Skip to content

a11y: screen reader and keyboard improvements#260

Closed
jamiepine wants to merge 3 commits intomainfrom
a11y/screen-reader-and-keyboard-improvements
Closed

a11y: screen reader and keyboard improvements#260
jamiepine wants to merge 3 commits intomainfrom
a11y/screen-reader-and-keyboard-improvements

Conversation

@jamiepine
Copy link
Owner

@jamiepine jamiepine commented Mar 13, 2026

Summary

Rebased/merged version of #243 by @ways2read, updated to resolve conflicts with latest main.

  • Screen reader improvements with ARIA labels and roles across the UI
  • Keyboard navigation enhancements for model management, generation forms, and profile cards
  • Extracted ModelItem sub-component with accessible status announcements

Single conflict resolved in ModelManagement.tsx — kept the PR's ModelItem component with a11y attributes alongside main's updated model management features.

See #243 for full description and discussion.


Original PR: #243 by @ways2read (Richard Orme).

Summary by CodeRabbit

Release Notes

  • New Features

    • Enhanced keyboard navigation: Use Enter or Space keys to interact with buttons, history items, and story selections throughout the interface.
    • Improved screen reader support: Added comprehensive ARIA labels, roles, and keyboard shortcuts across all major UI components for better accessibility.
  • Documentation

    • Added accessibility guide documenting keyboard interactions and screen reader enhancements.

ways2read and others added 3 commits March 7, 2026 12:02
- Audio player: aria-labels for Play/Pause, Loop, Mute, Close; labelled playback and volume sliders
- Generation: aria-labels for Generate speech and Fine tune instructions buttons
- Voice cards: focusable, labelled, Enter/Space to select
- History rows: focusable, labelled, Enter/Space to play; transcript textarea labelled
- Voices tab: focusable rows, labelled, Enter/Space to edit; Actions button labelled
- Model management: focusable model rows and labelled Download/Delete buttons
- Server tab: regions with aria-label and tabIndex for Connection, Status, App Updates
- Stories: focusable story rows, labelled, Enter/Space to select; Actions and track editor buttons labelled
- Voice profile samples: Play/Pause/Stop and mini-player slider labelled

Tested with NVDA and Narrator on Windows. See docs/PR-ACCESSIBILITY.md for full description.

Made-with: Cursor
- HistoryTable: skip row key handler when focus is on Actions button (Enter/Space)
- StoryList: expose selected story (aria-pressed, 'Selected' in label)
- ProfileCard: skip card key handler when focus is on Export/Edit/Delete
- VoicesTab: keep table semantics; edit button in first cell instead of role=button on row
- PR-ACCESSIBILITY.md: 'Fine-tune' wording, 'focus on the text area' phrasing

Made-with: Cursor
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 13, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a00637cb-64ef-42e9-b19b-788c45ac11df

📥 Commits

Reviewing files that changed from the base of the PR and between 670900b and b92b0dd.

📒 Files selected for processing (16)
  • app/src/components/AudioPlayer/AudioPlayer.tsx
  • app/src/components/Generation/FloatingGenerateBox.tsx
  • app/src/components/History/HistoryTable.tsx
  • app/src/components/ServerSettings/ConnectionForm.tsx
  • app/src/components/ServerSettings/ModelManagement.tsx
  • app/src/components/ServerSettings/ServerStatus.tsx
  • app/src/components/ServerSettings/UpdateStatus.tsx
  • app/src/components/StoriesTab/StoryList.tsx
  • app/src/components/StoriesTab/StoryTrackEditor.tsx
  • app/src/components/VoiceProfiles/AudioSampleRecording.tsx
  • app/src/components/VoiceProfiles/AudioSampleSystem.tsx
  • app/src/components/VoiceProfiles/AudioSampleUpload.tsx
  • app/src/components/VoiceProfiles/ProfileCard.tsx
  • app/src/components/VoiceProfiles/SampleList.tsx
  • app/src/components/VoicesTab/VoicesTab.tsx
  • docs/PR-ACCESSIBILITY.md

📝 Walkthrough

Walkthrough

This pull request adds comprehensive accessibility enhancements across the application, including ARIA labels, keyboard navigation support, semantic roles, and region landmarks to 16 UI components. A documentation file details the improvements. No public API changes or core logic modifications were introduced.

Changes

Cohort / File(s) Summary
Audio Playback & Sample Controls
app/src/components/AudioPlayer/AudioPlayer.tsx, app/src/components/VoiceProfiles/AudioSample*.tsx, app/src/components/VoiceProfiles/SampleList.tsx
Added aria-labels to Play/Pause buttons reflecting state (Play/Pause), slider labels, stop buttons, and volume controls. Volume slider includes aria-valuetext with duration formatting. AudioPlayer also introduces visually hidden volume label and role="group" on volume container.
Story & Track Components
app/src/components/StoriesTab/StoryList.tsx, app/src/components/StoriesTab/StoryTrackEditor.tsx
Made story items keyboard-accessible with role="button", tabIndex, and onKeyDown handlers for Enter/Space. Added aria-labels describing story details, selection state, and action buttons. StoryTrackEditor adds aria-labels to playback, split, duplicate, delete, and zoom controls.
Voice Profile Selection
app/src/components/VoiceProfiles/ProfileCard.tsx, app/src/components/VoicesTab/VoicesTab.tsx
ProfileCard now keyboard-accessible with role="button", tabIndex, dynamic aria-label reflecting selection, and aria-pressed state. VoicesTab refactors name/description display into an editable button wrapper and adds aria-label to actions dropdown.
Server & Model Management
app/src/components/ServerSettings/ConnectionForm.tsx, app/src/components/ServerSettings/ModelManagement.tsx, app/src/components/ServerSettings/ServerStatus.tsx, app/src/components/ServerSettings/UpdateStatus.tsx
Added region roles and aria-labels to Card containers (Server Connection, Server Status, App Updates). ModelManagement introduces new ModelItem component with status badges, size display, and action buttons supporting download/delete states with accessibility attributes.
Generation & History
app/src/components/Generation/FloatingGenerateBox.tsx, app/src/components/History/HistoryTable.tsx
FloatingGenerateBox adds aria-labels to generate button reflecting pending/profile selection state and instruct toggle. HistoryTable adds role="button", tabIndex, and onKeyDown handlers to rows for keyboard playback activation; extends transcript textarea with aria-label.
Documentation
docs/PR-ACCESSIBILITY.md
New file documenting accessibility improvements across components, including ARIA attributes, keyboard interactions, screen-reader considerations, and testing notes for NVDA/Narrator.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 Hop skip and a leap, accessibility's deep,
With ARIA labels and keyboard we keep,
Each button now speaks, each slider sings clear,
Screen readers rejoice, inclusion is here! 🎵✨

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch a11y/screen-reader-and-keyboard-improvements
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@jamiepine
Copy link
Owner Author

No longer needed — pushed the merge fix directly to the contributor's fork on PR #243.

@jamiepine jamiepine closed this Mar 13, 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.

2 participants