Getting Started
Components52
- Accordion
- Alert
- Alert Dialog
- Attachment
- Badge
- Breadcrumb
- Bubble
- Button
- Button Group
- Calendar
- Card
- Checkbox
- Collapsible
- Command
- Context Menu
- Data Table
- Dialog
- Drawer
- Dropdown Menu
- Empty
- Field
- Hover Card
- Input
- Input Group
- Item
- Kbd
- Label
- Marker
- Menubar
- Message
- Message Scroller
- Pagination
- Popover
- Progress
- Questionnaire
- Radio Group
- Scroll Area
- Select
- Separator
- Sheet
- Sidebar
- Skeleton
- Slider
- Sonner
- Spinner
- Switch
- Table
- Tabs
- Textarea
- Toggle
- Toggle Group
- Tooltip
"use client"
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectLabel,
SelectTrigger,
SelectValue,
} from "@/components/ui/select"
export function SelectDemo() {
return (
<Select items={fruits}>
<SelectTrigger className="w-44">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>Fruits</SelectLabel>
{fruits.slice(1).map((fruit) => (
<SelectItem key={fruit.value} value={fruit.value}>
{fruit.label}
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>
)
}
const fruits = [
{ label: "Select a fruit", value: null },
{ label: "Apple", value: "apple" },
{ label: "Banana", value: "banana" },
{ label: "Blueberry", value: "blueberry" },
{ label: "Grapes", value: "grapes" },
{ label: "Pineapple", value: "pineapple" },
]Installation#
pnpm dlx shadcn@latest add https://ui.ikramhasan.com/r/select.json
Usage#
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select"const items = [
{ label: "Light", value: "light" },
{ label: "Dark", value: "dark" },
{ label: "System", value: "system" },
]
<Select items={items}>
<SelectTrigger className="w-[180px]">
<SelectValue placeholder="Theme" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
{items.map((item) => (
<SelectItem key={item.value} value={item.value}>
{item.label}
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>Examples#
Groups, icons and a disabled item#
"use client"
import { MonitorIcon, MoonIcon, SunIcon } from "lucide-react"
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectLabel,
SelectSeparator,
SelectTrigger,
SelectValue,
} from "@/components/ui/select"
export function SelectGroups() {
return (
<Select items={themes} defaultValue="system">
<SelectTrigger className="w-44">
<SelectValue>
{(value: string) => {
const theme = themes.find((t) => t.value === value)
if (!theme) return null
const Icon = theme.icon
return (
<>
<Icon />
{theme.label}
</>
)
}}
</SelectValue>
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>Appearance</SelectLabel>
{themes.map((theme) => (
<SelectItem key={theme.value} value={theme.value}>
<theme.icon />
{theme.label}
</SelectItem>
))}
</SelectGroup>
<SelectSeparator />
<SelectGroup>
<SelectItem value="high-contrast" disabled>
High contrast
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
)
}
const themes = [
{ label: "Light", value: "light", icon: SunIcon },
{ label: "Dark", value: "dark", icon: MoonIcon },
{ label: "System", value: "system", icon: MonitorIcon },
]Sizes#
"use client"
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select"
export function SelectSizes() {
return (
<div className="flex items-center gap-3">
<Select items={fruits} defaultValue="apple">
<SelectTrigger size="sm" className="w-36">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectGroup>
{fruits.slice(1).map((fruit) => (
<SelectItem key={fruit.value} value={fruit.value}>
{fruit.label}
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>
<Select items={fruits} defaultValue="apple">
<SelectTrigger className="w-36">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectGroup>
{fruits.slice(1).map((fruit) => (
<SelectItem key={fruit.value} value={fruit.value}>
{fruit.label}
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>
</div>
)
}
const fruits = [
{ label: "Select a fruit", value: null },
{ label: "Apple", value: "apple" },
{ label: "Banana", value: "banana" },
{ label: "Blueberry", value: "blueberry" },
{ label: "Grapes", value: "grapes" },
{ label: "Pineapple", value: "pineapple" },
]Below the trigger, scrollable#
"use client"
import { GlobeIcon } from "lucide-react"
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectLabel,
SelectTrigger,
SelectValue,
} from "@/components/ui/select"
export function SelectScrollable() {
return (
<Select items={timezones} defaultValue="Asia/Dhaka">
<SelectTrigger className="w-56">
<GlobeIcon />
<SelectValue />
</SelectTrigger>
<SelectContent alignItemWithTrigger={false} className="max-h-64">
<SelectGroup>
<SelectLabel>Timezone</SelectLabel>
{timezones.map((zone) => (
<SelectItem key={zone.value} value={zone.value}>
{zone.label}
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>
)
}
const timezones = [
"Pacific/Honolulu",
"America/Anchorage",
"America/Los_Angeles",
"America/Denver",
"America/Chicago",
"America/New_York",
"America/Sao_Paulo",
"Atlantic/Azores",
"Europe/London",
"Europe/Paris",
"Europe/Istanbul",
"Asia/Dubai",
"Asia/Karachi",
"Asia/Dhaka",
"Asia/Bangkok",
"Asia/Singapore",
"Asia/Tokyo",
"Australia/Sydney",
"Pacific/Auckland",
].map((zone) => ({ label: zone.replace(/_/g, " "), value: zone }))Invalid#
Pick a fruit to continue.
"use client"
import { Field, FieldError, FieldLabel } from "@/components/ui/field"
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select"
export function SelectInvalid() {
return (
<Field data-invalid className="max-w-56">
<FieldLabel htmlFor="select-fruit">Fruit</FieldLabel>
<Select items={fruits}>
<SelectTrigger id="select-fruit" aria-invalid className="w-full">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectGroup>
{fruits.slice(1).map((fruit) => (
<SelectItem key={fruit.value} value={fruit.value}>
{fruit.label}
</SelectItem>
))}
</SelectGroup>
</SelectContent>
</Select>
<FieldError>Pick a fruit to continue.</FieldError>
</Field>
)
}
const fruits = [
{ label: "Select a fruit", value: null },
{ label: "Apple", value: "apple" },
{ label: "Banana", value: "banana" },
{ label: "Blueberry", value: "blueberry" },
{ label: "Grapes", value: "grapes" },
{ label: "Pineapple", value: "pineapple" },
]Disabled#
"use client"
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select"
export function SelectDisabled() {
return (
<Select items={fruits} disabled>
<SelectTrigger className="w-44">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectItem value="apple">Apple</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
)
}
const fruits = [
{ label: "Select a fruit", value: null },
{ label: "Apple", value: "apple" },
{ label: "Banana", value: "banana" },
{ label: "Blueberry", value: "blueberry" },
{ label: "Grapes", value: "grapes" },
{ label: "Pineapple", value: "pineapple" },
]API Reference#
Select is built on the Base UI Select primitive. See the Base UI documentation for every prop.