@smallwebco/tinypivot-react 1.0.9 → 1.0.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 (2) hide show
  1. package/dist/style.css +1727 -19
  2. package/package.json +2 -2
package/dist/style.css CHANGED
@@ -1,34 +1,26 @@
1
1
  /**
2
- * TinyPivot - Base Styles
3
- * Import this file in your app: import 'tinypivot/style.css'
2
+ * TinyPivot - Shared Styles
3
+ * Import this file in your app: import '@smallwebco/tinypivot-react/style.css'
4
4
  */
5
5
 
6
- /* Reset and Base */
6
+ /* ==========================================================================
7
+ Reset and Base
8
+ ========================================================================== */
7
9
  .vpg-data-grid *,
8
10
  .vpg-data-grid *::before,
9
- .vpg-data-grid *::after {
10
- box-sizing: border-box;
11
- }
12
-
11
+ .vpg-data-grid *::after,
13
12
  .vpg-pivot-config *,
14
13
  .vpg-pivot-config *::before,
15
- .vpg-pivot-config *::after {
16
- box-sizing: border-box;
17
- }
18
-
14
+ .vpg-pivot-config *::after,
19
15
  .vpg-pivot-skeleton *,
20
16
  .vpg-pivot-skeleton *::before,
21
- .vpg-pivot-skeleton *::after {
22
- box-sizing: border-box;
23
- }
24
-
17
+ .vpg-pivot-skeleton *::after,
25
18
  .vpg-filter-dropdown *,
26
19
  .vpg-filter-dropdown *::before,
27
20
  .vpg-filter-dropdown *::after {
28
21
  box-sizing: border-box;
29
22
  }
30
23
 
31
- /* Base font */
32
24
  .vpg-data-grid,
33
25
  .vpg-pivot-config,
34
26
  .vpg-pivot-skeleton,
@@ -39,7 +31,6 @@
39
31
  -moz-osx-font-smoothing: grayscale;
40
32
  }
41
33
 
42
- /* Focus visible for accessibility */
43
34
  .vpg-data-grid :focus-visible,
44
35
  .vpg-pivot-config :focus-visible,
45
36
  .vpg-pivot-skeleton :focus-visible,
@@ -48,7 +39,6 @@
48
39
  outline-offset: 2px;
49
40
  }
50
41
 
51
- /* Button reset */
52
42
  .vpg-data-grid button,
53
43
  .vpg-pivot-config button,
54
44
  .vpg-pivot-skeleton button,
@@ -56,7 +46,6 @@
56
46
  font-family: inherit;
57
47
  }
58
48
 
59
- /* Input reset */
60
49
  .vpg-data-grid input,
61
50
  .vpg-pivot-config input,
62
51
  .vpg-pivot-skeleton input,
@@ -68,3 +57,1722 @@
68
57
  font-family: inherit;
69
58
  }
70
59
 
