Product picker — accessibility
Keyboard
- Same as Entity picker:
button.add-refopens with Enter or Space and focuses the search; typing searches from 2 characters (debounce 180 ms). - Enter in the search picks the first product; the free-text row only when no product is listed. Nothing is picked while results are loading.
- Arrow keys, Home and End move between rows including the free-text row (canonical
Popover); rows are Tab stops; Enter or Space picks. - Multi: the panel stays open and the search keeps focus after a pick.
multi={false}: a pick closes the panel. - Esc or click outside closes the panel.
ARIA
- Trigger
aria-haspopup="listbox",aria-expanded. - Panel = Record select: search input with
aria-label; listrole="listbox"witharia-label(labelor "Produkty"); rowsbutton[role="option"]witharia-selected="false". - Product status is text in
sub("koncept", "ke schválení"), part of the row name — not colour. - Error state carries a retry button with its own name.
Focus
- On close (Esc, outside click,
maxreached) focus returns to „Přidat“ (DS.RecordRefField, acrm !4502).
- Foundation ring on
.add-ref, rows and token "×"; search input without its own ring. - After a pick in multi mode focus stays in the search.
Contrast
Record select tokens: name 17.59:1 (light) / 14.53:1 (dark); sub --fg-secondary ≥ 4.5:1 (light, #707477) / 6.2:1 (dark); empty and loading text --fg-muted 2.85:1 / 3.63:1.
Known limits
- No live region for loading or result count changes.
- Empty and loading text use
--fg-mutedon purpose: supplementary text stays light (owner, 3 Oct 2026).
Source: docs/select/product-picker.a11y.md · GitLab