@kinetixui/ui 0.1.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.
Files changed (81) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.d.ts +1176 -0
  3. package/dist/index.js +3939 -0
  4. package/package.json +106 -0
  5. package/src/components/accordion.tsx +52 -0
  6. package/src/components/alert-dialog.tsx +115 -0
  7. package/src/components/alert.tsx +47 -0
  8. package/src/components/aspect-ratio.tsx +7 -0
  9. package/src/components/audio-player.tsx +150 -0
  10. package/src/components/avatar.tsx +76 -0
  11. package/src/components/badge.tsx +40 -0
  12. package/src/components/breadcrumb.tsx +77 -0
  13. package/src/components/button.tsx +119 -0
  14. package/src/components/calendar.tsx +60 -0
  15. package/src/components/card.tsx +50 -0
  16. package/src/components/carousel.tsx +181 -0
  17. package/src/components/chart.tsx +177 -0
  18. package/src/components/checkbox.tsx +38 -0
  19. package/src/components/circular-progress.tsx +67 -0
  20. package/src/components/code-block.tsx +96 -0
  21. package/src/components/collapsible.tsx +9 -0
  22. package/src/components/command.tsx +123 -0
  23. package/src/components/context-menu.tsx +132 -0
  24. package/src/components/data-table.tsx +92 -0
  25. package/src/components/date-picker.tsx +68 -0
  26. package/src/components/dialog.tsx +101 -0
  27. package/src/components/drawer.tsx +82 -0
  28. package/src/components/dropdown-menu.tsx +132 -0
  29. package/src/components/fab.tsx +58 -0
  30. package/src/components/field.tsx +128 -0
  31. package/src/components/file-upload.tsx +183 -0
  32. package/src/components/footer.tsx +62 -0
  33. package/src/components/form.tsx +130 -0
  34. package/src/components/hover-card.tsx +28 -0
  35. package/src/components/image.tsx +87 -0
  36. package/src/components/inform.tsx +82 -0
  37. package/src/components/input-group.tsx +96 -0
  38. package/src/components/input-otp.tsx +63 -0
  39. package/src/components/input.tsx +72 -0
  40. package/src/components/label.tsx +20 -0
  41. package/src/components/list.tsx +69 -0
  42. package/src/components/menubar.tsx +168 -0
  43. package/src/components/metric.tsx +51 -0
  44. package/src/components/modal.tsx +126 -0
  45. package/src/components/navigation-bar.tsx +49 -0
  46. package/src/components/navigation-menu.tsx +117 -0
  47. package/src/components/number-input.tsx +86 -0
  48. package/src/components/pagination.tsx +77 -0
  49. package/src/components/password-input.tsx +36 -0
  50. package/src/components/popover.tsx +32 -0
  51. package/src/components/progress.tsx +24 -0
  52. package/src/components/quote.tsx +34 -0
  53. package/src/components/radio-group.tsx +44 -0
  54. package/src/components/rating.tsx +88 -0
  55. package/src/components/resizable.tsx +40 -0
  56. package/src/components/scroll-area.tsx +39 -0
  57. package/src/components/select.tsx +124 -0
  58. package/src/components/separator.tsx +25 -0
  59. package/src/components/sheet.tsx +104 -0
  60. package/src/components/sidebar.tsx +390 -0
  61. package/src/components/skeleton.tsx +9 -0
  62. package/src/components/slider.tsx +24 -0
  63. package/src/components/sonner.tsx +30 -0
  64. package/src/components/spinner.tsx +43 -0
  65. package/src/components/stepper.tsx +75 -0
  66. package/src/components/switch.tsx +37 -0
  67. package/src/components/tab-bar.tsx +58 -0
  68. package/src/components/table-of-contents.tsx +46 -0
  69. package/src/components/table.tsx +70 -0
  70. package/src/components/tabs.tsx +54 -0
  71. package/src/components/tag.tsx +56 -0
  72. package/src/components/textarea.tsx +56 -0
  73. package/src/components/toggle-group.tsx +41 -0
  74. package/src/components/toggle.tsx +34 -0
  75. package/src/components/tooltip.tsx +31 -0
  76. package/src/index.ts +305 -0
  77. package/src/lib/utils.ts +7 -0
  78. package/src/stories/Button.stories.tsx +155 -0
  79. package/src/stories/Input.stories.tsx +80 -0
  80. package/src/stories/Textarea.stories.tsx +69 -0
  81. package/tailwind.config.ts +107 -0
