Skip to content

Commit 6e05e86

Browse files
authored
Merge pull request #3 from nsitu/copilot/optimize-navigation-for-mobile
Add collapsible sidebar navigation for mobile
2 parents a8cc8f9 + 0d111b4 commit 6e05e86

3 files changed

Lines changed: 95 additions & 1 deletion

File tree

index.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,16 @@
1515
</svg>
1616
<h1>MuralAid</h1>
1717
<span class="subtitle">Measure Tool</span>
18+
<button class="menu-toggle" id="menu-toggle" aria-label="Toggle navigation" aria-expanded="false" aria-controls="sidebar">
19+
<span></span><span></span><span></span>
20+
</button>
1821
</header>
1922

2023
<div class="app">
2124

2225
<!-- ── SIDEBAR ───────────────────────────────── -->
23-
<aside class="sidebar">
26+
<div class="sidebar-backdrop" id="sidebar-backdrop"></div>
27+
<aside class="sidebar" id="sidebar">
2428
<nav class="steps-list">
2529
<div class="step-item active" id="si-1">
2630
<div class="step-badge">1</div><span class="step-name">Wall Photo</span>

script.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ function goTo(n) {
296296
if (cp) cp.classList.toggle('hidden', i !== n);
297297
}
298298
document.getElementById('zoom-btns').style.display = n >= 2 ? 'flex' : 'none';
299+
if (isMobile()) closeSidebar();
299300
updateStatus();
300301
render();
301302
}
@@ -679,6 +680,39 @@ function renderMarkerList() {
679680
`).join('');
680681
}
681682

683+
// ═══════════════════════════════════════════════════════════════
684+
// MOBILE NAV TOGGLE
685+
// ═══════════════════════════════════════════════════════════════
686+
const menuToggle = document.getElementById('menu-toggle');
687+
const sidebar = document.getElementById('sidebar');
688+
const sidebarBackdrop = document.getElementById('sidebar-backdrop');
689+
690+
function openSidebar() {
691+
sidebar.classList.add('open');
692+
sidebarBackdrop.classList.add('open');
693+
menuToggle.setAttribute('aria-expanded', 'true');
694+
}
695+
696+
function closeSidebar() {
697+
sidebar.classList.remove('open');
698+
sidebarBackdrop.classList.remove('open');
699+
menuToggle.setAttribute('aria-expanded', 'false');
700+
}
701+
702+
function isMobile() {
703+
return window.matchMedia('(max-width: 640px)').matches;
704+
}
705+
706+
menuToggle.addEventListener('click', () => {
707+
if (sidebar.classList.contains('open')) {
708+
closeSidebar();
709+
} else {
710+
openSidebar();
711+
}
712+
});
713+
714+
sidebarBackdrop.addEventListener('click', closeSidebar);
715+
682716
// ═══════════════════════════════════════════════════════════════
683717
// KEYBOARD SHORTCUTS
684718
// ═══════════════════════════════════════════════════════════════

style.css

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,40 @@ header svg { color: var(--teal); }
3434
header h1 { font-size: 1.1rem; font-weight: 700; letter-spacing: -0.02em; }
3535
header .subtitle { color: var(--muted); font-size: 0.82rem; }
3636

37+
/* ── HAMBURGER MENU TOGGLE ────────────────────────── */
38+
.menu-toggle {
39+
display: none;
40+
flex-direction: column;
41+
justify-content: center;
42+
gap: 5px;
43+
margin-left: auto;
44+
background: none;
45+
border: none;
46+
cursor: pointer;
47+
padding: 4px;
48+
border-radius: 6px;
49+
}
50+
.menu-toggle span {
51+
display: block;
52+
width: 22px;
53+
height: 2px;
54+
background: var(--text);
55+
border-radius: 2px;
56+
transition: transform 0.2s, opacity 0.2s;
57+
}
58+
.menu-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
59+
.menu-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
60+
.menu-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
61+
62+
/* ── SIDEBAR BACKDROP ─────────────────────────────── */
63+
.sidebar-backdrop {
64+
display: none;
65+
position: fixed;
66+
inset: 0;
67+
background: rgba(0,0,0,0.5);
68+
z-index: 9;
69+
}
70+
3771
/* ── LAYOUT ───────────────────────────────────────── */
3872
.app {
3973
display: flex;
@@ -256,3 +290,25 @@ input[type=range] { width: 100%; accent-color: var(--teal); cursor: pointer; }
256290
pointer-events: none;
257291
display: none;
258292
}
293+
294+
/* ── MOBILE ───────────────────────────────────────── */
295+
@media (max-width: 640px) {
296+
.menu-toggle { display: flex; }
297+
298+
.sidebar {
299+
position: fixed;
300+
top: 0; left: 0;
301+
height: 100%;
302+
width: min(300px, 85vw);
303+
z-index: 10;
304+
transform: translateX(-100%);
305+
transition: transform 0.25s ease;
306+
}
307+
.sidebar.open {
308+
transform: translateX(0);
309+
}
310+
311+
.sidebar-backdrop.open {
312+
display: block;
313+
}
314+
}

0 commit comments

Comments
 (0)