@24vlh/vds 0.1.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.
Files changed (65) hide show
  1. package/LICENSE.txt +201 -0
  2. package/README.md +147 -0
  3. package/dist/components/accordion.css +170 -0
  4. package/dist/components/accordion.min.css +1 -0
  5. package/dist/components/authoring.css +332 -0
  6. package/dist/components/authoring.min.css +1 -0
  7. package/dist/components/buttons.css +683 -0
  8. package/dist/components/buttons.min.css +1 -0
  9. package/dist/components/charts.css +502 -0
  10. package/dist/components/charts.min.css +1 -0
  11. package/dist/components/command.css +521 -0
  12. package/dist/components/command.min.css +1 -0
  13. package/dist/components/content-blocks.css +944 -0
  14. package/dist/components/content-blocks.min.css +1 -0
  15. package/dist/components/doc-block.css +782 -0
  16. package/dist/components/doc-block.min.css +1 -0
  17. package/dist/components/feedback.css +657 -0
  18. package/dist/components/feedback.min.css +1 -0
  19. package/dist/components/flows.css +1101 -0
  20. package/dist/components/flows.min.css +1 -0
  21. package/dist/components/forms-advanced.css +462 -0
  22. package/dist/components/forms-advanced.min.css +1 -0
  23. package/dist/components/forms.css +1831 -0
  24. package/dist/components/forms.min.css +1 -0
  25. package/dist/components/header-footer.css +348 -0
  26. package/dist/components/header-footer.min.css +1 -0
  27. package/dist/components/hero.css +498 -0
  28. package/dist/components/hero.min.css +1 -0
  29. package/dist/components/icons.css +937 -0
  30. package/dist/components/icons.min.css +1 -0
  31. package/dist/components/navigation.css +900 -0
  32. package/dist/components/navigation.min.css +1 -0
  33. package/dist/components/overlays.css +498 -0
  34. package/dist/components/overlays.min.css +1 -0
  35. package/dist/components/sections.css +450 -0
  36. package/dist/components/sections.min.css +1 -0
  37. package/dist/components/skeleton.css +385 -0
  38. package/dist/components/skeleton.min.css +1 -0
  39. package/dist/components/tables.css +591 -0
  40. package/dist/components/tables.min.css +1 -0
  41. package/dist/components/tabs.css +307 -0
  42. package/dist/components/tabs.min.css +1 -0
  43. package/dist/components/toasts.css +421 -0
  44. package/dist/components/toasts.min.css +1 -0
  45. package/dist/components/tooltips-popovers.css +447 -0
  46. package/dist/components/tooltips-popovers.min.css +1 -0
  47. package/dist/components/typography.css +250 -0
  48. package/dist/components/typography.min.css +1 -0
  49. package/dist/components/utilities.css +3434 -0
  50. package/dist/components/utilities.min.css +1 -0
  51. package/dist/core.css +866 -0
  52. package/dist/core.min.css +1 -0
  53. package/dist/identity.css +266 -0
  54. package/dist/identity.min.css +1 -0
  55. package/dist/themes/carbon.css +658 -0
  56. package/dist/themes/carbon.min.css +1 -0
  57. package/dist/themes/graphite.css +658 -0
  58. package/dist/themes/graphite.min.css +1 -0
  59. package/dist/themes/navy.css +657 -0
  60. package/dist/themes/navy.min.css +1 -0
  61. package/dist/themes/slate.css +659 -0
  62. package/dist/themes/slate.min.css +1 -0
  63. package/dist/vds.css +20313 -0
  64. package/dist/vds.min.css +1 -0
  65. package/package.json +64 -0
