@bizapps/ui 1.4.1 → 1.5.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.
package/dist/main.js CHANGED
@@ -4,7 +4,7 @@ import { cva } from 'class-variance-authority';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
7
- import { createContext, memo, useRef, useState, useMemo, useCallback, useEffect, forwardRef, Fragment, useId, useContext, useLayoutEffect } from 'react';
7
+ import { createContext, memo, useRef, useState, useMemo, useCallback, useEffect, forwardRef, Fragment, useId, useContext, useLayoutEffect, isValidElement, cloneElement } from 'react';
8
8
  import { Avatar as Avatar$1, Checkbox as Checkbox$1, Slot, Select as Select$1, Label as Label$1, Popover as Popover$1, Toggle as Toggle$1, ToggleGroup, Separator as Separator$1, Progress as Progress$1, Slider as Slider$1, Switch as Switch$1, Tabs as Tabs$1, Tooltip as Tooltip$1, Dialog as Dialog$1, AlertDialog as AlertDialog$1, Accordion as Accordion$1, DropdownMenu as DropdownMenu$1, RadioGroup as RadioGroup$1, NavigationMenu as NavigationMenu$1 } from 'radix-ui';
9
9
  import { isSameDay, isToday, format, addDays } from 'date-fns';
10
10
  import useEmblaCarousel from 'embla-carousel-react';
