# Combobox
A combobox is an input widget with an associated popup that enables users to select a value from a collection of possible values.
```svelte
Label
{#each items as item (item.value)}
{item.label}
{/each}
```
## Groups
Create labelled groups for your items.
```svelte
{#each collection.group() as [type, items] (type)}
{type}
{#each items as item (item.value)}
{item.label}
{/each}
{/each}
```
## Auto Highlight
Search for any option, then tap Enter on your keyboard to automatically select it.
```svelte
{#each items as item (item.value)}
{item.label}
{/each}
```
## Multiple
To maintain filtering functionality and improve clarity for users, we recommend displaying each selected value outside the perimeter of the Combobox component.
```svelte
{#each items as item (item.value)}
{item.label}
{/each}
{#each value as item (item)}
{item}
{/each}
```
## Disabled Item
```svelte
{#each items as item (item.value)}
{item.label}
{/each}
```
## Custom Filter
Try mistyping `apple` or `banana` to see the custom filter using the fuzzy search from [Fuse.js](https://fusejs.io/) in action.
```svelte
{#each items as item (item.value)}
{item.label}
{/each}
```
## Direction
```svelte
Label
{#each items as item (item.value)}
{item.label}
{/each}
```
## Guidelines
### Z-Index
By default we do not take an opinionated stance regarding z-index stacking. The result is the component can sometimes be occluded beneath other elements with a higher index. The Z-Index can controlled by applying a utility class to the Positioner component part.
```svelte
{#each items as item (item.value)}
{item.label}
{/each}
```
### Max Items
We recommend no more than 500 items max. For normal usage, a few dozen will provide the best performance.
## API Reference
### ComboboxRootProps
| Property | Default | Type | Description |
| ------------------------ | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| open? | - | boolean \| undefined | The controlled open state of the combobox |
| defaultOpen? | - | boolean \| undefined | The initial open state of the combobox when rendered.
Use when you don't need to control the open state of the combobox. |
| ids? | - | Partial\<\{ root: string; label: string; control: string; input: string; content: string; trigger: string; clearTrigger: string; item: (id: string, index?: number \| undefined) => string; positioner: string; itemGroup: (id: string \| number) => string; itemGroupLabel: (id: string \| number) => string; }> \| undefined | The ids of the elements in the combobox. Useful for composition. |
| inputValue? | - | string \| undefined | The controlled value of the combobox's input |
| defaultInputValue? | "" | string \| undefined | The initial value of the combobox's input when rendered.
Use when you don't need to control the value of the combobox's input. |
| name? | - | string \| undefined | The \`name\` attribute of the combobox's input. Useful for form submission |
| form? | - | string \| undefined | The associate form of the combobox. |
| disabled? | - | boolean \| undefined | Whether the combobox is disabled |
| readOnly? | - | boolean \| undefined | Whether the combobox is readonly. This puts the combobox in a "non-editable" mode
but the user can still interact with it |
| invalid? | - | boolean \| undefined | Whether the combobox is invalid |
| required? | - | boolean \| undefined | Whether the combobox is required |
| placeholder? | - | string \| undefined | The placeholder text of the combobox's input |
| defaultHighlightedValue? | - | string \| null \| undefined | The initial highlighted value of the combobox when rendered.
Use when you don't need to control the highlighted value of the combobox. |
| highlightedValue? | - | string \| null \| undefined | The controlled highlighted value of the combobox |
| value? | - | string\[] \| undefined | The controlled value of the combobox's selected items |
| defaultValue? | \[] | string\[] \| undefined | The initial value of the combobox's selected items when rendered.
Use when you don't need to control the value of the combobox's selected items. |
| inputBehavior? | "none" | "autohighlight" \| "autocomplete" \| "none" \| undefined | Defines the auto-completion behavior of the combobox.
- \`autohighlight\`: The first focused item is highlighted as the user types
- \`autocomplete\`: Navigating the listbox with the arrow keys selects the item and the input is updated |
| selectionBehavior? | "replace" | "clear" \| "replace" \| "preserve" \| undefined | The behavior of the combobox input when an item is selected
- \`replace\`: The selected item string is set as the input value
- \`clear\`: The input value is cleared
- \`preserve\`: The input value is preserved |
| autoFocus? | - | boolean \| undefined | Whether to autofocus the input on mount |
| openOnClick? | false | boolean \| undefined | Whether to open the combobox popup on initial click on the input |
| openOnChange? | true | boolean \| ((details: InputValueChangeDetails) => boolean) \| undefined | Whether to show the combobox when the input value changes |
| allowCustomValue? | - | boolean \| undefined | Whether to allow typing custom values in the input |
| alwaysSubmitOnEnter? | false | boolean \| undefined | Whether to always submit on Enter key press, even if popup is open.
Useful for single-field autocomplete forms where Enter should submit the form. |
| loopFocus? | true | boolean \| undefined | Whether to loop the keyboard navigation through the items |
| positioning? | \{ placement: "bottom-start" } | PositioningOptions \| undefined | The positioning options to dynamically position the menu |
| onInputValueChange? | - | ((details: InputValueChangeDetails) => void) \| undefined | Function called when the input's value changes |
| onValueChange? | - | ((details: ValueChangeDetails\) => void) \| undefined | Function called when a new item is selected |
| onHighlightChange? | - | ((details: HighlightChangeDetails\) => void) \| undefined | Function called when an item is highlighted using the pointer
or keyboard navigation. |
| onSelect? | - | ((details: SelectionDetails) => void) \| undefined | Function called when an item is selected |
| onOpenChange? | - | ((details: OpenChangeDetails) => void) \| undefined | Function called when the popup is opened |
| translations? | - | IntlTranslations \| undefined | Specifies the localized strings that identifies the accessibility elements and their states |
| collection? | - | ListCollection\ \| undefined | The collection of items |
| multiple? | - | boolean \| undefined | Whether to allow multiple selection.
\*\*Good to know:\*\* When \`multiple\` is \`true\`, the \`selectionBehavior\` is automatically set to \`clear\`.
It is recommended to render the selected items in a separate container. |
| closeOnSelect? | - | boolean \| undefined | Whether to close the combobox when an item is selected. |
| openOnKeyPress? | true | boolean \| undefined | Whether to open the combobox on arrow key press |
| scrollToIndexFn? | - | ((details: ScrollToIndexDetails) => void) \| undefined | Function to scroll to a specific index |
| composite? | true | boolean \| undefined | Whether the combobox is a composed with other composite widgets like tabs |
| disableLayer? | - | boolean \| undefined | Whether to disable registering this a dismissable layer |
| navigate? | - | ((details: NavigateDetails) => void) \| null \| undefined | Function to navigate to the selected item |
| dir? | "ltr" | "ltr" \| "rtl" \| undefined | The document's text/writing direction. |
| getRootNode? | - | (() => ShadowRoot \| Node \| Document) \| undefined | A root node to correctly resolve document in custom environments. E.x.: Iframes, Electron. |
| onPointerDownOutside? | - | ((event: PointerDownOutsideEvent) => void) \| undefined | Function called when the pointer is pressed down outside the component |
| onFocusOutside? | - | ((event: FocusOutsideEvent) => void) \| undefined | Function called when the focus is moved outside the component |
| onInteractOutside? | - | ((event: InteractOutsideEvent) => void) \| undefined | Function called when an interaction happens outside the component |
| element? | - | Snippet\<\[HTMLAttributes\<"div">]> \| undefined | Render the element yourself |
### ComboboxRootProviderProps
| Property | Default | Type | Description |
| -------- | ------- | ------------------------------------------------ | --------------------------- |
| value | - | () => ComboboxApi\ | - |
| element? | - | Snippet\<\[HTMLAttributes\<"div">]> \| undefined | Render the element yourself |
### ComboboxRootContextProps
| Property | Default | Type | Description |
| -------- | ------- | ----------------------------------------------- | ----------- |
| children | - | Snippet\<\[() => ComboboxApi\]> | - |
### ComboboxLabelProps
| Property | Default | Type | Description |
| -------- | ------- | -------------------------------------------------- | --------------------------- |
| element? | - | Snippet\<\[HTMLAttributes\<"label">]> \| undefined | Render the element yourself |
### ComboboxControlProps
| Property | Default | Type | Description |
| -------- | ------- | ------------------------------------------------ | --------------------------- |
| element? | - | Snippet\<\[HTMLAttributes\<"div">]> \| undefined | Render the element yourself |
### ComboboxInputProps
| Property | Default | Type | Description |
| -------- | ------- | -------------------------------------------------- | --------------------------- |
| element? | - | Snippet\<\[HTMLAttributes\<"input">]> \| undefined | Render the element yourself |
### ComboboxTriggerProps
| Property | Default | Type | Description |
| -------- | ------- | --------------------------------------------------- | --------------------------- |
| element? | - | Snippet\<\[HTMLAttributes\<"button">]> \| undefined | Render the element yourself |
### ComboboxPositionerProps
| Property | Default | Type | Description |
| -------- | ------- | ------------------------------------------------ | --------------------------- |
| element? | - | Snippet\<\[HTMLAttributes\<"div">]> \| undefined | Render the element yourself |
### ComboboxContentProps
| Property | Default | Type | Description |
| -------- | ------- | ----------------------------------------------- | --------------------------- |
| element? | - | Snippet\<\[HTMLAttributes\<"ul">]> \| undefined | Render the element yourself |
### ComboboxItemGroupProps
| Property | Default | Type | Description |
| -------- | ------- | ------------------------------------------------ | --------------------------- |
| element? | - | Snippet\<\[HTMLAttributes\<"div">]> \| undefined | Render the element yourself |
### ComboboxItemGroupLabelProps
| Property | Default | Type | Description |
| -------- | ------- | ------------------------------------------------ | --------------------------- |
| element? | - | Snippet\<\[HTMLAttributes\<"div">]> \| undefined | Render the element yourself |
### ComboboxItemProps
| Property | Default | Type | Description |
| ------------- | ------- | ----------------------------------------------- | ----------------------------------------------------------- |
| persistFocus? | - | boolean \| undefined | Whether hovering outside should clear the highlighted state |
| item | - | any | The item to render |
| element? | - | Snippet\<\[HTMLAttributes\<"li">]> \| undefined | Render the element yourself |
### ComboboxItemTextProps
| Property | Default | Type | Description |
| -------- | ------- | ------------------------------------------------- | --------------------------- |
| element? | - | Snippet\<\[HTMLAttributes\<"span">]> \| undefined | Render the element yourself |
### ComboboxItemIndicatorProps
| Property | Default | Type | Description |
| -------- | ------- | ------------------------------------------------ | --------------------------- |
| element? | - | Snippet\<\[HTMLAttributes\<"div">]> \| undefined | Render the element yourself |