Skip to main content

Installation

npm install @kuzenbo/core

Usage

import { Autocomplete } from "@kuzenbo/core";

const suggestions = [
  "Apple",
  "Banana",
  "Cherry",
  "Date",
  "Elderberry",
];

function Example() {
  return (
    <Autocomplete>
      <Autocomplete.Label>Fruit</Autocomplete.Label>
      <Autocomplete.Row>
        <Autocomplete.Input placeholder="Type to search..." />
        <Autocomplete.Trigger />
      </Autocomplete.Row>
      <Autocomplete.Portal>
        <Autocomplete.Positioner>
          <Autocomplete.Popup>
            <Autocomplete.Content>
              <Autocomplete.List>
                <Autocomplete.Empty>No results found.</Autocomplete.Empty>
                <Autocomplete.Collection items={suggestions}>
                  {(item) => (
                    <Autocomplete.Item value={item}>
                      {item}
                    </Autocomplete.Item>
                  )}
                </Autocomplete.Collection>
              </Autocomplete.List>
            </Autocomplete.Content>
          </Autocomplete.Popup>
        </Autocomplete.Positioner>
      </Autocomplete.Portal>
    </Autocomplete>
  );
}

Props

Autocomplete

size
'xs' | 'sm' | 'md' | 'lg' | 'xl'
default:"'md'"
The size of the autocomplete and its children.
value
string
The controlled value.
onValueChange
(value: string) => void
Callback when the value changes.
disabled
boolean
Whether the autocomplete is disabled.
required
boolean
Whether the autocomplete is required.

Autocomplete.Input

placeholder
string
Placeholder text.
className
string
Additional CSS classes to apply.

Autocomplete.Item

value
string
required
The value for this item.
disabled
boolean
Whether the item is disabled.
className
string
Additional CSS classes to apply.

Autocomplete.Collection

items
string[]
required
The items to render.
children
(item: string) => ReactNode
required
Function to render each item.

Advanced Patterns

Custom Filtering

const { useFilter, useFilteredItems } = Autocomplete;

function FilteredAutocomplete() {
  const filter = useFilter({ sensitivity: "base" });
  const filteredItems = useFilteredItems(items, filter);

  return (
    <Autocomplete>
      {/* ... */}
      <Autocomplete.Collection items={filteredItems}>
        {(item) => <Autocomplete.Item value={item}>{item}</Autocomplete.Item>}
      </Autocomplete.Collection>
    </Autocomplete>
  );
}

Grouped Suggestions

<Autocomplete.List>
  <Autocomplete.Group>
    <Autocomplete.GroupLabel>Recent</Autocomplete.GroupLabel>
    <Autocomplete.Item value="recent-1">Recent Item 1</Autocomplete.Item>
    <Autocomplete.Item value="recent-2">Recent Item 2</Autocomplete.Item>
  </Autocomplete.Group>
  <Autocomplete.Separator />
  <Autocomplete.Group>
    <Autocomplete.GroupLabel>All Items</Autocomplete.GroupLabel>
    <Autocomplete.Item value="item-1">Item 1</Autocomplete.Item>
    <Autocomplete.Item value="item-2">Item 2</Autocomplete.Item>
  </Autocomplete.Group>
</Autocomplete.List>

Clear Button

<Autocomplete.Row>
  <Autocomplete.Input placeholder="Type to search..." />
  <Autocomplete.Clear />
  <Autocomplete.Trigger />
</Autocomplete.Row>

Build docs developers (and LLMs) love