Combobox
글자를 입력해 목록을 좁히고 값 하나를 골라요. 시간대나 은행 이름처럼 선택지가 많아 한눈에 보기 어려울 때 써요. 선택지가 몇 개뿐이면 Select를 써요.
사용 예시
입력해서 고르기
필터 조건을 직접 정할 때 써요. 이 예시에서는 이름에 입력한 글자가 들어 있는 항목만 보여요.
tsx
권장
선택지가 3개면 Select를 써요. 열면 전부 보여서 입력하지 않고 고를 수 있어요.
지양
선택지가 몇 개 안 되는데 입력하게 하면 번거로워요. Combobox는 항목이 수십 개를 넘을 때 써요.
필터 맡기기
목록이 짧고 이름만 비교하면 될 때 써요. 필터 코드를 따로 쓰지 않아도 돼요.
tsx
권장
ComboboxTrigger를 누르면 전체 목록이 열려요. 항목을 보고 고를 수 있어요.
지양
ComboboxTrigger가 없으면 마우스로는 글자를 입력해야 목록이 열려요. 어떤 항목이 있는지 미리 볼 수 없어요.
호출하는 쪽에서 여닫기
고를 항목을 먼저 보여 줘야 하거나 다른 버튼으로 목록을 열어야 할 때 써요.
tsx
그룹
항목이 종류별로 나뉠 때 써요. 그룹 이름이 필요 없으면 ComboboxSeparator만 둬요.
tsx
항목 설명
이름만으로 항목을 구분하기 어려울 때 써요. ComboboxInput에는 항목의 label만 보이고, label이 없는 객체는 itemToStringLabel로 보일 글자를 정해요.
tsx
권장
value를 이름과 같게 적으면 고른 뒤 ComboboxInput에 이름이 그대로 보여요.
지양
고르면 ComboboxInput에 asia-seoul처럼 value가 표시돼서 어떤 항목을 골랐는지 알아보기 어려워요.
결과 없음
필터 결과가 없을 때 다음 동작을 할 수 있는 버튼을 함께 둬요.
tsx
라벨과 도움말
Field로 감싸면 라벨과 도움말이 ComboboxInput에 연결돼요. 값이 올바르지 않으면 Field에 invalid를 주고 FieldError에 필요한 값을 적어요.
영문 이름으로 찾아요.
저장하기 전에 시간대를 골라야 해요.
tsx
권장
라벨은 값을 고른 뒤에도 보여요. 나중에 다시 봐도 이 값의 뜻을 알 수 있어요.
지양
placeholder로 라벨을 대신하면 글자를 입력하는 순간 사라져요.
배경
Combobox 여러 개가 나란히 있으면 bare를 써요. 하나만 있거나 입력하는 곳이 먼저 눈에 띄어야 하면 well을 써요.
tsx
목록 줄에서 바로 바꾸기
표 셀이나 목록 줄처럼 값이 많이 모인 곳에서 써요. 펼침 아이콘과 지우기 버튼은 평소에 옅게 보여요.
- 첫 화면 문구 다듬기
- 로그인 오류 고치기
tsx
버튼 옆
옆에 있는 버튼과 size를 맞춰요. ComboboxAnchor가 lg면 버튼도 lg예요.
tsx
컨트롤
값
{"picked":null,"search":""}tsx
명세
| 이름 | 값 | 기본 |
|---|---|---|
| Combobox | ||
| value | string | null | - |
| 호출하는 쪽에서 고른 항목을 관리해요. | ||
| defaultValue | string | null | - |
| 처음 값이에요. | ||
| onValueChange | (value: string | null, eventDetails) => void | - |
| 항목을 고르면 호출돼요. | ||
| open | boolean | - |
| 호출하는 쪽에서 열림 상태를 관리해요. | ||
| defaultOpen | boolean | false |
| 처음에 열어 둘지 정해요. | ||
| onOpenChange | (open: boolean, eventDetails) => void | - |
| 열리거나 닫히면 호출돼요. | ||
| inputValue | string | - |
| 호출하는 쪽에서 입력한 글자를 관리해요. | ||
| onInputValueChange | (value: string, eventDetails) => void | - |
| 입력한 글자가 바뀌면 호출돼요. | ||
| items | string[] | - |
| 필터하기 전의 항목 전부를 넘겨요. 그룹은 { value, items } 배열로 넘겨요. | ||
| filteredItems | string[] | - |
| 호출하는 쪽에서 필터한 항목을 넘겨요. 넘기면 Combobox는 필터하지 않아요. | ||
| filter | (item, query) => boolean, null | - |
| 기본은 입력한 글자가 들어 있는 항목만 보여요. null이면 필터하지 않아요. | ||
| className | string | - |
| ComboboxCollection을 뺀 모든 하위 컴포넌트에 쓸 수 있어요. Combobox에서는 전체를 감싼 wrapper에 적용돼요. | ||
| ComboboxAnchor | ||
| surface | bare, well, ghost | bare |
| bare는 투명 배경에 테두리, well은 회색 배경이에요. ghost는 평소에 글자만 보이고, 마우스를 올리면 옅은 배경, 입력하거나 열면 조금 진한 배경이 생겨요. 여러 개가 나란히 있으면 bare, 하나만 있으면 well, 표 셀이나 목록 줄에서 값을 바로 바꾸면 ghost를 써요. | ||
| size | sm, md, lg | md |
| 높이가 32, 36, 40px이에요. | ||
| ComboboxInput | ||
| placeholder | string | - |
| ComboboxCancel | ||
| label | string | 지우기 |
| 스크린 리더가 읽는 이름이에요. | ||
| ComboboxTrigger | ||
| label | string | 목록 열기 |
| 스크린 리더가 읽는 이름이에요. | ||
| ComboboxContent | ||
| sideOffset | number, 함수 | 4 |
| 기준과 떨어진 거리예요. 단위는 px이에요. | ||
| alignOffset | number, 함수 | 0 |
| align 방향으로 옮기는 거리예요. 단위는 px이에요. | ||
| collisionAvoidance | object | - |
| 화면 가장자리에 닿을 때 뒤집을지, 밀어 넣을지 정해요. Base UI Positioner의 값을 그대로 받아요. | ||
| ComboboxGroup | ||
| label | string | - |
| 그룹 위에 보여요. | ||
| items | string[] | - |
| 그룹에 들어가는 항목이에요. ComboboxCollection이 이 항목을 그려요. | ||
| ComboboxItem | ||
| value | string | 필수 |
| 이 항목을 고르면 Combobox의 value가 이 값이 돼요. | ||
| disabled | boolean | false |