diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx index f075af9..5271ef7 100644 --- a/frontend/src/components/Layout.tsx +++ b/frontend/src/components/Layout.tsx @@ -1,5 +1,6 @@ -import { NavLink } from 'react-router-dom' -import { Wrench, ClipboardList, History, Boxes, HardHat, Repeat, MapPin, Settings } from 'lucide-react' +import { useState, useEffect } from 'react' +import { NavLink, useLocation } from 'react-router-dom' +import { Wrench, ClipboardList, History, Boxes, HardHat, Repeat, MapPin, Settings, Menu } from 'lucide-react' import { useAuth } from './AuthGate' import { can } from '../types' @@ -18,9 +19,13 @@ const NAV = [ export default function Layout({ children }: { children: React.ReactNode }) { const { user } = useAuth() const items = NAV.filter(n => can(user, n.cap)) + const location = useLocation() + const [menuOpen, setMenuOpen] = useState(false) + + useEffect(() => { setMenuOpen(false) }, [location.pathname]) return ( -
+
+ {menuOpen &&
setMenuOpen(false)} />} +
+ Maintenance -
diff --git a/frontend/src/index.css b/frontend/src/index.css index 388a5ff..dcbf353 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -124,9 +124,35 @@ html, body, #root { height: 100%; margin: 0; font-size: 14px; } .page-content { flex: 1; overflow-y: auto; display: flex; flex-direction: column; } @media (max-width: 768px) { - .sidebar { display: none; } + .sidebar { + position: fixed; + top: 0; left: 0; bottom: 0; + z-index: 200; + transform: translateX(calc(-1 * var(--sidebar-w))); + transition: transform 0.25s ease; + } + .app-shell.menu-open .sidebar { transform: translateX(0); } .top-bar { display: flex; } .app-shell { flex-direction: column; } + .field-row { flex-direction: column; } +} + +.menu-backdrop { + position: fixed; + inset: 0; + background: rgba(0,0,0,0.5); + z-index: 199; +} + +.top-bar-burger { + background: none; + border: none; + color: var(--text); + cursor: pointer; + display: flex; + align-items: center; + padding: 4px; + flex-shrink: 0; } /* ── Page chrome ───────────────────────────────────────────── */