@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
@@ -44,14 +44,42 @@ var styles = css`
44
44
  border-radius: var(--u-radius-circle, 50%);
45
45
  }
46
46
 
47
- /* === Color (색상) === */
47
+ /* === Role (의미 축) ===
48
+ 장식 축(아래)과 달리 역할 토큰을 읽어 리브랜딩을 따라오고, 면과 그 위 글자를
49
+ **쌍으로** 받아 대비 계약을 물려받는다. warning 이 흰 글자가 아닌 이유가 그것이다. */
50
+ :host([color="primary"]) {
51
+ color: var(--u-primary-txt-color, #FFFFFF);
52
+ background-color: var(--u-primary-color, #1976D2);
53
+ }
54
+ :host([color="info"]) {
55
+ color: var(--u-info-txt-color, #FFFFFF);
56
+ background-color: var(--u-info-color, #1976D2);
57
+ }
58
+ :host([color="success"]) {
59
+ color: var(--u-success-txt-color, #FFFFFF);
60
+ background-color: var(--u-success-color, #2E7D32);
61
+ }
62
+ :host([color="warning"]) {
63
+ color: var(--u-warning-txt-color, #000000);
64
+ background-color: var(--u-warning-color, #FDD835);
65
+ }
66
+ :host([color="danger"]) {
67
+ color: var(--u-danger-txt-color, #FFFFFF);
68
+ background-color: var(--u-danger-color, #D32F2F);
69
+ }
70
+
71
+ /* === Color (장식 축) === */
48
72
  :host([color="neutral"]) {
49
73
  color: var(--u-neutral-800, #424242);
50
74
  background-color: var(--u-neutral-200, #EEEEEE);
51
75
  }
52
76
  :host([color="blue"]) {
53
77
  color: var(--u-neutral-0, #FFFFFF);
54
- background-color: var(--u-primary-color, #1E88E5);
78
+ /* ★장식 축이므로 팔레트를 직접 읽는다 — 여기만 역할 토큰(--u-primary-color)이었다.
79
+ 그 탓에 브랜드를 바꾸면 color="blue" 배지만 함께 움직였다(color="green" 등 8색은
80
+ 안 움직인다). u-tag 에는 이 오염을 막는 네거티브 컨트롤이 있는데 u-badge 에는
81
+ 없어서 드러나지 않았다. 단은 이 컴포넌트의 다른 장식 색과 같은 500 으로 맞춘다. */
82
+ background-color: var(--u-blue-500, #2196F3);
55
83
  }
56
84
  :host([color="green"]) {
57
85
  color: var(--u-neutral-0, #FFFFFF);
@@ -12,7 +12,7 @@ var styles = css`
12
12
  cursor: pointer;
13
13
  }