60
+ /* ==========================================================================
61
+ Icons
62
+ ========================================================================== */
63
+ .vpg-icon { width: 1rem; height: 1rem; }
64
+ .vpg-icon-sm { width: 0.875rem; height: 0.875rem; }
65
+ .vpg-icon-xs { width: 0.75rem; height: 0.75rem; }
66
+ .vpg-icon-lg { width: 3rem; height: 3rem; }
67
+
68
+ /* ==========================================================================
69
+ DataGrid Container
70
+ ========================================================================== */
71
+ .vpg-data-grid {
72
+ display: flex;
73
+ flex-direction: column;
74
+ background: white;
75
+ border-radius: 0.5rem;
76
+ overflow: hidden;
77
+ border: 1px solid #e2e8f0;
78
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
79
+ margin-bottom: 1.5rem;
80
+ position: relative;
81
+ }
82
+
83
+ /* ==========================================================================
84
+ Toolbar
85
+ ========================================================================== */
86
+ .vpg-toolbar {
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: space-between;
90
+ padding: 0.5rem 1rem;
91
+ background: #f8fafc;
92
+ border-bottom: 1px solid #e2e8f0;
93
+ }
94
+
95
+ .vpg-toolbar-left,
96
+ .vpg-toolbar-right {
97
+ display: flex;
98
+ align-items: center;
99
+ gap: 0.5rem;
100
+ }
101
+
102
+ .vpg-toolbar-left { gap: 1rem; }
103
+
104
+ /* View Toggle */
105
+ .vpg-view-toggle {
106
+ display: flex;
107
+ background: white;
108
+ border-radius: 0.5rem;
109
+ border: 1px solid #e2e8f0;
110
+ overflow: hidden;
111
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
112
+ }
113
+
114
+ .vpg-view-btn {
115
+ display: flex;
116
+ align-items: center;
117
+ gap: 0.375rem;
118
+ padding: 0.375rem 0.75rem;
119
+ font-size: 0.75rem;
120
+ font-weight: 500;
121
+ color: #64748b;
122
+ background: transparent;
123
+ border: none;
124
+ cursor: pointer;
125
+ transition: all 0.15s;
126
+ }
127
+
128
+ .vpg-view-btn:hover { background: #f8fafc; }
129
+ .vpg-view-btn.active {
130
+ background: #4f46e5;
131
+ color: white;
132
+ box-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.1);
133
+ }
134
+ .vpg-view-btn.vpg-pivot-btn.active { background: #10b981; }
135
+
136
+ /* Font Size Control */
137
+ .vpg-font-size-control {
138
+ display: flex;
139
+ align-items: center;
140
+ gap: 0.5rem;
141
+ }
142
+
143
+ .vpg-label {
144
+ font-size: 0.75rem;
145
+ color: #64748b;
146
+ }
147
+
148
+ .vpg-font-size-toggle {
149
+ display: flex;
150
+ background: white;
151
+ border-radius: 0.25rem;
152
+ border: 1px solid #e2e8f0;
153
+ overflow: hidden;
154
+ }
155
+
156
+ .vpg-font-size-btn {
157
+ padding: 0.25rem 0.5rem;
158
+ font-size: 0.75rem;
159
+ font-weight: 500;
160
+ color: #64748b;
161
+ background: transparent;
162
+ border: none;
163
+ cursor: pointer;
164
+ transition: all 0.15s;
165
+ }
166
+
167
+ .vpg-font-size-btn:hover { background: #f1f5f9; }
168
+ .vpg-font-size-btn.active { background: #4f46e5; color: white; }
169
+
170
+ /* Filter Info */
171
+ .vpg-filter-info {
172
+ display: flex;
173
+ align-items: center;
174
+ gap: 0.5rem;
175
+ font-size: 0.875rem;
176
+ color: #475569;
177
+ }
178
+
179
+ .vpg-filter-info svg { color: #4f46e5; }
180
+
181
+ /* Search */
182
+ .vpg-search-container { display: flex; align-items: center; }
183
+
184
+ .vpg-icon-btn {
185
+ display: flex;
186
+ align-items: center;
187
+ justify-content: center;
188
+ padding: 0.375rem;
189
+ background: transparent;
190
+ border: none;
191
+ border-radius: 0.375rem;
192
+ color: #64748b;
193
+ cursor: pointer;
194
+ transition: all 0.15s;
195
+ }
196
+
197
+ .vpg-icon-btn:hover { background: #f1f5f9; color: #475569; }
198
+
199
+ .vpg-search-box {
200
+ display: flex;
201
+ align-items: center;
202
+ gap: 0.375rem;
203
+ padding: 0.375rem 0.625rem;
204
+ background: #f8fafc;
205
+ border: 1px solid transparent;
206
+ border-radius: 0.5rem;
207
+ transition: all 0.15s ease;
208
+ }
209
+
210
+ .vpg-search-box:focus-within {
211
+ background: white;
212
+ border-color: #e2e8f0;
213
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.05);
214
+ }
215
+
216
+ .vpg-search-icon {
217
+ width: 1rem;
218
+ height: 1rem;
219
+ color: #94a3b8;
220
+ flex-shrink: 0;
221
+ }
222
+
223
+ .vpg-search-input {
224
+ border: none;
225
+ outline: none;
226
+ background: transparent;
227
+ font-size: 0.8125rem;
228
+ color: #334155;
229
+ width: 200px;
230
+ }
231
+
232
+ .vpg-search-input::-moz-placeholder { color: #94a3b8; }
233
+
234
+ .vpg-search-input::placeholder { color: #94a3b8; }
235
+
236
+ .vpg-search-clear {
237
+ display: flex;
238
+ align-items: center;
239
+ justify-content: center;
240
+ padding: 0.125rem;
241
+ background: #f1f5f9;
242
+ border: none;
243
+ border-radius: 50%;
244
+ color: #64748b;
245
+ cursor: pointer;
246
+ }
247
+
248
+ .vpg-search-clear:hover { background: #e2e8f0; color: #475569; }
249
+
250
+ .vpg-search-info {
251
+ font-size: 0.75rem;
252
+ color: #64748b;
253
+ font-style: italic;
254
+ }
255
+
256
+ /* Buttons */
257
+ .vpg-clear-filters {
258
+ display: flex;
259
+ align-items: center;
260
+ gap: 0.375rem;
261
+ padding: 0.375rem 0.75rem;
262
+ font-size: 0.875rem;
263
+ font-weight: 500;
264
+ color: #475569;
265
+ background: white;
266
+ border: 1px solid #e2e8f0;
267
+ border-radius: 0.375rem;
268
+ cursor: pointer;
269
+ transition: all 0.15s;
270
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
271
+ }
272
+
273
+ .vpg-clear-filters:hover { background: #f8fafc; border-color: #cbd5e1; }
274
+
275
+ .vpg-export-btn {
276
+ display: flex;
277
+ align-items: center;
278
+ gap: 0.375rem;
279
+ padding: 0.375rem 0.75rem;
280
+ font-size: 0.75rem;
281
+ font-weight: 500;
282
+ color: #059669;
283
+ background: #ecfdf5;
284
+ border: 1px solid #a7f3d0;
285
+ border-radius: 0.375rem;
286
+ cursor: pointer;
287
+ transition: all 0.15s;
288
+ }
289
+
290
+ .vpg-export-btn:hover { background: #d1fae5; border-color: #6ee7b7; }
291
+
292
+ .vpg-config-toggle {
293
+ display: flex;
294
+ align-items: center;
295
+ gap: 0.375rem;
296
+ padding: 0.375rem 0.75rem;
297
+ font-size: 0.75rem;
298
+ font-weight: 500;
299
+ border-radius: 0.375rem;
300
+ background: white;
301
+ border: 1px solid #e2e8f0;
302
+ color: #475569;
303
+ cursor: pointer;
304
+ transition: all 0.15s;
305
+ }
306
+
307
+ .vpg-config-toggle:hover { background: #f8fafc; }
308
+ .vpg-config-toggle.active {
309
+ background: #ecfdf5;
310
+ border-color: #a7f3d0;
311
+ color: #059669;
312
+ }
313
+
314
+ .vpg-pivot-status {
315
+ display: flex;
316
+ align-items: center;
317
+ gap: 0.5rem;
318
+ font-size: 0.875rem;
319
+ color: #059669;
320
+ }
321
+
322
+ /* ==========================================================================
323
+ Grid Container
324
+ ========================================================================== */
325
+ .vpg-grid-container {
326
+ flex: 1;
327
+ overflow: auto;
328
+ position: relative;
329
+ background: rgba(248, 250, 252, 0.3);
330
+ }
331
+
332
+ .vpg-grid-container:focus { outline: none; }
333
+
334
+ /* Loading & Empty States */
335
+ .vpg-loading {
336
+ position: absolute;
337
+ inset: 0;
338
+ display: flex;
339
+ flex-direction: column;
340
+ align-items: center;
341
+ justify-content: center;
342
+ background: rgba(255, 255, 255, 0.95);
343
+ z-index: 10;
344
+ }
345
+
346
+ .vpg-spinner {
347
+ width: 2rem;
348
+ height: 2rem;
349
+ border: 2px solid #e2e8f0;
350
+ border-top-color: #4f46e5;
351
+ border-radius: 50%;
352
+ animation: vpg-spin 1s linear infinite;
353
+ }
354
+
355
+ @keyframes vpg-spin { to { transform: rotate(360deg); } }
356
+
357
+ .vpg-loading span { margin-top: 0.5rem; font-size: 0.875rem; color: #64748b; }
358
+
359
+ .vpg-empty {
360
+ display: flex;
361
+ flex-direction: column;
362
+ align-items: center;
363
+ justify-content: center;
364
+ height: 100%;
365
+ padding: 5rem;
366
+ gap: 0.75rem;
367
+ }
368
+
369
+ .vpg-empty-icon {
370
+ width: 5rem;
371
+ height: 5rem;
372
+ border-radius: 50%;
373
+ background: #f1f5f9;
374
+ display: flex;
375
+ align-items: center;
376
+ justify-content: center;
377
+ color: #cbd5e1;
378
+ margin-bottom: 0.5rem;
379
+ }
380
+
381
+ .vpg-empty-icon.vpg-warning { background: #fef3c7; color: #fcd34d; }
382
+ .vpg-empty span { color: #64748b; font-weight: 500; }
383
+
384
+ .vpg-clear-link {
385
+ color: #4f46e5;
386
+ font-size: 0.875rem;
387
+ font-weight: 500;
388
+ margin-top: 0.25rem;
389
+ background: transparent;
390
+ border: none;
391
+ cursor: pointer;
392
+ }
393
+
394
+ .vpg-clear-link:hover { text-decoration: underline; }
395
+
396
+ /* ==========================================================================
397
+ Table
398
+ ========================================================================== */
399
+ .vpg-table-wrapper { min-height: 100%; }
400
+
401
+ .vpg-table {
402
+ width: 100%;
403
+ border-collapse: separate;
404
+ border-spacing: 0;
405
+ }
406
+
407
+ .vpg-header-cell {
408
+ position: sticky;
409
+ top: 0;
410
+ z-index: 10;
411
+ padding: 0.75rem 1rem;
412
+ text-align: left;
413
+ cursor: pointer;
414
+ -webkit-user-select: none;
415
+ -moz-user-select: none;
416
+ user-select: none;
417
+ background: white;
418
+ transition: all 0.15s;
419
+ border-bottom: 1px solid #e2e8f0;
420
+ border-right: 1px solid #f1f5f9;
421
+ }
422
+
423
+ .vpg-header-cell:hover { background: #f8fafc; }
424
+ .vpg-header-cell:last-child { border-right: none; }
425
+ .vpg-header-cell.vpg-has-filter { background: rgba(238, 242, 255, 0.7); }
426
+ .vpg-header-cell.vpg-is-sorted { background: rgba(239, 246, 255, 0.7); }
427
+ .vpg-header-cell.vpg-has-filter.vpg-is-sorted { background: rgba(237, 233, 254, 0.7); }
428
+ .vpg-header-cell.vpg-is-active {
429
+ background: #e0e7ff;
430
+ box-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.1);
431
+ }
432
+
433
+ .vpg-header-content {
434
+ display: flex;
435
+ align-items: center;
436
+ justify-content: space-between;
437
+ gap: 0.5rem;
438
+ }
439
+
440
+ .vpg-header-text {
441
+ font-size: 0.75rem;
442
+ font-weight: 600;
443
+ color: #475569;
444
+ text-transform: uppercase;
445
+ letter-spacing: 0.05em;
446
+ overflow: hidden;
447
+ text-overflow: ellipsis;
448
+ white-space: nowrap;
449
+ }
450
+
451
+ .vpg-header-icons {
452
+ display: flex;
453
+ align-items: center;
454
+ gap: 0.25rem;
455
+ flex-shrink: 0;
456
+ }
457
+
458
+ .vpg-sort-indicator { color: #3b82f6; }
459
+ .vpg-filter-indicator { color: #4f46e5; }
460
+
461
+ .vpg-dropdown-arrow {
462
+ padding: 0.125rem;
463
+ border-radius: 0.25rem;
464
+ color: #cbd5e1;
465
+ transition: all 0.15s;
466
+ cursor: pointer;
467
+ }
468
+
469
+ .vpg-dropdown-arrow:hover { background: #e2e8f0; color: #475569; }
470
+ .vpg-header-cell:hover .vpg-dropdown-arrow { color: #94a3b8; }
471
+
472
+ /* Resize Handle */
473
+ .vpg-resize-handle {
474
+ position: absolute;
475
+ right: 0;
476
+ top: 0;
477
+ bottom: 0;
478
+ width: 6px;
479
+ cursor: col-resize;
480
+ background: transparent;
481
+ transition: background 0.15s;
482
+ }
483
+
484
+ .vpg-resize-handle:hover { background: rgba(79, 70, 229, 0.3); }
485
+ .vpg-header-cell { position: relative; }
486
+ .vpg-data-grid.vpg-resizing { cursor: col-resize; -webkit-user-select: none; -moz-user-select: none; user-select: none; }
487
+ .vpg-data-grid.vpg-resizing .vpg-resize-handle { background: rgba(79, 70, 229, 0.3); }
488
+
489
+ /* Rows */
490
+ .vpg-row { transition: background 0.15s; }
491
+ .vpg-row:nth-child(odd) { background: white; }
492
+ .vpg-row:nth-child(even) { background: rgba(248, 250, 252, 0.5); }
493
+ .vpg-row:hover { background: rgba(239, 246, 255, 0.4); }
494
+
495
+ /* Cells */
496
+ .vpg-cell {
497
+ padding: 0.625rem 1rem;
498
+ font-size: 0.875rem;
499
+ color: #334155;
500
+ overflow: hidden;
501
+ text-overflow: ellipsis;
502
+ white-space: nowrap;
503
+ cursor: cell;
504
+ transition: all 0.15s;
505
+ max-width: 350px;
506
+ border-bottom: 1px solid #f1f5f9;
507
+ border-right: 1px solid #f8fafc;
508
+ }
509
+
510
+ .vpg-cell:last-child { border-right: none; }
511
+
512
+ .vpg-cell.vpg-selected {
513
+ background: rgba(224, 231, 255, 0.8);
514
+ outline: 2px solid #818cf8;
515
+ outline-offset: -2px;
516
+ position: relative;
517
+ z-index: 1;
518
+ }
519
+
520
+ .vpg-cell.vpg-is-number {
521
+ text-align: right;
522
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
523
+ color: #334155;
524
+ font-variant-numeric: tabular-nums;
525
+ }
526
+
527
+ /* Font size variations */
528
+ .vpg-data-grid.vpg-font-xs .vpg-cell { font-size: 0.75rem; padding: 0.375rem 0.75rem; }
529
+ .vpg-data-grid.vpg-font-xs .vpg-header-text { font-size: 0.625rem; }
530
+ .vpg-data-grid.vpg-font-sm .vpg-cell { font-size: 0.875rem; padding: 0.5rem 1rem; }
531
+ .vpg-data-grid.vpg-font-base .vpg-cell { font-size: 1rem; padding: 0.625rem 1rem; }
532
+ .vpg-data-grid.vpg-font-base .vpg-header-text { font-size: 0.75rem; }
533
+
534
+ /* Striped rows (toggleable) */
535
+ .vpg-data-grid:not(.vpg-striped) .vpg-row:nth-child(even) { background: inherit; }
536
+
537
+ /* ==========================================================================
538
+ Footer
539
+ ========================================================================== */
540
+ .vpg-footer {
541
+ display: flex;
542
+ align-items: center;
543
+ justify-content: space-between;
544
+ padding: 0.75rem 1rem;
545
+ background: rgba(248, 250, 252, 0.8);
546
+ border-top: 1px solid rgba(226, 232, 240, 0.8);
547
+ font-size: 0.875rem;
548
+ }
549
+
550
+ .vpg-footer-left {
551
+ display: flex;
552
+ align-items: center;
553
+ color: #64748b;
554
+ }
555
+
556
+ .vpg-filtered-count { color: #4f46e5; font-weight: 500; }
557
+ .vpg-separator { color: #94a3b8; margin: 0 0.25rem; }
558
+ .vpg-pivot-label { color: #10b981; font-weight: 500; }
559
+ .vpg-footer-right { display: flex; align-items: center; gap: 1rem; }
560
+ .vpg-filtered-note { font-size: 0.75rem; color: #94a3b8; margin-left: 0.25rem; }
561
+
562
+ /* Selection Stats */
563
+ .vpg-selection-stats {
564
+ display: flex;
565
+ align-items: center;
566
+ gap: 0.5rem;
567
+ padding: 0.25rem 0.75rem;
568
+ background: #eef2ff;
569
+ border-radius: 0.375rem;
570
+ border: 1px solid #c7d2fe;
571
+ }
572
+
573
+ .vpg-stat { display: flex; align-items: center; gap: 0.375rem; }
574
+ .vpg-stat-label { font-size: 0.75rem; color: #4f46e5; font-weight: 500; }
575
+ .vpg-stat-value { font-size: 0.75rem; color: #1e1b4b; font-weight: 600; font-variant-numeric: tabular-nums; }
576
+ .vpg-stat-divider { color: #c7d2fe; }
577
+
578
+ /* Watermark */
579
+ .vpg-watermark-inline a {
580
+ font-size: 0.75rem;
581
+ color: #94a3b8;
582
+ text-decoration: none;
583
+ transition: color 0.15s;
584
+ }
585
+
586
+ .vpg-watermark-inline a:hover { color: #64748b; }
587
+
588
+ /* Demo Banner */
589
+ .vpg-demo-banner {
590
+ display: flex;
591
+ align-items: center;
592
+ gap: 0.5rem;
593
+ padding: 0.25rem 0.75rem;
594
+ background: linear-gradient(135deg, #fef3c7, #fde68a);
595
+ border: 1px solid #fcd34d;
596
+ border-radius: 0.375rem;
597
+ font-size: 0.75rem;
598
+ color: #92400e;
599
+ }
600
+
601
+ .vpg-demo-badge {
602
+ display: inline-flex;
603
+ padding: 0.125rem 0.375rem;
604
+ background: #f59e0b;
605
+ color: white;
606
+ font-size: 0.625rem;
607
+ font-weight: 700;
608
+ border-radius: 0.25rem;
609
+ letter-spacing: 0.05em;
610
+ }
611
+
612
+ .vpg-demo-banner a { font-weight: 600; color: #d97706; text-decoration: none; }
613
+ .vpg-demo-banner a:hover { color: #b45309; text-decoration: underline; }
614
+
615
+ /* ==========================================================================
616
+ Pagination
617
+ ========================================================================== */
618
+ .vpg-pagination { display: flex; align-items: center; gap: 0.25rem; }
619
+
620
+ .vpg-page-btn {
621
+ display: flex;
622
+ align-items: center;
623
+ justify-content: center;
624
+ width: 28px;
625
+ height: 28px;
626
+ background: white;
627
+ border: 1px solid #e2e8f0;
628
+ border-radius: 0.25rem;
629
+ color: #475569;
630
+ cursor: pointer;
631
+ transition: all 0.15s;
632
+ }
633
+
634
+ .vpg-page-btn:hover:not(:disabled) { background: #f8fafc; border-color: #cbd5e1; }
635
+ .vpg-page-btn:disabled { opacity: 0.5; cursor: not-allowed; }
636
+ .vpg-page-info { font-size: 0.75rem; color: #64748b; padding: 0 0.5rem; }
637
+
638
+ /* ==========================================================================
639
+ Toast
640
+ ========================================================================== */
641
+ .vpg-toast {
642
+ position: absolute;
643
+ top: 1rem;
644
+ right: 1rem;
645
+ display: flex;
646
+ align-items: center;
647
+ gap: 0.5rem;
648
+ padding: 0.5rem 1rem;
649
+ background: #10b981;
650
+ color: white;
651
+ border-radius: 0.5rem;
652
+ font-size: 0.875rem;
653
+ font-weight: 500;
654
+ box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);
655
+ z-index: 100;
656
+ }
657
+
658
+ /* ==========================================================================
659
+ Vertical Resize
660
+ ========================================================================== */
661
+ .vpg-vertical-resize-handle {
662
+ position: absolute;
663
+ bottom: 0;
664
+ left: 0;
665
+ right: 0;
666
+ height: 8px;
667
+ cursor: row-resize;
668
+ background: transparent;
669
+ display: flex;
670
+ align-items: center;
671
+ justify-content: center;
672
+ z-index: 10;
673
+ transition: background 0.15s;
674
+ }
675
+
676
+ .vpg-vertical-resize-handle:hover { background: rgba(79, 70, 229, 0.1); }
677
+ .vpg-vertical-resize-handle:hover .vpg-resize-grip span { background: rgba(79, 70, 229, 0.6); }
678
+
679
+ .vpg-resize-grip { display: flex; gap: 2px; padding: 2px 8px; border-radius: 4px; }
680
+ .vpg-resize-grip span {
681
+ width: 16px;
682
+ height: 2px;
683
+ background: #cbd5e1;
684
+ border-radius: 1px;
685
+ transition: background 0.15s;
686
+ }
687
+
688
+ .vpg-data-grid.vpg-resizing-vertical { cursor: row-resize; -webkit-user-select: none; -moz-user-select: none; user-select: none; }
689
+ .vpg-data-grid.vpg-resizing-vertical .vpg-vertical-resize-handle { background: rgba(79, 70, 229, 0.15); }
690
+ .vpg-data-grid.vpg-resizing-vertical .vpg-resize-grip span { background: rgba(79, 70, 229, 0.8); }
691
+
692
+ /* ==========================================================================
693
+ Scrollbar
694
+ ========================================================================== */
695
+ .vpg-grid-container::-webkit-scrollbar { width: 0.625rem; height: 0.625rem; }
696
+ .vpg-grid-container::-webkit-scrollbar-track { background: rgba(241, 245, 249, 0.5); }
697
+ .vpg-grid-container::-webkit-scrollbar-thumb { background: rgba(203, 213, 225, 0.8); border-radius: 9999px; }
698
+ .vpg-grid-container::-webkit-scrollbar-thumb:hover { background: rgba(148, 163, 184, 0.8); }
699
+ .vpg-grid-container::-webkit-scrollbar-corner { background: rgba(241, 245, 249, 0.5); }
700
+
701
+ /* ==========================================================================
702
+ Pivot Container
703
+ ========================================================================== */
704
+ .vpg-pivot-container {
705
+ display: flex;
706
+ flex: 1;
707
+ gap: 1rem;
708
+ overflow: hidden;
709
+ min-height: 0;
710
+ padding: 1rem;
711
+ }
712
+
713
+ .vpg-pivot-config-panel {
714
+ width: 14rem;
715
+ flex-shrink: 0;
716
+ overflow: hidden;
717
+ }
718
+
719
+ .vpg-pivot-main {
720
+ flex: 1;
721
+ min-width: 0;
722
+ min-height: 0;
723
+ overflow: hidden;
724
+ }
725
+
726
+ .vpg-pivot-main.vpg-full-width { width: 100%; }
727
+
728
+ /* ==========================================================================
729
+ Filter Dropdown
730
+ ========================================================================== */
731
+ .vpg-filter-dropdown {
732
+ background: white;
733
+ border-radius: 0.375rem;
734
+ box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
735
+ border: 1px solid #e2e8f0;
736
+ min-width: 220px;
737
+ max-width: 280px;
738
+ max-height: calc(100vh - 100px);
739
+ overflow: hidden;
740
+ display: flex;
741
+ flex-direction: column;
742
+ }
743
+
744
+ .vpg-filter-header {
745
+ display: flex;
746
+ align-items: center;
747
+ justify-content: space-between;
748
+ padding: 0.625rem;
749
+ background: #f8fafc;
750
+ border-bottom: 1px solid #e2e8f0;
751
+ border-radius: 0.375rem 0.375rem 0 0;
752
+ }
753
+
754
+ .vpg-filter-title {
755
+ font-size: 0.75rem;
756
+ font-weight: 600;
757
+ color: #1e293b;
758
+ overflow: hidden;
759
+ text-overflow: ellipsis;
760
+ white-space: nowrap;
761
+ }
762
+
763
+ .vpg-filter-count { font-size: 0.625rem; color: #64748b; }
764
+
765
+ .vpg-sort-controls {
766
+ display: flex;
767
+ gap: 0.25rem;
768
+ padding: 0.5rem;
769
+ background: #f8fafc;
770
+ }
771
+
772
+ .vpg-sort-btn {
773
+ display: flex;
774
+ align-items: center;
775
+ gap: 0.25rem;
776
+ padding: 0.25rem 0.5rem;
777
+ font-size: 0.6875rem;
778
+ font-weight: 500;
779
+ border-radius: 0.25rem;
780
+ color: #475569;
781
+ background: transparent;
782
+ border: none;
783
+ cursor: pointer;
784
+ transition: all 0.15s;
785
+ }
786
+
787
+ .vpg-sort-btn:hover { background: #e2e8f0; }
788
+ .vpg-sort-btn.active { background: #e0e7ff; color: #4338ca; }
789
+
790
+ .vpg-divider { height: 1px; background: #e2e8f0; }
791
+
792
+ .vpg-filter-dropdown .vpg-search-container {
793
+ position: relative;
794
+ padding: 0.375rem 0.5rem;
795
+ }
796
+
797
+ .vpg-filter-dropdown .vpg-search-icon {
798
+ position: absolute;
799
+ left: 0.875rem;
800
+ top: 50%;
801
+ transform: translateY(-50%);
802
+ width: 0.875rem;
803
+ height: 0.875rem;
804
+ color: #94a3b8;
805
+ }
806
+
807
+ .vpg-filter-dropdown .vpg-search-input {
808
+ width: 100%;
809
+ padding: 0.25rem 1.5rem 0.25rem 1.75rem;
810
+ font-size: 0.75rem;
811
+ border: 1px solid #cbd5e1;
812
+ border-radius: 0.25rem;
813
+ outline: none;
814
+ }
815
+
816
+ .vpg-filter-dropdown .vpg-search-input:focus {
817
+ border-color: #6366f1;
818
+ box-shadow: 0 0 0 1px #6366f1;
819
+ }
820
+
821
+ .vpg-clear-search {
822
+ position: absolute;
823
+ right: 0.875rem;
824
+ top: 50%;
825
+ transform: translateY(-50%);
826
+ width: 1rem;
827
+ height: 1rem;
828
+ display: flex;
829
+ align-items: center;
830
+ justify-content: center;
831
+ color: #94a3b8;
832
+ font-size: 0.875rem;
833
+ line-height: 1;
834
+ background: transparent;
835
+ border: none;
836
+ cursor: pointer;
837
+ }
838
+
839
+ .vpg-clear-search:hover { color: #475569; }
840
+
841
+ .vpg-bulk-actions {
842
+ display: flex;
843
+ gap: 0.375rem;
844
+ padding: 0.25rem 0.5rem;
845
+ border-bottom: 1px solid #f1f5f9;
846
+ }
847
+
848
+ .vpg-bulk-btn {
849
+ display: flex;
850
+ align-items: center;
851
+ gap: 0.125rem;
852
+ padding: 0.125rem 0.375rem;
853
+ font-size: 0.625rem;
854
+ font-weight: 500;
855
+ color: #475569;
856
+ background: transparent;
857
+ border: none;
858
+ border-radius: 0.25rem;
859
+ cursor: pointer;
860
+ transition: all 0.15s;
861
+ }
862
+
863
+ .vpg-bulk-btn:hover { color: #4f46e5; background: #eef2ff; }
864
+
865
+ .vpg-values-list {
866
+ max-height: 200px;
867
+ overflow-y: auto;
868
+ padding: 0.125rem 0.25rem;
869
+ flex: 1;
870
+ min-height: 0;
871
+ }
872
+
873
+ .vpg-value-item {
874
+ display: flex;
875
+ align-items: center;
876
+ gap: 0.375rem;
877
+ padding: 0.25rem 0.375rem;
878
+ border-radius: 0.25rem;
879
+ cursor: pointer;
880
+ transition: background 0.15s;
881
+ }
882
+
883
+ .vpg-value-item:hover { background: #f1f5f9; }
884
+ .vpg-value-item.selected { background: #eef2ff; }
885
+
886
+ .vpg-value-checkbox {
887
+ width: 0.875rem;
888
+ height: 0.875rem;
889
+ accent-color: #4f46e5;
890
+ border-radius: 0.25rem;
891
+ }
892
+
893
+ .vpg-value-text {
894
+ font-size: 0.75rem;
895
+ color: #334155;
896
+ overflow: hidden;
897
+ text-overflow: ellipsis;
898
+ white-space: nowrap;
899
+ flex: 1;
900
+ }
901
+
902
+ .vpg-value-text.vpg-blank { font-style: italic; color: #94a3b8; }
903
+
904
+ .vpg-no-results {
905
+ text-align: center;
906
+ padding: 0.75rem;
907
+ font-size: 0.75rem;
908
+ color: #94a3b8;
909
+ }
910
+
911
+ .vpg-filter-footer {
912
+ display: flex;
913
+ justify-content: space-between;
914
+ align-items: center;
915
+ padding: 0.5rem 0.625rem;
916
+ background: #f8fafc;
917
+ border-top: 1px solid #e2e8f0;
918
+ border-radius: 0 0 0.375rem 0.375rem;
919
+ }
920
+
921
+ .vpg-btn-clear {
922
+ padding: 0.25rem 0.5rem;
923
+ font-size: 0.75rem;
924
+ font-weight: 500;
925
+ color: #475569;
926
+ background: transparent;
927
+ border: none;
928
+ border-radius: 0.25rem;
929
+ cursor: pointer;
930
+ transition: all 0.15s;
931
+ }
932
+
933
+ .vpg-btn-clear:hover { background: #e2e8f0; color: #1e293b; }
934
+
935
+ .vpg-btn-apply {
936
+ padding: 0.25rem 0.75rem;
937
+ font-size: 0.75rem;
938
+ font-weight: 500;
939
+ color: white;
940
+ background: #4f46e5;
941
+ border: none;
942
+ border-radius: 0.25rem;
943
+ cursor: pointer;
944
+ transition: all 0.15s;
945
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
946
+ }
947
+
948
+ .vpg-btn-apply:hover { background: #4338ca; }
949
+
950
+ /* ==========================================================================
951
+ Pivot Config Panel
952
+ ========================================================================== */
953
+ .vpg-pivot-config {
954
+ background: white;
955
+ border: 1px solid #e2e8f0;
956
+ border-radius: 0.5rem;
957
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
958
+ overflow: hidden;
959
+ height: 100%;
960
+ display: flex;
961
+ flex-direction: column;
962
+ }
963
+
964
+ .vpg-config-header {
965
+ display: flex;
966
+ align-items: center;
967
+ justify-content: space-between;
968
+ padding: 0.5rem 0.75rem;
969
+ background: #f8fafc;
970
+ border-bottom: 1px solid #e2e8f0;
971
+ flex-shrink: 0;
972
+ }
973
+
974
+ .vpg-config-title {
975
+ display: flex;
976
+ align-items: center;
977
+ gap: 0.375rem;
978
+ font-size: 0.75rem;
979
+ font-weight: 600;
980
+ color: #475569;
981
+ text-transform: uppercase;
982
+ letter-spacing: 0.05em;
983
+ }
984
+
985
+ .vpg-header-actions { display: flex; align-items: center; gap: 0.25rem; }
986
+
987
+ .vpg-action-btn {
988
+ padding: 0.375rem;
989
+ border-radius: 0.25rem;
990
+ background: transparent;
991
+ border: none;
992
+ cursor: pointer;
993
+ transition: all 0.15s;
994
+ }
995
+
996
+ .vpg-clear-btn { color: #94a3b8; }
997
+ .vpg-clear-btn:hover { background: #fee2e2; color: #ef4444; }
998
+
999
+ .vpg-section-label {
1000
+ font-size: 0.625rem;
1001
+ font-weight: 700;
1002
+ color: #94a3b8;
1003
+ text-transform: uppercase;
1004
+ letter-spacing: 0.1em;
1005
+ padding: 0.25rem 0.5rem;
1006
+ }
1007
+
1008
+ .vpg-section-label .vpg-count { color: #cbd5e1; margin-left: 0.25rem; }
1009
+
1010
+ .vpg-assigned-section {
1011
+ border-bottom: 1px solid #e2e8f0;
1012
+ background: linear-gradient(to bottom, #f8fafc, white);
1013
+ padding-bottom: 0.5rem;
1014
+ flex-shrink: 0;
1015
+ }
1016
+
1017
+ .vpg-assigned-list {
1018
+ padding: 0 0.5rem;
1019
+ display: flex;
1020
+ flex-direction: column;
1021
+ gap: 0.25rem;
1022
+ }
1023
+
1024
+ .vpg-assigned-item {
1025
+ display: flex;
1026
+ align-items: center;
1027
+ justify-content: space-between;
1028
+ gap: 0.5rem;
1029
+ padding: 0.375rem 0.5rem;
1030
+ border-radius: 0.5rem;
1031
+ font-size: 0.75rem;
1032
+ cursor: grab;
1033
+ transition: all 0.15s;
1034
+ }
1035
+
1036
+ .vpg-assigned-item:active { cursor: grabbing; transform: scale(0.98); }
1037
+ .vpg-assigned-item.vpg-type-row { background: #eef2ff; border: 1px solid #c7d2fe; }
1038
+ .vpg-assigned-item.vpg-type-column { background: #f5f3ff; border: 1px solid #ddd6fe; }
1039
+ .vpg-assigned-item.vpg-type-value { background: #ecfdf5; border: 1px solid #a7f3d0; }
1040
+
1041
+ .vpg-item-main { display: flex; align-items: center; gap: 0.5rem; min-width: 0; }
1042
+
1043
+ .vpg-item-badge {
1044
+ width: 1.25rem;
1045
+ height: 1.25rem;
1046
+ display: flex;
1047
+ align-items: center;
1048
+ justify-content: center;
1049
+ font-size: 0.625rem;
1050
+ font-weight: 700;
1051
+ border-radius: 0.25rem;
1052
+ }
1053
+
1054
+ .vpg-item-badge.row { background: #c7d2fe; color: #4338ca; }
1055
+ .vpg-item-badge.column { background: #ddd6fe; color: #7c3aed; }
1056
+ .vpg-item-badge.value { background: #a7f3d0; color: #059669; }
1057
+
1058
+ .vpg-item-name {
1059
+ overflow: hidden;
1060
+ text-overflow: ellipsis;
1061
+ white-space: nowrap;
1062
+ font-weight: 500;
1063
+ color: #334155;
1064
+ }
1065
+
1066
+ .vpg-item-actions { display: flex; align-items: center; gap: 0.25rem; flex-shrink: 0; }
1067
+
1068
+ .vpg-toggle-btn {
1069
+ width: 1.25rem;
1070
+ height: 1.25rem;
1071
+ display: flex;
1072
+ align-items: center;
1073
+ justify-content: center;
1074
+ border-radius: 0.25rem;
1075
+ color: #94a3b8;
1076
+ background: transparent;
1077
+ border: none;
1078
+ cursor: pointer;
1079
+ transition: all 0.15s;
1080
+ }
1081
+
1082
+ .vpg-toggle-btn:hover { background: white; color: #475569; box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); }
1083
+
1084
+ .vpg-agg-select {
1085
+ font-size: 0.625rem;
1086
+ background: white;
1087
+ border: 1px solid #a7f3d0;
1088
+ border-radius: 0.25rem;
1089
+ padding: 0.125rem 0.25rem;
1090
+ color: #059669;
1091
+ font-weight: 500;
1092
+ min-width: 70px;
1093
+ cursor: pointer;
1094
+ }
1095
+
1096
+ .vpg-agg-select:focus { outline: none; box-shadow: 0 0 0 1px #10b981; }
1097
+
1098
+ .vpg-remove-btn {
1099
+ width: 1.25rem;
1100
+ height: 1.25rem;
1101
+ display: flex;
1102
+ align-items: center;
1103
+ justify-content: center;
1104
+ font-size: 0.875rem;
1105
+ line-height: 1;
1106
+ color: #94a3b8;
1107
+ background: transparent;
1108
+ border: none;
1109
+ border-radius: 50%;
1110
+ cursor: pointer;
1111
+ transition: all 0.15s;
1112
+ }
1113
+
1114
+ .vpg-remove-btn:hover { background: #fee2e2; color: #ef4444; }
1115
+
1116
+ .vpg-unassigned-section {
1117
+ flex: 1;
1118
+ display: flex;
1119
+ flex-direction: column;
1120
+ min-height: 0;
1121
+ overflow: hidden;
1122
+ }
1123
+
1124
+ .vpg-section-header {
1125
+ display: flex;
1126
+ align-items: center;
1127
+ justify-content: space-between;
1128
+ padding: 0 0.5rem;
1129
+ }
1130
+
1131
+ .vpg-field-search {
1132
+ position: relative;
1133
+ margin: 0 0.5rem 0.5rem;
1134
+ }
1135
+
1136
+ .vpg-field-search .vpg-search-icon {
1137
+ position: absolute;
1138
+ left: 0.5rem;
1139
+ top: 50%;
1140
+ transform: translateY(-50%);
1141
+ width: 0.875rem;
1142
+ height: 0.875rem;
1143
+ color: #94a3b8;
1144
+ pointer-events: none;
1145
+ }
1146
+
1147
+ .vpg-field-search .vpg-search-input {
1148
+ width: 100%;
1149
+ padding: 0.375rem 1.75rem 0.375rem 1.75rem;
1150
+ font-size: 0.75rem;
1151
+ border: 1px solid #e2e8f0;
1152
+ border-radius: 0.375rem;
1153
+ background: white;
1154
+ color: #334155;
1155
+ }
1156
+
1157
+ .vpg-field-search .vpg-search-input::-moz-placeholder { color: #94a3b8; }
1158
+
1159
+ .vpg-field-search .vpg-search-input::placeholder { color: #94a3b8; }
1160
+ .vpg-field-search .vpg-search-input:focus { outline: none; box-shadow: 0 0 0 1px #6366f1; border-color: #6366f1; }
1161
+
1162
+ .vpg-field-search .vpg-clear-search {
1163
+ position: absolute;
1164
+ right: 0.5rem;
1165
+ top: 50%;
1166
+ transform: translateY(-50%);
1167
+ padding: 0.125rem;
1168
+ border-radius: 0.25rem;
1169
+ color: #94a3b8;
1170
+ background: transparent;
1171
+ border: none;
1172
+ cursor: pointer;
1173
+ transition: all 0.15s;
1174
+ }
1175
+
1176
+ .vpg-field-search .vpg-clear-search:hover { background: #f1f5f9; color: #475569; }
1177
+
1178
+ .vpg-field-list {
1179
+ flex: 1;
1180
+ overflow-y: auto;
1181
+ padding: 0 0.5rem 0.5rem;
1182
+ display: flex;
1183
+ flex-direction: column;
1184
+ gap: 0.25rem;
1185
+ }
1186
+
1187
+ .vpg-field-item {
1188
+ display: flex;
1189
+ align-items: center;
1190
+ gap: 0.5rem;
1191
+ padding: 0.375rem 0.5rem;
1192
+ border-radius: 0.375rem;
1193
+ font-size: 0.75rem;
1194
+ cursor: grab;
1195
+ background: white;
1196
+ border: 1px solid #e2e8f0;
1197
+ color: #475569;
1198
+ transition: all 0.15s;
1199
+ }
1200
+
1201
+ .vpg-field-item:hover { border-color: #cbd5e1; background: #f8fafc; box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); }
1202
+ .vpg-field-item:active { cursor: grabbing; transform: scale(0.98); }
1203
+ .vpg-field-item.vpg-is-numeric { border-color: #bfdbfe; background: rgba(239, 246, 255, 0.3); }
1204
+
1205
+ .vpg-field-type-icon {
1206
+ width: 1.25rem;
1207
+ height: 1.25rem;
1208
+ display: flex;
1209
+ align-items: center;
1210
+ justify-content: center;
1211
+ font-size: 0.625rem;
1212
+ font-weight: 700;
1213
+ background: #f1f5f9;
1214
+ border-radius: 0.25rem;
1215
+ color: #64748b;
1216
+ flex-shrink: 0;
1217
+ }
1218
+
1219
+ .vpg-field-item.vpg-is-numeric .vpg-field-type-icon { background: #dbeafe; color: #2563eb; }
1220
+
1221
+ .vpg-field-name {
1222
+ flex: 1;
1223
+ overflow: hidden;
1224
+ text-overflow: ellipsis;
1225
+ white-space: nowrap;
1226
+ font-weight: 500;
1227
+ }
1228
+
1229
+ .vpg-unique-count {
1230
+ font-size: 0.625rem;
1231
+ color: #94a3b8;
1232
+ font-variant-numeric: tabular-nums;
1233
+ flex-shrink: 0;
1234
+ }
1235
+
1236
+ .vpg-empty-hint {
1237
+ font-size: 0.6875rem;
1238
+ color: #94a3b8;
1239
+ font-style: italic;
1240
+ text-align: center;
1241
+ padding: 1rem;
1242
+ }
1243
+
1244
+ .vpg-options-section {
1245
+ display: flex;
1246
+ align-items: center;
1247
+ justify-content: space-between;
1248
+ gap: 0.5rem;
1249
+ padding: 0.5rem 0.75rem;
1250
+ border-top: 1px solid #f1f5f9;
1251
+ background: rgba(248, 250, 252, 0.5);
1252
+ flex-shrink: 0;
1253
+ }
1254
+
1255
+ .vpg-option-toggle {
1256
+ display: flex;
1257
+ align-items: center;
1258
+ gap: 0.375rem;
1259
+ font-size: 0.6875rem;
1260
+ color: #64748b;
1261
+ cursor: pointer;
1262
+ -webkit-user-select: none;
1263
+ -moz-user-select: none;
1264
+ user-select: none;
1265
+ }
1266
+
1267
+ .vpg-option-toggle input {
1268
+ width: 0.875rem;
1269
+ height: 0.875rem;
1270
+ border-radius: 0.25rem;
1271
+ accent-color: #10b981;
1272
+ cursor: pointer;
1273
+ }
1274
+
1275
+ .vpg-auto-btn {
1276
+ display: flex;
1277
+ align-items: center;
1278
+ gap: 0.25rem;
1279
+ padding: 0.25rem 0.5rem;
1280
+ font-size: 0.6875rem;
1281
+ font-weight: 500;
1282
+ border-radius: 0.25rem;
1283
+ background: #ecfdf5;
1284
+ color: #059669;
1285
+ border: 1px solid #a7f3d0;
1286
+ cursor: pointer;
1287
+ transition: all 0.15s;
1288
+ }
1289
+
1290
+ .vpg-auto-btn:hover { background: #d1fae5; }
1291
+
1292
+ .vpg-pivot-config .vpg-watermark {
1293
+ padding: 0.375rem 0.75rem;
1294
+ background: #f1f5f9;
1295
+ border-top: 1px solid #e2e8f0;
1296
+ text-align: center;
1297
+ flex-shrink: 0;
1298
+ }
1299
+
1300
+ .vpg-pivot-config .vpg-watermark a {
1301
+ font-size: 0.625rem;
1302
+ color: #94a3b8;
1303
+ text-decoration: none;
1304
+ transition: color 0.15s;
1305
+ }
1306
+
1307
+ .vpg-pivot-config .vpg-watermark a:hover { color: #64748b; }
1308
+
1309
+ /* Config field list scrollbar */
1310
+ .vpg-field-list::-webkit-scrollbar { width: 0.375rem; }
1311
+ .vpg-field-list::-webkit-scrollbar-track { background: transparent; }
1312
+ .vpg-field-list::-webkit-scrollbar-thumb { background: #e2e8f0; border-radius: 9999px; }
1313
+ .vpg-field-list::-webkit-scrollbar-thumb:hover { background: #cbd5e1; }
1314
+
1315
+ /* ==========================================================================
1316
+ Pivot Skeleton
1317
+ ========================================================================== */
1318
+ .vpg-pivot-skeleton {
1319
+ background: white;
1320
+ border: 1px solid #e2e8f0;
1321
+ border-radius: 0.75rem;
1322
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
1323
+ overflow: hidden;
1324
+ display: flex;
1325
+ flex-direction: column;
1326
+ height: 100%;
1327
+ }
1328
+
1329
+ .vpg-pivot-skeleton.vpg-is-dragging { box-shadow: 0 0 0 2px #10b981; }
1330
+
1331
+ .vpg-skeleton-header {
1332
+ display: flex;
1333
+ align-items: center;
1334
+ justify-content: space-between;
1335
+ padding: 0.5rem 1rem;
1336
+ background: linear-gradient(to right, #ecfdf5, #f0fdfa);
1337
+ border-bottom: 1px solid #e2e8f0;
1338
+ flex-shrink: 0;
1339
+ }
1340
+
1341
+ .vpg-skeleton-title {
1342
+ display: flex;
1343
+ align-items: center;
1344
+ gap: 0.5rem;
1345
+ font-size: 0.75rem;
1346
+ font-weight: 600;
1347
+ color: #475569;
1348
+ text-transform: uppercase;
1349
+ letter-spacing: 0.05em;
1350
+ }
1351
+
1352
+ .vpg-header-right { display: flex; align-items: center; gap: 0.75rem; }
1353
+
1354
+ .vpg-config-summary { display: flex; align-items: center; gap: 0.375rem; }
1355
+
1356
+ .vpg-summary-badge {
1357
+ padding: 0.125rem 0.375rem;
1358
+ font-size: 0.625rem;
1359
+ font-weight: 600;
1360
+ border-radius: 0.25rem;
1361
+ }
1362
+
1363
+ .vpg-summary-badge.vpg-rows { background: #e0e7ff; color: #4f46e5; }
1364
+ .vpg-summary-badge.vpg-cols { background: #ede9fe; color: #7c3aed; }
1365
+ .vpg-summary-badge.vpg-vals { background: #d1fae5; color: #059669; }
1366
+
1367
+ /* Pro Required */
1368
+ .vpg-pro-required {
1369
+ flex: 1;
1370
+ display: flex;
1371
+ align-items: center;
1372
+ justify-content: center;
1373
+ background: linear-gradient(135deg, #fef3c7, #fde68a);
1374
+ }
1375
+
1376
+ .vpg-pro-content { text-align: center; padding: 2rem; }
1377
+ .vpg-pro-icon { width: 3rem; height: 3rem; color: #d97706; margin: 0 auto 1rem; }
1378
+ .vpg-pro-content h3 { font-size: 1.25rem; font-weight: 600; color: #92400e; margin-bottom: 0.5rem; }
1379
+ .vpg-pro-content p { font-size: 0.875rem; color: #a16207; margin-bottom: 1rem; }
1380
+
1381
+ .vpg-pro-link {
1382
+ display: inline-block;
1383
+ padding: 0.5rem 1rem;
1384
+ background: #f59e0b;
1385
+ color: white;
1386
+ font-weight: 500;
1387
+ border-radius: 0.375rem;
1388
+ text-decoration: none;
1389
+ transition: background 0.15s;
1390
+ }
1391
+
1392
+ .vpg-pro-link:hover { background: #d97706; }
1393
+
1394
+ /* Config Bar / Drop Zones */
1395
+ .vpg-config-bar {
1396
+ display: flex;
1397
+ align-items: stretch;
1398
+ gap: 0.5rem;
1399
+ padding: 0.5rem 0.75rem;
1400
+ background: #f8fafc;
1401
+ border-bottom: 1px solid #e2e8f0;
1402
+ flex-shrink: 0;
1403
+ }
1404
+
1405
+ .vpg-drop-zone {
1406
+ display: flex;
1407
+ align-items: center;
1408
+ gap: 0.5rem;
1409
+ padding: 0.5rem 0.75rem;
1410
+ border-radius: 0.5rem;
1411
+ border: 2px dashed;
1412
+ transition: all 0.15s;
1413
+ }
1414
+
1415
+ .vpg-drop-zone.vpg-row-zone { background: rgba(238, 242, 255, 0.5); border-color: #c7d2fe; }
1416
+ .vpg-drop-zone.vpg-column-zone { background: rgba(245, 243, 255, 0.5); border-color: #ddd6fe; flex: 1; }
1417
+ .vpg-drop-zone.vpg-value-zone { background: rgba(236, 253, 245, 0.5); border-color: #a7f3d0; }
1418
+
1419
+ .vpg-drop-zone.vpg-drag-over { border-style: solid; box-shadow: 0 0 0 2px currentColor inset; }
1420
+ .vpg-drop-zone.vpg-row-zone.vpg-drag-over { background: #eef2ff; border-color: #818cf8; }
1421
+ .vpg-drop-zone.vpg-column-zone.vpg-drag-over { background: #f5f3ff; border-color: #a78bfa; }
1422
+ .vpg-drop-zone.vpg-value-zone.vpg-drag-over { background: #ecfdf5; border-color: #34d399; }
1423
+
1424
+ .vpg-zone-header { display: flex; align-items: center; gap: 0.375rem; flex-shrink: 0; }
1425
+
1426
+ .vpg-zone-icon {
1427
+ width: 1.25rem;
1428
+ height: 1.25rem;
1429
+ display: flex;
1430
+ align-items: center;
1431
+ justify-content: center;
1432
+ font-size: 0.75rem;
1433
+ font-weight: 700;
1434
+ border-radius: 0.25rem;
1435
+ }
1436
+
1437
+ .vpg-zone-icon.vpg-row-icon { background: #c7d2fe; color: #4338ca; }
1438
+ .vpg-zone-icon.vpg-column-icon { background: #ddd6fe; color: #7c3aed; }
1439
+ .vpg-zone-icon.vpg-value-icon { background: #a7f3d0; color: #059669; }
1440
+
1441
+ .vpg-zone-label {
1442
+ font-size: 0.625rem;
1443
+ font-weight: 700;
1444
+ text-transform: uppercase;
1445
+ letter-spacing: 0.05em;
1446
+ }
1447
+
1448
+ .vpg-row-zone .vpg-zone-label { color: #4f46e5; }
1449
+ .vpg-column-zone .vpg-zone-label { color: #7c3aed; }
1450
+ .vpg-value-zone .vpg-zone-label { color: #059669; }
1451
+
1452
+ .vpg-zone-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 0.25rem; }
1453
+ .vpg-zone-hint { font-size: 0.625rem; color: #94a3b8; font-style: italic; }
1454
+
1455
+ .vpg-mini-chip {
1456
+ display: inline-flex;
1457
+ align-items: center;
1458
+ gap: 0.25rem;
1459
+ padding: 0.25rem 0.5rem;
1460
+ border-radius: 0.25rem;
1461
+ font-size: 0.625rem;
1462
+ font-weight: 500;
1463
+ max-width: 100%;
1464
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
1465
+ cursor: grab;
1466
+ transition: all 0.15s ease;
1467
+ }
1468
+
1469
+ .vpg-mini-chip:active { cursor: grabbing; }
1470
+ .vpg-mini-chip.vpg-row-chip { background: white; color: #4338ca; border: 1px solid #c7d2fe; }
1471
+ .vpg-mini-chip.vpg-column-chip { background: white; color: #7c3aed; border: 1px solid #ddd6fe; }
1472
+ .vpg-mini-chip.vpg-value-chip { background: white; color: #059669; border: 1px solid #a7f3d0; }
1473
+
1474
+ .vpg-mini-name {
1475
+ overflow: hidden;
1476
+ text-overflow: ellipsis;
1477
+ white-space: nowrap;
1478
+ flex: 1;
1479
+ }
1480
+
1481
+ .vpg-mini-remove {
1482
+ width: 1rem;
1483
+ height: 1rem;
1484
+ display: flex;
1485
+ align-items: center;
1486
+ justify-content: center;
1487
+ font-size: 0.875rem;
1488
+ line-height: 1;
1489
+ opacity: 0.4;
1490
+ flex-shrink: 0;
1491
+ background: transparent;
1492
+ border: none;
1493
+ border-radius: 50%;
1494
+ cursor: pointer;
1495
+ transition: all 0.15s;
1496
+ }
1497
+
1498
+ .vpg-mini-remove:hover { opacity: 1; background: #fee2e2; color: #ef4444; }
1499
+
1500
+ .vpg-agg-symbol {
1501
+ width: 1rem;
1502
+ height: 1rem;
1503
+ display: flex;
1504
+ align-items: center;
1505
+ justify-content: center;
1506
+ font-size: 0.625rem;
1507
+ font-weight: 700;
1508
+ background: #d1fae5;
1509
+ color: #059669;
1510
+ border-radius: 0.25rem;
1511
+ flex-shrink: 0;
1512
+ }
1513
+
1514
+ /* Placeholder */
1515
+ .vpg-placeholder {
1516
+ flex: 1;
1517
+ display: flex;
1518
+ align-items: center;
1519
+ justify-content: center;
1520
+ background: linear-gradient(135deg, #f8fafc, white, rgba(236, 253, 245, 0.3));
1521
+ border-top: 1px solid #f1f5f9;
1522
+ }
1523
+
1524
+ .vpg-placeholder-content {
1525
+ display: flex;
1526
+ flex-direction: column;
1527
+ align-items: center;
1528
+ gap: 1rem;
1529
+ text-align: center;
1530
+ padding: 2rem;
1531
+ }
1532
+
1533
+ .vpg-placeholder-icon { width: 4rem; height: 4rem; color: #cbd5e1; }
1534
+ .vpg-placeholder-text { font-size: 0.875rem; color: #64748b; }
1535
+ .vpg-placeholder-text strong { color: #334155; font-weight: 600; }
1536
+
1537
+ /* Pivot Table */
1538
+ .vpg-table-container {
1539
+ flex: 1;
1540
+ overflow: auto;
1541
+ max-height: 100%;
1542
+ }
1543
+
1544
+ .vpg-pivot-table {
1545
+ border-collapse: collapse;
1546
+ table-layout: fixed;
1547
+ min-width: -moz-max-content;
1548
+ min-width: max-content;
1549
+ }
1550
+
1551
+ .vpg-pivot-table thead {
1552
+ position: sticky;
1553
+ top: 0;
1554
+ z-index: 30;
1555
+ box-shadow: 0 2px 4px -1px rgba(0, 0, 0, 0.1);
1556
+ }
1557
+
1558
+ .vpg-column-header-row { background: #e2e8f0; }
1559
+ .vpg-column-header-row th { background: #e2e8f0; }
1560
+
1561
+ .vpg-row-header-label {
1562
+ position: sticky;
1563
+ left: 0;
1564
+ z-index: 30;
1565
+ padding: 0.5rem 0.75rem;
1566
+ text-align: left;
1567
+ font-size: 0.625rem;
1568
+ font-weight: 600;
1569
+ color: #64748b;
1570
+ text-transform: uppercase;
1571
+ border-bottom: 1px solid #cbd5e1;
1572
+ border-right: 1px solid #cbd5e1;
1573
+ background: #e2e8f0;
1574
+ cursor: pointer;
1575
+ }
1576
+
1577
+ .vpg-row-header-label:hover { background: #d1d5db; }
1578
+
1579
+ .vpg-column-header-cell {
1580
+ padding: 0.5rem 0.75rem;
1581
+ text-align: center;
1582
+ font-size: 0.6875rem;
1583
+ font-weight: 600;
1584
+ color: #334155;
1585
+ border-bottom: 1px solid #cbd5e1;
1586
+ border-right: 1px solid #cbd5e1;
1587
+ white-space: nowrap;
1588
+ background: #e2e8f0;
1589
+ cursor: pointer;
1590
+ }
1591
+
1592
+ .vpg-column-header-cell:hover { background: rgba(203, 213, 225, 0.5); }
1593
+
1594
+ .vpg-pivot-skeleton .vpg-header-content {
1595
+ display: flex;
1596
+ align-items: center;
1597
+ justify-content: center;
1598
+ gap: 0.25rem;
1599
+ }
1600
+
1601
+ .vpg-pivot-skeleton .vpg-sort-indicator {
1602
+ flex-shrink: 0;
1603
+ width: 1rem;
1604
+ height: 1rem;
1605
+ display: flex;
1606
+ align-items: center;
1607
+ justify-content: center;
1608
+ color: #94a3b8;
1609
+ font-size: 0.75rem;
1610
+ }
1611
+
1612
+ .vpg-pivot-skeleton .vpg-sort-indicator.active { color: #4f46e5; font-weight: 700; }
1613
+
1614
+ .vpg-total-header {
1615
+ padding: 0.5rem;
1616
+ text-align: center;
1617
+ font-size: 0.6875rem;
1618
+ font-weight: 700;
1619
+ color: #92400e;
1620
+ border-bottom: 1px solid #cbd5e1;
1621
+ border-left: 2px solid #f59e0b;
1622
+ background: #fde68a;
1623
+ vertical-align: middle;
1624
+ }
1625
+
1626
+ .vpg-data-row:hover { background: #ecfdf5; }
1627
+ .vpg-data-row:nth-child(even) { background: #f8fafc; }
1628
+
1629
+ .vpg-row-header-cell {
1630
+ position: sticky;
1631
+ left: 0;
1632
+ padding: 0.5rem 0.75rem;
1633
+ text-align: left;
1634
+ font-size: 0.75rem;
1635
+ font-weight: 500;
1636
+ color: #334155;
1637
+ background: white;
1638
+ border-bottom: 1px solid #e2e8f0;
1639
+ border-right: 1px solid #e2e8f0;
1640
+ white-space: nowrap;
1641
+ z-index: 10;
1642
+ }
1643
+
1644
+ .vpg-data-row:nth-child(even) .vpg-row-header-cell { background: #f8fafc; }
1645
+ .vpg-row-value + .vpg-row-value::before { content: ' / '; color: #94a3b8; }
1646
+
1647
+ .vpg-data-cell {
1648
+ padding: 0.5rem 0.75rem;
1649
+ text-align: right;
1650
+ font-size: 0.75rem;
1651
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1652
+ color: #334155;
1653
+ font-variant-numeric: tabular-nums;
1654
+ border-bottom: 1px solid #f1f5f9;
1655
+ border-right: 1px solid #f8fafc;
1656
+ cursor: cell;
1657
+ white-space: nowrap;
1658
+ }
1659
+
1660
+ .vpg-data-cell.selected {
1661
+ background: #d1fae5;
1662
+ outline: 2px solid #10b981;
1663
+ outline-offset: -2px;
1664
+ position: relative;
1665
+ z-index: 1;
1666
+ }
1667
+
1668
+ .vpg-data-cell.vpg-is-null { color: #cbd5e1; }
1669
+ .vpg-data-cell.vpg-total-cell { background: #fef3c7; font-weight: 600; color: #92400e; }
1670
+ .vpg-data-cell.vpg-grand-total-cell { background: #fde68a; font-weight: 700; color: #92400e; }
1671
+
1672
+ .vpg-totals-row { background: #fef9e7; }
1673
+ .vpg-total-label { font-weight: 700; color: #92400e; background: #fef3c7; }
1674
+
1675
+ /* Pivot font sizes */
1676
+ .vpg-pivot-skeleton.vpg-font-xs .vpg-data-cell,
1677
+ .vpg-pivot-skeleton.vpg-font-xs .vpg-row-header-cell { font-size: 0.75rem; padding: 0.375rem 0.75rem; }
1678
+ .vpg-pivot-skeleton.vpg-font-sm .vpg-data-cell,
1679
+ .vpg-pivot-skeleton.vpg-font-sm .vpg-row-header-cell { font-size: 0.875rem; padding: 0.5rem 1rem; }
1680
+ .vpg-pivot-skeleton.vpg-font-base .vpg-data-cell,
1681
+ .vpg-pivot-skeleton.vpg-font-base .vpg-row-header-cell { font-size: 1rem; padding: 0.625rem 1rem; }
1682
+
1683
+ /* Footer */
1684
+ .vpg-skeleton-footer {
1685
+ display: flex;
1686
+ align-items: center;
1687
+ gap: 0.5rem;
1688
+ padding: 0.5rem 1rem;
1689
+ font-size: 0.75rem;
1690
+ color: #64748b;
1691
+ background: #f8fafc;
1692
+ border-top: 1px solid #e2e8f0;
1693
+ flex-shrink: 0;
1694
+ }
1695
+
1696
+ /* Skeleton Watermark */
1697
+ .vpg-pivot-skeleton .vpg-watermark {
1698
+ padding: 0.375rem 1rem;
1699
+ background: #f1f5f9;
1700
+ border-top: 1px solid #e2e8f0;
1701
+ text-align: center;
1702
+ flex-shrink: 0;
1703
+ }
1704
+
1705
+ .vpg-pivot-skeleton .vpg-watermark a {
1706
+ font-size: 0.625rem;
1707
+ color: #94a3b8;
1708
+ text-decoration: none;
1709
+ transition: color 0.15s;
1710
+ }
1711
+
1712
+ .vpg-pivot-skeleton .vpg-watermark a:hover { color: #64748b; }
1713
+
1714
+ /* Demo Mode */
1715
+ .vpg-pivot-skeleton .vpg-watermark.vpg-demo-mode {
1716
+ display: flex;
1717
+ align-items: center;
1718
+ justify-content: center;
1719
+ gap: 0.75rem;
1720
+ padding: 0.5rem 1rem;
1721
+ background: linear-gradient(135deg, #fef3c7, #fde68a);
1722
+ border-top: 1px solid #fcd34d;
1723
+ font-size: 0.75rem;
1724
+ color: #92400e;
1725
+ }
1726
+
1727
+ .vpg-get-pro { font-weight: 600; color: #d97706 !important; }
1728
+ .vpg-get-pro:hover { color: #b45309 !important; text-decoration: underline; }
1729
+
1730
+ /* Pivot table scrollbar */
1731
+ .vpg-table-container::-webkit-scrollbar { width: 0.5rem; height: 0.5rem; }
1732
+ .vpg-table-container::-webkit-scrollbar-track { background: #f1f5f9; }
1733
+ .vpg-table-container::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 9999px; }
1734
+ .vpg-table-container::-webkit-scrollbar-thumb:hover { background: #94a3b8; }
1735
+ .vpg-table-container::-webkit-scrollbar-corner { background: #f1f5f9; }
1736
+
1737
+ /* Filter indicator in pivot */
1738
+ .vpg-pivot-skeleton .vpg-filter-indicator {
1739
+ position: relative;
1740
+ display: flex;
1741
+ align-items: center;
1742
+ gap: 0.375rem;
1743
+ padding: 0.25rem 0.625rem;
1744
+ background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);
1745
+ border: 1px solid #f59e0b;
1746
+ border-radius: 0.375rem;
1747
+ font-size: 0.6875rem;
1748
+ color: #92400e;
1749
+ box-shadow: 0 1px 2px rgba(245, 158, 11, 0.15);
1750
+ }
1751
+
1752
+ .vpg-pivot-skeleton .vpg-filter-icon {
1753
+ width: 0.875rem;
1754
+ height: 0.875rem;
1755
+ flex-shrink: 0;
1756
+ color: #d97706;
1757
+ }
1758
+
1759
+ .vpg-pivot-skeleton .vpg-filter-text {
1760
+ display: flex;
1761
+ align-items: center;
1762
+ gap: 0.25rem;
1763
+ white-space: nowrap;
1764
+ }
1765
+
1766
+ .vpg-pivot-skeleton .vpg-filter-text strong {
1767
+ font-weight: 600;
1768
+ color: #78350f;
1769
+ max-width: 150px;
1770
+ overflow: hidden;
1771
+ text-overflow: ellipsis;
1772
+ }
1773
+
1774
+ .vpg-pivot-skeleton .vpg-filter-count {
1775
+ color: #a16207;
1776
+ font-size: 0.625rem;
1777
+ }
1778
+