From 10f86772ee2d0aa3ee9208d7a7a3888e04911cb3 Mon Sep 17 00:00:00 2001 From: ducoterra Date: Tue, 20 Oct 2026 16:47:10 -0400 Subject: [PATCH] phase: 18_nav_hamburger MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Phase 18 — collapse the nav bar into a hamburger: complete, all green.** Verified (criteria): - ≤640px: the tab links leave the bar, the ☰ is visible, and it opens a dropdown under the sticky masthead (`top: 100%`, `z-index: 41`, viewport-wide) with the five stacked 40px links; above 640px the one-row desktop masthead is unchanged and the button hidden — `data/logs/nav-task04-verify.cjs` 24/24 and `data/logs/nav-final-pass.cjs` 45/45; screenshots `data/logs/nav-hamburger-{closed,open}-360.png`, `data/logs/nav-masthead-desktop-1280.png` ✓ - The four close paths: the button again, a tab click (navigates and closes), Esc (focus back on the opener), and `matchMedia` resize back above the breakpoint (drops a stale `.is-open`; `aria-expanded` tracks state on every path through the single `setNavMenu()` funnel) ✓ - `uv run pytest` → 1454 passed, 15 skipped; `bash .agents/validate.sh` → exit 0 (coverage 98.94% ≥ 94, ruff clean, pyright 0 errors, `node --check` + hygiene clean); served-page pins: button on all seven tabbed pages and nowhere on /login, CSS and binding compared on the 640px literal ✓ Real-device finding (mobile Chrome): the emulated 360px pass was blind to the system top-edge zone — Android Chrome is edge-to-edge by default, so the sticky bar started under the status bar and the first-row ☰ sat in a region the device does not deliver taps to (unreachable, not unbound; the same symptom brain of reese fixed in production). The ≤640px block now pads the bar by `env(safe-area-inset-top, 0px)` (the block's `padding-block` value restated on the top side), verified on the operator's phone; `env()` resolves to 0 on every non-notch surface, so all other widths render byte-identical. The served-byte pin's rule loop carries the line; CDP's `safeAreaInsets` override does not feed `env()`, which is the honest limit of the emulated proof. Docs: AGENTS.md *UI conventions* masthead entry extended with the three pins, the drift-comparison, the safe-area rule, and the real-device verification caveat; README's `web/` bullet names the ≤640px collapse with the desktop masthead unchanged above the breakpoint. Deviations: pinned the shipped token shape (`#nav-toggle { display: var(--nav-toggle-display) }` + the `:root` token) instead of the task file's literal `.nav-toggle { display: none }` — that literal loses to `button.ghost { display: inline-flex }` (task 01 measured it); the test docstring says so, so nobody "restores" the broken shape. `uv pip list --outdated` still advisory (fastapi 0.153.0 → 0.156.2); this phase moved no dependency. NOTES.md (emptied) / TODO.md (operator items added) are harness-side changes — left in the working tree, as in phase 17. Next pending phase: `.agents/phases/todo/19_ups_events_expandable/`. LLM-Generated: true --- .../18_nav_hamburger/00_phase.md | 0 .../18_nav_hamburger/01_hamburger_markup.md | 0 .../18_nav_hamburger/02_dropdown_css.md | 0 .../18_nav_hamburger/03_toggle_binding.md | 0 .../04_tests_and_verification.md | 0 .../18_nav_hamburger__00_phase.a1.err | 0 ..._nav_hamburger__01_hamburger_markup.a1.err | 0 ...8_nav_hamburger__01_hamburger_markup.a1.md | 21 +++ ...amburger__01_hamburger_markup.a1.md.status | 1 + ...hamburger__01_hamburger_markup.a1.validate | 65 ++++++++ .../18_nav_hamburger__02_dropdown_css.a1.err | 0 .../18_nav_hamburger__02_dropdown_css.a1.md | 16 ++ ...av_hamburger__02_dropdown_css.a1.md.status | 1 + ...nav_hamburger__02_dropdown_css.a1.validate | 65 ++++++++ ...18_nav_hamburger__03_toggle_binding.a1.err | 0 .../18_nav_hamburger__03_toggle_binding.a1.md | 13 ++ ..._hamburger__03_toggle_binding.a1.md.status | 1 + ...v_hamburger__03_toggle_binding.a1.validate | 65 ++++++++ ...amburger__04_tests_and_verification.a1.err | 0 ...hamburger__04_tests_and_verification.a1.md | 19 +++ ...er__04_tests_and_verification.a1.md.status | 1 + ...ger__04_tests_and_verification.a1.validate | 65 ++++++++ AGENTS.md | 55 +++++- README.md | 14 +- src/dashboards/app.py | 3 +- src/dashboards/web/pages/certs.html | 4 +- src/dashboards/web/pages/disks.html | 4 +- src/dashboards/web/pages/index.html | 4 +- src/dashboards/web/pages/llm.html | 4 +- src/dashboards/web/pages/settings.html | 4 +- src/dashboards/web/pages/system.html | 4 +- src/dashboards/web/pages/ups.html | 4 +- src/dashboards/web/static/app.js | 42 +++++ src/dashboards/web/static/dash.css | 135 +++++++++++++++ tests/test_api.py | 156 ++++++++++++++++++ 35 files changed, 752 insertions(+), 14 deletions(-) rename .agents/phases/{todo => complete}/18_nav_hamburger/00_phase.md (100%) rename .agents/phases/{todo => complete}/18_nav_hamburger/01_hamburger_markup.md (100%) rename .agents/phases/{todo => complete}/18_nav_hamburger/02_dropdown_css.md (100%) rename .agents/phases/{todo => complete}/18_nav_hamburger/03_toggle_binding.md (100%) rename .agents/phases/{todo => complete}/18_nav_hamburger/04_tests_and_verification.md (100%) create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__00_phase.a1.err create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__01_hamburger_markup.a1.err create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__01_hamburger_markup.a1.md create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__01_hamburger_markup.a1.md.status create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__01_hamburger_markup.a1.validate create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__02_dropdown_css.a1.err create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__02_dropdown_css.a1.md create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__02_dropdown_css.a1.md.status create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__02_dropdown_css.a1.validate create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__03_toggle_binding.a1.err create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__03_toggle_binding.a1.md create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__03_toggle_binding.a1.md.status create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__03_toggle_binding.a1.validate create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__04_tests_and_verification.a1.err create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__04_tests_and_verification.a1.md create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__04_tests_and_verification.a1.md.status create mode 100644 .agents/reports/18_nav_hamburger/18_nav_hamburger__04_tests_and_verification.a1.validate diff --git a/.agents/phases/todo/18_nav_hamburger/00_phase.md b/.agents/phases/complete/18_nav_hamburger/00_phase.md similarity index 100% rename from .agents/phases/todo/18_nav_hamburger/00_phase.md rename to .agents/phases/complete/18_nav_hamburger/00_phase.md diff --git a/.agents/phases/todo/18_nav_hamburger/01_hamburger_markup.md b/.agents/phases/complete/18_nav_hamburger/01_hamburger_markup.md similarity index 100% rename from .agents/phases/todo/18_nav_hamburger/01_hamburger_markup.md rename to .agents/phases/complete/18_nav_hamburger/01_hamburger_markup.md diff --git a/.agents/phases/todo/18_nav_hamburger/02_dropdown_css.md b/.agents/phases/complete/18_nav_hamburger/02_dropdown_css.md similarity index 100% rename from .agents/phases/todo/18_nav_hamburger/02_dropdown_css.md rename to .agents/phases/complete/18_nav_hamburger/02_dropdown_css.md diff --git a/.agents/phases/todo/18_nav_hamburger/03_toggle_binding.md b/.agents/phases/complete/18_nav_hamburger/03_toggle_binding.md similarity index 100% rename from .agents/phases/todo/18_nav_hamburger/03_toggle_binding.md rename to .agents/phases/complete/18_nav_hamburger/03_toggle_binding.md diff --git a/.agents/phases/todo/18_nav_hamburger/04_tests_and_verification.md b/.agents/phases/complete/18_nav_hamburger/04_tests_and_verification.md similarity index 100% rename from .agents/phases/todo/18_nav_hamburger/04_tests_and_verification.md rename to .agents/phases/complete/18_nav_hamburger/04_tests_and_verification.md diff --git a/.agents/reports/18_nav_hamburger/18_nav_hamburger__00_phase.a1.err b/.agents/reports/18_nav_hamburger/18_nav_hamburger__00_phase.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/18_nav_hamburger/18_nav_hamburger__01_hamburger_markup.a1.err b/.agents/reports/18_nav_hamburger/18_nav_hamburger__01_hamburger_markup.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/18_nav_hamburger/18_nav_hamburger__01_hamburger_markup.a1.md b/.agents/reports/18_nav_hamburger/18_nav_hamburger__01_hamburger_markup.a1.md new file mode 100644 index 0000000..6e18301 --- /dev/null +++ b/.agents/reports/18_nav_hamburger/18_nav_hamburger__01_hamburger_markup.a1.md @@ -0,0 +1,21 @@ +All green. Final state verified. + +**Implemented** +- `#nav-toggle` (`class="ghost nav-toggle"`, `type=button`, `aria-expanded=false`, `aria-controls="nav-tabs"`, `aria-label="Toggle navigation"`, `☰`) inserted between `.brand` and `nav.tabs` in all 7 tabbed pages (`index, system, disks, llm, ups, settings, certs`); block is byte-identical across them (md5 match). +- Nav given its id: `