@mendylanda/ui 0.3.0-alpha.0 → 0.3.0-alpha.10

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 (55) hide show
  1. package/README.md +20 -3
  2. package/dist/class-names.js +1 -1
  3. package/dist/filters/filter-bar.d.ts +1 -1
  4. package/dist/filters/filter-bar.js +53 -12
  5. package/dist/filters/filter-menu-focus.d.ts +1 -1
  6. package/dist/filters/filter-menu-panel.d.ts +1 -1
  7. package/dist/filters/use-menu-placement.d.ts +1 -1
  8. package/dist/primitives/popover.d.ts +5 -0
  9. package/dist/primitives/popover.js +10 -0
  10. package/dist/styles.css +153 -27
  11. package/dist/styles.tailwind3.css +153 -27
  12. package/dist/table/clipboard.d.ts +1 -1
  13. package/dist/table/clipboard.js +35 -22
  14. package/dist/table/column-widths.d.ts +9 -0
  15. package/dist/table/column-widths.js +23 -0
  16. package/dist/table/columns.d.ts +6 -0
  17. package/dist/table/columns.js +4 -0
  18. package/dist/table/data-table.d.ts +3 -0
  19. package/dist/table/data-table.js +6 -3
  20. package/dist/table/index.d.ts +1 -0
  21. package/dist/table/index.js +1 -0
  22. package/dist/table/table-column-settings.d.ts +6 -0
  23. package/dist/table/table-column-settings.js +55 -0
  24. package/dist/table/table-controls.d.ts +1 -3
  25. package/dist/table/table-controls.js +4 -41
  26. package/dist/table/table-feedback.d.ts +5 -1
  27. package/dist/table/table-feedback.js +5 -4
  28. package/dist/table/table-filters.d.ts +8 -0
  29. package/dist/table/table-filters.js +9 -0
  30. package/dist/table/table-frame.d.ts +10 -0
  31. package/dist/table/table-frame.js +10 -0
  32. package/dist/table/table-layout.d.ts +44 -0
  33. package/dist/table/table-layout.js +68 -0
  34. package/dist/table/table-loading.d.ts +12 -0
  35. package/dist/table/table-loading.js +6 -0
  36. package/dist/table/table-parts.d.ts +20 -2
  37. package/dist/table/table-parts.js +91 -37
  38. package/dist/table/table-view.d.ts +19 -2
  39. package/dist/table/table-view.js +60 -53
  40. package/dist/table/use-column-window.d.ts +42 -0
  41. package/dist/table/use-column-window.js +65 -0
  42. package/dist/table/use-data-table.d.ts +2 -2
  43. package/dist/table/use-data-table.js +15 -2
  44. package/dist/table/use-fill-layout.d.ts +2 -0
  45. package/dist/table/use-fill-layout.js +67 -0
  46. package/dist/table/use-inline-row-selection.d.ts +10 -0
  47. package/dist/table/use-inline-row-selection.js +33 -0
  48. package/dist/table/use-stable-array.d.ts +3 -0
  49. package/dist/table/use-stable-array.js +16 -0
  50. package/dist/table/use-table-interaction.d.ts +1 -1
  51. package/dist/table/use-table-interaction.js +32 -3
  52. package/dist/table/use-table-results.d.ts +8 -0
  53. package/dist/table/use-table-results.js +63 -0
  54. package/dist/utils.js +13 -2
  55. package/package.json +9 -8
@@ -16,6 +16,7 @@
16
16
  --font-weight-semibold: 600;
17
17
  --tracking-widest: 0.1em;
18
18
  --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);
19
+ --animate-spin: mendy-spin 1s linear infinite;
19
20
  --animate-pulse: mendy-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
20
21
  --default-transition-duration: 150ms;
21
22
  --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
@@ -101,6 +102,9 @@
101
102
  .mui-014aadadffad:where([data-mendy-ui], [data-mendy-ui] *) {
102
103
  isolation: isolate;
103
104
  }
105
+ .mui-d7efd1b0b0f9:where([data-mendy-ui], [data-mendy-ui] *) {
106
+ z-index: 1;
107
+ }
104
108
  .mui-418e44ad4f9e:where([data-mendy-ui], [data-mendy-ui] *) {
105
109
  z-index: 10;
106
110
  }
@@ -152,6 +156,12 @@
152
156
  .mui-8cc46fa87f41:where([data-mendy-ui], [data-mendy-ui] *) {
153
157
  margin-inline-end: calc(var(--spacing) * -1.5);
154
158
  }
