@aircall/ds 0.2.7 → 0.9.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,57 +1,297 @@
1
- import { cva } from "class-variance-authority";
1
+ import { Accordion as Accordion$1 } from "@base-ui/react/accordion";
2
2
  import { clsx } from "clsx";
3
3
  import { extendTailwindMerge } from "tailwind-merge";
4
+ import { ArrowDownToLine, ArrowLeft, ArrowRight, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CircleAlert, CircleAlertIcon, CircleCheck, FLAGS, FlagUs, Info, Loader2Icon, MinusIcon, MoreHorizontalIcon, PanelLeftIcon, Search, Smile, TriangleAlertIcon, XIcon } from "@aircall/react-icons";
4
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
6
  import * as React$1 from "react";
6
- import React, { useMemo } from "react";
7
- import * as AvatarPrimitive from "@radix-ui/react-avatar";
8
- import { Slot, Slot as Slot$1 } from "@radix-ui/react-slot";
9
- import * as SeparatorPrimitive from "@radix-ui/react-separator";
7
+ import React, { createContext, useContext, useMemo } from "react";
8
+ import { AlertDialog as AlertDialog$1 } from "@base-ui/react/alert-dialog";
9
+ import { Button as Button$1 } from "@base-ui/react/button";
10
+ import { cva } from "class-variance-authority";
11
+ import { Avatar as Avatar$1 } from "@base-ui/react/avatar";
12
+ import { mergeProps } from "@base-ui/react/merge-props";
13
+ import { useRender } from "@base-ui/react/use-render";
14
+ import { Separator as Separator$1 } from "@base-ui/react/separator";
15
+ import { DayPicker, getDefaultClassNames } from "react-day-picker";
10
16
  import useEmblaCarousel from "embla-carousel-react";
11
- import * as Icons from "@aircall/react-icons";
12
- import { ArrowLeftOutline, ArrowRightOutline, CheckCircleOutline, CheckOutline, ChevronDownOutline, ChevronRightOutline, ChevronUpOutline, CloseOutline, Emoji, Info, Search } from "@aircall/react-icons";
13
- import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
14
- import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
17
+ import { Checkbox as Checkbox$1 } from "@base-ui/react/checkbox";
18
+ import { Collapsible as Collapsible$1 } from "@base-ui/react/collapsible";
15
19
  import { Combobox as Combobox$1 } from "@base-ui/react";
16
- import { CheckIcon, ChevronDownIcon, CircleIcon, Loader2Icon, MinusIcon, OctagonXIcon, PanelLeftIcon, TriangleAlertIcon, XIcon } from "lucide-react";
17
20
  import { Command as Command$1 } from "cmdk";
18
- import * as DialogPrimitive from "@radix-ui/react-dialog";
19
- import { getCountryISO3 } from "@aircall/numbers";
20
- import { Drawer as Drawer$1 } from "vaul";
21
- import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
21
+ import { Dialog as Dialog$1 } from "@base-ui/react/dialog";
22
+ import { flexRender, getCoreRowModel, useReactTable } from "@tanstack/react-table";
23
+ import { Drawer as DrawerPrimitive } from "@base-ui/react/drawer";
24
+ import { Radio } from "@base-ui/react/radio";
25
+ import { RadioGroup as RadioGroup$1 } from "@base-ui/react/radio-group";
26
+ import { ScrollArea as ScrollAreaPrimitive } from "@base-ui/react/scroll-area";
27
+ import { Menu } from "@base-ui/react/menu";
22
28
  import EmojiReactPicker, { Categories, EmojiStyle, SuggestionMode, Theme } from "emoji-picker-react";
23
- import * as PopoverPrimitive from "@radix-ui/react-popover";
29
+ import { Popover as Popover$1 } from "@base-ui/react/popover";
24
30
  import { ThemeProvider as ThemeProvider$1, useTheme, useTheme as useTheme$1 } from "next-themes";
25
- import * as TooltipPrimitive from "@radix-ui/react-tooltip";
26
- import * as LabelPrimitive from "@radix-ui/react-label";
27
31
  import { OTPInput, OTPInputContext } from "input-otp";
28
- import * as ProgressPrimitive from "@radix-ui/react-progress";
29
- import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
30
- import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
31
- import * as SelectPrimitive from "@radix-ui/react-select";
32
- import * as SliderPrimitive from "@radix-ui/react-slider";
32
+ import { Progress as Progress$1 } from "@base-ui/react/progress";
33
+ import { Select as Select$1 } from "@base-ui/react/select";
34
+ import { Tooltip as Tooltip$1 } from "@base-ui/react/tooltip";
35
+ import { Slider as Slider$1 } from "@base-ui/react/slider";
33
36
  import { Toaster as Toaster$1, toast } from "sonner";
34
- import * as SwitchPrimitive from "@radix-ui/react-switch";
35
- import * as TabsPrimitive from "@radix-ui/react-tabs";
36
- import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
37
- import * as TogglePrimitive from "@radix-ui/react-toggle";
37
+ import { Switch as Switch$1 } from "@base-ui/react/switch";
38
+ import { Tabs as Tabs$1 } from "@base-ui/react/tabs";
39
+ import { Toggle as Toggle$1 } from "@base-ui/react/toggle";
40
+ import { ToggleGroup as ToggleGroup$1 } from "@base-ui/react/toggle-group";
38
41
 
39
42
  //#region src/lib/utils.ts
40
- const twMerge = extendTailwindMerge({ extend: { theme: { text: ["tiny"] } } });
43
+ const DS_COLORS = [
44
+ "background",
45
+ "foreground",
46
+ "card",
47
+ "card-foreground",
48
+ "popover",
49
+ "popover-foreground",
50
+ "primary",
51
+ "primary-foreground",
52
+ "secondary",
53
+ "secondary-foreground",
54
+ "info",
55
+ "info-foreground",
56
+ "info-background",
57
+ "success",
58
+ "success-foreground",
59
+ "success-background",
60
+ "warning",
61
+ "warning-foreground",
62
+ "warning-background",
63
+ "destructive",
64
+ "destructive-foreground",
65
+ "destructive-background",
66
+ "muted",
67
+ "muted-foreground",
68
+ "accent",
69
+ "accent-foreground",
70
+ "border",
71
+ "input",
72
+ "ring",
73
+ "chart-1",
74
+ "chart-2",
75
+ "chart-3",
76
+ "chart-4",
77
+ "chart-5",
78
+ "sidebar",
79
+ "sidebar-foreground",
80
+ "sidebar-primary",
81
+ "sidebar-primary-foreground",
82
+ "sidebar-accent",
83
+ "sidebar-accent-foreground",
84
+ "sidebar-border",
85
+ "sidebar-ring"
86
+ ];
87
+ const BLOCKS_COLORS = [
88
+ "page-background",
89
+ "navbar-foreground",
90
+ "navbar-accent",
91
+ "navbar-accent-foreground",
92
+ "navbar-icon-bg"
93
+ ];
94
+ const twMerge = extendTailwindMerge({ extend: { theme: {
95
+ color: [...DS_COLORS, ...BLOCKS_COLORS],
96
+ text: ["tiny"],
97
+ animate: ["caret-blink"]
98
+ } } });
41
99
  function cn(...inputs) {
42
100
  return twMerge(clsx(inputs));
43
101
  }
44
102
 
