# Select URL: https://ark-ui.com/docs/components/select Source: https://raw.githubusercontent.com/chakra-ui/ark/refs/heads/main/website/src/content/pages/components/select.mdx Displays a list of options for the user to pick from. --- ## Anatomy To set up the select correctly, you'll need to understand its anatomy and how we name its parts. > Each part includes a `data-part` attribute to help identify them in the DOM. ## Examples Learn how to use the `Select` component in your project. Let's take a look at the most basic example: **Example: basic** #### React ```tsx import { Portal } from '@ark-ui/react/portal' import { Select, createListCollection } from '@ark-ui/react/select' import { ChevronDownIcon } from 'lucide-react' export const Basic = () => { const collection = createListCollection({ items: ['React', 'Solid', 'Vue', 'Svelte'] }) return ( Framework Clear Frameworks {collection.items.map((item) => ( {item} ))} ) } ``` #### Solid ```tsx import { Select, createListCollection } from '@ark-ui/solid/select' import { Index, Portal } from 'solid-js/web' export const Basic = () => { const collection = createListCollection({ items: ['React', 'Solid', 'Vue', 'Svelte'] }) return ( Framework Clear Frameworks {(item) => ( {item()} )} ) } ``` #### Vue ```vue ``` #### Svelte ```svelte Framework Clear Frameworks {#each collection.items as item} {item} {/each} ``` ### Controlled Value Use the `value` and `onValueChange` props to control the selected items. **Example: controlled** #### React ```tsx import { Portal } from '@ark-ui/react/portal' import { Select, createListCollection } from '@ark-ui/react/select' import { ChevronDownIcon } from 'lucide-react' import { useState } from 'react' interface Item { label: string value: string disabled?: boolean | undefined } export const Controlled = () => { const [_, setSelectedItems] = useState([]) const collection = createListCollection({ items: [ { label: 'React', value: 'react' }, { label: 'Solid', value: 'solid' }, { label: 'Vue', value: 'vue' }, { label: 'Svelte', value: 'svelte', disabled: true }, ], }) return ( setSelectedItems(e.items)}> Framework Clear Frameworks {collection.items.map((item) => ( {item.label} ))} ) } ``` #### Solid ```tsx import { Select, createListCollection } from '@ark-ui/solid/select' import { createSignal } from 'solid-js' import { Index, Portal } from 'solid-js/web' interface Item { label: string value: string disabled?: boolean } export const Controlled = () => { const [, setSelectedItems] = createSignal([]) const collection = createListCollection({ items: [ { label: 'React', value: 'react' }, { label: 'Solid', value: 'solid' }, { label: 'Vue', value: 'vue' }, { label: 'Svelte', value: 'svelte', disabled: true }, ], }) return ( setSelectedItems(e.items)}> Framework Clear Frameworks {(item) => ( {item().label} )} ) } ``` #### Vue ```vue ``` #### Svelte ```svelte Framework Clear Frameworks {#each collection.items as item (item.value)} {item.label} {/each} {#if selectedItems.length > 0}

Selected: {selectedItems.map((item) => item.label).join(', ')}

