Components

Select

사용 예시

값 하나 고르기

고른 항목의 글자가 트리거에 보여요. SelectItem을 다른 컴포넌트로 감싸면 트리거가 글자를 찾지 못해서 items로 넘겨요.

tsx
<Select placeholder="결제 수단을 고르세요" aria-label="결제 수단">  <SelectItem value="card">    <SelectItemText>신용카드</SelectItemText>  </SelectItem>  <SelectItem value="transfer">    <SelectItemText>계좌 이체</SelectItemText>  </SelectItem>  <SelectItem value="phone">    <SelectItemText>휴대폰 결제</SelectItemText>  </SelectItem>  <SelectItem value="easy">    <SelectItemText>간편 결제</SelectItemText>  </SelectItem></Select>

항목 설명

이름만으로 항목을 구분하기 어려울 때 써요. 설명은 목록에만 나오고 트리거에는 이름만 보여요.

tsx
<Select placeholder="배송 방법을 고르세요" aria-label="배송 방법">  <SelectItem value="standard">    <SelectItemText>일반 배송</SelectItemText>    <SelectItemDescription>주문 다음 날부터 2일 걸려요</SelectItemDescription>  </SelectItem>  <SelectItem value="dawn">    <SelectItemText>새벽 배송</SelectItemText>    <SelectItemDescription>자정 전에 주문하면 아침에 와요</SelectItemDescription>  </SelectItem>  <SelectItem value="pickup">    <SelectItemText>방문 수령</SelectItemText>    <SelectItemDescription>매장에서 직접 받아요</SelectItemDescription>  </SelectItem></Select>

그룹과 구분선

항목이 종류별로 나뉠 때 써요. 그룹 이름이 필요 없으면 SelectSeparator만 둬요.

tsx
<Select placeholder="통화를 고르세요" aria-label="통화">  <SelectGroup label="아시아">    <SelectItem value="krw">      <SelectItemText>원</SelectItemText>    </SelectItem>    <SelectItem value="jpy">      <SelectItemText>엔</SelectItemText>    </SelectItem>  </SelectGroup>  <SelectSeparator />  <SelectGroup label="유럽과 미주">    <SelectItem value="usd">      <SelectItemText>달러</SelectItemText>    </SelectItem>    <SelectItem value="eur">      <SelectItemText>유로</SelectItemText>    </SelectItem>    <SelectItem value="gbp">      <SelectItemText>파운드</SelectItemText>    </SelectItem>  </SelectGroup></Select>

라벨과 도움말

Field로 감싸면 라벨과 도움말이 트리거에 연결돼요. 값이 올바르지 않으면 Field에 invalid를 주고 FieldError에 필요한 값을 적어요.

새벽 배송은 일부 지역에서만 돼요.

결제하기 전에 수단을 골라야 해요.

tsx
<Field>  <FieldLabel>배송 방법</FieldLabel>  <Select placeholder="배송 방법을 고르세요">    <SelectItem value="standard">      <SelectItemText>일반 배송</SelectItemText>    </SelectItem>    <SelectItem value="dawn">      <SelectItemText>새벽 배송</SelectItemText>    </SelectItem>  </Select>  <FieldHelp>새벽 배송은 일부 지역에서만 돼요.</FieldHelp></Field><Field invalid>  <FieldLabel>결제 수단</FieldLabel>  <Select placeholder="결제 수단을 고르세요">    <SelectItem value="card">      <SelectItemText>신용카드</SelectItemText>    </SelectItem>    <SelectItem value="transfer">      <SelectItemText>계좌 이체</SelectItemText>    </SelectItem>  </Select>  <FieldError>결제하기 전에 수단을 골라야 해요.</FieldError></Field>

배경

Select 여러 개가 나란히 있으면 bare를 써요. 하나만 있거나 고르는 곳이 먼저 눈에 띄어야 하면 well을 써요.

tsx
<Select placeholder="배송 방법을 고르세요" aria-label="배송 방법">  <SelectItem value="standard">    <SelectItemText>일반 배송</SelectItemText>  </SelectItem></Select><Select surface="well" placeholder="배송 방법을 고르세요" aria-label="배송 방법">  <SelectItem value="standard">    <SelectItemText>일반 배송</SelectItemText>  </SelectItem></Select>

문장 안에서 고르기

설정을 문장처럼 읽게 할 때 써요. 펼침 아이콘은 평소에 옅게 보여요.

반복, 알림

