Repository navigation
a11y(forms,omni,icons): combobox + durable labels + icon names (#2347 #2349 #2353) - #2364
Conversation
|
Internal review: LGTM (advisory — human approval required) Authored by Mattingly; reviewed by Lovell.
|
|
Rebased onto merged base a8718a7. Conflicts resolved in ests/a11y.spec.ts (branch's new tests renumbered to A71–A79) and ACCESSIBILITY.md (union merge). Final suite: 70 passed / 7 skipped / 0 failed. — Mattingly |
e8e4600 to
a1a9d26
Compare
|
Rebase round 2 — rebased onto \kpoin/ui-testing\ @ e0d1c92 (#2360 backend merged) Conflicts resolved in \ ests/a11y.spec.ts\ and \ACCESSIBILITY.md\ by keeping both sides (base's A35–A45 presets + A51–A58 backend AND this branch's A71–A79 forms/omni/icons tests). \styles.css\ auto-merged cleanly. No renumbering needed — ranges already disjoint. Final suite: 78 passed / 7 skipped / 0 failed — Mattingly |
a1a9d26 to
389dfee
Compare
|
Rebase round 3 complete — rebased onto \kpoin/ui-testing\ @ 7eb0c6c (post #2359 models merge). Conflicts resolved by keeping both sides:
Full suite result: 83 passed / 7 skipped / 0 failed. Branch force-pushed to \origin/feat/gui3-forms-icons-a11y. — Mattingly |
…-button names Closes #2347 #2349 #2353 - role=combobox, aria-expanded, aria-controls, aria-activedescendant, aria-autocomplete=list - Arrow key navigation (Down/Up move active option), Enter selects, Escape closes - Converted <button role=option> to <div role=option> (buttons can't own role=option) - Moved HF search action outside role=listbox to avoid aria-required-children violation - Label associated via htmlFor/id pair; options get stable id for activedescendant - Added .omni-component-picker__option--focused CSS for keyboard-navigation highlight - Clear button gained aria-label - Cloud provider form: 3 bare inputs now have <label class=sr-only htmlFor>+id - Edit-API-key inline input: aria-label naming the provider - Marketplace search: aria-label='Search marketplace apps' - aria-describedby hint span for base URL format - LogViewer search input: aria-label='Filter logs' - LogViewer Clear button: aria-label='Clear log output' - LogViewer Reconnect button: aria-label='Reconnect to log stream' - MarkdownMessage code-block copy button: aria-label='Copy code' in generated HTML - OmniComponentPicker clear button: aria-label=Clear {role} Tests: 9 new tests A35-A43; full suite 59 passed / 7 skipped / 0 failed Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
389dfee to
6bc7fbe
Compare
|
Rebase round 4 complete — rebased onto \1c3bb93f\ (merged base after #2362 download a11y). Conflict resolution: kept both sides throughout:
Test results: 87 passed / 7 skipped / 0 failed ✅ — Mattingly |
…-button names (#2364) Closes #2347 #2349 #2353 - role=combobox, aria-expanded, aria-controls, aria-activedescendant, aria-autocomplete=list - Arrow key navigation (Down/Up move active option), Enter selects, Escape closes - Converted <button role=option> to <div role=option> (buttons can't own role=option) - Moved HF search action outside role=listbox to avoid aria-required-children violation - Label associated via htmlFor/id pair; options get stable id for activedescendant - Added .omni-component-picker__option--focused CSS for keyboard-navigation highlight - Clear button gained aria-label - Cloud provider form: 3 bare inputs now have <label class=sr-only htmlFor>+id - Edit-API-key inline input: aria-label naming the provider - Marketplace search: aria-label='Search marketplace apps' - aria-describedby hint span for base URL format - LogViewer search input: aria-label='Filter logs' - LogViewer Clear button: aria-label='Clear log output' - LogViewer Reconnect button: aria-label='Reconnect to log stream' - MarkdownMessage code-block copy button: aria-label='Copy code' in generated HTML - OmniComponentPicker clear button: aria-label=Clear {role} Tests: 9 new tests A35-A43; full suite 59 passed / 7 skipped / 0 failed Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Summary
Group F accessibility fixes for blind NVDA user on the GUI3 branch. Three issues resolved in
prototype/ui-redesign/.#2347 — OmniComponentPicker full combobox semantics
File:
src/components/ModelManager.tsx(OmniComponentPicker, ~lines 807–920)The custom Omni model component picker lacked combobox ARIA semantics entirely. Changes:
role="combobox",aria-expanded,aria-controls(pointing to the listbox id),aria-activedescendant(tracking the focused option by id), andaria-autocomplete="list"to the input.<button role="option">to<div role="option">— buttons are not allowed to ownrole="option"per ARIA spec.role="listbox"to avoidaria-required-childrenviolations.htmlFor/idpair..omni-component-picker__option--focusedCSS for keyboard-navigation highlight.aria-labelmatching itstitle.Closes #2347
#2349 — ConnectView cloud/marketplace form durable labels
File:
src/components/ConnectView.tsxThe cloud provider form (provider name, base URL, API key) and the marketplace search relied solely on placeholders. Changes:
<label className="sr-only" htmlFor=...>with matchingidattributes.aria-labelnaming the provider.aria-label="Search marketplace apps".aria-describedbyhint span for the base URL format.Closes #2349
#2353 — Icon-only/title-only controls reliable accessible names
Files:
src/components/LogViewer.tsx,src/components/MarkdownMessage.tsx,src/components/ModelManager.tsxSwept components outside the Groups A–E conflict zone:
aria-label="Filter logs"; Clear button →aria-label="Clear log output"; Reconnect button →aria-label="Reconnect to log stream".aria-label="Copy code"added to the template.aria-labelmatching the role name (also in item 10 scope).Closes #2353
Tests
9 new Playwright tests (A35–A43) added to
tests/a11y.spec.ts:getByLabel; marketplace search aria-label verified.Test result: 59 passed / 7 skipped / 0 failed (was 50/7/0 before this PR; +9 new tests all green).
A human reviewer should verify NVDA screen reader UX on the Omni collection form before merging.