@opendata-ai/openchart-core 6.4.1 → 6.5.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.
@@ -1,764 +0,0 @@
1
- /**
2
- * @opendata-ai/core styles
3
- *
4
- * Plain CSS with viz- prefix for all class names.
5
- * CSS custom properties for theme overrides.
6
- * Dark mode via .viz-dark class on the container.
7
- */
8
-
9
- /* For optimal typography, load Inter: https://fonts.google.com/specimen/Inter */
10
-
11
- /* ---------------------------------------------------------------------------
12
- * Custom properties (light mode defaults)
13
- * --------------------------------------------------------------------------- */
14
-
15
- .viz-root,
16
- .viz-chart-root,
17
- .viz-table-wrapper,
18
- .viz-table-root,
19
- .viz-graph-wrapper,
20
- .viz-graph-root {
21
- --viz-font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
22
- --viz-font-mono: "JetBrains Mono", "Fira Code", "Cascadia Code", monospace;
23
- --viz-title-size: 22px;
24
- --viz-title-weight: 700;
25
- --viz-title-tracking: -0.02em;
26
- --viz-subtitle-size: 14px;
27
- --viz-subtitle-weight: 400;
28
- --viz-source-size: 12px;
29
- --viz-source-weight: 400;
30
- --viz-body-size: 13px;
31
- --viz-bg: #ffffff;
32
- --viz-text: #1d1d1d;
33
- --viz-text-secondary: #5c5c5c;
34
- --viz-text-muted: #999999;
35
- --viz-gridline: #e8e8e8;
36
- --viz-axis: #888888;
37
- --viz-border: #e2e2e2;
38
- --viz-border-radius: 4px;
39
- --viz-focus: #3b82f6;
40
- --viz-hover-bg: rgba(0, 0, 0, 0.025);
41
- --viz-tooltip-bg: rgba(255, 255, 255, 0.88);
42
- --viz-tooltip-border: rgba(0, 0, 0, 0.08);
43
- --viz-tooltip-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 0 1px rgba(0, 0, 0, 0.12);
44
- --viz-tooltip-text: #1d1d1d;
45
- --viz-legend-text: #555555;
46
- }
47
-
48
- /* ---------------------------------------------------------------------------
49
- * Dark mode overrides
50
- * --------------------------------------------------------------------------- */
51
-
52
- .viz-dark {
53
- --viz-bg: #1a1a2e;
54
- --viz-text: #e0e0e0;
55
- --viz-text-secondary: #b0b0b0;
56
- --viz-text-muted: #808080;
57
- --viz-gridline: #333355;
58
- --viz-axis: #999999;
59
- --viz-border: #444466;
60
- --viz-focus: #60a5fa;
61
- --viz-hover-bg: rgba(255, 255, 255, 0.05);
62
- --viz-tooltip-bg: rgba(30, 30, 50, 0.85);
63
- --viz-tooltip-border: rgba(255, 255, 255, 0.08);
64
- --viz-tooltip-shadow: 0 2px 8px rgba(0, 0, 0, 0.3), 0 0 1px rgba(0, 0, 0, 0.4);
65
- --viz-tooltip-text: #e0e0e0;
66
- --viz-legend-text: #b0b0b0;
67
- }
68
-
69
- /* ---------------------------------------------------------------------------
70
- * Chrome (title, subtitle, source, footer)
71
- * --------------------------------------------------------------------------- */
72
-
73
- .viz-chrome {
74
- font-family: var(--viz-font-family);
75
- }
76
-
77
- .viz-title {
78
- font-size: var(--viz-title-size);
79
- font-weight: var(--viz-title-weight);
80
- letter-spacing: var(--viz-title-tracking);
81
- fill: var(--viz-text);
82
- }
83
-
84
- .viz-subtitle {
85
- font-size: var(--viz-subtitle-size);
86
- font-weight: var(--viz-subtitle-weight);
87
- fill: var(--viz-text-secondary);
88
- }
89
-
90
- .viz-source,
91
- .viz-byline,
92
- .viz-footer {
93
- font-size: var(--viz-source-size);
94
- font-weight: var(--viz-source-weight);
95
- fill: var(--viz-text-muted);
96
- }
97
-
98
- /* ---------------------------------------------------------------------------
99
- * Table footer chrome
100
- * --------------------------------------------------------------------------- */
101
-
102
- .viz-chrome-footer {
103
- padding-top: 16px;
104
- }
105
-
106
- /* ---------------------------------------------------------------------------
107
- * Tooltip
108
- * --------------------------------------------------------------------------- */
109
-
110
- .viz-tooltip {
111
- position: absolute;
112
- display: none;
113
- pointer-events: none;
114
- z-index: 1000;
115
- background: var(--viz-tooltip-bg);
116
- backdrop-filter: blur(12px);
117
- border: 1px solid var(--viz-tooltip-border);
118
- border-radius: 8px;
119
- box-shadow: var(--viz-tooltip-shadow);
120
- color: var(--viz-tooltip-text);
121
- font-family: var(--viz-font-family);
122
- font-size: 12px;
123
- padding: 0;
124
- max-width: 260px;
125
- min-width: 140px;
126
- line-height: 1.4;
127
- animation: viz-tooltip-in 120ms ease-out;
128
- }
129
-
130
- @keyframes viz-tooltip-in {
131
- from {
132
- opacity: 0;
133
- transform: translateY(2px);
134
- }
135
- to {
136
- opacity: 1;
137
- transform: translateY(0);
138
- }
139
- }
140
-
141
- .viz-tooltip-header {
142
- display: flex;
143
- align-items: center;
144
- gap: 6px;
145
- padding: 8px 12px 6px;
146
- }
147
-
148
- .viz-tooltip-dot {
149
- width: 8px;
150
- height: 8px;
151
- border-radius: 50%;
152
- flex-shrink: 0;
153
- }
154
-
155
- .viz-tooltip-title {
156
- font-weight: 600;
157
- font-size: 12px;
158
- letter-spacing: -0.01em;
159
- color: var(--viz-tooltip-text);
160
- white-space: nowrap;
161
- overflow: hidden;
162
- text-overflow: ellipsis;
163
- }
164
-
165
- .viz-tooltip-body {
166
- padding: 4px 12px 8px;
167
- border-top: 1px solid var(--viz-tooltip-border);
168
- }
169
-
170
- /* Only add separator when header is present */
171
- .viz-tooltip-header + .viz-tooltip-body {
172
- padding-top: 6px;
173
- }
174
-
175
- /* No separator when body is the only child */
176
- .viz-tooltip-body:first-child {
177
- border-top: none;
178
- padding-top: 8px;
179
- }
180
-
181
- .viz-tooltip-row {
182
- display: flex;
183
- align-items: baseline;
184
- justify-content: space-between;
185
- gap: 12px;
186
- padding: 1px 0;
187
- }
188
-
189
- .viz-tooltip-label {
190
- color: var(--viz-text-muted);
191
- font-size: 11px;
192
- white-space: nowrap;
193
- flex-shrink: 0;
194
- }
195
-
196
- .viz-tooltip-value {
197
- font-weight: 500;
198
- font-size: 11px;
199
- font-variant-numeric: tabular-nums;
200
- text-align: right;
201
- overflow: hidden;
202
- text-overflow: ellipsis;
203
- white-space: nowrap;
204
- }
205
-
206
- /* ---------------------------------------------------------------------------
207
- * Legend
208
- * --------------------------------------------------------------------------- */
209
-
210
- .viz-legend {
211
- font-family: var(--viz-font-family);
212
- font-size: var(--viz-body-size);
213
- }
214
-
215
- .viz-legend-entry {
216
- cursor: default;
217
- }
218
-
219
- .viz-legend text {
220
- fill: var(--viz-legend-text);
221
- }
222
-
223
- /* ---------------------------------------------------------------------------
224
- * React wrapper roots
225
- * --------------------------------------------------------------------------- */
226
-
227
- .viz-chart-root {
228
- width: 100%;
229
- }
230
-
231
- .viz-table-root,
232
- .viz-graph-root {
233
- width: 100%;
234
- height: 100%;
235
- }
236
-
237
- .viz-table-root {
238
- overflow: auto;
239
- }
240
-
241
- /* ---------------------------------------------------------------------------
242
- * Chart container
243
- * --------------------------------------------------------------------------- */
244
-
245
- .viz-chart {
246
- font-family: var(--viz-font-family);
247
- display: block;
248
- width: 100%;
249
- }
250
-
251
- /* ---------------------------------------------------------------------------
252
- * Screen reader only utility
253
- * --------------------------------------------------------------------------- */
254
-
255
- .viz-sr-only {
256
- position: absolute;
257
- width: 1px;
258
- height: 1px;
259
- padding: 0;
260
- margin: -1px;
261
- overflow: hidden;
262
- clip-path: inset(50%);
263
- white-space: nowrap;
264
- border-width: 0;
265
- }
266
-
267
- /* ---------------------------------------------------------------------------
268
- * Table base
269
- * --------------------------------------------------------------------------- */
270
-
271
- .viz-table-wrapper {
272
- font-family: var(--viz-font-family);
273
- color: var(--viz-text);
274
- background: var(--viz-bg);
275
- }
276
-
277
- .viz-table-wrapper > .viz-chrome {
278
- margin-bottom: 16px;
279
- }
280
-
281
- .viz-table-title {
282
- margin-bottom: 4px;
283
- font-size: var(--viz-title-computed-size, var(--viz-title-size));
284
- font-weight: var(--viz-title-computed-weight, var(--viz-title-weight));
285
- color: var(--viz-title-computed-color, var(--viz-text));
286
- }
287
-
288
- .viz-table-subtitle {
289
- margin-bottom: 8px;
290
- font-size: var(--viz-subtitle-computed-size, var(--viz-subtitle-size));
291
- font-weight: var(--viz-subtitle-computed-weight, var(--viz-subtitle-weight));
292
- color: var(--viz-subtitle-computed-color, var(--viz-text-secondary));
293
- }
294
-
295
- .viz-table-source {
296
- font-size: var(--viz-source-computed-size, var(--viz-source-size));
297
- color: var(--viz-source-computed-color, var(--viz-text-muted));
298
- }
299
-
300
- .viz-table-footer-text {
301
- font-size: var(--viz-footer-computed-size, var(--viz-source-size));
302
- color: var(--viz-footer-computed-color, var(--viz-text-muted));
303
- }
304
-
305
- .viz-table-scroll {
306
- overflow-x: auto;
307
- }
308
-
309
- .viz-table-wrapper table {
310
- width: 100%;
311
- border-collapse: collapse;
312
- }
313
-
314
- .viz-table-wrapper th,
315
- .viz-table-wrapper td {
316
- padding: 10px 16px;
317
- text-align: left;
318
- border-bottom: 1px solid var(--viz-border);
319
- }
320
-
321
- .viz-table-wrapper th {
322
- font-weight: 600;
323
- font-size: 12px;
324
- text-transform: uppercase;
325
- letter-spacing: 0.05em;
326
- color: var(--viz-text-secondary);
327
- white-space: nowrap;
328
- }
329
-
330
- .viz-table-wrapper thead {
331
- position: sticky;
332
- top: 0;
333
- z-index: 2;
334
- background: var(--viz-bg);
335
- }
336
-
337
- .viz-table-wrapper thead th {
338
- border-bottom-width: 2px;
339
- }
340
-
341
- .viz-table-wrapper td {
342
- font-size: 14px;
343
- font-variant-numeric: tabular-nums;
344
- }
345
-
346
- /* ---------------------------------------------------------------------------
347
- * Sticky first column
348
- * --------------------------------------------------------------------------- */
349
-
350
- .viz-table--sticky th:first-child,
351
- .viz-table--sticky td:first-child {
352
- position: sticky;
353
- left: 0;
354
- z-index: 1;
355
- background: var(--viz-bg);
356
- }
357
-
358
- /* ---------------------------------------------------------------------------
359
- * Sort controls
360
- * --------------------------------------------------------------------------- */
361
-
362
- .viz-table-sort-btn {
363
- background: none;
364
- border: none;
365
- cursor: pointer;
366
- padding: 2px;
367
- margin-left: 6px;
368
- display: inline-flex;
369
- flex-direction: column;
370
- align-items: center;
371
- vertical-align: middle;
372
- gap: 2px;
373
- }
374
-
375
- .viz-table-sort-btn::before,
376
- .viz-table-sort-btn::after {
377
- content: "";
378
- display: block;
379
- width: 0;
380
- height: 0;
381
- border-left: 5px solid transparent;
382
- border-right: 5px solid transparent;
383
- transition:
384
- opacity 0.15s,
385
- border-color 0.15s;
386
- }
387
-
388
- .viz-table-sort-btn::before {
389
- border-bottom: 4.5px solid var(--viz-text-secondary);
390
- opacity: 0.45;
391
- }
392
-
393
- .viz-table-sort-btn::after {
394
- border-top: 4.5px solid var(--viz-text-secondary);
395
- opacity: 0.45;
396
- }
397
-
398
- .viz-table-sort-btn:hover::before,
399
- .viz-table-sort-btn:hover::after {
400
- opacity: 0.75;
401
- }
402
-
403
- th[aria-sort="ascending"] .viz-table-sort-btn::before {
404
- opacity: 1;
405
- border-bottom-color: var(--viz-text);
406
- }
407
-
408
- th[aria-sort="ascending"] .viz-table-sort-btn::after {
409
- opacity: 0.15;
410
- }
411
-
412
- th[aria-sort="descending"] .viz-table-sort-btn::after {
413
- opacity: 1;
414
- border-top-color: var(--viz-text);
415
- }
416
-
417
- th[aria-sort="descending"] .viz-table-sort-btn::before {
418
- opacity: 0.15;
419
- }
420
-
421
- /* ---------------------------------------------------------------------------
422
- * Search
423
- * --------------------------------------------------------------------------- */
424
-
425
- .viz-table-search {
426
- padding: 8px 0;
427
- }
428
-
429
- .viz-table-search input {
430
- width: 100%;
431
- padding: 8px 12px;
432
- border: 1px solid var(--viz-border);
433
- border-radius: 6px;
434
- font-size: 13px;
435
- font-family: inherit;
436
- background: var(--viz-bg);
437
- color: var(--viz-text);
438
- box-sizing: border-box;
439
- transition: border-color 0.15s;
440
- }
441
-
442
- .viz-table-search input::placeholder {
443
- color: var(--viz-text-muted);
444
- font-size: 13px;
445
- }
446
-
447
- .viz-table-search input:focus {
448
- outline: none;
449
- border-color: var(--viz-focus);
450
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
451
- }
452
-
453
- /* ---------------------------------------------------------------------------
454
- * Pagination
455
- * --------------------------------------------------------------------------- */
456
-
457
- .viz-table-pagination {
458
- display: flex;
459
- align-items: center;
460
- justify-content: space-between;
461
- padding: 12px 0 4px;
462
- font-size: 13px;
463
- color: var(--viz-text-secondary);
464
- }
465
-
466
- .viz-table-pagination-info {
467
- font-variant-numeric: tabular-nums;
468
- }
469
-
470
- .viz-table-pagination-btns {
471
- display: flex;
472
- gap: 8px;
473
- }
474
-
475
- .viz-table-pagination button {
476
- padding: 6px 14px;
477
- border: 1px solid var(--viz-border);
478
- border-radius: 6px;
479
- background: var(--viz-bg);
480
- color: var(--viz-text);
481
- cursor: pointer;
482
- font-size: 13px;
483
- font-family: inherit;
484
- transition:
485
- background 0.15s,
486
- border-color 0.15s;
487
- }
488
-
489
- .viz-table-pagination button:disabled {
490
- opacity: 0.35;
491
- cursor: not-allowed;
492
- }
493
-
494
- .viz-table-pagination button:hover:not(:disabled) {
495
- background: var(--viz-hover-bg);
496
- border-color: var(--viz-axis);
497
- }
498
-
499
- .viz-table-pagination button:focus-visible {
500
- outline: 2px solid var(--viz-focus);
501
- outline-offset: 1px;
502
- }
503
-
504
- /* ---------------------------------------------------------------------------
505
- * Bar cells
506
- * --------------------------------------------------------------------------- */
507
-
508
- .viz-table-bar {
509
- position: relative;
510
- }
511
-
512
- .viz-table-bar-fill {
513
- position: absolute;
514
- top: 6px;
515
- left: 0;
516
- bottom: 6px;
517
- border-radius: 2px;
518
- opacity: 0.15;
519
- pointer-events: none;
520
- }
521
-
522
- .viz-table-bar-value {
523
- position: relative;
524
- z-index: 1;
525
- }
526
-
527
- /* ---------------------------------------------------------------------------
528
- * Sparkline cells
529
- * --------------------------------------------------------------------------- */
530
-
531
- .viz-table-sparkline {
532
- display: block;
533
- width: 100%;
534
- position: relative;
535
- }
536
-
537
- .viz-table-sparkline svg {
538
- display: block;
539
- width: 100%;
540
- overflow: visible;
541
- }
542
-
543
- .viz-table-sparkline-dot {
544
- position: absolute;
545
- border-radius: 50%;
546
- width: 5px;
547
- height: 5px;
548
- }
549
-
550
- .viz-table-sparkline-labels {
551
- display: flex;
552
- justify-content: space-between;
553
- font-size: 11px;
554
- line-height: 1;
555
- }
556
-
557
- /* ---------------------------------------------------------------------------
558
- * Image cells
559
- * --------------------------------------------------------------------------- */
560
-
561
- .viz-table-image {
562
- display: inline-block;
563
- vertical-align: middle;
564
- }
565
-
566
- .viz-table-image img {
567
- object-fit: cover;
568
- }
569
-
570
- .viz-table-image-rounded img {
571
- border-radius: 50%;
572
- }
573
-
574
- /* ---------------------------------------------------------------------------
575
- * Flag cells
576
- * --------------------------------------------------------------------------- */
577
-
578
- .viz-table-flag {
579
- font-size: 1.2em;
580
- }
581
-
582
- /* ---------------------------------------------------------------------------
583
- * Compact mode
584
- * --------------------------------------------------------------------------- */
585
-
586
- .viz-table--compact th,
587
- .viz-table--compact td {
588
- padding: 4px 8px;
589
- font-size: 13px;
590
- }
591
-
592
- .viz-table--compact th {
593
- font-size: 11px;
594
- }
595
-
596
- /* ---------------------------------------------------------------------------
597
- * Row hover (when onRowClick is set)
598
- * --------------------------------------------------------------------------- */
599
-
600
- .viz-table--clickable tbody tr {
601
- cursor: pointer;
602
- }
603
-
604
- .viz-table--clickable tbody tr:hover {
605
- background: var(--viz-hover-bg);
606
- }
607
-
608
- /* ---------------------------------------------------------------------------
609
- * Table header keyboard focus
610
- * --------------------------------------------------------------------------- */
611
-
612
- .viz-table-wrapper th:focus {
613
- outline: 2px solid var(--viz-focus);
614
- outline-offset: -2px;
615
- }
616
-
617
- /* ---------------------------------------------------------------------------
618
- * Keyboard cell focus indicator
619
- * --------------------------------------------------------------------------- */
620
-
621
- .viz-table-cell-focus {
622
- outline: 2px solid var(--viz-focus);
623
- outline-offset: -2px;
624
- }
625
-
626
- /* ---------------------------------------------------------------------------
627
- * Table body focus (for keyboard navigation entry)
628
- * --------------------------------------------------------------------------- */
629
-
630
- .viz-table-wrapper tbody:focus {
631
- outline: none;
632
- }
633
-
634
- /* ---------------------------------------------------------------------------
635
- * Empty state
636
- * --------------------------------------------------------------------------- */
637
-
638
- .viz-table-empty {
639
- padding: 32px 16px;
640
- text-align: center;
641
- color: var(--viz-text-secondary);
642
- font-size: 14px;
643
- font-style: italic;
644
- }
645
-
646
- /* ---------------------------------------------------------------------------
647
- * Reduced motion
648
- * --------------------------------------------------------------------------- */
649
-
650
- @media (prefers-reduced-motion: reduce) {
651
- .viz-table-sort-btn::before,
652
- .viz-table-sort-btn::after,
653
- .viz-table-search input,
654
- .viz-table-pagination button {
655
- transition: none;
656
- }
657
- }
658
-
659
- /* ---------------------------------------------------------------------------
660
- * Graph
661
- * --------------------------------------------------------------------------- */
662
-
663
- .viz-graph-wrapper {
664
- position: relative;
665
- overflow: hidden;
666
- background: var(--viz-bg);
667
- font-family: var(--viz-font-family);
668
- width: 100%;
669
- height: 100%;
670
- }
671
-
672
- .viz-graph-canvas {
673
- display: block;
674
- cursor: grab;
675
- }
676
-
677
- .viz-graph-canvas--dragging {
678
- cursor: grabbing;
679
- }
680
-
681
- .viz-graph-chrome {
682
- padding: 16px 16px 8px;
683
- }
684
-
685
- .viz-graph-chrome .viz-title {
686
- font-size: var(--viz-title-size);
687
- font-weight: var(--viz-title-weight);
688
- letter-spacing: var(--viz-title-tracking);
689
- color: var(--viz-text);
690
- margin: 0 0 4px;
691
- }
692
-
693
- .viz-graph-chrome .viz-subtitle {
694
- font-size: var(--viz-subtitle-size);
695
- color: var(--viz-text-secondary);
696
- margin: 0;
697
- }
698
-
699
- .viz-graph-legend {
700
- position: absolute;
701
- top: 8px;
702
- right: 8px;
703
- background: var(--viz-bg);
704
- border: 1px solid var(--viz-border);
705
- border-radius: var(--viz-border-radius);
706
- padding: 8px 12px;
707
- font-size: 12px;
708
- color: var(--viz-text-secondary);
709
- max-height: 200px;
710
- overflow-y: auto;
711
- }
712
-
713
- .viz-graph-legend-item {
714
- display: flex;
715
- align-items: center;
716
- gap: 6px;
717
- padding: 2px 0;
718
- }
719
-
720
- .viz-graph-legend-swatch {
721
- width: 10px;
722
- height: 10px;
723
- border-radius: 50%;
724
- flex-shrink: 0;
725
- }
726
-
727
- .viz-graph-search {
728
- position: absolute;
729
- top: 8px;
730
- left: 8px;
731
- }
732
-
733
- .viz-graph-search input {
734
- font-family: var(--viz-font-family);
735
- font-size: var(--viz-body-size);
736
- padding: 6px 10px;
737
- border: 1px solid var(--viz-border);
738
- border-radius: var(--viz-border-radius);
739
- background: var(--viz-bg);
740
- color: var(--viz-text);
741
- outline: none;
742
- }
743
-
744
- .viz-graph-search input:focus {
745
- border-color: var(--viz-focus);
746
- box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.25);
747
- }
748
-
749
- /* Dark mode graph overrides (darker bg for canvas-based rendering) */
750
- .viz-dark .viz-graph-wrapper,
751
- .viz-graph-wrapper.viz-dark {
752
- --viz-bg: #0d1117;
753
- }
754
-
755
- .viz-dark .viz-graph-legend,
756
- .viz-dark.viz-graph-wrapper .viz-graph-legend {
757
- background: rgba(13, 17, 23, 0.85);
758
- border-color: rgba(255, 255, 255, 0.1);
759
- }
760
-
761
- .viz-dark .viz-graph-search input {
762
- background: rgba(13, 17, 23, 0.85);
763
- border-color: rgba(255, 255, 255, 0.1);
764
- }