Combobox

A searchable dropdown that combines a text input with a listbox. Useful for long option lists where filtering is beneficial.

Basic

const frameworks = [
  { value: "react", label: "React" },
  { value: "vue", label: "Vue" },
  { value: "svelte", label: "Svelte" },
]

<Combobox
  options={frameworks}
  value={value}
  onValueChange={setValue}
  placeholder="Select a framework..."
  emptyMessage="No framework found."
/>

Direction

The chevron indicator and selected-check icon placement flip automatically in RTL — the chevron sits on the start edge (right in RTL) alongside the label. The popover anchors to the trigger and mirrors open-direction, so filtered results still read in the expected order.

API Reference

PropTypeDefaultDescription
options{ value: string; label: string }[][]The list of selectable options.
valuestring""The controlled selected value.
onValueChange(value: string) => voidCallback fired when the selected value changes.
placeholderstring"Select..."Placeholder text when no value is selected.
emptyMessagestring"No results found."Text displayed when no options match the search query.

Accessibility

Combobox follows the ARIA combobox pattern via Radix Popover + CMDK Command. It supports full keyboard navigation: arrow keys to move through options, Enter to select, Escape to close the listbox.

Always provide a label via Field + FieldLabel or an explicit aria-label. Without one, screen readers will announce the combobox without context.

For multi-select, selected items are rendered as removable Badges. Each remove button has an aria-label identifying which item it removes.