Overview
expo-router supports web rendering and tablet form factors. On iPad with external keyboard or React Native Web, there is no keyboard navigation support: Tab key does not move focus between interactive elements, Enter does not activate buttons, and Escape does not dismiss modals. This violates WCAG 2.1 Level AA keyboard accessibility guidelines and breaks expected UX on iPadOS with Smart Keyboard.
Specifications
Features:
- All interactive elements reachable via Tab key in logical DOM order
- Enter/Space activates focused buttons, links, and form controls
- Escape closes modals, drawers, and dropdowns
- Visible focus indicator on all focused elements
Tasks:
- Audit all interactive components for
accessible={true} and accessibilityRole
- Add
onKeyPress handlers for Enter/Space on custom interactive components
- Add global
'keydown' Escape listener for modal and drawer close
- Implement
useFocusTrap hook for modal dialogs
- Test with iPad + Smart Keyboard and VoiceOver
Impacted Files:
src/components/common/Modal.tsx
src/components/common/Drawer.tsx
- All interactive custom components
Acceptance Criteria
- All interactive elements reachable via Tab without mouse/touch
- Enter activates focused buttons
- Escape dismisses focused modal or dropdown
- Focus indicator visible on all focused elements
- No WCAG 2.1 AA keyboard accessibility violations
Overview
expo-router supports web rendering and tablet form factors. On iPad with external keyboard or React Native Web, there is no keyboard navigation support: Tab key does not move focus between interactive elements, Enter does not activate buttons, and Escape does not dismiss modals. This violates WCAG 2.1 Level AA keyboard accessibility guidelines and breaks expected UX on iPadOS with Smart Keyboard.
Specifications
Features:
Tasks:
accessible={true}andaccessibilityRoleonKeyPresshandlers for Enter/Space on custom interactive components'keydown'Escape listener for modal and drawer closeuseFocusTraphook for modal dialogsImpacted Files:
src/components/common/Modal.tsxsrc/components/common/Drawer.tsxAcceptance Criteria