@mendylanda/ui 0.2.0 → 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.
@@ -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,18 @@
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
+ }
310
+ .mui-72b37c1a040d:where([data-mendy-ui], [data-mendy-ui] *) {
311
+ width: calc(var(--spacing) * 64);
312
+ }
262
313
  .mui-37535002f0f7:where([data-mendy-ui], [data-mendy-ui] *) {
263
314
  width: calc(var(--spacing) * 72);
264
315
  }
@@ -295,6 +346,9 @@
295
346
  .mui-e9ab1547c94d:where([data-mendy-ui], [data-mendy-ui] *) {
296
347
  min-width: 8rem;
297
348
  }
349
+ .mui-2bf6510f1330:where([data-mendy-ui], [data-mendy-ui] *) {
350
+ min-width: 100%;
351
+ }
298
352
  .mui-7bd5bab6d7f4:where([data-mendy-ui], [data-mendy-ui] *) {
299
353
  flex: 1;
300
354
  }
@@ -323,9 +377,15 @@
323
377
  .mui-7b3cd77eb999:where([data-mendy-ui], [data-mendy-ui] *) {
324
378
  animation: var(--animate-pulse);
325
379
  }
380
+ .mui-2194d094b585:where([data-mendy-ui], [data-mendy-ui] *) {
381
+ cursor: col-resize;
382
+ }
326
383
  .mui-d343f41ba73e:where([data-mendy-ui], [data-mendy-ui] *) {
327
384
  cursor: default;
328
385
  }
386
+ .mui-739a9a000791:where([data-mendy-ui], [data-mendy-ui] *) {
387
+ touch-action: none;
388
+ }
329
389
  .mui-acd532d8913e:where([data-mendy-ui], [data-mendy-ui] *) {
330
390
  resize: both;
331
391
  }
@@ -359,6 +419,9 @@
359
419
  .mui-a503dd374cca:where([data-mendy-ui], [data-mendy-ui] *) {
360
420
  justify-content: center;
361
421
  }
422
+ .mui-307644c34db6:where([data-mendy-ui], [data-mendy-ui] *) {
423
+ justify-content: flex-end;
424
+ }
362
425
  .mui-c62ec162662e:where([data-mendy-ui], [data-mendy-ui] *) {
363
426
  justify-content: flex-start;
364
427
  }
@@ -391,11 +454,21 @@
391
454
  margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--mendy-tw-space-y-reverse)));
392
455
  }
393
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
+ }
394
464
  .mui-5a3a4ee420c2:where([data-mendy-ui], [data-mendy-ui] *) {
395
465
  overflow: hidden;
396
466
  text-overflow: ellipsis;
397
467
  white-space: nowrap;
398
468
  }
469
+ .mui-1a26a0d28420:where([data-mendy-ui], [data-mendy-ui] *) {
470
+ overflow: auto;
471
+ }
399
472
  .mui-d5111d0e9f48:where([data-mendy-ui], [data-mendy-ui] *) {
400
473
  overflow: hidden;
401
474
  }
@@ -411,6 +484,9 @@
411
484
  .mui-998780cdef87:where([data-mendy-ui], [data-mendy-ui] *) {
412
485
  overscroll-behavior: contain;
413
486
  }
487
+ .mui-01024deec75e:where([data-mendy-ui], [data-mendy-ui] *) {
488
+ border-radius: 0.25rem;
489
+ }
414
490
  .mui-b005d61d0953:where([data-mendy-ui], [data-mendy-ui] *) {
415
491
  border-radius: calc(infinity * 1px);
416
492
  }
