Combobox

A searchable dropdown that filters options as the user types, with single-select and multi-select (pill chip) modes.

Installation

npx dafink-ui add combobox

Demo

Type to filter. Kotlin is disabled.

TypeScriptPython

Backspace on empty input removes the last chip.

Props

NameTypeDefaultDescription
optionsComboboxOption[]-Array of { value, label, disabled? } objects.
valuestring | string[]undefinedControlled selected value.
onChange(value: string | string[]) => voidundefinedCalled when selection changes.
multiplebooleanfalseEnables multi-select mode with pill chips.
placeholderstring'Search…'Placeholder shown in the input.
labelstringundefinedVisible label above the input.
hintstringundefinedHelper text below the input.
errorstringundefinedError message; switches input to error state.
size'sm' | 'md''md'Input size.
disabledbooleanfalsePrevents all interaction.
classNamestring''Additional classes on the root wrapper.

Accessibility

Combobox keeps real DOM focus in the <input role="combobox"> at all times; the highlighted option in the listbox is virtual focus only, communicated via aria-activedescendant against a role="listbox"/role="option" list — never real roving tabindex on the options. It is non-modal and never trapped: Tab closes the dropdown and moves on naturally.

KeyFunction
down arrowOpens the dropdown if closed; otherwise moves to the next enabled option, wrapping.
up arrowOpens the dropdown if closed; otherwise moves to the previous enabled option, wrapping.
homeJumps to the first enabled option.
endJumps to the last enabled option.
enterSelects the active option.
escapeCloses the dropdown (focus stays in the input); clears the input if the dropdown is already closed.
tabCloses the dropdown without returning focus, letting Tab land on the next page element naturally.
backspaceIn multi-select mode, removes the last selected pill when the input is empty.