159
+ .mui-477d8f4dfce9:where([data-mendy-ui], [data-mendy-ui] *) {
160
+ margin-inline-end: calc(var(--spacing) * 1);
161
+ }
162
+ .mui-68d781378b03:where([data-mendy-ui], [data-mendy-ui] *) {
163
+ margin-inline-end: calc(var(--spacing) * 2);
164
+ }
155
165
  .mui-f28fea81a5cd:where([data-mendy-ui], [data-mendy-ui] *) {
156
166
  margin-top: calc(var(--spacing) * 2);
157
167
  }
@@ -208,6 +218,10 @@
208
218
  width: calc(var(--spacing) * 4);
209
219
  height: calc(var(--spacing) * 4);
210
220
  }
221
+ .mui-2bd43fb57913:where([data-mendy-ui], [data-mendy-ui] *) {
222
+ width: calc(var(--spacing) * 5);
223
+ height: calc(var(--spacing) * 5);
224
+ }
211
225
  .mui-0712570dcc9f:where([data-mendy-ui], [data-mendy-ui] *) {
212
226
  width: calc(var(--spacing) * 6);
213
227
  height: calc(var(--spacing) * 6);
@@ -238,12 +252,18 @@
238
252
  .mui-c7d5500b77ab:where([data-mendy-ui], [data-mendy-ui] *) {
239
253
  height: calc(var(--spacing) * 0);
240
254
  }
255
+ .mui-2edce89ef182:where([data-mendy-ui], [data-mendy-ui] *) {
256
+ height: calc(var(--spacing) * 3);
257
+ }
241
258
  .mui-099be97e1fa4:where([data-mendy-ui], [data-mendy-ui] *) {
242
259
  height: calc(var(--spacing) * 4);
243
260
  }
244
261
  .mui-ce1945804664:where([data-mendy-ui], [data-mendy-ui] *) {
245
262
  height: calc(var(--spacing) * 6);
246
263
  }
264
+ .mui-c8e50836f8a1:where([data-mendy-ui], [data-mendy-ui] *) {
265
+ height: calc(var(--spacing) * 7);
266
+ }
247
267
  .mui-1fb07b38c63b:where([data-mendy-ui], [data-mendy-ui] *) {
248
268
  height: calc(var(--spacing) * 8);
249
269
  }
@@ -268,8 +288,11 @@
268
288
  .mui-1f061e70178e:where([data-mendy-ui], [data-mendy-ui] *) {
269
289
  max-height: var(--radix-dropdown-menu-content-available-height);
270
290
  }
271
- .mui-b057efba3283:where([data-mendy-ui], [data-mendy-ui] *) {
272
- max-height: calc(var(--spacing) * 96);
291
+ .mui-4d3f1304ebb2:where([data-mendy-ui], [data-mendy-ui] *) {
292
+ max-height: var(--radix-popover-content-available-height);
293
+ }
294
+ .mui-da0beef015c9:where([data-mendy-ui], [data-mendy-ui] *) {
295
+ max-height: 400px;
273
296
  }
274
297
  .mui-80baa5d03af7:where([data-mendy-ui], [data-mendy-ui] *) {
275
298
  max-height: calc(var(--filter-menu-height) - 2px);
@@ -283,6 +306,9 @@
283
306
  .mui-dcd942c18ddc:where([data-mendy-ui], [data-mendy-ui] *) {
284
307
  max-height: var(--radix-dropdown-menu-content-available-height);
285
308
  }
309
+ .mui-7bd696ca6be3:where([data-mendy-ui], [data-mendy-ui] *) {
310
+ max-height: 100%;
311
+ }
286
312
  .mui-410da8dfa8ac:where([data-mendy-ui], [data-mendy-ui] *) {
287
313
  min-height: calc(var(--spacing) * 0);
288
314
  }
@@ -301,18 +327,21 @@
301
327
  .mui-d4ea834145ae:where([data-mendy-ui], [data-mendy-ui] *) {
302
328
  width: calc(var(--spacing) * 2);
303
329
  }
330
+ .mui-56bb14cbd1fe:where([data-mendy-ui], [data-mendy-ui] *) {
331
+ width: calc(2 / 3 * 100%);
332
+ }
304
333
  .mui-8867d85ed290:where([data-mendy-ui], [data-mendy-ui] *) {
305
334
  width: calc(var(--spacing) * 8);
306
335
  }
307
336
  .mui-4ac4ec8dfbce:where([data-mendy-ui], [data-mendy-ui] *) {
308
337
  width: calc(var(--spacing) * 40);
309
338
  }
310
- .mui-72b37c1a040d:where([data-mendy-ui], [data-mendy-ui] *) {
311
- width: calc(var(--spacing) * 64);
312
- }
313
339
  .mui-37535002f0f7:where([data-mendy-ui], [data-mendy-ui] *) {
314
340
  width: calc(var(--spacing) * 72);
315
341
  }
342
+ .mui-a4cce7869436:where([data-mendy-ui], [data-mendy-ui] *) {
343
+ width: 300px;
344
+ }
316
345
  .mui-fc6a57ff7553:where([data-mendy-ui], [data-mendy-ui] *) {
317
346
  width: var(--mendy-filter-editor-width,19rem);
318
347
  }
@@ -358,6 +387,9 @@
358
387
  .mui-27ead27a81df:where([data-mendy-ui], [data-mendy-ui] *) {
359
388
  flex-shrink: 0;
360
389
  }
390
+ .mui-adca5146416e:where([data-mendy-ui], [data-mendy-ui] *) {
391
+ flex-grow: 1;
392
+ }
361
393
  .mui-215061302c50:where([data-mendy-ui], [data-mendy-ui] *) {
362
394
  border-collapse: collapse;
363
395
  }
@@ -368,6 +400,12 @@
368
400
  --mendy-tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
369
401
  translate: var(--mendy-tw-translate-x) var(--mendy-tw-translate-y);
370
402
  }
403
+ .mui-4e3f08588318:where([data-mendy-ui], [data-mendy-ui] *) {
404
+ rotate: calc(45deg * -1);
405
+ }
406
+ .mui-c80411b7591f:where([data-mendy-ui], [data-mendy-ui] *) {
407
+ rotate: 45deg;
408
+ }
371
409
  .mui-aa214ea38326:where([data-mendy-ui], [data-mendy-ui] *) {
372
410
  transform: var(--mendy-tw-rotate-x,) var(--mendy-tw-rotate-y,) var(--mendy-tw-rotate-z,) var(--mendy-tw-skew-x,) var(--mendy-tw-skew-y,);
373
411
  }
@@ -377,12 +415,21 @@
377
415
  .mui-7b3cd77eb999:where([data-mendy-ui], [data-mendy-ui] *) {
378
416
  animation: var(--animate-pulse);
379
417
  }
418
+ .mui-2c14b55d77e6:where([data-mendy-ui], [data-mendy-ui] *) {
419
+ animation: var(--animate-spin);
420
+ }
380
421
  .mui-2194d094b585:where([data-mendy-ui], [data-mendy-ui] *) {
381
422
  cursor: col-resize;
382
423
  }
383
424
  .mui-d343f41ba73e:where([data-mendy-ui], [data-mendy-ui] *) {
384
425
  cursor: default;
385
426
  }
427
+ .mui-f2e47d9c52ad:where([data-mendy-ui], [data-mendy-ui] *) {
428
+ cursor: grab;
429
+ }
430
+ .mui-d2fa8848968d:where([data-mendy-ui], [data-mendy-ui] *) {
431
+ cursor: pointer;
432
+ }
386
433
  .mui-739a9a000791:where([data-mendy-ui], [data-mendy-ui] *) {
387
434
  touch-action: none;
388
435
  }
@@ -454,13 +501,6 @@
454
501
  margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--mendy-tw-space-y-reverse)));
