diff --git a/CODE-AUDIT.md b/CODE-AUDIT.md index 893bfab..23aaab6 100644 --- a/CODE-AUDIT.md +++ b/CODE-AUDIT.md @@ -952,9 +952,16 @@ are an undefined spacing/radius/type scale and a drift between Fluent components ### Hover, focus, disabled, keyboard & accessibility -- [ ] **UI27 — Command palette uses JS hover, not CSS.** Items highlight via `onMouseEnter` setting +- [x] **UI27 — Command palette uses JS hover, not CSS.** Items highlight via `onMouseEnter` setting `itemActive` (no `:hover`), unlike every other list, and expose no `aria-selected`/active-descendant, so the highlight is invisible to screen readers. **Standard:** CSS `:hover` + listbox/option semantics. + *Fixed in [CommandPalette.tsx](src/renderer/src/components/CommandPalette.tsx): the input is now a + `role="combobox"` with `aria-controls`/`aria-activedescendant`/`aria-autocomplete="list"`, the list is a + `role="listbox"`, and each row is a `role="option"` with `aria-selected` — so the active row is announced + to Narrator via active-descendant (the standard combobox pattern; focus stays on the input, so the rows + became non-focusable `div`s rather than `button`s). `onMouseEnter` is kept deliberately: it unifies the + pointer and keyboard highlight onto one `sel` state, which — now that `aria-activedescendant` tracks it — + is more correct than a pure CSS `:hover` (which wouldn't move the announced selection).* - [x] **UI28 — Command palette input has no focus ring.** The search `` sets `outline: 'none'` with no replacement. **Standard:** a visible focus ring (Fluent stroke token). *(a11y)* - [x] **UI29 — Fragmented focus treatment.** Fluent ring (Fluent controls) vs custom border (Select) @@ -968,9 +975,16 @@ are an undefined spacing/radius/type scale and a drift between Fluent components so that control can't show a disabled state while Fluent controls can. **Standard:** add `disabled` + styling. - [ ] **UI32 — Native-control dark mode is uneven.** The DownloadBar `datetime-local` sets `colorScheme: 'light dark'` explicitly; the `Select` relies on the root `colorScheme`. **Standard:** set `colorScheme` consistently on both. -- [ ] **UI33 — No semantic headings.** Titles render as `Subtitle2`/`Title2` (styled spans), so there's +- [x] **UI33 — No semantic headings.** Titles render as `Subtitle2`/`Title2` (styled spans), so there's no h1–h6 hierarchy for screen-reader heading navigation (landmarks `