@postxl/ui-components 1.3.4 → 1.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -59,7 +59,7 @@ import * as AvatarPrimitive from "@radix-ui/react-avatar";
59
59
  import { DayPicker, getDefaultClassNames } from "react-day-picker";
60
60
  import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
61
61
  import useEmblaCarousel from "embla-carousel-react";
62
- import { BaselineIcon, CalendarIcon as CalendarIcon$1, CheckIcon as CheckIcon$1, CheckSquareIcon, ChevronDownIcon as ChevronDownIcon$1, ChevronUpIcon as ChevronUpIcon$1, CopyIcon, CrossIcon, EraserIcon, EyeOffIcon, FilterX, GripHorizontalIcon, HashIcon, ListChecksIcon, ListIcon, PanelLeftIcon, PinIcon, PinOffIcon, PlusIcon, Settings2Icon, SquareIcon, TextInitialIcon, TrashIcon, XIcon } from "lucide-react";
62
+ import { BaselineIcon, CalendarIcon as CalendarIcon$1, CheckIcon as CheckIcon$1, CheckSquareIcon, ChevronDownIcon as ChevronDownIcon$1, ChevronUpIcon as ChevronUpIcon$1, CopyIcon, EraserIcon, EyeOffIcon, FilterX, GripHorizontalIcon, HashIcon, ListChecksIcon, ListIcon, PanelLeftIcon, PinIcon, PinOffIcon, PlusIcon, Settings2Icon, SquareIcon, TextInitialIcon, TrashIcon, XIcon } from "lucide-react";
63
63
  import * as CollapsePrimitive from "@radix-ui/react-collapsible";
64
64
  import { Command as Command$1 } from "cmdk";
65
65
  import * as DialogPrimitive from "@radix-ui/react-dialog";
@@ -91,6 +91,21 @@ import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
91
91
  function cn(...inputs) {
92
92
  return twMerge(clsx(inputs));
93
93
  }
94
+ /**
95
+ * Generates a test ID by combining a base ID with a suffix.
96
+ * Returns undefined if no base ID is provided.
97
+ *
98
+ * For the root element, use `data-test-id={__e2e_test_id__}` directly.
99
+ * Use this function only for sub-elements that need a suffix.
100
+ *
101
+ * @example
102
+ * <div data-test-id={__e2e_test_id__}> // root element - use directly
103
+ * <input data-test-id={testId(__e2e_test_id__, 'search')}> // sub-element - returns `${baseId}-search` or undefined
104
+ */
105
+ function testId(baseId, suffix) {
106
+ if (!baseId) return void 0;
107
+ return `${baseId}-${suffix}`;
108
+ }
94
109
 
95
110
  //#endregion
96
111
  //#region src/accordion/accordion.tsx
@@ -366,7 +381,7 @@ BreadcrumbEllipsis.displayName = "BreadcrumbElipssis";
366
381
 
367
382
  //#endregion
368
383
  //#region src/calendar/calendar.tsx
