@ekkolyth/ui 0.1.19 → 0.2.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/index.js CHANGED
@@ -1,17 +1,20 @@
1
- import { A as FieldLegend, B as THEME_COLORS, C as Input, D as FieldError, E as FieldDescription, F as CalendarDayButton, H as colorPalette, I as Button, L as buttonVariants, M as FieldSet, N as FieldTitle, O as FieldGroup, P as Calendar, R as validate, S as Textarea, T as FieldContent, U as getContrastForeground, V as coerceThemeColor, W as resolveColorHex, _ as InputGroupAddon, a as Tabs, b as InputGroupText, c as TabsTrigger, d as Field, f as Popover, g as InputGroup, h as PopoverTrigger, i as getIconCategories, j as FieldSeparator, k as FieldLabel, l as Progress, m as PopoverContent, n as getStaticIcon, o as TabsContent, p as PopoverAnchor, r as PICKER_ICON_NAMES, s as TabsList, t as IconPicker, u as Label, v as InputGroupButton, w as BasicField, x as InputGroupTextarea, y as InputGroupInput, z as ColorPicker } from "./icon-picker-ByfHyJ7i.js";
1
+ import { $ as InputGroupText, A as FieldSet, B as ComboboxInput, C as FieldContent, D as FieldLabel, E as FieldGroup, F as ComboboxChipsInput, G as ComboboxTrigger, H as ComboboxLabel, I as ComboboxCollection, J as PortalContainerContext, K as ComboboxValue, L as ComboboxContent, M as Combobox, N as ComboboxChip, O as FieldLegend, P as ComboboxChips, Q as InputGroupInput, R as ComboboxEmpty, S as BasicField, T as FieldError, U as ComboboxList, V as ComboboxItem, W as ComboboxSeparator, X as InputGroupAddon, Y as InputGroup, Z as InputGroupButton, _ as validate, a as Tabs, at as ColorPicker, b as ComboboxField, c as TabsTrigger, ct as colorPalette, d as Popover, et as InputGroupTextarea, f as PopoverAnchor, g as CalendarDayButton, h as Calendar, i as getIconCategories, it as buttonVariants, j as FieldTitle, k as FieldSeparator, l as Label, lt as getContrastForeground, m as PopoverTrigger, n as getStaticIcon, nt as Input, o as TabsContent, ot as THEME_COLORS, p as PopoverContent, q as useComboboxAnchor, r as PICKER_ICON_NAMES, rt as Button, s as TabsList, st as coerceThemeColor, t as IconPicker, tt as Textarea, u as Field, ut as resolveColorHex, v as Dropzone, w as FieldDescription, x as Spinner, y as Progress, z as ComboboxGroup } from "./icon-picker-CwavOWKf.js";
2
2
  import { t as cn } from "./utils-C_uf36nf.js";
3
- import { t as LoadingScreen } from "./loading-screen-DB3youyT.js";
3
+ import { t as LoadingScreen } from "./loading-screen-DilmTJ3J.js";
4
4
  import { a as CardDescription, c as CardTitle, i as CardContent, n as Card, o as CardFooter, r as CardAction, s as CardHeader, t as Widget } from "./widget-C2vjxQms.js";
5
- import { t as useIsMobile } from "./use-mobile-CqHXB_Nc.js";
6
- import { t as Container } from "./container-BBg21poC.js";
7
- import { _ as SelectTrigger, d as SelectGroup, f as SelectItem, g as SelectSeparator, h as SelectScrollUpButton, l as Select, m as SelectScrollDownButton, n as toggleVariants, p as SelectLabel, r as Toaster, t as Toggle, u as SelectContent, v as SelectValue } from "./toggle-B2PFPImC.js";
5
+ import { t as useIsMobile } from "./use-mobile-C-Ak14Ip.js";
6
+ import { t as useWindowScrollMargin } from "./use-window-scroll-margin-BQMpLEeT.js";
7
+ import { n as Container, t as VirtualGrid } from "./virtual-grid-BNWXDxO1.js";
8
+ import { _ as SelectTrigger, d as SelectGroup, f as SelectItem, g as SelectSeparator, h as SelectScrollUpButton, l as Select, m as SelectScrollDownButton, n as toggleVariants, p as SelectLabel, r as Toaster, t as Toggle, u as SelectContent, v as SelectValue } from "./toggle-Bpm-ggNe.js";
8
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
10
  import { Slot } from "@radix-ui/react-slot";
10
11
  import { cva } from "class-variance-authority";
11
- import { ArrowDownIcon, ArrowLeft, ArrowRight, ArrowUpIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRight, ChevronRightIcon, ChevronsLeftIcon, ChevronsRightIcon, ChevronsUpDownIcon, CircleIcon, EyeOffIcon, FilterIcon, GripVerticalIcon, LayoutGrid, List, Loader2Icon, MinusIcon, MoreHorizontal, MoreHorizontalIcon, PanelLeftIcon, PlusCircleIcon, SearchIcon, Settings2Icon, StretchHorizontal, XIcon } from "lucide-react";
12
12
  import * as React from "react";
13
13
  import { createContext, useContext, useEffect, useState } from "react";
14
+ import { ArrowDownIcon, ArrowLeft, ArrowRight, ArrowUpIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRight, ChevronRightIcon, ChevronsLeftIcon, ChevronsRightIcon, ChevronsUpDownIcon, CircleIcon, EyeOffIcon, FilterIcon, GripVerticalIcon, LayoutGrid, List, MinusIcon, MoreHorizontal, MoreHorizontalIcon, PanelLeftIcon, PlusCircleIcon, SearchIcon, Settings2Icon, StretchHorizontal, XIcon } from "lucide-react";
15
+ import { useWindowVirtualizer } from "@tanstack/react-virtual";
14
16
  import * as AccordionPrimitive from "@radix-ui/react-accordion";
17
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
15
18
  import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
16
19
  import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
17
20
  import * as AvatarPrimitive from "@radix-ui/react-avatar";
@@ -20,12 +23,10 @@ import useEmblaCarousel from "embla-carousel-react";
20
23
  import * as RechartsPrimitive from "recharts";
21
24
  import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
22
25
  import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
23
- import { Combobox as Combobox$1 } from "@base-ui/react";
24
26
  import * as DialogPrimitive from "@radix-ui/react-dialog";
25
- import { Command as Command$1 } from "cmdk";
27
+ import { Command as Command$2 } from "cmdk";
26
28
  import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
27
29
  import { flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from "@tanstack/react-table";
28
- import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
29
30
  import { Drawer as Drawer$1 } from "vaul";
30
31
  import { Controller, FormProvider, useFormContext, useFormState } from "react-hook-form";
31
32
  import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
@@ -39,6 +40,7 @@ import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
39
40
  import * as TooltipPrimitive from "@radix-ui/react-tooltip";
40
41
  import * as SliderPrimitive from "@radix-ui/react-slider";
41
42
  import * as SwitchPrimitive from "@radix-ui/react-switch";
43
+ import { Chart as TanStackChart } from "@tanstack/charts/react";
42
44
  import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
43
45
  //#region src/components/ui/accordion/index.tsx
44
46
  function Accordion({ ...props }) {
@@ -61,7 +63,7 @@ function AccordionTrigger({ className, children, ...props }) {
61
63
  className: cn("focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 cursor-pointer items-center justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", className),
62
64
  "data-slot": "accordion-trigger",
63
65
  ...props,
64
- children: [children, /* @__PURE__ */ jsx(ChevronDownIcon, { className: "text-muted-foreground pointer-events-none size-8 shrink-0 transition-transform duration-200" })]
66
+ children: [children, /* @__PURE__ */ jsx(ChevronDownIcon, { className: "text-muted-foreground pointer-events-none size-4 shrink-0 transition-transform duration-200" })]
65
67
  })
66
68
  });
67
69
  }
@@ -77,6 +79,198 @@ function AccordionContent({ className, children, ...props }) {
77
79
  });
78
80
  }
79
81
  //#endregion
