Skip to content

Commit 146f28c

Browse files
committed
Add responsive hamburger menu for mobile navigation
1 parent 057295d commit 146f28c

2 files changed

Lines changed: 96 additions & 18 deletions

File tree

src/_includes/layouts/base.njk

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
<img src="/img/oarc-cloud-icon.png" alt="Open AR Cloud" class="logo-icon">
1717
<strong>OpenARCloud</strong>
1818
</a>
19+
<button class="nav-toggle" aria-label="Toggle navigation" aria-expanded="false">
20+
<span class="hamburger"></span>
21+
</button>
1922
<nav class="main-nav">
2023
<a href="/">Home</a>
2124
<a href="/platform/">Platform</a>
@@ -70,5 +73,15 @@
7073
</div>
7174
</div>
7275
</footer>
76+
<script>
77+
const navToggle = document.querySelector('.nav-toggle');
78+
const mainNav = document.querySelector('.main-nav');
79+
80+
navToggle.addEventListener('click', () => {
81+
const isOpen = mainNav.classList.toggle('is-open');
82+
navToggle.classList.toggle('is-open');
83+
navToggle.setAttribute('aria-expanded', isOpen);
84+
});
85+
</script>
7386
</body>
7487
</html>

src/css/style.css

Lines changed: 83 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -113,20 +113,6 @@ body::before {
113113
transition: all var(--transition-base);
114114
}
115115

116-
.logo::before {
117-
content: '[';
118-
color: var(--accent-cyan);
119-
margin-right: 4px;
120-
opacity: 0.6;
121-
}
122-
123-
.logo::after {
124-
content: ']';
125-
color: var(--accent-cyan);
126-
margin-left: 4px;
127-
opacity: 0.6;
128-
}
129-
130116
.logo:hover {
131117
color: var(--primary-violet);
132118
transform: translateX(2px);
@@ -176,6 +162,57 @@ body::before {
176162
width: 30px;
177163
}
178164

165+
/* Hamburger Toggle Button */
166+
.nav-toggle {
167+
display: none;
168+
background: none;
169+
border: none;
170+
cursor: pointer;
171+
padding: 10px;
172+
z-index: 1001;
173+
}
174+
175+
.hamburger {
176+
display: block;
177+
width: 24px;
178+
height: 2px;
179+
background: var(--neutral-800);
180+
position: relative;
181+
transition: background var(--transition-fast);
182+
}
183+
184+
.hamburger::before,
185+
.hamburger::after {
186+
content: '';
187+
position: absolute;
188+
left: 0;
189+
width: 24px;
190+
height: 2px;
191+
background: var(--neutral-800);
192+
transition: transform var(--transition-fast);
193+
}
194+
195+
.hamburger::before {
196+
top: -7px;
197+
}
198+
199+
.hamburger::after {
200+
top: 7px;
201+
}
202+
203+
/* Hamburger animation when open */
204+
.nav-toggle.is-open .hamburger {
205+
background: transparent;
206+
}
207+
208+
.nav-toggle.is-open .hamburger::before {
209+
transform: rotate(45deg) translate(5px, 5px);
210+
}
211+
212+
.nav-toggle.is-open .hamburger::after {
213+
transform: rotate(-45deg) translate(5px, -5px);
214+
}
215+
179216
/* Main Content */
180217
.main-content {
181218
min-height: calc(100vh - 300px);
@@ -624,13 +661,41 @@ ol {
624661
}
625662

626663
.header-content {
627-
flex-direction: column;
628-
gap: 20px;
664+
flex-wrap: wrap;
665+
justify-content: space-between;
666+
}
667+
668+
.nav-toggle {
669+
display: block;
629670
}
630671

631672
.main-nav {
632-
flex-wrap: wrap;
633-
justify-content: center;
673+
display: none;
674+
flex-direction: column;
675+
width: 100%;
676+
background: white;
677+
padding: 20px 0;
678+
gap: 0;
679+
border-top: 1px solid var(--neutral-200);
680+
margin-top: 20px;
681+
}
682+
683+
.main-nav.is-open {
684+
display: flex;
685+
}
686+
687+
.main-nav a {
688+
padding: 12px 0;
689+
border-radius: 0;
690+
border-bottom: 1px solid var(--neutral-100);
691+
}
692+
693+
.main-nav a:last-child {
694+
border-bottom: none;
695+
}
696+
697+
.main-nav a::before {
698+
display: none;
634699
}
635700

636701
.cta-grid {

0 commit comments

Comments
 (0)