@nexus-cross/tokens 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,197 @@
1
+ # @nexus-cross/tokens
2
+
3
+ NEXUS 디자인 토큰 라이브러리 - 색상, 타이포그래피, 간격 등 디자인 토큰을 TypeScript/JavaScript로 제공합니다.
4
+
5
+ ## 설치
6
+
7
+ ```bash
8
+ npm install @nexus-cross/tokens
9
+ # or
10
+ yarn add @nexus-cross/tokens
11
+ # or
12
+ pnpm add @nexus-cross/tokens
13
+ ```
14
+
15
+ ## 사용법
16
+
17
+ ### 기본 사용 (getTheme)
18
+
19
+ ```typescript
20
+ import { getTheme, typography, spacing } from '@nexus-cross/tokens';
21
+
22
+ // 테마 선택
23
+ function App({ isDark }: { isDark: boolean }) {
24
+ const { semantic, palette } = getTheme(isDark ? 'dark' : 'light');
25
+
26
+ return (
27
+ <div style={{
28
+ backgroundColor: semantic.bg.default.base,
29
+ color: semantic.text.primary.base,
30
+ padding: spacing.md,
31
+ }}>
32
+ <h1 style={{
33
+ fontSize: typography.heading.large.fontSize,
34
+ color: semantic.accent.primary.base,
35
+ }}>
36
+ Hello NEXUS
37
+ </h1>
38
+ </div>
39
+ );
40
+ }
41
+ ```
42
+
43
+ ### Palette vs Semantic
44
+
45
+ ```typescript
46
+ // ❌ 나쁜 예: palette를 직접 사용 (UI 의미가 불명확)
47
+ <div style={{ color: palette.neutral[900] }}>텍스트</div>
48
+
49
+ // ✅ 좋은 예: semantic 색상 사용 (의미 기반, 테마 자동 적용)
50
+ <div style={{ color: semantic.text.primary.base }}>텍스트</div>
51
+ ```
52
+
53
+ ### React Context를 이용한 테마 적용
54
+
55
+ ```typescript
56
+ import { createContext, useContext, useState, useEffect } from 'react';
57
+ import { getTheme, type ColorMode, type Theme } from '@nexus-cross/tokens';
58
+
59
+ const ThemeContext = createContext<{ theme: Theme; mode: ColorMode } | null>(null);
60
+
61
+ export function ThemeProvider({ children }) {
62
+ const [mode, setMode] = useState<ColorMode>('dark');
63
+ const theme = getTheme(mode);
64
+
65
+ return (
66
+ <ThemeContext.Provider value={{ theme, mode, setMode }}>
67
+ {children}
68
+ </ThemeContext.Provider>
69
+ );
70
+ }
71
+
72
+ export const useTheme = () => {
73
+ const ctx = useContext(ThemeContext);
74
+ if (!ctx) throw new Error('useTheme must be within ThemeProvider');
75
+ return ctx;
76
+ };
77
+
78
+ // 사용
79
+ function Button() {
80
+ const { theme } = useTheme();
81
+ return (
82
+ <button style={{
83
+ backgroundColor: theme.semantic.accent.primary.base,
84
+ color: theme.semantic.accent['on-primary'],
85
+ }}>
86
+ 클릭
87
+ </button>
88
+ );
89
+ }
90
+ ```
91
+
92
+ ## 구조
93
+
94
+ ```
95
+ @nexus-cross/tokens
96
+ ├── data/ # SSOT JSON 데이터
97
+ │ └── color.json # Semantic Mode-Aware 구조
98
+ ├── palette # 테마 독립적 기본 색상 팔레트 (단일 값)
99
+ │ ├── neutral # Gray scale
100
+ │ ├── brand # 브랜드 색상
101
+ │ ├── green # 상태 색상
102
+ │ ├── red
103
+ │ ├── yellow
104
+ │ └── blue
105
+ ├── themes # 테마별 semantic 색상
106
+ │ ├── light # 라이트 테마 (createSemantic(palette, 'light'))
107
+ │ └── dark # 다크 테마 (createSemantic(palette, 'dark'))
108
+ ├── typography # 타이포그래피
109
+ ├── spacing # 간격
110
+ ├── shadows # 그림자
111
+ └── breakpoints # 반응형 브레이크포인트
112
+ ```
113
+
114
+ ### Semantic Mode-Aware 구조
115
+
116
+ **Primitive**는 순수 색상값만 가집니다 (mode 무관):
117
+ ```typescript
118
+ palette.brand[500] // #22C55E (항상 동일)
119
+ palette.neutral[50] // #FAFAFA (항상 동일)
120
+ ```
121
+
122
+ **Semantic**에서 mode별로 다른 primitive를 참조합니다:
123
+ ```typescript
124
+ // color.json 구조
125
+ {
126
+ "semantic": {
127
+ "text": {
128
+ "primary": {
129
+ "base": {
130
+ "light": { "source": "neutral.950" }, // → #09090B
131
+ "dark": { "source": "neutral.50" } // → #FAFAFA
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+
138
+ // 사용 시
139
+ const lightTheme = getTheme('light');
140
+ lightTheme.semantic.text.primary.base // #09090B (어두운 색)
141
+
142
+ const darkTheme = getTheme('dark');
143
+ darkTheme.semantic.text.primary.base // #FAFAFA (밝은 색)
144
+ ```
145
+
146
+ ## API
147
+
148
+ ### getTheme(mode: 'light' | 'dark')
149
+
150
+ 지정된 mode의 테마를 반환합니다.
151
+
152
+ ```typescript
153
+ const { mode, palette, semantic } = getTheme('dark');
154
+ ```
155
+
156
+ ### palette
157
+
158
+ 테마 독립적인 순수 색상값입니다.
159
+
160
+ ```typescript
161
+ import { palette } from '@nexus-cross/tokens';
162
+
163
+ palette.neutral[500] // #71717A
164
+ palette.brand[500] // #22C55E
165
+ ```
166
+
167
+ ### light, dark (Pre-built)
168
+
169
+ 편의를 위한 미리 생성된 semantic 토큰입니다.
170
+
171
+ ```typescript
172
+ import { light, dark } from '@nexus-cross/tokens';
173
+
174
+ // getTheme('light').semantic과 동일
175
+ light.text.primary.base
176
+ ```
177
+
178
+ ## 개발
179
+
180
+ ```bash
181
+ # 빌드
182
+ npm run build
183
+
184
+ # 개발 모드 (watch)
185
+ npm run dev
186
+
187
+ # 타입 체크
188
+ npm run type-check
189
+ ```
190
+
191
+ ## 문서
192
+
193
+ 디자인 토큰의 상세 스펙은 [`../../docs/tokens/`](../../docs/tokens/) 디렉토리를 참고하세요.
194
+
195
+ ## 라이선스
196
+
197
+ ISC
package/dist/TOKENS.md ADDED
@@ -0,0 +1,394 @@
1
+ # @nexus-cross/tokens — Design Token Reference
2
+
3
+ > AI 코딩 어시스턴트를 위한 NEXUS 디자인 토큰 레퍼런스.
4
+ > Tailwind v4 유틸리티 클래스와 CSS 변수를 포함합니다.
5
+
6
+ ## 설치 및 사용
7
+
8
+ ```css
9
+ @import "tailwindcss";
10
+ @import "@nexus-cross/tokens/company.css";
11
+ ```
12
+
13
+ ## Color Tokens (@theme → Tailwind 클래스)
14
+
15
+ ### Background
16
+
17
+ | Tailwind Class | CSS Variable | 용도 | Light | Dark |
18
+ |---|---|---|---|---|
19
+ | `bg-bg-default` | `--color-bg-default` | 기본 배경 | `#FFFFFF` | `#1E232E` |
20
+ | `bg-bg-subtle` | `--color-bg-subtle` | 미묘한 배경 | `#F3F6F8` | `#161A21` |
21
+ | `bg-bg-strong` | `--color-bg-strong` | 강조 배경 | `#ECF0F2` | `#000000` |
22
+
23
+ ### Surface
24
+
25
+ | Tailwind Class | CSS Variable | 용도 | Light | Dark |
26
+ |---|---|---|---|---|
27
+ | `bg-surface-default` | `--color-surface-default` | 기본 표면 | `#FFFFFF` | `#1E232E` |
28
+ | `bg-surface-default-dim` | `--color-surface-default-dim` | 기본 표면 - 딤 | `#F3F6F8` | `#161A21` |
29
+ | `bg-surface-default-hover` | `--color-surface-default-hover` | 기본 표면 - 호버 | `#F3F6F8` | `#252B39` |
30
+ | `bg-surface-default-pressed` | `--color-surface-default-pressed` | 기본 표면 - 프레스 | `#ECF0F2` | `#363B4C` |
31
+ | `bg-surface-default-disabled` | `--color-surface-default-disabled` | 기본 표면 - 비활성 | `#ECF0F2` | `#363B4C` |
32
+ | `bg-surface-subtle` | `--color-surface-subtle` | 미묘한 표면 | `#F3F6F8` | `#252B39` |
33
+ | `bg-surface-subtle-hover` | `--color-surface-subtle-hover` | 미묘한 표면 - 호버 | `#ECF0F2` | `#363B4C` |
34
+ | `bg-surface-strong` | `--color-surface-strong` | 강조 표면 | `#ECF0F2` | `#363B4C` |
35
+ | `bg-surface-inverted` | `--color-surface-inverted` | 반전 표면 | `#161A21` | `#F3F6F8` |
36
+
37
+ ### Text
38
+
39
+ | Tailwind Class | CSS Variable | 용도 | Light | Dark |
40
+ |---|---|---|---|---|
41
+ | `text-text-highlight` | `--color-text-highlight` | 강조 텍스트 | `#000000` | `#FFFFFF` |
42
+ | `text-text-primary` | `--color-text-primary` | 주요 텍스트 | `#1E232E` | `#ECF0F2` |
43
+ | `text-text-primary-hover` | `--color-text-primary-hover` | 주요 텍스트 - 호버 | `#000000` | `#FFFFFF` |
44
+ | `text-text-primary-pressed` | `--color-text-primary-pressed` | 주요 텍스트 - 프레스 | `#000000` | `#FFFFFF` |
45
+ | `text-text-secondary` | `--color-text-secondary` | 보조 텍스트 | `#7E8597` | `#A2AABA` |
46
+ | `text-text-secondary-hover` | `--color-text-secondary-hover` | 보조 텍스트 - 호버 | `#3B4153` | `#C6D0DA` |
47
+ | `text-text-secondary-pressed` | `--color-text-secondary-pressed` | 보조 텍스트 - 프레스 | `#3B4153` | `#C6D0DA` |
48
+ | `text-text-tertiary` | `--color-text-tertiary` | 3차 텍스트 | `#7E8597` | `#7E8597` |
49
+ | `text-text-tertiary-hover` | `--color-text-tertiary-hover` | 3차 텍스트 - 호버 | `#62697A` | `#A2AABA` |
50
+ | `text-text-tertiary-pressed` | `--color-text-tertiary-pressed` | 3차 텍스트 - 프레스 | `#62697A` | `#A2AABA` |
51
+ | `text-text-muted` | `--color-text-muted` | 약한 텍스트 | `#A2AABA` | `#62697A` |
52
+ | `text-text-inverted` | `--color-text-inverted` | 반전 텍스트 | `#FFFFFF` | `#000000` |
53
+
54
+ ### Icon
55
+
56
+ | Tailwind Class | CSS Variable | 용도 | Light | Dark |
57
+ |---|---|---|---|---|
58
+ | `text-icon-highlight` | `--color-icon-highlight` | 강조 아이콘 | `#000000` | `#FFFFFF` |
59
+ | `text-icon-primary` | `--color-icon-primary` | 주요 아이콘 | `#1E232E` | `#ECF0F2` |
60
+ | `text-icon-primary-hover` | `--color-icon-primary-hover` | 주요 아이콘 - 호버 | `#000000` | `#FFFFFF` |
61
+ | `text-icon-primary-pressed` | `--color-icon-primary-pressed` | 주요 아이콘 - 프레스 | `#000000` | `#FFFFFF` |
62
+ | `text-icon-secondary` | `--color-icon-secondary` | 보조 아이콘 | `#7E8597` | `#A2AABA` |
63
+ | `text-icon-secondary-hover` | `--color-icon-secondary-hover` | 보조 아이콘 - 호버 | `#3B4153` | `#C6D0DA` |
64
+ | `text-icon-secondary-pressed` | `--color-icon-secondary-pressed` | 보조 아이콘 - 프레스 | `#3B4153` | `#C6D0DA` |
65
+ | `text-icon-tertiary` | `--color-icon-tertiary` | 3차 아이콘 | `#7E8597` | `#7E8597` |
66
+ | `text-icon-tertiary-hover` | `--color-icon-tertiary-hover` | 3차 아이콘 - 호버 | `#62697A` | `#A2AABA` |
67
+ | `text-icon-tertiary-pressed` | `--color-icon-tertiary-pressed` | 3차 아이콘 - 프레스 | `#62697A` | `#A2AABA` |
68
+ | `text-icon-muted` | `--color-icon-muted` | 약한 아이콘 | `#A2AABA` | `#62697A` |
69
+ | `text-icon-inverted` | `--color-icon-inverted` | 반전 아이콘 | `#FFFFFF` | `#000000` |
70
+
71
+ ### Border
72
+
73
+ | Tailwind Class | CSS Variable | 용도 | Light | Dark |
74
+ |---|---|---|---|---|
75
+ | `border-border-default` | `--color-border-default` | 기본 테두리 | `#ECF0F2` | `#3B4153` |
76
+ | `border-border-default-hover` | `--color-border-default-hover` | 기본 테두리 - 호버 | `#A2AABA` | `#62697A` |
77
+ | `border-border-default-focus` | `--color-border-default-focus` | 기본 테두리 - 포커스 | `#62697A` | `#A2AABA` |
78
+ | `border-border-subtle` | `--color-border-subtle` | 약한 테두리 | `#F3F6F8` | `#252B39` |
79
+ | `border-border-medium` | `--color-border-medium` | 중간 테두리 | `#C6D0DA` | `#62697A` |
80
+ | `border-border-strong` | `--color-border-strong` | 강한 테두리 | `#000000` | `#FFFFFF` |
81
+
82
+ ### Accent
83
+
84
+ | Tailwind Class | CSS Variable | 용도 | Light | Dark |
85
+ |---|---|---|---|---|
86
+ | `bg-accent-primary` | `--color-accent-primary` | 주요 액센트 | `#09B498` | `#00D5AA` |
87
+ | `bg-accent-primary-hover` | `--color-accent-primary-hover` | 주요 액센트 - 호버 | `#07C6A6` | `#12DFB6` |
88
+ | `bg-accent-primary-pressed` | `--color-accent-primary-pressed` | 주요 액센트 - 프레스 | `#0F947E` | `#07C6A6` |
89
+ | `bg-accent-primary-disabled` | `--color-accent-primary-disabled` | 주요 액센트 - 비활성 | `#CDF4ED` | `#123F3C` |
90
+ | `bg-accent-primary-focus` | `--color-accent-primary-focus` | 주요 액센트 - 포커스 | `#09B498` | `#07C6A6` |
91
+ | `bg-accent-primary-intense` | `--color-accent-primary-intense` | 주요 액센트 - 강조 | `#0F947E` | `#12DFB6` |
92
+ | `bg-accent-primary-dim` | `--color-accent-primary-dim` | 주요 액센트 - 딤 | `#83DCC9` | `#0F947E` |
93
+ | `bg-accent-on-primary` | `--color-accent-on-primary` | 액센트 배경 위 전경색 | `#FFFFFF` | `#000000` |
94
+ | `bg-accent-secondary` | `--color-accent-secondary` | | `#7346F3` | `#7D4FFF` |
95
+ | `bg-accent-secondary-intense` | `--color-accent-secondary-intense` | | `#7346F3` | `#9975FF` |
96
+ | `bg-accent-secondary-dim` | `--color-accent-secondary-dim` | | `#E9DBFB` | `#7346F3` |
97
+ | `bg-accent-secondary-hover` | `--color-accent-secondary-hover` | | `#7D4FFF` | `#9975FF` |
98
+ | `bg-accent-secondary-pressed` | `--color-accent-secondary-pressed` | | `#9975FF` | `#7346F3` |
99
+ | `bg-accent-secondary-disabled` | `--color-accent-secondary-disabled` | | `#F4EBFF` | `#3A1D7C` |
100
+ | `bg-accent-secondary-focus` | `--color-accent-secondary-focus` | | `#7D4FFF` | `#9975FF` |
101
+ | `bg-accent-on-secondary` | `--color-accent-on-secondary` | | `#FFFFFF` | `#FFFFFF` |
102
+
103
+ ### Status
104
+
105
+ | Tailwind Class | CSS Variable | 용도 | Light | Dark |
106
+ |---|---|---|---|---|
107
+ | `bg-status-success` | `--color-status-success` | 성공 | `#00B784` | `#02D69C` |
108
+ | `bg-status-success-hover` | `--color-status-success-hover` | 성공 - 호버 | `#00C890` | `#0BDFA5` |
109
+ | `bg-status-success-pressed` | `--color-status-success-pressed` | 성공 - 프레스 | `#1B9674` | `#00C890` |
110
+ | `bg-status-success-disabled` | `--color-status-success-disabled` | 성공 - 비활성 | `#CDF4EA` | `#0D4431` |
111
+ | `bg-status-success-intense` | `--color-status-success-intense` | 성공 - 강조 | `#1B9674` | `#0BDFA5` |
112
+ | `bg-status-success-dim` | `--color-status-success-dim` | 성공 - 딤 | `#9FECD7` | `#1B9674` |
113
+ | `bg-status-warning` | `--color-status-warning` | 경고 | `#FF9D00` | `#FFAA00` |
114
+ | `bg-status-warning-hover` | `--color-status-warning-hover` | 경고 - 호버 | `#FFAA00` | `#FF9D00` |
115
+ | `bg-status-warning-pressed` | `--color-status-warning-pressed` | 경고 - 프레스 | `#F9C127` | `#F9C127` |
116
+ | `bg-status-warning-disabled` | `--color-status-warning-disabled` | 경고 - 비활성 | `#FFF2D2` | `#4A3F2B` |
117
+ | `bg-status-warning-intense` | `--color-status-warning-intense` | 경고 - 강조 | `#D9840C` | `#FFAA00` |
118
+ | `bg-status-warning-dim` | `--color-status-warning-dim` | 경고 - 딤 | `#FFDB6E` | `#9F701A` |
119
+ | `bg-status-danger` | `--color-status-danger` | 위험/오류 | `#DB0A2D` | `#DB0A2D` |
120
+ | `bg-status-danger-hover` | `--color-status-danger-hover` | 위험/오류 - 호버 | `#E62848` | `#E62848` |
121
+ | `bg-status-danger-pressed` | `--color-status-danger-pressed` | 위험/오류 - 프레스 | `#AF2239` | `#D20625` |
122
+ | `bg-status-danger-disabled` | `--color-status-danger-disabled` | 위험/오류 - 비활성 | `#FDE8EB` | `#5B121E` |
123
+ | `bg-status-danger-intense` | `--color-status-danger-intense` | 위험/오류 - 강조 | `#D20625` | `#EC3C56` |
124
+ | `bg-status-danger-dim` | `--color-status-danger-dim` | 위험/오류 - 딤 | `#FFBBC4` | `#AF2239` |
125
+ | `bg-status-danger-focus` | `--color-status-danger-focus` | 위험/오류 - 포커스 | `#E62848` | `#AF2239` |
126
+ | `bg-status-info` | `--color-status-info` | 정보 | `#0095FF` | `#0095FF` |
127
+ | `bg-status-info-hover` | `--color-status-info-hover` | 정보 - 호버 | `#20B1FF` | `#20B1FF` |
128
+ | `bg-status-info-pressed` | `--color-status-info-pressed` | 정보 - 프레스 | `#1087FF` | `#1087FF` |
129
+ | `bg-status-info-disabled` | `--color-status-info-disabled` | 정보 - 비활성 | `#CCEFFF` | `#143A67` |
130
+ | `bg-status-info-intense` | `--color-status-info-intense` | 정보 - 강조 | `#1672D0` | `#20B1FF` |
131
+ | `bg-status-info-dim` | `--color-status-info-dim` | 정보 - 딤 | `#92DDFF` | `#1672D0` |
132
+
133
+ ### Static
134
+
135
+ | Tailwind Class | CSS Variable | 용도 | Light | Dark |
136
+ |---|---|---|---|---|
137
+ | `bg-static-white` | `--color-static-white` | 모드 불변 화이트 | `#FFFFFF` | `#FFFFFF` |
138
+ | `bg-static-black` | `--color-static-black` | 모드 불변 블랙 | `#000000` | `#000000` |
139
+
140
+ ### Shadow
141
+
142
+ | Tailwind Class | CSS Variable | 값 |
143
+ |---|---|---|
144
+ | `shadow-none` | `--shadow-none` | `none` |
145
+ | `shadow-sm` | `--shadow-sm` | `0 1px 2px 0 rgb(0 0 0 / 0.12)` |
146
+ | `shadow-md` | `--shadow-md` | `0 1px 3px 0 rgb(0 0 0 / 0.12)` |
147
+ | `shadow-lg` | `--shadow-lg` | `0 2px 8px -1px rgb(0 0 0 / 0.12)` |
148
+ | `shadow-xl` | `--shadow-xl` | `0 4px 15px -3px rgb(0 0 0 / 0.12)` |
149
+ | `shadow-2xl` | `--shadow-2xl` | `0 5px 25px -5px rgb(0 0 0 / 0.12)` |
150
+
151
+ ### Radius
152
+
153
+ | Tailwind Class | CSS Variable | 값 |
154
+ |---|---|---|
155
+ | `rounded-corner-none` | `--radius-corner-none` | `0px` |
156
+ | `rounded-corner-sm` | `--radius-corner-sm` | `4px` |
157
+ | `rounded-corner-md` | `--radius-corner-md` | `8px` |
158
+ | `rounded-corner-lg` | `--radius-corner-lg` | `12px` |
159
+ | `rounded-corner-xl` | `--radius-corner-xl` | `16px` |
160
+ | `rounded-corner-2xl` | `--radius-corner-2xl` | `24px` |
161
+ | `rounded-corner-full` | `--radius-corner-full` | `9999px` |
162
+
163
+ ### Breakpoint
164
+
165
+ | Tailwind Class | CSS Variable | 값 |
166
+ |---|---|---|
167
+ | `var(--breakpoint-screen-xs)` | `--breakpoint-screen-xs` | `320px` |
168
+ | `var(--breakpoint-screen-sm)` | `--breakpoint-screen-sm` | `640px` |
169
+ | `var(--breakpoint-screen-md)` | `--breakpoint-screen-md` | `768px` |
170
+ | `var(--breakpoint-screen-lg)` | `--breakpoint-screen-lg` | `1024px` |
171
+ | `var(--breakpoint-screen-xl)` | `--breakpoint-screen-xl` | `1280px` |
172
+ | `var(--breakpoint-screen-2xl)` | `--breakpoint-screen-2xl` | `1440px` |
173
+
174
+ ### Typography
175
+
176
+ | Tailwind Class | CSS Variable | 값 |
177
+ |---|---|---|
178
+ | `text-text-xs` | `--text-text-xs` | `0.75rem` |
179
+ | `text-text-sm` | `--text-text-sm` | `0.875rem` |
180
+ | `text-text-base` | `--text-text-base` | `1rem` |
181
+ | `text-text-lg` | `--text-text-lg` | `1.125rem` |
182
+ | `text-text-xl` | `--text-text-xl` | `1.25rem` |
183
+ | `text-text-medium-xs` | `--text-text-medium-xs` | `0.75rem` |
184
+ | `text-text-medium-sm` | `--text-text-medium-sm` | `0.875rem` |
185
+ | `text-text-medium-base` | `--text-text-medium-base` | `1rem` |
186
+ | `text-text-medium-lg` | `--text-text-medium-lg` | `1.125rem` |
187
+ | `text-text-medium-xl` | `--text-text-medium-xl` | `1.25rem` |
188
+ | `text-text-semibold-xs` | `--text-text-semibold-xs` | `0.75rem` |
189
+ | `text-text-semibold-sm` | `--text-text-semibold-sm` | `0.875rem` |
190
+ | `text-text-semibold-base` | `--text-text-semibold-base` | `1rem` |
191
+ | `text-text-semibold-lg` | `--text-text-semibold-lg` | `1.125rem` |
192
+ | `text-text-semibold-xl` | `--text-text-semibold-xl` | `1.25rem` |
193
+ | `text-heading-h7` | `--text-heading-h7` | `0.875rem` |
194
+ | `text-heading-h6` | `--text-heading-h6` | `1rem` |
195
+ | `text-heading-h5` | `--text-heading-h5` | `1.125rem` |
196
+ | `text-heading-h4` | `--text-heading-h4` | `1.25rem` |
197
+ | `text-heading-h3` | `--text-heading-h3` | `1.5rem` |
198
+ | `text-heading-h2` | `--text-heading-h2` | `1.875rem` |
199
+ | `text-heading-h1` | `--text-heading-h1` | `2.25rem` |
200
+ | `text-display-sm` | `--text-display-sm` | `2.25rem` |
201
+ | `text-display-md` | `--text-display-md` | `3rem` |
202
+ | `text-display-lg` | `--text-display-lg` | `3.75rem` |
203
+ | `text-label-sm` | `--text-label-sm` | `0.75rem` |
204
+ | `text-label-md` | `--text-label-md` | `0.875rem` |
205
+ | `text-label-lg` | `--text-label-lg` | `1rem` |
206
+ | `text-label-semibold-sm` | `--text-label-semibold-sm` | `0.75rem` |
207
+ | `text-label-semibold-md` | `--text-label-semibold-md` | `0.875rem` |
208
+ | `text-label-semibold-lg` | `--text-label-semibold-lg` | `1rem` |
209
+
210
+ ### Easing
211
+
212
+ | Tailwind Class | CSS Variable | 값 |
213
+ |---|---|---|
214
+ | `ease-transition-instant` | `--ease-transition-instant` | `linear` |
215
+ | `ease-transition-fast` | `--ease-transition-fast` | `cubic-bezier(0, 0, 0.2, 1)` |
216
+ | `ease-transition-normal` | `--ease-transition-normal` | `cubic-bezier(0, 0, 0.2, 1)` |
217
+ | `ease-transition-slow` | `--ease-transition-slow` | `cubic-bezier(0, 0, 0.2, 1)` |
218
+ | `ease-animation-enter` | `--ease-animation-enter` | `cubic-bezier(0, 0, 0.2, 1)` |
219
+ | `ease-animation-exit` | `--ease-animation-exit` | `cubic-bezier(0.4, 0, 1, 1)` |
220
+ | `ease-animation-bounce` | `--ease-animation-bounce` | `cubic-bezier(0.175, 0.885, 0.32, 1.275)` |
221
+
222
+ ## Foundation Tokens (:root → var()로 사용)
223
+
224
+ ### Spacing
225
+
226
+ | CSS Variable | 값 | 사용 예시 |
227
+ |---|---|---|
228
+ | `--spacing-padding-none` | `0` | `spacing-padding: var(--spacing-padding-none)` |
229
+ | `--spacing-padding-2xs` | `0.25rem` | `spacing-padding: var(--spacing-padding-2xs)` |
230
+ | `--spacing-padding-xs` | `0.5rem` | `spacing-padding: var(--spacing-padding-xs)` |
231
+ | `--spacing-padding-sm` | `0.75rem` | `spacing-padding: var(--spacing-padding-sm)` |
232
+ | `--spacing-padding-md` | `1rem` | `spacing-padding: var(--spacing-padding-md)` |
233
+ | `--spacing-padding-lg` | `1.5rem` | `spacing-padding: var(--spacing-padding-lg)` |
234
+ | `--spacing-padding-xl` | `2rem` | `spacing-padding: var(--spacing-padding-xl)` |
235
+ | `--spacing-padding-2xl` | `2.5rem` | `spacing-padding: var(--spacing-padding-2xl)` |
236
+ | `--spacing-gap-none` | `0` | `spacing-gap: var(--spacing-gap-none)` |
237
+ | `--spacing-gap-xs` | `0.25rem` | `spacing-gap: var(--spacing-gap-xs)` |
238
+ | `--spacing-gap-sm` | `0.5rem` | `spacing-gap: var(--spacing-gap-sm)` |
239
+ | `--spacing-gap-md` | `1rem` | `spacing-gap: var(--spacing-gap-md)` |
240
+ | `--spacing-gap-lg` | `1.5rem` | `spacing-gap: var(--spacing-gap-lg)` |
241
+ | `--spacing-gap-xl` | `2rem` | `spacing-gap: var(--spacing-gap-xl)` |
242
+
243
+ ### Border Width
244
+
245
+ | CSS Variable | 값 | 사용 예시 |
246
+ |---|---|---|
247
+ | `--border-width-stroke-none` | `0px` | `border-width: var(--border-width-stroke-none)` |
248
+ | `--border-width-stroke-thin` | `1px` | `border-width: var(--border-width-stroke-thin)` |
249
+ | `--border-width-stroke-default` | `1px` | `border-width: var(--border-width-stroke-default)` |
250
+ | `--border-width-stroke-heavy` | `2px` | `border-width: var(--border-width-stroke-heavy)` |
251
+
252
+ ### Opacity
253
+
254
+ | CSS Variable | 값 | 사용 예시 |
255
+ |---|---|---|
256
+ | `--opacity-overlay-dim` | `0.5` | `opacity-overlay: var(--opacity-overlay-dim)` |
257
+ | `--opacity-overlay-light` | `0.3` | `opacity-overlay: var(--opacity-overlay-light)` |
258
+ | `--opacity-overlay-heavy` | `0.7` | `opacity-overlay: var(--opacity-overlay-heavy)` |
259
+ | `--opacity-disabled-element` | `0.4` | `opacity-disabled: var(--opacity-disabled-element)` |
260
+ | `--opacity-disabled-text` | `0.5` | `opacity-disabled: var(--opacity-disabled-text)` |
261
+ | `--opacity-hover-subtle` | `0.05` | `opacity-hover: var(--opacity-hover-subtle)` |
262
+ | `--opacity-hover-default` | `0.1` | `opacity-hover: var(--opacity-hover-default)` |
263
+ | `--opacity-pressed-subtle` | `0.1` | `opacity-pressed: var(--opacity-pressed-subtle)` |
264
+ | `--opacity-pressed-default` | `0.2` | `opacity-pressed: var(--opacity-pressed-default)` |
265
+
266
+ ### Size
267
+
268
+ | CSS Variable | 값 | 사용 예시 |
269
+ |---|---|---|
270
+ | `--size-icon-xs` | `12px` | `size-icon: var(--size-icon-xs)` |
271
+ | `--size-icon-sm` | `16px` | `size-icon: var(--size-icon-sm)` |
272
+ | `--size-icon-md` | `20px` | `size-icon: var(--size-icon-md)` |
273
+ | `--size-icon-lg` | `24px` | `size-icon: var(--size-icon-lg)` |
274
+ | `--size-icon-xl` | `32px` | `size-icon: var(--size-icon-xl)` |
275
+ | `--size-control-xs` | `24px` | `size-control: var(--size-control-xs)` |
276
+ | `--size-control-sm` | `32px` | `size-control: var(--size-control-sm)` |
277
+ | `--size-control-md` | `40px` | `size-control: var(--size-control-md)` |
278
+ | `--size-control-lg` | `48px` | `size-control: var(--size-control-lg)` |
279
+ | `--size-touch-min` | `44px` | `size-touch: var(--size-touch-min)` |
280
+ | `--size-avatar-xs` | `24px` | `size-avatar: var(--size-avatar-xs)` |
281
+ | `--size-avatar-sm` | `32px` | `size-avatar: var(--size-avatar-sm)` |
282
+ | `--size-avatar-md` | `40px` | `size-avatar: var(--size-avatar-md)` |
283
+ | `--size-avatar-lg` | `48px` | `size-avatar: var(--size-avatar-lg)` |
284
+ | `--size-avatar-xl` | `64px` | `size-avatar: var(--size-avatar-xl)` |
285
+ | `--size-avatar-2xl` | `96px` | `size-avatar: var(--size-avatar-2xl)` |
286
+
287
+ ### Z-Index
288
+
289
+ | CSS Variable | 값 | 사용 예시 |
290
+ |---|---|---|
291
+ | `--z-index-layer-base` | `0` | `z-index: var(--z-index-layer-base)` |
292
+ | `--z-index-layer-dropdown` | `10` | `z-index: var(--z-index-layer-dropdown)` |
293
+ | `--z-index-layer-sticky` | `20` | `z-index: var(--z-index-layer-sticky)` |
294
+ | `--z-index-layer-popover` | `30` | `z-index: var(--z-index-layer-popover)` |
295
+ | `--z-index-layer-modal` | `40` | `z-index: var(--z-index-layer-modal)` |
296
+ | `--z-index-layer-toast` | `50` | `z-index: var(--z-index-layer-toast)` |
297
+ | `--z-index-layer-tooltip` | `100` | `z-index: var(--z-index-layer-tooltip)` |
298
+
299
+ ### Duration
300
+
301
+ | CSS Variable | 값 | 사용 예시 |
302
+ |---|---|---|
303
+ | `--duration-transition-instant` | `0ms` | `duration-transition: var(--duration-transition-instant)` |
304
+ | `--duration-transition-fast` | `150ms` | `duration-transition: var(--duration-transition-fast)` |
305
+ | `--duration-transition-normal` | `200ms` | `duration-transition: var(--duration-transition-normal)` |
306
+ | `--duration-transition-slow` | `300ms` | `duration-transition: var(--duration-transition-slow)` |
307
+ | `--duration-animation-enter` | `200ms` | `duration-animation: var(--duration-animation-enter)` |
308
+ | `--duration-animation-exit` | `150ms` | `duration-animation: var(--duration-animation-exit)` |
309
+ | `--duration-animation-bounce` | `500ms` | `duration-animation: var(--duration-animation-bounce)` |
310
+
311
+ ### Font Weight
312
+
313
+ | CSS Variable | 값 | 사용 예시 |
314
+ |---|---|---|
315
+ | `--font-weight-text-xs` | `400` | `font-weight: var(--font-weight-text-xs)` |
316
+ | `--font-weight-text-sm` | `400` | `font-weight: var(--font-weight-text-sm)` |
317
+ | `--font-weight-text-base` | `400` | `font-weight: var(--font-weight-text-base)` |
318
+ | `--font-weight-text-lg` | `400` | `font-weight: var(--font-weight-text-lg)` |
319
+ | `--font-weight-text-xl` | `400` | `font-weight: var(--font-weight-text-xl)` |
320
+ | `--font-weight-text-medium-xs` | `500` | `font-weight: var(--font-weight-text-medium-xs)` |
321
+ | `--font-weight-text-medium-sm` | `500` | `font-weight: var(--font-weight-text-medium-sm)` |
322
+ | `--font-weight-text-medium-base` | `500` | `font-weight: var(--font-weight-text-medium-base)` |
323
+ | `--font-weight-text-medium-lg` | `500` | `font-weight: var(--font-weight-text-medium-lg)` |
324
+ | `--font-weight-text-medium-xl` | `500` | `font-weight: var(--font-weight-text-medium-xl)` |
325
+ | `--font-weight-text-semibold-xs` | `600` | `font-weight: var(--font-weight-text-semibold-xs)` |
326
+ | `--font-weight-text-semibold-sm` | `600` | `font-weight: var(--font-weight-text-semibold-sm)` |
327
+ | `--font-weight-text-semibold-base` | `600` | `font-weight: var(--font-weight-text-semibold-base)` |
328
+ | `--font-weight-text-semibold-lg` | `600` | `font-weight: var(--font-weight-text-semibold-lg)` |
329
+ | `--font-weight-text-semibold-xl` | `600` | `font-weight: var(--font-weight-text-semibold-xl)` |
330
+ | `--font-weight-heading-h7` | `600` | `font-weight: var(--font-weight-heading-h7)` |
331
+ | `--font-weight-heading-h6` | `600` | `font-weight: var(--font-weight-heading-h6)` |
332
+ | `--font-weight-heading-h5` | `600` | `font-weight: var(--font-weight-heading-h5)` |
333
+ | `--font-weight-heading-h4` | `600` | `font-weight: var(--font-weight-heading-h4)` |
334
+ | `--font-weight-heading-h3` | `600` | `font-weight: var(--font-weight-heading-h3)` |
335
+ | `--font-weight-heading-h2` | `700` | `font-weight: var(--font-weight-heading-h2)` |
336
+ | `--font-weight-heading-h1` | `700` | `font-weight: var(--font-weight-heading-h1)` |
337
+ | `--font-weight-display-sm` | `700` | `font-weight: var(--font-weight-display-sm)` |
338
+ | `--font-weight-display-md` | `700` | `font-weight: var(--font-weight-display-md)` |
339
+ | `--font-weight-display-lg` | `700` | `font-weight: var(--font-weight-display-lg)` |
340
+ | `--font-weight-label-sm` | `500` | `font-weight: var(--font-weight-label-sm)` |
341
+ | `--font-weight-label-md` | `500` | `font-weight: var(--font-weight-label-md)` |
342
+ | `--font-weight-label-lg` | `500` | `font-weight: var(--font-weight-label-lg)` |
343
+ | `--font-weight-label-semibold-sm` | `600` | `font-weight: var(--font-weight-label-semibold-sm)` |
344
+ | `--font-weight-label-semibold-md` | `600` | `font-weight: var(--font-weight-label-semibold-md)` |
345
+ | `--font-weight-label-semibold-lg` | `600` | `font-weight: var(--font-weight-label-semibold-lg)` |
346
+
347
+ ### Letter Spacing
348
+
349
+ | CSS Variable | 값 | 사용 예시 |
350
+ |---|---|---|
351
+ | `--letter-spacing-text-xs` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-xs)` |
352
+ | `--letter-spacing-text-sm` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-sm)` |
353
+ | `--letter-spacing-text-base` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-base)` |
354
+ | `--letter-spacing-text-lg` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-lg)` |
355
+ | `--letter-spacing-text-xl` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-xl)` |
356
+ | `--letter-spacing-text-medium-xs` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-medium-xs)` |
357
+ | `--letter-spacing-text-medium-sm` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-medium-sm)` |
358
+ | `--letter-spacing-text-medium-base` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-medium-base)` |
359
+ | `--letter-spacing-text-medium-lg` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-medium-lg)` |
360
+ | `--letter-spacing-text-medium-xl` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-medium-xl)` |
361
+ | `--letter-spacing-text-semibold-xs` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-semibold-xs)` |
362
+ | `--letter-spacing-text-semibold-sm` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-semibold-sm)` |
363
+ | `--letter-spacing-text-semibold-base` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-semibold-base)` |
364
+ | `--letter-spacing-text-semibold-lg` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-semibold-lg)` |
365
+ | `--letter-spacing-text-semibold-xl` | `-0.01em` | `letter-spacing: var(--letter-spacing-text-semibold-xl)` |
366
+ | `--letter-spacing-heading-h7` | `0` | `letter-spacing: var(--letter-spacing-heading-h7)` |
367
+ | `--letter-spacing-heading-h6` | `0` | `letter-spacing: var(--letter-spacing-heading-h6)` |
368
+ | `--letter-spacing-heading-h5` | `0` | `letter-spacing: var(--letter-spacing-heading-h5)` |
369
+ | `--letter-spacing-heading-h4` | `0` | `letter-spacing: var(--letter-spacing-heading-h4)` |
370
+ | `--letter-spacing-heading-h3` | `0` | `letter-spacing: var(--letter-spacing-heading-h3)` |
371
+ | `--letter-spacing-heading-h2` | `0` | `letter-spacing: var(--letter-spacing-heading-h2)` |
372
+ | `--letter-spacing-heading-h1` | `0` | `letter-spacing: var(--letter-spacing-heading-h1)` |
373
+ | `--letter-spacing-display-sm` | `0` | `letter-spacing: var(--letter-spacing-display-sm)` |
374
+ | `--letter-spacing-display-md` | `0` | `letter-spacing: var(--letter-spacing-display-md)` |
375
+ | `--letter-spacing-display-lg` | `0` | `letter-spacing: var(--letter-spacing-display-lg)` |
376
+ | `--letter-spacing-label-sm` | `0` | `letter-spacing: var(--letter-spacing-label-sm)` |
377
+ | `--letter-spacing-label-md` | `0` | `letter-spacing: var(--letter-spacing-label-md)` |
378
+ | `--letter-spacing-label-lg` | `0` | `letter-spacing: var(--letter-spacing-label-lg)` |
379
+ | `--letter-spacing-label-semibold-sm` | `0` | `letter-spacing: var(--letter-spacing-label-semibold-sm)` |
380
+ | `--letter-spacing-label-semibold-md` | `0` | `letter-spacing: var(--letter-spacing-label-semibold-md)` |
381
+ | `--letter-spacing-label-semibold-lg` | `0` | `letter-spacing: var(--letter-spacing-label-semibold-lg)` |
382
+
383
+ ## 사용 가이드라인
384
+
385
+ - **배경색**: `bg-bg-*` 또는 `bg-surface-*` 사용
386
+ - **텍스트**: `text-text-*` 사용
387
+ - **아이콘**: `text-icon-*` 사용
388
+ - **테두리**: `border-border-*` 사용
389
+ - **강조/CTA**: `bg-accent-*`, `text-accent-*` 사용
390
+ - **상태 표시**: `text-status-*`, `bg-status-*` 사용
391
+ - **다크모드**: `.dark` 클래스 토글로 CSS 자동 전환
392
+ - **간격**: `p-[var(--spacing-padding-md)]`, `gap-[var(--spacing-gap-sm)]`
393
+ - **크기**: `w-[var(--size-icon-md)]`, `h-[var(--size-control-lg)]`
394
+ - **z-index**: `z-[var(--z-index-layer-modal)]`