그룹형 다중 선택
검색 가능한 그룹 옵션, 인원 제한, 선택 칩과 새 태그 추가를 지원하는 다중 선택 입력입니다.
적용 전 확인하세요
- 항목
- block/multi-select
- 상태·구현
- React · TypeScript
- 데이터 범위
- 로컬 예제 · 실제 저장·인증·운영은 별도 구현
- 설계 기준
- 7 Dimensions · Primitive → Brand → Semantic → Component
- 토큰
- klic.
설계 문서 원문은 한국어이며, 토큰 ID와 소스 코드는 번역하지 않습니다.
klic_get_item({"kind":"block","id":"multi-select"})패키지로 사용
bun add [email protected]import Block from 'klic-design/blocks/multi-select';
import 'klic-design/blocks.css';
<Block />React 19·React DOM 필요. 패키지는 한 번 설치하고 블록 경로를 선택하세요.
소스 가져오기
수정 가능한 소스·의존성·라이선스를 포함한 독립 실행 폴더를 만듭니다. 기존 프로젝트에 파일만 추가하는 명령은 아닙니다.
curl --fail --location --output klic.mjs https://design.klic.co.kr/integrations/klic.mjs
bun ./klic.mjs add block multi-select --out ./klic-multi-select공통 디자인 기준 보기
공통 디자인 기준
기준 리비전: 6f9c8f5e4d7c767f79a7db999670fb4d0936e07acb1b472fe162a7a9ade60c97
기준 원문: https://design.klic.co.kr/api/v1/design-system.json
API·CLI·MCP·WebMCP의 designSystem과 동봉된 KLIC-DESIGN-SYSTEM.json에서 이 기준과 리비전을 확인합니다. 항목별 계약은 item.design.system으로 연결합니다.
| 디멘션 | 토큰의 책임 | 구조·행동의 책임 |
|---|---|---|
| 크기와 비율 | 컨트롤 크기·아이콘·콘텐츠 폭 | min-height·패딩·줄바꿈·실제 hit area는 컴포넌트 recipe와 DOM에서 보장 |
| 타이포그래피 | 등록 family·역할별 크기·굵기 | 행간·자간·줄바꿈·반응형 조건은 지원 recipe에서 정의; 등록되지 않은 타입을 가정하지 않음 |
| 색과 대비 | 행동·선택·텍스트·경계·상태의 역할 색 | 레이블·아이콘·상태 속성으로 의미 전달; 합성 표면의 실제 대비는 토큰 밖에서 측정 |
| 배치와 정렬 | 콘텐츠 최대 폭·패널 폭 등 등록된 공간 역할 | DOM 읽기 순서·배치 전환·스크롤 소유권·Portal 구조 |
| 간격과 그룹화 | 내부 gap·padding·그룹 사이 간격과 승인 밀도 매핑 | label·fieldset·legend·describedby 등의 관계; 창 폭만으로 밀도를 변경하지 않음 |
| 표면과 깊이 | 표면색·반경·경계 및 지원 color/dimension 소재 leaf | blur·shadow 합성 recipe·stacking·보조 패널과 모달 구분·불투명 fallback |
| 상호작용과 피드백 | focus·선택·진행·성공·경고·오류의 시각 역할 | 키보드·focus 이동·비동기 전이·실행 차단·입력 보존·복구 경로 |
Primitive만 literal 소유. Brand→Primitive, Semantic→Brand, Component→Semantic 인접 참조 유지.
토큰 정의, DOM/CSS recipe의 구조 조건, 컴파일된 최종 literal 출력을 구분한다.
모션 레시피는 컴포넌트·블록 설치 항목과 별도 읽기 카탈로그로 유지하되, 브라우저 검색·미리보기·상세 UI는 KLIC Interface Library 홈페이지의 기존 #motion 메뉴에서 제공한다. 읽기 API·CLI·MCP·WebMCP도 같은 정본 카탈로그를 사용한다. 적용 범위는 사용자 제공 참조 소스의 884개 패턴·67개 분류이며, 기존 KLIC 카테고리/항목 탐색 동작에 그룹으로 싣는다. 기존 단순화 280개 카탈로그, 그 전용 경로와 별칭은 현 카탈로그에서 제외하고 호환 항목으로 유지하지 않는다. 각 채택 항목에는 원본 source id·pattern·engine을 연결하고, Copyright © 2026 acc0mplish. All rights reserved. 및 원본 라이선스 고지를 보존하며 KLIC 자체 제작으로 표시하지 않는다. 원본 안무·시간·경로·레이어·SVG/inline/WAAPI alpha는 보존한다. 외관은 KLIC 4계층 토큰 경로의 색·폰트·표면·테두리·radius·spacing으로 각색하고 Canvas도 같은 팔레트·폰트 토큰을 사용한다. 데모 CSS는 항목 범위로 격리한다. 같은 source runtime이 미리보기와 JavaScript/React 전달을 구동하며 Canvas 재생을 CSS만으로 제공한다고 주장하지 않는다. KLIC 각색본은 블루·네이비·중립 팔레트와 reduced-motion·replay·cleanup 계약을 따르고 출시 전 light/dark/mobile 및 실제 재생을 검증한다. NPM 패키지는 홈페이지와 별도 산출물이며, 현재 소스 후보의 export를 발행된 버전의 기능으로 소개하지 않는다. NPM export 안내는 확인된 발행 manifest에 근거한다.
프리셋의 허용 범위
Preset은 기존 API의 승인된 설정 조합이며 토큰의 다섯 번째 계층이 아니다.
해당 컴포넌트 API가 실제 지원하는 size·variant·density·layout 등 명시적 allowlist
- label·설명·업무 데이터
- value·selection·validation·request 상태
- 이벤트 핸들러·복구 액션·권한
- 원시 스타일 값·미등록 CSS 변수·임의 토큰 override
컴포넌트 기본값 → 선택한 preset → 허용된 명시적 설정. 업무 데이터·상태·권한은 별도 입력으로 처리한다.
허용 키·enum·조합을 검사하고 모르는 값은 진단한다. 타입 선언과 실제 DOM·동작 검증을 구분한다.
충돌 해결 순서
- 정보·조작·접근성을 먼저 보존: 핵심 정보·상태 의미·입력·focus와 조작 경로를 보존한다. 디멘션 번호로 다른 필수 계약을 무효화하지 않는다.
- 구조와 읽기 순서를 재배치: 줄바꿈·열 전환·행동 묶음·패널 배치를 먼저 조정한다. 의미상 필요한 2차원 영역만 국소 스크롤을 사용한다.
- 승인 범위에서 간격·표면 조정: 사용자가 선택한 밀도와 글자 배율을 존중하며 승인된 recipe 안에서 여백·장식을 조정한다. 공간 부족만으로 자동 compact나 글자 축소를 적용하지 않는다.
- 남는 제약과 검증을 기록: 기본값으로 해결되지 않으면 적용 범위·대안·영향·FR/AT·실제 검증을 기록한다. 토큰 계층을 건너뛰거나 검증 실패를 예외 승인으로 덮지 않는다.
sources/checks는 연결 근거이며 통과 인증이 아니다. 제품별 실제 환경 검증 결과는 기존 FR/AT 기록에서 관리한다.
적용과 검증
공통 기준과 항목별 DESIGN.md·실제 소스를 먼저 읽습니다. 규칙마다 토큰·DOM·CSS recipe·상태 처리의 책임을 나누고 제품에 필요한 조건을 적용합니다.
기준 본문과 항목 계약의 revision을 비교합니다. release는 레지스트리 배포를 식별하므로 서로 다른 배포의 페이지 결과를 섞지 않습니다.
최신 CLI와 로컬 레지스트리를 사용하고 stdio 세션을 재시작합니다. WebMCP는 페이지를 새로 읽어 등록합니다. source는 원시 코드만 출력합니다. 소스 묶음은 DESIGN.md, 테마 키트는 README.md를 KLIC-DESIGN-SYSTEM.json과 함께 읽습니다.
참고 문서의 선택적 채택
외부 문서와 초안은 검토 후보로 취급한다. KLIC의 현재 문제·구현·계약을 확인하고 필요한 규칙만 채택하며, 보류·기각의 이유와 적용 범위를 남긴다.
참고 문서의 제품명·예제 API·출처를 KLIC의 구현 사실로 옮기지 않는다. 채택한 규칙은 실제 토큰·DOM·CSS recipe·상태 처리와 검증 근거에 연결한다.
변경 시 함께 확인할 범위
문제 제기는 관련 사용 경로 전체의 변경 영향을 검토하는 출발점이다. 사용자가 언급한 화면이나 도구만 수정하고 완료로 처리하지 않는다.
- 구현 원본·토큰·컴포넌트·타입·스키마
- DOCS·웹 가이드·개발자 문서·예제
- MCP·CLI·WebMCP·API의 설명·입력·응답
- AI 프롬프트·llms.txt·소스와 테마 내보내기
- 회귀 검사·빌드·운영 배포와 실제 응답
정본을 수정한 뒤 관련 가이드·예제·도구·프롬프트·내보내기를 함께 재생성하고 같은 리비전을 검사한다. 영향을 받지 않는 경로는 이유를 기록하며, 실제 확인한 결과와 남은 미검증 조건을 구분해 보고한다.
설계 오류를 예방하는 기준
| 피해야 할 상황 | 적용 기준 |
|---|---|
| 검증 오류를 토스트만으로 안내하거나 실패 후 입력을 지우지 않습니다. | 「그룹형 다중 선택」의 용도: 검색 가능한 그룹 옵션, 인원 제한, 선택 칩과 새 태그 추가를 지원하는 다중 선택 입력입니다. |
| 샘플 데이터·로컬 상호작용을 실제 저장·인증·운영 기능으로 표시하지 않습니다. | 담당자·태그처럼 여러 값을 검색하고 그룹별로 선택하는 입력에 사용합니다. |
| 선택 제한, 비활성 옵션, 그룹 전체 선택 상태를 색만으로 전달하지 않습니다. | Use for inputs that search and select grouped values such as owners and tags. |
multi-select · 폼 양식 · 블록 · 실행 예시 · 샘플 데이터
사용할 때
- 「그룹형 다중 선택」의 용도: 검색 가능한 그룹 옵션, 인원 제한, 선택 칩과 새 태그 추가를 지원하는 다중 선택 입력입니다.
- 담당자·태그처럼 여러 값을 검색하고 그룹별로 선택하는 입력에 사용합니다.
- Use for inputs that search and select grouped values such as owners and tags.
사용하지 말아야 할 때
- 검증 오류를 토스트만으로 안내하거나 실패 후 입력을 지우지 않습니다.
- 샘플 데이터·로컬 상호작용을 실제 저장·인증·운영 기능으로 표시하지 않습니다.
- 선택 제한, 비활성 옵션, 그룹 전체 선택 상태를 색만으로 전달하지 않습니다.
- Do not communicate selection limits, disabled options or group selection by color alone.
접근성과 키보드
- 입력은 네이티브 폼 컨트롤을 우선하고, 트리·선택 목록·파이프라인은 이름 있는 키보드 조작과 보이는 초점을 제공합니다.
- 모든 조작의 이름·보이는 초점·실제 target 경계를 확인한다. reduced-motion에서도 기능에 필요한 상태 안내를 유지한다.
- 컨테이너 폭에 따라 패널과 단계 열을 재배치하고, 긴 표·로그만 내부 스크롤을 사용합니다.
- CSS viewport·실제 콘텐츠 컨테이너·사용자 확대·명시적 density를 별개의 시험 조건으로 기록한다.
밀도별 권장 사용
- compact: 관리자 반복 입력에만 사용합니다. 도움말·오류와 실제 클릭 영역은 유지합니다.
- normal: 기본 권장 밀도입니다. 읽기 순서와 레이블·컨트롤·피드백 그룹을 유지합니다.
- relaxed: 처음 작성하는 폼·긴 안내에 권장합니다. 필드 그룹의 간격을 늘립니다.
상태와 오류 복구
- loading: 진행 중임을 알리고 중복 요청을 차단합니다. 기존 데이터가 있으면 갱신 중에도 유지합니다.
- empty: 초기 빈 입력은 오류로 표시하지 않습니다. 필수 조건은 제출 전에도 안내합니다.
- filtered: 검색 결과가 없으면 데이터 없음과 구분하고 필터 초기화 행동을 제공합니다.
- error: 입력값을 보존하고 오류 설명을 해당 필드와 연결합니다.
4계층 디자인 토큰 매핑
| 토큰 경로 | CSS 변수 | 용도 |
|---|---|---|
klic.component.block.color.surface | --klic-component-block-color-surface | 페이지 표면 |
klic.component.block.color.panel | --klic-component-block-color-panel | 컨테이너 표면 |
klic.component.block.color.soft | --klic-component-block-color-soft | 보조 표면 |
klic.component.block.color.selected | --klic-component-block-color-selected | 선택 표면 |
klic.component.block.color.text | --klic-component-block-color-text | 본문 |
klic.component.block.color.muted | --klic-component-block-color-muted | 보조 문구 |
klic.component.block.color.border | --klic-component-block-color-border | 구분 경계 |
klic.component.block.color.control-border | --klic-component-block-color-control-border | 컨트롤 경계 |
klic.component.block.color.accent | --klic-component-block-color-accent | 주요 행동 |
klic.component.block.color.accent-hover | --klic-component-block-color-accent-hover | 주요 행동 호버 |
klic.component.block.color.on-accent | --klic-component-block-color-on-accent | 강조 위 문구 |
klic.component.block.color.success | --klic-component-block-color-success | 완료 의미 |
klic.component.block.color.success-surface | --klic-component-block-color-success-surface | 완료 표면 |
klic.component.block.color.warning | --klic-component-block-color-warning | 주의 의미 |
klic.component.block.color.warning-surface | --klic-component-block-color-warning-surface | 주의 표면 |
klic.component.block.color.danger | --klic-component-block-color-danger | 오류 의미 |
klic.component.block.color.danger-surface | --klic-component-block-color-danger-surface | 오류 표면 |
klic.component.block.content.max-width | --klic-component-block-content-max-width | 콘텐츠 최대 폭 |
klic.component.block.section.gap | --klic-component-block-section-gap | 섹션 간격 |
klic.component.block.container.padding | --klic-component-block-container-padding | 컨테이너 안쪽 간격 |
klic.component.block.control.height | --klic-component-block-control-height | 컨트롤 최소 높이 |
klic.component.block.surface.radius | --klic-component-block-surface-radius | 표면 반경 |
klic.component.block.icon.size | --klic-component-block-icon-size | 아이콘 크기 |
klic.component.block.typography.body.font-size | --klic-component-block-typography-body-font-size | 본문 크기 |
klic.component.block.typography.label.font-size | --klic-component-block-typography-label-font-size | 레이블 크기 |
구현 범위와 검수
구현 모듈: InteractionReferenceBlock
KLIC 독립 구현 · 사용자 제공 상호작용 참고 · 로컬 샘플 · multi-select
- 각 디멘션의 상태는 정책 채택(policy-adopted)이다. 연결된 소스나 토큰이 존재한다는 사실을 실제 동작 검증 완료로 해석하지 않는다.
- 실제 200% 브라우저 확대·스크린리더·한글 IME·forced-colors·물리 모바일 키보드는 미검증이다. 지원 환경별 결과와 예외 근거를 별도로 기록한다.
- 사용자 제공 상호작용 참고를 KLIC 토큰과 샘플 데이터로 재해석한 독립 구현입니다. 실제 업로드·로그 수신·CI 실행은 하지 않습니다.
- 참고 화면의 제품명·브랜드·소스 구현을 복사하지 않은 KLIC 독립 샘플입니다. 외부 저장·전송·실행은 하지 않습니다.
- 키보드로 주요 행동을 실행합니다.
- compact·normal·relaxed와 Light/Dark를 각각 확인합니다.
- 빈 결과·로딩·오류와 긴 한글 콘텐츠를 확인합니다.
이 문서는 설계 적용 지침이며 검증 완료 인증이 아닙니다. 실행 화면의 데이터와 행동은 로컬 데모입니다.
그룹형 다중 선택 DESIGN.md 다운로드 · 설계 계약 JSON
비교하고 선택하세요
| 항목 | 선택 기준 | 상태 |
|---|---|---|
| 파일 업로드 대기열 | 드롭·파일 선택, 형식 검증, 진행률, 동시 업로드, 취소와 실패 재시도를 보여주는 업로드 대기열입니다. | ready |
| 긴급 인시던트 등록 폼 | 장애 제목, 영향받는 서비스 멀티셀렉트, 심각도(Sev 1~4) 라디오 카드, 고객 영향도 스위치 및 워룸 채널 자동 생성 옵션을 갖춘 폼 | ready |
| 소프트웨어 구매 품의 폼 | 벤더 정보, 연간 계약 금액(통화 선택), 예산 귀속 부서, 개인정보(PII) 처리 여부 보안 체크리스트, 견적서 첨부 필드 폼 | ready |
| 웹훅 엔드포인트 설정 폼 | 수신 URL 유효성 검사, 커스텀 HTTP 헤더 키-밸류 동적 추가, 재시도(Retry) 정책 슬라이더, 구독 이벤트 그룹 선택 양식 | ready |