aplance-ui 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/registry/components/primitives/icon/icon.tsx +4 -6
- package/registry/components/primitives/modal/modal.module.css +5 -0
- package/registry/components/primitives/modal/modal.tsx +32 -34
- package/registry/components/primitives/popover/popover-context.ts +33 -29
- package/registry/components/primitives/popover/popover.module.css +4 -2
- package/registry/components/primitives/popover/popover.tsx +150 -37
- package/registry/components/ui/accordion/accordion.module.css +52 -0
- package/registry/components/ui/accordion/accordion.tsx +97 -25
- package/registry/components/ui/avatar/avatar.tsx +2 -2
- package/registry/components/ui/breadcrumbs/breadcrumbs.module.css +9 -9
- package/registry/components/ui/button/button.module.css +43 -5
- package/registry/components/ui/button/button.tsx +2 -1
- package/registry/components/ui/copy-button/copy-button.module.css +2 -0
- package/registry/components/ui/copy-button/copy-button.tsx +5 -0
- package/registry/components/ui/data-table/data-table.module.css +786 -710
- package/registry/components/ui/data-table/data-table.tsx +1238 -1211
- package/registry/components/ui/data-table/filter-modal.tsx +86 -0
- package/registry/components/ui/data-table/filters.tsx +21 -0
- package/registry/components/ui/data-table/pagination-bar.tsx +31 -17
- package/registry/components/ui/data-table/types.ts +19 -1
- package/registry/components/ui/data-table/useDataTable.tsx +2 -2
- package/registry/components/ui/data-table/utils.ts +30 -4
- package/registry/components/ui/input-fields/common/input-field-common.module.css +8 -2
- package/registry/components/ui/input-fields/common/picker-popover-common.module.css +4 -0
- package/registry/components/ui/input-fields/custom-select/custom-select.module.css +118 -76
- package/registry/components/ui/input-fields/custom-select/custom-select.tsx +552 -484
- package/registry/components/ui/input-fields/date-picker/date-picker.tsx +936 -933
- package/registry/components/ui/input-fields/date-picker/types.ts +2 -0
- package/registry/components/ui/input-fields/emoji-picker/emoji-picker.tsx +8 -0
- package/registry/components/ui/input-fields/input/input.tsx +348 -348
- package/registry/components/ui/input-fields/media-input/media-input.tsx +3 -1
- package/registry/components/ui/input-fields/media-input/types.ts +8 -2
- package/registry/components/ui/input-fields/media-input/useMediaUpload.tsx +5 -5
- package/registry/components/ui/input-fields/media-input/utils.ts +18 -5
- package/registry/components/ui/scroll-rail/scroll-rail.module.css +104 -0
- package/registry/components/ui/scroll-rail/scroll-rail.tsx +159 -0
- package/registry/components/ui/tabs/tabs.module.css +8 -12
- package/registry/components/ui/tabs/tabs.tsx +94 -50
- package/registry/components/ui/tooltip/tooltip.module.css +8 -3
- package/registry/components/ui/tooltip/tooltip.tsx +16 -3
- package/registry/hooks/useMediaQuery.ts +38 -0
- package/registry/lib/string.ts +3 -3
- package/registry/registry.json +54 -4
|
@@ -1,710 +1,786 @@
|
|
|
1
|
-
/* ─────────────────────────────────────────────
|
|
2
|
-
Root
|
|
3
|
-
Fills its flex parent. Stacks filter bar (fixed) + content wrap (grows).
|
|
4
|
-
───────────────────────────────────────────── */
|
|
5
|
-
.root {
|
|
6
|
-
width: 100%;
|
|
7
|
-
flex: 1;
|
|
8
|
-
min-height: 0;
|
|
9
|
-
display: flex;
|
|
10
|
-
flex-direction: column;
|
|
11
|
-
gap: var(--spacing-6);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/* ─────────────────────────────────────────────
|
|
15
|
-
Filter bar
|
|
16
|
-
CSS grid - always one row, never wraps.
|
|
17
|
-
gridTemplateColumns is set inline from FilterBar.
|
|
18
|
-
───────────────────────────────────────────── */
|
|
19
|
-
.filter_bar {
|
|
20
|
-
display: grid;
|
|
21
|
-
align-items: center;
|
|
22
|
-
place-items: center;
|
|
23
|
-
gap: var(--spacing-6);
|
|
24
|
-
width: 100%;
|
|
25
|
-
flex-shrink: 0;
|
|
26
|
-
|
|
27
|
-
> * {
|
|
28
|
-
min-width: 0;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/*
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
display: flex;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
bottom:
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
/*
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
.
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
.
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
.
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
─────────────────────────────────────────────
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
.
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
.
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
flex-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
.
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
flex-
|
|
710
|
-
|
|
1
|
+
/* ─────────────────────────────────────────────
|
|
2
|
+
Root
|
|
3
|
+
Fills its flex parent. Stacks filter bar (fixed) + content wrap (grows).
|
|
4
|
+
───────────────────────────────────────────── */
|
|
5
|
+
.root {
|
|
6
|
+
width: 100%;
|
|
7
|
+
flex: 1;
|
|
8
|
+
min-height: 0;
|
|
9
|
+
display: flex;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
gap: var(--spacing-6);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* ─────────────────────────────────────────────
|
|
15
|
+
Filter bar
|
|
16
|
+
CSS grid - always one row, never wraps.
|
|
17
|
+
gridTemplateColumns is set inline from FilterBar.
|
|
18
|
+
───────────────────────────────────────────── */
|
|
19
|
+
.filter_bar {
|
|
20
|
+
display: grid;
|
|
21
|
+
align-items: center;
|
|
22
|
+
place-items: center;
|
|
23
|
+
gap: var(--spacing-6);
|
|
24
|
+
width: 100%;
|
|
25
|
+
flex-shrink: 0;
|
|
26
|
+
|
|
27
|
+
> * {
|
|
28
|
+
min-width: 0;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* ─────────────────────────────────────────────
|
|
33
|
+
Compact filters (≤ --md)
|
|
34
|
+
The inline row can't fit its fields below this width, and stacking them all
|
|
35
|
+
full-height buries the table on phones - so the DataTable swaps <FilterBar>
|
|
36
|
+
for <FilterModal>: a single trigger button that opens the same fields,
|
|
37
|
+
stacked, inside the Modal primitive (a bottom sheet on phones).
|
|
38
|
+
───────────────────────────────────────────── */
|
|
39
|
+
.filter_modal_bar {
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-shrink: 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.filter_trigger {
|
|
45
|
+
display: inline-flex;
|
|
46
|
+
align-items: center;
|
|
47
|
+
gap: var(--spacing-2);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Active-filter count pill on the trigger button. */
|
|
51
|
+
.filter_count {
|
|
52
|
+
display: inline-flex;
|
|
53
|
+
align-items: center;
|
|
54
|
+
justify-content: center;
|
|
55
|
+
min-width: var(--spacing-9);
|
|
56
|
+
height: var(--spacing-9);
|
|
57
|
+
padding: 0 var(--spacing-1);
|
|
58
|
+
border-radius: var(--radius-full);
|
|
59
|
+
background: var(--color-primary);
|
|
60
|
+
color: var(--color-primary-foreground);
|
|
61
|
+
font-size: var(--font-size-xs);
|
|
62
|
+
font-weight: var(--font-weight-semibold);
|
|
63
|
+
line-height: 1;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* Fields stacked full width inside the modal; each control fills its row. */
|
|
67
|
+
.filter_modal_fields {
|
|
68
|
+
display: flex;
|
|
69
|
+
flex-direction: column;
|
|
70
|
+
gap: var(--spacing-5);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.filter_modal_field {
|
|
74
|
+
width: 100%;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.filter_modal_field > * {
|
|
78
|
+
width: 100%;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* ─────────────────────────────────────────────
|
|
82
|
+
Content wrap
|
|
83
|
+
Grows to fill all space below the filter bar.
|
|
84
|
+
Flex column: table shell (grows) + pagination (pinned to bottom via margin-top:auto).
|
|
85
|
+
───────────────────────────────────────────── */
|
|
86
|
+
.content_wrap {
|
|
87
|
+
flex: 1;
|
|
88
|
+
min-height: 0;
|
|
89
|
+
display: flex;
|
|
90
|
+
flex-direction: column;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* ─────────────────────────────────────────────
|
|
94
|
+
Table shell
|
|
95
|
+
Grows to fill space above pagination. Header pill + scrollable body.
|
|
96
|
+
───────────────────────────────────────────── */
|
|
97
|
+
.table_shell {
|
|
98
|
+
flex: 1;
|
|
99
|
+
min-height: 0;
|
|
100
|
+
display: flex;
|
|
101
|
+
flex-direction: column;
|
|
102
|
+
gap: var(--spacing-6);
|
|
103
|
+
padding-bottom: var(--spacing-6);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* no bottom padding when pagination is not shown */
|
|
107
|
+
.table_shell_no_pagination {
|
|
108
|
+
padding-bottom: 0;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* ─────────────────────────────────────────────
|
|
112
|
+
Detached header pill
|
|
113
|
+
Rounded standalone bar. scrollLeft synced to body via JS so pinned
|
|
114
|
+
columns stay perfectly aligned with their body counterparts.
|
|
115
|
+
───────────────────────────────────────────── */
|
|
116
|
+
.table_header_container {
|
|
117
|
+
position: relative;
|
|
118
|
+
flex-shrink: 0;
|
|
119
|
+
width: 100%;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.table_header_wrap {
|
|
123
|
+
width: 100%;
|
|
124
|
+
overflow-x: auto;
|
|
125
|
+
overflow-y: hidden;
|
|
126
|
+
border-radius: var(--radius-md);
|
|
127
|
+
background: var(--color-muted);
|
|
128
|
+
border: var(--border-1) solid var(--color-border);
|
|
129
|
+
scrollbar-width: none;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.table_header_wrap::-webkit-scrollbar {
|
|
133
|
+
display: none;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.header_padding_mask {
|
|
137
|
+
position: absolute;
|
|
138
|
+
top: 0;
|
|
139
|
+
right: 0;
|
|
140
|
+
bottom: 0;
|
|
141
|
+
width: var(--header-padding-right, 0px);
|
|
142
|
+
background: var(--color-muted);
|
|
143
|
+
border-radius: 0 var(--radius-md) var(--radius-md) 0;
|
|
144
|
+
border-top: var(--border-1) solid var(--color-border);
|
|
145
|
+
border-right: var(--border-1) solid var(--color-border);
|
|
146
|
+
border-bottom: var(--border-1) solid var(--color-border);
|
|
147
|
+
pointer-events: none;
|
|
148
|
+
z-index: 10;
|
|
149
|
+
visibility: hidden;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.table_header_container[data-has-scroll="true"] .header_padding_mask {
|
|
153
|
+
visibility: visible;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* ─────────────────────────────────────────────
|
|
157
|
+
Scrollable body
|
|
158
|
+
flex:1 + min-height:0 = fills all space, then scrolls.
|
|
159
|
+
───────────────────────────────────────────── */
|
|
160
|
+
.table_body_wrap {
|
|
161
|
+
flex: 1;
|
|
162
|
+
min-height: 0;
|
|
163
|
+
overflow-x: auto;
|
|
164
|
+
overflow-y: auto;
|
|
165
|
+
/* Reserve the scrollbar gutter by DEFAULT so clientWidth is stable: the
|
|
166
|
+
vertical scrollbar (when rows overflow) sits in the reserved gutter instead
|
|
167
|
+
of stealing ~15px and triggering an unexpected horizontal scrollbar. This
|
|
168
|
+
default also covers the first paint before JS measures. */
|
|
169
|
+
scrollbar-gutter: stable;
|
|
170
|
+
border: var(--border-1) solid var(--color-border);
|
|
171
|
+
border-radius: var(--radius-md);
|
|
172
|
+
background: var(--color-background);
|
|
173
|
+
position: relative;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Once JS confirms the body does NOT overflow vertically (no scrollbar to make
|
|
177
|
+
room for), release the gutter so the content fills to the border - otherwise
|
|
178
|
+
a few-row table shows a blank ~15px strip on the right. `data-has-scroll` is
|
|
179
|
+
set from `scrollHeight > clientHeight` in syncHeaderMetrics. */
|
|
180
|
+
.table_body_wrap[data-has-scroll="false"] {
|
|
181
|
+
scrollbar-gutter: auto;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* The columns fit (`columnsFit` in data-table.tsx): nothing to scroll to
|
|
185
|
+
sideways, so a sub-pixel overhang can't raise a horizontal scrollbar. */
|
|
186
|
+
.table_body_wrap[data-fits="true"] {
|
|
187
|
+
overflow-x: hidden;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/* ─────────────────────────────────────────────
|
|
191
|
+
Shared <table> - header wrap + body wrap.
|
|
192
|
+
table-layout:fixed + identical widths = perfect column alignment.
|
|
193
|
+
───────────────────────────────────────────── */
|
|
194
|
+
.table {
|
|
195
|
+
--data-table-selection-control-size: var(--spacing-9);
|
|
196
|
+
|
|
197
|
+
border-collapse: separate;
|
|
198
|
+
border-spacing: 0;
|
|
199
|
+
table-layout: fixed;
|
|
200
|
+
|
|
201
|
+
thead th {
|
|
202
|
+
position: relative;
|
|
203
|
+
height: var(--spacing-11);
|
|
204
|
+
padding: 0 var(--spacing-6);
|
|
205
|
+
font-size: var(--font-size-xs);
|
|
206
|
+
font-weight: var(--font-weight-semibold);
|
|
207
|
+
color: var(--color-foreground);
|
|
208
|
+
white-space: nowrap;
|
|
209
|
+
/* explicit background so sticky pinned cells mask scrolled content */
|
|
210
|
+
background: var(--color-muted);
|
|
211
|
+
/* visible: header checkbox focus ring not clipped */
|
|
212
|
+
overflow: visible;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
tbody tr {
|
|
216
|
+
transition: background var(--transition-fast);
|
|
217
|
+
|
|
218
|
+
/* The last row's line is a shadow, not a border. A shadow never adds to
|
|
219
|
+
the body's scroll height, and the body clips it at its own edge: with
|
|
220
|
+
space left under the rows it closes them, and where the rows reach the
|
|
221
|
+
body's border it is cut off instead of drawing a second line there.
|
|
222
|
+
Placed before the drop target, which wins on a last row. */
|
|
223
|
+
&:last-child td {
|
|
224
|
+
border-bottom: none;
|
|
225
|
+
box-shadow: 0 var(--border-1) 0 var(--color-border);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
&:hover td {
|
|
229
|
+
background: var(--color-secondary);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
&.row_selected td {
|
|
233
|
+
background: var(--color-muted);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
&.row_group td {
|
|
237
|
+
background: var(--color-secondary);
|
|
238
|
+
font-weight: var(--font-weight-medium);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
&.row_editing {
|
|
242
|
+
/* hover should not flicker the background of a row the user is editing */
|
|
243
|
+
&:hover td {
|
|
244
|
+
background: var(--color-background);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
td {
|
|
248
|
+
background: var(--color-background);
|
|
249
|
+
|
|
250
|
+
.td_inner {
|
|
251
|
+
/* let inline-edit focus rings + dropdown shadows escape the cell */
|
|
252
|
+
overflow: visible;
|
|
253
|
+
text-overflow: clip;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
&.row_dragging td {
|
|
259
|
+
opacity: 0.5;
|
|
260
|
+
background: var(--color-muted);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
&.row_drop_target td {
|
|
264
|
+
box-shadow: inset 0 2px 0 0 var(--color-primary);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
td {
|
|
268
|
+
padding: var(--spacing-5) var(--spacing-6);
|
|
269
|
+
font-size: var(--font-size-sm);
|
|
270
|
+
font-weight: var(--font-weight-normal);
|
|
271
|
+
color: var(--color-foreground);
|
|
272
|
+
vertical-align: middle;
|
|
273
|
+
border-bottom: var(--border-1) solid var(--color-border);
|
|
274
|
+
/* explicit background so sticky pinned cells mask scrolled content */
|
|
275
|
+
background: var(--color-background);
|
|
276
|
+
/* visible: focus rings + dropdowns escape the cell */
|
|
277
|
+
overflow: visible;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* ─────────────────────────────────────────────
|
|
283
|
+
Vertical column borders (showVerticalBorders prop)
|
|
284
|
+
Drawn on the LEFT of every cell except the first, so we never get a
|
|
285
|
+
double border at the table's outer edge.
|
|
286
|
+
───────────────────────────────────────────── */
|
|
287
|
+
.table_vertical_borders {
|
|
288
|
+
/* Only add vertical border if the previous cell is not the last left-pinned cell. Prevents double border with pinned columns. */
|
|
289
|
+
thead th:not(.col_pinned_last.col_pinned_left) + th,
|
|
290
|
+
tbody td:not(.col_pinned_last.col_pinned_left) + td {
|
|
291
|
+
border-left: var(--border-1) solid var(--color-border);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/* ─────────────────────────────────────────────
|
|
296
|
+
Header inner - flex container that hugs its content.
|
|
297
|
+
No `flex: 1` on the label; icons sit immediately next to the text and
|
|
298
|
+
`justify-content` (set by `.align_*`) determines start/end alignment.
|
|
299
|
+
───────────────────────────────────────────── */
|
|
300
|
+
.th_inner {
|
|
301
|
+
width: 100%;
|
|
302
|
+
display: flex;
|
|
303
|
+
align-items: center;
|
|
304
|
+
min-height: var(--spacing-11);
|
|
305
|
+
gap: var(--spacing-2);
|
|
306
|
+
margin: 0;
|
|
307
|
+
padding: 0;
|
|
308
|
+
overflow: hidden;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.th_label {
|
|
312
|
+
flex: 0 1 auto;
|
|
313
|
+
min-width: 0;
|
|
314
|
+
max-width: 100%;
|
|
315
|
+
overflow: hidden;
|
|
316
|
+
text-overflow: ellipsis;
|
|
317
|
+
white-space: nowrap;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.th_actions {
|
|
321
|
+
display: inline-flex;
|
|
322
|
+
align-items: center;
|
|
323
|
+
gap: var(--spacing-1);
|
|
324
|
+
flex-shrink: 0;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.drag_handle {
|
|
328
|
+
width: 1rem;
|
|
329
|
+
height: 1rem;
|
|
330
|
+
display: inline-flex;
|
|
331
|
+
align-items: center;
|
|
332
|
+
justify-content: center;
|
|
333
|
+
color: var(--color-muted-foreground);
|
|
334
|
+
cursor: grab;
|
|
335
|
+
flex-shrink: 0;
|
|
336
|
+
|
|
337
|
+
&:active {
|
|
338
|
+
cursor: grabbing;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/* ─────────────────────────────────────────────
|
|
343
|
+
Compact icon-only button used for sort / group / pin in the header.
|
|
344
|
+
───────────────────────────────────────────── */
|
|
345
|
+
.icon_btn {
|
|
346
|
+
/* !important needed: --button-icon is also set by :is(.ghost, .tone_ghost) in
|
|
347
|
+
button.module.css at equal specificity - CSS module load order is not guaranteed,
|
|
348
|
+
so !important on the var is the only reliable way to win without hardcoding svg color. */
|
|
349
|
+
--button-icon: var(--color-muted-foreground) !important;
|
|
350
|
+
|
|
351
|
+
&:hover:not(.disabled) {
|
|
352
|
+
--button-icon: var(--color-foreground) !important;
|
|
353
|
+
background-color: var(--color-border) !important;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/* ─────────────────────────────────────────────
|
|
358
|
+
Body cell inner - default truncates with ellipsis.
|
|
359
|
+
Override per-column with `meta.truncate = false` for cells hosting
|
|
360
|
+
inputs/buttons so focus rings and dropdowns aren't clipped.
|
|
361
|
+
───────────────────────────────────────────── */
|
|
362
|
+
.td_inner {
|
|
363
|
+
overflow: hidden;
|
|
364
|
+
text-overflow: ellipsis;
|
|
365
|
+
white-space: nowrap;
|
|
366
|
+
/* outset breathing room mirrors the header's */
|
|
367
|
+
margin: calc(var(--spacing-2) * -1);
|
|
368
|
+
padding: var(--spacing-2);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.td_inner_no_truncate {
|
|
372
|
+
overflow: visible;
|
|
373
|
+
text-overflow: clip;
|
|
374
|
+
white-space: normal;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
.selection_checkbox {
|
|
378
|
+
--native-control-size: var(--data-table-selection-control-size);
|
|
379
|
+
|
|
380
|
+
width: fit-content;
|
|
381
|
+
min-width: fit-content;
|
|
382
|
+
display: inline-flex;
|
|
383
|
+
align-items: center;
|
|
384
|
+
justify-content: center;
|
|
385
|
+
padding: 0;
|
|
386
|
+
margin: 0;
|
|
387
|
+
|
|
388
|
+
> * {
|
|
389
|
+
width: fit-content;
|
|
390
|
+
min-width: fit-content;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
> * > * {
|
|
394
|
+
width: fit-content;
|
|
395
|
+
min-width: fit-content;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.col_select {
|
|
400
|
+
padding-left: var(--spacing-5) !important;
|
|
401
|
+
padding-right: var(--spacing-5) !important;
|
|
402
|
+
|
|
403
|
+
.th_inner,
|
|
404
|
+
.td_inner {
|
|
405
|
+
margin: 0;
|
|
406
|
+
padding: 0;
|
|
407
|
+
display: flex;
|
|
408
|
+
align-items: center;
|
|
409
|
+
justify-content: center;
|
|
410
|
+
gap: 0;
|
|
411
|
+
overflow: visible;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
.group_anchor_cell {
|
|
416
|
+
text-align: left !important;
|
|
417
|
+
|
|
418
|
+
.td_inner {
|
|
419
|
+
display: flex;
|
|
420
|
+
align-items: center;
|
|
421
|
+
justify-content: flex-start;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/* ─────────────────────────────────────────────
|
|
426
|
+
Cell alignment via `column.meta.align`
|
|
427
|
+
- text-align handles inline text (truncate=true case)
|
|
428
|
+
- flex justify-content handles non-truncated content (action buttons, inputs)
|
|
429
|
+
- header is always a flex container so we always set justify-content there
|
|
430
|
+
───────────────────────────────────────────── */
|
|
431
|
+
.align_left {
|
|
432
|
+
text-align: left;
|
|
433
|
+
|
|
434
|
+
.th_inner {
|
|
435
|
+
justify-content: flex-start;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
.td_inner_no_truncate {
|
|
439
|
+
display: flex;
|
|
440
|
+
align-items: center;
|
|
441
|
+
justify-content: flex-start;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
.align_center {
|
|
446
|
+
text-align: center;
|
|
447
|
+
|
|
448
|
+
.th_inner {
|
|
449
|
+
justify-content: center;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
.td_inner_no_truncate {
|
|
453
|
+
display: flex;
|
|
454
|
+
align-items: center;
|
|
455
|
+
justify-content: center;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
.align_right {
|
|
460
|
+
text-align: right;
|
|
461
|
+
|
|
462
|
+
.th_inner {
|
|
463
|
+
justify-content: flex-end;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.td_inner_no_truncate {
|
|
467
|
+
display: flex;
|
|
468
|
+
align-items: center;
|
|
469
|
+
justify-content: flex-end;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/* ─────────────────────────────────────────────
|
|
474
|
+
Column pinning - sticky offsets are written inline by JS
|
|
475
|
+
The hairline divider lives only on the LAST column of each pinning group
|
|
476
|
+
(`col_pinned_last`) so adjacent pinned columns don't get double dividers.
|
|
477
|
+
───────────────────────────────────────────── */
|
|
478
|
+
.table th.col_pinned_left,
|
|
479
|
+
.table th.col_pinned_right,
|
|
480
|
+
.table td.col_pinned_left,
|
|
481
|
+
.table td.col_pinned_right {
|
|
482
|
+
position: sticky;
|
|
483
|
+
z-index: 1;
|
|
484
|
+
|
|
485
|
+
/* To ensure pinned columns are visible above other content */
|
|
486
|
+
background-color: var(--color-muted);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
.table thead th.col_pinned_left,
|
|
490
|
+
.table thead th.col_pinned_right {
|
|
491
|
+
z-index: 2;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/* Pinned left columns: add a right border only to the last pinned cell to act as a divider. */
|
|
495
|
+
.col_pinned_last.col_pinned_left {
|
|
496
|
+
border-right: var(--border-1) solid var(--color-border);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/* Pinned right columns: add a left border only to the last pinned cell to act as a divider. */
|
|
500
|
+
.col_pinned_last.col_pinned_right {
|
|
501
|
+
border-left: var(--border-1) solid var(--color-border);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/* Keep interactive cell popovers above sticky neighbors when they are rendered
|
|
505
|
+
in-place (non-portal mode). */
|
|
506
|
+
.table tbody td:focus-within {
|
|
507
|
+
position: relative;
|
|
508
|
+
z-index: 3;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/* ─────────────────────────────────────────────
|
|
512
|
+
Drag-and-drop column reordering
|
|
513
|
+
───────────────────────────────────────────── */
|
|
514
|
+
.col_dragging {
|
|
515
|
+
opacity: 0.5;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
.col_drop_target {
|
|
519
|
+
/* a slim vertical bar on the leading edge of the drop target */
|
|
520
|
+
outline: 2px solid var(--color-primary);
|
|
521
|
+
outline-offset: -2px;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/* ─────────────────────────────────────────────
|
|
525
|
+
Column resize handle - narrow vertical strip on the cell's right edge
|
|
526
|
+
───────────────────────────────────────────── */
|
|
527
|
+
.resize_handle {
|
|
528
|
+
position: absolute;
|
|
529
|
+
top: 0;
|
|
530
|
+
right: 0;
|
|
531
|
+
bottom: 0;
|
|
532
|
+
width: 5px;
|
|
533
|
+
cursor: col-resize;
|
|
534
|
+
user-select: none;
|
|
535
|
+
touch-action: none;
|
|
536
|
+
background: transparent;
|
|
537
|
+
transition: background var(--transition-fast);
|
|
538
|
+
|
|
539
|
+
&:hover,
|
|
540
|
+
&.resize_handle_active {
|
|
541
|
+
background: var(--color-primary);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/* ─────────────────────────────────────────────
|
|
546
|
+
Group rows + toggle
|
|
547
|
+
───────────────────────────────────────────── */
|
|
548
|
+
.group_toggle {
|
|
549
|
+
display: inline-flex;
|
|
550
|
+
align-items: center;
|
|
551
|
+
gap: var(--spacing-3);
|
|
552
|
+
padding: 0;
|
|
553
|
+
border: none;
|
|
554
|
+
background: transparent;
|
|
555
|
+
color: var(--color-foreground);
|
|
556
|
+
font: inherit;
|
|
557
|
+
cursor: pointer;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
.group_chevron {
|
|
561
|
+
transition: transform var(--transition-fast);
|
|
562
|
+
flex-shrink: 0;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
.group_chevron_open {
|
|
566
|
+
transform: rotate(90deg);
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
.group_value {
|
|
570
|
+
font-weight: var(--font-weight-semibold);
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
.group_count {
|
|
574
|
+
color: var(--color-muted-foreground);
|
|
575
|
+
font-size: var(--font-size-xs);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
.cell_aggregated {
|
|
579
|
+
font-weight: var(--font-weight-semibold);
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/* ─────────────────────────────────────────────
|
|
583
|
+
Loading / empty states
|
|
584
|
+
───────────────────────────────────────────── */
|
|
585
|
+
.state_overlay {
|
|
586
|
+
width: 100%;
|
|
587
|
+
padding: var(--spacing-14) var(--spacing-8);
|
|
588
|
+
display: flex;
|
|
589
|
+
align-items: center;
|
|
590
|
+
justify-content: center;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
.empty_msg {
|
|
594
|
+
font-size: var(--font-size-sm);
|
|
595
|
+
color: var(--color-muted-foreground);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/* ─────────────────────────────────────────────
|
|
599
|
+
Pagination bar
|
|
600
|
+
margin-top:auto pushes it to the absolute bottom of content_wrap
|
|
601
|
+
no matter how few rows are visible.
|
|
602
|
+
flex-shrink:0 stops it compressing when space is tight.
|
|
603
|
+
───────────────────────────────────────────── */
|
|
604
|
+
.pagination_bar {
|
|
605
|
+
flex-shrink: 0;
|
|
606
|
+
margin-top: auto;
|
|
607
|
+
width: 100%;
|
|
608
|
+
min-width: 0;
|
|
609
|
+
display: flex;
|
|
610
|
+
/* The count and the controls share a row while both fit; past that the
|
|
611
|
+
controls take a row of their own below. Nothing scrolls or clips. */
|
|
612
|
+
flex-wrap: wrap;
|
|
613
|
+
align-items: center;
|
|
614
|
+
justify-content: space-between;
|
|
615
|
+
column-gap: var(--spacing-8);
|
|
616
|
+
row-gap: var(--spacing-4);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
@media (--sm) {
|
|
620
|
+
.pagination_bar {
|
|
621
|
+
column-gap: var(--spacing-5);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
.loading_select_skeleton {
|
|
626
|
+
border-radius: var(--radius-sm);
|
|
627
|
+
flex-shrink: 0;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/* The count, then what a page adds beside it, like the actions on ticked
|
|
631
|
+
rows. The block sizes from nothing and never below its count, so the
|
|
632
|
+
controls wrap only once the count alone and they cannot share a row; on
|
|
633
|
+
their row it takes what the controls leave, and its extra scrolls there. */
|
|
634
|
+
.pagination_left {
|
|
635
|
+
display: flex;
|
|
636
|
+
align-items: center;
|
|
637
|
+
gap: var(--spacing-8);
|
|
638
|
+
flex: 1 1 0;
|
|
639
|
+
min-width: min-content;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
.pagination_left_loading {
|
|
643
|
+
overflow: hidden;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/* The extra slot, a ScrollRail: it takes what the count leaves on the row
|
|
647
|
+
and scrolls across on its own, with no scrollbar, so the bar never changes
|
|
648
|
+
height. Its items claim no width of the row (inline-size containment):
|
|
649
|
+
however many there are, the controls keep their place beside the count. */
|
|
650
|
+
.pagination_extra {
|
|
651
|
+
flex: 1 1 0;
|
|
652
|
+
contain: inline-size;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
.pagination_extra_items {
|
|
656
|
+
gap: var(--spacing-4);
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
.pagination_count {
|
|
660
|
+
flex-shrink: 0;
|
|
661
|
+
font-size: var(--font-size-sm);
|
|
662
|
+
color: var(--color-muted-foreground);
|
|
663
|
+
white-space: nowrap;
|
|
664
|
+
|
|
665
|
+
span {
|
|
666
|
+
font-weight: var(--font-weight-medium);
|
|
667
|
+
color: var(--color-foreground);
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
.pagination_controls {
|
|
672
|
+
display: flex;
|
|
673
|
+
flex-wrap: wrap;
|
|
674
|
+
align-items: center;
|
|
675
|
+
justify-content: flex-end;
|
|
676
|
+
column-gap: var(--spacing-8);
|
|
677
|
+
row-gap: var(--spacing-4);
|
|
678
|
+
min-width: 0;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/* A phone gives the controls a row of their own: the page size at its start,
|
|
682
|
+
the pages at its end. The size keeps its label for screen readers only, and
|
|
683
|
+
the first/last buttons go: prev/next and the page number say as much. */
|
|
684
|
+
@media (--sm) {
|
|
685
|
+
.pagination_controls {
|
|
686
|
+
flex-basis: 100%;
|
|
687
|
+
column-gap: var(--spacing-5);
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
.page_size_wrap {
|
|
691
|
+
margin-inline-end: auto;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
.page_size_label {
|
|
695
|
+
position: absolute;
|
|
696
|
+
width: 1px;
|
|
697
|
+
height: 1px;
|
|
698
|
+
overflow: hidden;
|
|
699
|
+
clip-path: inset(50%);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
.page_nav_edge {
|
|
703
|
+
display: none;
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
.pagination_controls_loading {
|
|
708
|
+
flex-direction: row;
|
|
709
|
+
flex-wrap: wrap;
|
|
710
|
+
align-items: center;
|
|
711
|
+
justify-content: flex-end;
|
|
712
|
+
max-width: 100%;
|
|
713
|
+
row-gap: var(--spacing-4);
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
.pagination_controls_loading > * {
|
|
717
|
+
flex: 0 1 auto;
|
|
718
|
+
min-width: 0;
|
|
719
|
+
max-width: 100%;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
.pagination_text_skeleton {
|
|
723
|
+
height: 1em;
|
|
724
|
+
min-width: 0;
|
|
725
|
+
max-width: 100%;
|
|
726
|
+
flex: 0 1 auto;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
.pagination_select_skeleton,
|
|
730
|
+
.pagination_button_skeleton {
|
|
731
|
+
width: var(--spacing-11);
|
|
732
|
+
height: var(--spacing-11);
|
|
733
|
+
min-width: 0;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
.pagination_select_skeleton {
|
|
737
|
+
flex: 0 1 auto;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
.pagination_button_skeleton {
|
|
741
|
+
flex: 0 0 auto;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
.page_size_wrap {
|
|
745
|
+
display: flex;
|
|
746
|
+
align-items: center;
|
|
747
|
+
gap: var(--spacing-5);
|
|
748
|
+
min-width: 0;
|
|
749
|
+
flex-shrink: 1;
|
|
750
|
+
max-width: 100%;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
.page_size_label {
|
|
754
|
+
font-size: var(--font-size-sm);
|
|
755
|
+
color: var(--color-muted-foreground);
|
|
756
|
+
white-space: nowrap;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
.page_indicator {
|
|
760
|
+
font-size: var(--font-size-sm);
|
|
761
|
+
color: var(--color-muted-foreground);
|
|
762
|
+
white-space: nowrap;
|
|
763
|
+
min-width: 6rem;
|
|
764
|
+
text-align: center;
|
|
765
|
+
|
|
766
|
+
span {
|
|
767
|
+
font-weight: var(--font-weight-medium);
|
|
768
|
+
color: var(--color-foreground);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
.page_nav {
|
|
773
|
+
display: flex;
|
|
774
|
+
align-items: center;
|
|
775
|
+
gap: var(--spacing-2);
|
|
776
|
+
flex-shrink: 0;
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
.page_nav_loading {
|
|
780
|
+
flex-wrap: wrap;
|
|
781
|
+
justify-content: flex-end;
|
|
782
|
+
row-gap: var(--spacing-2);
|
|
783
|
+
min-width: 0;
|
|
784
|
+
max-width: 100%;
|
|
785
|
+
flex-shrink: 1;
|
|
786
|
+
}
|