@@ -0,0 +1,591 @@
1
+ /************************************************************
2
+ * VLAH DESIGN SYSTEM (VDS) - Tables System
3
+ *
4
+ * Responsibilities:
5
+ * - Provide full table architecture: wrappers, panels, headers, body,
6
+ * sticky headers/cols, row states, groups, expandable rows
7
+ * - Implement visual variants (bordered/minimal/striped/inset/clear)
8
+ * - Supply density modes (A/B/C/compact) + HF mode for high-frequency data
9
+ * - Define numerical, currency, percent, and trend helpers using
10
+ * tabular-nums, masks, and semantic lanes
11
+ * - Support empty/loading states, responsive collapse, and metric tables
12
+ *
13
+ * System Notes:
14
+ * - 100% token-driven: spacing, borders, radii, text-scales, numeric
15
+ * variants, semantic colours
16
+ * - Pure CSS; JS optional only for toggling expandable rows
17
+ * - Compatible with skeleton loaders, overlays, finance states, and
18
+ * dark/light themes
19
+ ************************************************************/
20
+
21
+ /* ---------------------------------------------------------
22
+ 1. TABLE TOKEN DEFINITIONS
23
+ --------------------------------------------------------- */
24
+
25
+ [data-vds-table],
26
+ .vds-table {
27
+ --table-currency-tint: color-mix(in srgb, currentColor 50%, transparent 30%);
28
+ }
29
+
30
+ /* ---------------------------------------------------------
31
+ 2. TABLE WRAPPERS & PANELS
32
+ --------------------------------------------------------- */
33
+
34
+ .table-wrapper {
35
+ width: 100%;
36
+ overflow-x: auto;
37
+ -webkit-overflow-scrolling: touch;
38
+ }
39
+
40
+ .table-panel {
41
+ background-color: var(--color-surface);
42
+ border-radius: var(--radius-md);
43
+ border: var(--border-width) solid var(--color-border-subtle);
44
+ box-shadow: var(--shadow-xs);
45
+ padding: var(--space-4);
46
+ }
47
+
48
+ .table-panel__header {
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: space-between;
52
+ gap: var(--space-3);
53
+ margin-bottom: var(--space-3);
54
+ }
55
+
56
+ .table-panel__title {
57
+ font-size: var(--text-sm);
58
+ font-weight: 600;
59
+ color: var(--color-text);
60
+ }
61
+
62
+ .table-panel__meta {
63
+ font-size: var(--text-xs);
64
+ color: var(--color-text-muted);
65
+ }
66
+
67
+ /* ---------------------------------------------------------
68
+ 3. BASE TABLE STRUCTURE
69
+ --------------------------------------------------------- */
70
+
71
+ .table {
72
+ width: 100%;
73
+ border-collapse: collapse;
74
+ border-spacing: 0;
75
+ background-color: var(--color-surface);
76
+ color: var(--color-text);
77
+
78
+ --table-cell-pad-y: var(--space-3);
79
+ --table-cell-pad-x: var(--space-4);
80
+ --table-cell-font-size: var(--text-sm);
81
+ }
82
+
83
+ .table th,
84
+ .table td {
85
+ padding: var(--table-cell-pad-y) var(--table-cell-pad-x);
86
+ border-bottom: var(--border-width) solid var(--color-border-subtle);
87
+ vertical-align: middle;
88
+ text-align: left;
89
+ font-size: var(--table-cell-font-size);
90
+ }
91
+
92
+ .table th {
93
+ font-weight: 600;
94
+ color: var(--color-text);
95
+ background-color: var(--color-surface-subtle);
96
+ border-bottom: var(--border-width-strong) solid var(--color-border-strong);
97
+ white-space: nowrap;
98
+ font-size: var(--text-sm);
99
+ }
100
+
101
+ .table caption {
102
+ caption-side: top;
103
+ text-align: left;
104
+ margin-bottom: var(--space-2);
105
+ font-size: var(--text-xs);
106
+ color: var(--color-text-muted);
107
+ }
108
+
109
+ /* ---------------------------------------------------------
110
+ 4. DENSITY (A/B/C) & COMPACT
111
+ --------------------------------------------------------- */
112
+
113
+ .table--a {
114
+ --table-cell-pad-y: var(--space-4);
115
+ --table-cell-pad-x: var(--space-5);
116
+ --table-cell-font-size: var(--text-md);
117
+ }
118
+
119
+ .table--b {
120
+ --table-cell-pad-y: var(--space-3);
121
+ --table-cell-pad-x: var(--space-4);
122
+ --table-cell-font-size: var(--text-sm);
123
+ }
124
+
125
+ .table--c {
126
+ --table-cell-pad-y: var(--space-2);
127
+ --table-cell-pad-x: var(--space-3);
128
+ --table-cell-font-size: var(--text-xs);
129
+ }
130
+
131
+ .table--compact {
132
+ --table-cell-pad-y: var(--space-1);
133
+ }
134
+
135
+ /* ---------------------------------------------------------
136
+ 5. VISUAL VARIANTS
137
+ --------------------------------------------------------- */
138
+
139
+ .table--bordered th,
140
+ .table--bordered td {
141
+ border: var(--border-width) solid var(--color-border-subtle);
142
+ }
143
+
144
+ .table--no-borders th,
145
+ .table--no-borders td {
146
+ border: none;
147
+ }
148
+
149
+ .table--striped tbody tr:nth-child(odd) {
150
+ background-color: var(--color-surface-subtle);
151
+ }
152
+
153
+ .table--hover tbody tr:hover {
154
+ background-color: var(--color-surface-soft);
155
+ }
156
+
157
+ .table--minimal th,
158
+ .table--minimal td {
159
+ background-color: transparent;
160
+ border-bottom-color: var(--color-border-subtle);
161
+ }
162
+
163
+ .table--clear th,
164
+ .table--clear td {
165
+ border: none;
166
+ background-color: transparent;
167
+ }
168
+
169
+ .table--inset {
170
+ border-radius: var(--radius-md);
171
+ overflow: hidden;
172
+ }
173
+
174
+ .table--truncate-cells th,
175
+ .table--truncate-cells td {
176
+ white-space: nowrap;
177
+ overflow: hidden;
178
+ text-overflow: ellipsis;
179
+ }
180
+
181
+ /* ---------------------------------------------------------
182
+ 6. STICKY HEADER / COL
183
+ --------------------------------------------------------- */
184
+
185
+ .table--sticky-header thead th {
186
+ position: sticky;
187
+ top: 0;
188
+ z-index: var(--z-sticky);
189
+ background-color: var(--color-bg-elevated, var(--color-surface));
190
+ box-shadow: 0 1px 0 var(--color-border-subtle);
191
+ }
192
+
193
+ .table--sticky-col td:first-child,
194
+ .table--sticky-col th:first-child {
195
+ position: sticky;
196
+ left: 0;
197
+ z-index: var(--z-sticky-col);
198
+ background-color: var(--color-bg-elevated, var(--color-surface));
199
+ }
200
+
201
+ /* ---------------------------------------------------------
202
+ 7. ROW STATES
203
+ --------------------------------------------------------- */
204
+
205
+ .table-row--selected {
206
+ background-color: var(--color-accent-soft);
207
+ }
208
+
209
+ .table-row--success {
210
+ background-color: var(--table-row-good-bg, var(--color-success-soft));
211
+ }
212
+
213
+ .table-row--danger {
214
+ background-color: var(--table-row-bad-bg, var(--color-danger-soft));
215
+ }
216
+
217
+ .table-row--warning {
218
+ background-color: var(--table-row-warning-bg, var(--color-warning-soft));
219
+ }
220
+
221
+ .table-row--info {
222
+ background-color: var(--table-row-info-bg, var(--color-info-soft));
223
+ }
224
+
225
+ .table-row--muted {
226
+ background-color: var(--table-row-muted-bg, var(--color-muted-bg));
227
+ color: var(--color-text-muted);
228
+ }
229
+
230
+ /* ---------------------------------------------------------
231
+ 8. INLINE ACTIONS
232
+ --------------------------------------------------------- */
233
+
234
+ .table-actions {
235
+ display: flex;
236
+ gap: var(--space-2);
237
+ align-items: center;
238
+ }
239
+
240
+ .table-actions .icon {
241
+ width: var(--icon-sm);
242
+ height: var(--icon-sm);
243
+ color: var(--color-icon-muted);
244
+ flex-shrink: 0;
245
+ cursor: pointer;
246
+ }
247
+
248
+ .table-actions .icon:hover {
249
+ color: var(--color-icon-strong);
250
+ }
251
+
252
+ /* ---------------------------------------------------------
253
+ 9. EXPANDABLE ROWS
254
+ --------------------------------------------------------- */
255
+
256
+ .table-row--expandable {
257
+ cursor: pointer;
258
+ }
259
+
260
+ .table-row--details {
261
+ display: none;
262
+ }
263
+
264
+ .table-row--expanded + .table-row--details,
265
+ .table-row--details[data-expanded="true"] {
266
+ display: table-row;
267
+ }
268
+
269
+ .table-row--details td {
270
+ padding: var(--space-4);
271
+ background-color: var(--color-surface-subtle);
272
+ }
273
+
274
+ /* ---------------------------------------------------------
275
+ 10. GROUP HEADERS
276
+ --------------------------------------------------------- */
277
+
278
+ .table-group-header th {
279
+ background-color: var(--color-surface-soft);
280
+ font-weight: 600;
281
+ padding-top: var(--space-3);
282
+ padding-bottom: var(--space-2);
283
+ border-top: var(--border-width-strong) solid var(--color-border-strong);
284
+ }
285
+
286
+ /* ---------------------------------------------------------
287
+ 11. METRIC TABLES
288
+ --------------------------------------------------------- */
289
+
290
+ .metric-table {
291
+ width: 100%;
292
+ border-collapse: collapse;
293
+ }
294
+
295
+ .metric-table tr:not(:last-child) td {
296
+ border-bottom: var(--border-width) solid var(--color-border-subtle);
297
+ }
298
+
299
+ .metric-table__label {
300
+ font-weight: 500;
301
+ color: var(--color-text-muted);
302
+ padding: var(--space-2) 0;
303
+ font-size: var(--text-xs);
304
+ }
305
+
306
+ .metric-table__value {
307
+ text-align: right;
308
+ font-weight: 600;
309
+ padding: var(--space-2) 0;
310
+ font-size: var(--text-sm);
311
+ font-feature-settings: "tnum";
312
+ font-variant-numeric: tabular-nums;
313
+ }
314
+
315
+ /* ---------------------------------------------------------
316
+ 12. EMPTY & LOADING STATES
317
+ --------------------------------------------------------- */
318
+
319
+ .table-empty {
320
+ text-align: center;
321
+ padding: var(--space-6) 0;
322
+ color: var(--color-text-muted);
323
+ }
324
+
325
+ .table-empty__content {
326
+ display: flex;
327
+ flex-direction: column;
328
+ align-items: center;
329
+ text-align: center;
330
+ }
331
+
332
+ .table-empty__icon {
333
+ display: flex;
334
+ align-items: center;
335
+ justify-content: center;
336
+ margin-bottom: 0.5rem;
337
+ margin-bottom: var(--space-2, 0.5rem);
338
+ }
339
+
340
+ .table-loading td {
341
+ position: relative;
342
+ color: transparent;
343
+ overflow: hidden;
344
+ }
345
+
346
+ .table-loading td::after {
347
+ content: "";
348
+ position: absolute;
349
+ top: 0;
350
+ right: 0;
351
+ bottom: 0;
352
+ left: 0;
353
+ transform: translateX(-150%);
354
+ background: linear-gradient(90deg, transparent, var(--color-muted-bg), transparent);
355
+ animation: table-loading 1.6s infinite;
356
+ }
357
+
358
+ @keyframes table-loading {
359
+ 0% {
360
+ transform: translateX(-150%);
361
+ }
362
+ 100% {
363
+ transform: translateX(150%);
364
+ }
365
+ }
366
+
367
+ /* ---------------------------------------------------------
368
+ 13. RESPONSIVE COLLAPSE
369
+ --------------------------------------------------------- */
370
+
371
+ @media (max-width: 640px) {
372
+ .table--collapse thead {
373
+ display: none;
374
+ }
375
+
376
+ .table--collapse tbody tr {
377
+ display: block;
378
+ border: var(--border-width) solid var(--color-border-subtle);
379
+ margin-bottom: var(--space-4);
380
+ border-radius: var(--radius-md);
381
+ background-color: var(--color-surface);
382
+ overflow: hidden;
383
+ }
384
+
385
+ .table--collapse tbody td {
386
+ display: flex;
387
+ justify-content: space-between;
388
+ padding: var(--space-3);
389
+ border-bottom: var(--border-width) solid var(--color-border-subtle);
390
+ font-size: var(--text-sm);
391
+ }
392
+
393
+ .table--collapse tbody td:last-child {
394
+ border-bottom: none;
395
+ }
396
+
397
+ .table--collapse tbody td::before {
398
+ content: attr(data-label);
399
+ font-weight: 600;
400
+ color: var(--color-text-muted);
401
+ margin-right: var(--space-2);
402
+ font-size: var(--text-xs);
403
+ }
404
+ }
405
+
406
+ /* ---------------------------------------------------------
407
+ 14. HIGH FREQUENCY TABLE (HF)
408
+ --------------------------------------------------------- */
409
+
410
+ .table--hf {
411
+ font-size: var(--text-xs);
412
+ }
413
+
414
+ .table--hf th,
415
+ .table--hf td {
416
+ padding: var(--space-1) var(--space-2);
417
+ border: var(--border-width) solid var(--color-border-subtle);
418
+ }
419
+
420
+ .table--hf thead th {
421
+ background-color: var(--color-surface-subtle);
422
+ position: sticky;
423
+ top: 0;
424
+ z-index: var(--z-sticky);
425
+ border-bottom: var(--border-width-strong) solid var(--color-border-strong);
426
+ }
427
+
428
+ .table--hf td[data-type="num"] {
429
+ text-align: right;
430
+ font-feature-settings: "tnum";
431
+ font-variant-numeric: tabular-nums;
432
+ }
433
+
434
+ /* ---------------------------------------------------------
435
+ 15. NUMERIC / CURRENCY / PERCENT HELPERS (SPAN-BASED)
436
+ --------------------------------------------------------- */
437
+
438
+ .t-num,
439
+ .t-pct {
440
+ text-align: right;
441
+ font-feature-settings: "tnum";
442
+ font-variant-numeric: tabular-nums;
443
+ white-space: nowrap;
444
+ }
445
+
446
+ .t-cur {
447
+ display: flex;
448
+ justify-content: space-between;
449
+ align-items: baseline;
450
+ font-feature-settings: "tnum";
451
+ font-variant-numeric: tabular-nums;
452
+ white-space: nowrap;
453
+ }
454
+
455
+ .cur-eur::before {
456
+ content: "€";
457
+ }
458
+
459
+ .cur-usd::before {
460
+ content: "$";
461
+ }
462
+
463
+ .cur-gbp::before {
464
+ content: "£";
465
+ }
466
+
467
+ .cur-ron::before {
468
+ content: "RON";
469
+ }
470
+
471
+ .cur-chf::before {
472
+ content: "CHF";
473
+ }
474
+
475
+ .cur-jpy::before {
476
+ content: "¥";
477
+ }
478
+
479
+ .cur-eur::before,
480
+ .cur-usd::before,
481
+ .cur-gbp::before,
482
+ .cur-ron::before,
483
+ .cur-chf::before,
484
+ .cur-jpy::before {
485
+ margin-right: var(--space-1);
486
+ font-size: var(--text-xxxs);
487
+ font-weight: 600;
488
+ color: var(--table-currency-tint);
489
+ }
490
+
491
+ .t-pct {
492
+ color: inherit;
493
+ }
494
+
495
+ /* ---------------------------------------------------------
496
+ 16. TREND HELPERS (SPAN-BASED)
497
+ --------------------------------------------------------- */
498
+
499
+ .t-trend {
500
+ display: flex;
501
+ justify-content: space-between;
502
+ align-items: center;
503
+ font-feature-settings: "tnum";
504
+ font-variant-numeric: tabular-nums;
505
+ white-space: nowrap;
506
+ text-align: right;
507
+ width: 100%;
508
+ }
509
+
510
+ .t-up,
511
+ .t-down,
512
+ .t-flat {
513
+ display: inline-flex;
514
+ align-items: center;
515
+ }
516
+
517
+ .t-up {
518
+ color: var(--table-trend-up, var(--color-success-strong));
519
+ }
520
+
521
+ .t-down {
522
+ color: var(--table-trend-down, var(--color-danger-strong));
523
+ }
524
+
525
+ .t-flat {
526
+ color: var(--table-trend-flat, var(--color-text-muted));
527
+ }
528
+
529
+ .t-up::before,
530
+ .t-down::before,
531
+ .t-flat::before {
532
+ content: "";
533
+ width: var(--icon-xs);
534
+ height: var(--icon-xs);
535
+ -webkit-mask-size: contain;
536
+ mask-size: contain;
537
+ -webkit-mask-repeat: no-repeat;
538
+ mask-repeat: no-repeat;
539
+ background-color: currentColor;
540
+ margin-right: var(--space-1);
541
+ }
542
+
543
+ .t-up::before {
544
+ -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'><path d='M9 15 H7 V8 H5 L8 1 L11 8 H9 Z'/></svg>");
545
+ mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'><path d='M9 15 H7 V8 H5 L8 1 L11 8 H9 Z'/></svg>");
546
+ }
547
+
548
+ .t-down::before {
549
+ -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'><path d='M7 1 H9 V8 H11 L8 15 L5 8 H7 Z'/></svg>");
550
+ mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor'><path d='M7 1 H9 V8 H11 L8 15 L5 8 H7 Z'/></svg>");
551
+ }
552
+
553
+ .t-flat::before {
554
+ -webkit-mask-image: url("data:image/svg+xml,<svg stroke='currentColor' fill='none' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'><line x1='3' y1='8' x2='13' y2='8' stroke-width='2'/></svg>");
555
+ mask-image: url("data:image/svg+xml,<svg stroke='currentColor' fill='none' viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'><line x1='3' y1='8' x2='13' y2='8' stroke-width='2'/></svg>");
556
+ }
557
+
558
+ /* ---------------------------------------------------------
559
+ 17. FINANCE ROW STATES (NAMESPACED)
560
+ --------------------------------------------------------- */
561
+
562
+ .table-fin--good {
563
+ background-color: var(--table-row-good-bg, var(--color-success-soft));
564
+ }
565
+
566
+ .table-fin--bad {
567
+ background-color: var(--table-row-bad-bg, var(--color-danger-soft));
568
+ }
569
+
570
+ .table-fin--warning {
571
+ background-color: var(--table-row-warning-bg, var(--color-warning-soft));
572
+ }
573
+
574
+ .table-fin--info {
575
+ background-color: var(--table-row-info-bg, var(--color-info-soft));
576
+ }
577
+
578
+ .table-fin--muted {
579
+ background-color: var(--table-row-muted-bg, var(--color-muted-bg));
580
+ color: var(--color-text-muted);
581
+ }
582
+
583
+ .table-fin--flagged {
584
+ background-color: var(--table-row-flagged-bg, var(--color-danger-soft));
585
+ border-left: var(--border-width-strong) solid var(--color-danger);
586
+ }
587
+
588
+ .table-fin--curious {
589
+ background-color: var(--table-row-curious-bg, var(--color-surface-subtle));
590
+ border-left: var(--border-width-strong) solid var(--color-accent);
591
+ }
@@ -0,0 +1 @@
1
+ .vds-table,[data-vds-table]{--table-currency-tint:color-mix(in srgb,currentColor 50%,transparent 30%)}.table-wrapper{-webkit-overflow-scrolling:touch;overflow-x:auto;width:100%}.table-panel{background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-xs);padding:var(--space-4)}.table-panel__header{align-items:center;display:flex;gap:var(--space-3);justify-content:space-between;margin-bottom:var(--space-3)}.table-panel__title{color:var(--color-text);font-size:var(--text-sm);font-weight:600}.table-panel__meta{color:var(--color-text-muted);font-size:var(--text-xs)}.table{--table-cell-pad-y:var(--space-3);--table-cell-pad-x:var(--space-4);--table-cell-font-size:var(--text-sm);background-color:var(--color-surface);border-collapse:collapse;border-spacing:0;color:var(--color-text);width:100%}.table td,.table th{border-bottom:var(--border-width) solid var(--color-border-subtle);font-size:var(--table-cell-font-size);padding:var(--table-cell-pad-y) var(--table-cell-pad-x);text-align:left;vertical-align:middle}.table th{background-color:var(--color-surface-subtle);border-bottom:var(--border-width-strong) solid var(--color-border-strong);color:var(--color-text);font-size:var(--text-sm);font-weight:600;white-space:nowrap}.table caption{caption-side:top;color:var(--color-text-muted);font-size:var(--text-xs);margin-bottom:var(--space-2);text-align:left}.table--a{--table-cell-pad-y:var(--space-4);--table-cell-pad-x:var(--space-5);--table-cell-font-size:var(--text-md)}.table--b{--table-cell-pad-y:var(--space-3);--table-cell-pad-x:var(--space-4);--table-cell-font-size:var(--text-sm)}.table--c{--table-cell-pad-y:var(--space-2);--table-cell-pad-x:var(--space-3);--table-cell-font-size:var(--text-xs)}.table--compact{--table-cell-pad-y:var(--space-1)}.table--bordered td,.table--bordered th{border:var(--border-width) solid var(--color-border-subtle)}.table--no-borders td,.table--no-borders th{border:none}.table--striped tbody tr:nth-child(odd){background-color:var(--color-surface-subtle)}.table--hover tbody tr:hover{background-color:var(--color-surface-soft)}.table--minimal td,.table--minimal th{background-color:transparent;border-bottom-color:var(--color-border-subtle)}.table--clear td,.table--clear th{background-color:transparent;border:none}.table--inset{border-radius:var(--radius-md);overflow:hidden}.table--truncate-cells td,.table--truncate-cells th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.table--sticky-header thead th{background-color:var(--color-bg-elevated,var(--color-surface));box-shadow:0 1px 0 var(--color-border-subtle);position:sticky;top:0;z-index:var(--z-sticky)}.table--sticky-col td:first-child,.table--sticky-col th:first-child{background-color:var(--color-bg-elevated,var(--color-surface));left:0;position:sticky;z-index:var(--z-sticky-col)}.table-row--selected{background-color:var(--color-accent-soft)}.table-row--success{background-color:var(--table-row-good-bg,var(--color-success-soft))}.table-row--danger{background-color:var(--table-row-bad-bg,var(--color-danger-soft))}.table-row--warning{background-color:var(--table-row-warning-bg,var(--color-warning-soft))}.table-row--info{background-color:var(--table-row-info-bg,var(--color-info-soft))}.table-row--muted{background-color:var(--table-row-muted-bg,var(--color-muted-bg));color:var(--color-text-muted)}.table-actions{align-items:center;display:flex;gap:var(--space-2)}.table-actions .icon{color:var(--color-icon-muted);cursor:pointer;flex-shrink:0;height:var(--icon-sm);width:var(--icon-sm)}.table-actions .icon:hover{color:var(--color-icon-strong)}.table-row--expandable{cursor:pointer}.table-row--details{display:none}.table-row--details[data-expanded=true],.table-row--expanded+.table-row--details{display:table-row}.table-row--details td{background-color:var(--color-surface-subtle);padding:var(--space-4)}.table-group-header th{background-color:var(--color-surface-soft);border-top:var(--border-width-strong) solid var(--color-border-strong);font-weight:600;padding-bottom:var(--space-2);padding-top:var(--space-3)}.metric-table{border-collapse:collapse;width:100%}.metric-table tr:not(:last-child) td{border-bottom:var(--border-width) solid var(--color-border-subtle)}.metric-table__label{color:var(--color-text-muted);font-size:var(--text-xs);font-weight:500;padding:var(--space-2) 0}.metric-table__value{font-feature-settings:"tnum";font-size:var(--text-sm);font-variant-numeric:tabular-nums;font-weight:600;padding:var(--space-2) 0;text-align:right}.table-empty{color:var(--color-text-muted);padding:var(--space-6) 0;text-align:center}.table-empty__content{align-items:center;display:flex;flex-direction:column;text-align:center}.table-empty__icon{align-items:center;display:flex;justify-content:center;margin-bottom:.5rem;margin-bottom:var(--space-2,.5rem)}.table-loading td{color:transparent;overflow:hidden;position:relative}.table-loading td:after{animation:table-loading 1.6s infinite;background:linear-gradient(90deg,transparent,var(--color-muted-bg),transparent);bottom:0;content:"";left:0;position:absolute;right:0;top:0;transform:translateX(-150%)}@keyframes table-loading{0%{transform:translateX(-150%)}to{transform:translateX(150%)}}@media (max-width:640px){.table--collapse thead{display:none}.table--collapse tbody tr{background-color:var(--color-surface);border:var(--border-width) solid var(--color-border-subtle);border-radius:var(--radius-md);display:block;margin-bottom:var(--space-4);overflow:hidden}.table--collapse tbody td{border-bottom:var(--border-width) solid var(--color-border-subtle);display:flex;font-size:var(--text-sm);justify-content:space-between;padding:var(--space-3)}.table--collapse tbody td:last-child{border-bottom:none}.table--collapse tbody td:before{color:var(--color-text-muted);content:attr(data-label);font-size:var(--text-xs);font-weight:600;margin-right:var(--space-2)}}.table--hf{font-size:var(--text-xs)}.table--hf td,.table--hf th{border:var(--border-width) solid var(--color-border-subtle);padding:var(--space-1) var(--space-2)}.table--hf thead th{background-color:var(--color-surface-subtle);border-bottom:var(--border-width-strong) solid var(--color-border-strong);position:sticky;top:0;z-index:var(--z-sticky)}.t-num,.t-pct,.table--hf td[data-type=num]{font-feature-settings:"tnum";font-variant-numeric:tabular-nums;text-align:right}.t-cur,.t-num,.t-pct{white-space:nowrap}.t-cur{font-feature-settings:"tnum";align-items:baseline;display:flex;font-variant-numeric:tabular-nums;justify-content:space-between}.cur-eur:before{content:"€"}.cur-usd:before{content:"$"}.cur-gbp:before{content:"£"}.cur-ron:before{content:"RON"}.cur-chf:before{content:"CHF"}.cur-jpy:before{content:"¥"}.cur-chf:before,.cur-eur:before,.cur-gbp:before,.cur-jpy:before,.cur-ron:before,.cur-usd:before{color:var(--table-currency-tint);font-size:var(--text-xxxs);font-weight:600;margin-right:var(--space-1)}.t-pct{color:inherit}.t-trend{font-feature-settings:"tnum";align-items:center;display:flex;font-variant-numeric:tabular-nums;justify-content:space-between;text-align:right;white-space:nowrap;width:100%}.t-down,.t-flat,.t-up{align-items:center;display:inline-flex}.t-up{color:var(--table-trend-up,var(--color-success-strong))}.t-down{color:var(--table-trend-down,var(--color-danger-strong))}.t-flat{color:var(--table-trend-flat,var(--color-text-muted))}.t-down:before,.t-flat:before,.t-up:before{background-color:currentColor;content:"";height:var(--icon-xs);margin-right:var(--space-1);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:var(--icon-xs)}.t-up:before{-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor"><path d="M9 15H7V8H5l3-7 3 7H9Z"/></svg>');mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor"><path d="M9 15H7V8H5l3-7 3 7H9Z"/></svg>')}.t-down:before{-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor"><path d="M7 1h2v7h2l-3 7-3-7h2Z"/></svg>');mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor"><path d="M7 1h2v7h2l-3 7-3-7h2Z"/></svg>')}.t-flat:before{-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,<svg stroke="currentColor" fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path stroke-width="2" d="M3 8h10"/></svg>');mask-image:url('data:image/svg+xml;charset=utf-8,<svg stroke="currentColor" fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path stroke-width="2" d="M3 8h10"/></svg>')}.table-fin--good{background-color:var(--table-row-good-bg,var(--color-success-soft))}.table-fin--bad{background-color:var(--table-row-bad-bg,var(--color-danger-soft))}.table-fin--warning{background-color:var(--table-row-warning-bg,var(--color-warning-soft))}.table-fin--info{background-color:var(--table-row-info-bg,var(--color-info-soft))}.table-fin--muted{background-color:var(--table-row-muted-bg,var(--color-muted-bg));color:var(--color-text-muted)}.table-fin--flagged{background-color:var(--table-row-flagged-bg,var(--color-danger-soft));border-left:var(--border-width-strong) solid var(--color-danger)}.table-fin--curious{background-color:var(--table-row-curious-bg,var(--color-surface-subtle));border-left:var(--border-width-strong) solid var(--color-accent)}