Description
While the app has good accessibility foundations (ARIA live regions, focus trap, screen-reader-only content), several gaps remain:
Missing Accessibility Features
| Component |
Issue |
| GraphView |
No ARIA labels on canvas; Sigma.js renders to <canvas> — inherently inaccessible |
| MindMapView |
Mind Elixir nodes have no ARIA labels; sr-only summary does not update dynamically |
| CommandPalette.tsx |
Input missing aria-label; no role="combobox" with proper aria-autocomplete |
| ExportPanel.tsx |
Export buttons have no aria-live feedback for completion/error |
| AIHarness.tsx |
Chat messages have no role="log" or aria-live for screen readers |
| AIHarness.tsx |
Checkbox label not properly associated (no explicit id/htmlFor) |
| ThemeSwitcher.tsx |
Compact mode dropdown lacks aria-activedescendant for keyboard navigation |
Already Implemented (Good)
- ✅
useFocusTrap hook for modals/drawers
- ✅
useEscapeKey hook
- ✅
aria-expanded on progressive disclosure toggles
- ✅
aria-pressed on filter chips
- ✅
aria-current="page" on active nav
- ✅
aria-live="polite" for search status
- ✅
role="listbox"/role="option" on search results
- ✅
sr-only class for screen-reader-only content
Recommended Fix
- Add ARIA attributes to graph canvas container
- Make CommandPalette follow combobox pattern (WAI-ARIA APG)
- Add
role="log" and aria-live="polite" to AI chat messages
- Add
aria-live feedback for export completion
- Fix checkbox label association in AIHarness
- Update MindMapView
sr-only summary dynamically
Acceptance Criteria
Description
While the app has good accessibility foundations (ARIA live regions, focus trap, screen-reader-only content), several gaps remain:
Missing Accessibility Features
<canvas>— inherently inaccessiblesr-onlysummary does not update dynamicallyaria-label; norole="combobox"with properaria-autocompletearia-livefeedback for completion/errorrole="log"oraria-livefor screen readersid/htmlFor)aria-activedescendantfor keyboard navigationAlready Implemented (Good)
useFocusTraphook for modals/drawersuseEscapeKeyhookaria-expandedon progressive disclosure togglesaria-pressedon filter chipsaria-current="page"on active navaria-live="polite"for search statusrole="listbox"/role="option"on search resultssr-onlyclass for screen-reader-only contentRecommended Fix
role="log"andaria-live="polite"to AI chat messagesaria-livefeedback for export completionsr-onlysummary dynamicallyAcceptance Criteria