@iyulab/data-components 0.7.1 → 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.
@@ -5,7 +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
- border: 1px solid #e2e8f0;
8
+ color: var(--u-txt-color, #212121);
9
+ border: 1px solid var(--u-border-color, #E0E0E0);
9
10
  border-radius: 8px;
10
11
  overflow: hidden;
11
12
  }
@@ -15,25 +16,25 @@ var richTableStyles = css`
15
16
  align-items: center;
16
17
  gap: 8px;
17
18
  padding: 8px 12px;
18
- background: #f8fafc;
19
- border-bottom: 1px solid #e2e8f0;
19
+ background: var(--u-bg-color-raised, #FAFAFA);
20
+ border-bottom: 1px solid var(--u-border-color, #E0E0E0);
20
21
  }
21
22
 
22
23
  .toolbar .selection-info {
23
24
  font-size: 12px;
24
- color: #64748b;
25
+ color: var(--u-txt-color-weak, #757575);
25
26
  }
26
27
 
27
28
  .toolbar .search-input {
28
29
  padding: 4px 10px;
29
- border: 1px solid #d1d5db;
30
+ border: 1px solid var(--u-input-border-color, #E0E0E0);
30
31
  border-radius: 4px;
31
32
  font-size: 12px;
32
33
  outline: none;
33
34
  }
34
35
 
35
36
  .toolbar .search-input:focus {
36
- border-color: #3b82f6;
37
+ border-color: var(--u-input-border-color-focus, #1976D2);
37
38
  box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
38
39
  }
39
40
 
@@ -43,13 +44,16 @@ var richTableStyles = css`
43
44
  border-radius: 4px;
44
45
  font-size: 12px;
45
46
  cursor: pointer;
47
+ /* 예외 — "색 배경 위의 글자" 역할 토큰이 없다. --u-txt-color-inverse 는
48
+ 다크에서 neutral-100(#121212) 이라 파랑/초록 버튼 위에서 읽히지 않는다.
49
+ 버튼 배경은 두 테마 모두 유채색이므로 흰 글자가 맞다. */
46
50
  color: white;
47
51
  }
48
52
 
