The worst of it: the ghost-log HUD is a fixed 300px panel pinned bottom-left
on every route. On a 390px screen it covered the seance ask-field and its
buttons outright — you could not reach the input to type a question. It now
collapses, and spans the width instead of blocking it under 560px.
- 16 uses of `100vh` meant every page was taller than iOS Safari's visible
viewport, hiding the last row behind the toolbar. Now `100dvh` with the
`100vh` line kept first as the fallback.
- Six inputs under 16px triggered iOS zoom-on-focus, which never zooms back
out — you were left panning a zoomed layout after tapping login. All six
at 16px, plus a global floor.
- No safe-area insets existed anywhere, so enabling viewport-fit=cover
would have put content under the notch and home indicator. Added,
including the fixed-position shells that ignore body padding.
- The codex voice table forced horizontal page scroll; it scrolls in its
own container now.
- Tap targets under 44px raised, including a transcript replay button that
was ~20x14px and named only by a `title` tooltip, which touch never shows.
Decorative micro-labels left alone deliberately — bumping them wholesale
would reintroduce the overflow this fixes.
README: the documented test command cannot work. conftest APPENDS `_test`,
so the documented DATABASE_URL derived `quantumancy_test_test` and errored
every test at setup. Corrected, with the two guards explained. Test counts
were stale (328/366 -> 403/385).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Usability wave Workstream C (#5, #7):
- manifest.webmanifest with existing 192/512/180 icons, linked in
index.html with theme-color aligned to #07070d; no service worker.
- GET /api/seances/recent: last 12 of the seeker's own séances with
entity, per-kind event counts (one GROUP BY) and up to 3 spirit
echoes (one windowed query) — no per-session N+1.
- /log Ghost Log page: cards with GhostGlyph, relative in-fiction
timestamps, counts and echo lines; LOG link in the séance topbar;
en/es i18n parity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>