@mendylanda/ui 0.2.0 → 0.3.0-alpha.1

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 (37) hide show
  1. package/README.md +22 -0
  2. package/dist/class-names.js +1 -1
  3. package/dist/styles.css +162 -0
  4. package/dist/styles.tailwind3.css +162 -0
  5. package/dist/table/clipboard.d.ts +6 -0
  6. package/dist/table/clipboard.js +51 -0
  7. package/dist/table/columns.d.ts +60 -0
  8. package/dist/table/columns.js +72 -0
  9. package/dist/table/data-table.d.ts +14 -0
  10. package/dist/table/data-table.js +15 -0
  11. package/dist/table/features.d.ts +34 -0
  12. package/dist/table/features.js +35 -0
  13. package/dist/table/index.d.ts +9 -0
  14. package/dist/table/index.js +9 -0
  15. package/dist/table/state.d.ts +31 -0
  16. package/dist/table/state.js +48 -0
  17. package/dist/table/table-controls.d.ts +23 -0
  18. package/dist/table/table-controls.js +99 -0
  19. package/dist/table/table-feedback.d.ts +7 -0
  20. package/dist/table/table-feedback.js +11 -0
  21. package/dist/table/table-layout.d.ts +43 -0
  22. package/dist/table/table-layout.js +51 -0
  23. package/dist/table/table-loading.d.ts +11 -0
  24. package/dist/table/table-loading.js +5 -0
  25. package/dist/table/table-parts.d.ts +24 -0
  26. package/dist/table/table-parts.js +67 -0
  27. package/dist/table/table-view.d.ts +35 -0
  28. package/dist/table/table-view.js +78 -0
  29. package/dist/table/use-data-table.d.ts +24 -0
  30. package/dist/table/use-data-table.js +100 -0
  31. package/dist/table/use-result-selection.d.ts +17 -0
  32. package/dist/table/use-result-selection.js +53 -0
  33. package/dist/table/use-table-interaction.d.ts +15 -0
  34. package/dist/table/use-table-interaction.js +125 -0
  35. package/dist/table/use-viewport-width.d.ts +3 -0
  36. package/dist/table/use-viewport-width.js +17 -0
  37. package/package.json +14 -7
@@ -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);
@@ -199,6 +238,9 @@
199
238
  .mui-c7d5500b77ab:where([data-mendy-ui], [data-mendy-ui] *) {
200
239
  height: calc(var(--spacing) * 0);
201
240
  }
241
+ .mui-2edce89ef182:where([data-mendy-ui], [data-mendy-ui] *) {
242
+ height: calc(var(--spacing) * 3);
243
+ }
202
244
  .mui-099be97e1fa4:where([data-mendy-ui], [data-mendy-ui] *) {
203
245
  height: calc(var(--spacing) * 4);
204
246
  }
@@ -229,6 +271,9 @@
229
271
  .mui-1f061e70178e:where([data-mendy-ui], [data-mendy-ui] *) {
230
272
  max-height: var(--radix-dropdown-menu-content-available-height);
231
273
  }
274
+ .mui-b057efba3283:where([data-mendy-ui], [data-mendy-ui] *) {
275
+ max-height: calc(var(--spacing) * 96);
276
+ }
232
277
  .mui-80baa5d03af7:where([data-mendy-ui], [data-mendy-ui] *) {
233
278
  max-height: calc(var(--filter-menu-height) - 2px);
234
279
  }
@@ -256,9 +301,21 @@
256
301
  .mui-d48fe95d4da8:where([data-mendy-ui], [data-mendy-ui] *) {
257
302
  width: var(--cell-size);
258
303
  }
304
+ .mui-d4ea834145ae:where([data-mendy-ui], [data-mendy-ui] *) {
305
+ width: calc(var(--spacing) * 2);
306
+ }
307
+ .mui-56bb14cbd1fe:where([data-mendy-ui], [data-mendy-ui] *) {
308
+ width: calc(2 / 3 * 100%);
309
+ }
259
310
  .mui-8867d85ed290:where([data-mendy-ui], [data-mendy-ui] *) {
260
311
  width: calc(var(--spacing) * 8);
261
312
  }
