Screens that already fit no longer scroll or rubber-band

- API-key gate is now a fixed, out-of-flow overlay (inset-0, overflow
  hidden, overscroll-none) with its own internal scroller, so the document
  has no scrollable height on phones. It can't be panned or bounced.
- Home/create mains are flex columns with min-h-dvh and a flex-1 content
  area, and the empty state's mobile padding was trimmed, so a short/empty
  library is exactly viewport height instead of overflowing by ~76px.
  Long pages (the create form, decks) still scroll normally.
- html/body get overscroll-behavior: none to stop pull-to-refresh and
  rubber-banding on fitting screens.

Verified with a scroll probe (gate and empty library: scrollHeight ==
viewport; create still scrolls) plus zoom 6/6, install sheet 64/64,
pwa 16/16, final-ux 12/12, retry 14/14, security 8/8, contrast 20/20.
This commit is contained in:
Martin Dvořák 2026-10-07 12:37:46 +00:00
commit 7ab04e9f62
5 changed files with 8 additions and 7 deletions

View file

@ -134,7 +134,7 @@ export function EmptyState({
action?: React.ReactNode;
}) {
return (
<div className="animate-rise flex flex-col items-center px-6 py-16 text-center sm:py-24">
<div className="animate-rise flex flex-col items-center px-6 py-6 text-center sm:py-24">
<span
className="mb-4 grid size-12 place-items-center rounded-2xl border border-[var(--hairline)] bg-[var(--surface-strong)] text-[var(--text-subtle)]"
aria-hidden