@iyulab/components 1.15.0 → 1.20.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 (41) hide show
  1. package/CHANGELOG.md +367 -0
  2. package/dist/_virtual/_glob-assets_raw/dark.css.e8ac080d.js +1 -1
  3. package/dist/_virtual/_glob-assets_raw/light.css.637cb2f8.js +1 -1
  4. package/dist/components/UElement.styles.js +8 -3
  5. package/dist/components/alert/UAlert.styles.js +18 -9
  6. package/dist/components/badge/UBadge.d.ts +2 -1
  7. package/dist/components/badge/UBadge.styles.js +30 -2
  8. package/dist/components/breadcrumb-item/UBreadcrumbItem.styles.js +1 -1
  9. package/dist/components/button/UButton.d.ts +22 -3
  10. package/dist/components/button/UButton.styles.js +107 -16
  11. package/dist/components/card/UCard.styles.js +2 -2
  12. package/dist/components/carousel/UCarousel.styles.js +2 -2
  13. package/dist/components/checkbox/UCheckbox.d.ts +2 -1
  14. package/dist/components/checkbox/UCheckbox.styles.js +42 -9
  15. package/dist/components/copy-button/UCopyButton.styles.js +2 -2
  16. package/dist/components/dialog/UDialog.styles.js +1 -1
  17. package/dist/components/drawer/UDrawer.styles.js +1 -1
  18. package/dist/components/field/UField.styles.js +2 -2
  19. package/dist/components/icon-button/UIconButton.styles.js +1 -1
  20. package/dist/components/input/UInput.styles.js +9 -9
  21. package/dist/components/menu-item/UMenuItem.styles.js +2 -2
  22. package/dist/components/option/UOption.styles.js +1 -1
  23. package/dist/components/progress-bar/UProgressBar.styles.js +5 -5
  24. package/dist/components/progress-ring/UProgressRing.styles.js +5 -5
  25. package/dist/components/radio/URadio.styles.js +2 -2
  26. package/dist/components/rating/URating.styles.js +2 -2
  27. package/dist/components/select/USelect.styles.js +11 -9
  28. package/dist/components/slider/USlider.styles.js +11 -3
  29. package/dist/components/spinner/USpinner.d.ts +2 -1
  30. package/dist/components/spinner/USpinner.styles.js +9 -1
  31. package/dist/components/split-panel/USplitPanel.styles.js +1 -1
  32. package/dist/components/switch/USwitch.styles.js +7 -7
  33. package/dist/components/tab-panel/UTabPanel.styles.js +2 -2
  34. package/dist/components/tag/UTag.d.ts +6 -1
  35. package/dist/components/tag/UTag.styles.js +55 -2
  36. package/dist/components/textarea/UTextarea.styles.js +6 -6
  37. package/dist/components/tooltip/UTooltip.styles.js +1 -1
  38. package/dist/components/tree-item/UTreeItem.styles.js +1 -1
  39. package/dist/styles/dark.css +43 -13
  40. package/dist/styles/light.css +77 -19
  41. package/package.json +4 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,372 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.20.0] - 2026-08-03
