shadcn.io is not affiliated with official shadcn/ui
Shadcn Autocomplete for React and Tailwind
A searchable input that suggests options while allowing custom values.
Installation
bunx --bun shadcn@latest add https://kit.dev/r/autocomplete.jsonpnpm dlx shadcn@latest add https://kit.dev/r/autocomplete.jsonnpx shadcn@latest add https://kit.dev/r/autocomplete.jsonyarn shadcn@latest add https://kit.dev/r/autocomplete.jsonThis component depends on Combobox and Separator. Install them first if you haven't already.
Install the following dependencies:
bun add @ark-ui/react lucide-react tailwind-variantspnpm add @ark-ui/react lucide-react tailwind-variantsnpm install @ark-ui/react lucide-react tailwind-variantsyarn add @ark-ui/react lucide-react tailwind-variantsCopy and paste the following code into your project.
"use client";
import type { Combobox as ArkCombobox } from "@ark-ui/react/combobox";
import type React from "react";
import {
Combobox,
ComboboxClear,
ComboboxContent,
ComboboxContext,
ComboboxControl,
ComboboxEmpty,
ComboboxGroup,
ComboboxGroupLabel,
ComboboxInput,
ComboboxItem,
ComboboxList,
ComboboxRootProvider,
ComboboxTrigger,
useCombobox,
useComboboxContext,
} from "@/components/ui/combobox";
import { Separator } from "@/components/ui/separator";
export const useAutocomplete = useCombobox;
export const useAutocompleteContext = useComboboxContext;
export const AutocompleteContext: typeof ComboboxContext = ComboboxContext;
export const AutocompleteRootProvider: ArkCombobox.RootProviderComponent = (
props
) => <ComboboxRootProvider data-slot="autocomplete" {...props} />;
export const Autocomplete: ArkCombobox.RootComponent = (props) => (
<Combobox
allowCustomValue
data-slot="autocomplete"
inputBehavior="autocomplete"
{...props}
/>
);
export const AutocompleteControl = (
props: React.ComponentProps<typeof ComboboxControl>
) => <ComboboxControl data-slot="autocomplete-control" {...props} />;
export const AutocompleteInput = (
props: React.ComponentProps<typeof ComboboxInput>
) => {
const { showClear = false, showTrigger = false, ...rest } = props;
return (
<ComboboxInput
data-slot="autocomplete-input"
showClear={showClear}
showTrigger={showTrigger}
{...rest}
/>
);
};
export const AutocompleteGroupLabel = (
props: React.ComponentProps<typeof ComboboxGroupLabel>
) => <ComboboxGroupLabel data-slot="autocomplete-group-label" {...props} />;
export const AutocompleteItem = (
props: React.ComponentProps<typeof ComboboxItem>
) => <ComboboxItem data-slot="autocomplete-item" {...props} />;
export const AutocompleteContent = (
props: React.ComponentProps<typeof ComboboxContent>
) => <ComboboxContent data-slot="autocomplete-content" {...props} />;
export const AutocompleteTrigger = (
props: React.ComponentProps<typeof ComboboxTrigger>
) => <ComboboxTrigger data-slot="autocomplete-trigger" {...props} />;
export const AutocompleteClear = (
props: React.ComponentProps<typeof ComboboxClear>
) => <ComboboxClear data-slot="autocomplete-clear" {...props} />;
export const AutocompleteGroup = (
props: React.ComponentProps<typeof ComboboxGroup>
) => <ComboboxGroup data-slot="autocomplete-group" {...props} />;
export const AutocompleteEmpty = (
props: React.ComponentProps<typeof ComboboxEmpty>
) => <ComboboxEmpty data-slot="autocomplete-empty" {...props} />;
export const AutocompleteList = (
props: React.ComponentProps<typeof ComboboxList>
) => <ComboboxList data-slot="autocomplete-list" {...props} />;
export const AutocompleteCollection = (
props: React.ComponentProps<typeof ComboboxList>
) => <ComboboxList data-slot="autocomplete-collection" {...props} />;
export const AutocompleteSeparator = (
props: React.ComponentProps<typeof Separator>
) => <Separator data-slot="autocomplete-separator" {...props} />;Update the import paths to match your project setup.
Anatomy
AutocompleteRoot
├── AutocompleteClearTrigger
├── AutocompleteContent
├── AutocompleteControl
├── AutocompleteInput
├── AutocompleteItem
│ ├── AutocompleteItemGroup
│ │ └── AutocompleteItemGroupLabel
│ ├── AutocompleteItemIndicator
│ └── AutocompleteItemText
├── AutocompleteLabel
├── AutocompleteList
├── AutocompletePositioner
└── AutocompleteTriggerUsage
import { useListCollection } from "@ark-ui/react/collection";
import { useFilter } from "@ark-ui/react/locale";
import { Field, FieldLabel } from "@registry/react/components/field";
import {
Autocomplete,
AutocompleteContent,
AutocompleteEmpty,
AutocompleteInput,
AutocompleteItem,
AutocompleteList,
} from "@/components/ui/autocomplete";const AutocompleteDemo = () => {
const { contains } = useFilter({ sensitivity: "base" });
const { collection, filter } = useListCollection({
initialItems,
filter: contains,
});
return (
<Field className="w-full max-w-64">
<FieldLabel>Search fruits</FieldLabel>
<Autocomplete
collection={collection}
onInputValueChange={({ inputValue }) => filter(inputValue)}
>
<AutocompleteInput placeholder="e.g. Apple" showClear />
<AutocompleteContent>
<AutocompleteEmpty />
<AutocompleteList>
{collection.items.map((item) => (
<AutocompleteItem item={item} key={item.value}>
{item.label}
</AutocompleteItem>
))}
</AutocompleteList>
</AutocompleteContent>
</Autocomplete>
</Field>
);
};
const initialItems = [
{ label: "Apple", value: "apple" },
{ label: "Banana", value: "banana" },
{ label: "Cherry", value: "cherry" },
{ label: "Date", value: "date" },
];Accessibility
| Key | Description |
|---|---|
ArrowDown | Move down. |
ArrowUp | Move up. |
Home | Go to the start. |
End | Go to the end. |
Enter | Activate the focused item. |
Escape | Dismiss. |
Space | Activate the focused control. |
Demos
Async
Autohighlight
Context
Controlled
Creatable
Custom Object
Disabled
Dynamic
Group
Highlight
Inline
Invalid
Limit Results
Links
Multiple
Rehydrate
Root Provider
Size Lg
Size Md
Size Sm
With Clear Button
With Field
With Start Icon
With Trigger
API Reference
AutocompleteControl
PropType
AttributeType
AutocompleteInput
PropType
AttributeType
AutocompleteGroupLabel
PropType
AttributeType
AutocompleteItem
PropType
AttributeType
AutocompleteContent
PropType
AttributeType
AutocompleteTrigger
PropType
AttributeType
AutocompleteClear
PropType
AttributeType
AutocompleteGroup
PropType
AttributeType
AutocompleteEmpty
PropType
AttributeType
AutocompleteList
PropType
AttributeType
AutocompleteCollection
PropType
AttributeType
AutocompleteSeparator
PropType
AttributeType