Context
The UX architecture review in #765 flagged a full WCAG AA audit + NVDA/VoiceOver pass as outstanding work. PR B in the deferred-items sequence landed the automatable pieces:
jest-axe matcher wired up in vitest.setup.ts
- Axe tests on
NotFound, SuggestionCard, WorkoutHeader, CoachReviewingIndicator, TimelineWorkoutCard
- Keyboard tab-order + Enter/Space activation tests on
TimelineWorkoutCard
- Static regression test asserting the
prefers-reduced-motion override remains in index.css
Everything in that PR runs in CI via pnpm test. The items below require a real browser + human input and can't be automated from the Claude Code sandbox.
Outstanding manual work
1. WCAG AA color-contrast audit in a real browser
Run axe DevTools (or Accessibility Insights for Web) against each of the main pages, in both light and dark themes:
What to report: every contrast issue with ratio < 4.5:1 for normal text or < 3:1 for large text / non-text UI components.
2. Screen reader pass (NVDA on Windows, VoiceOver on macOS)
3. Mobile real-device testing
4. Focus management spot checks
How to file results
When you run any of the above, either:
- Comment on this issue with the findings (page, element, expected vs actual, severity), or
- Open a follow-up PR referencing this issue for each distinct fix.
Short fixes (color swaps, missing aria-label, focus-return) are fine to batch into one "a11y fixes from manual pass" PR. Anything structural (e.g. the virtualized Timeline announcement strategy) should be a standalone issue or PR.
Related
Context
The UX architecture review in #765 flagged a full WCAG AA audit + NVDA/VoiceOver pass as outstanding work. PR B in the deferred-items sequence landed the automatable pieces:
jest-axematcher wired up invitest.setup.tsNotFound,SuggestionCard,WorkoutHeader,CoachReviewingIndicator,TimelineWorkoutCardTimelineWorkoutCardprefers-reduced-motionoverride remains inindex.cssEverything in that PR runs in CI via
pnpm test. The items below require a real browser + human input and can't be automated from the Claude Code sandbox.Outstanding manual work
1. WCAG AA color-contrast audit in a real browser
Run axe DevTools (or Accessibility Insights for Web) against each of the main pages, in both light and dark themes:
/— Timeline (empty state + with data)/log— Log Workout (both exercise mode and text mode)/analytics— Overview / Progression / Records / Breakdown tabs/settings— all cards/— Coach panel open (desktop + mobile bottom sheet)What to report: every contrast issue with ratio < 4.5:1 for normal text or < 3:1 for large text / non-text UI components.
2. Screen reader pass (NVDA on Windows, VoiceOver on macOS)
@tanstack/react-virtualdrops off-viewport rows from the DOM, which can strand SR users. Verify the total item count is announced and that scrolling reveals rows correctly.sr-onlyprogress element are both announced at each step transition.role="log" aria-live="polite"region onCoachPanelChatArea.role="status" aria-live="polite"on the banner announces whenisAutoCoachingflips true.3. Mobile real-device testing
index.cssactually takes effect with OS-level motion reduction enabled.4. Focus management spot checks
WorkoutDetailDialog,GeneratePlanDialog,SchedulePlanDialog,RenamePlanDialog,GoalDialog,CombineWorkoutsDialog) should return focus to the element that opened it.#main-contentshould receive focus.How to file results
When you run any of the above, either:
Short fixes (color swaps, missing
aria-label, focus-return) are fine to batch into one "a11y fixes from manual pass" PR. Anything structural (e.g. the virtualized Timeline announcement strategy) should be a standalone issue or PR.Related
docs/client.md— Accessibility section (updated in PR B with the automated coverage list)