Select

Betav1.0.0

SAP 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.json

Variants

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
    └── SelectItem

Dependencies

설치 시 자동으로 함께 들어오는 의존성. 모든 버전은 정확히 고정되어 자동 업데이트를 방지합니다.

npm packages

PackageVersion
@base-ui/react1.5.0
clsx2.1.1
tailwind-merge3.6.0
lucide-react1.17.0

Groudit components

이 컴포넌트가 의존하는 다른 Groudit 컴포넌트 — 함께 설치됩니다.

Accessibility

이 컴포넌트는 WAI-ARIA combobox 패턴을 따릅니다.

Keyboard interactions

KeyDescription
SpaceEnter
옵션 리스트 열기.
옵션 간 이동.
HomeEnd
첫/마지막 옵션.
타이핑
해당 글자로 시작하는 옵션으로 점프.
Esc
옵션 리스트 닫기.

WCAG 2.1 AA

이 컴포넌트는 다음 Success Criteria 충족을 목표로 합니다.