455
502
  }
456
503
  }
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
- }
464
504
  .mui-5a3a4ee420c2:where([data-mendy-ui], [data-mendy-ui] *) {
465
505
  overflow: hidden;
466
506
  text-overflow: ellipsis;
@@ -484,9 +524,6 @@
484
524
  .mui-998780cdef87:where([data-mendy-ui], [data-mendy-ui] *) {
485
525
  overscroll-behavior: contain;
486
526
  }
487
- .mui-01024deec75e:where([data-mendy-ui], [data-mendy-ui] *) {
488
- border-radius: 0.25rem;
489
- }
490
527
  .mui-b005d61d0953:where([data-mendy-ui], [data-mendy-ui] *) {
491
528
  border-radius: calc(infinity * 1px);
492
529
  }
@@ -554,6 +591,9 @@
554
591
  border-color: color-mix(in oklab, var(--muted-foreground, #737373) 50%, transparent);
555
592
  }
556
593
  }
594
+ .mui-515f9fdc6db7:where([data-mendy-ui], [data-mendy-ui] *) {
595
+ border-color: var(--primary, #171717);
596
+ }
557
597
  .mui-292affc1f780:where([data-mendy-ui], [data-mendy-ui] *) {
558
598
  background-color: var(--accent, #f5f5f5);
559
599
  }
@@ -572,6 +612,9 @@
572
612
  .mui-047624ec0c39:where([data-mendy-ui], [data-mendy-ui] *) {
573
613
  background-color: var(--color-green-100);
574
614
  }
615
+ .mui-6ba846e1630e:where([data-mendy-ui], [data-mendy-ui] *) {
616
+ background-color: inherit;
617
+ }
575
618
  .mui-87ecb59f2d2d:where([data-mendy-ui], [data-mendy-ui] *) {
576
619
  background-color: var(--muted, #f5f5f5);
577
620
  }
@@ -641,6 +684,12 @@
641
684
  .mui-b5edc3ea7c91:where([data-mendy-ui], [data-mendy-ui] *) {
642
685
  padding-block: calc(var(--spacing) * 2);
643
686
  }
687
+ .mui-d3cea061f2f3:where([data-mendy-ui], [data-mendy-ui] *) {
688
+ padding-block: calc(var(--spacing) * 3);
689
+ }
690
+ .mui-96b92a971c95:where([data-mendy-ui], [data-mendy-ui] *) {
691
+ padding-block: calc(var(--spacing) * 5);
692
+ }
644
693
  .mui-078d945937da:where([data-mendy-ui], [data-mendy-ui] *) {
645
694
  padding-inline-start: calc(var(--spacing) * 8);
646
695
  }
@@ -781,6 +830,13 @@
781
830
  --mendy-tw-shadow: 0 1px 2px 0 var(--mendy-tw-shadow-color, rgb(0 0 0 / 0.05));
782
831
  box-shadow: var(--mendy-tw-inset-shadow), var(--mendy-tw-inset-ring-shadow), var(--mendy-tw-ring-offset-shadow), var(--mendy-tw-ring-shadow), var(--mendy-tw-shadow);
783
832
  }
833
+ .mui-853be6c11609:where([data-mendy-ui], [data-mendy-ui] *) {
834
+ --mendy-tw-ring-shadow: var(--mendy-tw-ring-inset,) 0 0 0 calc(2px + var(--mendy-tw-ring-offset-width)) var(--mendy-tw-ring-color, currentcolor);
835
+ box-shadow: var(--mendy-tw-inset-shadow), var(--mendy-tw-inset-ring-shadow), var(--mendy-tw-ring-offset-shadow), var(--mendy-tw-ring-shadow), var(--mendy-tw-shadow);
836
+ }
837
+ .mui-fd9d0b696aac:where([data-mendy-ui], [data-mendy-ui] *) {
838
+ --mendy-tw-ring-color: var(--primary, #171717);
839
+ }
784
840
  .mui-59edd3d33673:where([data-mendy-ui], [data-mendy-ui] *) {
785
841
  --mendy-tw-outline-style: none;
786
842
  outline-style: none;
@@ -793,6 +849,10 @@
793
849
  outline-style: var(--mendy-tw-outline-style);
794
850
  outline-width: 1px;
795
851
  }
852
+ .mui-e42932b7a79c:where([data-mendy-ui], [data-mendy-ui] *) {
853
+ --mendy-tw-blur: blur(8px);
854
+ filter: var(--mendy-tw-blur,) var(--mendy-tw-brightness,) var(--mendy-tw-contrast,) var(--mendy-tw-grayscale,) var(--mendy-tw-hue-rotate,) var(--mendy-tw-invert,) var(--mendy-tw-saturate,) var(--mendy-tw-sepia,) var(--mendy-tw-drop-shadow,);
855
+ }
796
856
  .mui-e0122edc668b:where([data-mendy-ui], [data-mendy-ui] *) {
797
857
  --mendy-tw-drop-shadow-size: drop-shadow(0 3px 3px var(--mendy-tw-drop-shadow-color, rgb(0 0 0 / 0.12)));
798
858
  --mendy-tw-drop-shadow: drop-shadow(var(--drop-shadow-md));
@@ -857,6 +917,13 @@
857
917
  }
858
918
  }
859
919
  }
920
+ .mui-34a57d4b4103:where([data-mendy-ui], [data-mendy-ui] *) {
921
+ &:is(:where(.mui-ad936fcbed63):hover *) {
922
+ @media (hover: hover) {
923
+ opacity: 50%;
924
+ }
925
+ }
926
+ }
860
927
  .mui-9af9a4182597:where([data-mendy-ui], [data-mendy-ui] *) {
861
928
  &:is(:where(.mui-ad936fcbed63)[data-disabled="true"] *) {
862
929
  pointer-events: none;
@@ -942,12 +1009,6 @@
942
1009
  border-inline-start-width: 0px;
943
1010
  }
944
1011
  }
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
- }
951
1012
  .mui-37ad15a95595:where([data-mendy-ui], [data-mendy-ui] *) {
952
1013
  &:hover {
953
1014
  @media (hover: hover) {
@@ -955,22 +1016,22 @@
955
1016
  }
956
1017
  }
957
1018
  }
958
- .mui-63b29dace366:where([data-mendy-ui], [data-mendy-ui] *) {
1019
+ .mui-bb6a4b3e902d:where([data-mendy-ui], [data-mendy-ui] *) {
959
1020
  &:hover {
960
1021
  @media (hover: hover) {
961
- background-color: var(--accent, #f5f5f5);
1022
+ background-color: var(--destructive, #dc2626);
962
1023
  @supports (color: color-mix(in lab, red, red)) {
963
- background-color: color-mix(in oklab, var(--accent, #f5f5f5) 50%, transparent);
1024
+ background-color: color-mix(in oklab, var(--destructive, #dc2626) 90%, transparent);
964
1025
  }
965
1026
  }
966
1027
  }
967
1028
  }
968
- .mui-bb6a4b3e902d:where([data-mendy-ui], [data-mendy-ui] *) {
1029
+ .mui-5cbdd1b32f1a:where([data-mendy-ui], [data-mendy-ui] *) {
969
1030
  &:hover {
970
1031
  @media (hover: hover) {
971
- background-color: var(--destructive, #dc2626);
1032
+ background-color: var(--muted, #f5f5f5);
972
1033
  @supports (color: color-mix(in lab, red, red)) {
973
- background-color: color-mix(in oklab, var(--destructive, #dc2626) 90%, transparent);
1034
+ background-color: color-mix(in oklab, var(--muted, #f5f5f5) 50%, transparent);
974
1035
  }
975
1036
  }
976
1037
  }
@@ -1063,6 +1124,11 @@
1063
1124
  }
1064
1125
  }
1065
1126
  }
1127
+ .mui-b8b1747fa763:where([data-mendy-ui], [data-mendy-ui] *) {
1128
+ &:focus-visible {
1129
+ opacity: 100%;
1130
+ }
1131
+ }
1066
1132
  .mui-39be5a15b766:where([data-mendy-ui], [data-mendy-ui] *) {
1067
1133
  &:focus-visible {
1068
1134
  --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);
@@ -1132,6 +1198,11 @@
1132
1198
  --mendy-tw-ring-inset: inset;
1133
1199
  }
1134
1200
  }
1201
+ .mui-71998ea7a2d0:where([data-mendy-ui], [data-mendy-ui] *) {
1202
+ &:active {
1203
+ cursor: grabbing;
1204
+ }
1205
+ }
1135
1206
  .mui-8d3c1014b967:where([data-mendy-ui], [data-mendy-ui] *) {
1136
1207
  &:disabled {
1137
1208
  pointer-events: none;
@@ -1142,11 +1213,25 @@
1142
1213
  cursor: not-allowed;
1143
1214
  }
1144
1215
  }
1216
+ .mui-d2e4a66bb430:where([data-mendy-ui], [data-mendy-ui] *) {
1217
+ &:disabled {
1218
+ opacity: 0% !important;
1219
+ }
1220
+ }
1145
1221
  .mui-4600b77303d6:where([data-mendy-ui], [data-mendy-ui] *) {
1146
1222
  &:disabled {
1147
1223
  opacity: 50%;
1148
1224
  }
1149
1225
  }
1226
+ .mui-978f422895e5:where([data-mendy-ui], [data-mendy-ui] *) {
1227
+ &:is(:where(.mui-ad936fcbed63):hover *) {
1228
+ @media (hover: hover) {
1229
+ &:disabled {
1230
+ opacity: 50% !important;
1231
+ }
1232
+ }
1233
+ }
1234
+ }
1150
1235
  .mui-7eb7501a2ef0:where([data-mendy-ui], [data-mendy-ui] *) {
1151
1236
  &:has(*:focus) {
1152
1237
  border-color: var(--ring, #737373);
@@ -1359,6 +1444,18 @@
1359
1444
  color: var(--primary-foreground, #fafafa);
1360
1445
  }
1361
1446
  }
1447
+ .mui-d0c2ae8419e1:where([data-mendy-ui], [data-mendy-ui] *) {
1448
+ &[data-state="checked"] {
1449
+ opacity: 100%;
1450
+ }
1451
+ }
1452
+ .mui-9c02852bfc55:where([data-mendy-ui], [data-mendy-ui] *) {
1453
+ &[data-state="checked"] {
1454
+ &:disabled {
1455
+ opacity: 100% !important;
1456
+ }
1457
+ }
1458
+ }
1362
1459
  .mui-37d8a3f448ff:where([data-mendy-ui], [data-mendy-ui] *) {
1363
1460
  &[data-state="closed"] {
1364
1461
  animation: none !important;
@@ -1381,6 +1478,18 @@
1381
1478
  --mendy-tw-exit-scale: .95;
1382
1479
  }
1383
1480
  }
1481
+ .mui-e2ed522ed9b7:where([data-mendy-ui], [data-mendy-ui] *) {
1482
+ &[data-state="indeterminate"] {
1483
+ opacity: 100%;
1484
+ }
1485
+ }
1486
+ .mui-cbd3aed703f7:where([data-mendy-ui], [data-mendy-ui] *) {
1487
+ &[data-state="indeterminate"] {
1488
+ &:disabled {
1489
+ opacity: 100% !important;
1490
+ }
1491
+ }
1492
+ }
1384
1493
  .mui-bae1e782f277:where([data-mendy-ui], [data-mendy-ui] *) {
1385
1494
  &[data-state="open"] {
1386
1495
  animation: mendy-enter var(--mendy-tw-animation-duration,var(--mendy-tw-duration,.15s))var(--mendy-tw-ease,ease)var(--mendy-tw-animation-delay,0s)var(--mendy-tw-animation-iteration-count,1)var(--mendy-tw-animation-direction,normal)var(--mendy-tw-animation-fill-mode,none);
@@ -1707,6 +1816,18 @@
1707
1816
  color: var(--muted-foreground, #737373);
1708
1817
  }
1709
1818
  }
1819
+ .mui-fa8e1efead3c:where([data-mendy-ui], [data-mendy-ui] *) {
1820
+ @media (hover:none) {
1821
+ opacity: 100%;
1822
+ }
1823
+ }
1824
+ .mui-eaedb91f8774:where([data-mendy-ui], [data-mendy-ui] *) {
1825
+ @media (hover:none) {
1826
+ &:disabled {
1827
+ opacity: 100% !important;
1828
+ }
1829
+ }
1830
+ }
1710
1831
  .mui-b8293c91796c:where([data-mendy-ui], [data-mendy-ui] *) {
1711
1832
  [data-slot=card-content] & {
1712
1833
  background-color: transparent;
@@ -2033,6 +2154,11 @@
2033
2154
  syntax: "*";
2034
2155
  inherits: false;
2035
2156
  }
2157
+ @keyframes mendy-spin {
2158
+ to {
2159
+ transform: rotate(360deg);
2160
+ }
2161
+ }
2036
2162
  @keyframes mendy-pulse {
2037
2163
  50% {
2038
2164
  opacity: 0.5;
@@ -1,5 +1,5 @@
1
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\"]";
2
+ export declare const interactiveSelector = "button, a, summary, input, textarea, select, [contenteditable]:not([contenteditable=\"false\"]), [role=\"checkbox\"], [role=\"button\"], [role=\"textbox\"]";
3
3
  export declare function selectedCellsText<T extends object>(table: DataTableInstance<T>): string;
4
4
  export declare function tableCsv<T extends object>(table: DataTableInstance<T>, options?: {
5
5
  selectedOnly?: boolean;
@@ -1,27 +1,40 @@
1
+ import { constructCell } from "@tanstack/react-table";
1
2
  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 const interactiveSelector = 'button, a, summary, input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="checkbox"], [role="button"], [role="textbox"]';
3
4
  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"))
5
+ const rows = table.getRowsInDisplayOrder();
6
+ const columns = [
7
+ ...table.getStartVisibleLeafColumns(),
8
+ ...table.getCenterVisibleLeafColumns(),
9
+ ...table.getEndVisibleLeafColumns(),
10
+ ];
11
+ // Bounds already resolve include/exclude operations in display order. Visiting
12
+ // only these cells avoids materializing every column of every selected row.
13
+ const values = new Map();
14
+ const includedColumns = new Set();
15
+ for (const bounds of table.getCellSelectionBounds()) {
16
+ for (let r = bounds.minRowIndex; r <= bounds.maxRowIndex; r++) {
17
+ const row = rows[r];
18
+ for (let c = bounds.minColumnIndex; c <= bounds.maxColumnIndex; c++) {
19
+ const column = columns[c];
20
+ const cell = constructCell(column, row, row.table);
21
+ if (!cell.getCanSelect())
22
+ continue;
23
+ const definition = column.columnDef;
24
+ let rowValues = values.get(r);
25
+ if (!rowValues)
26
+ values.set(r, (rowValues = new Map()));
27
+ rowValues.set(c, tsvValue(definition.copyValue?.(row.original) ??
28
+ definition.getCellValue?.(row.original) ??
29
+ String(cell.getValue() ?? "")));
30
+ includedColumns.add(c);
31
+ }
32
+ }
33
+ }
34
+ const columnIndexes = [...includedColumns].sort((a, b) => a - b);
35
+ return [...values]
36
+ .sort(([a], [b]) => a - b)
37
+ .map(([, row]) => columnIndexes.map((c) => row.get(c) ?? "").join("\t"))
25
38
  .join("\n");
26
39
  }
27
40
  export function tableCsv(table, options = {}) {
@@ -0,0 +1,9 @@
1
+ interface WidthColumn {
2
+ id: string;
3
+ size: number;
4
+ maxSize: number;
5
+ grow: number | false;
6
+ }
7
+ /** Allocate spare space without changing stored or user-resized column widths. */
8
+ export declare function distributeColumnWidths(columns: WidthColumn[], viewport: number | null): Map<string, number>;
9
+ export {};
@@ -0,0 +1,23 @@
1
+ /** Allocate spare space without changing stored or user-resized column widths. */
2
+ export function distributeColumnWidths(columns, viewport) {
3
+ const widths = new Map(columns.map((column) => [column.id, column.size]));
4
+ let spare = (viewport ?? 0) - columns.reduce((sum, column) => sum + column.size, 0);
5
+ let flexible = columns.filter((column) => typeof column.grow === "number" &&
6
+ Number.isFinite(column.grow) &&
7
+ column.grow > 0 &&
8
+ column.maxSize > column.size);
9
+ while (spare > 0.01 && flexible.length) {
10
+ const unit = flexible.reduce((max, column) => Math.max(max, Number(column.grow)), 0);
11
+ const weight = flexible.reduce((sum, column) => sum + Number(column.grow) / unit, 0);
12
+ let used = 0;
13
+ for (const column of flexible) {
14
+ const size = widths.get(column.id);
15
+ const extra = Math.min(column.maxSize - size, spare * (Number(column.grow) / unit / weight));
16
+ widths.set(column.id, size + extra);
17
+ used += extra;
18
+ }
19
+ spare -= used;
20
+ flexible = flexible.filter((column) => column.maxSize - widths.get(column.id) > 0.01);
21
+ }
22
+ return widths;
23
+ }
@@ -4,6 +4,8 @@ import type { DataTableFeatures } from "./features.js";
4
4
  export type TableColumn<T extends object> = ColumnDef<DataTableFeatures, T> & {
5
5
  label?: string;
6
6
  align?: "start" | "center" | "end";
7
+ /** Share of spare viewport width. Defaults to 1 for data columns, false for display columns. */
8
+ grow?: number | false;
7
9
  defaultHidden?: boolean;
8
10
  pin?: "start" | "end";
9
11
  copyValue?: (row: T) => string;
@@ -28,6 +30,7 @@ export interface ValueFormat<V> {
28
30
  interface ValueOptions<T extends object, V> {
29
31
  label: string;
30
32
  size?: number;
33
+ grow?: number | false;
31
34
  minSize?: number;
32
35
  maxSize?: number;
33
36
  hidden?: boolean;
@@ -48,6 +51,9 @@ interface ColumnBuilder<T extends object> {
48
51
  label: string;
49
52
  render: (row: T) => ReactNode;
50
53
  size?: number;
54
+ minSize?: number;
55
+ maxSize?: number;
56
+ grow?: number | false;
51
57
  pin?: "start" | "end";
52
58
  }): TableColumn<T>;
53
59
  }
@@ -9,6 +9,7 @@ function valueColumn(id, value, options) {
9
9
  header: options.label,
10
10
  label: options.label,
11
11
  size: options.size,
12
+ grow: options.grow,
12
13
  minSize: options.minSize,
13
14
  maxSize: options.maxSize,
14
15
  defaultHidden: options.hidden,
@@ -45,6 +46,9 @@ export function defineColumns(define) {
45
46
  label: options.label,
46
47
  header: options.label,
47
48
  size: options.size,
49
+ minSize: options.minSize,
50
+ maxSize: options.maxSize,
51
+ grow: options.grow ?? false,
48
52
  pin: options.pin,
49
53
  enableSorting: false,
50
54
  enableCellSelection: false,
@@ -1,11 +1,14 @@
1
1
  import type { ReactNode } from "react";
2
2
  import type { UseDataTableOptions, DataTableInstance } from "./use-data-table.js";
3
3
  import type { TableViewProps } from "./table-view.js";
4
+ import { type TableFiltersProps } from "./table-filters.js";
4
5
  type Appearance<T extends object> = Omit<TableViewProps<T>, "table"> & {
5
6
  toolbar?: ReactNode;
6
7
  footer?: ReactNode;
7
8
  showColumnSettings?: boolean;
8
9
  showPagination?: boolean;
10
+ /** Customize the built-in filter bar, or render it yourself with false. */
11
+ filterBar?: Omit<TableFiltersProps, "filters"> | false;
9
12
  };
10
13
  export type DataTableProps<T extends object> = Appearance<T> & (UseDataTableOptions<T> | {
11
14
  table: DataTableInstance<T>;
@@ -1,10 +1,13 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useDataTable } from "./use-data-table.js";
4
4
  import { TableView } from "./table-view.js";
5
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] }));
6
+ import { TableFilters } from "./table-filters.js";
7
+ import { TableFrame } from "./table-frame.js";
8
+ function ControlledTable({ table, toolbar, footer, showColumnSettings = true, showPagination = false, filters, filterBar, layout = "content", ...view }) {
9
+ const fill = layout === "fill";
10
+ return (_jsx(TableFrame, { layout: layout, slot: "data-table", header: (toolbar || showColumnSettings || (filters && filterBar !== false)) && (_jsxs("div", { className: "mui-222f930b8752 mui-27ead27a81df mui-faa8a23c68f6 mui-b9677bd1cb66 mui-32c92bb1fde4 mui-074569488cca", children: [_jsxs("div", { className: "mui-184ddc11e5f9 mui-7bd5bab6d7f4 mui-267171770524", children: [filters && filterBar !== false && _jsx(TableFilters, { ...filterBar, filters: filters }), !filters && toolbar] }), filters && toolbar, showColumnSettings && _jsx(TableColumnSettings, { table: table })] })), footer: showPagination || footer ? (_jsxs(_Fragment, { children: [showPagination && (_jsx("div", { className: "mui-27ead27a81df", children: _jsx(TablePagination, { table: table, loading: view.status === "loading" || view.refreshing }) })), footer] })) : undefined, children: _jsx(TableView, { table: table, filters: filters, ...view, height: fill ? "100%" : view.height }) }));
8
11
  }
9
12
  function ConfiguredTable(props) {
10
13
  const table = useDataTable(props);
@@ -6,4 +6,5 @@ export * from "./use-result-selection.js";
6
6
  export * from "./table-view.js";
7
7
  export * from "./table-controls.js";
8
8
  export * from "./data-table.js";
9
+ export * from "./table-filters.js";
9
10
  export * from "./clipboard.js";
@@ -6,4 +6,5 @@ export * from "./use-result-selection.js";
6
6
  export * from "./table-view.js";
7
7
  export * from "./table-controls.js";
8
8
  export * from "./data-table.js";
9
+ export * from "./table-filters.js";
9
10
  export * from "./clipboard.js";
@@ -0,0 +1,6 @@
1
+ import type { ReactNode } from "react";
2
+ import type { DataTableInstance } from "./use-data-table.js";
3
+ export declare function TableColumnSettings<T extends object>({ table, children, }: {
4
+ table: DataTableInstance<T>;
5
+ children?: ReactNode;
6
+ }): import("react/jsx-runtime").JSX.Element;