-
Notifications
You must be signed in to change notification settings - Fork 188
Expand file tree
/
Copy pathNavbar.jsx
More file actions
62 lines (57 loc) · 2.5 KB
/
Navbar.jsx
File metadata and controls
62 lines (57 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import { useState } from 'react';
import { NAV_LINKS, BRAND } from '../data/navigation';
import { useTheme } from '../context/ThemeContext';
function Navbar() {
const [menuOpen, setMenuOpen] = useState(false);
const { theme, toggleTheme } = useTheme();
return (
<header className="navbar" role="banner">
<div className="navbar__inner container">
<a href="/" className="navbar__brand" aria-label={`${BRAND.name} 首頁`}>
<span className="navbar__logo" aria-hidden="true">◆</span>
<span className="navbar__brand-name">{BRAND.name}</span>
</a>
<button
className="navbar__toggle"
onClick={() => setMenuOpen(!menuOpen)}
aria-expanded={menuOpen}
aria-controls="nav-menu"
aria-label="切換導覽選單"
>
<span className="navbar__toggle-bar" />
<span className="navbar__toggle-bar" />
<span className="navbar__toggle-bar" />
</button>
<nav
id="nav-menu"
className={`navbar__nav ${menuOpen ? 'navbar__nav--open' : ''}`}
role="navigation"
aria-label="主要導覽"
>
<ul className="navbar__list">
{NAV_LINKS.map((link) => (
<li key={link.href} className="navbar__item">
<a href={link.href} className="navbar__link" onClick={() => setMenuOpen(false)}>
{link.label}
</a>
</li>
))}
</ul>
<button
type="button"
className="navbar__theme-toggle"
onClick={toggleTheme}
aria-label={theme === 'dark' ? '切換為淺色主題' : '切換為深色主題'}
title={theme === 'dark' ? '淺色模式' : '深色模式'}
>
{theme === 'dark' ? '☀️' : '🌙'}
</button>
<a href="#demo" className="btn btn--primary btn--sm navbar__cta">
預約 Demo
</a>
</nav>
</div>
</header>
);
}
export default Navbar;