Selection field
Dropdown
Single or multiple selection in a field you can read at rest — chips, a limit, and a panel you may replace entirely.Reviewers are notified once the pull request opens
Semantics
The combobox pattern, wired to a real input rather than to a div that pretends to be one.
The input is the combobox
role="combobox" sits on the real input with aria-expanded, aria-controls and aria-activedescendant. Screen readers get one control, not a focusable wrapper with an unnamed field inside it.
The panel is a listbox
role="listbox" with aria-multiselectable in multiple mode; every row is an option carrying aria-selected.
Virtual focus
Real focus never leaves the field. Rows are pointed at with aria-activedescendant and are not tab stops.
Blocked rows announce themselves
A row you cannot pick — disabled in the data, or blocked by max — carries aria-disabled and is skipped by the arrows.
The label names the field
The label prop wires for/id through the text field. With labelPlacement="hidden" it is still there for assistive tech.
Keyboard, and a way to check it
Focus the field on the left and press a key: the binding that claims it lights up. If a row does not light up, the map is wrong — that is the point.
Reviewers are notified once the pull request opens
Focus the field and press a key — the matching row lights up
ArrowDownArrowUp
fieldOpen, then move
Closed, either arrow opens the panel on the current value. Open, they walk the rows and skip everything disabled.
Enter
fieldPick the active row
Opens a closed panel; chooses the active row when open. Single mode closes after, multiple keeps collecting.
Space
fieldSame as Enter
A select has no text to type, so Space belongs to selection here. In the autocomplete it stays a character.
HomeEnd
panel openFirst and last row
Jumps to either end of the list while the panel is open.
Escape
panel openClose, keep the value
Closes the panel without changing the selection.
Tab
panel openClose and leave
Closes the panel and lets focus continue to the next control.
ArrowLeftArrowRight
multipleWalk into the chips
With multiple selection, ArrowLeft steps back into the chips; ArrowRight walks out again.
BackspaceDelete
multipleRemove a chip
Deletes the focused chip, or the last one when no chip is focused. Mandatory keeps the final value.