Audit finding from #300 (commit 679f9fe)
Severity: medium
Category: a11y
File: crates/web/src/components/search/results.rs:96
Obvious fix: no
Description
Every ResultRow is rendered with selected=Signal::derive(|| false). There is no roving-tabindex / aria-activedescendant wiring, so keyboard users cannot tell which row would be activated by Enter, and screen readers never see a selected option in the listbox the spec calls out.
Impact / Threat
User-facing — keyboard / screen-reader navigation through search results is effectively broken.
Suggested fix
Track an active_index signal at the surface level, derive selected per row by comparing against active_index, drive Up/Down/Home/End from <SearchInput>'s on_keydown, and set aria-activedescendant on the input.
Verify
rg "Signal::derive\(\|\| false\)" crates/web/src/components/search
Audit finding from #300 (commit 679f9fe)
Severity: medium
Category: a11y
File: crates/web/src/components/search/results.rs:96
Obvious fix: no
Description
Every
ResultRowis rendered withselected=Signal::derive(|| false). There is no roving-tabindex /aria-activedescendantwiring, so keyboard users cannot tell which row would be activated by Enter, and screen readers never see a selected option in the listbox the spec calls out.Impact / Threat
User-facing — keyboard / screen-reader navigation through search results is effectively broken.
Suggested fix
Track an
active_indexsignal at the surface level, deriveselectedper row by comparing againstactive_index, drive Up/Down/Home/End from<SearchInput>'son_keydown, and setaria-activedescendanton the input.Verify
rg "Signal::derive\(\|\| false\)" crates/web/src/components/search