Files
qtalker---/frontend
Indiana 859467f46e feat: one hamburger, every page — mobile navigation, and the ghost log HUD is gone
The app never had a global navigation. Every page carried its own scattered
links, so on a phone it read as a pile of tiny controls with no map: you
could not tell what existed or where you were. Reported as "everything is
tiny and I cannot see what is going on".

MobileNav is one drawer with every reachable route pegged to exactly one tab,
each with a glyph and a line saying what it is for. It closes on Escape, on
backdrop press, and on any navigation including the back button, and it locks
body scroll — restoring the PREVIOUS value rather than clearing it, since the
séance board legitimately owns overflow during a rite.

Nothing was removed to make room: the whole component is display:none above
860px, so desktop is byte-for-byte unchanged. Detail routes light their
parent tab, so reading a dossier still shows you as "in the codex".

The load-bearing test parses App.tsx's route table and fails if a page exists
that no tab reaches — proven by dropping /devices, which reports "these pages
exist but no mobile tab reaches them: /devices". That is the failure that
actually happens over time.

The floating Ghost Log HUD is removed as requested — it never showed
anything the transcript doesn't already show, and on a 390px screen its fixed
300px panel sat on top of the séance ask-field. Its event bus went with it:
once the HUD was gone the bus had emitters and zero subscribers.

Two things caught while doing this, both mine:
- I first wrote the nav i18n block wholesale and clobbered the existing one,
  which would have silently renamed the Enter page from "the threshold" to
  "the veil" and dropped nav.enter. Merged instead, and verified no original
  value changed. The drawer reuses the existing nav.* vocabulary rather than
  inventing a second set of names for the same places.
- The route-table test first used node:fs, which passes under vitest but
  fails the production build, since tsc typechecks tests and there is no
  @types/node. Uses Vite's ?raw import now — no new dependency.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 17:15:01 +00:00
..