@@ -493,6 +569,12 @@
493
569
  .mui-965cf6587342:where([data-mendy-ui], [data-mendy-ui] *) {
494
570
  background-color: var(--destructive, #dc2626);
495
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
+ }
496
578
  .mui-810ae775809b:where([data-mendy-ui], [data-mendy-ui] *) {
497
579
  background-color: var(--muted-foreground, #737373);
498
580
  @supports (color: color-mix(in lab, red, red)) {
@@ -523,9 +605,18 @@
523
605
  .mui-094f5333853b:where([data-mendy-ui], [data-mendy-ui] *) {
524
606
  padding: calc(var(--spacing) * 3);
525
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
+ }
526
614
  .mui-56b8f5e0fb12:where([data-mendy-ui], [data-mendy-ui] *) {
527
615
  padding-inline: var(--cell-size);
528
616
  }
617
+ .mui-16e909e6f01d:where([data-mendy-ui], [data-mendy-ui] *) {
618
+ padding-inline: calc(var(--spacing) * 0);
619
+ }
529
620
  .mui-1da2e8f173c5:where([data-mendy-ui], [data-mendy-ui] *) {
530
621
  padding-inline: calc(var(--spacing) * 1.5);
531
622
  }
@@ -580,6 +671,9 @@
580
671
  .mui-05ab12448317:where([data-mendy-ui], [data-mendy-ui] *) {
581
672
  text-align: center;
582
673
  }
674
+ .mui-10558dbb3a24:where([data-mendy-ui], [data-mendy-ui] *) {
675
+ text-align: end;
676
+ }
583
677
  .mui-e9347b78185f:where([data-mendy-ui], [data-mendy-ui] *) {
584
678
  text-align: start;
585
679
  }
@@ -756,6 +850,13 @@
756
850
  .mui-14bd99410890:where([data-mendy-ui], [data-mendy-ui] *) {
757
851
  unicode-bidi: isolate;
758
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
+ }
759
860
  .mui-9af9a4182597:where([data-mendy-ui], [data-mendy-ui] *) {
760
861
  &:is(:where(.mui-ad936fcbed63)[data-disabled="true"] *) {
761
862
  pointer-events: none;
@@ -792,6 +893,11 @@
792
893
  --mendy-tw-ring-color: var(--ring, #737373);
793
894
  }
794
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
+ }
795
901
  .mui-f0ee83167878:where([data-mendy-ui], [data-mendy-ui] *) {
796
902
  &:is(:where(.mui-2ffc1d06387e):disabled ~ *) {
797
903
  cursor: not-allowed;
@@ -836,6 +942,12 @@
836
942
  border-inline-start-width: 0px;
837
943
  }
838
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
+ }
839
951
  .mui-37ad15a95595:where([data-mendy-ui], [data-mendy-ui] *) {
840
952
  &:hover {
841
953
  @media (hover: hover) {
@@ -843,6 +955,16 @@
843
955
  }
844
956
  }
845
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
+ }
846
968
  .mui-bb6a4b3e902d:where([data-mendy-ui], [data-mendy-ui] *) {
847
969
  &:hover {
848
970
  @media (hover: hover) {
@@ -853,6 +975,16 @@
853
975
  }
854
976
  }
855
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
+ }
856
988
  .mui-af9ea085901b:where([data-mendy-ui], [data-mendy-ui] *) {
857
989
  &:hover {
858
990
  @media (hover: hover) {
@@ -923,6 +1055,14 @@
923
1055
  border-color: var(--ring, #737373);
924
1056
  }
925
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
+ }
926
1066
  .mui-39be5a15b766:where([data-mendy-ui], [data-mendy-ui] *) {
927
1067
  &:focus-visible {
928
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);
@@ -954,12 +1094,28 @@
954
1094
  }
955
1095
  }
956
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
+ }
957
1103
  .mui-1df9125eebaf:where([data-mendy-ui], [data-mendy-ui] *) {
958
1104
  &:focus-visible {
959
1105
  outline-style: var(--mendy-tw-outline-style);
960
1106
  outline-width: 1px;
961
1107
  }
962
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
+ }
963
1119
  .mui-223daa83ed2d:where([data-mendy-ui], [data-mendy-ui] *) {
964
1120
  &:focus-visible {
965
1121
  outline-color: var(--ring, #737373);
@@ -1073,6 +1229,11 @@
1073
1229
  opacity: 50%;
1074
1230
  }
1075
1231
  }
1232
+ .mui-9d7d1760cd8e:where([data-mendy-ui], [data-mendy-ui] *) {
1233
+ &[data-highlighted="true"] {
1234
+ background-color: var(--accent, #f5f5f5);
1235
+ }
1236
+ }
1076
1237
  .mui-6fa6a8ade7c4:where([data-mendy-ui], [data-mendy-ui] *) {
1077
1238
  &[data-inset] {
1078
1239
  padding-left: calc(var(--spacing) * 8);
@@ -1305,6 +1466,11 @@
1305
1466
  rotate: 180deg;
1306
1467
  }
1307
1468
  }
1469
+ .mui-d254c96aea74:where([data-mendy-ui], [data-mendy-ui] *) {
1470
+ &:is(.dark *) {
1471
+ background-color: var(--color-green-950);
1472
+ }
1473
+ }
1308
1474
  .mui-9daa2369a41b:where([data-mendy-ui], [data-mendy-ui] *) {
1309
1475
  &:is(.dark *) {
1310
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";
@@ -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";