369
- function Calendar({ className, classNames, showOutsideDays = true, captionLayout = "label", buttonVariant = "ghost", showYearNavigation = false, formatters, components,...props }) {
384
+ function Calendar({ className, classNames, showOutsideDays = true, captionLayout = "label", buttonVariant = "ghost", showYearNavigation = false, formatters, components, __e2e_test_id__,...props }) {
370
385
  const defaultClassNames = getDefaultClassNames();
371
386
  const [rangeSelectionStep, setRangeSelectionStep] = React$43.useState("from");
372
387
  const handleDayClick = React$43.useCallback((day, modifiers, e) => {
@@ -467,6 +482,7 @@ function Calendar({ className, classNames, showOutsideDays = true, captionLayout
467
482
  disabled: fromMonth && currentMonth <= fromMonth,
468
483
  className: btnClassNames,
469
484
  onClick: () => setCurrentMonth((m) => addMonths(m ?? new Date(), -12)),
485
+ __e2e_test_id__: testId(__e2e_test_id__, "prev-year"),
470
486
  children: /* @__PURE__ */ jsx(DoubleArrowLeftIcon, { className: "" })
471
487
  }), /* @__PURE__ */ jsx(Button, {
472
488
  "aria-label": "previous month",
@@ -475,6 +491,7 @@ function Calendar({ className, classNames, showOutsideDays = true, captionLayout
475
491
  disabled: fromMonth && currentMonth <= fromMonth,
476
492
  className: btnClassNames,
477
493
  onClick: () => setCurrentMonth((m) => addMonths(m ?? new Date(), -1)),
494
+ __e2e_test_id__: testId(__e2e_test_id__, "prev-month"),
478
495
  children: /* @__PURE__ */ jsx(ChevronLeftIcon, {})
479
496
  })]
480
497
  }), /* @__PURE__ */ jsxs("div", {
@@ -486,6 +503,7 @@ function Calendar({ className, classNames, showOutsideDays = true, captionLayout
486
503
  disabled: toMonth && currentMonth >= toMonth,
487
504
  className: btnClassNames,
488
505
  onClick: () => setCurrentMonth((m) => addMonths(m ?? new Date(), 1)),
506
+ __e2e_test_id__: testId(__e2e_test_id__, "next-month"),
489
507
  children: /* @__PURE__ */ jsx(ChevronRightIcon, {})
490
508
  }), showYearNavigation && /* @__PURE__ */ jsx(Button, {
491
509
  "aria-label": "next year",
@@ -494,6 +512,7 @@ function Calendar({ className, classNames, showOutsideDays = true, captionLayout
494
512
  disabled: toMonth && currentMonth >= toMonth,
495
513
  className: btnClassNames,
496
514
  onClick: () => setCurrentMonth((m) => addMonths(m ?? new Date(), 12)),
515
+ __e2e_test_id__: testId(__e2e_test_id__, "next-year"),
497
516
  children: /* @__PURE__ */ jsx(DoubleArrowRightIcon, {})
498
517
  })]
499
518
  })]
@@ -502,6 +521,7 @@ function Calendar({ className, classNames, showOutsideDays = true, captionLayout
502
521
  Root: ({ className: className$1, rootRef,...props$1 }) => {
503
522
  return /* @__PURE__ */ jsx("div", {
504
523
  "data-slot": "calendar",
524
+ "data-test-id": __e2e_test_id__,
505
525
  ref: rootRef,
506
526
  className: cn(className$1),
507
527
  ...props$1
@@ -750,7 +770,7 @@ CarouselNext.displayName = "CarouselNext";
750
770
 
751
771
  //#endregion
752
772
  //#region src/checkbox/checkbox.tsx
753
- const checkboxVariants = cva("cursor-pointer peer appearance-none rounded border focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive shrink-0 shadow-xs transition-shadow", {
773
+ const checkboxVariants = cva("cursor-pointer peer appearance-none rounded-sm border focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive shrink-0 shadow-xs transition-shadow", {
754
774
  variants: {
755
775
  variant: {
756
776
  default: "",
@@ -863,6 +883,7 @@ function DialogContent({ className, children, showCloseButton = true, __e2e_test
863
883
  children: [/* @__PURE__ */ jsx(DialogOverlay, {}), /* @__PURE__ */ jsxs(DialogPrimitive.Content, {
864
884
  "data-slot": "dialog-content",
865
885
  className: cn("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg", className),
886
+ "data-test-id": __e2e_test_id__,
866
887
  ...props,
867
888
  children: [children, showCloseButton && /* @__PURE__ */ jsxs(DialogPrimitive.Close, {
868
889
  title: "Close",
@@ -873,7 +894,7 @@ function DialogContent({ className, children, showCloseButton = true, __e2e_test
873
894
  variant: "outline",
874
895
  size: "icon",
875
896
  className: "size-6 rounded",
876
- __e2e_test_id__: __e2e_test_id__ ? `${__e2e_test_id__}-close` : void 0,
897
+ __e2e_test_id__: testId(__e2e_test_id__, "close"),
877
898
  children: /* @__PURE__ */ jsx(Cross2Icon, {})
878
899
  }), /* @__PURE__ */ jsx("span", {
879
900
  className: "sr-only",
@@ -1247,7 +1268,7 @@ const ContentFrame = ({ title = "", controls = [], indicators = [], children, on
1247
1268
  /* @__PURE__ */ jsxs("div", {
1248
1269
  className: "flex flex-grow gap-2 overflow-hidden",
1249
1270
  children: [/* @__PURE__ */ jsx("h2", {
1250
- className: "text-xl overflow-hidden text-ellipsis whitespace-nowrap",
1271
+ className: "text-xl overflow-hidden text-ellipsis whitespace-nowrap w-full",
1251
1272
  children: titleLink ?? title
1252
1273
  }), indicators.length > 0 && /* @__PURE__ */ jsx("div", {
1253
1274
  className: "flex gap-2 whitespace-nowrap",
@@ -1803,7 +1824,7 @@ const GanttTimerangePicker = ({ initialDateFrom, initialDateTo, onRangeChange, t
1803
1824
  onClick: () => {
1804
1825
  setIsOpen(false);
1805
1826
  },
1806
- children: /* @__PURE__ */ jsx(CrossIcon, { className: "size-5" })
1827
+ children: /* @__PURE__ */ jsx(XIcon, { className: "size-5" })
1807
1828
  })]
1808
1829
  }),
1809
1830
  /* @__PURE__ */ jsxs("div", {
@@ -1915,12 +1936,12 @@ const GanttTimeline = ({ header }) => {
1915
1936
  const lastYearPartialMs = timelineEndMs - new Date(te.getFullYear(), 0, 1).getTime();
1916
1937
  const firstMonthPartialMs = new Date(ts.getFullYear(), ts.getMonth() + 1, 1).getTime() - timelineStartMs;
1917
1938
  const lastMonthPartialMs = timelineEndMs - new Date(te.getFullYear(), te.getMonth(), 1).getTime();
1918
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
1919
- className: "absolute right-8 top-1/2 z-10 -translate-y-1/2",
1939
+ return /* @__PURE__ */ jsxs(Fragment, { children: [cellOpts.onRangeChange && /* @__PURE__ */ jsx("div", {
1940
+ className: "absolute right-8 top-1/2 -translate-y-1/2",
1920
1941
  children: /* @__PURE__ */ jsx(GanttTimerangePicker, {
1921
1942
  initialDateFrom: cellOpts.dateRangeFrom ?? void 0,
1922
1943
  initialDateTo: cellOpts.dateRangeTo ?? void 0,
1923
- onRangeChange: cellOpts.onRangeChange ?? void 0,
1944
+ onRangeChange: cellOpts.onRangeChange,
1924
1945
  timelineStart: cellOpts.timelineStart,
1925
1946
  timelineEnd: cellOpts.timelineEnd
1926
1947
  })
@@ -2546,7 +2567,8 @@ function useDebouncedCallback(callback, delay) {
2546
2567
  const inputVariants = cva("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", {
2547
2568
  variants: { variant: {
2548
2569
  default: "min-h-9 md:text-sm focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
2549
- simple: "min-h-8"
2570
+ simple: "min-h-8",
2571
+ discreet: "py-0 min-h-7 border-transparent shadow-none hover:border-input hover:shadow-sm focus:border-input focus:shadow-sm bg-transparent hover:bg-accent/30"
2550
2572
  } },
2551
2573
  defaultVariants: { variant: "default" }
2552
2574
  });
@@ -2681,7 +2703,7 @@ function DataGridSearchImpl({ searchMatches, matchIndex, searchOpen, onSearchOpe
2681
2703
  size: "icon",
2682
2704
  className: "size-7",
2683
2705
  onClick: onClose,
2684
- children: /* @__PURE__ */ jsx(CrossIcon, {})
2706
+ children: /* @__PURE__ */ jsx(XIcon, {})
2685
2707
  })
2686
2708
  ]
2687
2709
  })]
@@ -3277,7 +3299,8 @@ function GanttCell({ cell, table, rowIndex, columnId, isFocused, isEditing, isSe
3277
3299
  const textareaVariants = cva("border-input placeholder:text-muted-foreground aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50", {
3278
3300
  variants: { variant: {
3279
3301
  default: "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
3280
- simple: ""
3302
+ simple: "",
3303
+ discreet: "border-transparent shadow-none hover:border-input hover:shadow-sm focus:border-input focus:shadow-sm bg-transparent hover:bg-accent/30"
3281
3304
  } },
3282
3305
  defaultVariants: { variant: "default" }
3283
3306
  });
@@ -3672,7 +3695,7 @@ function MultiSelectCell({ cell, table, rowIndex, columnId, isFocused, isEditing
3672
3695
  event.preventDefault();
3673
3696
  event.stopPropagation();
3674
3697
  },
3675
- children: /* @__PURE__ */ jsx(CrossIcon, { className: "size-3" })
3698
+ children: /* @__PURE__ */ jsx(XIcon, { className: "size-3" })
3676
3699
  })]
3677
3700
  }, value)), /* @__PURE__ */ jsx(CommandInput, {
3678
3701
  ref: inputRef,
@@ -3919,25 +3942,31 @@ function SelectCell({ cell, table, rowIndex, columnId, isFocused, isEditing, isS
3919
3942
  const cellOpts = cell.column.columnDef.meta?.cell;
3920
3943
  const hasSearch = (cellOpts?.variant === "select" && cellOpts?.hasSearch) ?? false;
3921
3944
  const sideOffset = -(inputRef.current?.clientHeight ?? 0);
3922
- const arrayOptions = cellOpts?.variant === "select" ? cellOpts.options : void 0;
3923
- const optionsMap = cellOpts?.variant === "select" ? cellOpts.optionsMap : void 0;
3945
+ const { options: arrayOptions, optionsMap, optionsRenderer } = cellOpts?.variant === "select" ? cellOpts : {};
3924
3946
  const arrayOptionsLabelMap = React$18.useMemo(() => arrayOptions ? new Map(arrayOptions.map((opt) => [opt.value, opt.label])) : null, [arrayOptions]);
3925
3947
  const displayLabel = React$18.useMemo(() => {
3926
- if (!value) return value;
3927
- if (optionsMap) return optionsMap.get(value) ?? value;
3928
- if (arrayOptionsLabelMap) return arrayOptionsLabelMap.get(value) ?? value;
3948
+ if (optionsMap) {
3949
+ const data = optionsMap.get(value ?? "");
3950
+ if (optionsRenderer) return optionsRenderer(data, "cell");
3951
+ return data ?? value;
3952
+ }
3953
+ if (arrayOptionsLabelMap) return arrayOptionsLabelMap.get(value ?? "") ?? value;
3929
3954
  return value;
3930
3955
  }, [
3931
3956
  value,
3932
3957
  optionsMap,
3933
- arrayOptionsLabelMap
3958
+ arrayOptionsLabelMap,
3959
+ optionsRenderer
3934
3960
  ]);
3935
3961
  const options = React$18.useMemo(() => {
3936
3962
  if (!isEditing) return [];
3937
- if (arrayOptions) return arrayOptions;
3938
- if (optionsMap) return Array.from(optionsMap.entries()).map(([id, label]) => ({
3963
+ if (arrayOptions) return arrayOptions.map((opt) => ({
3964
+ value: opt.value,
3965
+ data: opt.label
3966
+ }));
3967
+ if (optionsMap) return Array.from(optionsMap.entries()).map(([id, data]) => ({
3939
3968
  value: id,
3940
- label
3969
+ data
3941
3970
  }));
3942
3971
  return [];
3943
3972
  }, [
@@ -3998,13 +4027,13 @@ function SelectCell({ cell, table, rowIndex, columnId, isFocused, isEditing, isS
3998
4027
  meta?.isScrolling
3999
4028
  ]);
4000
4029
  let editingContent;
4001
- if (hasSearch) editingContent = /* @__PURE__ */ jsxs(Popover, {
4030
+ if (hasSearch || optionsRenderer) editingContent = /* @__PURE__ */ jsxs(Popover, {
4002
4031
  open,
4003
4032
  onOpenChange,
4004
4033
  children: [/* @__PURE__ */ jsx(PopoverTrigger, {
4005
4034
  asChild: true,
4006
4035
  children: /* @__PURE__ */ jsx("div", {
4007
- className: "size-full items-start text-start border-none p-0 shadow-none focus-visible:ring-0 dark:bg-transparent [&_svg]:hidden line-clamp-1",
4036
+ className: cn("size-full", !optionsRenderer && "items-start text-start border-none p-0 shadow-none focus-visible:ring-0 dark:bg-transparent [&_svg]:hidden line-clamp-1"),
4008
4037
  children: displayLabel
4009
4038
  })
4010
4039
  }), /* @__PURE__ */ jsx(PopoverContent, {
@@ -4014,17 +4043,18 @@ function SelectCell({ cell, table, rowIndex, columnId, isFocused, isEditing, isS
4014
4043
  className: "max-w-[500px] w-full rounded-none p-0",
4015
4044
  onOpenAutoFocus,
4016
4045
  children: /* @__PURE__ */ jsx(Command, { children: /* @__PURE__ */ jsxs(CommandList, { children: [
4017
- /* @__PURE__ */ jsx(CommandInput, {
4046
+ hasSearch && /* @__PURE__ */ jsx(CommandInput, {
4018
4047
  ref: inputRef,
4019
4048
  placeholder: "Search...",
4020
4049
  className: "h-auto flex-1 p-0"
4021
4050
  }),
4022
4051
  /* @__PURE__ */ jsx(CommandEmpty, { children: "No results found." }),
4023
4052
  /* @__PURE__ */ jsx(CommandGroup, { children: options.map((option) => /* @__PURE__ */ jsxs(CommandItem, {
4053
+ className: optionsRenderer ? "py-1" : void 0,
4024
4054
  onSelect: () => {
4025
4055
  onValueChange(option.value);
4026
4056
  },
4027
- children: [/* @__PURE__ */ jsx("span", { children: option.label }), value === option.value ? /* @__PURE__ */ jsx(CheckIcon$1, { className: "ml-auto h-4 w-4" }) : null]
4057
+ children: [optionsRenderer ? optionsRenderer(option.data, "option") : /* @__PURE__ */ jsx("span", { children: option.data }), value === option.value ? /* @__PURE__ */ jsx(CheckIcon$1, { className: "ml-auto h-4 w-4" }) : null]
4028
4058
  }, option.value)) })
4029
4059
  ] }) })
4030
4060
  })]
@@ -4046,7 +4076,7 @@ function SelectCell({ cell, table, rowIndex, columnId, isFocused, isEditing, isS
4046
4076
  children: options.map((option) => /* @__PURE__ */ jsx(SelectItem, {
4047
4077
  value: option.value,
4048
4078
  spacing: "sm",
4049
- children: option.label
4079
+ children: option.data
4050
4080
  }, option.value))
4051
4081
  })]
4052
4082
  });
@@ -4060,7 +4090,7 @@ function SelectCell({ cell, table, rowIndex, columnId, isFocused, isEditing, isS
4060
4090
  isFocused,
4061
4091
  isSelected,
4062
4092
  onKeyDown: onWrapperKeyDown,
4063
- children: isEditing ? editingContent : /* @__PURE__ */ jsx("span", {
4093
+ children: isEditing ? editingContent : optionsRenderer ? displayLabel : /* @__PURE__ */ jsx("span", {
4064
4094
  "data-slot": "grid-cell-content",
4065
4095
  children: displayLabel
4066
4096
  })
@@ -4511,6 +4541,63 @@ function DataGridViewMenu({ table,...props }) {
4511
4541
  })] });
4512
4542
  }
4513
4543
 
4544
+ //#endregion
4545
+ //#region src/data-grid/column-presets/select-column.tsx
4546
+ /**
4547
+ * Creates a selection column with checkboxes for row selection.
4548
+ * Includes a header checkbox for selecting all rows and an optional delete button.
4549
+ *
4550
+ * @example
4551
+ * ```tsx
4552
+ * const columns = [
4553
+ * createSelectColumn<MyDataType>({
4554
+ * onRemoveRows: (ids) => handleDelete(ids),
4555
+ * }),
4556
+ * // ... other columns
4557
+ * ]
4558
+ * ```
4559
+ */
4560
+ function createSelectColumn(options = {}) {
4561
+ const { onRemoveRows, id = "select", size = 70 } = options;
4562
+ return {
4563
+ id,
4564
+ header: ({ table }) => /* @__PURE__ */ jsxs("div", {
4565
+ className: "size-full p-0 m-0 flex items-center gap-2",
4566
+ children: [/* @__PURE__ */ jsx(Checkbox, {
4567
+ variant: table.getIsSomePageRowsSelected() ? "default" : "simple",
4568
+ iconStyle: table.getIsSomePageRowsSelected() ? "default" : "simple",
4569
+ checkIcon: "check",
4570
+ checked: table.getIsAllPageRowsSelected() || table.getIsSomePageRowsSelected(),
4571
+ onChange: (e) => table.toggleAllPageRowsSelected(!!e.target.checked)
4572
+ }), onRemoveRows && /* @__PURE__ */ jsx(Button, {
4573
+ variant: "ghost",
4574
+ className: "size-5 hover:[&_svg]:text-background hover:bg-destructive/90",
4575
+ onClick: () => {
4576
+ const toRemove = table.getSelectedRowModel().rows.map((row) => row.original.id);
4577
+ if (toRemove.length === 0) return;
4578
+ onRemoveRows(toRemove);
4579
+ table.toggleAllRowsSelected(false);
4580
+ },
4581
+ children: /* @__PURE__ */ jsx(TrashIcon, {})
4582
+ })]
4583
+ }),
4584
+ cell: ({ row }) => /* @__PURE__ */ jsx("div", {
4585
+ className: "size-full flex items-center px-3",
4586
+ children: /* @__PURE__ */ jsx(Checkbox, {
4587
+ variant: "simple",
4588
+ iconStyle: "simple",
4589
+ checkIcon: "check",
4590
+ checked: row.getIsSelected(),
4591
+ disabled: !row.getCanSelect(),
4592
+ onChange: (e) => row.toggleSelected(!!e.target.checked)
4593
+ })
4594
+ }),
4595
+ size,
4596
+ enableSorting: false,
4597
+ enableHiding: false
4598
+ };
4599
+ }
4600
+
4514
4601
  //#endregion
4515
4602
  //#region src/data-grid/hooks/use-data-grid.tsx
4516
4603
  const DEFAULT_ROW_HEIGHT = "short";
@@ -6089,6 +6176,109 @@ function useIsMobile(mobileBreakpoint = 768) {
6089
6176
  return isMobile;
6090
6177
  }
6091
6178
 
6179
+ //#endregion
6180
+ //#region src/info-card/info-card.tsx
6181
+ const variantStyles = {
6182
+ loading: {
6183
+ titleClass: "text-foreground",
6184
+ messageContainerClass: "p-4 bg-muted border border-border rounded-md"
6185
+ },
6186
+ error: {
6187
+ titleClass: "text-destructive",
6188
+ messageContainerClass: "p-4 bg-destructive/10 border border-destructive/20 rounded-md"
6189
+ },
6190
+ info: {
6191
+ titleClass: "text-foreground",
6192
+ messageContainerClass: "p-4 bg-muted border border-border rounded-md"
6193
+ },
6194
+ "not-found": {
6195
+ titleClass: "text-foreground",
6196
+ messageContainerClass: "p-4 bg-muted border border-border rounded-md"
6197
+ }
6198
+ };
6199
+ const InfoCard = ({ variant, title, message, showHomeButton = false, children }) => {
6200
+ const styles = variantStyles[variant];
6201
+ return /* @__PURE__ */ jsx("div", {
6202
+ className: "flex w-full pt-4 px-4 h-(--content-without-header) items-center justify-center",
6203
+ children: /* @__PURE__ */ jsxs(Card, {
6204
+ className: "max-w-xl w-full",
6205
+ children: [
6206
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, {
6207
+ className: styles.titleClass,
6208
+ children: /* @__PURE__ */ jsxs("span", {
6209
+ className: "flex items-center gap-2",
6210
+ children: [variant === "loading" && /* @__PURE__ */ jsx("div", {
6211
+ style: {
6212
+ width: 20,
6213
+ height: 20
6214
+ },
6215
+ children: /* @__PURE__ */ jsx(Spinner, {})
6216
+ }), title]
6217
+ })
6218
+ }) }),
6219
+ /* @__PURE__ */ jsxs(CardContent, {
6220
+ className: "space-y-4",
6221
+ children: [/* @__PURE__ */ jsx("div", {
6222
+ className: styles.messageContainerClass,
6223
+ children: /* @__PURE__ */ jsx("p", {
6224
+ className: "text-sm wrap-break-word",
6225
+ children: message
6226
+ })
6227
+ }), children]
6228
+ }),
6229
+ showHomeButton && /* @__PURE__ */ jsx(CardFooter, { children: /* @__PURE__ */ jsx(Button, {
6230
+ asChild: true,
6231
+ children: /* @__PURE__ */ jsx("a", {
6232
+ href: "/",
6233
+ children: "Back to Home"
6234
+ })
6235
+ }) })
6236
+ ]
6237
+ })
6238
+ });
6239
+ };
6240
+
6241
+ //#endregion
6242
+ //#region src/input/deferred-input.tsx
6243
+ /**
6244
+ * An Input that buffers changes locally and only commits to the parent
6245
+ * on blur or Enter key press. Useful for forms where you don't want to
6246
+ * trigger expensive operations (like API calls) on every keystroke.
6247
+ */
6248
+ function DeferredInput({ value, onCommit, onValueChange, commitOnEnter = true, onBlur, onKeyDown,...props }) {
6249
+ const [localValue, setLocalValue] = useState(value);
6250
+ useEffect(() => {
6251
+ setLocalValue(value);
6252
+ }, [value]);
6253
+ const commitValue = useCallback(() => {
6254
+ if (localValue !== value) onCommit(localValue);
6255
+ }, [
6256
+ localValue,
6257
+ value,
6258
+ onCommit
6259
+ ]);
6260
+ const handleChange = useCallback((e) => {
6261
+ const newValue = e.target.value;
6262
+ setLocalValue(newValue);
6263
+ onValueChange?.(newValue);
6264
+ }, [onValueChange]);
6265
+ const handleBlur = useCallback((e) => {
6266
+ commitValue();
6267
+ onBlur?.(e);
6268
+ }, [commitValue, onBlur]);
6269
+ const handleKeyDown = useCallback((e) => {
6270
+ if (commitOnEnter && e.key === "Enter") e.currentTarget.blur();
6271
+ onKeyDown?.(e);
6272
+ }, [commitOnEnter, onKeyDown]);
6273
+ return /* @__PURE__ */ jsx(Input, {
6274
+ ...props,
6275
+ value: localValue,
6276
+ onChange: handleChange,
6277
+ onBlur: handleBlur,
6278
+ onKeyDown: handleKeyDown
6279
+ });
6280
+ }
6281
+
6092
6282
  //#endregion
6093
6283
  //#region src/input/number-input.tsx
6094
6284
  /**
@@ -6142,7 +6332,8 @@ function parseFormattedNumberHeuristic(formatted) {
6142
6332
  const numberInputWrapperVariants = cva("border-input bg-background grid grid-cols-[auto_1fr_auto] items-center overflow-hidden rounded-md border shadow-xs transition-[color,box-shadow] has-[input:disabled]:pointer-events-none has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50", {
6143
6333
  variants: { variant: {
6144
6334
  default: "min-h-9 focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]",
6145
- simple: "min-h-8"
6335
+ simple: "min-h-8",
6336
+ discreet: "py-0 min-h-7 border-transparent shadow-none hover:border-input hover:shadow-sm focus-within:border-input focus-within:shadow-sm bg-transparent hover:bg-accent/30"
6146
6337
  } },
6147
6338
  defaultVariants: { variant: "default" }
6148
6339
  });
@@ -6235,7 +6426,7 @@ const NumberInput = React$10.forwardRef(({ className, wrapperClassName, prefix,
6235
6426
  inputVariants({ variant }),
6236
6427
  // Remove border/shadow/ring from input since wrapper handles it
6237
6428
  // Use min-h-full to override min-h-9/min-h-8 from inputVariants - wrapper controls height - never use explicit h-* in input since it breaks the spinner buttons for some browsers
6238
- "min-h-full border-0 shadow-none focus-visible:ring-0 p-0 tabular-nums",
6429
+ "min-h-full bg-transparent hover:bg-transparent border-0 shadow-none focus-visible:ring-0 p-0 tabular-nums",
6239
6430
  !prefix && !suffix ? "col-span-3" : !prefix || !suffix ? "col-span-2" : "col-span-1",
6240
6431
  "text-right",
6241
6432
  !prefix && "pl-2",
@@ -6266,6 +6457,51 @@ const NumberInput = React$10.forwardRef(({ className, wrapperClassName, prefix,
6266
6457
  });
6267
6458
  NumberInput.displayName = "NumberInput";
6268
6459
 
6460
+ //#endregion
6461
+ //#region src/input/deferred-number-input.tsx
6462
+ /**
6463
+ * A NumberInput that buffers changes locally and only commits to the parent
6464
+ * on blur or Enter key press. Useful for forms where you don't want to
6465
+ * trigger expensive operations (like API calls) on every keystroke.
6466
+ */
6467
+ function DeferredNumberInput({ value, onCommit, onValueChange, commitOnEnter = true, onBlur, onEnter,...props }) {
6468
+ const [localValue, setLocalValue] = useState(value);
6469
+ useEffect(() => {
6470
+ setLocalValue(value);
6471
+ }, [value]);
6472
+ const commitValue = useCallback(() => {
6473
+ if (localValue !== value) onCommit(localValue);
6474
+ }, [
6475
+ localValue,
6476
+ value,
6477
+ onCommit
6478
+ ]);
6479
+ const handleChange = useCallback((newValue) => {
6480
+ const normalizedValue = newValue ?? null;
6481
+ setLocalValue(normalizedValue);
6482
+ onValueChange?.(normalizedValue);
6483
+ }, [onValueChange]);
6484
+ const handleBlur = useCallback((e) => {
6485
+ commitValue();
6486
+ onBlur?.(e);
6487
+ }, [commitValue, onBlur]);
6488
+ const handleEnter = useCallback(() => {
6489
+ if (commitOnEnter) commitValue();
6490
+ onEnter?.();
6491
+ }, [
6492
+ commitOnEnter,
6493
+ commitValue,
6494
+ onEnter
6495
+ ]);
6496
+ return /* @__PURE__ */ jsx(NumberInput, {
6497
+ ...props,
6498
+ value: localValue ?? void 0,
6499
+ onChange: handleChange,
6500
+ onBlur: handleBlur,
6501
+ onEnter: handleEnter
6502
+ });
6503
+ }
6504
+
6269
6505
  //#endregion
6270
6506
  //#region src/mark-value-renderer/mark-value-renderer.tsx
6271
6507
  /**
@@ -6673,12 +6909,14 @@ const sheetVariants = cva("fixed z-50 gap-4 bg-background p-6 shadow-lg transiti
6673
6909
  } },
6674
6910
  defaultVariants: { side: "right" }
6675
6911
  });
6676
- const SheetContent = React$6.forwardRef(({ side = "right", className, children,...props }, ref) => /* @__PURE__ */ jsxs(SheetPortal, { children: [/* @__PURE__ */ jsx(SheetOverlay, {}), /* @__PURE__ */ jsxs(SheetPrimitive.Content, {
6912
+ const SheetContent = React$6.forwardRef(({ side = "right", className, children, __e2e_test_id__,...props }, ref) => /* @__PURE__ */ jsxs(SheetPortal, { children: [/* @__PURE__ */ jsx(SheetOverlay, {}), /* @__PURE__ */ jsxs(SheetPrimitive.Content, {
6677
6913
  ref,
6678
6914
  className: cn(sheetVariants({ side }), className),
6915
+ "data-test-id": __e2e_test_id__,
6679
6916
  ...props,
6680
6917
  children: [/* @__PURE__ */ jsxs(SheetPrimitive.Close, {
6681
6918
  className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary",
6919
+ "data-test-id": testId(__e2e_test_id__, "close"),
6682
6920
  children: [/* @__PURE__ */ jsx(Cross2Icon, { className: "h-4 w-4" }), /* @__PURE__ */ jsx("span", {
6683
6921
  className: "sr-only",
6684
6922
  children: "Close"
@@ -7112,7 +7350,7 @@ function usePersistedState(storageKey, defaultValue) {
7112
7350
  }, [storageKey]);
7113
7351
  return [state, setPersistedState];
7114
7352
  }
7115
- function Slicer({ filterValues, selectedValues, onChange, title, isLoading = false, optionsHeight = 200, className, defaultCollapsed = false, storageKey }) {
7353
+ function Slicer({ filterValues, selectedValues, onChange, title, isLoading = false, optionsHeight = 200, className, defaultCollapsed = false, storageKey, __e2e_test_id__ }) {
7116
7354
  const effectiveStorageKey = storageKey === null ? void 0 : storageKey ?? `slicer-collapsed-${title}`;
7117
7355
  const [isCollapsed, setIsCollapsed] = usePersistedState(effectiveStorageKey, defaultCollapsed);
7118
7356
  const [searchQuery, setSearchQuery] = useState("");
@@ -7146,6 +7384,7 @@ function Slicer({ filterValues, selectedValues, onChange, title, isLoading = fal
7146
7384
  };
7147
7385
  return /* @__PURE__ */ jsxs(Card, {
7148
7386
  className: cn("flex flex-col overflow-hidden w-56 rounded shadow-sm shrink-0", className),
7387
+ "data-test-id": __e2e_test_id__,
7149
7388
  children: [/* @__PURE__ */ jsxs(CardHeader, {
7150
7389
  className: "px-2 py-0 pt-2 flex space-y-0 border-b border-border bg-muted/50 relative min-h-9",
7151
7390
  children: [
@@ -7158,7 +7397,8 @@ function Slicer({ filterValues, selectedValues, onChange, title, isLoading = fal
7158
7397
  variant: "simple",
7159
7398
  placeholder: "Search...",
7160
7399
  value: searchQuery,
7161
- onChange: (e) => setSearchQuery(e.target.value)
7400
+ onChange: (e) => setSearchQuery(e.target.value),
7401
+ "data-test-id": testId(__e2e_test_id__, "search")
7162
7402
  }),
7163
7403
  /* @__PURE__ */ jsx(Button, {
7164
7404
  variant: "ghost",
@@ -7169,6 +7409,7 @@ function Slicer({ filterValues, selectedValues, onChange, title, isLoading = fal
7169
7409
  },
7170
7410
  title: isCollapsed ? "Expand slicer" : "Collapse slicer",
7171
7411
  className: "size-7 absolute top-1 right-9 text-muted-foreground",
7412
+ "data-test-id": testId(__e2e_test_id__, "collapse"),
7172
7413
  children: /* @__PURE__ */ jsx(ChevronUpIcon$1, { className: cn(isCollapsed && "rotate-180") })
7173
7414
  }),
7174
7415
  /* @__PURE__ */ jsx(Button, {
@@ -7178,6 +7419,7 @@ function Slicer({ filterValues, selectedValues, onChange, title, isLoading = fal
7178
7419
  onClick: handleClear,
7179
7420
  title: "Clear filter",
7180
7421
  className: "size-7 absolute top-1 right-1 text-muted-foreground",
7422
+ "data-test-id": testId(__e2e_test_id__, "clear"),
7181
7423
  children: /* @__PURE__ */ jsx(FilterX, {})
7182
7424
  })
7183
7425
  ]
@@ -7188,6 +7430,7 @@ function Slicer({ filterValues, selectedValues, onChange, title, isLoading = fal
7188
7430
  size: "xs",
7189
7431
  className: "w-full justify-start px-2 py-1 rounded-sm text-sm font-normal",
7190
7432
  onClick: handleSelectAll,
7433
+ "data-test-id": testId(__e2e_test_id__, "select-all"),
7191
7434
  children: searchQuery.length > 0 ? /* @__PURE__ */ jsx(Checkbox, {
7192
7435
  readOnly: true,
7193
7436
  checked: isAnyFilteredSelected,
@@ -7360,6 +7603,42 @@ function TabsContent({ className,...props }) {
7360
7603
  });
7361
7604
  }
7362
7605
 
7606
+ //#endregion
7607
+ //#region src/textarea/deferred-textarea.tsx
7608
+ /**
7609
+ * A Textarea that buffers changes locally and only commits to the parent
7610
+ * on blur. Useful for forms where you don't want to trigger expensive
7611
+ * operations (like API calls) on every keystroke.
7612
+ */
7613
+ function DeferredTextarea({ value, onCommit, onValueChange, onBlur,...props }) {
7614
+ const [localValue, setLocalValue] = useState(value);
7615
+ useEffect(() => {
7616
+ setLocalValue(value);
7617
+ }, [value]);
7618
+ const commitValue = useCallback(() => {
7619
+ if (localValue !== value) onCommit(localValue);
7620
+ }, [
7621
+ localValue,
7622
+ value,
7623
+ onCommit
7624
+ ]);
7625
+ const handleChange = useCallback((e) => {
7626
+ const newValue = e.target.value;
7627
+ setLocalValue(newValue);
7628
+ onValueChange?.(newValue);
7629
+ }, [onValueChange]);
7630
+ const handleBlur = useCallback((e) => {
7631
+ commitValue();
7632
+ onBlur?.(e);
7633
+ }, [commitValue, onBlur]);
7634
+ return /* @__PURE__ */ jsx(Textarea, {
7635
+ ...props,
7636
+ value: localValue,
7637
+ onChange: handleChange,
7638
+ onBlur: handleBlur
7639
+ });
7640
+ }
7641
+
7363
7642
  //#endregion
7364
7643
  //#region src/toggle/toggle.tsx
7365
7644
  const toggleVariants = cva("inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground cursor-pointer", {
@@ -7427,5 +7706,5 @@ const ToggleGroupItem = React$1.forwardRef(({ className, children, variant, size
7427
7706
  ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;
7428
7707
 
7429
7708
  //#endregion
7430
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, Calendar, CalendarDayButton, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, Checkbox, CheckboxCell, Collapse, CollapseContent, CollapseTrigger, ComboboxDemo, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandPalette, CommandPaletteDialog, CommandPaletteEmpty, CommandPaletteGroup, CommandPaletteInput, CommandPaletteItem, CommandPaletteList, CommandPaletteSeparator, CommandPaletteShortcut, CommandSeparator, CommandShortcut, ContentFrame, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DataGrid, DataGridCell, DataGridCellWrapper, DataGridColumnHeader, DataGridContextMenu, DataGridRow, DataGridSearch, DataGridViewMenu, DateCell, DatePickerDemo, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, GanttCell, GanttTimeline, GanttTimerangePicker, HeaderComponents, HoverCard, HoverCardContent, HoverCardTrigger, Input, Label, Loader, LongTextCell, MarkValueRenderer, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Modal, MultiSelectCell, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NumberCell, NumberInput, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ReactNodeCell, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectCell, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, ShortTextCell, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slicer, Slider, Spinner, Switch, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonVariants, checkboxVariants, cn, commandInputVariants, getCellKey, getCommonPinningStyles, getLineCount, getRowHeightValue, inputVariants, isoToLocalDate, knobVariants, navigationMenuTriggerStyle, parseCellKey, sliderVariants, toast, toggleVariants, useCallbackRef, useDataGrid, useDebouncedCallback, useIsMobile, useSidebar };
7709
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, Calendar, CalendarDayButton, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, Checkbox, CheckboxCell, Collapse, CollapseContent, CollapseTrigger, ComboboxDemo, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandPalette, CommandPaletteDialog, CommandPaletteEmpty, CommandPaletteGroup, CommandPaletteInput, CommandPaletteItem, CommandPaletteList, CommandPaletteSeparator, CommandPaletteShortcut, CommandSeparator, CommandShortcut, ContentFrame, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DataGrid, DataGridCell, DataGridCellWrapper, DataGridColumnHeader, DataGridContextMenu, DataGridRow, DataGridSearch, DataGridViewMenu, DateCell, DatePickerDemo, DeferredInput, DeferredNumberInput, DeferredTextarea, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, GanttCell, GanttTimeline, GanttTimerangePicker, HeaderComponents, HoverCard, HoverCardContent, HoverCardTrigger, InfoCard, Input, Label, Loader, LongTextCell, MarkValueRenderer, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Modal, MultiSelectCell, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NumberCell, NumberInput, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ReactNodeCell, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectCell, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, ShortTextCell, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slicer, Slider, Spinner, Switch, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonVariants, checkboxVariants, cn, commandInputVariants, createSelectColumn, getCellKey, getCommonPinningStyles, getLineCount, getRowHeightValue, inputVariants, isoToLocalDate, knobVariants, navigationMenuTriggerStyle, parseCellKey, sliderVariants, testId, toast, toggleVariants, useCallbackRef, useDataGrid, useDebouncedCallback, useIsMobile, useSidebar };
7431
7710
  //# sourceMappingURL=index.js.map