@infomind-ux/infoux-mcp 0.1.0

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.
Files changed (53) hide show
  1. package/README.md +81 -0
  2. package/bin/server.js +331 -0
  3. package/data/contract.md +215 -0
  4. package/data/manifest.json +286 -0
  5. package/data/references/accessibility.md +243 -0
  6. package/data/references/forbidden-patterns.md +462 -0
  7. package/data/references/guide-import.md +93 -0
  8. package/data/references/html-semantics.md +475 -0
  9. package/data/references/krds-components.md +1426 -0
  10. package/data/references/krds-source.md +1125 -0
  11. package/data/references/krds-tokens.md +201 -0
  12. package/data/references/project-profiles.md +99 -0
  13. package/data/references/snippet-template.md +185 -0
  14. package/data/references/tailwind-mapping.md +53 -0
  15. package/data/rules.json +780 -0
  16. package/data/snippets/accordion.md +49 -0
  17. package/data/snippets/alert.md +37 -0
  18. package/data/snippets/badge.md +29 -0
  19. package/data/snippets/boilerplate.md +125 -0
  20. package/data/snippets/breadcrumb.md +26 -0
  21. package/data/snippets/btn.md +63 -0
  22. package/data/snippets/calendar.md +64 -0
  23. package/data/snippets/card.md +50 -0
  24. package/data/snippets/carousel.md +43 -0
  25. package/data/snippets/check-radio.md +55 -0
  26. package/data/snippets/disclosure.md +44 -0
  27. package/data/snippets/file-upload.md +34 -0
  28. package/data/snippets/form.md +68 -0
  29. package/data/snippets/header.md +56 -0
  30. package/data/snippets/list.md +64 -0
  31. package/data/snippets/main-menu.md +49 -0
  32. package/data/snippets/modal.md +54 -0
  33. package/data/snippets/pagination.md +41 -0
  34. package/data/snippets/progress.md +30 -0
  35. package/data/snippets/select.md +34 -0
  36. package/data/snippets/side-panel.md +57 -0
  37. package/data/snippets/spinner.md +24 -0
  38. package/data/snippets/step-indicator.md +38 -0
  39. package/data/snippets/switch.md +32 -0
  40. package/data/snippets/tab.md +52 -0
  41. package/data/snippets/table.md +63 -0
  42. package/data/snippets/tag.md +42 -0
  43. package/data/snippets/toast.md +48 -0
  44. package/data/snippets/tooltip.md +38 -0
  45. package/data/tokens.css +390 -0
  46. package/data/workflows/change-token.md +20 -0
  47. package/data/workflows/create-component.md +71 -0
  48. package/data/workflows/design-form.md +20 -0
  49. package/data/workflows/design-page.md +22 -0
  50. package/data/workflows/design-widget.md +19 -0
  51. package/data/workflows/init-project.md +68 -0
  52. package/data/workflows/review-ui.md +14 -0
  53. package/package.json +34 -0
