SPB Git forge

spb/auto-ka

Public
61commits 1branches 0releases
14.4 MBsize
maindefault branch
12 days agolast push
Python 61.6% TypeScript 20.9% CSS 11.4% JavaScript 5.1% HTML 1.1%

standard header/menu KA 2026-08-22 : header opaque + z-index tokens + ka-scroll-lock

Simon-Pierre Boucher committed 1 mo ago (Aug 22, 2026) parent f739cb0

2 changed files +11 −16

modified frontend/src/App.tsx +7 −10
@@ -62,13 +62,11 @@ function AccountMenu() {
62 62 const loc = useLocation();
63 63 const nav = useNavigate();
64 64
65 − // menu ouvert = verrou du scroll d'arrière-plan + fermeture par Escape et
66 − // par tap extérieur au niveau document (le backdrop fixed est confiné au
67 − // header par son backdrop-filter — containing block — il ne couvre pas
68 − // toute la page)
65 + // menu ouvert = verrou du scroll d'arrière-plan (ka-scroll-lock sur <html>)
66 + // + fermeture par Escape et par tap extérieur au niveau document
69 67 useEffect(() => {
70 68 if (!menuOpen) return;
71 − document.body.style.overflow = "hidden";
69 + document.documentElement.classList.add("ka-scroll-lock");
72 70 const onKey = (e: KeyboardEvent) => { if (e.key === "Escape") setMenuOpen(false); };
73 71 const onDown = (e: PointerEvent) => {
74 72 if (!(e.target as Element | null)?.closest(".account")) setMenuOpen(false);
@@ -76,7 +74,7 @@ function AccountMenu() {
76 74 window.addEventListener("keydown", onKey);
77 75 document.addEventListener("pointerdown", onDown);
78 76 return () => {
79 − document.body.style.overflow = "";
77 + document.documentElement.classList.remove("ka-scroll-lock");
80 78 window.removeEventListener("keydown", onKey);
81 79 document.removeEventListener("pointerdown", onDown);
82 80 };
@@ -171,11 +169,11 @@ function Header() {
171 169 useEffect(() => { setOpen(false); }, [location]);
172 170 useEffect(() => {
173 171 if (!open) return;
174 − document.body.style.overflow = "hidden";
172 + document.documentElement.classList.add("ka-scroll-lock");
175 173 const onKey = (e: KeyboardEvent) => { if (e.key === "Escape") setOpen(false); };
176 174 window.addEventListener("keydown", onKey);
177 175 return () => {
178 − document.body.style.overflow = "";
176 + document.documentElement.classList.remove("ka-scroll-lock");
179 177 window.removeEventListener("keydown", onKey);
180 178 };
181 179 }, [open]);
@@ -183,8 +181,7 @@ function Header() {
183 181 return (
184 182 <>
185 183 {/* .menu-open remonte le header au-dessus du backdrop (posé HORS du
186 − header : son backdrop-filter créerait un containing block pour
187 − position:fixed) */}
184 + header, en frère) */}
188 185 <header className={`header ${open ? "menu-open" : ""}`}>
189 186 <div className="container header-inner">
190 187 <NavLink to="/" className="brand" aria-label="Auto-Ka — accueil">
modified frontend/src/styles.css +4 −6
@@ -32,13 +32,12 @@ button { font-family: inherit; }
32 32 .kicker::before { background: var(--accent); }
33 33
34 34 .container { max-width: 1280px; padding: 0 24px; }
35 −@media (max-width: 640px) { .container { padding: 0 16px; } }
35 +@media (max-width: 640px) { .container { padding: 0 16px; } .header-inner { height: 56px; } }
36 36
37 37 /* ================= Header ================= */
38 38 .header {
39 − position: sticky; top: 0; z-index: 50;
40 − background: rgba(245, 243, 238, 0.88); /* var(--paper) à 88 % */
41 − backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
39 + position: sticky; top: 0; z-index: var(--z-header, 500);
40 + background: var(--paper);
42 41 border-bottom: 2px solid var(--ink);
43 42 }
44 43 .header-inner { display: flex; align-items: center; gap: 20px; height: 64px; }
@@ -686,8 +685,7 @@ a.hub-chip:hover { border-color: var(--ink); color: var(--ink); }
686 685 padding: 12px 10px 4px; font-family: var(--font-mono);
687 686 font-size: 10.5px; color: var(--ink-3); letter-spacing: 0.04em;
688 687 }
689 −/* Backdrop rendu en FRÈRE du header (le backdrop-filter du header en ferait
690 − le containing block d'un position:fixed) ; .menu-open remonte le header
688 +/* Backdrop rendu en FRÈRE du header ; .menu-open remonte le header
691 689 au-dessus du backdrop pour que le panneau reste visible. */
692 690 .mm-backdrop {
693 691 position: fixed; inset: 0; z-index: var(--z-overlay, 800);
694 692