49
- .toolbar .btn-primary { background: #3b82f6; }
50
- .toolbar .btn-primary:hover { background: #2563eb; }
51
- .toolbar .btn-success { background: #10b981; }
52
- .toolbar .btn-success:hover { background: #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); }
53
57
 
54
58
  table {
55
59
  width: 100%;
@@ -58,10 +62,10 @@ var richTableStyles = css`
58
62
 
59
63
  thead th {
60
64
  padding: 8px;
61
- background: #f1f5f9;
65
+ background: var(--u-bg-color-raised, #FAFAFA);
62
66
  font-weight: 600;
63
67
  text-align: left;
64
- border-bottom: 2px solid #e2e8f0;
68
+ border-bottom: 2px solid var(--u-border-color, #E0E0E0);
65
69
  user-select: none;
66
70
  position: relative;
67
71
  }
@@ -71,55 +75,55 @@ var richTableStyles = css`
71
75
  }
72
76
 
73
77
  thead th.sortable:hover {
74
- background: #e2e8f0;
78
+ background: var(--u-bg-color-active, #EEEEEE);
75
79
  }
76
80
 
77
81
  .sort-indicator {
78
82
  font-size: 10px;
79
- color: #94a3b8;
83
+ color: var(--u-txt-color-weak, #757575);
80
84
  margin-left: 4px;
81
85
  }
82
86
 
83
87
  .filter-row td {
84
88
  padding: 4px;
85
- background: #fefce8;
86
- border-bottom: 1px solid #e2e8f0;
89
+ background: var(--u-yellow-0, #FFFDE7);
90
+ border-bottom: 1px solid var(--u-border-color, #E0E0E0);
87
91
  }
88
92
 
89
93
  .filter-row input,
90
94
  .filter-row select {
91
95
  width: 100%;
92
96
  padding: 2px 6px;
93
- border: 1px solid #d1d5db;
97
+ border: 1px solid var(--u-input-border-color, #E0E0E0);
94
98
  border-radius: 3px;
95
99
  font-size: 11px;
96
100
  outline: none;
97
101
  }
98
102
 
99
103
  tbody tr {
100
- border-bottom: 1px solid #e2e8f0;
104
+ border-bottom: 1px solid var(--u-border-color-weak, #EEEEEE);
101
105
  }
102
106
 
103
107
  tbody tr:hover {
104
- background: #f8fafc;
108
+ background: var(--u-bg-color-hover, #F5F5F5);
105
109
  }
106
110
 
107
111
  tbody tr.selected {
108
- background: #eff6ff;
112
+ background: var(--u-primary-bg-color, #E3F2FD);
109
113
  }
110
114
 
111
115
  tbody tr.focused td.focused-cell {
112
- outline: 2px solid #3b82f6;
116
+ outline: 2px solid var(--u-primary-color, #1976D2);
113
117
  outline-offset: -2px;
114
118
  }
115
119
 
116
120
  tbody tr.editing {
117
- background: #fefce8;
118
- outline: 2px solid #eab308;
121
+ background: var(--u-yellow-0, #FFFDE7);
122
+ outline: 2px solid var(--u-warning-color-weak, #FFEB3B);
119
123
  }
120
124
 
121
125
  tbody tr.error {
122
- background: #fef2f2;
126
+ background: var(--u-danger-bg-color, #FFEBEE);
123
127
  }
124
128
 
125
129
  tbody td {
@@ -129,19 +133,19 @@ var richTableStyles = css`
129
133
  tbody td .cell-edit-input {
130
134
  width: 100%;
131
135
  padding: 4px 6px;
132
- border: 1px solid #3b82f6;
136
+ border: 1px solid var(--u-primary-color, #1976D2);
133
137
  border-radius: 3px;
134
138
  font-size: 13px;
135
139
  outline: none;
136
140
  }
137
141
 
138
142
  tbody td .cell-edit-input.invalid {
139
- border-color: #ef4444;
143
+ border-color: var(--u-danger-color, #D32F2F);
140
144
  }
141
145
 
142
146
  .validation-error {
143
147
  font-size: 10px;
144
- color: #ef4444;
148
+ color: var(--u-danger-color, #D32F2F);
145
149
  margin-top: 2px;
146
150
  }
147
151
 
@@ -154,11 +158,11 @@ var richTableStyles = css`
154
158
  width: 30px;
155
159
  text-align: center;
156
160
  cursor: pointer;
157
- color: #94a3b8;
161
+ color: var(--u-txt-color-weak, #757575);
158
162
  }
159
163
 
160
164
  .expand-cell:hover {
161
- color: #3b82f6;
165
+ color: var(--u-primary-color, #1976D2);
162
166
  }
163
167
 
164
168
  .actions-cell {
@@ -168,31 +172,31 @@ var richTableStyles = css`
168
172
 
169
173
  .new-row td {
170
174
  padding: 4px 8px;
171
- background: #f0fdf4;
175
+ background: var(--u-success-bg-color, #E8F5E9);
172
176
  opacity: 0.8;
173
177
  }
174
178
 
175
179
  .new-row input {
176
180
  width: 100%;
177
181
  padding: 4px 6px;
178
- border: 1px dashed #86efac;
182
+ border: 1px dashed var(--u-success-color-weaker, #81C784);
179
183
  border-radius: 3px;
180
184
  background: transparent;
181
185
  font-size: 12px;
182
- color: #6b7280;
186
+ color: var(--u-txt-color-weak, #757575);
183
187
  outline: none;
184
188
  }
185
189
 
186
190
  .new-row input:focus {
187
- border-color: #10b981;
188
- background: white;
191
+ border-color: var(--u-success-color, #2E7D32);
192
+ background: var(--u-bg-color, #FFFFFF);
189
193
  opacity: 1;
190
194
  }
191
195
 
192
196
  .detail-row td {
193
197
  padding: 8px 8px 8px 70px;
194
- background: #f8fafc;
195
- border-bottom: 2px solid #e2e8f0;
198
+ background: var(--u-bg-color-raised, #FAFAFA);
199
+ border-bottom: 2px solid var(--u-border-color, #E0E0E0);
196
200
  }
197
201
 
198
202
  .badge {
@@ -208,10 +212,10 @@ var richTableStyles = css`
208
212
  justify-content: space-between;
209
213
  align-items: center;
210
214
  padding: 8px 12px;
211
- background: #f8fafc;
212
- border-top: 1px solid #e2e8f0;
215
+ background: var(--u-bg-color-raised, #FAFAFA);
216
+ border-top: 1px solid var(--u-border-color, #E0E0E0);
213
217
  font-size: 12px;
214
- color: #64748b;
218
+ color: var(--u-txt-color-weak, #757575);
215
219
  }
216
220
 
217
221
  .pagination .page-buttons {
@@ -222,22 +226,24 @@ var richTableStyles = css`
222
226
 
223
227
  .pagination button {
224
228
  padding: 2px 8px;
225
- border: 1px solid #d1d5db;
229
+ border: 1px solid var(--u-input-border-color, #E0E0E0);
226
230
  border-radius: 3px;
227
- background: white;
231
+ /* 크롬 면 위의 컨트롤이다 — 면과 같은 단이면 묻힌다. 입력 계열은 두 테마 모두
232
+ 크롬 면보다 한 단 안쪽이라(라이트 흰색 / 다크 #1E1E1E) 자연히 구분된다. */
233
+ background: var(--u-input-bg-color, #FFFFFF);
228
234
  font-size: 11px;
229
235
  cursor: pointer;
230
236
  }
231
237
 
232
238
  .pagination button.active {
233
- background: #3b82f6;
234
- color: white;
235
- border-color: #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);
236
242
  }
237
243
 
238
244
  .pagination select {
239
245
  padding: 2px 4px;
240
- border: 1px solid #d1d5db;
246
+ border: 1px solid var(--u-input-border-color, #E0E0E0);
241
247
  border-radius: 3px;
242
248
  font-size: 11px;
243
249
  margin-left: 8px;
@@ -248,7 +254,7 @@ var richTableStyles = css`
248
254
  align-items: center;
249
255
  justify-content: center;
250
256
  padding: 40px;
251
- color: #6b7280;
257
+ color: var(--u-txt-color-weak, #757575);
252
258
  }
253
259
 
254
260
  .empty-message {
@@ -256,178 +262,43 @@ var richTableStyles = css`
256
262
  align-items: center;
257
263
  justify-content: center;
258
264
  padding: 40px;
259
- color: #9ca3af;
260
- }
261
-
262
- /* ── Dark mode ──
263
- 외부에서 --u-* CSS 변수가 제공되면 그 값을 사용하고,
264
- 제공되지 않으면 자체 dark fallback 값을 적용한다. */
265
-
266
- :host-context([theme="dark"]) {
267
- border-color: var(--u-border-color, #3D3D3D);
268
- color: var(--u-txt-color, #D4D4D4);
269
- }
270
-
271
- :host-context([theme="dark"]) .toolbar {
272
- background: var(--u-neutral-200, #1E1E1E);
273
- border-bottom-color: var(--u-border-color, #3D3D3D);
274
- }
275
-
276
- :host-context([theme="dark"]) .toolbar .selection-info {
277
- color: var(--u-txt-color-weak, #8A8A8A);
278
- }
279
-
280
- :host-context([theme="dark"]) .toolbar .search-input {
281
- background: var(--u-input-bg-color, #1E1E1E);
282
- color: var(--u-txt-color, #D4D4D4);
283
- border-color: var(--u-input-border-color, #3D3D3D);
284
- }
285
-
286
- :host-context([theme="dark"]) .toolbar .search-input:focus {
287
- border-color: var(--u-blue-500, #6ba3e3);
288
- box-shadow: 0 0 0 2px rgba(107, 163, 227, 0.2);
289
- }
290
-
291
- :host-context([theme="dark"]) .toolbar .btn-primary {
292
- background: var(--u-blue-500, #6ba3e3);
293
- }
294
-
295
- :host-context([theme="dark"]) .toolbar .btn-primary:hover {
296
- background: var(--u-blue-600, #87B8F5);
297
- }
298
-
299
- :host-context([theme="dark"]) .toolbar .btn-success {
300
- background: var(--u-green-500, #66B584);
301
- }
302
-
303
- :host-context([theme="dark"]) .toolbar .btn-success:hover {
304
- background: var(--u-green-600, #81D19D);
305
- }
306
-
307
- :host-context([theme="dark"]) thead th {
308
- background: var(--u-neutral-200, #1E1E1E);
309
- color: var(--u-txt-color, #D4D4D4);
310
- border-bottom-color: var(--u-border-color, #3D3D3D);
311
- }
312
-
313
- :host-context([theme="dark"]) thead th.sortable:hover {
314
- background: var(--u-neutral-300, #2A2A2A);
315
- }
316
-
317
- :host-context([theme="dark"]) .sort-indicator {
318
- color: var(--u-txt-color-weak, #8A8A8A);
319
- }
320
-
321
- :host-context([theme="dark"]) .filter-row td {
322
- background: var(--u-yellow-0, #2E2200);
323
- border-bottom-color: var(--u-border-color, #3D3D3D);
324
- }
325
-
326
- :host-context([theme="dark"]) .filter-row input,
327
- :host-context([theme="dark"]) .filter-row select {
328
- background: var(--u-input-bg-color, #1E1E1E);
329
- color: var(--u-txt-color, #D4D4D4);
330
- border-color: var(--u-input-border-color, #3D3D3D);
331
- }
332
-
333
- :host-context([theme="dark"]) tbody tr {
334
- border-bottom-color: var(--u-border-color-weak, #2A2A2A);
265
+ color: var(--u-txt-color-weak, #757575);
335
266
  }
336
267
 
337
- :host-context([theme="dark"]) tbody tr:hover {
338
- background: var(--u-neutral-200, #1E1E1E);
339
- }
340
-
341
- :host-context([theme="dark"]) tbody tr.selected {
342
- background: var(--u-blue-0, #0a1e3d);
343
- }
344
-
345
- :host-context([theme="dark"]) tbody tr.focused td.focused-cell {
346
- outline-color: var(--u-blue-500, #6ba3e3);
347
- }
348
-
349
- :host-context([theme="dark"]) tbody tr.editing {
350
- background: var(--u-yellow-0, #2E2200);
351
- outline-color: var(--u-yellow-500, #D4A712);
352
- }
353
-
354
- :host-context([theme="dark"]) tbody tr.error {
355
- background: var(--u-red-0, #2E0A0A);
356
- }
357
-
358
- :host-context([theme="dark"]) tbody td .cell-edit-input {
359
- background: var(--u-input-bg-color, #1E1E1E);
360
- color: var(--u-txt-color, #D4D4D4);
361
- border-color: var(--u-blue-500, #6ba3e3);
362
- }
363
-
364
- :host-context([theme="dark"]) tbody td .cell-edit-input.invalid {
365
- border-color: var(--u-red-500, #D66060);
366
- }
367
-
368
- :host-context([theme="dark"]) .validation-error {
369
- color: var(--u-red-500, #D66060);
370
- }
371
-
372
- :host-context([theme="dark"]) .expand-cell {
373
- color: var(--u-txt-color-weak, #8A8A8A);
374
- }
375
-
376
- :host-context([theme="dark"]) .expand-cell:hover {
377
- color: var(--u-blue-500, #6ba3e3);
378
- }
379
-
380
- :host-context([theme="dark"]) .new-row td {
381
- background: var(--u-green-0, #0D2818);
382
- }
383
-
384
- :host-context([theme="dark"]) .new-row input {
385
- border-color: var(--u-green-500, #66B584);
386
- color: var(--u-txt-color-weak, #8A8A8A);
387
- }
388
-
389
- :host-context([theme="dark"]) .new-row input:focus {
390
- border-color: var(--u-green-600, #81D19D);
391
- background: var(--u-input-bg-color, #1E1E1E);
392
- color: var(--u-txt-color, #D4D4D4);
393
- }
394
268
 
395
- :host-context([theme="dark"]) .detail-row td {
396
- background: var(--u-neutral-200, #1E1E1E);
397
- border-bottom-color: var(--u-border-color, #3D3D3D);
269
+ /* 종전에는 아래 셋이 템플릿 안에 style="…#94a3b8" 형태로 박혀 있었다.
270
+ .styles.ts 훑는 정리로는 보이지 않는 자리다. */
271
+ .row-menu {
272
+ cursor: pointer;
273
+ color: var(--u-txt-color-weak, #757575);
398
274
  }
399
275
 
400
- :host-context([theme="dark"]) .pagination {
401
- background: var(--u-neutral-200, #1E1E1E);
402
- border-top-color: var(--u-border-color, #3D3D3D);
403
- color: var(--u-txt-color-weak, #8A8A8A);
276
+ .row-error-cell {
277
+ padding: 2px 8px;
278
+ background: var(--u-danger-bg-color, #FFEBEE);
279
+ color: var(--u-danger-color, #D32F2F);
280
+ font-size: 11px;
404
281
  }
405
282
 
406
- :host-context([theme="dark"]) .pagination button {
407
- background: var(--u-neutral-300, #2A2A2A);
408
- color: var(--u-txt-color, #D4D4D4);
409
- border-color: var(--u-border-color, #3D3D3D);
283
+ .new-row-marker {
284
+ color: var(--u-success-color-weaker, #81C784);
410
285
  }
411
286
 
412
- :host-context([theme="dark"]) .pagination button.active {
413
- background: var(--u-blue-500, #6ba3e3);
414
- color: var(--u-neutral-1000, #FFFFFF);
415
- border-color: var(--u-blue-500, #6ba3e3);
416
- }
287
+ /* ── 다크 보정 ──
288
+ ★**이 블록은 비어 있다. 그것이 목표 상태다.**
417
289
 
418
- :host-context([theme="dark"]) .pagination select {
419
- background: var(--u-input-bg-color, #1E1E1E);
420
- color: var(--u-txt-color, #D4D4D4);
421
- border-color: var(--u-input-border-color, #3D3D3D);
422
- }
290
+ 종전에는 여기 57개 선언이 있었고, base 레이어가 토큰을 전혀 쓰지 않아(하드코딩 hex)
291
+ 다크를 통째로 재구현할 수밖에 없었다. base 를 역할 토큰으로 옮기며 대부분이 사라졌고,
292
+ 마지막까지 남은 것은 **표면 높이 축의 부재** 하나였다 — 배경 역할 토큰이 상호작용
293
+ 상태 이름(-hover/-active/-disabled)뿐이라 "바탕보다 한 단 올라온 면"을 뜻할 수단이
294
+ 없었다. 라이트에서는 neutral-50/100 이 흰 바탕 위에서 읽히지만 다크에서는 그 단이
295
+ #0A0A0A/#121212 로 거의 검정이라 툴바·헤더·페이지네이션이 배경에 묻혔다.
423
296
 
424
- :host-context([theme="dark"]) .loading-overlay {
425
- color: var(--u-txt-color-weak, #8A8A8A);
426
- }
297
+ @iyulab/components 1.18.0 이 --u-bg-color-raised 를 신설해 그 자리를 채웠고,
298
+ base 규칙이 그것을 쓰므로 다크 전용 규칙이 필요 없다.
427
299
 
428
- :host-context([theme="dark"]) .empty-message {
429
- color: var(--u-txt-color-disabled, #525252);
430
- }
300
+ ⇒ **부수 효과로 Firefox·Safari 의 다크가 완성된다.** :host-context 그 둘에서
301
+ 미지원이라 블록의 색은 애초에 적용된 적이 없었다. 토큰 층은 브라우저를 가리지 않는다. */
431
302
  `;
432
303
  //#endregion
433
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.7.1",
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.8.0",
61
+ "@iyulab/components": "^1.18.0",
62
62
  "lit": "^3.3.3"
63
63
  },
64
64
  "peerDependencies": {