---
title: Select
description: Selects let users choose one or more known values from a list inside a compact trigger and popup listbox.
category: Forms
---
import { meta as SelectMeta, Default, Multiple, Searchable, TriggerKindFocus } from '@/content/stories/select';
import Canvas from '@/components/component-docs/canvas';
import Demo from '@/components/component-docs/demo';
export const config = {
dependencies: {
components: [Canvas, Demo],
scripts: [
'../../components/component-docs/demo.script.tsx',
'../../components/component-docs/canvas.script.tsx',
'../../components/component-docs/controls.script.tsx',
],
},
};
# Select
Selects let users choose one or more known values from a list inside a compact trigger and popup listbox. Use a select when the value must be one of the options; use a combobox when users also need to type and filter.
## Try it
## Mental model
`` is a behavior host: helpers place the trigger, value, and popup; the custom element owns open state, keyboard, and selection. Options live in an embedded `RuiListbox`. Named regions are Composition Helpers (`RuiSelectTrigger`, `RuiSelectClear`, …), not HTML slots.
The live `value` property is always a `string[]` (`[]` when nothing is selected). The HTML attribute is those tokens as a comma-separated string (`value="draft,published"`). JSX may pass a string or an array; a string is parsed as CSV. `rui-change` emits `{ value: string[] }`. Commas in the attribute are delimiters, not characters inside a token.
Not form-associated. Wrap in `RuiField` and read the value from `RuiForm` `onSubmit`. It does not appear in `new FormData(form)`.
## Usage
Pass `options` for the default composition, or supply children for an explicit layout.
```tsx
import { RuiSelect } from '@ecopages/radiant-ui/select';
import { RuiLabel } from '@ecopages/radiant-ui/label';
Animal
```
The `options` API does not include a clear control. Add `RuiSelectClear` in a composed layout when the field should be resettable. Children replace the default close icon.
```tsx
import {
RuiSelect,
RuiSelectClear,
RuiSelectControl,
RuiSelectListbox,
RuiSelectToggle,
RuiSelectTrigger,
RuiSelectValue,
} from '@ecopages/radiant-ui/select';
import { RuiListbox, RuiListboxOption } from '@ecopages/radiant-ui/listbox';
import { RuiIconX } from '@ecopages/radiant-ui/icons';
CatDog
```
Always set `embedded` on a listbox inside the popup so the select owns selection and keyboard.
## Custom markup
`` coordinates any light-DOM tree that matches its query contract. The `Rui*` helpers stamp these targets; they are not required.
```tsx
import '@ecopages/radiant-ui/select';
import '@ecopages/radiant-ui/listbox';