82
+ //#region src/components/ui/dropdown-menu/index.tsx
83
+ function DropdownMenu({ ...props }) {
84
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Root, {
85
+ "data-slot": "dropdown-menu",
86
+ ...props
87
+ });
88
+ }
89
+ function DropdownMenuPortal({ ...props }) {
90
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, {
91
+ "data-slot": "dropdown-menu-portal",
92
+ ...props
93
+ });
94
+ }
95
+ function DropdownMenuTrigger({ ...props }) {
96
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Trigger, {
97
+ "data-slot": "dropdown-menu-trigger",
98
+ ...props
99
+ });
100
+ }
101
+ function DropdownMenuContent({ className, sideOffset = 4, ...props }) {
102
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.Content, {
103
+ className: cn("bg-popover text-popover-foreground 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 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md", className),
104
+ "data-slot": "dropdown-menu-content",
105
+ sideOffset,
106
+ ...props
107
+ }) });
108
+ }
109
+ function DropdownMenuGroup({ ...props }) {
110
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Group, {
111
+ "data-slot": "dropdown-menu-group",
112
+ ...props
113
+ });
114
+ }
115
+ function DropdownMenuItem({ className, inset, variant = "default", ...props }) {
116
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Item, {
117
+ className: cn("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
118
+ "data-inset": inset,
119
+ "data-slot": "dropdown-menu-item",
120
+ "data-variant": variant,
121
+ ...props
122
+ });
123
+ }
124
+ function DropdownMenuCheckboxItem({ className, children, checked, ...props }) {
125
+ return /* @__PURE__ */ jsxs(DropdownMenuPrimitive.CheckboxItem, {
126
+ checked,
127
+ className: cn("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
128
+ "data-slot": "dropdown-menu-checkbox-item",
129
+ ...props,
130
+ children: [/* @__PURE__ */ jsx("span", {
131
+ className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center",
132
+ children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" }) })
133
+ }), children]
134
+ });
135
+ }
136
+ function DropdownMenuRadioGroup({ ...props }) {
137
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.RadioGroup, {
138
+ "data-slot": "dropdown-menu-radio-group",
139
+ ...props
140
+ });
141
+ }
142
+ function DropdownMenuRadioItem({ className, children, ...props }) {
143
+ return /* @__PURE__ */ jsxs(DropdownMenuPrimitive.RadioItem, {
144
+ className: cn("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
145
+ "data-slot": "dropdown-menu-radio-item",
146
+ ...props,
147
+ children: [/* @__PURE__ */ jsx("span", {
148
+ className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center",
149
+ children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CircleIcon, { className: "size-2 fill-current" }) })
150
+ }), children]
151
+ });
152
+ }
153
+ function DropdownMenuLabel({ className, inset, ...props }) {
154
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Label, {
155
+ className: cn("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8", className),
156
+ "data-inset": inset,
157
+ "data-slot": "dropdown-menu-label",
158
+ ...props
159
+ });
160
+ }
161
+ function DropdownMenuSeparator({ className, ...props }) {
162
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Separator, {
163
+ className: cn("bg-border -mx-1 my-1 h-px", className),
164
+ "data-slot": "dropdown-menu-separator",
165
+ ...props
166
+ });
167
+ }
168
+ function DropdownMenuShortcut({ className, ...props }) {
169
+ return /* @__PURE__ */ jsx("span", {
170
+ className: cn("text-muted-foreground ml-auto text-xs tracking-widest", className),
171
+ "data-slot": "dropdown-menu-shortcut",
172
+ ...props
173
+ });
174
+ }
175
+ function DropdownMenuSub({ ...props }) {
176
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Sub, {
177
+ "data-slot": "dropdown-menu-sub",
178
+ ...props
179
+ });
180
+ }
181
+ function DropdownMenuSubTrigger({ className, inset, children, ...props }) {
182
+ return /* @__PURE__ */ jsxs(DropdownMenuPrimitive.SubTrigger, {
183
+ className: cn("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8", className),
184
+ "data-inset": inset,
185
+ "data-slot": "dropdown-menu-sub-trigger",
186
+ ...props,
187
+ children: [children, /* @__PURE__ */ jsx(ChevronRightIcon, { className: "ml-auto size-4" })]
188
+ });
189
+ }
190
+ function DropdownMenuSubContent({ className, ...props }) {
191
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.SubContent, {
192
+ className: cn("bg-popover text-popover-foreground 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 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg", className),
193
+ "data-slot": "dropdown-menu-sub-content",
194
+ ...props
195
+ });
196
+ }
197
+ //#endregion
198
+ //#region src/components/ui/action-menu-button/index.tsx
199
+ function renderIcon(icon) {
200
+ if (!icon) return null;
201
+ if (React.isValidElement(icon)) return icon;
202
+ return /* @__PURE__ */ jsx(icon, {});
203
+ }
204
+ const triggerVariant = {
205
+ primary: "default",
206
+ outline: "outline",
207
+ ghost: "ghost"
208
+ };
209
+ function ActionMenuButton({ "aria-label": ariaLabel, align = "end", children, className, disabled, onOpenChange, open, size = "icon", variant = "ghost" }) {
210
+ return /* @__PURE__ */ jsxs(DropdownMenu, {
211
+ onOpenChange,
212
+ open,
213
+ children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
214
+ asChild: true,
215
+ disabled,
216
+ children: /* @__PURE__ */ jsx(Button, {
217
+ "aria-label": ariaLabel,
218
+ className,
219
+ onClick: (event) => {
220
+ event.stopPropagation();
221
+ event.preventDefault();
222
+ },
223
+ onPointerDown: (event) => event.stopPropagation(),
224
+ size,
225
+ type: "button",
226
+ variant: triggerVariant[variant],
227
+ children: /* @__PURE__ */ jsx(MoreHorizontal, {})
228
+ })
229
+ }), /* @__PURE__ */ jsx(DropdownMenuContent, {
230
+ align,
231
+ onClick: (event) => event.stopPropagation(),
232
+ children
233
+ })]
234
+ });
235
+ }
236
+ function ActionMenuItem({ description, destructive = false, disabled, icon, label, loading = false, onSelect, trailing }) {
237
+ return /* @__PURE__ */ jsxs(DropdownMenuItem, {
238
+ disabled,
239
+ onSelect,
240
+ variant: destructive ? "destructive" : "default",
241
+ children: [
242
+ loading ? /* @__PURE__ */ jsx(Spinner, {
243
+ "aria-hidden": true,
244
+ "aria-label": void 0,
245
+ role: void 0
246
+ }) : renderIcon(icon),
247
+ description ? /* @__PURE__ */ jsxs("span", {
248
+ className: "flex flex-col",
249
+ children: [label, /* @__PURE__ */ jsx("span", {
250
+ className: "text-muted-foreground",
251
+ children: description
252
+ })]
253
+ }) : label,
254
+ trailing ? /* @__PURE__ */ jsx("span", {
255
+ className: "ml-auto",
256
+ children: trailing
257
+ }) : null
258
+ ]
259
+ });
260
+ }
261
+ function ActionMenuSeparator() {
262
+ return /* @__PURE__ */ jsx(DropdownMenuSeparator, {});
263
+ }
264
+ function ActionMenuSub({ children }) {
265
+ return /* @__PURE__ */ jsx(DropdownMenuSub, { children });
266
+ }
267
+ function ActionMenuSubTrigger({ icon, label }) {
268
+ return /* @__PURE__ */ jsxs(DropdownMenuSubTrigger, { children: [renderIcon(icon), label] });
269
+ }
270
+ function ActionMenuSubContent({ children }) {
271
+ return /* @__PURE__ */ jsx(DropdownMenuSubContent, { children });
272
+ }
273
+ //#endregion
80
274
  //#region src/components/ui/alert/index.tsx