@@ -1683,31 +1683,37 @@ function SelectContent({
1683
1683
  className,
1684
1684
  children,
1685
1685
  position = "popper",
1686
+ maxHeight,
1687
+ style,
1686
1688
  ...props
1687
1689
  }) {
1690
+ const resolvedMaxHeight = typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight;
1688
1691
  return /* @__PURE__ */ jsx(Select$1.Portal, { children: /* @__PURE__ */ jsxs(
1689
1692
  Select$1.Content,
1690
1693
  {
1691
1694
  "data-slot": "select-content",
1692
1695
  className: cn(
1693
- "border-border bg-popover text-popover-foreground relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-x-hidden overflow-y-auto rounded-md border shadow-md",
1696
+ "border-border bg-popover text-popover-foreground relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-hidden rounded-md border shadow-md",
1694
1697
  "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
1695
1698
  "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
1696
1699
  "data-[side=bottom]:translate-y-1 data-[side=top]:-translate-y-1",
1697
- position === "popper" && "w-[--radix-select-trigger-width]",
1700
+ position === "popper" && "w-(--radix-select-trigger-width)",
1698
1701
  className
1699
1702
  ),
1700
1703
  position,
1704
+ style: {
1705
+ ...resolvedMaxHeight ? {
1706
+ maxHeight: `min(${resolvedMaxHeight}, var(--radix-select-content-available-height))`
1707
+ } : null,
1708
+ ...style
1709
+ },
1701
1710
  ...props,
1702
1711
  children: [
1703
1712
  /* @__PURE__ */ jsx(SelectScrollUpButton, {}),
1704
1713
  /* @__PURE__ */ jsx(
1705
1714
  Select$1.Viewport,
1706
1715
  {
1707
- className: cn(
1708
- "p-1",
1709
- position === "popper" && "h-[--radix-select-trigger-height]"
1710
- ),
1716
+ className: cn("scroll-my-1 p-1", position === "popper" && "w-full"),
1711
1717
  children
1712
1718
  }
1713
1719
  ),
@@ -4369,6 +4375,7 @@ ColorPickerPresets.displayName = "ColorPickerPresets";
4369
4375
  function Calendar({
4370
4376
  className,
4371
4377
  classNames,
4378
+ modifiersClassNames,
4372
4379
  showOutsideDays = true,
4373
4380
  captionLayout = "dropdown",
4374
4381
  buttonVariant = "ghost",
@@ -4380,6 +4387,36 @@ function Calendar({
4380
4387
  ...props
4381
4388
  }) {
4382
4389
  const defaultClassNames = getDefaultClassNames();
4390
+ const resolvedComponents = useMemo(
4391
+ () => ({
4392
+ Root: ({ className: className2, rootRef, ...rootProps }) => {
4393
+ return /* @__PURE__ */ jsx(
4394
+ "div",
4395
+ {
4396
+ "data-slot": "calendar",
4397
+ ref: rootRef,
4398
+ className: cn(className2),
4399
+ ...rootProps
4400
+ }
4401
+ );
4402
+ },
4403
+ Chevron: ({ className: className2, orientation, ...chevronProps }) => {
4404
+ if (orientation === "left") {
4405
+ return /* @__PURE__ */ jsx(ChevronLeftIcon, { className: cn("size-4", className2), ...chevronProps });
4406
+ }
4407
+ if (orientation === "right") {
4408
+ return /* @__PURE__ */ jsx(ChevronRightIcon, { className: cn("size-4", className2), ...chevronProps });
4409
+ }
4410
+ return /* @__PURE__ */ jsx(ChevronDownIcon, { className: cn("size-4", className2), ...chevronProps });
4411
+ },
4412
+ DayButton: (dayButtonProps) => /* @__PURE__ */ jsx(CalendarDayButton, { locale, ...dayButtonProps }),
4413
+ WeekNumber: ({ children, ...weekNumberProps }) => {
4414
+ return /* @__PURE__ */ jsx("td", { ...weekNumberProps, children: /* @__PURE__ */ jsx("div", { className: "flex size-(--cell-size) items-center justify-center text-center", children }) });
4415
+ },
4416
+ ...components
4417
+ }),
4418
+ [locale, components]
4419
+ );
4383
4420
  return /* @__PURE__ */ jsx(
4384
4421
  DayPicker,
4385
4422
  {
@@ -4471,33 +4508,13 @@ function Calendar({
4471
4508
  hidden: cn("invisible", defaultClassNames.hidden),
4472
4509
  ...classNames
4473
4510
  },
4474
- components: {
4475
- Root: ({ className: className2, rootRef, ...props2 }) => {
4476
- return /* @__PURE__ */ jsx(
4477
- "div",
4478
- {
4479
- "data-slot": "calendar",
4480
- ref: rootRef,
4481
- className: cn(className2),
4482
- ...props2
4483
- }
4484
- );
4485
- },
4486
- Chevron: ({ className: className2, orientation, ...props2 }) => {
4487
- if (orientation === "left") {
4488
- return /* @__PURE__ */ jsx(ChevronLeftIcon, { className: cn("size-4", className2), ...props2 });
4489
- }
4490
- if (orientation === "right") {
4491
- return /* @__PURE__ */ jsx(ChevronRightIcon, { className: cn("size-4", className2), ...props2 });
4492
- }
4493
- return /* @__PURE__ */ jsx(ChevronDownIcon, { className: cn("size-4", className2), ...props2 });
4494
- },
4495
- DayButton: ({ ...props2 }) => /* @__PURE__ */ jsx(CalendarDayButton, { locale, ...props2 }),
4496
- WeekNumber: ({ children, ...props2 }) => {
4497
- return /* @__PURE__ */ jsx("td", { ...props2, children: /* @__PURE__ */ jsx("div", { className: "flex size-(--cell-size) items-center justify-center text-center", children }) });
4498
- },
4499
- ...components
4511
+ modifiersClassNames: {
4512
+ preview_start: "relative isolate z-0 rounded-l-md bg-primary/8 after:absolute after:inset-y-0 after:right-0 after:w-3 after:bg-primary/8",
4513
+ preview_middle: "rounded-none bg-primary/8",
4514
+ preview_end: "relative isolate z-0 rounded-r-md bg-primary/8 after:absolute after:inset-y-0 after:left-0 after:w-3 after:bg-primary/8",
4515
+ ...modifiersClassNames
4500
4516
  },
4517
+ components: resolvedComponents,
4501
4518
  ...props
4502
4519
  }
4503
4520
  );
@@ -4514,6 +4531,9 @@ function CalendarDayButton({
4514
4531
  useEffect(() => {
4515
4532
  if (modifiers.focused) ref.current?.focus();
4516
4533
  }, [modifiers.focused]);
4534
+ const isPreviewEdge = Boolean(
4535
+ (modifiers.preview_start || modifiers.preview_end) && !modifiers.selected
4536
+ );
4517
4537
  return /* @__PURE__ */ jsx(
4518
4538
  Button,
4519
4539
  {
@@ -4525,8 +4545,10 @@ function CalendarDayButton({
4525
4545
  "data-range-start": modifiers.range_start,
4526
4546
  "data-range-end": modifiers.range_end,
4527
4547
  "data-range-middle": modifiers.range_middle,
4548
+ "data-preview-middle": Boolean(modifiers.preview_middle),
4549
+ "data-preview-edge": isPreviewEdge,
4528
4550
  className: cn(
4529
- "group-data-[focused=true]/day:ring-primary/40 data-[range-end=true]:!bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:!bg-primary/8 data-[range-middle=true]:text-foreground data-[range-start=true]:!bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:!bg-primary data-[selected-single=true]:text-primary-foreground relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 !rounded-md border-0 !bg-transparent leading-none font-normal transition-colors duration-150 group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:rounded-md group-data-[focused=true]/day:ring-[2px] hover:!bg-transparent data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md data-[selected-single=true]:rounded-md [&>span]:text-xs [&>span]:font-medium [&>span]:opacity-75",
4551
+ "group-data-[focused=true]/day:ring-primary/40 data-[preview-edge=true]:ring-primary/50 data-[preview-edge=true]:text-primary data-[preview-middle=true]:text-primary data-[range-end=true]:!bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:!bg-primary/8 data-[range-middle=true]:text-foreground data-[range-start=true]:!bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:!bg-primary data-[selected-single=true]:text-primary-foreground relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 !rounded-md border-0 !bg-transparent leading-none font-normal transition-colors duration-150 group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:rounded-md group-data-[focused=true]/day:ring-[2px] hover:!bg-transparent data-[preview-edge=true]:rounded-md data-[preview-edge=true]:font-medium data-[preview-edge=true]:ring-[2px] data-[preview-middle=true]:font-medium data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md data-[selected-single=true]:rounded-md [&>span]:text-xs [&>span]:font-medium [&>span]:opacity-75",
4530
4552
  defaultClassNames.day,
4531
4553
  className
4532
4554
  ),
@@ -4534,35 +4556,37 @@ function CalendarDayButton({
4534
4556
  }
4535
4557
  );
4536
4558
  }
4537
- function DatePicker({
4538
- mode = "single",
4539
- selected,
4540
- onSelect,
4541
- placeholder = "Pick a date",
4542
- disabled = false,
4543
- className,
4544
- fromDate,
4545
- toDate,
4546
- numberOfMonths = 1
4547
- }) {
4559
+ function DatePicker(props) {
4560
+ const {
4561
+ placeholder = "Pick a date",
4562
+ disabled = false,
4563
+ className,
4564
+ fromDate,
4565
+ toDate,
4566
+ numberOfMonths = 1
4567
+ } = props;
4548
4568
  const [open, setOpen] = useState(false);
4549
4569
  const [awaitingRangeEnd, setAwaitingRangeEnd] = useState(false);
4570
+ const [previewDate, setPreviewDate] = useState(void 0);
4550
4571
  const label = useMemo(() => {
4551
- if (mode === "range") {
4552
- const range = selected;
4572
+ if (props.mode === "range") {
4573
+ const range = props.selected;
4553
4574
  if (!range?.from) return placeholder;
4554
4575
  if (!range.to) return `${format(range.from, "MMM d, yyyy")} \u2013 \u2026`;
4555
4576
  return `${format(range.from, "MMM d, yyyy")} \u2013 ${format(range.to, "MMM d, yyyy")}`;
4556
4577
  }
4557
- const date = selected;
4558
- return date ? format(date, "MMM d, yyyy") : placeholder;
4559
- }, [mode, selected, placeholder]);
4578
+ return props.selected ? format(props.selected, "MMM d, yyyy") : placeholder;
4579
+ }, [props.mode, props.selected, placeholder]);
4560
4580
  const handleOpenChange = (nextOpen) => {
4561
4581
  setOpen(nextOpen);
4562
- if (!nextOpen) setAwaitingRangeEnd(false);
4582
+ if (!nextOpen) {
4583
+ setAwaitingRangeEnd(false);
4584
+ setPreviewDate(void 0);
4585
+ }
4563
4586
  };
4564
4587
  const handleRangeSelect = (range, triggerDate) => {
4565
- const emit = onSelect;
4588
+ if (props.mode !== "range") return;
4589
+ const emit = props.onSelect;
4566
4590
  if (!awaitingRangeEnd) {
4567
4591
  setAwaitingRangeEnd(true);
4568
4592
  emit?.({ from: triggerDate, to: void 0 });
@@ -4574,8 +4598,25 @@ function DatePicker({
4574
4598
  return;
4575
4599
  }
4576
4600
  setAwaitingRangeEnd(false);
4601
+ setPreviewDate(void 0);
4577
4602
  setOpen(false);
4578
4603
  };
4604
+ const rangeFrom = props.mode === "range" ? props.selected?.from : void 0;
4605
+ const previewModifiers = useMemo(() => {
4606
+ if (!awaitingRangeEnd || !rangeFrom || !previewDate) return void 0;
4607
+ if (isSameDay(rangeFrom, previewDate)) return void 0;
4608
+ const [start, end] = previewDate < rangeFrom ? [previewDate, rangeFrom] : [rangeFrom, previewDate];
4609
+ return {
4610
+ preview_start: start,
4611
+ preview_middle: { after: start, before: end },
4612
+ preview_end: end
4613
+ };
4614
+ }, [awaitingRangeEnd, rangeFrom, previewDate]);
4615
+ const handleDayPreview = (day, dayModifiers) => {
4616
+ if (!awaitingRangeEnd) return;
4617
+ if (dayModifiers.disabled || dayModifiers.hidden) return;
4618
+ setPreviewDate((current) => current && isSameDay(current, day) ? current : day);
4619
+ };
4579
4620
  const dateConstraints = useMemo(() => {
4580
4621
  const disabledMatchers = [];
4581
4622
  if (fromDate) disabledMatchers.push({ before: fromDate });
@@ -4586,7 +4627,7 @@ function DatePicker({
4586
4627
  ...toDate && { endMonth: toDate }
4587
4628
  };
4588
4629
  }, [fromDate, toDate]);
4589
- const hasValue = mode === "range" ? !!selected?.from : !!selected;
4630
+ const hasValue = props.mode === "range" ? !!props.selected?.from : !!props.selected;
4590
4631
  return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: handleOpenChange, children: [
4591
4632
  /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
4592
4633
  Button,
@@ -4605,32 +4646,36 @@ function DatePicker({
4605
4646
  ]
4606
4647
  }
4607
4648
  ) }),
4608
- /* @__PURE__ */ jsx(PopoverContent, { "data-slot": "date-picker-content", className: "w-auto p-0", align: "start", children: mode === "range" ? /* @__PURE__ */ jsx(
4609
- Calendar,
4610
- {
4611
- ...{
4649
+ /* @__PURE__ */ jsx(PopoverContent, { "data-slot": "date-picker-content", className: "w-auto p-0", align: "start", children: props.mode === "range" ? (
4650
+ // Clearing the preview on the wrapper instead of per day
4651
+ // avoids the blank frame `onDayMouseLeave` would cause when
4652
+ // the pointer travels from one day to the next.
4653
+ /* @__PURE__ */ jsx("div", { onMouseLeave: () => setPreviewDate(void 0), children: /* @__PURE__ */ jsx(
4654
+ Calendar,
4655
+ {
4612
4656
  mode: "range",
4613
- selected,
4657
+ selected: props.selected,
4614
4658
  onSelect: handleRangeSelect,
4615
- ...dateConstraints,
4659
+ modifiers: previewModifiers,
4660
+ onDayMouseEnter: handleDayPreview,
4661
+ onDayFocus: handleDayPreview,
4616
4662
  numberOfMonths,
4617
- autoFocus: true
4663
+ autoFocus: true,
4664
+ ...dateConstraints
4618
4665
  }
4619
- }
4666
+ ) })
4620
4667
  ) : /* @__PURE__ */ jsx(
4621
4668
  Calendar,
4622
4669
  {
4623
- ...{
4624
- mode: "single",
4625
- selected,
4626
- onSelect: (date) => {
4627
- onSelect?.(date);
4628
- setOpen(false);
4629
- },
4630
- ...dateConstraints,
4631
- numberOfMonths,
4632
- autoFocus: true
4633
- }
4670
+ mode: "single",
4671
+ selected: props.selected,
4672
+ onSelect: (date) => {
4673
+ props.onSelect?.(date);
4674
+ setOpen(false);
4675
+ },
4676
+ numberOfMonths,
4677
+ autoFocus: true,
4678
+ ...dateConstraints
4634
4679
  }
4635
4680
  ) })
4636
4681
  ] });
@@ -5093,6 +5138,8 @@ function AbilityProvider({ children, permissions }) {
5093
5138
  const [permissionSet, setPermissionSet] = useState(
5094
5139
  () => new Set(permissions ?? [])
5095
5140
  );
5141
+ const [imperativelyResolved, setImperativelyResolved] = useState(false);
5142
+ const status = permissions !== void 0 || imperativelyResolved ? "ready" : "loading";
5096
5143
  const can = useCallback(
5097
5144
  (perms, mode = "any") => {
5098
5145
  const list = Array.isArray(perms) ? perms : [perms];
@@ -5107,21 +5154,23 @@ function AbilityProvider({ children, permissions }) {
5107
5154
  );
5108
5155
  const setAbilities = useCallback((perms) => {
5109
5156
  setPermissionSet(new Set(perms));
5157
+ setImperativelyResolved(true);
5110
5158
  }, []);
5111
5159
  const clearAbilities = useCallback(() => {
5112
5160
  setPermissionSet(/* @__PURE__ */ new Set());
5161
+ setImperativelyResolved(true);
5113
5162
  }, []);
5114
- const syncedKey = useRef(permissions ? permissions.join("|") : null);
5163
+ const permissionKey = permissions === void 0 ? null : [...permissions].sort().join("|");
5164
+ const syncedKey = useRef(permissionKey);
5115
5165
  useEffect(() => {
5116
- if (permissions === void 0) return;
5117
- const key = permissions.join("|");
5118
- if (key === syncedKey.current) return;
5119
- syncedKey.current = key;
5166
+ if (permissionKey === null) return;
5167
+ if (permissionKey === syncedKey.current) return;
5168
+ syncedKey.current = permissionKey;
5120
5169
  setPermissionSet(new Set(permissions));
5121
- }, [permissions]);
5170
+ }, [permissionKey, permissions]);
5122
5171
  const value = useMemo(
5123
- () => ({ can, setAbilities, clearAbilities }),
5124
- [can, setAbilities, clearAbilities]
5172
+ () => ({ can, setAbilities, clearAbilities, status }),
5173
+ [can, setAbilities, clearAbilities, status]
5125
5174
  );
5126
5175
  return /* @__PURE__ */ jsx(AbilityContext.Provider, { value, children });
5127
5176
  }
@@ -5136,18 +5185,173 @@ function useCan(permissions, mode = "any") {
5136
5185
  const { can } = useAbility();
5137
5186
  return can(permissions, mode);
5138
5187
  }
5139
- function Can({ permission, mode = "any", negate = false, fallback = null, children }) {
5140
- const { can } = useAbility();
5141
- const hasPermission = can(permission, mode);
5188
+ function useAbilityStatus() {
5189
+ return useAbility().status;
5190
+ }
5191
+
5192
+ // src/components/authorization/permissions.generated.ts
5193
+ var KNOWN_PERMISSIONS = [];
5194
+
5195
+ // src/components/authorization/permission-catalog.ts
5196
+ var CATALOG = new Set(KNOWN_PERMISSIONS);
5197
+ var warned = /* @__PURE__ */ new Set();
5198
+ function warnUnknownPermission(permission) {
5199
+ if (process.env.NODE_ENV === "production") return;
5200
+ if (CATALOG.size === 0) return;
5201
+ const requested = Array.isArray(permission) ? permission : [permission];
5202
+ for (const entry of requested) {
5203
+ if (entry.includes("*")) continue;
5204
+ if (CATALOG.has(entry) || warned.has(entry)) continue;
5205
+ warned.add(entry);
5206
+ console.warn(
5207
+ `[Can] Unknown permission "${entry}". It is not in the generated permission catalog. Check for a typo, or regenerate the catalog with \`pnpm generate-permissions\`.`
5208
+ );
5209
+ }
5210
+ }
5211
+ var FOCUS_TRAVERSAL_KEYS = /* @__PURE__ */ new Set(["Tab", "Escape"]);
5212
+ function blockInteraction(event) {
5213
+ event.preventDefault();
5214
+ event.stopPropagation();
5215
+ }
5216
+ function blockNonTraversalKey(event) {
5217
+ if (!FOCUS_TRAVERSAL_KEYS.has(event.key)) blockInteraction(event);
5218
+ }
5219
+ var warnedRenderPropMisuse = /* @__PURE__ */ new Set();
5220
+ function warnRenderPropVoidsProps(voided) {
5221
+ if (process.env.NODE_ENV === "production") return;
5222
+ if (voided.length === 0) return;
5223
+ const key = voided.join(",");
5224
+ if (warnedRenderPropMisuse.has(key)) return;
5225
+ warnedRenderPropMisuse.add(key);
5226
+ console.warn(
5227
+ `[Can] \`children\` is a function, so ${voided.map((prop) => `\`${prop}\``).join(", ")} ${voided.length === 1 ? "is" : "are"} ignored. A render prop owns every state: read \`allowed\` and \`status\` and render the disabled, loading and denied cases yourself, or pass an element instead of a function.`
5228
+ );
5229
+ }
5230
+ function disableElement(child) {
5231
+ return cloneElement(child, {
5232
+ "aria-disabled": "true",
5233
+ className: cn(child.props.className, "cursor-not-allowed opacity-50"),
5234
+ onClickCapture: blockInteraction,
5235
+ onKeyDownCapture: blockNonTraversalKey,
5236
+ onKeyUpCapture: blockNonTraversalKey,
5237
+ onPointerDownCapture: blockInteraction,
5238
+ onMouseDownCapture: blockInteraction
5239
+ });
5240
+ }
5241
+ function InteractionFirewall({ children }) {
5242
+ return /* @__PURE__ */ jsx(
5243
+ "span",
5244
+ {
5245
+ "data-slot": "can-blocked",
5246
+ className: "contents",
5247
+ onClickCapture: blockInteraction,
5248
+ onPointerDownCapture: blockInteraction,
5249
+ onMouseDownCapture: blockInteraction,
5250
+ onKeyDownCapture: blockNonTraversalKey,
5251
+ onKeyUpCapture: blockNonTraversalKey,
5252
+ children
5253
+ }
5254
+ );
5255
+ }
5256
+ function DisabledSubtree({
5257
+ children,
5258
+ className,
5259
+ ...props
5260
+ }) {
5261
+ const { "data-slot": _incomingDataSlot, ...restProps } = props;
5262
+ return /* @__PURE__ */ jsx(
5263
+ "span",
5264
+ {
5265
+ "data-slot": "can-disabled",
5266
+ "aria-disabled": "true",
5267
+ className: cn(
5268
+ "inline-flex cursor-not-allowed opacity-50",
5269
+ "*:pointer-events-none",
5270
+ className
5271
+ ),
5272
+ onClickCapture: blockInteraction,
5273
+ onPointerDownCapture: blockInteraction,
5274
+ onMouseDownCapture: blockInteraction,
5275
+ onKeyDownCapture: blockNonTraversalKey,
5276
+ onKeyUpCapture: blockNonTraversalKey,
5277
+ ...restProps,
5278
+ children
5279
+ }
5280
+ );
5281
+ }
5282
+ function Can({
5283
+ permission,
5284
+ mode = "any",
5285
+ negate = false,
5286
+ behavior = "hide",
5287
+ reason = null,
5288
+ fallback = null,
5289
+ loading,
5290
+ children
5291
+ }) {
5292
+ warnUnknownPermission(permission);
5293
+ const { can, status } = useAbility();
5294
+ const hasPermission = status === "ready" && can(permission, mode);
5142
5295
  const show = negate ? !hasPermission : hasPermission;
5143
5296
  if (typeof children === "function") {
5144
- return /* @__PURE__ */ jsx(Fragment$1, { children: children(show) });
5297
+ warnRenderPropVoidsProps([
5298
+ ...behavior === "disable" ? ["behavior='disable'"] : [],
5299
+ ...reason !== null ? ["reason"] : [],
5300
+ ...fallback !== null ? ["fallback"] : [],
5301
+ ...loading !== void 0 ? ["loading"] : []
5302
+ ]);
5303
+ return /* @__PURE__ */ jsx(Fragment$1, { children: children({ allowed: show, status }) });
5304
+ }
5305
+ if (status === "loading" && loading !== void 0) {
5306
+ return /* @__PURE__ */ jsx(Fragment$1, { children: loading });
5145
5307
  }
5146
- return show ? /* @__PURE__ */ jsx(Fragment$1, { children }) : /* @__PURE__ */ jsx(Fragment$1, { children: fallback });
5308
+ if (show) {
5309
+ return /* @__PURE__ */ jsx(Fragment$1, { children });
5310
+ }
5311
+ if (behavior === "disable") {
5312
+ if (isValidElement(children) && children.type !== Fragment) {
5313
+ const disabledChild = disableElement(children);
5314
+ if (reason === null) {
5315
+ return /* @__PURE__ */ jsx(InteractionFirewall, { children: disabledChild });
5316
+ }
5317
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
5318
+ /* @__PURE__ */ jsx(InteractionFirewall, { children: /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: disabledChild }) }),
5319
+ /* @__PURE__ */ jsx(TooltipContent, { children: reason })
5320
+ ] });
5321
+ }
5322
+ if (reason === null) {
5323
+ return /* @__PURE__ */ jsx(DisabledSubtree, { children });
5324
+ }
5325
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
5326
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(DisabledSubtree, { children }) }),
5327
+ /* @__PURE__ */ jsx(TooltipContent, { children: reason })
5328
+ ] });
5329
+ }
5330
+ return /* @__PURE__ */ jsx(Fragment$1, { children: fallback });
5147
5331
  }
5148
5332
  Can.displayName = "Can";
5149
- function CanNot({ permission, mode = "any", fallback = null, children }) {
5150
- return /* @__PURE__ */ jsx(Can, { permission, mode, negate: true, fallback, children });
5333
+ function CanNot({
5334
+ permission,
5335
+ mode = "any",
5336
+ behavior = "hide",
5337
+ reason = null,
5338
+ fallback = null,
5339
+ loading,
5340
+ children
5341
+ }) {
5342
+ return /* @__PURE__ */ jsx(
5343
+ Can,
5344
+ {
5345
+ permission,
5346
+ mode,
5347
+ negate: true,
5348
+ behavior,
5349
+ reason,
5350
+ fallback,
5351
+ loading,
5352
+ children
5353
+ }
5354
+ );
5151
5355
  }
5152
5356
  CanNot.displayName = "CanNot";
5153
5357
  function useMediaQuery(query) {
@@ -6944,7 +7148,7 @@ function TableHead({ className, ...props }) {
6944
7148
  {
6945
7149
  "data-slot": "table-head",
6946
7150
  className: cn(
6947
- "text-foreground has([role=checkbox])]:pr-0 h-12 px-3 text-left align-middle font-medium whitespace-nowrap",
7151
+ "text-foreground has-[[role=checkbox]]:pr-0 h-12 px-3 text-left align-middle font-medium whitespace-nowrap",
6948
7152
  className
6949
7153
  ),
6950
7154
  ...props
@@ -6957,7 +7161,7 @@ function TableCell({ className, ...props }) {
6957
7161
  {
6958
7162
  "data-slot": "table-cell",
6959
7163
  className: cn(
6960
- "has([role=checkbox])]:pr-0 p-3 align-middle whitespace-nowrap",
7164
+ "has-[[role=checkbox]]:pr-0 p-3 align-middle whitespace-nowrap",
6961
7165
  className
6962
7166
  ),
6963
7167
  ...props
@@ -7218,6 +7422,13 @@ function useTableContext() {
7218
7422
  function useTableContextSafe() {
7219
7423
  return useContext(TableContext);
7220
7424
  }
7425
+
7426
+ // src/components/compounds/Table/cell-size-class.ts
7427
+ var cellSizeClass = {
7428
+ sm: "px-3 py-1.5 text-xs",
7429
+ md: "px-5 py-2.5 text-sm",
7430
+ lg: "px-6 py-3 text-sm"
7431
+ };
7221
7432
  var cardPadding = {
7222
7433
  sm: "p-3",
7223
7434
  md: "p-4",
@@ -7555,6 +7766,9 @@ function DataTableHeaderCell({ header }) {
7555
7766
  },
7556
7767
  className: cn(
7557
7768
  "bg-primary text-primary-foreground",
7769
+ // Same density padding as the body cells: without it the header
7770
+ // label and the cell value below it sit at different offsets.
7771
+ cellSizeClass[meta.size ?? tableSize],
7558
7772
  canResize && "relative",
7559
7773
  meta.align === "center" && "text-center",
7560
7774
  meta.align === "right" && "text-right",
@@ -7944,11 +8158,6 @@ function useTablePersistence({
7944
8158
  persistDensity
7945
8159
  };
7946
8160
  }
7947
- var cellSizeClass = {
7948
- sm: "px-1 py-0 text-xs",
7949
- md: "px-5 py-2.5 text-sm",
7950
- lg: "px-6 py-3 text-sm"
7951
- };
7952
8161
  function resolveClassName(value, row) {
7953
8162
  return typeof value === "function" ? value(row) : value;
7954
8163
  }
@@ -7989,6 +8198,13 @@ function DataTableCell({
7989
8198
  }
7990
8199
  );
7991
8200
  }
8201
+ var INTERACTIVE_CELL_CONTENT = 'button, a, input, select, textarea, [role="button"], [role="checkbox"], [role="menuitem"], [role="link"]';
8202
+ function isInteractiveCellEvent(event) {
8203
+ const target = event.target;
8204
+ if (!(target instanceof Element)) return false;
8205
+ const match = target.closest(INTERACTIVE_CELL_CONTENT);
8206
+ return match !== null && match !== event.currentTarget;
8207
+ }
7992
8208
  function DataTableRow({ row, classNames }) {
7993
8209
  const { onRowClick, variant } = useTableContext();
7994
8210
  const clickable = Boolean(onRowClick);
@@ -8001,12 +8217,15 @@ function DataTableRow({ row, classNames }) {
8001
8217
  "data-clickable": clickable || void 0,
8002
8218
  role: clickable ? "button" : void 0,
8003
8219
  tabIndex: clickable ? 0 : void 0,
8004
- onClick: clickable ? () => onRowClick?.(row.original) : void 0,
8220
+ onClick: clickable ? (e) => {
8221
+ if (isInteractiveCellEvent(e)) return;
8222
+ onRowClick?.(row.original);
8223
+ } : void 0,
8005
8224
  onKeyDown: clickable ? (e) => {
8006
- if (e.key === "Enter" || e.key === " ") {
8007
- e.preventDefault();
8008
- onRowClick?.(row.original);
8009
- }
8225
+ if (e.key !== "Enter" && e.key !== " ") return;
8226
+ if (isInteractiveCellEvent(e)) return;
8227
+ e.preventDefault();
8228
+ onRowClick?.(row.original);
8010
8229
  } : void 0,
8011
8230
  className: cn("hover:bg-muted", clickable && "cursor-pointer", rowClassName),
8012
8231
  children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx(DataTableCell, { cell, cellClassName }, cell.id))
@@ -8607,7 +8826,7 @@ function DataTableFooter({ pagination, selectedCount, className }) {
8607
8826
  className: cn("flex items-center justify-between border-t px-4 py-2", className),
8608
8827
  children: [
8609
8828
  selectedCount != null && selectedCount > 0 && /* @__PURE__ */ jsx("span", { "aria-live": "polite", className: "text-muted-foreground text-xs", children: `${selectedCount} row${selectedCount > 1 ? "s" : ""} selected` }),
8610
- /* @__PURE__ */ jsx(TablePagination, { ...pagination })
8829
+ /* @__PURE__ */ jsx("div", { className: "ml-auto", children: /* @__PURE__ */ jsx(TablePagination, { ...pagination }) })
8611
8830
  ]
8612
8831
  }
8613
8832
  );
@@ -8716,18 +8935,21 @@ function DataTableSearch({
8716
8935
  debounce = 300
8717
8936
  }) {
8718
8937
  const ctx = useTableContextSafe();
8719
- const [inputValue, setInputValue] = useState("");
8720
8938
  const globalFilter = ctx?.globalFilter;
8721
8939
  const setGlobalFilter = ctx?.setGlobalFilter;
8940
+ const committedValue = globalFilter ?? "";
8941
+ const [inputValue, setInputValue] = useState(committedValue);
8722
8942
  useEffect(() => {
8723
- if (globalFilter === "") setInputValue("");
8943
+ if (globalFilter === void 0) return;
8944
+ setInputValue(globalFilter);
8724
8945
  }, [globalFilter]);
8725
8946
  useEffect(() => {
8947
+ if (inputValue === committedValue) return;
8726
8948
  const timer = setTimeout(() => {
8727
8949
  setGlobalFilter?.(inputValue);
8728
8950
  }, debounce);
8729
8951
  return () => clearTimeout(timer);
8730
- }, [inputValue, debounce, setGlobalFilter]);
8952
+ }, [inputValue, committedValue, debounce, setGlobalFilter]);
8731
8953
  const handleClear = () => {
8732
8954
  setInputValue("");
8733
8955
  setGlobalFilter?.("");
@@ -8748,7 +8970,13 @@ function DataTableSearch({
8748
8970
  onChange: (e) => setInputValue(e.target.value),
8749
8971
  placeholder,
8750
8972
  "aria-label": placeholder,
8751
- className: "h-8 w-48 pr-8 pl-8 text-sm"
8973
+ className: cn(
8974
+ "h-8 w-48 pr-9 pl-9 text-sm",
8975
+ "[&::-webkit-search-cancel-button]:appearance-none",
8976
+ "[&::-webkit-search-decoration]:appearance-none",
8977
+ "[&::-webkit-search-results-button]:appearance-none",
8978
+ "[&::-webkit-search-results-decoration]:appearance-none"
8979
+ )
8752
8980
  }
8753
8981
  ),
8754
8982
  inputValue && /* @__PURE__ */ jsx(
@@ -8758,7 +8986,7 @@ function DataTableSearch({
8758
8986
  size: "icon-sm",
8759
8987
  onClick: handleClear,
8760
8988
  "aria-label": "Clear search",
8761
- className: "text-muted-foreground hover:text-foreground absolute right-0.5 size-6",
8989
+ className: "text-muted-foreground hover:text-foreground absolute top-1/2 right-1.5 size-6 -translate-y-1/2",
8762
8990
  children: /* @__PURE__ */ jsx(X, { className: "size-3.5", "aria-hidden": "true" })
8763
8991
  }
8764
8992
  )
@@ -9143,6 +9371,6 @@ function TCCEProvider({
9143
9371
  return /* @__PURE__ */ jsx(TooltipProvider, { delayDuration: tooltipDelayDuration, children: /* @__PURE__ */ jsx(AbilityProvider, { permissions, children: /* @__PURE__ */ jsx(Toaster, { position: toasterPosition, children }) }) });
9144
9372
  }
9145
9373
 
9146
- export { AbilityProvider, Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppShell, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge2 as Badge, BottomNav, BottomNavTabs, BottomNavTabsContent, BottomNavTabsList, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, Can, CanNot, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, Checkbox, ColorPicker, ColorPickerAlpha, ColorPickerEyeDropper, ColorPickerFormat, ColorPickerHue, ColorPickerOutput, ColorPickerPresets, ColorPickerSelection, Combobox, DataTable, DataTableCardView, DataTableColumnFilter, DataTableFooter, DataTableHeaderCell, DataTableRowActions, DataTableSearch, DataTableSkeleton, DataTableToolbar, DatePicker, Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Dropzone, DropzoneContent, DropzoneEmptyState, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, EventCalendar, Field, FieldDescription, FieldError, FieldGroup, FieldLabel, FilterOption, Input, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Label, Link, Logo, MiniCalendar, MiniCalendarDay, MiniCalendarDays, MiniCalendarNavigation, Navbar, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PhoneField, PinInput, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, SegmentedControl, SegmentedControlItem, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, SpinnerDots, SpinnerLoader, Status, StatusIndicator, StatusLabel, Switch, TCCEProvider, TEXT_SIZES, TEXT_WEIGHTS, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TablePagination, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Text, Textarea, Toaster, Toggle, ToggleGroup2 as ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, alertVariants, animation, avatarVariants, badgeVariants2 as badgeVariants, buttonVariants, columnFiltersToArrayQueryParams, columnFiltersToJsonString, columnFiltersToQueryParams, columnFiltersToRecord, createBackendParams, createBackendParamsWithFilters, duration, ease, fadeIn, getActiveFilterCount, getActiveFilterValues, getColumnValueCounts, getUniqueColumnValues, hasActiveFilters, linkVariants, logos, matchPermission, mergeFilters, multiSelectFilter, navigationMenuTriggerStyle, parseJsonToFilters, parseQueryParamsToFilters, progressIndicatorVariants, progressVariants, scaleIn, searchInArray, skeletonVariants, slideRight, slideUp, sortRecordToSortingState, sortingStateToJsonString, sortingStateToRecord, spinnerDotsVariants, spinnerLoaderVariants, spinnerVariants, spring, stagger, toggleVariants, tooltipContentVariants, transition, useAbility, useAppForm, useCan, useCarousel, useColorPicker, useColumnFilter, useSidebar, useTableContext, useTableData, useTableFiltering, useTableGlobalFilter, useTableSizing, useTableSorting, useTableVisibility, useToast };
9374
+ export { AbilityProvider, Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppShell, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge2 as Badge, BottomNav, BottomNavTabs, BottomNavTabsContent, BottomNavTabsList, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, Can, CanNot, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, Checkbox, ColorPicker, ColorPickerAlpha, ColorPickerEyeDropper, ColorPickerFormat, ColorPickerHue, ColorPickerOutput, ColorPickerPresets, ColorPickerSelection, Combobox, DataTable, DataTableCardView, DataTableColumnFilter, DataTableFooter, DataTableHeaderCell, DataTableRowActions, DataTableSearch, DataTableSkeleton, DataTableToolbar, DatePicker, Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Dropzone, DropzoneContent, DropzoneEmptyState, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, EventCalendar, Field, FieldDescription, FieldError, FieldGroup, FieldLabel, FilterOption, Input, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, KNOWN_PERMISSIONS, Label, Link, Logo, MiniCalendar, MiniCalendarDay, MiniCalendarDays, MiniCalendarNavigation, Navbar, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PhoneField, PinInput, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, SegmentedControl, SegmentedControlItem, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, SpinnerDots, SpinnerLoader, Status, StatusIndicator, StatusLabel, Switch, TCCEProvider, TEXT_SIZES, TEXT_WEIGHTS, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TablePagination, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Text, Textarea, Toaster, Toggle, ToggleGroup2 as ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, alertVariants, animation, avatarVariants, badgeVariants2 as badgeVariants, buttonVariants, columnFiltersToArrayQueryParams, columnFiltersToJsonString, columnFiltersToQueryParams, columnFiltersToRecord, createBackendParams, createBackendParamsWithFilters, duration, ease, fadeIn, getActiveFilterCount, getActiveFilterValues, getColumnValueCounts, getUniqueColumnValues, hasActiveFilters, linkVariants, logos, matchPermission, mergeFilters, multiSelectFilter, navigationMenuTriggerStyle, parseJsonToFilters, parseQueryParamsToFilters, progressIndicatorVariants, progressVariants, scaleIn, searchInArray, skeletonVariants, slideRight, slideUp, sortRecordToSortingState, sortingStateToJsonString, sortingStateToRecord, spinnerDotsVariants, spinnerLoaderVariants, spinnerVariants, spring, stagger, toggleVariants, tooltipContentVariants, transition, useAbility, useAbilityStatus, useAppForm, useCan, useCarousel, useColorPicker, useColumnFilter, useSidebar, useTableContext, useTableData, useTableFiltering, useTableGlobalFilter, useTableSizing, useTableSorting, useTableVisibility, useToast };
9147
9375
  //# sourceMappingURL=main.js.map
9148
9376
  //# sourceMappingURL=main.js.map