14
14
  :host:hover {
15
- color: var(--u-primary-color-strong, #1976D2);
15
+ color: var(--u-primary-color-strong, #1565C0);
16
16
  }
17
17
  :host([disabled]) {
18
18
  opacity: 0.5;
@@ -2,7 +2,18 @@ import { TemplateResult } from 'lit';
2
2
  import { UElement } from '../UElement.js';
3
3
  export type ButtonVariant = "solid" | "surface" | "filled" | "outlined" | "ghost" | "link";
4
4
  export type ButtonType = "button" | "submit" | "reset";
5
- export type ButtonColor = "neutral" | "blue" | "green" | "red" | "orange" | "teal" | "cyan" | "purple" | "pink";
5
+ /**
6
+ * 두 축이 한 속성에 병존한다.
7
+ *
8
+ * - **역할 축**(`primary`·`info`·`success`·`warning`·`danger`) — *의미*를 말한다.
9
+ * 색은 소비자의 역할 토큰이 정하므로 **리브랜딩을 따라오고**, 대비 계약을 물려받는다.
10
+ * - **장식 축**(`blue`·`purple` …) — *색 자체*를 말한다. 소비자가 고른 색이므로
11
+ * 리브랜딩에 **의도적으로 면역**이다.
12
+ *
13
+ * ★브랜드가 빨강인 제품에서 `color="red"` 는 브랜드와 위험을 같은 이름으로 만든다 —
14
+ * 그래서 위험은 `color="danger"` 로 쓴다.
15
+ */
16
+ export type ButtonColor = "neutral" | "primary" | "info" | "success" | "warning" | "danger" | "blue" | "green" | "red" | "orange" | "teal" | "cyan" | "purple" | "pink";
6
17
  export type ButtonSize = "sm" | "md" | "lg";
7
18
  /**
8
19
  * 클릭 가능한 버튼 컴포넌트입니다. href가 설정되면 앵커 태그로 렌더링됩니다.
@@ -19,11 +30,19 @@ export type ButtonSize = "sm" | "md" | "lg";
19
30
  *
20
31
  * @cssprop --u-primary-color - color="neutral"일 때 버튼 기준색. 지정 시 hover/active/surface 톤이 color-mix()로 자동 파생.
21
32
  * @cssprop --btn-padding-block - 내부 버튼의 상하 여백 (기본: 0.5em)
22
- * @cssprop --btn-padding-inline - 내부 버튼의 좌우 여백 (기본: 0.5em, variant="link"는 0)
33
+ * @cssprop --btn-padding-inline - 내부 버튼의 좌우 여백 (기본: 1em, variant="link"는 0).
34
+ * ⚠1.20.0 에서 0.5em → 1em. 세로와 같은 값이라 글자가 테두리에 붙어 있었다.
35
+ * 최소높이는 상하 여백에서 파생되므로(`1.5em + 상하×2 + 2px`) 이 값을 덮어도 높이는 안 변한다.
23
36
  * @cssprop --btn-border-color - 내부 버튼의 테두리 색. variant/hover/active 규칙이 이 값을 정한다
24
37
  * (기본: transparent)
25
- * @cssprop --btn-color - 버튼의 기준색. 아래 파생 토큰이 전부 이 값에서 color-mix()로 계산된다 —
38
+ * @cssprop --btn-color - 버튼의 **면** 색. 아래 파생 토큰이 전부 이 값에서 color-mix()로 계산된다 —
26
39
  * 보통 이것 하나만 덮으면 된다.
40
+ * @cssprop --btn-txt-color - 그 **면 위**의 글자색 — variant="solid" 가 읽는다
41
+ * (기본: #fff · 역할 값 지정 시 --u-{role}-txt-color)
42
+ * @cssprop --btn-color-strong - **바탕 위**의 글자색 — variant="link" 가 읽는다.
43
+ * 면과 요구가 반대라 슬롯이 따로 있다 (기본: --btn-color 와 동일 · 역할 값 지정 시 --u-{role}-color-strong)
44
+ * @cssprop --btn-color-strong-hover - 바탕 위 글자 hover (기본: 85% + black · 역할 값은 움직이지 않고 밑줄로 강조)
45
+ * @cssprop --btn-color-strong-active - 바탕 위 글자 active (기본: 70% + black · 역할 값은 고정)
27
46
  * @cssprop --btn-color-hover - solid 배경 hover (기본: --btn-color 85% + black)
28
47
  * @cssprop --btn-color-active - solid 배경 active (기본: --btn-color 70% + black)
29
48
  * @cssprop --btn-color-surface - surface 배경 (기본: --btn-color 12% + 배경색)
@@ -3,7 +3,24 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  :host {
5
5
  /* --btn-color 하나만 정해지면 hover/active/surface/outline 톤이 전부 자동 파생 */
6
- --btn-color: var(--u-primary-color, #1E88E5);
6
+ --btn-color: var(--u-primary-color, #1976D2);
7
+
8
+ /* ★색 슬롯이 셋인 이유 — 같은 색이 세 자리에서 요구가 다르다.
9
+ 시트의 역할 층이 이미 이 구분을 갖고 있어(-color = 면 · -strong = 바탕 위 글자 ·
10
+ -txt-color = 면 위 글자) 슬롯 이름을 그 어법에 1:1 로 맞춘다.
11
+
12
+ --btn-color 면(solid 배경 · 테두리 · surface 혼합의 원료)
13
+ --btn-txt-color 그 면 **위**의 글자 ← solid
14
+ --btn-color-strong 바탕 **위**의 글자 ← link
15
+
16
+ ⚠셋을 하나로 접으면 다크에서 깨진다: 바탕(#121212)과 on-color(#FFFFFF)가 정반대라
17
+ 한 단이 둘을 맡을 수 없다(Cycle 141 실측 — 다크 primary 면 6.09 ✓ / 바탕 3.07 ✗).
18
+ 장식 축(color="purple" 등)은 세 슬롯이 종전 값으로 수렴하므로 렌더가 변하지 않는다. */
19
+ --btn-txt-color: #fff;
20
+ --btn-color-strong: var(--btn-color);
21
+ --btn-color-strong-hover: color-mix(in srgb, var(--btn-color-strong) 85%, black);
22
+ --btn-color-strong-active: color-mix(in srgb, var(--btn-color-strong) 70%, black);
23
+
7
24
  --btn-color-hover: color-mix(in srgb, var(--btn-color) 85%, black);
8
25
  --btn-color-active: color-mix(in srgb, var(--btn-color) 70%, black);
9
26
  --btn-color-surface: color-mix(in srgb, var(--btn-color) 12%, var(--u-bg-color, #FFFFFF));
@@ -32,7 +49,53 @@ var styles = css`
32
49
  cursor: pointer;
33
50
  }
34
51
 
35
- /* === Color tokens === */
52
+ /* === Role tokens (의미 축) ===
53
+ color="danger" 는 *"위험한 동작"* 을 뜻하고, 그 색이 무엇인지는 소비자의 역할 토큰이
54
+ 정한다. 장식 축과 반대로 **리브랜딩을 따라오고**, 대비 계약(token-contrast.test.ts)이
55
+ 지키는 짝을 그대로 물려받는다.
56
+
57
+ ★장식 램프(shade-600)로 해석하면 안 된다 — 라이트에서 그 단 위의 흰 글자는 8색 중
58
+ 6색이 AA 미달이다(green 3.30 · orange 2.37 · cyan 2.74 …). 역할 값을 쓰는 이유가
59
+ *의미 이름*인데 그 대가로 대비를 잃으면 앞뒤가 맞지 않는다. */
60
+ :host([color="primary"]) {
61
+ --btn-color: var(--u-primary-color, #1976D2);
62
+ --btn-color-strong: var(--u-primary-color-strong, #1565C0);
63
+ --btn-txt-color: var(--u-primary-txt-color, #FFFFFF);
64
+ }
65
+ :host([color="info"]) {
66
+ --btn-color: var(--u-info-color, #1976D2);
67
+ --btn-color-strong: var(--u-info-color-strong, #1565C0);
68
+ --btn-txt-color: var(--u-info-txt-color, #FFFFFF);
69
+ }
70
+ :host([color="success"]) {
71
+ --btn-color: var(--u-success-color, #2E7D32);
72
+ --btn-color-strong: var(--u-success-color-strong, #1B5E20);
73
+ --btn-txt-color: var(--u-success-txt-color, #FFFFFF);
74
+ }
75
+ :host([color="warning"]) {
76
+ --btn-color: var(--u-warning-color, #FDD835);
77
+ --btn-color-strong: var(--u-warning-color-strong, #8A4A00);
78
+ --btn-txt-color: var(--u-warning-txt-color, #000000);
79
+ }
80
+ :host([color="danger"]) {
81
+ --btn-color: var(--u-danger-color, #D32F2F);
82
+ --btn-color-strong: var(--u-danger-color-strong, #C62828);
83
+ --btn-txt-color: var(--u-danger-txt-color, #FFFFFF);
84
+ }
85
+
86
+ /* 역할 축의 link 는 쉬는 상태가 **이미 대비로 선택된 단**(-strong)이라 더 어둡게 하면
87
+ 계약을 벗어난다. 강조는 밑줄이 맡는다 — neutral link 가 쓰는 어법과 같다.
88
+ 장식 축은 종전대로 혼합 파생을 유지한다. */
89
+ :host([color="primary"]),
90
+ :host([color="info"]),
91
+ :host([color="success"]),
92
+ :host([color="warning"]),
93
+ :host([color="danger"]) {
94
+ --btn-color-strong-hover: var(--btn-color-strong);
95
+ --btn-color-strong-active: var(--btn-color-strong);
96
+ }
97
+
98
+ /* === Color tokens (장식 축) === */
36
99
  :host([color="blue"]) { --btn-color: var(--u-blue-600, #1E88E5); }
37
100
  :host([color="green"]) { --btn-color: var(--u-green-600, #43A047); }
38
101
  :host([color="red"]) { --btn-color: var(--u-red-600, #E53935); }
@@ -42,7 +105,20 @@ var styles = css`
42
105
  :host([color="purple"]) { --btn-color: var(--u-purple-600, #8E24AA); }
43
106
  :host([color="pink"]) { --btn-color: var(--u-pink-600, #D81B60); }
44
107
 
45
- /* === Size === */
108
+ /* === Size ===
109
+ *
110
+ * ★**크기 축은 font-size 하나로 움직인다** — 여백·최소높이가 전부 em 이라 비례로 따라온다.
111
+ * 이것은 결손이 아니라 설계다: 폼·인라인 요소의 여백은 상속된 font-size 에 비례하는 것이
112
+ * 의도이며(--u-space-* 는 컨테이너/오버레이의 레이아웃 여백 축이라 여기 닿지 않는다),
113
+ * px 계단을 따로 두면 두 축이 갈라진다.
114
+ *
115
+ * ⚠**그런데 두 값이 그 비례에서 빠져 있었다** (1.20.0 에서 해소):
116
+ * ⑴ 가로 여백이 세로와 **같은 0.5em** 이라 글자가 테두리에 붙었다(실측 md 7px/7px).
117
+ * ⑵ min-height 가 **없어서** 아이콘만 든 버튼이 글자 버튼과 높이가 달랐다 —
118
+ * 실측: 같은 size 인데 md 아이콘 32px vs 글자 37px. 툴바에서 5px 어긋난다.
119
+ * 그리고 아이콘 버튼의 계단(30/32/34)이 글자 버튼(32/37/42)과 기울기가 달라
120
+ * size 를 올릴수록 어긋남이 커졌다.
121
+ */
46
122
  :host([size="sm"]) {
47
123
  font-size: 12px;
48
124
  }
@@ -79,7 +155,7 @@ var styles = css`
79
155
 
80
156
  /* solid: 강한 채움 (기본 color="neutral") */
81
157
  :host([variant="solid"]) {
82
- color: #fff;
158
+ color: var(--btn-txt-color);
83
159
  background-color: var(--btn-color);
84
160
  --btn-border-color: var(--btn-color);
85
161
  }
@@ -148,29 +224,33 @@ var styles = css`
148
224
  background-color: var(--u-bg-color-active, #EEEEEE);
149
225
  }
150
226
 
151
- /* link: blue 링크 스타일 (기본값, color="neutral"일 때도 유지 — 기존 동작 보존) */
227
+ /* link: blue 링크 스타일 (기본값, color="neutral"일 때도 유지 — 기존 동작 보존)
228
+ ★종전 3단(weak → color → strong)은 쉬는 상태가 --u-primary-color-weak (흰 바탕 3.12)라
229
+ 링크 글자가 AA 미달이었고, 그 사이 토큰 층의 --u-link-txt-color 는 어디에서도 쓰이지
230
+ 않았다. 링크 색을 정의해 둔 토큰을 링크가 무시하고 있었던 셈이다.
231
+ 쉬는 상태를 그 토큰으로 되돌리고, 강조는 밑줄과 -strong 한 단으로 표현한다. */
152
232
  :host([variant="link"]) {
153
- color: var(--u-primary-color-weak, #2196F3);
233
+ color: var(--u-link-txt-color, #1565C0);
154
234
  --btn-border-color: transparent;
155
235
  background-color: transparent;
156
236
  --btn-padding-inline: 0;
157
237
  }
158
- :host([variant="link"]:hover) {
159
- color: var(--u-primary-color, #1E88E5);
160
- text-decoration: underline;
161
- }
238
+ :host([variant="link"]:hover),
162
239
  :host([variant="link"]:active) {
163
- color: var(--u-primary-color-strong, #1976D2);
240
+ color: var(--u-primary-color-strong, #1565C0);
241
+ text-decoration: underline;
164
242
  }
165
- /* link + 명시적 non-neutral color: 링크 자체 색상을 재정의 (예: 파괴적 액션 링크) */
243
+ /* link + 명시적 non-neutral color: 링크 자체 색상을 재정의 (예: 파괴적 액션 링크)
244
+ ★여기는 **바탕 위의 글자**다 — 면 슬롯(--btn-color)이 아니라 --btn-color-strong 을
245
+ 읽는다. 장식 축에서는 둘이 같은 값이라 렌더가 변하지 않고, 역할 축에서만 갈린다. */
166
246
  :host([variant="link"][color]:not([color="neutral"])) {
167
- color: var(--btn-color);
247
+ color: var(--btn-color-strong);
168
248
  }
169
249
  :host([variant="link"][color]:not([color="neutral"]):hover) {
170
- color: var(--btn-color-hover);
250
+ color: var(--btn-color-strong-hover);
171
251
  }
172
252
  :host([variant="link"][color]:not([color="neutral"]):active) {
173
- color: var(--btn-color-active);
253
+ color: var(--btn-color-strong-active);
174
254
  }
175
255
 
176
256
  /* === Inner ===
@@ -192,9 +272,20 @@ var styles = css`
192
272
  align-items: center;
193
273
  justify-content: space-between;
194
274
 
195
- padding: var(--btn-padding-block, 0.5em) var(--btn-padding-inline, 0.5em);
275
+ padding: var(--btn-padding-block, 0.5em) var(--btn-padding-inline, 1em);
196
276
  border: 1px solid var(--btn-border-color, transparent);
197
277
  border-radius: inherit;
278
+
279
+ /* ★**글자 버튼의 자연 높이를 그대로 바닥값으로 쓴다** — 값을 새로 고른 것이 아니라
280
+ * 같은 식을 다시 쓴 것이다:
281
+ *
282
+ * line-height(1.5em) + 상하 여백 ×2 + 테두리 ×2
283
+ *
284
+ * 그래서 글자 버튼의 높이는 **변하지 않고**(sm 32 · md 37 · lg 42 그대로),
285
+ * 아이콘만 든 버튼이 같은 높이로 올라온다. 상수를 박으면 이 성질이 깨진다 —
286
+ * 소비자가 --btn-padding-block 을 덮는 순간 둘이 다시 갈라진다. */
287
+ min-height: calc(1.5em + 2 * var(--btn-padding-block, 0.5em) + 2px);
288
+
198
289
  }
199
290
  a {
200
291
  text-decoration: none;
@@ -5,7 +5,7 @@ var styles = css`
5
5
  display: flex;
6
6
  border-radius: var(--u-radius-xl, 8px);
7
7
  background-color: var(--u-panel-bg-color, #FFFFFF);
8
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
8
+ box-shadow: var(--u-shadow-md, 0 2px 8px rgba(0, 0, 0, 0.12));
9
9
  overflow: hidden;
10
10
 
11
11
  --card-border-width: 1px;
@@ -41,7 +41,7 @@ var styles = css`
41
41
  }
42
42
  :host([hoverable]:hover) {
43
43
  transform: translateY(-2px);
44
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
44
+ box-shadow: var(--u-shadow-lg, 0 4px 12px rgba(0, 0, 0, 0.16));
45
45
  }
46
46
 
47
47
  .media {
@@ -60,11 +60,11 @@ var styles = css`
60
60
  font-size: 20px;
61
61
  color: var(--u-neutral-900, #212121);
62
62
  background-color: var(--u-neutral-100, #F5F5F5);
63
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
63
+ box-shadow: var(--u-shadow-md, 0 2px 8px rgba(0, 0, 0, 0.12));
64
64
  }
65
65
  .nav-button:hover {
66
66
  background-color: var(--u-neutral-200, #EEEEEE);
67
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
67
+ box-shadow: var(--u-shadow-lg, 0 4px 12px rgba(0, 0, 0, 0.16));
68
68
  transform: translateY(-50%) scale(1.1);
69
69
  }
70
70
  .nav-button:active {
@@ -1,7 +1,8 @@
1
1
  import { PropertyValues } from 'lit';
2
2
  import { UFormControlElement } from '../UFormControlElement.js';
3
3
  export type CheckboxVariant = "filled" | "outline";
4
- export type CheckboxColor = "blue" | "green" | "red" | "orange" | "teal" | "cyan" | "purple" | "pink" | "neutral";
4
+ /** 역할 축(`primary`…`danger`, 의미 · 리브랜딩을 따라옴)과 장식 축(`blue`…, 자체 · 면역)이 병존한다. */
5
+ export type CheckboxColor = "primary" | "info" | "success" | "warning" | "danger" | "blue" | "green" | "red" | "orange" | "teal" | "cyan" | "purple" | "pink" | "neutral";
5
6
  /**
6
7
  * 선택/해제 상태를 토글하는 체크박스 컴포넌트입니다.
7
8
  * indeterminate 상태도 지원합니다.
@@ -2,7 +2,7 @@ import { css } from "lit";
2
2
  //#region src/components/checkbox/UCheckbox.styles.ts
3
3
  var styles = css`
4
4
  :host {
5
- --checkbox-fill-color: var(--u-primary-color, #1E88E5);
5
+ --checkbox-fill-color: var(--u-primary-color, #1976D2);
6
6
  --checkbox-color: inherit;
7
7
  --checkbox-border-color: var(--u-input-border-color, #E0E0E0);
8
8
  --checkbox-background-color: var(--u-input-bg-color, #FFFFFF);
@@ -27,10 +27,10 @@ var styles = css`
27
27
  cursor: default;
28
28
  }
29
29
  :host([invalid]) {
30
- --checkbox-border-color: var(--u-danger-color, #E53935);
30
+ --checkbox-border-color: var(--u-danger-color, #D32F2F);
31
31
  }
32
32
  :host([invalid]) .footer {
33
- color: var(--u-danger-color, #E53935);
33
+ color: var(--u-danger-color-strong, #C62828);
34
34
  }
35
35
  :host([checked]) .checkbox u-icon,
36
36
  :host([indeterminate]) .checkbox u-icon {
@@ -43,7 +43,8 @@ var styles = css`
43
43
  /* === Variant: filled - 배경 채움 === */
44
44
  :host([variant="filled"][checked]),
45
45
  :host([variant="filled"][indeterminate]) {
46
- --checkbox-color: var(--u-neutral-100, #F5F5F5);
46
+ /* 체크 표시가 **채운 면 위**에 선다 — 역할 축에서만 on-color 로 갈린다(장식 축은 폴백). */
47
+ --checkbox-color: var(--checkbox-hue-on-fill, var(--u-neutral-100, #F5F5F5));
47
48
  --checkbox-border-color: var(--checkbox-hue, var(--checkbox-fill-color));
48
49
  --checkbox-background-color: var(--checkbox-hue, var(--checkbox-fill-color));
49
50
  }
@@ -51,11 +52,43 @@ var styles = css`
51
52
  /* === Variant: outline - 테두리만 === */
52
53
  :host([variant="outline"][checked]),
53
54
  :host([variant="outline"][indeterminate]) {
54
- --checkbox-color: var(--checkbox-hue, var(--checkbox-fill-color));
55
+ /* 여기서는 같은 표시가 **바탕 위**에 선다 — 면 단이 아니라 -strong 이 맡는다. */
56
+ --checkbox-color: var(--checkbox-hue-strong, var(--checkbox-hue, var(--checkbox-fill-color)));
55
57
  --checkbox-border-color: var(--checkbox-hue, var(--checkbox-fill-color));
56
58
  --checkbox-background-color: transparent;
57
59
  }
58
60
 
61
+ /* ==========================================================================
62
+ 역할 축 — 의미 슬롯. 장식 축(아래)과 달리 팔레트가 아니라 역할 토큰을 읽는다.
63
+ 슬롯이 셋인 이유는 체크 표시가 두 자리에 서기 때문이다 —
64
+ filled 는 **채운 면 위**(그래서 on-color), outline 은 **바탕 위**(그래서 -strong).
65
+ ========================================================================== */
66
+ :host([color="primary"]) {
67
+ --checkbox-hue: var(--u-primary-color, #1976D2);
68
+ --checkbox-hue-on-fill: var(--u-primary-txt-color, #FFFFFF);
69
+ --checkbox-hue-strong: var(--u-primary-color-strong, #1565C0);
70
+ }
71
+ :host([color="info"]) {
72
+ --checkbox-hue: var(--u-info-color, #1976D2);
73
+ --checkbox-hue-on-fill: var(--u-info-txt-color, #FFFFFF);
74
+ --checkbox-hue-strong: var(--u-info-color-strong, #1565C0);
75
+ }
76
+ :host([color="success"]) {
77
+ --checkbox-hue: var(--u-success-color, #2E7D32);
78
+ --checkbox-hue-on-fill: var(--u-success-txt-color, #FFFFFF);
79
+ --checkbox-hue-strong: var(--u-success-color-strong, #1B5E20);
80
+ }
81
+ :host([color="warning"]) {
82
+ --checkbox-hue: var(--u-warning-color, #FDD835);
83
+ --checkbox-hue-on-fill: var(--u-warning-txt-color, #000000);
84
+ --checkbox-hue-strong: var(--u-warning-color-strong, #8A4A00);
85
+ }
86
+ :host([color="danger"]) {
87
+ --checkbox-hue: var(--u-danger-color, #D32F2F);
88
+ --checkbox-hue-on-fill: var(--u-danger-txt-color, #FFFFFF);
89
+ --checkbox-hue-strong: var(--u-danger-color-strong, #C62828);
90
+ }
91
+
59
92
  /* ==========================================================================
60
93
  장식 축 — color= 는 hue 슬롯만 채운다. variant 규칙이 폴백과 함께 읽는다.
61
94
  기본값 blue 는 규칙이 없다 = 슬롯이 비어 브랜드 훅(--checkbox-fill-color)을 탄다.
@@ -104,8 +137,8 @@ var styles = css`
104
137
  }
105
138
  input:focus-visible ~ .checkbox {
106
139
  box-shadow:
107
- 0 0 0 1px var(--u-input-border-color-focus, #1E88E5),
108
- 0 0 0 3px rgba(59, 130, 246, 0.22);
140
+ 0 0 0 1px var(--u-input-border-color-focus, #1565C0),
141
+ 0 0 0 3px color-mix(in srgb, var(--u-primary-color-strong, #1565C0) 22%, transparent);
109
142
  }
110
143
 
111
144
  /* 체크박스 외형 */
@@ -137,7 +170,7 @@ var styles = css`
137
170
  }
138
171
 
139
172
  .required {
140
- color: var(--u-danger-color, #E53935);
173
+ color: var(--u-danger-color-strong, #C62828);
141
174
  font-weight: 500;
142
175
  }
143
176
 
@@ -149,7 +182,7 @@ var styles = css`
149
182
  }
150
183
 
151
184
  :host([invalid]) .description {
152
- color: var(--u-danger-color, #E53935);
185
+ color: var(--u-danger-color-strong, #C62828);
153
186
  }
154
187
  `;
155
188
  //#endregion
@@ -14,12 +14,12 @@ var styles = css`
14
14
  }
15
15
 
16
16
  :host([copied]) u-icon-button {
17
- color: var(--u-success-color-weak, #4CAF50);
17
+ color: var(--u-success-color-strong, #1B5E20);
18
18
  }
19
19
 
20
20
  /* 라벨 형태(아이콘+텍스트): 복사 완료 시 아이콘/텍스트를 성공색으로 강조 */
21
21
  :host([copied]) u-button {
22
- color: var(--u-success-color-weak, #4CAF50);
22
+ color: var(--u-success-color-strong, #1B5E20);
23
23
  }
24
24
  `;
25
25
  //#endregion
@@ -70,7 +70,7 @@ var styles = css`
70
70
  border: 1px solid var(--u-border-color, color-mix(in srgb, CanvasText 20%, Canvas));
71
71
  border-radius: var(--u-radius-lg, 6px);
72
72
  background: var(--u-panel-bg-color, Canvas);
73
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
73
+ box-shadow: var(--u-shadow-xl, 0 6px 18px rgba(0, 0, 0, 0.24));
74
74
  pointer-events: auto;
75
75
  opacity: 0;
76
76
  transform: scale(0.92);
@@ -57,7 +57,7 @@ var styles = css`
57
57
  display: flex;
58
58
  flex-direction: column;
59
59
  background: var(--u-panel-bg-color, Canvas);
60
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
60
+ box-shadow: var(--u-shadow-xl, 0 6px 18px rgba(0, 0, 0, 0.24));
61
61
  pointer-events: auto;
62
62
  /*
63
63
  * easeOutQuart (cubic-bezier(0.22, 1, 0.36, 1)) — 빠르게 시작해서 부드럽게 정착.
@@ -12,7 +12,7 @@ var styles = css`
12
12
  cursor: not-allowed;
13
13
  }
14
14
  :host([invalid]) .footer {
15
- color: var(--u-danger-color, #E53935);
15
+ color: var(--u-danger-color-strong, #C62828);
16
16
  }
17
17
 
18
18
  .header {
@@ -32,7 +32,7 @@ var styles = css`
32
32
  }
33
33
 
34
34
  .required {
35
- color: var(--u-danger-color, #E53935);
35
+ color: var(--u-danger-color-strong, #C62828);
36
36
  margin-right: 0.2em;
37
37
  }
38
38
 
@@ -11,7 +11,7 @@ var styles = css`
11
11
  color: #fff;
12
12
  }
13
13
  :host([variant="link"]) {
14
- color: var(--u-primary-color-weak, #2196F3);
14
+ color: var(--u-link-txt-color, #1565C0);
15
15
  }
16
16
 
17
17
  u-button {
@@ -38,10 +38,10 @@ var styles = css`
38
38
  box-shadow: 0 0 0 1px var(--u-input-border-color-hover, #BDBDBD);
39
39
  }
40
40
  :host(:not([readonly]):not([disabled])) .container:focus-within {
41
- box-shadow: 0 0 0 1px var(--u-input-border-color-focus, #1E88E5);
41
+ box-shadow: 0 0 0 1px var(--u-input-border-color-focus, #1565C0);
42
42
  }
43
43
  :host([invalid]:not([readonly]):not([disabled])) .container {
44
- box-shadow: 0 0 0 1px var(--u-input-border-color-invalid, #E53935);
44
+ box-shadow: 0 0 0 1px var(--u-input-border-color-invalid, #C62828);
45
45
  }
46
46
 
47
47
  /* ===== Variant: filled ===== */
@@ -63,11 +63,11 @@ var styles = css`
63
63
  }
64
64
  :host([variant="filled"]:not([readonly]):not([disabled])) .container:focus-within {
65
65
  box-shadow: none;
66
- border-bottom-color: var(--u-input-border-color-focus, #1E88E5);
66
+ border-bottom-color: var(--u-input-border-color-focus, #1565C0);
67
67
  }
68
68
  :host([variant="filled"][invalid]:not([readonly]):not([disabled])) .container {
69
69
  box-shadow: none;
70
- border-bottom-color: var(--u-input-border-color-invalid, #E53935);
70
+ border-bottom-color: var(--u-input-border-color-invalid, #C62828);
71
71
  }
72
72
 
73
73
  /* ===== Variant: underlined ===== */
@@ -90,12 +90,12 @@ var styles = css`
90
90
  }
91
91
  :host([variant="underlined"]:not([readonly]):not([disabled])) .container:focus-within {
92
92
  box-shadow: none;
93
- border-bottom-color: var(--u-input-border-color-focus, #1E88E5);
93
+ border-bottom-color: var(--u-input-border-color-focus, #1565C0);
94
94
  border-bottom-width: 2px;
95
95
  }
96
96
  :host([variant="underlined"][invalid]:not([readonly]):not([disabled])) .container {
97
97
  box-shadow: none;
98
- border-bottom-color: var(--u-input-border-color-invalid, #E53935);
98
+ border-bottom-color: var(--u-input-border-color-invalid, #C62828);
99
99
  }
100
100
 
101
101
  /* ===== Variant: borderless ===== */
@@ -161,10 +161,10 @@ var styles = css`
161
161
  cursor: pointer;
162
162
  }
163
163
  .suffix-item:hover {
164
- color: var(--u-icon-color-hover, #1E88E5);
164
+ color: var(--u-icon-color-hover, #1565C0);
165
165
  }
166
166
  .suffix-item:active {
167
- color: var(--u-icon-color-active, #1E88E5);
167
+ color: var(--u-icon-color-active, #1565C0);
168
168
  }
169
169
 
170
170
  u-popover {
@@ -175,7 +175,7 @@ var styles = css`
175
175
  border: 1px solid var(--u-border-color, #E0E0E0);
176
176
  border-radius: var(--u-radius-lg, 6px);
177
177
  background-color: var(--u-panel-bg-color, #FFFFFF);
178
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
178
+ box-shadow: var(--u-shadow-lg, 0 4px 12px rgba(0, 0, 0, 0.16));
179
179
  overflow-x: auto;
180
180
  overflow-y: auto;
181
181
  }
@@ -3,7 +3,7 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  :host {
5
5
  --menu-item-depth: 0;
6
- --menu-item-color: var(--u-primary-color, #1E88E5);
6
+ --menu-item-color: var(--u-primary-color, #1976D2);
7
7
  }
8
8
 
9
9
  :host {
@@ -139,7 +139,7 @@ var styles = css`
139
139
  border: 1px solid var(--u-border-color, #E0E0E0);
140
140
  border-radius: var(--u-radius-md, 4px);
141
141
  background-color: var(--u-panel-bg-color, #FFFFFF);
142
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
142
+ box-shadow: var(--u-shadow-md, 0 2px 8px rgba(0, 0, 0, 0.12));
143
143
  transform: scale(0.8);
144
144
  transition: opacity 0.2s ease, visibility 0s 0.2s, transform 0.2s ease;
145
145
  }
@@ -2,7 +2,7 @@ import { css } from "lit";
2
2
  //#region src/components/option/UOption.styles.ts
3
3
  var styles = css`
4
4
  :host {
5
- --option-color: var(--u-primary-color, #1E88E5);
5
+ --option-color: var(--u-primary-color, #1976D2);
6
6
  --option-color-interactive: inherit;
7
7
  --option-border-color-interactive: var(--u-border-color-hover, #BDBDBD);
8
8
  --option-background-color-interactive: var(--u-bg-color-hover, #F5F5F5);
@@ -3,26 +3,26 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  :host {
5
5
  --progress-bar-height: 0.5em;
6
- --progress-bar-color: var(--u-primary-color, #1E88E5);
6
+ --progress-bar-color: var(--u-primary-color-strong, #1565C0);
7
7
  --progress-bar-buffer-color: color-mix(in srgb, var(--progress-bar-color) 35%, var(--u-bg-color, #FFFFFF));
8
8
  --progress-bar-track-color: var(--u-neutral-200, #EEEEEE);
9
9
  }
10
10
 
11
11
  /* === Status Colors === */
12
12
  :host([status="success"]) {
13
- --progress-bar-color: var(--u-success-color, #43A047);
13
+ --progress-bar-color: var(--u-success-color-strong, #1B5E20);
14
14
  --progress-bar-buffer-color: var(--u-success-color-weakest, #A5D6A7);
15
15
  }
16
16
  :host([status="warning"]) {
17
- --progress-bar-color: var(--u-warning-color-weak, #FFEB3B);
17
+ --progress-bar-color: var(--u-warning-color-strong, #8A4A00);
18
18
  --progress-bar-buffer-color: var(--u-warning-color-weakest, #FFF59D);
19
19
  }
20
20
  :host([status="error"]) {
21
- --progress-bar-color: var(--u-danger-color, #E53935);
21
+ --progress-bar-color: var(--u-danger-color-strong, #C62828);
22
22
  --progress-bar-buffer-color: var(--u-danger-color-weakest, #EF9A9A);
23
23
  }
24
24
  :host([status="info"]) {
25
- --progress-bar-color: var(--u-info-color-weak, #2196F3);
25
+ --progress-bar-color: var(--u-info-color-strong, #1565C0);
26
26
  --progress-bar-buffer-color: var(--u-info-color-weakest, #90CAF9);
27
27
  }
28
28
 
@@ -3,7 +3,7 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  :host {
5
5
  --progress-ring-size: 6em;
6
- --progress-ring-color: var(--u-primary-color, #1E88E5);
6
+ --progress-ring-color: var(--u-primary-color-strong, #1565C0);
7
7
  --progress-ring-track-width: 6;
8
8
  --progress-ring-track-color: var(--u-neutral-200, #EEEEEE);
9
9
  --progress-ring-buffer-color: color-mix(in srgb, var(--progress-ring-color) 35%, var(--u-bg-color, #FFFFFF));
@@ -11,19 +11,19 @@ var styles = css`
11
11
 
12
12
  /* === Status Colors === */
13
13
  :host([status="success"]) {
14
- --progress-ring-color: var(--u-success-color, #43A047);
14
+ --progress-ring-color: var(--u-success-color-strong, #1B5E20);
15
15
  --progress-ring-buffer-color: var(--u-success-color-weakest, #A5D6A7);
16
16
  }
17
17
  :host([status="warning"]) {
18
- --progress-ring-color: var(--u-warning-color-weak, #FFEB3B);
18
+ --progress-ring-color: var(--u-warning-color-strong, #8A4A00);
19
19
  --progress-ring-buffer-color: var(--u-warning-color-weakest, #FFF59D);
20
20
  }
21
21
  :host([status="error"]) {
22
- --progress-ring-color: var(--u-danger-color, #E53935);
22
+ --progress-ring-color: var(--u-danger-color-strong, #C62828);
23
23
  --progress-ring-buffer-color: var(--u-danger-color-weakest, #EF9A9A);
24
24
  }
25
25
  :host([status="info"]) {
26
- --progress-ring-color: var(--u-info-color-weak, #2196F3);
26
+ --progress-ring-color: var(--u-info-color-strong, #1565C0);
27
27
  --progress-ring-buffer-color: var(--u-info-color-weakest, #90CAF9);
28
28
  }
29
29