[Accessibility] Fix accessibility roles and states for radio buttons, checkboxes, and tabs#81054
[Accessibility] Fix accessibility roles and states for radio buttons, checkboxes, and tabs#81054marcochavezf merged 10 commits intoExpensify:mainfrom
Conversation
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 23adcc373d
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| // Use radio role for single-select (e.g. Date dropdown options), checkbox for multi-select, button otherwise | ||
| const isRadioOption = !canSelectMultiple && !!rightHandSideComponent; | ||
| const isCheckboxOption = canSelectMultiple; |
There was a problem hiding this comment.
Avoid inferring radio roles from right-hand content
The new heuristic const isRadioOption = !canSelectMultiple && !!rightHandSideComponent treats any list row that supplies a right-hand component as a radio button. That’s not always true: e.g., SelectionListWithSections in src/pages/NewChatPage.tsx passes a right-hand component to render the “Add to group” button or select circle (see itemRightSideComponent), but the list isn’t a single-choice radio group and canSelectMultiple isn’t set. With this change those rows will be announced as radios with a checked state based on item.isSelected, which is misleading for screen reader users and changes behavior vs. before. Consider making the radio role explicit (e.g., a prop from RadioListItem) instead of inferring it from rightHandSideComponent presence.
Useful? React with 👍 / 👎.
eh2077
left a comment
There was a problem hiding this comment.
Looks good! @ashu75575 Are you able to test with simulators?
JmillsExpensify
left a comment
There was a problem hiding this comment.
Awesome polish for usability.
Yes Screen.Recording.2026-02-02.at.8.55.38.PM.movScreen.Recording.2026-02-02.at.8.56.34.PM.1.movScreen.Recording.2026-02-02.at.11.44.18.PM.mov |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb ChromeiOS: HybridAppScreen.Recording.2026-02-04.at.9.50.40.PM.moviOS: mWeb SafariMacOS: Chrome / Safari |
eh2077
left a comment
There was a problem hiding this comment.
Looks good and tested well with iOS App
|
🚧 @marcochavezf has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/marcochavezf in version: 9.3.13-1 🚀
|
|
🚀 Deployed to staging by https://github.com/marcochavezf in version: 9.3.15-0 🚀
|
Explanation of Change
Improves accessibility for selection lists and tab selector
Selection list items
Tab selector
Fixed Issues
$ #79240
PROPOSAL: #79240 (comment)
Tests
[X] Verify that no errors appear in the JS console
Offline tests
QA Steps
Same as tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectioncanBeMissingparam foruseOnyxtoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
NOTE: This is a screen reader accessibility change with no visual differences. Testing requires screen reader software (VoiceOver on iOS/macOS or TalkBack on Android).