♿ Add VoiceOver and TalkBack Accessibility Support #72
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
♿ Add VoiceOver and TalkBack Accessibility Support
Summary
Implements comprehensive screen reader accessibility for the timer picker component, enabling VoiceOver (iOS) and TalkBack (Android) users to interact with all picker columns using native swipe gestures.
What's Changed
New Files
src/utils/useScreenReaderEnabled.ts- Hook to detect screen reader state with automatic change detectionModified Files
src/components/DurationScroll/types.ts- Added accessibility-related propssrc/components/DurationScroll/DurationScroll.tsx- Implemented accessible picker with adjustable rolesrc/components/TimerPicker/types.ts- Added accessibility label propssrc/components/TimerPicker/TimerPicker.tsx- Integrated screen reader detection and passed accessibility propssrc/index.ts- ExporteduseScreenReaderEnabledhookREADME.md- Documented new accessibility features and propsFeatures
✅ Native Screen Reader Support
✅ Immediate Audio Feedback
padWithZero, 12-hour format, etc.)✅ Conditional Behavior
✅ Internationalization Ready
New Props
TimerPicker/TimerPickerModalaccessibilityLabel?: string- Label for entire pickeraccessibilityLabels?: { days, hours, minutes, seconds, picker, hint }- Per-column labelsTechnical Implementation
AccessibilityInfoAPI to detect VoiceOver/TalkBack stateaccessibilityRole="adjustable"importantForAccessibility="no-hide-descendants"accessibilityElementsHidden(iOS) andimportantForAccessibility(Android)Breaking Changes
None - fully backward compatible. Default behavior unchanged when screen readers are disabled.
Testing
Manual Testing Required:
Automated Tests:
All existing tests pass. Accessibility features don't interfere with test queries (default
isScreenReaderEnabled={false}).Documentation
Updated README with:
useScreenReaderEnabledhook in custom components