import { NativeSelect, NativeSelectOption,} from "@/components/ui/native-select";
export 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> );}pnpm dlx shadcn@latest add @herocn/native-selectimport { 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>Options placed directly under NativeSelect (no NativeSelectOptGroup).
NativeSelect├── NativeSelectOption├── NativeSelectOption├── NativeSelectOption└── NativeSelectOptionUse NativeSelectOptGroup to organize options into categories.
NativeSelect├── NativeSelectOptGroup│ ├── NativeSelectOption│ └── NativeSelectOption└── NativeSelectOptGroup ├── NativeSelectOption └── NativeSelectOptionUse the variant prop to switch between default and secondary styles.
import { NativeSelect, NativeSelectOption,} from "@/components/ui/native-select";
export function NativeSelectVariants() { return ( <div className="flex w-full max-w-sm flex-col items-center justify-center gap-4"> <NativeSelect variant="default"> <NativeSelectOption value="">Default</NativeSelectOption> <NativeSelectOption value="apple">Apple</NativeSelectOption> <NativeSelectOption value="banana">Banana</NativeSelectOption> <NativeSelectOption value="blueberry">Blueberry</NativeSelectOption> </NativeSelect> <NativeSelect variant="secondary"> <NativeSelectOption value="">Secondary</NativeSelectOption> <NativeSelectOption value="apple">Apple</NativeSelectOption> <NativeSelectOption value="banana">Banana</NativeSelectOption> <NativeSelectOption value="blueberry">Blueberry</NativeSelectOption> </NativeSelect> </div> );}Use NativeSelectOptGroup to organize options into categories.
import { NativeSelect, NativeSelectOptGroup, NativeSelectOption,} from "@/components/ui/native-select";
export 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> );}Add the disabled prop to the NativeSelect component to disable the select.
import { NativeSelect, NativeSelectOption,} from "@/components/ui/native-select";
export 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> );}Use aria-invalid to show validation errors on the native select element.
import { NativeSelect, NativeSelectOption,} from "@/components/ui/native-select";
export 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> );}Use the Surface component to embed a native select in a styled container with the secondary variant.
Configure your application preferences.
import { NativeSelect, NativeSelectOption,} from "@/components/ui/native-select";import { Surface } from "@/components/ui/surface";
export function NativeSelectInSurface() { return ( <Surface className="flex w-full max-w-sm flex-col gap-4 rounded-3xl p-6"> <h4 className="font-medium text-sm">Settings</h4> <p className="text-muted-foreground text-sm"> Configure your application preferences. </p> <NativeSelect className="w-full" variant="secondary"> <NativeSelectOption value="">Select theme</NativeSelectOption> <NativeSelectOption value="light">Light</NativeSelectOption> <NativeSelectOption value="dark">Dark</NativeSelectOption> <NativeSelectOption value="system">System</NativeSelectOption> </NativeSelect> </Surface> );}"use client";
import { type Translations, useTranslation,} from "@/components/language-selector";import { NativeSelect, NativeSelectOption,} from "@/components/ui/native-select";
const translations: Translations = { en: { dir: "ltr", values: { placeholder: "Select status", todo: "Todo", inProgress: "In Progress", done: "Done", cancelled: "Cancelled", }, }, ar: { dir: "rtl", values: { placeholder: "اختر الحالة", todo: "مهام", inProgress: "قيد التنفيذ", done: "منجز", cancelled: "ملغي", }, }, he: { dir: "rtl", values: { placeholder: "בחר סטטוס", todo: "לעשות", inProgress: "בתהליך", done: "הושלם", cancelled: "בוטל", }, },};
export function NativeSelectRtl() { const { dir, t, language } = useTranslation(translations, "ar");
return ( <div lang={language} dir={dir}> <NativeSelect> <NativeSelectOption value="">{t.placeholder}</NativeSelectOption> <NativeSelectOption value="todo">{t.todo}</NativeSelectOption> <NativeSelectOption value="in-progress"> {t.inProgress} </NativeSelectOption> <NativeSelectOption value="done">{t.done}</NativeSelectOption> <NativeSelectOption value="cancelled">{t.cancelled}</NativeSelectOption> </NativeSelect> </div> );}The main select component that wraps the native HTML select element.
| Prop | Type | Default |
|---|---|---|
| variant | "default" | "secondary" | "default" |
| size | "default" | "sm" | "default" |
| disabled | boolean | false |
Prevents user interaction with the component. | ||
Represents an individual option within the select.
| Prop | Type | Default |
|---|---|---|
| value | string | — |
The value to submit when this option is selected. | ||
| disabled | boolean | false |
Prevents selection of this option. | ||
Groups related options together for better organization.
| Prop | Type | Default |
|---|---|---|
| label* | string | — |
The label displayed for the group. | ||
| disabled | boolean | false |
Disables all options within the group. | ||