Skip to content

Commit d3b71fe

Browse files
authored
Merge pull request #3 from rocketdeploy-dev/work/update-header-for-mobile-navigation
feat(nav): add mobile nav toggle
2 parents 15df33b + c7cde94 commit d3b71fe

File tree

2 files changed

+82
-4
lines changed

2 files changed

+82
-4
lines changed

src/components/Header.astro

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,40 @@ const nav = lang === "pl"
1616
];
1717
---
1818
<nav class="nav">
19-
<div class="brand">
20-
<b>rocketdeploy</b>
21-
<small>systems · delivery · ops</small>
19+
<div class="nav-header">
20+
<div class="brand">
21+
<b>rocketdeploy</b>
22+
<small>systems · delivery · ops</small>
23+
</div>
24+
<button
25+
class="nav-toggle"
26+
type="button"
27+
aria-controls="primary-nav"
28+
aria-expanded="false"
29+
>
30+
Menu
31+
</button>
2232
</div>
2333

24-
<div class="navlinks">
34+
<div class="navlinks" id="primary-nav" data-open="false">
2535
{nav.map((i) => (
2636
<a href={i.href}>{i.label}</a>
2737
))}
2838
<LanguageSwitch lang={lang} />
2939
</div>
3040
</nav>
41+
42+
<script is:inline>
43+
const navToggle = document.querySelector(".nav-toggle");
44+
const navLinks = document.querySelector("#primary-nav");
45+
46+
if (navToggle && navLinks) {
47+
navToggle.addEventListener("click", () => {
48+
const isOpen = navToggle.getAttribute("aria-expanded") === "true";
49+
const nextState = String(!isOpen);
50+
51+
navToggle.setAttribute("aria-expanded", nextState);
52+
navLinks.dataset.open = nextState;
53+
});
54+
}
55+
</script>

src/styles/global.css

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ a:hover{ border-bottom-color: rgba(122,162,255,.85); }
5656
padding: 14px 0;
5757
}
5858

59+
.nav-header{
60+
display:flex;
61+
align-items:center;
62+
justify-content:space-between;
63+
gap: 16px;
64+
}
65+
5966
.brand{
6067
display:flex;
6168
gap: 10px;
@@ -76,6 +83,25 @@ a:hover{ border-bottom-color: rgba(122,162,255,.85); }
7683
font-size: 14px;
7784
}
7885

86+
.nav-toggle{
87+
display:none;
88+
align-items:center;
89+
justify-content:center;
90+
gap: 8px;
91+
padding: 8px 12px;
92+
border-radius: 999px;
93+
border: 1px solid var(--border);
94+
background: var(--panel);
95+
color: var(--text);
96+
font-size: 13px;
97+
}
98+
99+
.navlinks a:focus-visible,
100+
.nav-toggle:focus-visible{
101+
outline: 2px solid var(--accent);
102+
outline-offset: 3px;
103+
}
104+
79105
.lang{
80106
display:flex;
81107
gap: 8px;
@@ -94,6 +120,33 @@ a:hover{ border-bottom-color: rgba(122,162,255,.85); }
94120
color: var(--text);
95121
}
96122

123+
@media (max-width: 768px){
124+
.nav{
125+
flex-direction: column;
126+
align-items: stretch;
127+
gap: 12px;
128+
}
129+
130+
.nav-header{
131+
width: 100%;
132+
}
133+
134+
.nav-toggle{
135+
display:inline-flex;
136+
}
137+
138+
.navlinks{
139+
display:none;
140+
flex-direction: column;
141+
align-items:flex-start;
142+
gap: 12px;
143+
}
144+
145+
.navlinks[data-open="true"]{
146+
display:flex;
147+
}
148+
}
149+
97150
main{ padding: 58px 0 70px; }
98151

99152
.hero{

0 commit comments

Comments
 (0)