81
275
  const alertVariants = cva("relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", {
82
276
  variants: { variant: {
@@ -214,12 +408,14 @@ function AvatarFallback({ className, ...props }) {
214
408
  }
215
409
  //#endregion
216
410
  //#region src/components/ui/badge/index.tsx
217
- const badgeVariants = cva("inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", {
411
+ const badgeVariants = cva("inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", {
218
412
  variants: { variant: {
219
413
  default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
220
414
  secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
221
415
  destructive: "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
222
- outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
416
+ outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
417
+ quest: "uppercase tracking-wide",
418
+ recipe: "border-transparent bg-primary/10 text-primary underline decoration-dotted underline-offset-2"
223
419
  } },
224
420
  defaultVariants: { variant: "default" }
225
421
  });
@@ -631,164 +827,6 @@ function CollapsibleContent({ ...props }) {
631
827
  });
632
828
  }
633
829
  //#endregion
634
- //#region src/components/ui/combobox/index.tsx
635
- const Combobox = Combobox$1.Root;
636
- function ComboboxValue({ ...props }) {
637
- return /* @__PURE__ */ jsx(Combobox$1.Value, {
638
- "data-slot": "combobox-value",
639
- ...props
640
- });
641
- }
642
- function ComboboxTrigger({ className, children, ...props }) {
643
- return /* @__PURE__ */ jsxs(Combobox$1.Trigger, {
644
- className: cn("[&_svg:not([class*='size-'])]:size-4", className),
645
- "data-slot": "combobox-trigger",
646
- ...props,
647
- children: [children, /* @__PURE__ */ jsx(ChevronDownIcon, {
648
- className: "pointer-events-none size-4 text-muted-foreground",
649
- "data-slot": "combobox-trigger-icon"
650
- })]
651
- });
652
- }
653
- function ComboboxClear({ className, ...props }) {
654
- return /* @__PURE__ */ jsx(Combobox$1.Clear, {
655
- className: cn(className),
656
- "data-slot": "combobox-clear",
657
- render: /* @__PURE__ */ jsx(InputGroupButton, {
658
- size: "icon-xs",
659
- variant: "ghost"
660
- }),
661
- ...props,
662
- children: /* @__PURE__ */ jsx(XIcon, { className: "pointer-events-none" })
663
- });
664
- }
665
- function ComboboxInput({ className, children, disabled = false, showTrigger = true, showClear = false, ...props }) {
666
- return /* @__PURE__ */ jsxs(InputGroup, {
667
- className: cn("w-auto", className),
668
- children: [
669
- /* @__PURE__ */ jsx(Combobox$1.Input, {
670
- render: /* @__PURE__ */ jsx(InputGroupInput, { disabled }),
671
- ...props
672
- }),
673
- /* @__PURE__ */ jsxs(InputGroupAddon, {
674
- align: "inline-end",
675
- children: [showTrigger && /* @__PURE__ */ jsx(InputGroupButton, {
676
- asChild: true,
677
- className: "group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent",
678
- "data-slot": "input-group-button",
679
- disabled,
680
- size: "icon-xs",
681
- variant: "ghost",
682
- children: /* @__PURE__ */ jsx(ComboboxTrigger, {})
683
- }), showClear && /* @__PURE__ */ jsx(ComboboxClear, { disabled })]
684
- }),
685
- children
686
- ]
687
- });
688
- }
689
- function ComboboxContent({ className, side = "bottom", sideOffset = 6, align = "start", alignOffset = 0, anchor, ...props }) {
690
- return /* @__PURE__ */ jsx(Combobox$1.Portal, { children: /* @__PURE__ */ jsx(Combobox$1.Positioner, {
691
- align,
692
- alignOffset,
693
- anchor,
694
- className: "isolate z-50",
695
- side,
696
- sideOffset,
697
- children: /* @__PURE__ */ jsx(Combobox$1.Popup, {
698
- className: cn("group/combobox-content relative max-h-96 w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
699
- "data-chips": !!anchor,
700
- "data-slot": "combobox-content",
701
- ...props
702
- })
703
- }) });
704
- }
705
- function ComboboxList({ className, ...props }) {
706
- return /* @__PURE__ */ jsx(Combobox$1.List, {
707
- className: cn("max-h-[min(calc(--spacing(96)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto p-1 data-empty:p-0", className),
708
- "data-slot": "combobox-list",
709
- ...props
710
- });
711
- }
712
- function ComboboxItem({ className, children, ...props }) {
713
- return /* @__PURE__ */ jsxs(Combobox$1.Item, {
714
- className: cn("relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
715
- "data-slot": "combobox-item",
716
- ...props,
717
- children: [children, /* @__PURE__ */ jsx(Combobox$1.ItemIndicator, {
718
- "data-slot": "combobox-item-indicator",
719
- render: /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center" }),
720
- children: /* @__PURE__ */ jsx(CheckIcon, { className: "pointer-events-none size-4 pointer-coarse:size-5" })
721
- })]
722
- });
723
- }
724
- function ComboboxGroup({ className, ...props }) {
725
- return /* @__PURE__ */ jsx(Combobox$1.Group, {
726
- className: cn(className),
727
- "data-slot": "combobox-group",
728
- ...props
729
- });
730
- }
731
- function ComboboxLabel({ className, ...props }) {
732
- return /* @__PURE__ */ jsx(Combobox$1.GroupLabel, {
733
- className: cn("px-2 py-1.5 text-xs text-muted-foreground pointer-coarse:px-3 pointer-coarse:py-2 pointer-coarse:text-sm", className),
734
- "data-slot": "combobox-label",
735
- ...props
736
- });
737
- }
738
- function ComboboxCollection({ ...props }) {
739
- return /* @__PURE__ */ jsx(Combobox$1.Collection, {
740
- "data-slot": "combobox-collection",
741
- ...props
742
- });
743
- }
744
- function ComboboxEmpty({ className, ...props }) {
745
- return /* @__PURE__ */ jsx(Combobox$1.Empty, {
746
- className: cn("hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex", className),
747
- "data-slot": "combobox-empty",
748
- ...props
749
- });
750
- }
751
- function ComboboxSeparator({ className, ...props }) {
752
- return /* @__PURE__ */ jsx(Combobox$1.Separator, {
753
- className: cn("-mx-1 my-1 h-px bg-border", className),
754
- "data-slot": "combobox-separator",
755
- ...props
756
- });
757
- }
758
- function ComboboxChips({ className, ...props }) {
759
- return /* @__PURE__ */ jsx(Combobox$1.Chips, {
760
- className: cn("flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-transparent bg-input bg-clip-padding px-2.5 py-1.5 text-sm shadow-xs transition-[color,box-shadow] focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-[3px] has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1.5 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40", className),
761
- "data-slot": "combobox-chips",
762
- ...props
763
- });
764
- }
765
- function ComboboxChip({ className, children, showRemove = true, ...props }) {
766
- return /* @__PURE__ */ jsxs(Combobox$1.Chip, {
767
- className: cn("flex h-[calc(--spacing(5.5))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0", className),
768
- "data-slot": "combobox-chip",
769
- ...props,
770
- children: [children, showRemove && /* @__PURE__ */ jsx(Combobox$1.ChipRemove, {
771
- className: "-ml-1 opacity-50 hover:opacity-100",
772
- "data-slot": "combobox-chip-remove",
773
- render: /* @__PURE__ */ jsx(Button, {
774
- size: "icon-xs",
775
- variant: "ghost"
776
- }),
777
- children: /* @__PURE__ */ jsx(XIcon, { className: "pointer-events-none" })
778
- })]
779
- });
780
- }
781
- function ComboboxChipsInput({ className, children, ...props }) {
782
- return /* @__PURE__ */ jsx(Combobox$1.Input, {
783
- className: cn("min-w-16 flex-1 outline-none", className),
784
- "data-slot": "combobox-chip-input",
785
- ...props
786
- });
787
- }
788
- function useComboboxAnchor() {
789
- return React.useRef(null);
790
- }
791
- //#endregion
792
830
  //#region src/components/ui/dialog/index.tsx
793
831
  function Dialog({ ...props }) {
794
832
  return /* @__PURE__ */ jsx(DialogPrimitive.Root, {
@@ -821,14 +859,32 @@ function DialogOverlay({ className, ...props }) {
821
859
  ...props
822
860
  });
823
861
  }
824
- function DialogContent({ className, children, showCloseButton = true, ...props }) {
862
+ function DialogContent({ className, children, onInteractOutside, ref, showCloseButton = true, ...props }) {
863
+ const [content, setContent] = React.useState(null);
864
+ const attach = React.useCallback((node) => {
865
+ setContent(node);
866
+ if (typeof ref === "function") ref(node);
867
+ else if (ref) ref.current = node;
868
+ }, [ref]);
825
869
  return /* @__PURE__ */ jsxs(DialogPortal, {
826
870
  "data-slot": "dialog-portal",
827
871
  children: [/* @__PURE__ */ jsx(DialogOverlay, {}), /* @__PURE__ */ jsxs(DialogPrimitive.Content, {
828
872
  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),
829
873
  "data-slot": "dialog-content",
874
+ onInteractOutside: (event) => {
875
+ const target = event.target;
876
+ if (target instanceof Element && target.closest("[data-slot=\"combobox-content\"]")) {
877
+ event.preventDefault();
878
+ return;
879
+ }
880
+ onInteractOutside?.(event);
881
+ },
882
+ ref: attach,
830
883
  ...props,
831
- children: [children, showCloseButton && /* @__PURE__ */ jsxs(DialogPrimitive.Close, {
884
+ children: [/* @__PURE__ */ jsx(PortalContainerContext.Provider, {
885
+ value: content,
886
+ children
887
+ }), showCloseButton && /* @__PURE__ */ jsxs(DialogPrimitive.Close, {
832
888
  className: "ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
833
889
  "data-slot": "dialog-close",
834
890
  children: [/* @__PURE__ */ jsx(XIcon, {}), /* @__PURE__ */ jsx("span", {
@@ -870,7 +926,7 @@ function DialogDescription({ className, ...props }) {
870
926
  //#endregion
871
927
  //#region src/components/ui/command/index.tsx
872
928
  function Command({ className, ...props }) {
873
- return /* @__PURE__ */ jsx(Command$1, {
929
+ return /* @__PURE__ */ jsx(Command$2, {
874
930
  className: cn("bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md", className),
875
931
  "data-slot": "command",
876
932
  ...props
@@ -896,7 +952,7 @@ function CommandInput({ className, ...props }) {
896
952
  return /* @__PURE__ */ jsxs("div", {
897
953
  className: "flex h-9 items-center gap-2 border-b px-3",
898
954
  "data-slot": "command-input-wrapper",
899
- children: [/* @__PURE__ */ jsx(SearchIcon, { className: "size-4 shrink-0 opacity-50" }), /* @__PURE__ */ jsx(Command$1.Input, {
955
+ children: [/* @__PURE__ */ jsx(SearchIcon, { className: "size-4 shrink-0 opacity-50" }), /* @__PURE__ */ jsx(Command$2.Input, {
900
956
  className: cn("placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50", className),
901
957
  "data-slot": "command-input",
902
958
  ...props
@@ -904,35 +960,35 @@ function CommandInput({ className, ...props }) {
904
960
  });
905
961
  }
906
962
  function CommandList({ className, ...props }) {
907
- return /* @__PURE__ */ jsx(Command$1.List, {
963
+ return /* @__PURE__ */ jsx(Command$2.List, {
908
964
  className: cn("max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto", className),
909
965
  "data-slot": "command-list",
910
966
  ...props
911
967
  });
912
968
  }
913
969
  function CommandEmpty({ ...props }) {
914
- return /* @__PURE__ */ jsx(Command$1.Empty, {
970
+ return /* @__PURE__ */ jsx(Command$2.Empty, {
915
971
  className: "py-6 text-center text-sm",
916
972
  "data-slot": "command-empty",
917
973
  ...props
918
974
  });
919
975
  }
920
976
  function CommandGroup({ className, ...props }) {
921
- return /* @__PURE__ */ jsx(Command$1.Group, {
977
+ return /* @__PURE__ */ jsx(Command$2.Group, {
922
978
  className: cn("text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium", className),
923
979
  "data-slot": "command-group",
924
980
  ...props
925
981
  });
926
982
  }
927
983
  function CommandSeparator({ className, ...props }) {
928
- return /* @__PURE__ */ jsx(Command$1.Separator, {
984
+ return /* @__PURE__ */ jsx(Command$2.Separator, {
929
985
  className: cn("bg-border -mx-1 h-px", className),
930
986
  "data-slot": "command-separator",
931
987
  ...props
932
988
  });
933
989
  }
934
990
  function CommandItem({ className, ...props }) {
935
- return /* @__PURE__ */ jsx(Command$1.Item, {
991
+ return /* @__PURE__ */ jsx(Command$2.Item, {
936
992
  className: cn("data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
937
993
  "data-slot": "command-item",
938
994
  ...props
@@ -1114,6 +1170,96 @@ function DataTable({ data, columns, tableId, bulkActions, filters, initialPageSi
1114
1170
  });
1115
1171
  }
1116
1172
  //#endregion
1173
+ //#region src/components/ui/data-table/data-table-bulk-bar.tsx
1174
+ function DataTableBulkBar() {
1175
+ const { table, bulkActions } = useDataTable();
1176
+ const [confirming, setConfirming] = useState(null);
1177
+ const selectedRows = table.getFilteredSelectedRowModel().rows;
1178
+ const selectedCount = selectedRows.length;
1179
+ if (!bulkActions?.length) return null;
1180
+ if (selectedCount === 0) return null;
1181
+ const runAction = async (action) => {
1182
+ const rows = selectedRows.map((r) => r.original);
1183
+ if (action.confirm) {
1184
+ setConfirming(action);
1185
+ return;
1186
+ }
1187
+ if (await action.onRun(rows)) table.resetRowSelection();
1188
+ };
1189
+ const runConfirmed = async () => {
1190
+ if (!confirming) return;
1191
+ const action = confirming;
1192
+ const rows = selectedRows.map((r) => r.original);
1193
+ setConfirming(null);
1194
+ if (await action.onRun(rows)) table.resetRowSelection();
1195
+ };
1196
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
1197
+ className: "fixed inset-x-0 bottom-4 z-40 mx-auto flex w-fit max-w-[calc(100%-2rem)] items-center gap-2 rounded-xl border border-border bg-card px-3 py-2 shadow-lg",
1198
+ children: [
1199
+ /* @__PURE__ */ jsx(Button, {
1200
+ className: "size-7",
1201
+ onClick: () => table.resetRowSelection(),
1202
+ size: "icon",
1203
+ variant: "ghost",
1204
+ children: /* @__PURE__ */ jsx(XIcon, { className: "size-4" })
1205
+ }),
1206
+ /* @__PURE__ */ jsxs("span", {
1207
+ className: "text-sm font-medium",
1208
+ children: [selectedCount, " selected"]
1209
+ }),
1210
+ /* @__PURE__ */ jsx("div", {
1211
+ className: "ml-2 flex items-center gap-1",
1212
+ children: bulkActions.map((action) => /* @__PURE__ */ jsxs(Button, {
1213
+ onClick: () => runAction(action),
1214
+ size: "sm",
1215
+ variant: action.variant === "destructive" ? "destructive" : "outline",
1216
+ children: [action.icon && /* @__PURE__ */ jsx(action.icon, { className: "size-4" }), action.label]
1217
+ }, action.id))
1218
+ })
1219
+ ]
1220
+ }), /* @__PURE__ */ jsx(AlertDialog, {
1221
+ onOpenChange: (open) => !open && setConfirming(null),
1222
+ open: confirming !== null,
1223
+ children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [/* @__PURE__ */ jsxs(AlertDialogHeader, { children: [/* @__PURE__ */ jsx(AlertDialogTitle, { children: confirming?.confirm?.title }), /* @__PURE__ */ jsx(AlertDialogDescription, { children: confirming?.confirm?.description })] }), /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [/* @__PURE__ */ jsx(AlertDialogCancel, { children: "Cancel" }), /* @__PURE__ */ jsx(AlertDialogAction, {
1224
+ onClick: runConfirmed,
1225
+ children: "Continue"
1226
+ })] })] })
1227
+ })] });
1228
+ }
1229
+ //#endregion
1230
+ //#region src/components/ui/data-table/data-table-column-header.tsx
1231
+ function DataTableColumnHeader({ column, title, align = "left" }) {
1232
+ if (!column.getCanSort()) return /* @__PURE__ */ jsx("span", {
1233
+ className: align === "right" ? "block text-right text-sm font-medium" : "text-sm font-medium",
1234
+ children: title
1235
+ });
1236
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
1237
+ asChild: true,
1238
+ children: /* @__PURE__ */ jsxs(Button, {
1239
+ className: align === "right" ? "-mr-3 ml-auto flex h-8 data-[state=open]:bg-accent" : "-ml-3 h-8 data-[state=open]:bg-accent",
1240
+ size: "sm",
1241
+ variant: "ghost",
1242
+ children: [/* @__PURE__ */ jsx("span", { children: title }), column.getIsSorted() === "desc" ? /* @__PURE__ */ jsx(ArrowDownIcon, { className: "ml-2 size-4" }) : column.getIsSorted() === "asc" ? /* @__PURE__ */ jsx(ArrowUpIcon, { className: "ml-2 size-4" }) : /* @__PURE__ */ jsx(ChevronsUpDownIcon, { className: "ml-2 size-4" })]
1243
+ })
1244
+ }), /* @__PURE__ */ jsxs(DropdownMenuContent, {
1245
+ align: align === "right" ? "end" : "start",
1246
+ children: [
1247
+ /* @__PURE__ */ jsxs(DropdownMenuItem, {
1248
+ onClick: () => column.toggleSorting(false),
1249
+ children: [/* @__PURE__ */ jsx(ArrowUpIcon, { className: "size-4" }), " Asc"]
1250
+ }),
1251
+ /* @__PURE__ */ jsxs(DropdownMenuItem, {
1252
+ onClick: () => column.toggleSorting(true),
1253
+ children: [/* @__PURE__ */ jsx(ArrowDownIcon, { className: "size-4" }), " Desc"]
1254
+ }),
1255
+ column.getCanHide() && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DropdownMenuSeparator, {}), /* @__PURE__ */ jsxs(DropdownMenuItem, {
1256
+ onClick: () => column.toggleVisibility(false),
1257
+ children: [/* @__PURE__ */ jsx(EyeOffIcon, { className: "size-4" }), " Hide"]
1258
+ })] })
1259
+ ]
1260
+ })] });
1261
+ }
1262
+ //#endregion
1117
1263
  //#region src/components/ui/table/index.tsx
1118
1264
  function Table({ className, ...props }) {
1119
1265
  return /* @__PURE__ */ jsx("div", {
@@ -1177,10 +1323,62 @@ function TableCaption({ className, ...props }) {
1177
1323
  }
1178
1324
  //#endregion
1179
1325
  //#region src/components/ui/data-table/data-table-content.tsx
1180
- function DataTableContent({ onRowClick, emptyMessage = "No results.", isLoading, loadingRowCount = 10 }) {
1326
+ function VirtualTableBody({ rows, columns, estimateRowHeight, renderRow }) {
1327
+ const { ref, margin } = useWindowScrollMargin();
1328
+ const virtualizer = useWindowVirtualizer({
1329
+ count: rows.length,
1330
+ estimateSize: () => estimateRowHeight,
1331
+ overscan: 8,
1332
+ scrollMargin: margin
1333
+ });
1334
+ const items = virtualizer.getVirtualItems();
1335
+ const offset = virtualizer.options.scrollMargin;
1336
+ const before = items.length ? items[0].start - offset : 0;
1337
+ const after = items.length ? virtualizer.getTotalSize() - (items[items.length - 1].end - offset) : 0;
1338
+ return /* @__PURE__ */ jsxs(TableBody, {
1339
+ ref,
1340
+ children: [
1341
+ before > 0 && /* @__PURE__ */ jsx("tr", {
1342
+ "aria-hidden": "true",
1343
+ children: /* @__PURE__ */ jsx("td", {
1344
+ className: "p-0",
1345
+ colSpan: columns,
1346
+ style: { height: before }
1347
+ })
1348
+ }),
1349
+ items.map((item) => renderRow(rows[item.index], item.index, virtualizer.measureElement)),
1350
+ after > 0 && /* @__PURE__ */ jsx("tr", {
1351
+ "aria-hidden": "true",
1352
+ children: /* @__PURE__ */ jsx("td", {
1353
+ className: "p-0",
1354
+ colSpan: columns,
1355
+ style: { height: after }
1356
+ })
1357
+ })
1358
+ ]
1359
+ });
1360
+ }
1361
+ function DataTableContent({ onRowClick, emptyMessage = "No results.", isLoading, loadingRowCount = 10, virtualize = false, estimateRowHeight = 48 }) {
1181
1362
  const { table } = useDataTable();
1182
1363
  const visibleColumns = table.getVisibleLeafColumns().length;
1183
1364
  const selectMode = table.getIsSomeRowsSelected() || table.getIsAllRowsSelected();
1365
+ const rows = table.getRowModel().rows;
1366
+ function renderRow(row, index, measureRef) {
1367
+ return /* @__PURE__ */ jsx(TableRow, {
1368
+ className: cn("group/row", onRowClick && "cursor-pointer"),
1369
+ "data-index": index,
1370
+ "data-state": row.getIsSelected() ? "selected" : void 0,
1371
+ onClick: onRowClick ? () => onRowClick(row.original) : void 0,
1372
+ ref: measureRef,
1373
+ children: row.getVisibleCells().map((cell) => {
1374
+ const meta = cell.column.columnDef.meta;
1375
+ return /* @__PURE__ */ jsx(TableCell, {
1376
+ className: cn(meta?.cellClassName),
1377
+ children: flexRender(cell.column.columnDef.cell, cell.getContext())
1378
+ }, cell.id);
1379
+ })
1380
+ }, row.id);
1381
+ }
1184
1382
  return /* @__PURE__ */ jsx(Card, {
1185
1383
  className: "group/table gap-0 py-0 overflow-hidden",
1186
1384
  "data-select-mode": selectMode ? "" : void 0,
@@ -1193,44 +1391,16 @@ function DataTableContent({ onRowClick, emptyMessage = "No results.", isLoading,
1193
1391
  children: header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())
1194
1392
  }, header.id);
1195
1393
  }) }, headerGroup.id))
1196
- }), /* @__PURE__ */ jsx(TableBody, { children: isLoading ? Array.from({ length: loadingRowCount }, (_, n) => /* @__PURE__ */ jsx(TableRow, { children: Array.from({ length: visibleColumns }, (_, c) => /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx("div", { className: "h-4 w-24 rounded bg-muted" }) }, c)) }, `skel-${n}`)) : table.getRowModel().rows.length === 0 ? /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, {
1197
- colSpan: visibleColumns,
1394
+ }), virtualize && !isLoading && rows.length > 0 ? /* @__PURE__ */ jsx(VirtualTableBody, {
1395
+ columns: visibleColumns,
1396
+ estimateRowHeight,
1397
+ renderRow,
1398
+ rows
1399
+ }) : /* @__PURE__ */ jsx(TableBody, { children: isLoading ? Array.from({ length: loadingRowCount }, (_, n) => /* @__PURE__ */ jsx(TableRow, { children: Array.from({ length: visibleColumns }, (_, c) => /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx("div", { className: "h-4 w-24 rounded bg-muted" }) }, c)) }, `skel-${n}`)) : rows.length === 0 ? /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, {
1198
1400
  className: "h-24 text-center text-muted-foreground",
1401
+ colSpan: visibleColumns,
1199
1402
  children: emptyMessage
1200
- }) }) : table.getRowModel().rows.map((row) => /* @__PURE__ */ jsx(TableRow, {
1201
- "data-state": row.getIsSelected() ? "selected" : void 0,
1202
- className: cn("group/row", onRowClick && "cursor-pointer"),
1203
- onClick: onRowClick ? () => onRowClick(row.original) : void 0,
1204
- children: row.getVisibleCells().map((cell) => {
1205
- const meta = cell.column.columnDef.meta;
1206
- return /* @__PURE__ */ jsx(TableCell, {
1207
- className: cn(meta?.cellClassName),
1208
- children: flexRender(cell.column.columnDef.cell, cell.getContext())
1209
- }, cell.id);
1210
- })
1211
- }, row.id)) })] })
1212
- });
1213
- }
1214
- //#endregion
1215
- //#region src/components/ui/data-table/data-table-toolbar.tsx
1216
- function DataTableToolbar({ children }) {
1217
- return /* @__PURE__ */ jsx("div", {
1218
- className: "flex flex-wrap items-center gap-2 pb-2",
1219
- children
1220
- });
1221
- }
1222
- //#endregion
1223
- //#region src/components/ui/data-table/data-table-search.tsx
1224
- function DataTableSearch({ placeholder = "Search…" }) {
1225
- const { table } = useDataTable();
1226
- return /* @__PURE__ */ jsxs("div", {
1227
- className: "relative flex-1 min-w-[180px] max-w-sm",
1228
- children: [/* @__PURE__ */ jsx(SearchIcon, { className: "absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground" }), /* @__PURE__ */ jsx(Input, {
1229
- value: table.getState().globalFilter ?? "",
1230
- onChange: (e) => table.setGlobalFilter(e.target.value),
1231
- placeholder,
1232
- className: "pl-9"
1233
- })]
1403
+ }) }) : rows.map((row) => renderRow(row)) })] })
1234
1404
  });
1235
1405
  }
1236
1406
  //#endregion
@@ -1243,169 +1413,53 @@ function DataTableFilter({ column, title, options }) {
1243
1413
  return /* @__PURE__ */ jsxs(Popover, { children: [/* @__PURE__ */ jsx(PopoverTrigger, {
1244
1414
  asChild: true,
1245
1415
  children: /* @__PURE__ */ jsxs(Button, {
1246
- variant: "outline",
1247
- size: "sm",
1248
1416
  className: "h-8 border-dashed",
1417
+ size: "sm",
1418
+ variant: "outline",
1249
1419
  children: [
1250
1420
  /* @__PURE__ */ jsx(PlusCircleIcon, { className: "size-4" }),
1251
1421
  title,
1252
1422
  selected.size > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Separator, {
1253
- orientation: "vertical",
1254
- className: "mx-2 h-4"
1255
- }), /* @__PURE__ */ jsx(Badge, {
1256
- variant: "secondary",
1257
- className: "rounded-sm px-1 font-normal",
1258
- children: selected.size
1259
- })] })
1260
- ]
1261
- })
1262
- }), /* @__PURE__ */ jsx(PopoverContent, {
1263
- className: "w-[200px] p-0",
1264
- align: "start",
1265
- children: /* @__PURE__ */ jsxs(Command, { children: [/* @__PURE__ */ jsx(CommandInput, { placeholder: title }), /* @__PURE__ */ jsxs(CommandList, { children: [
1266
- /* @__PURE__ */ jsx(CommandEmpty, { children: "No results." }),
1267
- /* @__PURE__ */ jsx(CommandGroup, { children: options.map((opt) => {
1268
- const isSelected = selected.has(opt.value);
1269
- return /* @__PURE__ */ jsxs(CommandItem, {
1270
- onSelect: () => {
1271
- const next = new Set(selected);
1272
- if (isSelected) next.delete(opt.value);
1273
- else next.add(opt.value);
1274
- col.setFilterValue(next.size === 0 ? void 0 : Array.from(next));
1275
- },
1276
- children: [
1277
- /* @__PURE__ */ jsx("div", {
1278
- className: `mr-2 flex size-4 items-center justify-center rounded-sm border ${isSelected ? "border-primary bg-primary text-primary-foreground" : "border-muted-foreground/40"}`,
1279
- children: isSelected && /* @__PURE__ */ jsx(CheckIcon, { className: "size-3" })
1280
- }),
1281
- opt.icon && /* @__PURE__ */ jsx(opt.icon, { className: "mr-2 size-4 text-muted-foreground" }),
1282
- /* @__PURE__ */ jsx("span", { children: opt.label })
1283
- ]
1284
- }, opt.value);
1285
- }) }),
1286
- selected.size > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(CommandSeparator, {}), /* @__PURE__ */ jsx(CommandGroup, { children: /* @__PURE__ */ jsx(CommandItem, {
1287
- onSelect: () => col.setFilterValue(void 0),
1288
- className: "justify-center text-center",
1289
- children: "Clear filters"
1290
- }) })] })
1291
- ] })] })
1292
- })] });
1293
- }
1294
- //#endregion
1295
- //#region src/components/ui/dropdown-menu/index.tsx
1296
- function DropdownMenu({ ...props }) {
1297
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Root, {
1298
- "data-slot": "dropdown-menu",
1299
- ...props
1300
- });
1301
- }
1302
- function DropdownMenuPortal({ ...props }) {
1303
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, {
1304
- "data-slot": "dropdown-menu-portal",
1305
- ...props
1306
- });
1307
- }
1308
- function DropdownMenuTrigger({ ...props }) {
1309
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Trigger, {
1310
- "data-slot": "dropdown-menu-trigger",
1311
- ...props
1312
- });
1313
- }
1314
- function DropdownMenuContent({ className, sideOffset = 4, ...props }) {
1315
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.Content, {
1316
- className: cn("bg-popover text-popover-foreground 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 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md", className),
1317
- "data-slot": "dropdown-menu-content",
1318
- sideOffset,
1319
- ...props
1320
- }) });
1321
- }
1322
- function DropdownMenuGroup({ ...props }) {
1323
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Group, {
1324
- "data-slot": "dropdown-menu-group",
1325
- ...props
1326
- });
1327
- }
1328
- function DropdownMenuItem({ className, inset, variant = "default", ...props }) {
1329
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Item, {
1330
- className: cn("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
1331
- "data-inset": inset,
1332
- "data-slot": "dropdown-menu-item",
1333
- "data-variant": variant,
1334
- ...props
1335
- });
1336
- }
1337
- function DropdownMenuCheckboxItem({ className, children, checked, ...props }) {
1338
- return /* @__PURE__ */ jsxs(DropdownMenuPrimitive.CheckboxItem, {
1339
- checked,
1340
- className: cn("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
1341
- "data-slot": "dropdown-menu-checkbox-item",
1342
- ...props,
1343
- children: [/* @__PURE__ */ jsx("span", {
1344
- className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center",
1345
- children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" }) })
1346
- }), children]
1347
- });
1348
- }
1349
- function DropdownMenuRadioGroup({ ...props }) {
1350
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.RadioGroup, {
1351
- "data-slot": "dropdown-menu-radio-group",
1352
- ...props
1353
- });
1354
- }
1355
- function DropdownMenuRadioItem({ className, children, ...props }) {
1356
- return /* @__PURE__ */ jsxs(DropdownMenuPrimitive.RadioItem, {
1357
- className: cn("focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
1358
- "data-slot": "dropdown-menu-radio-item",
1359
- ...props,
1360
- children: [/* @__PURE__ */ jsx("span", {
1361
- className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center",
1362
- children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CircleIcon, { className: "size-2 fill-current" }) })
1363
- }), children]
1364
- });
1365
- }
1366
- function DropdownMenuLabel({ className, inset, ...props }) {
1367
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Label, {
1368
- className: cn("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8", className),
1369
- "data-inset": inset,
1370
- "data-slot": "dropdown-menu-label",
1371
- ...props
1372
- });
1373
- }
1374
- function DropdownMenuSeparator({ className, ...props }) {
1375
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Separator, {
1376
- className: cn("bg-border -mx-1 my-1 h-px", className),
1377
- "data-slot": "dropdown-menu-separator",
1378
- ...props
1379
- });
1380
- }
1381
- function DropdownMenuShortcut({ className, ...props }) {
1382
- return /* @__PURE__ */ jsx("span", {
1383
- className: cn("text-muted-foreground ml-auto text-xs tracking-widest", className),
1384
- "data-slot": "dropdown-menu-shortcut",
1385
- ...props
1386
- });
1387
- }
1388
- function DropdownMenuSub({ ...props }) {
1389
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Sub, {
1390
- "data-slot": "dropdown-menu-sub",
1391
- ...props
1392
- });
1393
- }
1394
- function DropdownMenuSubTrigger({ className, inset, children, ...props }) {
1395
- return /* @__PURE__ */ jsxs(DropdownMenuPrimitive.SubTrigger, {
1396
- className: cn("focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8", className),
1397
- "data-inset": inset,
1398
- "data-slot": "dropdown-menu-sub-trigger",
1399
- ...props,
1400
- children: [children, /* @__PURE__ */ jsx(ChevronRightIcon, { className: "ml-auto size-4" })]
1401
- });
1402
- }
1403
- function DropdownMenuSubContent({ className, ...props }) {
1404
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.SubContent, {
1405
- className: cn("bg-popover text-popover-foreground 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 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg", className),
1406
- "data-slot": "dropdown-menu-sub-content",
1407
- ...props
1408
- });
1423
+ className: "mx-2 h-4",
1424
+ orientation: "vertical"
1425
+ }), /* @__PURE__ */ jsx(Badge, {
1426
+ className: "rounded-sm px-1 font-normal",
1427
+ variant: "secondary",
1428
+ children: selected.size
1429
+ })] })
1430
+ ]
1431
+ })
1432
+ }), /* @__PURE__ */ jsx(PopoverContent, {
1433
+ align: "start",
1434
+ className: "w-[200px] p-0",
1435
+ children: /* @__PURE__ */ jsxs(Command, { children: [/* @__PURE__ */ jsx(CommandInput, { placeholder: title }), /* @__PURE__ */ jsxs(CommandList, { children: [
1436
+ /* @__PURE__ */ jsx(CommandEmpty, { children: "No results." }),
1437
+ /* @__PURE__ */ jsx(CommandGroup, { children: options.map((opt) => {
1438
+ const isSelected = selected.has(opt.value);
1439
+ return /* @__PURE__ */ jsxs(CommandItem, {
1440
+ onSelect: () => {
1441
+ const next = new Set(selected);
1442
+ if (isSelected) next.delete(opt.value);
1443
+ else next.add(opt.value);
1444
+ col.setFilterValue(next.size === 0 ? void 0 : Array.from(next));
1445
+ },
1446
+ children: [
1447
+ /* @__PURE__ */ jsx("div", {
1448
+ className: `mr-2 flex size-4 items-center justify-center rounded-sm border ${isSelected ? "border-primary bg-primary text-primary-foreground" : "border-muted-foreground/40"}`,
1449
+ children: isSelected && /* @__PURE__ */ jsx(CheckIcon, { className: "size-3" })
1450
+ }),
1451
+ opt.icon && /* @__PURE__ */ jsx(opt.icon, { className: "mr-2 size-4 text-muted-foreground" }),
1452
+ /* @__PURE__ */ jsx("span", { children: opt.label })
1453
+ ]
1454
+ }, opt.value);
1455
+ }) }),
1456
+ selected.size > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(CommandSeparator, {}), /* @__PURE__ */ jsx(CommandGroup, { children: /* @__PURE__ */ jsx(CommandItem, {
1457
+ className: "justify-center text-center",
1458
+ onSelect: () => col.setFilterValue(void 0),
1459
+ children: "Clear filters"
1460
+ }) })] })
1461
+ ] })] })
1462
+ })] });
1409
1463
  }
