디자인 의사결정을 이름 있는 변수로 코드화한 것으로, 디자이너와 개발자가 동일한 기준으로 소통하기 위한 공통 언어입니다.
- 디자인과 구현 사이의 기준을 일치시켜 의도한 결과가 동일하게 구현되도록 합니다.
- 값을 직접 쓰지 않고 참조 구조(Base → Semantic)로 관리해 스타일 변경을 일관되게 적용할 수 있습니다.
- 디자이너와 개발자가 같은 이름으로 소통해 커뮤니케이션 오차를 줄입니다.
토큰은 Base → Semantic 두 계층으로 구성됩니다.
| 레이어 | 접근 | 역할 |
|---|---|---|
| Base | internal |
원시값 정의. 직접 사용 불가 (spacing 제외) |
| Semantic | public |
사용 목적과 맥락을 담은 실사용 API |
Semantic 토큰만 직접 참조(사용)할 수 있습니다. 예외적으로 spacing은 Base 토큰 사용이 가능합니다.
- Semantic 토큰은 사용 목적을 이름에 담고 있어 일관된 스타일을 유지할 수 있습니다.
- Base 토큰은 원시값에 단순 이름만 붙인 것이라 값이 변경될 때 영향 범위를 추적하기 어렵습니다.
- Spacing은 다양한 해상도 환경에 유연하게 대응해야 하고 적용 맥락이 광범위해, 의미보다 수치 기반 시스템으로 범용성을 확보합니다.
서비스에서 활용할 수 있는 원시 색상 값을 정의합니다.
color.base.{palette}{level}
| Base token | Raw value |
|---|---|
| color.base.gray0 | #FFFFFF |
| color.base.orange400 | #F77234 |
UI에 직접 사용되는 의미 기반 색상입니다.
color.{target}.{role}.{emphasis}.{state}
| 레벨 | 설명 | 값 |
|---|---|---|
| target | 적용 대상 | bg / fg / stroke |
| role | 의미 역할 | brand / secondary / neutral / success / attention / danger / information / dim |
| emphasis | 강조 수준 | bold / default / subtle / ghost / inverse |
| state | 상태 (선택) | hover / pressed / focused / disabled |
state만 선택적으로 사용할 수 있으며, 나머지 레벨은 모두 필수입니다.
bg: 컴포넌트나 페이지의 면을 채우는 배경색fg: 배경 위에 올라가는 텍스트, 아이콘 색상stroke: 보더, 구분선 등 외곽선 색상
brand: 서비스 아이덴티티를 나타내는 브랜드 색상secondary: 브랜드 다음 위계의 색상neutral: 일반 정보나 UI 전반에 사용되는 무채색success: 완료, 긍정적인 결과를 나타내는 색상attention: 주의, 경고 등 사용자 확인이 필요한 정보danger: 경고, 삭제 등 위험도가 높은 상태information: 안내, 팁 등 정보성 맥락dim: modal 뒤에 깔리는 오버레이
bold: 가장 높은 대비, 강한 시선 집중default→subtle→ghost순으로 강도 감소inverse: 배경색과 반전된 색상
| Base token | Semantic token | Raw value |
|---|---|---|
| color.base.orange400 | color.bg.brand.default | #F77234 |
weight, size, lineHeight, letterSpacing을 각각 분리 관리합니다.
typography.base.weight.{level}
| Base token | Raw value |
|---|---|
| typography.base.weight.bold | 700 |
| typography.base.weight.semibold | 600 |
| typography.base.weight.regular | 400 |
typography.base.size.t{level}
| Base token | Raw value |
|---|---|
| typography.base.size.t12 | 12px |
| typography.base.size.t16 | 16px |
typography.base.lineHeight.t{level}
| Base token | Raw value |
|---|---|
| typography.base.lineHeight.t16 | 16px |
| typography.base.lineHeight.t24 | 24px |
typography.base.letterSpacing.{level}
| Base token | Raw value |
|---|---|
| typography.base.letterSpacing.wide | -1.5% |
| typography.base.letterSpacing.default | -2.0% |
weight와 letterSpacing은 수치 대신 의미 기반 이름(bold, wide 등)을 사용합니다. 수치 자체보다 상대적인 역할과 사용 의도를 더 직관적으로 전달하기 위함입니다.
Base 토큰의 weight, size, lineHeight, letterSpacing을 묶어 하나의 텍스트 스타일로 정의합니다.
typography.{role}{level}
heading: 페이지의 핵심 제목title: 섹션이나 컴포넌트의 제목body: 본문 텍스트label: 버튼, 태그, 입력 필드 등 UI 요소에 부착되는 짧은 텍스트
level은 동일 role 안에서의 시각적 위계를 의미하며, 숫자가 작을수록 더 높은 강조 수준입니다.
| Semantic token | Base token | Raw value |
|---|---|---|
| typography.heading1 | typography.base.weight.bold | 700 |
| typography.base.size.t32 | 32px | |
| typography.base.lineHeight.t48 | 48px | |
| typography.base.letterSpacing.default | -2% |
여백과 간격 값을 수치 기반으로 체계화합니다.
spacing.base.size.s{level}
| Base token | Raw value |
|---|---|
| spacing.base.size.s0 | 0px |
| spacing.base.size.s8 | 8px |
| spacing.base.size.s16 | 16px |
토큰 외 임의 수치(13px, 22px 등)는 사용하지 않습니다. 디바이스 환경, 요소 간 관계, 시각적 위계를 기준으로 값을 선택합니다.
- 같은 그룹 내 인접 요소 → 작은 값
- 컴포넌트 내부 패딩 → 중간 값
- 섹션 간 구분, 레이아웃 여백 → 큰 값
Spacing은 별도의 Semantic 토큰 없이 Base 토큰을 직접 참조합니다.
| 구분 | 패턴 | 예시 |
|---|---|---|
| Base Color | color.base.{palette}{level} |
color.base.orange400 |
| Semantic Color | color.{target}.{role}.{emphasis}.{state} |
color.bg.brand.default |
| Base Typography | typography.base.{category}.{level} |
typography.base.size.t16 |
| Semantic Typography | typography.{role}{level} |
typography.heading1 |
| Base Spacing | spacing.base.size.s{level} |
spacing.base.size.s8 |