fix(Select/List): improvedA11y combobox VPAT fixes (Hub #242, #391, #392)#1149
Merged
Conversation
List destructured only aria-label and applied it to the ul/ol, so aria-labelledby fell into ...rest and landed on the outer wrapper div instead of the role="listbox" element. Consumers passing aria-labelledby via menuProps (e.g. Select in improvedA11y mode) got a listbox with no accessible name. Destructure aria-labelledby and apply it alongside aria-label on both ul and ol. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. |
…ncements Two WAI-ARIA APG combobox defects in improvedA11y mode: 1. aria-selected was set once from the committed value (opt.selected) and never moved as arrow keys changed the active descendant, so focus and selection state diverged. For single-select listboxes, selection now follows focus (aria-selected tracks the active option). Multi-select listboxes keep aria-selected on the committed choices, as required. 2. The visually-hidden live region reacted only to dropdownVisible/options/ searchQuery/selectLocale, never to activeDescendantId, so VoiceOver announced only "expanded" and never the highlighted option as the user arrowed through (NVDA compensates via native aria-activedescendant). The active option's text and position are now announced. Tradeoff: NVDA hears the option name twice (native + echo). The "of" connector is localizable via optionPositionSeparatorText (added to en_US/en_GB; other locales fall back to "of" pending translation). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
49e0625 to
3b8c11c
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #1149 +/- ##
==========================================
+ Coverage 84.97% 84.99% +0.01%
==========================================
Files 1230 1230
Lines 21542 21553 +11
Branches 8185 8191 +6
==========================================
+ Hits 18306 18318 +12
+ Misses 3150 3149 -1
Partials 86 86 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
ychhabra-eightfold
approved these changes
Jul 9, 2026
Adds the live-region position connector ("of" in "Apple, 1 of 3") to all
42 Select locales. Order-reversed / no-natural-word languages (Hindi,
Telugu, CJK, Turkish, Finnish, Hungarian) use the universal "/" separator
where a bare connector word would be grammatically wrong.
Addresses review feedback on #1149.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Collaborator
Author
|
Tracked in ENG-202332 — https://eightfoldai.atlassian.net/browse/ENG-202332 (TA Everest - Sprint 40). |
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Summary
Fixes three WAI-ARIA APG combobox a11y defects confirmed live on QA (Allyant Hub #242, #391, #392), all rooted in the shared
Select/Menu/Listcomponents inimprovedA11ymode. A single library fix resolves them for everyimprovedA11ySelectconsumer (TemplateSelectModal,TimeSlotSelect, and any other usage).1. Listbox missing accessible name (#391)
Listdestructured onlyaria-labeland applied it to the<ul>/<ol>;aria-labelledbyfell into...restand landed on the outer wrapper<div>instead of therole="listbox"element. Consumers passingaria-labelledbyviamenuProps(e.g.TimeSlotSelect) got a listbox with no accessible name. Now forwarded to both<ul>and<ol>alongsidearia-label.2.
aria-selecteddoesn't follow keyboard focus (#392, #242)aria-selectedwas set once from the committed value (opt.selected) and never moved as Arrow keys changed the active descendant, so focus and selection state diverged. Per the APG Combobox pattern ("selection follows focus in the listbox"), single-select listboxes now track the active descendant. Multi-select listboxes keeparia-selectedon the committed choices (guarded with!multiple) — moving it with focus there would be incorrect.3. VoiceOver never announces the highlighted option (#392, #242)
The visually-hidden live region reacted only to
dropdownVisible/options/searchQuery/selectLocale, never toactiveDescendantId, so VoiceOver announced only "expanded" and nothing as the user arrowed through options (NVDA compensates via nativearia-activedescendant). The active option's text and position are now announced.The "of" connector in the announcement ("Apple, 1 of 3") is localizable via a new optional
optionPositionSeparatorTextlocale key (set onen_US/en_GB; other locales fall back to"of"in code pending translation).Test plan
npx jest src/components/List src/components/Select src/components/Menu→ 122 tests pass, snapshots clean.menuProps.aria-labelledby→ SelectrestMenuProps→ Menu...rest→ List →<ul role="listbox">.Consumer impact
No app-side code changes needed.
vscodeconsumers already pass correct attributes; they only need to bump@eightfold.ai/octupleafter this releases.