Skip to content

Commit feaff98

Browse files
feat: implement responsive mobile hamburger menu toggle and drawer navigation
1 parent a96fd62 commit feaff98

1 file changed

Lines changed: 74 additions & 9 deletions

File tree

src/layouts/BaseLayout.astro

Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,17 @@ const navItems = [
6161
})}
6262
</nav>
6363

64-
<button id="theme-toggle-btn" class="theme-toggle-btn" aria-label="Toggle light and dark theme">
65-
<span class="sun-icon">☀️</span>
66-
<span class="moon-icon">🌙</span>
67-
</button>
64+
<div class="header-right">
65+
<button id="mobile-menu-btn" class="mobile-menu-btn" aria-label="Toggle navigation menu">
66+
<span class="hamburger-icon">☰</span>
67+
<span class="close-icon">✕</span>
68+
</button>
69+
70+
<button id="theme-toggle-btn" class="theme-toggle-btn" aria-label="Toggle light and dark theme">
71+
<span class="sun-icon">☀️</span>
72+
<span class="moon-icon">🌙</span>
73+
</button>
74+
</div>
6875
</div>
6976
</header>
7077

@@ -82,6 +89,15 @@ const navItems = [
8289
localStorage.setItem('theme', nextTheme);
8390
});
8491
}
92+
93+
const menuBtn = document.getElementById('mobile-menu-btn');
94+
const navLinks = document.querySelector('.nav-links');
95+
if (menuBtn && navLinks) {
96+
menuBtn.addEventListener('click', () => {
97+
const isOpen = navLinks.classList.toggle('mobile-open');
98+
menuBtn.classList.toggle('active', isOpen);
99+
});
100+
}
85101
</script>
86102
</body>
87103
</html>
@@ -105,6 +121,37 @@ const navItems = [
105121
align-items: center;
106122
}
107123

124+
.header-right {
125+
display: flex;
126+
align-items: center;
127+
gap: 0.5rem;
128+
}
129+
130+
.mobile-menu-btn {
131+
display: none;
132+
background: rgba(255, 255, 255, 0.05);
133+
border: 1px solid var(--border-glass);
134+
border-radius: 8px;
135+
width: 36px;
136+
height: 36px;
137+
align-items: center;
138+
justify-content: center;
139+
cursor: pointer;
140+
color: var(--text-main);
141+
font-size: 1.1rem;
142+
transition: all 0.2s ease;
143+
}
144+
145+
[data-theme="light"] .mobile-menu-btn {
146+
background: rgba(0, 0, 0, 0.05);
147+
}
148+
149+
.hamburger-icon { display: block; }
150+
.close-icon { display: none; }
151+
152+
.mobile-menu-btn.active .hamburger-icon { display: none; }
153+
.mobile-menu-btn.active .close-icon { display: block; }
154+
108155
.nav-links {
109156
display: flex;
110157
gap: 0.35rem;
@@ -188,15 +235,33 @@ const navItems = [
188235
}
189236

190237
@media (max-width: 768px) {
191-
.header-content {
192-
gap: 0.75rem;
238+
.mobile-menu-btn {
239+
display: flex;
193240
}
241+
194242
.nav-links {
195-
gap: 0.25rem;
243+
display: none;
244+
width: 100%;
245+
flex-direction: column;
246+
gap: 0.4rem;
247+
padding-top: 1rem;
248+
margin-top: 0.75rem;
249+
border-top: 1px solid var(--border-glass);
250+
}
251+
252+
.nav-links.mobile-open {
253+
display: flex;
196254
}
255+
256+
.header-content {
257+
flex-wrap: wrap;
258+
}
259+
197260
.nav-links a {
198-
font-size: 0.82rem;
199-
padding: 0.3rem 0.6rem;
261+
width: 100%;
262+
text-align: left;
263+
font-size: 0.95rem;
264+
padding: 0.6rem 0.85rem;
200265
}
201266
}
202267
</style>

0 commit comments

Comments
 (0)