1410
1464
  //#endregion
1411
1465
  //#region src/components/ui/data-table/data-table-filter-menu.tsx
@@ -1416,14 +1470,14 @@ function DataTableFilterMenu() {
1416
1470
  return /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
1417
1471
  asChild: true,
1418
1472
  children: /* @__PURE__ */ jsxs(Button, {
1419
- type: "button",
1420
- variant: "ghost",
1421
- size: "icon",
1422
1473
  "aria-label": "Filter",
1423
1474
  className: "relative",
1475
+ size: "icon",
1476
+ type: "button",
1477
+ variant: "ghost",
1424
1478
  children: [/* @__PURE__ */ jsx(FilterIcon, { className: "size-4" }), activeCount > 0 ? /* @__PURE__ */ jsx("span", {
1425
- "data-testid": "filter-count",
1426
1479
  className: "absolute -top-1 -right-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-foreground px-1 text-[10px] font-semibold text-background",
1480
+ "data-testid": "filter-count",
1427
1481
  children: activeCount
1428
1482
  }) : null]
1429
1483
  })
@@ -1467,8 +1521,8 @@ function DataTableFilterMenu() {
1467
1521
  })] }, filter.column);
1468
1522
  }),
1469
1523
  activeCount > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DropdownMenuSeparator, {}), /* @__PURE__ */ jsx(DropdownMenuItem, {
1470
- onSelect: () => table.resetColumnFilters(),
1471
1524
  className: "text-muted-foreground",
1525
+ onSelect: () => table.resetColumnFilters(),
1472
1526
  children: "Clear filters"
1473
1527
  })] }) : null