313
+ .mui-4ac4ec8dfbce:where([data-mendy-ui], [data-mendy-ui] *) {
314
+ width: calc(var(--spacing) * 40);
315
+ }
316
+ .mui-72b37c1a040d:where([data-mendy-ui], [data-mendy-ui] *) {
317
+ width: calc(var(--spacing) * 64);
318
+ }
262
319
  .mui-37535002f0f7:where([data-mendy-ui], [data-mendy-ui] *) {
263
320
  width: calc(var(--spacing) * 72);
264
321
  }
@@ -295,6 +352,9 @@
295
352
  .mui-e9ab1547c94d:where([data-mendy-ui], [data-mendy-ui] *) {
296
353
  min-width: 8rem;
297
354
  }
355
+ .mui-2bf6510f1330:where([data-mendy-ui], [data-mendy-ui] *) {
356
+ min-width: 100%;
357
+ }
298
358
  .mui-7bd5bab6d7f4:where([data-mendy-ui], [data-mendy-ui] *) {
299
359
  flex: 1;
300
360
  }
@@ -323,9 +383,15 @@
323
383
  .mui-7b3cd77eb999:where([data-mendy-ui], [data-mendy-ui] *) {
324
384
  animation: var(--animate-pulse);
325
385
  }
386
+ .mui-2194d094b585:where([data-mendy-ui], [data-mendy-ui] *) {
387
+ cursor: col-resize;
388
+ }
326
389
  .mui-d343f41ba73e:where([data-mendy-ui], [data-mendy-ui] *) {
327
390
  cursor: default;
328
391
  }
392
+ .mui-739a9a000791:where([data-mendy-ui], [data-mendy-ui] *) {
393
+ touch-action: none;
394
+ }
329
395
  .mui-acd532d8913e:where([data-mendy-ui], [data-mendy-ui] *) {
330
396
  resize: both;
331
397
  }
@@ -359,6 +425,9 @@
359
425
  .mui-a503dd374cca:where([data-mendy-ui], [data-mendy-ui] *) {
360
426
  justify-content: center;
361
427
  }
428
+ .mui-307644c34db6:where([data-mendy-ui], [data-mendy-ui] *) {
429
+ justify-content: flex-end;
430
+ }
362
431
  .mui-c62ec162662e:where([data-mendy-ui], [data-mendy-ui] *) {
363
432
  justify-content: flex-start;
364
433
  }
@@ -396,6 +465,9 @@
396
465
  text-overflow: ellipsis;
397
466
  white-space: nowrap;
398
467
  }
468
+ .mui-1a26a0d28420:where([data-mendy-ui], [data-mendy-ui] *) {
469
+ overflow: auto;
470
+ }
399
471
  .mui-d5111d0e9f48:where([data-mendy-ui], [data-mendy-ui] *) {
400
472
  overflow: hidden;
401
473
  }
