Select
미리 정의된 항목 중 하나 또는 여러 개를 선택하는 드롭다운 폼 컨트롤 컴포넌트
개요
Cals Select는 Foundation Combobox를 래핑하여 CALS 제품의 드롭다운 선택 UI를 선언적으로 구현하는 컴포넌트입니다.
주요 특징
- ✅ items 선언형 API: 배열 데이터만 넘기면 드롭다운 항목 자동 렌더링
- ✅ 단일/다중 선택: multiple prop으로 다중 선택 전환, 초과 선택은 +N으로 요약 표시
- ✅ 검색 필터: filterable prop으로 키보드 입력 실시간 필터링
- ✅ 빈 항목 추가: emptyOption prop으로 “전체” 등 빈 값 항목 추가
- ✅ 조건부 토큰 오버라이드: prop이 있을 때만 토큰 오버라이드 (기본값 보존)
- ✅ FormItem 내장: label/required/description/error prop으로 폼 레이블 자동 래핑
- ✅ 가시성 제어: visible prop으로 선언적 표시/숨김
- ✅ 포커스 제어: ref.focus()/blur()/element로 프로그래밍 제어
- ✅ 디자인 토큰: Foundation 토큰 시스템 완벽 호환
기본 사용
items prop으로 드롭다운 항목 배열을 전달합니다. 각 항목은 value와 label을 가집니다.
Preview
기본값 설정
defaultValue로 초기 선택값을 지정합니다.
Preview
크기
size prop으로 트리거 크기를 지정합니다. xs / sm / md / lg / xl을 지원합니다.
Preview
입력 안내 텍스트
placeholder로 선택 전 안내 문구를 표시합니다. showPlaceholder=false이면 안내 문구를 숨깁니다.
Preview
비활성 / 읽기 전용
disabled로 비활성화하거나 readOnly로 읽기 전용으로 설정합니다. readOnly는 disabled와 동일하게 동작합니다 (원본 CALS 호환).
Preview
목록 검색 필터
filterable=true이면 키보드 입력으로 항목을 실시간 필터링합니다. 기본(false)이면 입력 필드는 읽기 전용이지만 드롭다운은 정상 동작합니다.
Preview
다중 선택
multiple=true이면 여러 항목을 선택할 수 있습니다. 선택된 항목은 chip으로 표시되며, maxDisplayChips를 초과한 선택은 +N으로 요약 표시됩니다.
Preview
전체 선택 빈 항목
emptyOption으로 목록 첫 번째에 빈 값 항목을 추가합니다. true이면 기본 빈 항목, 객체이면 label/value를 지정합니다.
Preview
FormItem 래핑
label, required, description, error prop을 지정하면 FormItem으로 자동 래핑됩니다.
Preview
레이블 위치
orientation=“horizontal”이면 레이블을 왼쪽에, “vertical”이면 위쪽에 배치합니다.
Preview
커스텀 색상
backgroundColor, color, borderColor prop으로 토큰을 오버라이드합니다.
Preview
API Reference
Props
| Prop | Type | Default | Description |
|---|---|---|---|
items | SelectOption[] | - | 선택 항목 배열 ({ value, label, disabled? }) |
value | string | string[] | - | 선택된 값 (제어 모드) |
defaultValue | string | string[] | - | 초기 선택값 (비제어 모드) |
placeholder | string | - | 선택 전 안내 문구 |
showPlaceholder | boolean | true | 안내 문구 표시 여부 |
multiple | boolean | false | 다중 선택 허용 |
filterable | boolean | false | 키보드 필터링 허용 |
maxDisplayChips | number | 1 | 다중 선택 시 표시할 최대 chip 수 (초과 시 +N) |
emptyOption | boolean | { label?: string; value?: string } | - | 빈 값 항목 추가 (true이면 기본 빈 항목) |
size | "xs" | "sm" | "md" | "lg" | "xl" | "md" | 트리거 크기 |
visible | boolean | true | 표시 여부 (false → 렌더링 안 함) |
disabled | boolean | false | 비활성화 |
readOnly | boolean | false | 읽기 전용 (disabled와 동일 동작) |
showLabel | boolean | false | 빈 레이블 공간 표시 |
title | string | - | HTML title 속성 (native tooltip) |
backgroundColor | string | - | 배경색 (상태별 자동 파생) |
color | string | - | 텍스트 색상 |
borderColor | string | - | 테두리 색상 (상태별 자동 파생) |
borderWidth | string | - | 테두리 두께 |
fontSize | string | - | 폰트 크기 |
fontWeight | string | number | - | 폰트 굵기 |
fontFamily | string | - | 폰트 패밀리 |
fontStyle | string | - | 폰트 스타일 |
textAlign | string | - | 텍스트 정렬 |
label | string | - | FormItem 레이블 |
required | boolean | - | 필수 표시 |
orientation | "horizontal" | "vertical" | - | FormItem 레이블 방향 |
description | ReactNode | - | 설명 텍스트 |
error | ReactNode | - | 에러 메시지 |
className | string | - | 컴포넌트 컨테이너에 적용할 CSS 클래스 |
formClassName | string | - | FormItem 래퍼에 적용할 CSS 클래스 |
style | CSSProperties | - | 인라인 스타일 |
SelectOption
| Prop | Type | Required | Description |
|---|---|---|---|
label | string | ReactNode | ✅ | 표시 텍스트 |
value | string | ✅ | 값 |
disabled | boolean | - | 항목 비활성화 |
Events
| Event | Type | Description |
|---|---|---|
onChange | (value: string | string[]) => void | 선택 값 변경 시 호출 (single: string, multiple: string[]) |
Ref (SelectRef)
| Property | Type | Description |
|---|---|---|
focus | () => void | 입력 필드에 포커스 |
blur | () => void | 포커스 해제 |
element | HTMLElement | null | 내부 컨테이너 DOM 요소 |
접근성
권장 사항
- ✅ 각 항목에 의미 있는 label 텍스트를 제공합니다
- ✅ FormItem label을 사용하여 컨트롤 전체에 대한 설명을 제공합니다
- ✅ 키보드(Enter/Space/Arrow)로 드롭다운을 열고 항목을 탐색·선택할 수 있습니다
- ❌ 항목에 label 없이 value만 전달하지 마세요
관련 컴포넌트
- Foundation Combobox: 기본 Combobox 컴포넌트
- FormItem: 폼 래퍼
- RadioGroup: 소수의 항목 중 단일 선택이 필요한 경우