1474
1528
  ]
@@ -1498,46 +1552,15 @@ function nextLayout(current) {
1498
1552
  function DataTableLayoutToggle({ value, onChange }) {
1499
1553
  const Icon = ICONS[value];
1500
1554
  return /* @__PURE__ */ jsx(Button, {
1555
+ "aria-label": `${LABELS[value]} — tap to switch`,
1556
+ onClick: () => onChange(nextLayout(value)),
1557
+ size: "icon",
1501
1558
  type: "button",
1502
1559
  variant: "ghost",
1503
- size: "icon",
1504
- onClick: () => onChange(nextLayout(value)),
1505
- "aria-label": `${LABELS[value]} — tap to switch`,
1506
1560
  children: /* @__PURE__ */ jsx(Icon, { className: "size-4" })
1507
1561
  });
1508
1562
  }
1509
1563
  //#endregion
1510
- //#region src/components/ui/data-table/data-table-view-options.tsx
1511
- function DataTableViewOptions() {
1512
- const { table } = useDataTable();
1513
- return /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
1514
- asChild: true,
1515
- children: /* @__PURE__ */ jsx(Button, {
1516
- type: "button",
1517
- variant: "ghost",
1518
- size: "icon",
1519
- "aria-label": "Column visibility",
1520
- children: /* @__PURE__ */ jsx(Settings2Icon, { className: "size-4" })
1521
- })
1522
- }), /* @__PURE__ */ jsxs(DropdownMenuContent, {
1523
- align: "end",
1524
- className: "w-[180px]",
1525
- children: [
1526
- /* @__PURE__ */ jsx(DropdownMenuLabel, {
1527
- className: "text-muted-foreground text-[11px] uppercase tracking-wide",
1528
- children: "Columns"
1529
- }),
1530
- /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
1531
- table.getAllColumns().filter((c) => c.getCanHide()).map((c) => /* @__PURE__ */ jsx(DropdownMenuCheckboxItem, {
1532
- className: "capitalize",
1533
- checked: c.getIsVisible(),
1534
- onCheckedChange: (v) => c.toggleVisibility(!!v),
1535
- children: c.id
1536
- }, c.id))
1537
- ]
1538
- })] });
1539
- }
1540
- //#endregion
1541
1564
  //#region src/components/ui/data-table/data-table-pagination.tsx
