@iyulab/data-components 0.7.0 → 0.8.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, #0f172a);
9
+ border: 1px solid var(--u-border-color, #e2e8f0);
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-neutral-50, #f8fafc);
20
+ border-bottom: 1px solid var(--u-border-color, #e2e8f0);
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, #d1d5db);
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, #3b82f6);
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, #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
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-neutral-100, #f1f5f9);
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, #e2e8f0);
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, #e2e8f0);
75
79
  }
76
80
 
77
81
  .sort-indicator {
78
82
  font-size: 10px;
79
- color: #94a3b8;
83
+ color: var(--u-txt-color-weak, #94a3b8);
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, #fefce8);
90
+ border-bottom: 1px solid var(--u-border-color, #e2e8f0);
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, #d1d5db);
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, #e2e8f0);
101
105
  }
102
106
 
103
107
  tbody tr:hover {
104
- background: #f8fafc;
108
+ background: var(--u-bg-color-hover, #f8fafc);
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, #3b82f6);
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, #fefce8);
122
+ outline: 2px solid var(--u-warning-color-weak, #eab308);
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, #3b82f6);
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, #ef4444);
140
144
  }
141
145
 
142
146
  .validation-error {
143
147
  font-size: 10px;
144
- color: #ef4444;
148
+ color: var(--u-danger-color, #ef4444);
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, #94a3b8);
158
162
  }
159
163
 
160
164
  .expand-cell:hover {
161
- color: #3b82f6;
165
+ color: var(--u-primary-color, #3b82f6);
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, #86efac);
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, #10b981);
192
+ background: var(--u-bg-color, white);
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-neutral-50, #f8fafc);
199
+ border-bottom: 2px solid var(--u-border-color, #e2e8f0);
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-neutral-50, #f8fafc);
216
+ border-top: 1px solid var(--u-border-color, #e2e8f0);
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,22 @@ 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, #d1d5db);
226
230
  border-radius: 3px;
227
- background: white;
231
+ background: var(--u-bg-color, white);
228
232
  font-size: 11px;
229
233
  cursor: pointer;
230
234
  }
231
235
 
232
236
  .pagination button.active {
233
- background: #3b82f6;
234
- color: white;
235
- border-color: #3b82f6;
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);
236
240
  }
237
241
 
238
242
  .pagination select {
239
243
  padding: 2px 4px;
240
- border: 1px solid #d1d5db;
244
+ border: 1px solid var(--u-input-border-color, #d1d5db);
241
245
  border-radius: 3px;
242
246
  font-size: 11px;
243
247
  margin-left: 8px;
@@ -248,7 +252,7 @@ var richTableStyles = css`
248
252
  align-items: center;
249
253
  justify-content: center;
250
254
  padding: 40px;
251
- color: #6b7280;
255
+ color: var(--u-txt-color-weak, #757575);
252
256
  }
253
257
 
254
258
  .empty-message {
@@ -256,177 +260,59 @@ var richTableStyles = css`
256
260
  align-items: center;
257
261
  justify-content: center;
258
262
  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);
263
+ color: var(--u-txt-color-weak, #9ca3af);
311
264
  }
312
265
 
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
266
 
333
- :host-context([theme="dark"]) tbody tr {
334
- border-bottom-color: var(--u-border-color-weak, #2A2A2A);
335
- }
336
-
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);
267
+ /* 종전에는 아래 셋이 템플릿 안에 style="…#94a3b8" 형태로 박혀 있었다.
268
+ .styles.ts 훑는 정리로는 보이지 않는 자리다. */
269
+ .row-menu {
270
+ cursor: pointer;
271
+ color: var(--u-txt-color-weak, #94a3b8);
347
272
  }
348
273
 
349
- :host-context([theme="dark"]) tbody tr.editing {
350
- background: var(--u-yellow-0, #2E2200);
351
- outline-color: var(--u-yellow-500, #D4A712);
274
+ .row-error-cell {
275
+ padding: 2px 8px;
276
+ background: var(--u-danger-bg-color, #FFEBEE);
277
+ color: var(--u-danger-color, #ef4444);
278
+ font-size: 11px;
352
279
  }
353
280
 
354
- :host-context([theme="dark"]) tbody tr.error {
355
- background: var(--u-red-0, #2E0A0A);
281
+ .new-row-marker {
282
+ color: var(--u-success-color-weaker, #86efac);
356
283
  }
357
284
 
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
- }
285
+ /* ── 다크 보정 ──
286
+ ⚠**여기 남은 규칙은 "다크 테마 구현"이 아니다.** 역할 토큰의 중립 계열은 두 테마에서
287
+ 서로 다른 팔레트 단에 매핑돼 있어(--u-bg-color = neutral-0 라이트 / neutral-100 다크,
288
+ --u-border-color = neutral-300 / neutral-400) 테마 보정이 토큰 층에 이미 들어 있다.
289
+ 그래서 base 규칙 하나로 두 테마가 성립한다.
363
290
 
364
- :host-context([theme="dark"]) tbody td .cell-edit-input.invalid {
365
- border-color: var(--u-red-500, #D66060);
366
- }
291
+ 종전에는 자리에 57개 선언이 있었고, base 레이어가 토큰을 전혀 쓰지 않았기 때문에
292
+ (Tailwind 계열 hex 하드코딩) 다크를 통째로 재구현할 수밖에 없었다. base 를 역할 토큰으로
293
+ 옮기면서 그 대부분이 불필요해졌다.
367
294
 
368
- :host-context([theme="dark"]) .validation-error {
369
- color: var(--u-red-500, #D66060);
370
- }
295
+ 남긴 것은 역할 층에 자리가 없는 하나뿐이다:
371
296
 
372
- :host-context([theme="dark"]) .expand-cell {
373
- color: var(--u-txt-color-weak, #8A8A8A);
374
- }
297
+ **표면 높이 축이 없다.** 배경 역할 토큰은 상호작용 상태 이름(-hover/-active/
298
+ -disabled)뿐이라 "바탕보다 한 단 올라온 면"을 뜻하는 토큰이 없다. 라이트에서는
299
+ neutral-50/100 이 흰 바탕 위에서 충분히 읽히지만, 다크에서는 그 단이 각각
300
+ #0A0A0A/#121212 로 거의 검정이라 툴바·헤더·페이지네이션이 배경에 묻힌다.
375
301
 
376
- :host-context([theme="dark"]) .expand-cell:hover {
377
- color: var(--u-blue-500, #6ba3e3);
378
- }
379
302
 
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
-
395
- :host-context([theme="dark"]) .detail-row td {
396
- background: var(--u-neutral-200, #1E1E1E);
397
- border-bottom-color: var(--u-border-color, #3D3D3D);
398
- }
303
+ ⚠:host-context Firefox/Safari 미지원이다. 그러나 위 base 마이그레이션으로
304
+ **색의 대부분이 이제 토큰 층에서 테마를 따르므로**, 그 브라우저에서도 다크가
305
+ 동작한다 — 종전에는 이 블록이 전부였기 때문에 다크가 아예 없었다. */
399
306
 
307
+ :host-context([theme="dark"]) .toolbar,
308
+ :host-context([theme="dark"]) thead th,
309
+ :host-context([theme="dark"]) .detail-row td,
400
310
  :host-context([theme="dark"]) .pagination {
401
311
  background: var(--u-neutral-200, #1E1E1E);
402
- border-top-color: var(--u-border-color, #3D3D3D);
403
- color: var(--u-txt-color-weak, #8A8A8A);
404
312
  }
405
313
 
406
314
  :host-context([theme="dark"]) .pagination button {
407
315
  background: var(--u-neutral-300, #2A2A2A);
408
- color: var(--u-txt-color, #D4D4D4);
409
- border-color: var(--u-border-color, #3D3D3D);
410
- }
411
-
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
- }
417
-
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
- }
423
-
424
- :host-context([theme="dark"]) .loading-overlay {
425
- color: var(--u-txt-color-weak, #8A8A8A);
426
- }
427
-
428
- :host-context([theme="dark"]) .empty-message {
429
- color: var(--u-txt-color-disabled, #525252);
430
316
  }
431
317
  `;
432
318
  //#endregion
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.0",
4
+ "version": "0.8.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.5.1",
61
+ "@iyulab/components": "^1.15.0",
62
62
  "lit": "^3.3.3"
63
63
  },
64
64
  "peerDependencies": {