4
+
5
+ > ⚠**이 릴리스는 시각이 바뀐다.** 아래 항목들은 값을 고르는 문제가 아니라 **관계가
6
+ > 어긋나 있던 것**을 맞춘 것이며, 그 결과 버튼 폭·높이 등이 움직인다.
7
+
8
+ ### Added
9
+
10
+ - **`color` 속성이 역할 값을 받는다** — `primary` · `info` · `success` · `warning` · `danger`.
11
+ 대상: `u-button` · `u-tag`(→ `u-chip`) · `u-badge` · `u-checkbox` · `u-spinner`.
12
+
13
+ ```html
14
+ <u-button color="danger">삭제</u-button> <!-- 의미: 파괴적 동작 -->
15
+ <u-button color="red">삭제</u-button> <!-- 의미: 빨강. 리브랜딩해도 빨강 -->
16
+ ```
17
+
18
+ 종전에는 `color` 가 **원색 이름만** 받았다. 브랜드가 빨강인 제품에서는 *브랜드*와
19
+ *위험*이 같은 이름이 되고, 의미가 색에 종속된다.
20
+
21
+ 두 축은 성질이 반대이며 **병존**한다:
22
+
23
+ | 축 | 값 | 리브랜딩 | 대비 |
24
+ |---|---|---|---|
25
+ | **역할** | `primary` `info` `success` `warning` `danger` | 따라온다 | 계약 검사가 지킨다 |
26
+ | **장식** | `blue` `green` `red` `orange` `teal` `cyan` `purple` `pink` | 의도적 면역 | 소비자가 고른 색 |
27
+
28
+ ★**역할 값은 전경색을 함께 가져온다.** 장식 축은 면 위 글자가 흰색 고정인데, 역할 축은
29
+ `--u-{role}-txt-color` 를 쌍으로 받는다 — 그래서 `warning` 이 노란 면 위에 **검은 글자**로
30
+ 렌더된다. 같은 표시가 **바탕 위**에 서는 자리(`variant="link"` · `u-checkbox[variant="outline"]` ·
31
+ `u-spinner`)는 면 단이 아니라 `-strong` 을 읽는다. 면 단을 바탕 위 글자로 쓰면 다크에서
32
+ **3.07** 로 AA 미달이기 때문이다.
33
+
34
+ ⚠**순수 가산 — 장식 값의 렌더는 변하지 않는다.** 계산색 대조로 실증했다(기존 장식
35
+ 매트릭스 브라우저 테스트 통과).
36
+
37
+ - **대비 계약 단언 1종** — `--u-{role}-color-strong` on `--u-{role}-bg-color`(유채색 면 위의
38
+ **그 역할 글자**). `u-tag` 의 `surface`/`filled` 가 쓰는 실제 조합이며 두 테마 10/10 통과
39
+ (최저 다크 warning 4.58). 종전 단언은 같은 면 위의 **중립 본문**만 재고 있었다 — 태그는
40
+ 의미를 색으로도 전달하므로 중립으로 대체할 수 없어 요구가 다르다.
41
+
42
+ - **대비 계약이 표면 3종을 교차 검증한다** — 중립 텍스트 단을 `--u-bg-color` 하나가 아니라
43
+ `-raised`·`-active` 까지 대조한다. `--u-bg-color-raised` 는 1.18.0 신설인데 **면 축을
44
+ 늘리면서 검사의 곱집합을 늘리지 않아** 그 조합이 한 번도 측정되지 않았다.
45
+
46
+ ★현재 미달 4칸(`--u-txt-color-weak` × `-raised`/`-active`, 두 테마)은 **측정값으로 핀**해
47
+ 감시한다 — 값을 고치는 것은 게시된 전 컴포넌트의 보조 텍스트를 움직이는 사람 판단이다.
48
+ 해소안은 실측해 두었다(양 테마 한 단씩 → 6/6 통과, 다만 보조↔본문 위계비가 다크
49
+ 2.33 → 1.46 으로 약해진다).
50
+
51
+ - ★**높이(elevation) 축 — `--u-shadow-sm` · `-md` · `-lg` · `-xl`**
52
+
53
+ 그림자 **색** 축(`--u-shadow-color-*`)은 있었지만 **높이** 축이 없었다. 그래서
54
+ 컴포넌트가 그림자를 리터럴로 썼고, 같은 리듬을 의도한 자리에 **서로 다른 값 11가지**가
55
+ 생겼다 — `u-card` 는 `0 2px 8px rgba(0,0,0,.1)`, `u-carousel` 은 같은 형태에 `.15`.
56
+
57
+ ⚠**더 큰 문제는 그 리터럴들이 테마를 몰랐다는 것이다.** `rgba(0,0,0,.1)` 은 다크
58
+ 바탕에서 사실상 보이지 않는다 — **다크에서 카드·드롭다운의 높이 표현이 없었다.**
59
+ 색 축은 다크에서 3배 가까이 진한 값을 갖고 있었는데(`.12` → `.35`) 아무도 읽지 않았다.
60
+
61
+ ```
62
+ 라이트 다크 쓰이는 곳
63
+ sm 0 1px 3px rgba(0,0,0,.08) 0 1px 3px rgba(0,0,0,.25) 탭 · 슬라이더/스위치 손잡이
64
+ md 0 2px 8px rgba(0,0,0,.12) 0 2px 8px rgba(0,0,0,.35) 카드 · 캐러셀 · 메뉴 항목
65
+ lg 0 4px 12px rgba(0,0,0,.16) 0 4px 12px rgba(0,0,0,.45) 드롭다운 · 알림 · hover 상승
66
+ xl 0 6px 18px rgba(0,0,0,.24) 0 6px 18px rgba(0,0,0,.60) 대화상자 · 드로어 · 툴팁
67
+ ```
68
+
69
+ **소비자 영향**: 15곳의 그림자가 이 4단으로 수렴하므로 일부 컴포넌트의 그림자가
70
+ 미세하게 바뀐다(대부분 알파 ±0.04). **다크에서는 눈에 띄게 진해진다** — 종전이
71
+ 결손 상태였다. 개별 조정이 필요하면 토큰을 덮으면 된다.
72
+
73
+ ⚠**예외 하나**: `u-alert[variant="glass"]` 는 이 축을 쓰지 않는다 — 그 값은 유리
74
+ 질감 레시피의 일부이지 높이가 아니다(주석에 명시).
75
+
76
+ ### Changed
77
+
78
+ - **라이브러리가 스스로 그리는 숫자를 고정폭 자릿수로 낸다** — `u-slider` 의 값 표시와
79
+ 썸 툴팁, `u-select` 의 개수 표시(`n / m`).
80
+
81
+ 셋 다 **제자리에서 값이 바뀌는** 자리다. 비례폭 숫자는 자릿수가 바뀔 때마다 폭이
82
+ 달라져 옆 요소를 밀어내므로, 슬라이더를 끌 때 값이 흔들리고 선택할 때마다 라벨 줄이
83
+ 움직였다.
84
+
85
+ ⚠**눈금 라벨과 입력 필드는 대상이 아니다** — 눈금 라벨은 값이 바뀌지 않고 각자 제
86
+ 위치에 정렬되며, 입력 필드는 소비자가 정할 몫이다(`u-input[type="number"]` 의
87
+ `::part(input)` 오버라이드 예시가 문서에 있다).
88
+
89
+ - ★**`u-button` 의 크기 축이 실제로 비례하게 됐다.**
90
+
91
+ 크기 축은 `font-size` 하나로 움직이고 나머지가 `em` 으로 따라오는 설계인데,
92
+ **두 값이 그 비례에서 빠져 있었다.**
93
+
94
+ ```
95
+ ⑴ 가로 여백 = 세로 여백 (둘 다 0.5em) → 글자가 테두리에 붙었다
96
+ ⑵ min-height 없음 → 아이콘 버튼과 글자 버튼의 높이가 달랐다
97
+ ```
98
+
99
+ ⑵ 는 툴바에서 눈에 띄는 어긋남이었다 — 실측(같은 `size`):
100
+
101
+ ```
102
+ sm md lg
103
+ 글자 버튼 32px 37px 42px
104
+ 아이콘 버튼 30px 32px 34px ← 계단의 기울기가 달라 size 를 올릴수록 벌어진다
105
+ ```
106
+
107
+ **바뀐 것**
108
+
109
+ | | 종전 | 1.20.0 |
110
+ |---|---|---|
111
+ | `--btn-padding-inline` 기본값 | `0.5em` | **`1em`** |
112
+ | 내부 버튼 `min-height` | 없음 | `calc(1.5em + 2 × --btn-padding-block + 2px)` |
113
+
114
+ ★**최소높이는 상수가 아니라 글자 버튼의 자연 높이를 그대로 다시 쓴 식**이다
115
+ (줄높이 + 상하 여백 ×2 + 테두리 ×2). 그래서 **글자 버튼의 높이는 변하지 않고**
116
+ 아이콘 버튼만 같은 높이로 올라온다. 상하 여백을 덮어도 둘이 함께 움직인다.
117
+
118
+ **소비자 영향**: 버튼이 **가로로 넓어진다**(md 기준 좌우 7px → 14px). 좁은 폭을
119
+ 유지해야 하면 `--btn-padding-inline` 을 덮으면 된다 — 높이는 그 값에서 파생되지
120
+ 않으므로 영향받지 않는다.
121
+
122
+ ### Fixed
123
+
124
+ - ★**다크 테마에서 입력 오류·포커스를 테두리로 알 수 없던 문제** — 상태 테두리 두 토큰이
125
+ **면**의 단(`-color`)을 읽고 있었다. 테두리는 면이 아니라 **면 위에 그리는 선**이므로
126
+ `-strong` 이 맞고, 그 어긋남이 다크에서 WCAG 1.4.11(비텍스트 3.0) 미달로 나타났다.
127
+
128
+ ```
129
+ 입력면 위 대비 라이트 다크
130
+ --u-input-border-color-focus → -strong 4.60 → 5.75 2.74 ✗ → 4.74 ✓
131
+ --u-input-border-color-invalid → -strong 4.98 → 5.62 2.44 ✗ → 4.34 ✓
132
+ ```
133
+
134
+ 두 테마 모두 **더 잘 보이는 쪽으로만** 움직인다. 영향 범위는 `u-input` · `u-textarea` ·
135
+ `u-select` · `u-checkbox` · `u-switch` 의 포커스/오류 표시다.
136
+
137
+ ⚠**리브랜딩 시**: 상태 테두리는 이제 `--u-primary-color-strong` · `--u-danger-color-strong`
138
+ 을 따른다. 역할당 5단을 모두 재정의하는 정규 경로를 쓰고 있다면 조치가 필요 없다.
139
+ `--u-primary-color` **한 단만** 덮고 있었다면 포커스 테두리가 따라오지 않으므로
140
+ `-strong` 도 함께 덮을 것.
141
+
142
+ - **역할 축 검사에 구멍이 있었다** — `role-token-layer.test.ts` 의 장식 축 면제 판정이
143
+ `[color=…]` 전체였다. 역할 값도 같은 형태의 선택자를 쓰므로, **역할 규칙이 팔레트를
144
+ 직접 읽어도 검사가 침묵**했다. 면제를 장식 값에만 준다.
145
+
146
+ - ★**다크 테마에서 키보드 포커스 링이 잘 보이지 않던 문제** — 모든 컴포넌트에 적용된다.
147
+
148
+ 포커스 링(`UElement` 의 `:focus-visible`)이 `--u-primary-color-weak` 를 읽고 있었다.
149
+ 포커스 링은 **바탕 위에 그리는 그래픽**이라 바탕 기준으로 재야 하는데, 그 단은
150
+ **다크에서 2.31**(WCAG 1.4.11 기준 3.0)이다. `-strong` 으로 옮겨 라이트 5.75 ·
151
+ 다크 5.32 로 두 테마 모두 통과한다.
152
+
153
+ - ★**바탕·트랙 위 그래픽이 `-weak` 를 읽던 자리를 `-strong` 으로 옮겼다.**
154
+
155
+ ```
156
+ 진행바 · 진행 링 (5상태 각각) 트랙(neutral-200) 위에서 재야 한다
157
+ 별점 기호 라이트에서 노랑(#FFEB3B) 대 흰 바탕 = 1.22
158
+ 스플리터 활성 표시
159
+ 포커스 링 (위 항목)
160
+ ```
161
+
162
+ 실측(비텍스트 3.0 기준, 5역할 × 2테마 = 10칸):
163
+
164
+ ```
165
+ 바탕 위 트랙 위
166
+ -weak 4칸 통과 1칸 통과 ← 종전
167
+ -strong 10칸 통과 10칸 통과 ← 1.20.0 (최저 4.34)
168
+ ```
169
+
170
+ ⚠**진행바·진행 링 안에도 비대칭이 있었다** — 같은 컴포넌트인데 `success`·`error` 는
171
+ `--u-*-color`(면의 단), `warning`·`info` 는 `--u-*-color-weak` 를 읽고 있었다.
172
+ 다섯 상태가 이제 같은 단을 읽는다.
173
+
174
+ ⚠**시각 변경**: 진행바·진행 링·별점이 진해진다. 특히 **라이트에서 별점이
175
+ 노랑 → 어두운 호박**으로 바뀐다. 종전 값(#FFEB3B)은 흰 바탕에서 1.22 였고, 빈 별
176
+ (`--rating-symbol-off-color`, #E0E0E0)과의 구분도 사실상 없었다 — *별점을 읽을 수
177
+ 없는 상태*였다. 금색 별이 필요하면 `--rating-symbol-color` 를 덮으면 된다.
178
+
179
+ ⚠**`u-tag` 의 테두리(`--tag-hue-line`)는 옮기지 않았다** — 그 선은 바탕이 아니라
180
+ **태그 자신의 면을 두르며**, 장식 축이 같은 자리에서 `shade-300` 을 쓰므로 역할 축만
181
+ 옮기면 두 축의 대응이 깨진다. "장식 테두리가 1.4.11 대상인가"는 별개의 판단이다.
182
+
183
+ ### Documentation
184
+
185
+ - **비라틴 문자권(CJK·태국어·아랍어) 폰트 스택 지침** — `docs/theming.md` 에 절을 신설했다.
186
+ `--u-font-base` 는 시스템 UI 스택이라 **대부분의 앱은 조정할 필요가 없다**. 문제가
187
+ 드러나는 것은 **브라우저 UI 언어와 콘텐츠 문자가 다른 경우**로, 그때 스택이
188
+ `Helvetica`/`Arial` 까지 떨어지고 브라우저가 글자마다 대체 서체를 골라 줄이 고르지
189
+ 않게 보인다. `:root:lang(…)` 별 권장 스택 6종과 **순서 규칙**(플랫폼 UI 폰트를 앞에
190
+ 유지하고 명시 서체를 그 뒤 대비책으로), 그리고 `--u-font-mono` 에 CJK 커버리지가
191
+ 없다는 점을 함께 적었다.
192
+
193
+ ## [1.18.0] - 2026-08-02
194
+
195
+ ### Added
196
+
197
+ - **`--u-bg-color-raised`** — 바탕에 인접해 있으면서 한 단 구분되는 **크롬 면**
198
+ (툴바 · 표 헤더 · 푸터 · 페이지네이션).
199
+
200
+ ```
201
+ 라이트 neutral-50 (#FAFAFA) 다크 neutral-300 (#2A2A2A)
202
+ ```
203
+
204
+ 종전에는 배경 역할 토큰이 **상호작용 상태 이름뿐**이었다(`-hover`·`-active`·
205
+ `-disabled`). *"바탕보다 한 단 올라온 면"* 을 뜻할 수단이 없어, 소비 패키지가
206
+ `:host-context([theme="dark"])` 로 다크만 손으로 보정했다 — 그리고 그 선택자는
207
+ **Firefox·Safari 에서 미지원**이라 그 브라우저에서는 다크가 적용된 적이 없었다.
208
+
209
+ ⚠**`--u-panel-bg-color` 와 다르다.** 그쪽은 *떠 있는* 패널(카드·대화상자·메뉴)이라
210
+ 라이트에서 페이지와 같은 흰색이고 그림자가 높이를 나른다. 크롬 면은 그림자가 없어
211
+ 라이트에서도 틴트가 필요하다.
212
+
213
+ ⚠**한 단만 정의한다.** 두 단째의 실측 수요는 라이트 한쪽뿐이었고, 다크에서는 소비 측
214
+ 오버라이드가 두 값을 이미 같은 단으로 합치고 있었다. 상호작용 상태 축에 높이를 얹지도
215
+ 않는다 — 의미가 어긋난다.
216
+
217
+ ## [1.17.0] - 2026-08-02
218
+
219
+ ### Fixed
220
+
221
+ - ★**알림(`u-alert`) 아이콘이 알림 배경 위에서 보이지 않던 문제 — 라이트 4/4 미달.**
222
+
223
+ ```
224
+ 라이트 (기준 3.0) error 2.31 ✗ warning 1.48 ✗ info 2.63 ✗ success 2.50 ✗
225
+ 다크 3.18 ✓ 3.80 ✓ 3.48 ✓ 3.95 ✓
226
+ ```
227
+
228
+ 원인은 **전경이 아니라 배경**이었다. 알림 배경이 `--u-*-color-weakest`(라이트
229
+ shade-200)였는데, 그 단은 **진행바 버퍼 같은 그래픽**에도 쓰인다 — 그래픽으로 보이려면
230
+ 진해야 하고 면으로 쓰이려면 옅어야 한다. 두 요구를 한 단에 겹쳐 둔 것이 결함의 뿌리다.
231
+
232
+ ⇒ 알림 배경을 **면 토큰 `--u-*-bg-color`** 로 옮겼다. 두 테마 **4/4 통과**(4.58~7.00).
233
+ `-weakest` 는 그래픽 단으로 남는다.
234
+
235
+ **라이트 알림 배경이 옅어진다** — error `#EF9A9A` → `#FFEBEE` · info `#90CAF9` →
236
+ `#E3F2FD` · success `#A5D6A7` → `#E8F5E9` (warning 은 `#FFF59D` 유지).
237
+
238
+ - **라이트 `--u-warning-color-strong` 이 어떤 배경에서도 읽히지 않던 문제.**
239
+ yellow-700(`#FBC02D`)은 흰 바탕 1.66 · 노란 면 위 1.61 이다. 노랑 램프는 900 까지도
240
+ 2.65 로 미달이고 **1000(`#8A4A00`)에서 처음 6.86** 이 된다.
241
+
242
+ ⇒ 라이트만 `yellow-1000` 으로 옮겼다(다크는 yellow-700 = 5.30 으로 이미 정상).
243
+ 경고 아이콘·문구가 **밝은 노랑에서 어두운 호박색으로** 바뀐다 — 이 단의 용도는 면이
244
+ 아니라 글자·아이콘이므로 색상보다 가독성이 앞선다.
245
+
246
+ ⇒ 1.16.0 이 대비 검사에서 **제외해 두었던 라이트 warning 이 제외 없이 통과**한다.
247
+
248
+ ### Added
249
+
250
+ - **`--u-warning-bg-color`** — 1.16.0 에서 유일하게 빠져 있던 유채색 면 토큰.
251
+
252
+ 당시 판정은 *"라이트 황색 틴트가 Δ0.071 로 거의 보이지 않아 세기를 맞출 단 짝이 없다"*
253
+ 였는데, 그 측정은 **shade-0 짝만** 재고 있었다. 노랑만 한 단 내려 잡으면 라이트 쪽
254
+ 세기가 맞는다 — 바탕 대비 휘도 델타 실측:
255
+
256
+ ```
257
+ blue-0 0.131 · red-0 0.132 · green-0 0.117 · yellow-200 0.110 (yellow-0 은 0.027)
258
+ ```
259
+
260
+ 라이트 `yellow-200` / 다크 `yellow-100`. ⚠단 이름이 계열마다 다른 것은 이 층의 정상
261
+ 상태다 — 라이트 팔레트는 휘도 순이 아니라 같은 단 번호가 같은 세기를 뜻하지 않는다.
262
+
263
+ - **대비 계약 단언 2종** — `상태 아이콘이 그 상태의 면 위에서 보인다`(비텍스트 3.0)와
264
+ 면 토큰 위의 본문(5역할 전부). 1.16.0 이 측정값으로만 기록해 둔 항목이 단언으로 승격됐다.
265
+
266
+ ### Known issues
267
+
268
+ 1.16.0 의 다음 둘은 그대로다 — **다크 `-weak` 의 구조적 충돌**(바탕 위 그래픽과 흰 글자를
269
+ 받는 면이 팔레트의 반대쪽을 요구한다)과 **`--u-border-color-strong` 3.0 미달**.
270
+ 알림 테두리(`-weaker`)도 면 위에서 3.0 에 못 미치지만(1.13~2.61), 알림은 상호작용
271
+ 컴포넌트가 아니라 WCAG 1.4.11 적용 여부 자체가 판단을 요구하므로 이번에 손대지 않았다.
272
+
273
+ ## [1.16.0] - 2026-08-02
274
+
275
+ ### Fixed
276
+
277
+ - ★**역할 토큰의 유채색 단이 WCAG AA 를 받치지 못하던 문제 — 두 테마 모두.**
278
+
279
+ 1.15.0 은 *"라이트 shade-600 위의 흰 글자가 8색 중 6색 미달, 다크는 8/8 통과"* 로
280
+ 기록했다. 그 측정은 **한 방향만** 재고 있었다 — 같은 토큰이 **바탕 위의 글자**로도
281
+ 쓰이는데, 그쪽은 다크가 미달이었다:
282
+
283
+ ```
284
+ 바탕 위의 글자 (기준 4.5) 면 위의 흰 글자 (기준 4.5)
285
+ 라이트 --u-primary-color 3.68 ✗ 라이트 3.68 ✗
286
+ 다크 --u-primary-color 3.07 ✗ 다크 6.09 ✓
287
+ 다크 --u-danger-color 2.74 ✗ 다크 6.83 ✓
288
+ ```
289
+
290
+ 실제로 깨져 있던 자리: **입력 오류 문구**(`u-field`·`u-checkbox`·`u-switch`),
291
+ **링크 버튼**(`variant="link"` 쉬는 상태 3.12), **복사 완료 표시**, hover/active
292
+ 텍스트·아이콘.
293
+
294
+ ⇒ **단을 대비로 다시 골랐다.** 단 번호가 아니라 측정이 기준이다:
295
+
296
+ | 토큰 | 라이트 | 다크 |
297
+ |---|---|---|
298
+ | `--u-primary-color` · `--u-info-color` | blue-600 → **blue-700** (4.60) | 변경 없음 (면, 6.09) |
299
+ | `--u-primary-color-strong` · `--u-info-color-strong` | blue-700 → **blue-800** (5.75) | blue-700 → **blue-800** (5.32) |
300
+ | `--u-danger-color` | red-600 → **red-700** (4.98) | 변경 없음 (면, 6.83) |
301
+ | `--u-danger-color-strong` | red-700 → **red-800** (5.62) | red-700 → **red-800** (4.87) |
302
+ | `--u-success-color` | green-600 → **green-800** (5.13) | 변경 없음 (면, 4.93) |
303
+ | `--u-success-color-strong` | green-700 → **green-900** (7.87) | 변경 없음 (5.15) |
304
+
305
+ ⚠**계열마다 단이 다르고 테마마다 다르다.** Material 램프는 휘도가 아니라 색상 기준으로
306
+ 만들어져 있어 같은 단 번호가 같은 세기를 뜻하지 않는다(green 은 700 도 4.12 로 미달이라
307
+ 두 단을 건너뛴다). 종전에는 두 시트가 **같은 단**을 쓰도록 테스트가 강제하고 있었고,
308
+ 그 규칙이 라이트만 미달인 결함을 세 번 반복해서 만들었다.
309
+
310
+ ⚠**라이트와 다크에서 요구가 갈리는 이유**: 라이트는 바탕도 on-color 도 흰색이라 두
311
+ 요구가 한 조건으로 합쳐지지만, 다크는 바탕 `#121212` · on-color `#FFFFFF` 로 **정반대
312
+ 방향**이다. 한 단이 둘을 맡을 수 없다. 그래서 `-color` 는 **면**, `-strong` 은
313
+ **글자·아이콘**으로 용도를 확정했고, 다크에서 두 단이 벌어진다.
314
+
315
+ - **`--u-warning-txt-color` 가 노란 면 위에서 읽히지 않던 문제** — `#FFFFFF` 는 라이트
316
+ 노랑 위에서 1.40 이다. 노랑은 **어떤 단으로 옮겨도** 흰 글자로 AA 를 못 받치므로
317
+ (라이트 최대 2.65 @900, 그마저 갈색) 전경을 뒤집었다: `var(--u-neutral-1000)` —
318
+ 라이트 `#000000`(15.05 ✓) · 다크 `#FFFFFF`(4.65 ✓). 한 줄로 양 테마를 만족한다.
319
+
320
+ - **`u-badge[color="blue"]` 가 장식 축에서 역할 토큰을 읽던 문제.** 이 한 색만
321
+ `--u-primary-color` 를 참조해, 브랜드 색을 바꾸면 `color="blue"` 배지가 함께 움직였다
322
+ (`color="green"` 등 나머지 8색은 팔레트 직참조라 움직이지 않는다). `--u-blue-500` 로
323
+ 되돌렸다 — 이 컴포넌트의 다른 장식 색과 같은 단이다. **배지 파랑이 `#1E88E5` →
324
+ `#2196F3` 로 바뀐다.**
325
+
326
+ - **`u-button[variant="link"]` 이 `--u-link-txt-color` 를 무시하던 문제.** 링크 색을
327
+ 정의해 둔 토큰이 **어디에서도 쓰이지 않았고**, 링크는 대신 `--u-primary-color-weak`
328
+ (흰 바탕 3.12 ✗)를 썼다. 쉬는 상태를 그 토큰으로 되돌리고, hover/active 는 밑줄 +
329
+ `-strong` 한 단으로 합쳤다.
330
+
331
+ ### Added
332
+
333
+ - **`tests/build/token-contrast.test.ts`** — 역할 토큰의 **조합 대비**를 단언하는 회귀망.
334
+ 값 하나를 재는 것으로는 토큰이 안전한지 알 수 없다는 것이 위 결함의 교훈이므로,
335
+ `(전경, 배경, 기준)` 표를 두 테마에 대해 검사한다. 소비자가 `--u-primary-color` 를
336
+ 덮어써도 살아남는 형태의 계약이다.
337
+
338
+ - **`node scripts/token-fallbacks.mjs --refresh`** — 시트 값이 바뀐 뒤 **이미 배선된**
339
+ 폴백 리터럴을 다시 굽는다. 종전 생성기는 배선만 하고 갱신을 못 해서, 매핑을 바꿀 때마다
340
+ 수십 곳을 손으로 고쳐야 했다(*"폴백은 손으로 쓰지 말고 생성한다"* 는 원칙에 갱신 경로가
341
+ 없었다). 이번 변경의 49곳이 이 명령으로 처리됐다.
342
+
343
+ ### Changed
344
+
345
+ - **시각 변화 요약** — 전부 *진해지는* 방향이며 레이아웃에 영향이 없다.
346
+ 주 강조색 `#1E88E5` → `#1976D2` · 오류색 `#E53935` → `#D32F2F` ·
347
+ 성공색 `#43A047` → `#2E7D32` · 링크/hover 텍스트가 한 단 더 · 경고 면 위 글자가
348
+ 흰색 → 검정 · 배지 파랑 `#1E88E5` → `#2196F3`.
349
+ 다크에서는 **글자로 쓰이는 자리만** 밝아진다(면 색은 그대로).
350
+
351
+ ### Known issues
352
+
353
+ - **알림(`u-alert`) 아이콘이 알림 배경 위에서 3.0 에 미달** — 라이트 danger 2.61 ·
354
+ warning 1.48 (info 3.28 ✓ · success 4.79 ✓ 는 이번 재매핑으로 해소됐다). 원인은
355
+ 전경이 아니라 **배경(`-weakest` = shade-200)이 너무 진한 것**이라 면 토큰 쪽을
356
+ 손봐야 한다. 다크는 4/4 통과한다.
357
+
358
+ - **다크에서 `-weak`(진행바 채움·별점·포커스 링)가 바탕 위 3.0 미달** (2.31).
359
+ 이 자리는 재매핑으로 못 고친다 — 다크에서 `-weak`(바탕 위 그래픽, 밝아야 함)와
360
+ `-color`(흰 글자를 받는 면, 어두워야 함)가 팔레트의 **반대쪽**을 요구하므로 강도 축
361
+ 하나로 표현되지 않는다. 새 축 신설 여부는 설계 결정이다.
362
+
363
+ - **`--u-border-color-strong` 이 양 테마 모두 3.0 미달** (라이트 1.88 · 다크 2.40).
364
+ 무엇이 "UI 컴포넌트 경계"인지의 판단이 선행돼야 한다.
365
+
366
+ - **장식 축(`[color=X]`)의 shade-600 위 흰 글자는 여전히 8색 중 6색 미달** — 아래
367
+ 1.15.0 항목 참조. 역할 층과 달리 장식 축은 소비자가 고른 색이라 라이브러리가 단을
368
+ 대신 고를 수 없다.
369
+
3
370
  ## [1.15.0] - 2026-08-02
4
371
 
5
372
  ### Fixed
@@ -1,4 +1,4 @@
1
1
  //#region \0glob-assets_raw/dark.css.e8ac080d
2
- var dark_css_default = ":root[theme=\"dark\"] {\n color-scheme: dark;\n\n /* Neutral Colors */\n --u-neutral-0: #000000;\n --u-neutral-50: #0A0A0A;\n --u-neutral-100: #121212;\n --u-neutral-200: #1E1E1E;\n --u-neutral-300: #2A2A2A;\n --u-neutral-400: #3D3D3D;\n --u-neutral-500: #525252;\n --u-neutral-600: #6E6E6E;\n --u-neutral-700: #8A8A8A;\n --u-neutral-800: #B0B0B0;\n --u-neutral-900: #D4D4D4;\n --u-neutral-1000: #FFFFFF;\n\n /* Blue Colors */\n --u-blue-0: #030D1A;\n --u-blue-100: #061629;\n --u-blue-200: #0A223B;\n --u-blue-300: #103150;\n --u-blue-400: #174167;\n --u-blue-500: #205281;\n --u-blue-600: #2A659D;\n --u-blue-700: #3678B8;\n --u-blue-800: #478DCE;\n --u-blue-900: #5DA2DF;\n --u-blue-1000: #79BBEA;\n\n /* Green Colors */\n --u-green-0: #06140C;\n --u-green-100: #0A2114;\n --u-green-200: #10301D;\n --u-green-300: #164228;\n --u-green-400: #1F5535;\n --u-green-500: #2A6942;\n --u-green-600: #367E50;\n --u-green-700: #4A9563;\n --u-green-800: #63AB7A;\n --u-green-900: #80BE97;\n --u-green-1000: #9BCFB1;\n\n /* Yellow Colors */\n --u-yellow-0: #1C1300;\n --u-yellow-100: #2D1E00;\n --u-yellow-200: #402B00;\n --u-yellow-300: #553900;\n --u-yellow-400: #6B4900;\n --u-yellow-500: #825A00;\n --u-yellow-600: #9A6C00;\n --u-yellow-700: #B08012;\n --u-yellow-800: #C69635;\n --u-yellow-900: #D9AD5A;\n --u-yellow-1000: #E8C57F;\n\n /* Red Colors */\n --u-red-0: #1C0707;\n --u-red-100: #2C0B0B;\n --u-red-200: #3E1111;\n --u-red-300: #541818;\n --u-red-400: #6C2020;\n --u-red-500: #852A2A;\n --u-red-600: #A13535;\n --u-red-700: #B94949;\n --u-red-800: #CB6262;\n --u-red-900: #D98383;\n --u-red-1000: #E7A2A2;\n\n /* Orange Colors */\n --u-orange-0: #1D0E00;\n --u-orange-100: #2F1700;\n --u-orange-200: #421F00;\n --u-orange-300: #582A00;\n --u-orange-400: #703600;\n --u-orange-500: #8A4500;\n --u-orange-600: #A55600;\n --u-orange-700: #BD6A18;\n --u-orange-800: #D1823C;\n --u-orange-900: #E19D67;\n --u-orange-1000: #EDB992;\n\n /* Teal Colors */\n --u-teal-0: #041411;\n --u-teal-100: #07201B;\n --u-teal-200: #0B2E28;\n --u-teal-300: #10403A;\n --u-teal-400: #16544D;\n --u-teal-500: #1E6860;\n --u-teal-600: #297D74;\n --u-teal-700: #3A9389;\n --u-teal-800: #54A89F;\n --u-teal-900: #73BBB3;\n --u-teal-1000: #93CBC5;\n\n /* Cyan Colors */\n --u-cyan-0: #041318;\n --u-cyan-100: #071F29;\n --u-cyan-200: #0B2D3A;\n --u-cyan-300: #104050;\n --u-cyan-400: #165469;\n --u-cyan-500: #1E6A82;\n --u-cyan-600: #287F9C;\n --u-cyan-700: #3995B5;\n --u-cyan-800: #53AACC;\n --u-cyan-900: #73BEDD;\n --u-cyan-1000: #95CFE8;\n\n /* Purple Colors */\n --u-purple-0: #150A22;\n --u-purple-100: #220F36;\n --u-purple-200: #31164B;\n --u-purple-300: #432064;\n --u-purple-400: #572B80;\n --u-purple-500: #6C379C;\n --u-purple-600: #8245B7;\n --u-purple-700: #975BCB;\n --u-purple-800: #AB79D9;\n --u-purple-900: #BD99E2;\n --u-purple-1000: #CEB8EA;\n\n /* Pink Colors */\n --u-pink-0: #1F0A14;\n --u-pink-100: #310F20;\n --u-pink-200: #451532;\n --u-pink-300: #5C1D45;\n --u-pink-400: #74285A;\n --u-pink-500: #8F336F;\n --u-pink-600: #AB4187;\n --u-pink-700: #C0569D;\n --u-pink-800: #D174B3;\n --u-pink-900: #E095C7;\n --u-pink-1000: #EBB5D9;\n\n /* ==========================================================================\n Role Colors — 의미 역할 층\n 컴포넌트는 팔레트 프리미티브가 아니라 이 층을 참조한다.\n 브랜드 색 교체는 아래 25개만 재정의하면 시맨틱 층까지 따라온다.\n\n 단은 '강도' 축이다 (weakest -> strong). 용도(배경/테두리/텍스트)는\n 소비처가 정한다 -- 단을 속성에 묶으면 primary 버튼의 배경이 어느\n 단인지 같은 모순이 생긴다.\n ========================================================================== */\n\n /* primary — 브랜드 · 강조 · 포커스 · 링크 */\n --u-primary-color-weakest: var(--u-blue-200);\n --u-primary-color-weaker: var(--u-blue-300);\n --u-primary-color-weak: var(--u-blue-500);\n --u-primary-color: var(--u-blue-600);\n --u-primary-color-strong: var(--u-blue-700);\n\n /* info — 정보 안내 (primary 와 기본값은 같으나 역할이 다르다 — 브랜딩은 primary 만 바꾼다) */\n --u-info-color-weakest: var(--u-blue-200);\n --u-info-color-weaker: var(--u-blue-300);\n --u-info-color-weak: var(--u-blue-500);\n --u-info-color: var(--u-blue-600);\n --u-info-color-strong: var(--u-blue-700);\n\n /* success — 성공 · 완료 */\n --u-success-color-weakest: var(--u-green-200);\n --u-success-color-weaker: var(--u-green-300);\n --u-success-color-weak: var(--u-green-500);\n --u-success-color: var(--u-green-600);\n --u-success-color-strong: var(--u-green-700);\n\n /* warning — 주의 */\n --u-warning-color-weakest: var(--u-yellow-200);\n --u-warning-color-weaker: var(--u-yellow-300);\n --u-warning-color-weak: var(--u-yellow-500);\n --u-warning-color: var(--u-yellow-600);\n --u-warning-color-strong: var(--u-yellow-700);\n\n /* danger — 오류 · 위험 · 유효성 실패 */\n --u-danger-color-weakest: var(--u-red-200);\n --u-danger-color-weaker: var(--u-red-300);\n --u-danger-color-weak: var(--u-red-500);\n --u-danger-color: var(--u-red-600);\n --u-danger-color-strong: var(--u-red-700);\n /* ==========================================================================\n Radius Scale — 모서리 반경\n 리터럴을 흩뿌리면 값이 갈린다(실제로 pill 이 999px/9999px 두 표기로 나뉘어 있었다).\n ========================================================================== */\n --u-radius-none: 0;\n --u-radius-sm: 3px;\n --u-radius-md: 4px;\n --u-radius-lg: 6px;\n --u-radius-xl: 8px;\n --u-radius-pill: 9999px;\n --u-radius-circle: 50%;\n\n /* ==========================================================================\n Space Scale — 컨테이너·오버레이의 절대 여백\n ⚠**여백은 하나의 축이 아니다.** 이 스케일은 컨테이너/오버레이의 **레이아웃 여백**만\n 담당한다. 폼·인라인 요소의 `em` 여백은 상속된 `font-size` 에 비례하는 것이 의도이므로\n **여기로 흡수하지 않는다.** 반경과 마찬가지로 테마와 무관하므로 두 시트가 같다.\n 축 구분과 근거는 docs/design-tokens.md 참조.\n ========================================================================== */\n --u-space-3xs: 2px;\n --u-space-2xs: 4px;\n --u-space-xs: 6px;\n --u-space-sm: 8px;\n --u-space-md: 12px;\n --u-space-lg: 16px;\n\n /* Text Colors */\n --u-txt-color: var(--u-neutral-900);\n --u-txt-color-inverse: var(--u-neutral-100);\n\n /* 유채색 배경 위의 글자 — 두 테마 모두 흰색이다(light.css 참조). */\n --u-primary-txt-color: #FFFFFF;\n --u-info-txt-color: #FFFFFF;\n --u-success-txt-color: #FFFFFF;\n --u-danger-txt-color: #FFFFFF;\n --u-warning-txt-color: #FFFFFF;\n --u-txt-color-hover: var(--u-primary-color);\n --u-txt-color-active: var(--u-primary-color);\n --u-txt-color-disabled: var(--u-neutral-500);\n --u-txt-color-weak: var(--u-neutral-700);\n --u-txt-color-strong: var(--u-neutral-1000);\n\n --u-link-txt-color: var(--u-primary-color-strong);\n --u-tooltip-txt-color: var(--u-neutral-100);\n\n /* Icon Colors */\n --u-icon-color: var(--u-neutral-800);\n --u-icon-color-inverse: var(--u-neutral-100);\n --u-icon-color-hover: var(--u-primary-color);\n --u-icon-color-active: var(--u-primary-color);\n --u-icon-color-disabled: var(--u-neutral-500);\n\n /* Border Colors */\n --u-border-color: var(--u-neutral-400);\n --u-border-color-weak: var(--u-neutral-300);\n --u-border-color-strong: var(--u-neutral-500);\n --u-border-color-hover: var(--u-neutral-500);\n\n --u-input-border-color: var(--u-neutral-400);\n --u-input-border-color-hover: var(--u-neutral-500);\n --u-input-border-color-focus: var(--u-primary-color);\n --u-input-border-color-invalid: var(--u-danger-color);\n\n /* Background Colors */\n --u-bg-color: var(--u-neutral-100);\n --u-bg-color-inverse: var(--u-neutral-0);\n --u-bg-color-hover: var(--u-neutral-300);\n --u-bg-color-active: var(--u-neutral-400);\n --u-bg-color-disabled: var(--u-neutral-100);\n \n /* 유채색 표면 — 라이트와 **같은 단이 아니라 같은 세기**로 짝지었다(light.css 참조).\n 팔레트 유채색 틴트가 다크에서 짓눌리므로 한 단 위를 쓴다. green 은 대칭이라 그대로. */\n --u-primary-bg-color: var(--u-blue-100);\n --u-info-bg-color: var(--u-blue-100);\n --u-success-bg-color: var(--u-green-0);\n --u-danger-bg-color: var(--u-red-100);\n\n --u-input-bg-color: var(--u-neutral-200);\n --u-panel-bg-color: var(--u-neutral-200);\n --u-overlay-bg-color: rgba(0, 0, 0, 0.7);\n --u-tooltip-bg-color: rgba(255, 255, 255, 0.85);\n\n /* Shadow Colors */\n --u-shadow-color-weaker: rgba(0, 0, 0, 0.15);\n --u-shadow-color-weak: rgba(0, 0, 0, 0.25);\n --u-shadow-color-normal: rgba(0, 0, 0, 0.35);\n --u-shadow-color-strong: rgba(0, 0, 0, 0.45);\n --u-shadow-color-stronger: rgba(0, 0, 0, 0.60);\n\n /* Scrollbar Colors */\n --u-scrollbar-color: var(--u-neutral-500);\n --u-scrollbar-color-hover: var(--u-neutral-600);\n --u-scrollbar-track-color: transparent;\n\n /* Font Styles */\n --u-font-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';\n --u-font-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Monaco, 'Courier New', monospace;\n --u-font-serif: 'Georgia', 'Times New Roman', Times, serif;\n --u-font-display: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;\n --u-font-modern: 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --u-font-rounded: 'Nunito', 'Quicksand', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}";
2
+ var dark_css_default = ":root[theme=\"dark\"] {\n color-scheme: dark;\n\n /* Neutral Colors */\n --u-neutral-0: #000000;\n --u-neutral-50: #0A0A0A;\n --u-neutral-100: #121212;\n --u-neutral-200: #1E1E1E;\n --u-neutral-300: #2A2A2A;\n --u-neutral-400: #3D3D3D;\n --u-neutral-500: #525252;\n --u-neutral-600: #6E6E6E;\n --u-neutral-700: #8A8A8A;\n --u-neutral-800: #B0B0B0;\n --u-neutral-900: #D4D4D4;\n --u-neutral-1000: #FFFFFF;\n\n /* Blue Colors */\n --u-blue-0: #030D1A;\n --u-blue-100: #061629;\n --u-blue-200: #0A223B;\n --u-blue-300: #103150;\n --u-blue-400: #174167;\n --u-blue-500: #205281;\n --u-blue-600: #2A659D;\n --u-blue-700: #3678B8;\n --u-blue-800: #478DCE;\n --u-blue-900: #5DA2DF;\n --u-blue-1000: #79BBEA;\n\n /* Green Colors */\n --u-green-0: #06140C;\n --u-green-100: #0A2114;\n --u-green-200: #10301D;\n --u-green-300: #164228;\n --u-green-400: #1F5535;\n --u-green-500: #2A6942;\n --u-green-600: #367E50;\n --u-green-700: #4A9563;\n --u-green-800: #63AB7A;\n --u-green-900: #80BE97;\n --u-green-1000: #9BCFB1;\n\n /* Yellow Colors */\n --u-yellow-0: #1C1300;\n --u-yellow-100: #2D1E00;\n --u-yellow-200: #402B00;\n --u-yellow-300: #553900;\n --u-yellow-400: #6B4900;\n --u-yellow-500: #825A00;\n --u-yellow-600: #9A6C00;\n --u-yellow-700: #B08012;\n --u-yellow-800: #C69635;\n --u-yellow-900: #D9AD5A;\n --u-yellow-1000: #E8C57F;\n\n /* Red Colors */\n --u-red-0: #1C0707;\n --u-red-100: #2C0B0B;\n --u-red-200: #3E1111;\n --u-red-300: #541818;\n --u-red-400: #6C2020;\n --u-red-500: #852A2A;\n --u-red-600: #A13535;\n --u-red-700: #B94949;\n --u-red-800: #CB6262;\n --u-red-900: #D98383;\n --u-red-1000: #E7A2A2;\n\n /* Orange Colors */\n --u-orange-0: #1D0E00;\n --u-orange-100: #2F1700;\n --u-orange-200: #421F00;\n --u-orange-300: #582A00;\n --u-orange-400: #703600;\n --u-orange-500: #8A4500;\n --u-orange-600: #A55600;\n --u-orange-700: #BD6A18;\n --u-orange-800: #D1823C;\n --u-orange-900: #E19D67;\n --u-orange-1000: #EDB992;\n\n /* Teal Colors */\n --u-teal-0: #041411;\n --u-teal-100: #07201B;\n --u-teal-200: #0B2E28;\n --u-teal-300: #10403A;\n --u-teal-400: #16544D;\n --u-teal-500: #1E6860;\n --u-teal-600: #297D74;\n --u-teal-700: #3A9389;\n --u-teal-800: #54A89F;\n --u-teal-900: #73BBB3;\n --u-teal-1000: #93CBC5;\n\n /* Cyan Colors */\n --u-cyan-0: #041318;\n --u-cyan-100: #071F29;\n --u-cyan-200: #0B2D3A;\n --u-cyan-300: #104050;\n --u-cyan-400: #165469;\n --u-cyan-500: #1E6A82;\n --u-cyan-600: #287F9C;\n --u-cyan-700: #3995B5;\n --u-cyan-800: #53AACC;\n --u-cyan-900: #73BEDD;\n --u-cyan-1000: #95CFE8;\n\n /* Purple Colors */\n --u-purple-0: #150A22;\n --u-purple-100: #220F36;\n --u-purple-200: #31164B;\n --u-purple-300: #432064;\n --u-purple-400: #572B80;\n --u-purple-500: #6C379C;\n --u-purple-600: #8245B7;\n --u-purple-700: #975BCB;\n --u-purple-800: #AB79D9;\n --u-purple-900: #BD99E2;\n --u-purple-1000: #CEB8EA;\n\n /* Pink Colors */\n --u-pink-0: #1F0A14;\n --u-pink-100: #310F20;\n --u-pink-200: #451532;\n --u-pink-300: #5C1D45;\n --u-pink-400: #74285A;\n --u-pink-500: #8F336F;\n --u-pink-600: #AB4187;\n --u-pink-700: #C0569D;\n --u-pink-800: #D174B3;\n --u-pink-900: #E095C7;\n --u-pink-1000: #EBB5D9;\n\n /* ==========================================================================\n Role Colors — 의미 역할 층\n 컴포넌트는 팔레트 프리미티브가 아니라 이 층을 참조한다.\n 브랜드 색 교체는 아래 25개만 재정의하면 시맨틱 층까지 따라온다.\n\n 단은 '강도' 축이다 (weakest -> strong). 용도(배경/테두리/텍스트)는\n 소비처가 정한다 -- 단을 속성에 묶으면 primary 버튼의 배경이 어느\n 단인지 같은 모순이 생긴다.\n\n ★**다만 두 단은 용도가 확정돼 있다** — 대비 요구가 서로 다르기 때문이다.\n `-color` = **면**. `--u-*-txt-color` 가 그 위에 얹히므로 on-color 기준 4.5.\n `-strong` = **글자·아이콘**. `--u-bg-color` 위에 놓이므로 바탕 기준 4.5.\n 라이트에서는 바탕도 on-color 도 흰색이라 두 요구가 한 조건으로 합쳐지지만,\n **다크에서는 정반대 방향**이다(바탕 #121212 · on-color #FFFFFF). 바탕에서 읽히는\n 밝은 단은 흰 글자를 못 받고, 흰 글자를 받는 어두운 단은 바탕에서 안 읽힌다.\n ⇒ 다크에서 `-color` 와 `-strong` 이 두 단 벌어지는 것이 그 결과다.\n `tests/build/token-contrast.test.ts` 가 값을 지킨다.\n ========================================================================== */\n\n /* primary — 브랜드 · 강조 · 포커스 · 링크 */\n --u-primary-color-weakest: var(--u-blue-200);\n --u-primary-color-weaker: var(--u-blue-300);\n --u-primary-color-weak: var(--u-blue-500);\n --u-primary-color: var(--u-blue-600); /* 면: 흰 글자 6.09 ✓ */\n --u-primary-color-strong: var(--u-blue-800); /* 글자: 바탕 5.32 ✓ (700 은 4.05 ✗) */\n\n /* info — 정보 안내 (primary 와 기본값은 같으나 역할이 다르다 — 브랜딩은 primary 만 바꾼다) */\n --u-info-color-weakest: var(--u-blue-200);\n --u-info-color-weaker: var(--u-blue-300);\n --u-info-color-weak: var(--u-blue-500);\n --u-info-color: var(--u-blue-600);\n --u-info-color-strong: var(--u-blue-800);\n\n /* success — 성공 · 완료 */\n --u-success-color-weakest: var(--u-green-200);\n --u-success-color-weaker: var(--u-green-300);\n --u-success-color-weak: var(--u-green-500);\n --u-success-color: var(--u-green-600);\n --u-success-color-strong: var(--u-green-700);\n\n /* warning — 주의 */\n --u-warning-color-weakest: var(--u-yellow-200);\n --u-warning-color-weaker: var(--u-yellow-300);\n --u-warning-color-weak: var(--u-yellow-500);\n --u-warning-color: var(--u-yellow-600);\n --u-warning-color-strong: var(--u-yellow-700);\n\n /* danger — 오류 · 위험 · 유효성 실패 */\n --u-danger-color-weakest: var(--u-red-200);\n --u-danger-color-weaker: var(--u-red-300);\n --u-danger-color-weak: var(--u-red-500);\n --u-danger-color: var(--u-red-600); /* 면: 흰 글자 6.83 ✓ */\n --u-danger-color-strong: var(--u-red-800); /* 글자: 바탕 4.87 ✓ (700 은 3.67 ✗) */\n /* ==========================================================================\n Radius Scale — 모서리 반경\n 리터럴을 흩뿌리면 값이 갈린다(실제로 pill 이 999px/9999px 두 표기로 나뉘어 있었다).\n ========================================================================== */\n --u-radius-none: 0;\n --u-radius-sm: 3px;\n --u-radius-md: 4px;\n --u-radius-lg: 6px;\n --u-radius-xl: 8px;\n --u-radius-pill: 9999px;\n --u-radius-circle: 50%;\n\n /* ==========================================================================\n Space Scale — 컨테이너·오버레이의 절대 여백\n ⚠**여백은 하나의 축이 아니다.** 이 스케일은 컨테이너/오버레이의 **레이아웃 여백**만\n 담당한다. 폼·인라인 요소의 `em` 여백은 상속된 `font-size` 에 비례하는 것이 의도이므로\n **여기로 흡수하지 않는다.** 반경과 마찬가지로 테마와 무관하므로 두 시트가 같다.\n 축 구분과 근거는 docs/design-tokens.md 참조.\n ========================================================================== */\n --u-space-3xs: 2px;\n --u-space-2xs: 4px;\n --u-space-xs: 6px;\n --u-space-sm: 8px;\n --u-space-md: 12px;\n --u-space-lg: 16px;\n\n /* Text Colors */\n --u-txt-color: var(--u-neutral-900);\n --u-txt-color-inverse: var(--u-neutral-100);\n\n /* 유채색 배경 위의 글자 — warning 만 다르다(light.css 참조). */\n --u-primary-txt-color: #FFFFFF;\n --u-info-txt-color: #FFFFFF;\n --u-success-txt-color: #FFFFFF;\n --u-danger-txt-color: #FFFFFF;\n /* ★라이트 시트와 같은 이유로 중립 최상단을 쓴다 — 다크에서는 그 값이 #FFFFFF 라\n 결과가 종전과 같다(4.65 ✓). 리터럴 대신 토큰을 쓰는 이유는 라이트에서 뒤집히기\n 때문이다(#000000). 두 시트가 같은 선언이 되어 어긋날 자리가 없어진다. */\n --u-warning-txt-color: var(--u-neutral-1000);\n --u-txt-color-hover: var(--u-primary-color-strong);\n --u-txt-color-active: var(--u-primary-color-strong);\n --u-txt-color-disabled: var(--u-neutral-500);\n --u-txt-color-weak: var(--u-neutral-700);\n --u-txt-color-strong: var(--u-neutral-1000);\n\n --u-link-txt-color: var(--u-primary-color-strong);\n --u-tooltip-txt-color: var(--u-neutral-100);\n\n /* Icon Colors */\n --u-icon-color: var(--u-neutral-800);\n --u-icon-color-inverse: var(--u-neutral-100);\n --u-icon-color-hover: var(--u-primary-color-strong);\n --u-icon-color-active: var(--u-primary-color-strong);\n --u-icon-color-disabled: var(--u-neutral-500);\n\n /* Border Colors */\n --u-border-color: var(--u-neutral-400);\n --u-border-color-weak: var(--u-neutral-300);\n --u-border-color-strong: var(--u-neutral-500);\n --u-border-color-hover: var(--u-neutral-500);\n\n /* ★상태 테두리는 `-strong` 단이다 — light.css 의 같은 자리 주석 참조.\n 이 테마가 실제로 미달이었다: focus 2.74 · invalid 2.44 → 4.74 / 4.34. */\n --u-input-border-color: var(--u-neutral-400);\n --u-input-border-color-hover: var(--u-neutral-500);\n --u-input-border-color-focus: var(--u-primary-color-strong);\n --u-input-border-color-invalid: var(--u-danger-color-strong);\n\n /* Background Colors */\n --u-bg-color: var(--u-neutral-100);\n --u-bg-color-inverse: var(--u-neutral-0);\n --u-bg-color-hover: var(--u-neutral-300);\n --u-bg-color-active: var(--u-neutral-400);\n --u-bg-color-disabled: var(--u-neutral-100);\n\n /* 면 높이 — 상세는 light.css 참조. 다크는 **바탕보다 밝은 쪽**이 위다.\n neutral-300(#2A2A2A)은 바탕(#121212) 대비 1.42 로, 소비 측이 오버라이드로 쓰던\n neutral-200(1.15)보다 실제로 더 잘 구분된다 — 그 오버라이드가 해결하려던 증상이\n *\"툴바·헤더가 배경에 묻힌다\"* 였다. */\n --u-bg-color-raised: var(--u-neutral-300);\n \n /* 유채색 표면 — 라이트와 **같은 단이 아니라 같은 세기**로 짝지었다(light.css 참조).\n 팔레트 유채색 틴트가 다크에서 짓눌리므로 한 단 위를 쓴다. green 은 대칭이라 그대로. */\n --u-primary-bg-color: var(--u-blue-100);\n --u-info-bg-color: var(--u-blue-100);\n --u-success-bg-color: var(--u-green-0);\n --u-danger-bg-color: var(--u-red-100);\n /* warning 합류 — 라이트는 yellow-200 이다(단 이름이 다른 이유는 light.css 참조). */\n --u-warning-bg-color: var(--u-yellow-100);\n\n --u-input-bg-color: var(--u-neutral-200);\n --u-panel-bg-color: var(--u-neutral-200);\n --u-overlay-bg-color: rgba(0, 0, 0, 0.7);\n --u-tooltip-bg-color: rgba(255, 255, 255, 0.85);\n\n /* Shadow Colors */\n --u-shadow-color-weaker: rgba(0, 0, 0, 0.15);\n --u-shadow-color-weak: rgba(0, 0, 0, 0.25);\n --u-shadow-color-normal: rgba(0, 0, 0, 0.35);\n --u-shadow-color-strong: rgba(0, 0, 0, 0.45);\n --u-shadow-color-stronger: rgba(0, 0, 0, 0.60);\n\n /* Elevation Scale — 근거는 light.css 의 같은 자리 주석 참조.\n ★다크는 알파가 3배 가까이 진하다 — 리터럴로 흩어져 있던 종전에는 이 차이가\n 적용되지 않아 다크에서 그림자가 사실상 보이지 않았다. */\n --u-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.25); /* = shadow-color-weak */\n --u-shadow-md: 0 2px 8px rgba(0, 0, 0, 0.35); /* = shadow-color-normal */\n --u-shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.45); /* = shadow-color-strong */\n --u-shadow-xl: 0 6px 18px rgba(0, 0, 0, 0.60); /* = shadow-color-stronger */\n\n /* Scrollbar Colors */\n --u-scrollbar-color: var(--u-neutral-500);\n --u-scrollbar-color-hover: var(--u-neutral-600);\n --u-scrollbar-track-color: transparent;\n\n /* Font Styles */\n --u-font-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';\n --u-font-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Monaco, 'Courier New', monospace;\n --u-font-serif: 'Georgia', 'Times New Roman', Times, serif;\n --u-font-display: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;\n --u-font-modern: 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --u-font-rounded: 'Nunito', 'Quicksand', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}";
3
3
  //#endregion
4
4
  export { dark_css_default as default };
@@ -1,4 +1,4 @@
1
1
  //#region \0glob-assets_raw/light.css.637cb2f8
2
- var light_css_default = ":root {\n color-scheme: light;\n\n /* Neutral Colors */\n --u-neutral-0: #FFFFFF;\n --u-neutral-50: #FAFAFA;\n --u-neutral-100: #F5F5F5;\n --u-neutral-200: #EEEEEE;\n --u-neutral-300: #E0E0E0;\n --u-neutral-400: #BDBDBD;\n --u-neutral-500: #9E9E9E;\n --u-neutral-600: #757575;\n --u-neutral-700: #616161;\n --u-neutral-800: #424242;\n --u-neutral-900: #212121;\n --u-neutral-1000: #000000;\n\n /* Blue Colors */\n --u-blue-0: #E3F2FD;\n --u-blue-100: #BBDEFB;\n --u-blue-200: #90CAF9;\n --u-blue-300: #64B5F6;\n --u-blue-400: #42A5F5;\n --u-blue-500: #2196F3;\n --u-blue-600: #1E88E5;\n --u-blue-700: #1976D2;\n --u-blue-800: #1565C0;\n --u-blue-900: #0D47A1;\n --u-blue-1000: #062A5E;\n\n /* Green Colors */\n --u-green-0: #E8F5E9;\n --u-green-100: #C8E6C9;\n --u-green-200: #A5D6A7;\n --u-green-300: #81C784;\n --u-green-400: #66BB6A;\n --u-green-500: #4CAF50;\n --u-green-600: #43A047;\n --u-green-700: #388E3C;\n --u-green-800: #2E7D32;\n --u-green-900: #1B5E20;\n --u-green-1000: #0F3A12;\n\n /* Yellow Colors */\n --u-yellow-0: #FFFDE7;\n --u-yellow-100: #FFF9C4;\n --u-yellow-200: #FFF59D;\n --u-yellow-300: #FFF176;\n --u-yellow-400: #FFEE58;\n --u-yellow-500: #FFEB3B;\n --u-yellow-600: #FDD835;\n --u-yellow-700: #FBC02D;\n --u-yellow-800: #F9A825;\n --u-yellow-900: #F57F17;\n --u-yellow-1000: #8A4A00;\n\n /* Red Colors */\n --u-red-0: #FFEBEE;\n --u-red-100: #FFCDD2;\n --u-red-200: #EF9A9A;\n --u-red-300: #E57373;\n --u-red-400: #EF5350;\n --u-red-500: #F44336;\n --u-red-600: #E53935;\n --u-red-700: #D32F2F;\n --u-red-800: #C62828;\n --u-red-900: #B71C1C;\n --u-red-1000: #6B0F0F;\n\n /* Orange Colors */\n --u-orange-0: #FFF3E0;\n --u-orange-100: #FFE0B2;\n --u-orange-200: #FFCC80;\n --u-orange-300: #FFB74D;\n --u-orange-400: #FFA726;\n --u-orange-500: #FF9800;\n --u-orange-600: #FB8C00;\n --u-orange-700: #F57C00;\n --u-orange-800: #EF6C00;\n --u-orange-900: #E65100;\n --u-orange-1000: #8C3100;\n\n /* Teal Colors */\n --u-teal-0: #E0F2F1;\n --u-teal-100: #B2DFDB;\n --u-teal-200: #80CBC4;\n --u-teal-300: #4DB6AC;\n --u-teal-400: #26A69A;\n --u-teal-500: #009688;\n --u-teal-600: #00897B;\n --u-teal-700: #00796B;\n --u-teal-800: #00695C;\n --u-teal-900: #004D40;\n --u-teal-1000: #002E26;\n\n /* Cyan Colors */\n --u-cyan-0: #E0F7FA;\n --u-cyan-100: #B2EBF2;\n --u-cyan-200: #80DEEA;\n --u-cyan-300: #4DD0E1;\n --u-cyan-400: #26C6DA;\n --u-cyan-500: #00BCD4;\n --u-cyan-600: #00ACC1;\n --u-cyan-700: #0097A7;\n --u-cyan-800: #00838F;\n --u-cyan-900: #006064;\n --u-cyan-1000: #003A3D;\n\n /* Purple Colors */\n --u-purple-0: #F3E5F5;\n --u-purple-100: #E1BEE7;\n --u-purple-200: #CE93D8;\n --u-purple-300: #BA68C8;\n --u-purple-400: #AB47BC;\n --u-purple-500: #9C27B0;\n --u-purple-600: #8E24AA;\n --u-purple-700: #7B1FA2;\n --u-purple-800: #6A1B9A;\n --u-purple-900: #4A148C;\n --u-purple-1000: #2C0B54;\n\n /* Pink Colors */\n --u-pink-0: #FCE4EC;\n --u-pink-100: #F8BBD0;\n --u-pink-200: #F48FB1;\n --u-pink-300: #F06292;\n --u-pink-400: #EC407A;\n --u-pink-500: #E91E63;\n --u-pink-600: #D81B60;\n --u-pink-700: #C2185B;\n --u-pink-800: #AD1457;\n --u-pink-900: #880E4F;\n --u-pink-1000: #520830;\n\n /* ==========================================================================\n Role Colors — 의미 역할 층\n 컴포넌트는 팔레트 프리미티브가 아니라 이 층을 참조한다.\n 브랜드 색 교체는 아래 25개만 재정의하면 시맨틱 층까지 따라온다.\n\n 단은 '강도' 축이다 (weakest -> strong). 용도(배경/테두리/텍스트)는\n 소비처가 정한다 -- 단을 속성에 묶으면 primary 버튼의 배경이 어느\n 단인지 같은 모순이 생긴다.\n ========================================================================== */\n\n /* primary — 브랜드 · 강조 · 포커스 · 링크 */\n --u-primary-color-weakest: var(--u-blue-200);\n --u-primary-color-weaker: var(--u-blue-300);\n --u-primary-color-weak: var(--u-blue-500);\n --u-primary-color: var(--u-blue-600);\n --u-primary-color-strong: var(--u-blue-700);\n\n /* info — 정보 안내 (primary 와 기본값은 같으나 역할이 다르다 — 브랜딩은 primary 만 바꾼다) */\n --u-info-color-weakest: var(--u-blue-200);\n --u-info-color-weaker: var(--u-blue-300);\n --u-info-color-weak: var(--u-blue-500);\n --u-info-color: var(--u-blue-600);\n --u-info-color-strong: var(--u-blue-700);\n\n /* success — 성공 · 완료 */\n --u-success-color-weakest: var(--u-green-200);\n --u-success-color-weaker: var(--u-green-300);\n --u-success-color-weak: var(--u-green-500);\n --u-success-color: var(--u-green-600);\n --u-success-color-strong: var(--u-green-700);\n\n /* warning — 주의 */\n --u-warning-color-weakest: var(--u-yellow-200);\n --u-warning-color-weaker: var(--u-yellow-300);\n --u-warning-color-weak: var(--u-yellow-500);\n --u-warning-color: var(--u-yellow-600);\n --u-warning-color-strong: var(--u-yellow-700);\n\n /* danger — 오류 · 위험 · 유효성 실패 */\n --u-danger-color-weakest: var(--u-red-200);\n --u-danger-color-weaker: var(--u-red-300);\n --u-danger-color-weak: var(--u-red-500);\n --u-danger-color: var(--u-red-600);\n --u-danger-color-strong: var(--u-red-700);\n /* ==========================================================================\n Radius Scale — 모서리 반경\n 리터럴을 흩뿌리면 값이 갈린다(실제로 pill 이 999px/9999px 두 표기로 나뉘어 있었다).\n ========================================================================== */\n --u-radius-none: 0;\n --u-radius-sm: 3px;\n --u-radius-md: 4px;\n --u-radius-lg: 6px;\n --u-radius-xl: 8px;\n --u-radius-pill: 9999px;\n --u-radius-circle: 50%;\n\n /* ==========================================================================\n Space Scale — 컨테이너·오버레이의 절대 여백\n ⚠**여백은 하나의 축이 아니다.** 이 스케일은 컨테이너/오버레이(카드·대화상자·드로어·\n 알림·메뉴·툴팁 등)의 **레이아웃 여백**만 담당한다. 폼·인라인 요소의 `em` 여백은\n 상속된 `font-size` 에 비례하는 것이 의도이므로 **여기로 흡수하지 않는다** —\n 흡수하면 타이포를 키운 소비자의 여백이 따라 커지지 않는다.\n 축 구분과 근거는 docs/design-tokens.md 참조.\n ========================================================================== */\n --u-space-3xs: 2px;\n --u-space-2xs: 4px;\n --u-space-xs: 6px;\n --u-space-sm: 8px;\n --u-space-md: 12px;\n --u-space-lg: 16px;\n\n /* Text Colors */\n --u-txt-color: var(--u-neutral-900);\n --u-txt-color-inverse: var(--u-neutral-0);\n /* 유채색 배경 위의 글자. --u-txt-color-inverse 는 다크에서 neutral-100(#121212)이라\n 유채색 버튼 위에서 읽히지 않는다. 브랜드 색을 바꾸는 소비자가 전경색도 함께\n 조절할 수 있도록 별도 이름을 준다.\n ⚠이 토큰이 흰색이라는 것과 그 위의 배경이 AA 를 받친다는 것은 별개다 —\n 라이트 팔레트의 shade-600 은 8색 중 6색이 흰 글자로 AA 에 미달한다(미해결). */\n --u-primary-txt-color: #FFFFFF;\n --u-info-txt-color: #FFFFFF;\n --u-success-txt-color: #FFFFFF;\n --u-danger-txt-color: #FFFFFF;\n --u-warning-txt-color: #FFFFFF;\n\n --u-txt-color-hover: var(--u-primary-color);\n --u-txt-color-active: var(--u-primary-color);\n --u-txt-color-disabled: var(--u-neutral-400);\n /* neutral-500(#9E9E9E)은 흰 배경 대비 2.68 로 WCAG AA(4.5) 미달이었다.\n neutral-600(#757575) = 4.61 로 통과한다. 다크 매핑(neutral-700 = 5.43)은\n 원래 정상이라 손대지 않는다 — 라이트 한쪽만의 결함이었다. */\n --u-txt-color-weak: var(--u-neutral-600);\n --u-txt-color-strong: var(--u-neutral-1000);\n\n --u-link-txt-color: var(--u-primary-color-strong);\n --u-tooltip-txt-color: var(--u-neutral-0);\n\n /* Icon Colors */\n --u-icon-color: var(--u-neutral-700);\n --u-icon-color-inverse: var(--u-neutral-0);\n --u-icon-color-hover: var(--u-primary-color);\n --u-icon-color-active: var(--u-primary-color);\n --u-icon-color-disabled: var(--u-neutral-400);\n\n /* Border Colors */\n --u-border-color: var(--u-neutral-300);\n --u-border-color-weak: var(--u-neutral-200);\n --u-border-color-strong: var(--u-neutral-400);\n --u-border-color-hover: var(--u-neutral-400);\n\n --u-input-border-color: var(--u-neutral-300);\n --u-input-border-color-hover: var(--u-neutral-400);\n --u-input-border-color-focus: var(--u-primary-color);\n --u-input-border-color-invalid: var(--u-danger-color);\n\n /* Background Colors */\n --u-bg-color: var(--u-neutral-0);\n --u-bg-color-inverse: var(--u-neutral-900);\n --u-bg-color-hover: var(--u-neutral-100);\n --u-bg-color-active: var(--u-neutral-200);\n --u-bg-color-disabled: var(--u-neutral-50);\n \n /* 유채색 표면 — 정보/성공/위험 상태의 '면'.\n 역할 층의 유채색은 전경 5단뿐이라, 상태 배경이 필요한 컴포넌트는 팔레트를 직접\n 읽고 다크를 손으로 보정해야 했다. 팔레트의 유채색 틴트는 다크에서 짓눌리므로\n (바탕 대비 델타의 다크/라이트 비 — 청색 0.38~0.54) 두 테마가 **같은 단이 아니라\n 같은 세기**가 되도록 짝지었다. 실측 비: blue 1.09 · red 1.12 · green 0.91.\n ⚠yellow(경고)는 빠져 있다 — 라이트 황색 틴트가 Δ0.071 로 거의 보이지 않아\n 어떤 짝을 골라도 비가 2배 밑으로 내려가지 않는다. 리터럴 재설계가 선행돼야 한다. */\n --u-primary-bg-color: var(--u-blue-0);\n --u-info-bg-color: var(--u-blue-0);\n --u-success-bg-color: var(--u-green-0);\n --u-danger-bg-color: var(--u-red-0);\n\n --u-input-bg-color: var(--u-neutral-0);\n --u-panel-bg-color: var(--u-neutral-0);\n --u-overlay-bg-color: rgba(0, 0, 0, 0.5);\n --u-tooltip-bg-color: rgba(0, 0, 0, 0.75);\n\n /* Shadow Colors */\n --u-shadow-color-weaker: rgba(0, 0, 0, 0.04);\n --u-shadow-color-weak: rgba(0, 0, 0, 0.08);\n --u-shadow-color-normal: rgba(0, 0, 0, 0.12);\n --u-shadow-color-strong: rgba(0, 0, 0, 0.16);\n --u-shadow-color-stronger: rgba(0, 0, 0, 0.24);\n\n /* Scrollbar Colors */\n --u-scrollbar-color: var(--u-neutral-400);\n --u-scrollbar-color-hover: var(--u-neutral-500);\n --u-scrollbar-track-color: transparent;\n\n /* Font Styles */\n --u-font-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';\n --u-font-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Monaco, 'Courier New', monospace;\n --u-font-serif: 'Georgia', 'Times New Roman', Times, serif;\n --u-font-display: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;\n --u-font-modern: 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --u-font-rounded: 'Nunito', 'Quicksand', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}";
2
+ var light_css_default = ":root {\n color-scheme: light;\n\n /* Neutral Colors */\n --u-neutral-0: #FFFFFF;\n --u-neutral-50: #FAFAFA;\n --u-neutral-100: #F5F5F5;\n --u-neutral-200: #EEEEEE;\n --u-neutral-300: #E0E0E0;\n --u-neutral-400: #BDBDBD;\n --u-neutral-500: #9E9E9E;\n --u-neutral-600: #757575;\n --u-neutral-700: #616161;\n --u-neutral-800: #424242;\n --u-neutral-900: #212121;\n --u-neutral-1000: #000000;\n\n /* Blue Colors */\n --u-blue-0: #E3F2FD;\n --u-blue-100: #BBDEFB;\n --u-blue-200: #90CAF9;\n --u-blue-300: #64B5F6;\n --u-blue-400: #42A5F5;\n --u-blue-500: #2196F3;\n --u-blue-600: #1E88E5;\n --u-blue-700: #1976D2;\n --u-blue-800: #1565C0;\n --u-blue-900: #0D47A1;\n --u-blue-1000: #062A5E;\n\n /* Green Colors */\n --u-green-0: #E8F5E9;\n --u-green-100: #C8E6C9;\n --u-green-200: #A5D6A7;\n --u-green-300: #81C784;\n --u-green-400: #66BB6A;\n --u-green-500: #4CAF50;\n --u-green-600: #43A047;\n --u-green-700: #388E3C;\n --u-green-800: #2E7D32;\n --u-green-900: #1B5E20;\n --u-green-1000: #0F3A12;\n\n /* Yellow Colors */\n --u-yellow-0: #FFFDE7;\n --u-yellow-100: #FFF9C4;\n --u-yellow-200: #FFF59D;\n --u-yellow-300: #FFF176;\n --u-yellow-400: #FFEE58;\n --u-yellow-500: #FFEB3B;\n --u-yellow-600: #FDD835;\n --u-yellow-700: #FBC02D;\n --u-yellow-800: #F9A825;\n --u-yellow-900: #F57F17;\n --u-yellow-1000: #8A4A00;\n\n /* Red Colors */\n --u-red-0: #FFEBEE;\n --u-red-100: #FFCDD2;\n --u-red-200: #EF9A9A;\n --u-red-300: #E57373;\n --u-red-400: #EF5350;\n --u-red-500: #F44336;\n --u-red-600: #E53935;\n --u-red-700: #D32F2F;\n --u-red-800: #C62828;\n --u-red-900: #B71C1C;\n --u-red-1000: #6B0F0F;\n\n /* Orange Colors */\n --u-orange-0: #FFF3E0;\n --u-orange-100: #FFE0B2;\n --u-orange-200: #FFCC80;\n --u-orange-300: #FFB74D;\n --u-orange-400: #FFA726;\n --u-orange-500: #FF9800;\n --u-orange-600: #FB8C00;\n --u-orange-700: #F57C00;\n --u-orange-800: #EF6C00;\n --u-orange-900: #E65100;\n --u-orange-1000: #8C3100;\n\n /* Teal Colors */\n --u-teal-0: #E0F2F1;\n --u-teal-100: #B2DFDB;\n --u-teal-200: #80CBC4;\n --u-teal-300: #4DB6AC;\n --u-teal-400: #26A69A;\n --u-teal-500: #009688;\n --u-teal-600: #00897B;\n --u-teal-700: #00796B;\n --u-teal-800: #00695C;\n --u-teal-900: #004D40;\n --u-teal-1000: #002E26;\n\n /* Cyan Colors */\n --u-cyan-0: #E0F7FA;\n --u-cyan-100: #B2EBF2;\n --u-cyan-200: #80DEEA;\n --u-cyan-300: #4DD0E1;\n --u-cyan-400: #26C6DA;\n --u-cyan-500: #00BCD4;\n --u-cyan-600: #00ACC1;\n --u-cyan-700: #0097A7;\n --u-cyan-800: #00838F;\n --u-cyan-900: #006064;\n --u-cyan-1000: #003A3D;\n\n /* Purple Colors */\n --u-purple-0: #F3E5F5;\n --u-purple-100: #E1BEE7;\n --u-purple-200: #CE93D8;\n --u-purple-300: #BA68C8;\n --u-purple-400: #AB47BC;\n --u-purple-500: #9C27B0;\n --u-purple-600: #8E24AA;\n --u-purple-700: #7B1FA2;\n --u-purple-800: #6A1B9A;\n --u-purple-900: #4A148C;\n --u-purple-1000: #2C0B54;\n\n /* Pink Colors */\n --u-pink-0: #FCE4EC;\n --u-pink-100: #F8BBD0;\n --u-pink-200: #F48FB1;\n --u-pink-300: #F06292;\n --u-pink-400: #EC407A;\n --u-pink-500: #E91E63;\n --u-pink-600: #D81B60;\n --u-pink-700: #C2185B;\n --u-pink-800: #AD1457;\n --u-pink-900: #880E4F;\n --u-pink-1000: #520830;\n\n /* ==========================================================================\n Role Colors — 의미 역할 층\n 컴포넌트는 팔레트 프리미티브가 아니라 이 층을 참조한다.\n 브랜드 색 교체는 아래 25개만 재정의하면 시맨틱 층까지 따라온다.\n\n 단은 '강도' 축이다 (weakest -> strong). 용도(배경/테두리/텍스트)는\n 소비처가 정한다 -- 단을 속성에 묶으면 primary 버튼의 배경이 어느\n 단인지 같은 모순이 생긴다.\n ========================================================================== */\n\n /* ★단이 팔레트 shade 와 1:1 이 아니다 — **대비로 고른다.**\n `-color` 는 `--u-*-txt-color` 를 받는 면이고 `-strong` 은 바탕 위의 글자다.\n 라이트에서는 바탕도 on-color 도 흰색이라 두 요구가 `contrast(shade, #FFF) ≥ 4.5`\n 하나로 합쳐지고, 그 단이 계열마다 다르다(blue 700 · red 700 · green 800).\n Material 램프는 휘도가 아니라 색상 기준으로 만들어져 있어서 단 번호가 세기를\n 보장하지 않는다 — 값은 `tests/build/token-contrast.test.ts` 가 지킨다. */\n\n /* primary — 브랜드 · 강조 · 포커스 · 링크 */\n --u-primary-color-weakest: var(--u-blue-200);\n --u-primary-color-weaker: var(--u-blue-300);\n --u-primary-color-weak: var(--u-blue-500);\n --u-primary-color: var(--u-blue-700); /* 4.60 ✓ (600 은 3.68 ✗) */\n --u-primary-color-strong: var(--u-blue-800); /* 5.75 ✓ */\n\n /* info — 정보 안내 (primary 와 기본값은 같으나 역할이 다르다 — 브랜딩은 primary 만 바꾼다) */\n --u-info-color-weakest: var(--u-blue-200);\n --u-info-color-weaker: var(--u-blue-300);\n --u-info-color-weak: var(--u-blue-500);\n --u-info-color: var(--u-blue-700);\n --u-info-color-strong: var(--u-blue-800);\n\n /* success — 성공 · 완료\n ⚠green 은 700 도 4.12 로 미달이라 두 단을 건너뛴다. 계열마다 통과 단이 다른 것이\n 이 층의 정상 상태다(단 번호를 맞추면 대비가 어긋난다). */\n --u-success-color-weakest: var(--u-green-200);\n --u-success-color-weaker: var(--u-green-300);\n --u-success-color-weak: var(--u-green-500);\n --u-success-color: var(--u-green-800); /* 5.13 ✓ (600=3.30 · 700=4.12 ✗) */\n --u-success-color-strong: var(--u-green-900); /* 7.87 ✓ */\n\n /* warning — 주의 */\n --u-warning-color-weakest: var(--u-yellow-200);\n --u-warning-color-weaker: var(--u-yellow-300);\n --u-warning-color-weak: var(--u-yellow-500);\n --u-warning-color: var(--u-yellow-600);\n /* ★다른 계열은 -strong 이 shade-800~900 인데 warning 만 1000 이다 — 노랑 램프는\n 900 까지도 흰 바탕 2.65 로 미달이고, 1000(#8A4A00)에서 처음 6.86 이 된다.\n 그 값은 갈색에 가깝지만, 이 단의 용도는 **면이 아니라 글자·아이콘**이므로 색상보다\n 가독성이 먼저다(경고 문구를 어두운 호박색으로 쓰는 것은 보편 관행이다). */\n --u-warning-color-strong: var(--u-yellow-1000);\n\n /* danger — 오류 · 위험 · 유효성 실패 */\n --u-danger-color-weakest: var(--u-red-200);\n --u-danger-color-weaker: var(--u-red-300);\n --u-danger-color-weak: var(--u-red-500);\n --u-danger-color: var(--u-red-700); /* 4.98 ✓ (600 은 4.23 ✗ — 오류 문구가 이 단이었다) */\n --u-danger-color-strong: var(--u-red-800); /* 5.62 ✓ */\n /* ==========================================================================\n Radius Scale — 모서리 반경\n 리터럴을 흩뿌리면 값이 갈린다(실제로 pill 이 999px/9999px 두 표기로 나뉘어 있었다).\n ========================================================================== */\n --u-radius-none: 0;\n --u-radius-sm: 3px;\n --u-radius-md: 4px;\n --u-radius-lg: 6px;\n --u-radius-xl: 8px;\n --u-radius-pill: 9999px;\n --u-radius-circle: 50%;\n\n /* ==========================================================================\n Space Scale — 컨테이너·오버레이의 절대 여백\n ⚠**여백은 하나의 축이 아니다.** 이 스케일은 컨테이너/오버레이(카드·대화상자·드로어·\n 알림·메뉴·툴팁 등)의 **레이아웃 여백**만 담당한다. 폼·인라인 요소의 `em` 여백은\n 상속된 `font-size` 에 비례하는 것이 의도이므로 **여기로 흡수하지 않는다** —\n 흡수하면 타이포를 키운 소비자의 여백이 따라 커지지 않는다.\n 축 구분과 근거는 docs/design-tokens.md 참조.\n ========================================================================== */\n --u-space-3xs: 2px;\n --u-space-2xs: 4px;\n --u-space-xs: 6px;\n --u-space-sm: 8px;\n --u-space-md: 12px;\n --u-space-lg: 16px;\n\n /* Text Colors */\n --u-txt-color: var(--u-neutral-900);\n --u-txt-color-inverse: var(--u-neutral-0);\n /* 유채색 배경 위의 글자. --u-txt-color-inverse 는 다크에서 neutral-100(#121212)이라\n 유채색 버튼 위에서 읽히지 않는다. 브랜드 색을 바꾸는 소비자가 전경색도 함께\n 조절할 수 있도록 별도 이름을 준다.\n ⚠이 토큰이 흰색이라는 것과 그 위의 배경이 AA 를 받친다는 것은 별개다 —\n 라이트 팔레트의 shade-600 은 8색 중 6색이 흰 글자로 AA 에 미달한다(미해결). */\n --u-primary-txt-color: #FFFFFF;\n --u-info-txt-color: #FFFFFF;\n --u-success-txt-color: #FFFFFF;\n --u-danger-txt-color: #FFFFFF;\n /* ★warning 만 어둡다 — 취향이 아니라 측정이다. 노랑은 **어떤 단도** 흰 글자로 AA 를\n 받치지 못한다(라이트 최대 2.65 @900, 그마저 갈색). 다른 넷처럼 단을 옮기는 수단이\n 없으므로 전경을 뒤집는다. `--u-neutral-1000` 은 라이트 #000000 / 다크 #FFFFFF 이라\n 한 줄로 양 테마를 만족한다(라이트 15.05 · 다크 4.65). */\n --u-warning-txt-color: var(--u-neutral-1000);\n\n --u-txt-color-hover: var(--u-primary-color-strong);\n --u-txt-color-active: var(--u-primary-color-strong);\n --u-txt-color-disabled: var(--u-neutral-400);\n /* neutral-500(#9E9E9E)은 흰 배경 대비 2.68 로 WCAG AA(4.5) 미달이었다.\n neutral-600(#757575) = 4.61 로 통과한다. 다크 매핑(neutral-700 = 5.43)은\n 원래 정상이라 손대지 않는다 — 라이트 한쪽만의 결함이었다. */\n --u-txt-color-weak: var(--u-neutral-600);\n --u-txt-color-strong: var(--u-neutral-1000);\n\n --u-link-txt-color: var(--u-primary-color-strong);\n --u-tooltip-txt-color: var(--u-neutral-0);\n\n /* Icon Colors */\n --u-icon-color: var(--u-neutral-700);\n --u-icon-color-inverse: var(--u-neutral-0);\n --u-icon-color-hover: var(--u-primary-color-strong);\n --u-icon-color-active: var(--u-primary-color-strong);\n --u-icon-color-disabled: var(--u-neutral-400);\n\n /* Border Colors */\n --u-border-color: var(--u-neutral-300);\n --u-border-color-weak: var(--u-neutral-200);\n --u-border-color-strong: var(--u-neutral-400);\n --u-border-color-hover: var(--u-neutral-400);\n\n /* ★상태 테두리는 `-strong` 단이다 — 면이 아니라 **면 위에 그리는 선**이기 때문이다.\n 1.16.0 이 가른 용도(`-color` = 면 / `-strong` = 면·바탕 위)에 이 자리가 맞춰지지\n 않아 다크에서 미달이었다: focus 2.74 · invalid 2.44 (WCAG 1.4.11 기준 3.0).\n `-strong` 으로 옮기면 다크 4.74 / 4.34, 라이트 5.75 / 5.62 — 두 테마 모두 단조 상승. */\n --u-input-border-color: var(--u-neutral-300);\n --u-input-border-color-hover: var(--u-neutral-400);\n --u-input-border-color-focus: var(--u-primary-color-strong);\n --u-input-border-color-invalid: var(--u-danger-color-strong);\n\n /* Background Colors */\n --u-bg-color: var(--u-neutral-0);\n --u-bg-color-inverse: var(--u-neutral-900);\n --u-bg-color-hover: var(--u-neutral-100);\n --u-bg-color-active: var(--u-neutral-200);\n --u-bg-color-disabled: var(--u-neutral-50);\n\n /* ★면 높이 — 바탕에 인접해 있으면서 한 단 구분되는 크롬 면(툴바·표 헤더·푸터).\n 상호작용 상태(-hover/-active/-disabled)와 **다른 축**이다. 상태 이름에 높이를\n 얹으면 의미가 어긋난다(`DL-131-1`).\n `--u-panel-bg-color` 와도 다르다 — 그쪽은 **떠 있는 패널**(카드·대화상자·메뉴)이라\n 라이트에서 페이지와 같은 흰색이고 그림자가 높이를 나른다. 크롬 면은 그림자가 없어\n 라이트에서도 틴트가 필요하다.\n ⚠한 단만 정의한다. 두 단째의 실측 수요는 라이트 한쪽뿐이었다(다크에서는 소비 측\n 오버라이드가 두 값을 같은 단으로 합치고 있었다). */\n --u-bg-color-raised: var(--u-neutral-50);\n \n /* 유채색 표면 — 정보/성공/위험 상태의 '면'.\n 역할 층의 유채색은 전경 5단뿐이라, 상태 배경이 필요한 컴포넌트는 팔레트를 직접\n 읽고 다크를 손으로 보정해야 했다. 팔레트의 유채색 틴트는 다크에서 짓눌리므로\n (바탕 대비 델타의 다크/라이트 비 — 청색 0.38~0.54) 두 테마가 **같은 단이 아니라\n 같은 세기**가 되도록 짝지었다. 실측 비: blue 1.09 · red 1.12 · green 0.91.\n\n ★**warning 이 합류했다(1.16.0 → 1.17.0).** 종전에는 *\"세기를 맞출 단 짝이 없다\"* 며\n 빠져 있었는데, 그 판정은 **shade-0 짝만** 재고 있었다. 노랑만 한 단 내려 잡으면\n 라이트 쪽 세기가 맞는다 — 바탕 대비 휘도 델타 실측:\n blue-0 0.131 · red-0 0.132 · green-0 0.117 · **yellow-200 0.110** (yellow-0 은 0.027)\n ⚠단 이름이 계열마다 다른 것(yellow 만 200)은 이 층의 정상 상태다. 라이트 팔레트는\n 휘도 순이 아니므로 같은 단 번호가 같은 세기를 뜻하지 않는다. */\n --u-primary-bg-color: var(--u-blue-0);\n --u-info-bg-color: var(--u-blue-0);\n --u-success-bg-color: var(--u-green-0);\n --u-danger-bg-color: var(--u-red-0);\n --u-warning-bg-color: var(--u-yellow-200);\n\n --u-input-bg-color: var(--u-neutral-0);\n --u-panel-bg-color: var(--u-neutral-0);\n --u-overlay-bg-color: rgba(0, 0, 0, 0.5);\n --u-tooltip-bg-color: rgba(0, 0, 0, 0.75);\n\n /* Shadow Colors */\n --u-shadow-color-weaker: rgba(0, 0, 0, 0.04);\n --u-shadow-color-weak: rgba(0, 0, 0, 0.08);\n --u-shadow-color-normal: rgba(0, 0, 0, 0.12);\n --u-shadow-color-strong: rgba(0, 0, 0, 0.16);\n --u-shadow-color-stronger: rgba(0, 0, 0, 0.24);\n\n /* ==========================================================================\n Elevation Scale — 높이(그림자)\n\n ★색 축은 있었지만 **높이 축이 없었다.** 그 결과 컴포넌트가 그림자를 리터럴로\n 썼고, 같은 리듬을 의도한 자리에 서로 다른 값 11가지가 생겼다(카드 .1 vs 캐러셀\n .15 — 둘 다 \"표면에 얹힌 카드\"인데 알파가 다르다).\n\n ⚠**그리고 그 리터럴들은 테마를 몰랐다** — `rgba(0,0,0,.1)` 은 다크 바탕에서\n 거의 보이지 않는다. 이 축을 경유하면 다크의 진한 알파(.25~.60)를 자동으로 받는다.\n\n ⚠**알파를 `--u-shadow-color-*` 로 중첩하지 않고 인라인한다.** use-site 폴백\n 생성기는 합성 값을 리터럴로 다루므로, 중첩하면 `var(--u-shadow-md, 0 2px 8px\n var(--u-shadow-color-normal))` 처럼 **폴백 안에 또 토큰이 들어간다** — 시트가\n 없을 때 그 폴백도 함께 무효가 되어 그림자가 통째로 사라진다.\n 두 축의 알파가 어긋나지 않는지는 `tests/build/elevation-scale.test.ts` 가 지킨다.\n ========================================================================== */\n --u-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08); /* = shadow-color-weak — 표면에 얹힌 작은 컨트롤(탭·손잡이) */\n --u-shadow-md: 0 2px 8px rgba(0, 0, 0, 0.12); /* = shadow-color-normal — 카드·표면 */\n --u-shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.16); /* = shadow-color-strong — 떠 있는 레이어(드롭다운·알림) */\n --u-shadow-xl: 0 6px 18px rgba(0, 0, 0, 0.24); /* = shadow-color-stronger — 모달·최상위(대화상자·툴팁) */\n\n /* Scrollbar Colors */\n --u-scrollbar-color: var(--u-neutral-400);\n --u-scrollbar-color-hover: var(--u-neutral-500);\n --u-scrollbar-track-color: transparent;\n\n /* Font Styles */\n --u-font-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';\n --u-font-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Monaco, 'Courier New', monospace;\n --u-font-serif: 'Georgia', 'Times New Roman', Times, serif;\n --u-font-display: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;\n --u-font-modern: 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --u-font-rounded: 'Nunito', 'Quicksand', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n}";
3
3
  //#endregion
4
4
  export { light_css_default as default };
@@ -15,13 +15,18 @@ var styles = css`
15
15
  overflow-wrap: inherit;
16
16
  }
17
17
 
18
- /* Focus Styles */
18
+ /* Focus Styles
19
+ *
20
+ * ★**-strong 단이다** — 포커스 링은 바탕 위에 그리는 그래픽이므로 바탕 기준으로
21
+ * 재야 한다. 1.20.0 이전에는 -weak 였고 **다크에서 2.31**(WCAG 1.4.11 기준 3.0)이었다.
22
+ * 즉 키보드 사용자가 다크 테마에서 포커스 위치를 알기 어려웠다. -strong 은
23
+ * 라이트 5.75 · 다크 5.32 로 두 테마 모두 통과한다. */
19
24
  :host(:focus-visible) {
20
- outline: 2px solid var(--u-primary-color-weak, #2196F3);
25
+ outline: 2px solid var(--u-primary-color-strong, #1565C0);
21
26
  outline-offset: 2px;
22
27
  }
23
28
  :focus-visible {
24
- outline: 2px solid var(--u-primary-color-weak, #2196F3);
29
+ outline: 2px solid var(--u-primary-color-strong, #1565C0);
25
30
  outline-offset: 2px;
26
31
  }
27
32
 
@@ -7,25 +7,32 @@ var styles = css`
7
7
  --alert-border-color: var(--u-neutral-300, #E0E0E0);
8
8
  --alert-background-color: var(--u-neutral-200, #EEEEEE);
9
9
  }
10
+ /* ★배경은 -weakest 가 아니라 면 토큰(--u-*-bg-color)이다.
11
+ -weakest 는 라이트에서 shade-200 이라 **면으로 쓰기에 너무 진했다** — 그 위의
12
+ 아이콘(-strong)이 라이트 4/4 미달이었다(1.48~2.63, 기준 3.0). 다크는 통과했으므로
13
+ 라이트 한쪽만의 결함이었고, 원인은 전경이 아니라 배경이다.
14
+ 면 토큰으로 옮기면 두 테마 4/4 통과한다(4.58~7.00).
15
+ -weakest 는 진행바 버퍼 같은 **그래픽** 단으로 남는다 — 같은 단에 면과 그래픽을
16
+ 겹쳐 두었던 것이 애초의 문제다. */
10
17
  :host([status="error"]) {
11
- --alert-icon-color: var(--u-danger-color-strong, #D32F2F);
18
+ --alert-icon-color: var(--u-danger-color-strong, #C62828);
12
19
  --alert-border-color: var(--u-danger-color-weaker, #E57373);
13
- --alert-background-color: var(--u-danger-color-weakest, #EF9A9A);
20
+ --alert-background-color: var(--u-danger-bg-color, #FFEBEE);
14
21
  }
15
22
  :host([status="warning"]) {
16
- --alert-icon-color: var(--u-warning-color-strong, #FBC02D);
23
+ --alert-icon-color: var(--u-warning-color-strong, #8A4A00);
17
24
  --alert-border-color: var(--u-warning-color-weaker, #FFF176);
18
- --alert-background-color: var(--u-warning-color-weakest, #FFF59D);
25
+ --alert-background-color: var(--u-warning-bg-color, #FFF59D);
19
26
  }
20
27
  :host([status="info"]) {
21
- --alert-icon-color: var(--u-info-color-strong, #1976D2);
28
+ --alert-icon-color: var(--u-info-color-strong, #1565C0);
22
29
  --alert-border-color: var(--u-info-color-weaker, #64B5F6);
23
- --alert-background-color: var(--u-info-color-weakest, #90CAF9);
30
+ --alert-background-color: var(--u-info-bg-color, #E3F2FD);
24
31
  }
25
32
  :host([status="success"]) {
26
- --alert-icon-color: var(--u-success-color-strong, #388E3C);
33
+ --alert-icon-color: var(--u-success-color-strong, #1B5E20);
27
34
  --alert-border-color: var(--u-success-color-weaker, #81C784);
28
- --alert-background-color: var(--u-success-color-weakest, #A5D6A7);
35
+ --alert-background-color: var(--u-success-bg-color, #E8F5E9);
29
36
  }
30
37
  :host([status="notice"]) {
31
38
  --alert-icon-color: var(--u-neutral-700, #616161);
@@ -40,7 +47,7 @@ var styles = css`
40
47
  max-width: 100%;
41
48
  max-height: 50vh;
42
49
  border-radius: var(--u-radius-xl, 8px);
43
- box-shadow: 0 4px 12px var(--u-shadow-color-normal, rgba(0, 0, 0, 0.12));
50
+ box-shadow: var(--u-shadow-lg, 0 4px 12px rgba(0, 0, 0, 0.16));
44
51
 
45
52
  opacity: 0;
46
53
  transform: scale(0.8);
@@ -82,6 +89,8 @@ var styles = css`
82
89
  --alert-border-color: rgba(255, 255, 255, 0.3);
83
90
  background: rgba(255, 255, 255, 0.2);
84
91
  border-radius: 16px;
92
+ /* ⚠**높이 축(--u-shadow-*)을 쓰지 않는다** — 이 값은 유리 질감 레시피의 일부이고
93
+ (30px 번짐 + backdrop-filter), 높이를 뜻하지 않는다. 축으로 접으면 질감이 사라진다. */
85
94
  box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
86
95
  backdrop-filter: blur(5px);
87
96
  -webkit-backdrop-filter: blur(5px);
@@ -1,7 +1,8 @@
1
1
  import { nothing } from 'lit';
2
2
  import { UElement } from '../UElement.js';
3
3
  export type BadgeVariant = "pill" | "dot" | "square";
4
- export type BadgeColor = "neutral" | "blue" | "green" | "yellow" | "red" | "orange" | "teal" | "cyan" | "purple" | "pink";
4
+ /** 역할 축(`primary`…`danger`, 의미 · 리브랜딩을 따라옴)과 장식 축(`blue`…, 자체 · 면역)이 병존한다. */
5
+ export type BadgeColor = "neutral" | "primary" | "info" | "success" | "warning" | "danger" | "blue" | "green" | "yellow" | "red" | "orange" | "teal" | "cyan" | "purple" | "pink";
5
6
  export type BadgeAnchor = "top-right" | "top-left" | "bottom-right" | "bottom-left";
6
7
  /**
7
8
  * 상태, 숫자, 알림 등의 정보를 배지로 표시하는 컴포넌트입니다.