fix(web): small-screen defects found by a measured audit #239

Merged
grenade merged 1 commits from fix/small-screen-audit into main 2026-08-06 10:05:47 +00:00

1 Commits

Author SHA1 Message Date
5ff5ee4b88 fix(web): small-screen defects found by a measured audit
All checks were successful
CI / Classify changes (push) Successful in 12s
CI / Web (lint + typecheck + i18n + build) (push) Successful in 1m54s
CI / CUDA type-check (push) Has been skipped
CI / Format (push) Has been skipped
CI / Clippy (push) Has been skipped
CI / Test (push) Has been skipped
CI / Build cortex SRPM (push) Has been skipped
CI / Build neuron SRPM (push) Has been skipped
CI / Publish cortex to COPR (push) Has been skipped
CI / Publish neuron to COPR (push) Has been skipped
CI / Bump version in source (push) Has been skipped
CI / Classify changes (pull_request) Successful in 12s
CI / Format (pull_request) Successful in 8s
CI / Clippy (pull_request) Successful in 2m45s
CI / Test (pull_request) Successful in 14m28s
CI / Web (lint + typecheck + i18n + build) (pull_request) Successful in 1m59s
CI / CUDA type-check (pull_request) Successful in 19m13s
CI / Build cortex SRPM (pull_request) Has been skipped
CI / Publish cortex to COPR (pull_request) Has been skipped
CI / Build neuron SRPM (pull_request) Has been skipped
CI / Publish neuron to COPR (pull_request) Has been skipped
CI / Bump version in source (pull_request) Has been skipped
Driving the built app through headless Chrome at 320/360/390/414/768/
992/1200px across every public route, and in Arabic, Hebrew and German,
turned up four real defects. All four are verified fixed by re-running
the same sweep: 42 route/width combinations, no horizontal overflow.

A long URL or identifier in a chat message made the conversation pan
sideways ~200px on a phone. `overflow-wrap: anywhere` on the bubble, not
`break-word`, because only `anywhere` counts toward the min-content
width — and it was the min-content width driving the scroll area, so
`break-word` would have wrapped the text and left the panning intact.

The mission page slid sideways 8-12px at every width below the
container's max-width. A row's horizontal gutter becomes a negative side
margin of half its width and the container only cancels that up to
`g-4`; the two `g-5` rows there poked 12px past the viewport. Restricting
the wide gutter to large screens still failed at exactly 992px, because
a scrollbar narrows the viewport below what the breakpoint assumes, so
the horizontal gutter goes entirely — the columns stack below lg and the
vertical gutter is what does the visible work.

The document advertised `lang="en"` while rendering Arabic. Direction was
already synced on language change; the language itself was not, which is
what a screen reader announces from and what the browser selects a font
and hyphenation dictionary with.

Footer links and the password-reset link were 19-22px tall, under the
24px minimum, and sit at the bottom edge of a phone where tapping is
least accurate. The remaining sub-24px link is a mailto inline in a
sentence, which the guideline exempts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0165r11RzqkMqWWXfJE8tAVU
2026-08-06 13:02:30 +03:00