Skip to main content

Autocomplete

A text input with automatic filtering suggestions, built on Base UI’s Autocomplete primitive.

Base UI Primitive

Built on @base-ui/react/autocomplete

Import

import { Autocomplete } from "@soft-ui/react/autocomplete"

Usage

import { Autocomplete } from "@soft-ui/react/autocomplete"

const items = ["Apple", "Banana", "Cherry"]

export default function Example() {
  return (
    <Autocomplete.Root items={items}>
      <Autocomplete.Input placeholder="Type to search..." />
      <Autocomplete.Portal>
        <Autocomplete.Positioner>
          <Autocomplete.Popup>
            <Autocomplete.List>
              {items.map((item) => (
                <Autocomplete.Item key={item} value={item}>
                  {item}
                </Autocomplete.Item>
              ))}
            </Autocomplete.List>
            <Autocomplete.Empty>No results</Autocomplete.Empty>
          </Autocomplete.Popup>
        </Autocomplete.Positioner>
      </Autocomplete.Portal>
    </Autocomplete.Root>
  )
}

Components

Autocomplete.Root

size
's' | 'm' | 'l'
default:"'m'"
Control size.
  • s: 32px height
  • m: 36px height
  • l: 40px height
variant
'secondary' | 'tertiary'
default:"'secondary'"
Visual style variant.
  • secondary: Solid background
  • tertiary: Glass-morphic with backdrop blur
items
readonly ItemValue[] | readonly AutocompleteGroup<ItemValue>[]
Array of items or grouped items for autocomplete suggestions.
value
string
Controlled value.
defaultValue
string
Uncontrolled default value.
onValueChange
(value: string) => void
Callback fired when value changes.
disabled
boolean
Disables the autocomplete.
className
string
Additional CSS classes for the container.
unsafeClassName
string
Escape hatch for structural overrides.

Autocomplete.Input

placeholder
string
Placeholder text.
className
string
Additional CSS classes.

Autocomplete.Trigger

Optional trigger button to show/hide suggestions.
className
string
Additional CSS classes.

Autocomplete.Positioner

sideOffset
number
default:"4"
Distance from input.
collisionPadding
number
default:"8"
Padding from viewport edge.

Autocomplete.Item

value
string
Value of the item.
disabled
boolean
Disables the item.
className
string
Additional CSS classes.

Autocomplete.Empty

Displayed when no items match the input.
className
string
Additional CSS classes.

Autocomplete.Group / Autocomplete.GroupLabel

For grouping items with labels.

Examples

Basic

import { Autocomplete } from "@soft-ui/react/autocomplete"

const fruits = ["Apple", "Banana", "Cherry", "Date", "Elderberry"]

export default function Basic() {
  return (
    <Autocomplete.Root items={fruits}>
      <Autocomplete.Input placeholder="Type to search..." />
      <Autocomplete.Portal>
        <Autocomplete.Positioner>
          <Autocomplete.Popup>
            <Autocomplete.List>
              {fruits.map((fruit) => (
                <Autocomplete.Item key={fruit} value={fruit}>
                  {fruit}
                </Autocomplete.Item>
              ))}
            </Autocomplete.List>
            <Autocomplete.Empty>No results found</Autocomplete.Empty>
          </Autocomplete.Popup>
        </Autocomplete.Positioner>
      </Autocomplete.Portal>
    </Autocomplete.Root>
  )
}

Grouped Items

import { Autocomplete } from "@soft-ui/react/autocomplete"

const items = [
  { label: "Fruits", items: ["Apple", "Banana"] },
  { label: "Vegetables", items: ["Carrot", "Broccoli"] },
]

export default function Grouped() {
  return (
    <Autocomplete.Root items={items}>
      <Autocomplete.Input placeholder="Search..." />
      <Autocomplete.Portal>
        <Autocomplete.Positioner>
          <Autocomplete.Popup>
            <Autocomplete.List>
              {items.map((group) => (
                <Autocomplete.Group key={group.label}>
                  <Autocomplete.GroupLabel>{group.label}</Autocomplete.GroupLabel>
                  {group.items.map((item) => (
                    <Autocomplete.Item key={item} value={item}>
                      {item}
                    </Autocomplete.Item>
                  ))}
                </Autocomplete.Group>
              ))}
            </Autocomplete.List>
          </Autocomplete.Popup>
        </Autocomplete.Positioner>
      </Autocomplete.Portal>
    </Autocomplete.Root>
  )
}

Build docs developers (and LLMs) love