Components
Combobox
An autocomplete input with a filterable dropdown list of options.
Preview
'use client'; import { Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxValue, useComboboxAnchor, } from '@/registry/san-francisco/ui/combobox'; import * as React from 'react'; const frameworks = [ { value: 'react', label: 'React' }, { value: 'vue', label: 'Vue' }, { value: 'svelte', label: 'Svelte' }, { value: 'angular', label: 'Angular' }, ]; const groups = [ { value: 'Frontend', items: [ { value: 'react', label: 'React' }, { value: 'vue', label: 'Vue' }, ], }, { value: 'Backend', items: [ { value: 'express', label: 'Express' }, { value: 'fastify', label: 'Fastify' }, ], }, ]; const multiFrameworks = ['Next.js', 'SvelteKit', 'Nuxt.js', 'Remix', 'Astro'] as const; export default function ComboboxDemo() { return ( <Combobox items={frameworks}> <ComboboxInput className="w-full max-w-xs" placeholder="Search frameworks..." /> <ComboboxContent> <ComboboxEmpty>No results found.</ComboboxEmpty> <ComboboxList> {(item) => ( <ComboboxItem key={item.value} value={item}> {item.label} </ComboboxItem> )} </ComboboxList> </ComboboxContent> </Combobox> ); }
Installation
bunx shadcn@latest add @sft-ui/comboboxWith Groups
'use client'; import { Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxValue, useComboboxAnchor, } from '@/registry/san-francisco/ui/combobox'; import * as React from 'react'; const frameworks = [ { value: 'react', label: 'React' }, { value: 'vue', label: 'Vue' }, { value: 'svelte', label: 'Svelte' }, { value: 'angular', label: 'Angular' }, ]; const groups = [ { value: 'Frontend', items: [ { value: 'react', label: 'React' }, { value: 'vue', label: 'Vue' }, ], }, { value: 'Backend', items: [ { value: 'express', label: 'Express' }, { value: 'fastify', label: 'Fastify' }, ], }, ]; const multiFrameworks = ['Next.js', 'SvelteKit', 'Nuxt.js', 'Remix', 'Astro'] as const; export default function ComboboxGroups() { return ( <Combobox items={groups}> <ComboboxInput className="w-full max-w-xs" placeholder="Search..." /> <ComboboxContent> <ComboboxEmpty>No results found.</ComboboxEmpty> <ComboboxList> {(group, index) => ( <ComboboxGroup key={group.value} items={group.items}> {index > 0 ? <ComboboxSeparator /> : null} <ComboboxLabel>{group.value}</ComboboxLabel> <ComboboxCollection> {(item) => ( <ComboboxItem key={item.value} value={item}> {item.label} </ComboboxItem> )} </ComboboxCollection> </ComboboxGroup> )} </ComboboxList> </ComboboxContent> </Combobox> ); }
With Chips (Multi-select)
'use client'; import { Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxValue, useComboboxAnchor, } from '@/registry/san-francisco/ui/combobox'; import * as React from 'react'; const frameworks = [ { value: 'react', label: 'React' }, { value: 'vue', label: 'Vue' }, { value: 'svelte', label: 'Svelte' }, { value: 'angular', label: 'Angular' }, ]; const groups = [ { value: 'Frontend', items: [ { value: 'react', label: 'React' }, { value: 'vue', label: 'Vue' }, ], }, { value: 'Backend', items: [ { value: 'express', label: 'Express' }, { value: 'fastify', label: 'Fastify' }, ], }, ]; const multiFrameworks = ['Next.js', 'SvelteKit', 'Nuxt.js', 'Remix', 'Astro'] as const; export default function ComboboxMultiple() { const anchor = useComboboxAnchor(); return ( <Combobox multiple autoHighlight items={multiFrameworks} defaultValue={[multiFrameworks[0]]}> <ComboboxChips ref={anchor} className="w-full max-w-xs"> <ComboboxValue> {(values) => ( <React.Fragment> {values.map((value: string) => ( <ComboboxChip key={value}>{value}</ComboboxChip> ))} <ComboboxChipsInput /> </React.Fragment> )} </ComboboxValue> </ComboboxChips> <ComboboxContent anchor={anchor}> <ComboboxEmpty>No items found.</ComboboxEmpty> <ComboboxList> {(item) => ( <ComboboxItem key={item} value={item}> {item} </ComboboxItem> )} </ComboboxList> </ComboboxContent> </Combobox> ); }
API Reference
See the Base UI Combobox documentation for the API reference.