diff --git a/docs/accessibility/ACCESSIBILITY_FINDINGS.md b/docs/accessibility/ACCESSIBILITY_FINDINGS.md index c5538c0ea1..9b80077ddd 100644 --- a/docs/accessibility/ACCESSIBILITY_FINDINGS.md +++ b/docs/accessibility/ACCESSIBILITY_FINDINGS.md @@ -1550,14 +1550,18 @@ These patterns recur across the codebase and should be fixed once (component/sou ### Recommended Fix Order -1. **Critical blockers:** A11Y-001, A11Y-002 (build the `Clickable` and `IconButton` primitives first). -2. **Keyboard navigation:** A11Y-006, A11Y-007, A11Y-009, A11Y-015, A11Y-020, A11Y-021, A11Y-033. -3. **Screen reader support:** A11Y-004, A11Y-008, A11Y-010, A11Y-012, A11Y-013, A11Y-014, A11Y-024, A11Y-026, A11Y-030, A11Y-034. -4. **Forms:** A11Y-005, A11Y-016, A11Y-019, A11Y-029. +1. **Critical blockers:** A11Y-001 (completed), A11Y-002 (completed) — build the `Clickable` and `IconButton` primitives first. +2. **Keyboard navigation:** A11Y-006 (completed), A11Y-007, A11Y-009, A11Y-015, A11Y-020 (completed), A11Y-021 (completed), A11Y-033. +3. **Screen reader support:** A11Y-004 (completed), A11Y-008 (completed), A11Y-010 (completed), A11Y-012, A11Y-013, A11Y-014, A11Y-024, A11Y-026, A11Y-030, A11Y-034. +4. **Forms:** A11Y-005 (completed), A11Y-016 (completed), A11Y-019 (completed), A11Y-029. 5. **Dialogs & focus management:** A11Y-011, A11Y-017, A11Y-023 (build `AppModal`). -6. **Semantic HTML improvements:** A11Y-003, A11Y-018, A11Y-028, A11Y-031, A11Y-035. +6. **Semantic HTML improvements:** A11Y-003 (completed), A11Y-018 (completed), A11Y-028 (completed), A11Y-031, A11Y-035 (completed). 7. **Remaining low-priority items:** A11Y-022, A11Y-025, A11Y-027, A11Y-032. +> "(completed)" means the fix is merged into `develop`. 15 of 35 findings are done: A11Y-001, 002, 003, 004, 005, 006, 008, 010, 016, 018, 019, 020, 021, 028, 035. +> +> Partially covered: A11Y-005 — one control is still unlabeled, tracked as FU-004 in `FOLLOW_UPS.md`. A11Y-032 was in scope of the semantic-HTML branch but was not fixed; `RedeemPopup` still uses `` with no `href`. + --- *Generated from a repository-wide accessibility audit. Line numbers reflect the state of the code at audit time and may shift as the codebase changes; re-verify before fixing. Automated color-contrast testing (axe/Lighthouse) and manual screen-reader passes (NVDA, VoiceOver) are recommended to complement this static review.* diff --git a/docs/accessibility/FOLLOW_UPS.md b/docs/accessibility/FOLLOW_UPS.md index b207d07815..8cdde2d8c6 100644 --- a/docs/accessibility/FOLLOW_UPS.md +++ b/docs/accessibility/FOLLOW_UPS.md @@ -282,3 +282,58 @@ Hoist `handleMouseEnter` (and any other Hooks) above the conditional so they run - File: `src/features/common/WebappButton/index.tsx` (link branch). - Related: shared `isExternalUrl` helper in `src/utils/url.ts`. + +## FU-006 — Give empty-state illustrations a text alternative + +**Status:** Open. +**Origin:** Surfaced during A11Y-010 (live regions) while checking whether the PlanetCash empty transactions state is announced. It is not announced, but the cause is a missing text alternative (WCAG 1.1.1), not a missing live region (4.1.3), so it is out of scope for A11Y-010. +**Priority:** Medium — `NoTransactionsFound` is a real content gap for screen reader users; the rest is consistency work. + +### Background + +`NoTransactionsFound` renders an illustration and nothing else: + +```tsx +const NoTransactionsFound = (): ReactElement => { + return ( + + + + ); +}; +``` + +`TransactionsNotFound` is a bare inline `` with no `role`, no ``, and no `aria-label`. So a sighted user sees "you have no transactions" and a screen reader user gets nothing at all: the container is empty as far as assistive tech is concerned. + +The neighbouring `NoDataFound` illustration in the projects list has the inverse problem. It is also unlabeled, but it sits next to a visible "No project found" paragraph that already carries the meaning, so the SVG is decorative and should be hidden rather than named. + +### Proposal + +Prefer real text over an SVG label, so the empty state is visible to everyone and translatable: + +1. Add a visible message to `NoTransactionsFound` (new `Me` namespace key, for example `noTransactionsFound`; no such key exists today), mirroring how `ProjectList` pairs `NoDataFound` with `noProjectFound` text. +2. Mark both illustrations `aria-hidden="true"` once the text carries the meaning. Following the A11Y-002 convention, wrap the icon component in `