Native Select
A styled native HTML select element with consistent design system integration.
For a styled select component, see the Select component.
import { NativeSelect, NativeSelectOption } from "~/components/ui/native-select";
export default function NativeSelectDemo() { return ( <NativeSelect> <NativeSelectOption value="">Select status</NativeSelectOption> <NativeSelectOption value="todo">Todo</NativeSelectOption> <NativeSelectOption value="in-progress">In Progress</NativeSelectOption> <NativeSelectOption value="done">Done</NativeSelectOption> <NativeSelectOption value="cancelled">Cancelled</NativeSelectOption> </NativeSelect> );}Installation
Usage
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
Simple
Options placed directly under NativeSelect (no NativeSelectOptGroup).
NativeSelect├── NativeSelectOption├── NativeSelectOption├── NativeSelectOption└── NativeSelectOptionWith groups
Use NativeSelectOptGroup to organize options into categories.
NativeSelect├── NativeSelectOptGroup│ ├── NativeSelectOption│ └── NativeSelectOption└── NativeSelectOptGroup ├── NativeSelectOption └── NativeSelectOptionGroups
Use NativeSelectOptGroup to organize options into categories.
import { NativeSelect, NativeSelectOptGroup, NativeSelectOption,} from "~/components/ui/native-select";
export default function NativeSelectGroups() { return ( <NativeSelect> <NativeSelectOption value="">Select department</NativeSelectOption> <NativeSelectOptGroup label="Engineering"> <NativeSelectOption value="frontend">Frontend</NativeSelectOption> <NativeSelectOption value="backend">Backend</NativeSelectOption> <NativeSelectOption value="devops">DevOps</NativeSelectOption> </NativeSelectOptGroup> <NativeSelectOptGroup label="Sales"> <NativeSelectOption value="sales-rep">Sales Rep</NativeSelectOption> <NativeSelectOption value="account-manager">Account Manager</NativeSelectOption> <NativeSelectOption value="sales-director">Sales Director</NativeSelectOption> </NativeSelectOptGroup> <NativeSelectOptGroup label="Operations"> <NativeSelectOption value="support">Customer Support</NativeSelectOption> <NativeSelectOption value="product-manager">Product Manager</NativeSelectOption> <NativeSelectOption value="ops-manager">Operations Manager</NativeSelectOption> </NativeSelectOptGroup> </NativeSelect> );}Sizes
Use the size prop to switch between the default and small select sizes.
import { NativeSelect, NativeSelectOption } from "~/components/ui/native-select";
export default function NativeSelectSizes() { return ( <div class="flex flex-col gap-4"> <NativeSelect size="sm"> <NativeSelectOption value="">Select a fruit</NativeSelectOption> <NativeSelectOption value="apple">Apple</NativeSelectOption> <NativeSelectOption value="banana">Banana</NativeSelectOption> <NativeSelectOption value="blueberry">Blueberry</NativeSelectOption> </NativeSelect> <NativeSelect size="default"> <NativeSelectOption value="">Select a fruit</NativeSelectOption> <NativeSelectOption value="apple">Apple</NativeSelectOption> <NativeSelectOption value="banana">Banana</NativeSelectOption> <NativeSelectOption value="blueberry">Blueberry</NativeSelectOption> </NativeSelect> </div> );}With Field
Use with the Field component for proper form labeling and descriptions.
Select your country of residence.
import { Field, FieldDescription, FieldLabel } from "~/components/ui/field";import { NativeSelect, NativeSelectOption } from "~/components/ui/native-select";
export default function NativeSelectField() { return ( <Field> <FieldLabel for="native-select-country">Country</FieldLabel> <NativeSelect id="native-select-country"> <NativeSelectOption value="">Select a country</NativeSelectOption> <NativeSelectOption value="us">United States</NativeSelectOption> <NativeSelectOption value="uk">United Kingdom</NativeSelectOption> <NativeSelectOption value="ca">Canada</NativeSelectOption> <NativeSelectOption value="au">Australia</NativeSelectOption> </NativeSelect> <FieldDescription>Select your country of residence.</FieldDescription> </Field> );}Disabled
Add the disabled prop to the NativeSelect component to disable the select.
import { NativeSelect, NativeSelectOption } from "~/components/ui/native-select";
export default function NativeSelectDisabled() { return ( <NativeSelect disabled> <NativeSelectOption value="">Disabled</NativeSelectOption> <NativeSelectOption value="apple">Apple</NativeSelectOption> <NativeSelectOption value="banana">Banana</NativeSelectOption> <NativeSelectOption value="blueberry">Blueberry</NativeSelectOption> </NativeSelect> );}Invalid
Use aria-invalid to show validation errors and the data-invalid attribute to the Field component for styling.
import { NativeSelect, NativeSelectOption } from "~/components/ui/native-select";
export default function NativeSelectInvalid() { return ( <NativeSelect aria-invalid="true"> <NativeSelectOption value="">Error state</NativeSelectOption> <NativeSelectOption value="apple">Apple</NativeSelectOption> <NativeSelectOption value="banana">Banana</NativeSelectOption> <NativeSelectOption value="blueberry">Blueberry</NativeSelectOption> </NativeSelect> );}Native Select vs Select
- Use
NativeSelectfor native browser behavior, better performance, or mobile-optimized dropdowns. - Use
Selectfor custom styling, animations, or complex interactions.
Accessibility
- The component maintains all native HTML select accessibility features.
- Screen readers can navigate through options using arrow keys.
- The chevron icon is marked as
aria-hidden="true"to avoid duplication. - Use
aria-labeloraria-labelledbyfor additional context when needed.
<NativeSelect aria-label="Choose your preferred language"> <NativeSelectOption value="en">English</NativeSelectOption> <NativeSelectOption value="es">Spanish</NativeSelectOption> <NativeSelectOption value="fr">French</NativeSelectOption></NativeSelect>API Reference
NativeSelect
The main select component that wraps the native HTML select element.
<NativeSelect> <NativeSelectOption value="option1">Option 1</NativeSelectOption> <NativeSelectOption value="option2">Option 2</NativeSelectOption></NativeSelect>NativeSelectOption
Represents an individual option within the select.
NativeSelectOptGroup
Groups related options together for better organization.
<NativeSelectOptGroup label="Fruits"> <NativeSelectOption value="apple">Apple</NativeSelectOption> <NativeSelectOption value="banana">Banana</NativeSelectOption></NativeSelectOptGroup>