@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
@@ -2,7 +2,7 @@ import { css } from "lit";
2
2
  //#region src/components/radio/URadio.styles.ts
3
3
  var styles = css`
4
4
  :host {
5
- --radio-color: var(--u-primary-color, #1E88E5);
5
+ --radio-color: var(--u-primary-color, #1976D2);
6
6
  --radio-color-active: color-mix(in srgb, var(--radio-color) 85%, black);
7
7
  }
8
8
 
@@ -38,7 +38,7 @@ var styles = css`
38
38
  border-radius: 0.35em;
39
39
  }
40
40
  :host([invalid]) .container {
41
- border-color: var(--u-danger-color, #E53935);
41
+ border-color: var(--u-danger-color, #D32F2F);
42
42
  }
43
43
 
44
44
  /* Type: default */
@@ -2,7 +2,7 @@ import { css } from "lit";
2
2
  //#region src/components/rating/URating.styles.ts
3
3
  var styles = css`
4
4
  :host {
5
- --rating-symbol-color: var(--u-warning-color-weak, #FFEB3B);
5
+ --rating-symbol-color: var(--u-warning-color-strong, #8A4A00);
6
6
  --rating-symbol-off-color: var(--u-neutral-300, #E0E0E0);
7
7
  }
8
8
 
@@ -32,7 +32,7 @@ var styles = css`
32
32
  transition: color 0.15s ease, transform 0.15s ease;
33
33
  }
34
34
  .symbol:focus-visible {
35
- outline: 2px solid var(--u-primary-color-weak, #2196F3);
35
+ outline: 2px solid var(--u-primary-color-strong, #1565C0);
36
36
  outline-offset: 2px;
37
37
  }
38
38
  :host(:not([disabled]):not([readonly])) .symbol:hover {
@@ -44,10 +44,10 @@ var styles = css`
44
44
  box-shadow: 0 0 0 1px var(--u-input-border-color-hover, #BDBDBD);
45
45
  }
46
46
  :host(:not([readonly]):not([disabled])) .container:focus-within {
47
- box-shadow: 0 0 0 1px var(--u-input-border-color-focus, #1E88E5);
47
+ box-shadow: 0 0 0 1px var(--u-input-border-color-focus, #1565C0);
48
48
  }
49
49
  :host([invalid]:not([readonly]):not([disabled])) .container {
50
- box-shadow: 0 0 0 1px var(--u-input-border-color-invalid, #E53935);
50
+ box-shadow: 0 0 0 1px var(--u-input-border-color-invalid, #C62828);
51
51
  }
52
52
 
53
53
  /* ===== Variant: filled ===== */
@@ -69,11 +69,11 @@ var styles = css`
69
69
  }
70
70
  :host([variant="filled"]:not([readonly]):not([disabled])) .container:focus-within {
71
71
  box-shadow: none;
72
- border-bottom-color: var(--u-input-border-color-focus, #1E88E5);
72
+ border-bottom-color: var(--u-input-border-color-focus, #1565C0);
73
73
  }
74
74
  :host([variant="filled"][invalid]:not([readonly]):not([disabled])) .container {
75
75
  box-shadow: none;
76
- border-bottom-color: var(--u-input-border-color-invalid, #E53935);
76
+ border-bottom-color: var(--u-input-border-color-invalid, #C62828);
77
77
  }
78
78
 
79
79
  /* ===== Variant: underlined ===== */
@@ -96,12 +96,12 @@ var styles = css`
96
96
  }
97
97
  :host([variant="underlined"]:not([readonly]):not([disabled])) .container:focus-within {
98
98
  box-shadow: none;
99
- border-bottom-color: var(--u-input-border-color-focus, #1E88E5);
99
+ border-bottom-color: var(--u-input-border-color-focus, #1565C0);
100
100
  border-bottom-width: 2px;
101
101
  }
102
102
  :host([variant="underlined"][invalid]:not([readonly]):not([disabled])) .container {
103
103
  box-shadow: none;
104
- border-bottom-color: var(--u-input-border-color-invalid, #E53935);
104
+ border-bottom-color: var(--u-input-border-color-invalid, #C62828);
105
105
  }
106
106
 
107
107
  /* ===== Variant: borderless ===== */
@@ -120,6 +120,8 @@ var styles = css`
120
120
  .count {
121
121
  color: var(--u-txt-color-weak, #757575);
122
122
  line-height: 1.25;
123
+ /* n / m 은 제자리에서 n 이 바뀐다 — 비례폭이면 선택할 때마다 라벨 줄이 흔들린다 */
124
+ font-variant-numeric: tabular-nums;
123
125
  }
124
126
 
125
127
  .text-content {
@@ -157,10 +159,10 @@ var styles = css`
157
159
  cursor: pointer;
158
160
  }
159
161
  .suffix-item:hover {
160
- color: var(--u-icon-color-hover, #1E88E5);
162
+ color: var(--u-icon-color-hover, #1565C0);
161
163
  }
162
164
  .suffix-item:active {
163
- color: var(--u-icon-color-active, #1E88E5);
165
+ color: var(--u-icon-color-active, #1565C0);
164
166
  }
165
167
 
166
168
  /* 드롭다운 패널 — 옵션 텍스트가 길어도 팝오버가 앵커보다 넓어지지 않도록 고정 너비로
@@ -173,7 +175,7 @@ var styles = css`
173
175
  border: 1px solid var(--u-border-color, #E0E0E0);
174
176
  border-radius: var(--u-radius-lg, 6px);
175
177
  background-color: var(--u-panel-bg-color, #FFFFFF);
176
- 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));
177
179
  overflow-x: hidden;
178
180
  overflow-y: auto;
179
181
  }
@@ -2,7 +2,7 @@ import { css } from "lit";
2
2
  //#region src/components/slider/USlider.styles.ts
3
3
  var styles = css`
4
4
  :host {
5
- --slider-fill-color: var(--u-primary-color, #1E88E5);
5
+ --slider-fill-color: var(--u-primary-color, #1976D2);
6
6
  --slider-track-color: var(--u-neutral-300, #E0E0E0);
7
7
  --slider-track-height: 6px;
8
8
  --slider-thumb-size: 18px;
@@ -21,6 +21,14 @@ var styles = css`
21
21
  font-family: var(--u-font-base);
22
22
  }
23
23
 
24
+ /* 라이브러리가 **스스로 그리는 숫자**는 고정폭 자릿수로 낸다.
25
+ 둘 다 제자리에서 값이 바뀌는 자리라 비례폭이면 드래그 중 글자가 흔들린다.
26
+ ★툴팁은 슬롯을 건너 상속으로 닿는다 — font-variant-numeric 은 상속 프로퍼티다. */
27
+ [slot="label-aside"],
28
+ u-tooltip[part="thumb-tooltip"] {
29
+ font-variant-numeric: tabular-nums;
30
+ }
31
+
24
32
  .container {
25
33
  position: relative;
26
34
  height: var(--slider-thumb-size);
@@ -67,14 +75,14 @@ var styles = css`
67
75
  border: 2px solid var(--slider-thumb-border-color);
68
76
  border-radius: var(--u-radius-circle, 50%);
69
77
  background: var(--slider-thumb-color);
70
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
78
+ box-shadow: var(--u-shadow-sm, 0 1px 3px rgba(0, 0, 0, 0.08));
71
79
  transition: transform 0.15s ease, box-shadow 0.15s ease;
72
80
  cursor: pointer;
73
81
  }
74
82
  .thumb:hover .thumb-content,
75
83
  .thumb:active .thumb-content {
76
84
  transform: scale(1.15);
77
- box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3);
85
+ box-shadow: var(--u-shadow-md, 0 2px 8px rgba(0, 0, 0, 0.12));
78
86
  }
79
87
  .thumb:focus-visible .thumb-content {
80
88
  box-shadow: 0 0 0 1px var(--slider-fill-color);
@@ -1,5 +1,6 @@
1
1
  import { UElement } from '../UElement.js';
2
- export type SpinnerColor = "neutral" | "blue" | "green" | "yellow" | "red" | "orange" | "teal" | "cyan" | "purple" | "pink";
2
+ /** 역할 축(`primary`…`danger`, 의미 · 리브랜딩을 따라옴)과 장식 축(`blue`…, 자체 · 면역)이 병존한다. */
3
+ export type SpinnerColor = "neutral" | "primary" | "info" | "success" | "warning" | "danger" | "blue" | "green" | "yellow" | "red" | "orange" | "teal" | "cyan" | "purple" | "pink";
3
4
  /**
4
5
  * 로딩 상태를 나타내는 회전 스피너 컴포넌트입니다.
5
6
  *
@@ -4,11 +4,19 @@ var styles = css`
4
4
  :host {
5
5
  --spinner-track-width: 0.125em;
6
6
  --spinner-track-color: var(--u-neutral-200, #EEEEEE);
7
- --spinner-indicator-color: var(--u-primary-color, #1E88E5);
7
+ --spinner-indicator-color: var(--u-primary-color, #1976D2);
8
8
  --spinner-indicator-speed: 2s;
9
9
  }
10
10
 
11
11
  /* Color variants */
12
+ /* 역할 축 — 스피너는 **바탕 위의 그래픽**이므로 면 단(-color)이 아니라 -strong 을
13
+ 읽는다. 다크에서 -color 는 바탕 위 3.07 까지 떨어진다(Cycle 141 실측). */
14
+ :host([color="primary"]) { --spinner-indicator-color: var(--u-primary-color-strong, #1565C0); }
15
+ :host([color="info"]) { --spinner-indicator-color: var(--u-info-color-strong, #1565C0); }
16
+ :host([color="success"]) { --spinner-indicator-color: var(--u-success-color-strong, #1B5E20); }
17
+ :host([color="warning"]) { --spinner-indicator-color: var(--u-warning-color-strong, #8A4A00); }
18
+ :host([color="danger"]) { --spinner-indicator-color: var(--u-danger-color-strong, #C62828); }
19
+
12
20
  :host([color="blue"]) { --spinner-indicator-color: var(--u-blue-600, #1E88E5); }
13
21
  :host([color="green"]) { --spinner-indicator-color: var(--u-green-600, #43A047); }
14
22
  :host([color="yellow"]) { --spinner-indicator-color: var(--u-yellow-600, #FDD835); }
@@ -5,7 +5,7 @@ var styles = css`
5
5
  --splitter-size: 4px;
6
6
  --splitter-color: var(--u-neutral-200, #EEEEEE);
7
7
  --splitter-color-hover: var(--u-primary-color-weaker, #64B5F6);
8
- --splitter-color-active: var(--u-primary-color-weak, #2196F3);
8
+ --splitter-color-active: var(--u-primary-color-strong, #1565C0);
9
9
  }
10
10
 
11
11
  :host {
@@ -5,7 +5,7 @@ var styles = css`
5
5
  --switch-track-width: 2.4em;
6
6
  --switch-track-height: 1.4em;
7
7
  --switch-track-color: var(--u-neutral-300, #E0E0E0);
8
- --switch-track-color-checked: var(--u-primary-color, #1E88E5);
8
+ --switch-track-color-checked: var(--u-primary-color, #1976D2);
9
9
  --switch-thumb-size: 1.1em;
10
10
  --switch-thumb-offset: 0.15em;
11
11
  --switch-thumb-color: #fff;
@@ -34,7 +34,7 @@ var styles = css`
34
34
  cursor: default;
35
35
  }
36
36
  :host([invalid]) .track {
37
- outline: 2px solid var(--u-danger-color, #E53935);
37
+ outline: 2px solid var(--u-danger-color, #D32F2F);
38
38
  outline-offset: 1px;
39
39
  }
40
40
  :host(:not([disabled]):not([readonly]):hover) .track {
@@ -56,8 +56,8 @@ var styles = css`
56
56
  }
57
57
  input:focus-visible ~ .track {
58
58
  box-shadow:
59
- 0 0 0 1px var(--u-input-border-color-focus, #1E88E5),
60
- 0 0 0 3px rgba(59, 130, 246, 0.22);
59
+ 0 0 0 1px var(--u-input-border-color-focus, #1565C0),
60
+ 0 0 0 3px color-mix(in srgb, var(--u-primary-color-strong, #1565C0) 22%, transparent);
61
61
  }
62
62
 
63
63
  /* === 트랙 === */
@@ -123,7 +123,7 @@ var styles = css`
123
123
  height: var(--switch-thumb-size);
124
124
  border-radius: var(--switch-radius);
125
125
  background: var(--switch-thumb-color);
126
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
126
+ box-shadow: var(--u-shadow-sm, 0 1px 3px rgba(0, 0, 0, 0.08));
127
127
  overflow: hidden;
128
128
  transition:
129
129
  transform var(--switch-duration) cubic-bezier(0.4, 0, 0.2, 1),
@@ -176,7 +176,7 @@ var styles = css`
176
176
  }
177
177
 
178
178
  .required {
179
- color: var(--u-danger-color, #E53935);
179
+ color: var(--u-danger-color-strong, #C62828);
180
180
  font-weight: 500;
181
181
  }
182
182
 
@@ -188,7 +188,7 @@ var styles = css`
188
188
  }
189
189
 
190
190
  :host([invalid]) .description {
191
- color: var(--u-danger-color, #E53935);
191
+ color: var(--u-danger-color-strong, #C62828);
192
192
  }
193
193
  `;
194
194
  //#endregion
@@ -2,7 +2,7 @@ import { css } from "lit";
2
2
  //#region src/components/tab-panel/UTabPanel.styles.ts
3
3
  var styles = css`
4
4
  :host {
5
- --tab-panel-color: var(--u-primary-color, #1E88E5);
5
+ --tab-panel-color: var(--u-primary-color, #1976D2);
6
6
  }
7
7
 
8
8
  :host {
@@ -188,7 +188,7 @@ var styles = css`
188
188
  :host([variant="pill"]) ::slotted(u-tab[active]) {
189
189
  border-color: var(--u-border-color, #E0E0E0);
190
190
  background-color: var(--u-neutral-0, #FFFFFF);
191
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
191
+ box-shadow: var(--u-shadow-sm, 0 1px 3px rgba(0, 0, 0, 0.08));
192
192
  }
193
193
 
194
194
  /* Variant: plain */
@@ -1,6 +1,11 @@
1
1
  import { UElement } from '../UElement.js';
2
2
  export type TagVariant = "solid" | "surface" | "filled" | "outlined";
3
- export type TagColor = "neutral" | "blue" | "green" | "yellow" | "red" | "orange" | "teal" | "cyan" | "purple" | "pink";
3
+ /**
4
+ * 두 축이 병존한다 — **역할 축**(`primary`·`info`·`success`·`warning`·`danger`)은 *의미*를
5
+ * 말하고 리브랜딩을 따라오며 대비 계약을 물려받는다. **장식 축**(`blue`·`purple` …)은
6
+ * *색 자체*를 말하고 리브랜딩에 의도적으로 면역이다.
7
+ */
8
+ export type TagColor = "neutral" | "primary" | "info" | "success" | "warning" | "danger" | "blue" | "green" | "yellow" | "red" | "orange" | "teal" | "cyan" | "purple" | "pink";
4
9
  /**
5
10
  * 레이블, 카테고리, 상태 등을 표시하는 태그 컴포넌트입니다.
6
11
  *
@@ -2,12 +2,63 @@ import { css } from "lit";
2
2
  //#region src/components/tag/UTag.styles.ts
3
3
  var styles = css`
4
4
  :host {
5
- --tag-fill-color: var(--u-primary-color, #1E88E5);
5
+ --tag-fill-color: var(--u-primary-color, #1976D2);
6
6
  --tag-color: var(--u-neutral-800, #424242);
7
7
  --tag-bg-color: var(--u-neutral-100, #F5F5F5);
8
8
  --tag-border-color: transparent;
9
9
  }
10
10
 
11
+ /* ==========================================================================
12
+ 역할 축 — 의미 슬롯 매핑
13
+ color="danger" 는 색이 아니라 *"위험"* 을 뜻한다. 장식 축(아래)과 달리 팔레트가 아니라
14
+ **역할 토큰**을 읽으므로 리브랜딩을 따라오고, 대비 계약이 지키는 짝을 물려받는다.
15
+
16
+ 슬롯이 여섯인 이유는 자리마다 대비 요구가 다르기 때문이다(실측, 두 테마 전건 AA):
17
+ solid 면 --u-{role}-color + 그 위 글자 --u-{role}-txt-color (4.60~15.05)
18
+ surface 연한 면 --u-{role}-bg-color + 그 위 글자 --u-{role}-color-strong (4.58~7.00)
19
+ outlined 바탕 위 글자 --u-{role}-color-strong (계약 검사 대상)
20
+ ========================================================================== */
21
+ :host([color="primary"]) {
22
+ --tag-hue-solid: var(--u-primary-color, #1976D2);
23
+ --tag-hue-on-solid: var(--u-primary-txt-color, #FFFFFF);
24
+ --tag-hue-line: var(--u-primary-color-weak, #2196F3);
25
+ --tag-hue-surface: var(--u-primary-bg-color, #E3F2FD);
26
+ --tag-hue-text: var(--u-primary-color-strong, #1565C0);
27
+ --tag-hue-text-outlined: var(--u-primary-color-strong, #1565C0);
28
+ }
29
+ :host([color="info"]) {
30
+ --tag-hue-solid: var(--u-info-color, #1976D2);
31
+ --tag-hue-on-solid: var(--u-info-txt-color, #FFFFFF);
32
+ --tag-hue-line: var(--u-info-color-weak, #2196F3);
33
+ --tag-hue-surface: var(--u-info-bg-color, #E3F2FD);
34
+ --tag-hue-text: var(--u-info-color-strong, #1565C0);
35
+ --tag-hue-text-outlined: var(--u-info-color-strong, #1565C0);
36
+ }
37
+ :host([color="success"]) {
38
+ --tag-hue-solid: var(--u-success-color, #2E7D32);
39
+ --tag-hue-on-solid: var(--u-success-txt-color, #FFFFFF);
40
+ --tag-hue-line: var(--u-success-color-weak, #4CAF50);
41
+ --tag-hue-surface: var(--u-success-bg-color, #E8F5E9);
42
+ --tag-hue-text: var(--u-success-color-strong, #1B5E20);
43
+ --tag-hue-text-outlined: var(--u-success-color-strong, #1B5E20);
44
+ }
45
+ :host([color="warning"]) {
46
+ --tag-hue-solid: var(--u-warning-color, #FDD835);
47
+ --tag-hue-on-solid: var(--u-warning-txt-color, #000000);
48
+ --tag-hue-line: var(--u-warning-color-weak, #FFEB3B);
49
+ --tag-hue-surface: var(--u-warning-bg-color, #FFF59D);
50
+ --tag-hue-text: var(--u-warning-color-strong, #8A4A00);
51
+ --tag-hue-text-outlined: var(--u-warning-color-strong, #8A4A00);
52
+ }
53
+ :host([color="danger"]) {
54
+ --tag-hue-solid: var(--u-danger-color, #D32F2F);
55
+ --tag-hue-on-solid: var(--u-danger-txt-color, #FFFFFF);
56
+ --tag-hue-line: var(--u-danger-color-weak, #F44336);
57
+ --tag-hue-surface: var(--u-danger-bg-color, #FFEBEE);
58
+ --tag-hue-text: var(--u-danger-color-strong, #C62828);
59
+ --tag-hue-text-outlined: var(--u-danger-color-strong, #C62828);
60
+ }
61
+
11
62
  /* ==========================================================================
12
63
  장식 축 — 색 슬롯 매핑
13
64
  color="purple" 에는 역할 의미가 없다(장식이다). 그래서 역할 토큰이 아니라
@@ -82,7 +133,9 @@ var styles = css`
82
133
 
83
134
  /* Variant: solid (강한 채움, 색 미지정 시 --tag-fill-color = 브랜드) */
84
135
  :host([variant="solid"]) {
85
- --tag-color: var(--u-neutral-0, #FFFFFF);
136
+ /* 면 위의 글자. 장식 축은 슬롯이 비어 흰색으로 떨어진다(현행 보존) — 역할 축에서만
137
+ 갈린다. warning 이 그 이유다: 노란 면 위의 흰 글자는 읽히지 않는다. */
138
+ --tag-color: var(--tag-hue-on-solid, var(--u-neutral-0, #FFFFFF));
86
139
  --tag-bg-color: var(--tag-hue-solid, var(--tag-fill-color));
87
140
  --tag-border-color: var(--tag-hue-solid, var(--tag-fill-color));
88
141
  }
@@ -26,10 +26,10 @@ var styles = css`
26
26
  box-shadow: 0 0 0 1px var(--u-input-border-color-hover, #BDBDBD);
27
27
  }
28
28
  :host(:not([readonly]):not([disabled])) .container:focus-within {
29
- box-shadow: 0 0 0 1px var(--u-input-border-color-focus, #1E88E5);
29
+ box-shadow: 0 0 0 1px var(--u-input-border-color-focus, #1565C0);
30
30
  }
31
31
  :host([invalid]:not([readonly]):not([disabled])) .container {
32
- box-shadow: 0 0 0 1px var(--u-input-border-color-invalid, #E53935);
32
+ box-shadow: 0 0 0 1px var(--u-input-border-color-invalid, #C62828);
33
33
  }
34
34
 
35
35
  /* ===== Variant: filled ===== */
@@ -51,11 +51,11 @@ var styles = css`
51
51
  }
52
52
  :host([variant="filled"]:not([readonly]):not([disabled])) .container:focus-within {
53
53
  box-shadow: none;
54
- border-bottom-color: var(--u-input-border-color-focus, #1E88E5);
54
+ border-bottom-color: var(--u-input-border-color-focus, #1565C0);
55
55
  }
56
56
  :host([variant="filled"][invalid]:not([readonly]):not([disabled])) .container {
57
57
  box-shadow: none;
58
- border-bottom-color: var(--u-input-border-color-invalid, #E53935);
58
+ border-bottom-color: var(--u-input-border-color-invalid, #C62828);
59
59
  }
60
60
 
61
61
  /* ===== Variant: underlined ===== */
@@ -78,12 +78,12 @@ var styles = css`
78
78
  }
79
79
  :host([variant="underlined"]:not([readonly]):not([disabled])) .container:focus-within {
80
80
  box-shadow: none;
81
- border-bottom-color: var(--u-input-border-color-focus, #1E88E5);
81
+ border-bottom-color: var(--u-input-border-color-focus, #1565C0);
82
82
  border-bottom-width: 2px;
83
83
  }
84
84
  :host([variant="underlined"][invalid]:not([readonly]):not([disabled])) .container {
85
85
  box-shadow: none;
86
- border-bottom-color: var(--u-input-border-color-invalid, #E53935);
86
+ border-bottom-color: var(--u-input-border-color-invalid, #C62828);
87
87
  }
88
88
 
89
89
  /* ===== Variant: borderless ===== */
@@ -12,7 +12,7 @@ var styles = css`
12
12
  line-height: 1.25;
13
13
  border-radius: var(--u-radius-md, 4px);
14
14
  background-color: var(--u-tooltip-bg-color, rgba(0, 0, 0, 0.75));
15
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.2);
15
+ box-shadow: var(--u-shadow-xl, 0 6px 18px rgba(0, 0, 0, 0.24));
16
16
  transform: scale(0.9);
17
17
  transition: opacity 0.2s ease, transform 0.2s ease, visibility 0s 0.2s;
18
18
 
@@ -3,7 +3,7 @@ import { css } from "lit";
3
3
  var styles = css`
4
4
  :host {
5
5
  --tree-item-depth: 0;
6
- --tree-item-color: var(--u-primary-color, #1E88E5);
6
+ --tree-item-color: var(--u-primary-color, #1976D2);
7
7
  }
8
8
 
9
9
  :host {
@@ -140,21 +140,30 @@
140
140
  단은 '강도' 축이다 (weakest -> strong). 용도(배경/테두리/텍스트)는
141
141
  소비처가 정한다 -- 단을 속성에 묶으면 primary 버튼의 배경이 어느
142
142
  단인지 같은 모순이 생긴다.
143
+
144
+ ★**다만 두 단은 용도가 확정돼 있다** — 대비 요구가 서로 다르기 때문이다.
145
+ `-color` = **면**. `--u-*-txt-color` 가 그 위에 얹히므로 on-color 기준 4.5.
146
+ `-strong` = **글자·아이콘**. `--u-bg-color` 위에 놓이므로 바탕 기준 4.5.
147
+ 라이트에서는 바탕도 on-color 도 흰색이라 두 요구가 한 조건으로 합쳐지지만,
148
+ **다크에서는 정반대 방향**이다(바탕 #121212 · on-color #FFFFFF). 바탕에서 읽히는
149
+ 밝은 단은 흰 글자를 못 받고, 흰 글자를 받는 어두운 단은 바탕에서 안 읽힌다.
150
+ ⇒ 다크에서 `-color` 와 `-strong` 이 두 단 벌어지는 것이 그 결과다.
151
+ `tests/build/token-contrast.test.ts` 가 값을 지킨다.
143
152
  ========================================================================== */
144
153
 
145
154
  /* primary — 브랜드 · 강조 · 포커스 · 링크 */
146
155
  --u-primary-color-weakest: var(--u-blue-200);
147
156
  --u-primary-color-weaker: var(--u-blue-300);
148
157
  --u-primary-color-weak: var(--u-blue-500);
149
- --u-primary-color: var(--u-blue-600);
150
- --u-primary-color-strong: var(--u-blue-700);
158
+ --u-primary-color: var(--u-blue-600); /* 면: 흰 글자 6.09 ✓ */
159
+ --u-primary-color-strong: var(--u-blue-800); /* 글자: 바탕 5.32 ✓ (700 은 4.05 ✗) */
151
160
 
152
161
  /* info — 정보 안내 (primary 와 기본값은 같으나 역할이 다르다 — 브랜딩은 primary 만 바꾼다) */
153
162
  --u-info-color-weakest: var(--u-blue-200);
154
163
  --u-info-color-weaker: var(--u-blue-300);
155
164
  --u-info-color-weak: var(--u-blue-500);
156
165
  --u-info-color: var(--u-blue-600);
157
- --u-info-color-strong: var(--u-blue-700);
166
+ --u-info-color-strong: var(--u-blue-800);
158
167
 
159
168
  /* success — 성공 · 완료 */
160
169
  --u-success-color-weakest: var(--u-green-200);
@@ -174,8 +183,8 @@
174
183
  --u-danger-color-weakest: var(--u-red-200);
175
184
  --u-danger-color-weaker: var(--u-red-300);
176
185
  --u-danger-color-weak: var(--u-red-500);
177
- --u-danger-color: var(--u-red-600);
178
- --u-danger-color-strong: var(--u-red-700);
186
+ --u-danger-color: var(--u-red-600); /* 면: 흰 글자 6.83 ✓ */
187
+ --u-danger-color-strong: var(--u-red-800); /* 글자: 바탕 4.87 ✓ (700 은 3.67 ✗) */
179
188
  /* ==========================================================================
180
189
  Radius Scale — 모서리 반경
181
190
  리터럴을 흩뿌리면 값이 갈린다(실제로 pill 이 999px/9999px 두 표기로 나뉘어 있었다).
@@ -206,14 +215,17 @@
206
215
  --u-txt-color: var(--u-neutral-900);
207
216
  --u-txt-color-inverse: var(--u-neutral-100);
208
217
 
209
- /* 유채색 배경 위의 글자 — 테마 모두 흰색이다(light.css 참조). */
218
+ /* 유채색 배경 위의 글자 — warning 다르다(light.css 참조). */
210
219
  --u-primary-txt-color: #FFFFFF;
211
220
  --u-info-txt-color: #FFFFFF;
212
221
  --u-success-txt-color: #FFFFFF;
213
222
  --u-danger-txt-color: #FFFFFF;
214
- --u-warning-txt-color: #FFFFFF;
215
- --u-txt-color-hover: var(--u-primary-color);
216
- --u-txt-color-active: var(--u-primary-color);
223
+ /* ★라이트 시트와 같은 이유로 중립 최상단을 쓴다 — 다크에서는 그 값이 #FFFFFF
224
+ 결과가 종전과 같다(4.65 ✓). 리터럴 대신 토큰을 쓰는 이유는 라이트에서 뒤집히기
225
+ 때문이다(#000000). 두 시트가 같은 선언이 되어 어긋날 자리가 없어진다. */
226
+ --u-warning-txt-color: var(--u-neutral-1000);
227
+ --u-txt-color-hover: var(--u-primary-color-strong);
228
+ --u-txt-color-active: var(--u-primary-color-strong);
217
229
  --u-txt-color-disabled: var(--u-neutral-500);
218
230
  --u-txt-color-weak: var(--u-neutral-700);
219
231
  --u-txt-color-strong: var(--u-neutral-1000);
@@ -224,8 +236,8 @@
224
236
  /* Icon Colors */
225
237
  --u-icon-color: var(--u-neutral-800);
226
238
  --u-icon-color-inverse: var(--u-neutral-100);
227
- --u-icon-color-hover: var(--u-primary-color);
228
- --u-icon-color-active: var(--u-primary-color);
239
+ --u-icon-color-hover: var(--u-primary-color-strong);
240
+ --u-icon-color-active: var(--u-primary-color-strong);
229
241
  --u-icon-color-disabled: var(--u-neutral-500);
230
242
 
231
243
  /* Border Colors */
@@ -234,10 +246,12 @@
234
246
  --u-border-color-strong: var(--u-neutral-500);
235
247
  --u-border-color-hover: var(--u-neutral-500);
236
248
 
249
+ /* ★상태 테두리는 `-strong` 단이다 — light.css 의 같은 자리 주석 참조.
250
+ 이 테마가 실제로 미달이었다: focus 2.74 · invalid 2.44 → 4.74 / 4.34. */
237
251
  --u-input-border-color: var(--u-neutral-400);
238
252
  --u-input-border-color-hover: var(--u-neutral-500);
239
- --u-input-border-color-focus: var(--u-primary-color);
240
- --u-input-border-color-invalid: var(--u-danger-color);
253
+ --u-input-border-color-focus: var(--u-primary-color-strong);
254
+ --u-input-border-color-invalid: var(--u-danger-color-strong);
241
255
 
242
256
  /* Background Colors */
243
257
  --u-bg-color: var(--u-neutral-100);
@@ -245,6 +259,12 @@
245
259
  --u-bg-color-hover: var(--u-neutral-300);
246
260
  --u-bg-color-active: var(--u-neutral-400);
247
261
  --u-bg-color-disabled: var(--u-neutral-100);
262
+
263
+ /* 면 높이 — 상세는 light.css 참조. 다크는 **바탕보다 밝은 쪽**이 위다.
264
+ neutral-300(#2A2A2A)은 바탕(#121212) 대비 1.42 로, 소비 측이 오버라이드로 쓰던
265
+ neutral-200(1.15)보다 실제로 더 잘 구분된다 — 그 오버라이드가 해결하려던 증상이
266
+ *"툴바·헤더가 배경에 묻힌다"* 였다. */
267
+ --u-bg-color-raised: var(--u-neutral-300);
248
268
 
249
269
  /* 유채색 표면 — 라이트와 **같은 단이 아니라 같은 세기**로 짝지었다(light.css 참조).
250
270
  팔레트 유채색 틴트가 다크에서 짓눌리므로 한 단 위를 쓴다. green 은 대칭이라 그대로. */
@@ -252,6 +272,8 @@
252
272
  --u-info-bg-color: var(--u-blue-100);
253
273
  --u-success-bg-color: var(--u-green-0);
254
274
  --u-danger-bg-color: var(--u-red-100);
275
+ /* warning 합류 — 라이트는 yellow-200 이다(단 이름이 다른 이유는 light.css 참조). */
276
+ --u-warning-bg-color: var(--u-yellow-100);
255
277
 
256
278
  --u-input-bg-color: var(--u-neutral-200);
257
279
  --u-panel-bg-color: var(--u-neutral-200);
@@ -265,6 +287,14 @@
265
287
  --u-shadow-color-strong: rgba(0, 0, 0, 0.45);
266
288
  --u-shadow-color-stronger: rgba(0, 0, 0, 0.60);
267
289
 
290
+ /* Elevation Scale — 근거는 light.css 의 같은 자리 주석 참조.
291
+ ★다크는 알파가 3배 가까이 진하다 — 리터럴로 흩어져 있던 종전에는 이 차이가
292
+ 적용되지 않아 다크에서 그림자가 사실상 보이지 않았다. */
293
+ --u-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.25); /* = shadow-color-weak */
294
+ --u-shadow-md: 0 2px 8px rgba(0, 0, 0, 0.35); /* = shadow-color-normal */
295
+ --u-shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.45); /* = shadow-color-strong */
296
+ --u-shadow-xl: 0 6px 18px rgba(0, 0, 0, 0.60); /* = shadow-color-stronger */
297
+
268
298
  /* Scrollbar Colors */
269
299
  --u-scrollbar-color: var(--u-neutral-500);
270
300
  --u-scrollbar-color-hover: var(--u-neutral-600);