Native Select
A styled native HTML select element with consistent design system integration.
For a styled select component, see the Select component.
"use client"
import { NativeSelect, NativeSelectOption } from "@/components/ui/native-select"
export default function NativeSelectDemo() {
return (
<NativeSelect aria-label="Application stage">
<NativeSelectOption value="">Select stage</NativeSelectOption>
<NativeSelectOption value="applied">Applied</NativeSelectOption>
<NativeSelectOption value="screening">Screening</NativeSelectOption>
<NativeSelectOption value="interview">Interview</NativeSelectOption>
<NativeSelectOption value="offer">Offer</NativeSelectOption>
<NativeSelectOption value="rejected">Rejected</NativeSelectOption>
</NativeSelect>
)
}Installation
pnpm dlx shadcn@latest add @kickresume/native-selectUsage
import { NativeSelect, NativeSelectOptGroup, NativeSelectOption } from "@/components/ui/native-select"<NativeSelect aria-label="Application stage">
<NativeSelectOption value="">Select stage</NativeSelectOption>
<NativeSelectOption value="applied">Applied</NativeSelectOption>
<NativeSelectOption value="screening">Screening</NativeSelectOption>
<NativeSelectOption value="interview">Interview</NativeSelectOption>
<NativeSelectOption value="offer">Offer</NativeSelectOption>
<NativeSelectOption value="rejected">Rejected</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
└── NativeSelectOptionExamples
Groups
Use NativeSelectOptGroup to organize options into categories.
"use client"
import {
NativeSelect,
NativeSelectOptGroup,
NativeSelectOption,
} from "@/components/ui/native-select"
export default function NativeSelectGroups() {
return (
<NativeSelect aria-label="Role">
<NativeSelectOption value="">Select a role</NativeSelectOption>
<NativeSelectOptGroup label="Engineering">
<NativeSelectOption value="frontend">
Frontend Engineer
</NativeSelectOption>
<NativeSelectOption value="backend">
Backend Engineer
</NativeSelectOption>
<NativeSelectOption value="devops">DevOps Engineer</NativeSelectOption>
</NativeSelectOptGroup>
<NativeSelectOptGroup label="Design">
<NativeSelectOption value="product-designer">
Product Designer
</NativeSelectOption>
<NativeSelectOption value="ux-researcher">
UX Researcher
</NativeSelectOption>
</NativeSelectOptGroup>
<NativeSelectOptGroup label="Product">
<NativeSelectOption value="product-manager">
Product Manager
</NativeSelectOption>
<NativeSelectOption value="program-manager">
Program Manager
</NativeSelectOption>
</NativeSelectOptGroup>
</NativeSelect>
)
}Disabled
Add the disabled prop to the NativeSelect component to disable the select.
"use client"
import { NativeSelect, NativeSelectOption } from "@/components/ui/native-select"
import { Field, FieldLabel } from "@/components/ui/field"
export default function NativeSelectDisabled() {
return (
<Field data-disabled>
<FieldLabel htmlFor="native-select-disabled">
Application stage
</FieldLabel>
<NativeSelect id="native-select-disabled" disabled>
<NativeSelectOption value="">Disabled</NativeSelectOption>
<NativeSelectOption value="applied">Applied</NativeSelectOption>
<NativeSelectOption value="screening">Screening</NativeSelectOption>
<NativeSelectOption value="interview">Interview</NativeSelectOption>
</NativeSelect>
</Field>
)
}Invalid
Use aria-invalid to show validation errors and the data-invalid attribute to the Field component for styling.
"use client"
import { NativeSelect, NativeSelectOption } from "@/components/ui/native-select"
import { Field, FieldError, FieldLabel } from "@/components/ui/field"
export default function NativeSelectInvalid() {
return (
<Field data-invalid>
<FieldLabel htmlFor="native-select-invalid">Application stage</FieldLabel>
<NativeSelect
id="native-select-invalid"
aria-describedby="native-select-invalid-error"
aria-invalid="true"
>
<NativeSelectOption value="">Error state</NativeSelectOption>
<NativeSelectOption value="applied">Applied</NativeSelectOption>
<NativeSelectOption value="screening">Screening</NativeSelectOption>
<NativeSelectOption value="interview">Interview</NativeSelectOption>
</NativeSelect>
<FieldError id="native-select-invalid-error">
Select an application stage.
</FieldError>
</Field>
)
}Size
Use the size prop to change the size of the select.
"use client"
import { NativeSelect, NativeSelectOption } from "@/components/ui/native-select"
export default function NativeSelectSize() {
return (
<div className="flex flex-col items-start gap-4">
<NativeSelect
aria-label="Small application stage"
size="sm"
defaultValue="applied"
>
<NativeSelectOption value="applied">Applied</NativeSelectOption>
<NativeSelectOption value="screening">Screening</NativeSelectOption>
<NativeSelectOption value="interview">Interview</NativeSelectOption>
</NativeSelect>
<NativeSelect
aria-label="Default application stage"
size="default"
defaultValue="applied"
>
<NativeSelectOption value="applied">Applied</NativeSelectOption>
<NativeSelectOption value="screening">Screening</NativeSelectOption>
<NativeSelectOption value="interview">Interview</NativeSelectOption>
</NativeSelect>
</div>
)
}Native Select vs Select
- Use
NativeSelectfor native browser behavior, better performance, or mobile-optimized dropdowns. - Use
Selectfor custom styling, animations, or complex interactions.
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>| Prop | Type | Default |
|---|---|---|
size | "sm" | "default" | "default" |
NativeSelectOption
Represents an individual option within the select.
| Prop | Type | Default |
|---|---|---|
value | string | |
disabled | boolean | false |
NativeSelectOptGroup
Groups related options together for better organization.
| Prop | Type | Default |
|---|---|---|
label | string | |
disabled | boolean | false |
<NativeSelectOptGroup label="Fruits">
<NativeSelectOption value="apple">Apple</NativeSelectOption>
<NativeSelectOption value="banana">Banana</NativeSelectOption>
</NativeSelectOptGroup>