Select
Betav1.0.0SAP UI5 의 Select / MultiComboBox 디자인 패턴을 참고한 옵션 선택 컴포넌트. Single · Multi · Grouped · Icons · Searchable · Description · States 7 가지 변형.
Loading…
import { MultiSelect } from "@/components/ui/multi-select";
const [value, setValue] = useState<string[]>(["apple", "banana"]);
<MultiSelect
options={[
{ value: "apple", label: "Apple", icon: "🍎" },
{ value: "banana", label: "Banana", icon: "🍌" },
{ value: "blueberry", label: "Blueberry", icon: "🫐" },
]}
value={value}
onValueChange={setValue}
placeholder="Select fruits"
maxDisplay={3}
/>Installation
pnpm dlx shadcn@latest add https://groudit.com/r/select.jsonVariants
Single (basic)
가장 단순한 형태 — 한 번에 하나만 선택.
Loading…
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
<Select>
<SelectTrigger><SelectValue placeholder="Select a fruit" /></SelectTrigger>
<SelectContent>
<SelectItem value="apple">Apple</SelectItem>
<SelectItem value="banana">Banana</SelectItem>
</SelectContent>
</Select>Grouped
SelectGroup + SelectLabel + SelectSeparator 로 항목 분류.
Loading…
import {
Select, SelectContent, SelectGroup, SelectItem,
SelectLabel, SelectSeparator, SelectTrigger, SelectValue,
} from "@/components/ui/select";
<Select>
<SelectTrigger><SelectValue placeholder="Select a timezone" /></SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>Asia</SelectLabel>
<SelectItem value="seoul">Seoul (KST)</SelectItem>
<SelectItem value="tokyo">Tokyo (JST)</SelectItem>
</SelectGroup>
<SelectSeparator />
<SelectGroup>
<SelectLabel>America</SelectLabel>
<SelectItem value="new-york">New York (EST)</SelectItem>
</SelectGroup>
</SelectContent>
</Select>With icons
각 옵션 앞에 아이콘 — 국가 플래그·상태 표시·카테고리 등.
Loading…
<Select defaultValue="kr">
<SelectTrigger><SelectValue /></SelectTrigger>
<SelectContent>
<SelectItem value="kr">
<span className="mr-2">🇰🇷</span> Korea
</SelectItem>
<SelectItem value="us">
<span className="mr-2">🇺🇸</span> United States
</SelectItem>
</SelectContent>
</Select>Searchable / Combobox
옵션이 많을 때 — Command + Popover 조합으로 입력 + 필터링.
Loading…
import { Command, CommandInput, CommandItem, ... } from "@/components/ui/command";
import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
const [open, setOpen] = useState(false);
const [value, setValue] = useState("");
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger>{value || "Select language…"}</PopoverTrigger>
<PopoverContent className="p-0">
<Command>
<CommandInput placeholder="Search language…" />
<CommandList>
<CommandEmpty>No language found.</CommandEmpty>
<CommandGroup>
{LANGUAGES.map((l) => (
<CommandItem key={l.value} onSelect={() => {
setValue(l.value); setOpen(false);
}}>
{l.label}
{value === l.value && <span className="ml-auto">✓</span>}
</CommandItem>
))}
</CommandGroup>
</CommandList>
</Command>
</PopoverContent>
</Popover>With description
옵션마다 보조 설명을 함께 표시 — 플랜 선택, 권한 등급 등.
Loading…
<SelectItem value="pro">
<div className="flex flex-col items-start">
<span className="font-medium">Pro</span>
<span className="text-xs text-muted-foreground">$29/mo · for teams</span>
</div>
</SelectItem>States (disabled / invalid)
비활성화, 폼 에러, 일부 항목만 disabled 등 다양한 상태.
Loading…
// Disabled select
<Select disabled>
<SelectTrigger><SelectValue placeholder="Cannot select" /></SelectTrigger>
</Select>
// Invalid select
<SelectTrigger
aria-invalid="true"
className="border-destructive focus-visible:ring-destructive/30"
/>
// Disabled single item
<SelectItem value="x" disabled>Disabled item</SelectItem>Composition
Select
├── SelectTrigger
│ └── SelectValue
└── SelectContent
├── SelectGroup
│ ├── SelectLabel
│ └── SelectItem
├── SelectSeparator
└── SelectItemDependencies
설치 시 자동으로 함께 들어오는 의존성. 모든 버전은 정확히 고정되어 자동 업데이트를 방지합니다.
npm packages
| Package | Version |
|---|---|
| @base-ui/react | 1.5.0 |
| clsx | 2.1.1 |
| tailwind-merge | 3.6.0 |
| lucide-react | 1.17.0 |
Accessibility
이 컴포넌트는 WAI-ARIA combobox 패턴을 따릅니다.
Keyboard interactions
| Key | Description |
|---|---|
SpaceEnter | 옵션 리스트 열기. |
↑↓ | 옵션 간 이동. |
HomeEnd | 첫/마지막 옵션. |
타이핑 | 해당 글자로 시작하는 옵션으로 점프. |
Esc | 옵션 리스트 닫기. |