feat(web): responsive + a11y sweep across remaining routes #561
No reviewers
Labels
No labels
area:agents
area:dashboard
area:database
area:design
area:design-review
area:flows
area:infra
area:meta
area:security
area:sessions
area:webhook
area:workdir
security
type:bug
type:chore
type:meta
type:user-story
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
charles/claude-hooks!561
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "boss/558"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
<Tabs>foundation primitive (roving tabindex, arrow-key nav) and documents the primitives + a11y baseline inapps/web/CLAUDE.mdso the next sweep doesn't have to relitigate conventions./flows,/monitor,/settings,/login— Unicode glyphs → lucide icons, raw<button>→<Button>(incl.tone="error"), inputs labelled, hand-rolled drawers migrated to<Drawer>, mobile card stacks where a desktop table would overflow.md:(every NAV_ITEM reachable on a phone), Esc dismisses the newest toast, save-status wrapped inrole="status" aria-live="polite".Closes #558
Test plan
bun x turbo run typecheck(4 packages)bun x @biomejs/biome@^2 check .bun x turbo run test— 597 web tests + 2601 server tests pass<Drawer>instances (TaskDrawer, hamburger nav)role="status"save announcement on /settingsCI green. One real a11y bug in the new
<Tabs>primitive blocks approval; two nits below.a11y —
apps/web/src/components/tabs.tsxTabsPanel(line ~388): the<div role="tabpanel">hasfocus-visible:ring-2styles but notabIndex, so the panel is not in the keyboard tab-order and those styles are unreachable. Per WAI-ARIA APG manual-activation pattern, the panel element should carrytabIndex={0}when it cannot guarantee focusable descendants (which a generic primitive cannot). Fix: addtabIndex={0}to the div.doc —
apps/web/CLAUDE.mddiff lines 51–53: two consecutive---separators were inserted; remove one.a11y —
apps/web/src/features/flows/RunsDrawer.tsxDrawerHeader: the toggle is still a raw<button type="button">— not<Button>— contrary to the convention this PR codifies. Low-risk since it has hand-crafted focus-visible styles, but worth tidying for consistency.CI green. One real a11y bug in the new
<Tabs>primitive blocks approval; two nits below.a11y —
apps/web/src/components/tabs.tsxTabsPanel(~line 388): the<div role="tabpanel">hasfocus-visible:ring-2styles but notabIndex, so the panel is not in the keyboard tab-order and those styles are unreachable. Per WAI-ARIA APG manual-activation pattern, the panel element should carrytabIndex={0}when it cannot guarantee focusable descendants (which a generic primitive cannot). Fix: addtabIndex={0}to the div.doc —
apps/web/CLAUDE.mddiff lines 51-53: two consecutive---separators were inserted; remove one.a11y —
apps/web/src/features/flows/RunsDrawer.tsxDrawerHeader: toggle is still a raw<button type="button">, contrary to the convention this PR codifies. Has hand-crafted focus-visible styles so not broken, but worth tidying.Addressed in
7dc1045:TabsPanelnow carriestabIndex={0}so the focus-visible ring is reachable per WAI-ARIA APG. SuppressednoNoninteractiveTabindexwith a justification comment.DrawerHeadermigrates from raw<button>to<Button variant="ghost" size="sm">.---under the reduced-motion section.bun x turbo run typecheck,bun x @biomejs/biome@^2 check ., and the 597 web tests pass locally.All three round-1 findings resolved:
tabIndex={0}onTabsPanel, duplicate---removed from CLAUDE.md,RunsDrawertoggle now uses<Button>. CI green.