@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.
Files changed (40) hide show
  1. package/NOTICE.md +1 -1
  2. package/README.md +32 -3
  3. package/dist/class-names.js +1 -1
  4. package/dist/customization.js +1 -1
  5. package/dist/filters/filter-bar.js +3 -0
  6. package/dist/filters/filter-definition.js +1 -0
  7. package/dist/filters/filter-menu-panel.js +1 -1
  8. package/dist/filters/filter-select-editor.d.ts +8 -2
  9. package/dist/filters/filter-select-editor.js +11 -7
  10. package/dist/styles.css +179 -0
  11. package/dist/styles.tailwind3.css +179 -0
  12. package/dist/table/clipboard.d.ts +6 -0
  13. package/dist/table/clipboard.js +51 -0
  14. package/dist/table/columns.d.ts +60 -0
  15. package/dist/table/columns.js +72 -0
  16. package/dist/table/data-table.d.ts +14 -0
  17. package/dist/table/data-table.js +15 -0
  18. package/dist/table/features.d.ts +34 -0
  19. package/dist/table/features.js +35 -0
  20. package/dist/table/index.d.ts +9 -0
  21. package/dist/table/index.js +9 -0
  22. package/dist/table/state.d.ts +31 -0
  23. package/dist/table/state.js +48 -0
  24. package/dist/table/table-controls.d.ts +23 -0
  25. package/dist/table/table-controls.js +95 -0
  26. package/dist/table/table-feedback.d.ts +7 -0
  27. package/dist/table/table-feedback.js +11 -0
  28. package/dist/table/table-parts.d.ts +24 -0
  29. package/dist/table/table-parts.js +67 -0
  30. package/dist/table/table-view.d.ts +35 -0
  31. package/dist/table/table-view.js +110 -0
  32. package/dist/table/use-data-table.d.ts +24 -0
  33. package/dist/table/use-data-table.js +100 -0
  34. package/dist/table/use-result-selection.d.ts +17 -0
  35. package/dist/table/use-result-selection.js +53 -0
  36. package/dist/table/use-table-interaction.d.ts +15 -0
  37. package/dist/table/use-table-interaction.js +125 -0
  38. package/dist/table/use-viewport-width.d.ts +3 -0
  39. package/dist/table/use-viewport-width.js +17 -0
  40. 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";