@@ -0,0 +1,1125 @@
1
+ # KRDS Source — 원본 수집 자료
2
+
3
+ > 수집일: 2026-04-30
4
+ > 출처: KRDS 공식(www.krds.go.kr) + KRDS-uiux GitHub 저장소(공식) + 전자정부 UI/UX 가이드(uiux.egovframe.go.kr)
5
+ > 우선순위: KRDS 공식 채택. 전자정부 UI/UX 가이드는 KRDS와 동일 콘텐츠를 호스팅함이 확인되어 별도 보완 항목 없음.
6
+ > 수집 범위: 디자인 토큰(색상/타이포/간격/그리드/반경/그림자/모션/z-index/브레이크포인트), 컴포넌트 카탈로그, 접근성, 1rem=10px 트릭, 네이밍 규칙
7
+ > 수집 방법: ① KRDS 공식 사이트의 스타일 가이드 페이지 fetch ② KRDS-uiux GitHub의 공식 토큰 JSON(`tokens/transformed_tokens.json`) 직접 다운로드 ③ 컴파일된 CSS(`resources/css/`)에서 z-index/그림자 추출
8
+
9
+ ---
10
+
11
+ ## 0. 개요
12
+
13
+ - **시스템명**: KRDS (Korea Government Design System) — 한국명 "범정부 UI/UX 디자인 시스템"
14
+ - **현재 버전**: v1.0.0 (이전 버전 v0.4는 https://v04.krds.go.kr 에서 보존)
15
+ - **GitHub**: https://github.com/KRDS-uiux/krds-uiux (공식 저장소)
16
+ - **CSS 변수 prefix**: `--krds-`
17
+ - **모드 구분**: `light`(기본) / `high-contrast`(고대비)
18
+ - **반응형 모드**: `mobile` / `pc`
19
+ - **표준형 vs 확장형**:
20
+ - **표준형(Standard)**: 중앙행정기관 대표 웹사이트(정부24, 고용24 등). KRDS 그대로 적용.
21
+ - **확장형(Extended)**: 독자 로고/브랜드 사용 기관(국민건강보험, 복지로 등). KRDS 토큰 위에 부처 색상/모양 커스터마이즈.
22
+
23
+ ### 디자인 원칙 7가지 (출처: utility_02)
24
+ 1. **사용자 중심의 서비스** — 모든 의사 결정은 사용자를 중심으로
25
+ 2. **모든 사용자를 포용하는 서비스** — 장애인·고령자·어린이·외국인 동등 접근
26
+ 3. **공통된 경험 안에서 개별 특성을 고려한 서비스** — 일관성 + 기관 특성 최적화
27
+ 4. **빠르고 간단한 서비스** — 사용자 의사결정 최소화
28
+ 5. **쉽게 이해하고 사용할 수 있는 서비스** — 친숙·간결·직관
29
+ 6. **사용자의 다양한 상황을 고려하는 서비스** — 상황·목적·숙련도·빈도 고려
30
+ 7. **신뢰할 수 있는 서비스** — 정부 공식성, 최신·정확 정보
31
+
32
+ ---
33
+
34
+ ## 1. 색상 토큰 (Color)
35
+
36
+ > 모든 hex 값은 KRDS-uiux GitHub `tokens/transformed_tokens.json` 원본에서 추출.
37
+ > 단계 체계: **0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 100** (Gray만 0/100 포함, 나머지 11단계)
38
+ > "매직넘버" 규칙: 두 단계의 차이가 50이면 명도 대비 4.5:1 보장.
39
+
40
+ ### 1.1 Primitive — Light 모드
41
+
42
+ #### Primary (대표/주조색 — 정부 상징)
43
+ | 단계 | hex | 비고 |
44
+ |------|------|------|
45
+ | 5 | `#ecf2fe` | |
46
+ | 10 | `#d8e5fd` | |
47
+ | 20 | `#b1cefb` | |
48
+ | 30 | `#86aff9` | |
49
+ | 40 | `#4c87f6` | |
50
+ | **50** | `#256ef4` | **base** — 기본 액션색 |
51
+ | 60 | `#0b50d0` | text 권장 |
52
+ | 70 | `#083891` | |
53
+ | 80 | `#052561` | |
54
+ | 90 | `#03163a` | |
55
+ | 95 | `#020f27` | |
56
+
57
+ #### Secondary (보조색)
58
+ | 단계 | hex |
59
+ |------|------|
60
+ | 5 | `#eef2f7` |
61
+ | 10 | `#d6e0eb` |
62
+ | 20 | `#bacbde` |
63
+ | 30 | `#90b0d5` |
64
+ | 40 | `#6b96c7` |
65
+ | **50** | `#346fb2` |
66
+ | 60 | `#1c589c` |
67
+ | 70 | `#063a74` |
68
+ | 80 | `#052b57` |
69
+ | 90 | `#031f3f` |
70
+ | 95 | `#02162c` |
71
+
72
+ #### Gray (무채색 13단계 — 0/100 포함)
73
+ | 단계 | hex |
74
+ |------|------|
75
+ | **0** | `#ffffff` |
76
+ | 5 | `#f4f5f6` |
77
+ | 10 | `#e6e8ea` |
78
+ | 20 | `#cdd1d5` |
79
+ | 30 | `#b1b8be` |
80
+ | 40 | `#8a949e` |
81
+ | 50 | `#6d7882` |
82
+ | 60 | `#58616a` |
83
+ | 70 | `#464c53` |
84
+ | 80 | `#33363d` |
85
+ | 90 | `#1e2124` |
86
+ | 95 | `#131416` |
87
+ | **100** | `#000000` |
88
+
89
+ #### Danger (Critical/Error)
90
+ | 단계 | hex | 시맨틱 역할 |
91
+ |------|------|------|
92
+ | 5 | `#fdefec` | surface |
93
+ | 10 | `#fcdfd9` | border |
94
+ | 20 | `#f7afa1` | |
95
+ | 30 | `#f48771` | |
96
+ | 40 | `#f05f42` | |
97
+ | **50** | `#de3412` | **base** |
98
+ | 60 | `#bd2c0f` | text |
99
+ | 70 | `#8a240f` | |
100
+ | 80 | `#5c180a` | |
101
+ | 90 | `#390d05` | |
102
+ | 95 | `#260903` | |
103
+
104
+ #### Warning
105
+ | 단계 | hex | 시맨틱 역할 |
106
+ |------|------|------|
107
+ | 5 | `#fff3db` | surface |
108
+ | 10 | `#ffe0a3` | border |
109
+ | 20 | `#ffc95c` | |
110
+ | 30 | `#ffb114` | |
111
+ | 40 | `#c78500` | |
112
+ | **50** | `#9e6a00` | **base** |
113
+ | 60 | `#8a5c00` | text |
114
+ | 70 | `#614100` | |
115
+ | 80 | `#422c00` | |
116
+ | 90 | `#2e1f00` | |
117
+ | 95 | `#241800` | |
118
+
119
+ #### Success
120
+ | 단계 | hex | 시맨틱 역할 |
121
+ |------|------|------|
122
+ | 5 | `#eaf6ec` | surface |
123
+ | 10 | `#d8eedd` | border |
124
+ | 20 | `#a9dab4` | |
125
+ | 30 | `#7ec88e` | |
126
+ | 40 | `#3fa654` | |
127
+ | **50** | `#228738` | **base** |
128
+ | 60 | `#267337` | text |
129
+ | 70 | `#285d33` | |
130
+ | 80 | `#1f4727` | |
131
+ | 90 | `#122b18` | |
132
+ | 95 | `#0e2012` | |
133
+
134
+ #### Information (Info)
135
+ | 단계 | hex | 시맨틱 역할 |
136
+ |------|------|------|
137
+ | 5 | `#e7f4fe` | surface |
138
+ | 10 | `#d3ebfd` | border |
139
+ | 20 | `#9ed2fa` | |
140
+ | 30 | `#5fb5f7` | |
141
+ | 40 | `#2098f3` | |
142
+ | **50** | `#0b78cb` | **base** |
143
+ | 60 | `#096ab3` | text |
144
+ | 70 | `#085691` | |
145
+ | 80 | `#053961` | |
146
+ | 90 | `#03253f` | |
147
+ | 95 | `#021a2c` | |
148
+
149
+ #### Point (강조색 — 빨강 계열)
150
+ | 단계 | hex |
151
+ |------|------|
152
+ | 5 | `#fbeff0` |
153
+ | 10 | `#f5d6d9` |
154
+ | 20 | `#ebadb2` |
155
+ | 30 | `#e0858c` |
156
+ | 40 | `#d65c66` |
157
+ | **50** | `#d63d4a` |
158
+ | 60 | `#ab2b36` |
159
+ | 70 | `#7a1f26` |
160
+ | 80 | `#521419` |
161
+ | 90 | `#310c0f` |
162
+ | 95 | `#21080a` |
163
+
164
+ #### Graphic (그래픽 전용 — 5단계만)
165
+ | 단계 | hex |
166
+ |------|------|
167
+ | 10 | `#e5ecf9` |
168
+ | 30 | `#98acc5` |
169
+ | 50 | `#61758f` |
170
+ | 70 | `#39506c` |
171
+ | 90 | `#223a58` |
172
+
173
+ #### Alpha (투명도 — bg/border/dimmed)
174
+ | 토큰 | hex | 용도 |
175
+ |------|------|------|
176
+ | black100 | `#000000` | text-title |
177
+ | black75 | `#000000bf` | dimmed |
178
+ | black50 | `#00000080` | bg, border |
179
+ | black25 | `#00000040` | bg, border |
180
+ | black10 | `#0000001a` | bg, border |
181
+ | black0 | `#00000000` | transparent |
182
+ | white100 | `#ffffff` | text-title (inverse) |
183
+ | white75 | `#ffffffbf` | dimmed (inverse) |
184
+ | white50 | `#ffffff80` | bg, border |
185
+ | white25 | `#ffffff40` | bg, border |
186
+ | white10 | `#ffffff1a` | bg, border |
187
+ | white0 | `#ffffff00` | transparent |
188
+
189
+ #### Shadow Alpha (Light 모드 — 그림자 전용)
190
+ | 토큰 | hex |
191
+ |------|------|
192
+ | `--krds-light-color-alpha-shadow1` | `#0000000d` (5% black) |
193
+ | `--krds-light-color-alpha-shadow2` | `#00000014` (8% black) |
194
+ | `--krds-light-color-alpha-shadow3` | `#0000001f` (12% black) |
195
+
196
+ ### 1.2 Primitive — High-Contrast 모드
197
+
198
+ > Primary, Gray, Danger, Warning, Success, Information, Point의 hex는 Light 모드와 동일.
199
+ > 차이점:
200
+ > - Secondary가 청록 계열로 변경됨
201
+ > - Shadow alpha가 더 짙음
202
+ > - 시맨틱 토큰(text/icon/border 등)이 다른 단계를 참조함
203
+
204
+ #### High-Contrast Secondary (청록 계열)
205
+ | 단계 | hex |
206
+ |------|------|
207
+ | 5 | `#edf6f8` |
208
+ | 10 | `#d5ebf1` |
209
+ | 20 | `#abd8e3` |
210
+ | 30 | `#75c0d1` |
211
+ | 40 | `#3d9fb8` |
212
+ | **50** | `#268097` |
213
+ | 60 | `#1f687a` |
214
+ | 70 | `#17505e` |
215
+ | 80 | `#113b45` |
216
+ | 90 | `#0e3139` |
217
+ | 95 | `#091f25` |
218
+
219
+ #### High-Contrast Shadow Alpha
220
+ | 토큰 | hex |
221
+ |------|------|
222
+ | `--krds-high-contrast-color-alpha-shadow1` | `#0000001f` (12% black) |
223
+ | `--krds-high-contrast-color-alpha-shadow2` | `#00000033` (20% black) |
224
+ | `--krds-high-contrast-color-alpha-shadow3` | `#00000066` (40% black) |
225
+
226
+ ### 1.3 Semantic 색상 토큰 (Light 모드)
227
+
228
+ > 시맨틱 토큰은 primitive를 참조함. 형식: `--krds-light-color-{category}-{role}`
229
+
230
+ #### text (텍스트)
231
+ | 토큰 | 참조 primitive | 비고 |
232
+ |------|------|------|
233
+ | `text.bolder` | `gray.95` | 가장 진한 본문 |
234
+ | `text.basic` | `gray.90` | 기본 본문 |
235
+ | `text.subtle` | `gray.70` | 보조 텍스트 |
236
+ | `text.disabled` | `gray.40` | 비활성 |
237
+ | `text.disabled-on` | `gray.50` | 비활성 위 텍스트 |
238
+ | `text.primary` | `primary.60` | 활성/선택 |
239
+ | `text.secondary` | `secondary.80` | 활성/선택 |
240
+ | `text.danger` | `danger.60` | |
241
+ | `text.warning` | `warning.60` | |
242
+ | `text.success` | `success.60` | |
243
+ | `text.information` | `information.60` | |
244
+ | `text.point` | `point.60` | |
245
+ | `text.bolder-inverse` | `gray.0` | 다크 배경용 |
246
+ | `text.basic-inverse` | `gray.0` | 다크 배경용 |
247
+ | `text.subtle-inverse` | `gray.30` | 다크 배경용 |
248
+ | `text.inverse-static` | `gray.0` | |
249
+ | `text.static` | `gray.90` | |
250
+
251
+ #### background (배경)
252
+ | 토큰 | 참조 primitive |
253
+ |------|------|
254
+ | `background.white` | `gray.0` |
255
+ | `background.inverse` | `gray.90` |
256
+ | `background.gray-subtler` | `gray.5` |
257
+ | `background.gray-subtle` | `gray.10` |
258
+ | `background.dim` | `alpha.black75` (모달 dim) |
259
+
260
+ #### surface (표면 — 카드/패널)
261
+ | 토큰 | 참조 primitive |
262
+ |------|------|
263
+ | `surface.white` | `gray.0` |
264
+ | `surface.inverse` | `gray.90` |
265
+ | `surface.gray-subtler` | `gray.5` |
266
+ | `surface.gray-subtle` | `gray.10` |
267
+ | `surface.disabled` | `gray.20` |
268
+ | `surface.primary-subtler` | `primary.5` |
269
+ | `surface.secondary-subtler` | `secondary.5` |
270
+ | `surface.danger-subtler` | `danger.5` |
271
+ | `surface.warning-subtler` | `warning.5` |
272
+ | `surface.success-subtler` | `success.5` |
273
+ | `surface.information-subtler` | `information.5` |
274
+ | `surface.point-subtler` | `point.5` |
275
+
276
+ #### border (테두리)
277
+ | 토큰 | 참조 primitive |
278
+ |------|------|
279
+ | `border.gray-light` | `gray.20` |
280
+ | `border.gray` | `gray.30` (disabled) |
281
+ | `border.gray-dark` | `gray.60` (active) |
282
+ | `border.gray-darker` | `gray.90` |
283
+ | `border.primary` | `primary.50` (active/selected) |
284
+ | `border.primary-light` | `primary.10` |
285
+ | `border.secondary` | `secondary.70` |
286
+ | `border.secondary-light` | `secondary.10` |
287
+ | `border.danger` | `danger.50` |
288
+ | `border.danger-light` | `danger.10` |
289
+ | `border.warning` | `warning.50` |
290
+ | `border.warning-light` | `warning.10` |
291
+ | `border.success` | `success.50` |
292
+ | `border.success-light` | `success.10` |
293
+ | `border.information` | `information.50` |
294
+ | `border.information-light` | `information.10` |
295
+ | `border.point` | `point.50` |
296
+ | `border.point-light` | `point.10` |
297
+ | `border.disabled` | `gray.30` |
298
+ | `border.inverse` | `gray.0` |
299
+ | `border.transparency` | `alpha.black0` |
300
+
301
+ #### icon
302
+ | 토큰 | 참조 primitive |
303
+ |------|------|
304
+ | `icon.gray` | `gray.80` |
305
+ | `icon.gray-light` | `gray.70` |
306
+ | `icon.gray-fill` | `gray.20` |
307
+ | `icon.inverse` | `gray.0` |
308
+ | `icon.primary` | `primary.50` |
309
+ | `icon.secondary` | `secondary.80` |
310
+ | `icon.point` | `point.50` |
311
+ | `icon.danger` | `danger.50` |
312
+ | `icon.warning` | `warning.50` |
313
+ | `icon.success` | `success.50` |
314
+ | `icon.information` | `information.50` |
315
+ | `icon.disabled` | `gray.40` |
316
+ | `icon.disabled-on` | `gray.50` |
317
+
318
+ #### link
319
+ | 토큰 | 값 |
320
+ |------|------|
321
+ | `link.default` | `primary.50` |
322
+ | `link.hover` | `primary.60` |
323
+ | `link.pressed` | `primary.70` |
324
+ | `link.visited` | `#5917b8` (직접 hex — 유일한 직접 정의) |
325
+
326
+ #### button (버튼 전용 시맨틱)
327
+ | 토큰 | 참조 |
328
+ |------|------|
329
+ | `button.primary-fill` | `primary.50` |
330
+ | `button.primary-fill-hover` | `primary.60` |
331
+ | `button.primary-fill-pressed` | `primary.70` |
332
+ | `button.secondary-fill` | `primary.5` |
333
+ | `button.secondary-fill-hover` | `primary.10` |
334
+ | `button.secondary-fill-pressed` | `primary.20` |
335
+ | `button.secondary-border` | `primary.50` |
336
+ | `button.tertiary-fill` | `alpha.white0` |
337
+ | `button.tertiary-fill-hover` | `gray.5` |
338
+ | `button.tertiary-fill-pressed` | `gray.10` |
339
+ | `button.tertiary-border` | `gray.60` |
340
+ | `button.text-fill` | `alpha.white0` |
341
+ | `button.text-fill-hover` | `secondary.5` |
342
+ | `button.text-fill-pressed` | `secondary.10` |
343
+ | `button.text-border` | `alpha.black0` |
344
+ | `button.disabled-fill` | `gray.20` |
345
+ | `button.disabled-border` | `gray.30` |
346
+
347
+ #### input (입력 필드)
348
+ | 토큰 | 참조 |
349
+ |------|------|
350
+ | `input.border` | `gray.60` |
351
+ | `input.border-active` | `primary.50` |
352
+ | `input.border-error` | `danger.50` |
353
+ | `input.border-disabled` | `gray.30` |
354
+ | `input.surface` | `gray.0` |
355
+ | `input.surface-disabled` | `gray.20` |
356
+
357
+ #### action (액션 상태 색상)
358
+ | 토큰 | 참조 |
359
+ |------|------|
360
+ | `action.primary` | `alpha.white0` (transparent base) |
361
+ | `action.primary-hover` | `primary.5` |
362
+ | `action.primary-pressed` | `primary.10` |
363
+ | `action.primary-active` | `primary.50` |
364
+ | `action.primary-selected` | `primary.5` |
365
+ | `action.secondary` | `alpha.white0` |
366
+ | `action.secondary-hover` | `secondary.5` |
367
+ | `action.secondary-pressed` | `secondary.10` |
368
+ | `action.secondary-active` | `secondary.70` |
369
+ | `action.secondary-selected` | `secondary.5` |
370
+ | `action.disabled` | `gray.20` |
371
+ | `action.white` | `gray.0` |
372
+
373
+ #### divider, element, graphic (그 외 시맨틱)
374
+ - `divider.*` (gray-light/gray/gray-dark/gray-darker/primary/secondary/error/point 등)
375
+ - `element.*` (gray-lighter/light/normal/dark, primary/secondary/point/danger/warning/success/information의 lighter/light/normal 등)
376
+ - `graphic.*` (blue-subtler/subtle/normal/dark/darker, red-subtler/subtle/normal/dark/darker, brand)
377
+
378
+ > 전체 시맨틱 토큰은 `tokens/transformed_tokens.json` mode-light/mode-high-contrast 섹션 참조 (이 문서에 모두 추출됨).
379
+
380
+ ---
381
+
382
+ ## 2. 타이포그래피 (Typography)
383
+
384
+ ### 2.1 폰트 패밀리
385
+ - **권장 폰트**: `Pretendard GOV`
386
+ - SCSS 정의: `$font-family-base: "Pretendard GOV", sans-serif`
387
+ - 출처: `resources/scss/common/_variables_for_code.scss` line 15
388
+ - Pretendard 기반으로 공공기관 접근성·가독성에 최적화
389
+ - **확장형 권장**: Noto Sans, Nanum Gothic, Spoqa Han Sans
390
+ - **베이스 사이즈**: 17px (Pretendard GOV 상대적으로 작은 자형 보정)
391
+
392
+ ### 2.2 폰트 크기 — Primitive `$font-size-base`
393
+ - **`62.5%`** = 1rem = 10px (1rem=10px 트릭 명시적 채택, 출처 SCSS line 16 주석: `//10px 1rem으로 설정`)
394
+
395
+ ### 2.3 폰트 Weight
396
+ | 토큰 | 값 |
397
+ |------|------|
398
+ | `regular` | 400 |
399
+ | `bold` | 700 |
400
+
401
+ ### 2.4 line-height
402
+ | 토큰 | 값 |
403
+ |------|------|
404
+ | `none` | 1 |
405
+ | `base` | 1.5 (150%) |
406
+
407
+ > KRDS는 접근성 위해 **최소 150%** 이상 권장.
408
+
409
+ ### 2.5 letter-spacing
410
+ | 토큰 | 값 |
411
+ |------|------|
412
+ | `none` | 0rem |
413
+ | `wide` | 0.1rem (= 1px) |
414
+
415
+ ### 2.6 텍스트 스타일 스케일 — PC
416
+
417
+ #### Display
418
+ | 스타일 | PC | Mobile | weight | line-height | letter-spacing |
419
+ |--------|-----|--------|--------|-------------|----------------|
420
+ | display-large | 6rem (60px) | 4.4rem (44px) | 700 | 150% | 1px |
421
+ | display-medium | 4.4rem (44px) | 3.2rem (32px) | 700 | 150% | 1px |
422
+ | display-small | 3.6rem (36px) | 2.8rem (28px) | 700 | 150% | 1px |
423
+
424
+ #### Heading (h1~h5 매핑)
425
+ | 스타일 | PC | Mobile | weight |
426
+ |--------|-----|--------|--------|
427
+ | heading-xlarge | 4rem (40px) | 2.8rem (28px) | 700 |
428
+ | heading-large | 3.2rem (32px) | 2.4rem (24px) | 700 |
429
+ | heading-medium | 2.4rem (24px) | 2.2rem (22px) | 700 |
430
+ | heading-small | 1.9rem (19px) | 1.9rem (19px) | 700 |
431
+ | heading-xsmall | 1.7rem (17px) | 1.7rem (17px) | 700 |
432
+ | heading-xxsmall | 1.5rem (15px) | 1.5rem (15px) | 700 |
433
+
434
+ #### Body (본문)
435
+ | 스타일 | PC | Mobile | weight |
436
+ |--------|-----|--------|--------|
437
+ | body-large | 1.9rem (19px) | 1.9rem (19px) | 400 |
438
+ | body-large-bold | 1.9rem (19px) | 1.9rem (19px) | 700 |
439
+ | **body-medium** | **1.7rem (17px)** | **1.7rem (17px)** | **400 (기본 본문)** |
440
+ | body-medium-bold | 1.7rem (17px) | 1.7rem (17px) | 700 |
441
+ | body-small | 1.5rem (15px) | 1.5rem (15px) | 400 |
442
+ | body-small-bold | 1.5rem (15px) | 1.5rem (15px) | 700 |
443
+ | body-xsmall | 1.3rem (13px) | 1.3rem (13px) | 400 |
444
+ | body-xsmall-bold | 1.3rem (13px) | 1.3rem (13px) | 700 |
445
+
446
+ #### Label (UI 레이블)
447
+ | 스타일 | PC/Mobile | weight |
448
+ |--------|-----------|--------|
449
+ | label-large | 1.9rem (19px) | 400 |
450
+ | label-medium | 1.7rem (17px) | 400 |
451
+ | label-small | 1.5rem (15px) | 400 |
452
+ | label-xsmall | 1.3rem (13px) | 400 |
453
+
454
+ #### Navigation (시맨틱)
455
+ | 토큰 | PC | Mobile |
456
+ |------|-----|--------|
457
+ | nav-title-medium | 2.4rem | 2.2rem |
458
+ | nav-title-small | 1.9rem | 1.9rem |
459
+ | nav-depth-medium-bold | 1.7rem (700) | 1.7rem (700) |
460
+ | nav-depth-medium | 1.7rem (400) | 1.7rem (400) |
461
+ | nav-depth-small-bold | 1.5rem (700) | 1.5rem (700) |
462
+ | nav-depth-small | 1.5rem (400) | 1.5rem (400) |
463
+
464
+ > letter-spacing은 Display는 1px, 그 외 기본 0px.
465
+ > line-height는 모두 150% 일관 적용.
466
+
467
+ ---
468
+
469
+ ## 3. 간격 (Spacing) — 8-point grid
470
+
471
+ ### 3.1 Primitive number 스케일 (전체 22단계)
472
+ > 모든 값은 `rem` (1rem = 10px). 8-point grid 베이스이지만 fine-grained 조절 위해 4/2 단위도 포함.
473
+
474
+ | primitive | rem | px |
475
+ |-----------|-----|-----|
476
+ | 0 | 0rem | 0px |
477
+ | 1 | 0.1rem | 1px |
478
+ | 2 | 0.2rem | 2px |
479
+ | 3 | 0.4rem | 4px |
480
+ | 4 | 0.6rem | 6px |
481
+ | 5 | 0.8rem | 8px |
482
+ | 6 | 1.0rem | 10px |
483
+ | 7 | 1.2rem | 12px |
484
+ | 8 | 1.6rem | 16px |
485
+ | 9 | 2.0rem | 20px |
486
+ | 10 | 2.4rem | 24px |
487
+ | 11 | 2.8rem | 28px |
488
+ | 12 | 3.2rem | 32px |
489
+ | 13 | 3.6rem | 36px |
490
+ | 14 | 4.0rem | 40px |
491
+ | 15 | 4.4rem | 44px |
492
+ | 16 | 4.8rem | 48px |
493
+ | 17 | 5.6rem | 56px |
494
+ | 18 | 6.4rem | 64px |
495
+ | 19 | 7.2rem | 72px |
496
+ | 20 | 8.0rem | 80px |
497
+ | 21 | 9.6rem | 96px |
498
+ | max | 100rem | 1000px |
499
+
500
+ ### 3.2 Semantic gap (요소 간 간격)
501
+ | 토큰 | 참조 primitive | px |
502
+ |------|------|-----|
503
+ | gap-1 | number-2 | 2px |
504
+ | gap-2 | number-3 | 4px |
505
+ | gap-3 | number-5 | 8px |
506
+ | gap-4 | number-7 | 12px |
507
+ | gap-5 | number-8 | 16px |
508
+ | gap-6 | number-9 | 20px |
509
+ | gap-7 | number-10 | 24px |
510
+ | gap-8 | number-12 | 32px |
511
+ | gap-9 | number-14 | 40px |
512
+ | gap-10 | number-16 | 48px |
513
+ | gap-11 | number-18 | 64px |
514
+ | gap-12 | number-20 | 80px |
515
+
516
+ ### 3.3 Semantic padding
517
+ | 토큰 | 참조 primitive | px |
518
+ |------|------|-----|
519
+ | padding-1 | number-2 | 2px |
520
+ | padding-2 | number-3 | 4px |
521
+ | padding-3 | number-5 | 8px |
522
+ | padding-4 | number-6 | 10px |
523
+ | padding-5 | number-7 | 12px |
524
+ | padding-6 | number-8 | 16px |
525
+ | padding-7 | number-9 | 20px |
526
+ | padding-8 | number-10 | 24px |
527
+ | padding-9 | number-12 | 32px |
528
+ | padding-10 | number-14 | 40px |
529
+
530
+ ### 3.4 Semantic size-height (높이 — 버튼/입력 등 컴포넌트 기준)
531
+ | 토큰 | 참조 | px |
532
+ |------|------|-----|
533
+ | size-height-1 | number-5 | 8px |
534
+ | size-height-2 | number-8 | 16px |
535
+ | size-height-3 | number-9 | 20px |
536
+ | size-height-4 | number-10 | 24px |
537
+ | size-height-5 | number-12 | 32px |
538
+ | size-height-6 | number-14 | 40px |
539
+ | size-height-7 | number-16 | 48px |
540
+ | size-height-8 | number-17 | 56px |
541
+ | size-height-9 | number-18 | 64px |
542
+ | size-height-10 | number-19 | 72px |
543
+ | size-height-11 | number-20 | 80px |
544
+
545
+ ### 3.5 Layout 간격 — 반응형 (gap-layout)
546
+
547
+ #### Mobile (< 1024px)
548
+ | 토큰 | 참조 | px |
549
+ |------|------|-----|
550
+ | header-breadcrumb | number-8 | 16px |
551
+ | breadcrumb-h1 | number-12 | 32px |
552
+ | h1-h2 | number-12 | 32px |
553
+ | h2-h2 | number-14 | 40px |
554
+ | h2-h3 | number-10 | 24px |
555
+ | h3-h3 | number-12 | 32px |
556
+ | h3-h4 | number-8 | 16px |
557
+ | h4-h4 | number-10 | 24px |
558
+ | h4-h5 | number-7 | 12px |
559
+ | h5-h5 | number-8 | 16px |
560
+ | title-body-small | number-5 | 8px |
561
+ | title-body-medium | number-7 | 12px |
562
+ | title-body-large | number-9 | 20px |
563
+ | contents-footer | number-14 | 40px |
564
+ | left-contents | 0rem | 0px |
565
+ | contents-right | 0rem | 0px |
566
+ | text-text-large | number-8 | 16px |
567
+ | text-text-medium | number-7 | 12px |
568
+ | text-text-small | number-6 | 10px |
569
+ | image-text-small | number-8 | 16px |
570
+ | image-text-medium | number-9 | 20px |
571
+ | image-text-large | number-10 | 24px |
572
+
573
+ #### PC (≥ 1024px)
574
+ | 토큰 | 참조 | px |
575
+ |------|------|-----|
576
+ | header-breadcrumb | number-10 | 24px |
577
+ | breadcrumb-h1 | number-14 | 40px |
578
+ | h1-h2 | number-16 | 48px |
579
+ | h2-h2 | number-20 | 80px |
580
+ | h2-h3 | number-14 | 40px |
581
+ | h3-h3 | number-18 | 64px |
582
+ | h3-h4 | number-10 | 24px |
583
+ | h4-h4 | number-14 | 40px |
584
+ | h4-h5 | number-8 | 16px |
585
+ | h5-h5 | number-12 | 32px |
586
+ | title-body-small | number-8 | 16px |
587
+ | title-body-medium | number-9 | 20px |
588
+ | title-body-large | number-10 | 24px |
589
+ | contents-footer | number-18 | 64px |
590
+ | left-contents | number-18 | 64px |
591
+ | contents-right | number-14 | 40px |
592
+ | text-text-large | number-9 | 20px |
593
+ | text-text-medium | number-8 | 16px |
594
+ | text-text-small | number-7 | 12px |
595
+ | image-text-small | number-9 | 20px |
596
+ | image-text-medium | number-10 | 24px |
597
+ | image-text-large | number-12 | 32px |
598
+
599
+ ### 3.6 Card padding (반응형)
600
+ | 사이즈 | Mobile | PC |
601
+ |--------|--------|------|
602
+ | xsmall | 1.2rem (12px) | 1.6rem (16px) |
603
+ | small | 2rem (20px) | 2.4rem (24px) |
604
+ | medium | 2.4rem (24px) | 3.2rem (32px) |
605
+ | large | 2.4rem (24px) | 4rem (40px) |
606
+
607
+ ---
608
+
609
+ ## 4. 그리드 (Grid) & 콘텐츠 영역
610
+
611
+ ### 4.1 콘텐츠 영역 (Layout container)
612
+ | 토큰 | 값 | 비고 |
613
+ |------|------|------|
614
+ | `--krds-contents-size` | **1200px** | 콘텐츠 max-width |
615
+ | `--krds-contents-wrap-size` | **1248px** | 콘텐츠 + padding 양쪽 (1200 + 24×2) |
616
+ | `--krds-contents-padding-x` (PC) | **24px** | 1024px 이상 |
617
+ | `--krds-contents-padding-x` (Mobile) | **16px** | 1024px 미만 |
618
+
619
+ ### 4.2 스크린 마진 (좌우 마진)
620
+ | 사이즈 | 값 | 적용 |
621
+ |--------|------|------|
622
+ | large | 24px | 1024px 이상 |
623
+ | medium | 24px | 768px 이상 |
624
+ | small | 16px | 360px 이상 |
625
+
626
+ ### 4.3 그리드 거터 (Gutter)
627
+ | 사이즈 | 최소 | 최적 | 적용 |
628
+ |--------|------|------|------|
629
+ | large | 16px | 24px | 1024px 이상 |
630
+ | medium | 16px | 24px | 768px 이상 |
631
+ | small | 16px | 16px | 360px 이상 |
632
+
633
+ ### 4.4 컬럼 수
634
+ > KRDS 공식 페이지에서 명시된 정확한 컬럼 수치는 확인되지 않음. 일반 8-point grid 기반 12-column이 통상이지만, **KRDS는 컴포넌트 간 gap·padding을 모두 토큰화한 "토큰 기반 레이아웃" 방식이라 12/8/4 컬럼을 강제하지 않음** (관찰).
635
+ > ⚠ **공백 — UX팀 결정 필요**
636
+
637
+ ---
638
+
639
+ ## 5. 반응형 브레이크포인트 (Breakpoints)
640
+
641
+ > 출처: `resources/scss/common/_variables_for_code.scss` line 8-12
642
+
643
+ | 토큰 | 값 |
644
+ |------|------|
645
+ | `$breakpoint-small` | **360px** |
646
+ | `$breakpoint-medium` | **768px** |
647
+ | `$breakpoint-large` | **1024px** |
648
+ | `$breakpoint-xlarge` | **1280px** |
649
+ | `$breakpoint-xxlarge` | **1440px** |
650
+
651
+ ### 미디어 쿼리 mixin (출처: `mixins/_breakpoints.scss`)
652
+ | Mixin | 범위 |
653
+ |-------|------|
654
+ | `size-medium` | ~ 767px (모바일) |
655
+ | `size-medium-more` | 768px ~ |
656
+ | `size-medium-to-large` | 768 ~ 1023 (태블릿) |
657
+ | `size-large-less` | ~ 1023 (모바일+태블릿) |
658
+ | `size-large-more` | 1024 ~ |
659
+ | `size-large-to-xlarge` | 1024 ~ 1279 (소형 데스크톱) |
660
+ | `size-xlarge` | 1280 ~ |
661
+
662
+ ### 디바이스 분류 추정
663
+ - **Mobile**: ~ 767px
664
+ - **Tablet**: 768 ~ 1023
665
+ - **Desktop (Small)**: 1024 ~ 1279
666
+ - **Desktop**: 1280 ~ 1439
667
+ - **Desktop (Large)**: 1440 ~
668
+
669
+ ---
670
+
671
+ ## 6. 반경 (Border Radius)
672
+
673
+ > 출처: KRDS Shape 가이드 + transformed_tokens.json semantic.radius
674
+
675
+ ### 6.1 Semantic radius 토큰
676
+ | 토큰 | 참조 | px | 적용 컴포넌트 |
677
+ |------|------|-----|---------------|
678
+ | xsmall1 | number-2 | 2px | 인디케이터, 배지 |
679
+ | xsmall2 | number-2 | 2px | 프로그레스 바 |
680
+ | xsmall3 | number-2 | 2px | |
681
+ | small1 | number-3 | 4px | 칩, 체크박스 |
682
+ | small2 | number-3 | 4px | 라디오, 스위치 |
683
+ | small3 | number-3 | 4px | 태그 |
684
+ | medium1 | number-4 | 6px | 버튼 small |
685
+ | medium2 | number-4 | 6px | 버튼 medium, 입력 |
686
+ | medium3 | number-5 | 8px | 버튼 large, 셀렉트 |
687
+ | medium4 | number-5 | 8px | 페이지네이션 |
688
+ | large1 | number-6 | 10px | 카드 |
689
+ | large2 | number-6 | 10px | 다이얼로그 |
690
+ | xlarge1 | number-7 | 12px | 배너, 다이얼로그 |
691
+ | xlarge2 | number-7 | 12px | 바텀 시트 |
692
+ | max | number-max | 1000px | 완전 원형 (pill) |
693
+
694
+ ### 6.2 KRDS Shape 가이드 — 5단계 추상 그룹
695
+ | 그룹 | 컨테이너 크기 | 반경값 | 컴포넌트 예시 |
696
+ |------|---------------|--------|---------------|
697
+ | Xsmall | 8×8~16×16 | 2px | 인디케이터, 배지, 프로그레스 |
698
+ | Small | 20×20~32×32 | 4px | 칩, 체크박스, 라디오, 스위치, 태그 |
699
+ | Medium | 40×40~64×64 | 6~8px | 버튼, 입력, 셀렉트, 페이지네이션 |
700
+ | Large | 72×72~80×80 | 10px | 카드, 다이얼로그 |
701
+ | Xlarge | 96×96~120×120 | 12px (최대) | 배너, 다이얼로그, 바텀 시트 |
702
+
703
+ ### 6.3 반경 계산 공식
704
+ - "컨테이너 높이 × 1/8 (0.125) = radius"
705
+ - 홀수 결과는 더 높은 짝수로 반올림
706
+ - 짝수 권장, px 단위 사용
707
+
708
+ ---
709
+
710
+ ## 7. 그림자 (Shadow / Elevation)
711
+
712
+ > KRDS는 별도의 elevation-1/2/3 같은 추상 토큰 없이, 컴포넌트별로 그림자를 직접 정의함. 모든 그림자는 위 § 1.1의 `alpha-shadow1/2/3` 토큰을 조합하여 만듦.
713
+
714
+ ### 7.1 그림자 alpha (재인용)
715
+ - shadow1: `#0000000d` (5%)
716
+ - shadow2: `#00000014` (8%)
717
+ - shadow3: `#0000001f` (12%)
718
+
719
+ ### 7.2 컴포넌트별 그림자 정의 (Light 모드)
720
+
721
+ | 컴포넌트 토큰 | 값 |
722
+ |---------------|------|
723
+ | `--krds-modal--wrap-shadow` | `0 0 0.2rem 0 shadow2, 0 1.6rem 2.4rem 0 shadow3` |
724
+ | `--krds-help-panel--shadow` | `0 0 0.2rem 0 shadow2, 0 0.8rem 1.6rem 0 shadow3` |
725
+ | `--krds-contextual-help--popover-shadow` | `0 0 0.2rem 0 shadow2, 0 0.8rem 1.6rem 0 shadow3` |
726
+ | `--krds-critical-alerts--banner-shadow` | `0 0 0.2rem 0 shadow1, 0 0.4rem 0.8rem 0 shadow2` |
727
+ | `--krds-calendar--head-drop-down-shadow` | `0 0 0.2rem 0 shadow1, 0 0.4rem 0.8rem 0 shadow2` |
728
+ | `--krds-dropdown--menu-color-alpha-shadow` | (드롭다운용 — 정확 값은 _dropdown.scss 참조) |
729
+
730
+ ### 7.3 추상화 그림자 단계 (관찰)
731
+ - **Level-1 (subtle)**: `0 0 0.2rem 0 shadow1, 0 0.4rem 0.8rem 0 shadow2` — alert/banner/dropdown
732
+ - **Level-2 (medium)**: `0 0 0.2rem 0 shadow2, 0 0.8rem 1.6rem 0 shadow3` — popover/help panel
733
+ - **Level-3 (deep)**: `0 0 0.2rem 0 shadow2, 0 1.6rem 2.4rem 0 shadow3` — modal
734
+
735
+ ### 7.4 포커스 outline 그림자
736
+ | 토큰 | 값 |
737
+ |------|------|
738
+ | `--krds-box-shadow-outline` | `0 0 0 0.4rem var(--krds-light-color-border-primary)` |
739
+ | `--krds-box-shadow-outline-inset` | `inset 0 0 0 0.2rem var(--krds-light-color-border-primary)` |
740
+
741
+ > KRDS의 포커스 스타일: 4px 두께의 primary 색상 외곽선
742
+
743
+ ---
744
+
745
+ ## 8. 모션 (Motion / Transition)
746
+
747
+ > 출처: `_variables_for_code.scss` line 45-49
748
+
749
+ | 토큰 | 값 |
750
+ |------|------|
751
+ | `$transition-base` | `.4s ease-in-out` |
752
+ | `$transition-fade` | `opacity .4s linear` |
753
+ | `$transition-collapse` | `max-height .4s ease` |
754
+ | `$transition-collapse-width` | `width .4s ease` |
755
+
756
+ ### CSS 변수
757
+ - `--krds-transition-base`: `0.4s ease-in-out`
758
+ - `--krds-transition-fade`: `opacity 0.4s linear`
759
+ - `--krds-transition-collapse`: `max-height 0.4s ease`
760
+ - `--krds-transition-collapse-width`: `width 0.4s ease`
761
+
762
+ ### 추가 관찰 (modal SCSS)
763
+ - 모달 visibility: `transition: visibility .15s .3s, z-index 0s .3s, opacity .2s`
764
+
765
+ > ⚠ **공백** — KRDS는 별도의 motion-duration 스케일(예: motion-fast/medium/slow)을 정의하지 않음. 사실상 0.4s/0.4s/0.4s/0.4s 단일 값 + 0.15s/0.2s/0.3s 컴포넌트별 보조값이 전부. 인포마인드 UX팀이 motion 스케일을 별도 정의할지 결정 필요.
766
+
767
+ ---
768
+
769
+ ## 9. z-index 레이어
770
+
771
+ > 출처: 컴파일된 `component.css` 분석 (별도 토큰 정의 없음)
772
+
773
+ | 값 | 용도 (관찰) |
774
+ |-----|-------------|
775
+ | -1 | 모달 닫힘 상태, 가려진 레이어 |
776
+ | auto | 기본 |
777
+ | 1 | 일반 stacking |
778
+ | 2 ~ 5 | 컴포넌트 내부 stacking |
779
+ | 10 | 카드/리스트 hover 등 |
780
+ | 50, 60, 70, 71 | 푸터·헤더 sticky 등 |
781
+ | 100 | 헤더 등 fixed |
782
+ | 901 | 모달 wrap |
783
+ | 1000 | 백드롭 dim |
784
+ | 1010 | 모달 위 추가 레이어 |
785
+ | 1020 | 토스트/알림 |
786
+ | 10000 | 최상단 (TTS 등) |
787
+
788
+ > ⚠ **공백** — KRDS는 추상화된 z-index 토큰(예: `z-index-modal: 1000`)을 정의하지 않고 raw 값을 직접 사용. UX팀이 `z-index-{layer}` 토큰을 별도 정의 필요.
789
+
790
+ ---
791
+
792
+ ## 10. 컴포넌트 카탈로그 (KRDS 공식 컴포넌트 37+개)
793
+
794
+ > 출처: `https://www.krds.go.kr/html/site/component/component_summary.html` + GitHub `resources/scss/component/`
795
+
796
+ ### 10.1 카테고리별 목록
797
+
798
+ #### 정체성 (Identity)
799
+ - 공식 배너 (Masthead) — `_masthead.scss`
800
+ - 운영기관 식별자 (Identifier) — `_identifier.scss`
801
+ - 헤더 (Header) — `_header.scss`
802
+ - 푸터 (Footer) — `_footer.scss`
803
+
804
+ #### 탐색 (Navigation)
805
+ - 건너뛰기 링크 (Skip link) — `_skip_link.scss`
806
+ - 메인 메뉴 (Main menu) — `_main_menu.scss`
807
+ - 브레드크럼 (Breadcrumb) — `_breadcrumb.scss`
808
+ - 사이드 메뉴 (Side navigation) — `_side_navigation.scss`
809
+ - 콘텐츠 내 탐색 (In-page navigation) — `_in_page_navigation.scss`
810
+ - 페이지네이션 (Pagination) — `_pagination.scss`
811
+
812
+ #### 레이아웃 및 표현 (Layout & Presentation)
813
+ - 구조화 목록 (Structured list) — `_structured_list.scss`
814
+ - 긴급 공지 (Critical alerts) — `_critical_alerts.scss`
815
+ - 달력 (Calendar) — `_calendar.scss`
816
+ - 디스클로저 (Disclosure) — `_disclosure.scss`
817
+ - 모달 (Modal) — `_modal.scss`
818
+ - 배지 (Badge) — `_badge.scss`
819
+ - 아코디언 (Accordion) — `_accordion.scss`
820
+ - 이미지 (Image)
821
+ - 캐러셀 (Carousel) — `_carousel.scss`
822
+ - 탭 (Tab) — `_tab.scss`
823
+ - 표 (Table) — `_table.scss`
824
+ - 텍스트 목록 (Text list) — `_text_list.scss`
825
+ - 파비콘 (Favicon)
826
+
827
+ #### 액션 (Action)
828
+ - 링크 (Link)
829
+ - 버튼 (Button) — `_button.scss`
830
+ - 플로팅 버튼 (FAB)
831
+
832
+ #### 선택 (Selection)
833
+ - 라디오 버튼 (Radio button) — `_form_check.scss`
834
+ - 체크박스 (Checkbox) — `_form_check.scss`
835
+ - 셀렉트 (Select) — `_select.scss`
836
+ - 태그 (Tag) — `_tag.scss`
837
+ - 토글 스위치 (Toggle switch) — `_switch.scss`
838
+
839
+ #### 피드백 (Feedback)
840
+ - 단계 표시기 (Step indicator) — `_step_indicator.scss`
841
+ - 스피너 (Spinner) — `_spinner.scss`
842
+
843
+ #### 도움 (Help)
844
+ - 도움 패널 (Help panel) — `_help_panel.scss`
845
+ - 따라하기 패널 (Tutorial panel)
846
+ - 맥락적 도움말 (Contextual help) — `_contextual_help.scss`
847
+ - 코치마크 (Coach mark) — `_coach_mark.scss`
848
+ - 툴팁 (Tooltip) — `_tooltip.scss`
849
+ - 음성지원 (TTS) — `_tts.scss`
850
+
851
+ #### 입력 (Input)
852
+ - 날짜 입력 필드 (Date input) — `_input.scss`
853
+ - 텍스트 영역 (Textarea) — `_input.scss`
854
+ - 텍스트 입력 필드 (Text input) — `_input.scss`
855
+ - 파일 업로드 (File upload) — `_file_upload.scss`
856
+
857
+ #### 설정 (Settings)
858
+ - 언어 변경 (Language switcher) — `_language_switcher.scss`
859
+ - 화면 크기 조정 (Resize) — `_resize.scss`
860
+
861
+ #### 콘텐츠 (Content)
862
+ - 접근 가능한 미디어 (Accessible multimedia)
863
+ - 숨긴 콘텐츠 (Visually hidden)
864
+
865
+ #### 모바일 (Mobile-only)
866
+ - 범위 슬라이드 (Range slider)
867
+ - 뒤로가기 버튼 (Back button)
868
+ - 바텀시트 (Bottom sheet)
869
+ - 수량 토글 (Quantity toggle)
870
+ - 토스트 (Toast)
871
+ - 스낵바 (Snackbar)
872
+ - 탭바 (Tab bars)
873
+ - 스플래시 스크린 (Splash screen)
874
+
875
+ > 총 ~50개 컴포넌트 (KRDS 공식 카탈로그는 "37 컴포넌트"로 표시되나 모바일 컴포넌트 포함 시 50개 수준)
876
+
877
+ ### 10.2 버튼 (Button) — 상세 명세
878
+
879
+ #### Variant (4종)
880
+ 1. **primary** — 채움 / 가장 강조 액션
881
+ 2. **secondary** — primary.5 채움 + primary.50 border / 보조 액션
882
+ 3. **tertiary** — 투명 채움 + gray.60 border / 약한 액션
883
+ 4. **text** — 투명 + 투명 border / 텍스트 링크형
884
+
885
+ #### Size (5종)
886
+ | 사이즈 | size-height | padding-x | gap | radius |
887
+ |--------|-------------|-----------|-----|--------|
888
+ | xsmall | size-height-5 (32px) | padding-4 (10px) | gap-1 (2px) | small3 (4px) |
889
+ | small | size-height-6 (40px) | padding-5 (12px) | gap-1 (2px) | medium1 (6px) |
890
+ | medium | size-height-7 (48px) | padding-6 (16px) | gap-2 (4px) | medium2 (6px) |
891
+ | large | size-height-8 (56px) | padding-7 (20px) | gap-2 (4px) | medium3 (8px) |
892
+ | xlarge | size-height-9 (64px) | padding-8 (24px) | gap-2 (4px) | medium4 (8px) |
893
+
894
+ #### State
895
+ - default / hover / pressed / active / selected / disabled
896
+
897
+ > 다른 컴포넌트 상세 명세는 `https://www.krds.go.kr/html/site/component/component_NN_NN.html` 또는 `resources/scss/component/_*.scss`를 직접 참조.
898
+
899
+ ### 10.3 입력 필드 (Text input) — 핵심 명세
900
+
901
+ - 구성: 레이블 → 보조설명 → 입력박스 → 시스템메시지
902
+ - 요소 간 gap: **gap-3 (8px)**
903
+ - 입력박스 내부 padding: **padding-6 (16px)**
904
+ - 출처: KRDS 입력폼 가이드 페이지
905
+
906
+ ---
907
+
908
+ ## 11. 접근성 (Accessibility)
909
+
910
+ ### 11.1 준수 표준
911
+ - **W3C WCAG 2.1 Level AA 이상**
912
+ - 한국 KWCAG 2.1/2.2 (행정안전부 고시) 호환
913
+ - 출처: KRDS 디자이너 시작하기 페이지
914
+
915
+ ### 11.2 색상 대비
916
+ - 일반 텍스트: **4.5:1 이상** (AA)
917
+ - 큰 텍스트(18pt+ 또는 14pt bold+): **3:1 이상** (AA)
918
+ - 일반 텍스트 AAA: 7:1
919
+ - 큰 텍스트 AAA: 4.5:1
920
+ - **매직넘버 50 규칙**: KRDS 색상 단계에서 두 단계 차이가 50 이상이면 4.5:1 자동 충족 (예: gray.10 ↔ gray.60)
921
+
922
+ ### 11.3 아이콘 대비
923
+ - 기본 모드: 최소 **3:1**
924
+ - 고대비 모드: **7:1**
925
+
926
+ ### 11.4 본문 폰트 사이즈
927
+ - **최소 16px**, KRDS는 17px (body-medium) 채택
928
+
929
+ ### 11.5 line-height
930
+ - **최소 150%** (모든 KRDS 텍스트 토큰이 150%로 통일)
931
+
932
+ ### 11.6 포커스 스타일
933
+ - 모든 인터랙티브 요소에 outline 필수
934
+ - KRDS 기본: 4px primary 색상 외곽선 (`--krds-box-shadow-outline`)
935
+ - `:focus { outline: none }` 금지
936
+
937
+ ### 11.7 터치/클릭 영역
938
+ - KRDS 공식 페이지에서 명시적 수치 미확인. 단, 버튼 최소 사이즈 xsmall=32px / small=40px / medium=48px이며, **medium(48px)을 모바일 권장**으로 추정 (WCAG 권장 44×44px 충족).
939
+ - ⚠ **공백** — 명시적 "터치 타겟 최소 44×44px" 문구 출처 미확인. UX팀이 KRDS 위에 명시 추가 필요.
940
+
941
+ ### 11.8 키보드 네비게이션
942
+ - 모든 컴포넌트(모달/드롭다운/탭 등)는 Tab/Enter/Esc/방향키 지원 가이드 명시
943
+ - Skip Link 컴포넌트(`_skip_link.scss`) 필수 제공
944
+
945
+ ### 11.9 스크린 리더
946
+ - 모든 인터랙티브 요소에 적절한 aria-label/role/aria-live 등 ARIA 속성 사용
947
+ - 음성지원 TTS 컴포넌트 별도 제공
948
+ - "숨긴 콘텐츠" (Visually hidden) 컴포넌트 표준화
949
+
950
+ ### 11.10 고대비 모드
951
+ - KRDS는 light/high-contrast 두 모드를 시스템 차원에서 지원
952
+ - `prefers-contrast: more` 미디어 쿼리 + `[data-color-mode="high-contrast"]` 어트리뷰트 모두 활용 (관찰)
953
+
954
+ ---
955
+
956
+ ## 12. 1rem = 10px 트릭 권장 여부
957
+
958
+ ### 결론: **KRDS는 명시적으로 채택함** ✅
959
+
960
+ #### 출처 (직접 인용)
961
+ 파일: `resources/scss/common/_variables_for_code.scss` line 16
962
+ ```scss
963
+ $font-size-base: 62.5% !default; //10px 1rem으로 설정
964
+ ```
965
+
966
+ CSS 출력 (`common.css`):
967
+ ```css
968
+ --krds-font-size-base: 62.5%;
969
+ ```
970
+
971
+ #### 적용 증거
972
+ - KRDS의 모든 spacing/size primitive 값이 0.1rem 단위로 정의됨
973
+ - number-1 = 0.1rem (= 1px)
974
+ - number-2 = 0.2rem (= 2px)
975
+ - number-8 = 1.6rem (= 16px)
976
+ - 모든 폰트 크기도 rem 단위 (예: body-medium = 1.7rem = 17px, display-large = 6rem = 60px)
977
+ - 인포마인드 UX팀이 사용 중인 62.5% 트릭과 **완전 동일**
978
+
979
+ ---
980
+
981
+ ## 13. 토큰 네이밍 규칙
982
+
983
+ ### 13.1 형식
984
+ ```
985
+ --krds-{mode?}-{category}-{subcategory?}-{role}-{state?}
986
+ ```
987
+
988
+ ### 13.2 핵심 prefix
989
+ - 모든 CSS 변수: `--krds-` 접두사
990
+ - 모드: `light` / `high-contrast`
991
+ - 반응형: `mobile` / `pc`
992
+
993
+ ### 13.3 계층 (KRDS 공식 분류)
994
+ 1. **Primitive tokens** — 기초 디자인 속성 (직접 사용 X)
995
+ - 예: `--krds-light-color-primary-50`
996
+ 2. **Semantic tokens** — 의미·맥락 정의
997
+ - 예: `--krds-light-color-text-primary`
998
+ 3. **Component tokens** — 컴포넌트 전용 (코드에서 정의)
999
+ - 예: `--krds-button--primary-fill`
1000
+
1001
+ ### 13.4 컴포넌트 토큰 네이밍 패턴
1002
+ ```
1003
+ --krds-{component-name}--{theme/type/size/modifier}
1004
+ ```
1005
+ 예시:
1006
+ - `--krds-button--primary-fill`
1007
+ - `--krds-modal--wrap-shadow`
1008
+ - `--krds-calendar--head-drop-down-shadow`
1009
+ - 더블 하이픈 `--`로 컴포넌트명과 속성 구분
1010
+
1011
+ ### 13.5 색상 토큰 네이밍
1012
+ ```
1013
+ --krds-{mode}-color-{category}-{role}
1014
+ ```
1015
+ - 모드: `light` | `high-contrast`
1016
+ - 카테고리: `primary` | `secondary` | `gray` | `danger` | `warning` | `success` | `information` | `point` | `graphic` | `alpha` (primitive)
1017
+ - 카테고리: `text` | `background` | `surface` | `border` | `icon` | `link` | `button` | `input` | `action` | `divider` | `element` | `graphic` (semantic)
1018
+ - 단계 (primitive): 0/5/10/20/30/40/50/60/70/80/90/95/100
1019
+ - 역할 (semantic): basic/bolder/subtle/disabled/inverse 등
1020
+
1021
+ ### 13.6 단위 토큰 네이밍
1022
+ ```
1023
+ --krds-{type}-{step|name}
1024
+ ```
1025
+ - `--krds-radius-medium2`
1026
+ - `--krds-padding-6`
1027
+ - `--krds-gap-3`
1028
+ - `--krds-size-height-7`
1029
+
1030
+ ### 13.7 반응형 토큰 네이밍
1031
+ ```
1032
+ --krds-{mobile|pc}-{type}-{role}
1033
+ ```
1034
+ - `--krds-pc-font-size-body-medium`
1035
+ - `--krds-mobile-font-size-display-large`
1036
+ - `--krds-pc-gap-layout-h1-h2`
1037
+
1038
+ ---
1039
+
1040
+ ## 14. 모순/공백 메모
1041
+
1042
+ ### 14.1 KRDS와 전자정부 UI/UX 가이드 차이
1043
+ - **차이 없음**. uiux.egovframe.go.kr/guide/index.html은 KRDS와 동일한 콘텐츠를 호스팅함이 확인됨 (2026-04-30 기준 첫 검색결과 제목이 "KRDS"). 별도 보완 항목 없음.
1044
+
1045
+ ### 14.2 KRDS에 명시 안 된 항목 (UX팀 결정 필요)
1046
+
1047
+ | 항목 | 현황 | 권장 처리 |
1048
+ |------|------|------|
1049
+ | **Grid columns 수** | 12/8/4 컬럼 강제 안 함 (gap·padding 토큰화) | UX팀이 12-col 기본값 명시 |
1050
+ | **z-index 추상 토큰** | raw 값 직접 사용(1000/1010/1020 등) | `z-index-{header/modal/toast}` 토큰 정의 |
1051
+ | **Motion duration 스케일** | 0.4s/0.15s/0.2s/0.3s 단일·보조값만 | `motion-fast/medium/slow` 등 스케일 정의 |
1052
+ | **Easing 스케일** | `ease-in-out` / `linear` / `ease`만 사용 | `easing-emphasis/standard/decelerate` 등 정의 |
1053
+ | **Touch target 최소 사이즈** | 명시적 44px 문구 미확인 | UX팀이 44×44px 강제 명시 |
1054
+ | **Elevation 추상 토큰** | 컴포넌트별 직접 정의(`--krds-modal--wrap-shadow` 등) | `shadow-1/2/3` 추상 토큰 정의 |
1055
+ | **다크 모드** | high-contrast 모드만 존재. 일반 다크 모드는 없음 | 필요 시 별도 추가 |
1056
+ | **Brand 변형 토큰** | 확장형 가이드는 색상/모양 커스터마이즈 가능하다고만 명시 | UX팀 brand-* 토큰 별도 정의 |
1057
+
1058
+ ### 14.3 출처 미확인 항목
1059
+ - KRDS 사이트의 "이미지" 컴포넌트 상세 명세
1060
+ - 그리드 정확한 컬럼 수
1061
+ - 모션 duration 추상 스케일 (없음 — 사실상 단일 값)
1062
+
1063
+ ### 14.4 KRDS 자체의 한계
1064
+ - **컴포넌트 사이즈 명세는 SCSS 파일에서만 추출 가능** (KRDS 공식 사이트는 SPA로 렌더링되어 브라우저 자동화 없이 fetch만으로는 컴포넌트 명세 확인 어려움)
1065
+ - KRDS 공식 사이트의 디자인 토큰 페이지(style_07)는 동적 렌더링되어 토큰값이 HTML에 직접 노출되지 않음 → GitHub `tokens/transformed_tokens.json` 사용이 정공법
1066
+
1067
+ ---
1068
+
1069
+ ## 15. 참고 URL 목록
1070
+
1071
+ ### KRDS 공식
1072
+ - 메인: https://www.krds.go.kr/
1073
+ - 구버전(v0.4): https://v04.krds.go.kr/
1074
+ - 디자인 원칙: https://www.krds.go.kr/html/site/utility/utility_02.html
1075
+ - 색상 가이드: https://www.krds.go.kr/html/site/style/style_02.html
1076
+ - 타이포그래피 가이드: https://www.krds.go.kr/html/site/style/style_03.html
1077
+ - 형태(반경): https://www.krds.go.kr/html/site/style/style_04.html
1078
+ - 레이아웃(간격/그리드): https://www.krds.go.kr/html/site/style/style_05.html
1079
+ - 아이콘: https://www.krds.go.kr/html/site/style/style_06.html
1080
+ - 디자인 토큰: https://www.krds.go.kr/html/site/style/style_07.html
1081
+ - 디자인 토큰 전체 보기: https://www.krds.go.kr/html/site/style/style_07_popup.html
1082
+ - 컴포넌트 카탈로그: https://www.krds.go.kr/html/site/component/component_summary.html
1083
+ - 디자이너 시작하기: https://www.krds.go.kr/html/site/outline/outline_02.html
1084
+ - KRDS 소개: https://www.krds.go.kr/html/site/utility/utility_01.html
1085
+
1086
+ ### KRDS 공식 GitHub
1087
+ - 조직 페이지: https://github.com/KRDS-uiux
1088
+ - 메인 저장소: https://github.com/KRDS-uiux/krds-uiux
1089
+ - **토큰 JSON (이 문서의 hex/rem 값 원본 출처)**:
1090
+ - https://raw.githubusercontent.com/KRDS-uiux/krds-uiux/main/tokens/transformed_tokens.json
1091
+ - SCSS 변수 원본: https://raw.githubusercontent.com/KRDS-uiux/krds-uiux/main/resources/scss/common/_variables_for_code.scss
1092
+ - 브레이크포인트 mixin: https://raw.githubusercontent.com/KRDS-uiux/krds-uiux/main/resources/scss/common/mixins/_breakpoints.scss
1093
+ - 컴파일된 토큰 CSS: https://raw.githubusercontent.com/KRDS-uiux/krds-uiux/main/resources/css/token/krds_tokens.css
1094
+ - 컴포넌트 SCSS 디렉토리: https://github.com/KRDS-uiux/krds-uiux/tree/main/resources/scss/component
1095
+ - 컴포넌트 HTML 예제: https://github.com/KRDS-uiux/krds-uiux/tree/main/html/code
1096
+
1097
+ ### 전자정부 UI/UX 가이드 (KRDS와 동일 콘텐츠)
1098
+ - 메인: https://uiux.egovframe.go.kr/
1099
+ - 가이드: https://uiux.egovframe.go.kr/guide/index.html
1100
+
1101
+ ### 외부 분석 자료 (보조)
1102
+ - 디자인 나침반 — KRDS 분석: https://designcompass.org/2024/04/17/krds/
1103
+ - 플립커뮤니케이션즈 — KRDS 가이드 변경점: https://blog.pulip.com/디지털-정부-서비스를-위한-체계적-디자인-시스템-krds/
1104
+ - 나무위키 — 범정부 UI/UX 디자인 시스템: https://namu.wiki/w/범정부%20UI/UX%20디자인%20시스템
1105
+
1106
+ ---
1107
+
1108
+ ## 16. 수집 방법론 메모 (재현 가능성)
1109
+
1110
+ 이 문서의 수치는 다음 절차로 추출됨:
1111
+
1112
+ 1. **WebFetch로 KRDS 공식 페이지 접근**
1113
+ - 정적 콘텐츠(원칙, 컴포넌트 목록, 타이포 표) 추출 성공
1114
+ - 동적 토큰 표는 SPA 렌더링으로 fetch만으로 미확보 → GitHub 우회
1115
+
1116
+ 2. **GitHub `KRDS-uiux/krds-uiux` 저장소 발견 후 직접 다운로드**
1117
+ - `tokens/transformed_tokens.json` (88KB, 3389 라인) — 모든 hex/rem 값 원본
1118
+ - `resources/scss/common/_variables_for_code.scss` — 베이스 변수
1119
+ - `resources/scss/common/mixins/_breakpoints.scss` — 브레이크포인트
1120
+ - `resources/css/token/krds_tokens.css` — 컴파일된 CSS 변수
1121
+ - `resources/css/component/component.css` (11810 라인) — z-index/그림자 추출
1122
+
1123
+ 3. **jq로 JSON 토큰 추출**, grep으로 z-index/box-shadow 추출.
1124
+
1125
+ 4. **재현 가능**: 위 URL들을 다시 fetch하면 동일한 값 확보 가능.