@iyulab/data-components 0.8.0 → 0.9.1
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
CHANGED
|
@@ -1,5 +1,77 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.9.1] - 2026-08-03
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- **포커스 테두리의 폴백 리터럴 2곳이 낡아 있었다** — `@iyulab/components` 시트가
|
|
8
|
+
상태 테두리를 한 단 진하게 옮기면서(다크 대비 미달 해소) 여기 구워 둔 값이 어긋났다.
|
|
9
|
+
⚠**토큰 시트를 로드한 환경에서는 드러나지 않는다** — 폴백이 평가되지 않기 때문이다.
|
|
10
|
+
깨지는 곳은 시트 없이 이 패키지를 쓰는 소비자의 화면이다.
|
|
11
|
+
- **검색 입력의 포커스 링이 팔레트에 없는 색이었다** — `rgba(59, 130, 246, .2)`
|
|
12
|
+
(Tailwind blue-500)를 굽고 있어 브랜드를 덮어도 따라오지 않았고 다크에서도 같은 값이었다.
|
|
13
|
+
역할 토큰에서 `color-mix()` 로 파생하도록 고쳤다.
|
|
14
|
+
|
|
15
|
+
## [0.9.0] - 2026-08-02
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- ★**URichTable 의 다크 테마가 Firefox·Safari 에서 동작하지 않던 문제.**
|
|
20
|
+
|
|
21
|
+
툴바·표 헤더·상세 행·페이지네이션의 다크 배경이 `:host-context([theme="dark"])` 로만
|
|
22
|
+
선언돼 있었는데, 그 선택자는 **Firefox·Safari 에서 미지원**이다. 두 브라우저에서는
|
|
23
|
+
그 색이 적용된 적이 없다 — 라이트용 밝은 회색이 다크 화면에 그대로 남았다.
|
|
24
|
+
|
|
25
|
+
우회가 아니라 원인을 없앴다: `@iyulab/components` 1.18.0 의 **`--u-bg-color-raised`**
|
|
26
|
+
가 그 면을 표현하므로 base 규칙 하나로 두 테마가 성립하고, **다크 전용 블록이 통째로
|
|
27
|
+
사라졌다**(이 파일의 다크 규칙 3 → **0**). 토큰 층은 브라우저를 가리지 않는다.
|
|
28
|
+
|
|
29
|
+
- ★**`@iyulab/data-components/init` 이 게시본에 존재하지 않던 문제.**
|
|
30
|
+
`exports['./init']` 이 선언돼 있고 `src/init.ts` 도 있는데, **빌드 진입점 목록에 없어서**
|
|
31
|
+
`dist/init.js` 가 한 번도 생성되지 않았다(타입 선언 `dist/init.d.ts` 만 남아 더 눈에 띄지
|
|
32
|
+
않았다). 이 서브패스를 임포트하는 소비자는 `ERR_MODULE_NOT_FOUND` 를 받는다.
|
|
33
|
+
|
|
34
|
+
⚠**이 리포 안에서는 아무 증상이 없다** — 로컬은 상대 경로로 소스를 직접 읽는다.
|
|
35
|
+
게시본을 설치한 쪽에서만 드러나는 부류이며, 같은 성질의 결함이 과거에 네 번의 릴리스를
|
|
36
|
+
지나 잠복한 적이 있다. 모노레포 `npm run doctor` 에 **게시 계약 스윕**을 추가해 12개
|
|
37
|
+
패키지 전부를 대조하도록 했다.
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
|
|
41
|
+
- ⚠**`@iyulab/components` 의존 범위를 `^1.18.0` 으로 올린다.** 이 버전은 1.18.0 이 신설한
|
|
42
|
+
`--u-bg-color-raised` 를 쓴다. 1.15.0~1.17.0 과 짝지으면 토큰이 없어 폴백(`#FAFAFA`)이
|
|
43
|
+
발동하는데, 그 값은 라이트 기준이라 **다크에서 툴바·헤더가 밝은 회색으로 칠해진다.**
|
|
44
|
+
범위를 올리지 않으면 조용히 깨지는 조합이 생긴다.
|
|
45
|
+
- 다크 툴바·헤더·상세 행·페이지네이션이 `#1E1E1E` → **`#2A2A2A`** 로 한 단 밝아진다.
|
|
46
|
+
기존 오버라이드가 해결하려던 증상(*"툴바·헤더가 배경에 묻힌다"*)에 대해 바탕 대비가
|
|
47
|
+
1.15 → **1.42** 로 개선된다.
|
|
48
|
+
- 다크 페이지네이션 버튼이 `#2A2A2A` → **`#1E1E1E`** 로 한 단 안쪽이 된다. 크롬 면 위의
|
|
49
|
+
**컨트롤**이므로 입력 계열 토큰(`--u-input-bg-color`)을 쓴다 — 면과 같은 단이면 묻힌다.
|
|
50
|
+
- 라이트 표 헤더가 `#F5F5F5` → **`#FAFAFA`** 로 툴바와 같은 단이 된다. 두 단의 실측 수요는
|
|
51
|
+
라이트 한쪽뿐이었고, 헤더는 이미 2px 테두리로 분리돼 있다.
|
|
52
|
+
|
|
53
|
+
## [0.8.1] - 2026-08-02
|
|
54
|
+
|
|
55
|
+
### Fixed
|
|
56
|
+
|
|
57
|
+
- ★**토큰 폴백 리터럴 108곳이 정본 시트와 어긋나 있던 문제.** 세 부류가 섞여 있었다:
|
|
58
|
+
|
|
59
|
+
1. **다른 팔레트가 박혀 있던 것** (~80곳) — `#3b82f6`·`#e2e8f0`·`#94a3b8`·`#0f172a`·
|
|
60
|
+
`#ef4444`·`#10b981` 등. `@iyulab/components` 의 값이었던 적이 **한 번도 없다.**
|
|
61
|
+
시트를 로드하지 않은 소비자에게는 이 패키지만 전혀 다른 색 체계로 보였다.
|
|
62
|
+
2. ★★**다크 시트 값이 라이트 폴백으로 구워져 있던 것** (4곳) —
|
|
63
|
+
`--u-neutral-200: #1E1E1E`·`--u-neutral-300: #2A2A2A`. 시트가 없는 **라이트 화면에
|
|
64
|
+
다크 회색**이 칠해진다. 폴백 정본은 light 여야 한다.
|
|
65
|
+
3. 1.16.0 의 역할 단 재매핑을 받지 못한 것 (~24곳).
|
|
66
|
+
|
|
67
|
+
특히 `--u-txt-color-weak` 12곳은 `#94a3b8`(흰 배경 대비 **2.56**, AA 미달 — 시트 값 #757575 는 4.61)이었다 —
|
|
68
|
+
업스트림이 1.15.0 에서 바로 이 토큰의 AA 미달을 고쳤는데, 이 패키지의 폴백은 그 수정을
|
|
69
|
+
받은 적이 없었다.
|
|
70
|
+
|
|
71
|
+
⚠**이 결함은 개발 환경에서 절대 드러나지 않는다.** 토큰 시트가 있으면 폴백은 아예
|
|
72
|
+
평가되지 않는다 — 깨지는 곳은 시트를 로드하지 않은 소비자의 화면이고, 우리가 보지
|
|
73
|
+
못하는 자리다. 모노레포 루트의 `npm run tokens:sync` 가 이제 정본 시트와 대조한다.
|
|
74
|
+
|
|
3
75
|
## [0.8.0] - 2026-08-02
|
|
4
76
|
|
|
5
77
|
### Changed
|
|
@@ -18,8 +18,8 @@ var styles = [css`
|
|
|
18
18
|
align-items: center;
|
|
19
19
|
justify-content: space-between;
|
|
20
20
|
padding: 0.75rem;
|
|
21
|
-
background: var(--u-bg-color, #
|
|
22
|
-
border: 1px solid var(--u-border-color, #
|
|
21
|
+
background: var(--u-bg-color, #FFFFFF);
|
|
22
|
+
border: 1px solid var(--u-border-color, #E0E0E0);
|
|
23
23
|
border-radius: 8px;
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -29,18 +29,18 @@ var styles = [css`
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
.view-toggles u-button[active] {
|
|
32
|
-
background: var(--u-primary-color, #
|
|
32
|
+
background: var(--u-primary-color, #1976D2);
|
|
33
33
|
/* 예외 1 — "주색 위의 글자" 역할 토큰이 없다.
|
|
34
34
|
역할 층의 유채색은 전경 5단(--u-primary-color-*)뿐이고, 그 위에 얹는 글자색을
|
|
35
35
|
가리키는 토큰은 없다. 실측: 라이트 #FFFFFF/#1E88E5 = 3.68, 다크 #000000/#2A659D
|
|
36
36
|
= 3.45 — 다크는 흰 글자였다면 6.09 였다. 즉 현재 값이 최선이 아니지만, 팔레트를
|
|
37
37
|
직접 바꾸면 게시된 시각이 움직이므로 토큰 추가 결정까지 현행을 유지한다. */
|
|
38
|
-
color: var(--u-neutral-0, #
|
|
38
|
+
color: var(--u-neutral-0, #FFFFFF);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
.info {
|
|
42
42
|
font-size: 0.875rem;
|
|
43
|
-
color: var(--u-txt-color-weak, #
|
|
43
|
+
color: var(--u-txt-color-weak, #757575);
|
|
44
44
|
font-weight: 500;
|
|
45
45
|
}
|
|
46
46
|
|
|
@@ -60,8 +60,8 @@ var styles = [css`
|
|
|
60
60
|
|
|
61
61
|
/* Card Styles */
|
|
62
62
|
.card {
|
|
63
|
-
background: var(--u-bg-color, #
|
|
64
|
-
border: 1px solid var(--u-border-color, #
|
|
63
|
+
background: var(--u-bg-color, #FFFFFF);
|
|
64
|
+
border: 1px solid var(--u-border-color, #E0E0E0);
|
|
65
65
|
border-radius: 8px;
|
|
66
66
|
padding: 1.25rem;
|
|
67
67
|
cursor: pointer;
|
|
@@ -69,13 +69,13 @@ var styles = [css`
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
.card:hover {
|
|
72
|
-
border-color: var(--u-primary-color, #
|
|
72
|
+
border-color: var(--u-primary-color, #1976D2);
|
|
73
73
|
box-shadow: 0 4px 12px var(--u-shadow-color-weak, rgba(0, 0, 0, 0.08));
|
|
74
74
|
transform: translateY(-2px);
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
.card.selected {
|
|
78
|
-
border-color: var(--u-primary-color, #
|
|
78
|
+
border-color: var(--u-primary-color, #1976D2);
|
|
79
79
|
background: var(--u-bg-color-active, #EEEEEE);
|
|
80
80
|
box-shadow: 0 0 0 3px var(--u-primary-color-weakest, #90CAF9);
|
|
81
81
|
}
|
|
@@ -95,14 +95,14 @@ var styles = [css`
|
|
|
95
95
|
.card-field .label {
|
|
96
96
|
font-size: 0.875rem;
|
|
97
97
|
font-weight: 600;
|
|
98
|
-
color: var(--u-txt-color-weak, #
|
|
98
|
+
color: var(--u-txt-color-weak, #757575);
|
|
99
99
|
min-width: 80px;
|
|
100
100
|
flex-shrink: 0;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
.card-field .value {
|
|
104
104
|
font-size: 0.9375rem;
|
|
105
|
-
color: var(--u-txt-color, #
|
|
105
|
+
color: var(--u-txt-color, #212121);
|
|
106
106
|
word-break: break-word;
|
|
107
107
|
}
|
|
108
108
|
|
|
@@ -120,14 +120,14 @@ var styles = [css`
|
|
|
120
120
|
/* Table */
|
|
121
121
|
.table-wrapper {
|
|
122
122
|
overflow-x: auto;
|
|
123
|
-
border: 1px solid var(--u-border-color, #
|
|
123
|
+
border: 1px solid var(--u-border-color, #E0E0E0);
|
|
124
124
|
border-radius: 8px;
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
table {
|
|
128
128
|
width: 100%;
|
|
129
129
|
border-collapse: collapse;
|
|
130
|
-
background: var(--u-bg-color, #
|
|
130
|
+
background: var(--u-bg-color, #FFFFFF);
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
thead {
|
|
@@ -136,7 +136,7 @@ var styles = [css`
|
|
|
136
136
|
"바탕보다 한 단 올라온 면"을 뜻하는 토큰이 없다. 헤더에 -hover 를 쓰면
|
|
137
137
|
마우스 상태를 뜻하게 되므로 팔레트를 직접 읽는다. neutral-50 은 두 테마에서
|
|
138
138
|
각각 #FAFAFA/#0A0A0A 로 반전되므로 다크 보정은 필요 없다. */
|
|
139
|
-
background: var(--u-neutral-50, #
|
|
139
|
+
background: var(--u-neutral-50, #FAFAFA);
|
|
140
140
|
position: sticky;
|
|
141
141
|
top: 0;
|
|
142
142
|
z-index: 10;
|
|
@@ -147,8 +147,8 @@ var styles = [css`
|
|
|
147
147
|
text-align: left;
|
|
148
148
|
font-size: 0.875rem;
|
|
149
149
|
font-weight: 600;
|
|
150
|
-
color: var(--u-txt-color-weak, #
|
|
151
|
-
border-bottom: 2px solid var(--u-border-color, #
|
|
150
|
+
color: var(--u-txt-color-weak, #757575);
|
|
151
|
+
border-bottom: 2px solid var(--u-border-color, #E0E0E0);
|
|
152
152
|
white-space: nowrap;
|
|
153
153
|
}
|
|
154
154
|
|
|
@@ -166,13 +166,13 @@ var styles = [css`
|
|
|
166
166
|
}
|
|
167
167
|
|
|
168
168
|
tbody tr:not(:last-child) {
|
|
169
|
-
border-bottom: 1px solid var(--u-border-color-weak, #
|
|
169
|
+
border-bottom: 1px solid var(--u-border-color-weak, #EEEEEE);
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
td {
|
|
173
173
|
padding: 0.875rem 1rem;
|
|
174
174
|
font-size: 0.9375rem;
|
|
175
|
-
color: var(--u-txt-color, #
|
|
175
|
+
color: var(--u-txt-color, #212121);
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
/* Empty State */
|
|
@@ -181,7 +181,7 @@ var styles = [css`
|
|
|
181
181
|
align-items: center;
|
|
182
182
|
justify-content: center;
|
|
183
183
|
min-height: 300px;
|
|
184
|
-
color: var(--u-txt-color-weak, #
|
|
184
|
+
color: var(--u-txt-color-weak, #757575);
|
|
185
185
|
font-size: 1rem;
|
|
186
186
|
}
|
|
187
187
|
`];
|
|
@@ -12,14 +12,14 @@ var baseStyles = css`
|
|
|
12
12
|
height: 100%;
|
|
13
13
|
overflow: hidden;
|
|
14
14
|
outline: none;
|
|
15
|
-
border: 1px solid var(--u-border-color, #
|
|
15
|
+
border: 1px solid var(--u-border-color, #E0E0E0);
|
|
16
16
|
border-radius: 4px;
|
|
17
|
-
background: var(--u-bg-color, #
|
|
17
|
+
background: var(--u-bg-color, #FFFFFF);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
.sheet-container:focus-within {
|
|
21
|
-
border-color: var(--u-blue-500, #
|
|
22
|
-
box-shadow: 0 0 0 2px var(--u-blue-100, #
|
|
21
|
+
border-color: var(--u-blue-500, #2196F3);
|
|
22
|
+
box-shadow: 0 0 0 2px var(--u-blue-100, #BBDEFB);
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
.sheet-scroll {
|
|
@@ -43,15 +43,15 @@ var baseStyles = css`
|
|
|
43
43
|
z-index: 4;
|
|
44
44
|
width: 48px;
|
|
45
45
|
min-width: 48px;
|
|
46
|
-
background: var(--u-neutral-100, #
|
|
47
|
-
border-right: 1px solid var(--u-border-color, #
|
|
48
|
-
border-bottom: 2px solid var(--u-border-color, #
|
|
46
|
+
background: var(--u-neutral-100, #F5F5F5);
|
|
47
|
+
border-right: 1px solid var(--u-border-color, #E0E0E0);
|
|
48
|
+
border-bottom: 2px solid var(--u-border-color, #E0E0E0);
|
|
49
49
|
cursor: pointer;
|
|
50
50
|
user-select: none;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
.corner:hover {
|
|
54
|
-
background: var(--u-neutral-200, #
|
|
54
|
+
background: var(--u-neutral-200, #EEEEEE);
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
/* Column headers (A, B, C...) */
|
|
@@ -59,14 +59,14 @@ var baseStyles = css`
|
|
|
59
59
|
position: sticky;
|
|
60
60
|
top: 0;
|
|
61
61
|
z-index: 2;
|
|
62
|
-
background: var(--u-neutral-100, #
|
|
62
|
+
background: var(--u-neutral-100, #F5F5F5);
|
|
63
63
|
padding: 4px 8px;
|
|
64
64
|
text-align: center;
|
|
65
65
|
font-size: 12px;
|
|
66
66
|
font-weight: 600;
|
|
67
|
-
color: var(--u-txt-color-weak, #
|
|
68
|
-
border-right: 1px solid var(--u-border-color, #
|
|
69
|
-
border-bottom: 2px solid var(--u-border-color, #
|
|
67
|
+
color: var(--u-txt-color-weak, #757575);
|
|
68
|
+
border-right: 1px solid var(--u-border-color, #E0E0E0);
|
|
69
|
+
border-bottom: 2px solid var(--u-border-color, #E0E0E0);
|
|
70
70
|
white-space: nowrap;
|
|
71
71
|
min-width: 80px;
|
|
72
72
|
cursor: pointer;
|
|
@@ -75,8 +75,8 @@ var baseStyles = css`
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
.col-header.col-selected {
|
|
78
|
-
background: var(--u-blue-200, #
|
|
79
|
-
color: var(--u-blue-800, #
|
|
78
|
+
background: var(--u-blue-200, #90CAF9);
|
|
79
|
+
color: var(--u-blue-800, #1565C0);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
.resize-handle {
|
|
@@ -102,7 +102,7 @@ var baseStyles = css`
|
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
.resize-handle:hover::after {
|
|
105
|
-
background: var(--u-blue-500, #
|
|
105
|
+
background: var(--u-blue-500, #2196F3);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
.sheet-container.is-resizing {
|
|
@@ -124,31 +124,31 @@ var baseStyles = css`
|
|
|
124
124
|
text-align: right;
|
|
125
125
|
padding: 0 6px;
|
|
126
126
|
font-size: 11px;
|
|
127
|
-
color: var(--u-txt-color-weak, #
|
|
127
|
+
color: var(--u-txt-color-weak, #757575);
|
|
128
128
|
/* 예외 — 표면 높이 축이 없다. 행번호 여백은 "비활성"이 아니라 시트 바탕보다
|
|
129
129
|
한 단 내려간 면이다. --u-bg-color-disabled 를 쓰면 다크에서 바탕(neutral-100)과
|
|
130
130
|
같은 값이 되어 여백 구분이 사라진다 — 스냅샷이 그것을 잡았다. */
|
|
131
|
-
background: var(--u-neutral-50, #
|
|
132
|
-
border-right: 1px solid var(--u-border-color, #
|
|
133
|
-
border-bottom: 1px solid var(--u-border-color-weak, #
|
|
131
|
+
background: var(--u-neutral-50, #FAFAFA);
|
|
132
|
+
border-right: 1px solid var(--u-border-color, #E0E0E0);
|
|
133
|
+
border-bottom: 1px solid var(--u-border-color-weak, #EEEEEE);
|
|
134
134
|
cursor: pointer;
|
|
135
135
|
user-select: none;
|
|
136
136
|
vertical-align: middle;
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
.row-num.row-selected {
|
|
140
|
-
background: var(--u-blue-100, #
|
|
141
|
-
color: var(--u-blue-800, #
|
|
140
|
+
background: var(--u-blue-100, #BBDEFB);
|
|
141
|
+
color: var(--u-blue-800, #1565C0);
|
|
142
142
|
font-weight: 600;
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
/* Data cells */
|
|
146
146
|
.cell {
|
|
147
147
|
padding: 0 6px;
|
|
148
|
-
border-right: 1px solid var(--u-border-color-weak, #
|
|
149
|
-
border-bottom: 1px solid var(--u-border-color-weak, #
|
|
148
|
+
border-right: 1px solid var(--u-border-color-weak, #EEEEEE);
|
|
149
|
+
border-bottom: 1px solid var(--u-border-color-weak, #EEEEEE);
|
|
150
150
|
font-size: 13px;
|
|
151
|
-
color: var(--u-txt-color, #
|
|
151
|
+
color: var(--u-txt-color, #212121);
|
|
152
152
|
min-width: 80px;
|
|
153
153
|
overflow: hidden;
|
|
154
154
|
text-overflow: ellipsis;
|
|
@@ -167,8 +167,8 @@ var baseStyles = css`
|
|
|
167
167
|
|
|
168
168
|
/* The anchor cell (top-left of selection) */
|
|
169
169
|
.cell.anchor {
|
|
170
|
-
background: var(--u-bg-color, #
|
|
171
|
-
outline: 2px solid var(--u-blue-500, #
|
|
170
|
+
background: var(--u-bg-color, #FFFFFF);
|
|
171
|
+
outline: 2px solid var(--u-blue-500, #2196F3);
|
|
172
172
|
outline-offset: -2px;
|
|
173
173
|
overflow: visible;
|
|
174
174
|
z-index: 1;
|
|
@@ -188,13 +188,13 @@ var baseStyles = css`
|
|
|
188
188
|
min-width: 100%;
|
|
189
189
|
height: calc(100% + 2px);
|
|
190
190
|
border: none;
|
|
191
|
-
outline: 2px solid var(--u-blue-500, #
|
|
191
|
+
outline: 2px solid var(--u-blue-500, #2196F3);
|
|
192
192
|
outline-offset: -1px;
|
|
193
193
|
padding: 0 6px;
|
|
194
194
|
font-size: 13px;
|
|
195
195
|
font-family: inherit;
|
|
196
|
-
color: var(--u-txt-color, #
|
|
197
|
-
background: var(--u-bg-color, #
|
|
196
|
+
color: var(--u-txt-color, #212121);
|
|
197
|
+
background: var(--u-bg-color, #FFFFFF);
|
|
198
198
|
box-sizing: border-box;
|
|
199
199
|
z-index: 10;
|
|
200
200
|
box-shadow: 0 2px 8px var(--u-shadow-color-strong, rgba(0, 0, 0, 0.16));
|
|
@@ -209,8 +209,8 @@ var baseStyles = css`
|
|
|
209
209
|
min-width: 120px;
|
|
210
210
|
max-height: 200px;
|
|
211
211
|
overflow-y: auto;
|
|
212
|
-
background: var(--u-bg-color, #
|
|
213
|
-
border: 1px solid var(--u-border-color, #
|
|
212
|
+
background: var(--u-bg-color, #FFFFFF);
|
|
213
|
+
border: 1px solid var(--u-border-color, #E0E0E0);
|
|
214
214
|
border-top: none;
|
|
215
215
|
border-radius: 0 0 4px 4px;
|
|
216
216
|
box-shadow: 0 4px 12px var(--u-shadow-color-normal, rgba(0, 0, 0, 0.12));
|
|
@@ -220,7 +220,7 @@ var baseStyles = css`
|
|
|
220
220
|
.dropdown-item {
|
|
221
221
|
padding: 4px 8px;
|
|
222
222
|
font-size: 13px;
|
|
223
|
-
color: var(--u-txt-color, #
|
|
223
|
+
color: var(--u-txt-color, #212121);
|
|
224
224
|
cursor: pointer;
|
|
225
225
|
white-space: nowrap;
|
|
226
226
|
overflow: hidden;
|
|
@@ -228,18 +228,18 @@ var baseStyles = css`
|
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
.dropdown-item:hover {
|
|
231
|
-
background: var(--u-neutral-100, #
|
|
231
|
+
background: var(--u-neutral-100, #F5F5F5);
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
.dropdown-item.highlighted {
|
|
235
235
|
background: var(--u-primary-bg-color, #E3F2FD);
|
|
236
|
-
color: var(--u-blue-800, #
|
|
236
|
+
color: var(--u-blue-800, #1565C0);
|
|
237
237
|
}
|
|
238
238
|
|
|
239
239
|
.dropdown-empty {
|
|
240
240
|
padding: 6px 8px;
|
|
241
241
|
font-size: 12px;
|
|
242
|
-
color: var(--u-txt-color-weak, #
|
|
242
|
+
color: var(--u-txt-color-weak, #757575);
|
|
243
243
|
font-style: italic;
|
|
244
244
|
}
|
|
245
245
|
|
|
@@ -251,12 +251,12 @@ var baseStyles = css`
|
|
|
251
251
|
/* Readonly column/cell */
|
|
252
252
|
.cell.cell-readonly {
|
|
253
253
|
background: var(--u-bg-color-disabled, #FAFAFA);
|
|
254
|
-
color: var(--u-txt-color-weak, #
|
|
254
|
+
color: var(--u-txt-color-weak, #757575);
|
|
255
255
|
cursor: default;
|
|
256
256
|
}
|
|
257
257
|
|
|
258
258
|
.cell.cell-readonly.selected {
|
|
259
|
-
background: var(--u-neutral-100, #
|
|
259
|
+
background: var(--u-neutral-100, #F5F5F5);
|
|
260
260
|
}
|
|
261
261
|
|
|
262
262
|
.cell.cell-readonly.anchor {
|
|
@@ -266,13 +266,13 @@ var baseStyles = css`
|
|
|
266
266
|
/* Computed column/cell */
|
|
267
267
|
.cell.cell-computed {
|
|
268
268
|
background: var(--u-primary-bg-color, #E3F2FD);
|
|
269
|
-
color: var(--u-txt-color, #
|
|
269
|
+
color: var(--u-txt-color, #212121);
|
|
270
270
|
font-style: italic;
|
|
271
271
|
cursor: default;
|
|
272
272
|
}
|
|
273
273
|
|
|
274
274
|
.cell.cell-computed.selected {
|
|
275
|
-
background: var(--u-blue-100, #
|
|
275
|
+
background: var(--u-blue-100, #BBDEFB);
|
|
276
276
|
}
|
|
277
277
|
|
|
278
278
|
.cell.cell-computed.anchor {
|
|
@@ -292,20 +292,20 @@ var DARK_PREFIXES = [
|
|
|
292
292
|
];
|
|
293
293
|
var darkRules = (host) => `
|
|
294
294
|
${host} .col-header.col-selected {
|
|
295
|
-
background: var(--u-blue-100, #
|
|
295
|
+
background: var(--u-blue-100, #BBDEFB);
|
|
296
296
|
}
|
|
297
297
|
|
|
298
298
|
${host} .cell.cell-readonly.selected {
|
|
299
|
-
background: var(--u-neutral-200, #
|
|
299
|
+
background: var(--u-neutral-200, #EEEEEE);
|
|
300
300
|
}
|
|
301
301
|
|
|
302
302
|
|
|
303
303
|
${host} .cell.cell-computed.selected {
|
|
304
|
-
background: var(--u-blue-200, #
|
|
304
|
+
background: var(--u-blue-200, #90CAF9);
|
|
305
305
|
}
|
|
306
306
|
|
|
307
307
|
${host} .cell.cell-computed.anchor {
|
|
308
|
-
background: var(--u-blue-100, #
|
|
308
|
+
background: var(--u-blue-100, #BBDEFB);
|
|
309
309
|
}
|
|
310
310
|
|
|
311
311
|
`;
|
|
@@ -5,8 +5,8 @@ var richTableStyles = css`
|
|
|
5
5
|
display: block;
|
|
6
6
|
font-family: system-ui, -apple-system, sans-serif;
|
|
7
7
|
font-size: 13px;
|
|
8
|
-
color: var(--u-txt-color, #
|
|
9
|
-
border: 1px solid var(--u-border-color, #
|
|
8
|
+
color: var(--u-txt-color, #212121);
|
|
9
|
+
border: 1px solid var(--u-border-color, #E0E0E0);
|
|
10
10
|
border-radius: 8px;
|
|
11
11
|
overflow: hidden;
|
|
12
12
|
}
|
|
@@ -16,8 +16,8 @@ var richTableStyles = css`
|
|
|
16
16
|
align-items: center;
|
|
17
17
|
gap: 8px;
|
|
18
18
|
padding: 8px 12px;
|
|
19
|
-
background: var(--u-
|
|
20
|
-
border-bottom: 1px solid var(--u-border-color, #
|
|
19
|
+
background: var(--u-bg-color-raised, #FAFAFA);
|
|
20
|
+
border-bottom: 1px solid var(--u-border-color, #E0E0E0);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
.toolbar .selection-info {
|
|
@@ -27,15 +27,15 @@ var richTableStyles = css`
|
|
|
27
27
|
|
|
28
28
|
.toolbar .search-input {
|
|
29
29
|
padding: 4px 10px;
|
|
30
|
-
border: 1px solid var(--u-input-border-color, #
|
|
30
|
+
border: 1px solid var(--u-input-border-color, #E0E0E0);
|
|
31
31
|
border-radius: 4px;
|
|
32
32
|
font-size: 12px;
|
|
33
33
|
outline: none;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
.toolbar .search-input:focus {
|
|
37
|
-
border-color: var(--u-input-border-color-focus, #
|
|
38
|
-
box-shadow: 0 0 0 2px
|
|
37
|
+
border-color: var(--u-input-border-color-focus, #1565C0);
|
|
38
|
+
box-shadow: 0 0 0 2px color-mix(in srgb, var(--u-primary-color-strong, #1565C0) 20%, transparent);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
.toolbar .btn {
|
|
@@ -50,10 +50,10 @@ var richTableStyles = css`
|
|
|
50
50
|
color: white;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
.toolbar .btn-primary { background: var(--u-primary-color, #
|
|
54
|
-
.toolbar .btn-primary:hover { background: var(--u-primary-color-strong, #
|
|
55
|
-
.toolbar .btn-success { background: var(--u-success-color, #
|
|
56
|
-
.toolbar .btn-success:hover { background: var(--u-success-color-strong, #
|
|
53
|
+
.toolbar .btn-primary { background: var(--u-primary-color, #1976D2); }
|
|
54
|
+
.toolbar .btn-primary:hover { background: var(--u-primary-color-strong, #1565C0); }
|
|
55
|
+
.toolbar .btn-success { background: var(--u-success-color, #2E7D32); }
|
|
56
|
+
.toolbar .btn-success:hover { background: var(--u-success-color-strong, #1B5E20); }
|
|
57
57
|
|
|
58
58
|
table {
|
|
59
59
|
width: 100%;
|
|
@@ -62,10 +62,10 @@ var richTableStyles = css`
|
|
|
62
62
|
|
|
63
63
|
thead th {
|
|
64
64
|
padding: 8px;
|
|
65
|
-
background: var(--u-
|
|
65
|
+
background: var(--u-bg-color-raised, #FAFAFA);
|
|
66
66
|
font-weight: 600;
|
|
67
67
|
text-align: left;
|
|
68
|
-
border-bottom: 2px solid var(--u-border-color, #
|
|
68
|
+
border-bottom: 2px solid var(--u-border-color, #E0E0E0);
|
|
69
69
|
user-select: none;
|
|
70
70
|
position: relative;
|
|
71
71
|
}
|
|
@@ -75,37 +75,37 @@ var richTableStyles = css`
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
thead th.sortable:hover {
|
|
78
|
-
background: var(--u-bg-color-active, #
|
|
78
|
+
background: var(--u-bg-color-active, #EEEEEE);
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
.sort-indicator {
|
|
82
82
|
font-size: 10px;
|
|
83
|
-
color: var(--u-txt-color-weak, #
|
|
83
|
+
color: var(--u-txt-color-weak, #757575);
|
|
84
84
|
margin-left: 4px;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
.filter-row td {
|
|
88
88
|
padding: 4px;
|
|
89
|
-
background: var(--u-yellow-0, #
|
|
90
|
-
border-bottom: 1px solid var(--u-border-color, #
|
|
89
|
+
background: var(--u-yellow-0, #FFFDE7);
|
|
90
|
+
border-bottom: 1px solid var(--u-border-color, #E0E0E0);
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
.filter-row input,
|
|
94
94
|
.filter-row select {
|
|
95
95
|
width: 100%;
|
|
96
96
|
padding: 2px 6px;
|
|
97
|
-
border: 1px solid var(--u-input-border-color, #
|
|
97
|
+
border: 1px solid var(--u-input-border-color, #E0E0E0);
|
|
98
98
|
border-radius: 3px;
|
|
99
99
|
font-size: 11px;
|
|
100
100
|
outline: none;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
tbody tr {
|
|
104
|
-
border-bottom: 1px solid var(--u-border-color-weak, #
|
|
104
|
+
border-bottom: 1px solid var(--u-border-color-weak, #EEEEEE);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
tbody tr:hover {
|
|
108
|
-
background: var(--u-bg-color-hover, #
|
|
108
|
+
background: var(--u-bg-color-hover, #F5F5F5);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
tbody tr.selected {
|
|
@@ -113,13 +113,13 @@ var richTableStyles = css`
|
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
tbody tr.focused td.focused-cell {
|
|
116
|
-
outline: 2px solid var(--u-primary-color, #
|
|
116
|
+
outline: 2px solid var(--u-primary-color, #1976D2);
|
|
117
117
|
outline-offset: -2px;
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
tbody tr.editing {
|
|
121
|
-
background: var(--u-yellow-0, #
|
|
122
|
-
outline: 2px solid var(--u-warning-color-weak, #
|
|
121
|
+
background: var(--u-yellow-0, #FFFDE7);
|
|
122
|
+
outline: 2px solid var(--u-warning-color-weak, #FFEB3B);
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
tbody tr.error {
|
|
@@ -133,19 +133,19 @@ var richTableStyles = css`
|
|
|
133
133
|
tbody td .cell-edit-input {
|
|
134
134
|
width: 100%;
|
|
135
135
|
padding: 4px 6px;
|
|
136
|
-
border: 1px solid var(--u-primary-color, #
|
|
136
|
+
border: 1px solid var(--u-primary-color, #1976D2);
|
|
137
137
|
border-radius: 3px;
|
|
138
138
|
font-size: 13px;
|
|
139
139
|
outline: none;
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
tbody td .cell-edit-input.invalid {
|
|
143
|
-
border-color: var(--u-danger-color, #
|
|
143
|
+
border-color: var(--u-danger-color, #D32F2F);
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
.validation-error {
|
|
147
147
|
font-size: 10px;
|
|
148
|
-
color: var(--u-danger-color, #
|
|
148
|
+
color: var(--u-danger-color, #D32F2F);
|
|
149
149
|
margin-top: 2px;
|
|
150
150
|
}
|
|
151
151
|
|
|
@@ -158,11 +158,11 @@ var richTableStyles = css`
|
|
|
158
158
|
width: 30px;
|
|
159
159
|
text-align: center;
|
|
160
160
|
cursor: pointer;
|
|
161
|
-
color: var(--u-txt-color-weak, #
|
|
161
|
+
color: var(--u-txt-color-weak, #757575);
|
|
162
162
|
}
|
|
163
163
|
|
|
164
164
|
.expand-cell:hover {
|
|
165
|
-
color: var(--u-primary-color, #
|
|
165
|
+
color: var(--u-primary-color, #1976D2);
|
|
166
166
|
}
|
|
167
167
|
|
|
168
168
|
.actions-cell {
|
|
@@ -179,7 +179,7 @@ var richTableStyles = css`
|
|
|
179
179
|
.new-row input {
|
|
180
180
|
width: 100%;
|
|
181
181
|
padding: 4px 6px;
|
|
182
|
-
border: 1px dashed var(--u-success-color-weaker, #
|
|
182
|
+
border: 1px dashed var(--u-success-color-weaker, #81C784);
|
|
183
183
|
border-radius: 3px;
|
|
184
184
|
background: transparent;
|
|
185
185
|
font-size: 12px;
|
|
@@ -188,15 +188,15 @@ var richTableStyles = css`
|
|
|
188
188
|
}
|
|
189
189
|
|
|
190
190
|
.new-row input:focus {
|
|
191
|
-
border-color: var(--u-success-color, #
|
|
192
|
-
background: var(--u-bg-color,
|
|
191
|
+
border-color: var(--u-success-color, #2E7D32);
|
|
192
|
+
background: var(--u-bg-color, #FFFFFF);
|
|
193
193
|
opacity: 1;
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
.detail-row td {
|
|
197
197
|
padding: 8px 8px 8px 70px;
|
|
198
|
-
background: var(--u-
|
|
199
|
-
border-bottom: 2px solid var(--u-border-color, #
|
|
198
|
+
background: var(--u-bg-color-raised, #FAFAFA);
|
|
199
|
+
border-bottom: 2px solid var(--u-border-color, #E0E0E0);
|
|
200
200
|
}
|
|
201
201
|
|
|
202
202
|
.badge {
|
|
@@ -212,8 +212,8 @@ var richTableStyles = css`
|
|
|
212
212
|
justify-content: space-between;
|
|
213
213
|
align-items: center;
|
|
214
214
|
padding: 8px 12px;
|
|
215
|
-
background: var(--u-
|
|
216
|
-
border-top: 1px solid var(--u-border-color, #
|
|
215
|
+
background: var(--u-bg-color-raised, #FAFAFA);
|
|
216
|
+
border-top: 1px solid var(--u-border-color, #E0E0E0);
|
|
217
217
|
font-size: 12px;
|
|
218
218
|
color: var(--u-txt-color-weak, #757575);
|
|
219
219
|
}
|
|
@@ -226,22 +226,24 @@ var richTableStyles = css`
|
|
|
226
226
|
|
|
227
227
|
.pagination button {
|
|
228
228
|
padding: 2px 8px;
|
|
229
|
-
border: 1px solid var(--u-input-border-color, #
|
|
229
|
+
border: 1px solid var(--u-input-border-color, #E0E0E0);
|
|
230
230
|
border-radius: 3px;
|
|
231
|
-
|
|
231
|
+
/* 크롬 면 위의 컨트롤이다 — 면과 같은 단이면 묻힌다. 입력 계열은 두 테마 모두
|
|
232
|
+
크롬 면보다 한 단 안쪽이라(라이트 흰색 / 다크 #1E1E1E) 자연히 구분된다. */
|
|
233
|
+
background: var(--u-input-bg-color, #FFFFFF);
|
|
232
234
|
font-size: 11px;
|
|
233
235
|
cursor: pointer;
|
|
234
236
|
}
|
|
235
237
|
|
|
236
238
|
.pagination button.active {
|
|
237
|
-
background: var(--u-primary-color, #
|
|
238
|
-
color: var(--u-txt-color-inverse,
|
|
239
|
-
border-color: var(--u-input-border-color-focus, #
|
|
239
|
+
background: var(--u-primary-color, #1976D2);
|
|
240
|
+
color: var(--u-txt-color-inverse, #FFFFFF);
|
|
241
|
+
border-color: var(--u-input-border-color-focus, #1565C0);
|
|
240
242
|
}
|
|
241
243
|
|
|
242
244
|
.pagination select {
|
|
243
245
|
padding: 2px 4px;
|
|
244
|
-
border: 1px solid var(--u-input-border-color, #
|
|
246
|
+
border: 1px solid var(--u-input-border-color, #E0E0E0);
|
|
245
247
|
border-radius: 3px;
|
|
246
248
|
font-size: 11px;
|
|
247
249
|
margin-left: 8px;
|
|
@@ -260,7 +262,7 @@ var richTableStyles = css`
|
|
|
260
262
|
align-items: center;
|
|
261
263
|
justify-content: center;
|
|
262
264
|
padding: 40px;
|
|
263
|
-
color: var(--u-txt-color-weak, #
|
|
265
|
+
color: var(--u-txt-color-weak, #757575);
|
|
264
266
|
}
|
|
265
267
|
|
|
266
268
|
|
|
@@ -268,52 +270,35 @@ var richTableStyles = css`
|
|
|
268
270
|
.styles.ts 만 훑는 정리로는 보이지 않는 자리다. */
|
|
269
271
|
.row-menu {
|
|
270
272
|
cursor: pointer;
|
|
271
|
-
color: var(--u-txt-color-weak, #
|
|
273
|
+
color: var(--u-txt-color-weak, #757575);
|
|
272
274
|
}
|
|
273
275
|
|
|
274
276
|
.row-error-cell {
|
|
275
277
|
padding: 2px 8px;
|
|
276
278
|
background: var(--u-danger-bg-color, #FFEBEE);
|
|
277
|
-
color: var(--u-danger-color, #
|
|
279
|
+
color: var(--u-danger-color, #D32F2F);
|
|
278
280
|
font-size: 11px;
|
|
279
281
|
}
|
|
280
282
|
|
|
281
283
|
.new-row-marker {
|
|
282
|
-
color: var(--u-success-color-weaker, #
|
|
284
|
+
color: var(--u-success-color-weaker, #81C784);
|
|
283
285
|
}
|
|
284
286
|
|
|
285
287
|
/* ── 다크 보정 ──
|
|
286
|
-
|
|
287
|
-
서로 다른 팔레트 단에 매핑돼 있어(--u-bg-color = neutral-0 라이트 / neutral-100 다크,
|
|
288
|
-
--u-border-color = neutral-300 / neutral-400) 테마 보정이 토큰 층에 이미 들어 있다.
|
|
289
|
-
그래서 base 규칙 하나로 두 테마가 성립한다.
|
|
290
|
-
|
|
291
|
-
종전에는 이 자리에 57개 선언이 있었고, base 레이어가 토큰을 전혀 쓰지 않았기 때문에
|
|
292
|
-
(Tailwind 계열 hex 하드코딩) 다크를 통째로 재구현할 수밖에 없었다. base 를 역할 토큰으로
|
|
293
|
-
옮기면서 그 대부분이 불필요해졌다.
|
|
288
|
+
★**이 블록은 비어 있다. 그것이 목표 상태다.**
|
|
294
289
|
|
|
295
|
-
|
|
290
|
+
종전에는 여기 57개 선언이 있었고, base 레이어가 토큰을 전혀 쓰지 않아(하드코딩 hex)
|
|
291
|
+
다크를 통째로 재구현할 수밖에 없었다. base 를 역할 토큰으로 옮기며 대부분이 사라졌고,
|
|
292
|
+
마지막까지 남은 것은 **표면 높이 축의 부재** 하나였다 — 배경 역할 토큰이 상호작용
|
|
293
|
+
상태 이름(-hover/-active/-disabled)뿐이라 "바탕보다 한 단 올라온 면"을 뜻할 수단이
|
|
294
|
+
없었다. 라이트에서는 neutral-50/100 이 흰 바탕 위에서 읽히지만 다크에서는 그 단이
|
|
295
|
+
#0A0A0A/#121212 로 거의 검정이라 툴바·헤더·페이지네이션이 배경에 묻혔다.
|
|
296
296
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
neutral-50/100 이 흰 바탕 위에서 충분히 읽히지만, 다크에서는 그 단이 각각
|
|
300
|
-
#0A0A0A/#121212 로 거의 검정이라 툴바·헤더·페이지네이션이 배경에 묻힌다.
|
|
297
|
+
@iyulab/components 1.18.0 이 --u-bg-color-raised 를 신설해 그 자리를 채웠고,
|
|
298
|
+
base 규칙이 그것을 쓰므로 다크 전용 규칙이 필요 없다.
|
|
301
299
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
**색의 대부분이 이제 토큰 층에서 테마를 따르므로**, 그 브라우저에서도 다크가
|
|
305
|
-
동작한다 — 종전에는 이 블록이 전부였기 때문에 다크가 아예 없었다. */
|
|
306
|
-
|
|
307
|
-
:host-context([theme="dark"]) .toolbar,
|
|
308
|
-
:host-context([theme="dark"]) thead th,
|
|
309
|
-
:host-context([theme="dark"]) .detail-row td,
|
|
310
|
-
:host-context([theme="dark"]) .pagination {
|
|
311
|
-
background: var(--u-neutral-200, #1E1E1E);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
:host-context([theme="dark"]) .pagination button {
|
|
315
|
-
background: var(--u-neutral-300, #2A2A2A);
|
|
316
|
-
}
|
|
300
|
+
⇒ **부수 효과로 Firefox·Safari 의 다크가 완성된다.** :host-context 는 그 둘에서
|
|
301
|
+
미지원이라 이 블록의 색은 애초에 적용된 적이 없었다. 토큰 층은 브라우저를 가리지 않는다. */
|
|
317
302
|
`;
|
|
318
303
|
//#endregion
|
|
319
304
|
export { richTableStyles };
|
package/dist/init.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./utilities/shadowDomProtection.js";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iyulab/data-components",
|
|
3
3
|
"description": "iyulab data visualization components",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.9.1",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iyulab",
|
|
7
7
|
"web-components",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"lint:fix": "eslint src/ --fix"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
|
-
"@iyulab/components": "^1.
|
|
61
|
+
"@iyulab/components": "^1.18.0",
|
|
62
62
|
"lit": "^3.3.3"
|
|
63
63
|
},
|
|
64
64
|
"peerDependencies": {
|