@@ -493,6 +565,12 @@
493
565
  .mui-965cf6587342:where([data-mendy-ui], [data-mendy-ui] *) {
494
566
  background-color: var(--destructive, #dc2626);
495
567
  }
568
+ .mui-047624ec0c39:where([data-mendy-ui], [data-mendy-ui] *) {
569
+ background-color: var(--color-green-100);
570
+ }
571
+ .mui-87ecb59f2d2d:where([data-mendy-ui], [data-mendy-ui] *) {
572
+ background-color: var(--muted, #f5f5f5);
573
+ }
496
574
  .mui-810ae775809b:where([data-mendy-ui], [data-mendy-ui] *) {
497
575
  background-color: var(--muted-foreground, #737373);
498
576
  @supports (color: color-mix(in lab, red, red)) {
@@ -523,9 +601,18 @@
523
601
  .mui-094f5333853b:where([data-mendy-ui], [data-mendy-ui] *) {
524
602
  padding: calc(var(--spacing) * 3);
525
603
  }
604
+ .mui-c432836760e3:where([data-mendy-ui], [data-mendy-ui] *) {
605
+ padding: calc(var(--spacing) * 6);
606
+ }
607
+ .mui-c7902d77ad80:where([data-mendy-ui], [data-mendy-ui] *) {
608
+ padding: calc(var(--spacing) * 8);
609
+ }
526
610
  .mui-56b8f5e0fb12:where([data-mendy-ui], [data-mendy-ui] *) {
527
611
  padding-inline: var(--cell-size);
528
612
  }
613
+ .mui-16e909e6f01d:where([data-mendy-ui], [data-mendy-ui] *) {
614
+ padding-inline: calc(var(--spacing) * 0);
615
+ }
529
616
  .mui-1da2e8f173c5:where([data-mendy-ui], [data-mendy-ui] *) {
530
617
  padding-inline: calc(var(--spacing) * 1.5);
531
618
  }
@@ -580,6 +667,9 @@
580
667
  .mui-05ab12448317:where([data-mendy-ui], [data-mendy-ui] *) {
581
668
  text-align: center;
582
669
  }
670
+ .mui-10558dbb3a24:where([data-mendy-ui], [data-mendy-ui] *) {
671
+ text-align: end;
672
+ }
583
673
  .mui-e9347b78185f:where([data-mendy-ui], [data-mendy-ui] *) {
584
674
  text-align: start;
585
675
  }
@@ -756,6 +846,13 @@
756
846
  .mui-14bd99410890:where([data-mendy-ui], [data-mendy-ui] *) {
757
847
  unicode-bidi: isolate;
758
848
  }
849
+ .mui-97b1c00ff005:where([data-mendy-ui], [data-mendy-ui] *) {
850
+ &:is(:where(.mui-ad936fcbed63):hover *) {
851
+ @media (hover: hover) {
852
+ background-color: var(--accent, #f5f5f5);
853
+ }
854
+ }
855
+ }
759
856
  .mui-9af9a4182597:where([data-mendy-ui], [data-mendy-ui] *) {
760
857
  &:is(:where(.mui-ad936fcbed63)[data-disabled="true"] *) {
761
858
  pointer-events: none;
@@ -792,6 +889,11 @@
792
889
  --mendy-tw-ring-color: var(--ring, #737373);
793
890
  }
794
891
  }
892
+ .mui-e6020023567a:where([data-mendy-ui], [data-mendy-ui] *) {
893
+ &:is(:where(.mui-ad936fcbed63)[data-highlighted="true"] *) {
894
+ background-color: var(--accent, #f5f5f5);
895
+ }
896
+ }
795
897
  .mui-f0ee83167878:where([data-mendy-ui], [data-mendy-ui] *) {
796
898
  &:is(:where(.mui-2ffc1d06387e):disabled ~ *) {
797
899
  cursor: not-allowed;
@@ -836,6 +938,12 @@
836
938
  border-inline-start-width: 0px;
837
939
  }
838
940
  }
941
+ .mui-beeef6663906:where([data-mendy-ui], [data-mendy-ui] *) {
942
+ &:last-child {
943
+ border-inline-end-style: var(--mendy-tw-border-style);
944
+ border-inline-end-width: 0px;
945
+ }
946
+ }
839
947
  .mui-37ad15a95595:where([data-mendy-ui], [data-mendy-ui] *) {
840
948
  &:hover {
841
949
  @media (hover: hover) {
@@ -843,6 +951,16 @@
843
951
  }
844
952
  }
845
953
  }
954
+ .mui-63b29dace366:where([data-mendy-ui], [data-mendy-ui] *) {
955
+ &:hover {
956
+ @media (hover: hover) {
957
+ background-color: var(--accent, #f5f5f5);
958
+ @supports (color: color-mix(in lab, red, red)) {
959
+ background-color: color-mix(in oklab, var(--accent, #f5f5f5) 50%, transparent);
960
+ }
961
+ }
962
+ }
963
+ }
846
964
  .mui-bb6a4b3e902d:where([data-mendy-ui], [data-mendy-ui] *) {
847
965
  &:hover {
848
966
  @media (hover: hover) {
@@ -853,6 +971,16 @@
853
971
  }
854
972
  }
855
973
  }
974
+ .mui-4273133a876a:where([data-mendy-ui], [data-mendy-ui] *) {
975
+ &:hover {
976
+ @media (hover: hover) {
977
+ background-color: var(--primary, #171717);
978
+ @supports (color: color-mix(in lab, red, red)) {
979
+ background-color: color-mix(in oklab, var(--primary, #171717) 20%, transparent);
980
+ }
981
+ }
982
+ }
983
+ }
856
984
  .mui-af9ea085901b:where([data-mendy-ui], [data-mendy-ui] *) {
857
985
  &:hover {
858
986
  @media (hover: hover) {
@@ -923,6 +1051,14 @@
923
1051
  border-color: var(--ring, #737373);
924
1052
  }
925
1053
  }
1054
+ .mui-2f669cfad5aa:where([data-mendy-ui], [data-mendy-ui] *) {
1055
+ &:focus-visible {
1056
+ background-color: var(--primary, #171717);
1057
+ @supports (color: color-mix(in lab, red, red)) {
1058
+ background-color: color-mix(in oklab, var(--primary, #171717) 20%, transparent);
1059
+ }
1060
+ }
1061
+ }
926
1062
  .mui-39be5a15b766:where([data-mendy-ui], [data-mendy-ui] *) {
927
1063
  &:focus-visible {
928
1064
  --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);
@@ -954,12 +1090,28 @@
954
1090
  }
955
1091
  }
956
1092
  }
1093
+ .mui-a47d391255f3:where([data-mendy-ui], [data-mendy-ui] *) {
1094
+ &:focus-visible {
1095
+ outline-style: var(--mendy-tw-outline-style);
1096
+ outline-width: 1px;
1097
+ }
1098
+ }
957
1099
  .mui-1df9125eebaf:where([data-mendy-ui], [data-mendy-ui] *) {
958
1100
  &:focus-visible {
959
1101
  outline-style: var(--mendy-tw-outline-style);
960
1102
  outline-width: 1px;
961
1103
  }
962
1104
  }
1105
+ .mui-a8719ed8b095:where([data-mendy-ui], [data-mendy-ui] *) {
1106
+ &:focus-visible {
1107
+ outline-offset: calc(2px * -1);
1108
+ }
1109
+ }
1110
+ .mui-2b1c7d88acff:where([data-mendy-ui], [data-mendy-ui] *) {
1111
+ &:focus-visible {
1112
+ outline-color: var(--primary, #171717);
1113
+ }
1114
+ }
963
1115
  .mui-223daa83ed2d:where([data-mendy-ui], [data-mendy-ui] *) {
964
1116
  &:focus-visible {
965
1117
  outline-color: var(--ring, #737373);
@@ -1073,6 +1225,11 @@
1073
1225
  opacity: 50%;
1074
1226
  }
1075
1227
  }
1228
+ .mui-9d7d1760cd8e:where([data-mendy-ui], [data-mendy-ui] *) {
1229
+ &[data-highlighted="true"] {
1230
+ background-color: var(--accent, #f5f5f5);
1231
+ }
1232
+ }
1076
1233
  .mui-6fa6a8ade7c4:where([data-mendy-ui], [data-mendy-ui] *) {
1077
1234
  &[data-inset] {
1078
1235
  padding-left: calc(var(--spacing) * 8);
@@ -1305,6 +1462,11 @@
1305
1462
  rotate: 180deg;
1306
1463
  }
1307
1464
  }
1465
+ .mui-d254c96aea74:where([data-mendy-ui], [data-mendy-ui] *) {
1466
+ &:is(.dark *) {
1467
+ background-color: var(--color-green-950);
1468
+ }
1469
+ }
1308
1470
  .mui-9daa2369a41b:where([data-mendy-ui], [data-mendy-ui] *) {
1309
1471
  &:is(.dark *) {
1310
1472
  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";
@@ -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";