@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.
- package/CHANGELOG.md +367 -0
- package/dist/_virtual/_glob-assets_raw/dark.css.e8ac080d.js +1 -1
- package/dist/_virtual/_glob-assets_raw/light.css.637cb2f8.js +1 -1
- package/dist/components/UElement.styles.js +8 -3
- package/dist/components/alert/UAlert.styles.js +18 -9
- package/dist/components/badge/UBadge.d.ts +2 -1
- package/dist/components/badge/UBadge.styles.js +30 -2
- package/dist/components/breadcrumb-item/UBreadcrumbItem.styles.js +1 -1
- package/dist/components/button/UButton.d.ts +22 -3
- package/dist/components/button/UButton.styles.js +107 -16
- package/dist/components/card/UCard.styles.js +2 -2
- package/dist/components/carousel/UCarousel.styles.js +2 -2
- package/dist/components/checkbox/UCheckbox.d.ts +2 -1
- package/dist/components/checkbox/UCheckbox.styles.js +42 -9
- package/dist/components/copy-button/UCopyButton.styles.js +2 -2
- package/dist/components/dialog/UDialog.styles.js +1 -1
- package/dist/components/drawer/UDrawer.styles.js +1 -1
- package/dist/components/field/UField.styles.js +2 -2
- package/dist/components/icon-button/UIconButton.styles.js +1 -1
- package/dist/components/input/UInput.styles.js +9 -9
- package/dist/components/menu-item/UMenuItem.styles.js +2 -2
- package/dist/components/option/UOption.styles.js +1 -1
- package/dist/components/progress-bar/UProgressBar.styles.js +5 -5
- package/dist/components/progress-ring/UProgressRing.styles.js +5 -5
- package/dist/components/radio/URadio.styles.js +2 -2
- package/dist/components/rating/URating.styles.js +2 -2
- package/dist/components/select/USelect.styles.js +11 -9
- package/dist/components/slider/USlider.styles.js +11 -3
- package/dist/components/spinner/USpinner.d.ts +2 -1
- package/dist/components/spinner/USpinner.styles.js +9 -1
- package/dist/components/split-panel/USplitPanel.styles.js +1 -1
- package/dist/components/switch/USwitch.styles.js +7 -7
- package/dist/components/tab-panel/UTabPanel.styles.js +2 -2
- package/dist/components/tag/UTag.d.ts +6 -1
- package/dist/components/tag/UTag.styles.js +55 -2
- package/dist/components/textarea/UTextarea.styles.js +6 -6
- package/dist/components/tooltip/UTooltip.styles.js +1 -1
- package/dist/components/tree-item/UTreeItem.styles.js +1 -1
- package/dist/styles/dark.css +43 -13
- package/dist/styles/light.css +77 -19
- 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, #
|
|
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, #
|
|
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-
|
|
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-
|
|
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, #
|
|
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, #
|
|
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, #
|
|
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, #
|
|
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, #
|
|
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, #
|
|
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, #
|
|
162
|
+
color: var(--u-icon-color-hover, #1565C0);
|
|
161
163
|
}
|
|
162
164
|
.suffix-item:active {
|
|
163
|
-
color: var(--u-icon-color-active, #
|
|
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.
|
|
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, #
|
|
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.
|
|
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
|
|
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
|
-
|
|
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, #
|
|
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-
|
|
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, #
|
|
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, #
|
|
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, #
|
|
60
|
-
0 0 0 3px
|
|
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.
|
|
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, #
|
|
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, #
|
|
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, #
|
|
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
|
-
|
|
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, #
|
|
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
|
-
|
|
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, #
|
|
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, #
|
|
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, #
|
|
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, #
|
|
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, #
|
|
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, #
|
|
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.
|
|
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
|
|
package/dist/styles/dark.css
CHANGED
|
@@ -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-
|
|
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
|
-
/* 유채색 배경 위의 글자 —
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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);
|