Skip to content

[Frontend] Accessibility (a11y) & WCAG 2.1 AA Compliance Audit (#1198) - #1407

Closed
dimka90 wants to merge 1 commit into
LabsCrypt:mainfrom
dimka90:fix/1198-accessibility-wcag
Closed

[Frontend] Accessibility (a11y) & WCAG 2.1 AA Compliance Audit (#1198)#1407
dimka90 wants to merge 1 commit into
LabsCrypt:mainfrom
dimka90:fix/1198-accessibility-wcag

Conversation

@dimka90

@dimka90 dimka90 commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

Closes #1198 — proactive accessibility audit & remediation for FlowFi's dashboard surfaces.

What changed

Live ticing announcements — new LiveValue component (components/ui/LiveValue.tsx): a visually-hidden aria-live="polite" + aria-atomic="true" region that syncs from the latest rendered value at most once per cadence (default 1s), wired into:

  • IncomingStreamCard claimable amount
  • stream-details StatCard claimable metric (the live card)

Screen readers now announce balances on user query instead of per-requestAnimationFrame.

prefers-reduced-motionuseStreamingAmount computes the accrued value once when (prefers-reduced-motion: reduce) is set instead of running the animation loop.

Keyboard focus — global :focus-visible outline (accent) for all interactive elements (WCAG 2.4.7).

Contrast (dark mode) — added dark: variants for ticker labels, status badges (emerald/amber/slate), and modal copy; solid text-sky-800 replaces the failing text-sky-800/70.

Dialog semantics fixes:

  • StreamDetailsModal icon copy button now has aria-label="Copy recipient address"
  • IncomingStreamCard swapped an invalid dl/dt/dd layout (div-wrapped) for div-based structure to satisfy axe definition-list/dlitem

Automated testing__tests__/a11y.test.tsx runs axe-core against IncomingStreamCard, StreamDetailsModal, TopUpModal, and WalletModal, asserting zero critical/serious violations (color-contrast excluded: happy-dom can't compute real styles — covered by the browser-side audit + token fixes). __tests__/live-value.test.tsx covers throttling behavior.

Verification

  • npx vitest run: 321 tests pass (37 files)
  • npx tsc --noEmit: 0 net-new errors vs. main baseline
  • npm run lint --workspace=frontend: clean

…ypt#1198)

- Add LiveValue throttled aria-live region for ticking balances
  (IncomingStreamCard claimable, stream-details StatCard claimable) so
  screen readers announce on user query rather than per frame.
- Respect prefers-reduced-motion in useStreamingAmount: compute accrued
  value once instead of running the rAF loop.
- Global :focus-visible outline token for keyboard users (2.4.7).
- Fix dark-mode contrast for ticker labels, badges, and modal copy
  (slate/emerald/amber/indigo utilities get dark: variants).
- give the clipboard icon button in StreamDetailsModal an accessible name.
- Replace invalid dl/dt/dd layout in IncomingStreamCard with div-based
  structure to satisfy axe definition-list/dlitem rules.
- Add axe-core a11y suite (a11y.test.tsx) asserting zero critical/serious
  violations across IncomingStreamCard, StreamDetailsModal, TopUpModal,
  WalletModal; unit tests for LiveValue throttling.
@dimka90

dimka90 commented Aug 30, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #1409 — the single combined PR for #1198 #1199 #1200 #1201.

@dimka90 dimka90 closed this Aug 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Frontend] Accessibility (a11y) & WCAG 2.1 AA Compliance Audit

1 participant