1542
1565
  function DataTablePagination({ pageSizes = [
1543
1566
  10,
@@ -1565,8 +1588,8 @@ function DataTablePagination({ pageSizes = [
1565
1588
  className: "text-sm font-medium",
1566
1589
  children: "Rows per page"
1567
1590
  }), /* @__PURE__ */ jsxs(Select, {
1568
- value: `${table.getState().pagination.pageSize}`,
1569
1591
  onValueChange: (value) => table.setPageSize(Number(value)),
1592
+ value: `${table.getState().pagination.pageSize}`,
1570
1593
  children: [/* @__PURE__ */ jsx(SelectTrigger, {
1571
1594
  className: "h-8 w-[70px]",
1572
1595
  children: /* @__PURE__ */ jsx(SelectValue, { placeholder: table.getState().pagination.pageSize })
@@ -1592,35 +1615,35 @@ function DataTablePagination({ pageSizes = [
1592
1615
  className: "flex items-center gap-1",
1593
1616
  children: [
1594
1617
  /* @__PURE__ */ jsx(Button, {
1595
- variant: "outline",
1596
- size: "icon",
1597
1618
  className: "size-8",
1598
- onClick: () => table.setPageIndex(0),
1599
1619
  disabled: !table.getCanPreviousPage(),
1620
+ onClick: () => table.setPageIndex(0),
1621
+ size: "icon",
1622
+ variant: "outline",
1600
1623
  children: /* @__PURE__ */ jsx(ChevronsLeftIcon, { className: "size-4" })
1601
1624
  }),
1602
1625
  /* @__PURE__ */ jsx(Button, {
1603
- variant: "outline",
1604
- size: "icon",
1605
1626
  className: "size-8",
1606
- onClick: () => table.previousPage(),
1607
1627
  disabled: !table.getCanPreviousPage(),
1628
+ onClick: () => table.previousPage(),
1629
+ size: "icon",
1630
+ variant: "outline",
1608
1631
  children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "size-4" })
1609
1632
  }),
1610
1633
  /* @__PURE__ */ jsx(Button, {
1611
- variant: "outline",
1612
- size: "icon",
1613
1634
  className: "size-8",
1614
- onClick: () => table.nextPage(),
1615
1635
  disabled: !table.getCanNextPage(),
1636
+ onClick: () => table.nextPage(),
1637
+ size: "icon",
1638
+ variant: "outline",
1616
1639
  children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4" })
1617
1640
  }),
1618
1641
  /* @__PURE__ */ jsx(Button, {
1619
- variant: "outline",
1620
- size: "icon",
1621
1642
  className: "size-8",
1622
- onClick: () => table.setPageIndex(pageCount - 1),
1623
1643
  disabled: !table.getCanNextPage(),
1644
+ onClick: () => table.setPageIndex(pageCount - 1),
1645
+ size: "icon",
1646
+ variant: "outline",
1624
1647
  children: /* @__PURE__ */ jsx(ChevronsRightIcon, { className: "size-4" })
1625
1648
  })
1626
1649
  ]
@@ -1630,94 +1653,18 @@ function DataTablePagination({ pageSizes = [
1630
1653
  });
1631
1654
  }
1632
1655
  //#endregion
1633
- //#region src/components/ui/data-table/data-table-bulk-bar.tsx
1634
- function DataTableBulkBar() {
1635
- const { table, bulkActions } = useDataTable();
1636
- const [confirming, setConfirming] = useState(null);
1637
- const selectedRows = table.getFilteredSelectedRowModel().rows;
1638
- const selectedCount = selectedRows.length;
1639
- if (!bulkActions?.length) return null;
1640
- if (selectedCount === 0) return null;
1641
- const runAction = async (action) => {
1642
- const rows = selectedRows.map((r) => r.original);
1643
- if (action.confirm) {
1644
- setConfirming(action);
1645
- return;
1646
- }
1647
- if (await action.onRun(rows)) table.resetRowSelection();
1648
- };
1649
- const runConfirmed = async () => {
1650
- if (!confirming) return;
1651
- const action = confirming;
1652
- const rows = selectedRows.map((r) => r.original);
1653
- setConfirming(null);
1654
- if (await action.onRun(rows)) table.resetRowSelection();
1655
- };
1656
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
1657
- className: "fixed inset-x-0 bottom-4 z-40 mx-auto flex w-fit max-w-[calc(100%-2rem)] items-center gap-2 rounded-xl border border-border bg-card px-3 py-2 shadow-lg",
1658
- children: [
1659
- /* @__PURE__ */ jsx(Button, {
1660
- variant: "ghost",
1661
- size: "icon",
1662
- className: "size-7",
1663
- onClick: () => table.resetRowSelection(),
1664
- children: /* @__PURE__ */ jsx(XIcon, { className: "size-4" })
1665
- }),
1666
- /* @__PURE__ */ jsxs("span", {
1667
- className: "text-sm font-medium",
1668
- children: [selectedCount, " selected"]
1669
- }),
1670
- /* @__PURE__ */ jsx("div", {
1671
- className: "ml-2 flex items-center gap-1",
1672
- children: bulkActions.map((action) => /* @__PURE__ */ jsxs(Button, {
1673
- variant: action.variant === "destructive" ? "destructive" : "outline",
1674
- size: "sm",
1675
- onClick: () => runAction(action),
1676
- children: [action.icon && /* @__PURE__ */ jsx(action.icon, { className: "size-4" }), action.label]
1677
- }, action.id))
1678
- })
1679
- ]
1680
- }), /* @__PURE__ */ jsx(AlertDialog, {
1681
- open: confirming !== null,
1682
- onOpenChange: (open) => !open && setConfirming(null),
1683
- children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [/* @__PURE__ */ jsxs(AlertDialogHeader, { children: [/* @__PURE__ */ jsx(AlertDialogTitle, { children: confirming?.confirm?.title }), /* @__PURE__ */ jsx(AlertDialogDescription, { children: confirming?.confirm?.description })] }), /* @__PURE__ */ jsxs(AlertDialogFooter, { children: [/* @__PURE__ */ jsx(AlertDialogCancel, { children: "Cancel" }), /* @__PURE__ */ jsx(AlertDialogAction, {
1684
- onClick: runConfirmed,
1685
- children: "Continue"
1686
- })] })] })
1687
- })] });
1688
- }
1689
- //#endregion
1690
- //#region src/components/ui/data-table/data-table-column-header.tsx
1691
- function DataTableColumnHeader({ column, title, align = "left" }) {
1692
- if (!column.getCanSort()) return /* @__PURE__ */ jsx("span", {
1693
- className: align === "right" ? "block text-right text-sm font-medium" : "text-sm font-medium",
1694
- children: title
1656
+ //#region src/components/ui/data-table/data-table-search.tsx
1657
+ function DataTableSearch({ placeholder = "Search…" }) {
1658
+ const { table } = useDataTable();
1659
+ return /* @__PURE__ */ jsxs("div", {
1660
+ className: "relative flex-1 min-w-[180px] max-w-sm",
1661
+ children: [/* @__PURE__ */ jsx(SearchIcon, { className: "absolute left-3 top-1/2 -translate-y-1/2 size-4 text-muted-foreground" }), /* @__PURE__ */ jsx(Input, {
1662
+ className: "pl-9",
1663
+ onChange: (e) => table.setGlobalFilter(e.target.value),
1664
+ placeholder,
1665
+ value: table.getState().globalFilter ?? ""
1666
+ })]
1695
1667
  });
1696
- return /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
1697
- asChild: true,
1698
- children: /* @__PURE__ */ jsxs(Button, {
1699
- variant: "ghost",
1700
- size: "sm",
1701
- className: align === "right" ? "-mr-3 ml-auto flex h-8 data-[state=open]:bg-accent" : "-ml-3 h-8 data-[state=open]:bg-accent",
1702
- children: [/* @__PURE__ */ jsx("span", { children: title }), column.getIsSorted() === "desc" ? /* @__PURE__ */ jsx(ArrowDownIcon, { className: "ml-2 size-4" }) : column.getIsSorted() === "asc" ? /* @__PURE__ */ jsx(ArrowUpIcon, { className: "ml-2 size-4" }) : /* @__PURE__ */ jsx(ChevronsUpDownIcon, { className: "ml-2 size-4" })]
1703
- })
1704
- }), /* @__PURE__ */ jsxs(DropdownMenuContent, {
1705
- align: align === "right" ? "end" : "start",
1706
- children: [
1707
- /* @__PURE__ */ jsxs(DropdownMenuItem, {
1708
- onClick: () => column.toggleSorting(false),
1709
- children: [/* @__PURE__ */ jsx(ArrowUpIcon, { className: "size-4" }), " Asc"]
1710
- }),
1711
- /* @__PURE__ */ jsxs(DropdownMenuItem, {
1712
- onClick: () => column.toggleSorting(true),
1713
- children: [/* @__PURE__ */ jsx(ArrowDownIcon, { className: "size-4" }), " Desc"]
1714
- }),
1715
- column.getCanHide() && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DropdownMenuSeparator, {}), /* @__PURE__ */ jsxs(DropdownMenuItem, {
1716
- onClick: () => column.toggleVisibility(false),
1717
- children: [/* @__PURE__ */ jsx(EyeOffIcon, { className: "size-4" }), " Hide"]
1718
- })] })
1719
- ]
1720
- })] });
1721
1668
  }
