fix(ui): announce failures, keep focus honest and stop the last layout shifts

Hidden states of the floating coach button now leave the tab order and
accessibility tree, its focus ring carries an offset, its icon is dark
on the gradient, an unread nudge is announced once via a live region,
and it sits correctly above the fold on tablet widths and yields to
the onboarding tour. Chart error cards announce themselves, share the
exact height variables of the skeleton band, carry per-chart retry
labels, and a failed chunk renders inside the regular card shell. The
header icon cluster spaces its extended hit areas apart, the tab strip
keeps horizontal paint room for focus rings, the streak row reserves
its slot in every card state, the selection bar clears the bottom nav
on landscape phones, and the version poller keeps an in-memory reload
guard for browsers that block session storage. Mood notes render as
plain paragraphs with a toggle that appears only when text is actually
clamped, the remember control reveals on hover and hands focus to its
confirmation, and the hypnogram names its source and paints only the
lanes the night contains.
This commit is contained in:
Marc-André Bombeck committed 2026-06-11 23:20:37 +02:00
1 parent a2a995e429
commit 95f21bfa4d
29 files changed
+703 -137

No files matched your search

@@ -62,10 +62,12 @@ export function SelectionActionBar({
// edge. A `sticky bottom-2` bar lands BEHIND the nav, hiding the
// destructive "Delete (N)" button. Lift the bar to clear the nav band
// + safe area using the same offset the Coach FAB uses
// (`layout-coach-fab.tsx`); at `sm:`/desktop the nav is gone, so drop
// back to `bottom-4`. z-30 keeps the bar above page content without
// needing to beat the (now-cleared) nav's z-50.
className="bg-card border-border sticky bottom-[calc(env(safe-area-inset-bottom,0px)+5rem)] z-30 mt-2 flex items-center justify-between gap-2 rounded-lg border p-2 shadow-lg sm:bottom-4"
// (`layout-coach-fab.tsx`); the nav only hides from `md:` up
// (`md:hidden`), so the drop back to `bottom-4` happens at `md:` —
// an `sm:` drop sat the bar behind the still-visible nav 640-767px.
// z-30 keeps the bar above page content without needing to beat the
// (now-cleared) nav's z-50.
className="bg-card border-border sticky bottom-[calc(env(safe-area-inset-bottom,0px)+5rem)] z-30 mt-2 flex items-center justify-between gap-2 rounded-lg border p-2 shadow-lg md:bottom-4"
>
<div className="flex items-center gap-1">
<Button