@mendylanda/ui 0.1.9 → 0.3.0-alpha.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/NOTICE.md +1 -1
- package/README.md +32 -3
- package/dist/class-names.js +1 -1
- package/dist/customization.js +1 -1
- package/dist/filters/filter-bar.js +3 -0
- package/dist/filters/filter-definition.js +1 -0
- package/dist/filters/filter-menu-panel.js +1 -1
- package/dist/filters/filter-select-editor.d.ts +8 -2
- package/dist/filters/filter-select-editor.js +11 -7
- package/dist/styles.css +179 -0
- package/dist/styles.tailwind3.css +179 -0
- package/dist/table/clipboard.d.ts +6 -0
- package/dist/table/clipboard.js +51 -0
- package/dist/table/columns.d.ts +60 -0
- package/dist/table/columns.js +72 -0
- package/dist/table/data-table.d.ts +14 -0
- package/dist/table/data-table.js +15 -0
- package/dist/table/features.d.ts +34 -0
- package/dist/table/features.js +35 -0
- package/dist/table/index.d.ts +9 -0
- package/dist/table/index.js +9 -0
- package/dist/table/state.d.ts +31 -0
- package/dist/table/state.js +48 -0
- package/dist/table/table-controls.d.ts +23 -0
- package/dist/table/table-controls.js +95 -0
- package/dist/table/table-feedback.d.ts +7 -0
- package/dist/table/table-feedback.js +11 -0
- package/dist/table/table-parts.d.ts +24 -0
- package/dist/table/table-parts.js +67 -0
- package/dist/table/table-view.d.ts +35 -0
- package/dist/table/table-view.js +110 -0
- package/dist/table/use-data-table.d.ts +24 -0
- package/dist/table/use-data-table.js +100 -0
- package/dist/table/use-result-selection.d.ts +17 -0
- package/dist/table/use-result-selection.js +53 -0
- package/dist/table/use-table-interaction.d.ts +15 -0
- package/dist/table/use-table-interaction.js +125 -0
- package/dist/table/use-viewport-width.d.ts +3 -0
- package/dist/table/use-viewport-width.js +17 -0
- package/package.json +8 -2
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
@layer properties;
|
|
3
3
|
@layer theme {
|
|
4
4
|
:where([data-mendy-ui]),:where([data-mendy-ui]) {
|
|
5
|
+
--color-green-100: oklch(96.2% 0.044 156.743);
|
|
6
|
+
--color-green-950: oklch(26.6% 0.065 152.934);
|
|
5
7
|
--spacing: 0.25rem;
|
|
6
8
|
--text-xs: 0.75rem;
|
|
7
9
|
--text-xs--line-height: calc(1 / 0.75);
|
|
@@ -48,12 +50,18 @@
|
|
|
48
50
|
.mui-d2d9e1f13413:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
49
51
|
position: relative;
|
|
50
52
|
}
|
|
53
|
+
.mui-964a9431ff49:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
54
|
+
position: sticky;
|
|
55
|
+
}
|
|
51
56
|
.mui-ce13093ad8c9:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
52
57
|
inset: calc(var(--spacing) * 0);
|
|
53
58
|
}
|
|
54
59
|
.mui-3ba24c062d55:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
55
60
|
inset-inline: calc(var(--spacing) * 0);
|
|
56
61
|
}
|
|
62
|
+
.mui-eb9e48c5dda9:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
63
|
+
inset-block: calc(var(--spacing) * 0);
|
|
64
|
+
}
|
|
57
65
|
.mui-cced28c6dc3f:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
58
66
|
inset-inline-start: var(--spacing);
|
|
59
67
|
}
|
|
@@ -78,6 +86,30 @@
|
|
|
78
86
|
.mui-4e45f4841abb:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
79
87
|
top: calc(1 / 2 * 100%);
|
|
80
88
|
}
|
|
89
|
+
.mui-a74c4477017c:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
90
|
+
right: calc(var(--spacing) * 0);
|
|
91
|
+
}
|
|
92
|
+
.mui-30150dd033ab:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
93
|
+
bottom: calc(var(--spacing) * 0);
|
|
94
|
+
}
|
|
95
|
+
.mui-a5c36273c0f0:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
96
|
+
bottom: calc(var(--spacing) * 2);
|
|
97
|
+
}
|
|
98
|
+
.mui-635702706586:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
99
|
+
left: calc(var(--spacing) * 0);
|
|
100
|
+
}
|
|
101
|
+
.mui-014aadadffad:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
102
|
+
isolation: isolate;
|
|
103
|
+
}
|
|
104
|
+
.mui-418e44ad4f9e:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
105
|
+
z-index: 10;
|
|
106
|
+
}
|
|
107
|
+
.mui-4e8f0a87a0dc:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
108
|
+
z-index: 20;
|
|
109
|
+
}
|
|
110
|
+
.mui-fbb62f5cb6fe:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
111
|
+
z-index: 30;
|
|
112
|
+
}
|
|
81
113
|
.mui-3eef1ce97dba:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
82
114
|
z-index: 50;
|
|
83
115
|
}
|
|
@@ -147,6 +179,9 @@
|
|
|
147
179
|
.mui-123306850fe1:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
148
180
|
display: inline-flex;
|
|
149
181
|
}
|
|
182
|
+
.mui-0d4fc4a78d37:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
183
|
+
display: table;
|
|
184
|
+
}
|
|
150
185
|
.mui-3da89b3ed14b:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
151
186
|
field-sizing: content;
|
|
152
187
|
}
|
|
@@ -161,6 +196,10 @@
|
|
|
161
196
|
width: calc(var(--spacing) * 1.5);
|
|
162
197
|
height: calc(var(--spacing) * 1.5);
|
|
163
198
|
}
|
|
199
|
+
.mui-5e34f5313859:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
200
|
+
width: calc(var(--spacing) * 3);
|
|
201
|
+
height: calc(var(--spacing) * 3);
|
|
202
|
+
}
|
|
164
203
|
.mui-61c000c8a98a:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
165
204
|
width: calc(var(--spacing) * 3.5);
|
|
166
205
|
height: calc(var(--spacing) * 3.5);
|
|
@@ -229,6 +268,9 @@
|
|
|
229
268
|
.mui-1f061e70178e:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
230
269
|
max-height: var(--radix-dropdown-menu-content-available-height);
|
|
231
270
|
}
|
|
271
|
+
.mui-b057efba3283:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
272
|
+
max-height: calc(var(--spacing) * 96);
|
|
273
|
+
}
|
|
232
274
|
.mui-80baa5d03af7:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
233
275
|
max-height: calc(var(--filter-menu-height) - 2px);
|
|
234
276
|
}
|
|
@@ -256,9 +298,15 @@
|
|
|
256
298
|
.mui-d48fe95d4da8:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
257
299
|
width: var(--cell-size);
|
|
258
300
|
}
|
|
301
|
+
.mui-d4ea834145ae:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
302
|
+
width: calc(var(--spacing) * 2);
|
|
303
|
+
}
|
|
259
304
|
.mui-8867d85ed290:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
260
305
|
width: calc(var(--spacing) * 8);
|
|
261
306
|
}
|
|
307
|
+
.mui-4ac4ec8dfbce:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
308
|
+
width: calc(var(--spacing) * 40);
|
|
309
|
+
}
|
|
262
310
|
.mui-72b37c1a040d:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
263
311
|
width: calc(var(--spacing) * 64);
|
|
264
312
|
}
|
|
@@ -298,6 +346,9 @@
|
|
|
298
346
|
.mui-e9ab1547c94d:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
299
347
|
min-width: 8rem;
|
|
300
348
|
}
|
|
349
|
+
.mui-2bf6510f1330:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
350
|
+
min-width: 100%;
|
|
351
|
+
}
|
|
301
352
|
.mui-7bd5bab6d7f4:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
302
353
|
flex: 1;
|
|
303
354
|
}
|
|
@@ -326,9 +377,15 @@
|
|
|
326
377
|
.mui-7b3cd77eb999:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
327
378
|
animation: var(--animate-pulse);
|
|
328
379
|
}
|
|
380
|
+
.mui-2194d094b585:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
381
|
+
cursor: col-resize;
|
|
382
|
+
}
|
|
329
383
|
.mui-d343f41ba73e:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
330
384
|
cursor: default;
|
|
331
385
|
}
|
|
386
|
+
.mui-739a9a000791:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
387
|
+
touch-action: none;
|
|
388
|
+
}
|
|
332
389
|
.mui-acd532d8913e:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
333
390
|
resize: both;
|
|
334
391
|
}
|
|
@@ -362,6 +419,9 @@
|
|
|
362
419
|
.mui-a503dd374cca:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
363
420
|
justify-content: center;
|
|
364
421
|
}
|
|
422
|
+
.mui-307644c34db6:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
423
|
+
justify-content: flex-end;
|
|
424
|
+
}
|
|
365
425
|
.mui-c62ec162662e:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
366
426
|
justify-content: flex-start;
|
|
367
427
|
}
|
|
@@ -394,11 +454,21 @@
|
|
|
394
454
|
margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--mendy-tw-space-y-reverse)));
|
|
395
455
|
}
|
|
396
456
|
}
|
|
457
|
+
.mui-b8ceaab118a4:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
458
|
+
:where(& > :not(:last-child)) {
|
|
459
|
+
--mendy-tw-space-y-reverse: 0;
|
|
460
|
+
margin-block-start: calc(calc(var(--spacing) * 3) * var(--mendy-tw-space-y-reverse));
|
|
461
|
+
margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--mendy-tw-space-y-reverse)));
|
|
462
|
+
}
|
|
463
|
+
}
|
|
397
464
|
.mui-5a3a4ee420c2:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
398
465
|
overflow: hidden;
|
|
399
466
|
text-overflow: ellipsis;
|
|
400
467
|
white-space: nowrap;
|
|
401
468
|
}
|
|
469
|
+
.mui-1a26a0d28420:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
470
|
+
overflow: auto;
|
|
471
|
+
}
|
|
402
472
|
.mui-d5111d0e9f48:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
403
473
|
overflow: hidden;
|
|
404
474
|
}
|
|
@@ -414,6 +484,9 @@
|
|
|
414
484
|
.mui-998780cdef87:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
415
485
|
overscroll-behavior: contain;
|
|
416
486
|
}
|
|
487
|
+
.mui-01024deec75e:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
488
|
+
border-radius: 0.25rem;
|
|
489
|
+
}
|
|
417
490
|
.mui-b005d61d0953:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
418
491
|
border-radius: calc(infinity * 1px);
|
|
419
492
|
}
|
|
@@ -496,6 +569,12 @@
|
|
|
496
569
|
.mui-965cf6587342:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
497
570
|
background-color: var(--destructive, #dc2626);
|
|
498
571
|
}
|
|
572
|
+
.mui-047624ec0c39:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
573
|
+
background-color: var(--color-green-100);
|
|
574
|
+
}
|
|
575
|
+
.mui-87ecb59f2d2d:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
576
|
+
background-color: var(--muted, #f5f5f5);
|
|
577
|
+
}
|
|
499
578
|
.mui-810ae775809b:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
500
579
|
background-color: var(--muted-foreground, #737373);
|
|
501
580
|
@supports (color: color-mix(in lab, red, red)) {
|
|
@@ -526,9 +605,18 @@
|
|
|
526
605
|
.mui-094f5333853b:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
527
606
|
padding: calc(var(--spacing) * 3);
|
|
528
607
|
}
|
|
608
|
+
.mui-c432836760e3:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
609
|
+
padding: calc(var(--spacing) * 6);
|
|
610
|
+
}
|
|
611
|
+
.mui-c7902d77ad80:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
612
|
+
padding: calc(var(--spacing) * 8);
|
|
613
|
+
}
|
|
529
614
|
.mui-56b8f5e0fb12:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
530
615
|
padding-inline: var(--cell-size);
|
|
531
616
|
}
|
|
617
|
+
.mui-16e909e6f01d:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
618
|
+
padding-inline: calc(var(--spacing) * 0);
|
|
619
|
+
}
|
|
532
620
|
.mui-1da2e8f173c5:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
533
621
|
padding-inline: calc(var(--spacing) * 1.5);
|
|
534
622
|
}
|
|
@@ -583,6 +671,9 @@
|
|
|
583
671
|
.mui-05ab12448317:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
584
672
|
text-align: center;
|
|
585
673
|
}
|
|
674
|
+
.mui-10558dbb3a24:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
675
|
+
text-align: end;
|
|
676
|
+
}
|
|
586
677
|
.mui-e9347b78185f:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
587
678
|
text-align: start;
|
|
588
679
|
}
|
|
@@ -759,6 +850,13 @@
|
|
|
759
850
|
.mui-14bd99410890:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
760
851
|
unicode-bidi: isolate;
|
|
761
852
|
}
|
|
853
|
+
.mui-97b1c00ff005:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
854
|
+
&:is(:where(.mui-ad936fcbed63):hover *) {
|
|
855
|
+
@media (hover: hover) {
|
|
856
|
+
background-color: var(--accent, #f5f5f5);
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
}
|
|
762
860
|
.mui-9af9a4182597:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
763
861
|
&:is(:where(.mui-ad936fcbed63)[data-disabled="true"] *) {
|
|
764
862
|
pointer-events: none;
|
|
@@ -795,6 +893,11 @@
|
|
|
795
893
|
--mendy-tw-ring-color: var(--ring, #737373);
|
|
796
894
|
}
|
|
797
895
|
}
|
|
896
|
+
.mui-e6020023567a:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
897
|
+
&:is(:where(.mui-ad936fcbed63)[data-highlighted="true"] *) {
|
|
898
|
+
background-color: var(--accent, #f5f5f5);
|
|
899
|
+
}
|
|
900
|
+
}
|
|
798
901
|
.mui-f0ee83167878:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
799
902
|
&:is(:where(.mui-2ffc1d06387e):disabled ~ *) {
|
|
800
903
|
cursor: not-allowed;
|
|
@@ -833,6 +936,18 @@
|
|
|
833
936
|
color: var(--muted-foreground, #737373);
|
|
834
937
|
}
|
|
835
938
|
}
|
|
939
|
+
.mui-3deb00079b4c:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
940
|
+
&:first-child {
|
|
941
|
+
border-inline-start-style: var(--mendy-tw-border-style);
|
|
942
|
+
border-inline-start-width: 0px;
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
.mui-beeef6663906:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
946
|
+
&:last-child {
|
|
947
|
+
border-inline-end-style: var(--mendy-tw-border-style);
|
|
948
|
+
border-inline-end-width: 0px;
|
|
949
|
+
}
|
|
950
|
+
}
|
|
836
951
|
.mui-37ad15a95595:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
837
952
|
&:hover {
|
|
838
953
|
@media (hover: hover) {
|
|
@@ -840,6 +955,16 @@
|
|
|
840
955
|
}
|
|
841
956
|
}
|
|
842
957
|
}
|
|
958
|
+
.mui-63b29dace366:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
959
|
+
&:hover {
|
|
960
|
+
@media (hover: hover) {
|
|
961
|
+
background-color: var(--accent, #f5f5f5);
|
|
962
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
963
|
+
background-color: color-mix(in oklab, var(--accent, #f5f5f5) 50%, transparent);
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
}
|
|
843
968
|
.mui-bb6a4b3e902d:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
844
969
|
&:hover {
|
|
845
970
|
@media (hover: hover) {
|
|
@@ -850,6 +975,16 @@
|
|
|
850
975
|
}
|
|
851
976
|
}
|
|
852
977
|
}
|
|
978
|
+
.mui-4273133a876a:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
979
|
+
&:hover {
|
|
980
|
+
@media (hover: hover) {
|
|
981
|
+
background-color: var(--primary, #171717);
|
|
982
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
983
|
+
background-color: color-mix(in oklab, var(--primary, #171717) 20%, transparent);
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
}
|
|
853
988
|
.mui-af9ea085901b:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
854
989
|
&:hover {
|
|
855
990
|
@media (hover: hover) {
|
|
@@ -920,6 +1055,14 @@
|
|
|
920
1055
|
border-color: var(--ring, #737373);
|
|
921
1056
|
}
|
|
922
1057
|
}
|
|
1058
|
+
.mui-2f669cfad5aa:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
1059
|
+
&:focus-visible {
|
|
1060
|
+
background-color: var(--primary, #171717);
|
|
1061
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
1062
|
+
background-color: color-mix(in oklab, var(--primary, #171717) 20%, transparent);
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
923
1066
|
.mui-39be5a15b766:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
924
1067
|
&:focus-visible {
|
|
925
1068
|
--mendy-tw-ring-shadow: var(--mendy-tw-ring-inset,) 0 0 0 calc(1px + var(--mendy-tw-ring-offset-width)) var(--mendy-tw-ring-color, currentcolor);
|
|
@@ -951,12 +1094,28 @@
|
|
|
951
1094
|
}
|
|
952
1095
|
}
|
|
953
1096
|
}
|
|
1097
|
+
.mui-a47d391255f3:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
1098
|
+
&:focus-visible {
|
|
1099
|
+
outline-style: var(--mendy-tw-outline-style);
|
|
1100
|
+
outline-width: 1px;
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
954
1103
|
.mui-1df9125eebaf:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
955
1104
|
&:focus-visible {
|
|
956
1105
|
outline-style: var(--mendy-tw-outline-style);
|
|
957
1106
|
outline-width: 1px;
|
|
958
1107
|
}
|
|
959
1108
|
}
|
|
1109
|
+
.mui-a8719ed8b095:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
1110
|
+
&:focus-visible {
|
|
1111
|
+
outline-offset: calc(2px * -1);
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
.mui-2b1c7d88acff:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
1115
|
+
&:focus-visible {
|
|
1116
|
+
outline-color: var(--primary, #171717);
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
960
1119
|
.mui-223daa83ed2d:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
961
1120
|
&:focus-visible {
|
|
962
1121
|
outline-color: var(--ring, #737373);
|
|
@@ -1045,6 +1204,16 @@
|
|
|
1045
1204
|
}
|
|
1046
1205
|
}
|
|
1047
1206
|
}
|
|
1207
|
+
.mui-2d6703b5473b:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
1208
|
+
&[aria-pressed="true"] {
|
|
1209
|
+
background-color: var(--accent, #f5f5f5);
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
.mui-ff2dcda51a27:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
1213
|
+
&[aria-pressed="true"] {
|
|
1214
|
+
color: var(--accent-foreground, #171717);
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1048
1217
|
.mui-7d900a71e5ba:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
1049
1218
|
&[aria-selected="true"] {
|
|
1050
1219
|
color: var(--muted-foreground, #737373);
|
|
@@ -1060,6 +1229,11 @@
|
|
|
1060
1229
|
opacity: 50%;
|
|
1061
1230
|
}
|
|
1062
1231
|
}
|
|
1232
|
+
.mui-9d7d1760cd8e:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
1233
|
+
&[data-highlighted="true"] {
|
|
1234
|
+
background-color: var(--accent, #f5f5f5);
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1063
1237
|
.mui-6fa6a8ade7c4:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
1064
1238
|
&[data-inset] {
|
|
1065
1239
|
padding-left: calc(var(--spacing) * 8);
|
|
@@ -1292,6 +1466,11 @@
|
|
|
1292
1466
|
rotate: 180deg;
|
|
1293
1467
|
}
|
|
1294
1468
|
}
|
|
1469
|
+
.mui-d254c96aea74:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
1470
|
+
&:is(.dark *) {
|
|
1471
|
+
background-color: var(--color-green-950);
|
|
1472
|
+
}
|
|
1473
|
+
}
|
|
1295
1474
|
.mui-9daa2369a41b:where([data-mendy-ui], [data-mendy-ui] *) {
|
|
1296
1475
|
&:is(.dark *) {
|
|
1297
1476
|
background-color: var(--input, #e5e5e5);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DataTableInstance } from "./use-data-table.js";
|
|
2
|
+
export declare const interactiveSelector = "button, a, input, textarea, select, [contenteditable]:not([contenteditable=\"false\"]), [role=\"checkbox\"], [role=\"button\"], [role=\"textbox\"]";
|
|
3
|
+
export declare function selectedCellsText<T extends object>(table: DataTableInstance<T>): string;
|
|
4
|
+
export declare function tableCsv<T extends object>(table: DataTableInstance<T>, options?: {
|
|
5
|
+
selectedOnly?: boolean;
|
|
6
|
+
}): string;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { csvValue, tsvValue } from "./state.js";
|
|
2
|
+
export const interactiveSelector = 'button, a, input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="checkbox"], [role="button"], [role="textbox"]';
|
|
3
|
+
export function selectedCellsText(table) {
|
|
4
|
+
const selected = new Set(table.getSelectedCellIds());
|
|
5
|
+
const rows = table
|
|
6
|
+
.getRowsInDisplayOrder()
|
|
7
|
+
.filter((row) => row.getVisibleCells().some((cell) => selected.has(cell.id)));
|
|
8
|
+
const columns = new Set(rows.flatMap((row) => row
|
|
9
|
+
.getVisibleCells()
|
|
10
|
+
.filter((cell) => selected.has(cell.id))
|
|
11
|
+
.map((cell) => cell.column.id)));
|
|
12
|
+
return rows
|
|
13
|
+
.map((row) => row
|
|
14
|
+
.getVisibleCells()
|
|
15
|
+
.filter((cell) => columns.has(cell.column.id))
|
|
16
|
+
.map((cell) => {
|
|
17
|
+
if (!selected.has(cell.id))
|
|
18
|
+
return "";
|
|
19
|
+
const definition = cell.column.columnDef;
|
|
20
|
+
return tsvValue(definition.copyValue?.(row.original) ??
|
|
21
|
+
definition.getCellValue?.(row.original) ??
|
|
22
|
+
String(cell.getValue() ?? ""));
|
|
23
|
+
})
|
|
24
|
+
.join("\t"))
|
|
25
|
+
.join("\n");
|
|
26
|
+
}
|
|
27
|
+
export function tableCsv(table, options = {}) {
|
|
28
|
+
const columns = table.getVisibleLeafColumns().flatMap((column) => {
|
|
29
|
+
const definition = column.columnDef;
|
|
30
|
+
if (definition.exportOptions === false)
|
|
31
|
+
return [];
|
|
32
|
+
if (definition.exportOptions)
|
|
33
|
+
return Array.isArray(definition.exportOptions)
|
|
34
|
+
? definition.exportOptions
|
|
35
|
+
: [definition.exportOptions];
|
|
36
|
+
return [
|
|
37
|
+
{
|
|
38
|
+
header: definition.label ??
|
|
39
|
+
(typeof definition.header === "string" ? definition.header : column.id),
|
|
40
|
+
value: (row) => definition.copyValue?.(row) ?? String(column.accessorFn?.(row, 0) ?? ""),
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
});
|
|
44
|
+
const rows = table
|
|
45
|
+
.getRowsInDisplayOrder()
|
|
46
|
+
.filter((row) => !options.selectedOnly || row.getIsSelected());
|
|
47
|
+
return [
|
|
48
|
+
columns.map((column) => csvValue(column.header)).join(","),
|
|
49
|
+
...rows.map((row) => columns.map((column) => csvValue(column.value(row.original))).join(",")),
|
|
50
|
+
].join("\r\n");
|
|
51
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { ColumnDef } from "@tanstack/react-table";
|
|
3
|
+
import type { DataTableFeatures } from "./features.js";
|
|
4
|
+
export type TableColumn<T extends object> = ColumnDef<DataTableFeatures, T> & {
|
|
5
|
+
label?: string;
|
|
6
|
+
align?: "start" | "center" | "end";
|
|
7
|
+
defaultHidden?: boolean;
|
|
8
|
+
pin?: "start" | "end";
|
|
9
|
+
copyValue?: (row: T) => string;
|
|
10
|
+
getCellValue?: (row: T) => string | null;
|
|
11
|
+
exportOptions?: {
|
|
12
|
+
header: string;
|
|
13
|
+
value: (row: T) => string;
|
|
14
|
+
} | {
|
|
15
|
+
header: string;
|
|
16
|
+
value: (row: T) => string;
|
|
17
|
+
}[] | false;
|
|
18
|
+
};
|
|
19
|
+
type Paths<T extends object, D extends unknown[] = []> = D["length"] extends 5 ? never : {
|
|
20
|
+
[K in keyof T & string]: NonNullable<T[K]> extends Date | readonly unknown[] ? K : NonNullable<T[K]> extends object ? K | `${K}.${Paths<NonNullable<T[K]>, [...D, 0]>}` : K;
|
|
21
|
+
}[keyof T & string];
|
|
22
|
+
type At<T extends object, P extends string> = P extends `${infer K}.${infer R}` ? K extends keyof T ? At<NonNullable<T[K]>, R> | Extract<T[K], null | undefined> : never : P extends keyof T ? T[P] : never;
|
|
23
|
+
export interface ValueFormat<V> {
|
|
24
|
+
display: (value: V) => ReactNode;
|
|
25
|
+
text: (value: V) => string;
|
|
26
|
+
align?: "start" | "center" | "end";
|
|
27
|
+
}
|
|
28
|
+
interface ValueOptions<T extends object, V> {
|
|
29
|
+
label: string;
|
|
30
|
+
size?: number;
|
|
31
|
+
minSize?: number;
|
|
32
|
+
maxSize?: number;
|
|
33
|
+
hidden?: boolean;
|
|
34
|
+
pin?: "start" | "end";
|
|
35
|
+
sortable?: boolean;
|
|
36
|
+
format?: ValueFormat<NonNullable<V>>;
|
|
37
|
+
render?: (context: {
|
|
38
|
+
row: T;
|
|
39
|
+
value: V;
|
|
40
|
+
}) => ReactNode;
|
|
41
|
+
copy?: (value: V, row: T) => string;
|
|
42
|
+
export?: false | ((value: V, row: T) => string);
|
|
43
|
+
}
|
|
44
|
+
interface ColumnBuilder<T extends object> {
|
|
45
|
+
accessor<P extends Paths<T>>(path: P, options: ValueOptions<T, At<T, P>>): TableColumn<T>;
|
|
46
|
+
computed<V>(id: string, value: (row: T) => V, options: ValueOptions<T, V>): TableColumn<T>;
|
|
47
|
+
display(id: string, options: {
|
|
48
|
+
label: string;
|
|
49
|
+
render: (row: T) => ReactNode;
|
|
50
|
+
size?: number;
|
|
51
|
+
pin?: "start" | "end";
|
|
52
|
+
}): TableColumn<T>;
|
|
53
|
+
}
|
|
54
|
+
export declare function defineColumns<T extends object>(define: (column: ColumnBuilder<T>) => TableColumn<T>[]): TableColumn<T>[];
|
|
55
|
+
export declare const format: {
|
|
56
|
+
currency(currency: string, locale?: string): ValueFormat<number>;
|
|
57
|
+
number(options?: Intl.NumberFormatOptions, locale?: string): ValueFormat<number>;
|
|
58
|
+
date(options?: Intl.DateTimeFormatOptions, locale?: string): ValueFormat<Date>;
|
|
59
|
+
};
|
|
60
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
function valueColumn(id, value, options) {
|
|
2
|
+
const text = (row) => {
|
|
3
|
+
const v = value(row);
|
|
4
|
+
return v == null ? "" : (options.format?.text(v) ?? String(v));
|
|
5
|
+
};
|
|
6
|
+
return {
|
|
7
|
+
id,
|
|
8
|
+
accessorFn: value,
|
|
9
|
+
header: options.label,
|
|
10
|
+
label: options.label,
|
|
11
|
+
size: options.size,
|
|
12
|
+
minSize: options.minSize,
|
|
13
|
+
maxSize: options.maxSize,
|
|
14
|
+
defaultHidden: options.hidden,
|
|
15
|
+
pin: options.pin,
|
|
16
|
+
align: options.format?.align,
|
|
17
|
+
enableSorting: options.sortable ?? true,
|
|
18
|
+
cell: ({ row }) => {
|
|
19
|
+
const v = value(row.original);
|
|
20
|
+
return options.render
|
|
21
|
+
? options.render({ row: row.original, value: v })
|
|
22
|
+
: v == null
|
|
23
|
+
? "—"
|
|
24
|
+
: (options.format?.display(v) ?? String(v));
|
|
25
|
+
},
|
|
26
|
+
copyValue: options.copy ? (row) => options.copy(value(row), row) : text,
|
|
27
|
+
exportOptions: options.export === false
|
|
28
|
+
? false
|
|
29
|
+
: {
|
|
30
|
+
header: options.label,
|
|
31
|
+
value: typeof options.export === "function"
|
|
32
|
+
? (row) => options.export(value(row), row)
|
|
33
|
+
: text,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function defineColumns(define) {
|
|
38
|
+
return define({
|
|
39
|
+
accessor: (path, options) => valueColumn(path, (row) => path
|
|
40
|
+
.split(".")
|
|
41
|
+
.reduce((v, key) => (v == null ? undefined : v[key]), row), options),
|
|
42
|
+
computed: valueColumn,
|
|
43
|
+
display: (id, options) => ({
|
|
44
|
+
id,
|
|
45
|
+
label: options.label,
|
|
46
|
+
header: options.label,
|
|
47
|
+
size: options.size,
|
|
48
|
+
pin: options.pin,
|
|
49
|
+
enableSorting: false,
|
|
50
|
+
enableCellSelection: false,
|
|
51
|
+
cell: ({ row }) => options.render(row.original),
|
|
52
|
+
exportOptions: false,
|
|
53
|
+
}),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
export const format = {
|
|
57
|
+
currency(currency, locale) {
|
|
58
|
+
// react-doctor-disable-next-line react-doctor/js-hoist-intl -- Formatter factories run when defining columns; their closures reuse this instance for every cell.
|
|
59
|
+
const formatter = new Intl.NumberFormat(locale, { style: "currency", currency });
|
|
60
|
+
return { display: formatter.format, text: formatter.format, align: "end" };
|
|
61
|
+
},
|
|
62
|
+
number(options, locale) {
|
|
63
|
+
// react-doctor-disable-next-line react-doctor/js-hoist-intl -- Formatter factories run when defining columns; their closures reuse this instance for every cell.
|
|
64
|
+
const formatter = new Intl.NumberFormat(locale, options);
|
|
65
|
+
return { display: formatter.format, text: formatter.format, align: "end" };
|
|
66
|
+
},
|
|
67
|
+
date(options, locale) {
|
|
68
|
+
// react-doctor-disable-next-line react-doctor/js-hoist-intl -- Formatter factories run when defining columns; their closures reuse this instance for every cell.
|
|
69
|
+
const formatter = new Intl.DateTimeFormat(locale, options);
|
|
70
|
+
return { display: formatter.format, text: formatter.format };
|
|
71
|
+
},
|
|
72
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { UseDataTableOptions, DataTableInstance } from "./use-data-table.js";
|
|
3
|
+
import type { TableViewProps } from "./table-view.js";
|
|
4
|
+
type Appearance<T extends object> = Omit<TableViewProps<T>, "table"> & {
|
|
5
|
+
toolbar?: ReactNode;
|
|
6
|
+
footer?: ReactNode;
|
|
7
|
+
showColumnSettings?: boolean;
|
|
8
|
+
showPagination?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type DataTableProps<T extends object> = Appearance<T> & (UseDataTableOptions<T> | {
|
|
11
|
+
table: DataTableInstance<T>;
|
|
12
|
+
});
|
|
13
|
+
export declare function DataTable<T extends object>(props: DataTableProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useDataTable } from "./use-data-table.js";
|
|
4
|
+
import { TableView } from "./table-view.js";
|
|
5
|
+
import { TableColumnSettings, TablePagination } from "./table-controls.js";
|
|
6
|
+
function ControlledTable({ table, toolbar, footer, showColumnSettings = true, showPagination = false, ...view }) {
|
|
7
|
+
return (_jsxs("div", { "data-mendy-ui": "", className: "mui-184ddc11e5f9 mui-267171770524", children: [(toolbar || showColumnSettings) && (_jsxs("div", { className: "mui-222f930b8752 mui-faa8a23c68f6 mui-b9677bd1cb66 mui-32c92bb1fde4 mui-074569488cca", children: [_jsx("div", { className: "mui-184ddc11e5f9 mui-7bd5bab6d7f4", children: toolbar }), showColumnSettings && _jsx(TableColumnSettings, { table: table })] })), _jsx(TableView, { table: table, ...view }), showPagination && (_jsx(TablePagination, { table: table, loading: view.status === "loading" || view.refreshing })), footer] }));
|
|
8
|
+
}
|
|
9
|
+
function ConfiguredTable(props) {
|
|
10
|
+
const table = useDataTable(props);
|
|
11
|
+
return (_jsx(ControlledTable, { ...props, table: table, showPagination: props.showPagination ?? props.processing?.pagination === "client" }));
|
|
12
|
+
}
|
|
13
|
+
export function DataTable(props) {
|
|
14
|
+
return "table" in props ? _jsx(ControlledTable, { ...props }) : _jsx(ConfiguredTable, { ...props });
|
|
15
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare const tableFeaturesDefault: {
|
|
2
|
+
cellSelectionFeature: import("@tanstack/react-table").TableFeature;
|
|
3
|
+
columnResizingFeature: import("@tanstack/react-table").TableFeature;
|
|
4
|
+
columnOrderingFeature: import("@tanstack/react-table").TableFeature;
|
|
5
|
+
columnPinningFeature: import("@tanstack/react-table").TableFeature;
|
|
6
|
+
columnSizingFeature: import("@tanstack/react-table").TableFeature;
|
|
7
|
+
columnVisibilityFeature: import("@tanstack/react-table").TableFeature;
|
|
8
|
+
columnFilteringFeature: import("@tanstack/react-table").TableFeature;
|
|
9
|
+
columnFacetingFeature: import("@tanstack/react-table").TableFeature;
|
|
10
|
+
globalFilteringFeature: import("@tanstack/react-table").TableFeature;
|
|
11
|
+
rowPaginationFeature: import("@tanstack/react-table").TableFeature;
|
|
12
|
+
rowSelectionFeature: import("@tanstack/react-table").TableFeature;
|
|
13
|
+
rowSortingFeature: import("@tanstack/react-table").TableFeature;
|
|
14
|
+
filteredRowModel: (table: import("@tanstack/react-table").Table<any, any>) => () => import("@tanstack/react-table").RowModel<any, any>;
|
|
15
|
+
sortedRowModel: (table: import("@tanstack/react-table").Table<any, any>) => () => import("@tanstack/react-table").RowModel<any, any>;
|
|
16
|
+
paginatedRowModel: (table: import("@tanstack/react-table").Table<any, any>) => () => import("@tanstack/react-table").RowModel<any, any>;
|
|
17
|
+
facetedRowModel: (table: import("@tanstack/react-table").Table<any, any>, columnId: string) => () => import("@tanstack/react-table").RowModel<any, any>;
|
|
18
|
+
facetedUniqueValues: (table: import("@tanstack/react-table").Table<import("@tanstack/react-table").TableFeatures, any>, columnId: string) => () => Map<any, number>;
|
|
19
|
+
filterFns: {
|
|
20
|
+
includesString: import("@tanstack/react-table").CreatedFilterFn<any, any>;
|
|
21
|
+
inNumberRange: import("@tanstack/react-table").CreatedFilterFn<any, any>;
|
|
22
|
+
inDateRange: import("@tanstack/react-table").CreatedFilterFn<any, any>;
|
|
23
|
+
equals: import("@tanstack/react-table").CreatedFilterFn<any, any>;
|
|
24
|
+
arrIncludes: import("@tanstack/react-table").CreatedFilterFn<any, any>;
|
|
25
|
+
weakEquals: import("@tanstack/react-table").CreatedFilterFn<any, any>;
|
|
26
|
+
};
|
|
27
|
+
sortFns: {
|
|
28
|
+
alphanumeric: import("@tanstack/react-table").CreatedSortFn<any, any>;
|
|
29
|
+
basic: import("@tanstack/react-table").CreatedSortFn<any, any>;
|
|
30
|
+
datetime: import("@tanstack/react-table").CreatedSortFn<any, any>;
|
|
31
|
+
text: import("@tanstack/react-table").CreatedSortFn<any, any>;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export type DataTableFeatures = typeof tableFeaturesDefault;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { columnFacetingFeature, columnFilteringFeature, cellSelectionFeature, columnResizingFeature, columnOrderingFeature, columnPinningFeature, columnSizingFeature, columnVisibilityFeature, createFacetedRowModel, createFacetedUniqueValues, createFilteredRowModel, createPaginatedRowModel, createSortedRowModel, filterFn_arrIncludes, filterFn_equals, filterFn_inDateRange, filterFn_inNumberRange, filterFn_includesString, filterFn_weakEquals, globalFilteringFeature, rowPaginationFeature, rowSelectionFeature, rowSortingFeature, sortFn_alphanumeric, sortFn_basic, sortFn_datetime, sortFn_text, tableFeatures, } from "@tanstack/react-table";
|
|
2
|
+
export const tableFeaturesDefault = tableFeatures({
|
|
3
|
+
cellSelectionFeature,
|
|
4
|
+
columnResizingFeature,
|
|
5
|
+
columnOrderingFeature,
|
|
6
|
+
columnPinningFeature,
|
|
7
|
+
columnSizingFeature,
|
|
8
|
+
columnVisibilityFeature,
|
|
9
|
+
columnFilteringFeature,
|
|
10
|
+
columnFacetingFeature,
|
|
11
|
+
globalFilteringFeature,
|
|
12
|
+
rowPaginationFeature,
|
|
13
|
+
rowSelectionFeature,
|
|
14
|
+
rowSortingFeature,
|
|
15
|
+
filteredRowModel: createFilteredRowModel(),
|
|
16
|
+
sortedRowModel: createSortedRowModel(),
|
|
17
|
+
paginatedRowModel: createPaginatedRowModel(),
|
|
18
|
+
facetedRowModel: createFacetedRowModel(),
|
|
19
|
+
facetedUniqueValues: createFacetedUniqueValues(),
|
|
20
|
+
// Register the functions used by automatic filter and sort inference.
|
|
21
|
+
filterFns: {
|
|
22
|
+
includesString: filterFn_includesString,
|
|
23
|
+
inNumberRange: filterFn_inNumberRange,
|
|
24
|
+
inDateRange: filterFn_inDateRange,
|
|
25
|
+
equals: filterFn_equals,
|
|
26
|
+
arrIncludes: filterFn_arrIncludes,
|
|
27
|
+
weakEquals: filterFn_weakEquals,
|
|
28
|
+
},
|
|
29
|
+
sortFns: {
|
|
30
|
+
alphanumeric: sortFn_alphanumeric,
|
|
31
|
+
basic: sortFn_basic,
|
|
32
|
+
datetime: sortFn_datetime,
|
|
33
|
+
text: sortFn_text,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./columns.js";
|
|
2
|
+
export * from "./features.js";
|
|
3
|
+
export * from "./state.js";
|
|
4
|
+
export * from "./use-data-table.js";
|
|
5
|
+
export * from "./use-result-selection.js";
|
|
6
|
+
export * from "./table-view.js";
|
|
7
|
+
export * from "./table-controls.js";
|
|
8
|
+
export * from "./data-table.js";
|
|
9
|
+
export * from "./clipboard.js";
|