Combobox with search, free-solo input, multiple selection, and async data.
Introduction
Autocomplete is a combobox built on the same foundation as Select—FormField chrome, Menu listbox, chips, async data, and composed list children.
Use Autocomplete when users should type to filter and optionally commit custom values. Use Select when the value must come from a fixed list and search is optional.
The options list uses bridge-soft-scrollbar. See Scroll utilities.
| Prop | Select default | Autocomplete default |
|---|---|---|
| searchable | false | true |
| freeSolo | — | true |
Import
import { Autocomplete } from "@bridge-ui/vue/Components/Autocomplete";import { Autocomplete } from "@bridge-ui/react/Components/Autocomplete";Basic usage
Pass an options array of objects with label and value keys. Search is enabled by default. For an initial value without binding, use defaultValue in React or default-value in Vue.
Free solo
Enabled by default. Type a value that is not in options and commit with Enter, Tab, or by closing the menu. Set freeSolo={false} (React) or :free-solo="false" (Vue) to require picking from the list.
Multiple
Enable multiple to allow selecting more than one option. Selected values render as chips.
Async data
Pass asyncData with search and resolve callbacks for remote or debounced option lists. Implies searchable.
Overlay
Use the overlay prop to choose the picker shell: auto (default), menu, modal, or drawer. auto uses menu on desktop and a bottom drawer on mobile. When unset, showFooter defaults to true for modal / drawer overlays (false for menu). Apply commits and closes; Cancel discards and closes.
Validation
Set error and errorMessage to show invalid styling and an error message below the field.
Match field width
Set customProps.listbox.matchWidth so the menu panel matches the field. Only applies when the overlay resolves to menu.
<Autocomplete
label="Country"
:options="countries"
:custom-props="{
listbox: { matchWidth: true },
}"
/><Autocomplete
label="Country"
options={countries}
customProps={{
listbox: { matchWidth: true },
}}
/>To apply this to every Select / Autocomplete menu, set components.Listbox.defaultProps.matchWidth — see Default props.
Related components
Accessibility
Autocomplete follows the FormField accessibility pattern and WAI-ARIA combobox behavior for the searchable trigger.
- Label, helper text, and error message are linked via controlId and aria-describedby.
- When error is true, the trigger receives aria-invalid="true".
Anatomy
FormField (root)
├── Header — label, optional corner text, required indicator
├── Container — variant shell
│ └── Trigger — searchable input / chips showing the current selection
├── Options panel — filterable listbox (supports loading and free-solo commit)
└── Footer — description or error messageAPI
| Prop | Type | Default | Description |
|---|---|---|---|
| default-value | SelectModel | — | Initial value for uncontrolled usage (without v-model). |
| v-model | SelectModel | — | Two-way binding for the selected value (single or multiple). |
| Prop | Type | Default | Description |
|---|---|---|---|
| onChange | (value: SelectModel) => void | — | Called when the selection changes. |
| value | SelectModel | — | Selected value (single or multiple). Use with onChange for controlled state. |
Autocomplete-specific
| Prop | Type | Default | Description |
|---|---|---|---|
| asyncData | SelectAsyncData | — | Remote data source. Implies searchable. |
| children | ReactNode | — | Composed dropdown content (ListSection / ListItem with value). Replaces mapped options in the listbox. String primary is the closed-trigger label. |
| clearable | boolean | false | Whether the value can be cleared. |
| defaultValue | SelectModel | null | — | Initial value when uncontrolled. |
| disableMaxHeight | boolean | false | When true, the dropdown options list is not height-limited. |
| emptyMessage | string | "No options" | Message when the filtered list is empty. |
| flipOptions | boolean | false | Inverts the visual order of options. |
| freeSolo | boolean | true | Allows committing typed text that is not in options (Enter, Tab, or closing the menu). |
| hideEmptyMessage | boolean | false | Hides the empty-state message. |
| loading | boolean | — | External or async loading state (OR’d with async in-flight). |
| loadingMessage | string | "Loading..." | Message shown in the dropdown while loading. |
| maxHeight | string | "max-h-60" | Tailwind max-height class for the dropdown options area. |
| minItemsForSearch | number | 11 | Minimum option count before search UI is enabled. |
| multiple | boolean | false | Whether multiple values can be selected. |
| optionDescription | string | "description" | Key used to read the description from option objects. |
| optionLabel | string | "label" | Key used to read the label from option objects. |
| options | ListboxOptionsInput | — | Options to display. May include section groups ({ title, options, sticky? }) mixed with flat options. |
| optionValue | string | "value" | Key used to read the value from option objects. |
| overlay | FieldOverlayMode | "auto" | Overlay shell: menu, modal, drawer, or auto. |
| placeholder | string | — | Placeholder when no value is selected. |
| searchable | boolean | true | Whether options can be filtered via the trigger input. |
| showFooter | boolean | false (true for modal/drawer when unset) | Shows Cancel / Apply on the nested listbox. Selection stays draft until Apply. |
Events
| Event | Payload | Description |
|---|---|---|
| @apply | — | Emitted when Apply is pressed on the listbox footer (showFooter). |
| @cancel | — | Emitted when Cancel is pressed on the listbox footer (showFooter). |
| @change | value: SelectModel | Emitted when the value changes (alternative to v-model). |
| @clear | — | Emitted when the value is cleared. |
| @close | — | Emitted when the menu closes. |
| @deselect | option: SelectOption | Emitted when an option is deselected (multiple mode). |
| @open | — | Emitted when the menu opens. |
| @search | query: string | Emitted when the search query changes. |
| @select | option: SelectOption | Emitted when an option is selected. |
| Prop | Payload | Description |
|---|---|---|
| onApply | — | Called when Apply is pressed on the listbox footer (showFooter). |
| onCancel | — | Called when Cancel is pressed on the listbox footer (showFooter). |
| onClear | — | Called when the value is cleared. |
| onClose | — | Called when the menu closes. |
| onDeselect | option: SelectOption | Called when an option is deselected (multiple mode). |
| onOpen | — | Called when the menu opens. |
| onSearch | query: string | Called when the search query changes. |
| onSelect | option: SelectOption | Called when an option is selected. |
Slots
| Slot | Description |
|---|---|
| afterOptions | Content below the option list. |
| beforeOptions | Content above the option list. |
| chip | Custom chip content in multiple mode ({ option }). |
| empty | Custom empty-state content. |
| footer | Custom footer. Replaces Cancel / Apply. Call apply() to commit and close, or cancel() to discard. |
| loading | Custom loading content in the dropdown (progress bar still renders above). |
| option | Custom option item content ({ option, selected }). |
Inherited from FormField
| Prop | Type | Default | Description |
|---|---|---|---|
| classes | FormFieldClasses | — | Class overrides per part. |
| color | FormFieldColor | "primary" | Color applied to the field control. |
| controlId | string | — | Associates labels and helper text with the control. Auto-generated when omitted. |
| corner | string | — | Secondary label text at the inline end of the header row. |
| customProps | SelectCustomProps | — | FormField parts plus nested listbox, chip, clearIcon, and overlay shells (menu, modal, drawer). label accepts Label props (without children). |
| description | string | — | Helper text below the control. Hidden when error and an error message are set, unless showDescriptionOnError. |
| disabled | boolean | false | Whether the control is disabled. |
| end | string | — | Inline-end text inside the field (suffix). |
| endIcon | IconSource | — | Icon at the inline end. |
| error | boolean | false | Applies invalid styling. Hides description when an error message is shown, unless showDescriptionOnError. |
| errorIcon | IconSource | "alert" | Icon shown when invalid and showErrorIcon is enabled. |
| errorMessage | string | — | Error message below the control. |
| hideErrorMessage | boolean | false | Does not reserve the error row. That row is also omitted while a description is shown. |
| label | string | — | Primary label text above the control. |
| readonly | boolean | false | Whether the control is read-only. |
| required | boolean | false | Shows a red asterisk on the label. |
| rounded | FormFieldRounded | "md" | Border radius of the field control and the listbox dropdown panel. |
| showDescriptionOnError | boolean | false | Keeps the description visible while the field is invalid. |
| showErrorIcon | boolean | true | Shows an error icon when invalid. |
| size | FormFieldSize | "md" | Typography and control sizing. |
| slots | FormFieldSlots | — | React slots. Vue: #label, #corner, default, #description, #errorMessage, #start, #end. |
| start | string | — | Inline-start text inside the field (prefix). |
| startIcon | IconSource | — | Icon at the inline start. |
| variant | FormFieldVariant | "outline" | Visual variant of the field shell. |