package/dist/index.js ADDED
@@ -0,0 +1,3939 @@
1
+ "use client";
2
+
3
+ // src/components/button.tsx
4
+ import * as React from "react";
5
+ import { Slot } from "@radix-ui/react-slot";
6
+ import { cva } from "class-variance-authority";
7
+
8
+ // src/lib/utils.ts
9
+ import { clsx } from "clsx";
10
+ import { twMerge } from "tailwind-merge";
11
+ function cn(...inputs) {
12
+ return twMerge(clsx(inputs));
13
+ }
14
+
15
+ // src/components/button.tsx
16
+ import { jsx } from "react/jsx-runtime";
17
+ var buttonVariants = cva(
18
+ [
19
+ "inline-flex items-center justify-center gap-1 shrink-0",
20
+ "font-sans font-medium whitespace-nowrap select-none",
21
+ "rounded-md transition-colors outline-none",
22
+ "focus-visible:shadow-focus",
23
+ "disabled:pointer-events-none disabled:opacity-50",
24
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-[18px]"
25
+ ],
26
+ {
27
+ variants: {
28
+ variant: {
29
+ // bg primary / text on-primary; hover+active step down the blue ramp; disabled -> border grey
30
+ Primary: "bg-primary text-primary-foreground hover:bg-[--color-blue-600] active:bg-[--color-blue-700] disabled:bg-border disabled:text-muted-foreground",
31
+ // rest = secondaryContainer; hover/active promote to full secondary with on-secondary text
32
+ Secondary: "bg-secondary text-secondary-foreground hover:bg-[--color-green-500] hover:text-[--color-green-50] active:bg-[--color-green-600] active:text-[--color-green-50] focus-visible:bg-secondary disabled:bg-border disabled:text-muted-foreground",
33
+ // 1px outline; hover fills with accent (LightBlue); active pins primary border+text
34
+ Outline: "border border-input bg-transparent text-foreground hover:bg-accent active:border-primary active:bg-accent active:text-primary disabled:border-input disabled:text-muted-foreground disabled:bg-transparent",
35
+ Destructive: "bg-destructive text-destructive-foreground hover:brightness-95 active:brightness-90 disabled:bg-border disabled:text-muted-foreground",
36
+ Ghost: "bg-transparent text-foreground hover:bg-accent active:bg-accent active:text-primary disabled:text-muted-foreground disabled:bg-transparent",
37
+ Link: "bg-transparent text-primary underline-offset-4 hover:underline hover:text-foreground rounded-none px-0 disabled:text-muted-foreground disabled:no-underline"
38
+ },
39
+ size: {
40
+ // padding = Figma spacing/3 + spacing/2 ; type = Label Small (11/16, +0.5 tracking)
41
+ sm: "px-3 py-2 text-[11px] leading-4 tracking-[0.5px]",
42
+ // spacing/4 + spacing/3 ; Label Medium (12/16, +0.5)
43
+ md: "px-4 py-3 text-[12px] leading-4 tracking-[0.5px]",
44
+ // spacing/6 + spacing/3 ; Label Large (14/20, +0.1)
45
+ lg: "px-6 py-3 text-[14px] leading-5 tracking-[0.1px]",
46
+ // spacing/3 all round, square
47
+ icon: "p-3 [&>*:not(svg)]:sr-only"
48
+ },
49
+ /** force a static visual state — leave undefined for real interaction */
50
+ state: {
51
+ Default: "",
52
+ Hover: "",
53
+ Focus: "shadow-focus",
54
+ Active: "",
55
+ Disabled: "pointer-events-none opacity-50"
56
+ },
57
+ /** corner style — matches the design source's Corners property */
58
+ corners: {
59
+ sharp: "rounded-none",
60
+ default: "",
61
+ pill: "rounded-full"
62
+ }
63
+ },
64
+ compoundVariants: [
65
+ { variant: "Destructive", class: "focus-visible:shadow-focus-destructive" },
66
+ { variant: "Primary", state: "Hover", class: "bg-[--color-blue-600]" },
67
+ { variant: "Primary", state: "Active", class: "bg-[--color-blue-700]" },
68
+ { variant: "Secondary", state: "Hover", class: "bg-[--color-green-500] text-[--color-green-50]" },
69
+ { variant: "Secondary", state: "Active", class: "bg-[--color-green-600] text-[--color-green-50]" },
70
+ { variant: "Outline", state: "Hover", class: "bg-accent" },
71
+ { variant: "Outline", state: "Active", class: "border-primary bg-accent text-primary" },
72
+ { variant: "Ghost", state: "Hover", class: "bg-accent" },
73
+ { variant: "Ghost", state: "Active", class: "bg-accent text-primary" },
74
+ { variant: "Link", state: "Hover", class: "underline text-foreground" },
75
+ { variant: "Link", size: ["sm", "md", "lg"], class: "py-2 px-0 h-auto" }
76
+ ],
77
+ defaultVariants: { variant: "Primary", size: "md", state: "Default", corners: "default" }
78
+ }
79
+ );
80
+ var Button = React.forwardRef(
81
+ ({ className, variant, size, state, corners, asChild = false, disabled, ...props }, ref) => {
82
+ const Comp = asChild ? Slot : "button";
83
+ return /* @__PURE__ */ jsx(
84
+ Comp,
85
+ {
86
+ ref,
87
+ "data-slot": "button",
88
+ "data-variant": variant ?? "Primary",
89
+ "data-size": size ?? "md",
90
+ disabled: disabled || state === "Disabled",
91
+ className: cn(buttonVariants({ variant, size, state, corners }), className),
92
+ ...props
93
+ }
94
+ );
95
+ }
96
+ );
97
+ Button.displayName = "Button";
98
+
99
+ // src/components/input.tsx
100
+ import * as React2 from "react";
101
+ import { cva as cva2 } from "class-variance-authority";
102
+ import { jsx as jsx2 } from "react/jsx-runtime";
103
+ var inputVariants = cva2(
104
+ [
105
+ "flex w-full border border-input bg-background px-3 py-3",
106
+ "font-sans text-[14px] leading-5 tracking-[0.25px] text-foreground",
107
+ "placeholder:text-muted-foreground",
108
+ "outline-none transition-colors",
109
+ "focus-visible:border-primary focus-visible:shadow-focus",
110
+ "disabled:cursor-not-allowed disabled:opacity-50",
111
+ "aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-visible:border-destructive aria-[invalid=true]:focus-visible:shadow-focus-destructive"
112
+ ],
113
+ {
114
+ variants: {
115
+ state: {
116
+ Default: "",
117
+ Focus: "border-primary shadow-focus",
118
+ Error: "border-destructive",
119
+ Disabled: "opacity-50 pointer-events-none"
120
+ },
121
+ /** corner style — matches the design source's Corners property */
122
+ corners: {
123
+ sharp: "rounded-none",
124
+ default: "rounded-sm",
125
+ rounded: "rounded-md",
126
+ pill: "rounded-full px-4"
127
+ }
128
+ },
129
+ defaultVariants: { state: "Default", corners: "default" }
130
+ }
131
+ );
132
+ var Input = React2.forwardRef(
133
+ ({ className, state, corners, type = "text", disabled, "aria-invalid": ariaInvalid, ...props }, ref) => /* @__PURE__ */ jsx2(
134
+ "input",
135
+ {
136
+ ref,
137
+ type,
138
+ "data-slot": "input",
139
+ "data-state": state ? state.toLowerCase() : void 0,
140
+ "aria-invalid": ariaInvalid ?? (state === "Error" || void 0),
141
+ disabled: disabled || state === "Disabled",
142
+ className: cn(inputVariants({ state, corners }), className),
143
+ ...props
144
+ }
145
+ )
146
+ );
147
+ Input.displayName = "Input";
148
+
149
+ // src/components/textarea.tsx
150
+ import * as React3 from "react";
151
+ import { cva as cva3 } from "class-variance-authority";
152
+ import { jsx as jsx3 } from "react/jsx-runtime";
153
+ var textareaVariants = cva3(
154
+ [
155
+ "flex w-full min-h-[100px] resize-y rounded-sm border border-input bg-background px-3 py-3",
156
+ "font-sans text-[14px] leading-5 tracking-[0.25px] text-foreground",
157
+ "placeholder:text-muted-foreground",
158
+ "outline-none transition-colors",
159
+ "focus-visible:border-primary focus-visible:shadow-focus",
160
+ "disabled:cursor-not-allowed disabled:opacity-50",
161
+ "aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-visible:border-destructive aria-[invalid=true]:focus-visible:shadow-focus-destructive"
162
+ ],
163
+ {
164
+ variants: {
165
+ state: {
166
+ Default: "",
167
+ Focus: "border-primary shadow-focus",
168
+ Error: "border-destructive",
169
+ Disabled: "opacity-50 pointer-events-none resize-none"
170
+ }
171
+ },
172
+ defaultVariants: { state: "Default" }
173
+ }
174
+ );
175
+ var Textarea = React3.forwardRef(
176
+ ({ className, state, disabled, "aria-invalid": ariaInvalid, ...props }, ref) => /* @__PURE__ */ jsx3(
177
+ "textarea",
178
+ {
179
+ ref,
180
+ "data-slot": "textarea",
181
+ "data-state": state ? state.toLowerCase() : void 0,
182
+ "aria-invalid": ariaInvalid ?? (state === "Error" || void 0),
183
+ disabled: disabled || state === "Disabled",
184
+ className: cn(textareaVariants({ state }), className),
185
+ ...props
186
+ }
187
+ )
188
+ );
189
+ Textarea.displayName = "Textarea";
190
+
191
+ // src/components/accordion.tsx
192
+ import * as React4 from "react";
193
+ import * as AccordionPrimitive from "@radix-ui/react-accordion";
194
+ import { ChevronDown } from "lucide-react";
195
+ import { jsx as jsx4, jsxs } from "react/jsx-runtime";
196
+ var Accordion = AccordionPrimitive.Root;
197
+ var AccordionItem = React4.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx4(AccordionPrimitive.Item, { ref, className: cn("border-b", className), ...props }));
198
+ AccordionItem.displayName = "AccordionItem";
199
+ var AccordionTrigger = React4.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx4(AccordionPrimitive.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
200
+ AccordionPrimitive.Trigger,
201
+ {
202
+ ref,
203
+ className: cn(
204
+ "flex flex-1 items-center justify-between py-4 text-sm font-medium font-sans transition-all hover:underline [&[data-state=open]>svg]:rotate-180",
205
+ className
206
+ ),
207
+ ...props,
208
+ children: [
209
+ children,
210
+ /* @__PURE__ */ jsx4(ChevronDown, { className: "size-4 shrink-0 text-muted-foreground transition-transform duration-200" })
211
+ ]
212
+ }
213
+ ) }));
214
+ AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
215
+ var AccordionContent = React4.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx4(
216
+ AccordionPrimitive.Content,
217
+ {
218
+ ref,
219
+ className: "overflow-hidden text-sm font-sans data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
220
+ ...props,
221
+ children: /* @__PURE__ */ jsx4("div", { className: cn("pb-4 pt-0", className), children })
222
+ }
223
+ ));
224
+ AccordionContent.displayName = AccordionPrimitive.Content.displayName;
225
+
226
+ // src/components/alert.tsx
227
+ import * as React5 from "react";
228
+ import { cva as cva4 } from "class-variance-authority";
229
+ import { jsx as jsx5 } from "react/jsx-runtime";
230
+ var alertVariants = cva4(
231
+ "relative w-full rounded-lg border px-4 py-3 text-sm font-sans [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",
232
+ {
233
+ variants: {
234
+ variant: {
235
+ default: "bg-background text-foreground",
236
+ destructive: "border-destructive/50 text-destructive [&>svg]:text-destructive",
237
+ success: "border-success/50 text-success [&>svg]:text-success",
238
+ warning: "border-warning/50 text-warning [&>svg]:text-warning",
239
+ info: "border-info/50 text-info [&>svg]:text-info"
240
+ }
241
+ },
242
+ defaultVariants: { variant: "default" }
243
+ }
244
+ );
245
+ var Alert = React5.forwardRef(({ className, variant, ...props }, ref) => /* @__PURE__ */ jsx5("div", { ref, role: "alert", className: cn(alertVariants({ variant }), className), ...props }));
246
+ Alert.displayName = "Alert";
247
+ var AlertTitle = React5.forwardRef(
248
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx5("h5", { ref, className: cn("mb-1 font-medium leading-none tracking-tight", className), ...props })
249
+ );
250
+ AlertTitle.displayName = "AlertTitle";
251
+ var AlertDescription = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx5("div", { ref, className: cn("text-sm [&_p]:leading-relaxed", className), ...props }));
252
+ AlertDescription.displayName = "AlertDescription";
253
+
254
+ // src/components/alert-dialog.tsx
255
+ import * as React6 from "react";
256
+ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
257
+ import { jsx as jsx6, jsxs as jsxs2 } from "react/jsx-runtime";
258
+ var AlertDialog = AlertDialogPrimitive.Root;
259
+ var AlertDialogTrigger = AlertDialogPrimitive.Trigger;
260
+ var AlertDialogPortal = AlertDialogPrimitive.Portal;
261
+ var AlertDialogOverlay = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
262
+ AlertDialogPrimitive.Overlay,
263
+ {
264
+ ref,
265
+ className: cn(
266
+ "fixed inset-0 z-50 bg-foreground/40 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
267
+ className
268
+ ),
269
+ ...props
270
+ }
271
+ ));
272
+ AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
273
+ var AlertDialogContent = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs2(AlertDialogPortal, { children: [
274
+ /* @__PURE__ */ jsx6(AlertDialogOverlay, {}),
275
+ /* @__PURE__ */ jsx6(
276
+ AlertDialogPrimitive.Content,
277
+ {
278
+ ref,
279
+ className: cn(
280
+ "fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border bg-background p-6 shadow-lg sm:rounded-xl font-sans",
281
+ "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",
282
+ className
283
+ ),
284
+ ...props
285
+ }
286
+ )
287
+ ] }));
288
+ AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
289
+ var AlertDialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx6("div", { className: cn("flex flex-col space-y-2 text-center sm:text-left", className), ...props });
290
+ AlertDialogHeader.displayName = "AlertDialogHeader";
291
+ var AlertDialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx6(
292
+ "div",
293
+ {
294
+ className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className),
295
+ ...props
296
+ }
297
+ );
298
+ AlertDialogFooter.displayName = "AlertDialogFooter";
299
+ var AlertDialogTitle = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(AlertDialogPrimitive.Title, { ref, className: cn("text-lg font-semibold", className), ...props }));
300
+ AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
301
+ var AlertDialogDescription = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
302
+ AlertDialogPrimitive.Description,
303
+ {
304
+ ref,
305
+ className: cn("text-sm text-muted-foreground", className),
306
+ ...props
307
+ }
308
+ ));
309
+ AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
310
+ var AlertDialogAction = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
311
+ AlertDialogPrimitive.Action,
312
+ {
313
+ ref,
314
+ className: cn(buttonVariants({ variant: "Primary", size: "md" }), className),
315
+ ...props
316
+ }
317
+ ));
318
+ AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
319
+ var AlertDialogCancel = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
320
+ AlertDialogPrimitive.Cancel,
321
+ {
322
+ ref,
323
+ className: cn(buttonVariants({ variant: "Outline", size: "md" }), "mt-2 sm:mt-0", className),
324
+ ...props
325
+ }
326
+ ));
327
+ AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
328
+
329
+ // src/components/aspect-ratio.tsx
330
+ import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
331
+ var AspectRatio = AspectRatioPrimitive.Root;
332
+
333
+ // src/components/avatar.tsx
334
+ import * as React7 from "react";
335
+ import * as AvatarPrimitive from "@radix-ui/react-avatar";
336
+ import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
337
+ var Avatar = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
338
+ AvatarPrimitive.Root,
339
+ {
340
+ ref,
341
+ className: cn("relative flex size-10 shrink-0 overflow-hidden rounded-full", className),
342
+ ...props
343
+ }
344
+ ));
345
+ Avatar.displayName = AvatarPrimitive.Root.displayName;
346
+ var AvatarImage = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(AvatarPrimitive.Image, { ref, className: cn("aspect-square size-full", className), ...props }));
347
+ AvatarImage.displayName = AvatarPrimitive.Image.displayName;
348
+ var AvatarFallback = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
349
+ AvatarPrimitive.Fallback,
350
+ {
351
+ ref,
352
+ className: cn(
353
+ "flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground",
354
+ className
355
+ ),
356
+ ...props
357
+ }
358
+ ));
359
+ AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
360
+ var AvatarGroup = React7.forwardRef(
361
+ ({ className, max, children, ...props }, ref) => {
362
+ const items = React7.Children.toArray(children);
363
+ const visible = max ? items.slice(0, max) : items;
364
+ const overflow = max ? items.length - max : 0;
365
+ return /* @__PURE__ */ jsxs3("div", { ref, className: cn("flex -space-x-2", className), ...props, children: [
366
+ visible.map((child, i) => /* @__PURE__ */ jsx7("div", { className: "rounded-full ring-2 ring-background", children: child }, i)),
367
+ overflow > 0 && /* @__PURE__ */ jsx7("div", { className: "rounded-full ring-2 ring-background", children: /* @__PURE__ */ jsx7(Avatar, { children: /* @__PURE__ */ jsxs3(AvatarFallback, { children: [
368
+ "+",
369
+ overflow
370
+ ] }) }) })
371
+ ] });
372
+ }
373
+ );
374
+ AvatarGroup.displayName = "AvatarGroup";
375
+
376
+ // src/components/badge.tsx
377
+ import { cva as cva5 } from "class-variance-authority";
378
+ import { jsx as jsx8 } from "react/jsx-runtime";
379
+ var badgeVariants = cva5(
380
+ "inline-flex items-center rounded-full px-2.5 py-1 text-xs font-medium font-sans tracking-[0.5px] transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
381
+ {
382
+ variants: {
383
+ variant: {
384
+ default: "bg-primary text-primary-foreground",
385
+ secondary: "bg-secondary-foreground text-secondary",
386
+ destructive: "bg-destructive text-destructive-foreground",
387
+ outline: "border border-input text-foreground",
388
+ subtle: "bg-accent text-accent-foreground"
389
+ }
390
+ },
391
+ defaultVariants: { variant: "default" }
392
+ }
393
+ );
394
+ function Badge({ className, variant, ...props }) {
395
+ return /* @__PURE__ */ jsx8("div", { className: cn(badgeVariants({ variant }), className), ...props });
396
+ }
397
+
398
+ // src/components/breadcrumb.tsx
399
+ import * as React8 from "react";
400
+ import { Slot as Slot2 } from "@radix-ui/react-slot";
401
+ import { ChevronRight, MoreHorizontal } from "lucide-react";
402
+ import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
403
+ var Breadcrumb = React8.forwardRef(
404
+ ({ ...props }, ref) => /* @__PURE__ */ jsx9("nav", { ref, "aria-label": "breadcrumb", className: "font-sans", ...props })
405
+ );
406
+ Breadcrumb.displayName = "Breadcrumb";
407
+ var BreadcrumbList = React8.forwardRef(
408
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
409
+ "ol",
410
+ {
411
+ ref,
412
+ className: cn("flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5", className),
413
+ ...props
414
+ }
415
+ )
416
+ );
417
+ BreadcrumbList.displayName = "BreadcrumbList";
418
+ var BreadcrumbItem = React8.forwardRef(
419
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx9("li", { ref, className: cn("inline-flex items-center gap-1.5", className), ...props })
420
+ );
421
+ BreadcrumbItem.displayName = "BreadcrumbItem";
422
+ var BreadcrumbLink = React8.forwardRef(({ asChild, className, ...props }, ref) => {
423
+ const Comp = asChild ? Slot2 : "a";
424
+ return /* @__PURE__ */ jsx9(Comp, { ref, className: cn("transition-colors hover:text-foreground", className), ...props });
425
+ });
426
+ BreadcrumbLink.displayName = "BreadcrumbLink";
427
+ var BreadcrumbPage = React8.forwardRef(
428
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
429
+ "span",
430
+ {
431
+ ref,
432
+ role: "link",
433
+ "aria-disabled": "true",
434
+ "aria-current": "page",
435
+ className: cn("font-normal text-foreground", className),
436
+ ...props
437
+ }
438
+ )
439
+ );
440
+ BreadcrumbPage.displayName = "BreadcrumbPage";
441
+ var BreadcrumbSeparator = ({ children, className, ...props }) => /* @__PURE__ */ jsx9("li", { role: "presentation", "aria-hidden": true, className: cn("[&>svg]:size-3.5", className), ...props, children: children ?? /* @__PURE__ */ jsx9(ChevronRight, {}) });
442
+ BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
443
+ var BreadcrumbEllipsis = ({ className, ...props }) => /* @__PURE__ */ jsxs4("span", { role: "presentation", "aria-hidden": true, className: cn("flex size-9 items-center justify-center", className), ...props, children: [
444
+ /* @__PURE__ */ jsx9(MoreHorizontal, { className: "size-4" }),
445
+ /* @__PURE__ */ jsx9("span", { className: "sr-only", children: "More" })
446
+ ] });
447
+ BreadcrumbEllipsis.displayName = "BreadcrumbEllipsis";
448
+
449
+ // src/components/card.tsx
450
+ import * as React9 from "react";
451
+ import { jsx as jsx10 } from "react/jsx-runtime";
452
+ var Card = React9.forwardRef(
453
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx10(
454
+ "div",
455
+ {
456
+ ref,
457
+ className: cn("rounded-xl border bg-card text-card-foreground shadow-sm font-sans", className),
458
+ ...props
459
+ }
460
+ )
461
+ );
462
+ Card.displayName = "Card";
463
+ var CardHeader = React9.forwardRef(
464
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx10("div", { ref, className: cn("flex flex-col space-y-1.5 p-6", className), ...props })
465
+ );
466
+ CardHeader.displayName = "CardHeader";
467
+ var CardTitle = React9.forwardRef(
468
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx10("div", { ref, className: cn("font-semibold leading-none tracking-tight", className), ...props })
469
+ );
470
+ CardTitle.displayName = "CardTitle";
471
+ var CardDescription = React9.forwardRef(
472
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx10("div", { ref, className: cn("text-sm text-muted-foreground", className), ...props })
473
+ );
474
+ CardDescription.displayName = "CardDescription";
475
+ var CardContent = React9.forwardRef(
476
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx10("div", { ref, className: cn("p-6 pt-0", className), ...props })
477
+ );
478
+ CardContent.displayName = "CardContent";
479
+ var CardFooter = React9.forwardRef(
480
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx10("div", { ref, className: cn("flex items-center p-6 pt-0", className), ...props })
481
+ );
482
+ CardFooter.displayName = "CardFooter";
483
+
484
+ // src/components/checkbox.tsx
485
+ import * as React10 from "react";
486
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
487
+ import { Check, Minus } from "lucide-react";
488
+ import { jsx as jsx11 } from "react/jsx-runtime";
489
+ var Checkbox = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx11(
490
+ CheckboxPrimitive.Root,
491
+ {
492
+ ref,
493
+ className: cn(
494
+ "peer size-[18px] shrink-0 rounded-sm border-2 border-input outline-none transition-colors",
495
+ "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
496
+ "disabled:cursor-not-allowed disabled:opacity-50",
497
+ "data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
498
+ "data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground",
499
+ "aria-invalid:border-destructive aria-invalid:data-[state=checked]:border-destructive aria-invalid:data-[state=checked]:bg-destructive",
500
+ className
501
+ ),
502
+ ...props,
503
+ children: /* @__PURE__ */ jsx11(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-current", children: props.checked === "indeterminate" ? /* @__PURE__ */ jsx11(Minus, { className: "size-3" }) : /* @__PURE__ */ jsx11(Check, { className: "size-3", strokeWidth: 3 }) })
504
+ }
505
+ ));
506
+ Checkbox.displayName = CheckboxPrimitive.Root.displayName;
507
+
508
+ // src/components/collapsible.tsx
509
+ import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
510
+ var Collapsible = CollapsiblePrimitive.Root;
511
+ var CollapsibleTrigger2 = CollapsiblePrimitive.CollapsibleTrigger;
512
+ var CollapsibleContent2 = CollapsiblePrimitive.CollapsibleContent;
513
+
514
+ // src/components/dialog.tsx
515
+ import * as React11 from "react";
516
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
517
+ import { X } from "lucide-react";
518
+ import { jsx as jsx12, jsxs as jsxs5 } from "react/jsx-runtime";
519
+ var Dialog = DialogPrimitive.Root;
520
+ var DialogTrigger = DialogPrimitive.Trigger;
521
+ var DialogPortal = DialogPrimitive.Portal;
522
+ var DialogClose = DialogPrimitive.Close;
523
+ var DialogOverlay = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx12(
524
+ DialogPrimitive.Overlay,
525
+ {
526
+ ref,
527
+ className: cn(
528
+ "fixed inset-0 z-50 bg-foreground/40 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
529
+ className
530
+ ),
531
+ ...props
532
+ }
533
+ ));
534
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
535
+ var DialogContent = React11.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs5(DialogPortal, { children: [
536
+ /* @__PURE__ */ jsx12(DialogOverlay, {}),
537
+ /* @__PURE__ */ jsxs5(
538
+ DialogPrimitive.Content,
539
+ {
540
+ ref,
541
+ className: cn(
542
+ "fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border bg-background p-6 shadow-lg sm:rounded-xl font-sans",
543
+ "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",
544
+ className
545
+ ),
546
+ ...props,
547
+ children: [
548
+ children,
549
+ /* @__PURE__ */ jsxs5(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring disabled:pointer-events-none", children: [
550
+ /* @__PURE__ */ jsx12(X, { className: "size-4" }),
551
+ /* @__PURE__ */ jsx12("span", { className: "sr-only", children: "Close" })
552
+ ] })
553
+ ]
554
+ }
555
+ )
556
+ ] }));
557
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
558
+ var DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx12("div", { className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className), ...props });
559
+ DialogHeader.displayName = "DialogHeader";
560
+ var DialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx12(
561
+ "div",
562
+ {
563
+ className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className),
564
+ ...props
565
+ }
566
+ );
567
+ DialogFooter.displayName = "DialogFooter";
568
+ var DialogTitle = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx12(
569
+ DialogPrimitive.Title,
570
+ {
571
+ ref,
572
+ className: cn("text-lg font-semibold leading-none tracking-tight", className),
573
+ ...props
574
+ }
575
+ ));
576
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
577
+ var DialogDescription = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx12(
578
+ DialogPrimitive.Description,
579
+ {
580
+ ref,
581
+ className: cn("text-sm text-muted-foreground", className),
582
+ ...props
583
+ }
584
+ ));
585
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
586
+
587
+ // src/components/dropdown-menu.tsx
588
+ import * as React12 from "react";
589
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
590
+ import { Check as Check2, ChevronRight as ChevronRight2, Circle } from "lucide-react";
591
+ import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
592
+ var DropdownMenu = DropdownMenuPrimitive.Root;
593
+ var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
594
+ var DropdownMenuGroup = DropdownMenuPrimitive.Group;
595
+ var DropdownMenuPortal = DropdownMenuPrimitive.Portal;
596
+ var DropdownMenuSub = DropdownMenuPrimitive.Sub;
597
+ var DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
598
+ var contentCls = "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md font-sans 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";
599
+ var itemCls = "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
600
+ var DropdownMenuContent = React12.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx13(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx13(DropdownMenuPrimitive.Content, { ref, sideOffset, className: cn(contentCls, className), ...props }) }));
601
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
602
+ var DropdownMenuItem = React12.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx13(DropdownMenuPrimitive.Item, { ref, className: cn(itemCls, inset && "pl-8", className), ...props }));
603
+ DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
604
+ var DropdownMenuCheckboxItem = React12.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs6(DropdownMenuPrimitive.CheckboxItem, { ref, className: cn(itemCls, "pl-8", className), checked, ...props, children: [
605
+ /* @__PURE__ */ jsx13("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx13(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx13(Check2, { className: "size-4" }) }) }),
606
+ children
607
+ ] }));
608
+ DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
609
+ var DropdownMenuRadioItem = React12.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs6(DropdownMenuPrimitive.RadioItem, { ref, className: cn(itemCls, "pl-8", className), ...props, children: [
610
+ /* @__PURE__ */ jsx13("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx13(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx13(Circle, { className: "size-2 fill-current" }) }) }),
611
+ children
612
+ ] }));
613
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
614
+ var DropdownMenuLabel = React12.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx13(
615
+ DropdownMenuPrimitive.Label,
616
+ {
617
+ ref,
618
+ className: cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className),
619
+ ...props
620
+ }
621
+ ));
622
+ DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
623
+ var DropdownMenuSeparator = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx13(DropdownMenuPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props }));
624
+ DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
625
+ var DropdownMenuShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx13("span", { className: cn("ml-auto text-xs tracking-widest opacity-60", className), ...props });
626
+ DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
627
+ var DropdownMenuSubTrigger = React12.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs6(
628
+ DropdownMenuPrimitive.SubTrigger,
629
+ {
630
+ ref,
631
+ className: cn(itemCls, "data-[state=open]:bg-accent", inset && "pl-8", className),
632
+ ...props,
633
+ children: [
634
+ children,
635
+ /* @__PURE__ */ jsx13(ChevronRight2, { className: "ml-auto size-4" })
636
+ ]
637
+ }
638
+ ));
639
+ DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
640
+ var DropdownMenuSubContent = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx13(DropdownMenuPrimitive.SubContent, { ref, className: cn(contentCls, className), ...props }));
641
+ DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
642
+
643
+ // src/components/hover-card.tsx
644
+ import * as React13 from "react";
645
+ import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
646
+ import { jsx as jsx14 } from "react/jsx-runtime";
647
+ var HoverCard = HoverCardPrimitive.Root;
648
+ var HoverCardTrigger = HoverCardPrimitive.Trigger;
649
+ var HoverCardContent = React13.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx14(
650
+ HoverCardPrimitive.Content,
651
+ {
652
+ ref,
653
+ align,
654
+ sideOffset,
655
+ className: cn(
656
+ "z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none font-sans",
657
+ "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",
658
+ className
659
+ ),
660
+ ...props
661
+ }
662
+ ));
663
+ HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
664
+
665
+ // src/components/label.tsx
666
+ import * as React14 from "react";
667
+ import * as LabelPrimitive from "@radix-ui/react-label";
668
+ import { cva as cva6 } from "class-variance-authority";
669
+ import { jsx as jsx15 } from "react/jsx-runtime";
670
+ var labelVariants = cva6(
671
+ "text-sm font-medium leading-none font-sans peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
672
+ );
673
+ var Label2 = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx15(LabelPrimitive.Root, { ref, className: cn(labelVariants(), className), ...props }));
674
+ Label2.displayName = LabelPrimitive.Root.displayName;
675
+
676
+ // src/components/pagination.tsx
677
+ import * as React15 from "react";
678
+ import { ChevronLeft, ChevronRight as ChevronRight3, MoreHorizontal as MoreHorizontal2 } from "lucide-react";
679
+ import { jsx as jsx16, jsxs as jsxs7 } from "react/jsx-runtime";
680
+ var Pagination = ({ className, ...props }) => /* @__PURE__ */ jsx16(
681
+ "nav",
682
+ {
683
+ role: "navigation",
684
+ "aria-label": "pagination",
685
+ className: cn("mx-auto flex w-full justify-center font-sans", className),
686
+ ...props
687
+ }
688
+ );
689
+ Pagination.displayName = "Pagination";
690
+ var PaginationContent = React15.forwardRef(
691
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx16("ul", { ref, className: cn("flex flex-row items-center gap-1", className), ...props })
692
+ );
693
+ PaginationContent.displayName = "PaginationContent";
694
+ var PaginationItem = React15.forwardRef(
695
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx16("li", { ref, className: cn("", className), ...props })
696
+ );
697
+ PaginationItem.displayName = "PaginationItem";
698
+ var PaginationLink = ({ className, isActive, ...props }) => /* @__PURE__ */ jsx16(
699
+ "a",
700
+ {
701
+ "aria-current": isActive ? "page" : void 0,
702
+ className: cn(
703
+ buttonVariants({ variant: isActive ? "Outline" : "Ghost", size: "icon" }),
704
+ "size-9",
705
+ className
706
+ ),
707
+ ...props
708
+ }
709
+ );
710
+ PaginationLink.displayName = "PaginationLink";
711
+ var PaginationPrevious = ({ className, ...props }) => /* @__PURE__ */ jsxs7(PaginationLink, { "aria-label": "Go to previous page", className: cn("w-auto gap-1 px-2.5", className), ...props, children: [
712
+ /* @__PURE__ */ jsx16(ChevronLeft, { className: "size-4" }),
713
+ /* @__PURE__ */ jsx16("span", { children: "Previous" })
714
+ ] });
715
+ PaginationPrevious.displayName = "PaginationPrevious";
716
+ var PaginationNext = ({ className, ...props }) => /* @__PURE__ */ jsxs7(PaginationLink, { "aria-label": "Go to next page", className: cn("w-auto gap-1 px-2.5", className), ...props, children: [
717
+ /* @__PURE__ */ jsx16("span", { children: "Next" }),
718
+ /* @__PURE__ */ jsx16(ChevronRight3, { className: "size-4" })
719
+ ] });
720
+ PaginationNext.displayName = "PaginationNext";
721
+ var PaginationEllipsis = ({ className, ...props }) => /* @__PURE__ */ jsxs7("span", { "aria-hidden": true, className: cn("flex size-9 items-center justify-center", className), ...props, children: [
722
+ /* @__PURE__ */ jsx16(MoreHorizontal2, { className: "size-4" }),
723
+ /* @__PURE__ */ jsx16("span", { className: "sr-only", children: "More pages" })
724
+ ] });
725
+ PaginationEllipsis.displayName = "PaginationEllipsis";
726
+
727
+ // src/components/popover.tsx
728
+ import * as React16 from "react";
729
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
730
+ import { jsx as jsx17 } from "react/jsx-runtime";
731
+ var Popover = PopoverPrimitive.Root;
732
+ var PopoverTrigger = PopoverPrimitive.Trigger;
733
+ var PopoverAnchor = PopoverPrimitive.Anchor;
734
+ var PopoverContent = React16.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx17(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx17(
735
+ PopoverPrimitive.Content,
736
+ {
737
+ ref,
738
+ align,
739
+ sideOffset,
740
+ className: cn(
741
+ "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none font-sans",
742
+ "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",
743
+ "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",
744
+ className
745
+ ),
746
+ ...props
747
+ }
748
+ ) }));
749
+ PopoverContent.displayName = PopoverPrimitive.Content.displayName;
750
+
751
+ // src/components/progress.tsx
752
+ import * as React17 from "react";
753
+ import * as ProgressPrimitive from "@radix-ui/react-progress";
754
+ import { jsx as jsx18 } from "react/jsx-runtime";
755
+ var Progress = React17.forwardRef(({ className, value, ...props }, ref) => /* @__PURE__ */ jsx18(
756
+ ProgressPrimitive.Root,
757
+ {
758
+ ref,
759
+ className: cn("relative h-2 w-full overflow-hidden rounded-full bg-muted", className),
760
+ ...props,
761
+ children: /* @__PURE__ */ jsx18(
762
+ ProgressPrimitive.Indicator,
763
+ {
764
+ className: "size-full flex-1 bg-primary transition-transform",
765
+ style: { transform: `translateX(-${100 - (value || 0)}%)` }
766
+ }
767
+ )
768
+ }
769
+ ));
770
+ Progress.displayName = ProgressPrimitive.Root.displayName;
771
+
772
+ // src/components/radio-group.tsx
773
+ import * as React18 from "react";
774
+ import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
775
+ import { Circle as Circle2 } from "lucide-react";
776
+ import { jsx as jsx19 } from "react/jsx-runtime";
777
+ var RadioGroup2 = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx19(RadioGroupPrimitive.Root, { ref, className: cn("grid gap-3", className), ...props }));
778
+ RadioGroup2.displayName = RadioGroupPrimitive.Root.displayName;
779
+ var RadioGroupItem = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx19(
780
+ RadioGroupPrimitive.Item,
781
+ {
782
+ ref,
783
+ className: cn(
784
+ "aspect-square size-[18px] rounded-full border-2 border-input text-primary outline-none transition-colors",
785
+ "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
786
+ "disabled:cursor-not-allowed disabled:opacity-50",
787
+ "data-[state=checked]:border-primary",
788
+ "aria-invalid:border-destructive",
789
+ className
790
+ ),
791
+ ...props,
792
+ children: /* @__PURE__ */ jsx19(RadioGroupPrimitive.Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx19(Circle2, { className: "size-2.5 fill-primary text-primary" }) })
793
+ }
794
+ ));
795
+ RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
796
+
797
+ // src/components/scroll-area.tsx
798
+ import * as React19 from "react";
799
+ import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
800
+ import { jsx as jsx20, jsxs as jsxs8 } from "react/jsx-runtime";
801
+ var ScrollArea = React19.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs8(ScrollAreaPrimitive.Root, { ref, className: cn("relative overflow-hidden", className), ...props, children: [
802
+ /* @__PURE__ */ jsx20(ScrollAreaPrimitive.Viewport, { className: "size-full rounded-[inherit]", children }),
803
+ /* @__PURE__ */ jsx20(ScrollBar, {}),
804
+ /* @__PURE__ */ jsx20(ScrollAreaPrimitive.Corner, {})
805
+ ] }));
806
+ ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
807
+ var ScrollBar = React19.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ jsx20(
808
+ ScrollAreaPrimitive.ScrollAreaScrollbar,
809
+ {
810
+ ref,
811
+ orientation,
812
+ className: cn(
813
+ "flex touch-none select-none transition-colors",
814
+ orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-px",
815
+ orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent p-px",
816
+ className
817
+ ),
818
+ ...props,
819
+ children: /* @__PURE__ */ jsx20(ScrollAreaPrimitive.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-border" })
820
+ }
821
+ ));
822
+ ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;
823
+
824
+ // src/components/select.tsx
825
+ import * as React20 from "react";
826
+ import * as SelectPrimitive from "@radix-ui/react-select";
827
+ import { Check as Check3, ChevronDown as ChevronDown2, ChevronUp } from "lucide-react";
828
+ import { jsx as jsx21, jsxs as jsxs9 } from "react/jsx-runtime";
829
+ var Select = SelectPrimitive.Root;
830
+ var SelectGroup = SelectPrimitive.Group;
831
+ var SelectValue = SelectPrimitive.Value;
832
+ var SelectTrigger = React20.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs9(
833
+ SelectPrimitive.Trigger,
834
+ {
835
+ ref,
836
+ className: cn(
837
+ "flex min-h-[44px] w-full items-center justify-between rounded-sm border border-input bg-background px-3 py-3",
838
+ "font-sans text-[14px] leading-5 tracking-[0.25px] text-foreground",
839
+ "data-[placeholder]:text-muted-foreground [&>span]:line-clamp-1",
840
+ "outline-none transition-colors",
841
+ "focus:border-primary focus:shadow-focus",
842
+ "data-[state=open]:border-primary",
843
+ "aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:border-destructive aria-[invalid=true]:focus:shadow-focus-destructive",
844
+ "disabled:cursor-not-allowed disabled:opacity-50",
845
+ className
846
+ ),
847
+ ...props,
848
+ children: [
849
+ children,
850
+ /* @__PURE__ */ jsx21(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx21(ChevronDown2, { className: "size-4 shrink-0 opacity-60" }) })
851
+ ]
852
+ }
853
+ ));
854
+ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
855
+ var SelectContent = React20.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx21(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs9(
856
+ SelectPrimitive.Content,
857
+ {
858
+ ref,
859
+ position,
860
+ className: cn(
861
+ "relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md font-sans",
862
+ "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",
863
+ position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=top]:-translate-y-1",
864
+ className
865
+ ),
866
+ ...props,
867
+ children: [
868
+ /* @__PURE__ */ jsx21(SelectPrimitive.ScrollUpButton, { className: "flex h-6 items-center justify-center", children: /* @__PURE__ */ jsx21(ChevronUp, { className: "size-4" }) }),
869
+ /* @__PURE__ */ jsx21(
870
+ SelectPrimitive.Viewport,
871
+ {
872
+ className: cn("p-1", position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),
873
+ children
874
+ }
875
+ ),
876
+ /* @__PURE__ */ jsx21(SelectPrimitive.ScrollDownButton, { className: "flex h-6 items-center justify-center", children: /* @__PURE__ */ jsx21(ChevronDown2, { className: "size-4" }) })
877
+ ]
878
+ }
879
+ ) }));
880
+ SelectContent.displayName = SelectPrimitive.Content.displayName;
881
+ var SelectLabel = React20.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx21(SelectPrimitive.Label, { ref, className: cn("px-2 py-1.5 text-sm font-semibold", className), ...props }));
882
+ SelectLabel.displayName = SelectPrimitive.Label.displayName;
883
+ var SelectItem = React20.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs9(
884
+ SelectPrimitive.Item,
885
+ {
886
+ ref,
887
+ className: cn(
888
+ "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none",
889
+ "focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
890
+ className
891
+ ),
892
+ ...props,
893
+ children: [
894
+ /* @__PURE__ */ jsx21("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx21(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx21(Check3, { className: "size-4" }) }) }),
895
+ /* @__PURE__ */ jsx21(SelectPrimitive.ItemText, { children })
896
+ ]
897
+ }
898
+ ));
899
+ SelectItem.displayName = SelectPrimitive.Item.displayName;
900
+ var SelectSeparator = React20.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx21(SelectPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props }));
901
+ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
902
+
903
+ // src/components/separator.tsx
904
+ import * as React21 from "react";
905
+ import * as SeparatorPrimitive from "@radix-ui/react-separator";
906
+ import { jsx as jsx22 } from "react/jsx-runtime";
907
+ var Separator3 = React21.forwardRef(({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx22(
908
+ SeparatorPrimitive.Root,
909
+ {
910
+ ref,
911
+ decorative,
912
+ orientation,
913
+ className: cn(
914
+ "shrink-0 bg-border",
915
+ orientation === "horizontal" ? "h-px w-full" : "h-full w-px",
916
+ className
917
+ ),
918
+ ...props
919
+ }
920
+ ));
921
+ Separator3.displayName = SeparatorPrimitive.Root.displayName;
922
+
923
+ // src/components/sheet.tsx
924
+ import * as React22 from "react";
925
+ import * as SheetPrimitive from "@radix-ui/react-dialog";
926
+ import { cva as cva7 } from "class-variance-authority";
927
+ import { X as X2 } from "lucide-react";
928
+ import { jsx as jsx23, jsxs as jsxs10 } from "react/jsx-runtime";
929
+ var Sheet = SheetPrimitive.Root;
930
+ var SheetTrigger = SheetPrimitive.Trigger;
931
+ var SheetClose = SheetPrimitive.Close;
932
+ var SheetPortal = SheetPrimitive.Portal;
933
+ var SheetOverlay = React22.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx23(
934
+ SheetPrimitive.Overlay,
935
+ {
936
+ ref,
937
+ className: cn(
938
+ "fixed inset-0 z-50 bg-foreground/40 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
939
+ className
940
+ ),
941
+ ...props
942
+ }
943
+ ));
944
+ SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
945
+ var sheetVariants = cva7(
946
+ "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500 font-sans",
947
+ {
948
+ variants: {
949
+ side: {
950
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
951
+ bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
952
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
953
+ right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"
954
+ }
955
+ },
956
+ defaultVariants: { side: "right" }
957
+ }
958
+ );
959
+ var SheetContent = React22.forwardRef(({ side = "right", className, children, ...props }, ref) => /* @__PURE__ */ jsxs10(SheetPortal, { children: [
960
+ /* @__PURE__ */ jsx23(SheetOverlay, {}),
961
+ /* @__PURE__ */ jsxs10(SheetPrimitive.Content, { ref, className: cn(sheetVariants({ side }), className), ...props, children: [
962
+ children,
963
+ /* @__PURE__ */ jsxs10(SheetPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring", children: [
964
+ /* @__PURE__ */ jsx23(X2, { className: "size-4" }),
965
+ /* @__PURE__ */ jsx23("span", { className: "sr-only", children: "Close" })
966
+ ] })
967
+ ] })
968
+ ] }));
969
+ SheetContent.displayName = SheetPrimitive.Content.displayName;
970
+ var SheetHeader = ({ className, ...props }) => /* @__PURE__ */ jsx23("div", { className: cn("flex flex-col space-y-2 text-center sm:text-left", className), ...props });
971
+ SheetHeader.displayName = "SheetHeader";
972
+ var SheetFooter = ({ className, ...props }) => /* @__PURE__ */ jsx23("div", { className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className), ...props });
973
+ SheetFooter.displayName = "SheetFooter";
974
+ var SheetTitle = React22.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx23(SheetPrimitive.Title, { ref, className: cn("text-lg font-semibold text-foreground", className), ...props }));
975
+ SheetTitle.displayName = SheetPrimitive.Title.displayName;
976
+ var SheetDescription = React22.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx23(SheetPrimitive.Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
977
+ SheetDescription.displayName = SheetPrimitive.Description.displayName;
978
+
979
+ // src/components/modal.tsx
980
+ import * as DialogPrimitive2 from "@radix-ui/react-dialog";
981
+ import { X as X3 } from "lucide-react";
982
+ import { jsx as jsx24, jsxs as jsxs11 } from "react/jsx-runtime";
983
+ var DEFAULT_ACTION = {
984
+ Info: "Got it",
985
+ Confirmation: "Confirm",
986
+ Warning: "Proceed",
987
+ Destructive: "Delete"
988
+ };
989
+ function Modal({
990
+ type = "Info",
991
+ title,
992
+ description,
993
+ actionLabel,
994
+ cancelLabel = "Cancel",
995
+ onAction,
996
+ onCancel,
997
+ open,
998
+ defaultOpen,
999
+ onOpenChange,
1000
+ trigger,
1001
+ children,
1002
+ className
1003
+ }) {
1004
+ const showCancel = type !== "Info";
1005
+ return /* @__PURE__ */ jsxs11(Dialog, { open, defaultOpen, onOpenChange, children: [
1006
+ trigger && /* @__PURE__ */ jsx24(DialogTrigger, { asChild: true, children: trigger }),
1007
+ /* @__PURE__ */ jsxs11(DialogPortal, { children: [
1008
+ /* @__PURE__ */ jsx24(DialogOverlay, {}),
1009
+ /* @__PURE__ */ jsxs11(
1010
+ DialogPrimitive2.Content,
1011
+ {
1012
+ className: cn(
1013
+ "fixed left-1/2 top-1/2 z-50 flex w-full max-w-[480px] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl bg-background font-sans",
1014
+ "shadow-[0_4px_24px_rgba(0,0,0,0.12)]",
1015
+ "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",
1016
+ className
1017
+ ),
1018
+ children: [
1019
+ /* @__PURE__ */ jsxs11("header", { className: "flex items-center justify-between px-6 pb-3 pt-5", children: [
1020
+ /* @__PURE__ */ jsx24(DialogPrimitive2.Title, { className: "min-w-0 flex-1 text-[18px] font-semibold leading-6 text-foreground", children: title }),
1021
+ /* @__PURE__ */ jsx24(
1022
+ DialogPrimitive2.Close,
1023
+ {
1024
+ className: "rounded-sm opacity-70 outline-none transition-opacity hover:opacity-100 focus-visible:ring-2 focus-visible:ring-ring",
1025
+ "aria-label": "Close",
1026
+ children: /* @__PURE__ */ jsx24(X3, { className: "size-5" })
1027
+ }
1028
+ )
1029
+ ] }),
1030
+ /* @__PURE__ */ jsx24("div", { className: "h-px w-full bg-border" }),
1031
+ /* @__PURE__ */ jsxs11("div", { className: "px-6 py-5", children: [
1032
+ description && /* @__PURE__ */ jsx24(DialogPrimitive2.Description, { className: "text-[14px] leading-5 tracking-[0.25px] text-muted-foreground", children: description }),
1033
+ children
1034
+ ] }),
1035
+ /* @__PURE__ */ jsx24("div", { className: "h-px w-full bg-border" }),
1036
+ /* @__PURE__ */ jsxs11("footer", { className: "flex items-center justify-end gap-3 px-6 py-4", children: [
1037
+ showCancel && /* @__PURE__ */ jsx24(DialogPrimitive2.Close, { asChild: true, children: /* @__PURE__ */ jsx24(Button, { variant: "Outline", size: "lg", onClick: onCancel, children: cancelLabel }) }),
1038
+ /* @__PURE__ */ jsx24(DialogPrimitive2.Close, { asChild: true, children: /* @__PURE__ */ jsx24(
1039
+ Button,
1040
+ {
1041
+ variant: type === "Destructive" ? "Destructive" : "Primary",
1042
+ size: "lg",
1043
+ onClick: onAction,
1044
+ children: actionLabel ?? DEFAULT_ACTION[type]
1045
+ }
1046
+ ) })
1047
+ ] })
1048
+ ]
1049
+ }
1050
+ )
1051
+ ] })
1052
+ ] });
1053
+ }
1054
+
1055
+ // src/components/skeleton.tsx
1056
+ import { jsx as jsx25 } from "react/jsx-runtime";
1057
+ function Skeleton({ className, ...props }) {
1058
+ return /* @__PURE__ */ jsx25("div", { className: cn("animate-pulse rounded-md bg-muted", className), ...props });
1059
+ }
1060
+
1061
+ // src/components/slider.tsx
1062
+ import * as React23 from "react";
1063
+ import * as SliderPrimitive from "@radix-ui/react-slider";
1064
+ import { jsx as jsx26, jsxs as jsxs12 } from "react/jsx-runtime";
1065
+ var Slider = React23.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs12(
1066
+ SliderPrimitive.Root,
1067
+ {
1068
+ ref,
1069
+ className: cn("relative flex w-full touch-none select-none items-center", className),
1070
+ ...props,
1071
+ children: [
1072
+ /* @__PURE__ */ jsx26(SliderPrimitive.Track, { className: "relative h-1.5 w-full grow overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsx26(SliderPrimitive.Range, { className: "absolute h-full bg-primary" }) }),
1073
+ /* @__PURE__ */ jsx26(SliderPrimitive.Thumb, { className: "block size-4 rounded-full border border-primary/50 bg-background shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50" })
1074
+ ]
1075
+ }
1076
+ ));
1077
+ Slider.displayName = SliderPrimitive.Root.displayName;
1078
+
1079
+ // src/components/sonner.tsx
1080
+ import { Toaster as Sonner, toast } from "sonner";
1081
+ import { jsx as jsx27 } from "react/jsx-runtime";
1082
+ function Toaster({ theme = "system", ...props }) {
1083
+ return /* @__PURE__ */ jsx27(
1084
+ Sonner,
1085
+ {
1086
+ theme,
1087
+ className: "toaster group font-sans",
1088
+ toastOptions: {
1089
+ classNames: {
1090
+ toast: "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
1091
+ description: "group-[.toast]:text-muted-foreground",
1092
+ actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
1093
+ cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"
1094
+ }
1095
+ },
1096
+ ...props
1097
+ }
1098
+ );
1099
+ }
1100
+
1101
+ // src/components/switch.tsx
1102
+ import * as React24 from "react";
1103
+ import * as SwitchPrimitive from "@radix-ui/react-switch";
1104
+ import { jsx as jsx28 } from "react/jsx-runtime";
1105
+ var Switch = React24.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx28(
1106
+ SwitchPrimitive.Root,
1107
+ {
1108
+ ref,
1109
+ className: cn(
1110
+ "peer inline-flex h-6 w-12 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors",
1111
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
1112
+ "disabled:cursor-not-allowed disabled:opacity-50",
1113
+ "data-[state=checked]:bg-primary data-[state=unchecked]:bg-tertiary",
1114
+ className
1115
+ ),
1116
+ ...props,
1117
+ children: /* @__PURE__ */ jsx28(
1118
+ SwitchPrimitive.Thumb,
1119
+ {
1120
+ className: cn(
1121
+ "pointer-events-none block size-5 rounded-full bg-background shadow-lg ring-0 transition-transform",
1122
+ "data-[state=checked]:translate-x-6 data-[state=unchecked]:translate-x-0"
1123
+ )
1124
+ }
1125
+ )
1126
+ }
1127
+ ));
1128
+ Switch.displayName = SwitchPrimitive.Root.displayName;
1129
+
1130
+ // src/components/tag.tsx
1131
+ import * as React25 from "react";
1132
+ import { cva as cva8 } from "class-variance-authority";
1133
+ import { X as X4 } from "lucide-react";
1134
+ import { jsx as jsx29, jsxs as jsxs13 } from "react/jsx-runtime";
1135
+ var tagVariants = cva8(
1136
+ "inline-flex items-center gap-1 rounded-sm px-2 py-1 text-xs font-medium font-sans tracking-[0.5px]",
1137
+ {
1138
+ variants: {
1139
+ variant: {
1140
+ default: "bg-accent text-accent-foreground",
1141
+ secondary: "bg-secondary text-secondary-foreground",
1142
+ destructive: "bg-destructive-foreground text-destructive",
1143
+ warning: "bg-warning-foreground text-warning",
1144
+ outline: "border border-input text-foreground"
1145
+ }
1146
+ },
1147
+ defaultVariants: { variant: "default" }
1148
+ }
1149
+ );
1150
+ var Tag = React25.forwardRef(
1151
+ ({ className, variant, onRemove, children, ...props }, ref) => /* @__PURE__ */ jsxs13("span", { ref, className: cn(tagVariants({ variant }), className), ...props, children: [
1152
+ children,
1153
+ onRemove && /* @__PURE__ */ jsx29(
1154
+ "button",
1155
+ {
1156
+ type: "button",
1157
+ onClick: onRemove,
1158
+ "aria-label": "Remove",
1159
+ className: "-mr-0.5 ml-0.5 rounded-[2px] opacity-70 outline-none transition-opacity hover:opacity-100 focus-visible:ring-1 focus-visible:ring-current",
1160
+ children: /* @__PURE__ */ jsx29(X4, { className: "size-3.5" })
1161
+ }
1162
+ )
1163
+ ] })
1164
+ );
1165
+ Tag.displayName = "Tag";
1166
+
1167
+ // src/components/table.tsx
1168
+ import * as React26 from "react";
1169
+ import { jsx as jsx30 } from "react/jsx-runtime";
1170
+ var Table = React26.forwardRef(
1171
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx30("div", { className: "relative w-full overflow-auto", children: /* @__PURE__ */ jsx30("table", { ref, className: cn("w-full caption-bottom text-sm font-sans", className), ...props }) })
1172
+ );
1173
+ Table.displayName = "Table";
1174
+ var TableHeader = React26.forwardRef(
1175
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx30("thead", { ref, className: cn("[&_tr]:border-b", className), ...props })
1176
+ );
1177
+ TableHeader.displayName = "TableHeader";
1178
+ var TableBody = React26.forwardRef(
1179
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx30("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props })
1180
+ );
1181
+ TableBody.displayName = "TableBody";
1182
+ var TableFooter = React26.forwardRef(
1183
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx30("tfoot", { ref, className: cn("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", className), ...props })
1184
+ );
1185
+ TableFooter.displayName = "TableFooter";
1186
+ var TableRow = React26.forwardRef(
1187
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx30(
1188
+ "tr",
1189
+ {
1190
+ ref,
1191
+ className: cn("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted", className),
1192
+ ...props
1193
+ }
1194
+ )
1195
+ );
1196
+ TableRow.displayName = "TableRow";
1197
+ var TableHead = React26.forwardRef(
1198
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx30(
1199
+ "th",
1200
+ {
1201
+ ref,
1202
+ className: cn("h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0", className),
1203
+ ...props
1204
+ }
1205
+ )
1206
+ );
1207
+ TableHead.displayName = "TableHead";
1208
+ var TableCell = React26.forwardRef(
1209
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx30("td", { ref, className: cn("p-2 align-middle [&:has([role=checkbox])]:pr-0", className), ...props })
1210
+ );
1211
+ TableCell.displayName = "TableCell";
1212
+ var TableCaption = React26.forwardRef(
1213
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx30("caption", { ref, className: cn("mt-4 text-sm text-muted-foreground", className), ...props })
1214
+ );
1215
+ TableCaption.displayName = "TableCaption";
1216
+
1217
+ // src/components/tabs.tsx
1218
+ import * as React27 from "react";
1219
+ import * as TabsPrimitive from "@radix-ui/react-tabs";
1220
+ import { jsx as jsx31 } from "react/jsx-runtime";
1221
+ var Tabs = TabsPrimitive.Root;
1222
+ var TabsList = React27.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx31(
1223
+ TabsPrimitive.List,
1224
+ {
1225
+ ref,
1226
+ className: cn(
1227
+ "inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground font-sans",
1228
+ className
1229
+ ),
1230
+ ...props
1231
+ }
1232
+ ));
1233
+ TabsList.displayName = TabsPrimitive.List.displayName;
1234
+ var TabsTrigger = React27.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx31(
1235
+ TabsPrimitive.Trigger,
1236
+ {
1237
+ ref,
1238
+ className: cn(
1239
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium transition-all",
1240
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
1241
+ "disabled:pointer-events-none disabled:opacity-50",
1242
+ "data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow",
1243
+ className
1244
+ ),
1245
+ ...props
1246
+ }
1247
+ ));
1248
+ TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
1249
+ var TabsContent = React27.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx31(
1250
+ TabsPrimitive.Content,
1251
+ {
1252
+ ref,
1253
+ className: cn("mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", className),
1254
+ ...props
1255
+ }
1256
+ ));
1257
+ TabsContent.displayName = TabsPrimitive.Content.displayName;
1258
+
1259
+ // src/components/toggle.tsx
1260
+ import * as React28 from "react";
1261
+ import * as TogglePrimitive from "@radix-ui/react-toggle";
1262
+ import { cva as cva9 } from "class-variance-authority";
1263
+ import { jsx as jsx32 } from "react/jsx-runtime";
1264
+ var toggleVariants = cva9(
1265
+ "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium font-sans transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0",
1266
+ {
1267
+ variants: {
1268
+ variant: {
1269
+ default: "bg-transparent",
1270
+ outline: "border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground"
1271
+ },
1272
+ size: {
1273
+ default: "h-9 min-w-9 px-2",
1274
+ sm: "h-8 min-w-8 px-1.5",
1275
+ lg: "h-10 min-w-10 px-2.5"
1276
+ }
1277
+ },
1278
+ defaultVariants: { variant: "default", size: "default" }
1279
+ }
1280
+ );
1281
+ var Toggle = React28.forwardRef(({ className, variant, size, ...props }, ref) => /* @__PURE__ */ jsx32(TogglePrimitive.Root, { ref, className: cn(toggleVariants({ variant, size }), className), ...props }));
1282
+ Toggle.displayName = TogglePrimitive.Root.displayName;
1283
+
1284
+ // src/components/toggle-group.tsx
1285
+ import * as React29 from "react";
1286
+ import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
1287
+ import { jsx as jsx33 } from "react/jsx-runtime";
1288
+ var ToggleGroupContext = React29.createContext({
1289
+ size: "default",
1290
+ variant: "default"
1291
+ });
1292
+ var ToggleGroup = React29.forwardRef(({ className, variant, size, children, ...props }, ref) => /* @__PURE__ */ jsx33(ToggleGroupPrimitive.Root, { ref, className: cn("flex items-center gap-1", className), ...props, children: /* @__PURE__ */ jsx33(ToggleGroupContext.Provider, { value: { variant, size }, children }) }));
1293
+ ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;
1294
+ var ToggleGroupItem = React29.forwardRef(({ className, children, variant, size, ...props }, ref) => {
1295
+ const ctx = React29.useContext(ToggleGroupContext);
1296
+ return /* @__PURE__ */ jsx33(
1297
+ ToggleGroupPrimitive.Item,
1298
+ {
1299
+ ref,
1300
+ className: cn(toggleVariants({ variant: ctx.variant || variant, size: ctx.size || size }), className),
1301
+ ...props,
1302
+ children
1303
+ }
1304
+ );
1305
+ });
1306
+ ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;
1307
+
1308
+ // src/components/tooltip.tsx
1309
+ import * as React30 from "react";
1310
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
1311
+ import { jsx as jsx34 } from "react/jsx-runtime";
1312
+ var TooltipProvider = TooltipPrimitive.Provider;
1313
+ var Tooltip = TooltipPrimitive.Root;
1314
+ var TooltipTrigger = TooltipPrimitive.Trigger;
1315
+ var TooltipContent = React30.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx34(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx34(
1316
+ TooltipPrimitive.Content,
1317
+ {
1318
+ ref,
1319
+ sideOffset,
1320
+ className: cn(
1321
+ "z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground font-sans",
1322
+ "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",
1323
+ "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",
1324
+ className
1325
+ ),
1326
+ ...props
1327
+ }
1328
+ ) }));
1329
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
1330
+
1331
+ // src/components/calendar.tsx
1332
+ import { ChevronLeft as ChevronLeft2, ChevronRight as ChevronRight4 } from "lucide-react";
1333
+ import { DayPicker } from "react-day-picker";
1334
+ import { jsx as jsx35 } from "react/jsx-runtime";
1335
+ function Calendar({ className, classNames, showOutsideDays = true, ...props }) {
1336
+ return /* @__PURE__ */ jsx35(
1337
+ DayPicker,
1338
+ {
1339
+ showOutsideDays,
1340
+ className: cn("p-3 font-sans", className),
1341
+ classNames: {
1342
+ months: "flex flex-col sm:flex-row gap-2",
1343
+ month: "flex flex-col gap-4",
1344
+ caption: "flex justify-center pt-1 relative items-center w-full",
1345
+ caption_label: "text-sm font-medium",
1346
+ nav: "flex items-center gap-1",
1347
+ nav_button: cn(
1348
+ buttonVariants({ variant: "Outline", size: "icon" }),
1349
+ "size-7 bg-transparent p-0 opacity-50 hover:opacity-100"
1350
+ ),
1351
+ nav_button_previous: "absolute left-1",
1352
+ nav_button_next: "absolute right-1",
1353
+ table: "w-full border-collapse space-x-1",
1354
+ head_row: "flex",
1355
+ head_cell: "text-muted-foreground rounded-md w-8 font-normal text-[0.8rem]",
1356
+ row: "flex w-full mt-2",
1357
+ cell: cn(
1358
+ "relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected].day-range-end)]:rounded-r-md",
1359
+ props.mode === "range" ? "[&:has(>.day-range-end)]:rounded-r-md [&:has(>.day-range-start)]:rounded-l-md first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md" : "[&:has([aria-selected])]:rounded-md"
1360
+ ),
1361
+ day: cn(buttonVariants({ variant: "Ghost", size: "icon" }), "size-8 p-0 font-normal aria-selected:opacity-100"),
1362
+ day_range_start: "day-range-start",
1363
+ day_range_end: "day-range-end",
1364
+ day_selected: "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
1365
+ day_today: "bg-accent text-accent-foreground",
1366
+ day_outside: "day-outside text-muted-foreground aria-selected:text-muted-foreground",
1367
+ day_disabled: "text-muted-foreground opacity-50",
1368
+ day_range_middle: "aria-selected:bg-accent aria-selected:text-accent-foreground",
1369
+ day_hidden: "invisible",
1370
+ ...classNames
1371
+ },
1372
+ components: {
1373
+ IconLeft: () => /* @__PURE__ */ jsx35(ChevronLeft2, { className: "size-4" }),
1374
+ IconRight: () => /* @__PURE__ */ jsx35(ChevronRight4, { className: "size-4" })
1375
+ },
1376
+ ...props
1377
+ }
1378
+ );
1379
+ }
1380
+ Calendar.displayName = "Calendar";
1381
+
1382
+ // src/components/carousel.tsx
1383
+ import * as React31 from "react";
1384
+ import useEmblaCarousel from "embla-carousel-react";
1385
+ import { ArrowLeft, ArrowRight } from "lucide-react";
1386
+ import { jsx as jsx36, jsxs as jsxs14 } from "react/jsx-runtime";
1387
+ var CarouselContext = React31.createContext(null);
1388
+ function useCarousel() {
1389
+ const context = React31.useContext(CarouselContext);
1390
+ if (!context) throw new Error("useCarousel must be used within a <Carousel />");
1391
+ return context;
1392
+ }
1393
+ var Carousel = React31.forwardRef(({ orientation = "horizontal", opts, setApi, plugins, className, children, ...props }, ref) => {
1394
+ const [carouselRef, api] = useEmblaCarousel(
1395
+ { ...opts, axis: orientation === "horizontal" ? "x" : "y" },
1396
+ plugins
1397
+ );
1398
+ const [canScrollPrev, setCanScrollPrev] = React31.useState(false);
1399
+ const [canScrollNext, setCanScrollNext] = React31.useState(false);
1400
+ const onSelect = React31.useCallback((a) => {
1401
+ if (!a) return;
1402
+ setCanScrollPrev(a.canScrollPrev());
1403
+ setCanScrollNext(a.canScrollNext());
1404
+ }, []);
1405
+ const scrollPrev = React31.useCallback(() => api?.scrollPrev(), [api]);
1406
+ const scrollNext = React31.useCallback(() => api?.scrollNext(), [api]);
1407
+ React31.useEffect(() => {
1408
+ if (api && setApi) setApi(api);
1409
+ }, [api, setApi]);
1410
+ React31.useEffect(() => {
1411
+ if (!api) return;
1412
+ onSelect(api);
1413
+ api.on("reInit", onSelect);
1414
+ api.on("select", onSelect);
1415
+ return () => {
1416
+ api?.off("select", onSelect);
1417
+ };
1418
+ }, [api, onSelect]);
1419
+ return /* @__PURE__ */ jsx36(
1420
+ CarouselContext.Provider,
1421
+ {
1422
+ value: { carouselRef, api, opts, orientation, scrollPrev, scrollNext, canScrollPrev, canScrollNext },
1423
+ children: /* @__PURE__ */ jsx36(
1424
+ "div",
1425
+ {
1426
+ ref,
1427
+ onKeyDownCapture: (e) => {
1428
+ if (e.key === "ArrowLeft") {
1429
+ e.preventDefault();
1430
+ scrollPrev();
1431
+ } else if (e.key === "ArrowRight") {
1432
+ e.preventDefault();
1433
+ scrollNext();
1434
+ }
1435
+ },
1436
+ className: cn("relative font-sans", className),
1437
+ role: "region",
1438
+ "aria-roledescription": "carousel",
1439
+ ...props,
1440
+ children
1441
+ }
1442
+ )
1443
+ }
1444
+ );
1445
+ });
1446
+ Carousel.displayName = "Carousel";
1447
+ var CarouselContent = React31.forwardRef(
1448
+ ({ className, ...props }, ref) => {
1449
+ const { carouselRef, orientation } = useCarousel();
1450
+ return /* @__PURE__ */ jsx36("div", { ref: carouselRef, className: "overflow-hidden", children: /* @__PURE__ */ jsx36(
1451
+ "div",
1452
+ {
1453
+ ref,
1454
+ className: cn("flex", orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col", className),
1455
+ ...props
1456
+ }
1457
+ ) });
1458
+ }
1459
+ );
1460
+ CarouselContent.displayName = "CarouselContent";
1461
+ var CarouselItem = React31.forwardRef(
1462
+ ({ className, ...props }, ref) => {
1463
+ const { orientation } = useCarousel();
1464
+ return /* @__PURE__ */ jsx36(
1465
+ "div",
1466
+ {
1467
+ ref,
1468
+ role: "group",
1469
+ "aria-roledescription": "slide",
1470
+ className: cn("min-w-0 shrink-0 grow-0 basis-full", orientation === "horizontal" ? "pl-4" : "pt-4", className),
1471
+ ...props
1472
+ }
1473
+ );
1474
+ }
1475
+ );
1476
+ CarouselItem.displayName = "CarouselItem";
1477
+ var CarouselPrevious = React31.forwardRef(
1478
+ ({ className, variant = "Outline", ...props }, ref) => {
1479
+ const { orientation, scrollPrev, canScrollPrev } = useCarousel();
1480
+ return /* @__PURE__ */ jsxs14(
1481
+ Button,
1482
+ {
1483
+ ref,
1484
+ variant,
1485
+ size: "icon",
1486
+ className: cn(
1487
+ "absolute size-8 rounded-full",
1488
+ orientation === "horizontal" ? "-left-12 top-1/2 -translate-y-1/2" : "-top-12 left-1/2 -translate-x-1/2 rotate-90",
1489
+ className
1490
+ ),
1491
+ disabled: !canScrollPrev,
1492
+ onClick: scrollPrev,
1493
+ ...props,
1494
+ children: [
1495
+ /* @__PURE__ */ jsx36(ArrowLeft, { className: "size-4" }),
1496
+ /* @__PURE__ */ jsx36("span", { className: "sr-only", children: "Previous slide" })
1497
+ ]
1498
+ }
1499
+ );
1500
+ }
1501
+ );
1502
+ CarouselPrevious.displayName = "CarouselPrevious";
1503
+ var CarouselNext = React31.forwardRef(
1504
+ ({ className, variant = "Outline", ...props }, ref) => {
1505
+ const { orientation, scrollNext, canScrollNext } = useCarousel();
1506
+ return /* @__PURE__ */ jsxs14(
1507
+ Button,
1508
+ {
1509
+ ref,
1510
+ variant,
1511
+ size: "icon",
1512
+ className: cn(
1513
+ "absolute size-8 rounded-full",
1514
+ orientation === "horizontal" ? "-right-12 top-1/2 -translate-y-1/2" : "-bottom-12 left-1/2 -translate-x-1/2 rotate-90",
1515
+ className
1516
+ ),
1517
+ disabled: !canScrollNext,
1518
+ onClick: scrollNext,
1519
+ ...props,
1520
+ children: [
1521
+ /* @__PURE__ */ jsx36(ArrowRight, { className: "size-4" }),
1522
+ /* @__PURE__ */ jsx36("span", { className: "sr-only", children: "Next slide" })
1523
+ ]
1524
+ }
1525
+ );
1526
+ }
1527
+ );
1528
+ CarouselNext.displayName = "CarouselNext";
1529
+
1530
+ // src/components/chart.tsx
1531
+ import * as React32 from "react";
1532
+ import * as RechartsPrimitive from "recharts";
1533
+ import { jsx as jsx37, jsxs as jsxs15 } from "react/jsx-runtime";
1534
+ var THEMES = { light: "", dark: ".dark" };
1535
+ var ChartContext = React32.createContext(null);
1536
+ function useChart() {
1537
+ const context = React32.useContext(ChartContext);
1538
+ if (!context) throw new Error("useChart must be used within a <ChartContainer />");
1539
+ return context;
1540
+ }
1541
+ var ChartContainer = React32.forwardRef(({ id, className, children, config, ...props }, ref) => {
1542
+ const uniqueId = React32.useId();
1543
+ const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
1544
+ return /* @__PURE__ */ jsx37(ChartContext.Provider, { value: { config }, children: /* @__PURE__ */ jsxs15(
1545
+ "div",
1546
+ {
1547
+ "data-chart": chartId,
1548
+ ref,
1549
+ className: cn(
1550
+ "flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none",
1551
+ className
1552
+ ),
1553
+ ...props,
1554
+ children: [
1555
+ /* @__PURE__ */ jsx37(ChartStyle, { id: chartId, config }),
1556
+ /* @__PURE__ */ jsx37(RechartsPrimitive.ResponsiveContainer, { children })
1557
+ ]
1558
+ }
1559
+ ) });
1560
+ });
1561
+ ChartContainer.displayName = "Chart";
1562
+ var ChartStyle = ({ id, config }) => {
1563
+ const colorConfig = Object.entries(config).filter(([, c]) => c.theme || c.color);
1564
+ if (!colorConfig.length) return null;
1565
+ return /* @__PURE__ */ jsx37(
1566
+ "style",
1567
+ {
1568
+ dangerouslySetInnerHTML: {
1569
+ __html: Object.entries(THEMES).map(
1570
+ ([theme, prefix]) => `
1571
+ ${prefix} [data-chart=${id}] {
1572
+ ${colorConfig.map(([key, itemConfig]) => {
1573
+ const color = itemConfig.theme?.[theme] || itemConfig.color;
1574
+ return color ? ` --color-${key}: ${color};` : null;
1575
+ }).join("\n")}
1576
+ }
1577
+ `
1578
+ ).join("\n")
1579
+ }
1580
+ }
1581
+ );
1582
+ };
1583
+ var ChartTooltip = RechartsPrimitive.Tooltip;
1584
+ var ChartTooltipContent = React32.forwardRef(
1585
+ ({ active, payload, className, indicator = "dot", hideLabel = false, hideIndicator = false, label, labelFormatter, formatter, color }, ref) => {
1586
+ const { config } = useChart();
1587
+ if (!active || !payload?.length) return null;
1588
+ return /* @__PURE__ */ jsxs15(
1589
+ "div",
1590
+ {
1591
+ ref,
1592
+ className: cn(
1593
+ "grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl",
1594
+ className
1595
+ ),
1596
+ children: [
1597
+ !hideLabel && /* @__PURE__ */ jsx37("div", { className: "font-medium", children: labelFormatter ? labelFormatter(label, payload) : label }),
1598
+ /* @__PURE__ */ jsx37("div", { className: "grid gap-1.5", children: payload.map((item, i) => {
1599
+ const key = `${item.name || item.dataKey || "value"}`;
1600
+ const itemConfig = config[key];
1601
+ const indicatorColor = color || item.payload?.fill || item.color;
1602
+ return /* @__PURE__ */ jsxs15("div", { className: "flex w-full items-center gap-2", children: [
1603
+ !hideIndicator && /* @__PURE__ */ jsx37(
1604
+ "div",
1605
+ {
1606
+ className: cn("shrink-0 rounded-[2px]", {
1607
+ "size-2.5": indicator === "dot",
1608
+ "w-1": indicator === "line",
1609
+ "w-0 border-[1.5px] border-dashed bg-transparent": indicator === "dashed"
1610
+ }),
1611
+ style: { backgroundColor: indicatorColor, borderColor: indicatorColor }
1612
+ }
1613
+ ),
1614
+ /* @__PURE__ */ jsxs15("div", { className: "flex flex-1 justify-between leading-none", children: [
1615
+ /* @__PURE__ */ jsx37("span", { className: "text-muted-foreground", children: itemConfig?.label || item.name }),
1616
+ item.value != null && /* @__PURE__ */ jsx37("span", { className: "font-mono font-medium tabular-nums text-foreground", children: formatter ? formatter(item.value, item.name, item, i, payload) : item.value.toLocaleString() })
1617
+ ] })
1618
+ ] }, key + i);
1619
+ }) })
1620
+ ]
1621
+ }
1622
+ );
1623
+ }
1624
+ );
1625
+ ChartTooltipContent.displayName = "ChartTooltipContent";
1626
+ var ChartLegend = RechartsPrimitive.Legend;
1627
+ var ChartLegendContent = React32.forwardRef(({ className, payload, verticalAlign = "bottom" }, ref) => {
1628
+ const { config } = useChart();
1629
+ if (!payload?.length) return null;
1630
+ return /* @__PURE__ */ jsx37(
1631
+ "div",
1632
+ {
1633
+ ref,
1634
+ className: cn("flex items-center justify-center gap-4", verticalAlign === "top" ? "pb-3" : "pt-3", className),
1635
+ children: payload.map((item) => {
1636
+ const key = `${item.dataKey || "value"}`;
1637
+ const itemConfig = config[key];
1638
+ return /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-1.5", children: [
1639
+ /* @__PURE__ */ jsx37("div", { className: "size-2 shrink-0 rounded-[2px]", style: { backgroundColor: item.color } }),
1640
+ itemConfig?.label || item.value
1641
+ ] }, item.value);
1642
+ })
1643
+ }
1644
+ );
1645
+ });
1646
+ ChartLegendContent.displayName = "ChartLegendContent";
1647
+
1648
+ // src/components/command.tsx
1649
+ import * as React33 from "react";
1650
+ import { Command as CommandPrimitive } from "cmdk";
1651
+ import { Search } from "lucide-react";
1652
+ import { jsx as jsx38, jsxs as jsxs16 } from "react/jsx-runtime";
1653
+ var Command = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
1654
+ CommandPrimitive,
1655
+ {
1656
+ ref,
1657
+ className: cn(
1658
+ "flex size-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground font-sans",
1659
+ className
1660
+ ),
1661
+ ...props
1662
+ }
1663
+ ));
1664
+ Command.displayName = CommandPrimitive.displayName;
1665
+ var CommandDialog = ({ children, ...props }) => /* @__PURE__ */ jsx38(Dialog, { ...props, children: /* @__PURE__ */ jsx38(DialogContent, { className: "overflow-hidden p-0", children: /* @__PURE__ */ jsx38(Command, { className: "[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-input-wrapper]_svg]:size-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:size-5", children }) }) });
1666
+ var CommandInput = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs16("div", { className: "flex items-center border-b px-3", "cmdk-input-wrapper": "", children: [
1667
+ /* @__PURE__ */ jsx38(Search, { className: "mr-2 size-4 shrink-0 opacity-50" }),
1668
+ /* @__PURE__ */ jsx38(
1669
+ CommandPrimitive.Input,
1670
+ {
1671
+ ref,
1672
+ className: cn(
1673
+ "flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
1674
+ className
1675
+ ),
1676
+ ...props
1677
+ }
1678
+ )
1679
+ ] }));
1680
+ CommandInput.displayName = CommandPrimitive.Input.displayName;
1681
+ var CommandList = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
1682
+ CommandPrimitive.List,
1683
+ {
1684
+ ref,
1685
+ className: cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className),
1686
+ ...props
1687
+ }
1688
+ ));
1689
+ CommandList.displayName = CommandPrimitive.List.displayName;
1690
+ var CommandEmpty = React33.forwardRef((props, ref) => /* @__PURE__ */ jsx38(CommandPrimitive.Empty, { ref, className: "py-6 text-center text-sm", ...props }));
1691
+ CommandEmpty.displayName = CommandPrimitive.Empty.displayName;
1692
+ var CommandGroup = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
1693
+ CommandPrimitive.Group,
1694
+ {
1695
+ ref,
1696
+ className: cn(
1697
+ "overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
1698
+ className
1699
+ ),
1700
+ ...props
1701
+ }
1702
+ ));
1703
+ CommandGroup.displayName = CommandPrimitive.Group.displayName;
1704
+ var CommandSeparator = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(CommandPrimitive.Separator, { ref, className: cn("-mx-1 h-px bg-border", className), ...props }));
1705
+ CommandSeparator.displayName = CommandPrimitive.Separator.displayName;
1706
+ var CommandItem = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
1707
+ CommandPrimitive.Item,
1708
+ {
1709
+ ref,
1710
+ className: cn(
1711
+ "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0",
1712
+ className
1713
+ ),
1714
+ ...props
1715
+ }
1716
+ ));
1717
+ CommandItem.displayName = CommandPrimitive.Item.displayName;
1718
+ var CommandShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx38("span", { className: cn("ml-auto text-xs tracking-widest text-muted-foreground", className), ...props });
1719
+ CommandShortcut.displayName = "CommandShortcut";
1720
+
1721
+ // src/components/context-menu.tsx
1722
+ import * as React34 from "react";
1723
+ import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
1724
+ import { Check as Check4, ChevronRight as ChevronRight5, Circle as Circle3 } from "lucide-react";
1725
+ import { jsx as jsx39, jsxs as jsxs17 } from "react/jsx-runtime";
1726
+ var ContextMenu = ContextMenuPrimitive.Root;
1727
+ var ContextMenuTrigger = ContextMenuPrimitive.Trigger;
1728
+ var ContextMenuGroup = ContextMenuPrimitive.Group;
1729
+ var ContextMenuPortal = ContextMenuPrimitive.Portal;
1730
+ var ContextMenuSub = ContextMenuPrimitive.Sub;
1731
+ var ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;
1732
+ var itemCls2 = "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
1733
+ var contentCls2 = "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md font-sans 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";
1734
+ var ContextMenuSubTrigger = React34.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs17(
1735
+ ContextMenuPrimitive.SubTrigger,
1736
+ {
1737
+ ref,
1738
+ className: cn(itemCls2, "data-[state=open]:bg-accent", inset && "pl-8", className),
1739
+ ...props,
1740
+ children: [
1741
+ children,
1742
+ /* @__PURE__ */ jsx39(ChevronRight5, { className: "ml-auto size-4" })
1743
+ ]
1744
+ }
1745
+ ));
1746
+ ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName;
1747
+ var ContextMenuSubContent = React34.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx39(ContextMenuPrimitive.SubContent, { ref, className: cn(contentCls2, className), ...props }));
1748
+ ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName;
1749
+ var ContextMenuContent = React34.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx39(ContextMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx39(ContextMenuPrimitive.Content, { ref, className: cn(contentCls2, className), ...props }) }));
1750
+ ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName;
1751
+ var ContextMenuItem = React34.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx39(ContextMenuPrimitive.Item, { ref, className: cn(itemCls2, inset && "pl-8", className), ...props }));
1752
+ ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName;
1753
+ var ContextMenuCheckboxItem = React34.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs17(ContextMenuPrimitive.CheckboxItem, { ref, className: cn(itemCls2, "pl-8", className), checked, ...props, children: [
1754
+ /* @__PURE__ */ jsx39("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx39(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx39(Check4, { className: "size-4" }) }) }),
1755
+ children
1756
+ ] }));
1757
+ ContextMenuCheckboxItem.displayName = ContextMenuPrimitive.CheckboxItem.displayName;
1758
+ var ContextMenuRadioItem = React34.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs17(ContextMenuPrimitive.RadioItem, { ref, className: cn(itemCls2, "pl-8", className), ...props, children: [
1759
+ /* @__PURE__ */ jsx39("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx39(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx39(Circle3, { className: "size-2 fill-current" }) }) }),
1760
+ children
1761
+ ] }));
1762
+ ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName;
1763
+ var ContextMenuLabel = React34.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx39(
1764
+ ContextMenuPrimitive.Label,
1765
+ {
1766
+ ref,
1767
+ className: cn("px-2 py-1.5 text-sm font-semibold text-foreground", inset && "pl-8", className),
1768
+ ...props
1769
+ }
1770
+ ));
1771
+ ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName;
1772
+ var ContextMenuSeparator = React34.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx39(ContextMenuPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-border", className), ...props }));
1773
+ ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName;
1774
+ var ContextMenuShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx39("span", { className: cn("ml-auto text-xs tracking-widest text-muted-foreground", className), ...props });
1775
+ ContextMenuShortcut.displayName = "ContextMenuShortcut";
1776
+
1777
+ // src/components/data-table.tsx
1778
+ import * as React35 from "react";
1779
+ import {
1780
+ flexRender,
1781
+ getCoreRowModel,
1782
+ getPaginationRowModel,
1783
+ getSortedRowModel,
1784
+ useReactTable
1785
+ } from "@tanstack/react-table";
1786
+ import { jsx as jsx40, jsxs as jsxs18 } from "react/jsx-runtime";
1787
+ function DataTable({
1788
+ columns,
1789
+ data,
1790
+ className,
1791
+ pageSize = 10
1792
+ }) {
1793
+ const [sorting, setSorting] = React35.useState([]);
1794
+ const table = useReactTable({
1795
+ data,
1796
+ columns,
1797
+ state: { sorting },
1798
+ onSortingChange: setSorting,
1799
+ getCoreRowModel: getCoreRowModel(),
1800
+ getSortedRowModel: getSortedRowModel(),
1801
+ getPaginationRowModel: getPaginationRowModel(),
1802
+ initialState: { pagination: { pageSize } }
1803
+ });
1804
+ return /* @__PURE__ */ jsxs18("div", { className: cn("space-y-3", className), children: [
1805
+ /* @__PURE__ */ jsx40("div", { className: "rounded-md border", children: /* @__PURE__ */ jsxs18(Table, { children: [
1806
+ /* @__PURE__ */ jsx40(TableHeader, { children: table.getHeaderGroups().map((hg) => /* @__PURE__ */ jsx40(TableRow, { children: hg.headers.map((header) => /* @__PURE__ */ jsx40(TableHead, { children: header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext()) }, header.id)) }, hg.id)) }),
1807
+ /* @__PURE__ */ jsx40(TableBody, { children: table.getRowModel().rows.length ? table.getRowModel().rows.map((row) => /* @__PURE__ */ jsx40(TableRow, { "data-state": row.getIsSelected() && "selected", children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx40(TableCell, { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id)) }, row.id)) : /* @__PURE__ */ jsx40(TableRow, { children: /* @__PURE__ */ jsx40(TableCell, { colSpan: columns.length, className: "h-24 text-center", children: "No results." }) }) })
1808
+ ] }) }),
1809
+ /* @__PURE__ */ jsxs18("div", { className: "flex items-center justify-end gap-2", children: [
1810
+ /* @__PURE__ */ jsx40(Button, { variant: "Outline", size: "sm", onClick: () => table.previousPage(), disabled: !table.getCanPreviousPage(), children: "Previous" }),
1811
+ /* @__PURE__ */ jsx40(Button, { variant: "Outline", size: "sm", onClick: () => table.nextPage(), disabled: !table.getCanNextPage(), children: "Next" })
1812
+ ] })
1813
+ ] });
1814
+ }
1815
+
1816
+ // src/components/drawer.tsx
1817
+ import * as React36 from "react";
1818
+ import { Drawer as DrawerPrimitive } from "vaul";
1819
+ import { jsx as jsx41, jsxs as jsxs19 } from "react/jsx-runtime";
1820
+ var Drawer = ({ shouldScaleBackground = true, ...props }) => /* @__PURE__ */ jsx41(DrawerPrimitive.Root, { shouldScaleBackground, ...props });
1821
+ Drawer.displayName = "Drawer";
1822
+ var DrawerTrigger = DrawerPrimitive.Trigger;
1823
+ var DrawerPortal = DrawerPrimitive.Portal;
1824
+ var DrawerClose = DrawerPrimitive.Close;
1825
+ var DrawerOverlay = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx41(DrawerPrimitive.Overlay, { ref, className: cn("fixed inset-0 z-50 bg-foreground/40", className), ...props }));
1826
+ DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName;
1827
+ var DrawerContent = React36.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs19(DrawerPortal, { children: [
1828
+ /* @__PURE__ */ jsx41(DrawerOverlay, {}),
1829
+ /* @__PURE__ */ jsxs19(
1830
+ DrawerPrimitive.Content,
1831
+ {
1832
+ ref,
1833
+ className: cn(
1834
+ "fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background font-sans",
1835
+ className
1836
+ ),
1837
+ ...props,
1838
+ children: [
1839
+ /* @__PURE__ */ jsx41("div", { className: "mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted" }),
1840
+ children
1841
+ ]
1842
+ }
1843
+ )
1844
+ ] }));
1845
+ DrawerContent.displayName = "DrawerContent";
1846
+ var DrawerHeader = ({ className, ...props }) => /* @__PURE__ */ jsx41("div", { className: cn("grid gap-1.5 p-4 text-center sm:text-left", className), ...props });
1847
+ DrawerHeader.displayName = "DrawerHeader";
1848
+ var DrawerFooter = ({ className, ...props }) => /* @__PURE__ */ jsx41("div", { className: cn("mt-auto flex flex-col gap-2 p-4", className), ...props });
1849
+ DrawerFooter.displayName = "DrawerFooter";
1850
+ var DrawerTitle = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx41(DrawerPrimitive.Title, { ref, className: cn("text-lg font-semibold leading-none tracking-tight", className), ...props }));
1851
+ DrawerTitle.displayName = DrawerPrimitive.Title.displayName;
1852
+ var DrawerDescription = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx41(DrawerPrimitive.Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
1853
+ DrawerDescription.displayName = DrawerPrimitive.Description.displayName;
1854
+
1855
+ // src/components/field.tsx
1856
+ import * as React37 from "react";
1857
+ import { Slot as Slot3 } from "@radix-ui/react-slot";
1858
+ import { CircleAlert, CircleCheck, Info, TriangleAlert } from "lucide-react";
1859
+ import { cva as cva10 } from "class-variance-authority";
1860
+ import { jsx as jsx42, jsxs as jsxs20 } from "react/jsx-runtime";
1861
+ var FieldContext = React37.createContext(null);
1862
+ function useField() {
1863
+ const ctx = React37.useContext(FieldContext);
1864
+ if (!ctx) throw new Error("Field parts must be used within <Field>");
1865
+ return ctx;
1866
+ }
1867
+ var Field = React37.forwardRef(
1868
+ ({ className, invalid = false, ...props }, ref) => {
1869
+ const id = React37.useId();
1870
+ const value = React37.useMemo(
1871
+ () => ({ id: `${id}-control`, descriptionId: `${id}-description`, messageId: `${id}-message`, invalid }),
1872
+ [id, invalid]
1873
+ );
1874
+ return /* @__PURE__ */ jsx42(FieldContext.Provider, { value, children: /* @__PURE__ */ jsx42("div", { ref, "data-invalid": invalid || void 0, className: cn("grid gap-1.5", className), ...props }) });
1875
+ }
1876
+ );
1877
+ Field.displayName = "Field";
1878
+ var FieldLabel = React37.forwardRef(({ className, ...props }, ref) => {
1879
+ const { id, invalid } = useField();
1880
+ return /* @__PURE__ */ jsx42(Label2, { ref, htmlFor: id, className: cn(invalid && "text-destructive", className), ...props });
1881
+ });
1882
+ FieldLabel.displayName = "FieldLabel";
1883
+ var FieldControl = React37.forwardRef(
1884
+ ({ ...props }, ref) => {
1885
+ const { id, descriptionId, messageId, invalid } = useField();
1886
+ return /* @__PURE__ */ jsx42(
1887
+ Slot3,
1888
+ {
1889
+ ref,
1890
+ id,
1891
+ "aria-invalid": invalid || void 0,
1892
+ "aria-describedby": `${descriptionId} ${messageId}`,
1893
+ ...props
1894
+ }
1895
+ );
1896
+ }
1897
+ );
1898
+ FieldControl.displayName = "FieldControl";
1899
+ var FieldDescription = React37.forwardRef(
1900
+ ({ className, ...props }, ref) => {
1901
+ const { descriptionId } = useField();
1902
+ return /* @__PURE__ */ jsx42("p", { ref, id: descriptionId, className: cn("text-body-sm text-muted-foreground", className), ...props });
1903
+ }
1904
+ );
1905
+ FieldDescription.displayName = "FieldDescription";
1906
+ var messageVariants = cva10("flex items-center gap-1.5 text-body-sm [&>svg]:size-3.5 [&>svg]:shrink-0", {
1907
+ variants: {
1908
+ intent: {
1909
+ error: "text-destructive",
1910
+ warning: "text-warning",
1911
+ success: "text-success",
1912
+ info: "text-info"
1913
+ }
1914
+ },
1915
+ defaultVariants: { intent: "error" }
1916
+ });
1917
+ var INTENT_ICON = {
1918
+ error: CircleAlert,
1919
+ warning: TriangleAlert,
1920
+ success: CircleCheck,
1921
+ info: Info
1922
+ };
1923
+ var FieldMessage = React37.forwardRef(
1924
+ ({ className, intent = "error", hideIcon, children, ...props }, ref) => {
1925
+ const { messageId } = useField();
1926
+ const Icon2 = INTENT_ICON[intent ?? "error"];
1927
+ if (!children) return null;
1928
+ return /* @__PURE__ */ jsxs20("p", { ref, id: messageId, className: cn(messageVariants({ intent }), className), ...props, children: [
1929
+ !hideIcon && /* @__PURE__ */ jsx42(Icon2, {}),
1930
+ /* @__PURE__ */ jsx42("span", { children })
1931
+ ] });
1932
+ }
1933
+ );
1934
+ FieldMessage.displayName = "FieldMessage";
1935
+
1936
+ // src/components/form.tsx
1937
+ import * as React38 from "react";
1938
+ import { Slot as Slot4 } from "@radix-ui/react-slot";
1939
+ import {
1940
+ Controller,
1941
+ FormProvider,
1942
+ useFormContext,
1943
+ useFormState
1944
+ } from "react-hook-form";
1945
+ import { jsx as jsx43 } from "react/jsx-runtime";
1946
+ var Form = FormProvider;
1947
+ var FormFieldContext = React38.createContext({});
1948
+ var FormField = ({
1949
+ ...props
1950
+ }) => /* @__PURE__ */ jsx43(FormFieldContext.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsx43(Controller, { ...props }) });
1951
+ var useFormField = () => {
1952
+ const fieldContext = React38.useContext(FormFieldContext);
1953
+ const itemContext = React38.useContext(FormItemContext);
1954
+ const { getFieldState } = useFormContext();
1955
+ const formState = useFormState({ name: fieldContext.name });
1956
+ const fieldState = getFieldState(fieldContext.name, formState);
1957
+ if (!fieldContext) throw new Error("useFormField should be used within <FormField>");
1958
+ const { id } = itemContext;
1959
+ return {
1960
+ id,
1961
+ name: fieldContext.name,
1962
+ formItemId: `${id}-form-item`,
1963
+ formDescriptionId: `${id}-form-item-description`,
1964
+ formMessageId: `${id}-form-item-message`,
1965
+ ...fieldState
1966
+ };
1967
+ };
1968
+ var FormItemContext = React38.createContext({});
1969
+ var FormItem = React38.forwardRef(
1970
+ ({ className, ...props }, ref) => {
1971
+ const id = React38.useId();
1972
+ return /* @__PURE__ */ jsx43(FormItemContext.Provider, { value: { id }, children: /* @__PURE__ */ jsx43("div", { ref, className: cn("grid gap-2", className), ...props }) });
1973
+ }
1974
+ );
1975
+ FormItem.displayName = "FormItem";
1976
+ var FormLabel = React38.forwardRef(({ className, ...props }, ref) => {
1977
+ const { error, formItemId } = useFormField();
1978
+ return /* @__PURE__ */ jsx43(Label2, { ref, className: cn(error && "text-destructive", className), htmlFor: formItemId, ...props });
1979
+ });
1980
+ FormLabel.displayName = "FormLabel";
1981
+ var FormControl = React38.forwardRef(({ ...props }, ref) => {
1982
+ const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
1983
+ return /* @__PURE__ */ jsx43(
1984
+ Slot4,
1985
+ {
1986
+ ref,
1987
+ id: formItemId,
1988
+ "aria-describedby": !error ? formDescriptionId : `${formDescriptionId} ${formMessageId}`,
1989
+ "aria-invalid": !!error,
1990
+ ...props
1991
+ }
1992
+ );
1993
+ });
1994
+ FormControl.displayName = "FormControl";
1995
+ var FormDescription = React38.forwardRef(
1996
+ ({ className, ...props }, ref) => {
1997
+ const { formDescriptionId } = useFormField();
1998
+ return /* @__PURE__ */ jsx43("p", { ref, id: formDescriptionId, className: cn("text-sm text-muted-foreground", className), ...props });
1999
+ }
2000
+ );
2001
+ FormDescription.displayName = "FormDescription";
2002
+ var FormMessage = React38.forwardRef(
2003
+ ({ className, children, ...props }, ref) => {
2004
+ const { error, formMessageId } = useFormField();
2005
+ const body = error ? String(error?.message ?? "") : children;
2006
+ if (!body) return null;
2007
+ return /* @__PURE__ */ jsx43("p", { ref, id: formMessageId, className: cn("text-sm font-medium text-destructive", className), ...props, children: body });
2008
+ }
2009
+ );
2010
+ FormMessage.displayName = "FormMessage";
2011
+
2012
+ // src/components/input-group.tsx
2013
+ import * as React39 from "react";
2014
+ import { cva as cva11 } from "class-variance-authority";
2015
+ import { jsx as jsx44 } from "react/jsx-runtime";
2016
+ var InputGroup = React39.forwardRef(
2017
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx44(
2018
+ "div",
2019
+ {
2020
+ ref,
2021
+ "data-slot": "input-group",
2022
+ className: cn(
2023
+ "flex w-full items-center overflow-hidden rounded-sm border border-input bg-background font-sans transition-colors",
2024
+ "focus-within:border-primary focus-within:shadow-focus",
2025
+ "has-[[aria-invalid=true]]:border-destructive has-[[aria-invalid=true]]:focus-within:shadow-focus-destructive",
2026
+ "has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50",
2027
+ className
2028
+ ),
2029
+ ...props
2030
+ }
2031
+ )
2032
+ );
2033
+ InputGroup.displayName = "InputGroup";
2034
+ var InputGroupInput = React39.forwardRef(({ className, type = "text", ...props }, ref) => /* @__PURE__ */ jsx44(
2035
+ "input",
2036
+ {
2037
+ ref,
2038
+ type,
2039
+ "data-slot": "input-group-input",
2040
+ className: cn(
2041
+ "min-w-0 flex-1 bg-transparent px-3 py-3 text-body-md text-foreground",
2042
+ "placeholder:text-muted-foreground outline-none disabled:cursor-not-allowed",
2043
+ className
2044
+ ),
2045
+ ...props
2046
+ }
2047
+ ));
2048
+ InputGroupInput.displayName = "InputGroupInput";
2049
+ var addonVariants = cva11("flex shrink-0 items-center gap-2 text-muted-foreground [&_svg]:size-4 [&_svg]:shrink-0", {
2050
+ variants: { align: { start: "pl-3", end: "pr-3" } },
2051
+ defaultVariants: { align: "start" }
2052
+ });
2053
+ var InputGroupAddon = React39.forwardRef(({ className, align, ...props }, ref) => /* @__PURE__ */ jsx44("div", { ref, "data-slot": "input-group-addon", className: cn(addonVariants({ align }), className), ...props }));
2054
+ InputGroupAddon.displayName = "InputGroupAddon";
2055
+ var InputGroupText = React39.forwardRef(
2056
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx44(
2057
+ "span",
2058
+ {
2059
+ ref,
2060
+ className: cn("select-none whitespace-nowrap px-3 text-body-md text-muted-foreground", className),
2061
+ ...props
2062
+ }
2063
+ )
2064
+ );
2065
+ InputGroupText.displayName = "InputGroupText";
2066
+ var InputGroupButton = React39.forwardRef(({ className, type = "button", ...props }, ref) => /* @__PURE__ */ jsx44(
2067
+ "button",
2068
+ {
2069
+ ref,
2070
+ type,
2071
+ className: cn(
2072
+ "flex h-full shrink-0 items-center gap-1.5 self-stretch border-l border-input bg-muted px-3 text-label-md text-foreground",
2073
+ "outline-none transition-colors hover:bg-accent focus-visible:bg-accent disabled:cursor-not-allowed disabled:opacity-50",
2074
+ "[&_svg]:size-4 [&_svg]:shrink-0",
2075
+ className
2076
+ ),
2077
+ ...props
2078
+ }
2079
+ ));
2080
+ InputGroupButton.displayName = "InputGroupButton";
2081
+
2082
+ // src/components/input-otp.tsx
2083
+ import * as React40 from "react";
2084
+ import { OTPInput, OTPInputContext } from "input-otp";
2085
+ import { Minus as Minus2 } from "lucide-react";
2086
+ import { jsx as jsx45, jsxs as jsxs21 } from "react/jsx-runtime";
2087
+ var InputOTP = React40.forwardRef(({ className, containerClassName, ...props }, ref) => /* @__PURE__ */ jsx45(
2088
+ OTPInput,
2089
+ {
2090
+ ref,
2091
+ containerClassName: cn("flex items-center gap-2 has-[:disabled]:opacity-50", containerClassName),
2092
+ className: cn("disabled:cursor-not-allowed", className),
2093
+ ...props
2094
+ }
2095
+ ));
2096
+ InputOTP.displayName = "InputOTP";
2097
+ var InputOTPGroup = React40.forwardRef(
2098
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx45("div", { ref, className: cn("flex items-center", className), ...props })
2099
+ );
2100
+ InputOTPGroup.displayName = "InputOTPGroup";
2101
+ var InputOTPSlot = React40.forwardRef(({ index, className, ...props }, ref) => {
2102
+ const inputOTPContext = React40.useContext(OTPInputContext);
2103
+ const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index] ?? {};
2104
+ return /* @__PURE__ */ jsxs21(
2105
+ "div",
2106
+ {
2107
+ ref,
2108
+ className: cn(
2109
+ "relative flex size-9 items-center justify-center border-y border-r border-input text-sm shadow-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md",
2110
+ isActive && "z-10 ring-1 ring-ring",
2111
+ className
2112
+ ),
2113
+ ...props,
2114
+ children: [
2115
+ char,
2116
+ hasFakeCaret && /* @__PURE__ */ jsx45("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsx45("div", { className: "h-4 w-px animate-caret-blink bg-foreground duration-1000" }) })
2117
+ ]
2118
+ }
2119
+ );
2120
+ });
2121
+ InputOTPSlot.displayName = "InputOTPSlot";
2122
+ var InputOTPSeparator = React40.forwardRef(
2123
+ ({ ...props }, ref) => /* @__PURE__ */ jsx45("div", { ref, role: "separator", ...props, children: /* @__PURE__ */ jsx45(Minus2, { className: "size-4" }) })
2124
+ );
2125
+ InputOTPSeparator.displayName = "InputOTPSeparator";
2126
+
2127
+ // src/components/password-input.tsx
2128
+ import * as React41 from "react";
2129
+ import { Eye, EyeOff } from "lucide-react";
2130
+ import { jsx as jsx46, jsxs as jsxs22 } from "react/jsx-runtime";
2131
+ var PasswordInput = React41.forwardRef(({ className, ...props }, ref) => {
2132
+ const [visible, setVisible] = React41.useState(false);
2133
+ return /* @__PURE__ */ jsxs22(InputGroup, { className, children: [
2134
+ /* @__PURE__ */ jsx46(InputGroupInput, { ref, type: visible ? "text" : "password", ...props }),
2135
+ /* @__PURE__ */ jsx46(InputGroupAddon, { align: "end", children: /* @__PURE__ */ jsx46(
2136
+ "button",
2137
+ {
2138
+ type: "button",
2139
+ "aria-label": visible ? "Hide password" : "Show password",
2140
+ "aria-pressed": visible,
2141
+ onClick: () => setVisible((v) => !v),
2142
+ className: cn("rounded-[2px] outline-none transition-colors hover:text-foreground focus-visible:text-foreground"),
2143
+ children: visible ? /* @__PURE__ */ jsx46(EyeOff, {}) : /* @__PURE__ */ jsx46(Eye, {})
2144
+ }
2145
+ ) })
2146
+ ] });
2147
+ });
2148
+ PasswordInput.displayName = "PasswordInput";
2149
+
2150
+ // src/components/menubar.tsx
2151
+ import * as React42 from "react";
2152
+ import * as MenubarPrimitive from "@radix-ui/react-menubar";
2153
+ import { Check as Check5, ChevronRight as ChevronRight6, Circle as Circle4 } from "lucide-react";
2154
+ import { jsx as jsx47, jsxs as jsxs23 } from "react/jsx-runtime";
2155
+ var MenubarMenu = (props) => /* @__PURE__ */ jsx47(MenubarPrimitive.Menu, { ...props });
2156
+ var MenubarGroup = (props) => /* @__PURE__ */ jsx47(MenubarPrimitive.Group, { ...props });
2157
+ var MenubarPortal = (props) => /* @__PURE__ */ jsx47(MenubarPrimitive.Portal, { ...props });
2158
+ var MenubarSub = (props) => /* @__PURE__ */ jsx47(MenubarPrimitive.Sub, { ...props });
2159
+ var MenubarRadioGroup = (props) => /* @__PURE__ */ jsx47(MenubarPrimitive.RadioGroup, { ...props });
2160
+ var itemCls3 = "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
2161
+ var contentCls3 = "z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md font-sans data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95";
2162
+ var Menubar = React42.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
2163
+ MenubarPrimitive.Root,
2164
+ {
2165
+ ref,
2166
+ className: cn("flex h-9 items-center gap-1 rounded-md border bg-background p-1 shadow-sm font-sans", className),
2167
+ ...props
2168
+ }
2169
+ ));
2170
+ Menubar.displayName = MenubarPrimitive.Root.displayName;
2171
+ var MenubarTrigger = React42.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
2172
+ MenubarPrimitive.Trigger,
2173
+ {
2174
+ ref,
2175
+ className: cn(
2176
+ "flex cursor-default select-none items-center rounded-sm px-3 py-1 text-sm font-medium outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
2177
+ className
2178
+ ),
2179
+ ...props
2180
+ }
2181
+ ));
2182
+ MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName;
2183
+ var MenubarSubTrigger = React42.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs23(MenubarPrimitive.SubTrigger, { ref, className: cn(itemCls3, "data-[state=open]:bg-accent", inset && "pl-8", className), ...props, children: [
2184
+ children,
2185
+ /* @__PURE__ */ jsx47(ChevronRight6, { className: "ml-auto size-4" })
2186
+ ] }));
2187
+ MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName;
2188
+ var MenubarSubContent = React42.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(MenubarPrimitive.SubContent, { ref, className: cn(contentCls3, className), ...props }));
2189
+ MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName;
2190
+ var MenubarContent = React42.forwardRef(({ className, align = "start", alignOffset = -4, sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx47(MenubarPrimitive.Portal, { children: /* @__PURE__ */ jsx47(
2191
+ MenubarPrimitive.Content,
2192
+ {
2193
+ ref,
2194
+ align,
2195
+ alignOffset,
2196
+ sideOffset,
2197
+ className: cn(contentCls3, className),
2198
+ ...props
2199
+ }
2200
+ ) }));
2201
+ MenubarContent.displayName = MenubarPrimitive.Content.displayName;
2202
+ var MenubarItem = React42.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx47(MenubarPrimitive.Item, { ref, className: cn(itemCls3, inset && "pl-8", className), ...props }));
2203
+ MenubarItem.displayName = MenubarPrimitive.Item.displayName;
2204
+ var MenubarCheckboxItem = React42.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs23(MenubarPrimitive.CheckboxItem, { ref, className: cn(itemCls3, "pl-8", className), checked, ...props, children: [
2205
+ /* @__PURE__ */ jsx47("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx47(MenubarPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx47(Check5, { className: "size-4" }) }) }),
2206
+ children
2207
+ ] }));
2208
+ MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName;
2209
+ var MenubarRadioItem = React42.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs23(MenubarPrimitive.RadioItem, { ref, className: cn(itemCls3, "pl-8", className), ...props, children: [
2210
+ /* @__PURE__ */ jsx47("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx47(MenubarPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx47(Circle4, { className: "size-2 fill-current" }) }) }),
2211
+ children
2212
+ ] }));
2213
+ MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName;
2214
+ var MenubarLabel = React42.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx47(MenubarPrimitive.Label, { ref, className: cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className), ...props }));
2215
+ MenubarLabel.displayName = MenubarPrimitive.Label.displayName;
2216
+ var MenubarSeparator = React42.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(MenubarPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-border", className), ...props }));
2217
+ MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName;
2218
+ var MenubarShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx47("span", { className: cn("ml-auto text-xs tracking-widest text-muted-foreground", className), ...props });
2219
+ MenubarShortcut.displayName = "MenubarShortcut";
2220
+
2221
+ // src/components/navigation-menu.tsx
2222
+ import * as React43 from "react";
2223
+ import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
2224
+ import { cva as cva12 } from "class-variance-authority";
2225
+ import { ChevronDown as ChevronDown3 } from "lucide-react";
2226
+ import { jsx as jsx48, jsxs as jsxs24 } from "react/jsx-runtime";
2227
+ var NavigationMenu = React43.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs24(
2228
+ NavigationMenuPrimitive.Root,
2229
+ {
2230
+ ref,
2231
+ className: cn("relative z-10 flex max-w-max flex-1 items-center justify-center font-sans", className),
2232
+ ...props,
2233
+ children: [
2234
+ children,
2235
+ /* @__PURE__ */ jsx48(NavigationMenuViewport, {})
2236
+ ]
2237
+ }
2238
+ ));
2239
+ NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName;
2240
+ var NavigationMenuList = React43.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48(
2241
+ NavigationMenuPrimitive.List,
2242
+ {
2243
+ ref,
2244
+ className: cn("group flex flex-1 list-none items-center justify-center gap-1", className),
2245
+ ...props
2246
+ }
2247
+ ));
2248
+ NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
2249
+ var NavigationMenuItem = NavigationMenuPrimitive.Item;
2250
+ var navigationMenuTriggerStyle = cva12(
2251
+ "group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-accent/50"
2252
+ );
2253
+ var NavigationMenuTrigger = React43.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs24(NavigationMenuPrimitive.Trigger, { ref, className: cn(navigationMenuTriggerStyle(), "group", className), ...props, children: [
2254
+ children,
2255
+ /* @__PURE__ */ jsx48(
2256
+ ChevronDown3,
2257
+ {
2258
+ className: "relative top-px ml-1 size-3 transition-transform duration-200 group-data-[state=open]:rotate-180",
2259
+ "aria-hidden": true
2260
+ }
2261
+ )
2262
+ ] }));
2263
+ NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName;
2264
+ var NavigationMenuContent = React43.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48(
2265
+ NavigationMenuPrimitive.Content,
2266
+ {
2267
+ ref,
2268
+ className: cn(
2269
+ "left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out md:absolute md:w-auto",
2270
+ className
2271
+ ),
2272
+ ...props
2273
+ }
2274
+ ));
2275
+ NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName;
2276
+ var NavigationMenuLink = NavigationMenuPrimitive.Link;
2277
+ var NavigationMenuViewport = React43.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48("div", { className: "absolute left-0 top-full flex justify-center", children: /* @__PURE__ */ jsx48(
2278
+ NavigationMenuPrimitive.Viewport,
2279
+ {
2280
+ ref,
2281
+ className: cn(
2282
+ "origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]",
2283
+ className
2284
+ ),
2285
+ ...props
2286
+ }
2287
+ ) }));
2288
+ NavigationMenuViewport.displayName = NavigationMenuPrimitive.Viewport.displayName;
2289
+ var NavigationMenuIndicator = React43.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48(
2290
+ NavigationMenuPrimitive.Indicator,
2291
+ {
2292
+ ref,
2293
+ className: cn(
2294
+ "top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in",
2295
+ className
2296
+ ),
2297
+ ...props,
2298
+ children: /* @__PURE__ */ jsx48("div", { className: "relative top-[60%] size-2 rotate-45 rounded-tl-sm bg-border shadow-md" })
2299
+ }
2300
+ ));
2301
+ NavigationMenuIndicator.displayName = NavigationMenuPrimitive.Indicator.displayName;
2302
+
2303
+ // src/components/resizable.tsx
2304
+ import { GripVertical } from "lucide-react";
2305
+ import * as ResizablePrimitive from "react-resizable-panels";
2306
+ import { jsx as jsx49 } from "react/jsx-runtime";
2307
+ var ResizablePanelGroup = ({
2308
+ className,
2309
+ ...props
2310
+ }) => /* @__PURE__ */ jsx49(
2311
+ ResizablePrimitive.PanelGroup,
2312
+ {
2313
+ className: cn("flex h-full w-full data-[panel-group-direction=vertical]:flex-col", className),
2314
+ ...props
2315
+ }
2316
+ );
2317
+ var ResizablePanel = ResizablePrimitive.Panel;
2318
+ var ResizableHandle = ({
2319
+ withHandle,
2320
+ className,
2321
+ ...props
2322
+ }) => /* @__PURE__ */ jsx49(
2323
+ ResizablePrimitive.PanelResizeHandle,
2324
+ {
2325
+ className: cn(
2326
+ "relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90",
2327
+ className
2328
+ ),
2329
+ ...props,
2330
+ children: withHandle && /* @__PURE__ */ jsx49("div", { className: "z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border", children: /* @__PURE__ */ jsx49(GripVertical, { className: "size-2.5" }) })
2331
+ }
2332
+ );
2333
+
2334
+ // src/components/sidebar.tsx
2335
+ import * as React44 from "react";
2336
+ import { Slot as Slot5 } from "@radix-ui/react-slot";
2337
+ import { cva as cva13 } from "class-variance-authority";
2338
+ import { PanelLeft } from "lucide-react";
2339
+ import { jsx as jsx50, jsxs as jsxs25 } from "react/jsx-runtime";
2340
+ var SIDEBAR_COOKIE_NAME = "sidebar:state";
2341
+ var SIDEBAR_WIDTH = "16rem";
2342
+ var SIDEBAR_WIDTH_MOBILE = "18rem";
2343
+ var SIDEBAR_WIDTH_ICON = "3rem";
2344
+ var SIDEBAR_KEYBOARD_SHORTCUT = "b";
2345
+ var SidebarContext = React44.createContext(null);
2346
+ function useSidebar() {
2347
+ const context = React44.useContext(SidebarContext);
2348
+ if (!context) throw new Error("useSidebar must be used within a SidebarProvider.");
2349
+ return context;
2350
+ }
2351
+ function useIsMobile() {
2352
+ const [isMobile, setIsMobile] = React44.useState(false);
2353
+ React44.useEffect(() => {
2354
+ const mql = window.matchMedia("(max-width: 767px)");
2355
+ const onChange = () => setIsMobile(window.innerWidth < 768);
2356
+ mql.addEventListener("change", onChange);
2357
+ onChange();
2358
+ return () => mql.removeEventListener("change", onChange);
2359
+ }, []);
2360
+ return isMobile;
2361
+ }
2362
+ var SidebarProvider = React44.forwardRef(({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }, ref) => {
2363
+ const isMobile = useIsMobile();
2364
+ const [openMobile, setOpenMobile] = React44.useState(false);
2365
+ const [_open, _setOpen] = React44.useState(defaultOpen);
2366
+ const open = openProp ?? _open;
2367
+ const setOpen = React44.useCallback(
2368
+ (value) => {
2369
+ const openState = typeof value === "function" ? value(open) : value;
2370
+ if (setOpenProp) setOpenProp(openState);
2371
+ else _setOpen(openState);
2372
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${60 * 60 * 24 * 7}`;
2373
+ },
2374
+ [setOpenProp, open]
2375
+ );
2376
+ const toggleSidebar = React44.useCallback(() => {
2377
+ return isMobile ? setOpenMobile((o) => !o) : setOpen((o) => !o);
2378
+ }, [isMobile, setOpen]);
2379
+ React44.useEffect(() => {
2380
+ const handleKeyDown = (event) => {
2381
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
2382
+ event.preventDefault();
2383
+ toggleSidebar();
2384
+ }
2385
+ };
2386
+ window.addEventListener("keydown", handleKeyDown);
2387
+ return () => window.removeEventListener("keydown", handleKeyDown);
2388
+ }, [toggleSidebar]);
2389
+ const state = open ? "expanded" : "collapsed";
2390
+ const contextValue = React44.useMemo(
2391
+ () => ({ state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar }),
2392
+ [state, open, setOpen, isMobile, openMobile, toggleSidebar]
2393
+ );
2394
+ return /* @__PURE__ */ jsx50(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx50(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsx50(
2395
+ "div",
2396
+ {
2397
+ ref,
2398
+ style: { "--sidebar-width": SIDEBAR_WIDTH, "--sidebar-width-icon": SIDEBAR_WIDTH_ICON, ...style },
2399
+ className: cn("group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar font-sans", className),
2400
+ ...props,
2401
+ children
2402
+ }
2403
+ ) }) });
2404
+ });
2405
+ SidebarProvider.displayName = "SidebarProvider";
2406
+ var Sidebar = React44.forwardRef(({ side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props }, ref) => {
2407
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
2408
+ if (collapsible === "none") {
2409
+ return /* @__PURE__ */ jsx50("div", { ref, className: cn("flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground", className), ...props, children });
2410
+ }
2411
+ if (isMobile) {
2412
+ return /* @__PURE__ */ jsx50(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: /* @__PURE__ */ jsxs25(
2413
+ SheetContent,
2414
+ {
2415
+ "data-sidebar": "sidebar",
2416
+ "data-mobile": "true",
2417
+ className: "w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",
2418
+ style: { "--sidebar-width": SIDEBAR_WIDTH_MOBILE },
2419
+ side,
2420
+ children: [
2421
+ /* @__PURE__ */ jsxs25(SheetHeader, { className: "sr-only", children: [
2422
+ /* @__PURE__ */ jsx50(SheetTitle, { children: "Sidebar" }),
2423
+ /* @__PURE__ */ jsx50(SheetDescription, { children: "Displays the mobile sidebar." })
2424
+ ] }),
2425
+ /* @__PURE__ */ jsx50("div", { className: "flex h-full w-full flex-col", children })
2426
+ ]
2427
+ }
2428
+ ) });
2429
+ }
2430
+ return /* @__PURE__ */ jsxs25(
2431
+ "div",
2432
+ {
2433
+ ref,
2434
+ className: "group peer hidden text-sidebar-foreground md:block",
2435
+ "data-state": state,
2436
+ "data-collapsible": state === "collapsed" ? collapsible : "",
2437
+ "data-variant": variant,
2438
+ "data-side": side,
2439
+ children: [
2440
+ /* @__PURE__ */ jsx50(
2441
+ "div",
2442
+ {
2443
+ className: cn(
2444
+ "relative h-svh w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear",
2445
+ "group-data-[collapsible=offcanvas]:w-0",
2446
+ variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+theme(spacing.4))]" : "group-data-[collapsible=icon]:w-[--sidebar-width-icon]"
2447
+ )
2448
+ }
2449
+ ),
2450
+ /* @__PURE__ */ jsx50(
2451
+ "div",
2452
+ {
2453
+ className: cn(
2454
+ "fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex",
2455
+ 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)]",
2456
+ variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+theme(spacing.4)+2px)]" : "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l",
2457
+ className
2458
+ ),
2459
+ ...props,
2460
+ children: /* @__PURE__ */ jsx50(
2461
+ "div",
2462
+ {
2463
+ "data-sidebar": "sidebar",
2464
+ className: "flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow",
2465
+ children
2466
+ }
2467
+ )
2468
+ }
2469
+ )
2470
+ ]
2471
+ }
2472
+ );
2473
+ });
2474
+ Sidebar.displayName = "Sidebar";
2475
+ var SidebarTrigger = React44.forwardRef(
2476
+ ({ className, onClick, ...props }, ref) => {
2477
+ const { toggleSidebar } = useSidebar();
2478
+ return /* @__PURE__ */ jsxs25(
2479
+ Button,
2480
+ {
2481
+ ref,
2482
+ variant: "Ghost",
2483
+ size: "icon",
2484
+ className: cn("size-7", className),
2485
+ onClick: (e) => {
2486
+ onClick?.(e);
2487
+ toggleSidebar();
2488
+ },
2489
+ ...props,
2490
+ children: [
2491
+ /* @__PURE__ */ jsx50(PanelLeft, {}),
2492
+ /* @__PURE__ */ jsx50("span", { className: "sr-only", children: "Toggle Sidebar" })
2493
+ ]
2494
+ }
2495
+ );
2496
+ }
2497
+ );
2498
+ SidebarTrigger.displayName = "SidebarTrigger";
2499
+ var SidebarInset = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50(
2500
+ "main",
2501
+ {
2502
+ ref,
2503
+ className: cn(
2504
+ "relative flex min-h-svh flex-1 flex-col bg-background",
2505
+ "peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",
2506
+ className
2507
+ ),
2508
+ ...props
2509
+ }
2510
+ ));
2511
+ SidebarInset.displayName = "SidebarInset";
2512
+ var SidebarHeader = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50("div", { ref, "data-sidebar": "header", className: cn("flex flex-col gap-2 p-2", className), ...props }));
2513
+ SidebarHeader.displayName = "SidebarHeader";
2514
+ var SidebarFooter = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50("div", { ref, "data-sidebar": "footer", className: cn("flex flex-col gap-2 p-2", className), ...props }));
2515
+ SidebarFooter.displayName = "SidebarFooter";
2516
+ var SidebarSeparator = React44.forwardRef(
2517
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx50(Separator3, { ref, "data-sidebar": "separator", className: cn("mx-2 w-auto bg-sidebar-border", className), ...props })
2518
+ );
2519
+ SidebarSeparator.displayName = "SidebarSeparator";
2520
+ var SidebarContent = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50(
2521
+ "div",
2522
+ {
2523
+ ref,
2524
+ "data-sidebar": "content",
2525
+ className: cn("flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden", className),
2526
+ ...props
2527
+ }
2528
+ ));
2529
+ SidebarContent.displayName = "SidebarContent";
2530
+ var SidebarGroup = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50("div", { ref, "data-sidebar": "group", className: cn("relative flex w-full min-w-0 flex-col p-2", className), ...props }));
2531
+ SidebarGroup.displayName = "SidebarGroup";
2532
+ var SidebarGroupLabel = React44.forwardRef(({ className, asChild = false, ...props }, ref) => {
2533
+ const Comp = asChild ? Slot5 : "div";
2534
+ return /* @__PURE__ */ jsx50(
2535
+ Comp,
2536
+ {
2537
+ ref,
2538
+ "data-sidebar": "group-label",
2539
+ className: cn(
2540
+ "flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
2541
+ "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
2542
+ className
2543
+ ),
2544
+ ...props
2545
+ }
2546
+ );
2547
+ });
2548
+ SidebarGroupLabel.displayName = "SidebarGroupLabel";
2549
+ var SidebarGroupContent = React44.forwardRef(
2550
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx50("div", { ref, "data-sidebar": "group-content", className: cn("w-full text-sm", className), ...props })
2551
+ );
2552
+ SidebarGroupContent.displayName = "SidebarGroupContent";
2553
+ var SidebarMenu = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50("ul", { ref, "data-sidebar": "menu", className: cn("flex w-full min-w-0 flex-col gap-1", className), ...props }));
2554
+ SidebarMenu.displayName = "SidebarMenu";
2555
+ var SidebarMenuItem = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50("li", { ref, "data-sidebar": "menu-item", className: cn("group/menu-item relative", className), ...props }));
2556
+ SidebarMenuItem.displayName = "SidebarMenuItem";
2557
+ var sidebarMenuButtonVariants = cva13(
2558
+ "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none 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",
2559
+ {
2560
+ variants: {
2561
+ variant: {
2562
+ default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
2563
+ outline: "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]"
2564
+ },
2565
+ size: {
2566
+ default: "h-8 text-sm",
2567
+ sm: "h-7 text-xs",
2568
+ lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0"
2569
+ }
2570
+ },
2571
+ defaultVariants: { variant: "default", size: "default" }
2572
+ }
2573
+ );
2574
+ var SidebarMenuButton = React44.forwardRef(({ asChild = false, isActive = false, variant = "default", size = "default", tooltip, className, ...props }, ref) => {
2575
+ const Comp = asChild ? Slot5 : "button";
2576
+ const { isMobile, state } = useSidebar();
2577
+ const button = /* @__PURE__ */ jsx50(
2578
+ Comp,
2579
+ {
2580
+ ref,
2581
+ "data-sidebar": "menu-button",
2582
+ "data-size": size,
2583
+ "data-active": isActive,
2584
+ className: cn(sidebarMenuButtonVariants({ variant, size }), className),
2585
+ ...props
2586
+ }
2587
+ );
2588
+ if (!tooltip) return button;
2589
+ const tooltipProps = typeof tooltip === "string" ? { children: tooltip } : tooltip;
2590
+ return /* @__PURE__ */ jsxs25(Tooltip, { children: [
2591
+ /* @__PURE__ */ jsx50(TooltipTrigger, { asChild: true, children: button }),
2592
+ /* @__PURE__ */ jsx50(TooltipContent, { side: "right", align: "center", hidden: state !== "collapsed" || isMobile, ...tooltipProps })
2593
+ ] });
2594
+ });
2595
+ SidebarMenuButton.displayName = "SidebarMenuButton";
2596
+ var SidebarMenuSkeleton = React44.forwardRef(({ className, showIcon = false, ...props }, ref) => {
2597
+ const width = React44.useMemo(() => `${Math.floor(Math.random() * 40) + 50}%`, []);
2598
+ return /* @__PURE__ */ jsxs25("div", { ref, "data-sidebar": "menu-skeleton", className: cn("flex h-8 items-center gap-2 rounded-md px-2", className), ...props, children: [
2599
+ showIcon && /* @__PURE__ */ jsx50(Skeleton, { className: "size-4 rounded-md" }),
2600
+ /* @__PURE__ */ jsx50(Skeleton, { className: "h-4 max-w-[--skeleton-width] flex-1", style: { "--skeleton-width": width } })
2601
+ ] });
2602
+ });
2603
+ SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
2604
+ var SidebarInput = React44.forwardRef(
2605
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx50(Input, { ref, "data-sidebar": "input", className: cn("h-8 w-full bg-background shadow-none", className), ...props })
2606
+ );
2607
+ SidebarInput.displayName = "SidebarInput";
2608
+
2609
+ // src/components/audio-player.tsx
2610
+ import * as React45 from "react";
2611
+ import { Pause, Play, SkipBack, SkipForward } from "lucide-react";
2612
+ import { jsx as jsx51, jsxs as jsxs26 } from "react/jsx-runtime";
2613
+ function fmt(t) {
2614
+ if (!Number.isFinite(t)) return "0:00";
2615
+ const m = Math.floor(t / 60);
2616
+ const s = Math.floor(t % 60);
2617
+ return `${m}:${s.toString().padStart(2, "0")}`;
2618
+ }
2619
+ var AudioPlayer = React45.forwardRef(
2620
+ ({ src, variant = "full", title, artist, coverSrc, skipBy = 10, onPrev, onNext, className, ...props }, ref) => {
2621
+ const audioRef = React45.useRef(null);
2622
+ const [playing, setPlaying] = React45.useState(false);
2623
+ const [current, setCurrent] = React45.useState(0);
2624
+ const [duration, setDuration] = React45.useState(0);
2625
+ const toggle = () => {
2626
+ const a = audioRef.current;
2627
+ if (!a) return;
2628
+ if (a.paused) void a.play();
2629
+ else a.pause();
2630
+ };
2631
+ const seek = (t) => {
2632
+ const a = audioRef.current;
2633
+ if (a) a.currentTime = Math.max(0, Math.min(duration || 0, t));
2634
+ };
2635
+ const skip = (delta) => seek(current + delta);
2636
+ const audio = /* @__PURE__ */ jsx51(
2637
+ "audio",
2638
+ {
2639
+ ref: audioRef,
2640
+ src,
2641
+ preload: "metadata",
2642
+ onPlay: () => setPlaying(true),
2643
+ onPause: () => setPlaying(false),
2644
+ onTimeUpdate: (e) => setCurrent(e.currentTarget.currentTime),
2645
+ onLoadedMetadata: (e) => setDuration(e.currentTarget.duration),
2646
+ onEnded: () => setPlaying(false)
2647
+ }
2648
+ );
2649
+ const PlayPause = ({ size = 44 }) => /* @__PURE__ */ jsx51(
2650
+ "button",
2651
+ {
2652
+ type: "button",
2653
+ onClick: toggle,
2654
+ "aria-label": playing ? "Pause" : "Play",
2655
+ className: "grid shrink-0 place-items-center rounded-full bg-primary text-primary-foreground outline-none transition-transform hover:scale-105 focus-visible:shadow-focus",
2656
+ style: { width: size, height: size },
2657
+ children: playing ? /* @__PURE__ */ jsx51(Pause, { className: "size-1/3 fill-current" }) : /* @__PURE__ */ jsx51(Play, { className: "size-1/3 translate-x-px fill-current" })
2658
+ }
2659
+ );
2660
+ const iconBtn = "grid size-8 shrink-0 place-items-center rounded-full text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:text-foreground disabled:opacity-40 [&>svg]:size-4";
2661
+ if (variant === "mini") {
2662
+ const pct = duration ? current / duration * 100 : 0;
2663
+ return /* @__PURE__ */ jsxs26(
2664
+ "div",
2665
+ {
2666
+ ref,
2667
+ className: cn(
2668
+ "relative flex w-full max-w-[360px] items-center gap-3 overflow-hidden rounded-full border border-border bg-background p-2 pl-3 font-sans",
2669
+ className
2670
+ ),
2671
+ ...props,
2672
+ children: [
2673
+ audio,
2674
+ coverSrc ? /* @__PURE__ */ jsx51("img", { src: coverSrc, alt: "", className: "size-10 shrink-0 rounded-full object-cover" }) : /* @__PURE__ */ jsx51("div", { className: "size-10 shrink-0 rounded-full bg-muted" }),
2675
+ /* @__PURE__ */ jsxs26("div", { className: "min-w-0 flex-1", children: [
2676
+ /* @__PURE__ */ jsx51("p", { className: "truncate text-label-md font-semibold text-foreground", children: title ?? "Audio" }),
2677
+ artist && /* @__PURE__ */ jsx51("p", { className: "truncate text-body-sm text-muted-foreground", children: artist })
2678
+ ] }),
2679
+ /* @__PURE__ */ jsx51("button", { type: "button", onClick: () => skip(skipBy), "aria-label": `Forward ${skipBy}s`, className: iconBtn, children: /* @__PURE__ */ jsx51(SkipForward, {}) }),
2680
+ /* @__PURE__ */ jsx51(PlayPause, { size: 36 }),
2681
+ /* @__PURE__ */ jsx51("div", { className: "absolute inset-x-0 bottom-0 h-1 bg-muted", children: /* @__PURE__ */ jsx51("div", { className: "h-full bg-primary transition-[width]", style: { width: `${pct}%` } }) })
2682
+ ]
2683
+ }
2684
+ );
2685
+ }
2686
+ return /* @__PURE__ */ jsxs26(
2687
+ "div",
2688
+ {
2689
+ ref,
2690
+ className: cn("flex w-full max-w-[360px] flex-col gap-2 font-sans", className),
2691
+ ...props,
2692
+ children: [
2693
+ audio,
2694
+ /* @__PURE__ */ jsx51(
2695
+ Slider,
2696
+ {
2697
+ value: [current],
2698
+ max: duration || 1,
2699
+ step: 0.5,
2700
+ onValueChange: (vals) => seek(vals[0] ?? 0),
2701
+ "aria-label": "Seek"
2702
+ }
2703
+ ),
2704
+ /* @__PURE__ */ jsxs26("div", { className: "flex justify-between text-body-sm text-muted-foreground", children: [
2705
+ /* @__PURE__ */ jsx51("span", { children: fmt(current) }),
2706
+ /* @__PURE__ */ jsx51("span", { children: fmt(duration) })
2707
+ ] }),
2708
+ /* @__PURE__ */ jsxs26("div", { className: "mt-1 flex items-center justify-center gap-3", children: [
2709
+ /* @__PURE__ */ jsx51("button", { type: "button", onClick: onPrev, disabled: !onPrev, "aria-label": "Previous track", className: iconBtn, children: /* @__PURE__ */ jsx51(SkipBack, { className: "fill-current" }) }),
2710
+ /* @__PURE__ */ jsx51("button", { type: "button", onClick: () => skip(-skipBy), "aria-label": `Back ${skipBy}s`, className: iconBtn, children: /* @__PURE__ */ jsx51(SkipBack, {}) }),
2711
+ /* @__PURE__ */ jsx51(PlayPause, {}),
2712
+ /* @__PURE__ */ jsx51("button", { type: "button", onClick: () => skip(skipBy), "aria-label": `Forward ${skipBy}s`, className: iconBtn, children: /* @__PURE__ */ jsx51(SkipForward, {}) }),
2713
+ /* @__PURE__ */ jsx51("button", { type: "button", onClick: onNext, disabled: !onNext, "aria-label": "Next track", className: iconBtn, children: /* @__PURE__ */ jsx51(SkipForward, { className: "fill-current" }) })
2714
+ ] })
2715
+ ]
2716
+ }
2717
+ );
2718
+ }
2719
+ );
2720
+ AudioPlayer.displayName = "AudioPlayer";
2721
+
2722
+ // src/components/circular-progress.tsx
2723
+ import * as React46 from "react";
2724
+ import { jsx as jsx52, jsxs as jsxs27 } from "react/jsx-runtime";
2725
+ var CircularProgress = React46.forwardRef(
2726
+ ({ value = 0, size = 48, strokeWidth = 4, showValue = false, label, className, ...props }, ref) => {
2727
+ const v = Math.max(0, Math.min(100, value));
2728
+ const r = (size - strokeWidth) / 2;
2729
+ const c = 2 * Math.PI * r;
2730
+ return /* @__PURE__ */ jsxs27(
2731
+ "div",
2732
+ {
2733
+ ref,
2734
+ role: "progressbar",
2735
+ "aria-valuemin": 0,
2736
+ "aria-valuemax": 100,
2737
+ "aria-valuenow": v,
2738
+ className: cn("relative inline-grid place-items-center font-sans", className),
2739
+ style: { width: size, height: size },
2740
+ ...props,
2741
+ children: [
2742
+ /* @__PURE__ */ jsxs27("svg", { width: size, height: size, className: "-rotate-90", "aria-hidden": true, children: [
2743
+ /* @__PURE__ */ jsx52(
2744
+ "circle",
2745
+ {
2746
+ cx: size / 2,
2747
+ cy: size / 2,
2748
+ r,
2749
+ fill: "none",
2750
+ strokeWidth,
2751
+ className: "stroke-muted"
2752
+ }
2753
+ ),
2754
+ /* @__PURE__ */ jsx52(
2755
+ "circle",
2756
+ {
2757
+ cx: size / 2,
2758
+ cy: size / 2,
2759
+ r,
2760
+ fill: "none",
2761
+ strokeWidth,
2762
+ strokeLinecap: "round",
2763
+ strokeDasharray: c,
2764
+ strokeDashoffset: c - v / 100 * c,
2765
+ className: "stroke-primary transition-[stroke-dashoffset] duration-300"
2766
+ }
2767
+ )
2768
+ ] }),
2769
+ (showValue || label != null) && /* @__PURE__ */ jsx52("span", { className: "absolute text-label-md text-foreground", children: label ?? `${Math.round(v)}%` })
2770
+ ]
2771
+ }
2772
+ );
2773
+ }
2774
+ );
2775
+ CircularProgress.displayName = "CircularProgress";
2776
+
2777
+ // src/components/image.tsx
2778
+ import * as React47 from "react";
2779
+ import { ImageOff } from "lucide-react";
2780
+ import { jsx as jsx53 } from "react/jsx-runtime";
2781
+ var RATIOS = {
2782
+ "1:1": 1,
2783
+ "3:2": 3 / 2,
2784
+ "4:3": 4 / 3,
2785
+ "3:4": 3 / 4,
2786
+ "3:1": 3,
2787
+ "16:9": 16 / 9
2788
+ };
2789
+ var Image2 = React47.forwardRef(
2790
+ ({ ratio = "1:1", rounded = true, fallback, className, alt = "", onLoad, onError, ...props }, forwardedRef) => {
2791
+ const [status, setStatus] = React47.useState("loading");
2792
+ const innerRef = React47.useRef(null);
2793
+ const setRef = React47.useCallback(
2794
+ (node) => {
2795
+ innerRef.current = node;
2796
+ if (typeof forwardedRef === "function") forwardedRef(node);
2797
+ else if (forwardedRef) forwardedRef.current = node;
2798
+ },
2799
+ [forwardedRef]
2800
+ );
2801
+ const r = typeof ratio === "number" ? ratio : RATIOS[ratio] ?? 1;
2802
+ React47.useEffect(() => {
2803
+ const img = innerRef.current;
2804
+ if (!img) return;
2805
+ if (img.complete) setStatus(img.naturalWidth > 0 ? "loaded" : "error");
2806
+ }, [props.src]);
2807
+ return /* @__PURE__ */ jsx53(
2808
+ "div",
2809
+ {
2810
+ className: cn(
2811
+ "relative w-full overflow-hidden bg-muted",
2812
+ rounded && "rounded-md",
2813
+ className
2814
+ ),
2815
+ style: { aspectRatio: r },
2816
+ children: status === "error" ? /* @__PURE__ */ jsx53("div", { className: "absolute inset-0 grid place-items-center text-muted-foreground", children: fallback ?? /* @__PURE__ */ jsx53(ImageOff, { className: "size-6" }) }) : /* @__PURE__ */ jsx53(
2817
+ "img",
2818
+ {
2819
+ ref: setRef,
2820
+ alt,
2821
+ className: cn(
2822
+ "size-full object-cover transition-opacity duration-300",
2823
+ status === "loaded" ? "opacity-100" : "opacity-0"
2824
+ ),
2825
+ onLoad: (e) => {
2826
+ setStatus("loaded");
2827
+ onLoad?.(e);
2828
+ },
2829
+ onError: (e) => {
2830
+ setStatus("error");
2831
+ onError?.(e);
2832
+ },
2833
+ ...props
2834
+ }
2835
+ )
2836
+ }
2837
+ );
2838
+ }
2839
+ );
2840
+ Image2.displayName = "Image";
2841
+
2842
+ // src/components/inform.tsx
2843
+ import * as React48 from "react";
2844
+ import { cva as cva14 } from "class-variance-authority";
2845
+ import { CircleAlert as CircleAlert2, CircleCheck as CircleCheck2, Info as Info2, TriangleAlert as TriangleAlert2, X as X5 } from "lucide-react";
2846
+ import { jsx as jsx54, jsxs as jsxs28 } from "react/jsx-runtime";
2847
+ var informVariants = cva14(
2848
+ "flex items-start gap-2.5 rounded-md p-3 text-body-sm font-sans [&>svg]:mt-0.5 [&>svg]:size-4 [&>svg]:shrink-0",
2849
+ {
2850
+ variants: {
2851
+ variant: {
2852
+ information: "bg-info/10 text-info",
2853
+ warning: "bg-warning/15 text-warning",
2854
+ success: "bg-success/15 text-success",
2855
+ error: "bg-destructive/10 text-destructive",
2856
+ action: "bg-foreground text-background"
2857
+ }
2858
+ },
2859
+ defaultVariants: { variant: "information" }
2860
+ }
2861
+ );
2862
+ var ICON = {
2863
+ information: Info2,
2864
+ warning: TriangleAlert2,
2865
+ success: CircleCheck2,
2866
+ error: CircleAlert2,
2867
+ action: Info2
2868
+ };
2869
+ var Inform = React48.forwardRef(
2870
+ ({ className, variant = "information", hideIcon, onDismiss, action, children, ...props }, ref) => {
2871
+ const Icon2 = ICON[variant ?? "information"];
2872
+ return /* @__PURE__ */ jsxs28("div", { ref, role: "status", className: cn(informVariants({ variant }), className), ...props, children: [
2873
+ !hideIcon && /* @__PURE__ */ jsx54(Icon2, {}),
2874
+ /* @__PURE__ */ jsxs28("div", { className: "min-w-0 flex-1", children: [
2875
+ /* @__PURE__ */ jsx54("p", { className: "[&:not(:only-child)]:mb-2", children }),
2876
+ action && /* @__PURE__ */ jsxs28(
2877
+ "button",
2878
+ {
2879
+ type: "button",
2880
+ onClick: action.onClick,
2881
+ className: "inline-flex items-center gap-1.5 text-label-md font-medium underline-offset-2 outline-none hover:underline focus-visible:underline [&>svg]:size-4",
2882
+ children: [
2883
+ action.icon,
2884
+ action.label
2885
+ ]
2886
+ }
2887
+ )
2888
+ ] }),
2889
+ onDismiss && /* @__PURE__ */ jsx54(
2890
+ "button",
2891
+ {
2892
+ type: "button",
2893
+ onClick: onDismiss,
2894
+ "aria-label": "Dismiss",
2895
+ className: "-m-0.5 shrink-0 rounded-[2px] p-0.5 opacity-70 outline-none transition-opacity hover:opacity-100 focus-visible:opacity-100 focus-visible:ring-1 focus-visible:ring-current",
2896
+ children: /* @__PURE__ */ jsx54(X5, { className: "size-3.5" })
2897
+ }
2898
+ )
2899
+ ] });
2900
+ }
2901
+ );
2902
+ Inform.displayName = "Inform";
2903
+
2904
+ // src/components/rating.tsx
2905
+ import * as React49 from "react";
2906
+ import { Star } from "lucide-react";
2907
+ import { cva as cva15 } from "class-variance-authority";
2908
+ import { jsx as jsx55 } from "react/jsx-runtime";
2909
+ var starVariants = cva15("transition-colors", {
2910
+ variants: {
2911
+ size: {
2912
+ sm: "size-4",
2913
+ md: "size-5",
2914
+ lg: "size-6"
2915
+ }
2916
+ },
2917
+ defaultVariants: { size: "md" }
2918
+ });
2919
+ var Rating = React49.forwardRef(
2920
+ ({ className, value, defaultValue = 0, max = 5, size, readOnly = false, onChange, ...props }, ref) => {
2921
+ const [internal, setInternal] = React49.useState(defaultValue);
2922
+ const [hovered, setHovered] = React49.useState(null);
2923
+ const current = value ?? internal;
2924
+ const display = hovered ?? current;
2925
+ const set = (n) => {
2926
+ if (readOnly) return;
2927
+ setInternal(n);
2928
+ onChange?.(n);
2929
+ };
2930
+ return /* @__PURE__ */ jsx55(
2931
+ "div",
2932
+ {
2933
+ ref,
2934
+ role: readOnly ? "img" : "radiogroup",
2935
+ "aria-label": readOnly ? `Rated ${current} out of ${max}` : "Rating",
2936
+ className: cn("inline-flex items-center gap-0.5", className),
2937
+ onMouseLeave: () => setHovered(null),
2938
+ ...props,
2939
+ children: Array.from({ length: max }, (_, i) => {
2940
+ const n = i + 1;
2941
+ const filled = n <= display;
2942
+ return /* @__PURE__ */ jsx55(
2943
+ "button",
2944
+ {
2945
+ type: "button",
2946
+ disabled: readOnly,
2947
+ "aria-label": `${n} star${n > 1 ? "s" : ""}`,
2948
+ "aria-pressed": n <= current,
2949
+ onMouseEnter: () => !readOnly && setHovered(n),
2950
+ onClick: () => set(n),
2951
+ className: cn(
2952
+ "rounded-[2px] outline-none disabled:cursor-default",
2953
+ !readOnly && "cursor-pointer focus-visible:ring-2 focus-visible:ring-ring"
2954
+ ),
2955
+ children: /* @__PURE__ */ jsx55(
2956
+ Star,
2957
+ {
2958
+ className: cn(
2959
+ starVariants({ size }),
2960
+ filled ? "fill-warning text-warning" : "fill-transparent text-muted-foreground"
2961
+ )
2962
+ }
2963
+ )
2964
+ },
2965
+ n
2966
+ );
2967
+ })
2968
+ }
2969
+ );
2970
+ }
2971
+ );
2972
+ Rating.displayName = "Rating";
2973
+
2974
+ // src/components/spinner.tsx
2975
+ import * as React50 from "react";
2976
+ import { cva as cva16 } from "class-variance-authority";
2977
+ import { jsx as jsx56 } from "react/jsx-runtime";
2978
+ var spinnerVariants = cva16("inline-block animate-spin rounded-full border-2 border-current border-t-transparent", {
2979
+ variants: {
2980
+ size: {
2981
+ sm: "size-4",
2982
+ md: "size-6",
2983
+ lg: "size-8"
2984
+ },
2985
+ variant: {
2986
+ default: "text-primary",
2987
+ muted: "text-muted-foreground",
2988
+ onColor: "text-primary-foreground"
2989
+ }
2990
+ },
2991
+ defaultVariants: { size: "md", variant: "default" }
2992
+ });
2993
+ var Spinner = React50.forwardRef(
2994
+ ({ className, size, variant, label = "Loading\u2026", ...props }, ref) => /* @__PURE__ */ jsx56("span", { ref, role: "status", "aria-label": label, className: cn(spinnerVariants({ size, variant }), className), ...props, children: /* @__PURE__ */ jsx56("span", { className: "sr-only", children: label }) })
2995
+ );
2996
+ Spinner.displayName = "Spinner";
2997
+
2998
+ // src/components/list.tsx
2999
+ import * as React51 from "react";
3000
+ import { jsx as jsx57, jsxs as jsxs29 } from "react/jsx-runtime";
3001
+ var List3 = React51.forwardRef(
3002
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx57("div", { ref, role: "list", className: cn("flex flex-col divide-y divide-border", className), ...props })
3003
+ );
3004
+ List3.displayName = "List";
3005
+ var ListItem = React51.forwardRef(
3006
+ ({ className, leading, title, description, trailing, disabled, onSelect, ...props }, ref) => {
3007
+ const interactive = !!onSelect && !disabled;
3008
+ return /* @__PURE__ */ jsxs29(
3009
+ "div",
3010
+ {
3011
+ ref,
3012
+ role: interactive ? "button" : "listitem",
3013
+ tabIndex: interactive ? 0 : void 0,
3014
+ "aria-disabled": disabled,
3015
+ onClick: disabled ? void 0 : onSelect,
3016
+ onKeyDown: interactive ? (e) => {
3017
+ if (e.key === "Enter" || e.key === " ") {
3018
+ e.preventDefault();
3019
+ onSelect?.();
3020
+ }
3021
+ } : void 0,
3022
+ className: cn(
3023
+ "flex items-center gap-3 px-3 py-3 font-sans outline-none",
3024
+ interactive && "cursor-pointer hover:bg-accent focus-visible:bg-accent",
3025
+ disabled && "pointer-events-none opacity-50",
3026
+ className
3027
+ ),
3028
+ ...props,
3029
+ children: [
3030
+ leading && /* @__PURE__ */ jsx57("div", { className: "flex shrink-0 items-center justify-center", children: leading }),
3031
+ /* @__PURE__ */ jsxs29("div", { className: "min-w-0 flex-1", children: [
3032
+ /* @__PURE__ */ jsx57("div", { className: "truncate text-body-md text-foreground", children: title }),
3033
+ description && /* @__PURE__ */ jsx57("div", { className: "truncate text-body-sm text-muted-foreground", children: description })
3034
+ ] }),
3035
+ trailing && /* @__PURE__ */ jsx57("div", { className: "flex shrink-0 items-center gap-2", children: trailing })
3036
+ ]
3037
+ }
3038
+ );
3039
+ }
3040
+ );
3041
+ ListItem.displayName = "ListItem";
3042
+
3043
+ // src/components/stepper.tsx
3044
+ import * as React52 from "react";
3045
+ import { Check as Check6 } from "lucide-react";
3046
+ import { jsx as jsx58, jsxs as jsxs30 } from "react/jsx-runtime";
3047
+ var Stepper = React52.forwardRef(
3048
+ ({ className, steps, current, orientation = "horizontal", ...props }, ref) => {
3049
+ const vertical = orientation === "vertical";
3050
+ return /* @__PURE__ */ jsx58("ol", { ref, className: cn("flex font-sans", vertical ? "flex-col" : "w-full items-start", className), ...props, children: steps.map((step, i) => {
3051
+ const status = i < current ? "complete" : i === current ? "current" : "upcoming";
3052
+ const isLast = i === steps.length - 1;
3053
+ return /* @__PURE__ */ jsxs30(
3054
+ "li",
3055
+ {
3056
+ className: cn("flex", vertical ? "flex-row gap-3" : "flex-1 flex-col items-center gap-2 text-center"),
3057
+ "aria-current": status === "current" ? "step" : void 0,
3058
+ children: [
3059
+ /* @__PURE__ */ jsxs30("div", { className: cn("flex items-center", vertical ? "flex-col" : "w-full"), children: [
3060
+ /* @__PURE__ */ jsx58(
3061
+ "span",
3062
+ {
3063
+ className: cn(
3064
+ "flex size-7 shrink-0 items-center justify-center rounded-full text-label-md font-medium",
3065
+ status === "complete" && "bg-primary text-primary-foreground",
3066
+ status === "current" && "border-2 border-primary text-primary",
3067
+ status === "upcoming" && "border border-input text-muted-foreground"
3068
+ ),
3069
+ children: status === "complete" ? /* @__PURE__ */ jsx58(Check6, { className: "size-4" }) : i + 1
3070
+ }
3071
+ ),
3072
+ !isLast && /* @__PURE__ */ jsx58(
3073
+ "span",
3074
+ {
3075
+ "aria-hidden": true,
3076
+ className: cn(
3077
+ "bg-border",
3078
+ vertical ? "my-1 min-h-6 w-px flex-1 self-stretch" : "mt-3.5 h-px flex-1",
3079
+ status === "complete" && "bg-primary"
3080
+ )
3081
+ }
3082
+ )
3083
+ ] }),
3084
+ /* @__PURE__ */ jsxs30("div", { className: cn(vertical && "pb-6"), children: [
3085
+ /* @__PURE__ */ jsx58("p", { className: cn("text-label-md font-medium", status === "upcoming" ? "text-muted-foreground" : "text-foreground"), children: step.label }),
3086
+ step.description && /* @__PURE__ */ jsx58("p", { className: "text-body-sm text-muted-foreground", children: step.description })
3087
+ ] })
3088
+ ]
3089
+ },
3090
+ i
3091
+ );
3092
+ }) });
3093
+ }
3094
+ );
3095
+ Stepper.displayName = "Stepper";
3096
+
3097
+ // src/components/fab.tsx
3098
+ import * as React53 from "react";
3099
+ import { Slot as Slot6 } from "@radix-ui/react-slot";
3100
+ import { cva as cva17 } from "class-variance-authority";
3101
+ import { jsx as jsx59 } from "react/jsx-runtime";
3102
+ var fabVariants = cva17(
3103
+ [
3104
+ "inline-flex shrink-0 items-center justify-center gap-2 rounded-full font-sans font-medium",
3105
+ "shadow-lg outline-none transition-colors",
3106
+ "focus-visible:shadow-focus disabled:pointer-events-none disabled:opacity-50",
3107
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0"
3108
+ ],
3109
+ {
3110
+ variants: {
3111
+ variant: {
3112
+ Primary: "bg-primary text-primary-foreground hover:bg-[--color-blue-600] active:bg-[--color-blue-700]",
3113
+ Secondary: "bg-secondary text-secondary-foreground hover:bg-[--color-green-500] hover:text-[--color-green-50] active:bg-[--color-green-600] active:text-[--color-green-50]"
3114
+ },
3115
+ size: {
3116
+ default: "size-14 [&_svg]:size-6",
3117
+ sm: "size-11 [&_svg]:size-5"
3118
+ },
3119
+ extended: {
3120
+ true: "w-auto px-5",
3121
+ false: ""
3122
+ }
3123
+ },
3124
+ defaultVariants: { variant: "Primary", size: "default", extended: false }
3125
+ }
3126
+ );
3127
+ var Fab = React53.forwardRef(
3128
+ ({ className, variant, size, extended, asChild = false, ...props }, ref) => {
3129
+ const Comp = asChild ? Slot6 : "button";
3130
+ return /* @__PURE__ */ jsx59(
3131
+ Comp,
3132
+ {
3133
+ ref,
3134
+ "data-slot": "fab",
3135
+ className: cn(fabVariants({ variant, size, extended }), className),
3136
+ ...props
3137
+ }
3138
+ );
3139
+ }
3140
+ );
3141
+ Fab.displayName = "Fab";
3142
+
3143
+ // src/components/tab-bar.tsx
3144
+ import * as React54 from "react";
3145
+ import { jsx as jsx60, jsxs as jsxs31 } from "react/jsx-runtime";
3146
+ var TabBar = React54.forwardRef(
3147
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx60(
3148
+ "nav",
3149
+ {
3150
+ ref,
3151
+ className: cn("flex w-full items-stretch border-t border-border bg-background font-sans", className),
3152
+ ...props,
3153
+ children
3154
+ }
3155
+ )
3156
+ );
3157
+ TabBar.displayName = "TabBar";
3158
+ var TabBarItem = React54.forwardRef(
3159
+ ({ className, icon, label, active, badge, ...props }, ref) => /* @__PURE__ */ jsxs31(
3160
+ "button",
3161
+ {
3162
+ ref,
3163
+ type: "button",
3164
+ "aria-current": active ? "page" : void 0,
3165
+ className: cn(
3166
+ "relative flex flex-1 flex-col items-center justify-center gap-1 py-2 text-label-sm outline-none transition-colors",
3167
+ active ? "text-primary" : "text-muted-foreground hover:text-foreground",
3168
+ "focus-visible:bg-accent",
3169
+ className
3170
+ ),
3171
+ ...props,
3172
+ children: [
3173
+ /* @__PURE__ */ jsxs31("span", { className: "relative [&_svg]:size-6", children: [
3174
+ icon,
3175
+ badge && /* @__PURE__ */ jsx60("span", { className: "absolute -right-1.5 -top-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-destructive px-1 text-[10px] font-medium text-destructive-foreground", children: badge })
3176
+ ] }),
3177
+ /* @__PURE__ */ jsx60("span", { className: "font-medium", children: label })
3178
+ ]
3179
+ }
3180
+ )
3181
+ );
3182
+ TabBarItem.displayName = "TabBarItem";
3183
+
3184
+ // src/components/navigation-bar.tsx
3185
+ import * as React55 from "react";
3186
+ import { ChevronLeft as ChevronLeft3 } from "lucide-react";
3187
+ import { jsx as jsx61, jsxs as jsxs32 } from "react/jsx-runtime";
3188
+ var NavigationBar = React55.forwardRef(
3189
+ ({ className, title, infoText, onBack, leading, actions, ...props }, ref) => /* @__PURE__ */ jsxs32(
3190
+ "header",
3191
+ {
3192
+ ref,
3193
+ className: cn("flex h-14 w-full items-center gap-2 border-b border-border bg-background px-2 font-sans", className),
3194
+ ...props,
3195
+ children: [
3196
+ /* @__PURE__ */ jsx61("div", { className: "flex min-w-9 shrink-0 items-center", children: leading ?? (onBack && /* @__PURE__ */ jsx61(
3197
+ "button",
3198
+ {
3199
+ type: "button",
3200
+ onClick: onBack,
3201
+ "aria-label": "Back",
3202
+ className: "flex size-9 items-center justify-center rounded-full text-foreground outline-none transition-colors hover:bg-accent focus-visible:bg-accent",
3203
+ children: /* @__PURE__ */ jsx61(ChevronLeft3, { className: "size-5" })
3204
+ }
3205
+ )) }),
3206
+ /* @__PURE__ */ jsxs32("div", { className: "min-w-0 flex-1", children: [
3207
+ /* @__PURE__ */ jsx61("p", { className: "truncate text-body-lg font-medium text-foreground", children: title }),
3208
+ infoText && /* @__PURE__ */ jsx61("p", { className: "truncate text-body-sm text-muted-foreground", children: infoText })
3209
+ ] }),
3210
+ actions && /* @__PURE__ */ jsx61("div", { className: "flex shrink-0 items-center gap-1", children: actions })
3211
+ ]
3212
+ }
3213
+ )
3214
+ );
3215
+ NavigationBar.displayName = "NavigationBar";
3216
+
3217
+ // src/components/file-upload.tsx
3218
+ import * as React56 from "react";
3219
+ import { File, Loader2, TriangleAlert as TriangleAlert3, Upload, X as X6 } from "lucide-react";
3220
+ import { jsx as jsx62, jsxs as jsxs33 } from "react/jsx-runtime";
3221
+ function formatBytes(bytes) {
3222
+ if (!bytes) return "";
3223
+ const units = ["B", "KB", "MB", "GB"];
3224
+ let v = bytes;
3225
+ let i = 0;
3226
+ while (v >= 1024 && i < units.length - 1) {
3227
+ v /= 1024;
3228
+ i++;
3229
+ }
3230
+ return `${v.toFixed(v < 10 && i > 0 ? 1 : 0)} ${units[i]}`;
3231
+ }
3232
+ var FileUpload = React56.forwardRef(
3233
+ ({ className, multiple, accept, disabled, helperText, buttonLabel = "Browse files", files = [], onFilesSelected, onRemove, onRetry, ...props }, ref) => {
3234
+ const inputRef = React56.useRef(null);
3235
+ const [dragging, setDragging] = React56.useState(false);
3236
+ const pick = (list) => {
3237
+ if (!list || !list.length) return;
3238
+ onFilesSelected?.(Array.from(list));
3239
+ };
3240
+ return /* @__PURE__ */ jsxs33("div", { ref, className: cn("flex w-full flex-col gap-3 font-sans", className), ...props, children: [
3241
+ /* @__PURE__ */ jsxs33(
3242
+ "div",
3243
+ {
3244
+ role: "button",
3245
+ tabIndex: disabled ? -1 : 0,
3246
+ "aria-disabled": disabled,
3247
+ onClick: () => !disabled && inputRef.current?.click(),
3248
+ onKeyDown: (e) => {
3249
+ if (!disabled && (e.key === "Enter" || e.key === " ")) {
3250
+ e.preventDefault();
3251
+ inputRef.current?.click();
3252
+ }
3253
+ },
3254
+ onDragOver: (e) => {
3255
+ e.preventDefault();
3256
+ if (!disabled) setDragging(true);
3257
+ },
3258
+ onDragLeave: () => setDragging(false),
3259
+ onDrop: (e) => {
3260
+ e.preventDefault();
3261
+ setDragging(false);
3262
+ if (!disabled) pick(e.dataTransfer.files);
3263
+ },
3264
+ className: cn(
3265
+ "flex flex-col items-center gap-2 rounded-md border border-dashed border-input p-6 text-center outline-none transition-colors",
3266
+ !disabled && "cursor-pointer hover:bg-accent/50 focus-visible:shadow-focus",
3267
+ dragging && "border-primary bg-accent",
3268
+ disabled && "pointer-events-none opacity-50"
3269
+ ),
3270
+ children: [
3271
+ /* @__PURE__ */ jsx62(Upload, { className: "size-6 text-muted-foreground", "aria-hidden": true }),
3272
+ /* @__PURE__ */ jsxs33("p", { className: "text-body-sm text-muted-foreground", children: [
3273
+ "Drag & drop ",
3274
+ multiple ? "files" : "a file",
3275
+ " here, or"
3276
+ ] }),
3277
+ /* @__PURE__ */ jsx62(
3278
+ Button,
3279
+ {
3280
+ type: "button",
3281
+ variant: "Outline",
3282
+ size: "sm",
3283
+ disabled,
3284
+ onClick: (e) => {
3285
+ e.stopPropagation();
3286
+ inputRef.current?.click();
3287
+ },
3288
+ children: buttonLabel
3289
+ }
3290
+ ),
3291
+ helperText && /* @__PURE__ */ jsx62("p", { className: "text-body-sm text-muted-foreground", children: helperText }),
3292
+ /* @__PURE__ */ jsx62(
3293
+ "input",
3294
+ {
3295
+ ref: inputRef,
3296
+ type: "file",
3297
+ multiple,
3298
+ accept,
3299
+ disabled,
3300
+ className: "sr-only",
3301
+ onChange: (e) => {
3302
+ pick(e.target.files);
3303
+ e.target.value = "";
3304
+ }
3305
+ }
3306
+ )
3307
+ ]
3308
+ }
3309
+ ),
3310
+ files.length > 0 && /* @__PURE__ */ jsx62("ul", { className: "flex flex-col gap-2", children: files.map((f) => /* @__PURE__ */ jsx62(FileUploadItem, { file: f, onRemove, onRetry }, f.id)) })
3311
+ ] });
3312
+ }
3313
+ );
3314
+ FileUpload.displayName = "FileUpload";
3315
+ function FileUploadItem({ file, onRemove, onRetry }) {
3316
+ const isError = file.status === "error";
3317
+ const isLoading = file.status === "loading";
3318
+ return /* @__PURE__ */ jsxs33("li", { className: cn("flex items-center gap-2.5 rounded-md border p-2.5 text-body-sm", isError ? "border-destructive bg-destructive/5" : "border-input"), children: [
3319
+ isLoading ? /* @__PURE__ */ jsx62(Loader2, { className: "size-4 shrink-0 animate-spin text-muted-foreground", "aria-hidden": true }) : isError ? /* @__PURE__ */ jsx62(TriangleAlert3, { className: "size-4 shrink-0 text-destructive", "aria-hidden": true }) : /* @__PURE__ */ jsx62(File, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": true }),
3320
+ /* @__PURE__ */ jsxs33("div", { className: "min-w-0 flex-1", children: [
3321
+ /* @__PURE__ */ jsx62("p", { className: "truncate text-foreground", children: file.name }),
3322
+ isError && file.error ? /* @__PURE__ */ jsx62("p", { className: "text-destructive", children: file.error }) : /* @__PURE__ */ jsx62("p", { className: "text-muted-foreground", children: formatBytes(file.size) }),
3323
+ isLoading && typeof file.progress === "number" && /* @__PURE__ */ jsx62("div", { className: "mt-1 h-1 w-full overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsx62("div", { className: "h-full bg-primary transition-[width]", style: { width: `${Math.max(0, Math.min(100, file.progress))}%` } }) })
3324
+ ] }),
3325
+ isError && onRetry && /* @__PURE__ */ jsx62(
3326
+ "button",
3327
+ {
3328
+ type: "button",
3329
+ onClick: () => onRetry(file.id),
3330
+ className: "shrink-0 text-label-md font-medium text-primary underline-offset-2 outline-none hover:underline focus-visible:underline",
3331
+ children: "Retry"
3332
+ }
3333
+ ),
3334
+ onRemove && /* @__PURE__ */ jsx62(
3335
+ "button",
3336
+ {
3337
+ type: "button",
3338
+ onClick: () => onRemove(file.id),
3339
+ "aria-label": `Remove ${file.name}`,
3340
+ className: "shrink-0 rounded-[2px] p-0.5 text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-1 focus-visible:ring-current",
3341
+ children: /* @__PURE__ */ jsx62(X6, { className: "size-3.5" })
3342
+ }
3343
+ )
3344
+ ] });
3345
+ }
3346
+ FileUploadItem.displayName = "FileUploadItem";
3347
+
3348
+ // src/components/date-picker.tsx
3349
+ import * as React57 from "react";
3350
+ import { CalendarIcon } from "lucide-react";
3351
+ import { format } from "date-fns";
3352
+ import { jsx as jsx63, jsxs as jsxs34 } from "react/jsx-runtime";
3353
+ var DatePicker = React57.forwardRef(
3354
+ ({ value, onChange, placeholder = "Select date", label, helperText, error, disabled, className, formatStr = "PP", calendarProps }, ref) => {
3355
+ const [open, setOpen] = React57.useState(false);
3356
+ return /* @__PURE__ */ jsxs34("div", { className: cn("flex flex-col gap-1.5 font-sans", className), children: [
3357
+ label && /* @__PURE__ */ jsx63("label", { className: "text-label-md font-medium text-foreground", children: label }),
3358
+ /* @__PURE__ */ jsxs34(Popover, { open, onOpenChange: setOpen, children: [
3359
+ /* @__PURE__ */ jsx63(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs34(
3360
+ Button,
3361
+ {
3362
+ ref,
3363
+ type: "button",
3364
+ variant: "Outline",
3365
+ disabled,
3366
+ className: cn("w-full justify-start px-3 font-normal", !value && "text-muted-foreground", error && "border-destructive text-destructive"),
3367
+ children: [
3368
+ /* @__PURE__ */ jsx63(CalendarIcon, { className: "size-4" }),
3369
+ value ? format(value, formatStr) : placeholder
3370
+ ]
3371
+ }
3372
+ ) }),
3373
+ /* @__PURE__ */ jsx63(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsx63(
3374
+ Calendar,
3375
+ {
3376
+ mode: "single",
3377
+ selected: value,
3378
+ onSelect: (d) => {
3379
+ onChange?.(d);
3380
+ setOpen(false);
3381
+ },
3382
+ ...calendarProps
3383
+ }
3384
+ ) })
3385
+ ] }),
3386
+ helperText && /* @__PURE__ */ jsx63("p", { className: cn("text-body-sm", error ? "text-destructive" : "text-muted-foreground"), children: helperText })
3387
+ ] });
3388
+ }
3389
+ );
3390
+ DatePicker.displayName = "DatePicker";
3391
+
3392
+ // src/components/code-block.tsx
3393
+ import * as React58 from "react";
3394
+ import { Check as Check7, Copy } from "lucide-react";
3395
+ import { jsx as jsx64, jsxs as jsxs35 } from "react/jsx-runtime";
3396
+ var CodeBlock = React58.forwardRef(
3397
+ ({ className, code, language, filename, files, hideCopy, ...props }, ref) => {
3398
+ const tabs = files && files.length > 0 ? files : [{ name: filename ?? language ?? "", code: code ?? "" }];
3399
+ const [active, setActive] = React58.useState(0);
3400
+ const [copied, setCopied] = React58.useState(false);
3401
+ const current = tabs[active] ?? tabs[0];
3402
+ const hasHeader = tabs.length > 1 || !!current.name;
3403
+ const copy = async () => {
3404
+ try {
3405
+ await navigator.clipboard.writeText(current.code);
3406
+ setCopied(true);
3407
+ window.setTimeout(() => setCopied(false), 1500);
3408
+ } catch {
3409
+ }
3410
+ };
3411
+ return /* @__PURE__ */ jsxs35("div", { ref, className: cn("overflow-hidden rounded-md border border-input bg-muted font-sans", className), ...props, children: [
3412
+ hasHeader && /* @__PURE__ */ jsxs35("div", { className: "flex items-center justify-between border-b border-input bg-background px-2", children: [
3413
+ /* @__PURE__ */ jsx64("div", { className: "flex", children: tabs.map((t, i) => /* @__PURE__ */ jsx64(
3414
+ "button",
3415
+ {
3416
+ type: "button",
3417
+ onClick: () => setActive(i),
3418
+ className: cn(
3419
+ "border-b-2 px-3 py-2 text-body-sm transition-colors outline-none",
3420
+ i === active ? "border-primary text-foreground" : "border-transparent text-muted-foreground hover:text-foreground"
3421
+ ),
3422
+ children: t.name || "code"
3423
+ },
3424
+ t.name || i
3425
+ )) }),
3426
+ !hideCopy && /* @__PURE__ */ jsx64(
3427
+ "button",
3428
+ {
3429
+ type: "button",
3430
+ onClick: copy,
3431
+ "aria-label": "Copy code",
3432
+ className: "rounded-[2px] p-1.5 text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-1 focus-visible:ring-current",
3433
+ children: copied ? /* @__PURE__ */ jsx64(Check7, { className: "size-4" }) : /* @__PURE__ */ jsx64(Copy, { className: "size-4" })
3434
+ }
3435
+ )
3436
+ ] }),
3437
+ /* @__PURE__ */ jsxs35("div", { className: "relative", children: [
3438
+ !hasHeader && !hideCopy && /* @__PURE__ */ jsx64(
3439
+ "button",
3440
+ {
3441
+ type: "button",
3442
+ onClick: copy,
3443
+ "aria-label": "Copy code",
3444
+ className: "absolute right-2 top-2 rounded-[2px] p-1.5 text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-1 focus-visible:ring-current",
3445
+ children: copied ? /* @__PURE__ */ jsx64(Check7, { className: "size-4" }) : /* @__PURE__ */ jsx64(Copy, { className: "size-4" })
3446
+ }
3447
+ ),
3448
+ /* @__PURE__ */ jsx64("pre", { className: "overflow-x-auto p-4 text-body-sm text-foreground", children: /* @__PURE__ */ jsx64("code", { children: current.code }) })
3449
+ ] })
3450
+ ] });
3451
+ }
3452
+ );
3453
+ CodeBlock.displayName = "CodeBlock";
3454
+
3455
+ // src/components/metric.tsx
3456
+ import * as React59 from "react";
3457
+ import { ArrowDown, ArrowUp } from "lucide-react";
3458
+ import { jsx as jsx65, jsxs as jsxs36 } from "react/jsx-runtime";
3459
+ var Metric = React59.forwardRef(
3460
+ ({ className, label, value, trend, change, icon, chart, ...props }, ref) => /* @__PURE__ */ jsxs36("div", { ref, className: cn("flex flex-col gap-2 rounded-md border border-input p-4 font-sans", className), ...props, children: [
3461
+ /* @__PURE__ */ jsxs36("div", { className: "flex items-center justify-between", children: [
3462
+ /* @__PURE__ */ jsx65("p", { className: "text-body-sm text-muted-foreground", children: label }),
3463
+ icon && /* @__PURE__ */ jsx65("span", { className: "text-muted-foreground [&_svg]:size-5", children: icon })
3464
+ ] }),
3465
+ /* @__PURE__ */ jsxs36("div", { className: "flex items-end justify-between gap-2", children: [
3466
+ /* @__PURE__ */ jsx65("p", { className: "text-headline-sm font-medium text-foreground", children: value }),
3467
+ trend && /* @__PURE__ */ jsxs36(
3468
+ "span",
3469
+ {
3470
+ className: cn(
3471
+ "inline-flex items-center gap-0.5 text-label-md font-medium",
3472
+ trend === "up" && "text-success",
3473
+ trend === "down" && "text-destructive",
3474
+ trend === "neutral" && "text-muted-foreground"
3475
+ ),
3476
+ children: [
3477
+ trend === "up" && /* @__PURE__ */ jsx65(ArrowUp, { className: "size-3.5" }),
3478
+ trend === "down" && /* @__PURE__ */ jsx65(ArrowDown, { className: "size-3.5" }),
3479
+ change
3480
+ ]
3481
+ }
3482
+ )
3483
+ ] }),
3484
+ chart && /* @__PURE__ */ jsx65("div", { className: "mt-1", children: chart })
3485
+ ] })
3486
+ );
3487
+ Metric.displayName = "Metric";
3488
+
3489
+ // src/components/number-input.tsx
3490
+ import * as React60 from "react";
3491
+ import { Minus as Minus3, Plus } from "lucide-react";
3492
+ import { jsx as jsx66, jsxs as jsxs37 } from "react/jsx-runtime";
3493
+ var NumberInput = React60.forwardRef(
3494
+ ({ className, value, defaultValue = 0, min, max, step = 1, onChange, disabled, ...props }, ref) => {
3495
+ const [internal, setInternal] = React60.useState(defaultValue);
3496
+ const current = value ?? internal;
3497
+ const clamp = (n) => {
3498
+ let v = n;
3499
+ if (min != null) v = Math.max(min, v);
3500
+ if (max != null) v = Math.min(max, v);
3501
+ return v;
3502
+ };
3503
+ const set = (n) => {
3504
+ const v = clamp(n);
3505
+ setInternal(v);
3506
+ onChange?.(v);
3507
+ };
3508
+ return /* @__PURE__ */ jsxs37(
3509
+ "div",
3510
+ {
3511
+ className: cn(
3512
+ "flex h-10 items-stretch overflow-hidden rounded-md border border-input font-sans focus-within:shadow-focus",
3513
+ disabled && "pointer-events-none opacity-50",
3514
+ className
3515
+ ),
3516
+ children: [
3517
+ /* @__PURE__ */ jsx66(
3518
+ "button",
3519
+ {
3520
+ type: "button",
3521
+ "aria-label": "Decrease",
3522
+ disabled: disabled || min != null && current <= min,
3523
+ onClick: () => set(current - step),
3524
+ className: "flex w-9 shrink-0 items-center justify-center text-muted-foreground outline-none transition-colors hover:bg-accent hover:text-foreground disabled:pointer-events-none disabled:opacity-50",
3525
+ children: /* @__PURE__ */ jsx66(Minus3, { className: "size-4" })
3526
+ }
3527
+ ),
3528
+ /* @__PURE__ */ jsx66(
3529
+ "input",
3530
+ {
3531
+ ref,
3532
+ type: "number",
3533
+ inputMode: "numeric",
3534
+ value: current,
3535
+ min,
3536
+ max,
3537
+ step,
3538
+ disabled,
3539
+ onChange: (e) => {
3540
+ const n = e.target.valueAsNumber;
3541
+ if (!Number.isNaN(n)) set(n);
3542
+ },
3543
+ className: "w-full min-w-0 flex-1 border-x border-input bg-transparent px-2 text-center text-body-md text-foreground outline-none [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none",
3544
+ ...props
3545
+ }
3546
+ ),
3547
+ /* @__PURE__ */ jsx66(
3548
+ "button",
3549
+ {
3550
+ type: "button",
3551
+ "aria-label": "Increase",
3552
+ disabled: disabled || max != null && current >= max,
3553
+ onClick: () => set(current + step),
3554
+ className: "flex w-9 shrink-0 items-center justify-center text-muted-foreground outline-none transition-colors hover:bg-accent hover:text-foreground disabled:pointer-events-none disabled:opacity-50",
3555
+ children: /* @__PURE__ */ jsx66(Plus, { className: "size-4" })
3556
+ }
3557
+ )
3558
+ ]
3559
+ }
3560
+ );
3561
+ }
3562
+ );
3563
+ NumberInput.displayName = "NumberInput";
3564
+
3565
+ // src/components/quote.tsx
3566
+ import * as React61 from "react";
3567
+ import { jsx as jsx67, jsxs as jsxs38 } from "react/jsx-runtime";
3568
+ var Quote = React61.forwardRef(
3569
+ ({ className, author, authorTitle, avatar, children, ...props }, ref) => /* @__PURE__ */ jsxs38("figure", { ref, className: cn("flex flex-col gap-4 font-sans", className), ...props, children: [
3570
+ /* @__PURE__ */ jsxs38("blockquote", { className: "text-title-md font-medium text-foreground", children: [
3571
+ "\u201C",
3572
+ children,
3573
+ "\u201D"
3574
+ ] }),
3575
+ (author || authorTitle) && /* @__PURE__ */ jsxs38("figcaption", { className: "flex items-center gap-3", children: [
3576
+ avatar,
3577
+ /* @__PURE__ */ jsxs38("div", { children: [
3578
+ author && /* @__PURE__ */ jsx67("p", { className: "text-body-md font-medium text-foreground", children: author }),
3579
+ authorTitle && /* @__PURE__ */ jsx67("p", { className: "text-body-sm text-muted-foreground", children: authorTitle })
3580
+ ] })
3581
+ ] })
3582
+ ] })
3583
+ );
3584
+ Quote.displayName = "Quote";
3585
+
3586
+ // src/components/footer.tsx
3587
+ import * as React62 from "react";
3588
+ import { jsx as jsx68, jsxs as jsxs39 } from "react/jsx-runtime";
3589
+ var Footer = React62.forwardRef(
3590
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx68("footer", { ref, className: cn("w-full border-t border-border bg-background px-6 py-10 font-sans", className), ...props, children })
3591
+ );
3592
+ Footer.displayName = "Footer";
3593
+ var FooterColumn = React62.forwardRef(
3594
+ ({ className, title, children, ...props }, ref) => /* @__PURE__ */ jsxs39("div", { ref, className: cn("flex flex-col gap-3", className), ...props, children: [
3595
+ /* @__PURE__ */ jsx68("p", { className: "text-label-md font-medium text-foreground", children: title }),
3596
+ /* @__PURE__ */ jsx68("div", { className: "flex flex-col gap-2", children })
3597
+ ] })
3598
+ );
3599
+ FooterColumn.displayName = "FooterColumn";
3600
+ var FooterLink = React62.forwardRef(
3601
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx68(
3602
+ "a",
3603
+ {
3604
+ ref,
3605
+ className: cn(
3606
+ "text-body-sm text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:text-foreground",
3607
+ className
3608
+ ),
3609
+ ...props
3610
+ }
3611
+ )
3612
+ );
3613
+ FooterLink.displayName = "FooterLink";
3614
+ var FooterBottom = React62.forwardRef(
3615
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx68(
3616
+ "div",
3617
+ {
3618
+ ref,
3619
+ className: cn(
3620
+ "mt-8 flex flex-wrap items-center justify-between gap-3 border-t border-border pt-6 text-body-sm text-muted-foreground",
3621
+ className
3622
+ ),
3623
+ ...props
3624
+ }
3625
+ )
3626
+ );
3627
+ FooterBottom.displayName = "FooterBottom";
3628
+
3629
+ // src/components/table-of-contents.tsx
3630
+ import * as React63 from "react";
3631
+ import { jsx as jsx69 } from "react/jsx-runtime";
3632
+ var TableOfContents = React63.forwardRef(
3633
+ ({ className, items, active, ...props }, ref) => /* @__PURE__ */ jsx69("nav", { ref, "aria-label": "Table of contents", className: cn("flex flex-col gap-0.5 font-sans", className), ...props, children: items.map((item) => {
3634
+ const isActive = item.id === active;
3635
+ return /* @__PURE__ */ jsx69(
3636
+ "a",
3637
+ {
3638
+ href: `#${item.id}`,
3639
+ "aria-current": isActive ? "location" : void 0,
3640
+ style: { paddingInlineStart: `${((item.level ?? 1) - 1) * 12 + 12}px` },
3641
+ className: cn(
3642
+ "-ms-px border-s py-1.5 text-body-sm outline-none transition-colors",
3643
+ isActive ? "border-primary font-medium text-primary" : "border-transparent text-muted-foreground hover:text-foreground"
3644
+ ),
3645
+ children: item.label
3646
+ },
3647
+ item.id
3648
+ );
3649
+ }) })
3650
+ );
3651
+ TableOfContents.displayName = "TableOfContents";
3652
+ export {
3653
+ Accordion,
3654
+ AccordionContent,
3655
+ AccordionItem,
3656
+ AccordionTrigger,
3657
+ Alert,
3658
+ AlertDescription,
3659
+ AlertDialog,
3660
+ AlertDialogAction,
3661
+ AlertDialogCancel,
3662
+ AlertDialogContent,
3663
+ AlertDialogDescription,
3664
+ AlertDialogFooter,
3665
+ AlertDialogHeader,
3666
+ AlertDialogOverlay,
3667
+ AlertDialogPortal,
3668
+ AlertDialogTitle,
3669
+ AlertDialogTrigger,
3670
+ AlertTitle,
3671
+ AspectRatio,
3672
+ AudioPlayer,
3673
+ Avatar,
3674
+ AvatarFallback,
3675
+ AvatarGroup,
3676
+ AvatarImage,
3677
+ Badge,
3678
+ Breadcrumb,
3679
+ BreadcrumbEllipsis,
3680
+ BreadcrumbItem,
3681
+ BreadcrumbLink,
3682
+ BreadcrumbList,
3683
+ BreadcrumbPage,
3684
+ BreadcrumbSeparator,
3685
+ Button,
3686
+ Calendar,
3687
+ Card,
3688
+ CardContent,
3689
+ CardDescription,
3690
+ CardFooter,
3691
+ CardHeader,
3692
+ CardTitle,
3693
+ Carousel,
3694
+ CarouselContent,
3695
+ CarouselItem,
3696
+ CarouselNext,
3697
+ CarouselPrevious,
3698
+ ChartContainer,
3699
+ ChartLegend,
3700
+ ChartLegendContent,
3701
+ ChartStyle,
3702
+ ChartTooltip,
3703
+ ChartTooltipContent,
3704
+ Checkbox,
3705
+ CircularProgress,
3706
+ CodeBlock,
3707
+ Collapsible,
3708
+ CollapsibleContent2 as CollapsibleContent,
3709
+ CollapsibleTrigger2 as CollapsibleTrigger,
3710
+ Command,
3711
+ CommandDialog,
3712
+ CommandEmpty,
3713
+ CommandGroup,
3714
+ CommandInput,
3715
+ CommandItem,
3716
+ CommandList,
3717
+ CommandSeparator,
3718
+ CommandShortcut,
3719
+ ContextMenu,
3720
+ ContextMenuCheckboxItem,
3721
+ ContextMenuContent,
3722
+ ContextMenuGroup,
3723
+ ContextMenuItem,
3724
+ ContextMenuLabel,
3725
+ ContextMenuPortal,
3726
+ ContextMenuRadioGroup,
3727
+ ContextMenuRadioItem,
3728
+ ContextMenuSeparator,
3729
+ ContextMenuShortcut,
3730
+ ContextMenuSub,
3731
+ ContextMenuSubContent,
3732
+ ContextMenuSubTrigger,
3733
+ ContextMenuTrigger,
3734
+ DataTable,
3735
+ DatePicker,
3736
+ Dialog,
3737
+ DialogClose,
3738
+ DialogContent,
3739
+ DialogDescription,
3740
+ DialogFooter,
3741
+ DialogHeader,
3742
+ DialogOverlay,
3743
+ DialogPortal,
3744
+ DialogTitle,
3745
+ DialogTrigger,
3746
+ Drawer,
3747
+ DrawerClose,
3748
+ DrawerContent,
3749
+ DrawerDescription,
3750
+ DrawerFooter,
3751
+ DrawerHeader,
3752
+ DrawerOverlay,
3753
+ DrawerPortal,
3754
+ DrawerTitle,
3755
+ DrawerTrigger,
3756
+ DropdownMenu,
3757
+ DropdownMenuCheckboxItem,
3758
+ DropdownMenuContent,
3759
+ DropdownMenuGroup,
3760
+ DropdownMenuItem,
3761
+ DropdownMenuLabel,
3762
+ DropdownMenuPortal,
3763
+ DropdownMenuRadioGroup,
3764
+ DropdownMenuRadioItem,
3765
+ DropdownMenuSeparator,
3766
+ DropdownMenuShortcut,
3767
+ DropdownMenuSub,
3768
+ DropdownMenuSubContent,
3769
+ DropdownMenuSubTrigger,
3770
+ DropdownMenuTrigger,
3771
+ Fab,
3772
+ Field,
3773
+ FieldControl,
3774
+ FieldDescription,
3775
+ FieldLabel,
3776
+ FieldMessage,
3777
+ FileUpload,
3778
+ FileUploadItem,
3779
+ Footer,
3780
+ FooterBottom,
3781
+ FooterColumn,
3782
+ FooterLink,
3783
+ Form,
3784
+ FormControl,
3785
+ FormDescription,
3786
+ FormField,
3787
+ FormItem,
3788
+ FormLabel,
3789
+ FormMessage,
3790
+ HoverCard,
3791
+ HoverCardContent,
3792
+ HoverCardTrigger,
3793
+ Image2 as Image,
3794
+ Inform,
3795
+ Input,
3796
+ InputGroup,
3797
+ InputGroupAddon,
3798
+ InputGroupButton,
3799
+ InputGroupInput,
3800
+ InputGroupText,
3801
+ InputOTP,
3802
+ InputOTPGroup,
3803
+ InputOTPSeparator,
3804
+ InputOTPSlot,
3805
+ Label2 as Label,
3806
+ List3 as List,
3807
+ ListItem,
3808
+ Menubar,
3809
+ MenubarCheckboxItem,
3810
+ MenubarContent,
3811
+ MenubarGroup,
3812
+ MenubarItem,
3813
+ MenubarLabel,
3814
+ MenubarMenu,
3815
+ MenubarPortal,
3816
+ MenubarRadioGroup,
3817
+ MenubarRadioItem,
3818
+ MenubarSeparator,
3819
+ MenubarShortcut,
3820
+ MenubarSub,
3821
+ MenubarSubContent,
3822
+ MenubarSubTrigger,
3823
+ MenubarTrigger,
3824
+ Metric,
3825
+ Modal,
3826
+ NavigationBar,
3827
+ NavigationMenu,
3828
+ NavigationMenuContent,
3829
+ NavigationMenuIndicator,
3830
+ NavigationMenuItem,
3831
+ NavigationMenuLink,
3832
+ NavigationMenuList,
3833
+ NavigationMenuTrigger,
3834
+ NavigationMenuViewport,
3835
+ NumberInput,
3836
+ Pagination,
3837
+ PaginationContent,
3838
+ PaginationEllipsis,
3839
+ PaginationItem,
3840
+ PaginationLink,
3841
+ PaginationNext,
3842
+ PaginationPrevious,
3843
+ PasswordInput,
3844
+ Popover,
3845
+ PopoverAnchor,
3846
+ PopoverContent,
3847
+ PopoverTrigger,
3848
+ Progress,
3849
+ Quote,
3850
+ RadioGroup2 as RadioGroup,
3851
+ RadioGroupItem,
3852
+ Rating,
3853
+ ResizableHandle,
3854
+ ResizablePanel,
3855
+ ResizablePanelGroup,
3856
+ ScrollArea,
3857
+ ScrollBar,
3858
+ Select,
3859
+ SelectContent,
3860
+ SelectGroup,
3861
+ SelectItem,
3862
+ SelectLabel,
3863
+ SelectSeparator,
3864
+ SelectTrigger,
3865
+ SelectValue,
3866
+ Separator3 as Separator,
3867
+ Sheet,
3868
+ SheetClose,
3869
+ SheetContent,
3870
+ SheetDescription,
3871
+ SheetFooter,
3872
+ SheetHeader,
3873
+ SheetOverlay,
3874
+ SheetPortal,
3875
+ SheetTitle,
3876
+ SheetTrigger,
3877
+ Sidebar,
3878
+ SidebarContent,
3879
+ SidebarFooter,
3880
+ SidebarGroup,
3881
+ SidebarGroupContent,
3882
+ SidebarGroupLabel,
3883
+ SidebarHeader,
3884
+ SidebarInput,
3885
+ SidebarInset,
3886
+ SidebarMenu,
3887
+ SidebarMenuButton,
3888
+ SidebarMenuItem,
3889
+ SidebarMenuSkeleton,
3890
+ SidebarProvider,
3891
+ SidebarSeparator,
3892
+ SidebarTrigger,
3893
+ Skeleton,
3894
+ Slider,
3895
+ Spinner,
3896
+ Stepper,
3897
+ Switch,
3898
+ TabBar,
3899
+ TabBarItem,
3900
+ Table,
3901
+ TableBody,
3902
+ TableCaption,
3903
+ TableCell,
3904
+ TableFooter,
3905
+ TableHead,
3906
+ TableHeader,
3907
+ TableOfContents,
3908
+ TableRow,
3909
+ Tabs,
3910
+ TabsContent,
3911
+ TabsList,
3912
+ TabsTrigger,
3913
+ Tag,
3914
+ Textarea,
3915
+ Toaster,
3916
+ Toggle,
3917
+ ToggleGroup,
3918
+ ToggleGroupItem,
3919
+ Tooltip,
3920
+ TooltipContent,
3921
+ TooltipProvider,
3922
+ TooltipTrigger,
3923
+ badgeVariants,
3924
+ buttonVariants,
3925
+ cn,
3926
+ fabVariants,
3927
+ formatBytes,
3928
+ informVariants,
3929
+ inputVariants,
3930
+ messageVariants,
3931
+ navigationMenuTriggerStyle,
3932
+ spinnerVariants,
3933
+ tagVariants,
3934
+ textareaVariants,
3935
+ toast,
3936
+ toggleVariants,
3937
+ useFormField,
3938
+ useSidebar
3939
+ };