103
+ //#endregion
104
+ //#region src/components/accordion.tsx
105
+ function Accordion({ className, ...props }) {
106
+ return /* @__PURE__ */ jsx(Accordion$1.Root, {
107
+ "data-slot": "accordion",
108
+ className: cn("flex w-full flex-col", className),
109
+ ...props
110
+ });
111
+ }
112
+ function AccordionItem({ className, ...props }) {
113
+ return /* @__PURE__ */ jsx(Accordion$1.Item, {
114
+ "data-slot": "accordion-item",
115
+ className: cn("not-last:border-b", className),
116
+ ...props
117
+ });
118
+ }
119
+ function AccordionTrigger({ className, children, ...props }) {
120
+ return /* @__PURE__ */ jsx(Accordion$1.Header, {
121
+ className: "flex",
122
+ children: /* @__PURE__ */ jsxs(Accordion$1.Trigger, {
123
+ "data-slot": "accordion-trigger",
124
+ className: cn("group/accordion-trigger relative flex flex-1 items-start justify-between rounded-md border border-transparent py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:after:border-ring aria-disabled:pointer-events-none aria-disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground", className),
125
+ ...props,
126
+ children: [
127
+ children,
128
+ /* @__PURE__ */ jsx(ChevronDownIcon, {
129
+ "data-slot": "accordion-trigger-icon",
130
+ className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
131
+ }),
132
+ /* @__PURE__ */ jsx(ChevronUpIcon, {
133
+ "data-slot": "accordion-trigger-icon",
134
+ className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
135
+ })
136
+ ]
137
+ })
138
+ });
139
+ }
140
+ function AccordionContent({ className, children, ...props }) {
141
+ return /* @__PURE__ */ jsx(Accordion$1.Panel, {
142
+ "data-slot": "accordion-content",
143
+ className: "overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up",
144
+ ...props,
145
+ children: /* @__PURE__ */ jsx("div", {
146
+ className: cn("h-(--accordion-panel-height) pt-0 pb-4 data-ending-style:h-0 data-starting-style:h-0 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4", className),
147
+ children
148
+ })
149
+ });
150
+ }
151
+
152
+ //#endregion
153
+ //#region src/components/button.tsx
154
+ const buttonVariants = cva("group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px active:not-aria-[haspopup]:opacity-60 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
155
+ variants: {
156
+ variant: {
157
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
158
+ outline: "border-border bg-background hover:bg-muted hover:text-accent-foreground aria-expanded:bg-muted aria-expanded:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
159
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
160
+ ghost: "hover:bg-muted hover:text-accent-foreground aria-expanded:bg-muted aria-expanded:text-accent-foreground dark:hover:bg-muted/50",
161
+ destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
162
+ link: "text-primary underline underline-offset-4"
163
+ },
164
+ size: {
165
+ default: "h-8 gap-1.5 px-2 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",
166
+ sm: "h-6 gap-1.5 px-2 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",
167
+ lg: "h-10 gap-1.5 px-4 [&_svg:not([class*='size-'])]:size-6 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3",
168
+ icon: "size-8",
169
+ "icon-sm": "size-6",
170
+ "icon-lg": "size-10 [&_svg:not([class*='size-'])]:size-6"
171
+ },
172
+ block: { true: "w-full" }
173
+ },
174
+ defaultVariants: {
175
+ variant: "default",
176
+ size: "default",
177
+ block: false
178
+ }
179
+ });
180
+ const Button = React$1.forwardRef(({ className, variant = "default", size = "default", block = false, ...props }, ref) => {
181
+ return /* @__PURE__ */ jsx(Button$1, {
182
+ ref,
183
+ "data-slot": "button",
184
+ "data-variant": variant,
185
+ className: cn(buttonVariants({
186
+ variant,
187
+ size,
188
+ block,
189
+ className
190
+ })),
191
+ ...props
192
+ });
193
+ });
194
+ Button.displayName = "Button";
195
+
196
+ //#endregion
197
+ //#region src/components/alert-dialog.tsx
198
+ function AlertDialog({ ...props }) {
199
+ return /* @__PURE__ */ jsx(AlertDialog$1.Root, {
200
+ "data-slot": "alert-dialog",
201
+ ...props
202
+ });
203
+ }
204
+ function AlertDialogTrigger({ ...props }) {
205
+ return /* @__PURE__ */ jsx(AlertDialog$1.Trigger, {
206
+ "data-slot": "alert-dialog-trigger",
207
+ ...props
208
+ });
209
+ }
210
+ function AlertDialogPortal({ ...props }) {
211
+ return /* @__PURE__ */ jsx(AlertDialog$1.Portal, {
212
+ "data-slot": "alert-dialog-portal",
213
+ ...props
214
+ });
215
+ }
216
+ function AlertDialogOverlay({ className, ...props }) {
217
+ return /* @__PURE__ */ jsx(AlertDialog$1.Backdrop, {
218
+ "data-slot": "alert-dialog-overlay",
219
+ className: cn("fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0", className),
220
+ ...props
221
+ });
222
+ }
223
+ function AlertDialogContent({ className, size = "default", ...props }) {
224
+ return /* @__PURE__ */ jsxs(AlertDialogPortal, { children: [/* @__PURE__ */ jsx(AlertDialogOverlay, {}), /* @__PURE__ */ jsx(AlertDialog$1.Popup, {
225
+ "data-slot": "alert-dialog-content",
226
+ "data-size": size,
227
+ className: cn("group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-sm 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),
228
+ ...props
229
+ })] });
230
+ }
231
+ function AlertDialogHeader({ className, ...props }) {
232
+ return /* @__PURE__ */ jsx("div", {
233
+ "data-slot": "alert-dialog-header",
234
+ className: cn("grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]", className),
235
+ ...props
236
+ });
237
+ }
238
+ function AlertDialogFooter({ className, ...props }) {
239
+ return /* @__PURE__ */ jsx("div", {
240
+ "data-slot": "alert-dialog-footer",
241
+ className: cn("-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end", className),
242
+ ...props
243
+ });
244
+ }
245
+ function AlertDialogMedia({ className, ...props }) {
246
+ return /* @__PURE__ */ jsx("div", {
247
+ "data-slot": "alert-dialog-media",
248
+ className: cn("mb-2 inline-flex size-10 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-6", className),
249
+ ...props
250
+ });
251
+ }
252
+ function AlertDialogTitle({ className, ...props }) {
253
+ return /* @__PURE__ */ jsx(AlertDialog$1.Title, {
254
+ "data-slot": "alert-dialog-title",
255
+ className: cn("text-base font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2", className),
256
+ ...props
257
+ });
258
+ }
259
+ function AlertDialogDescription({ className, ...props }) {
260
+ return /* @__PURE__ */ jsx(AlertDialog$1.Description, {
261
+ "data-slot": "alert-dialog-description",
262
+ className: cn("text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground", className),
263
+ ...props
264
+ });
265
+ }
266
+ function AlertDialogAction({ className, ...props }) {
267
+ return /* @__PURE__ */ jsx(Button, {
268
+ "data-slot": "alert-dialog-action",
269
+ className: cn(className),
270
+ ...props
271
+ });
272
+ }
273
+ function AlertDialogCancel({ className, variant = "outline", size = "default", ...props }) {
274
+ return /* @__PURE__ */ jsx(AlertDialog$1.Close, {
275
+ "data-slot": "alert-dialog-cancel",
276
+ className: cn(className),
277
+ render: /* @__PURE__ */ jsx(Button, {
278
+ variant,
279
+ size
280
+ }),
281
+ ...props
282
+ });
283
+ }
284
+
45
285
  //#endregion
46
286
  //#region src/components/alert.tsx
47
- const alertVariants = cva("relative grid w-full items-start gap-x-2 gap-y-0.5 rounded-xl border px-3.5 py-3 text-card-foreground text-sm has-[>svg]:has-data-[slot=alert-action]:grid-cols-[calc(var(--spacing)*4)_1fr_auto] has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-data-[slot=alert-action]:grid-cols-[1fr_auto] has-[>svg]:gap-x-2 [&>svg]:h-lh [&>svg]:w-4", {
287
+ const alertVariants = cva("relative grid w-full items-start gap-x-2 gap-y-0.5 rounded-3xl border px-4 py-4 text-card-foreground text-sm has-[>svg]:has-data-[slot=alert-action]:grid-cols-[calc(var(--spacing)*6)_1fr_auto] has-[>svg]:grid-cols-[calc(var(--spacing)*6)_1fr] has-data-[slot=alert-action]:grid-cols-[1fr_auto] has-[>svg]:gap-x-4 [&>svg]:size-6", {
48
288
  defaultVariants: { variant: "default" },
49
289
  variants: { variant: {
50
- default: "bg-transparent dark:bg-input/32 [&>svg]:text-muted-foreground",
51
- error: "border-destructive/32 bg-destructive/4 [&>svg]:text-destructive",
52
- info: "border-info/32 bg-info/4 [&>svg]:text-info",
53
- success: "border-success/32 bg-success/4 [&>svg]:text-success",
54
- warning: "border-warning/32 bg-warning/4 [&>svg]:text-warning"
290
+ default: "bg-card border-border [&>svg]:text-muted-foreground",
291
+ error: "bg-destructive-background border-destructive/35 [&>svg]:text-destructive",
292
+ info: "bg-info-background border-info/35 [&>svg]:text-info",
293
+ success: "bg-success-background border-success/35 [&>svg]:text-success",
294
+ warning: "bg-warning-background border-warning/35 [&>svg]:text-warning"
55
295
  } }
56
296
  });
57
297
  function Alert({ className, variant, ...props }) {
@@ -64,7 +304,7 @@ function Alert({ className, variant, ...props }) {
64
304
  }
65
305
  function AlertTitle({ className, ...props }) {
66
306
  return /* @__PURE__ */ jsx("div", {
67
- className: cn("font-medium [svg~&]:col-start-2", className),
307
+ className: cn("font-medium leading-6 [svg~&]:col-start-2", className),
68
308
  "data-slot": "alert-title",
69
309
  ...props
70
310
  });
@@ -86,88 +326,336 @@ function AlertAction({ className, ...props }) {
86
326
 
87
327
  //#endregion
88
328
  //#region src/components/avatar.tsx
89
- const avatarVariants = cva("relative flex shrink-0 overflow-hidden ", {
90
- variants: {
91
- shape: {
92
- default: "rounded-full",
93
- rounded: "rounded-md"
94
- },
95
- size: {
96
- sm: "size-6 text-xs",
97
- default: "size-8",
98
- lg: "size-10"
99
- }
100
- },
101
- defaultVariants: {
102
- shape: "default",
103
- size: "default"
104
- }
105
- });
106
- const Avatar = React$1.forwardRef(({ className, shape = "default", size = "default", ...props }, ref) => {
107
- return /* @__PURE__ */ jsx(AvatarPrimitive.Root, {
329
+ const Avatar = React$1.forwardRef(({ className, size = "default", ...props }, ref) => {
330
+ return /* @__PURE__ */ jsx(Avatar$1.Root, {
331
+ ref,
108
332
  "data-slot": "avatar",
109
- className: cn(avatarVariants({
110
- shape,
111
- size
112
- }), className),
113
- ...props,
114
- ref
333
+ "data-size": size,
334
+ className: cn("group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=xs]:size-5 data-[size=sm]:size-6 data-[size=lg]:size-10 data-[size=xl]:size-12 dark:after:mix-blend-lighten", className),
335
+ ...props
115
336
  });
116
337
  });
338
+ Avatar.displayName = "Avatar";
117
339
  function AvatarImage({ className, ...props }) {
118
- return /* @__PURE__ */ jsx(AvatarPrimitive.Image, {
340
+ return /* @__PURE__ */ jsx(Avatar$1.Image, {
119
341
  "data-slot": "avatar-image",
120
- className: cn("aspect-square size-full", className),
342
+ className: cn("aspect-square size-full rounded-full object-cover", className),
121
343
  ...props
122
344
  });
123
345
  }
124
346
  function AvatarFallback({ className, ...props }) {
125
- return /* @__PURE__ */ jsx(AvatarPrimitive.Fallback, {
347
+ return /* @__PURE__ */ jsx(Avatar$1.Fallback, {
126
348
  "data-slot": "avatar-fallback",
127
- className: cn("bg-muted flex size-full items-center justify-center", className),
349
+ className: cn("flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=xs]/avatar:text-xs group-data-[size=sm]/avatar:text-xs group-data-[size=xl]/avatar:text-base", className),
350
+ ...props
351
+ });
352
+ }
353
+ function AvatarBadge({ className, ...props }) {
354
+ return /* @__PURE__ */ jsx("span", {
355
+ "data-slot": "avatar-badge",
356
+ className: cn("absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-blend-color ring-2 ring-background select-none", "group-data-[size=xs]/avatar:size-2 group-data-[size=xs]/avatar:[&>svg]:hidden", "group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden", "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2", "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2", "group-data-[size=xl]/avatar:size-3 group-data-[size=xl]/avatar:[&>svg]:size-2", className),
357
+ ...props
358
+ });
359
+ }
360
+ function AvatarGroup({ className, ...props }) {
361
+ return /* @__PURE__ */ jsx("div", {
362
+ "data-slot": "avatar-group",
363
+ className: cn("group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background", className),
364
+ ...props
365
+ });
366
+ }
367
+ function AvatarGroupCount({ className, ...props }) {
368
+ return /* @__PURE__ */ jsx("div", {
369
+ "data-slot": "avatar-group-count",
370
+ className: cn("relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=xs]/avatar-group:size-5 group-has-data-[size=sm]/avatar-group:size-6 group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=xl]/avatar-group:size-12 [&>svg]:size-4 group-has-data-[size=xs]/avatar-group:[&>svg]:size-3 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=xl]/avatar-group:[&>svg]:size-6", className),
128
371
  ...props
129
372
  });
130
373
  }
131
374
 
132
375
  //#endregion
133
- //#region src/components/badge.tsx
134
- 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", {
376
+ //#region src/components/counter-badge.tsx
377
+ const counterBadgeVariants = cva("group/counter-badge inline-flex h-5 min-w-5 shrink-0 items-center justify-center rounded-full border border-transparent px-1 text-xs font-medium leading-none whitespace-nowrap transition-[color,box-shadow]", {
135
378
  variants: { variant: {
136
- default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
137
- secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
138
- 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",
139
- outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
379
+ default: "bg-destructive text-primary-foreground hover:bg-destructive/80 focus-visible:border-ring focus-visible:outline-1 focus-visible:outline-offset-1 focus-visible:outline-ring/50",
380
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 focus-visible:border-ring focus-visible:outline-1 focus-visible:outline-offset-1 focus-visible:outline-ring/50",
381
+ ghost: "text-muted-foreground hover:bg-muted/80 focus-visible:outline-1 focus-visible:outline-offset-1 focus-visible:outline-ring/50"
140
382
  } },
141
383
  defaultVariants: { variant: "default" }
142
384
  });
143
- const Badge = React$1.forwardRef(({ className, variant, asChild = false, ...props }, forwardedRef) => {
144
- return /* @__PURE__ */ jsx(asChild ? Slot$1 : "span", {
145
- "data-slot": "badge",
146
- className: cn(badgeVariants({ variant }), className),
147
- ref: forwardedRef,
148
- ...props
385
+ const CounterBadge = React$1.forwardRef(({ className, variant = "default", render, ...props }, ref) => {
386
+ return useRender({
387
+ defaultTagName: "span",
388
+ props: mergeProps({
389
+ className: cn(counterBadgeVariants({ variant }), className),
390
+ ref
391
+ }, props),
392
+ render,
393
+ state: {
394
+ slot: "counter-badge",
395
+ variant
396
+ }
397
+ });
398
+ });
399
+ CounterBadge.displayName = "CounterBadge";
400
+
401
+ //#endregion
402
+ //#region src/components/badge.tsx
403
+ const badgeVariants = cva("group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none", {
404
+ variants: {
405
+ variant: {
406
+ default: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
407
+ secondary: "bg-charcoal-500/30 text-foreground [a]:hover:bg-charcoal-500/20",
408
+ outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground"
409
+ },
410
+ size: {
411
+ sm: "h-5 px-2 py-0.5 text-xs [&>svg]:size-3!",
412
+ lg: "h-7 px-3 py-1 text-sm [&>svg]:size-4!"
413
+ }
414
+ },
415
+ defaultVariants: {
416
+ variant: "default",
417
+ size: "sm"
418
+ }
419
+ });
420
+ const Badge = React$1.forwardRef(({ className, variant = "default", size = "sm", render, ...props }, ref) => {
421
+ return useRender({
422
+ defaultTagName: "span",
423
+ props: mergeProps({
424
+ className: cn(badgeVariants({
425
+ variant,
426
+ size
427
+ }), className),
428
+ ref
429
+ }, props),
430
+ render,
431
+ state: {
432
+ slot: "badge",
433
+ variant,
434
+ size
435
+ }
149
436
  });
150
437
  });
151
438
  Badge.displayName = "Badge";
439
+ function BadgeGroup({ className, ...props }) {
440
+ return /* @__PURE__ */ jsx("div", {
441
+ "data-slot": "badge-group",
442
+ className: cn("flex flex-wrap items-center gap-2", className),
443
+ ...props
444
+ });
445
+ }
446
+ function BadgeGroupCount({ className, ...props }) {
447
+ return /* @__PURE__ */ jsx(CounterBadge, {
448
+ "data-slot": "badge-group-count",
449
+ variant: "ghost",
450
+ className,
451
+ ...props
452
+ });
453
+ }
454
+
455
+ //#endregion
456
+ //#region src/components/banner.tsx
457
+ const bannerVariants = cva("relative grid w-full items-start gap-x-2 gap-y-0.5 px-4 py-4 text-card-foreground text-sm has-[>svg]:has-data-[slot=alert-action]:grid-cols-[calc(var(--spacing)*6)_1fr_auto] has-[>svg]:grid-cols-[calc(var(--spacing)*6)_1fr] has-data-[slot=alert-action]:grid-cols-[1fr_auto] has-[>svg]:gap-x-4 [&>svg]:size-6", {
458
+ defaultVariants: { variant: "default" },
459
+ variants: {
460
+ variant: {
461
+ default: "bg-card border-border [&>svg]:text-muted-foreground",
462
+ error: "bg-destructive-background border-destructive [&>svg]:text-destructive",
463
+ info: "bg-info-background border-info [&>svg]:text-info",
464
+ success: "bg-success-background border-success [&>svg]:text-success",
465
+ warning: "bg-warning-background border-warning [&>svg]:text-warning"
466
+ },
467
+ borderDirection: {
468
+ top: "border-t",
469
+ bottom: "border-b"
470
+ }
471
+ }
472
+ });
473
+ function Banner({ className, variant, borderDirection, ...props }) {
474
+ return /* @__PURE__ */ jsx("div", {
475
+ className: cn(bannerVariants({
476
+ variant,
477
+ borderDirection
478
+ }), className),
479
+ "data-slot": "banner",
480
+ role: "alert",
481
+ ...props
482
+ });
483
+ }
484
+
485
+ //#endregion
486
+ //#region src/components/notification-queue.tsx
487
+ const PRIORITY_WEIGHT = {
488
+ error: 1e3,
489
+ warning: 100,
490
+ success: 50,
491
+ info: 10,
492
+ promotional: 1
493
+ };
494
+ const NotificationQueueContext = React$1.createContext(null);
495
+ function useNotificationQueueContext() {
496
+ const ctx = React$1.useContext(NotificationQueueContext);
497
+ if (!ctx) throw new Error("useNotification* hooks must be used inside <NotificationQueueProvider>");
498
+ return ctx;
499
+ }
500
+ function reducer(state, action) {
501
+ switch (action.type) {
502
+ case "REGISTER": {
503
+ const idx = state.entries.findIndex((e) => e.id === action.entry.id && e.slot === action.entry.slot);
504
+ if (idx >= 0) {
505
+ const updated = [...state.entries];
506
+ updated[idx] = {
507
+ ...action.entry,
508
+ registeredAt: state.entries[idx].registeredAt
509
+ };
510
+ const dismissed = new Set(state.dismissed);
511
+ dismissed.delete(`${action.entry.slot}::${action.entry.id}`);
512
+ return {
513
+ ...state,
514
+ entries: updated,
515
+ dismissed
516
+ };
517
+ }
518
+ return {
519
+ ...state,
520
+ entries: [...state.entries, action.entry]
521
+ };
522
+ }
523
+ case "UNREGISTER": {
524
+ const key = `${action.slot}::${action.id}`;
525
+ const dismissed = new Set(state.dismissed);
526
+ dismissed.delete(key);
527
+ return {
528
+ ...state,
529
+ entries: state.entries.filter((e) => !(e.id === action.id && e.slot === action.slot)),
530
+ dismissed
531
+ };
532
+ }
533
+ case "DISMISS": {
534
+ const key = `${action.slot}::${action.id}`;
535
+ if (state.dismissed.has(key)) return state;
536
+ return {
537
+ ...state,
538
+ dismissed: new Set([...state.dismissed, key])
539
+ };
540
+ }
541
+ }
542
+ }
543
+ function getSlotQueue(state, slot) {
544
+ return state.entries.filter((e) => e.slot === slot && !state.dismissed.has(`${slot}::${e.id}`)).sort((a, b) => {
545
+ const diff = PRIORITY_WEIGHT[b.priority] - PRIORITY_WEIGHT[a.priority];
546
+ return diff !== 0 ? diff : b.registeredAt - a.registeredAt;
547
+ });
548
+ }
549
+ function NotificationQueueProvider({ children }) {
550
+ const [state, dispatch] = React$1.useReducer(reducer, {
551
+ entries: [],
552
+ dismissed: /* @__PURE__ */ new Set()
553
+ });
554
+ const value = React$1.useMemo(() => ({
555
+ state,
556
+ dispatch
557
+ }), [state]);
558
+ return /* @__PURE__ */ jsx(NotificationQueueContext.Provider, {
559
+ value,
560
+ children
561
+ });
562
+ }
563
+ function useNotificationQueue() {
564
+ const { dispatch } = useNotificationQueueContext();
565
+ return {
566
+ push: React$1.useCallback(({ id, slot, priority, render }) => {
567
+ const dismiss = () => dispatch({
568
+ type: "DISMISS",
569
+ id,
570
+ slot
571
+ });
572
+ dispatch({
573
+ type: "REGISTER",
574
+ entry: {
575
+ id,
576
+ slot,
577
+ priority,
578
+ registeredAt: Date.now(),
579
+ contentRef: { current: render({ dismiss }) }
580
+ }
581
+ });
582
+ return { dismiss };
583
+ }, [dispatch]),
584
+ dismiss: React$1.useCallback((id, slot) => dispatch({
585
+ type: "DISMISS",
586
+ id,
587
+ slot
588
+ }), [dispatch])
589
+ };
590
+ }
591
+ function useNotification({ id, slot, priority, render }) {
592
+ const { dispatch } = useNotificationQueueContext();
593
+ const dismiss = React$1.useCallback(() => dispatch({
594
+ type: "DISMISS",
595
+ id,
596
+ slot
597
+ }), [
598
+ id,
599
+ slot,
600
+ dispatch
601
+ ]);
602
+ const renderRef = React$1.useRef(render);
603
+ renderRef.current = render;
604
+ const contentRef = React$1.useRef(null);
605
+ contentRef.current = renderRef.current({ dismiss });
606
+ React$1.useEffect(() => {
607
+ dispatch({
608
+ type: "REGISTER",
609
+ entry: {
610
+ id,
611
+ slot,
612
+ priority,
613
+ registeredAt: Date.now(),
614
+ contentRef
615
+ }
616
+ });
617
+ return () => dispatch({
618
+ type: "UNREGISTER",
619
+ id,
620
+ slot
621
+ });
622
+ }, [
623
+ id,
624
+ slot,
625
+ priority,
626
+ dispatch
627
+ ]);
628
+ return { dismiss };
629
+ }
630
+ function NotificationSlot({ slot, className }) {
631
+ const { state } = useNotificationQueueContext();
632
+ const active = getSlotQueue(state, slot)[0];
633
+ if (!active) return null;
634
+ return /* @__PURE__ */ jsx("div", {
635
+ "data-slot": "notification-slot",
636
+ className: cn(className),
637
+ children: active.contentRef.current
638
+ });
639
+ }
152
640
 
153
641
  //#endregion
154
642
  //#region src/components/separator.tsx
155
- function Separator({ className, orientation = "horizontal", decorative = true, ...props }) {
156
- return /* @__PURE__ */ jsx(SeparatorPrimitive.Root, {
643
+ function Separator({ className, orientation = "horizontal", ...props }) {
644
+ return /* @__PURE__ */ jsx(Separator$1, {
157
645
  "data-slot": "separator",
158
- decorative,
646
+ "data-orientation": orientation,
159
647
  orientation,
160
- className: cn("bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px", className),
648
+ className: cn("shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch", className),
161
649
  ...props
162
650
  });
163
651
  }
164
652
 
165
653
  //#endregion
166
654
  //#region src/components/button-group.tsx
167
- const buttonGroupVariants = cva("flex w-fit items-stretch [&>*]:focus-visible:z-10 [&>*]:focus-visible:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md has-[>[data-slot=button-group]]:gap-2", {
655
+ const buttonGroupVariants = cva("flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1", {
168
656
  variants: { orientation: {
169
- horizontal: "[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none",
170
- vertical: "flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none"
657
+ horizontal: "*:data-slot:rounded-r-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-r-md! [&>[data-slot]~[data-slot]]:rounded-l-none [&>[data-slot]~[data-slot]]:border-l-0",
658
+ vertical: "flex-col *:data-slot:rounded-b-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-md! [&>[data-slot]~[data-slot]]:rounded-t-none [&>[data-slot]~[data-slot]]:border-t-0"
171
659
  } },
172
660
  defaultVariants: { orientation: "horizontal" }
173
661
  });
@@ -180,64 +668,124 @@ function ButtonGroup({ className, orientation, ...props }) {
180
668
  ...props
181
669
  });
182
670
  }
183
- function ButtonGroupText({ className, asChild = false, ...props }) {
184
- return /* @__PURE__ */ jsx(asChild ? Slot$1 : "div", {
185
- className: cn("bg-muted flex items-center gap-2 rounded-md border px-4 text-sm font-medium shadow-xs [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4", className),
186
- ...props
671
+ function ButtonGroupText({ className, render, ...props }) {
672
+ return useRender({
673
+ defaultTagName: "div",
674
+ props: mergeProps({ className: cn("flex items-center gap-2 rounded-md border bg-muted px-2.5 text-sm font-medium [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4", className) }, props),
675
+ render,
676
+ state: { slot: "button-group-text" }
187
677
  });
188
678
  }
189
679
  function ButtonGroupSeparator({ className, orientation = "vertical", ...props }) {
190
680
  return /* @__PURE__ */ jsx(Separator, {
191
681
  "data-slot": "button-group-separator",
192
682
  orientation,
193
- className: cn("bg-input relative !m-0 self-stretch data-[orientation=vertical]:h-auto", className),
683
+ className: cn("relative self-stretch bg-input data-[orientation=horizontal]:mx-px data-[orientation=horizontal]:w-auto data-[orientation=vertical]:my-px data-[orientation=vertical]:h-auto", className),
194
684
  ...props
195
685
  });
196
686
  }
197
687
 
198
688
  //#endregion
199
- //#region src/components/button.tsx
200
- const buttonVariants = cva("cursor-pointer inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-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", {
201
- variants: {
202
- variant: {
203
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
204
- destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
205
- outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
206
- secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
207
- ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
208
- link: "text-primary underline-offset-4 hover:underline"
689
+ //#region src/components/calendar.tsx
690
+ function Calendar({ className, classNames, showOutsideDays = true, captionLayout = "label", buttonVariant = "ghost", locale, formatters, components, ...props }) {
691
+ const defaultClassNames = getDefaultClassNames();
692
+ return /* @__PURE__ */ jsx(DayPicker, {
693
+ showOutsideDays,
694
+ className: cn("group/calendar bg-background p-3 [--cell-radius:var(--radius-md)] [--cell-size:--spacing(8)] in-data-[slot=card-content]:bg-transparent in-data-[slot=popover-content]:bg-transparent", String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`, String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`, className),
695
+ captionLayout,
696
+ locale,
697
+ formatters: {
698
+ formatMonthDropdown: (date) => date.toLocaleString(locale?.code, { month: "short" }),
699
+ ...formatters
209
700
  },
210
- size: {
211
- default: "h-9 px-4 py-2 has-[>svg]:px-3",
212
- sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
213
- lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
214
- icon: "size-9",
215
- "icon-sm": "size-8",
216
- "icon-lg": "size-10",
217
- "icon-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3"
701
+ classNames: {
702
+ root: cn("w-fit", defaultClassNames.root),
703
+ months: cn("relative flex flex-col gap-4 md:flex-row", defaultClassNames.months),
704
+ month: cn("flex w-full flex-col gap-4", defaultClassNames.month),
705
+ nav: cn("absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1", defaultClassNames.nav),
706
+ button_previous: cn(buttonVariants({ variant: buttonVariant }), "size-(--cell-size) p-0 select-none aria-disabled:opacity-50", defaultClassNames.button_previous),
707
+ button_next: cn(buttonVariants({ variant: buttonVariant }), "size-(--cell-size) p-0 select-none aria-disabled:opacity-50", defaultClassNames.button_next),
708
+ month_caption: cn("flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)", defaultClassNames.month_caption),
709
+ dropdowns: cn("flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium", defaultClassNames.dropdowns),
710
+ dropdown_root: cn("relative rounded-(--cell-radius)", defaultClassNames.dropdown_root),
711
+ dropdown: cn("absolute inset-0 bg-popover opacity-0", defaultClassNames.dropdown),
712
+ caption_label: cn("font-medium select-none", captionLayout === "label" ? "text-sm" : "flex items-center gap-1 rounded-(--cell-radius) text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground", defaultClassNames.caption_label),
713
+ table: "w-full border-collapse",
714
+ weekdays: cn("flex", defaultClassNames.weekdays),
715
+ weekday: cn("flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal text-muted-foreground select-none", defaultClassNames.weekday),
716
+ week: cn("mt-2 flex w-full", defaultClassNames.week),
717
+ week_number_header: cn("w-(--cell-size) select-none", defaultClassNames.week_number_header),
718
+ week_number: cn("text-[0.8rem] text-muted-foreground select-none", defaultClassNames.week_number),
719
+ day: cn("group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius)", props.showWeekNumber ? "[&:nth-child(2)[data-selected=true]_button]:rounded-l-(--cell-radius)" : "[&:first-child[data-selected=true]_button]:rounded-l-(--cell-radius)", defaultClassNames.day),
720
+ range_start: cn("relative isolate z-0 rounded-l-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:right-0 after:w-4 after:bg-muted", defaultClassNames.range_start),
721
+ range_middle: cn("rounded-none", defaultClassNames.range_middle),
722
+ range_end: cn("relative isolate z-0 rounded-r-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:left-0 after:w-4 after:bg-muted", defaultClassNames.range_end),
723
+ today: cn("rounded-(--cell-radius) text-foreground not-data-[selected=true]:bg-muted data-[selected=true]:rounded-none", defaultClassNames.today),
724
+ outside: cn("text-muted-foreground aria-selected:text-muted-foreground", defaultClassNames.outside),
725
+ disabled: cn("text-muted-foreground opacity-50", defaultClassNames.disabled),
726
+ hidden: cn("invisible", defaultClassNames.hidden),
727
+ ...classNames
728
+ },
729
+ components: {
730
+ Root: ({ className: rootClassName, rootRef, ...rootProps }) => {
731
+ return /* @__PURE__ */ jsx("div", {
732
+ "data-slot": "calendar",
733
+ ref: rootRef,
734
+ className: cn(rootClassName),
735
+ ...rootProps
736
+ });
737
+ },
738
+ Chevron: ({ className: chevronClassName, orientation, ...chevronProps }) => {
739
+ if (orientation === "left") return /* @__PURE__ */ jsx(ChevronLeftIcon, {
740
+ className: cn("size-4", chevronClassName),
741
+ ...chevronProps
742
+ });
743
+ if (orientation === "right") return /* @__PURE__ */ jsx(ChevronRightIcon, {
744
+ className: cn("size-4", chevronClassName),
745
+ ...chevronProps
746
+ });
747
+ return /* @__PURE__ */ jsx(ChevronDownIcon, {
748
+ className: cn("size-4", chevronClassName),
749
+ ...chevronProps
750
+ });
751
+ },
752
+ DayButton: ({ ...dayButtonProps }) => /* @__PURE__ */ jsx(CalendarDayButton, {
753
+ locale,
754
+ ...dayButtonProps
755
+ }),
756
+ WeekNumber: ({ children, ...weekNumberProps }) => {
757
+ return /* @__PURE__ */ jsx("td", {
758
+ ...weekNumberProps,
759
+ children: /* @__PURE__ */ jsx("div", {
760
+ className: "flex size-(--cell-size) items-center justify-center text-center",
761
+ children
762
+ })
763
+ });
764
+ },
765
+ ...components
218
766
  },
219
- block: { true: "w-full" }
220
- },
221
- defaultVariants: {
222
- variant: "default",
223
- size: "default",
224
- block: false
225
- }
226
- });
227
- const Button = React$1.forwardRef(({ className, variant, size, asChild = false, block = false, ...props }, forwardedRef) => {
228
- return /* @__PURE__ */ jsx(asChild ? Slot$1 : "button", {
229
- "data-slot": "button",
230
- className: cn(buttonVariants({
231
- variant,
232
- size,
233
- block,
234
- className
235
- })),
236
- ref: forwardedRef,
237
767
  ...props
238
768
  });
239
- });
240
- Button.displayName = "Button";
769
+ }
770
+ function CalendarDayButton({ className: dayClassName, day, modifiers, locale, ...props }) {
771
+ const defaultClassNames = getDefaultClassNames();
772
+ const ref = React$1.useRef(null);
773
+ React$1.useEffect(() => {
774
+ if (modifiers.focused) ref.current?.focus();
775
+ }, [modifiers.focused]);
776
+ return /* @__PURE__ */ jsx(Button, {
777
+ ref,
778
+ variant: "ghost",
779
+ size: "icon",
780
+ "data-day": day.date.toLocaleDateString(locale?.code),
781
+ "data-selected-single": modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle,
782
+ "data-range-start": modifiers.range_start,
783
+ "data-range-end": modifiers.range_end,
784
+ "data-range-middle": modifiers.range_middle,
785
+ className: cn("relative isolate z-10 flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 rounded-(--cell-radius) border-transparent bg-clip-border leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:rounded-r-(--cell-radius) data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-muted data-[range-middle=true]:text-foreground data-[range-start=true]:rounded-l-(--cell-radius) 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 dark:hover:text-foreground [&>span]:text-xs [&>span]:opacity-70", defaultClassNames.day, dayClassName),
786
+ ...props
787
+ });
788
+ }
241
789
 
242
790
  //#endregion
243
791
  //#region src/components/card.tsx
@@ -393,7 +941,7 @@ function CarouselPrevious({ className, variant = "outline", size = "sm", ...prop
393
941
  disabled: !canScrollPrev,
394
942
  onClick: scrollPrev,
395
943
  ...props,
396
- children: [/* @__PURE__ */ jsx(ArrowLeftOutline, {}), /* @__PURE__ */ jsx("span", {
944
+ children: [/* @__PURE__ */ jsx(ArrowLeft, {}), /* @__PURE__ */ jsx("span", {
397
945
  className: "sr-only",
398
946
  children: "Previous slide"
399
947
  })]
@@ -409,7 +957,7 @@ function CarouselNext({ className, variant = "outline", size = "sm", ...props })
409
957
  disabled: !canScrollNext,
410
958
  onClick: scrollNext,
411
959
  ...props,
412
- children: [/* @__PURE__ */ jsx(ArrowRightOutline, {}), /* @__PURE__ */ jsx("span", {
960
+ children: [/* @__PURE__ */ jsx(ArrowRight, {}), /* @__PURE__ */ jsx("span", {
413
961
  className: "sr-only",
414
962
  children: "Next slide"
415
963
  })]
@@ -419,15 +967,16 @@ function CarouselNext({ className, variant = "outline", size = "sm", ...props })
419
967
  //#endregion
420
968
  //#region src/components/checkbox.tsx
421
969
  const Checkbox = React$1.forwardRef(({ className, ...props }, ref) => {
422
- return /* @__PURE__ */ jsx(CheckboxPrimitive.Root, {
970
+ return /* @__PURE__ */ jsx(Checkbox$1.Root, {
423
971
  ref,
424
972
  "data-slot": "checkbox",
425
- className: cn("peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className),
973
+ className: cn("peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input transition-[color,box-shadow,opacity] outline-none active:opacity-60 group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 dark:disabled:bg-input/80 aria-invalid:border-destructive focus-visible:aria-invalid:ring-3 focus-visible:aria-invalid:ring-destructive/20 hover:aria-invalid:data-unchecked:bg-destructive-background focus-visible:aria-invalid:data-unchecked:bg-destructive-background dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:focus-visible:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground data-indeterminate:border-primary data-indeterminate:bg-primary data-indeterminate:text-primary-foreground aria-invalid:data-checked:border-destructive aria-invalid:data-checked:bg-destructive aria-invalid:data-indeterminate:border-destructive aria-invalid:data-indeterminate:bg-destructive dark:data-checked:bg-primary dark:data-indeterminate:bg-primary", className),
426
974
  ...props,
427
- children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, {
975
+ children: /* @__PURE__ */ jsxs(Checkbox$1.Indicator, {
428
976
  "data-slot": "checkbox-indicator",
429
- className: "grid place-content-center text-current transition-none",
430
- children: /* @__PURE__ */ jsx(CheckOutline, { className: "size-3.5" })
977
+ keepMounted: true,
978
+ className: "group/indicator grid place-content-center text-current transition-none [&>svg]:size-3.5",
979
+ children: [/* @__PURE__ */ jsx(CheckIcon, { className: "hidden group-data-[checked]/indicator:block" }), /* @__PURE__ */ jsx(MinusIcon, { className: "hidden group-data-[indeterminate]/indicator:block" })]
431
980
  })
432
981
  });
433
982
  });
@@ -436,19 +985,19 @@ Checkbox.displayName = "Checkbox";
436
985
  //#endregion
437
986
  //#region src/components/collapsible.tsx
438
987
  function Collapsible({ ...props }) {
439
- return /* @__PURE__ */ jsx(CollapsiblePrimitive.Root, {
988
+ return /* @__PURE__ */ jsx(Collapsible$1.Root, {
440
989
  "data-slot": "collapsible",
441
990
  ...props
442
991
  });
443
992
  }
444
993
  function CollapsibleTrigger({ ...props }) {
445
- return /* @__PURE__ */ jsx(CollapsiblePrimitive.CollapsibleTrigger, {
994
+ return /* @__PURE__ */ jsx(Collapsible$1.Trigger, {
446
995
  "data-slot": "collapsible-trigger",
447
996
  ...props
448
997
  });
449
998
  }
450
999
  function CollapsibleContent({ ...props }) {
451
- return /* @__PURE__ */ jsx(CollapsiblePrimitive.CollapsibleContent, {
1000
+ return /* @__PURE__ */ jsx(Collapsible$1.Panel, {
452
1001
  "data-slot": "collapsible-content",
453
1002
  ...props
454
1003
  });
@@ -456,23 +1005,12 @@ function CollapsibleContent({ ...props }) {
456
1005
 
457
1006
  //#endregion
458
1007
  //#region src/components/input.tsx
459
- const inputVariants = cva("text-foreground file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm 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", {
460
- variants: {
461
- sizing: {
462
- default: "h-9 px-4 py-2",
463
- sm: "h-8 rounded-md gap-1.5 px-3",
464
- lg: "h-11 rounded-lg px-6"
465
- },
466
- block: { true: "w-full" }
467
- },
468
- defaultVariants: { sizing: "default" }
469
- });
470
- const Input = React$1.forwardRef(({ className, type, sizing, block, ...props }, forwardedRef) => {
1008
+ const inputVariants = cva("text-foreground file:text-foreground placeholder:text-muted-foreground dark:bg-input/30 border-input flex h-10 w-full min-w-0 rounded-md border bg-transparent px-3 py-2 text-base transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium hover:border-ring hover:aria-invalid:border-destructive disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 dark:disabled:bg-input/80 md:text-sm focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3 aria-invalid:border-destructive focus-visible:aria-invalid:ring-destructive/20 focus-visible:aria-invalid:ring-3 dark:focus-visible:aria-invalid:ring-destructive/40", { variants: { block: { true: "w-full" } } });
1009
+ const Input = React$1.forwardRef(({ className, type, block, ...props }, forwardedRef) => {
471
1010
  return /* @__PURE__ */ jsx("input", {
472
1011
  type,
473
1012
  "data-slot": "input",
474
1013
  className: cn(inputVariants({
475
- sizing,
476
1014
  block,
477
1015
  className
478
1016
  })),
@@ -486,29 +1024,21 @@ const Input = React$1.forwardRef(({ className, type, sizing, block, ...props },
486
1024
  function Textarea({ className, ...props }) {
487
1025
  return /* @__PURE__ */ jsx("textarea", {
488
1026
  "data-slot": "textarea",
489
- className: cn("border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", className),
1027
+ className: cn("border-input placeholder:text-muted-foreground hover:border-ring hover:aria-invalid:border-destructive focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3 aria-invalid:border-destructive focus-visible:aria-invalid:ring-destructive/20 focus-visible:aria-invalid:ring-3 dark:focus-visible:aria-invalid:ring-destructive/40 dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 dark:disabled:bg-input/80 md:text-sm", className),
490
1028
  ...props
491
1029
  });
492
1030
  }
493
1031
 
494
1032
  //#endregion
495
1033
  //#region src/components/input-group.tsx
496
- const inputGroupVariants = cva("group/input-group border-input dark:bg-input/30 relative flex w-full items-center rounded-md border shadow-xs transition-[color,box-shadow] outline-none has-[>textarea]:h-auto", {
497
- variants: { sizing: {
498
- default: "h-9",
499
- sm: "h-8",
500
- lg: "h-11"
501
- } },
502
- defaultVariants: { sizing: "default" }
503
- });
504
- function InputGroup({ className, sizing, ...props }) {
505
- return /* @__PURE__ */ jsx("div", {
506
- "data-slot": "input-group",
507
- role: "group",
508
- className: cn(inputGroupVariants({ sizing }), "has-[>[data-align=inline-start]]:[&>input]:pl-2", "has-[>[data-align=inline-end]]:[&>input]:pr-2", "has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3", "has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3", "has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-[3px]", "has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40", className),
509
- ...props
510
- });
511
- }
1034
+ const InputGroup = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", {
1035
+ ref,
1036
+ "data-slot": "input-group",
1037
+ role: "group",
1038
+ className: cn("group/input-group border-input dark:bg-input/30 relative flex h-10 w-full items-center rounded-md border transition-[color,box-shadow] outline-none has-[>textarea]:h-auto", "not-has-[input:disabled]:not-has-[textarea:disabled]:not-has-[[data-slot][aria-invalid=true]]:hover:border-ring", "has-[input:disabled]:bg-input/50 has-[textarea:disabled]:bg-input/50 has-[input:disabled]:opacity-50 has-[textarea:disabled]:opacity-50 dark:has-[input:disabled]:bg-input/80 dark:has-[textarea:disabled]:bg-input/80", "has-[>[data-align=inline-start]]:[&>input]:pl-2", "has-[>[data-align=inline-end]]:[&>input]:pr-2", "has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3", "has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3", "has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-3", "has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]:focus-visible]:ring-destructive/20 dark:has-[[data-slot][aria-invalid=true]:focus-visible]:ring-destructive/40", className),
1039
+ ...props
1040
+ }));
1041
+ InputGroup.displayName = "InputGroup";
512
1042
  const inputGroupAddonVariants = cva("text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none [&>svg:not([class*='size-'])]:size-4 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[disabled=true]/input-group:opacity-50", {
513
1043
  variants: { align: {
514
1044
  "inline-start": "order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]",
@@ -531,22 +1061,13 @@ function InputGroupAddon({ className, align = "inline-start", ...props }) {
531
1061
  ...props
532
1062
  });
533
1063
  }
534
- const inputGroupButtonVariants = cva("text-sm shadow-none flex gap-2 items-center", {
535
- variants: { size: {
536
- xs: "h-6 gap-1 px-2 rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-3.5 has-[>svg]:px-2",
537
- sm: "h-7 px-2.5 gap-1.5 rounded-md has-[>svg]:px-2.5",
538
- "icon-xs": "size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0",
539
- "icon-sm": "size-7 p-0 has-[>svg]:p-0"
540
- } },
541
- defaultVariants: { size: "xs" }
542
- });
543
- const InputGroupButton = React$1.forwardRef(({ className, type = "button", variant = "ghost", size = "xs", ...props }, ref) => {
1064
+ const InputGroupButton = React$1.forwardRef(({ className, type = "button", variant = "ghost", size = "sm", ...props }, ref) => {
544
1065
  return /* @__PURE__ */ jsx(Button, {
545
1066
  ref,
546
1067
  type,
547
- "data-size": size,
548
1068
  variant,
549
- className: cn(inputGroupButtonVariants({ size }), className),
1069
+ size,
1070
+ className,
550
1071
  ...props
551
1072
  });
552
1073
  });
@@ -560,7 +1081,7 @@ function InputGroupText({ className, ...props }) {
560
1081
  const InputGroupInput = React$1.forwardRef(({ className, ...props }, forwardedRef) => {
561
1082
  return /* @__PURE__ */ jsx(Input, {
562
1083
  "data-slot": "input-group-control",
563
- className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent", className),
1084
+ className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 aria-invalid:ring-0 focus-visible:aria-invalid:!ring-0 disabled:bg-transparent disabled:opacity-100 dark:bg-transparent dark:disabled:bg-transparent", className),
564
1085
  ...props,
565
1086
  ref: forwardedRef
566
1087
  });
@@ -568,7 +1089,7 @@ const InputGroupInput = React$1.forwardRef(({ className, ...props }, forwardedRe
568
1089
  function InputGroupTextarea({ className, ...props }) {
569
1090
  return /* @__PURE__ */ jsx(Textarea, {
570
1091
  "data-slot": "input-group-control",
571
- className: cn("flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent", className),
1092
+ className: cn("flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent", className),
572
1093
  ...props
573
1094
  });
574
1095
  }
@@ -586,54 +1107,49 @@ const ComboboxTrigger = React$1.forwardRef(({ className, children, ...props }, r
586
1107
  return /* @__PURE__ */ jsxs(Combobox$1.Trigger, {
587
1108
  ref,
588
1109
  "data-slot": "combobox-trigger",
589
- "aria-label": "Open options",
590
1110
  className: cn("[&_svg:not([class*='size-'])]:size-4", className),
591
1111
  ...props,
592
- children: [children, /* @__PURE__ */ jsx(ChevronDownIcon, {
593
- "data-slot": "combobox-trigger-icon",
594
- className: "text-muted-foreground pointer-events-none size-4"
595
- })]
1112
+ children: [children, /* @__PURE__ */ jsx(ChevronDownIcon, { className: "pointer-events-none size-4 text-muted-foreground" })]
596
1113
  });
597
1114
  });
598
1115
  ComboboxTrigger.displayName = "ComboboxTrigger";
599
1116
  function ComboboxClear({ className, ...props }) {
600
1117
  return /* @__PURE__ */ jsx(Combobox$1.Clear, {
601
1118
  "data-slot": "combobox-clear",
602
- "aria-label": "Clear selection",
603
1119
  render: /* @__PURE__ */ jsx(InputGroupButton, {
604
1120
  variant: "ghost",
605
- size: "icon-xs"
1121
+ size: "icon-sm"
606
1122
  }),
607
1123
  className: cn(className),
608
1124
  ...props,
609
1125
  children: /* @__PURE__ */ jsx(XIcon, { className: "pointer-events-none" })
610
1126
  });
611
1127
  }
612
- function ComboboxInput({ className, children, disabled = false, showTrigger = true, showClear = false, ...props }) {
1128
+ const ComboboxInput = React$1.forwardRef(({ className, children, disabled = false, showTrigger = true, showClear = false, ...props }, ref) => {
613
1129
  return /* @__PURE__ */ jsxs(InputGroup, {
1130
+ ref,
614
1131
  className: cn("w-auto", className),
615
1132
  children: [
616
1133
  /* @__PURE__ */ jsx(Combobox$1.Input, {
617
- disabled,
618
1134
  render: /* @__PURE__ */ jsx(InputGroupInput, { disabled }),
619
1135
  ...props
620
1136
  }),
621
1137
  /* @__PURE__ */ jsxs(InputGroupAddon, {
622
1138
  align: "inline-end",
623
1139
  children: [showTrigger && /* @__PURE__ */ jsx(InputGroupButton, {
624
- size: "icon-xs",
1140
+ size: "icon-sm",
625
1141
  variant: "ghost",
626
- asChild: true,
1142
+ render: /* @__PURE__ */ jsx(ComboboxTrigger, {}),
627
1143
  "data-slot": "input-group-button",
628
1144
  className: "group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent",
629
- disabled,
630
- children: /* @__PURE__ */ jsx(ComboboxTrigger, {})
1145
+ disabled
631
1146
  }), showClear && /* @__PURE__ */ jsx(ComboboxClear, { disabled })]
632
1147
  }),
633
1148
  children
634
1149
  ]
635
1150
  });
636
- }
1151
+ });
1152
+ ComboboxInput.displayName = "ComboboxInput";
637
1153
  function ComboboxContent({ className, side = "bottom", sideOffset = 6, align = "start", alignOffset = 0, anchor, ...props }) {
638
1154
  return /* @__PURE__ */ jsx(Combobox$1.Portal, { children: /* @__PURE__ */ jsx(Combobox$1.Positioner, {
639
1155
  side,
@@ -645,7 +1161,7 @@ function ComboboxContent({ className, side = "bottom", sideOffset = 6, align = "
645
1161
  children: /* @__PURE__ */ jsx(Combobox$1.Popup, {
646
1162
  "data-slot": "combobox-content",
647
1163
  "data-chips": !!anchor,
648
- className: cn("bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-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 ring-foreground/10 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:border-input/30 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 shadow-md ring-1 duration-100 data-[chips=true]:min-w-(--anchor-width) *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:shadow-none", className),
1164
+ className: cn("group/combobox-content relative max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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]: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),
649
1165
  ...props
650
1166
  })
651
1167
  }) });
@@ -653,19 +1169,19 @@ function ComboboxContent({ className, side = "bottom", sideOffset = 6, align = "
653
1169
  function ComboboxList({ className, ...props }) {
654
1170
  return /* @__PURE__ */ jsx(Combobox$1.List, {
655
1171
  "data-slot": "combobox-list",
656
- 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),
1172
+ className: cn("no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 outline-hidden data-empty:p-0", className),
657
1173
  ...props
658
1174
  });
659
1175
  }
660
1176
  function ComboboxItem({ className, children, ...props }) {
661
1177
  return /* @__PURE__ */ jsxs(Combobox$1.Item, {
662
1178
  "data-slot": "combobox-item",
663
- className: cn("data-highlighted:bg-accent data-highlighted:text-accent-foreground 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-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
1179
+ className: cn("relative flex w-full cursor-default items-center gap-2 rounded-md p-2 pr-8 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),
664
1180
  ...props,
665
1181
  children: [children, /* @__PURE__ */ jsx(Combobox$1.ItemIndicator, {
666
1182
  "data-slot": "combobox-item-indicator",
667
- render: /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center" }),
668
- children: /* @__PURE__ */ jsx(CheckIcon, { className: "pointer-events-none size-4 pointer-coarse:size-5" })
1183
+ render: /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center text-primary" }),
1184
+ children: /* @__PURE__ */ jsx(CheckIcon, { className: "pointer-events-none" })
669
1185
  })]
670
1186
  });
671
1187
  }
@@ -679,7 +1195,7 @@ function ComboboxGroup({ className, ...props }) {
679
1195
  function ComboboxLabel({ className, ...props }) {
680
1196
  return /* @__PURE__ */ jsx(Combobox$1.GroupLabel, {
681
1197
  "data-slot": "combobox-label",
682
- className: cn("text-muted-foreground px-2 py-1.5 text-xs pointer-coarse:px-3 pointer-coarse:py-2 pointer-coarse:text-sm", className),
1198
+ className: cn("p-2 text-xs text-muted-foreground", className),
683
1199
  ...props
684
1200
  });
685
1201
  }
@@ -692,14 +1208,14 @@ function ComboboxCollection({ ...props }) {
692
1208
  function ComboboxEmpty({ className, ...props }) {
693
1209
  return /* @__PURE__ */ jsx(Combobox$1.Empty, {
694
1210
  "data-slot": "combobox-empty",
695
- className: cn("text-muted-foreground hidden w-full justify-center py-2 text-center text-sm group-data-empty/combobox-content:flex", className),
1211
+ className: cn("hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex", className),
696
1212
  ...props
697
1213
  });
698
1214
  }
699
1215
  function ComboboxSeparator({ className, ...props }) {
700
1216
  return /* @__PURE__ */ jsx(Combobox$1.Separator, {
701
1217
  "data-slot": "combobox-separator",
702
- className: cn("bg-border -mx-1 my-1 h-px", className),
1218
+ className: cn("-mx-1 my-1 h-px bg-border", className),
703
1219
  ...props
704
1220
  });
705
1221
  }
@@ -707,7 +1223,7 @@ const ComboboxChips = React$1.forwardRef(({ className, ...props }, ref) => {
707
1223
  return /* @__PURE__ */ jsx(Combobox$1.Chips, {
708
1224
  ref,
709
1225
  "data-slot": "combobox-chips",
710
- className: cn("dark:bg-input/30 border-input focus-within:border-ring focus-within:ring-ring/50 has-aria-invalid:ring-destructive/20 dark:has-aria-invalid:ring-destructive/40 has-aria-invalid:border-destructive dark:has-aria-invalid:border-destructive/50 flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border bg-transparent bg-clip-padding px-2.5 py-1.5 text-sm shadow-xs transition-[color,box-shadow] focus-within:ring-[3px] has-aria-invalid:ring-[3px] has-data-[slot=combobox-chip]:px-1.5", className),
1226
+ className: cn("flex min-h-10 flex-wrap items-center gap-1 rounded-md border border-input bg-transparent bg-clip-padding py-2 pl-3 pr-2 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40", className),
711
1227
  ...props
712
1228
  });
713
1229
  });
@@ -715,13 +1231,12 @@ ComboboxChips.displayName = "ComboboxChips";
715
1231
  function ComboboxChip({ className, children, showRemove = true, ...props }) {
716
1232
  return /* @__PURE__ */ jsxs(Combobox$1.Chip, {
717
1233
  "data-slot": "combobox-chip",
718
- className: cn("bg-muted text-foreground flex h-[calc(--spacing(5.5))] w-fit items-center justify-center gap-1 rounded-sm px-1.5 text-xs font-medium whitespace-nowrap has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0", className),
1234
+ className: cn("flex h-6 w-fit items-center justify-center gap-1 rounded-md 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),
719
1235
  ...props,
720
1236
  children: [children, showRemove && /* @__PURE__ */ jsx(Combobox$1.ChipRemove, {
721
- "aria-label": "Remove item",
722
1237
  render: /* @__PURE__ */ jsx(Button, {
723
1238
  variant: "ghost",
724
- size: "icon-xs"
1239
+ size: "icon-sm"
725
1240
  }),
726
1241
  className: "-ml-1 opacity-50 hover:opacity-100",
727
1242
  "data-slot": "combobox-chip-remove",
@@ -743,78 +1258,84 @@ function useComboboxAnchor() {
743
1258
  //#endregion
744
1259
  //#region src/components/dialog.tsx
745
1260
  function Dialog({ ...props }) {
746
- return /* @__PURE__ */ jsx(DialogPrimitive.Root, {
1261
+ return /* @__PURE__ */ jsx(Dialog$1.Root, {
747
1262
  "data-slot": "dialog",
748
1263
  ...props
749
1264
  });
750
1265
  }
751
1266
  function DialogTrigger({ ...props }) {
752
- return /* @__PURE__ */ jsx(DialogPrimitive.Trigger, {
1267
+ return /* @__PURE__ */ jsx(Dialog$1.Trigger, {
753
1268
  "data-slot": "dialog-trigger",
754
1269
  ...props
755
1270
  });
756
1271
  }
757
1272
  function DialogPortal({ ...props }) {
758
- return /* @__PURE__ */ jsx(DialogPrimitive.Portal, {
1273
+ return /* @__PURE__ */ jsx(Dialog$1.Portal, {
759
1274
  "data-slot": "dialog-portal",
760
1275
  ...props
761
1276
  });
762
1277
  }
763
1278
  function DialogClose({ ...props }) {
764
- return /* @__PURE__ */ jsx(DialogPrimitive.Close, {
1279
+ return /* @__PURE__ */ jsx(Dialog$1.Close, {
765
1280
  "data-slot": "dialog-close",
766
1281
  ...props
767
1282
  });
768
1283
  }
769
1284
  function DialogOverlay({ className, ...props }) {
770
- return /* @__PURE__ */ jsx(DialogPrimitive.Overlay, {
1285
+ return /* @__PURE__ */ jsx(Dialog$1.Backdrop, {
771
1286
  "data-slot": "dialog-overlay",
772
- className: cn("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50", className),
1287
+ className: cn("fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0", className),
773
1288
  ...props
774
1289
  });
775
1290
  }
776
- function DialogContent({ className, children, ...props }) {
777
- return /* @__PURE__ */ jsxs(DialogPortal, {
778
- "data-slot": "dialog-portal",
779
- children: [/* @__PURE__ */ jsx(DialogOverlay, {}), /* @__PURE__ */ jsxs(DialogPrimitive.Content, {
780
- "data-slot": "dialog-content",
781
- 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),
782
- ...props,
783
- children: [children, /* @__PURE__ */ jsxs(DialogPrimitive.Close, {
784
- 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",
785
- children: [/* @__PURE__ */ jsx(CloseOutline, {}), /* @__PURE__ */ jsx("span", {
786
- className: "sr-only",
787
- children: "Close"
788
- })]
1291
+ function DialogContent({ className, children, showCloseButton = true, ...props }) {
1292
+ return /* @__PURE__ */ jsxs(DialogPortal, { children: [/* @__PURE__ */ jsx(DialogOverlay, {}), /* @__PURE__ */ jsxs(Dialog$1.Popup, {
1293
+ "data-slot": "dialog-content",
1294
+ className: cn("fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl ring-1 ring-foreground/10 bg-background px-6 py-4 text-sm duration-100 outline-none sm:max-w-md 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),
1295
+ ...props,
1296
+ children: [children, showCloseButton && /* @__PURE__ */ jsxs(Dialog$1.Close, {
1297
+ "data-slot": "dialog-close",
1298
+ render: /* @__PURE__ */ jsx(Button, {
1299
+ variant: "ghost",
1300
+ className: "absolute top-3 right-4",
1301
+ size: "icon-sm"
1302
+ }),
1303
+ children: [/* @__PURE__ */ jsx(XIcon, {}), /* @__PURE__ */ jsx("span", {
1304
+ className: "sr-only",
1305
+ children: "Close"
789
1306
  })]
790
1307
  })]
791
- });
1308
+ })] });
792
1309
  }
793
1310
  function DialogHeader({ className, ...props }) {
794
1311
  return /* @__PURE__ */ jsx("div", {
795
1312
  "data-slot": "dialog-header",
796
- className: cn("flex flex-col gap-2 text-center sm:text-left", className),
1313
+ className: cn("flex flex-col gap-2", className),
797
1314
  ...props
798
1315
  });
799
1316
  }
800
- function DialogFooter({ className, ...props }) {
801
- return /* @__PURE__ */ jsx("div", {
1317
+ function DialogFooter({ className, showCloseButton = false, children, ...props }) {
1318
+ return /* @__PURE__ */ jsxs("div", {
802
1319
  "data-slot": "dialog-footer",
803
1320
  className: cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className),
804
- ...props
1321
+ ...props,
1322
+ children: [children, showCloseButton && /* @__PURE__ */ jsx(Dialog$1.Close, {
1323
+ render: /* @__PURE__ */ jsx(Button, { variant: "outline" }),
1324
+ children: "Close"
1325
+ })]
805
1326
  });
806
1327
  }
807
1328
  function DialogTitle({ className, ...props }) {
808
- return /* @__PURE__ */ jsx(DialogPrimitive.Title, {
1329
+ return /* @__PURE__ */ jsx(Dialog$1.Title, {
809
1330
  "data-slot": "dialog-title",
810
- className: cn("text-lg leading-none font-semibold", className),
1331
+ className: cn("text-lg font-bold leading-normal", className),
811
1332
  ...props
812
1333
  });
813
1334
  }
814
1335
  function DialogDescription({ className, ...props }) {
815
- return /* @__PURE__ */ jsx(DialogPrimitive.Description, {
1336
+ return /* @__PURE__ */ jsx(Dialog$1.Description, {
816
1337
  "data-slot": "dialog-description",
817
- className: cn("text-muted-foreground text-sm", className),
1338
+ className: cn("text-sm leading-normal text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground", className),
818
1339
  ...props
819
1340
  });
820
1341
  }
@@ -899,253 +1420,941 @@ function CommandShortcut({ className, ...props }) {
899
1420
 
900
1421
  //#endregion
901
1422
  //#region src/components/country-flag.tsx
902
- const additionalCountryCodeMappings = {
903
- BQ: "ABW",
904
- BES: "ABW",
905
- CW: "ABW",
906
- SX: "ABW"
907
- };
908
1423
  const sizeMap = {
909
- xs: "size-2",
910
1424
  sm: "size-3",
911
1425
  md: "size-4",
912
- lg: "size-4",
1426
+ lg: "size-5",
913
1427
  xl: "size-6"
914
1428
  };
915
1429
  const CountryFlag = ({ countryIsoCode, size = "xl", className, ...otherProps }) => {
916
- const CountryIcons = Icons;
917
- const properCountryCode = (countryIsoCode.length === 3 ? countryIsoCode : getCountryISO3(countryIsoCode)) || additionalCountryCodeMappings[countryIsoCode];
918
- return /* @__PURE__ */ jsx(properCountryCode ? CountryIcons["Flag" + capitalizeFirstLetter(properCountryCode.toLowerCase())] : CountryIcons["FlagAbw"], {
1430
+ return /* @__PURE__ */ jsx(FLAGS[countryIsoCode.toLowerCase()] ?? FlagUs, {
919
1431
  className: cn("flex-none", sizeMap[size], className),
920
1432
  ...otherProps
921
1433
  });
922
1434
  };
923
- function capitalizeFirstLetter(val) {
924
- return String(val).charAt(0).toUpperCase() + String(val).slice(1);
1435
+
1436
+ //#endregion
1437
+ //#region src/components/table.tsx
1438
+ const Table = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", {
1439
+ "data-slot": "table-container",
1440
+ className: "relative w-full overflow-x-auto",
1441
+ children: /* @__PURE__ */ jsx("table", {
1442
+ ref,
1443
+ "data-slot": "table",
1444
+ className: cn("w-full caption-bottom text-sm", className),
1445
+ ...props
1446
+ })
1447
+ }));
1448
+ Table.displayName = "Table";
1449
+ const TableHeader = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("thead", {
1450
+ ref,
1451
+ "data-slot": "table-header",
1452
+ className: cn("[&_tr]:border-b", className),
1453
+ ...props
1454
+ }));
1455
+ TableHeader.displayName = "TableHeader";
1456
+ const TableBody = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("tbody", {
1457
+ ref,
1458
+ "data-slot": "table-body",
1459
+ className: cn("[&_tr:last-child]:border-0", className),
1460
+ ...props
1461
+ }));
1462
+ TableBody.displayName = "TableBody";
1463
+ const TableFooter = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("tfoot", {
1464
+ ref,
1465
+ "data-slot": "table-footer",
1466
+ className: cn("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", className),
1467
+ ...props
1468
+ }));
1469
+ TableFooter.displayName = "TableFooter";
1470
+ const TableRow = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("tr", {
1471
+ ref,
1472
+ "data-slot": "table-row",
1473
+ className: cn("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted", className),
1474
+ ...props
1475
+ }));
1476
+ TableRow.displayName = "TableRow";
1477
+ const TableHead = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("th", {
1478
+ ref,
1479
+ "data-slot": "table-head",
1480
+ className: cn("h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0", className),
1481
+ ...props
1482
+ }));
1483
+ TableHead.displayName = "TableHead";
1484
+ const TableCell = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("td", {
1485
+ ref,
1486
+ "data-slot": "table-cell",
1487
+ className: cn("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0", className),
1488
+ ...props
1489
+ }));
1490
+ TableCell.displayName = "TableCell";
1491
+ const TableCaption = React$1.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("caption", {
1492
+ ref,
1493
+ "data-slot": "table-caption",
1494
+ className: cn("mt-4 text-sm text-muted-foreground", className),
1495
+ ...props
1496
+ }));
1497
+ TableCaption.displayName = "TableCaption";
1498
+
1499
+ //#endregion
1500
+ //#region src/components/data-table.tsx
1501
+ function DataTable({ columns, data, tableOptions, noResultsMessage = "No results." }) {
1502
+ const table = useReactTable({
1503
+ data,
1504
+ columns,
1505
+ getCoreRowModel: getCoreRowModel(),
1506
+ ...tableOptions
1507
+ });
1508
+ return /* @__PURE__ */ jsxs(Table, { children: [/* @__PURE__ */ jsx(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx(TableRow, { children: headerGroup.headers.map((header) => /* @__PURE__ */ jsx(TableHead, { children: header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext()) }, header.id)) }, headerGroup.id)) }), /* @__PURE__ */ jsx(TableBody, { children: table.getRowModel().rows.length ? table.getRowModel().rows.map((row) => /* @__PURE__ */ jsx(TableRow, {
1509
+ "data-state": row.getIsSelected() && "selected",
1510
+ children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx(TableCell, { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id))
1511
+ }, row.id)) : /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, {
1512
+ colSpan: columns.length,
1513
+ className: "h-24 text-center",
1514
+ children: noResultsMessage
1515
+ }) }) })] });
1516
+ }
1517
+
1518
+ //#endregion
1519
+ //#region src/components/scroll-area.tsx
1520
+ function ScrollArea({ className, children, scrollFade = false, scrollbarGutter = false, ...props }) {
1521
+ return /* @__PURE__ */ jsxs(ScrollAreaPrimitive.Root, {
1522
+ className: cn("size-full min-h-0", className),
1523
+ ...props,
1524
+ children: [
1525
+ /* @__PURE__ */ jsx(ScrollAreaPrimitive.Viewport, {
1526
+ className: cn("h-full rounded-[inherit] outline-none transition-shadows focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-has-overflow-y:overscroll-y-contain data-has-overflow-x:overscroll-x-contain", scrollFade && "mask-t-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-y-start)))] mask-b-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-y-end)))] mask-l-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-x-start)))] mask-r-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-x-end)))] [--fade-size:1.5rem]", scrollbarGutter && "data-has-overflow-y:pe-2.5 data-has-overflow-x:pb-2.5"),
1527
+ "data-slot": "scroll-area-viewport",
1528
+ children
1529
+ }),
1530
+ /* @__PURE__ */ jsx(ScrollBar, { orientation: "vertical" }),
1531
+ /* @__PURE__ */ jsx(ScrollBar, { orientation: "horizontal" }),
1532
+ /* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, { "data-slot": "scroll-area-corner" })
1533
+ ]
1534
+ });
1535
+ }
1536
+ function ScrollBar({ className, orientation = "vertical", ...props }) {
1537
+ return /* @__PURE__ */ jsx(ScrollAreaPrimitive.Scrollbar, {
1538
+ className: cn("m-1 flex opacity-0 transition-opacity delay-300 data-[orientation=horizontal]:h-1.5 data-[orientation=vertical]:w-1.5 data-[orientation=horizontal]:flex-col data-hovering:opacity-100 data-scrolling:opacity-100 data-hovering:delay-0 data-scrolling:delay-0 data-hovering:duration-100 data-scrolling:duration-100", className),
1539
+ "data-slot": "scroll-area-scrollbar",
1540
+ orientation,
1541
+ ...props,
1542
+ children: /* @__PURE__ */ jsx(ScrollAreaPrimitive.Thumb, {
1543
+ className: "relative flex-1 rounded-full bg-foreground/20",
1544
+ "data-slot": "scroll-area-thumb"
1545
+ })
1546
+ });
925
1547
  }
926
1548
 
927
1549
  //#endregion
928
1550
  //#region src/components/drawer.tsx
929
- function Drawer({ ...props }) {
930
- return /* @__PURE__ */ jsx(Drawer$1.Root, {
931
- "data-slot": "drawer",
932
- ...props
1551
+ const DrawerContext = createContext({ position: "bottom" });
1552
+ const directionMap = {
1553
+ bottom: "down",
1554
+ left: "left",
1555
+ right: "right",
1556
+ top: "up"
1557
+ };
1558
+ const DrawerCreateHandle = DrawerPrimitive.createHandle;
1559
+ function Drawer({ swipeDirection, position = "bottom", ...props }) {
1560
+ return /* @__PURE__ */ jsx(DrawerContext.Provider, {
1561
+ value: { position },
1562
+ children: /* @__PURE__ */ jsx(DrawerPrimitive.Root, {
1563
+ swipeDirection: swipeDirection ?? directionMap[position],
1564
+ ...props
1565
+ })
933
1566
  });
934
1567
  }
935
- function DrawerTrigger({ ...props }) {
936
- return /* @__PURE__ */ jsx(Drawer$1.Trigger, {
1568
+ const DrawerPortal = DrawerPrimitive.Portal;
1569
+ function DrawerTrigger(props) {
1570
+ return /* @__PURE__ */ jsx(DrawerPrimitive.Trigger, {
937
1571
  "data-slot": "drawer-trigger",
938
1572
  ...props
939
1573
  });
940
1574
  }
941
- function DrawerPortal({ ...props }) {
942
- return /* @__PURE__ */ jsx(Drawer$1.Portal, {
943
- "data-slot": "drawer-portal",
1575
+ function DrawerClose(props) {
1576
+ return /* @__PURE__ */ jsx(DrawerPrimitive.Close, {
1577
+ "data-slot": "drawer-close",
944
1578
  ...props
945
1579
  });
946
1580
  }
947
- function DrawerClose({ ...props }) {
948
- return /* @__PURE__ */ jsx(Drawer$1.Close, {
949
- "data-slot": "drawer-close",
1581
+ function DrawerSwipeArea({ className, position: positionProp, ...props }) {
1582
+ const { position: contextPosition } = useContext(DrawerContext);
1583
+ const position = positionProp ?? contextPosition;
1584
+ return /* @__PURE__ */ jsx(DrawerPrimitive.SwipeArea, {
1585
+ className: cn("fixed z-50 touch-none", position === "bottom" && "inset-x-0 bottom-0 h-8", position === "top" && "inset-x-0 top-0 h-8", position === "left" && "inset-y-0 left-0 w-8", position === "right" && "inset-y-0 right-0 w-8", className),
1586
+ "data-slot": "drawer-swipe-area",
950
1587
  ...props
951
1588
  });
952
1589
  }
953
- const DrawerOverlay = React$1.forwardRef(({ className, ...props }, forwardedRef) => {
954
- return /* @__PURE__ */ jsx(Drawer$1.Overlay, {
955
- "data-slot": "drawer-overlay",
956
- className: cn("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50", className),
957
- ...props,
958
- ref: forwardedRef
1590
+ function DrawerBackdrop({ className, inContainer, ...props }) {
1591
+ return /* @__PURE__ */ jsx(DrawerPrimitive.Backdrop, {
1592
+ className: cn("inset-0 z-50 bg-black/10 opacity-[calc(1-var(--drawer-swipe-progress))] backdrop-blur-sm transition-opacity duration-450 ease-[cubic-bezier(0.32,0.72,0,1)] data-ending-style:opacity-0 data-starting-style:opacity-0 data-ending-style:duration-[calc(var(--drawer-swipe-strength)*400ms)] data-swiping:duration-0 supports-[-webkit-touch-callout:none]:absolute", inContainer ? "absolute" : "fixed", className),
1593
+ "data-slot": "drawer-backdrop",
1594
+ ...props
959
1595
  });
960
- });
961
- function DrawerContent({ className, children, container, ...props }) {
1596
+ }
1597
+ function DrawerViewport({ className, position, variant = "default", inContainer, ...props }) {
1598
+ return /* @__PURE__ */ jsx(DrawerPrimitive.Viewport, {
1599
+ className: cn("inset-0 z-50 [--bleed:--spacing(12)] [--inset:--spacing(0)]", inContainer ? "absolute" : "fixed", "touch-none", position === "bottom" && "grid grid-rows-[1fr_auto] pt-12", position === "top" && "grid grid-rows-[auto_1fr] pb-12", position === "left" && "flex justify-start", position === "right" && "flex justify-end", variant === "inset" && "px-(--inset) sm:[--inset:--spacing(4)]", variant === "inset" && position !== "bottom" && "pt-(--inset)", variant === "inset" && position !== "top" && "pb-(--inset)", className),
1600
+ "data-slot": "drawer-viewport",
1601
+ ...props
1602
+ });
1603
+ }
1604
+ function DrawerPopup({ className, children, showCloseButton = false, position: positionProp, variant = "default", showBar = false, container, ...props }) {
1605
+ const { position: contextPosition } = useContext(DrawerContext);
1606
+ const position = positionProp ?? contextPosition;
1607
+ const inContainer = !!container;
962
1608
  return /* @__PURE__ */ jsxs(DrawerPortal, {
963
- "data-slot": "drawer-portal",
964
1609
  container,
965
- children: [/* @__PURE__ */ jsx(DrawerOverlay, {}), /* @__PURE__ */ jsxs(Drawer$1.Content, {
966
- "data-slot": "drawer-content",
967
- className: cn("group/drawer-content bg-card fixed z-50 flex h-auto flex-col", "data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[90vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b", "data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[90vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t", "data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm", "data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm", className),
968
- ...props,
969
- children: [/* @__PURE__ */ jsx("div", { className: "bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block" }), children]
1610
+ children: [/* @__PURE__ */ jsx(DrawerBackdrop, { inContainer }), /* @__PURE__ */ jsx(DrawerViewport, {
1611
+ position,
1612
+ variant,
1613
+ inContainer,
1614
+ children: /* @__PURE__ */ jsxs(DrawerPrimitive.Popup, {
1615
+ className: cn("relative flex max-h-full min-h-0 w-full min-w-0 flex-col bg-popover not-dark:bg-clip-padding text-popover-foreground shadow-lg/5 outline-none transition-[transform,box-shadow,height,background-color] duration-450 ease-[cubic-bezier(0.32,0.72,0,1)] will-change-transform [--peek:calc(--spacing(6)-1px)] [--scale-base:calc(max(0,1-(var(--nested-drawers)*var(--stack-step))))] [--scale:clamp(0,calc(var(--scale-base)+(var(--stack-step)*var(--stack-progress))),1)] [--shrink:calc(1-var(--scale))] [--stack-peek-offset:max(0px,calc((var(--nested-drawers)-var(--stack-progress))*var(--peek)))] [--stack-progress:clamp(0,var(--drawer-swipe-progress),1)] [--stack-step:0.05] before:pointer-events-none before:absolute before:inset-0 before:shadow-[0_1px_--theme(--color-black/4%)] after:pointer-events-none after:absolute after:bg-popover data-swiping:select-none data-nested-drawer-open:overflow-hidden data-nested-drawer-open:bg-[color-mix(in_srgb,var(--popover),var(--color-black)_calc(2%*(var(--nested-drawers)-var(--stack-progress))))] data-ending-style:shadow-transparent data-starting-style:shadow-transparent data-ending-style:duration-[calc(var(--drawer-swipe-strength)*400ms)] dark:data-nested-drawer-open:bg-[color-mix(in_srgb,var(--popover),var(--color-black)_calc(6%*(var(--nested-drawers)-var(--stack-progress))))] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]", "touch-none", position === "bottom" && "transform-[translateY(calc(var(--drawer-snap-point-offset)+var(--drawer-swipe-movement-y)))] data-ending-style:transform-[translateY(calc(100%+env(safe-area-inset-bottom,0px)+var(--inset)))] data-starting-style:transform-[translateY(calc(100%+env(safe-area-inset-bottom,0px)+var(--inset)))] row-start-2 -mb-[max(0px,calc(var(--drawer-snap-point-offset,0px)+clamp(0,1,var(--drawer-snap-point-offset,0px)/1px)*var(--drawer-swipe-movement-y,0px)))] border-t pb-[max(0px,calc(env(safe-area-inset-bottom,0px)+var(--drawer-snap-point-offset,0px)+clamp(0,1,var(--drawer-snap-point-offset,0px)/1px)*var(--drawer-swipe-movement-y,0px)))] not-data-starting-style:not-data-ending-style:transition-[transform,box-shadow,height,background-color,margin,padding] after:inset-x-0 after:top-full after:h-(--bleed) has-data-[slot=drawer-bar]:pt-2 data-ending-style:mb-0 data-starting-style:mb-0 data-ending-style:pb-0 data-starting-style:pb-0", position === "top" && "data-starting-style:transform-[translateY(calc(-100%-var(--inset)))] data-ending-style:transform-[translateY(calc(-100%-var(--inset)))] transform-[translateY(var(--drawer-swipe-movement-y))] border-b after:inset-x-0 after:bottom-full after:h-(--bleed) has-data-[slot=drawer-bar]:pb-2", position === "left" && "data-starting-style:transform-[translateX(calc(-100%-var(--inset)))] data-ending-style:transform-[translateX(calc(-100%-var(--inset)))] transform-[translateX(var(--drawer-swipe-movement-x))] w-[calc(100%-(--spacing(12)))] max-w-md border-e after:inset-y-0 after:end-full after:w-(--bleed) has-data-[slot=drawer-bar]:pe-2", position === "right" && "transform-[translateX(var(--drawer-swipe-movement-x))] data-ending-style:transform-[translateX(calc(100%+var(--inset)))] data-starting-style:transform-[translateX(calc(100%+var(--inset)))] col-start-2 w-[calc(100%-(--spacing(12)))] max-w-md border-s after:inset-y-0 after:start-full after:w-(--bleed) has-data-[slot=drawer-bar]:ps-2", variant !== "straight" && cn(position === "bottom" && "rounded-t-2xl", position === "top" && "rounded-b-2xl **:data-[slot=drawer-footer]:rounded-b-[calc(var(--radius-2xl)-1px)]", position === "left" && "rounded-e-2xl **:data-[slot=drawer-footer]:rounded-ee-[calc(var(--radius-2xl)-1px)]", position === "right" && "rounded-s-2xl **:data-[slot=drawer-footer]:rounded-es-[calc(var(--radius-2xl)-1px)]"), variant === "default" && cn(position === "bottom" && "before:rounded-t-[calc(var(--radius-2xl)-1px)]", position === "top" && "before:rounded-b-[calc(var(--radius-2xl)-1px)]", position === "left" && "before:rounded-e-[calc(var(--radius-2xl)-1px)]", position === "right" && "before:rounded-s-[calc(var(--radius-2xl)-1px)]"), variant === "inset" && "before:hidden sm:rounded-2xl sm:border sm:after:bg-transparent sm:before:rounded-[calc(var(--radius-2xl)-1px)] sm:**:data-[slot=drawer-footer]:rounded-b-[calc(var(--radius-2xl)-1px)]", variant === "straight" && "[--stack-step:0]", (position === "bottom" || position === "top") && "h-(--drawer-height,auto) [--height:max(0px,calc(var(--drawer-frontmost-height,var(--drawer-height))))] data-nested-drawer-open:h-(--height)", position === "bottom" && "data-nested-drawer-open:transform-[translateY(calc(var(--drawer-swipe-movement-y)-var(--stack-peek-offset)-(var(--shrink)*var(--height))))_scale(var(--scale))] origin-[50%_calc(100%-var(--inset))]", position === "top" && "data-nested-drawer-open:transform-[translateY(calc(var(--drawer-swipe-movement-y)+var(--stack-peek-offset)+(var(--shrink)*var(--height))))_scale(var(--scale))] origin-[50%_var(--inset)]", position === "left" && "data-nested-drawer-open:transform-[translateX(calc(var(--drawer-swipe-movement-x)+var(--stack-peek-offset)))_scale(var(--scale))] origin-right", position === "right" && "data-nested-drawer-open:transform-[translateX(calc(var(--drawer-swipe-movement-x)-var(--stack-peek-offset)))_scale(var(--scale))] origin-left", className),
1616
+ "data-slot": "drawer-popup",
1617
+ ...props,
1618
+ children: [
1619
+ children,
1620
+ showCloseButton && /* @__PURE__ */ jsx(DrawerPrimitive.Close, {
1621
+ "aria-label": "Close",
1622
+ className: "absolute end-2 top-2",
1623
+ render: /* @__PURE__ */ jsx(Button, {
1624
+ size: "icon",
1625
+ variant: "ghost"
1626
+ }),
1627
+ children: /* @__PURE__ */ jsx(XIcon, {})
1628
+ }),
1629
+ showBar && /* @__PURE__ */ jsx(DrawerBar, {})
1630
+ ]
1631
+ })
970
1632
  })]
971
1633
  });
972
1634
  }
973
- function DrawerHeader({ className, ...props }) {
974
- return /* @__PURE__ */ jsx("div", {
975
- "data-slot": "drawer-header",
976
- className: cn("flex flex-col gap-1.5 p-4", className),
977
- ...props
1635
+ function DrawerHeader({ className, allowSelection = false, render, ...props }) {
1636
+ return useRender({
1637
+ defaultTagName: "div",
1638
+ props: mergeProps({
1639
+ className: cn("flex flex-col gap-2 p-6 in-[[data-slot=drawer-popup]:has([data-slot=drawer-panel])]:pb-3 max-sm:pb-4", !allowSelection && "cursor-default", className),
1640
+ "data-slot": "drawer-header"
1641
+ }, props),
1642
+ render: allowSelection ? /* @__PURE__ */ jsx(DrawerContent, { render }) : render
978
1643
  });
979
1644
  }
980
- function DrawerFooter({ className, ...props }) {
981
- return /* @__PURE__ */ jsx("div", {
982
- "data-slot": "drawer-footer",
983
- className: cn("mt-auto flex flex-col gap-2 p-4", className),
984
- ...props
1645
+ function DrawerFooter({ className, variant = "default", allowSelection = true, render, ...props }) {
1646
+ return useRender({
1647
+ defaultTagName: "div",
1648
+ props: mergeProps({
1649
+ className: cn("flex flex-col-reverse gap-2 px-6 pb-(--safe-area-inset-bottom,0px) sm:flex-row sm:justify-end", !allowSelection && "cursor-default", variant === "default" && "border-t bg-muted/72 pt-4 pb-[calc(env(safe-area-inset-bottom,0px)+--spacing(4))]", variant === "bare" && "in-[[data-slot=drawer-popup]:has([data-slot=drawer-panel])]:pt-3 pt-4 pb-[calc(env(safe-area-inset-bottom,0px)+--spacing(6))]", className),
1650
+ "data-slot": "drawer-footer"
1651
+ }, props),
1652
+ render: allowSelection ? /* @__PURE__ */ jsx(DrawerContent, { render }) : render
985
1653
  });
986
1654
  }
987
1655
  function DrawerTitle({ className, ...props }) {
988
- return /* @__PURE__ */ jsx(Drawer$1.Title, {
1656
+ return /* @__PURE__ */ jsx(DrawerPrimitive.Title, {
1657
+ className: cn("font-heading font-semibold text-xl leading-none", className),
989
1658
  "data-slot": "drawer-title",
990
- className: cn("text-foreground font-semibold", className),
991
1659
  ...props
992
1660
  });
993
1661
  }
994
1662
  function DrawerDescription({ className, ...props }) {
995
- return /* @__PURE__ */ jsx(Drawer$1.Description, {
996
- "data-slot": "drawer-description",
1663
+ return /* @__PURE__ */ jsx(DrawerPrimitive.Description, {
997
1664
  className: cn("text-muted-foreground text-sm", className),
1665
+ "data-slot": "drawer-description",
1666
+ ...props
1667
+ });
1668
+ }
1669
+ function DrawerPanel({ className, scrollFade = true, scrollable = true, allowSelection = true, render, ...props }) {
1670
+ const content = useRender({
1671
+ defaultTagName: "div",
1672
+ props: mergeProps({
1673
+ className: cn("p-6 in-[[data-slot=drawer-popup]:has([data-slot=drawer-header])]:pt-1 in-[[data-slot=drawer-popup]:has([data-slot=drawer-footer]:not(.border-t))]:pb-1", !allowSelection && "cursor-default", className),
1674
+ "data-slot": "drawer-panel"
1675
+ }, props),
1676
+ render: allowSelection ? /* @__PURE__ */ jsx(DrawerContent, { render }) : render
1677
+ });
1678
+ if (scrollable) return /* @__PURE__ */ jsx(ScrollArea, {
1679
+ className: "touch-auto",
1680
+ scrollFade,
1681
+ children: content
1682
+ });
1683
+ return content;
1684
+ }
1685
+ function DrawerBar({ className, position: positionProp, render, ...props }) {
1686
+ const { position: contextPosition } = useContext(DrawerContext);
1687
+ const position = positionProp ?? contextPosition;
1688
+ const horizontal = position === "left" || position === "right";
1689
+ return useRender({
1690
+ defaultTagName: "div",
1691
+ props: mergeProps({
1692
+ "aria-hidden": true,
1693
+ className: cn("absolute flex touch-none items-center justify-center p-3 before:rounded-full before:bg-input", horizontal ? "inset-y-0 before:h-12 before:w-1" : "inset-x-0 before:h-1 before:w-12", position === "top" && "bottom-0", position === "bottom" && "top-0", position === "left" && "right-0", position === "right" && "left-0", className),
1694
+ "data-slot": "drawer-bar"
1695
+ }, props),
1696
+ render
1697
+ });
1698
+ }
1699
+ const DrawerContent = DrawerPrimitive.Content;
1700
+ function DrawerMenu({ className, render, ...props }) {
1701
+ return useRender({
1702
+ defaultTagName: "nav",
1703
+ props: mergeProps({
1704
+ className: cn("-m-2 flex flex-col", className),
1705
+ "data-slot": "drawer-menu"
1706
+ }, props),
1707
+ render
1708
+ });
1709
+ }
1710
+ function DrawerMenuItem({ className, variant = "default", render, disabled, ...props }) {
1711
+ return useRender({
1712
+ defaultTagName: "button",
1713
+ props: mergeProps({
1714
+ className: cn("flex min-h-9 w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-64 data-[variant=destructive]:text-destructive-foreground sm:min-h-8 sm:text-sm [&>svg:not([class*='opacity-'])]:opacity-80 [&>svg:not([class*='size-'])]:size-4.5 sm:[&>svg:not([class*='size-'])]:size-4 [&>svg]:pointer-events-none [&>svg]:-mx-0.5 [&>svg]:shrink-0", className),
1715
+ "data-slot": "drawer-menu-item",
1716
+ "data-variant": variant,
1717
+ disabled,
1718
+ type: "button"
1719
+ }, props),
1720
+ render
1721
+ });
1722
+ }
1723
+ function DrawerMenuSeparator({ className, render, ...props }) {
1724
+ return useRender({
1725
+ defaultTagName: "div",
1726
+ props: mergeProps({
1727
+ className: cn("mx-2 my-1 h-px bg-border", className),
1728
+ "data-slot": "drawer-menu-separator"
1729
+ }, props),
1730
+ render
1731
+ });
1732
+ }
1733
+ function DrawerMenuGroup({ className, render, ...props }) {
1734
+ return useRender({
1735
+ defaultTagName: "div",
1736
+ props: mergeProps({
1737
+ className: cn("flex flex-col", className),
1738
+ "data-slot": "drawer-menu-group"
1739
+ }, props),
1740
+ render
1741
+ });
1742
+ }
1743
+ function DrawerMenuGroupLabel({ className, render, ...props }) {
1744
+ return useRender({
1745
+ defaultTagName: "div",
1746
+ props: mergeProps({
1747
+ className: cn("px-2 py-1.5 font-medium text-muted-foreground text-xs", className),
1748
+ "data-slot": "drawer-menu-group-label"
1749
+ }, props),
1750
+ render
1751
+ });
1752
+ }
1753
+ function DrawerMenuTrigger({ className, children, ...props }) {
1754
+ return /* @__PURE__ */ jsxs(DrawerTrigger, {
1755
+ className: cn("flex min-h-9 w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none hover:bg-accent hover:text-accent-foreground sm:min-h-8 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className),
1756
+ "data-slot": "drawer-menu-trigger",
1757
+ ...props,
1758
+ children: [children, /* @__PURE__ */ jsx(ChevronRightIcon, { className: "ms-auto -me-0.5 opacity-80" })]
1759
+ });
1760
+ }
1761
+ function DrawerMenuCheckboxItem({ className, children, checked, defaultChecked, onCheckedChange, variant = "default", disabled, render, ...props }) {
1762
+ return /* @__PURE__ */ jsx(Checkbox$1.Root, {
1763
+ checked,
1764
+ className: cn("grid min-h-9 w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none hover:bg-accent hover:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-64 sm:min-h-8 sm:text-sm [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:-mx-0.5 [&_svg]:shrink-0", variant === "switch" ? "grid-cols-[1fr_auto] gap-4 pe-1.5" : "grid-cols-[1rem_1fr] pe-4", className),
1765
+ "data-slot": "drawer-menu-checkbox-item",
1766
+ defaultChecked,
1767
+ disabled,
1768
+ onCheckedChange,
1769
+ render,
1770
+ ...props,
1771
+ children: variant === "switch" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
1772
+ className: "col-start-1",
1773
+ children
1774
+ }), /* @__PURE__ */ jsx(Checkbox$1.Indicator, {
1775
+ className: "inset-shadow-[0_1px_--theme(--color-black/4%)] col-start-2 inline-flex h-[calc(var(--thumb-size)+2px)] w-[calc(var(--thumb-size)*2-2px)] shrink-0 items-center rounded-full p-px outline-none transition-[background-color,box-shadow] duration-200 [--thumb-size:--spacing(4)] focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input data-disabled:opacity-64 sm:[--thumb-size:--spacing(3)]",
1776
+ keepMounted: true,
1777
+ children: /* @__PURE__ */ jsx("span", { className: "pointer-events-none block aspect-square h-full in-[[data-slot=drawer-menu-checkbox-item][data-checked]]:origin-[var(--thumb-size)_50%] origin-left in-[[data-slot=drawer-menu-checkbox-item][data-checked]]:translate-x-[calc(var(--thumb-size)-4px)] in-[[data-slot=drawer-menu-checkbox-item]:active]:not-data-disabled:scale-x-110 in-[[data-slot=drawer-menu-checkbox-item]:active]:rounded-[var(--thumb-size)/calc(var(--thumb-size)*1.10)] rounded-(--thumb-size) bg-background shadow-sm/5 will-change-transform [transition:translate_.15s,border-radius_.15s,scale_.1s_.1s,transform-origin_.15s]" })
1778
+ })] }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Checkbox$1.Indicator, {
1779
+ className: "col-start-1",
1780
+ children: /* @__PURE__ */ jsx("svg", {
1781
+ fill: "none",
1782
+ height: "24",
1783
+ stroke: "currentColor",
1784
+ strokeLinecap: "round",
1785
+ strokeLinejoin: "round",
1786
+ strokeWidth: "2",
1787
+ viewBox: "0 0 24 24",
1788
+ width: "24",
1789
+ xmlns: "http://www.w3.org/2000/svg",
1790
+ children: /* @__PURE__ */ jsx("path", { d: "M5.252 12.7 10.2 18.63 18.748 5.37" })
1791
+ })
1792
+ }), /* @__PURE__ */ jsx("span", {
1793
+ className: "col-start-2",
1794
+ children
1795
+ })] })
1796
+ });
1797
+ }
1798
+ function DrawerMenuRadioGroup({ className, ...props }) {
1799
+ return /* @__PURE__ */ jsx(RadioGroup$1, {
1800
+ className: cn("flex flex-col", className),
1801
+ "data-slot": "drawer-menu-radio-group",
998
1802
  ...props
999
1803
  });
1000
1804
  }
1805
+ function DrawerMenuRadioItem({ className, children, value, disabled, render, ...props }) {
1806
+ return /* @__PURE__ */ jsxs(Radio.Root, {
1807
+ className: cn("grid min-h-9 w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none hover:bg-accent hover:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-64 sm:min-h-8 sm:text-sm [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:-mx-0.5 [&_svg]:shrink-0", "grid-cols-[1rem_1fr] items-center pe-4", className),
1808
+ "data-slot": "drawer-menu-radio-item",
1809
+ disabled,
1810
+ render,
1811
+ value,
1812
+ ...props,
1813
+ children: [/* @__PURE__ */ jsx(Radio.Indicator, {
1814
+ className: "col-start-1",
1815
+ children: /* @__PURE__ */ jsx("svg", {
1816
+ fill: "none",
1817
+ height: "24",
1818
+ stroke: "currentColor",
1819
+ strokeLinecap: "round",
1820
+ strokeLinejoin: "round",
1821
+ strokeWidth: "2",
1822
+ viewBox: "0 0 24 24",
1823
+ width: "24",
1824
+ xmlns: "http://www.w3.org/2000/svg",
1825
+ children: /* @__PURE__ */ jsx("path", { d: "M5.252 12.7 10.2 18.63 18.748 5.37" })
1826
+ })
1827
+ }), /* @__PURE__ */ jsx("span", {
1828
+ className: "col-start-2",
1829
+ children
1830
+ })]
1831
+ });
1832
+ }
1001
1833
 
1002
1834
  //#endregion
1003
1835
  //#region src/components/dropdown-menu.tsx
1004
1836
  function DropdownMenu({ ...props }) {
1005
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Root, {
1837
+ return /* @__PURE__ */ jsx(Menu.Root, {
1006
1838
  "data-slot": "dropdown-menu",
1007
1839
  ...props
1008
1840
  });
1009
1841
  }
1010
1842
  function DropdownMenuPortal({ ...props }) {
1011
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, {
1843
+ return /* @__PURE__ */ jsx(Menu.Portal, {
1012
1844
  "data-slot": "dropdown-menu-portal",
1013
1845
  ...props
1014
1846
  });
1015
1847
  }
1016
1848
  function DropdownMenuTrigger({ ...props }) {
1017
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Trigger, {
1849
+ return /* @__PURE__ */ jsx(Menu.Trigger, {
1018
1850
  "data-slot": "dropdown-menu-trigger",
1019
1851
  ...props
1020
1852
  });
1021
1853
  }
1022
- function DropdownMenuContent({ className, sideOffset = 4, container, forceMount, ...props }) {
1023
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, {
1854
+ function DropdownMenuContent({ align = "start", alignOffset = 0, side = "bottom", sideOffset = 4, className, container, ...props }) {
1855
+ return /* @__PURE__ */ jsx(Menu.Portal, {
1024
1856
  container,
1025
- forceMount,
1026
- children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.Content, {
1027
- "data-slot": "dropdown-menu-content",
1857
+ children: /* @__PURE__ */ jsx(Menu.Positioner, {
1858
+ className: "isolate z-50 outline-none",
1859
+ align,
1860
+ alignOffset,
1861
+ side,
1028
1862
  sideOffset,
1029
- 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),
1030
- ...props
1863
+ children: /* @__PURE__ */ jsx(Menu.Popup, {
1864
+ "data-slot": "dropdown-menu-content",
1865
+ className: cn("z-50 max-h-(--available-height) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95", className),
1866
+ ...props
1867
+ })
1031
1868
  })
1032
1869
  });
1033
1870
  }
1034
1871
  function DropdownMenuGroup({ ...props }) {
1035
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Group, {
1872
+ return /* @__PURE__ */ jsx(Menu.Group, {
1036
1873
  "data-slot": "dropdown-menu-group",
1037
1874
  ...props
1038
1875
  });
1039
1876
  }
1877
+ function DropdownMenuLabel({ className, inset, ...props }) {
1878
+ return /* @__PURE__ */ jsx(Menu.GroupLabel, {
1879
+ "data-slot": "dropdown-menu-label",
1880
+ "data-inset": inset,
1881
+ className: cn("px-2 py-1.5 text-xs font-medium text-muted-foreground data-inset:pl-8", className),
1882
+ ...props
1883
+ });
1884
+ }
1040
1885
  function DropdownMenuItem({ className, inset, variant = "default", ...props }) {
1041
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Item, {
1886
+ return /* @__PURE__ */ jsx(Menu.Item, {
1042
1887
  "data-slot": "dropdown-menu-item",
1043
1888
  "data-inset": inset,
1044
1889
  "data-variant": variant,
1045
- 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 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),
1890
+ className: cn("group/dropdown-menu-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive", className),
1891
+ ...props
1892
+ });
1893
+ }
1894
+ function DropdownMenuSub({ ...props }) {
1895
+ return /* @__PURE__ */ jsx(Menu.SubmenuRoot, {
1896
+ "data-slot": "dropdown-menu-sub",
1046
1897
  ...props
1047
1898
  });
1048
1899
  }
1049
- function DropdownMenuCheckboxItem({ className, children, checked, ...props }) {
1050
- return /* @__PURE__ */ jsxs(DropdownMenuPrimitive.CheckboxItem, {
1900
+ function DropdownMenuSubTrigger({ className, inset, children, ...props }) {
1901
+ return /* @__PURE__ */ jsxs(Menu.SubmenuTrigger, {
1902
+ "data-slot": "dropdown-menu-sub-trigger",
1903
+ "data-inset": inset,
1904
+ className: cn("flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-8 data-popup-open:bg-accent data-popup-open:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
1905
+ ...props,
1906
+ children: [children, /* @__PURE__ */ jsx(ChevronRightIcon, { className: "ml-auto" })]
1907
+ });
1908
+ }
1909
+ function DropdownMenuSubContent({ align = "start", alignOffset = -3, side = "right", sideOffset = 0, className, ...props }) {
1910
+ return /* @__PURE__ */ jsx(DropdownMenuContent, {
1911
+ "data-slot": "dropdown-menu-sub-content",
1912
+ className: cn("w-auto min-w-[96px] rounded-md bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 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-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),
1913
+ align,
1914
+ alignOffset,
1915
+ side,
1916
+ sideOffset,
1917
+ ...props
1918
+ });
1919
+ }
1920
+ function DropdownMenuCheckboxItem({ className, children, checked, inset, ...props }) {
1921
+ return /* @__PURE__ */ jsxs(Menu.CheckboxItem, {
1051
1922
  "data-slot": "dropdown-menu-checkbox-item",
1052
- 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),
1923
+ "data-inset": inset,
1924
+ className: cn("relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
1053
1925
  checked,
1054
1926
  ...props,
1055
1927
  children: [/* @__PURE__ */ jsx("span", {
1056
- className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center",
1057
- children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckOutline, { className: "size-4" }) })
1928
+ className: "pointer-events-none absolute right-2 flex items-center justify-center",
1929
+ "data-slot": "dropdown-menu-checkbox-item-indicator",
1930
+ children: /* @__PURE__ */ jsx(Menu.CheckboxItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, {}) })
1058
1931
  }), children]
1059
1932
  });
1060
1933
  }
1061
1934
  function DropdownMenuRadioGroup({ ...props }) {
1062
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.RadioGroup, {
1935
+ return /* @__PURE__ */ jsx(Menu.RadioGroup, {
1063
1936
  "data-slot": "dropdown-menu-radio-group",
1064
1937
  ...props
1065
1938
  });
1066
1939
  }
1067
- function DropdownMenuRadioItem({ className, children, ...props }) {
1068
- return /* @__PURE__ */ jsxs(DropdownMenuPrimitive.RadioItem, {
1940
+ function DropdownMenuRadioItem({ className, children, inset, ...props }) {
1941
+ return /* @__PURE__ */ jsxs(Menu.RadioItem, {
1069
1942
  "data-slot": "dropdown-menu-radio-item",
1070
- 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),
1943
+ "data-inset": inset,
1944
+ className: cn("relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
1071
1945
  ...props,
1072
1946
  children: [/* @__PURE__ */ jsx("span", {
1073
- className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center",
1074
- children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx("div", { className: "size-2 rounded-full bg-current" }) })
1947
+ className: "pointer-events-none absolute right-2 flex items-center justify-center",
1948
+ "data-slot": "dropdown-menu-radio-item-indicator",
1949
+ children: /* @__PURE__ */ jsx(Menu.RadioItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, {}) })
1075
1950
  }), children]
1076
1951
  });
1077
1952
  }
1078
- function DropdownMenuLabel({ className, inset, ...props }) {
1079
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Label, {
1080
- "data-slot": "dropdown-menu-label",
1081
- "data-inset": inset,
1082
- className: cn("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8", className),
1083
- ...props
1084
- });
1085
- }
1086
1953
  function DropdownMenuSeparator({ className, ...props }) {
1087
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Separator, {
1954
+ return /* @__PURE__ */ jsx(Menu.Separator, {
1088
1955
  "data-slot": "dropdown-menu-separator",
1089
- className: cn("bg-border -mx-1 my-1 h-px", className),
1956
+ className: cn("-mx-1 my-1 h-px bg-border", className),
1090
1957
  ...props
1091
1958
  });
1092
1959
  }
1093
1960
  function DropdownMenuShortcut({ className, ...props }) {
1094
1961
  return /* @__PURE__ */ jsx("span", {
1095
1962
  "data-slot": "dropdown-menu-shortcut",
1096
- className: cn("text-muted-foreground ml-auto text-xs tracking-widest", className),
1963
+ className: cn("ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground", className),
1097
1964
  ...props
1098
1965
  });
1099
1966
  }
1100
- function DropdownMenuSub({ ...props }) {
1101
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Sub, {
1102
- "data-slot": "dropdown-menu-sub",
1967
+ function DropdownMenuAddon({ className, ...props }) {
1968
+ return /* @__PURE__ */ jsx("span", {
1969
+ "data-slot": "dropdown-menu-addon",
1970
+ className: cn("ml-auto shrink-0 inline-flex items-center", className),
1103
1971
  ...props
1104
1972
  });
1105
1973
  }
1106
- function DropdownMenuSubTrigger({ className, inset, children, ...props }) {
1107
- return /* @__PURE__ */ jsxs(DropdownMenuPrimitive.SubTrigger, {
1108
- "data-slot": "dropdown-menu-sub-trigger",
1109
- "data-inset": inset,
1110
- 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),
1111
- ...props,
1112
- children: [children, /* @__PURE__ */ jsx(ChevronRightOutline, { className: "ml-auto size-4" })]
1974
+
1975
+ //#endregion
1976
+ //#region src/components/empty.tsx
1977
+ function Empty({ className, ...props }) {
1978
+ return /* @__PURE__ */ jsx("div", {
1979
+ "data-slot": "empty",
1980
+ className: cn("flex min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-lg p-6 text-center text-balance md:p-12", className),
1981
+ ...props
1113
1982
  });
1114
1983
  }
1115
- function DropdownMenuSubContent({ className, ...props }) {
1116
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.SubContent, {
1117
- "data-slot": "dropdown-menu-sub-content",
1118
- 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),
1984
+ function EmptyHeader({ className, ...props }) {
1985
+ return /* @__PURE__ */ jsx("div", {
1986
+ "data-slot": "empty-header",
1987
+ className: cn("flex max-w-sm flex-col items-center gap-2 text-center", className),
1988
+ ...props
1989
+ });
1990
+ }
1991
+ const emptyMediaVariants = cva("flex shrink-0 items-center justify-center mb-2 [&_svg]:pointer-events-none [&_svg]:shrink-0", {
1992
+ variants: { variant: {
1993
+ default: "bg-transparent",
1994
+ icon: "bg-muted text-foreground flex size-8 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-4"
1995
+ } },
1996
+ defaultVariants: { variant: "default" }
1997
+ });
1998
+ function EmptyMedia({ className, variant = "default", ...props }) {
1999
+ return /* @__PURE__ */ jsx("div", {
2000
+ "data-slot": "empty-icon",
2001
+ "data-variant": variant,
2002
+ className: cn(emptyMediaVariants({
2003
+ variant,
2004
+ className
2005
+ })),
2006
+ ...props
2007
+ });
2008
+ }
2009
+ function EmptyTitle({ className, ...props }) {
2010
+ return /* @__PURE__ */ jsx("div", {
2011
+ "data-slot": "empty-title",
2012
+ className: cn("text-sm font-medium tracking-tight", className),
2013
+ ...props
2014
+ });
2015
+ }
2016
+ function EmptyDescription({ className, ...props }) {
2017
+ return /* @__PURE__ */ jsx("div", {
2018
+ "data-slot": "empty-description",
2019
+ className: cn("text-muted-foreground [&>a:hover]:text-primary text-sm [&>a]:underline [&>a]:underline-offset-4", className),
2020
+ ...props
2021
+ });
2022
+ }
2023
+ function EmptyContent({ className, ...props }) {
2024
+ return /* @__PURE__ */ jsx("div", {
2025
+ "data-slot": "empty-content",
2026
+ className: cn("flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance", className),
1119
2027
  ...props
1120
2028
  });
1121
2029
  }
1122
2030
 
2031
+ //#endregion
2032
+ //#region src/components/dropzone.tsx
2033
+ const DropzoneContext = React$1.createContext(null);
2034
+ function useDropzoneContext() {
2035
+ const ctx = React$1.useContext(DropzoneContext);
2036
+ if (!ctx) throw new Error("Dropzone subcomponents must be rendered inside <Dropzone>.");
2037
+ return ctx;
2038
+ }
2039
+ const DEFAULT_ERROR_MESSAGES = {
2040
+ "too-many-files": ({ maxFiles }) => maxFiles === 1 ? "Only one file can be uploaded" : `Only ${maxFiles ?? "a few"} files can be uploaded`,
2041
+ "file-too-large": ({ maxSize }) => maxSize ? `File is too large (max ${formatBytes(maxSize)})` : "File is too large",
2042
+ "file-too-small": ({ minSize }) => minSize ? `File is too small (min ${formatBytes(minSize)})` : "File is too small",
2043
+ "file-invalid-type": () => "This file type isn't allowed"
2044
+ };
2045
+ function formatBytes(bytes) {
2046
+ if (bytes < 1024) return `${bytes} B`;
2047
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`;
2048
+ return `${(bytes / 1024 / 1024).toFixed(0)} MB`;
2049
+ }
2050
+ function parseAccept(accept) {
2051
+ if (!accept) return [];
2052
+ return accept.split(",").map((p) => p.trim().toLowerCase()).filter(Boolean);
2053
+ }
2054
+ function matchesAccept(file, patterns) {
2055
+ if (patterns.length === 0) return true;
2056
+ const fileType = file.type.toLowerCase();
2057
+ const fileName = file.name.toLowerCase();
2058
+ return patterns.some((pattern) => {
2059
+ if (pattern.startsWith(".")) return fileName.endsWith(pattern);
2060
+ if (pattern.endsWith("/*")) return fileType.startsWith(pattern.slice(0, -1));
2061
+ return fileType === pattern;
2062
+ });
2063
+ }
2064
+ function matchesAcceptForDrag(type, patterns) {
2065
+ if (patterns.length === 0) return true;
2066
+ if (!type) return true;
2067
+ const mimePatterns = patterns.filter((p) => !p.startsWith("."));
2068
+ if (mimePatterns.length === 0) return true;
2069
+ const lowerType = type.toLowerCase();
2070
+ return mimePatterns.some((p) => p.endsWith("/*") ? lowerType.startsWith(p.slice(0, -1)) : lowerType === p);
2071
+ }
2072
+ function validateFiles(files, options) {
2073
+ const { acceptPatterns, maxFiles, maxSize, minSize } = options;
2074
+ if (files.length === 0) return [];
2075
+ if (maxFiles !== void 0 && files.length > maxFiles) {
2076
+ const message = DEFAULT_ERROR_MESSAGES["too-many-files"]({ maxFiles });
2077
+ return files.map((file) => ({
2078
+ file,
2079
+ errors: [{
2080
+ code: "too-many-files",
2081
+ message
2082
+ }]
2083
+ }));
2084
+ }
2085
+ const rejections = [];
2086
+ for (const file of files) {
2087
+ const errors = [];
2088
+ if (acceptPatterns.length > 0 && !matchesAccept(file, acceptPatterns)) errors.push({
2089
+ code: "file-invalid-type",
2090
+ message: DEFAULT_ERROR_MESSAGES["file-invalid-type"]({})
2091
+ });
2092
+ if (maxSize !== void 0 && file.size > maxSize) errors.push({
2093
+ code: "file-too-large",
2094
+ message: DEFAULT_ERROR_MESSAGES["file-too-large"]({ maxSize })
2095
+ });
2096
+ if (minSize !== void 0 && file.size < minSize) errors.push({
2097
+ code: "file-too-small",
2098
+ message: DEFAULT_ERROR_MESSAGES["file-too-small"]({ minSize })
2099
+ });
2100
+ if (errors.length > 0) rejections.push({
2101
+ file,
2102
+ errors
2103
+ });
2104
+ }
2105
+ return rejections;
2106
+ }
2107
+ /**
2108
+ * Headless drop-target — handles drag/drop state, validation, and the hover
2109
+ * overlay. Has no visual chrome; wrap content in `<DropzoneContent>` for the
2110
+ * standard dashed-border look, or compose around any other control (textarea,
2111
+ * etc.) for file-drop on an arbitrary surface.
2112
+ */
2113
+ const Dropzone = React$1.forwardRef(({ className, children, onFiles, onError, accept, multiple = false, maxFiles, maxSize, minSize, disabled = false, hoverMessage = "Drop your file here to upload", dragRejectMessage, onDragEnter, onDragLeave, onDragOver, ...props }, ref) => {
2114
+ const inputRef = React$1.useRef(null);
2115
+ const [isDragging, setIsDragging] = React$1.useState(false);
2116
+ const [isDragReject, setIsDragReject] = React$1.useState(false);
2117
+ const dragCounterRef = React$1.useRef(0);
2118
+ const acceptPatterns = React$1.useMemo(() => parseAccept(accept), [accept]);
2119
+ const open = React$1.useCallback(() => {
2120
+ if (disabled) return;
2121
+ inputRef.current?.click();
2122
+ }, [disabled]);
2123
+ const ctx = React$1.useMemo(() => ({
2124
+ inputRef,
2125
+ disabled,
2126
+ open
2127
+ }), [disabled, open]);
2128
+ function processFiles(files) {
2129
+ if (files.length === 0) return;
2130
+ const rejections = validateFiles(files, {
2131
+ acceptPatterns,
2132
+ maxFiles: multiple ? maxFiles : 1,
2133
+ maxSize,
2134
+ minSize
2135
+ });
2136
+ const rejectedSet = new Set(rejections.map((r) => r.file));
2137
+ const accepted = files.filter((f) => !rejectedSet.has(f));
2138
+ if (accepted.length > 0) onFiles?.(accepted);
2139
+ if (rejections.length > 0) onError?.(rejections);
2140
+ }
2141
+ function resetDragState() {
2142
+ dragCounterRef.current = 0;
2143
+ setIsDragging(false);
2144
+ setIsDragReject(false);
2145
+ }
2146
+ function computeIsDragReject(items) {
2147
+ if (dragRejectMessage == null || acceptPatterns.length === 0) return false;
2148
+ return Array.from(items).some((item) => item.kind === "file" && !matchesAcceptForDrag(item.type, acceptPatterns));
2149
+ }
2150
+ function handleDragEnter(event) {
2151
+ event.preventDefault();
2152
+ if (disabled) return;
2153
+ dragCounterRef.current += 1;
2154
+ if (dragCounterRef.current === 1) setIsDragging(true);
2155
+ setIsDragReject(computeIsDragReject(event.dataTransfer.items));
2156
+ onDragEnter?.(event);
2157
+ }
2158
+ function handleDragLeave(event) {
2159
+ event.preventDefault();
2160
+ if (disabled) return;
2161
+ dragCounterRef.current = Math.max(0, dragCounterRef.current - 1);
2162
+ if (dragCounterRef.current === 0) {
2163
+ setIsDragging(false);
2164
+ setIsDragReject(false);
2165
+ }
2166
+ onDragLeave?.(event);
2167
+ }
2168
+ function handleDragOver(event) {
2169
+ event.preventDefault();
2170
+ if (!disabled) event.dataTransfer.dropEffect = "copy";
2171
+ onDragOver?.(event);
2172
+ }
2173
+ function handleDrop(event) {
2174
+ event.preventDefault();
2175
+ resetDragState();
2176
+ if (disabled) return;
2177
+ processFiles(Array.from(event.dataTransfer.files));
2178
+ }
2179
+ const overlayState = !isDragging ? "idle" : isDragReject ? "reject" : "dragging";
2180
+ const overlayMessage = isDragReject ? dragRejectMessage : hoverMessage;
2181
+ return /* @__PURE__ */ jsx(DropzoneContext.Provider, {
2182
+ value: ctx,
2183
+ children: /* @__PURE__ */ jsxs("div", {
2184
+ ref,
2185
+ "data-slot": "dropzone",
2186
+ "data-state": overlayState,
2187
+ "data-disabled": disabled || void 0,
2188
+ className: cn("group/dropzone relative", className),
2189
+ onDragEnter: handleDragEnter,
2190
+ onDragLeave: handleDragLeave,
2191
+ onDragOver: handleDragOver,
2192
+ onDrop: handleDrop,
2193
+ ...props,
2194
+ children: [
2195
+ /* @__PURE__ */ jsx("input", {
2196
+ ref: inputRef,
2197
+ type: "file",
2198
+ accept,
2199
+ multiple,
2200
+ disabled,
2201
+ className: "sr-only",
2202
+ tabIndex: -1,
2203
+ onClick: (event) => event.stopPropagation(),
2204
+ onChange: (event) => {
2205
+ processFiles(Array.from(event.target.files ?? []));
2206
+ event.target.value = "";
2207
+ }
2208
+ }),
2209
+ children,
2210
+ /* @__PURE__ */ jsxs("div", {
2211
+ "aria-hidden": true,
2212
+ className: cn("pointer-events-none absolute inset-0 flex flex-col items-center justify-center gap-2 rounded-lg border border-dashed border-ring bg-accent text-sm font-medium text-foreground backdrop-blur-xl transition-opacity", "opacity-0 group-data-[state=dragging]/dropzone:opacity-100", "group-data-[state=reject]/dropzone:opacity-100 group-data-[state=reject]/dropzone:border-destructive group-data-[state=reject]/dropzone:bg-destructive-background group-data-[state=reject]/dropzone:text-destructive"),
2213
+ children: [
2214
+ /* @__PURE__ */ jsx(ArrowDownToLine, { className: "size-5 group-data-[state=reject]/dropzone:hidden" }),
2215
+ /* @__PURE__ */ jsx(CircleAlert, { className: "hidden size-5 group-data-[state=reject]/dropzone:block" }),
2216
+ overlayMessage != null && /* @__PURE__ */ jsx("p", { children: overlayMessage })
2217
+ ]
2218
+ })
2219
+ ]
2220
+ })
2221
+ });
2222
+ });
2223
+ Dropzone.displayName = "Dropzone";
2224
+ /**
2225
+ * Visual file-picker card — dashed border, centered layout, and click /
2226
+ * Space / Enter open the picker. Omit it (and use `<DropzoneTrigger>`)
2227
+ * when you want file-drop on an existing surface instead.
2228
+ */
2229
+ const DropzoneContent = React$1.forwardRef(({ className, error = false, onClick, onKeyDown, ...props }, ref) => {
2230
+ const { open, disabled } = useDropzoneContext();
2231
+ return /* @__PURE__ */ jsx("div", {
2232
+ ref,
2233
+ role: "button",
2234
+ tabIndex: disabled ? -1 : 0,
2235
+ "aria-disabled": disabled || void 0,
2236
+ "aria-invalid": error || void 0,
2237
+ "data-slot": "dropzone-content",
2238
+ "data-disabled": disabled || void 0,
2239
+ "data-error": error || void 0,
2240
+ className: cn("flex min-w-0 flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed border-input bg-background p-6 text-center text-balance transition-colors", "outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50", "data-error:border-destructive", "data-disabled:cursor-not-allowed data-disabled:opacity-60 data-disabled:bg-muted", !disabled && "cursor-pointer hover:bg-muted/40", className),
2241
+ onClick: (event) => {
2242
+ if (!disabled) open();
2243
+ onClick?.(event);
2244
+ },
2245
+ onKeyDown: (event) => {
2246
+ if (!disabled && (event.key === "Enter" || event.key === " ")) {
2247
+ event.preventDefault();
2248
+ open();
2249
+ }
2250
+ onKeyDown?.(event);
2251
+ },
2252
+ ...props
2253
+ });
2254
+ });
2255
+ DropzoneContent.displayName = "DropzoneContent";
2256
+ /** `<EmptyMedia>` with `variant="icon"` baked in. */
2257
+ function DropzoneIcon({ variant = "icon", ...props }) {
2258
+ return /* @__PURE__ */ jsx(EmptyMedia, {
2259
+ "data-slot": "dropzone-icon",
2260
+ variant,
2261
+ ...props
2262
+ });
2263
+ }
2264
+ function DropzoneTitle({ className, ...props }) {
2265
+ return /* @__PURE__ */ jsx(EmptyTitle, {
2266
+ "data-slot": "dropzone-title",
2267
+ className: cn("text-foreground", className),
2268
+ ...props
2269
+ });
2270
+ }
2271
+ function DropzoneDescription(props) {
2272
+ return /* @__PURE__ */ jsx(EmptyDescription, {
2273
+ "data-slot": "dropzone-description",
2274
+ ...props
2275
+ });
2276
+ }
2277
+ function DropzoneActions({ className, ...props }) {
2278
+ return /* @__PURE__ */ jsx("div", {
2279
+ "data-slot": "dropzone-actions",
2280
+ className: cn("mt-2 flex items-center gap-2", className),
2281
+ onClick: (event) => event.stopPropagation(),
2282
+ onKeyDown: (event) => event.stopPropagation(),
2283
+ ...props
2284
+ });
2285
+ }
2286
+ /**
2287
+ * Opens the file picker on click. Default-renders a DS `<Button>`; pass
2288
+ * `render` (Base UI convention) to substitute another element.
2289
+ */
2290
+ const DropzoneTrigger = React$1.forwardRef(({ render, onClick, ...props }, ref) => {
2291
+ const { open, disabled } = useDropzoneContext();
2292
+ return useRender({
2293
+ defaultTagName: "button",
2294
+ props: mergeProps({
2295
+ ref,
2296
+ type: "button",
2297
+ "data-slot": "dropzone-trigger",
2298
+ disabled,
2299
+ onClick: (event) => {
2300
+ event.stopPropagation();
2301
+ open();
2302
+ onClick?.(event);
2303
+ }
2304
+ }, props),
2305
+ render: render ?? /* @__PURE__ */ jsx(Button, {})
2306
+ });
2307
+ });
2308
+ DropzoneTrigger.displayName = "DropzoneTrigger";
2309
+
1123
2310
  //#endregion
1124
2311
  //#region src/components/popover.tsx
1125
2312
  function Popover({ ...props }) {
1126
- return /* @__PURE__ */ jsx(PopoverPrimitive.Root, {
2313
+ return /* @__PURE__ */ jsx(Popover$1.Root, {
1127
2314
  "data-slot": "popover",
1128
2315
  ...props
1129
2316
  });
1130
2317
  }
1131
- function PopoverTrigger({ ...props }) {
1132
- return /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, {
2318
+ const PopoverTrigger = React$1.forwardRef((props, ref) => {
2319
+ return /* @__PURE__ */ jsx(Popover$1.Trigger, {
1133
2320
  "data-slot": "popover-trigger",
2321
+ ref,
1134
2322
  ...props
1135
2323
  });
1136
- }
1137
- function PopoverContent({ className, align = "center", sideOffset = 4, ...props }) {
1138
- return /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(PopoverPrimitive.Content, {
1139
- "data-slot": "popover-content",
2324
+ });
2325
+ PopoverTrigger.displayName = "PopoverTrigger";
2326
+ function PopoverContent({ className, align = "center", alignOffset = 0, side = "bottom", sideOffset = 4, ...props }) {
2327
+ return /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(Popover$1.Positioner, {
1140
2328
  align,
2329
+ alignOffset,
2330
+ side,
1141
2331
  sideOffset,
1142
- 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 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden", className),
1143
- ...props
2332
+ className: "isolate z-50",
2333
+ children: /* @__PURE__ */ jsx(Popover$1.Popup, {
2334
+ "data-slot": "popover-content",
2335
+ className: cn("z-50 flex w-72 origin-(--transform-origin) flex-col gap-4 rounded-md bg-popover p-4 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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-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),
2336
+ ...props
2337
+ })
1144
2338
  }) });
1145
2339
  }
1146
- function PopoverAnchor({ ...props }) {
1147
- return /* @__PURE__ */ jsx(PopoverPrimitive.Anchor, {
1148
- "data-slot": "popover-anchor",
2340
+ function PopoverHeader({ className, ...props }) {
2341
+ return /* @__PURE__ */ jsx("div", {
2342
+ "data-slot": "popover-header",
2343
+ className: cn("flex flex-col gap-0.5 text-sm", className),
2344
+ ...props
2345
+ });
2346
+ }
2347
+ function PopoverTitle({ className, ...props }) {
2348
+ return /* @__PURE__ */ jsx(Popover$1.Title, {
2349
+ "data-slot": "popover-title",
2350
+ className: cn("font-bold", className),
2351
+ ...props
2352
+ });
2353
+ }
2354
+ function PopoverDescription({ className, ...props }) {
2355
+ return /* @__PURE__ */ jsx(Popover$1.Description, {
2356
+ "data-slot": "popover-description",
2357
+ className: cn("text-muted-foreground", className),
1149
2358
  ...props
1150
2359
  });
1151
2360
  }
@@ -1163,25 +2372,6 @@ function ThemeProvider({ children, ...props }) {
1163
2372
  });
1164
2373
  }
1165
2374
 
1166
- //#endregion
1167
- //#region src/components/tooltip.tsx
1168
- const TooltipProvider = TooltipPrimitive.Provider;
1169
- const Tooltip = TooltipPrimitive.Root;
1170
- const TooltipTrigger = TooltipPrimitive.Trigger;
1171
- const TooltipContent = React$1.forwardRef(({ className, sideOffset = 4, collisionPadding = 4, container, forceMount, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Portal, {
1172
- container,
1173
- forceMount,
1174
- children: /* @__PURE__ */ jsx(TooltipPrimitive.Content, {
1175
- ref,
1176
- sideOffset,
1177
- collisionPadding,
1178
- sticky: "partial",
1179
- className: cn("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-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", className),
1180
- ...props
1181
- })
1182
- }));
1183
- TooltipContent.displayName = TooltipPrimitive.Content.displayName;
1184
-
1185
2375
  //#endregion
1186
2376
  //#region src/components/emoji-picker.tsx
1187
2377
  const EmojiPickerCategories = {
@@ -1195,120 +2385,104 @@ const EmojiPickerCategories = {
1195
2385
  SYMBOLS: Categories.SYMBOLS,
1196
2386
  FLAGS: Categories.FLAGS
1197
2387
  };
1198
- const DefaultEmojiButton = React$1.forwardRef((props, ref) => /* @__PURE__ */ jsx(Button, {
1199
- ...props,
1200
- ref,
1201
- variant: "outline",
1202
- size: "icon-sm"
1203
- }));
1204
- DefaultEmojiButton.displayName = "DefaultEmojiButton";
1205
- function EmojiPicker({ disabled, tooltip = "Emoji", onEmojiSelect, className, triggerClassName, emojiClassName, searchPlaceholder, emojiListWidth = 300, DefaultTriggerComponent, categories }) {
2388
+ const EmojiPickerContext = React$1.createContext(null);
2389
+ function useEmojiPickerContext() {
2390
+ const context = React$1.useContext(EmojiPickerContext);
2391
+ if (!context) throw new Error("EmojiPicker compound components must be used inside <EmojiPicker>");
2392
+ return context;
2393
+ }
2394
+ function EmojiPicker({ onEmojiSelect, children }) {
1206
2395
  const [open, setOpen] = React$1.useState(false);
1207
- const { resolvedTheme } = useTheme();
1208
- const pickerTheme = resolvedTheme === "dark" ? Theme.DARK : Theme.LIGHT;
1209
- const handleSelect = React$1.useCallback((emojiData) => {
1210
- onEmojiSelect?.(emojiData.emoji);
2396
+ const onSelect = React$1.useCallback((emoji) => {
2397
+ onEmojiSelect?.(emoji);
1211
2398
  setOpen(false);
1212
2399
  }, [onEmojiSelect]);
1213
- return /* @__PURE__ */ jsxs(Popover, {
1214
- open,
1215
- onOpenChange: setOpen,
1216
- children: [/* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(PopoverTrigger, {
1217
- asChild: true,
1218
- children: /* @__PURE__ */ jsx(TooltipTrigger, {
1219
- asChild: true,
1220
- children: /* @__PURE__ */ jsx(DefaultTriggerComponent || DefaultEmojiButton, {
1221
- type: "button",
1222
- "aria-label": "Open emoji picker",
1223
- disabled,
1224
- className: cn("data-[state=open]:bg-accent", triggerClassName),
1225
- children: /* @__PURE__ */ jsx(Emoji, { "aria-hidden": "true" })
1226
- })
1227
- })
1228
- }), /* @__PURE__ */ jsx(TooltipContent, { children: tooltip })] }) }), /* @__PURE__ */ jsx(PopoverContent, {
1229
- className: cn("p-0 w-64", className),
1230
- align: "start",
1231
- children: /* @__PURE__ */ jsx("div", {
1232
- className: cn("ds-emoji-picker", emojiClassName),
1233
- "data-emoji-class": true,
1234
- children: /* @__PURE__ */ jsx(EmojiReactPicker, {
1235
- lazyLoadEmojis: true,
1236
- emojiStyle: EmojiStyle.NATIVE,
1237
- suggestedEmojisMode: SuggestionMode.RECENT,
1238
- previewConfig: { showPreview: false },
1239
- onEmojiClick: handleSelect,
1240
- width: emojiListWidth,
1241
- searchPlaceHolder: searchPlaceholder,
1242
- categories,
1243
- theme: pickerTheme
1244
- })
1245
- })
1246
- })]
1247
- });
1248
- }
1249
-
1250
- //#endregion
1251
- //#region src/components/empty.tsx
1252
- function Empty({ className, ...props }) {
1253
- return /* @__PURE__ */ jsx("div", {
1254
- "data-slot": "empty",
1255
- className: cn("flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12", className),
1256
- ...props
1257
- });
1258
- }
1259
- function EmptyHeader({ className, ...props }) {
1260
- return /* @__PURE__ */ jsx("div", {
1261
- "data-slot": "empty-header",
1262
- className: cn("flex max-w-sm flex-col items-center gap-2 text-center", className),
1263
- ...props
1264
- });
1265
- }
1266
- const emptyMediaVariants = cva("flex shrink-0 items-center justify-center mb-2 [&_svg]:pointer-events-none [&_svg]:shrink-0", {
1267
- variants: { variant: {
1268
- default: "bg-transparent",
1269
- icon: "bg-muted text-foreground flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-6"
1270
- } },
1271
- defaultVariants: { variant: "default" }
1272
- });
1273
- function EmptyMedia({ className, variant = "default", ...props }) {
1274
- return /* @__PURE__ */ jsx("div", {
1275
- "data-slot": "empty-icon",
1276
- "data-variant": variant,
1277
- className: cn(emptyMediaVariants({
1278
- variant,
1279
- className
1280
- })),
1281
- ...props
1282
- });
1283
- }
1284
- function EmptyTitle({ className, ...props }) {
1285
- return /* @__PURE__ */ jsx("div", {
1286
- "data-slot": "empty-title",
1287
- className: cn("text-lg font-medium tracking-tight", className),
1288
- ...props
2400
+ const contextValue = React$1.useMemo(() => ({ onSelect }), [onSelect]);
2401
+ return /* @__PURE__ */ jsx(EmojiPickerContext.Provider, {
2402
+ value: contextValue,
2403
+ children: /* @__PURE__ */ jsx(Popover, {
2404
+ open,
2405
+ onOpenChange: setOpen,
2406
+ children
2407
+ })
1289
2408
  });
1290
2409
  }
1291
- function EmptyDescription({ className, ...props }) {
1292
- return /* @__PURE__ */ jsx("div", {
1293
- "data-slot": "empty-description",
1294
- className: cn("text-muted-foreground [&>a:hover]:text-primary text-sm/relaxed [&>a]:underline [&>a]:underline-offset-4", className),
1295
- ...props
2410
+ const EmojiPickerTrigger = React$1.forwardRef(({ render, children, ...props }, ref) => /* @__PURE__ */ jsx(PopoverTrigger, {
2411
+ ref,
2412
+ "aria-label": "Emoji",
2413
+ render: render ?? /* @__PURE__ */ jsx(Button, {
2414
+ variant: "outline",
2415
+ size: "icon"
2416
+ }),
2417
+ ...props,
2418
+ children: children ?? /* @__PURE__ */ jsx(Smile, { "aria-hidden": "true" })
2419
+ }));
2420
+ EmojiPickerTrigger.displayName = "EmojiPickerTrigger";
2421
+ function EmojiPickerContent({ className, align = "start", searchPlaceholder, categories, width = 300, suggestedEmojisMode = SuggestionMode.RECENT, ...props }) {
2422
+ const { onSelect } = useEmojiPickerContext();
2423
+ const { resolvedTheme } = useTheme();
2424
+ const pickerTheme = resolvedTheme === "dark" ? Theme.DARK : Theme.LIGHT;
2425
+ const handleClick = React$1.useCallback((emojiData) => onSelect(emojiData.emoji), [onSelect]);
2426
+ return /* @__PURE__ */ jsx(PopoverContent, {
2427
+ "aria-label": "Choose an emoji",
2428
+ className: cn("p-0 w-auto overflow-hidden ring-foreground/5", className),
2429
+ align,
2430
+ ...props,
2431
+ children: /* @__PURE__ */ jsx("div", {
2432
+ className: "ds-emoji-picker",
2433
+ children: /* @__PURE__ */ jsx(EmojiReactPicker, {
2434
+ lazyLoadEmojis: true,
2435
+ emojiStyle: EmojiStyle.NATIVE,
2436
+ suggestedEmojisMode,
2437
+ previewConfig: { showPreview: false },
2438
+ onEmojiClick: handleClick,
2439
+ width,
2440
+ searchPlaceHolder: searchPlaceholder,
2441
+ categories,
2442
+ theme: pickerTheme
2443
+ })
2444
+ })
1296
2445
  });
1297
2446
  }
1298
- function EmptyContent({ className, ...props }) {
1299
- return /* @__PURE__ */ jsx("div", {
1300
- "data-slot": "empty-content",
1301
- className: cn("flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance", className),
2447
+
2448
+ //#endregion
2449
+ //#region src/components/fab.tsx
2450
+ const fabVariants = cva("group/fab inline-flex shrink-0 items-center justify-center rounded-md shadow-lg font-semibold whitespace-nowrap transition-all outline-none select-none focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px active:not-aria-[haspopup]:shadow-md [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-6", {
2451
+ variants: {
2452
+ variant: {
2453
+ default: "bg-primary text-primary-foreground hover:bg-primary/90 aria-expanded:bg-primary/90",
2454
+ outline: "border border-input bg-background hover:bg-muted hover:text-accent-foreground focus-visible:border-ring aria-expanded:bg-muted active:bg-muted dark:border-input dark:bg-input/30 dark:hover:bg-input/50 dark:active:bg-input/50"
2455
+ },
2456
+ size: {
2457
+ lg: "h-10 gap-2 px-4 text-base",
2458
+ "icon-lg": "size-10"
2459
+ }
2460
+ },
2461
+ defaultVariants: {
2462
+ variant: "default",
2463
+ size: "icon-lg"
2464
+ }
2465
+ });
2466
+ const FAB = React$1.forwardRef(({ className, variant, size, ...props }, ref) => {
2467
+ return /* @__PURE__ */ jsx(Button$1, {
2468
+ ref,
2469
+ "data-slot": "fab",
2470
+ className: cn(fabVariants({
2471
+ variant,
2472
+ size,
2473
+ className
2474
+ })),
1302
2475
  ...props
1303
2476
  });
1304
- }
2477
+ });
2478
+ FAB.displayName = "FAB";
1305
2479
 
1306
2480
  //#endregion
1307
2481
  //#region src/components/label.tsx
1308
2482
  function Label({ className, ...props }) {
1309
- return /* @__PURE__ */ jsx(LabelPrimitive.Root, {
2483
+ return /* @__PURE__ */ jsx("label", {
1310
2484
  "data-slot": "label",
1311
- className: cn("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50", className),
2485
+ className: cn("flex items-center gap-2 text-sm leading-normal font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50 peer-data-disabled:opacity-50", className),
1312
2486
  ...props
1313
2487
  });
1314
2488
  }
@@ -1318,7 +2492,7 @@ function Label({ className, ...props }) {
1318
2492
  function FieldSet({ className, ...props }) {
1319
2493
  return /* @__PURE__ */ jsx("fieldset", {
1320
2494
  "data-slot": "field-set",
1321
- className: cn("flex flex-col gap-6", "has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3", className),
2495
+ className: cn("flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3", className),
1322
2496
  ...props
1323
2497
  });
1324
2498
  }
@@ -1326,30 +2500,22 @@ function FieldLegend({ className, variant = "legend", ...props }) {
1326
2500
  return /* @__PURE__ */ jsx("legend", {
1327
2501
  "data-slot": "field-legend",
1328
2502
  "data-variant": variant,
1329
- className: cn("mb-3 font-medium", "data-[variant=legend]:text-base", "data-[variant=label]:text-sm", className),
2503
+ className: cn("mb-1.5 font-medium leading-normal data-[variant=label]:text-sm data-[variant=legend]:text-base", className),
1330
2504
  ...props
1331
2505
  });
1332
2506
  }
1333
2507
  function FieldGroup({ className, ...props }) {
1334
2508
  return /* @__PURE__ */ jsx("div", {
1335
2509
  "data-slot": "field-group",
1336
- className: cn("group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4", className),
2510
+ className: cn("group/field-group @container/field-group flex w-full flex-col gap-6 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4", className),
1337
2511
  ...props
1338
2512
  });
1339
2513
  }
1340
- const fieldVariants = cva("group/field flex w-full gap-3 data-[invalid=true]:text-destructive", {
2514
+ const fieldVariants = cva("group/field flex w-full gap-2 data-[invalid=true]:text-destructive", {
1341
2515
  variants: { orientation: {
1342
- vertical: ["flex-col [&>*]:w-full [&>.sr-only]:w-auto"],
1343
- horizontal: [
1344
- "flex-row items-center",
1345
- "[&>[data-slot=field-label]]:flex-auto",
1346
- "has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px"
1347
- ],
1348
- responsive: [
1349
- "flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto",
1350
- "@md/field-group:[&>[data-slot=field-label]]:flex-auto",
1351
- "@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px"
1352
- ]
2516
+ vertical: "flex-col *:w-full [&>.sr-only]:w-auto",
2517
+ horizontal: "flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",
2518
+ responsive: "flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px"
1353
2519
  } },
1354
2520
  defaultVariants: { orientation: "vertical" }
1355
2521
  });
@@ -1365,28 +2531,28 @@ function Field({ className, orientation = "vertical", ...props }) {
1365
2531
  function FieldContent({ className, ...props }) {
1366
2532
  return /* @__PURE__ */ jsx("div", {
1367
2533
  "data-slot": "field-content",
1368
- className: cn("group/field-content flex flex-1 flex-col gap-1.5 leading-snug", className),
2534
+ className: cn("group/field-content flex flex-1 flex-col gap-2 leading-normal", className),
1369
2535
  ...props
1370
2536
  });
1371
2537
  }
1372
2538
  function FieldLabel({ className, ...props }) {
1373
2539
  return /* @__PURE__ */ jsx(Label, {
1374
2540
  "data-slot": "field-label",
1375
- className: cn("group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50", "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4", "has-data-[state=checked]:bg-primary/5 has-data-[state=checked]:border-primary dark:has-data-[state=checked]:bg-primary/10", className),
2541
+ className: cn("group/field-label peer/field-label flex w-fit gap-2 leading-normal group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-4 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10", "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col", className),
1376
2542
  ...props
1377
2543
  });
1378
2544
  }
1379
2545
  function FieldTitle({ className, ...props }) {
1380
2546
  return /* @__PURE__ */ jsx("div", {
1381
2547
  "data-slot": "field-label",
1382
- className: cn("flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50", className),
2548
+ className: cn("flex w-fit items-center gap-2 text-sm leading-normal font-medium group-data-[disabled=true]/field:opacity-50", className),
1383
2549
  ...props
1384
2550
  });
1385
2551
  }
1386
2552
  function FieldDescription({ className, ...props }) {
1387
2553
  return /* @__PURE__ */ jsx("p", {
1388
2554
  "data-slot": "field-description",
1389
- className: cn("text-muted-foreground text-sm leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance", "last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5", "[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4", className),
2555
+ className: cn("text-left text-sm leading-normal font-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance [[data-variant=legend]+&]:-mt-1.5", "last:mt-0 nth-last-2:-mt-1", "[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary", className),
1390
2556
  ...props
1391
2557
  });
1392
2558
  }
@@ -1397,7 +2563,7 @@ function FieldSeparator({ children, className, ...props }) {
1397
2563
  className: cn("relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2", className),
1398
2564
  ...props,
1399
2565
  children: [/* @__PURE__ */ jsx(Separator, { className: "absolute inset-0 top-1/2" }), children && /* @__PURE__ */ jsx("span", {
1400
- className: "bg-background text-muted-foreground relative mx-auto block w-fit px-2",
2566
+ className: "relative mx-auto block w-fit bg-background px-2 text-muted-foreground",
1401
2567
  "data-slot": "field-separator-content",
1402
2568
  children
1403
2569
  })]
@@ -1418,26 +2584,55 @@ function FieldError({ className, children, errors, ...props }) {
1418
2584
  return /* @__PURE__ */ jsx("div", {
1419
2585
  role: "alert",
1420
2586
  "data-slot": "field-error",
1421
- className: cn("text-destructive text-sm font-normal", className),
2587
+ className: cn("text-sm leading-normal font-normal text-destructive", className),
1422
2588
  ...props,
1423
2589
  children: content
1424
2590
  });
1425
2591
  }
1426
2592
 
2593
+ //#endregion
2594
+ //#region src/components/gauge.tsx
2595
+ const GAUGES = 8;
2596
+ function getSegmentState(index, value) {
2597
+ if (index >= value) return "empty";
2598
+ if (value === GAUGES) return "filled";
2599
+ const distanceFromHead = value - 1 - index;
2600
+ if (distanceFromHead === 0) return "head";
2601
+ if (distanceFromHead === 1) return "trailing";
2602
+ return "filled";
2603
+ }
2604
+ function Gauge({ className, value, ...props }) {
2605
+ const clampedValue = Math.max(0, Math.min(value, GAUGES));
2606
+ return /* @__PURE__ */ jsx("div", {
2607
+ role: "meter",
2608
+ "aria-valuenow": clampedValue,
2609
+ "aria-valuemin": 0,
2610
+ "aria-valuemax": GAUGES,
2611
+ "data-slot": "gauge",
2612
+ className: cn("flex w-full items-center gap-3", className),
2613
+ ...props,
2614
+ children: Array.from({ length: GAUGES }, (_, index) => {
2615
+ const state = getSegmentState(index, clampedValue);
2616
+ return /* @__PURE__ */ jsx("div", {
2617
+ "data-slot": "gauge-item",
2618
+ "data-state": state,
2619
+ className: "relative h-3 flex-1 overflow-hidden rounded-full bg-muted",
2620
+ children: /* @__PURE__ */ jsx("div", {
2621
+ "data-slot": "gauge-indicator",
2622
+ className: cn("absolute inset-0 bg-primary transition-opacity", "data-[state=empty]:opacity-0", "data-[state=head]:opacity-35", "data-[state=trailing]:opacity-65", "data-[state=filled]:opacity-100"),
2623
+ "data-state": state
2624
+ })
2625
+ }, index);
2626
+ })
2627
+ });
2628
+ }
2629
+
1427
2630
  //#endregion
1428
2631
  //#region src/components/input-otp.tsx
1429
- const inputOTPVariants = cva("", {
1430
- variants: { sizing: {
1431
- default: "**:data-[slot=input-otp-slot]:h-9 **:data-[slot=input-otp-slot]:w-9",
1432
- sm: "**:data-[slot=input-otp-slot]:h-8 **:data-[slot=input-otp-slot]:w-8",
1433
- lg: "**:data-[slot=input-otp-slot]:h-12 **:data-[slot=input-otp-slot]:w-12"
1434
- } },
1435
- defaultVariants: { sizing: "default" }
1436
- });
1437
- function InputOTP({ className, containerClassName, sizing, ...props }) {
2632
+ function InputOTP({ className, containerClassName, ...props }) {
1438
2633
  return /* @__PURE__ */ jsx(OTPInput, {
1439
2634
  "data-slot": "input-otp",
1440
- containerClassName: cn("flex items-center gap-2 has-disabled:opacity-50", inputOTPVariants({ sizing }), containerClassName),
2635
+ containerClassName: cn("flex items-center gap-2 has-disabled:opacity-50 **:data-[slot=input-otp-slot]:h-12 **:data-[slot=input-otp-slot]:w-12 has-[input[aria-invalid=true]]:**:data-[slot=input-otp-slot]:border-destructive has-[input[aria-invalid=true]]:**:data-[slot=input-otp-slot]:data-[active=true]:ring-destructive/20 dark:has-[input[aria-invalid=true]]:**:data-[slot=input-otp-slot]:data-[active=true]:ring-destructive/40", containerClassName),
1441
2636
  className: cn("disabled:cursor-not-allowed", className),
1442
2637
  ...props
1443
2638
  });
@@ -1454,7 +2649,7 @@ function InputOTPSlot({ index, className, ...props }) {
1454
2649
  return /* @__PURE__ */ jsxs("div", {
1455
2650
  "data-slot": "input-otp-slot",
1456
2651
  "data-active": isActive,
1457
- className: cn("data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]", className),
2652
+ className: cn("data-[active=true]:border-ring data-[active=true]:ring-ring/50 dark:bg-input/30 border-input relative flex items-center justify-center border-y border-r text-sm transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-3", className),
1458
2653
  ...props,
1459
2654
  children: [char, hasFakeCaret && /* @__PURE__ */ jsx("div", {
1460
2655
  className: "pointer-events-none absolute inset-0 flex items-center justify-center",
@@ -1479,7 +2674,7 @@ const ItemGroup = React$1.forwardRef(({ className, stackedItems = false, ...prop
1479
2674
  role: "list",
1480
2675
  "data-slot": "item-group",
1481
2676
  "data-stacked": stackedItems ? "" : void 0,
1482
- className: cn("group/item-group flex flex-col", stackedItems ? "*:has-[+[data-slot=item]]:rounded-b-none *:[[data-slot=item]+[data-slot=item]]:rounded-t-none *:[[data-slot=item]+[data-slot=item]]:border-t-0" : "", className),
2677
+ className: cn("group/item-group flex w-full flex-col", stackedItems ? "*:has-[+[data-slot=item]]:rounded-b-none *:[[data-slot=item]+[data-slot=item]]:rounded-t-none *:[[data-slot=item]+[data-slot=item]]:border-t-0" : "gap-4 has-data-[size=sm]:gap-2.5 has-data-[size=xs]:gap-2", className),
1483
2678
  ...props
1484
2679
  });
1485
2680
  });
@@ -1488,20 +2683,21 @@ function ItemSeparator({ className, ...props }) {
1488
2683
  return /* @__PURE__ */ jsx(Separator, {
1489
2684
  "data-slot": "item-separator",
1490
2685
  orientation: "horizontal",
1491
- className: cn("my-0", className),
2686
+ className: cn("my-2", className),
1492
2687
  ...props
1493
2688
  });
1494
2689
  }
1495
- const itemVariants = cva("group/item flex items-center text-sm transition-colors [a]:hover:bg-accent/50 [a]:transition-colors duration-100 flex-wrap outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", {
2690
+ const itemVariants = cva("group/item flex w-full flex-wrap items-center rounded-md border text-sm transition-colors duration-100 outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 [a]:transition-colors [a]:hover:bg-muted", {
1496
2691
  variants: {
1497
2692
  variant: {
1498
- default: "bg-transparent rounded-md",
1499
- outline: "border border-border rounded-md",
1500
- muted: "bg-muted/50 rounded-md"
2693
+ default: "border-transparent",
2694
+ outline: "border-border",
2695
+ muted: "border-transparent bg-muted/50"
1501
2696
  },
1502
2697
  size: {
1503
- default: "p-4 gap-4",
1504
- sm: "p-3 gap-2.5"
2698
+ default: "gap-3.5 px-4 py-3.5",
2699
+ sm: "gap-2.5 px-3 py-2.5",
2700
+ xs: "gap-2 px-2.5 py-2 in-data-[slot=dropdown-menu-content]:p-0"
1505
2701
  }
1506
2702
  },
1507
2703
  defaultVariants: {
@@ -1509,26 +2705,31 @@ const itemVariants = cva("group/item flex items-center text-sm transition-colors
1509
2705
  size: "default"
1510
2706
  }
1511
2707
  });
1512
- const Item = React$1.forwardRef(({ className, variant = "default", size = "default", asChild = false, ...props }, ref) => {
1513
- return /* @__PURE__ */ jsx(asChild ? Slot$1 : "div", {
1514
- ref,
1515
- "data-slot": "item",
1516
- "data-variant": variant,
1517
- "data-size": size,
1518
- className: cn(itemVariants({
2708
+ const Item = React$1.forwardRef(({ className, variant = "default", size = "default", render, ...props }, ref) => {
2709
+ return useRender({
2710
+ defaultTagName: "div",
2711
+ props: mergeProps({
2712
+ className: cn(itemVariants({
2713
+ variant,
2714
+ size,
2715
+ className
2716
+ })),
2717
+ ref
2718
+ }, props),
2719
+ render,
2720
+ state: {
2721
+ slot: "item",
1519
2722
  variant,
1520
- size,
1521
- className
1522
- })),
1523
- ...props
2723
+ size
2724
+ }
1524
2725
  });
1525
2726
  });
1526
2727
  Item.displayName = "Item";
1527
- const itemMediaVariants = cva("flex shrink-0 items-center justify-center gap-2 group-has-[[data-slot=item-description]]/item:self-start [&_svg]:pointer-events-none group-has-[[data-slot=item-description]]/item:translate-y-0.5", {
2728
+ const itemMediaVariants = cva("flex shrink-0 items-center justify-center gap-2 group-has-data-[slot=item-description]/item:translate-y-0.5 group-has-data-[slot=item-description]/item:self-start [&_svg]:pointer-events-none", {
1528
2729
  variants: { variant: {
1529
2730
  default: "bg-transparent",
1530
- icon: "size-8 border rounded-sm bg-muted [&_svg:not([class*='size-'])]:size-4",
1531
- image: "size-10 rounded-sm overflow-hidden [&_img]:size-full [&_img]:object-cover"
2731
+ icon: "[&_svg:not([class*='size-'])]:size-4",
2732
+ image: "size-10 overflow-hidden rounded-sm group-data-[size=sm]/item:size-8 group-data-[size=xs]/item:size-6 [&_img]:size-full [&_img]:object-cover"
1532
2733
  } },
1533
2734
  defaultVariants: { variant: "default" }
1534
2735
  });
@@ -1549,7 +2750,7 @@ const ItemContent = React$1.forwardRef(({ className, ...props }, ref) => {
1549
2750
  return /* @__PURE__ */ jsx("div", {
1550
2751
  ref,
1551
2752
  "data-slot": "item-content",
1552
- className: cn("flex flex-1 flex-col gap-1 [&+[data-slot=item-content]]:flex-none", className),
2753
+ className: cn("flex flex-1 flex-col gap-1 group-data-[size=xs]/item:gap-0 [&+[data-slot=item-content]]:flex-none", className),
1553
2754
  ...props
1554
2755
  });
1555
2756
  });
@@ -1558,7 +2759,7 @@ const ItemTitle = React$1.forwardRef(({ className, ...props }, ref) => {
1558
2759
  return /* @__PURE__ */ jsx("div", {
1559
2760
  ref,
1560
2761
  "data-slot": "item-title",
1561
- className: cn("flex w-fit items-center gap-2 text-sm leading-snug font-medium", className),
2762
+ className: cn("line-clamp-1 flex w-fit items-center gap-2 text-sm leading-snug font-medium underline-offset-4", className),
1562
2763
  ...props
1563
2764
  });
1564
2765
  });
@@ -1567,7 +2768,7 @@ const ItemDescription = React$1.forwardRef(({ className, ...props }, ref) => {
1567
2768
  return /* @__PURE__ */ jsx("p", {
1568
2769
  ref,
1569
2770
  "data-slot": "item-description",
1570
- className: cn("text-muted-foreground line-clamp-2 text-sm leading-normal font-normal text-balance", "[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4", className),
2771
+ className: cn("line-clamp-2 text-left text-sm leading-normal font-normal text-muted-foreground group-data-[size=xs]/item:text-xs [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary", className),
1571
2772
  ...props
1572
2773
  });
1573
2774
  });
@@ -1625,208 +2826,294 @@ const ListCol = ({ grow, wrap, children, className, ...props }) => {
1625
2826
  });
1626
2827
  };
1627
2828
 
2829
+ //#endregion
2830
+ //#region src/components/pagination.tsx
2831
+ function Pagination({ className, ...props }) {
2832
+ return /* @__PURE__ */ jsx("nav", {
2833
+ role: "navigation",
2834
+ "aria-label": "pagination",
2835
+ "data-slot": "pagination",
2836
+ className: cn("mx-auto flex w-full justify-center", className),
2837
+ ...props
2838
+ });
2839
+ }
2840
+ function PaginationContent({ className, ...props }) {
2841
+ return /* @__PURE__ */ jsx("ul", {
2842
+ "data-slot": "pagination-content",
2843
+ className: cn("flex items-center gap-1", className),
2844
+ ...props
2845
+ });
2846
+ }
2847
+ function PaginationItem({ ...props }) {
2848
+ return /* @__PURE__ */ jsx("li", {
2849
+ "data-slot": "pagination-item",
2850
+ ...props
2851
+ });
2852
+ }
2853
+ function PaginationLink({ className, isActive, size = "icon", ...props }) {
2854
+ return /* @__PURE__ */ jsx(Button, {
2855
+ variant: isActive ? "outline" : "ghost",
2856
+ size,
2857
+ className: cn(className),
2858
+ nativeButton: false,
2859
+ render: /* @__PURE__ */ jsx("a", {
2860
+ "aria-current": isActive ? "page" : void 0,
2861
+ "data-slot": "pagination-link",
2862
+ "data-active": isActive,
2863
+ ...props
2864
+ })
2865
+ });
2866
+ }
2867
+ function PaginationPrevious({ className, text = "Previous", ...props }) {
2868
+ return /* @__PURE__ */ jsxs(PaginationLink, {
2869
+ "aria-label": "Go to previous page",
2870
+ size: "default",
2871
+ className: cn("pl-2!", className),
2872
+ ...props,
2873
+ children: [/* @__PURE__ */ jsx(ChevronLeftIcon, { "data-icon": "inline-start" }), /* @__PURE__ */ jsx("span", {
2874
+ className: "hidden sm:block",
2875
+ children: text
2876
+ })]
2877
+ });
2878
+ }
2879
+ function PaginationNext({ className, text = "Next", ...props }) {
2880
+ return /* @__PURE__ */ jsxs(PaginationLink, {
2881
+ "aria-label": "Go to next page",
2882
+ size: "default",
2883
+ className: cn("pr-2!", className),
2884
+ ...props,
2885
+ children: [/* @__PURE__ */ jsx("span", {
2886
+ className: "hidden sm:block",
2887
+ children: text
2888
+ }), /* @__PURE__ */ jsx(ChevronRightIcon, { "data-icon": "inline-end" })]
2889
+ });
2890
+ }
2891
+ function PaginationEllipsis({ className, ...props }) {
2892
+ return /* @__PURE__ */ jsxs("span", {
2893
+ "aria-hidden": true,
2894
+ "data-slot": "pagination-ellipsis",
2895
+ className: cn("flex size-9 items-center justify-center [&_svg:not([class*='size-'])]:size-4", className),
2896
+ ...props,
2897
+ children: [/* @__PURE__ */ jsx(MoreHorizontalIcon, {}), /* @__PURE__ */ jsx("span", {
2898
+ className: "sr-only",
2899
+ children: "More pages"
2900
+ })]
2901
+ });
2902
+ }
2903
+
1628
2904
  //#endregion
1629
2905
  //#region src/components/progress.tsx
1630
- function Progress({ className, value, ...props }) {
1631
- return /* @__PURE__ */ jsx(ProgressPrimitive.Root, {
2906
+ function Progress({ className, children, value, ...props }) {
2907
+ return /* @__PURE__ */ jsxs(Progress$1.Root, {
2908
+ value,
1632
2909
  "data-slot": "progress",
1633
- className: cn("bg-primary/20 relative h-2 w-full overflow-hidden rounded-full", className),
2910
+ className: cn("flex flex-wrap gap-3", className),
1634
2911
  ...props,
1635
- children: /* @__PURE__ */ jsx(ProgressPrimitive.Indicator, {
1636
- "data-slot": "progress-indicator",
1637
- className: "bg-primary h-full w-full flex-1 transition-all",
1638
- style: { transform: `translateX(-${100 - (value || 0)}%)` }
1639
- })
2912
+ children: [children, /* @__PURE__ */ jsx(ProgressTrack, { children: /* @__PURE__ */ jsx(ProgressIndicator, {}) })]
2913
+ });
2914
+ }
2915
+ function ProgressTrack({ className, ...props }) {
2916
+ return /* @__PURE__ */ jsx(Progress$1.Track, {
2917
+ className: cn("relative flex h-1 w-full items-center overflow-x-hidden rounded-full bg-muted", className),
2918
+ "data-slot": "progress-track",
2919
+ ...props
2920
+ });
2921
+ }
2922
+ function ProgressIndicator({ className, ...props }) {
2923
+ return /* @__PURE__ */ jsx(Progress$1.Indicator, {
2924
+ "data-slot": "progress-indicator",
2925
+ className: cn("h-full bg-primary transition-all", className),
2926
+ ...props
2927
+ });
2928
+ }
2929
+ function ProgressLabel({ className, ...props }) {
2930
+ return /* @__PURE__ */ jsx(Progress$1.Label, {
2931
+ className: cn("text-sm font-medium", className),
2932
+ "data-slot": "progress-label",
2933
+ ...props
2934
+ });
2935
+ }
2936
+ function ProgressValue({ className, ...props }) {
2937
+ return /* @__PURE__ */ jsx(Progress$1.Value, {
2938
+ className: cn("ml-auto text-sm text-muted-foreground tabular-nums", className),
2939
+ "data-slot": "progress-value",
2940
+ ...props
1640
2941
  });
1641
2942
  }
1642
2943
 
1643
2944
  //#endregion
1644
2945
  //#region src/components/radio-group.tsx
1645
2946
  function RadioGroup({ className, ...props }) {
1646
- return /* @__PURE__ */ jsx(RadioGroupPrimitive.Root, {
2947
+ return /* @__PURE__ */ jsx(RadioGroup$1, {
1647
2948
  "data-slot": "radio-group",
1648
- className: cn("grid gap-3", className),
2949
+ className: cn("grid w-full gap-3", className),
1649
2950
  ...props
1650
2951
  });
1651
2952
  }
1652
2953
  function RadioGroupItem({ className, ...props }) {
1653
- return /* @__PURE__ */ jsx(RadioGroupPrimitive.Item, {
2954
+ return /* @__PURE__ */ jsx(Radio.Root, {
1654
2955
  "data-slot": "radio-group-item",
1655
- className: cn("border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className),
2956
+ className: cn("group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none transition-[color,box-shadow,opacity] active:opacity-60 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 data-disabled:pointer-events-none data-disabled:cursor-not-allowed data-disabled:opacity-50 aria-invalid:border-destructive focus-visible:aria-invalid:ring-3 focus-visible:aria-invalid:ring-destructive/20 dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:focus-visible:aria-invalid:ring-destructive/40 data-checked:border-primary aria-invalid:data-checked:border-destructive", className),
1656
2957
  ...props,
1657
- children: /* @__PURE__ */ jsx(RadioGroupPrimitive.Indicator, {
2958
+ children: /* @__PURE__ */ jsx(Radio.Indicator, {
1658
2959
  "data-slot": "radio-group-indicator",
1659
- className: "relative flex items-center justify-center",
1660
- children: /* @__PURE__ */ jsx(CircleIcon, { className: "fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2" })
1661
- })
1662
- });
1663
- }
1664
-
1665
- //#endregion
1666
- //#region src/components/scroll-area.tsx
1667
- function ScrollArea({ className, children, ...props }) {
1668
- return /* @__PURE__ */ jsxs(ScrollAreaPrimitive.Root, {
1669
- "data-slot": "scroll-area",
1670
- className: cn("relative", className),
1671
- ...props,
1672
- children: [
1673
- /* @__PURE__ */ jsx(ScrollAreaPrimitive.Viewport, {
1674
- "data-slot": "scroll-area-viewport",
1675
- className: "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1",
1676
- children
1677
- }),
1678
- /* @__PURE__ */ jsx(ScrollBar, {}),
1679
- /* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})
1680
- ]
1681
- });
1682
- }
1683
- function ScrollBar({ className, orientation = "vertical", ...props }) {
1684
- return /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaScrollbar, {
1685
- "data-slot": "scroll-area-scrollbar",
1686
- orientation,
1687
- className: cn("flex touch-none p-px transition-colors select-none", orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent", orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent", className),
1688
- ...props,
1689
- children: /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaThumb, {
1690
- "data-slot": "scroll-area-thumb",
1691
- className: "bg-border relative flex-1 rounded-full"
2960
+ className: "flex size-full items-center justify-center",
2961
+ children: /* @__PURE__ */ jsx("span", { className: "size-2 rounded-full bg-primary group-aria-invalid/radio-group-item:bg-destructive" })
1692
2962
  })
1693
2963
  });
1694
2964
  }
1695
2965
 
1696
2966
  //#endregion
1697
2967
  //#region src/components/select.tsx
1698
- function Select({ ...props }) {
1699
- return /* @__PURE__ */ jsx(SelectPrimitive.Root, {
1700
- "data-slot": "select",
1701
- ...props
1702
- });
1703
- }
1704
- function SelectGroup({ ...props }) {
1705
- return /* @__PURE__ */ jsx(SelectPrimitive.Group, {
2968
+ const selectTriggerVariants = cva("flex w-fit items-center justify-between rounded-md border border-input bg-transparent py-2 text-sm whitespace-nowrap transition-colors outline-none select-none hover:border-ring focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive focus-visible:aria-invalid:ring-3 focus-visible:aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:focus-visible:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
2969
+ variants: { size: {
2970
+ default: "h-10 gap-2 px-3",
2971
+ sm: "h-8 gap-1.5 px-2"
2972
+ } },
2973
+ defaultVariants: { size: "default" }
2974
+ });
2975
+ const Select = Select$1.Root;
2976
+ function SelectGroup({ className, ...props }) {
2977
+ return /* @__PURE__ */ jsx(Select$1.Group, {
1706
2978
  "data-slot": "select-group",
2979
+ className: cn("scroll-my-1", className),
1707
2980
  ...props
1708
2981
  });
1709
2982
  }
1710
- function SelectValue({ ...props }) {
1711
- return /* @__PURE__ */ jsx(SelectPrimitive.Value, {
2983
+ function SelectValue({ className, ...props }) {
2984
+ return /* @__PURE__ */ jsx(Select$1.Value, {
1712
2985
  "data-slot": "select-value",
2986
+ className: cn("flex flex-1 text-left", className),
1713
2987
  ...props
1714
2988
  });
1715
2989
  }
1716
2990
  function SelectTrigger({ className, size = "default", children, ...props }) {
1717
- return /* @__PURE__ */ jsxs(SelectPrimitive.Trigger, {
2991
+ return /* @__PURE__ */ jsxs(Select$1.Trigger, {
1718
2992
  "data-slot": "select-trigger",
1719
2993
  "data-size": size,
1720
- className: cn("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
2994
+ className: cn(selectTriggerVariants({ size }), className),
1721
2995
  ...props,
1722
- children: [children, /* @__PURE__ */ jsx(SelectPrimitive.Icon, {
1723
- asChild: true,
1724
- children: /* @__PURE__ */ jsx(ChevronDownOutline, { className: "size-4 opacity-50" })
1725
- })]
2996
+ children: [children, /* @__PURE__ */ jsx(Select$1.Icon, { render: /* @__PURE__ */ jsx(ChevronDownIcon, { className: "pointer-events-none size-4 text-muted-foreground" }) })]
1726
2997
  });
1727
2998
  }
1728
- function SelectContent({ className, children, position = "popper", ...props }) {
1729
- return /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(SelectPrimitive.Content, {
1730
- "data-slot": "select-content",
1731
- 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 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className),
1732
- position,
1733
- ...props,
1734
- children: [
1735
- /* @__PURE__ */ jsx(SelectScrollUpButton, {}),
1736
- /* @__PURE__ */ jsx(SelectPrimitive.Viewport, {
1737
- className: cn("p-1", position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"),
1738
- children
1739
- }),
1740
- /* @__PURE__ */ jsx(SelectScrollDownButton, {})
1741
- ]
2999
+ function SelectContent({ className, children, side = "bottom", sideOffset = 4, align = "start", alignOffset = 0, alignItemWithTrigger = false, ...props }) {
3000
+ return /* @__PURE__ */ jsx(Select$1.Portal, { children: /* @__PURE__ */ jsx(Select$1.Positioner, {
3001
+ side,
3002
+ sideOffset,
3003
+ align,
3004
+ alignOffset,
3005
+ alignItemWithTrigger,
3006
+ className: "isolate z-50",
3007
+ children: /* @__PURE__ */ jsxs(Select$1.Popup, {
3008
+ "data-slot": "select-content",
3009
+ "data-align-trigger": alignItemWithTrigger,
3010
+ className: cn("relative isolate z-50 max-h-(--available-height) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-md p-1 bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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-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),
3011
+ ...props,
3012
+ children: [
3013
+ /* @__PURE__ */ jsx(SelectScrollUpButton, {}),
3014
+ /* @__PURE__ */ jsx(Select$1.List, { children }),
3015
+ /* @__PURE__ */ jsx(SelectScrollDownButton, {})
3016
+ ]
3017
+ })
1742
3018
  }) });
1743
3019
  }
1744
3020
  function SelectLabel({ className, ...props }) {
1745
- return /* @__PURE__ */ jsx(SelectPrimitive.Label, {
3021
+ return /* @__PURE__ */ jsx(Select$1.GroupLabel, {
1746
3022
  "data-slot": "select-label",
1747
- className: cn("text-muted-foreground px-2 py-1.5 text-xs", className),
3023
+ className: cn("p-2 text-xs text-muted-foreground", className),
1748
3024
  ...props
1749
3025
  });
1750
3026
  }
1751
3027
  function SelectItem({ className, children, ...props }) {
1752
- return /* @__PURE__ */ jsxs(SelectPrimitive.Item, {
3028
+ return /* @__PURE__ */ jsxs(Select$1.Item, {
1753
3029
  "data-slot": "select-item",
1754
- className: cn("focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground 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-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", className),
3030
+ className: cn("relative flex w-full cursor-default items-center gap-2 rounded-md p-2 pr-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:cursor-not-allowed data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", className),
1755
3031
  ...props,
1756
- children: [/* @__PURE__ */ jsx("span", {
1757
- className: "absolute right-2 flex size-3.5 items-center justify-center",
1758
- children: /* @__PURE__ */ jsx(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckOutline, { className: "size-4" }) })
1759
- }), /* @__PURE__ */ jsx(SelectPrimitive.ItemText, { children })]
3032
+ children: [/* @__PURE__ */ jsx(Select$1.ItemText, {
3033
+ className: "flex flex-1 shrink-0 gap-2 whitespace-nowrap",
3034
+ children
3035
+ }), /* @__PURE__ */ jsx(Select$1.ItemIndicator, {
3036
+ "data-slot": "select-item-indicator",
3037
+ render: /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center text-primary" }),
3038
+ children: /* @__PURE__ */ jsx(CheckIcon, { className: "pointer-events-none" })
3039
+ })]
1760
3040
  });
1761
3041
  }
1762
3042
  function SelectSeparator({ className, ...props }) {
1763
- return /* @__PURE__ */ jsx(SelectPrimitive.Separator, {
3043
+ return /* @__PURE__ */ jsx(Select$1.Separator, {
1764
3044
  "data-slot": "select-separator",
1765
- className: cn("bg-border pointer-events-none -mx-1 my-1 h-px", className),
3045
+ className: cn("pointer-events-none -mx-1 my-1 h-px bg-border", className),
1766
3046
  ...props
1767
3047
  });
1768
3048
  }
1769
3049
  function SelectScrollUpButton({ className, ...props }) {
1770
- return /* @__PURE__ */ jsx(SelectPrimitive.ScrollUpButton, {
3050
+ return /* @__PURE__ */ jsx(Select$1.ScrollUpArrow, {
1771
3051
  "data-slot": "select-scroll-up-button",
1772
- className: cn("flex cursor-default items-center justify-center py-1", className),
3052
+ className: cn("top-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4", className),
1773
3053
  ...props,
1774
- children: /* @__PURE__ */ jsx(ChevronUpOutline, { className: "size-4" })
3054
+ children: /* @__PURE__ */ jsx(ChevronUpIcon, {})
1775
3055
  });
1776
3056
  }
1777
3057
  function SelectScrollDownButton({ className, ...props }) {
1778
- return /* @__PURE__ */ jsx(SelectPrimitive.ScrollDownButton, {
3058
+ return /* @__PURE__ */ jsx(Select$1.ScrollDownArrow, {
1779
3059
  "data-slot": "select-scroll-down-button",
1780
- className: cn("flex cursor-default items-center justify-center py-1", className),
3060
+ className: cn("bottom-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4", className),
1781
3061
  ...props,
1782
- children: /* @__PURE__ */ jsx(ChevronDownOutline, { className: "size-4" })
3062
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, {})
1783
3063
  });
1784
3064
  }
1785
3065
 
1786
3066
  //#endregion
1787
3067
  //#region src/components/sheet.tsx
1788
3068
  function Sheet({ ...props }) {
1789
- return /* @__PURE__ */ jsx(DialogPrimitive.Root, {
3069
+ return /* @__PURE__ */ jsx(Dialog$1.Root, {
1790
3070
  "data-slot": "sheet",
1791
3071
  ...props
1792
3072
  });
1793
3073
  }
1794
3074
  function SheetTrigger({ ...props }) {
1795
- return /* @__PURE__ */ jsx(DialogPrimitive.Trigger, {
3075
+ return /* @__PURE__ */ jsx(Dialog$1.Trigger, {
1796
3076
  "data-slot": "sheet-trigger",
1797
3077
  ...props
1798
3078
  });
1799
3079
  }
1800
3080
  function SheetClose({ ...props }) {
1801
- return /* @__PURE__ */ jsx(DialogPrimitive.Close, {
3081
+ return /* @__PURE__ */ jsx(Dialog$1.Close, {
1802
3082
  "data-slot": "sheet-close",
1803
3083
  ...props
1804
3084
  });
1805
3085
  }
1806
3086
  function SheetPortal({ ...props }) {
1807
- return /* @__PURE__ */ jsx(DialogPrimitive.Portal, {
3087
+ return /* @__PURE__ */ jsx(Dialog$1.Portal, {
1808
3088
  "data-slot": "sheet-portal",
1809
3089
  ...props
1810
3090
  });
1811
3091
  }
1812
- const SheetOverlay = React$1.forwardRef(({ className, ...props }, forwardedRef) => {
1813
- return /* @__PURE__ */ jsx(DialogPrimitive.Overlay, {
3092
+ const SheetOverlay = React$1.forwardRef(({ className, ...props }, ref) => {
3093
+ return /* @__PURE__ */ jsx(Dialog$1.Backdrop, {
1814
3094
  "data-slot": "sheet-overlay",
1815
- className: cn("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50", className),
3095
+ className: cn("fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs", className),
1816
3096
  ...props,
1817
- ref: forwardedRef
3097
+ ref
1818
3098
  });
1819
3099
  });
1820
- function SheetContent({ className, children, side = "right", container, position = "fixed", ...props }) {
3100
+ SheetOverlay.displayName = "SheetOverlay";
3101
+ function SheetContent({ className, children, side = "right", showCloseButton = true, container, ...props }) {
1821
3102
  return /* @__PURE__ */ jsxs(SheetPortal, {
1822
3103
  container,
1823
- children: [/* @__PURE__ */ jsx(SheetOverlay, {}), /* @__PURE__ */ jsxs(DialogPrimitive.Content, {
3104
+ children: [/* @__PURE__ */ jsx(SheetOverlay, {}), /* @__PURE__ */ jsxs(Dialog$1.Popup, {
1824
3105
  "data-slot": "sheet-content",
1825
- className: cn("bg-card data-[state=open]:animate-in data-[state=closed]:animate-out z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500", position === "fixed" ? "fixed" : "absolute", side === "right" && "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm", side === "left" && "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm", side === "top" && "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b", side === "bottom" && "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t", className),
3106
+ "data-side": side,
3107
+ className: cn("fixed z-50 flex flex-col gap-4 bg-background bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm", className),
1826
3108
  ...props,
1827
- children: [children, /* @__PURE__ */ jsxs(DialogPrimitive.Close, {
1828
- className: "ring-offset-background focus:ring-ring data-[state=open]:bg-secondary 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",
1829
- children: [/* @__PURE__ */ jsx(CloseOutline, { className: "size-4" }), /* @__PURE__ */ jsx("span", {
3109
+ children: [children, showCloseButton && /* @__PURE__ */ jsxs(Dialog$1.Close, {
3110
+ "data-slot": "sheet-close",
3111
+ render: /* @__PURE__ */ jsx(Button, {
3112
+ variant: "ghost",
3113
+ className: "absolute top-4 right-4",
3114
+ size: "icon"
3115
+ }),
3116
+ children: [/* @__PURE__ */ jsx(XIcon, {}), /* @__PURE__ */ jsx("span", {
1830
3117
  className: "sr-only",
1831
3118
  children: "Close"
1832
3119
  })]
@@ -1849,16 +3136,16 @@ function SheetFooter({ className, ...props }) {
1849
3136
  });
1850
3137
  }
1851
3138
  function SheetTitle({ className, ...props }) {
1852
- return /* @__PURE__ */ jsx(DialogPrimitive.Title, {
3139
+ return /* @__PURE__ */ jsx(Dialog$1.Title, {
1853
3140
  "data-slot": "sheet-title",
1854
- className: cn("text-foreground font-semibold", className),
3141
+ className: cn("font-medium text-foreground", className),
1855
3142
  ...props
1856
3143
  });
1857
3144
  }
1858
3145
  function SheetDescription({ className, ...props }) {
1859
- return /* @__PURE__ */ jsx(DialogPrimitive.Description, {
3146
+ return /* @__PURE__ */ jsx(Dialog$1.Description, {
1860
3147
  "data-slot": "sheet-description",
1861
- className: cn("text-muted-foreground text-sm", className),
3148
+ className: cn("text-sm text-muted-foreground", className),
1862
3149
  ...props
1863
3150
  });
1864
3151
  }
@@ -1868,10 +3155,49 @@ function SheetDescription({ className, ...props }) {
1868
3155
  function Skeleton({ className, ...props }) {
1869
3156
  return /* @__PURE__ */ jsx("div", {
1870
3157
  "data-slot": "skeleton",
1871
- className: cn("bg-accent animate-pulse rounded-md", className),
3158
+ className: cn("animate-pulse rounded-md bg-muted", className),
3159
+ ...props
3160
+ });
3161
+ }
3162
+
3163
+ //#endregion
3164
+ //#region src/components/tooltip.tsx
3165
+ function TooltipProvider({ delay = 0, ...props }) {
3166
+ return /* @__PURE__ */ jsx(Tooltip$1.Provider, {
3167
+ "data-slot": "tooltip-provider",
3168
+ delay,
3169
+ ...props
3170
+ });
3171
+ }
3172
+ function Tooltip({ ...props }) {
3173
+ return /* @__PURE__ */ jsx(Tooltip$1.Root, {
3174
+ "data-slot": "tooltip",
3175
+ ...props
3176
+ });
3177
+ }
3178
+ function TooltipTrigger({ ...props }) {
3179
+ return /* @__PURE__ */ jsx(Tooltip$1.Trigger, {
3180
+ "data-slot": "tooltip-trigger",
1872
3181
  ...props
1873
3182
  });
1874
3183
  }
3184
+ const TooltipContent = React$1.forwardRef(({ className, side = "top", sideOffset = 4, align = "center", alignOffset = 0, children, ...props }, ref) => {
3185
+ return /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsx(Tooltip$1.Positioner, {
3186
+ align,
3187
+ alignOffset,
3188
+ side,
3189
+ sideOffset,
3190
+ className: "isolate z-50",
3191
+ children: /* @__PURE__ */ jsxs(Tooltip$1.Popup, {
3192
+ ref,
3193
+ "data-slot": "tooltip-content",
3194
+ className: cn("z-50 inline-flex w-fit max-w-sm origin-(--transform-origin) items-center gap-2 rounded-md bg-accent-foreground p-2 text-sm font-medium text-primary-foreground has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 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),
3195
+ ...props,
3196
+ children: [children, /* @__PURE__ */ jsx(Tooltip$1.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-accent-foreground fill-accent-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5" })]
3197
+ })
3198
+ }) });
3199
+ });
3200
+ TooltipContent.displayName = "TooltipContent";
1875
3201
 
1876
3202
  //#endregion
1877
3203
  //#region src/hooks/use-mobile.ts
@@ -1904,9 +3230,8 @@ function useSidebar() {
1904
3230
  if (!context) throw new Error("useSidebar must be used within a SidebarProvider.");
1905
3231
  return context;
1906
3232
  }
1907
- function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, disableMobile = true, className, style, children, ...props }) {
1908
- const isMobileDevice = useIsMobile();
1909
- const isMobile = disableMobile ? false : isMobileDevice;
3233
+ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }) {
3234
+ const isMobile = useIsMobile();
1910
3235
  const [openMobile, setOpenMobile] = React$1.useState(false);
1911
3236
  const [_open, _setOpen] = React$1.useState(defaultOpen);
1912
3237
  const open = openProp ?? _open;
@@ -1953,27 +3278,24 @@ function SidebarProvider({ defaultOpen = true, open: openProp, onOpenChange: set
1953
3278
  ]);
1954
3279
  return /* @__PURE__ */ jsx(SidebarContext.Provider, {
1955
3280
  value: contextValue,
1956
- children: /* @__PURE__ */ jsx(TooltipProvider, {
1957
- delayDuration: 0,
1958
- children: /* @__PURE__ */ jsx("div", {
1959
- "data-slot": "sidebar-wrapper",
1960
- style: {
1961
- "--sidebar-width": SIDEBAR_WIDTH,
1962
- "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
1963
- ...style
1964
- },
1965
- className: cn("group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full", className),
1966
- ...props,
1967
- children
1968
- })
3281
+ children: /* @__PURE__ */ jsx("div", {
3282
+ "data-slot": "sidebar-wrapper",
3283
+ style: {
3284
+ "--sidebar-width": SIDEBAR_WIDTH,
3285
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
3286
+ ...style
3287
+ },
3288
+ className: cn("group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar", className),
3289
+ ...props,
3290
+ children
1969
3291
  })
1970
3292
  });
1971
3293
  }
1972
- function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props }) {
3294
+ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, dir, ...props }) {
1973
3295
  const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
1974
3296
  if (collapsible === "none") return /* @__PURE__ */ jsx("div", {
1975
3297
  "data-slot": "sidebar",
1976
- className: cn("bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col", className),
3298
+ className: cn("flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground", className),
1977
3299
  ...props,
1978
3300
  children
1979
3301
  });
@@ -1982,10 +3304,11 @@ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas"
1982
3304
  onOpenChange: setOpenMobile,
1983
3305
  ...props,
1984
3306
  children: /* @__PURE__ */ jsxs(SheetContent, {
3307
+ dir,
1985
3308
  "data-sidebar": "sidebar",
1986
3309
  "data-slot": "sidebar",
1987
3310
  "data-mobile": "true",
1988
- className: "bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden",
3311
+ className: "w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",
1989
3312
  style: { "--sidebar-width": SIDEBAR_WIDTH_MOBILE },
1990
3313
  side,
1991
3314
  children: [/* @__PURE__ */ jsxs(SheetHeader, {
@@ -1998,7 +3321,7 @@ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas"
1998
3321
  })
1999
3322
  });
2000
3323
  return /* @__PURE__ */ jsxs("div", {
2001
- className: cn("group peer text-sidebar-foreground", isMobile ? "hidden md:block" : "block"),
3324
+ className: "group peer hidden text-sidebar-foreground md:block",
2002
3325
  "data-state": state,
2003
3326
  "data-collapsible": state === "collapsed" ? collapsible : "",
2004
3327
  "data-variant": variant,
@@ -2009,12 +3332,13 @@ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas"
2009
3332
  className: cn("relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear", "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)")
2010
3333
  }), /* @__PURE__ */ jsx("div", {
2011
3334
  "data-slot": "sidebar-container",
2012
- className: cn("fixed inset-y-0 z-10 w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear", 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, isMobile ? "hidden md:flex" : "flex"),
3335
+ "data-side": side,
3336
+ className: cn("fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex", 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),
2013
3337
  ...props,
2014
3338
  children: /* @__PURE__ */ jsx("div", {
2015
3339
  "data-sidebar": "sidebar",
2016
3340
  "data-slot": "sidebar-inner",
2017
- className: "bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm",
3341
+ className: "flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border",
2018
3342
  children
2019
3343
  })
2020
3344
  })]
@@ -2025,9 +3349,9 @@ function SidebarTrigger({ className, onClick, ...props }) {
2025
3349
  return /* @__PURE__ */ jsxs(Button, {
2026
3350
  "data-sidebar": "trigger",
2027
3351
  "data-slot": "sidebar-trigger",
2028
- variant: "outline",
2029
- size: "icon-sm",
2030
- className,
3352
+ variant: "ghost",
3353
+ size: "icon",
3354
+ className: cn(className),
2031
3355
  onClick: (event) => {
2032
3356
  onClick?.(event);
2033
3357
  toggleSidebar();
@@ -2040,7 +3364,7 @@ function SidebarTrigger({ className, onClick, ...props }) {
2040
3364
  });
2041
3365
  }
2042
3366
  function SidebarRail({ className, ...props }) {
2043
- const { isMobile, toggleSidebar } = useSidebar();
3367
+ const { toggleSidebar } = useSidebar();
2044
3368
  return /* @__PURE__ */ jsx("button", {
2045
3369
  "data-sidebar": "rail",
2046
3370
  "data-slot": "sidebar-rail",
@@ -2048,15 +3372,14 @@ function SidebarRail({ className, ...props }) {
2048
3372
  tabIndex: -1,
2049
3373
  onClick: toggleSidebar,
2050
3374
  title: "Toggle Sidebar",
2051
- className: cn("hover:after:bg-sidebar-border absolute inset-y-0 z-20 w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px]", "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize", "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", "hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full", "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", className, isMobile ? "hidden sm:flex" : "flex"),
3375
+ className: cn("absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2", "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize", "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar", "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", className),
2052
3376
  ...props
2053
3377
  });
2054
3378
  }
2055
3379
  function SidebarInset({ className, ...props }) {
2056
- const { isMobile } = useSidebar();
2057
3380
  return /* @__PURE__ */ jsx("main", {
2058
3381
  "data-slot": "sidebar-inset",
2059
- className: cn("bg-background relative flex w-full flex-1 flex-col min-w-0", isMobile && "md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2", !isMobile && "peer-data-[variant=inset]:m-2 peer-data-[variant=inset]:ml-0 peer-data-[variant=inset]:rounded-xl peer-data-[variant=inset]:shadow-sm peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2", className),
3382
+ className: cn("relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2", className),
2060
3383
  ...props
2061
3384
  });
2062
3385
  }
@@ -2064,7 +3387,7 @@ function SidebarInput({ className, ...props }) {
2064
3387
  return /* @__PURE__ */ jsx(Input, {
2065
3388
  "data-slot": "sidebar-input",
2066
3389
  "data-sidebar": "input",
2067
- className: cn("bg-background h-8 w-full shadow-none", className),
3390
+ className: cn("h-8 w-full bg-background shadow-none", className),
2068
3391
  ...props
2069
3392
  });
2070
3393
  }
@@ -2088,7 +3411,7 @@ function SidebarSeparator({ className, ...props }) {
2088
3411
  return /* @__PURE__ */ jsx(Separator, {
2089
3412
  "data-slot": "sidebar-separator",
2090
3413
  "data-sidebar": "separator",
2091
- className: cn("bg-sidebar-border mx-2 w-auto", className),
3414
+ className: cn("mx-2 w-auto bg-sidebar-border", className),
2092
3415
  ...props
2093
3416
  });
2094
3417
  }
@@ -2096,7 +3419,7 @@ function SidebarContent({ className, ...props }) {
2096
3419
  return /* @__PURE__ */ jsx("div", {
2097
3420
  "data-slot": "sidebar-content",
2098
3421
  "data-sidebar": "content",
2099
- className: cn("flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden", className),
3422
+ className: cn("no-scrollbar flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden", className),
2100
3423
  ...props
2101
3424
  });
2102
3425
  }
@@ -2108,22 +3431,26 @@ function SidebarGroup({ className, ...props }) {
2108
3431
  ...props
2109
3432
  });
2110
3433
  }
2111
- function SidebarGroupLabel({ className, asChild = false, ...props }) {
2112
- return /* @__PURE__ */ jsx(asChild ? Slot$1 : "div", {
2113
- "data-slot": "sidebar-group-label",
2114
- "data-sidebar": "group-label",
2115
- className: cn("text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0", className),
2116
- ...props
3434
+ function SidebarGroupLabel({ className, render, ...props }) {
3435
+ return useRender({
3436
+ defaultTagName: "div",
3437
+ props: mergeProps({ className: cn("flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", className) }, props),
3438
+ render,
3439
+ state: {
3440
+ slot: "sidebar-group-label",
3441
+ sidebar: "group-label"
3442
+ }
2117
3443
  });
2118
3444
  }
2119
- function SidebarGroupAction({ className, asChild = false, ...props }) {
2120
- const Comp = asChild ? Slot$1 : "button";
2121
- const { isMobile } = useSidebar();
2122
- return /* @__PURE__ */ jsx(Comp, {
2123
- "data-slot": "sidebar-group-action",
2124
- "data-sidebar": "group-action",
2125
- className: cn("text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", "after:absolute after:-inset-2", isMobile && "md:after:hidden", "group-data-[collapsible=icon]:hidden", className),
2126
- ...props
3445
+ function SidebarGroupAction({ className, render, ...props }) {
3446
+ return useRender({
3447
+ defaultTagName: "button",
3448
+ props: mergeProps({ className: cn("absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0", className) }, props),
3449
+ render,
3450
+ state: {
3451
+ slot: "sidebar-group-action",
3452
+ sidebar: "group-action"
3453
+ }
2127
3454
  });
2128
3455
  }
2129
3456
  function SidebarGroupContent({ className, ...props }) {
@@ -2150,7 +3477,7 @@ function SidebarMenuItem({ className, ...props }) {
2150
3477
  ...props
2151
3478
  });
2152
3479
  }
2153
- const sidebarMenuButtonVariants = cva("peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0", {
3480
+ const sidebarMenuButtonVariants = cva("peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate", {
2154
3481
  variants: {
2155
3482
  variant: {
2156
3483
  default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
@@ -2167,44 +3494,47 @@ const sidebarMenuButtonVariants = cva("peer/menu-button flex w-full items-center
2167
3494
  size: "default"
2168
3495
  }
2169
3496
  });
2170
- const SidebarMenuButton = React$1.forwardRef(({ asChild = false, isActive = false, variant = "default", size = "default", tooltip, className, ...props }, ref) => {
2171
- const Comp = asChild ? Slot$1 : "button";
3497
+ const SidebarMenuButton = React$1.forwardRef(({ render, isActive = false, variant = "default", size = "default", tooltip, className, ...props }, ref) => {
2172
3498
  const { isMobile, state } = useSidebar();
2173
- const button = /* @__PURE__ */ jsx(Comp, {
2174
- ref,
2175
- "data-slot": "sidebar-menu-button",
2176
- "data-sidebar": "menu-button",
2177
- "data-size": size,
2178
- "data-active": isActive,
2179
- className: cn(sidebarMenuButtonVariants({
2180
- variant,
2181
- size
2182
- }), className),
2183
- ...props
3499
+ const comp = useRender({
3500
+ defaultTagName: "button",
3501
+ props: mergeProps({
3502
+ className: cn(sidebarMenuButtonVariants({
3503
+ variant,
3504
+ size
3505
+ }), className),
3506
+ ref
3507
+ }, props),
3508
+ render: !tooltip ? render : /* @__PURE__ */ jsx(TooltipTrigger, { render }),
3509
+ state: {
3510
+ slot: "sidebar-menu-button",
3511
+ sidebar: "menu-button",
3512
+ size,
3513
+ active: isActive
3514
+ }
2184
3515
  });
2185
- if (!tooltip) return button;
2186
- let tooltipProps = tooltip;
2187
- if (typeof tooltipProps === "string") tooltipProps = { children: tooltipProps };
2188
- return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
2189
- asChild: true,
2190
- children: button
2191
- }), /* @__PURE__ */ jsx(TooltipContent, {
3516
+ if (!tooltip) return comp;
3517
+ if (typeof tooltip === "string") tooltip = { children: tooltip };
3518
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [comp, /* @__PURE__ */ jsx(TooltipContent, {
2192
3519
  side: "right",
2193
3520
  align: "center",
2194
3521
  hidden: state !== "collapsed" || isMobile,
2195
- ...tooltipProps
3522
+ ...tooltip
2196
3523
  })] });
2197
3524
  });
2198
3525
  SidebarMenuButton.displayName = "SidebarMenuButton";
2199
- const SidebarMenuAction = React$1.forwardRef(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
2200
- const Comp = asChild ? Slot$1 : "button";
2201
- const { isMobile } = useSidebar();
2202
- return /* @__PURE__ */ jsx(Comp, {
2203
- ref,
2204
- "data-slot": "sidebar-menu-action",
2205
- "data-sidebar": "menu-action",
2206
- className: cn("text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", "after:absolute after:-inset-2", isMobile && "md:after:hidden", "peer-data-[size=sm]/menu-button:top-1", "peer-data-[size=default]/menu-button:top-1.5", "peer-data-[size=lg]/menu-button:top-2.5", "group-data-[collapsible=icon]:hidden", showOnHover && cn("peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100", isMobile ? "md:opacity-0" : "opacity-0"), className),
2207
- ...props
3526
+ const SidebarMenuAction = React$1.forwardRef(({ className, render, showOnHover = false, ...props }, ref) => {
3527
+ return useRender({
3528
+ defaultTagName: "button",
3529
+ props: mergeProps({
3530
+ className: cn("absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0", showOnHover && "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0", className),
3531
+ ref
3532
+ }, props),
3533
+ render,
3534
+ state: {
3535
+ slot: "sidebar-menu-action",
3536
+ sidebar: "menu-action"
3537
+ }
2208
3538
  });
2209
3539
  });
2210
3540
  SidebarMenuAction.displayName = "SidebarMenuAction";
@@ -2212,14 +3542,15 @@ function SidebarMenuBadge({ className, ...props }) {
2212
3542
  return /* @__PURE__ */ jsx("div", {
2213
3543
  "data-slot": "sidebar-menu-badge",
2214
3544
  "data-sidebar": "menu-badge",
2215
- className: cn("text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none", "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground", "peer-data-[size=sm]/menu-button:top-1", "peer-data-[size=default]/menu-button:top-1.5", "peer-data-[size=lg]/menu-button:top-2.5", "group-data-[collapsible=icon]:hidden", className),
3545
+ className: cn("pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground", className),
2216
3546
  ...props
2217
3547
  });
2218
3548
  }
2219
- function SidebarMenuSkeleton({ className, showIcon = false, ...props }) {
2220
- const width = React$1.useMemo(() => {
3549
+ function SidebarMenuSkeleton({ className, showIcon = false, width: widthProp, ...props }) {
3550
+ const [fallbackWidth] = React$1.useState(() => {
2221
3551
  return `${Math.floor(Math.random() * 40) + 50}%`;
2222
- }, []);
3552
+ });
3553
+ const width = widthProp ?? fallbackWidth;
2223
3554
  return /* @__PURE__ */ jsxs("div", {
2224
3555
  "data-slot": "sidebar-menu-skeleton",
2225
3556
  "data-sidebar": "menu-skeleton",
@@ -2239,7 +3570,7 @@ function SidebarMenuSub({ className, ...props }) {
2239
3570
  return /* @__PURE__ */ jsx("ul", {
2240
3571
  "data-slot": "sidebar-menu-sub",
2241
3572
  "data-sidebar": "menu-sub",
2242
- className: cn("border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5", "group-data-[collapsible=icon]:hidden", className),
3573
+ className: cn("mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden", className),
2243
3574
  ...props
2244
3575
  });
2245
3576
  }
@@ -2251,45 +3582,57 @@ function SidebarMenuSubItem({ className, ...props }) {
2251
3582
  ...props
2252
3583
  });
2253
3584
  }
2254
- function SidebarMenuSubButton({ asChild = false, size = "md", isActive = false, className, ...props }) {
2255
- return /* @__PURE__ */ jsx(asChild ? Slot$1 : "a", {
2256
- "data-slot": "sidebar-menu-sub-button",
2257
- "data-sidebar": "menu-sub-button",
2258
- "data-size": size,
2259
- "data-active": isActive,
2260
- className: cn("text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0", "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground", size === "sm" && "text-xs", size === "md" && "text-sm", "group-data-[collapsible=icon]:hidden", className),
2261
- ...props
3585
+ function SidebarMenuSubButton({ render, size = "md", isActive = false, className, ...props }) {
3586
+ return useRender({
3587
+ defaultTagName: "a",
3588
+ props: mergeProps({ className: cn("flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground", className) }, props),
3589
+ render,
3590
+ state: {
3591
+ slot: "sidebar-menu-sub-button",
3592
+ sidebar: "menu-sub-button",
3593
+ size,
3594
+ active: isActive
3595
+ }
2262
3596
  });
2263
3597
  }
2264
3598
 
2265
3599
  //#endregion
2266
3600
  //#region src/components/slider.tsx
2267
- function Slider({ className, defaultValue, value, min = 0, max = 100, ...props }) {
3601
+ function Slider({ className, defaultValue, value, min = 0, max = 100, orientation = "horizontal", ...props }) {
2268
3602
  const _values = React$1.useMemo(() => Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max], [
2269
3603
  value,
2270
3604
  defaultValue,
2271
3605
  min,
2272
3606
  max
2273
3607
  ]);
2274
- return /* @__PURE__ */ jsxs(SliderPrimitive.Root, {
3608
+ return /* @__PURE__ */ jsx(Slider$1.Root, {
3609
+ className: cn("data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full", className),
2275
3610
  "data-slot": "slider",
3611
+ "data-orientation": orientation,
2276
3612
  defaultValue,
2277
3613
  value,
2278
3614
  min,
2279
3615
  max,
2280
- className: cn("relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col", className),
3616
+ orientation,
3617
+ thumbAlignment: "edge",
2281
3618
  ...props,
2282
- children: [/* @__PURE__ */ jsx(SliderPrimitive.Track, {
2283
- "data-slot": "slider-track",
2284
- className: cn("bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5"),
2285
- children: /* @__PURE__ */ jsx(SliderPrimitive.Range, {
2286
- "data-slot": "slider-range",
2287
- className: cn("bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full")
2288
- })
2289
- }), Array.from({ length: _values.length }, (_, index) => /* @__PURE__ */ jsx(SliderPrimitive.Thumb, {
2290
- "data-slot": "slider-thumb",
2291
- className: "border-primary bg-background ring-ring/50 block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50"
2292
- }, index))]
3619
+ children: /* @__PURE__ */ jsxs(Slider$1.Control, {
3620
+ "data-orientation": orientation,
3621
+ className: "relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col",
3622
+ children: [/* @__PURE__ */ jsx(Slider$1.Track, {
3623
+ "data-slot": "slider-track",
3624
+ "data-orientation": orientation,
3625
+ className: "relative grow overflow-hidden rounded-full bg-muted select-none data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5",
3626
+ children: /* @__PURE__ */ jsx(Slider$1.Indicator, {
3627
+ "data-slot": "slider-range",
3628
+ "data-orientation": orientation,
3629
+ className: "bg-primary select-none data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full"
3630
+ })
3631
+ }), Array.from({ length: _values.length }, (_, index) => /* @__PURE__ */ jsx(Slider$1.Thumb, {
3632
+ "data-slot": "slider-thumb",
3633
+ className: "block size-4 shrink-0 rounded-full border border-ring bg-background shadow-sm ring-ring/50 transition-[color,box-shadow] select-none hover:ring-3 focus-visible:ring-3 focus-visible:outline-hidden data-disabled:pointer-events-none"
3634
+ }, index))]
3635
+ })
2293
3636
  });
2294
3637
  }
2295
3638
 
@@ -2301,12 +3644,22 @@ const Toaster = ({ ...props }) => {
2301
3644
  theme,
2302
3645
  className: "toaster group",
2303
3646
  icons: {
2304
- success: /* @__PURE__ */ jsx(CheckCircleOutline, { className: "size-4" }),
3647
+ success: /* @__PURE__ */ jsx(CircleCheck, { className: "size-4" }),
2305
3648
  info: /* @__PURE__ */ jsx(Info, { className: "size-4" }),
2306
3649
  warning: /* @__PURE__ */ jsx(TriangleAlertIcon, { className: "size-4" }),
2307
- error: /* @__PURE__ */ jsx(OctagonXIcon, { className: "size-4" }),
3650
+ error: /* @__PURE__ */ jsx(CircleAlertIcon, { className: "size-4" }),
2308
3651
  loading: /* @__PURE__ */ jsx(Loader2Icon, { className: "size-4 animate-spin" })
2309
3652
  },
3653
+ toastOptions: { classNames: {
3654
+ toast: "group toast !rounded-3xl !border !px-4 !py-4 !shadow-[0px_4px_12px_-1px_rgba(0,0,0,0.1)] !gap-2 !items-center",
3655
+ title: "!font-medium !text-sm",
3656
+ description: "!text-sm !text-muted-foreground",
3657
+ default: "",
3658
+ info: "!bg-info-background !border-info/35 [&_[data-icon]>svg]:!text-info",
3659
+ success: "!bg-success-background !border-success/35 [&_[data-icon]>svg]:!text-success",
3660
+ error: "!bg-destructive-background !border-destructive/35 [&_[data-icon]>svg]:!text-destructive",
3661
+ warning: "!bg-warning-background !border-warning/35 [&_[data-icon]>svg]:!text-warning"
3662
+ } },
2310
3663
  style: {
2311
3664
  "--normal-bg": "var(--popover)",
2312
3665
  "--normal-text": "var(--popover-foreground)",
@@ -2353,81 +3706,61 @@ function Spinner({ className, size, ...props }) {
2353
3706
  //#endregion
2354
3707
  //#region src/components/switch.tsx
2355
3708
  function Switch({ className, ...props }) {
2356
- return /* @__PURE__ */ jsx(SwitchPrimitive.Root, {
3709
+ return /* @__PURE__ */ jsx(Switch$1.Root, {
2357
3710
  "data-slot": "switch",
2358
- className: cn("peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className),
3711
+ className: cn("peer relative inline-flex h-6 w-10 shrink-0 items-center rounded-full border border-transparent p-1 transition-all outline-none active:opacity-60 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive focus-visible:aria-invalid:ring-3 focus-visible:aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:focus-visible:aria-invalid:ring-destructive/40 data-checked:bg-primary aria-invalid:data-checked:bg-destructive data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50", className),
2359
3712
  ...props,
2360
- children: /* @__PURE__ */ jsx(SwitchPrimitive.Thumb, {
3713
+ children: /* @__PURE__ */ jsx(Switch$1.Thumb, {
2361
3714
  "data-slot": "switch-thumb",
2362
- className: cn("bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0")
3715
+ className: "pointer-events-none block size-4 rounded-full bg-background ring-0 transition-transform data-unchecked:translate-x-0 data-checked:translate-x-4 dark:data-checked:bg-primary-foreground dark:data-unchecked:bg-foreground"
2363
3716
  })
2364
3717
  });
2365
3718
  }
2366
3719
 
2367
3720
  //#endregion
2368
3721
  //#region src/components/tabs.tsx
2369
- function Tabs({ className, ...props }) {
2370
- return /* @__PURE__ */ jsx(TabsPrimitive.Root, {
3722
+ function Tabs({ className, orientation = "horizontal", ...props }) {
3723
+ return /* @__PURE__ */ jsx(Tabs$1.Root, {
2371
3724
  "data-slot": "tabs",
2372
- className: cn("flex flex-col gap-2", className),
3725
+ "data-orientation": orientation,
3726
+ className: cn("group/tabs flex gap-2 data-[orientation=horizontal]:flex-col", className),
2373
3727
  ...props
2374
3728
  });
2375
3729
  }
2376
3730
  function TabsList({ className, ...props }) {
2377
- return /* @__PURE__ */ jsx(TabsPrimitive.List, {
3731
+ return /* @__PURE__ */ jsx(Tabs$1.List, {
2378
3732
  "data-slot": "tabs-list",
2379
- className: cn("bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]", className),
3733
+ className: cn("group/tabs-list inline-flex w-fit items-center justify-center gap-4 text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col", className),
2380
3734
  ...props
2381
3735
  });
2382
3736
  }
2383
3737
  function TabsTrigger({ className, ...props }) {
2384
- return /* @__PURE__ */ jsx(TabsPrimitive.Trigger, {
3738
+ return /* @__PURE__ */ jsx(Tabs$1.Tab, {
2385
3739
  "data-slot": "tabs-trigger",
2386
- className: cn("data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-[0px_1px_2px_-1px_rgba(0,0,0,0.10)] data-[state=active]:shadow-[0px_1px_3px_0px_rgba(0,0,0,0.10)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
3740
+ className: cn("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground data-active:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", "after:absolute after:rounded-full after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-1.5 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0.5 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 data-active:after:opacity-100", className),
2387
3741
  ...props
2388
3742
  });
2389
3743
  }
2390
3744
  function TabsContent({ className, ...props }) {
2391
- return /* @__PURE__ */ jsx(TabsPrimitive.Content, {
3745
+ return /* @__PURE__ */ jsx(Tabs$1.Panel, {
2392
3746
  "data-slot": "tabs-content",
2393
- className: cn("flex-1 outline-none", className),
3747
+ className: cn("flex-1 text-sm outline-none", className),
2394
3748
  ...props
2395
3749
  });
2396
3750
  }
2397
3751
 
2398
- //#endregion
2399
- //#region src/components/tab-bar.tsx
2400
- function TabBar({ tabs, activeTab, onTabChange, renderTab, className }) {
2401
- return /* @__PURE__ */ jsx(Tabs, {
2402
- value: activeTab,
2403
- onValueChange: onTabChange,
2404
- className: `w-full ${className || ""}`,
2405
- children: /* @__PURE__ */ jsx(TabsList, {
2406
- className: "w-full h-auto flex border-t border-border bg-card p-0 rounded-none shadow-none",
2407
- children: tabs.map((tab) => /* @__PURE__ */ jsx(TabsTrigger, {
2408
- value: tab.value,
2409
- className: ["flex flex-col items-center flex-1 py-2 px-0 transition-colors border-b-2 border-b-transparent rounded-none bg-transparent data-[state=active]:shadow-none dark:data-[state=active]:bg-transparent dark:data-[state=active]:border-none", activeTab === tab.value ? "text-foreground font-semibold border-b-primary" : "text-muted-foreground font-normal"].join(" "),
2410
- children: renderTab ? renderTab(tab, activeTab === tab.value) : /* @__PURE__ */ jsxs(Fragment, { children: [tab.renderIcon?.(), /* @__PURE__ */ jsx("span", {
2411
- className: "text-xs",
2412
- children: tab.label
2413
- })] })
2414
- }, tab.value))
2415
- })
2416
- });
2417
- }
2418
-
2419
3752
  //#endregion
2420
3753
  //#region src/components/toggle.tsx
2421
- const toggleVariants = cva("inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap", {
3754
+ const toggleVariants = cva("group/toggle inline-flex items-center justify-center gap-1 rounded-md bg-transparent text-sm font-medium whitespace-nowrap transition-all outline-none hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 data-disabled:pointer-events-none data-disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
2422
3755
  variants: {
2423
3756
  variant: {
2424
- default: "bg-transparent",
2425
- outline: "border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground"
3757
+ default: "data-pressed:bg-secondary data-pressed:text-secondary-foreground data-pressed:hover:bg-secondary data-pressed:hover:text-secondary-foreground",
3758
+ outline: "border border-input data-pressed:bg-muted"
2426
3759
  },
2427
3760
  size: {
2428
- default: "h-9 px-2 min-w-9",
2429
- sm: "h-8 px-1.5 min-w-8",
2430
- lg: "h-10 px-2.5 min-w-10"
3761
+ default: "h-8 min-w-8 px-2 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",
3762
+ sm: "h-6 min-w-6 px-1.5 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 [&_svg:not([class*='size-'])]:size-3.5",
3763
+ lg: "h-10 min-w-10 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2"
2431
3764
  }
2432
3765
  },
2433
3766
  defaultVariants: {
@@ -2435,54 +3768,139 @@ const toggleVariants = cva("inline-flex items-center justify-center gap-2 rounde
2435
3768
  size: "default"
2436
3769
  }
2437
3770
  });
2438
- const Toggle = React$1.forwardRef(({ className, variant, size, ...props }, ref) => /* @__PURE__ */ jsx(TogglePrimitive.Root, {
2439
- ref,
2440
- "data-slot": "toggle",
2441
- className: cn(toggleVariants({
2442
- variant,
2443
- size,
2444
- className
2445
- })),
2446
- ...props
2447
- }));
2448
- Toggle.displayName = "Toggle";
3771
+ function Toggle({ className, variant = "default", size = "default", ...props }) {
3772
+ return /* @__PURE__ */ jsx(Toggle$1, {
3773
+ "data-slot": "toggle",
3774
+ className: cn(toggleVariants({
3775
+ variant,
3776
+ size,
3777
+ className
3778
+ })),
3779
+ ...props
3780
+ });
3781
+ }
2449
3782
 
2450
3783
  //#endregion
2451
3784
  //#region src/components/toggle-group.tsx
2452
3785
  const ToggleGroupContext = React$1.createContext({
2453
3786
  size: "default",
2454
- variant: "default"
3787
+ variant: "default",
3788
+ spacing: 0,
3789
+ orientation: "horizontal",
3790
+ block: false
2455
3791
  });
2456
- function ToggleGroup({ className, variant, size, children, ...props }) {
2457
- return /* @__PURE__ */ jsx(ToggleGroupPrimitive.Root, {
3792
+ function ToggleGroup({ className, variant, size, spacing = 0, orientation = "horizontal", block = false, children, ...props }) {
3793
+ return /* @__PURE__ */ jsx(ToggleGroup$1, {
2458
3794
  "data-slot": "toggle-group",
2459
3795
  "data-variant": variant,
2460
3796
  "data-size": size,
2461
- className: cn("group/toggle-group flex w-fit items-center rounded-md data-[variant=outline]:shadow-xs", className),
3797
+ "data-spacing": spacing,
3798
+ "data-orientation": orientation,
3799
+ "data-block": block,
3800
+ style: { "--gap": spacing },
3801
+ className: cn("group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-md data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch data-[block=true]:w-full", className),
2462
3802
  ...props,
2463
3803
  children: /* @__PURE__ */ jsx(ToggleGroupContext.Provider, {
2464
3804
  value: {
2465
3805
  variant,
2466
- size
3806
+ size,
3807
+ spacing,
3808
+ orientation,
3809
+ block
2467
3810
  },
2468
3811
  children
2469
3812
  })
2470
3813
  });
2471
3814
  }
2472
- function ToggleGroupItem({ className, children, variant, size, ...props }) {
3815
+ function ToggleGroupItem({ className, children, variant = "default", size = "default", ...props }) {
2473
3816
  const context = React$1.useContext(ToggleGroupContext);
2474
- return /* @__PURE__ */ jsx(ToggleGroupPrimitive.Item, {
3817
+ return /* @__PURE__ */ jsx(Toggle$1, {
2475
3818
  "data-slot": "toggle-group-item",
2476
3819
  "data-variant": context.variant || variant,
2477
3820
  "data-size": context.size || size,
2478
- className: cn(toggleVariants({
3821
+ "data-spacing": context.spacing,
3822
+ className: cn("shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 group-data-[spacing=0]/toggle-group:shadow-none focus:z-10 focus-visible:z-10 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pr-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:pl-1.5 group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:first:rounded-l-md group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:first:rounded-t-md group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:last:rounded-r-md group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:last:rounded-b-md group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:border-l-0 group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:border-t-0 group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:first:border-l group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:first:border-t group-data-[block=true]/toggle-group:flex-1", toggleVariants({
2479
3823
  variant: context.variant || variant,
2480
3824
  size: context.size || size
2481
- }), "min-w-0 flex-1 shrink-0 rounded-none shadow-none first:rounded-l-md last:rounded-r-md focus:z-10 focus-visible:z-10 data-[variant=outline]:border-l-0 data-[variant=outline]:first:border-l", className),
3825
+ }), className),
2482
3826
  ...props,
2483
3827
  children
2484
3828
  });
2485
3829
  }
2486
3830
 
2487
3831
  //#endregion
2488
- export { Alert, AlertAction, AlertDescription, AlertTitle, Avatar, AvatarFallback, AvatarImage, Badge, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxTrigger, ComboboxValue, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, CountryFlag, 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, EmojiPicker, EmojiPickerCategories, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Label, List, ListCol, ListRow, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, 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, Slot, Spinner, Switch, TabBar, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, ThemeProvider, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonGroupVariants, buttonVariants, cn, inputOTPVariants, spinnerVariants, toast, toggleVariants, useComboboxAnchor, useSidebar, useTheme };
3832
+ //#region src/hooks/use-audio-gauge.ts
3833
+ /**
3834
+ * Drives a `<Gauge>` from the system microphone. Opens the default audio
3835
+ * input via `getUserMedia` and runs a smoothed frequency-domain analyser.
3836
+ *
3837
+ * The returned `value` is calibrated for typical speech: a normal speaking
3838
+ * voice fills several segments, and the meter saturates at ~50% of the
3839
+ * digital signal range (matches the existing tractor-based audio meters
3840
+ * shipped in `aw-web` and `phone`).
3841
+ *
3842
+ * @example
3843
+ * const { value, error } = useAudioGauge()
3844
+ * return (
3845
+ * <>
3846
+ * <Gauge value={value} />
3847
+ * {error && <p>Microphone unavailable: {error.message}</p>}
3848
+ * </>
3849
+ * )
3850
+ */
3851
+ function useAudioGauge(options = {}) {
3852
+ const { intervalMs = 16, fftSize = 32, smoothing = .3, gain = 2 } = options;
3853
+ const [value, setValue] = React$1.useState(0);
3854
+ const [error, setError] = React$1.useState(null);
3855
+ const gainRef = React$1.useRef(gain);
3856
+ gainRef.current = gain;
3857
+ React$1.useEffect(() => {
3858
+ let cancelled = false;
3859
+ let stream;
3860
+ let ctx;
3861
+ let intervalId;
3862
+ setError(null);
3863
+ navigator.mediaDevices.getUserMedia({ audio: true }).then((s) => {
3864
+ if (cancelled) {
3865
+ s.getTracks().forEach((track) => track.stop());
3866
+ return;
3867
+ }
3868
+ stream = s;
3869
+ ctx = new AudioContext();
3870
+ const source = ctx.createMediaStreamSource(s);
3871
+ const analyser = ctx.createAnalyser();
3872
+ analyser.fftSize = fftSize;
3873
+ analyser.smoothingTimeConstant = smoothing;
3874
+ source.connect(analyser);
3875
+ const buffer = new Uint8Array(analyser.frequencyBinCount);
3876
+ ctx.resume().catch(() => {});
3877
+ intervalId = setInterval(() => {
3878
+ analyser.getByteFrequencyData(buffer);
3879
+ let sum = 0;
3880
+ for (const v of buffer) sum += v;
3881
+ const next = Math.round(sum / buffer.length / 255 * 8 * gainRef.current);
3882
+ setValue((prev) => prev === next ? prev : next);
3883
+ }, intervalMs);
3884
+ }).catch((err) => {
3885
+ if (!cancelled) setError(err);
3886
+ });
3887
+ return () => {
3888
+ cancelled = true;
3889
+ if (intervalId !== void 0) clearInterval(intervalId);
3890
+ stream?.getTracks().forEach((track) => track.stop());
3891
+ ctx?.close().catch(() => {});
3892
+ setValue(0);
3893
+ };
3894
+ }, [
3895
+ intervalMs,
3896
+ fftSize,
3897
+ smoothing
3898
+ ]);
3899
+ return {
3900
+ value,
3901
+ error
3902
+ };
3903
+ }
3904
+
3905
+ //#endregion
3906
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertAction, AlertAction as BannerAction, AlertDescription, AlertDescription as BannerDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AlertTitle as BannerTitle, Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage, Badge, BadgeGroup, BadgeGroupCount, Banner, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxLabel, ComboboxList, ComboboxSeparator, ComboboxTrigger, ComboboxValue, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, CounterBadge, CountryFlag, DataTable, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerBackdrop, DrawerBar, DrawerClose, DrawerContent, DrawerCreateHandle, DrawerDescription, DrawerFooter, DrawerHeader, DrawerMenu, DrawerMenuCheckboxItem, DrawerMenuGroup, DrawerMenuGroupLabel, DrawerMenuItem, DrawerMenuRadioGroup, DrawerMenuRadioItem, DrawerMenuSeparator, DrawerMenuTrigger, DrawerPanel, DrawerPopup, DrawerPortal, DrawerPrimitive, DrawerSwipeArea, DrawerTitle, DrawerTrigger, DrawerViewport, DropdownMenu, DropdownMenuAddon, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Dropzone, DropzoneActions, DropzoneContent, DropzoneDescription, DropzoneIcon, DropzoneTitle, DropzoneTrigger, EmojiPicker, EmojiPickerCategories, EmojiPickerContent, EmojiPickerTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, FAB, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, Gauge, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Label, List, ListCol, ListRow, NotificationQueueProvider, NotificationSlot, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Progress, ProgressIndicator, ProgressLabel, ProgressTrack, ProgressValue, RadioGroup, RadioGroupItem, ScrollArea, ScrollAreaPrimitive, 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, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, ThemeProvider, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, alertVariants, badgeVariants, bannerVariants, buttonGroupVariants, buttonVariants, cn, counterBadgeVariants, fabVariants, selectTriggerVariants, spinnerVariants, toast, toggleVariants, useAudioGauge, useComboboxAnchor, useNotification, useNotificationQueue, useSidebar, useTheme };