@cratis/components 0.1.9 → 0.1.10

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 (101) hide show
  1. package/dist/cjs/PivotViewer/PivotViewer.css +1258 -0
  2. package/dist/cjs/PivotViewer/components/Spinner.css +77 -0
  3. package/dist/cjs/TimeMachine/EventsView.css +213 -0
  4. package/dist/cjs/TimeMachine/TimeMachine.css +567 -0
  5. package/dist/esm/PivotViewer/PivotViewer.css +1258 -0
  6. package/dist/esm/PivotViewer/components/Spinner.css +77 -0
  7. package/dist/esm/TimeMachine/EventsView.css +213 -0
  8. package/dist/esm/TimeMachine/TimeMachine.css +567 -0
  9. package/package.json +3 -4
  10. package/.storybook/main.ts +0 -24
  11. package/CommandDialog/CommandDialog.stories.tsx +0 -25
  12. package/CommandDialog/CommandDialog.tsx +0 -161
  13. package/CommandDialog/index.ts +0 -4
  14. package/CommandForm/CommandForm.stories.tsx +0 -24
  15. package/CommandForm/CommandForm.tsx +0 -266
  16. package/CommandForm/CommandFormField.tsx +0 -27
  17. package/CommandForm/CommandFormFields.tsx +0 -142
  18. package/CommandForm/DatePickerField.tsx +0 -57
  19. package/CommandForm/DropdownField.tsx +0 -65
  20. package/CommandForm/InputTextField.tsx +0 -62
  21. package/CommandForm/SliderField.tsx +0 -68
  22. package/CommandForm/index.ts +0 -10
  23. package/Common/ErrorBoundary.stories.tsx +0 -10
  24. package/Common/ErrorBoundary.tsx +0 -41
  25. package/Common/FormElement.stories.tsx +0 -10
  26. package/Common/FormElement.tsx +0 -20
  27. package/Common/Page.stories.tsx +0 -10
  28. package/Common/Page.tsx +0 -21
  29. package/Common/index.ts +0 -6
  30. package/DataPage/DataPage.stories.tsx +0 -10
  31. package/DataPage/DataPage.tsx +0 -191
  32. package/DataPage/index.ts +0 -4
  33. package/DataTables/DataTableForObservableQuery.stories.tsx +0 -10
  34. package/DataTables/DataTableForObservableQuery.tsx +0 -97
  35. package/DataTables/DataTableForQuery.stories.tsx +0 -10
  36. package/DataTables/DataTableForQuery.tsx +0 -97
  37. package/DataTables/index.ts +0 -5
  38. package/Dialogs/BusyIndicatorDialog.stories.tsx +0 -26
  39. package/Dialogs/BusyIndicatorDialog.tsx +0 -26
  40. package/Dialogs/ConfirmationDialog.stories.tsx +0 -36
  41. package/Dialogs/ConfirmationDialog.tsx +0 -75
  42. package/Dialogs/index.ts +0 -5
  43. package/Dropdown/Dropdown.tsx +0 -23
  44. package/Dropdown/index.ts +0 -4
  45. package/PivotViewer/PivotViewer.stories.tsx +0 -24
  46. package/PivotViewer/PivotViewer.tsx +0 -791
  47. package/PivotViewer/components/AxisLabels.tsx +0 -69
  48. package/PivotViewer/components/DetailPanel.tsx +0 -108
  49. package/PivotViewer/components/FilterPanel.tsx +0 -189
  50. package/PivotViewer/components/FilterPanelContainer.tsx +0 -10
  51. package/PivotViewer/components/PivotCanvas.tsx +0 -660
  52. package/PivotViewer/components/PivotViewerMain.tsx +0 -229
  53. package/PivotViewer/components/RangeHistogramFilter.tsx +0 -220
  54. package/PivotViewer/components/Spinner.tsx +0 -21
  55. package/PivotViewer/components/Toolbar.tsx +0 -130
  56. package/PivotViewer/components/ToolbarContainer.tsx +0 -10
  57. package/PivotViewer/components/index.ts +0 -12
  58. package/PivotViewer/components/pivot/animation.ts +0 -108
  59. package/PivotViewer/components/pivot/buckets.ts +0 -152
  60. package/PivotViewer/components/pivot/colorResolver.ts +0 -67
  61. package/PivotViewer/components/pivot/constants.ts +0 -46
  62. package/PivotViewer/components/pivot/sprites.ts +0 -265
  63. package/PivotViewer/components/pivot/visibility.ts +0 -319
  64. package/PivotViewer/constants.ts +0 -9
  65. package/PivotViewer/engine/layout.ts +0 -149
  66. package/PivotViewer/engine/pivot.worker.ts +0 -86
  67. package/PivotViewer/engine/store.ts +0 -437
  68. package/PivotViewer/engine/types.ts +0 -255
  69. package/PivotViewer/hooks/index.ts +0 -13
  70. package/PivotViewer/hooks/useContainerDimensions.ts +0 -45
  71. package/PivotViewer/hooks/useDimensionState.ts +0 -53
  72. package/PivotViewer/hooks/useFilterOptions.ts +0 -36
  73. package/PivotViewer/hooks/useFilterPanelDrag.ts +0 -49
  74. package/PivotViewer/hooks/useFilterState.ts +0 -106
  75. package/PivotViewer/hooks/useFilteredData.ts +0 -119
  76. package/PivotViewer/hooks/usePanning.ts +0 -163
  77. package/PivotViewer/hooks/usePivotEngine.ts +0 -252
  78. package/PivotViewer/hooks/useSelectedItem.ts +0 -402
  79. package/PivotViewer/hooks/useWheelZoom.ts +0 -114
  80. package/PivotViewer/hooks/useZoomState.ts +0 -34
  81. package/PivotViewer/index.ts +0 -7
  82. package/PivotViewer/types.ts +0 -59
  83. package/PivotViewer/utils/animations.ts +0 -249
  84. package/PivotViewer/utils/constants.ts +0 -20
  85. package/PivotViewer/utils/index.ts +0 -6
  86. package/PivotViewer/utils/selection.ts +0 -292
  87. package/PivotViewer/utils/utils.ts +0 -259
  88. package/TimeMachine/EventsView.stories.tsx +0 -10
  89. package/TimeMachine/EventsView.tsx +0 -119
  90. package/TimeMachine/Properties.stories.tsx +0 -10
  91. package/TimeMachine/Properties.tsx +0 -98
  92. package/TimeMachine/ReadModelView.stories.tsx +0 -10
  93. package/TimeMachine/ReadModelView.tsx +0 -143
  94. package/TimeMachine/TimeMachine.stories.tsx +0 -10
  95. package/TimeMachine/TimeMachine.tsx +0 -244
  96. package/TimeMachine/index.ts +0 -8
  97. package/TimeMachine/types.ts +0 -23
  98. package/global.d.ts +0 -11
  99. package/index.ts +0 -22
  100. package/useOverlayZIndex.ts +0 -32
  101. package/vite.config.ts +0 -80