1722
1669
  //#endregion
1723
1670
  //#region src/components/ui/data-table/data-table-select-column.tsx
@@ -1731,23 +1678,62 @@ function createSelectColumn() {
1731
1678
  cellClassName: "pl-3 !pr-3 w-px"
1732
1679
  },
1733
1680
  header: ({ table }) => /* @__PURE__ */ jsx(Checkbox, {
1734
- className: HEADER_CHECKBOX_CLASS,
1681
+ "aria-label": "Select all",
1735
1682
  checked: table.getIsAllPageRowsSelected() || table.getIsSomePageRowsSelected() && "indeterminate",
1736
- onCheckedChange: (v) => table.toggleAllPageRowsSelected(!!v),
1737
- "aria-label": "Select all"
1683
+ className: HEADER_CHECKBOX_CLASS,
1684
+ onCheckedChange: (v) => table.toggleAllPageRowsSelected(!!v)
1738
1685
  }),
1739
1686
  cell: ({ row }) => /* @__PURE__ */ jsx(Checkbox, {
1740
- className: ROW_CHECKBOX_CLASS,
1687
+ "aria-label": "Select row",
1741
1688
  checked: row.getIsSelected(),
1689
+ className: ROW_CHECKBOX_CLASS,
1742
1690
  onCheckedChange: (v) => row.toggleSelected(!!v),
1743
- onClick: (e) => e.stopPropagation(),
1744
- "aria-label": "Select row"
1691
+ onClick: (e) => e.stopPropagation()
1745
1692
  }),
1746
1693
  enableSorting: false,
1747
1694
  enableHiding: false
1748
1695
  };
1749
1696
  }
1750
1697
  //#endregion
