mirror of
https://github.com/shadcn-ui/ui.git
synced 2026-06-22 12:15:43 +00:00
206 lines
5.6 KiB
Plaintext
206 lines
5.6 KiB
Plaintext
---
|
|
title: Native Select
|
|
description: A styled native HTML select element with consistent design system integration.
|
|
component: true
|
|
---
|
|
|
|
import { InfoIcon } from "lucide-react"
|
|
|
|
<Callout variant="info" icon={<InfoIcon className="!translate-y-[3px]" />}>
|
|
For a styled select component, see the [Select](/docs/components/select)
|
|
component.
|
|
</Callout>
|
|
|
|
<ComponentPreview name="native-select-demo" />
|
|
|
|
## Installation
|
|
|
|
<CodeTabs>
|
|
|
|
<TabsList>
|
|
<TabsTrigger value="cli">CLI</TabsTrigger>
|
|
<TabsTrigger value="manual">Manual</TabsTrigger>
|
|
</TabsList>
|
|
<TabsContent value="cli">
|
|
|
|
```bash
|
|
npx shadcn@latest add native-select
|
|
```
|
|
|
|
</TabsContent>
|
|
|
|
<TabsContent value="manual">
|
|
|
|
<Steps>
|
|
|
|
<Step>Copy and paste the following code into your project.</Step>
|
|
|
|
<ComponentSource name="native-select" title="components/ui/native-select.tsx" />
|
|
|
|
<Step>Update the import paths to match your project setup.</Step>
|
|
|
|
</Steps>
|
|
|
|
</TabsContent>
|
|
|
|
</CodeTabs>
|
|
|
|
## Usage
|
|
|
|
```tsx showLineNumbers
|
|
import {
|
|
NativeSelect,
|
|
NativeSelectOptGroup,
|
|
NativeSelectOption,
|
|
} from "@/components/ui/native-select"
|
|
```
|
|
|
|
```tsx showLineNumbers
|
|
<NativeSelect>
|
|
<NativeSelectOption value="">Select a fruit</NativeSelectOption>
|
|
<NativeSelectOption value="apple">Apple</NativeSelectOption>
|
|
<NativeSelectOption value="banana">Banana</NativeSelectOption>
|
|
<NativeSelectOption value="blueberry">Blueberry</NativeSelectOption>
|
|
<NativeSelectOption value="grapes" disabled>
|
|
Grapes
|
|
</NativeSelectOption>
|
|
<NativeSelectOption value="pineapple">Pineapple</NativeSelectOption>
|
|
</NativeSelect>
|
|
```
|
|
|
|
## Examples
|
|
|
|
### With Groups
|
|
|
|
Organize options using `NativeSelectOptGroup` for better categorization.
|
|
|
|
<ComponentPreview name="native-select-groups" />
|
|
|
|
```tsx showLineNumbers
|
|
<NativeSelect>
|
|
<NativeSelectOption value="">Select a food</NativeSelectOption>
|
|
<NativeSelectOptGroup label="Fruits">
|
|
<NativeSelectOption value="apple">Apple</NativeSelectOption>
|
|
<NativeSelectOption value="banana">Banana</NativeSelectOption>
|
|
<NativeSelectOption value="blueberry">Blueberry</NativeSelectOption>
|
|
</NativeSelectOptGroup>
|
|
<NativeSelectOptGroup label="Vegetables">
|
|
<NativeSelectOption value="carrot">Carrot</NativeSelectOption>
|
|
<NativeSelectOption value="broccoli">Broccoli</NativeSelectOption>
|
|
<NativeSelectOption value="spinach">Spinach</NativeSelectOption>
|
|
</NativeSelectOptGroup>
|
|
</NativeSelect>
|
|
```
|
|
|
|
### Disabled State
|
|
|
|
Disable individual options or the entire select component.
|
|
|
|
<ComponentPreview name="native-select-disabled" />
|
|
|
|
### Invalid State
|
|
|
|
Show validation errors with the `aria-invalid` attribute and error styling.
|
|
|
|
<ComponentPreview name="native-select-invalid" />
|
|
|
|
```tsx showLineNumbers
|
|
<NativeSelect aria-invalid="true">
|
|
<NativeSelectOption value="">Select a country</NativeSelectOption>
|
|
<NativeSelectOption value="us">United States</NativeSelectOption>
|
|
<NativeSelectOption value="uk">United Kingdom</NativeSelectOption>
|
|
<NativeSelectOption value="ca">Canada</NativeSelectOption>
|
|
</NativeSelect>
|
|
```
|
|
|
|
### Form Integration
|
|
|
|
Use with form libraries like React Hook Form for controlled components.
|
|
|
|
<ComponentPreview name="native-select-form" />
|
|
|
|
### Input Group Integration
|
|
|
|
Combine with `InputGroup` for complex input layouts.
|
|
|
|
<ComponentPreview name="native-select-input-group" />
|
|
|
|
## Native Select vs Select
|
|
|
|
- Use `NativeSelect` when you need native browser behavior, better performance, or mobile-optimized dropdowns.
|
|
- Use `Select` when you need custom styling, animations, or complex interactions.
|
|
|
|
The `NativeSelect` component provides native HTML select functionality with consistent styling that matches your design system.
|
|
|
|
## 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-label` or `aria-labelledby` for additional context when needed.
|
|
|
|
```tsx showLineNumbers
|
|
<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.
|
|
|
|
| Prop | Type | Default |
|
|
| ----------- | -------- | ------- |
|
|
| `className` | `string` | |
|
|
|
|
All other props are passed through to the underlying `<select>` element.
|
|
|
|
```tsx
|
|
<NativeSelect>
|
|
<NativeSelectOption value="option1">Option 1</NativeSelectOption>
|
|
<NativeSelectOption value="option2">Option 2</NativeSelectOption>
|
|
</NativeSelect>
|
|
```
|
|
|
|
### NativeSelectOption
|
|
|
|
Represents an individual option within the select.
|
|
|
|
| Prop | Type | Default |
|
|
| ----------- | --------- | ------- |
|
|
| `value` | `string` | |
|
|
| `disabled` | `boolean` | `false` |
|
|
| `className` | `string` | |
|
|
|
|
All other props are passed through to the underlying `<option>` element.
|
|
|
|
```tsx
|
|
<NativeSelectOption value="apple">Apple</NativeSelectOption>
|
|
<NativeSelectOption value="banana" disabled>
|
|
Banana
|
|
</NativeSelectOption>
|
|
```
|
|
|
|
### NativeSelectOptGroup
|
|
|
|
Groups related options together for better organization.
|
|
|
|
| Prop | Type | Default |
|
|
| ----------- | --------- | ------- |
|
|
| `label` | `string` | |
|
|
| `disabled` | `boolean` | `false` |
|
|
| `className` | `string` | |
|
|
|
|
All other props are passed through to the underlying `<optgroup>` element.
|
|
|
|
```tsx
|
|
<NativeSelectOptGroup label="Fruits">
|
|
<NativeSelectOption value="apple">Apple</NativeSelectOption>
|
|
<NativeSelectOption value="banana">Banana</NativeSelectOption>
|
|
</NativeSelectOptGroup>
|
|
```
|