tsx
<p className="text-value flex flex-wrap items-center gap-1">  <span>반복</span>  <Select surface="ghost" value={repeat} onValueChange={setRepeat} aria-label="반복" className="w-auto">    <SelectItem value="day">      <SelectItemText>날마다</SelectItemText>    </SelectItem>    <SelectItem value="week">      <SelectItemText>주마다</SelectItemText>    </SelectItem>    <SelectItem value="month">      <SelectItemText>달마다</SelectItemText>    </SelectItem>  </Select>  <span>, 알림</span>  <Select surface="ghost" value={alarm} onValueChange={setAlarm} aria-label="알림" className="w-auto">    <SelectItem value="10">      <SelectItemText>10분 전</SelectItemText>    </SelectItem>    <SelectItem value="60">      <SelectItemText>1시간 전</SelectItemText>    </SelectItem>  </Select></p>

폼에서는 bare

Input 옆

옆에 있는 컨트롤과 size를 맞춰요. Input과 버튼이 lg면 Select도 lg예요.

tsx
<div className="flex gap-2">  <Input className="min-w-0" placeholder="보낼 금액을 입력하세요" />  <div className="w-40 shrink-0">    <Select placeholder="통화" aria-label="통화">      <SelectItem value="krw">        <SelectItemText>원</SelectItemText>      </SelectItem>      <SelectItem value="usd">        <SelectItemText>달러</SelectItemText>      </SelectItem>    </Select>  </div>  <Button color="brand" emphasis="solid">보내기</Button></div>

비활성

값을 바꿀 수 없을 때는 Select에, 고를 수 없는 항목이 있을 때는 그 SelectItem에 disabled를 줘요.

tsx
<Select value={method} onValueChange={setMethod} disabled aria-label="결제 수단">  <SelectItem value="card">    <SelectItemText>신용카드</SelectItemText>  </SelectItem></Select><Select placeholder="배송 방법을 고르세요" aria-label="배송 방법">  <SelectItem value="standard">    <SelectItemText>일반 배송</SelectItemText>  </SelectItem>  <SelectItem value="dawn">    <SelectItemText>새벽 배송</SelectItemText>  </SelectItem>  <SelectItem value="pickup" disabled>    <SelectItemText>방문 수령</SelectItemText>    <SelectItemDescription>가까운 매장이 없어요</SelectItemDescription>  </SelectItem></Select>

컨트롤

값null
tsx
<Select value={shipping} onValueChange={setShipping} placeholder="배송 방법을 고르세요" aria-label="배송 방법">  <SelectItem value="standard">    <SelectItemText>일반 배송</SelectItemText>  </SelectItem>  <SelectItem value="dawn">    <SelectItemText>새벽 배송</SelectItemText>  </SelectItem>  <SelectItem value="pickup">    <SelectItemText>방문 수령</SelectItemText>  </SelectItem></Select>

명세

이름
이름값기본
Select
valuestring | null-
호출하는 쪽에서 고른 항목을 관리해요. 고르지 않았으면 null이에요.
defaultValuestring | null-
처음 값이에요.
onValueChange(value: string | null, eventDetails) => void-
고른 항목이 바뀌면 호출돼요.
openboolean-
호출하는 쪽에서 열림 상태를 관리해요.
defaultOpenbooleanfalse
처음에 열어 둘지 정해요.
onOpenChange(open: boolean, eventDetails) => void-
열리거나 닫히면 호출돼요.
placeholderstring-
surfacebare, well, ghostbare
bare는 투명 배경에 테두리, well은 회색 배경이에요. ghost는 평소에 글자만 보이고, 마우스를 올리면 옅은 배경, 열면 조금 진한 배경이 생겨요. 여러 개가 나란히 있으면 bare, 하나만 있으면 well, 문장이나 표 셀 안에서 값을 바로 바꾸면 ghost를 써요.
sizesm, md, lgmd
높이가 32, 36, 40px이에요.
arrowbooleanfalse
목록에 트리거를 가리키는 화살표를 보여요.
sideOffsetnumber, 함수8, arrow가 있으면 14
기준과 떨어진 거리예요. 단위는 px이에요.
alignOffsetnumber, 함수0
align 방향으로 옮기는 거리예요. 단위는 px이에요.
collisionAvoidanceobject-
화면 가장자리에 닿을 때 뒤집을지, 밀어 넣을지 정해요. Base UI Positioner의 값을 그대로 받아요.
disabledbooleanfalse
classNamestring-
모든 하위 컴포넌트에 쓸 수 있어요. Select에서는 트리거에 적용돼요.
SelectItem
valuestring필수
이 항목을 고르면 Select의 value가 이 값이 돼요.
disabledbooleanfalse
SelectGroup
labelstring-
항목 위에 보이는 그룹 이름이에요.