1698
+ //#region src/components/ui/data-table/data-table-toolbar.tsx
1699
+ function DataTableToolbar({ children }) {
1700
+ return /* @__PURE__ */ jsx("div", {
1701
+ className: "flex flex-wrap items-center gap-2 pb-2",
1702
+ children
1703
+ });
1704
+ }
1705
+ //#endregion
1706
+ //#region src/components/ui/data-table/data-table-view-options.tsx
1707
+ function DataTableViewOptions() {
1708
+ const { table } = useDataTable();
1709
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
1710
+ asChild: true,
1711
+ children: /* @__PURE__ */ jsx(Button, {
1712
+ "aria-label": "Column visibility",
1713
+ size: "icon",
1714
+ type: "button",
1715
+ variant: "ghost",
1716
+ children: /* @__PURE__ */ jsx(Settings2Icon, { className: "size-4" })
1717
+ })
1718
+ }), /* @__PURE__ */ jsxs(DropdownMenuContent, {
1719
+ align: "end",
1720
+ className: "w-[180px]",
1721
+ children: [
1722
+ /* @__PURE__ */ jsx(DropdownMenuLabel, {
1723
+ className: "text-muted-foreground text-[11px] uppercase tracking-wide",
1724
+ children: "Columns"
1725
+ }),
1726
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
1727
+ table.getAllColumns().filter((c) => c.getCanHide()).map((c) => /* @__PURE__ */ jsx(DropdownMenuCheckboxItem, {
1728
+ checked: c.getIsVisible(),
1729
+ className: "capitalize",
1730
+ onCheckedChange: (v) => c.toggleVisibility(!!v),
1731
+ children: c.id
1732
+ }, c.id))
1733
+ ]
1734
+ })] });
1735
+ }
1736
+ //#endregion
1751
1737
  //#region src/components/ui/data-table/use-data-table-url-state.ts
1752
1738
  function readUrlState(prefix) {
1753
1739
  if (typeof window === "undefined") return {};
@@ -2704,8 +2690,8 @@ function useSidebar() {
2704
2690
  if (!context) throw new Error("useSidebar must be used within a SidebarProvider.");
2705
2691
  return context;
2706
2692
  }
2707
- function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }) {
2708
- const isMobile = useIsMobile();
2693
+ function SidebarProvider({ defaultOpen = true, mobileBreakpoint = 768, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }) {
2694
+ const isMobile = useIsMobile(mobileBreakpoint);
2709
2695
  const [openMobile, setOpenMobile] = React.useState(false);
2710
2696
  const [_open, _setOpen] = React.useState(defaultOpen);
2711
2697
  const open = openProp ?? _open;
@@ -2763,7 +2749,7 @@ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: set
2763
2749
  })
2764
2750
  });
2765
2751
  }
2766
- function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props }) {
2752
+ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas", mobileWidth = SIDEBAR_WIDTH_MOBILE, className, children, ...props }) {
2767
2753
  const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
2768
2754
  if (collapsible === "none") return /* @__PURE__ */ jsx("div", {
2769
2755
  className: cn("bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col", className),
@@ -2776,12 +2762,12 @@ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas"
2776
2762
  open: openMobile,
2777
2763
  ...props,
2778
2764
  children: /* @__PURE__ */ jsxs(SheetContent, {
2779
- className: "bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden",
2765
+ className: cn("bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden", mobileWidth !== SIDEBAR_WIDTH_MOBILE && "sm:max-w-none"),
2780
2766
  "data-mobile": "true",
2781
2767
  "data-sidebar": "sidebar",
2782
2768
  "data-slot": "sidebar",
2783
2769
  side,
2784
- style: { "--sidebar-width": SIDEBAR_WIDTH_MOBILE },
2770
+ style: { "--sidebar-width": mobileWidth },
2785
2771
  children: [/* @__PURE__ */ jsxs(SheetHeader, {
2786
2772
  className: "sr-only",
2787
2773
  children: [/* @__PURE__ */ jsx(SheetTitle, { children: "Sidebar" }), /* @__PURE__ */ jsx(SheetDescription, { children: "Displays the mobile sidebar." })]
@@ -2799,10 +2785,10 @@ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas"
2799
2785
  "data-state": state,
2800
2786
  "data-variant": variant,
2801
2787
  children: [/* @__PURE__ */ jsx("div", {
2802
- className: cn("relative w-(--sidebar-width) bg-sidebar transition-[width] duration-200 ease-in-out", "group-data-[collapsible=offcanvas]:w-0", "group-data-[side=right]:rotate-180", variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"),
2788
+ className: cn("relative w-(--sidebar-width) transition-[width] duration-200 ease-in-out", "group-data-[collapsible=offcanvas]:w-0", "group-data-[side=right]:rotate-180", variant === "floating" ? "bg-transparent" : "bg-sidebar", variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"),
2803
2789
  "data-slot": "sidebar-gap"
2804
2790
  }), /* @__PURE__ */ jsx("div", {
2805
- className: cn("fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-in-out md:flex bg-sidebar", side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]", variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l", className),
2791
+ className: cn("fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-in-out md:flex", variant === "floating" ? "bg-transparent" : "bg-sidebar", side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]", variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l", className),
2806
2792
  "data-slot": "sidebar-container",
2807
2793
  ...props,
2808
2794
  children: /* @__PURE__ */ jsx("div", {
@@ -3083,16 +3069,6 @@ function Slider({ className, defaultValue, value, min = 0, max = 100, ...props }
3083
3069
  });
3084
3070
  }
3085
3071
  //#endregion
3086
- //#region src/components/ui/spinner/index.tsx
3087
- function Spinner({ className, ...props }) {
3088
- return /* @__PURE__ */ jsx(Loader2Icon, {
3089
- "aria-label": "Loading",
3090
- className: cn("size-4 animate-spin", className),
3091
- role: "status",
3092
- ...props
3093
- });
3094
- }
3095
- //#endregion
3096
3072
  //#region src/components/ui/switch/index.tsx
3097
3073
  function Switch({ className, ...props }) {
3098
3074
  return /* @__PURE__ */ jsx(SwitchPrimitive.Root, {
@@ -3106,6 +3082,18 @@ function Switch({ className, ...props }) {
3106
3082
  });
3107
3083
  }
3108
3084
  //#endregion
3085
+ //#region src/components/ui/tanstack-chart/index.tsx
3086
+ function chartColor(index) {
3087
+ return `var(--chart-${index % 5 + 1})`;
3088
+ }
3089
+ const tanstackChartTheme = {
3090
+ foreground: "var(--foreground)",
3091
+ muted: "var(--muted-foreground)",
3092
+ grid: "var(--border)",
3093
+ background: "var(--card)",
3094
+ palette: Array.from({ length: 5 }, (_, index) => chartColor(index))
3095
+ };
3096
+ //#endregion
3109
3097
  //#region src/components/ui/toggle-group/index.tsx
3110
3098
  const ToggleGroupContext = React.createContext({
3111
3099
  size: "default",
@@ -3246,4 +3234,4 @@ function UserLevel({ value, variant = "inline", className }) {
3246
3234
  });
3247
3235
  }
3248
3236
  //#endregion
3249
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, BasicField, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, ColorPicker, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxTrigger, ComboboxValue, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, Container, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DataTable, DataTableBulkBar, DataTableColumnHeader, DataTableContent, DataTableContext, DataTableFilter, DataTableFilterMenu, DataTableLayoutToggle, DataTablePagination, DataTableSearch, DataTableToolbar, DataTableViewOptions, 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, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, IconPicker, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, Label, LoadingScreen, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, PICKER_ICON_NAMES, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PhoneInput, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, 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, Switch, THEME_COLORS, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, User, UserAvatar, UserAvatarFallback, UserAvatarImage, UserInfo, UserLevel, UserMeta, UserName, Widget, badgeVariants, buttonGroupVariants, buttonVariants, cn, coerceThemeColor, colorPalette, createSelectColumn, formatPhoneInput, getContrastForeground, getIconCategories, getStaticIcon, navigationMenuTriggerStyle, normalizePhoneInput, phoneSchema, resolveColorHex, toggleVariants, useComboboxAnchor, useDataTable, useDataTableUrlState, useFormField, useIsMobile, useSidebar, validate };
3237
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActionMenuButton, ActionMenuItem, ActionMenuSeparator, ActionMenuSub, ActionMenuSubContent, ActionMenuSubTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, BasicField, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, ColorPicker, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxField, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxTrigger, ComboboxValue, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, Container, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DataTable, DataTableBulkBar, DataTableColumnHeader, DataTableContent, DataTableContext, DataTableFilter, DataTableFilterMenu, DataTableLayoutToggle, DataTablePagination, DataTableSearch, DataTableToolbar, DataTableViewOptions, 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, Dropzone, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, IconPicker, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, Label, LoadingScreen, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, PICKER_ICON_NAMES, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PhoneInput, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, 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, Switch, THEME_COLORS, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TanStackChart, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, User, UserAvatar, UserAvatarFallback, UserAvatarImage, UserInfo, UserLevel, UserMeta, UserName, VirtualGrid, Widget, badgeVariants, buttonGroupVariants, buttonVariants, chartColor, cn, coerceThemeColor, colorPalette, createSelectColumn, formatPhoneInput, getContrastForeground, getIconCategories, getStaticIcon, navigationMenuTriggerStyle, normalizePhoneInput, phoneSchema, resolveColorHex, tanstackChartTheme, toggleVariants, useComboboxAnchor, useDataTable, useDataTableUrlState, useFormField, useIsMobile, useSidebar, useWindowScrollMargin, validate };