@iyulab/data-components 0.8.0 → 0.9.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 CHANGED
@@ -1,5 +1,65 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.9.0] - 2026-08-02
4
+
5
+ ### Fixed
6
+
7
+ - ★**URichTable 의 다크 테마가 Firefox·Safari 에서 동작하지 않던 문제.**
8
+
9
+ 툴바·표 헤더·상세 행·페이지네이션의 다크 배경이 `:host-context([theme="dark"])` 로만
10
+ 선언돼 있었는데, 그 선택자는 **Firefox·Safari 에서 미지원**이다. 두 브라우저에서는
11
+ 그 색이 적용된 적이 없다 — 라이트용 밝은 회색이 다크 화면에 그대로 남았다.
12
+
13
+ 우회가 아니라 원인을 없앴다: `@iyulab/components` 1.18.0 의 **`--u-bg-color-raised`**
14
+ 가 그 면을 표현하므로 base 규칙 하나로 두 테마가 성립하고, **다크 전용 블록이 통째로
15
+ 사라졌다**(이 파일의 다크 규칙 3 → **0**). 토큰 층은 브라우저를 가리지 않는다.
16
+
17
+ - ★**`@iyulab/data-components/init` 이 게시본에 존재하지 않던 문제.**
18
+ `exports['./init']` 이 선언돼 있고 `src/init.ts` 도 있는데, **빌드 진입점 목록에 없어서**
19
+ `dist/init.js` 가 한 번도 생성되지 않았다(타입 선언 `dist/init.d.ts` 만 남아 더 눈에 띄지
20
+ 않았다). 이 서브패스를 임포트하는 소비자는 `ERR_MODULE_NOT_FOUND` 를 받는다.
21
+
22
+ ⚠**이 리포 안에서는 아무 증상이 없다** — 로컬은 상대 경로로 소스를 직접 읽는다.
23
+ 게시본을 설치한 쪽에서만 드러나는 부류이며, 같은 성질의 결함이 과거에 네 번의 릴리스를
24
+ 지나 잠복한 적이 있다. 모노레포 `npm run doctor` 에 **게시 계약 스윕**을 추가해 12개
25
+ 패키지 전부를 대조하도록 했다.
26
+
27
+ ### Changed
28
+
29
+ - ⚠**`@iyulab/components` 의존 범위를 `^1.18.0` 으로 올린다.** 이 버전은 1.18.0 이 신설한
30
+ `--u-bg-color-raised` 를 쓴다. 1.15.0~1.17.0 과 짝지으면 토큰이 없어 폴백(`#FAFAFA`)이
31
+ 발동하는데, 그 값은 라이트 기준이라 **다크에서 툴바·헤더가 밝은 회색으로 칠해진다.**
32
+ 범위를 올리지 않으면 조용히 깨지는 조합이 생긴다.
33
+ - 다크 툴바·헤더·상세 행·페이지네이션이 `#1E1E1E` → **`#2A2A2A`** 로 한 단 밝아진다.
34
+ 기존 오버라이드가 해결하려던 증상(*"툴바·헤더가 배경에 묻힌다"*)에 대해 바탕 대비가
35
+ 1.15 → **1.42** 로 개선된다.
36
+ - 다크 페이지네이션 버튼이 `#2A2A2A` → **`#1E1E1E`** 로 한 단 안쪽이 된다. 크롬 면 위의
37
+ **컨트롤**이므로 입력 계열 토큰(`--u-input-bg-color`)을 쓴다 — 면과 같은 단이면 묻힌다.
38
+ - 라이트 표 헤더가 `#F5F5F5` → **`#FAFAFA`** 로 툴바와 같은 단이 된다. 두 단의 실측 수요는
39
+ 라이트 한쪽뿐이었고, 헤더는 이미 2px 테두리로 분리돼 있다.
40
+
41
+ ## [0.8.1] - 2026-08-02
42
+
43
+ ### Fixed
44
+
45
+ - ★**토큰 폴백 리터럴 108곳이 정본 시트와 어긋나 있던 문제.** 세 부류가 섞여 있었다:
46
+
47
+ 1. **다른 팔레트가 박혀 있던 것** (~80곳) — `#3b82f6`·`#e2e8f0`·`#94a3b8`·`#0f172a`·
48
+ `#ef4444`·`#10b981` 등. `@iyulab/components` 의 값이었던 적이 **한 번도 없다.**
49
+ 시트를 로드하지 않은 소비자에게는 이 패키지만 전혀 다른 색 체계로 보였다.
50
+ 2. ★★**다크 시트 값이 라이트 폴백으로 구워져 있던 것** (4곳) —
51
+ `--u-neutral-200: #1E1E1E`·`--u-neutral-300: #2A2A2A`. 시트가 없는 **라이트 화면에
52
+ 다크 회색**이 칠해진다. 폴백 정본은 light 여야 한다.
53
+ 3. 1.16.0 의 역할 단 재매핑을 받지 못한 것 (~24곳).
54
+
55
+ 특히 `--u-txt-color-weak` 12곳은 `#94a3b8`(흰 배경 대비 **2.56**, AA 미달 — 시트 값 #757575 는 4.61)이었다 —
56
+ 업스트림이 1.15.0 에서 바로 이 토큰의 AA 미달을 고쳤는데, 이 패키지의 폴백은 그 수정을
57
+ 받은 적이 없었다.
58
+
59
+ ⚠**이 결함은 개발 환경에서 절대 드러나지 않는다.** 토큰 시트가 있으면 폴백은 아예
60
+ 평가되지 않는다 — 깨지는 곳은 시트를 로드하지 않은 소비자의 화면이고, 우리가 보지
61
+ 못하는 자리다. 모노레포 루트의 `npm run tokens:sync` 가 이제 정본 시트와 대조한다.
62
+
3
63
  ## [0.8.0] - 2026-08-02
4
64
 
5
65
  ### 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, #fff);
22
- border: 1px solid var(--u-border-color, #e2e8f0);
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, #1E88E5);
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, #fff);
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, #64748b);
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, #fff);
64
- border: 1px solid var(--u-border-color, #e2e8f0);
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, #1E88E5);
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, #1E88E5);
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, #64748b);
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, #0f172a);
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, #e2e8f0);
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, #fff);
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, #f8fafc);
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, #64748b);
151
- border-bottom: 2px solid var(--u-border-color, #e2e8f0);
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, #f1f5f9);
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, #0f172a);
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, #64748b);
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, #e2e8f0);
15
+ border: 1px solid var(--u-border-color, #E0E0E0);
16
16
  border-radius: 4px;
17
- background: var(--u-bg-color, #fff);
17
+ background: var(--u-bg-color, #FFFFFF);
18
18
  }
19
19
 
20
20
  .sheet-container:focus-within {
21
- border-color: var(--u-blue-500, #3b82f6);
22
- box-shadow: 0 0 0 2px var(--u-blue-100, #dbeafe);
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, #f1f5f9);
47
- border-right: 1px solid var(--u-border-color, #e2e8f0);
48
- border-bottom: 2px solid var(--u-border-color, #e2e8f0);
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, #e2e8f0);
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, #f1f5f9);
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, #64748b);
68
- border-right: 1px solid var(--u-border-color, #e2e8f0);
69
- border-bottom: 2px solid var(--u-border-color, #e2e8f0);
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, #bfdbfe);
79
- color: var(--u-blue-800, #1e40af);
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, #3b82f6);
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, #64748b);
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, #f8fafc);
132
- border-right: 1px solid var(--u-border-color, #e2e8f0);
133
- border-bottom: 1px solid var(--u-border-color-weak, #f1f5f9);
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, #dbeafe);
141
- color: var(--u-blue-800, #1e40af);
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, #f1f5f9);
149
- border-bottom: 1px solid var(--u-border-color-weak, #f1f5f9);
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, #0f172a);
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, #fff);
171
- outline: 2px solid var(--u-blue-500, #3b82f6);
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, #3b82f6);
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, #0f172a);
197
- background: var(--u-bg-color, #fff);
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, #fff);
213
- border: 1px solid var(--u-border-color, #e2e8f0);
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, #0f172a);
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, #f1f5f9);
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, #1e40af);
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, #64748b);
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, #64748b);
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, #f1f5f9);
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, #0f172a);
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, #dbeafe);
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, #1e3a5f);
295
+ background: var(--u-blue-100, #BBDEFB);
296
296
  }
297
297
 
298
298
  ${host} .cell.cell-readonly.selected {
299
- background: var(--u-neutral-200, #2A2A2A);
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, #2a4a6f);
304
+ background: var(--u-blue-200, #90CAF9);
305
305
  }
306
306
 
307
307
  ${host} .cell.cell-computed.anchor {
308
- background: var(--u-blue-100, #1e3a5f);
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, #0f172a);
9
- border: 1px solid var(--u-border-color, #e2e8f0);
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-neutral-50, #f8fafc);
20
- border-bottom: 1px solid var(--u-border-color, #e2e8f0);
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,14 +27,14 @@ var richTableStyles = css`
27
27
 
28
28
  .toolbar .search-input {
29
29
  padding: 4px 10px;
30
- border: 1px solid var(--u-input-border-color, #d1d5db);
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, #3b82f6);
37
+ border-color: var(--u-input-border-color-focus, #1976D2);
38
38
  box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
39
39
  }
40
40
 
@@ -50,10 +50,10 @@ var richTableStyles = css`
50
50
  color: white;
51
51
  }
52
52
 
53
- .toolbar .btn-primary { background: var(--u-primary-color, #3b82f6); }
54
- .toolbar .btn-primary:hover { background: var(--u-primary-color-strong, #2563eb); }
55
- .toolbar .btn-success { background: var(--u-success-color, #10b981); }
56
- .toolbar .btn-success:hover { background: var(--u-success-color-strong, #059669); }
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-neutral-100, #f1f5f9);
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, #e2e8f0);
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, #e2e8f0);
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, #94a3b8);
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, #fefce8);
90
- border-bottom: 1px solid var(--u-border-color, #e2e8f0);
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, #d1d5db);
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, #e2e8f0);
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, #f8fafc);
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, #3b82f6);
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, #fefce8);
122
- outline: 2px solid var(--u-warning-color-weak, #eab308);
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, #3b82f6);
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, #ef4444);
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, #ef4444);
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, #94a3b8);
161
+ color: var(--u-txt-color-weak, #757575);
162
162
  }
163
163
 
164
164
  .expand-cell:hover {
165
- color: var(--u-primary-color, #3b82f6);
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, #86efac);
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, #10b981);
192
- background: var(--u-bg-color, white);
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-neutral-50, #f8fafc);
199
- border-bottom: 2px solid var(--u-border-color, #e2e8f0);
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-neutral-50, #f8fafc);
216
- border-top: 1px solid var(--u-border-color, #e2e8f0);
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, #d1d5db);
229
+ border: 1px solid var(--u-input-border-color, #E0E0E0);
230
230
  border-radius: 3px;
231
- background: var(--u-bg-color, white);
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, #3b82f6);
238
- color: var(--u-txt-color-inverse, white);
239
- border-color: var(--u-input-border-color-focus, #3b82f6);
239
+ background: var(--u-primary-color, #1976D2);
240
+ color: var(--u-txt-color-inverse, #FFFFFF);
241
+ border-color: var(--u-input-border-color-focus, #1976D2);
240
242
  }
241
243
 
242
244
  .pagination select {
243
245
  padding: 2px 4px;
244
- border: 1px solid var(--u-input-border-color, #d1d5db);
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, #9ca3af);
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, #94a3b8);
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, #ef4444);
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, #86efac);
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
- **표면 높이 축이 없다.** 배경 역할 토큰은 상호작용 상태 이름(-hover/-active/
298
- -disabled)뿐이라 "바탕보다 올라온 면"을 뜻하는 토큰이 없다. 라이트에서는
299
- neutral-50/100 이 흰 바탕 위에서 충분히 읽히지만, 다크에서는 그 단이 각각
300
- #0A0A0A/#121212 로 거의 검정이라 툴바·헤더·페이지네이션이 배경에 묻힌다.
297
+ @iyulab/components 1.18.0 --u-bg-color-raised 신설해 자리를 채웠고,
298
+ base 규칙이 그것을 쓰므로 다크 전용 규칙이 필요 없다.
301
299
 
302
-
303
- ⚠:host-context Firefox/Safari 미지원이다. 그러나 base 마이그레이션으로
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.8.0",
4
+ "version": "0.9.0",
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.15.0",
61
+ "@iyulab/components": "^1.18.0",
62
62
  "lit": "^3.3.3"
63
63
  },
64
64
  "peerDependencies": {