# Combobox
A text input that filters a list of options as you type, for one value or several shown as chips, with async results.
```ehtml Example
import {
Combobox, ComboboxItem, ComboboxGroup, ComboboxRow, ComboboxLabel, ComboboxSeparator,
} from "@elements/ui/combobox";
{tag.name} find(search, q)}>
{u.name}
```
## Parts
| Part | What it is |
|---|---|
| `Combobox` | The root: the input chrome (chips, input, clear and trigger buttons), the hidden form input and the listbox popup. |
| `ComboboxItem` | An option. Filtering hides it when its text and keywords do not match. |
| `ComboboxGroup` | A labelled group, hidden while none of its items match. |
| `ComboboxRow` | With grid: a row of items, which become its cells. Hidden while none of its items match. |
| `ComboboxLabel` | A label row the keyboard skips. |
| `ComboboxSeparator` | A line between groups, hidden while a query filters. |
## Slots
| Slot | Part | Content |
|---|---|---|
| `default` | | ComboboxItem, ComboboxGroup, ComboboxRow, ComboboxLabel and ComboboxSeparator parts, after any items. |
| `default` | `ComboboxRow` | The row's ComboboxItem cells. |
| `empty` | | Replaces emptyText when nothing matches. |
| `start` | | An icon or text inside the input chrome, before the input. |
| `default` | `ComboboxItem` | The option's content. |
| `indicator` | `ComboboxItem` | Replaces the check shown while selected. |
## Keyboard
| Keys | Action |
|---|---|
| `Typing` | Opens the list and filters it. |
| `ArrowDown` | Opens on the selected option (or the first); then moves down. Past the last, back to the input; again, the first. |
| `ArrowUp` | Opens on the last option; then moves up. Past the first, back to the input; again, the last. |
| `Alt + ArrowDown` | Opens without highlighting an option. |
| `Alt + ArrowUp` | Closes the list. |
| `PageUp / PageDown` | Moves ten options. |
| `Enter` | Picks the highlighted option. |
| `Escape` | Closes the list; single selection puts the selected label back in the input. Typed text that chose nothing stays. |
| `Escape (closed)` | Clears typed text that chose nothing. |
| `ArrowDown / Enter / Space on the trigger` | inputInPopup: opens with focus in the search input. |
| `ArrowLeft / ArrowRight / Home / End` | Move the caret, and give the highlight back to the input. |
| `Backspace` | multiple, in an empty input: removes the last value, counted in "+N more" when chipLimit hides it. |
| `ArrowLeft at the start` | multiple: moves to the chips; Left and Right move between them, Right past the last returns to the input. |
| `Backspace / Delete on a chip` | Removes it. |
| `Tab` | Closes and moves on; typed text that chose nothing clears. |
| `Arrows (grid)` | With grid: Up and Down move to the same column of the next row, Left and Right to the next cell (across rows); with nothing highlighted, Left and Right move the caret. |
| `Home / End, Ctrl + Home / End (grid)` | With grid and a cell highlighted: the row's first and last cell; the grid's first and last cell. |
## Data attributes
| Attribute | Values | On | Description |
|---|---|---|---|
| `data-state` | `"open" \| "closed"` | .combobox-content | |
| `data-anchor-hidden` | present | .combobox-content | While the input is scrolled out of view; the popup is hidden. Never with sticky. |
| `data-side, data-align` | side, alignment | .combobox-arrow | Where the arrow sits, after a flip. |
| `data-uncentered` | present | .combobox-arrow | The arrow cannot point at the input's middle. |
| `data-state` | `"open" \| "closed"` | .combobox-arrow, .combobox-backdrop | |
| `data-popup-open` | present | .combobox-control, .combobox-input, .combobox-trigger, .combobox-clear | |
| `data-popup-side` | `"top" \| "bottom"` | .combobox-control, .combobox-input, .combobox-trigger | The open popup's side. |
| `data-list-empty` | present | .combobox-control, .combobox-input, .combobox-trigger | Nothing matches. |
| `data-placeholder` | present | .combobox-control | Nothing is selected. |
| `data-pressed, data-focused` | present | .combobox-control, .combobox-input | During a press; while focus is inside. |
| `data-filled, data-dirty, data-touched` | present | .combobox-control, .combobox-input, .combobox-trigger | Has a value; the value changed from the first one; focus has left once. A form reset clears dirty and touched. |
| `data-valid` | present | .combobox-control, .combobox-input | The enclosing Field is valid. |
| `data-empty` | present | .combobox-content | Nothing matches. |
| `data-loading` | present | .combobox-content | |
| `data-invalid, data-disabled, data-readonly, data-required` | present | .combobox-control | |
| `data-invalid` | present | .combobox-input | aria-invalid is true (invalid, or a Field). |
| `data-visible` | present | .combobox-clear | There is something to clear. |
| `data-disabled` | present | .combobox-clear | |
| `data-highlighted` | present | .combobox-item | |
| `data-selected` | present | .combobox-item | |
| `data-state` | `"checked" \| "unchecked"` | .combobox-item | |
| `data-disabled` | present | .combobox-item | |
| `data-side` | `"top" \| "bottom" \| "left" \| "right"` | .combobox-content | |
| `data-align` | `"start" \| "center" \| "end"` | .combobox-content | |
| `--combobox-columns` | number | .combobox-list | With grid: how many equal columns each row has (default 4). Set it in your CSS. |
| `--anchor-width` | px | .combobox-content | The control's width; the popup is at least this wide. |
| `--available-height` | px | .combobox-content | |
| `--anchor-height, --available-width, --transform-origin` | px, px, position | .combobox-content | |
## Accessibility
- The input is the APG editable combobox with list autocomplete: role="combobox", aria-autocomplete="list", aria-expanded, aria-controls the listbox.
- Focus stays in the input; aria-activedescendant names the highlighted option. Editing the text gives the highlight back to the input.
- With grid the popup is role="grid" (aria-haspopup="grid" on the input), each ComboboxRow role="row" and its items role="gridcell".
- Options carry aria-selected; the listbox has aria-multiselectable with multiple and aria-busy while loading.
- After typing settles, a polite live region says how many results there are.
- Chips are focusable with the arrow keys; each remove button is named "Remove `