아이콘
아이콘을 얼마나 크게 그리고 스크린리더에 어떻게 읽히게 할지 정한다.
크기
md
0.875rem
0.875rem
lg
1rem
1rem
2xl
1.25rem
1.25rem
3xl
1.5rem
1.5rem
값이 14 · 16 · 20 · 24px 로 등간격이 아니다. 값이 불규칙해서 숫자가 아니라 역할 이름을 쓴다(디자인 토큰). xl 은 쓰이지 않아서 만들지 않았다.
점과 표시는 아이콘이 아니다. 라디오 점(8) · 체크 표시(6×10) · 토스트 표시점(10) · 툴팁 화살표(10)는
size-dot-xs / sm / md 다. 10px 아이콘은 하나도 없었다.어느 크기를 고르나
아이콘은 나란히 놓인 글자보다 한 단계 크다. 같은 크기로 맞추면 아이콘이 글자보다 작아 보인다. 글자는 획이 촘촘하고 아이콘은 비어 있기 때문이다.
| 같이 놓이는 글자 | 아이콘 | 예 |
|---|---|---|
font-size-4 (16px) — 액션 라벨 · 입력값 | size-icon-2xl 20px | Button 기본 |
font-size-3 (14px) — 보조 텍스트 | size-icon-lg 16px | Button small · Datepicker 이전/다음 |
font-size-1 (12px) — 캡션 · 메시지 | size-icon-lg 16px | 에러 메시지 앞 아이콘 |
| 글자 없이 단독 | size-icon-3xl 24px | Textfield 안 아이콘 · Select 화살표 |
| 태그 제거 | size-icon-md 14px | MultiSelect 태그의 × 버튼 |
현재 쓰이는 곳 전부
| 토큰 | 값 | 쓰는 곳 |
|---|---|---|
| size-icon-md | 14px | Select 태그 제거(×) 버튼 |
| size-icon-lg | 16px | Button small 의 아이콘 · Datepicker 이전/다음 · Accordion 화살표 · Message 아이콘 |
| size-icon-2xl | 20px | Button 기본 크기의 아이콘 · Switch 썸 |
| size-icon-3xl | 24px | Textfield 안 아이콘 · Select 드롭다운 표시 |
보이는 크기와 누를 수 있는 크기는 다르다
아이콘이 16px 이어도 누르는 범위는 따로 정한다. 팝업 닫기와 달력의 이전/다음·날짜는 가상요소로 44px 을 누르고, 입력 안 보조 버튼은 둘이 붙어 있어 하한 24px 에 둔다. 자리별 결정은 접근성 문서에 있다.
읽히는 아이콘과 읽히지 않는 아이콘
Icon 은 title 이 있는지로 갈린다. 이것이 유일한 스위치다.
| 장식용 | 의미를 가진 것 | |
|---|---|---|
| 언제 | 옆에 글자가 있어 아이콘이 없어도 뜻이 통한다 | 아이콘만으로 뜻을 전달한다 |
| 쓰는 법 | title 을 주지 않는다 | title 을 준다 |
| 결과 | aria-hidden — 스크린리더가 건너뛴다 | role="img" + <title> |
{/* 장식용 — 옆의 "삭제" 가 이미 뜻을 전한다 */}
<Button icon={<DelIcon />}>삭제</Button>
{/* 아이콘만 있는 버튼 — 접근 이름은 버튼이 갖는다 */}
<IconButton aria-label="삭제">
<DelIcon />
</IconButton>접근 이름을 두 번 주지 않는다. 아이콘 전용 버튼에서는 버튼에 이름을 주고 아이콘은 장식으로 둔다. 둘 다 주면 스크린리더가 같은 말을 두 번 읽는다.
아이콘 세트
아이콘은 lucide-react 다. 24px 격자에 stroke 2 인 line 아이콘이고, 크기에 비례해 선이 가늘어진다. 컴포넌트가 쓰는 일곱 개(지우기 · 검색 · 비밀번호 보기/숨기기 · 닫기 · 달력 · 주의)는 @nui-kit/react/icon 에서 가져온다. Select 의 화살표와 지우기, Datepicker 의 이전/다음, Accordion 의 화살표도 같은 세트다.
직접 넣을 아이콘은 lucide-react 에서 바로 가져온다. size 에 14 · 16 · 20 · 24 를 주면 위 표와 같은 자리에 놓인다. 라이브러리가 쓰는 세트와 같아 선 굵기가 섞이지 않는다.
import { Trash2 } from "lucide-react";
<Button icon={<Trash2 size={20} />}>삭제</Button>직접 만든 SVG 를 쓸 때는 Icon 으로 감싸면 크기·색·접근성 처리가 함께 따라온다.
토큰
| 토큰 | 값 | 비고 |
|---|---|---|
| --nui-size-icon-md | 0.875rem | 14px |
| --nui-size-icon-lg | 1rem | 16px |
| --nui-size-icon-2xl | 1.25rem | 20px |
| --nui-size-icon-3xl | 1.5rem | 24px |