@@ -0,0 +1,1258 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ }
4
+
5
+ .pivot-viewer {
6
+ position: relative;
7
+ height: 100vh;
8
+ width: 100%;
9
+ background: radial-gradient(circle at 25% 20%, var(--primary-500), var(--surface-ground));
10
+ color: var(--text-color);
11
+ overflow: hidden;
12
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
13
+ }
14
+
15
+ .pv-filter-panel {
16
+ position: fixed;
17
+ width: min(280px, calc(100% - 2rem));
18
+ max-height: calc(100vh - 6.5rem);
19
+ background: linear-gradient(180deg, var(--surface-card), var(--surface-ground));
20
+ border: 1px solid var(--surface-border);
21
+ border-radius: 1rem;
22
+ box-shadow: 0 24px 60px rgba(0, 0, 0, 0.3);
23
+ backdrop-filter: blur(14px);
24
+ overflow: hidden;
25
+ z-index: 12;
26
+ display: flex;
27
+ flex-direction: column;
28
+ }
29
+
30
+ .pv-filter-panel.dragging {
31
+ cursor: grabbing;
32
+ user-select: none;
33
+ }
34
+
35
+ .pv-filter-panel.minimized {
36
+ max-height: none;
37
+ }
38
+
39
+ .pv-filter-panel-header {
40
+ display: flex;
41
+ align-items: center;
42
+ gap: 0.5rem;
43
+ padding: 0.75rem 1rem;
44
+ cursor: grab;
45
+ background: var(--surface-section);
46
+ border-bottom: 1px solid var(--surface-border);
47
+ flex-shrink: 0;
48
+ }
49
+
50
+ .pv-filter-panel.dragging .pv-filter-panel-header {
51
+ cursor: grabbing;
52
+ }
53
+
54
+ .pv-filter-panel-header h2 {
55
+ margin: 0;
56
+ font-size: 0.85rem;
57
+ letter-spacing: 0.04em;
58
+ text-transform: uppercase;
59
+ color: var(--text-color);
60
+ flex: 1;
61
+ pointer-events: none;
62
+ }
63
+
64
+ .pv-minimize-btn,
65
+ .pv-close-btn {
66
+ appearance: none;
67
+ border: none;
68
+ border-radius: 0.4rem;
69
+ width: 1.5rem;
70
+ height: 1.5rem;
71
+ display: flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+ background: var(--highlight-bg);
75
+ color: var(--text-color);
76
+ font-size: 1rem;
77
+ font-weight: 500;
78
+ cursor: pointer;
79
+ transition: background 120ms ease;
80
+ }
81
+
82
+ .pv-minimize-btn:hover,
83
+ .pv-close-btn:hover {
84
+ background: var(--surface-hover);
85
+ }
86
+
87
+ .pv-close-btn {
88
+ font-size: 1.2rem;
89
+ }
90
+
91
+ .pv-filter-panel-content {
92
+ overflow: hidden;
93
+ max-height: 0;
94
+ opacity: 0;
95
+ padding: 0 1.25rem;
96
+ transition: max-height 150ms ease-out, opacity 100ms ease-out, padding 150ms ease-out;
97
+ }
98
+
99
+ .pv-filter-panel-content.expanded {
100
+ overflow-y: auto;
101
+ flex: 1;
102
+ max-height: 600px;
103
+ opacity: 1;
104
+ padding: 1rem 1.25rem 1.25rem;
105
+ }
106
+
107
+ .pv-search {
108
+ padding-bottom: 1rem;
109
+ }
110
+
111
+ .pv-search input {
112
+ width: 100%;
113
+ padding: 0.65rem 0.85rem;
114
+ border-radius: 0.75rem;
115
+ border: 1px solid var(--surface-border);
116
+ background: var(--surface-ground);
117
+ color: inherit;
118
+ font-size: 0.95rem;
119
+ box-shadow: inset 0 1px 0 var(--surface-border);
120
+ }
121
+
122
+ .pv-search input:focus {
123
+ outline: none;
124
+ border-color: var(--primary-color);
125
+ box-shadow: var(--focus-ring);
126
+ }
127
+
128
+
129
+ .pv-filter-groups {
130
+ display: flex;
131
+ flex-direction: column;
132
+ gap: 0.85rem;
133
+ }
134
+
135
+ .pv-filter {
136
+ background: var(--surface-overlay);
137
+ border: 1px solid var(--surface-border);
138
+ border-radius: 0.85rem;
139
+ padding: 0.75rem 0.85rem;
140
+ transition: border-color 180ms ease, box-shadow 180ms ease;
141
+ }
142
+
143
+ .pv-filter.expanded {
144
+ border-color: var(--primary-color);
145
+ box-shadow: 0 15px 38px rgba(0, 0, 0, 0.3);
146
+ }
147
+
148
+ .pv-filter-trigger {
149
+ display: flex;
150
+ width: 100%;
151
+ align-items: center;
152
+ justify-content: space-between;
153
+ background: none;
154
+ border: none;
155
+ color: inherit;
156
+ padding: 0;
157
+ cursor: pointer;
158
+ font-size: 0.82rem;
159
+ font-weight: 600;
160
+ text-transform: uppercase;
161
+ letter-spacing: 0.05em;
162
+ }
163
+
164
+ .pv-filter-label {
165
+ display: flex;
166
+ align-items: center;
167
+ gap: 0.4rem;
168
+ }
169
+
170
+ .pv-filter-trigger-meta {
171
+ display: inline-flex;
172
+ align-items: center;
173
+ gap: 0.5rem;
174
+ }
175
+
176
+ .pv-filter-count {
177
+ display: inline-flex;
178
+ align-items: center;
179
+ justify-content: center;
180
+ min-width: 1.5rem;
181
+ padding: 0.15rem 0.45rem;
182
+ border-radius: 999px;
183
+ background: var(--highlight-bg);
184
+ color: var(--text-color);
185
+ font-size: 0.7rem;
186
+ }
187
+
188
+ .pv-filter-chevron {
189
+ width: 0.65rem;
190
+ height: 0.65rem;
191
+ border-right: 2px solid var(--text-color);
192
+ border-bottom: 2px solid var(--text-color);
193
+ transform: rotate(45deg);
194
+ transition: transform 180ms ease;
195
+ }
196
+
197
+ .pv-filter.expanded .pv-filter-chevron {
198
+ transform: rotate(225deg);
199
+ }
200
+
201
+ .pv-filter-content {
202
+ overflow: hidden;
203
+ max-height: 0;
204
+ opacity: 0;
205
+ margin-top: 0;
206
+ padding-top: 0;
207
+ border-top: 1px solid transparent;
208
+ transition: max-height 120ms ease-out, opacity 80ms ease-out, margin-top 120ms ease-out, padding-top 120ms ease-out, border-color 120ms ease-out;
209
+ }
210
+
211
+ .pv-filter-content.expanded {
212
+ max-height: 350px;
213
+ opacity: 1;
214
+ margin-top: 0.75rem;
215
+ padding-top: 0.75rem;
216
+ border-top-color: var(--surface-border);
217
+ overflow-y: auto;
218
+ }
219
+
220
+ .pv-filter-content ul {
221
+ list-style: none;
222
+ margin: 0;
223
+ padding: 0;
224
+ display: grid;
225
+ gap: 0.45rem;
226
+ }
227
+
228
+ .pv-filter-content li label {
229
+ display: grid;
230
+ grid-template-columns: auto 1fr auto;
231
+ gap: 0.6rem;
232
+ align-items: center;
233
+ padding: 0.45rem 0.5rem;
234
+ border-radius: 0.55rem;
235
+ border: 1px solid transparent;
236
+ cursor: pointer;
237
+ transition: background 160ms ease, border-color 160ms ease;
238
+ }
239
+
240
+ .pv-filter-content li label:hover {
241
+ background: var(--surface-hover);
242
+ }
243
+
244
+ .pv-filter-content input[type='checkbox'],
245
+ .pv-filter-content input[type='radio'] {
246
+ accent-color: var(--primary-color);
247
+ }
248
+
249
+ .pv-filter-content li label span {
250
+ font-size: 0.85rem;
251
+ }
252
+
253
+ .pv-filter-clear {
254
+ margin-top: 0.75rem;
255
+ appearance: none;
256
+ border: none;
257
+ border-radius: 0.55rem;
258
+ padding: 0.4rem 0.75rem;
259
+ background: var(--highlight-bg);
260
+ color: var(--text-color);
261
+ font-size: 0.72rem;
262
+ text-transform: uppercase;
263
+ letter-spacing: 0.08em;
264
+ cursor: pointer;
265
+ }
266
+
267
+ .pv-option-count {
268
+ font-feature-settings: "tnum";
269
+ font-variant-numeric: tabular-nums;
270
+ color: var(--text-color-secondary);
271
+ font-size: 0.75rem;
272
+ }
273
+
274
+ .pv-main {
275
+ position: relative;
276
+ display: flex;
277
+ flex-direction: column;
278
+ min-height: 0;
279
+ height: 100%;
280
+ padding-left: 0;
281
+ overflow: hidden;
282
+ }
283
+
284
+ .pv-toolbar {
285
+ display: flex;
286
+ justify-content: space-between;
287
+ align-items: center;
288
+ padding: 0.75rem 1.75rem;
289
+ border-bottom: 1px solid var(--surface-border);
290
+ background: var(--surface-section);
291
+ backdrop-filter: blur(12px);
292
+ position: sticky;
293
+ top: 0;
294
+ z-index: 15;
295
+ flex-shrink: 0;
296
+ min-height: 3.5rem;
297
+ height: 3.5rem;
298
+ overflow: visible;
299
+ }
300
+
301
+ .pv-toolbar-left,
302
+ .pv-toolbar-right {
303
+ display: inline-flex;
304
+ align-items: center;
305
+ gap: 0.75rem;
306
+ flex-shrink: 0;
307
+ }
308
+
309
+ .pv-toolbar-right {
310
+ gap: 1rem;
311
+ }
312
+
313
+ .pv-toolbar h1 {
314
+ margin: 0;
315
+ font-size: 1.1rem;
316
+ letter-spacing: -0.01em;
317
+ white-space: nowrap;
318
+ }
319
+
320
+ .pv-count {
321
+ margin-left: 1rem;
322
+ display: inline-flex;
323
+ align-items: center;
324
+ gap: 0.35rem;
325
+ padding: 0.3rem 0.65rem;
326
+ border-radius: 999px;
327
+ background: var(--highlight-bg);
328
+ font-size: 0.8rem;
329
+ color: var(--text-color);
330
+ }
331
+
332
+ .pv-filter-button {
333
+ appearance: none;
334
+ border: none;
335
+ border-radius: 999px;
336
+ padding: 0.45rem 1rem;
337
+ background: var(--highlight-bg);
338
+ color: var(--text-color);
339
+ font-size: 0.8rem;
340
+ letter-spacing: 0.08em;
341
+ text-transform: uppercase;
342
+ cursor: pointer;
343
+ transition: background 180ms ease, box-shadow 180ms ease;
344
+ }
345
+
346
+ .pv-filter-button.active,
347
+ .pv-filter-button:hover {
348
+ background: var(--surface-hover);
349
+ box-shadow: var(--focus-ring);
350
+ }
351
+
352
+ /* Filter Icon Button */
353
+ .pv-filter-icon-button {
354
+ position: relative;
355
+ appearance: none;
356
+ border: none;
357
+ border-radius: 0.5rem;
358
+ width: 2.25rem;
359
+ height: 2.25rem;
360
+ display: flex;
361
+ align-items: center;
362
+ justify-content: center;
363
+ background: var(--highlight-bg);
364
+ color: var(--text-color);
365
+ cursor: pointer;
366
+ transition: background 180ms ease, box-shadow 180ms ease;
367
+ }
368
+
369
+ .pv-filter-icon-button:hover {
370
+ background: var(--surface-hover);
371
+ }
372
+
373
+ .pv-filter-icon-button.active {
374
+ background: var(--surface-hover);
375
+ box-shadow: var(--focus-ring);
376
+ }
377
+
378
+ .pv-filter-badge {
379
+ position: absolute;
380
+ top: -4px;
381
+ right: -4px;
382
+ min-width: 1.1rem;
383
+ height: 1.1rem;
384
+ display: flex;
385
+ align-items: center;
386
+ justify-content: center;
387
+ border-radius: 999px;
388
+ background: var(--primary-color);
389
+ color: var(--primary-color-text);
390
+ font-size: 0.65rem;
391
+ font-weight: 600;
392
+ padding: 0 0.25rem;
393
+ }
394
+
395
+ /* Filter Dropdown */
396
+ .pv-filter-dropdown {
397
+ position: fixed;
398
+ width: min(320px, calc(100vw - 2rem));
399
+ max-height: calc(100vh - 8rem);
400
+ background: linear-gradient(180deg, var(--surface-card), var(--surface-ground));
401
+ border: 1px solid var(--surface-border);
402
+ border-radius: 0.85rem;
403
+ box-shadow: 0 20px 50px rgba(0, 0, 0, 0.4);
404
+ backdrop-filter: blur(16px);
405
+ overflow: hidden;
406
+ z-index: 1000;
407
+ display: flex;
408
+ flex-direction: column;
409
+ will-change: opacity, transform;
410
+ contain: layout;
411
+ }
412
+
413
+ .pv-filter-dropdown-content {
414
+ padding: 1rem;
415
+ overflow-y: auto;
416
+ flex: 1;
417
+ }
418
+
419
+ .pv-view-toggle {
420
+ display: inline-flex;
421
+ align-items: center;
422
+ border-radius: 999px;
423
+ background: var(--surface-section);
424
+ border: 1px solid var(--surface-border);
425
+ padding: 0.2rem;
426
+ gap: 0.2rem;
427
+ }
428
+
429
+ .pv-view-toggle button {
430
+ appearance: none;
431
+ border: none;
432
+ border-radius: 999px;
433
+ padding: 0.35rem 0.9rem;
434
+ color: var(--text-color-secondary);
435
+ background: transparent;
436
+ font-size: 0.75rem;
437
+ letter-spacing: 0.06em;
438
+ text-transform: uppercase;
439
+ cursor: pointer;
440
+ transition: color 160ms ease, background 160ms ease, box-shadow 160ms ease;
441
+ }
442
+
443
+ .pv-view-toggle button.active {
444
+ background: var(--primary-color);
445
+ color: var(--primary-color-text);
446
+ }
447
+
448
+ .pv-zoom-controls {
449
+ display: inline-flex;
450
+ align-items: center;
451
+ gap: 0.5rem;
452
+ background: var(--surface-section);
453
+ border: 1px solid var(--surface-border);
454
+ border-radius: 0.6rem;
455
+ padding: 0.25rem 0.5rem;
456
+ }
457
+
458
+ .pv-zoom-controls button {
459
+ appearance: none;
460
+ border: none;
461
+ background: transparent;
462
+ color: var(--text-color);
463
+ font-size: 1.1rem;
464
+ width: 1.75rem;
465
+ height: 1.75rem;
466
+ border-radius: 0.4rem;
467
+ cursor: pointer;
468
+ display: flex;
469
+ align-items: center;
470
+ justify-content: center;
471
+ transition: background 120ms ease, color 120ms ease;
472
+ }
473
+
474
+ .pv-zoom-controls button:hover {
475
+ background: var(--surface-hover);
476
+ color: var(--text-color);
477
+ }
478
+
479
+ .pv-zoom-controls button:disabled {
480
+ opacity: 0.4;
481
+ cursor: not-allowed;
482
+ }
483
+
484
+ .pv-zoom-slider {
485
+ width: 80px;
486
+ height: 4px;
487
+ appearance: none;
488
+ background: var(--surface-border);
489
+ border-radius: 2px;
490
+ cursor: pointer;
491
+ }
492
+
493
+ .pv-zoom-slider::-webkit-slider-thumb {
494
+ appearance: none;
495
+ width: 14px;
496
+ height: 14px;
497
+ background: var(--primary-color);
498
+ border: 2px solid var(--text-color);
499
+ border-radius: 50%;
500
+ cursor: pointer;
501
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
502
+ transition: transform 120ms ease;
503
+ }
504
+
505
+ .pv-zoom-slider::-webkit-slider-thumb:hover {
506
+ transform: scale(1.15);
507
+ }
508
+
509
+ .pv-zoom-slider::-moz-range-thumb {
510
+ width: 14px;
511
+ height: 14px;
512
+ background: var(--primary-color);
513
+ border: 2px solid var(--text-color);
514
+ border-radius: 50%;
515
+ cursor: pointer;
516
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
517
+ }
518
+
519
+ .pv-zoom-controls span {
520
+ font-size: 0.75rem;
521
+ color: var(--text-color-secondary);
522
+ min-width: 3rem;
523
+ text-align: center;
524
+ font-variant-numeric: tabular-nums;
525
+ }
526
+
527
+ .pv-dimension-select {
528
+ display: inline-flex;
529
+ align-items: center;
530
+ gap: 0.6rem;
531
+ font-size: 0.9rem;
532
+ color: var(--text-color-secondary);
533
+ }
534
+
535
+ .pv-dimension-select select {
536
+ background: var(--surface-ground);
537
+ border: 1px solid var(--surface-border);
538
+ border-radius: 0.6rem;
539
+ color: inherit;
540
+ font-size: 0.9rem;
541
+ padding: 0.4rem 0.6rem;
542
+ }
543
+
544
+ .pv-groups {
545
+ position: relative;
546
+ flex: 1;
547
+ padding: 1.5rem 1.5rem 0;
548
+ display: flex;
549
+ align-items: flex-end;
550
+ gap: 0.25rem;
551
+ overflow: auto;
552
+ scroll-behavior: smooth;
553
+ cursor: grab;
554
+ user-select: none;
555
+ touch-action: pan-x pan-y;
556
+ /* Hide scrollbars */
557
+ scrollbar-width: none; /* Firefox */
558
+ -ms-overflow-style: none; /* IE and Edge */
559
+ }
560
+
561
+ .pv-groups::-webkit-scrollbar {
562
+ display: none; /* Chrome, Safari, Opera */
563
+ }
564
+
565
+ .pv-groups.pv-panning {
566
+ cursor: grabbing;
567
+ scroll-behavior: auto;
568
+ }
569
+
570
+ .pv-groups:active {
571
+ cursor: grabbing;
572
+ }
573
+
574
+ /* Groups wrapper for bucket mode with axis labels */
575
+ .pv-groups-wrapper {
576
+ display: flex;
577
+ flex-direction: column;
578
+ flex: 1;
579
+ min-height: 0;
580
+ overflow: hidden;
581
+ background: transparent;
582
+ }
583
+
584
+ .pv-groups-buckets {
585
+ flex: 1;
586
+ padding-bottom: 0;
587
+ }
588
+
589
+ .pv-group {
590
+ display: flex;
591
+ flex-direction: column;
592
+ align-items: stretch;
593
+ background: transparent;
594
+ border-radius: 0;
595
+ border: none;
596
+ padding: 0;
597
+ box-shadow: none;
598
+ flex: 0 0 auto;
599
+ transition: background 180ms ease;
600
+ }
601
+
602
+ /* Bucket mode groups need to align cards to bottom and extend full height */
603
+ .pv-group-bucket {
604
+ justify-content: flex-end;
605
+ position: relative;
606
+ min-height: 100%; /* Ensure full height for hover */
607
+ width: var(--column-width); /* Fixed width even when empty */
608
+ }
609
+
610
+ /* Zebra striping for bucket mode - every other bucket gets a lighter background */
611
+ .pv-group-bucket:nth-child(even)::before {
612
+ background: rgba(255, 255, 255, 0.03);
613
+ }
614
+
615
+ /* Full-height hover highlight that extends to the top */
616
+ .pv-group-bucket::before {
617
+ content: '';
618
+ position: absolute;
619
+ inset: 0;
620
+ top: -100vh; /* Extend way above to ensure it reaches the top */
621
+ background: transparent;
622
+ transition: background 180ms ease;
623
+ pointer-events: none;
624
+ z-index: 0;
625
+ }
626
+
627
+ .pv-group-bucket:hover::before,
628
+ .pv-group-bucket.highlighted::before {
629
+ background: var(--surface-hover);
630
+ }
631
+
632
+ /* Zebra striping hover state - combine with stripe background */
633
+ .pv-group-bucket:nth-child(even):hover::before,
634
+ .pv-group-bucket:nth-child(even).highlighted::before {
635
+ background: var(--surface-hover);
636
+ }
637
+
638
+ .pv-group:hover {
639
+ background: transparent;
640
+ }
641
+
642
+ .pv-group.highlighted {
643
+ background: transparent;
644
+ }
645
+
646
+ .pv-group header {
647
+ display: none;
648
+ }
649
+
650
+ .pv-group header h2 {
651
+ margin: 0;
652
+ font-size: 1rem;
653
+ letter-spacing: 0.01em;
654
+ }
655
+
656
+ .pv-group header span {
657
+ font-size: 0.75rem;
658
+ color: var(--text-color-secondary);
659
+ background: var(--highlight-bg);
660
+ padding: 0.15rem 0.5rem;
661
+ border-radius: 999px;
662
+ }
663
+
664
+ .pv-cards {
665
+ display: grid;
666
+ gap: calc(4px * var(--zoom-scale, 1));
667
+ width: var(--column-width, auto);
668
+ }
669
+
670
+ .pv-cards-bucket {
671
+ /* Grid fills left-to-right with fixed columns */
672
+ grid-template-columns: repeat(var(--cards-per-row, 5), 1fr);
673
+ grid-auto-flow: row;
674
+ width: var(--column-width);
675
+ }
676
+
677
+ .pv-cards-bucket .pv-card {
678
+ /* Cards maintain their direction */
679
+ }
680
+
681
+ /* Empty placeholder cells in bucket grid */
682
+ .pv-card-placeholder {
683
+ visibility: hidden;
684
+ width: var(--card-width);
685
+ height: var(--card-height);
686
+ }
687
+
688
+ /* Axis labels at bottom of bucket view */
689
+ .pv-axis-labels {
690
+ display: flex;
691
+ align-items: stretch;
692
+ background: var(--surface-section);
693
+ border-top: 1px solid var(--surface-border);
694
+ padding: 0.5rem 1.5rem;
695
+ padding-left: calc(1.5rem); /* Match groups container padding */
696
+ gap: 0.25rem; /* Match gap between groups */
697
+ overflow-x: hidden; /* Disable independent scroll - synced via JS */
698
+ flex-shrink: 0;
699
+ }
700
+
701
+ .pv-axis-label {
702
+ display: flex;
703
+ flex-direction: column;
704
+ align-items: center;
705
+ justify-content: center;
706
+ padding: 0.5rem 0;
707
+ text-align: center;
708
+ cursor: pointer;
709
+ transition: background 180ms ease, border-color 180ms ease;
710
+ flex: 0 0 auto;
711
+ border-radius: 0.5rem;
712
+ border: 2px solid transparent;
713
+ background: transparent;
714
+ color: inherit;
715
+ font: inherit;
716
+ }
717
+
718
+ /* Zebra striping for axis labels - match the bucket columns */
719
+ .pv-axis-label:nth-child(even) {
720
+ background: rgba(255, 255, 255, 0.03);
721
+ }
722
+
723
+ .pv-axis-label:hover,
724
+ .pv-axis-label.highlighted {
725
+ background: var(--surface-hover);
726
+ }
727
+
728
+ /* Zebra striping hover/highlight for even labels */
729
+ .pv-axis-label:nth-child(even):hover,
730
+ .pv-axis-label:nth-child(even).highlighted {
731
+ background: var(--surface-hover);
732
+ }
733
+
734
+ .pv-axis-label.selected {
735
+ border-color: var(--primary-color);
736
+ background: var(--highlight-bg);
737
+ }
738
+
739
+ .pv-axis-label:focus-visible {
740
+ outline: none;
741
+ border-color: var(--primary-color);
742
+ box-shadow: var(--focus-ring);
743
+ }
744
+
745
+ .pv-axis-label-text {
746
+ font-size: 0.75rem;
747
+ color: var(--text-color);
748
+ font-weight: 500;
749
+ white-space: nowrap;
750
+ overflow: hidden;
751
+ text-overflow: ellipsis;
752
+ max-width: 100%;
753
+ }
754
+
755
+ .pv-axis-label-count {
756
+ font-size: 0.65rem;
757
+ color: var(--text-color-secondary);
758
+ margin-top: 0.15rem;
759
+ font-variant-numeric: tabular-nums;
760
+ }
761
+
762
+ .pv-groups.pv-groups-collection {
763
+ display: flex;
764
+ flex-wrap: wrap;
765
+ align-items: flex-start;
766
+ align-content: flex-start;
767
+ padding: 1.5rem;
768
+ gap: calc(8px * var(--zoom-scale, 1));
769
+ overflow: auto;
770
+ }
771
+
772
+ /* Pause flex reflow during zoom animation for smoother effect */
773
+ .pv-groups.pv-zooming {
774
+ /* Disable transitions during zoom */
775
+ }
776
+
777
+ /* CRITICAL: Freeze collection layout during zoom - prevent any reflow */
778
+ .pv-groups.pv-groups-collection.pv-zooming {
779
+ /* Lock the gap to prevent layout shifts */
780
+ gap: 8px !important;
781
+ }
782
+
783
+ .pv-groups.pv-groups-collection.pv-zooming .pv-card {
784
+ /* Prevent cards from resizing/reflowing during zoom */
785
+ flex-shrink: 0 !important;
786
+ flex-grow: 0 !important;
787
+ }
788
+
789
+ .pv-groups.pv-groups-collection > div,
790
+ .pv-groups.pv-groups-collection > section {
791
+ width: auto;
792
+ }
793
+
794
+ .pv-group-collection {
795
+ display: contents;
796
+ background: transparent;
797
+ border: none;
798
+ padding: 0;
799
+ box-shadow: none;
800
+ }
801
+
802
+ .pv-group-collection .pv-cards {
803
+ display: contents;
804
+ }
805
+
806
+ .pv-cards-collection {
807
+ display: contents;
808
+ }
809
+
810
+ .pv-cards-collection .pv-card {
811
+ background: linear-gradient(180deg, var(--surface-card), var(--surface-ground));
812
+ }
813
+
814
+ .pv-card {
815
+ border: none;
816
+ text-align: left;
817
+ padding: 0;
818
+ background: linear-gradient(180deg, var(--surface-card), var(--surface-ground));
819
+ border-radius: 0.85rem;
820
+ cursor: pointer;
821
+ color: inherit;
822
+ border: 1px solid transparent;
823
+ transition: border-color 160ms ease;
824
+ }
825
+
826
+ .pv-card:focus-visible {
827
+ outline: none;
828
+ border-color: var(--primary-color);
829
+ box-shadow: var(--focus-ring);
830
+ }
831
+
832
+ .pv-card.selected {
833
+ border-color: var(--primary-color);
834
+ box-shadow: var(--focus-ring), 0 8px 20px rgba(0, 0, 0, 0.2);
835
+ }
836
+
837
+ .pv-card-body {
838
+ padding: calc(0.85rem * var(--zoom-scale, 1)) calc(0.95rem * var(--zoom-scale, 1));
839
+ font-size: calc(1rem * var(--zoom-scale, 1));
840
+ overflow: hidden;
841
+ }
842
+
843
+ .pv-card-title {
844
+ font-size: calc(0.95rem * var(--zoom-scale, 1));
845
+ font-weight: 600;
846
+ margin-bottom: calc(0.65rem * var(--zoom-scale, 1));
847
+ line-height: 1.2;
848
+ overflow: hidden;
849
+ text-overflow: ellipsis;
850
+ white-space: nowrap;
851
+ }
852
+
853
+ .pv-card-row {
854
+ display: grid;
855
+ grid-template-columns: minmax(0, 0.9fr) minmax(0, 1fr);
856
+ gap: calc(0.5rem * var(--zoom-scale, 1));
857
+ font-size: calc(0.8rem * var(--zoom-scale, 1));
858
+ color: var(--text-color);
859
+ margin-bottom: calc(0.35rem * var(--zoom-scale, 1));
860
+ line-height: 1.3;
861
+ }
862
+
863
+ .pv-card-row dt {
864
+ margin: 0;
865
+ color: var(--text-color-secondary);
866
+ font-weight: 500;
867
+ overflow: hidden;
868
+ text-overflow: ellipsis;
869
+ white-space: nowrap;
870
+ }
871
+
872
+ .pv-card-row dd {
873
+ margin: 0;
874
+ overflow: hidden;
875
+ text-overflow: ellipsis;
876
+ white-space: nowrap;
877
+ }
878
+
879
+ .pv-card-more {
880
+ margin-top: calc(0.4rem * var(--zoom-scale, 1));
881
+ color: var(--text-color-secondary);
882
+ text-align: right;
883
+ font-size: calc(0.9rem * var(--zoom-scale, 1));
884
+ }
885
+
886
+ .pv-empty {
887
+ width: 100%;
888
+ text-align: center;
889
+ padding: 3rem;
890
+ color: var(--text-color-secondary);
891
+ font-size: 1.05rem;
892
+ }
893
+
894
+ /* Slide-in detail panel from the right */
895
+ .pv-detail-panel {
896
+ position: absolute;
897
+ top: 0;
898
+ right: 0;
899
+ bottom: 0;
900
+ width: 380px;
901
+ background: var(--surface-overlay);
902
+ border-left: 1px solid var(--surface-border);
903
+ display: flex;
904
+ flex-direction: column;
905
+ z-index: 14;
906
+ box-shadow: -8px 0 32px rgba(0, 0, 0, 0.3);
907
+ }
908
+
909
+ .pv-detail-panel header {
910
+ display: flex;
911
+ align-items: center;
912
+ justify-content: space-between;
913
+ padding: 1rem 1.25rem;
914
+ border-bottom: 1px solid var(--surface-border);
915
+ flex-shrink: 0;
916
+ }
917
+
918
+ .pv-detail-panel header h2 {
919
+ margin: 0;
920
+ font-size: 1.1rem;
921
+ color: var(--text-color);
922
+ }
923
+
924
+ .pv-detail-panel header p {
925
+ margin: 0.25rem 0 0;
926
+ font-size: 0.8rem;
927
+ color: var(--text-color-secondary);
928
+ }
929
+
930
+ .pv-detail-panel header button {
931
+ appearance: none;
932
+ border: none;
933
+ background: var(--surface-hover);
934
+ color: var(--text-color);
935
+ width: 32px;
936
+ height: 32px;
937
+ border-radius: 8px;
938
+ font-size: 1.3rem;
939
+ cursor: pointer;
940
+ display: flex;
941
+ align-items: center;
942
+ justify-content: center;
943
+ transition: background 120ms ease;
944
+ }
945
+
946
+ .pv-detail-panel header button:hover {
947
+ background: var(--highlight-bg);
948
+ }
949
+
950
+ .pv-detail-panel-content {
951
+ flex: 1;
952
+ overflow-y: auto;
953
+ padding: 1rem 1.25rem 1.5rem;
954
+ }
955
+
956
+ .pv-detail-panel section h3 {
957
+ margin: 0 0 0.6rem;
958
+ font-size: 0.85rem;
959
+ text-transform: uppercase;
960
+ letter-spacing: 0.06em;
961
+ color: var(--text-color-secondary);
962
+ }
963
+
964
+ .pv-detail-panel section + section {
965
+ margin-top: 1.25rem;
966
+ }
967
+
968
+ .pv-detail-panel dl {
969
+ display: grid;
970
+ gap: 0.4rem;
971
+ }
972
+
973
+ .pv-detail-panel dl > div {
974
+ background: var(--surface-section);
975
+ border-radius: 0.6rem;
976
+ padding: 0.5rem 0.7rem;
977
+ }
978
+
979
+ .pv-detail-panel dt {
980
+ margin: 0;
981
+ font-size: 0.7rem;
982
+ text-transform: uppercase;
983
+ letter-spacing: 0.08em;
984
+ color: var(--text-color-secondary);
985
+ }
986
+
987
+ .pv-detail-panel dd {
988
+ margin: 0.15rem 0 0;
989
+ font-size: 0.85rem;
990
+ color: var(--text-color);
991
+ white-space: pre-wrap;
992
+ word-break: break-word;
993
+ }
994
+
995
+ .pv-detail-panel .pv-detail-meta dl {
996
+ grid-template-columns: 1fr 1fr;
997
+ }
998
+
999
+ .pv-detail-panel .pv-detail-causation .pv-pill-row {
1000
+ display: flex;
1001
+ flex-wrap: wrap;
1002
+ gap: 0.4rem;
1003
+ }
1004
+
1005
+ /* Legacy overlay styles - hidden */
1006
+ .pv-detail-overlay {
1007
+ display: none;
1008
+ position: fixed;
1009
+ inset: 0;
1010
+ background: var(--maskbg);
1011
+ backdrop-filter: blur(6px);
1012
+ display: flex;
1013
+ align-items: flex-end;
1014
+ justify-content: center;
1015
+ padding: 2rem;
1016
+ z-index: 20;
1017
+ }
1018
+
1019
+ .pv-detail {
1020
+ width: min(720px, 100%);
1021
+ background: var(--surface-overlay);
1022
+ border: 1px solid var(--surface-border);
1023
+ border-radius: 1.25rem;
1024
+ padding: 1.75rem;
1025
+ max-height: min(80vh, 640px);
1026
+ overflow-y: auto;
1027
+ color: var(--text-color);
1028
+ }
1029
+
1030
+ .pv-detail header {
1031
+ display: flex;
1032
+ align-items: center;
1033
+ justify-content: space-between;
1034
+ margin-bottom: 1.25rem;
1035
+ }
1036
+
1037
+ .pv-detail header h2 {
1038
+ margin: 0;
1039
+ font-size: 1.3rem;
1040
+ }
1041
+
1042
+ .pv-detail header p {
1043
+ margin: 0;
1044
+ font-size: 0.9rem;
1045
+ color: var(--text-color-secondary);
1046
+ }
1047
+
1048
+ .pv-detail header button {
1049
+ appearance: none;
1050
+ border: none;
1051
+ border-radius: 0.75rem;
1052
+ padding: 0.5rem 1rem;
1053
+ background: var(--highlight-bg);
1054
+ color: inherit;
1055
+ cursor: pointer;
1056
+ }
1057
+
1058
+ .pv-detail section h3 {
1059
+ margin-top: 0;
1060
+ font-size: 1rem;
1061
+ margin-bottom: 0.75rem;
1062
+ }
1063
+
1064
+ .pv-detail section + section {
1065
+ margin-top: 1.25rem;
1066
+ }
1067
+
1068
+ .pv-detail dl {
1069
+ display: grid;
1070
+ gap: 0.5rem;
1071
+ }
1072
+
1073
+ .pv-detail dl > div {
1074
+ background: var(--surface-section);
1075
+ border-radius: 0.75rem;
1076
+ padding: 0.55rem 0.75rem;
1077
+ }
1078
+
1079
+ .pv-detail dt {
1080
+ margin: 0;
1081
+ font-size: 0.75rem;
1082
+ text-transform: uppercase;
1083
+ letter-spacing: 0.08em;
1084
+ color: var(--text-color-secondary);
1085
+ }
1086
+
1087
+ .pv-detail dd {
1088
+ margin: 0.2rem 0 0;
1089
+ font-size: 0.9rem;
1090
+ color: var(--text-color);
1091
+ white-space: pre-wrap;
1092
+ word-break: break-word;
1093
+ }
1094
+
1095
+ .pv-detail-meta dl {
1096
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
1097
+ }
1098
+
1099
+ .pv-detail-causation .pv-pill-row {
1100
+ display: flex;
1101
+ flex-wrap: wrap;
1102
+ gap: 0.5rem;
1103
+ }
1104
+
1105
+ .pv-pill {
1106
+ display: inline-flex;
1107
+ align-items: center;
1108
+ gap: 0.35rem;
1109
+ padding: 0.35rem 0.65rem;
1110
+ border-radius: 999px;
1111
+ background: var(--highlight-bg);
1112
+ color: var(--text-color);
1113
+ font-size: 0.8rem;
1114
+ border: 1px solid var(--surface-border);
1115
+ }
1116
+
1117
+ /* Range Histogram Filter */
1118
+ .pv-range-histogram {
1119
+ padding: 0.5rem 0;
1120
+ }
1121
+
1122
+ .pv-histogram-bars {
1123
+ display: flex;
1124
+ align-items: flex-end;
1125
+ gap: 2px;
1126
+ height: 80px;
1127
+ padding: 0 2px;
1128
+ margin-bottom: 0.5rem;
1129
+ }
1130
+
1131
+ .pv-histogram-bar {
1132
+ flex: 1;
1133
+ min-width: 8px;
1134
+ background: var(--highlight-bg);
1135
+ border: none;
1136
+ border-radius: 2px 2px 0 0;
1137
+ cursor: pointer;
1138
+ transition: background 160ms ease, transform 120ms ease;
1139
+ padding: 0;
1140
+ }
1141
+
1142
+ .pv-histogram-bar:hover {
1143
+ background: var(--surface-hover);
1144
+ transform: scaleY(1.02);
1145
+ }
1146
+
1147
+ .pv-histogram-bar.in-range {
1148
+ background: var(--primary-color);
1149
+ }
1150
+
1151
+ .pv-histogram-bar.partial {
1152
+ background: var(--highlight-bg);
1153
+ }
1154
+
1155
+ .pv-range-slider {
1156
+ position: relative;
1157
+ height: 24px;
1158
+ margin: 0.5rem 0;
1159
+ }
1160
+
1161
+ .pv-range-track {
1162
+ position: absolute;
1163
+ top: 50%;
1164
+ left: 0;
1165
+ right: 0;
1166
+ height: 4px;
1167
+ background: var(--surface-border);
1168
+ border-radius: 2px;
1169
+ transform: translateY(-50%);
1170
+ }
1171
+
1172
+ .pv-range-selection {
1173
+ position: absolute;
1174
+ top: 50%;
1175
+ height: 4px;
1176
+ background: var(--primary-color);
1177
+ border-radius: 2px;
1178
+ transform: translateY(-50%);
1179
+ cursor: grab;
1180
+ }
1181
+
1182
+ .pv-range-selection:active {
1183
+ cursor: grabbing;
1184
+ }
1185
+
1186
+ .pv-range-handle {
1187
+ position: absolute;
1188
+ top: 50%;
1189
+ width: 16px;
1190
+ height: 16px;
1191
+ background: var(--primary-color);
1192
+ border: 2px solid var(--text-color);
1193
+ border-radius: 50%;
1194
+ transform: translate(-50%, -50%);
1195
+ cursor: ew-resize;
1196
+ transition: transform 120ms ease, box-shadow 120ms ease;
1197
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
1198
+ }
1199
+
1200
+ .pv-range-handle:hover {
1201
+ transform: translate(-50%, -50%) scale(1.15);
1202
+ box-shadow: 0 4px 12px var(--primary-color);
1203
+ }
1204
+
1205
+ .pv-range-labels {
1206
+ display: flex;
1207
+ justify-content: space-between;
1208
+ font-size: 0.75rem;
1209
+ color: var(--text-color-secondary);
1210
+ font-variant-numeric: tabular-nums;
1211
+ }
1212
+
1213
+ .pv-range-clear {
1214
+ margin-top: 0.75rem;
1215
+ appearance: none;
1216
+ border: none;
1217
+ border-radius: 0.55rem;
1218
+ padding: 0.4rem 0.75rem;
1219
+ background: var(--highlight-bg);
1220
+ color: var(--text-color);
1221
+ font-size: 0.72rem;
1222
+ text-transform: uppercase;
1223
+ letter-spacing: 0.08em;
1224
+ cursor: pointer;
1225
+ width: 100%;
1226
+ }
1227
+
1228
+ .pv-range-clear:hover {
1229
+ background: var(--surface-hover);
1230
+ }
1231
+
1232
+ @media (max-width: 900px) {
1233
+ .pv-filter-panel {
1234
+ width: calc(100% - 2.5rem);
1235
+ left: 1.25rem;
1236
+ right: 1.25rem;
1237
+ top: 1.25rem;
1238
+ max-height: calc(100vh - 2.5rem);
1239
+ }
1240
+
1241
+ .pv-toolbar {
1242
+ flex-wrap: wrap;
1243
+ gap: 1rem;
1244
+ }
1245
+
1246
+ .pv-toolbar-right {
1247
+ flex-wrap: wrap;
1248
+ gap: 1rem;
1249
+ }
1250
+
1251
+ .pv-view-toggle {
1252
+ order: -1;
1253
+ }
1254
+
1255
+ .pv-groups {
1256
+ padding: 1.5rem;
1257
+ }
1258
+ }