--- meta: title: Select description: Selects allow you to choose items from a menu of predefined options. layout: component --- ```html:preview Option 1 Option 2 Option 3 Option 4 Option 5 Option 6 ``` ```jsx:react import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( Option 1 Option 2 Option 3 Option 4 Option 5 Option 6 ); ``` :::tip This component works with standard `
` elements. Please refer to the section on [form controls](/getting-started/form-controls) to learn more about form submission and client-side validation. ::: ## Examples ### Labels Use the `label` attribute to give the select an accessible label. For labels that contain HTML, use the `label` slot instead. ```html:preview Option 1 Option 2 Option 3 ``` ```jsx:react import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( Option 1 Option 2 Option 3 ); ``` ### Help Text Add descriptive help text to a select with the `help-text` attribute. For help texts that contain HTML, use the `help-text` slot instead. ```html:preview Novice Intermediate Advanced ``` ```jsx:react import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( Novice Intermediate Advanced ); ``` ### Placeholders Use the `placeholder` attribute to add a placeholder. ```html:preview Option 1 Option 2 Option 3 ``` ```jsx:react import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( Option 1 Option 2 Option 3 ); ``` ### Clearable Use the `clearable` attribute to make the control clearable. The clear button only appears when an option is selected. ```html:preview Option 1 Option 2 Option 3 ``` ```jsx:react import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( Option 1 Option 2 Option 3 ); ``` ### Filled Selects Add the `filled` attribute to draw a filled select. ```html:preview Option 1 Option 2 Option 3 ``` ```jsx:react import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( Option 1 Option 2 Option 3 ); ``` ### Pill Use the `pill` attribute to give selects rounded edges. ```html:preview Option 1 Option 2 Option 3 ``` ```jsx:react import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( Option 1 Option 2 Option 3 ); ``` ### Disabled Use the `disabled` attribute to disable a select. ```html:preview Option 1 Option 2 Option 3 ``` ```jsx:react import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( Option 1 Option 2 Option 3 ); ``` ### Multiple To allow multiple options to be selected, use the `multiple` attribute. It's a good practice to use `clearable` when this option is enabled. To set multiple values at once, set `value` to a space-delimited list of values. ```html:preview Option 1 Option 2 Option 3 Option 4 Option 5 Option 6 ``` ```jsx:react import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( Option 1 Option 2 Option 3 Option 4 Option 5 Option 6 ); ``` :::tip Note that multi-select options may wrap, causing the control to expand vertically. You can use the `max-options-visible` attribute to control the maximum number of selected options to show at once. ::: ### Setting Initial Values Use the `value` attribute to set the initial selection. When using `multiple`, the `value` _attribute_ uses space-delimited values to select more than one option. Because of this, `` values cannot contain spaces. If you're accessing the `value` _property_ through Javascript, it will be an array. ```html:preview Option 1 Option 2 Option 3 Option 4 ``` ```jsx:react import SlDivider from '@shoelace-style/shoelace/dist/react/divider'; import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( Option 1 Option 2 Option 3 ); ``` ### Grouping Options Use `` to group listbox items visually. You can also use `` to provide labels, but they won't be announced by most assistive devices. ```html:preview Section 1 Option 1 Option 2 Option 3 Section 2 Option 4 Option 5 Option 6 ``` ```jsx:react import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( Option 1 Option 2 Option 3 Option 4 Option 5 Option 6 ); ``` ### Sizes Use the `size` attribute to change a select's size. Note that size does not apply to listbox options. ```html:preview Option 1 Option 2 Option 3
Option 1 Option 2 Option 3
Option 1 Option 2 Option 3 ``` ```jsx:react import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( <> Option 1 Option 2 Option 3
Option 1 Option 2 Option 3
Option 1 Option 2 Option 3 ); ``` ### Placement The preferred placement of the select's listbox can be set with the `placement` attribute. Note that the actual position may vary to ensure the panel remains in the viewport. Valid placements are `top` and `bottom`. ```html:preview Option 1 Option 2 Option 3 ``` ```jsx:react import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( Option 1 Option 2 Option 3 ); ``` ### Prefix & Suffix Use the `prefix` and `suffix` slots to add presentational icons and text. Avoid slotting in interactive elements, such as buttons, links, etc. ```html:preview New Option 1 Option 2 Option 3
New Option 1 Option 2 Option 3
New Option 1 Option 2 Option 3 ``` ```jsx:react import SlIcon from '@shoelace-style/shoelace/dist/react/icon'; import SlOption from '@shoelace-style/shoelace/dist/react/option'; import SlSelect from '@shoelace-style/shoelace/dist/react/select'; const App = () => ( <> Option 1 Option 2 Option 3
Option 1 Option 2 Option 3
Option 1 Option 2 Option 3 ); ``` ### Custom Tags When multiple options can be selected, you can provide custom tags by passing a function to the `getTag` property. Your function can return a string of HTML, a Lit Template, or an [`HTMLElement`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement). The `getTag()` function will be called for each option. The first argument is an `` element and the second argument is the tag's index (its position in the tag list). Remember that custom tags are rendered in a shadow root. To style them, you can use the `style` attribute in your template or you can add your own [parts](/getting-started/customizing/#css-parts) and target them with the [`::part()`](https://developer.mozilla.org/en-US/docs/Web/CSS/::part) selector. ```html:preview Email Phone Chat ``` ### Lazy loading options Lazy loading options is very hard to get right. `` largely follows how a native `