Select
Presents a selection of choices to the user, activated by a button.
Features
- Full keyboard navigation
- Can be controlled or uncontrolled
- Typeahead support
- Optional arrow component
- Custom positioning
Anatomy
- Trigger: The button that opens/closes the select menu
- Menu: The popover select menu
- Option: The individual select options
- Label: The label for the input
- Arrow: An optional arrow element which points to the menu's input
- Group: An optional group and group label element which can be used to group options
Usage
To create an select, use the createSelect builder function. Follow the anatomy or the example at
the top of this page to create your select.
Example components
Multi-select
A multi-select is a select that allows the user to select multiple options. To create a
multi-select, simply set the multiple prop to true on the createSelect builder.
Change options with keyboard
Using custom event listeners, you can customize what the keyboard does when interacting with the
trigger. In this example, we use the on:keydown event listener to change the selected option when
the user presses the up or down arrow keys, instead of opening the menu.
API Reference
createSelect
The builder function used to create the select component.
Props
| Prop | Default | Type / Description |
defaultSelected | - | SelectOption<unknown> The initial selected option. |
selected | - | Writable<SelectOption<unknown>> A writable store that can be used to get or update or the selected option. |
onSelectedChange | - | ChangeFn<SelectOption<unknown>> A callback that is called when the selected option changes. See Change Functions |
required | false | boolean Whether or not the select is required. |
disabled | false | boolean Whether or not the select is disabled. |
arrowSize | 8 | number The size of the arrow which points to the trigger in pixels. |
preventScroll | true | boolean Whether or not to prevent scrolling of the document when the select is open. |
loop | false | boolean Whether or not the focus should loop back to the first item when the last item is reached. |
escapeBehavior | 'close' | 'close' | 'ignore' | 'defer-otherwise-close' | 'defer-otherwise-ignore' Defines how the select reacts when the Escape key is pressed. close: Closes the select immediately.ignore: Prevents the select from closing and also blocks the parent element from closing in response to the Escape key.defer-otherwise-close: Delegates the action to the parent element. If no parent is found, it closes the element.defer-otherwise-ignore: Delegates the action to the parent element. If no parent is found, nothing is done. |
closeOnOutsideClick | true | boolean Whether or not to close the select when the user clicks outside of it. |
preventTextSelectionOverflow | true | boolean Whether to prevent text selection overflowing the select when it is the top layer. |
portal | body | string | HTMLElement | null The element or selector to render the select into. Nested floating elements are automatically rendered into their own portal if not specified. Pass in |
forceVisible | false | boolean Whether or not to force the select to always be visible. This is useful for custom transitions and animations using conditional blocks. |
positioning | placement: 'bottom' | A configuration object which determines how the floating element is positioned relative to the trigger. |
name | - | string The name to be used for the select input. |
highlightOnHover | true | boolean When true, hovering an option will update the |
multiple | false | boolean Whether or not the select is a multiple select. |
defaultOpen | false | boolean Whether the select is open by default or not. |
open | - | Writable<boolean> A writable store that controls whether or not the select is open. |
onOpenChange | - | ChangeFn<boolean> A callback called when the value of the See Change Functions |
ids | - | Record<'trigger' | 'menu' | 'label', string> Override the internally generated ids for the elements. |
Elements
| Element | Description |
The builder store used to create the select trigger. | |
The builder store used to create the select menu. | |
The builder store used to create the select options. | |
The builder store used to create the select hidden input. | |
The builder store used to create the select label. | |
The builder store used to create the select separator. | |
The builder store used to create the select group. | |
The builder store used to create the select group label. | |
The builder store used to create the select arrow. |
States
| State | Description |
open | A writable store that returns whether or not the select is open. |
selected | A writable store whose value is the selected option. |
selectedLabel | A readable store whose value is the selected option's label. |
Helpers
| Helper | Description |
isSelected | A derived store that returns whether or not the given value is selected. |
Options
| Option | Description |
required | Whether or not the select is required. |
disabled | Whether or not the select is disabled. |
arrowSize | The size of the arrow which points to the trigger in pixels. |
preventScroll | Whether or not to prevent scrolling of the document when the select is open. |
loop | Whether or not the focus should loop back to the first item when the last item is reached. |
escapeBehavior | Defines how the select reacts when the Escape key is pressed. close: Closes the select immediately.ignore: Prevents the select from closing and also blocks the parent element from closing in response to the Escape key.defer-otherwise-close: Delegates the action to the parent element. If no parent is found, it closes the element.defer-otherwise-ignore: Delegates the action to the parent element. If no parent is found, nothing is done. |
closeOnOutsideClick | Whether or not to close the select when the user clicks outside of it. |
preventTextSelectionOverflow | Whether to prevent text selection overflowing the select when it is the top layer. |
portal | The element or selector to render the select into. Nested floating elements are automatically rendered into their own portal if not specified. Pass in |
forceVisible | Whether or not to force the select to always be visible. This is useful for custom transitions and animations using conditional blocks. |
positioning | A configuration object which determines how the floating element is positioned relative to the trigger. |
name | The name to be used for the select input. |
highlightOnHover | When true, hovering an option will update the |
IDs
| Option | Description |
trigger | The writable store that represents the id of the |
menu | The writable store that represents the id of the |
label | The writable store that represents the id of the |
trigger
The element which opens/closes the select.
Data Attributes
| Data Attribute | Value |
[data-state] |
|
[data-disabled] | Present when the select is disabled. |
[data-melt-select-trigger] | Present on all trigger elements. |
Custom Events
| Event | Value |
m-click | (e: ) => void |
m-keydown | (e: ) => void |
label
The label element
Data Attributes
| Data Attribute | Value |
[data-melt-select-label] | Present on all label elements. |
Custom Events
| Event | Value |
m-click | (e: ) => void |
menu
The menu element
Data Attributes
| Data Attribute | Value |
[data-side] | 'top' | 'right' | 'bottom' | 'left' |
[data-align] | 'start' | 'center' | 'end' |
[data-melt-select-menu] | Present on all menu elements. |
Custom Events
| Event | Value |
m-keydown | (e: ) => void |
option
The option elements
Props
| Prop | Default | Type / Description |
label | - | string The label of the option. |
value * | - | unknown The value of the option. |
disabled | false | boolean Whether or not the option is disabled. |
Data Attributes
| Data Attribute | Value |
[data-melt-select-option] | Present on all option elements. |
Custom Events
| Event | Value |
m-click | (e: ) => void |
m-keydown | (e: ) => void |
m-pointermove | (e: ) => void |
m-pointerleave | (e: ) => void |
m-focusin | (e: ) => void |
m-focusout | (e: ) => void |
group
A function which takes in a unique key to group options together.
Props
| Prop | Default | Type / Description |
key | - | string A unique key for the group. |
Data Attributes
| Data Attribute | Value |
[data-melt-select-group] | Present on all group elements. |
groupLabel
A function which takes in a unique key to group options together.
Props
| Prop | Default | Type / Description |
key | - | string A unique key for the group. |
Data Attributes
| Data Attribute | Value |
[data-melt-select-group-label] | Present on all group-label elements. |
separator
An optional separator element
Data Attributes
| Data Attribute | Value |
[data-melt-select-separator] | Present on all separator elements. |
arrow
The optional arrow element
Data Attributes
| Data Attribute | Value |
[data-side] | 'top' | 'right' | 'bottom' | 'left' |
[data-arrow] |
|
[data-melt-select-arrow] | Present on all arrow elements. |
hidden-input
The hidden input element. Used for form submission.
Data Attributes
| Data Attribute | Value |
[data-melt-select-hidden-input] | Present on all hidden-input elements. |
Accessibility
Adheres to the ListBox WAI-ARIA design pattern
| Key | Behavior |
| Space | When focus is on the |
| Enter | When focus is on the |
| ArrowDown | When focus is on the |
| ArrowUp | When focus is on the |
| Esc | Closes the select and moves focus to the |
On This Page