@iyulab/components 1.18.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 (34) hide show
  1. package/CHANGELOG.md +190 -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 +3 -1
  6. package/dist/components/badge/UBadge.d.ts +2 -1
  7. package/dist/components/badge/UBadge.styles.js +25 -1
  8. package/dist/components/button/UButton.d.ts +22 -3
  9. package/dist/components/button/UButton.styles.js +97 -8
  10. package/dist/components/card/UCard.styles.js +2 -2
  11. package/dist/components/carousel/UCarousel.styles.js +2 -2
  12. package/dist/components/checkbox/UCheckbox.d.ts +2 -1
  13. package/dist/components/checkbox/UCheckbox.styles.js +37 -4
  14. package/dist/components/dialog/UDialog.styles.js +1 -1
  15. package/dist/components/drawer/UDrawer.styles.js +1 -1
  16. package/dist/components/input/UInput.styles.js +7 -7
  17. package/dist/components/menu-item/UMenuItem.styles.js +1 -1
  18. package/dist/components/progress-bar/UProgressBar.styles.js +5 -5
  19. package/dist/components/progress-ring/UProgressRing.styles.js +5 -5
  20. package/dist/components/rating/URating.styles.js +2 -2
  21. package/dist/components/select/USelect.styles.js +9 -7
  22. package/dist/components/slider/USlider.styles.js +10 -2
  23. package/dist/components/spinner/USpinner.d.ts +2 -1
  24. package/dist/components/spinner/USpinner.styles.js +8 -0
  25. package/dist/components/split-panel/USplitPanel.styles.js +1 -1
  26. package/dist/components/switch/USwitch.styles.js +3 -3
  27. package/dist/components/tab-panel/UTabPanel.styles.js +1 -1
  28. package/dist/components/tag/UTag.d.ts +6 -1
  29. package/dist/components/tag/UTag.styles.js +54 -1
  30. package/dist/components/textarea/UTextarea.styles.js +6 -6
  31. package/dist/components/tooltip/UTooltip.styles.js +1 -1
  32. package/dist/styles/dark.css +12 -2
  33. package/dist/styles/light.css +27 -2
  34. package/package.json +4 -3
@@ -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 상태도 지원합니다.
@@ -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, #1976D2),
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
  /* 체크박스 외형 */
@@ -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)) — 빠르게 시작해서 부드럽게 정착.
@@ -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, #1976D2);
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, #D32F2F);
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, #1976D2);
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, #D32F2F);
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, #1976D2);
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, #D32F2F);
98
+ border-bottom-color: var(--u-input-border-color-invalid, #C62828);
99
99
  }
100
100
 
101
101
  /* ===== Variant: borderless ===== */
@@ -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
  }
@@ -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
  }
@@ -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, #1976D2);
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, #2E7D32);
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, #D32F2F);
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, #1976D2);
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, #2E7D32);
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, #D32F2F);
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
 
@@ -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, #1976D2);
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, #D32F2F);
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, #1976D2);
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, #D32F2F);
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, #1976D2);
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, #D32F2F);
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 {
@@ -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
  }
@@ -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
  *
@@ -9,6 +9,14 @@ var styles = css`
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 {
@@ -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, #1976D2),
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),
@@ -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
  *
@@ -8,6 +8,57 @@ var styles = css`
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, #1976D2);
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, #D32F2F);
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, #1976D2);
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, #D32F2F);
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, #1976D2);
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, #D32F2F);
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
 
@@ -246,10 +246,12 @@
246
246
  --u-border-color-strong: var(--u-neutral-500);
247
247
  --u-border-color-hover: var(--u-neutral-500);
248
248
 
249
+ /* ★상태 테두리는 `-strong` 단이다 — light.css 의 같은 자리 주석 참조.
250
+ 이 테마가 실제로 미달이었다: focus 2.74 · invalid 2.44 → 4.74 / 4.34. */
249
251
  --u-input-border-color: var(--u-neutral-400);
250
252
  --u-input-border-color-hover: var(--u-neutral-500);
251
- --u-input-border-color-focus: var(--u-primary-color);
252
- --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);
253
255
 
254
256
  /* Background Colors */
255
257
  --u-bg-color: var(--u-neutral-100);
@@ -285,6 +287,14 @@
285
287
  --u-shadow-color-strong: rgba(0, 0, 0, 0.45);
286
288
  --u-shadow-color-stronger: rgba(0, 0, 0, 0.60);
287
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
+
288
298
  /* Scrollbar Colors */
289
299
  --u-scrollbar-color: var(--u-neutral-500);
290
300
  --u-scrollbar-color-hover: var(--u-neutral-600);