{/if} ``` ### Grouping Grouping related options can be useful for organizing options into categories. - Use the `groupBy` prop to configure the grouping of the items. - Use the `collection.group()` method to get the grouped items. - Use the `Select.ItemGroup` and `Select.ItemGroupLabel` components to render the grouped items. **Example: grouping** #### React ```tsx import { Portal } from '@ark-ui/react/portal' import { Select, createListCollection } from '@ark-ui/react/select' import { ChevronDownIcon } from 'lucide-react' export const Grouping = () => { const collection = createListCollection({ items: [ { label: 'React', value: 'react', type: 'JS' }, { label: 'Solid', value: 'solid', type: 'JS' }, { label: 'Vue', value: 'vue', type: 'JS' }, { label: 'Panda', value: 'panda', type: 'CSS' }, { label: 'Tailwind', value: 'tailwind', type: 'CSS' }, ], groupBy: (item) => item.type, }) return ( Framework Clear {collection.group().map(([type, group]) => ( {type} {group.map((item) => ( {item.label} ))} ))} ) } ``` #### Solid ```tsx import { Select, createListCollection } from '@ark-ui/solid/select' import { For, Portal } from 'solid-js/web' export const Grouping = () => { const collection = createListCollection({ items: [ { label: 'React', value: 'react', type: 'JS' }, { label: 'Solid', value: 'solid', type: 'JS' }, { label: 'Vue', value: 'vue', type: 'JS' }, { label: 'Panda', value: 'panda', type: 'CSS' }, { label: 'Tailwind', value: 'tailwind', type: 'CSS' }, ], groupBy: (item) => item.type, }) return ( Framework Clear {([type, group]) => ( {type} {(item) => ( {item.label} )} )} ) } ``` #### Vue ```vue ``` #### Svelte ```svelte Framework Clear {#each collection.group() as [type, group]} {type} {#each group as item (item.value)} {item.label} {/each} {/each} ``` ### Multiple Selection To enable `multiple` item selection: **Example: multiple** #### React ```tsx import { Portal } from '@ark-ui/react/portal' import { Select, createListCollection } from '@ark-ui/react/select' import { ChevronDownIcon } from 'lucide-react' export const Multiple = () => { const collection = createListCollection({ items: [ { label: 'React', value: 'react' }, { label: 'Solid', value: 'solid' }, { label: 'Vue', value: 'vue' }, { label: 'Svelte', value: 'svelte', disabled: true }, ], }) return ( Framework Clear Frameworks {collection.items.map((item) => ( {item.label} ))} ) } ``` #### Solid ```tsx import { Select, createListCollection } from '@ark-ui/solid/select' import { ChevronDownIcon } from 'lucide-solid' import { Index, Portal } from 'solid-js/web' export const Multiple = () => { const collection = createListCollection({ items: [ { label: 'React', value: 'react' }, { label: 'Solid', value: 'solid' }, { label: 'Vue', value: 'vue' }, { label: 'Svelte', value: 'svelte', disabled: true }, ], }) return ( Framework Clear Frameworks {(item) => ( {item().label} )} ) } ``` #### Vue ```vue ``` #### Svelte ```svelte Framework Clear Frameworks {#each collection.items as item (item.value)} {item.label} {/each} ``` ### Form Library Here's an example of integrating the `Select` component with a form library. **Example: form-library** #### React ```tsx import { Select, createListCollection } from '@ark-ui/react/select' import { ChevronDownIcon } from 'lucide-react' import { Controller, type SubmitHandler, useForm } from 'react-hook-form' interface Inputs { framework: string } export const FormLibrary = () => { const { control, handleSubmit } = useForm({ defaultValues: { framework: 'React' }, }) const collection = createListCollection({ items: ['React', 'Solid', 'Vue', 'Svelte'], }) const onSubmit: SubmitHandler = (data) => { window.alert(JSON.stringify(data)) } return (
( field.onChange(e.value[0])} name={field.name} onInteractOutside={() => field.onBlur()} > Framework Clear Frameworks {collection.items.map((item) => ( {item} ))} )} /> ) } ``` #### Solid ```tsx import { Select, createListCollection } from '@ark-ui/solid' import { createForm, getValue, setValue } from '@modular-forms/solid' import { createMemo } from 'solid-js' import { Index, Portal } from 'solid-js/web' export const FormLibrary = () => { const frameworks = createListCollection({ items: [ { label: 'React', value: 'react' }, { label: 'Solid', value: 'solid' }, { label: 'Vue', value: 'vue' }, ], }) const [formStore, { Form, Field }] = createForm({ initialValues: { value: 'solid' }, }) const value = createMemo(() => getValue(formStore, 'value')) return ( <>
Value is {value()}
{ console.log(e.value) }} > {(field, props) => ( { setValue(formStore, field.name, e.value[0]) }} > Clear Frameworks {(item) => ( {item().label} )} )}
) } ``` #### Vue ```vue ``` #### Svelte ```svelte
Value is {formData.framework}
{ e.preventDefault() form.handleSubmit() }} > {#snippet children(field)} {@const state = field.state} 0} name={field.name} onValueChange={(details) => { field.handleChange(details.value[0]) }} > Clear Frameworks {#each frameworks.items as item} {item.label} {/each} {/snippet}
``` ### Field Component The `Field` component helps manage form-related state and accessibility attributes of a select. It includes handling ARIA labels, helper text, and error text to ensure proper accessibility. **Example: with-field** #### React ```tsx import { Field } from '@ark-ui/react/field' import { Select, createListCollection } from '@ark-ui/react/select' import { ChevronDownIcon } from 'lucide-react' export const WithField = (props: Field.RootProps) => { const collection = createListCollection({ items: ['React', 'Solid', 'Vue', 'Svelte'] }) return ( Label {collection.items.map((item) => ( {item} ))} Additional Info Error Info ) } ``` #### Solid ```tsx import { Field } from '@ark-ui/solid/field' import { Select, createListCollection } from '@ark-ui/solid/select' import { ChevronDownIcon } from 'lucide-solid' import { Index } from 'solid-js/web' export const WithField = (props: Field.RootProps) => { const collection = createListCollection({ items: ['React', 'Solid', 'Vue', 'Svelte'] }) return ( Label Frameworks {(item) => ( {item()} )} Additional Info Error Info ) } ``` #### Vue ```vue ``` #### Svelte ```svelte Framework {#each collection.items as item} {item} {/each} Additional Info Error Info ``` ### Async Loading Here's an example of how to load the items asynchronously when the select is opened. **Example: async** #### React ```tsx import { Portal } from '@ark-ui/react/portal' import { Select, createListCollection } from '@ark-ui/react/select' import { ChevronDownIcon } from 'lucide-react' import { useState } from 'react' function loadData() { return new Promise((resolve) => { setTimeout(() => resolve(['React', 'Solid', 'Vue', 'Svelte', 'Angular', 'Ember']), 500) }) } export const Async = () => { const [items, setItems] = useState(null) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const collection = createListCollection({ items: items || [], }) const handleOpenChange = (details: Select.OpenChangeDetails) => { if (details.open && items == null) { setLoading(true) setError(null) loadData() .then((data) => setItems(data)) .catch((err) => setError(err)) .finally(() => setLoading(false)) } } return ( Framework Clear {loading ? (
Loading...
) : error ? (
Error: {error.message}
) : ( collection.items.map((item) => ( {item} )) )}
) } ``` #### Solid ```tsx import { Select, createListCollection } from '@ark-ui/solid/select' import { Index, Show, createMemo, createSignal } from 'solid-js' import { Portal } from 'solid-js/web' function loadData() { return new Promise((resolve) => { setTimeout(() => resolve(['React', 'Solid', 'Vue', 'Svelte', 'Angular', 'Ember']), 500) }) } export const Async = () => { const [items, setItems] = createSignal(null) const [loading, setLoading] = createSignal(false) const [error, setError] = createSignal(null) const collection = createMemo(() => createListCollection({ items: items() || [], }), ) const handleOpenChange = (details: Select.OpenChangeDetails) => { if (details.open && items() === null) { setLoading(true) setError(null) loadData() .then((data) => setItems(data)) .catch((err) => setError(err)) .finally(() => setLoading(false)) } } return ( Framework Clear
Loading...
Error: {error()?.message}
{(item) => ( {item()} )}
) } ``` #### Vue ```vue ``` #### Svelte ```svelte Framework Clear {#if loading}
Loading...
{:else if error}
Error: {error.message}
{:else} {#each collection.items as item} {item} {/each} {/if}
``` ### Root Provider The `RootProvider` component provides a context for the select. It accepts the value of the `useSelect` hook. You can leverage it to access the component state and methods from outside the select. **Example: root-provider** #### React ```tsx import { Portal } from '@ark-ui/react/portal' import { Select, createListCollection, useSelect } from '@ark-ui/react/select' import { ChevronDownIcon } from 'lucide-react' export const RootProvider = () => { const collection = createListCollection({ items: ['React', 'Solid', 'Vue', 'Svelte'] }) const select = useSelect({ collection: collection }) return ( <> Framework Clear Frameworks {collection.items.map((item) => ( {item} ))} ) } ``` #### Solid ```tsx import { Select, createListCollection, useSelect } from '@ark-ui/solid/select' import { Index, Portal } from 'solid-js/web' export const RootProvider = () => { const collection = createListCollection({ items: ['React', 'Solid', 'Vue', 'Svelte'] }) const select = useSelect({ collection: collection }) return ( <> Framework Clear Frameworks {(item) => ( {item()} )} ) } ``` #### Vue ```vue ``` #### Svelte ```svelte
Framework Clear Frameworks {#each collection.items as item} {item} {/each}
``` > If you're using the `RootProvider` component, you don't need to use the `Root` component. ### Select on Highlight Here's an example of automatically selecting items when they are highlighted (hovered or navigated to with keyboard). **Example: select-on-highlight** #### React ```tsx import { Portal } from '@ark-ui/react/portal' import { Select, createListCollection, useSelect } from '@ark-ui/react/select' import { ChevronDownIcon } from 'lucide-react' export const SelectOnHighlight = () => { const collection = createListCollection({ items: ['React', 'Solid', 'Vue', 'Svelte'], }) const select = useSelect({ collection, onHighlightChange({ highlightedValue }) { if (highlightedValue) { select.selectValue(highlightedValue) } }, }) return ( Framework Clear Frameworks {collection.items.map((item) => ( {item} ))} ) } ``` #### Solid ```tsx import { Select, createListCollection, useSelect } from '@ark-ui/solid/select' import { Index, Portal } from 'solid-js/web' export const SelectOnHighlight = () => { const collection = createListCollection({ items: ['React', 'Solid', 'Vue', 'Svelte'], }) const select = useSelect({ collection, onHighlightChange({ highlightedValue }) { if (highlightedValue) { select().selectValue(highlightedValue) } }, }) return ( Framework Clear Frameworks {(item) => ( {item()} )} ) } ``` #### Vue ```vue ``` #### Svelte ```svelte Framework Clear Frameworks {#each collection.items as item} {item} {/each} ``` ### Maximum Selected Items Here's an example of limiting the number of items that can be selected in a multiple select. **Example: max-selected** #### React ```tsx import { Portal } from '@ark-ui/react/portal' import { Select, createListCollection } from '@ark-ui/react/select' import { ChevronDownIcon } from 'lucide-react' import { useState } from 'react' const items = ['React', 'Solid', 'Vue', 'Svelte'] export const MaxSelected = () => { const [value, setValue] = useState([]) const maxSelected = 2 const hasReachedMax = (value: string[]) => value.length >= maxSelected const collection = createListCollection({ items: items.map((item) => ({ label: item, value: item, disabled: hasReachedMax(value) && !value.includes(item), })), }) const handleValueChange = (details: Select.ValueChangeDetails) => { if (hasReachedMax(value) && details.value.length) return setValue(details.value) } return ( Framework Clear Frameworks {collection.items.map((item) => ( {item.label} ))} ) } ``` #### Solid ```tsx import { Select, createListCollection } from '@ark-ui/solid/select' import { Index, createMemo, createSignal } from 'solid-js' import { Portal } from 'solid-js/web' const items = ['React', 'Solid', 'Vue', 'Svelte'] export const MaxSelected = () => { const [value, setValue] = createSignal([]) const maxSelected = 2 const hasReachedMax = (value: string[]) => value.length >= maxSelected const collection = createMemo(() => createListCollection({ items: items.map((item) => ({ label: item, value: item, disabled: hasReachedMax(value()) && !value().includes(item), })), }), ) const handleValueChange = (details: Select.ValueChangeDetails) => { if (hasReachedMax(value()) && details.value.length) return setValue(details.value) } return ( Framework Clear Frameworks {(item) => ( {item().label} )} ) } ``` #### Vue ```vue ``` #### Svelte ```svelte Framework Clear Frameworks {#each collection.items as item (item.value)} {item.label} {/each} ``` ### Lazy Mount The `lazyMount` and `unmountOnExit` props allow you to control when the select content is mounted and unmounted from the DOM. This can improve performance by only rendering the content when needed. **Example: lazy-mount** #### React ```tsx import { Portal } from '@ark-ui/react/portal' import { Select, createListCollection } from '@ark-ui/react/select' import { ChevronDownIcon } from 'lucide-react' export const LazyMount = () => { const collection = createListCollection({ items: ['React', 'Solid', 'Vue', 'Svelte', 'Angular', 'Alpine'], }) return ( Framework Clear Frameworks {collection.items.map((item) => ( {item} ))} ) } ``` #### Solid ```tsx import { Select, createListCollection } from '@ark-ui/solid/select' import { Index, Portal } from 'solid-js/web' export const LazyMount = () => { const collection = createListCollection({ items: ['React', 'Solid', 'Vue', 'Svelte', 'Angular', 'Alpine'], }) return ( Framework Clear Frameworks {(item) => ( {item()} )} ) } ``` #### Vue ```vue ``` #### Svelte ```svelte Framework Clear Frameworks {#each collection.items as item} {item} {/each} ``` ## Guides ### Type-Safety The `Select.RootComponent` type enables you to create closed, strongly typed wrapper components that maintain full type safety for collection items. This is particularly useful when building reusable select components with custom props and consistent styling. ```tsx import { Select as ArkSelect, type CollectionItem } from '@ark-ui/react/select' import { createListCollection } from '@ark-ui/react/collection' interface SelectProps extends ArkSelect.RootProps {} const Select: ArkSelect.RootComponent = (props) => { return {/* ... */} } ``` Then, you can use the `Select` component as follows: ```tsx const App = () => { const collection = createListCollection({ initialItems: [ { label: 'React', value: 'react' }, { label: 'Vue', value: 'vue' }, { label: 'Svelte', value: 'svelte' }, ], }) return ( ) } ``` ### Usage in Popover or Dialog When using the Select component within a `Popover` or `Dialog`, avoid rendering its content within a `Portal` or `Teleport`. This ensures the Select's content stays within the Popover/Dialog's DOM hierarchy rather than being portalled to the document body, maintaining proper interaction and accessibility behavior. ### Hidden Select The `Select.HiddenSelect` component renders a native HTML `` element exists in the DOM - **Browser auto-fill**: Browsers can properly auto-fill the select based on previously submitted form data - **Progressive enhancement**: Forms remain functional even if JavaScript fails to load ```tsx {/* Other Select components */} ``` The hidden select automatically syncs with the Select component's value, ensuring form data is always up-to-date. ### Empty State You can create an empty state component that displays when there are no items in the collection. Use the `useSelectContext` hook to check the collection size: ```tsx const SelectEmpty = (props: React.ComponentProps<'div'>) => { const select = useSelectContext() if (select.collection.size === 0) { return
} return null } ``` Then use it within your Select content: ```tsx No items to display {/* Your items */} ``` ### Available height and width The following css variables are exposed to the `Select.Positioner` which you can use to style the `Select.Content` ```css /* width of the select trigger */ --reference-width: ; /* width of the available viewport */ --available-width: ; /* height of the available viewport */ --available-height: ; ``` For example, if you want to make sure the maximum height doesn't exceed the available height, you can use the following: ```css [data-scope='select'][data-part='content'] { max-height: calc(var(--available-height) - 100px); } ``` ## API Reference ### Props **Component API Reference** #### React **Root Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `collection` | `ListCollection` | Yes | The collection of items | | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `closeOnSelect` | `boolean` | No | Whether the select should close after an item is selected | | `composite` | `boolean` | No | Whether the select is a composed with other composite widgets like tabs or combobox | | `defaultHighlightedValue` | `string` | No | The initial value of the highlighted item when opened. Use when you don't need to control the highlighted value of the select. | | `defaultOpen` | `boolean` | No | Whether the select's open state is controlled by the user | | `defaultValue` | `string[]` | No | The initial default value of the select when rendered. Use when you don't need to control the value of the select. | | `deselectable` | `boolean` | No | Whether the value can be cleared by clicking the selected item. **Note:** this is only applicable for single selection | | `disabled` | `boolean` | No | Whether the select is disabled | | `form` | `string` | No | The associate form of the underlying select. | | `highlightedValue` | `string` | No | The controlled key of the highlighted item | | `id` | `string` | No | The unique identifier of the machine. | | `ids` | `Partial<{ root: string content: string control: string trigger: string clearTrigger: string label: string hiddenSelect: string positioner: string item: (id: string | number) => string itemGroup: (id: string | number) => string itemGroupLabel: (id: string | number) => string }>` | No | The ids of the elements in the select. Useful for composition. | | `immediate` | `boolean` | No | Whether to synchronize the present change immediately or defer it to the next frame | | `invalid` | `boolean` | No | Whether the select is invalid | | `lazyMount` | `boolean` | No | Whether to enable lazy mounting | | `loopFocus` | `boolean` | No | Whether to loop the keyboard navigation through the options | | `multiple` | `boolean` | No | Whether to allow multiple selection | | `name` | `string` | No | The `name` attribute of the underlying select. | | `onExitComplete` | `VoidFunction` | No | Function called when the animation ends in the closed state | | `onFocusOutside` | `(event: FocusOutsideEvent) => void` | No | Function called when the focus is moved outside the component | | `onHighlightChange` | `(details: HighlightChangeDetails) => void` | No | The callback fired when the highlighted item changes. | | `onInteractOutside` | `(event: InteractOutsideEvent) => void` | No | Function called when an interaction happens outside the component | | `onOpenChange` | `(details: OpenChangeDetails) => void` | No | Function called when the popup is opened | | `onPointerDownOutside` | `(event: PointerDownOutsideEvent) => void` | No | Function called when the pointer is pressed down outside the component | | `onSelect` | `(details: SelectionDetails) => void` | No | Function called when an item is selected | | `onValueChange` | `(details: ValueChangeDetails) => void` | No | The callback fired when the selected item changes. | | `open` | `boolean` | No | Whether the select menu is open | | `positioning` | `PositioningOptions` | No | The positioning options of the menu. | | `present` | `boolean` | No | Whether the node is present (controlled by the user) | | `readOnly` | `boolean` | No | Whether the select is read-only | | `required` | `boolean` | No | Whether the select is required | | `scrollToIndexFn` | `(details: ScrollToIndexDetails) => void` | No | Function to scroll to a specific index | | `skipAnimationOnMount` | `boolean` | No | Whether to allow the initial presence animation. | | `unmountOnExit` | `boolean` | No | Whether to unmount on exit. | | `value` | `string[]` | No | The controlled keys of the selected items | **Root Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | root | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | **ClearTrigger Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ClearTrigger Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | clear-trigger | | `[data-invalid]` | Present when invalid | **Content Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Content Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | content | | `[data-state]` | "open" | "closed" | | `[data-nested]` | listbox | | `[data-has-nested]` | listbox | | `[data-placement]` | The placement of the content | | `[data-activedescendant]` | The id the active descendant of the content | **Control Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Control Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | control | | `[data-state]` | "open" | "closed" | | `[data-focus]` | Present when focused | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | **HiddenSelect Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Indicator Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Indicator Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | indicator | | `[data-state]` | "open" | "closed" | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | **ItemGroupLabel Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ItemGroup Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ItemGroup Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item-group | | `[data-disabled]` | Present when disabled | **ItemIndicator Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ItemIndicator Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item-indicator | | `[data-state]` | "checked" | "unchecked" | **Item Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `item` | `any` | No | The item to render | | `persistFocus` | `boolean` | No | Whether hovering outside should clear the highlighted state | **Item Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item | | `[data-value]` | The value of the item | | `[data-state]` | "checked" | "unchecked" | | `[data-highlighted]` | Present when highlighted | | `[data-disabled]` | Present when disabled | **ItemText Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ItemText Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item-text | | `[data-state]` | "checked" | "unchecked" | | `[data-disabled]` | Present when disabled | | `[data-highlighted]` | Present when highlighted | **Label Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Label Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | label | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | **List Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Positioner Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **RootProvider Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `value` | `UseSelectReturn` | Yes | | | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `immediate` | `boolean` | No | Whether to synchronize the present change immediately or defer it to the next frame | | `lazyMount` | `boolean` | No | Whether to enable lazy mounting | | `onExitComplete` | `VoidFunction` | No | Function called when the animation ends in the closed state | | `present` | `boolean` | No | Whether the node is present (controlled by the user) | | `skipAnimationOnMount` | `boolean` | No | Whether to allow the initial presence animation. | | `unmountOnExit` | `boolean` | No | Whether to unmount on exit. | **Trigger Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Trigger Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | trigger | | `[data-state]` | "open" | "closed" | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | | `[data-placement]` | The placement of the trigger | | `[data-placeholder-shown]` | Present when placeholder is shown | **ValueText Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `placeholder` | `string` | No | Text to display when no value is selected. | **ValueText Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | value-text | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-focus]` | Present when focused | #### Solid **Root Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `collection` | `ListCollection` | Yes | The collection of items | | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `closeOnSelect` | `boolean` | No | Whether the select should close after an item is selected | | `composite` | `boolean` | No | Whether the select is a composed with other composite widgets like tabs or combobox | | `defaultHighlightedValue` | `string` | No | The initial value of the highlighted item when opened. Use when you don't need to control the highlighted value of the select. | | `defaultOpen` | `boolean` | No | Whether the select's open state is controlled by the user | | `defaultValue` | `string[]` | No | The initial default value of the select when rendered. Use when you don't need to control the value of the select. | | `deselectable` | `boolean` | No | Whether the value can be cleared by clicking the selected item. **Note:** this is only applicable for single selection | | `disabled` | `boolean` | No | Whether the select is disabled | | `form` | `string` | No | The associate form of the underlying select. | | `highlightedValue` | `string` | No | The controlled key of the highlighted item | | `id` | `string` | No | The unique identifier of the machine. | | `ids` | `Partial<{ root: string content: string control: string trigger: string clearTrigger: string label: string hiddenSelect: string positioner: string item: (id: string | number) => string itemGroup: (id: string | number) => string itemGroupLabel: (id: string | number) => string }>` | No | The ids of the elements in the select. Useful for composition. | | `immediate` | `boolean` | No | Whether to synchronize the present change immediately or defer it to the next frame | | `invalid` | `boolean` | No | Whether the select is invalid | | `lazyMount` | `boolean` | No | Whether to enable lazy mounting | | `loopFocus` | `boolean` | No | Whether to loop the keyboard navigation through the options | | `multiple` | `boolean` | No | Whether to allow multiple selection | | `name` | `string` | No | The `name` attribute of the underlying select. | | `onExitComplete` | `VoidFunction` | No | Function called when the animation ends in the closed state | | `onFocusOutside` | `(event: FocusOutsideEvent) => void` | No | Function called when the focus is moved outside the component | | `onHighlightChange` | `(details: HighlightChangeDetails) => void` | No | The callback fired when the highlighted item changes. | | `onInteractOutside` | `(event: InteractOutsideEvent) => void` | No | Function called when an interaction happens outside the component | | `onOpenChange` | `(details: OpenChangeDetails) => void` | No | Function called when the popup is opened | | `onPointerDownOutside` | `(event: PointerDownOutsideEvent) => void` | No | Function called when the pointer is pressed down outside the component | | `onSelect` | `(details: SelectionDetails) => void` | No | Function called when an item is selected | | `onValueChange` | `(details: ValueChangeDetails) => void` | No | The callback fired when the selected item changes. | | `open` | `boolean` | No | Whether the select menu is open | | `positioning` | `PositioningOptions` | No | The positioning options of the menu. | | `present` | `boolean` | No | Whether the node is present (controlled by the user) | | `readOnly` | `boolean` | No | Whether the select is read-only | | `required` | `boolean` | No | Whether the select is required | | `scrollToIndexFn` | `(details: ScrollToIndexDetails) => void` | No | Function to scroll to a specific index | | `skipAnimationOnMount` | `boolean` | No | Whether to allow the initial presence animation. | | `unmountOnExit` | `boolean` | No | Whether to unmount on exit. | | `value` | `string[]` | No | The controlled keys of the selected items | **Root Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | root | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | **ClearTrigger Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'button'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ClearTrigger Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | clear-trigger | | `[data-invalid]` | Present when invalid | **Content Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Content Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | content | | `[data-state]` | "open" | "closed" | | `[data-nested]` | listbox | | `[data-has-nested]` | listbox | | `[data-placement]` | The placement of the content | | `[data-activedescendant]` | The id the active descendant of the content | **Control Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Control Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | control | | `[data-state]` | "open" | "closed" | | `[data-focus]` | Present when focused | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | **HiddenSelect Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'select'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Indicator Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Indicator Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | indicator | | `[data-state]` | "open" | "closed" | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | **ItemGroupLabel Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ItemGroup Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ItemGroup Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item-group | | `[data-disabled]` | Present when disabled | **ItemIndicator Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ItemIndicator Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item-indicator | | `[data-state]` | "checked" | "unchecked" | **Item Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `item` | `any` | No | The item to render | | `persistFocus` | `boolean` | No | Whether hovering outside should clear the highlighted state | **Item Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item | | `[data-value]` | The value of the item | | `[data-state]` | "checked" | "unchecked" | | `[data-highlighted]` | Present when highlighted | | `[data-disabled]` | Present when disabled | **ItemText Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'span'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ItemText Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item-text | | `[data-state]` | "checked" | "unchecked" | | `[data-disabled]` | Present when disabled | | `[data-highlighted]` | Present when highlighted | **Label Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'label'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Label Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | label | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | **List Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Positioner Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **RootProvider Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `value` | `UseSelectReturn` | Yes | | | `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `immediate` | `boolean` | No | Whether to synchronize the present change immediately or defer it to the next frame | | `lazyMount` | `boolean` | No | Whether to enable lazy mounting | | `onExitComplete` | `VoidFunction` | No | Function called when the animation ends in the closed state | | `present` | `boolean` | No | Whether the node is present (controlled by the user) | | `skipAnimationOnMount` | `boolean` | No | Whether to allow the initial presence animation. | | `unmountOnExit` | `boolean` | No | Whether to unmount on exit. | **Trigger Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'button'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Trigger Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | trigger | | `[data-state]` | "open" | "closed" | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | | `[data-placement]` | The placement of the trigger | | `[data-placeholder-shown]` | Present when placeholder is shown | **ValueText Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `(props: ParentProps<'span'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `placeholder` | `string` | No | Text to display when no value is selected. | **ValueText Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | value-text | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-focus]` | Present when focused | #### Vue **Root Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `collection` | `ListCollection` | Yes | The collection of items | | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `closeOnSelect` | `boolean` | No | Whether the select should close after an item is selected | | `composite` | `boolean` | No | Whether the select is a composed with other composite widgets like tabs or combobox | | `defaultHighlightedValue` | `string` | No | The initial value of the highlighted item when opened. Use when you don't need to control the highlighted value of the select. | | `defaultOpen` | `boolean` | No | Whether the select's open state is controlled by the user | | `defaultValue` | `string[]` | No | The initial default value of the select when rendered. Use when you don't need to control the value of the select. | | `deselectable` | `boolean` | No | Whether the value can be cleared by clicking the selected item. **Note:** this is only applicable for single selection | | `disabled` | `boolean` | No | Whether the select is disabled | | `form` | `string` | No | The associate form of the underlying select. | | `highlightedValue` | `string` | No | The controlled key of the highlighted item | | `id` | `string` | No | The unique identifier of the machine. | | `ids` | `Partial<{ root: string content: string control: string trigger: string clearTrigger: string label: string hiddenSelect: string positioner: string item(id: string | number): string itemGroup(id: string | number): string itemGroupLabel(id: string | number): string }>` | No | The ids of the elements in the select. Useful for composition. | | `invalid` | `boolean` | No | Whether the select is invalid | | `lazyMount` | `boolean` | No | Whether to enable lazy mounting | | `loopFocus` | `boolean` | No | Whether to loop the keyboard navigation through the options | | `modelValue` | `string[]` | No | The model value of the select | | `multiple` | `boolean` | No | Whether to allow multiple selection | | `name` | `string` | No | The `name` attribute of the underlying select. | | `open` | `boolean` | No | Whether the select menu is open | | `positioning` | `PositioningOptions` | No | The positioning options of the menu. | | `readOnly` | `boolean` | No | Whether the select is read-only | | `required` | `boolean` | No | Whether the select is required | | `scrollToIndexFn` | `(details: ScrollToIndexDetails) => void` | No | Function to scroll to a specific index | | `unmountOnExit` | `boolean` | No | Whether to unmount on exit. | **Root Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | root | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | **ClearTrigger Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ClearTrigger Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | clear-trigger | | `[data-invalid]` | Present when invalid | **Content Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Content Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | content | | `[data-state]` | "open" | "closed" | | `[data-nested]` | listbox | | `[data-has-nested]` | listbox | | `[data-placement]` | The placement of the content | | `[data-activedescendant]` | The id the active descendant of the content | **Control Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Control Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | control | | `[data-state]` | "open" | "closed" | | `[data-focus]` | Present when focused | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | **HiddenSelect Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Indicator Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Indicator Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | indicator | | `[data-state]` | "open" | "closed" | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | **ItemGroupLabel Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ItemGroup Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `id` | `string` | No | | **ItemGroup Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item-group | | `[data-disabled]` | Present when disabled | **ItemIndicator Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ItemIndicator Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item-indicator | | `[data-state]` | "checked" | "unchecked" | **Item Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `item` | `any` | No | The item to render | | `persistFocus` | `boolean` | No | Whether hovering outside should clear the highlighted state | **Item Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item | | `[data-value]` | The value of the item | | `[data-state]` | "checked" | "unchecked" | | `[data-highlighted]` | Present when highlighted | | `[data-disabled]` | Present when disabled | **ItemText Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **ItemText Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item-text | | `[data-state]` | "checked" | "unchecked" | | `[data-disabled]` | Present when disabled | | `[data-highlighted]` | Present when highlighted | **Label Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Label Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | label | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | **List Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Positioner Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **RootProvider Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `value` | `SelectApi` | Yes | | | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `lazyMount` | `boolean` | No | Whether to enable lazy mounting | | `unmountOnExit` | `boolean` | No | Whether to unmount on exit. | **Trigger Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | **Trigger Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | trigger | | `[data-state]` | "open" | "closed" | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | | `[data-placement]` | The placement of the trigger | | `[data-placeholder-shown]` | Present when placeholder is shown | **ValueText Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `placeholder` | `string` | No | | **ValueText Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | value-text | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-focus]` | Present when focused | #### Svelte **Root Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `collection` | `ListCollection` | Yes | The collection of items | | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `closeOnSelect` | `boolean` | No | Whether the select should close after an item is selected | | `composite` | `boolean` | No | Whether the select is a composed with other composite widgets like tabs or combobox | | `defaultHighlightedValue` | `string` | No | The initial value of the highlighted item when opened. Use when you don't need to control the highlighted value of the select. | | `defaultOpen` | `boolean` | No | Whether the select's open state is controlled by the user | | `defaultValue` | `string[]` | No | The initial default value of the select when rendered. Use when you don't need to control the value of the select. | | `deselectable` | `boolean` | No | Whether the value can be cleared by clicking the selected item. **Note:** this is only applicable for single selection | | `disabled` | `boolean` | No | Whether the select is disabled | | `form` | `string` | No | The associate form of the underlying select. | | `highlightedValue` | `string` | No | The controlled key of the highlighted item | | `id` | `string` | No | The unique identifier of the machine. | | `ids` | `Partial<{ root: string content: string control: string trigger: string clearTrigger: string label: string hiddenSelect: string positioner: string item: (id: string | number) => string itemGroup: (id: string | number) => string itemGroupLabel: (id: string | number) => string }>` | No | The ids of the elements in the select. Useful for composition. | | `immediate` | `boolean` | No | Whether to synchronize the present change immediately or defer it to the next frame | | `invalid` | `boolean` | No | Whether the select is invalid | | `lazyMount` | `boolean` | No | Whether to enable lazy mounting | | `loopFocus` | `boolean` | No | Whether to loop the keyboard navigation through the options | | `multiple` | `boolean` | No | Whether to allow multiple selection | | `name` | `string` | No | The `name` attribute of the underlying select. | | `onExitComplete` | `VoidFunction` | No | Function called when the animation ends in the closed state | | `onFocusOutside` | `(event: FocusOutsideEvent) => void` | No | Function called when the focus is moved outside the component | | `onHighlightChange` | `(details: HighlightChangeDetails) => void` | No | The callback fired when the highlighted item changes. | | `onInteractOutside` | `(event: InteractOutsideEvent) => void` | No | Function called when an interaction happens outside the component | | `onOpenChange` | `(details: OpenChangeDetails) => void` | No | Function called when the popup is opened | | `onPointerDownOutside` | `(event: PointerDownOutsideEvent) => void` | No | Function called when the pointer is pressed down outside the component | | `onSelect` | `(details: SelectionDetails) => void` | No | Function called when an item is selected | | `onValueChange` | `(details: ValueChangeDetails) => void` | No | The callback fired when the selected item changes. | | `open` | `boolean` | No | Whether the select menu is open | | `positioning` | `PositioningOptions` | No | The positioning options of the menu. | | `present` | `boolean` | No | Whether the node is present (controlled by the user) | | `readOnly` | `boolean` | No | Whether the select is read-only | | `ref` | `Element` | No | | | `required` | `boolean` | No | Whether the select is required | | `scrollToIndexFn` | `(details: ScrollToIndexDetails) => void` | No | Function to scroll to a specific index | | `skipAnimationOnMount` | `boolean` | No | Whether to allow the initial presence animation. | | `unmountOnExit` | `boolean` | No | Whether to unmount on exit. | | `value` | `string[]` | No | The controlled keys of the selected items | **Root Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | root | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | **ClearTrigger Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'button'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **ClearTrigger Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | clear-trigger | | `[data-invalid]` | Present when invalid | **Content Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **Content Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | content | | `[data-state]` | "open" | "closed" | | `[data-nested]` | listbox | | `[data-has-nested]` | listbox | | `[data-placement]` | The placement of the content | | `[data-activedescendant]` | The id the active descendant of the content | **Context Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `render` | `Snippet<[UseSelectReturn]>` | Yes | | **Control Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **Control Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | control | | `[data-state]` | "open" | "closed" | | `[data-focus]` | Present when focused | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | **HiddenSelect Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'select'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **Indicator Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **Indicator Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | indicator | | `[data-state]` | "open" | "closed" | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | **ItemContext Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `render` | `Snippet<[UseSelectItemContext]>` | Yes | | **ItemGroupLabel Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **ItemGroup Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `id` | `string` | No | | | `ref` | `Element` | No | | **ItemGroup Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item-group | | `[data-disabled]` | Present when disabled | **ItemIndicator Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **ItemIndicator Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item-indicator | | `[data-state]` | "checked" | "unchecked" | **Item Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `disabled` | `boolean` | No | | | `item` | `NonNullable` | No | | | `ref` | `Element` | No | | **Item Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item | | `[data-value]` | The value of the item | | `[data-state]` | "checked" | "unchecked" | | `[data-highlighted]` | Present when highlighted | | `[data-disabled]` | Present when disabled | **ItemText Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'span'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **ItemText Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | item-text | | `[data-state]` | "checked" | "unchecked" | | `[data-disabled]` | Present when disabled | | `[data-highlighted]` | Present when highlighted | **Label Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'label'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **Label Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | label | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | **List Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **Positioner Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **RootProvider Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `value` | `UseSelectReturn` | Yes | | | `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `immediate` | `boolean` | No | Whether to synchronize the present change immediately or defer it to the next frame | | `lazyMount` | `boolean` | No | Whether to enable lazy mounting | | `onExitComplete` | `VoidFunction` | No | Function called when the animation ends in the closed state | | `present` | `boolean` | No | Whether the node is present (controlled by the user) | | `ref` | `Element` | No | | | `skipAnimationOnMount` | `boolean` | No | Whether to allow the initial presence animation. | | `unmountOnExit` | `boolean` | No | Whether to unmount on exit. | **Trigger Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'button'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `ref` | `Element` | No | | **Trigger Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | trigger | | `[data-state]` | "open" | "closed" | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-readonly]` | Present when read-only | | `[data-placement]` | The placement of the trigger | | `[data-placeholder-shown]` | Present when placeholder is shown | **ValueText Props:** | Prop | Type | Required | Description | |------|------|----------|-------------| | `asChild` | `Snippet<[PropsFn<'span'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. | | `placeholder` | `string` | No | | | `ref` | `Element` | No | | **ValueText Data Attributes:** | Attribute | Value | |-----------|-------| | `[data-scope]` | select | | `[data-part]` | value-text | | `[data-disabled]` | Present when disabled | | `[data-invalid]` | Present when invalid | | `[data-focus]` | Present when focused | ### Context These are the properties available when using `Select.Context`, `useSelectContext` hook or `useSelect` hook. **API:** | Property | Type | Description | |----------|------|-------------| | `focused` | `boolean` | Whether the select is focused | | `open` | `boolean` | Whether the select is open | | `empty` | `boolean` | Whether the select value is empty | | `highlightedValue` | `string` | The value of the highlighted item | | `highlightedItem` | `V` | The highlighted item | | `setHighlightValue` | `(value: string) => void` | Function to highlight a value | | `clearHighlightValue` | `VoidFunction` | Function to clear the highlighted value | | `selectedItems` | `V[]` | The selected items | | `hasSelectedItems` | `boolean` | Whether there's a selected option | | `value` | `string[]` | The selected item keys | | `valueAsString` | `string` | The string representation of the selected items | | `selectValue` | `(value: string) => void` | Function to select a value | | `selectAll` | `VoidFunction` | Function to select all values | | `setValue` | `(value: string[]) => void` | Function to set the value of the select | | `clearValue` | `(value?: string) => void` | Function to clear the value of the select. If a value is provided, it will only clear that value, otherwise, it will clear all values. | | `focus` | `VoidFunction` | Function to focus on the select input | | `getItemState` | `(props: ItemProps) => ItemState` | Returns the state of a select item | | `setOpen` | `(open: boolean) => void` | Function to open or close the select | | `collection` | `ListCollection` | Function to toggle the select | | `reposition` | `(options?: Partial) => void` | Function to set the positioning options of the select | | `multiple` | `boolean` | Whether the select allows multiple selections | | `disabled` | `boolean` | Whether the select is disabled | ## Accessibility Complies with the [Listbox WAI-ARIA design pattern](https://www.w3.org/WAI/ARIA/apg/patterns/listbox/). ### Keyboard Support