- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-react';
import { useState } from 'react';
const data = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' },
{ label: 'Orange', value: 'orange' },
{ label: 'Carrot', value: 'carrot' },
{ label: 'Broccoli', value: 'broccoli' },
{ label: 'Spinach', value: 'spinach' },
];
export default function Default() {
const [items, setItems] = useState(data);
const collection = useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
});
const onOpenChange = () => {
setItems(data);
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase()));
if (filtered.length > 0) {
setItems(filtered);
} else {
setItems(data);
}
};
return (
<Combobox
className="max-w-md"
placeholder="Search..."
collection={collection}
onOpenChange={onOpenChange}
onInputValueChange={onInputValueChange}
>
<Combobox.Label>Label</Combobox.Label>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Combobox.ClearTrigger>Clear All</Combobox.ClearTrigger>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{items.map((item) => (
<Combobox.Item key={item.value} item={item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
))}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>
);
}- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
<script lang="ts">
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-svelte';
const data = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' },
{ label: 'Orange', value: 'orange' },
{ label: 'Carrot', value: 'carrot' },
{ label: 'Broccoli', value: 'broccoli' },
{ label: 'Spinach', value: 'spinach' },
];
let items = $state(data);
const collection = $derived(
useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
}),
);
const onOpenChange = () => {
items = data;
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase()));
if (filtered.length > 0) {
items = filtered;
} else {
items = data;
}
};
</script>
<Combobox class="max-w-md" placeholder="Search..." {collection} {onOpenChange} {onInputValueChange}>
<Combobox.Label>Label</Combobox.Label>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Combobox.ClearTrigger>Clear All</Combobox.ClearTrigger>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{#each items as item (item.value)}
<Combobox.Item {item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
{/each}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>Groups
Organize items into categorized groups.
- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
'use client';
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-react';
import { useState } from 'react';
const data = [
{ label: 'Apple', value: 'apple', type: 'Fruits' },
{ label: 'Banana', value: 'banana', type: 'Fruits' },
{ label: 'Orange', value: 'orange', type: 'Fruits' },
{ label: 'Carrot', value: 'carrot', type: 'Vegetables' },
{ label: 'Broccoli', value: 'broccoli', type: 'Vegetables' },
{ label: 'Spinach', value: 'spinach', type: 'Vegetables' },
];
export default function Group() {
const [items, setItems] = useState(data);
const collection = useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
groupBy: (item) => item.type,
});
const onOpenChange = () => {
setItems(data);
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase()));
if (filtered.length > 0) {
setItems(filtered);
} else {
setItems(data);
}
};
return (
<Combobox
className="max-w-md"
placeholder="Search..."
collection={collection}
onOpenChange={onOpenChange}
onInputValueChange={onInputValueChange}
>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{collection.group().map(([type, items]) => (
<Combobox.ItemGroup key={type}>
<Combobox.ItemGroupLabel>{type}</Combobox.ItemGroupLabel>
{items.map((item) => (
<Combobox.Item key={item.value} item={item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
))}
</Combobox.ItemGroup>
))}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>
);
}- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
<script lang="ts">
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-svelte';
const data = [
{ label: 'Apple', value: 'apple', type: 'Fruits' },
{ label: 'Banana', value: 'banana', type: 'Fruits' },
{ label: 'Orange', value: 'orange', type: 'Fruits' },
{ label: 'Carrot', value: 'carrot', type: 'Vegetables' },
{ label: 'Broccoli', value: 'broccoli', type: 'Vegetables' },
{ label: 'Spinach', value: 'spinach', type: 'Vegetables' },
];
let items = $state(data);
const collection = $derived(
useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
groupBy: (item) => item.type,
}),
);
const onOpenChange = () => {
items = data;
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase()));
if (filtered.length > 0) {
items = filtered;
} else {
items = data;
}
};
</script>
<Combobox class="max-w-md" placeholder="Search..." {collection} {onOpenChange} {onInputValueChange}>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{#each collection.group() as [type, items] (type)}
<Combobox.ItemGroup>
<Combobox.ItemGroupLabel>{type}</Combobox.ItemGroupLabel>
{#each items as item (item.value)}
<Combobox.Item {item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
{/each}
</Combobox.ItemGroup>
{/each}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>Auto Highlight
Search for any option, then tap Enter on your keyboard to automatically select it.
- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-react';
import { useState } from 'react';
const data = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' },
{ label: 'Orange', value: 'orange' },
{ label: 'Carrot', value: 'carrot' },
{ label: 'Broccoli', value: 'broccoli' },
{ label: 'Spinach', value: 'spinach' },
];
export default function AutoHighlight() {
const [items, setItems] = useState(data);
const collection = useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
});
const onOpenChange = () => {
setItems(data);
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase()));
if (filtered.length > 0) {
setItems(filtered);
} else {
setItems(data);
}
};
return (
<Combobox
className="max-w-md"
placeholder="Search..."
collection={collection}
onOpenChange={onOpenChange}
onInputValueChange={onInputValueChange}
inputBehavior="autohighlight"
>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{items.map((item) => (
<Combobox.Item key={item.value} item={item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
))}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>
);
}- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
<script lang="ts">
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-svelte';
const data = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' },
{ label: 'Orange', value: 'orange' },
{ label: 'Carrot', value: 'carrot' },
{ label: 'Broccoli', value: 'broccoli' },
{ label: 'Spinach', value: 'spinach' },
];
let items = $state(data);
const collection = $derived(
useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
}),
);
const onOpenChange = () => {
items = data;
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase()));
if (filtered.length > 0) {
items = filtered;
} else {
items = data;
}
};
</script>
<Combobox class="max-w-md" placeholder="Search..." {collection} {onOpenChange} {onInputValueChange} inputBehavior="autohighlight">
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{#each items as item (item.value)}
<Combobox.Item {item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
{/each}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>Multiple
To maintain filtering functionality and improve clarity for users, we recommend displaying each selected value outside the perimeter of the Combobox component.
- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-react';
import { useState } from 'react';
const data = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' },
{ label: 'Orange', value: 'orange' },
{ label: 'Carrot', value: 'carrot' },
{ label: 'Broccoli', value: 'broccoli' },
{ label: 'Spinach', value: 'spinach' },
];
export default function Default() {
const [value, setValue] = useState<string[]>([]);
const [items, setItems] = useState(data);
const collection = useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
});
const onOpenChange = () => {
setItems(data);
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase()));
if (filtered.length > 0) {
setItems(filtered);
} else {
setItems(data);
}
};
const onValueChange: ComboboxRootProps['onValueChange'] = (event) => {
setValue(event.value);
};
return (
<div className="grid gap-2 w-full max-w-md">
<Combobox
placeholder="Search..."
collection={collection}
onOpenChange={onOpenChange}
onInputValueChange={onInputValueChange}
multiple={true}
value={value}
onValueChange={onValueChange}
>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{items.map((item) => (
<Combobox.Item key={item.value} item={item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
))}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>
<div className="flex flex-wrap gap-2">
{value.map((item) => (
<span key={item} className="badge preset-filled">
{item}
</span>
))}
</div>
</div>
);
}- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
<script lang="ts">
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-svelte';
const data = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' },
{ label: 'Orange', value: 'orange' },
{ label: 'Carrot', value: 'carrot' },
{ label: 'Broccoli', value: 'broccoli' },
{ label: 'Spinach', value: 'spinach' },
];
let value: string[] = $state([]);
let items = $state(data);
const collection = $derived(
useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
}),
);
const onOpenChange = () => {
items = data;
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase()));
if (filtered.length > 0) {
items = filtered;
} else {
items = data;
}
};
const onValueChange: ComboboxRootProps['onValueChange'] = (event) => {
value = event.value;
};
</script>
<div class="grid gap-2 w-full max-w-md">
<Combobox placeholder="Search..." {collection} {onOpenChange} {onInputValueChange} {value} {onValueChange} multiple>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{#each items as item (item.value)}
<Combobox.Item {item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
{/each}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>
<div class="flex flex-wrap gap-2">
{#each value as item (item)}
<span class="badge preset-filled">
{item}
</span>
{/each}
</div>
</div>Disabled Item
- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-react';
import { useState } from 'react';
const data = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' },
{ label: 'Orange', value: 'orange' },
{ label: 'Carrot', value: 'carrot' },
{ label: 'Broccoli', value: 'broccoli' },
{ label: 'Spinach', value: 'spinach' },
];
export default function Default() {
const [items, setItems] = useState(data);
const collection = useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
isItemDisabled: (item) => item.value === 'banana',
});
const onOpenChange = () => {
setItems(data);
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase()));
if (filtered.length > 0) {
setItems(filtered);
} else {
setItems(data);
}
};
return (
<Combobox
className="max-w-md"
placeholder="Search..."
collection={collection}
onOpenChange={onOpenChange}
onInputValueChange={onInputValueChange}
>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{items.map((item) => (
<Combobox.Item key={item.value} item={item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
))}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>
);
}- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
<script lang="ts">
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-svelte';
const data = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' },
{ label: 'Orange', value: 'orange' },
{ label: 'Carrot', value: 'carrot' },
{ label: 'Broccoli', value: 'broccoli' },
{ label: 'Spinach', value: 'spinach' },
];
let items = $state(data);
const collection = $derived(
useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
isItemDisabled: (item) => item.value === 'banana',
}),
);
const onOpenChange = () => {
items = data;
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase()));
if (filtered.length > 0) {
items = filtered;
} else {
items = data;
}
};
</script>
<Combobox class="max-w-md" placeholder="Search..." {collection} {onOpenChange} {onInputValueChange}>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{#each items as item (item.value)}
<Combobox.Item {item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
{/each}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>Custom Filter
Try mistyping apple or banana to see the custom filter using the fuzzy search from Fuse.js in action.
- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-react';
import Fuse from 'fuse.js';
import { useState } from 'react';
const data = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' },
{ label: 'Orange', value: 'orange' },
{ label: 'Carrot', value: 'carrot' },
{ label: 'Broccoli', value: 'broccoli' },
{ label: 'Spinach', value: 'spinach' },
];
const fuse = new Fuse(data, {
keys: ['label', 'value'],
threshold: 0.3,
});
export default function Default() {
const [items, setItems] = useState(data);
const collection = useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
});
const onOpenChange = () => {
setItems(data);
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const results = fuse.search(event.inputValue);
if (results.length > 0) {
setItems(results.map((result) => result.item));
} else {
setItems(data);
}
};
return (
<Combobox
className="max-w-md"
placeholder="Search..."
collection={collection}
onOpenChange={onOpenChange}
onInputValueChange={onInputValueChange}
>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{items.map((item) => (
<Combobox.Item key={item.value} item={item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
))}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>
);
}- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
<script lang="ts">
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-svelte';
import Fuse from 'fuse.js';
const data = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' },
{ label: 'Orange', value: 'orange' },
{ label: 'Carrot', value: 'carrot' },
{ label: 'Broccoli', value: 'broccoli' },
{ label: 'Spinach', value: 'spinach' },
];
const fuse = new Fuse(data, {
keys: ['label', 'value'],
threshold: 0.3,
});
let items = $state(data);
const collection = $derived(
useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
}),
);
const onOpenChange = () => {
items = data;
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const results = fuse.search(event.inputValue);
if (results.length > 0) {
items = results.map((result) => result.item);
} else {
items = data;
}
};
</script>
<Combobox class="max-w-md" placeholder="Search..." {collection} {onOpenChange} {onInputValueChange}>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{#each items as item (item.value)}
<Combobox.Item {item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
{/each}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>Direction
Set the text direction (ltr or rtl) using the dir prop.
- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-react';
import { useState } from 'react';
const data = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' },
{ label: 'Orange', value: 'orange' },
{ label: 'Carrot', value: 'carrot' },
{ label: 'Broccoli', value: 'broccoli' },
{ label: 'Spinach', value: 'spinach' },
];
export default function Dir() {
const [items, setItems] = useState(data);
const collection = useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
});
const onOpenChange = () => {
setItems(data);
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase()));
if (filtered.length > 0) {
setItems(filtered);
} else {
setItems(data);
}
};
return (
<Combobox
className="max-w-md"
placeholder="Search..."
collection={collection}
onOpenChange={onOpenChange}
onInputValueChange={onInputValueChange}
dir="rtl"
>
<Combobox.Label>Label</Combobox.Label>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{items.map((item) => (
<Combobox.Item key={item.value} item={item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
))}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>
);
}- Apple
- Banana
- Orange
- Carrot
- Broccoli
- Spinach
<script lang="ts">
import { Combobox, Portal, type ComboboxRootProps, useListCollection } from '@skeletonlabs/skeleton-svelte';
const data = [
{ label: 'Apple', value: 'apple' },
{ label: 'Banana', value: 'banana' },
{ label: 'Orange', value: 'orange' },
{ label: 'Carrot', value: 'carrot' },
{ label: 'Broccoli', value: 'broccoli' },
{ label: 'Spinach', value: 'spinach' },
];
let items = $state(data);
const collection = $derived(
useListCollection({
items: items,
itemToString: (item) => item.label,
itemToValue: (item) => item.value,
}),
);
const onOpenChange = () => {
items = data;
};
const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => {
const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase()));
if (filtered.length > 0) {
items = filtered;
} else {
items = data;
}
};
</script>
<Combobox class="max-w-md" placeholder="Search..." {collection} {onOpenChange} {onInputValueChange} dir="rtl">
<Combobox.Label>Label</Combobox.Label>
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
{#each items as item (item.value)}
<Combobox.Item {item}>
<Combobox.ItemText>{item.label}</Combobox.ItemText>
<Combobox.ItemIndicator />
</Combobox.Item>
{/each}
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>Guidelines
Z-Index
By default we do not take an opinionated stance regarding z-index stacking. The result is the component can sometimes be occluded beneath other elements with a higher index. The Z-Index can controlled by applying a utility class to the Content component part.
<Combobox.Content className="z-50" /><Combobox.Content class="z-50" />Max Items
We recommend no more than 500 items max. For normal usage, a few dozen will provide the best performance.
Anatomy
Here’s an overview of how the Combobox component is structured in code:
import { Combobox, Portal } from '@skeletonlabs/skeleton-react';
export default function Anatomy() {
return (
<Combobox>
<Combobox.Label />
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
<Combobox.ClearTrigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
<Combobox.ItemGroup>
<Combobox.ItemGroupLabel />
<Combobox.Item>
<Combobox.ItemText />
<Combobox.ItemIndicator />
</Combobox.Item>
</Combobox.ItemGroup>
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>
);
}<script lang="ts">
import { Combobox, Portal } from '@skeletonlabs/skeleton-svelte';
</script>
<Combobox>
<Combobox.Label />
<Combobox.Control>
<Combobox.Input />
<Combobox.Trigger />
<Combobox.ClearTrigger />
</Combobox.Control>
<Portal>
<Combobox.Positioner>
<Combobox.Content>
<Combobox.ItemGroup>
<Combobox.ItemGroupLabel />
<Combobox.Item>
<Combobox.ItemText />
<Combobox.ItemIndicator />
</Combobox.Item>
</Combobox.ItemGroup>
</Combobox.Content>
</Combobox.Positioner>
</Portal>
</Combobox>API Reference
Unable to load component information for react/combobox
Unable to load component information for svelte/combobox