Native Select
A styled native HTML select element with consistent design system integration.
Installation
terminal
npx felicityui add native-select --platform reactUsage
example.tsx
import {
NativeSelect,
NativeSelectOptGroup,
NativeSelectOption,
} from "@/components/ui/native-select"
<NativeSelect>
<NativeSelectOption value="">Select a fruit</NativeSelectOption>
<NativeSelectOption value="apple">Apple</NativeSelectOption>
<NativeSelectOption value="banana">Banana</NativeSelectOption>
<NativeSelectOption value="blueberry">Blueberry</NativeSelectOption>
<NativeSelectOption value="pineapple">Pineapple</NativeSelectOption>
</NativeSelect>Composition
NativeSelect
├── NativeSelectOption
└── NativeSelectOptGroup
└── NativeSelectOptionDefault
Groups
NativeSelectOptGroup organizes options.
Disabled
Invalid
error / invalid set aria-invalid and data-invalid.
Choose a fruit to continue.
RTL
dir=rtl
API Reference
| Prop | Type | Default | Description |
|---|---|---|---|
| label | ReactNode | — | Optional field label. |
| description | ReactNode | — | Helper text below the control. |
| error | ReactNode | — | Error message; sets invalid styling. |
| invalid | boolean | — | Marks invalid without requiring error text. |
| disabled | boolean | — | Disables the select. |
| NativeSelectOptGroup.label | string | — | Group label (native optgroup label). |
Accessibility
WCAG 2.2 AA
- Native select semantics and keyboard support.
- Label association when field chrome is used.
aria-invalidandrole=alertfor errors.- Visible
focus-visiblering.
Platform notes
React
Native HTML <select> with Felicity tokens and chevron. Prefer Select for a custom listbox — not Base UI / Radix runtime.
Server Componentcompatible.- Uses
data-slot=native-select|native-select-option|native-select-optgroup. - Optional field chrome via label/description/error.
aria-invalidwhen invalid or error is set.