@greatapps/greatauth-ui 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ui.js ADDED
@@ -0,0 +1,2161 @@
1
+ // src/lib/utils.ts
2
+ import { clsx } from "clsx";
3
+ import { twMerge } from "tailwind-merge";
4
+ function cn(...inputs) {
5
+ return twMerge(clsx(inputs));
6
+ }
7
+
8
+ // src/components/ui/button.tsx
9
+ import { cva } from "class-variance-authority";
10
+ import { Slot } from "radix-ui";
11
+ import { jsx } from "react/jsx-runtime";
12
+ var buttonVariants = cva(
13
+ "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-md border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-3 aria-invalid:ring-3 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none",
14
+ {
15
+ variants: {
16
+ variant: {
17
+ default: "bg-primary text-primary-foreground hover:bg-primary/80",
18
+ outline: "border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground shadow-xs",
19
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
20
+ ghost: "hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground",
21
+ destructive: "bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30",
22
+ link: "text-primary underline-offset-4 hover:underline"
23
+ },
24
+ size: {
25
+ default: "h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
26
+ xs: "h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
27
+ sm: "h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",
28
+ lg: "h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3",
29
+ icon: "size-9",
30
+ "icon-xs": "size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3",
31
+ "icon-sm": "size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md",
32
+ "icon-lg": "size-10"
33
+ }
34
+ },
35
+ defaultVariants: {
36
+ variant: "default",
37
+ size: "default"
38
+ }
39
+ }
40
+ );
41
+ function Button({
42
+ className,
43
+ variant = "default",
44
+ size = "default",
45
+ asChild = false,
46
+ ...props
47
+ }) {
48
+ const Comp = asChild ? Slot.Root : "button";
49
+ return /* @__PURE__ */ jsx(
50
+ Comp,
51
+ {
52
+ "data-slot": "button",
53
+ "data-variant": variant,
54
+ "data-size": size,
55
+ className: cn(buttonVariants({ variant, size, className })),
56
+ ...props
57
+ }
58
+ );
59
+ }
60
+
61
+ // src/components/ui/dialog.tsx
62
+ import { Dialog as DialogPrimitive } from "radix-ui";
63
+ import { X } from "lucide-react";
64
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
65
+ function Dialog({
66
+ ...props
67
+ }) {
68
+ return /* @__PURE__ */ jsx2(DialogPrimitive.Root, { "data-slot": "dialog", ...props });
69
+ }
70
+ function DialogTrigger({
71
+ ...props
72
+ }) {
73
+ return /* @__PURE__ */ jsx2(DialogPrimitive.Trigger, { "data-slot": "dialog-trigger", ...props });
74
+ }
75
+ function DialogPortal({
76
+ ...props
77
+ }) {
78
+ return /* @__PURE__ */ jsx2(DialogPrimitive.Portal, { "data-slot": "dialog-portal", ...props });
79
+ }
80
+ function DialogClose({
81
+ ...props
82
+ }) {
83
+ return /* @__PURE__ */ jsx2(DialogPrimitive.Close, { "data-slot": "dialog-close", ...props });
84
+ }
85
+ function DialogOverlay({
86
+ className,
87
+ ...props
88
+ }) {
89
+ return /* @__PURE__ */ jsx2(
90
+ DialogPrimitive.Overlay,
91
+ {
92
+ "data-slot": "dialog-overlay",
93
+ className: cn("data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 isolate z-50", className),
94
+ ...props
95
+ }
96
+ );
97
+ }
98
+ function DialogContent({
99
+ className,
100
+ children,
101
+ showCloseButton = true,
102
+ ...props
103
+ }) {
104
+ return /* @__PURE__ */ jsxs(DialogPortal, { children: [
105
+ /* @__PURE__ */ jsx2(DialogOverlay, {}),
106
+ /* @__PURE__ */ jsxs(
107
+ DialogPrimitive.Content,
108
+ {
109
+ "data-slot": "dialog-content",
110
+ className: cn(
111
+ "bg-background data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 ring-foreground/10 grid max-w-[calc(100%-2rem)] gap-6 rounded-xl p-6 text-sm ring-1 duration-100 sm:max-w-md fixed top-1/2 left-1/2 z-50 w-full -translate-x-1/2 -translate-y-1/2 outline-none",
112
+ className
113
+ ),
114
+ ...props,
115
+ children: [
116
+ children,
117
+ showCloseButton && /* @__PURE__ */ jsx2(DialogPrimitive.Close, { "data-slot": "dialog-close", asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "ghost", className: "absolute top-4 right-4", size: "icon-sm", children: [
118
+ /* @__PURE__ */ jsx2(X, {}),
119
+ /* @__PURE__ */ jsx2("span", { className: "sr-only", children: "Close" })
120
+ ] }) })
121
+ ]
122
+ }
123
+ )
124
+ ] });
125
+ }
126
+ function DialogHeader({ className, ...props }) {
127
+ return /* @__PURE__ */ jsx2(
128
+ "div",
129
+ {
130
+ "data-slot": "dialog-header",
131
+ className: cn("gap-2 flex flex-col", className),
132
+ ...props
133
+ }
134
+ );
135
+ }
136
+ function DialogFooter({
137
+ className,
138
+ children,
139
+ ...props
140
+ }) {
141
+ return /* @__PURE__ */ jsx2(
142
+ "div",
143
+ {
144
+ "data-slot": "dialog-footer",
145
+ className: cn(
146
+ "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
147
+ className
148
+ ),
149
+ ...props,
150
+ children
151
+ }
152
+ );
153
+ }
154
+ function DialogTitle({
155
+ className,
156
+ ...props
157
+ }) {
158
+ return /* @__PURE__ */ jsx2(
159
+ DialogPrimitive.Title,
160
+ {
161
+ "data-slot": "dialog-title",
162
+ className: cn("leading-none font-medium", className),
163
+ ...props
164
+ }
165
+ );
166
+ }
167
+ function DialogDescription({
168
+ className,
169
+ ...props
170
+ }) {
171
+ return /* @__PURE__ */ jsx2(
172
+ DialogPrimitive.Description,
173
+ {
174
+ "data-slot": "dialog-description",
175
+ className: cn("text-muted-foreground *:[a]:hover:text-foreground text-sm *:[a]:underline *:[a]:underline-offset-3", className),
176
+ ...props
177
+ }
178
+ );
179
+ }
180
+
181
+ // src/components/ui/alert-dialog.tsx
182
+ import { AlertDialog as AlertDialogPrimitive } from "radix-ui";
183
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
184
+ function AlertDialog({
185
+ ...props
186
+ }) {
187
+ return /* @__PURE__ */ jsx3(AlertDialogPrimitive.Root, { "data-slot": "alert-dialog", ...props });
188
+ }
189
+ function AlertDialogTrigger({
190
+ ...props
191
+ }) {
192
+ return /* @__PURE__ */ jsx3(AlertDialogPrimitive.Trigger, { "data-slot": "alert-dialog-trigger", ...props });
193
+ }
194
+ function AlertDialogPortal({
195
+ ...props
196
+ }) {
197
+ return /* @__PURE__ */ jsx3(AlertDialogPrimitive.Portal, { "data-slot": "alert-dialog-portal", ...props });
198
+ }
199
+ function AlertDialogOverlay({
200
+ className,
201
+ ...props
202
+ }) {
203
+ return /* @__PURE__ */ jsx3(
204
+ AlertDialogPrimitive.Overlay,
205
+ {
206
+ "data-slot": "alert-dialog-overlay",
207
+ className: cn("data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 z-50", className),
208
+ ...props
209
+ }
210
+ );
211
+ }
212
+ function AlertDialogContent({
213
+ className,
214
+ size = "default",
215
+ ...props
216
+ }) {
217
+ return /* @__PURE__ */ jsxs2(AlertDialogPortal, { children: [
218
+ /* @__PURE__ */ jsx3(AlertDialogOverlay, {}),
219
+ /* @__PURE__ */ jsx3(
220
+ AlertDialogPrimitive.Content,
221
+ {
222
+ "data-slot": "alert-dialog-content",
223
+ "data-size": size,
224
+ className: cn(
225
+ "data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 bg-background ring-foreground/10 gap-6 rounded-xl p-6 ring-1 duration-100 data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 outline-none",
226
+ className
227
+ ),
228
+ ...props
229
+ }
230
+ )
231
+ ] });
232
+ }
233
+ function AlertDialogHeader({
234
+ className,
235
+ ...props
236
+ }) {
237
+ return /* @__PURE__ */ jsx3(
238
+ "div",
239
+ {
240
+ "data-slot": "alert-dialog-header",
241
+ className: cn("grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]", className),
242
+ ...props
243
+ }
244
+ );
245
+ }
246
+ function AlertDialogFooter({
247
+ className,
248
+ ...props
249
+ }) {
250
+ return /* @__PURE__ */ jsx3(
251
+ "div",
252
+ {
253
+ "data-slot": "alert-dialog-footer",
254
+ className: cn(
255
+ "flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end",
256
+ className
257
+ ),
258
+ ...props
259
+ }
260
+ );
261
+ }
262
+ function AlertDialogTitle({
263
+ className,
264
+ ...props
265
+ }) {
266
+ return /* @__PURE__ */ jsx3(
267
+ AlertDialogPrimitive.Title,
268
+ {
269
+ "data-slot": "alert-dialog-title",
270
+ className: cn("text-lg font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2", className),
271
+ ...props
272
+ }
273
+ );
274
+ }
275
+ function AlertDialogDescription({
276
+ className,
277
+ ...props
278
+ }) {
279
+ return /* @__PURE__ */ jsx3(
280
+ AlertDialogPrimitive.Description,
281
+ {
282
+ "data-slot": "alert-dialog-description",
283
+ className: cn("text-muted-foreground *:[a]:hover:text-foreground text-sm text-balance md:text-pretty *:[a]:underline *:[a]:underline-offset-3", className),
284
+ ...props
285
+ }
286
+ );
287
+ }
288
+ function AlertDialogAction({
289
+ className,
290
+ variant = "default",
291
+ size = "default",
292
+ ...props
293
+ }) {
294
+ return /* @__PURE__ */ jsx3(Button, { variant, size, asChild: true, children: /* @__PURE__ */ jsx3(
295
+ AlertDialogPrimitive.Action,
296
+ {
297
+ "data-slot": "alert-dialog-action",
298
+ className: cn(className),
299
+ ...props
300
+ }
301
+ ) });
302
+ }
303
+ function AlertDialogCancel({
304
+ className,
305
+ variant = "outline",
306
+ size = "default",
307
+ ...props
308
+ }) {
309
+ return /* @__PURE__ */ jsx3(Button, { variant, size, asChild: true, children: /* @__PURE__ */ jsx3(
310
+ AlertDialogPrimitive.Cancel,
311
+ {
312
+ "data-slot": "alert-dialog-cancel",
313
+ className: cn(className),
314
+ ...props
315
+ }
316
+ ) });
317
+ }
318
+
319
+ // src/components/ui/select.tsx
320
+ import { Select as SelectPrimitive } from "radix-ui";
321
+ import { ChevronsUpDown, Check, ChevronUp, ChevronDown } from "lucide-react";
322
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
323
+ function Select({
324
+ ...props
325
+ }) {
326
+ return /* @__PURE__ */ jsx4(SelectPrimitive.Root, { "data-slot": "select", ...props });
327
+ }
328
+ function SelectGroup({
329
+ className,
330
+ ...props
331
+ }) {
332
+ return /* @__PURE__ */ jsx4(
333
+ SelectPrimitive.Group,
334
+ {
335
+ "data-slot": "select-group",
336
+ className: cn("scroll-my-1 p-1", className),
337
+ ...props
338
+ }
339
+ );
340
+ }
341
+ function SelectValue({
342
+ ...props
343
+ }) {
344
+ return /* @__PURE__ */ jsx4(SelectPrimitive.Value, { "data-slot": "select-value", ...props });
345
+ }
346
+ function SelectTrigger({
347
+ className,
348
+ size = "default",
349
+ children,
350
+ ...props
351
+ }) {
352
+ return /* @__PURE__ */ jsxs3(
353
+ SelectPrimitive.Trigger,
354
+ {
355
+ "data-slot": "select-trigger",
356
+ "data-size": size,
357
+ className: cn(
358
+ "border-input data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 gap-1.5 rounded-md border bg-transparent py-2 pr-2 pl-2.5 text-sm shadow-xs transition-[color,box-shadow] focus-visible:ring-3 aria-invalid:ring-3 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:gap-1.5 [&_svg:not([class*='size-'])]:size-4 flex w-fit items-center justify-between whitespace-nowrap outline-none disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
359
+ className
360
+ ),
361
+ ...props,
362
+ children: [
363
+ children,
364
+ /* @__PURE__ */ jsx4(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx4(ChevronsUpDown, { className: "text-muted-foreground size-4 pointer-events-none" }) })
365
+ ]
366
+ }
367
+ );
368
+ }
369
+ function SelectContent({
370
+ className,
371
+ children,
372
+ position = "item-aligned",
373
+ align = "center",
374
+ ...props
375
+ }) {
376
+ return /* @__PURE__ */ jsx4(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs3(
377
+ SelectPrimitive.Content,
378
+ {
379
+ "data-slot": "select-content",
380
+ "data-align-trigger": position === "item-aligned",
381
+ className: cn("bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 min-w-36 rounded-md shadow-md ring-1 duration-100 relative z-50 max-h-(--radix-select-content-available-height) origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto data-[align-trigger=true]:animate-none", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className),
382
+ position,
383
+ align,
384
+ ...props,
385
+ children: [
386
+ /* @__PURE__ */ jsx4(SelectScrollUpButton, {}),
387
+ /* @__PURE__ */ jsx4(
388
+ SelectPrimitive.Viewport,
389
+ {
390
+ "data-position": position,
391
+ className: cn(
392
+ "data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)",
393
+ position === "popper" && ""
394
+ ),
395
+ children
396
+ }
397
+ ),
398
+ /* @__PURE__ */ jsx4(SelectScrollDownButton, {})
399
+ ]
400
+ }
401
+ ) });
402
+ }
403
+ function SelectLabel({
404
+ className,
405
+ ...props
406
+ }) {
407
+ return /* @__PURE__ */ jsx4(
408
+ SelectPrimitive.Label,
409
+ {
410
+ "data-slot": "select-label",
411
+ className: cn("text-muted-foreground px-2 py-1.5 text-xs", className),
412
+ ...props
413
+ }
414
+ );
415
+ }
416
+ function SelectItem({
417
+ className,
418
+ children,
419
+ ...props
420
+ }) {
421
+ return /* @__PURE__ */ jsxs3(
422
+ SelectPrimitive.Item,
423
+ {
424
+ "data-slot": "select-item",
425
+ className: cn(
426
+ "focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 relative flex w-full cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
427
+ className
428
+ ),
429
+ ...props,
430
+ children: [
431
+ /* @__PURE__ */ jsx4("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx4(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx4(Check, { className: "pointer-events-none" }) }) }),
432
+ /* @__PURE__ */ jsx4(SelectPrimitive.ItemText, { children })
433
+ ]
434
+ }
435
+ );
436
+ }
437
+ function SelectSeparator({
438
+ className,
439
+ ...props
440
+ }) {
441
+ return /* @__PURE__ */ jsx4(
442
+ SelectPrimitive.Separator,
443
+ {
444
+ "data-slot": "select-separator",
445
+ className: cn("bg-border -mx-1 my-1 h-px pointer-events-none", className),
446
+ ...props
447
+ }
448
+ );
449
+ }
450
+ function SelectScrollUpButton({
451
+ className,
452
+ ...props
453
+ }) {
454
+ return /* @__PURE__ */ jsx4(
455
+ SelectPrimitive.ScrollUpButton,
456
+ {
457
+ "data-slot": "select-scroll-up-button",
458
+ className: cn("bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4", className),
459
+ ...props,
460
+ children: /* @__PURE__ */ jsx4(ChevronUp, {})
461
+ }
462
+ );
463
+ }
464
+ function SelectScrollDownButton({
465
+ className,
466
+ ...props
467
+ }) {
468
+ return /* @__PURE__ */ jsx4(
469
+ SelectPrimitive.ScrollDownButton,
470
+ {
471
+ "data-slot": "select-scroll-down-button",
472
+ className: cn("bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4", className),
473
+ ...props,
474
+ children: /* @__PURE__ */ jsx4(ChevronDown, {})
475
+ }
476
+ );
477
+ }
478
+
479
+ // src/components/ui/input.tsx
480
+ import { jsx as jsx5 } from "react/jsx-runtime";
481
+ function Input({ className, type, ...props }) {
482
+ return /* @__PURE__ */ jsx5(
483
+ "input",
484
+ {
485
+ type,
486
+ "data-slot": "input",
487
+ className: cn(
488
+ "dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 h-9 rounded-md border bg-transparent px-2.5 py-1 text-base shadow-xs transition-[color,box-shadow] file:h-7 file:text-sm file:font-medium focus-visible:ring-3 aria-invalid:ring-3 md:text-sm file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
489
+ className
490
+ ),
491
+ ...props
492
+ }
493
+ );
494
+ }
495
+
496
+ // src/components/ui/label.tsx
497
+ import { Label as LabelPrimitive } from "radix-ui";
498
+ import { jsx as jsx6 } from "react/jsx-runtime";
499
+ function Label({
500
+ className,
501
+ ...props
502
+ }) {
503
+ return /* @__PURE__ */ jsx6(
504
+ LabelPrimitive.Root,
505
+ {
506
+ "data-slot": "label",
507
+ className: cn(
508
+ "gap-2 text-sm leading-none font-medium group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 flex items-center select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed",
509
+ className
510
+ ),
511
+ ...props
512
+ }
513
+ );
514
+ }
515
+
516
+ // src/components/ui/textarea.tsx
517
+ import { jsx as jsx7 } from "react/jsx-runtime";
518
+ function Textarea({ className, ...props }) {
519
+ return /* @__PURE__ */ jsx7(
520
+ "textarea",
521
+ {
522
+ "data-slot": "textarea",
523
+ className: cn(
524
+ "border-input dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-md border bg-transparent px-2.5 py-2 text-base shadow-xs transition-[color,box-shadow] focus-visible:ring-3 aria-invalid:ring-3 md:text-sm placeholder:text-muted-foreground flex field-sizing-content min-h-16 w-full outline-none disabled:cursor-not-allowed disabled:opacity-50",
525
+ className
526
+ ),
527
+ ...props
528
+ }
529
+ );
530
+ }
531
+
532
+ // src/components/ui/card.tsx
533
+ import { jsx as jsx8 } from "react/jsx-runtime";
534
+ function Card({
535
+ className,
536
+ size = "default",
537
+ ...props
538
+ }) {
539
+ return /* @__PURE__ */ jsx8(
540
+ "div",
541
+ {
542
+ "data-slot": "card",
543
+ "data-size": size,
544
+ className: cn("ring-foreground/10 bg-card text-card-foreground gap-6 overflow-hidden rounded-xl py-6 text-sm shadow-xs ring-1 has-[>img:first-child]:pt-0 data-[size=sm]:gap-4 data-[size=sm]:py-4 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl group/card flex flex-col", className),
545
+ ...props
546
+ }
547
+ );
548
+ }
549
+ function CardHeader({ className, ...props }) {
550
+ return /* @__PURE__ */ jsx8(
551
+ "div",
552
+ {
553
+ "data-slot": "card-header",
554
+ className: cn(
555
+ "gap-1 rounded-t-xl px-6 group-data-[size=sm]/card:px-4 [.border-b]:pb-6 group-data-[size=sm]/card:[.border-b]:pb-4 group/card-header @container/card-header grid auto-rows-min items-start has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]",
556
+ className
557
+ ),
558
+ ...props
559
+ }
560
+ );
561
+ }
562
+ function CardTitle({ className, ...props }) {
563
+ return /* @__PURE__ */ jsx8(
564
+ "div",
565
+ {
566
+ "data-slot": "card-title",
567
+ className: cn("text-base leading-normal font-medium group-data-[size=sm]/card:text-sm", className),
568
+ ...props
569
+ }
570
+ );
571
+ }
572
+ function CardDescription({ className, ...props }) {
573
+ return /* @__PURE__ */ jsx8(
574
+ "div",
575
+ {
576
+ "data-slot": "card-description",
577
+ className: cn("text-muted-foreground text-sm", className),
578
+ ...props
579
+ }
580
+ );
581
+ }
582
+ function CardContent({ className, ...props }) {
583
+ return /* @__PURE__ */ jsx8(
584
+ "div",
585
+ {
586
+ "data-slot": "card-content",
587
+ className: cn("px-6 group-data-[size=sm]/card:px-4", className),
588
+ ...props
589
+ }
590
+ );
591
+ }
592
+ function CardFooter({ className, ...props }) {
593
+ return /* @__PURE__ */ jsx8(
594
+ "div",
595
+ {
596
+ "data-slot": "card-footer",
597
+ className: cn("rounded-b-xl px-6 group-data-[size=sm]/card:px-4 [.border-t]:pt-6 group-data-[size=sm]/card:[.border-t]:pt-4 flex items-center", className),
598
+ ...props
599
+ }
600
+ );
601
+ }
602
+
603
+ // src/components/ui/badge.tsx
604
+ import { cva as cva2 } from "class-variance-authority";
605
+ import { Slot as Slot2 } from "radix-ui";
606
+ import { jsx as jsx9 } from "react/jsx-runtime";
607
+ var badgeVariants = cva2(
608
+ "h-5 gap-1 rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium transition-all has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&>svg]:size-3! inline-flex items-center justify-center w-fit whitespace-nowrap shrink-0 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive overflow-hidden group/badge",
609
+ {
610
+ variants: {
611
+ variant: {
612
+ default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
613
+ secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
614
+ destructive: "bg-destructive/10 [a]:hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 text-destructive dark:bg-destructive/20",
615
+ outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
616
+ ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
617
+ link: "text-primary underline-offset-4 hover:underline"
618
+ }
619
+ },
620
+ defaultVariants: {
621
+ variant: "default"
622
+ }
623
+ }
624
+ );
625
+ function Badge({
626
+ className,
627
+ variant = "default",
628
+ asChild = false,
629
+ ...props
630
+ }) {
631
+ const Comp = asChild ? Slot2.Root : "span";
632
+ return /* @__PURE__ */ jsx9(
633
+ Comp,
634
+ {
635
+ "data-slot": "badge",
636
+ "data-variant": variant,
637
+ className: cn(badgeVariants({ variant }), className),
638
+ ...props
639
+ }
640
+ );
641
+ }
642
+
643
+ // src/components/ui/avatar.tsx
644
+ import { Avatar as AvatarPrimitive } from "radix-ui";
645
+ import { jsx as jsx10 } from "react/jsx-runtime";
646
+ function Avatar({
647
+ className,
648
+ size = "default",
649
+ ...props
650
+ }) {
651
+ return /* @__PURE__ */ jsx10(
652
+ AvatarPrimitive.Root,
653
+ {
654
+ "data-slot": "avatar",
655
+ "data-size": size,
656
+ className: cn(
657
+ "size-8 rounded-full after:rounded-full data-[size=lg]:size-10 data-[size=sm]:size-6 after:border-border group/avatar relative flex shrink-0 select-none after:absolute after:inset-0 after:border after:mix-blend-darken dark:after:mix-blend-lighten",
658
+ className
659
+ ),
660
+ ...props
661
+ }
662
+ );
663
+ }
664
+ function AvatarImage({
665
+ className,
666
+ ...props
667
+ }) {
668
+ return /* @__PURE__ */ jsx10(
669
+ AvatarPrimitive.Image,
670
+ {
671
+ "data-slot": "avatar-image",
672
+ className: cn(
673
+ "rounded-full aspect-square size-full object-cover",
674
+ className
675
+ ),
676
+ ...props
677
+ }
678
+ );
679
+ }
680
+ function AvatarFallback({
681
+ className,
682
+ ...props
683
+ }) {
684
+ return /* @__PURE__ */ jsx10(
685
+ AvatarPrimitive.Fallback,
686
+ {
687
+ "data-slot": "avatar-fallback",
688
+ className: cn(
689
+ "bg-muted text-muted-foreground rounded-full flex size-full items-center justify-center text-sm group-data-[size=sm]/avatar:text-xs",
690
+ className
691
+ ),
692
+ ...props
693
+ }
694
+ );
695
+ }
696
+
697
+ // src/components/ui/tooltip.tsx
698
+ import { Tooltip as TooltipPrimitive } from "radix-ui";
699
+ import { jsx as jsx11, jsxs as jsxs4 } from "react/jsx-runtime";
700
+ function TooltipProvider({
701
+ delayDuration = 0,
702
+ ...props
703
+ }) {
704
+ return /* @__PURE__ */ jsx11(
705
+ TooltipPrimitive.Provider,
706
+ {
707
+ "data-slot": "tooltip-provider",
708
+ delayDuration,
709
+ ...props
710
+ }
711
+ );
712
+ }
713
+ function Tooltip({
714
+ ...props
715
+ }) {
716
+ return /* @__PURE__ */ jsx11(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props });
717
+ }
718
+ function TooltipTrigger({
719
+ ...props
720
+ }) {
721
+ return /* @__PURE__ */ jsx11(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
722
+ }
723
+ function TooltipContent({
724
+ className,
725
+ sideOffset = 0,
726
+ children,
727
+ ...props
728
+ }) {
729
+ return /* @__PURE__ */ jsx11(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs4(
730
+ TooltipPrimitive.Content,
731
+ {
732
+ "data-slot": "tooltip-content",
733
+ sideOffset,
734
+ className: cn(
735
+ "data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 rounded-md px-3 py-1.5 text-xs bg-foreground text-background z-50 w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin)",
736
+ className
737
+ ),
738
+ ...props,
739
+ children: [
740
+ children,
741
+ /* @__PURE__ */ jsx11(TooltipPrimitive.Arrow, { className: "size-2.5 rotate-45 rounded-[2px] bg-foreground fill-foreground z-50 translate-y-[calc(-50%_-_2px)]" })
742
+ ]
743
+ }
744
+ ) });
745
+ }
746
+
747
+ // src/components/ui/dropdown-menu.tsx
748
+ import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
749
+ import { Check as Check2, ChevronRight } from "lucide-react";
750
+ import { jsx as jsx12, jsxs as jsxs5 } from "react/jsx-runtime";
751
+ function DropdownMenu({
752
+ ...props
753
+ }) {
754
+ return /* @__PURE__ */ jsx12(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
755
+ }
756
+ function DropdownMenuTrigger({
757
+ ...props
758
+ }) {
759
+ return /* @__PURE__ */ jsx12(
760
+ DropdownMenuPrimitive.Trigger,
761
+ {
762
+ "data-slot": "dropdown-menu-trigger",
763
+ ...props
764
+ }
765
+ );
766
+ }
767
+ function DropdownMenuContent({
768
+ className,
769
+ align = "start",
770
+ sideOffset = 4,
771
+ ...props
772
+ }) {
773
+ return /* @__PURE__ */ jsx12(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx12(
774
+ DropdownMenuPrimitive.Content,
775
+ {
776
+ "data-slot": "dropdown-menu-content",
777
+ sideOffset,
778
+ align,
779
+ className: cn("data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-md p-1 shadow-md ring-1 duration-100 z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto data-[state=closed]:overflow-hidden", className),
780
+ ...props
781
+ }
782
+ ) });
783
+ }
784
+ function DropdownMenuGroup({
785
+ ...props
786
+ }) {
787
+ return /* @__PURE__ */ jsx12(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
788
+ }
789
+ function DropdownMenuItem({
790
+ className,
791
+ inset,
792
+ variant = "default",
793
+ ...props
794
+ }) {
795
+ return /* @__PURE__ */ jsx12(
796
+ DropdownMenuPrimitive.Item,
797
+ {
798
+ "data-slot": "dropdown-menu-item",
799
+ "data-inset": inset,
800
+ "data-variant": variant,
801
+ className: cn(
802
+ "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:text-destructive not-data-[variant=destructive]:focus:**:text-accent-foreground gap-2 rounded-sm px-2 py-1.5 text-sm data-inset:pl-8 [&_svg:not([class*='size-'])]:size-4 group/dropdown-menu-item relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
803
+ className
804
+ ),
805
+ ...props
806
+ }
807
+ );
808
+ }
809
+ function DropdownMenuLabel({
810
+ className,
811
+ inset,
812
+ ...props
813
+ }) {
814
+ return /* @__PURE__ */ jsx12(
815
+ DropdownMenuPrimitive.Label,
816
+ {
817
+ "data-slot": "dropdown-menu-label",
818
+ "data-inset": inset,
819
+ className: cn("text-muted-foreground px-2 py-1.5 text-xs font-medium data-inset:pl-8", className),
820
+ ...props
821
+ }
822
+ );
823
+ }
824
+ function DropdownMenuSeparator({
825
+ className,
826
+ ...props
827
+ }) {
828
+ return /* @__PURE__ */ jsx12(
829
+ DropdownMenuPrimitive.Separator,
830
+ {
831
+ "data-slot": "dropdown-menu-separator",
832
+ className: cn("bg-border -mx-1 my-1 h-px", className),
833
+ ...props
834
+ }
835
+ );
836
+ }
837
+
838
+ // src/components/ui/separator.tsx
839
+ import { Separator as SeparatorPrimitive } from "radix-ui";
840
+ import { jsx as jsx13 } from "react/jsx-runtime";
841
+ function Separator({
842
+ className,
843
+ orientation = "horizontal",
844
+ decorative = true,
845
+ ...props
846
+ }) {
847
+ return /* @__PURE__ */ jsx13(
848
+ SeparatorPrimitive.Root,
849
+ {
850
+ "data-slot": "separator",
851
+ decorative,
852
+ orientation,
853
+ className: cn(
854
+ "bg-border shrink-0 data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
855
+ className
856
+ ),
857
+ ...props
858
+ }
859
+ );
860
+ }
861
+
862
+ // src/components/ui/skeleton.tsx
863
+ import { jsx as jsx14 } from "react/jsx-runtime";
864
+ function Skeleton({ className, ...props }) {
865
+ return /* @__PURE__ */ jsx14(
866
+ "div",
867
+ {
868
+ "data-slot": "skeleton",
869
+ className: cn("bg-muted rounded-md animate-pulse", className),
870
+ ...props
871
+ }
872
+ );
873
+ }
874
+
875
+ // src/components/ui/scroll-area.tsx
876
+ import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
877
+ import { jsx as jsx15, jsxs as jsxs6 } from "react/jsx-runtime";
878
+ function ScrollArea({
879
+ className,
880
+ children,
881
+ ...props
882
+ }) {
883
+ return /* @__PURE__ */ jsxs6(
884
+ ScrollAreaPrimitive.Root,
885
+ {
886
+ "data-slot": "scroll-area",
887
+ className: cn("relative", className),
888
+ ...props,
889
+ children: [
890
+ /* @__PURE__ */ jsx15(
891
+ ScrollAreaPrimitive.Viewport,
892
+ {
893
+ "data-slot": "scroll-area-viewport",
894
+ className: "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1",
895
+ children
896
+ }
897
+ ),
898
+ /* @__PURE__ */ jsx15(ScrollBar, {}),
899
+ /* @__PURE__ */ jsx15(ScrollAreaPrimitive.Corner, {})
900
+ ]
901
+ }
902
+ );
903
+ }
904
+ function ScrollBar({
905
+ className,
906
+ orientation = "vertical",
907
+ ...props
908
+ }) {
909
+ return /* @__PURE__ */ jsx15(
910
+ ScrollAreaPrimitive.ScrollAreaScrollbar,
911
+ {
912
+ "data-slot": "scroll-area-scrollbar",
913
+ "data-orientation": orientation,
914
+ orientation,
915
+ className: cn(
916
+ "data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent flex touch-none p-px transition-colors select-none",
917
+ className
918
+ ),
919
+ ...props,
920
+ children: /* @__PURE__ */ jsx15(
921
+ ScrollAreaPrimitive.ScrollAreaThumb,
922
+ {
923
+ "data-slot": "scroll-area-thumb",
924
+ className: "rounded-full bg-border relative flex-1"
925
+ }
926
+ )
927
+ }
928
+ );
929
+ }
930
+
931
+ // src/components/ui/tabs.tsx
932
+ import { cva as cva3 } from "class-variance-authority";
933
+ import { Tabs as TabsPrimitive } from "radix-ui";
934
+ import { jsx as jsx16 } from "react/jsx-runtime";
935
+ function Tabs({
936
+ className,
937
+ orientation = "horizontal",
938
+ ...props
939
+ }) {
940
+ return /* @__PURE__ */ jsx16(
941
+ TabsPrimitive.Root,
942
+ {
943
+ "data-slot": "tabs",
944
+ "data-orientation": orientation,
945
+ className: cn(
946
+ "gap-2 group/tabs flex data-horizontal:flex-col",
947
+ className
948
+ ),
949
+ ...props
950
+ }
951
+ );
952
+ }
953
+ var tabsListVariants = cva3(
954
+ "rounded-lg p-[3px] group-data-horizontal/tabs:h-9 data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col",
955
+ {
956
+ variants: {
957
+ variant: {
958
+ default: "bg-muted",
959
+ line: "gap-1 bg-transparent"
960
+ }
961
+ },
962
+ defaultVariants: {
963
+ variant: "default"
964
+ }
965
+ }
966
+ );
967
+ function TabsList({
968
+ className,
969
+ variant = "default",
970
+ ...props
971
+ }) {
972
+ return /* @__PURE__ */ jsx16(
973
+ TabsPrimitive.List,
974
+ {
975
+ "data-slot": "tabs-list",
976
+ "data-variant": variant,
977
+ className: cn(tabsListVariants({ variant }), className),
978
+ ...props
979
+ }
980
+ );
981
+ }
982
+ function TabsTrigger({
983
+ className,
984
+ ...props
985
+ }) {
986
+ return /* @__PURE__ */ jsx16(
987
+ TabsPrimitive.Trigger,
988
+ {
989
+ "data-slot": "tabs-trigger",
990
+ className: cn(
991
+ "gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg:not([class*='size-'])]:size-4 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring text-foreground/60 hover:text-foreground dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center whitespace-nowrap transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
992
+ "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent",
993
+ "data-active:bg-background dark:data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 data-active:text-foreground",
994
+ "after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100",
995
+ className
996
+ ),
997
+ ...props
998
+ }
999
+ );
1000
+ }
1001
+ function TabsContent({
1002
+ className,
1003
+ ...props
1004
+ }) {
1005
+ return /* @__PURE__ */ jsx16(
1006
+ TabsPrimitive.Content,
1007
+ {
1008
+ "data-slot": "tabs-content",
1009
+ className: cn("text-sm flex-1 outline-none", className),
1010
+ ...props
1011
+ }
1012
+ );
1013
+ }
1014
+
1015
+ // src/components/ui/table.tsx
1016
+ import { jsx as jsx17 } from "react/jsx-runtime";
1017
+ function Table({ className, ...props }) {
1018
+ return /* @__PURE__ */ jsx17("div", { "data-slot": "table-container", className: "relative w-full overflow-x-auto", children: /* @__PURE__ */ jsx17(
1019
+ "table",
1020
+ {
1021
+ "data-slot": "table",
1022
+ className: cn("w-full caption-bottom text-sm", className),
1023
+ ...props
1024
+ }
1025
+ ) });
1026
+ }
1027
+ function TableHeader({ className, ...props }) {
1028
+ return /* @__PURE__ */ jsx17(
1029
+ "thead",
1030
+ {
1031
+ "data-slot": "table-header",
1032
+ className: cn("[&_tr]:border-b", className),
1033
+ ...props
1034
+ }
1035
+ );
1036
+ }
1037
+ function TableBody({ className, ...props }) {
1038
+ return /* @__PURE__ */ jsx17(
1039
+ "tbody",
1040
+ {
1041
+ "data-slot": "table-body",
1042
+ className: cn("[&_tr:last-child]:border-0", className),
1043
+ ...props
1044
+ }
1045
+ );
1046
+ }
1047
+ function TableFooter({ className, ...props }) {
1048
+ return /* @__PURE__ */ jsx17(
1049
+ "tfoot",
1050
+ {
1051
+ "data-slot": "table-footer",
1052
+ className: cn("bg-muted/50 border-t font-medium [&>tr]:last:border-b-0", className),
1053
+ ...props
1054
+ }
1055
+ );
1056
+ }
1057
+ function TableRow({ className, ...props }) {
1058
+ return /* @__PURE__ */ jsx17(
1059
+ "tr",
1060
+ {
1061
+ "data-slot": "table-row",
1062
+ className: cn("hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors", className),
1063
+ ...props
1064
+ }
1065
+ );
1066
+ }
1067
+ function TableHead({ className, ...props }) {
1068
+ return /* @__PURE__ */ jsx17(
1069
+ "th",
1070
+ {
1071
+ "data-slot": "table-head",
1072
+ className: cn("text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0", className),
1073
+ ...props
1074
+ }
1075
+ );
1076
+ }
1077
+ function TableCell({ className, ...props }) {
1078
+ return /* @__PURE__ */ jsx17(
1079
+ "td",
1080
+ {
1081
+ "data-slot": "table-cell",
1082
+ className: cn("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0", className),
1083
+ ...props
1084
+ }
1085
+ );
1086
+ }
1087
+ function TableCaption({
1088
+ className,
1089
+ ...props
1090
+ }) {
1091
+ return /* @__PURE__ */ jsx17(
1092
+ "caption",
1093
+ {
1094
+ "data-slot": "table-caption",
1095
+ className: cn("text-muted-foreground mt-4 text-sm", className),
1096
+ ...props
1097
+ }
1098
+ );
1099
+ }
1100
+
1101
+ // src/components/ui/progress.tsx
1102
+ import { Progress as ProgressPrimitive } from "radix-ui";
1103
+ import { jsx as jsx18 } from "react/jsx-runtime";
1104
+ function Progress({
1105
+ className,
1106
+ value,
1107
+ ...props
1108
+ }) {
1109
+ return /* @__PURE__ */ jsx18(
1110
+ ProgressPrimitive.Root,
1111
+ {
1112
+ "data-slot": "progress",
1113
+ className: cn(
1114
+ "bg-muted h-1.5 rounded-full relative flex w-full items-center overflow-x-hidden",
1115
+ className
1116
+ ),
1117
+ ...props,
1118
+ children: /* @__PURE__ */ jsx18(
1119
+ ProgressPrimitive.Indicator,
1120
+ {
1121
+ "data-slot": "progress-indicator",
1122
+ className: "bg-primary size-full flex-1 transition-all",
1123
+ style: { transform: `translateX(-${100 - (value || 0)}%)` }
1124
+ }
1125
+ )
1126
+ }
1127
+ );
1128
+ }
1129
+
1130
+ // src/components/ui/command.tsx
1131
+ import { Command as CommandPrimitive } from "cmdk";
1132
+ import { Search } from "lucide-react";
1133
+ import { jsx as jsx19, jsxs as jsxs7 } from "react/jsx-runtime";
1134
+ function Command({
1135
+ className,
1136
+ ...props
1137
+ }) {
1138
+ return /* @__PURE__ */ jsx19(
1139
+ CommandPrimitive,
1140
+ {
1141
+ "data-slot": "command",
1142
+ className: cn(
1143
+ "bg-popover text-popover-foreground rounded-xl p-1 flex size-full flex-col overflow-hidden",
1144
+ className
1145
+ ),
1146
+ ...props
1147
+ }
1148
+ );
1149
+ }
1150
+ function CommandInput({
1151
+ className,
1152
+ ...props
1153
+ }) {
1154
+ return /* @__PURE__ */ jsxs7("div", { "data-slot": "command-input-wrapper", className: "flex h-9 items-center gap-2 border-b px-3", children: [
1155
+ /* @__PURE__ */ jsx19(Search, { className: "size-4 shrink-0 opacity-50" }),
1156
+ /* @__PURE__ */ jsx19(
1157
+ CommandPrimitive.Input,
1158
+ {
1159
+ "data-slot": "command-input",
1160
+ className: cn(
1161
+ "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",
1162
+ className
1163
+ ),
1164
+ ...props
1165
+ }
1166
+ )
1167
+ ] });
1168
+ }
1169
+ function CommandList({
1170
+ className,
1171
+ ...props
1172
+ }) {
1173
+ return /* @__PURE__ */ jsx19(
1174
+ CommandPrimitive.List,
1175
+ {
1176
+ "data-slot": "command-list",
1177
+ className: cn(
1178
+ "no-scrollbar max-h-72 scroll-py-1 outline-none overflow-x-hidden overflow-y-auto",
1179
+ className
1180
+ ),
1181
+ ...props
1182
+ }
1183
+ );
1184
+ }
1185
+ function CommandEmpty({
1186
+ className,
1187
+ ...props
1188
+ }) {
1189
+ return /* @__PURE__ */ jsx19(
1190
+ CommandPrimitive.Empty,
1191
+ {
1192
+ "data-slot": "command-empty",
1193
+ className: cn("py-6 text-center text-sm", className),
1194
+ ...props
1195
+ }
1196
+ );
1197
+ }
1198
+ function CommandGroup({
1199
+ className,
1200
+ ...props
1201
+ }) {
1202
+ return /* @__PURE__ */ jsx19(
1203
+ CommandPrimitive.Group,
1204
+ {
1205
+ "data-slot": "command-group",
1206
+ className: cn(
1207
+ "text-foreground overflow-hidden p-1 **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground",
1208
+ className
1209
+ ),
1210
+ ...props
1211
+ }
1212
+ );
1213
+ }
1214
+ function CommandSeparator({
1215
+ className,
1216
+ ...props
1217
+ }) {
1218
+ return /* @__PURE__ */ jsx19(
1219
+ CommandPrimitive.Separator,
1220
+ {
1221
+ "data-slot": "command-separator",
1222
+ className: cn("bg-border -mx-1 h-px w-auto", className),
1223
+ ...props
1224
+ }
1225
+ );
1226
+ }
1227
+ function CommandItem({
1228
+ className,
1229
+ ...props
1230
+ }) {
1231
+ return /* @__PURE__ */ jsx19(
1232
+ CommandPrimitive.Item,
1233
+ {
1234
+ "data-slot": "command-item",
1235
+ className: cn(
1236
+ "data-selected:bg-muted data-selected:text-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none [&_svg:not([class*='size-'])]:size-4 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
1237
+ className
1238
+ ),
1239
+ ...props
1240
+ }
1241
+ );
1242
+ }
1243
+ function CommandShortcut({
1244
+ className,
1245
+ ...props
1246
+ }) {
1247
+ return /* @__PURE__ */ jsx19(
1248
+ "span",
1249
+ {
1250
+ "data-slot": "command-shortcut",
1251
+ className: cn("text-muted-foreground ml-auto text-xs tracking-widest", className),
1252
+ ...props
1253
+ }
1254
+ );
1255
+ }
1256
+
1257
+ // src/components/ui/sidebar.tsx
1258
+ import * as React from "react";
1259
+ import { cva as cva4 } from "class-variance-authority";
1260
+ import { Slot as Slot3 } from "radix-ui";
1261
+ import { PanelLeft } from "lucide-react";
1262
+
1263
+ // src/hooks/use-mobile.ts
1264
+ import { useEffect, useState } from "react";
1265
+ var MOBILE_BREAKPOINT = 768;
1266
+ function useIsMobile() {
1267
+ const [isMobile, setIsMobile] = useState(void 0);
1268
+ useEffect(() => {
1269
+ const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
1270
+ const onChange = () => setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
1271
+ mql.addEventListener("change", onChange);
1272
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
1273
+ return () => mql.removeEventListener("change", onChange);
1274
+ }, []);
1275
+ return !!isMobile;
1276
+ }
1277
+
1278
+ // src/components/ui/sheet.tsx
1279
+ import { Dialog as SheetPrimitive } from "radix-ui";
1280
+ import { X as X2 } from "lucide-react";
1281
+ import { jsx as jsx20, jsxs as jsxs8 } from "react/jsx-runtime";
1282
+ function Sheet({ ...props }) {
1283
+ return /* @__PURE__ */ jsx20(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
1284
+ }
1285
+ function SheetTrigger({
1286
+ ...props
1287
+ }) {
1288
+ return /* @__PURE__ */ jsx20(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props });
1289
+ }
1290
+ function SheetClose({
1291
+ ...props
1292
+ }) {
1293
+ return /* @__PURE__ */ jsx20(SheetPrimitive.Close, { "data-slot": "sheet-close", ...props });
1294
+ }
1295
+ function SheetPortal({
1296
+ ...props
1297
+ }) {
1298
+ return /* @__PURE__ */ jsx20(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
1299
+ }
1300
+ function SheetOverlay({
1301
+ className,
1302
+ ...props
1303
+ }) {
1304
+ return /* @__PURE__ */ jsx20(
1305
+ SheetPrimitive.Overlay,
1306
+ {
1307
+ "data-slot": "sheet-overlay",
1308
+ className: cn("data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 duration-100 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 z-50", className),
1309
+ ...props
1310
+ }
1311
+ );
1312
+ }
1313
+ function SheetContent({
1314
+ className,
1315
+ children,
1316
+ side = "right",
1317
+ showCloseButton = true,
1318
+ ...props
1319
+ }) {
1320
+ return /* @__PURE__ */ jsxs8(SheetPortal, { children: [
1321
+ /* @__PURE__ */ jsx20(SheetOverlay, {}),
1322
+ /* @__PURE__ */ jsxs8(
1323
+ SheetPrimitive.Content,
1324
+ {
1325
+ "data-slot": "sheet-content",
1326
+ "data-side": side,
1327
+ className: cn("bg-background data-open:animate-in data-closed:animate-out data-[side=right]:data-closed:slide-out-to-right-10 data-[side=right]:data-open:slide-in-from-right-10 data-[side=left]:data-closed:slide-out-to-left-10 data-[side=left]:data-open:slide-in-from-left-10 data-[side=top]:data-closed:slide-out-to-top-10 data-[side=top]:data-open:slide-in-from-top-10 data-closed:fade-out-0 data-open:fade-in-0 data-[side=bottom]:data-closed:slide-out-to-bottom-10 data-[side=bottom]:data-open:slide-in-from-bottom-10 fixed z-50 flex flex-col gap-4 bg-clip-padding text-sm shadow-lg transition duration-200 ease-in-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm", className),
1328
+ ...props,
1329
+ children: [
1330
+ children,
1331
+ showCloseButton && /* @__PURE__ */ jsx20(SheetPrimitive.Close, { "data-slot": "sheet-close", asChild: true, children: /* @__PURE__ */ jsxs8(Button, { variant: "ghost", className: "absolute top-4 right-4", size: "icon-sm", children: [
1332
+ /* @__PURE__ */ jsx20(X2, {}),
1333
+ /* @__PURE__ */ jsx20("span", { className: "sr-only", children: "Close" })
1334
+ ] }) })
1335
+ ]
1336
+ }
1337
+ )
1338
+ ] });
1339
+ }
1340
+ function SheetHeader({ className, ...props }) {
1341
+ return /* @__PURE__ */ jsx20(
1342
+ "div",
1343
+ {
1344
+ "data-slot": "sheet-header",
1345
+ className: cn("gap-1.5 p-4 flex flex-col", className),
1346
+ ...props
1347
+ }
1348
+ );
1349
+ }
1350
+ function SheetFooter({ className, ...props }) {
1351
+ return /* @__PURE__ */ jsx20(
1352
+ "div",
1353
+ {
1354
+ "data-slot": "sheet-footer",
1355
+ className: cn("gap-2 p-4 mt-auto flex flex-col", className),
1356
+ ...props
1357
+ }
1358
+ );
1359
+ }
1360
+ function SheetTitle({
1361
+ className,
1362
+ ...props
1363
+ }) {
1364
+ return /* @__PURE__ */ jsx20(
1365
+ SheetPrimitive.Title,
1366
+ {
1367
+ "data-slot": "sheet-title",
1368
+ className: cn("text-foreground font-medium", className),
1369
+ ...props
1370
+ }
1371
+ );
1372
+ }
1373
+ function SheetDescription({
1374
+ className,
1375
+ ...props
1376
+ }) {
1377
+ return /* @__PURE__ */ jsx20(
1378
+ SheetPrimitive.Description,
1379
+ {
1380
+ "data-slot": "sheet-description",
1381
+ className: cn("text-muted-foreground text-sm", className),
1382
+ ...props
1383
+ }
1384
+ );
1385
+ }
1386
+
1387
+ // src/components/ui/sidebar.tsx
1388
+ import { jsx as jsx21, jsxs as jsxs9 } from "react/jsx-runtime";
1389
+ var SIDEBAR_COOKIE_NAME = "sidebar_state";
1390
+ var SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
1391
+ var SIDEBAR_WIDTH = "16rem";
1392
+ var SIDEBAR_WIDTH_MOBILE = "18rem";
1393
+ var SIDEBAR_WIDTH_ICON = "3rem";
1394
+ var SIDEBAR_KEYBOARD_SHORTCUT = "b";
1395
+ var SidebarContext = React.createContext(null);
1396
+ function useSidebar() {
1397
+ const context = React.useContext(SidebarContext);
1398
+ if (!context) {
1399
+ throw new Error("useSidebar must be used within a SidebarProvider.");
1400
+ }
1401
+ return context;
1402
+ }
1403
+ function SidebarProvider({
1404
+ defaultOpen = true,
1405
+ open: openProp,
1406
+ onOpenChange: setOpenProp,
1407
+ className,
1408
+ style,
1409
+ children,
1410
+ ...props
1411
+ }) {
1412
+ const isMobile = useIsMobile();
1413
+ const [openMobile, setOpenMobile] = React.useState(false);
1414
+ const [_open, _setOpen] = React.useState(defaultOpen);
1415
+ const open = openProp ?? _open;
1416
+ const setOpen = React.useCallback(
1417
+ (value) => {
1418
+ const openState = typeof value === "function" ? value(open) : value;
1419
+ if (setOpenProp) {
1420
+ setOpenProp(openState);
1421
+ } else {
1422
+ _setOpen(openState);
1423
+ }
1424
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
1425
+ },
1426
+ [setOpenProp, open]
1427
+ );
1428
+ const toggleSidebar = React.useCallback(() => {
1429
+ return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2);
1430
+ }, [isMobile, setOpen, setOpenMobile]);
1431
+ React.useEffect(() => {
1432
+ const handleKeyDown = (event) => {
1433
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
1434
+ event.preventDefault();
1435
+ toggleSidebar();
1436
+ }
1437
+ };
1438
+ window.addEventListener("keydown", handleKeyDown);
1439
+ return () => window.removeEventListener("keydown", handleKeyDown);
1440
+ }, [toggleSidebar]);
1441
+ const state = open ? "expanded" : "collapsed";
1442
+ const contextValue = React.useMemo(
1443
+ () => ({
1444
+ state,
1445
+ open,
1446
+ setOpen,
1447
+ isMobile,
1448
+ openMobile,
1449
+ setOpenMobile,
1450
+ toggleSidebar
1451
+ }),
1452
+ [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
1453
+ );
1454
+ return /* @__PURE__ */ jsx21(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx21(
1455
+ "div",
1456
+ {
1457
+ "data-slot": "sidebar-wrapper",
1458
+ style: {
1459
+ "--sidebar-width": SIDEBAR_WIDTH,
1460
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
1461
+ ...style
1462
+ },
1463
+ className: cn(
1464
+ "group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full",
1465
+ className
1466
+ ),
1467
+ ...props,
1468
+ children
1469
+ }
1470
+ ) });
1471
+ }
1472
+ function Sidebar({
1473
+ side = "left",
1474
+ variant = "sidebar",
1475
+ collapsible = "offcanvas",
1476
+ className,
1477
+ children,
1478
+ dir,
1479
+ ...props
1480
+ }) {
1481
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
1482
+ if (collapsible === "none") {
1483
+ return /* @__PURE__ */ jsx21(
1484
+ "div",
1485
+ {
1486
+ "data-slot": "sidebar",
1487
+ className: cn(
1488
+ "bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col",
1489
+ className
1490
+ ),
1491
+ ...props,
1492
+ children
1493
+ }
1494
+ );
1495
+ }
1496
+ if (isMobile) {
1497
+ return /* @__PURE__ */ jsx21(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: /* @__PURE__ */ jsxs9(
1498
+ SheetContent,
1499
+ {
1500
+ dir,
1501
+ "data-sidebar": "sidebar",
1502
+ "data-slot": "sidebar",
1503
+ "data-mobile": "true",
1504
+ className: "bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden",
1505
+ style: {
1506
+ "--sidebar-width": SIDEBAR_WIDTH_MOBILE
1507
+ },
1508
+ side,
1509
+ children: [
1510
+ /* @__PURE__ */ jsxs9(SheetHeader, { className: "sr-only", children: [
1511
+ /* @__PURE__ */ jsx21(SheetTitle, { children: "Sidebar" }),
1512
+ /* @__PURE__ */ jsx21(SheetDescription, { children: "Displays the mobile sidebar." })
1513
+ ] }),
1514
+ /* @__PURE__ */ jsx21("div", { className: "flex h-full w-full flex-col", children })
1515
+ ]
1516
+ }
1517
+ ) });
1518
+ }
1519
+ return /* @__PURE__ */ jsxs9(
1520
+ "div",
1521
+ {
1522
+ className: "group peer text-sidebar-foreground hidden md:block",
1523
+ "data-state": state,
1524
+ "data-collapsible": state === "collapsed" ? collapsible : "",
1525
+ "data-variant": variant,
1526
+ "data-side": side,
1527
+ "data-slot": "sidebar",
1528
+ children: [
1529
+ /* @__PURE__ */ jsx21(
1530
+ "div",
1531
+ {
1532
+ "data-slot": "sidebar-gap",
1533
+ className: cn(
1534
+ "transition-[width] duration-200 ease-linear relative w-(--sidebar-width) bg-transparent",
1535
+ "group-data-[collapsible=offcanvas]:w-0",
1536
+ "group-data-[side=right]:rotate-180",
1537
+ variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"
1538
+ )
1539
+ }
1540
+ ),
1541
+ /* @__PURE__ */ jsx21(
1542
+ "div",
1543
+ {
1544
+ "data-slot": "sidebar-container",
1545
+ "data-side": side,
1546
+ className: cn(
1547
+ "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex",
1548
+ // Adjust the padding for floating and inset variants.
1549
+ variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",
1550
+ className
1551
+ ),
1552
+ ...props,
1553
+ children: /* @__PURE__ */ jsx21(
1554
+ "div",
1555
+ {
1556
+ "data-sidebar": "sidebar",
1557
+ "data-slot": "sidebar-inner",
1558
+ className: "bg-sidebar group-data-[variant=floating]:ring-sidebar-border group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 flex size-full flex-col",
1559
+ children
1560
+ }
1561
+ )
1562
+ }
1563
+ )
1564
+ ]
1565
+ }
1566
+ );
1567
+ }
1568
+ function SidebarTrigger({
1569
+ className,
1570
+ onClick,
1571
+ ...props
1572
+ }) {
1573
+ const { toggleSidebar } = useSidebar();
1574
+ return /* @__PURE__ */ jsxs9(
1575
+ Button,
1576
+ {
1577
+ "data-sidebar": "trigger",
1578
+ "data-slot": "sidebar-trigger",
1579
+ variant: "ghost",
1580
+ size: "icon-sm",
1581
+ className: cn(className),
1582
+ onClick: (event) => {
1583
+ onClick?.(event);
1584
+ toggleSidebar();
1585
+ },
1586
+ ...props,
1587
+ children: [
1588
+ /* @__PURE__ */ jsx21(PanelLeft, {}),
1589
+ /* @__PURE__ */ jsx21("span", { className: "sr-only", children: "Toggle Sidebar" })
1590
+ ]
1591
+ }
1592
+ );
1593
+ }
1594
+ function SidebarRail({ className, ...props }) {
1595
+ const { toggleSidebar } = useSidebar();
1596
+ return /* @__PURE__ */ jsx21(
1597
+ "button",
1598
+ {
1599
+ "data-sidebar": "rail",
1600
+ "data-slot": "sidebar-rail",
1601
+ "aria-label": "Toggle Sidebar",
1602
+ tabIndex: -1,
1603
+ onClick: toggleSidebar,
1604
+ title: "Toggle Sidebar",
1605
+ className: cn(
1606
+ "hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2",
1607
+ "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize",
1608
+ "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
1609
+ "hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full",
1610
+ "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
1611
+ "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
1612
+ className
1613
+ ),
1614
+ ...props
1615
+ }
1616
+ );
1617
+ }
1618
+ function SidebarInset({ className, ...props }) {
1619
+ return /* @__PURE__ */ jsx21(
1620
+ "main",
1621
+ {
1622
+ "data-slot": "sidebar-inset",
1623
+ className: cn(
1624
+ "bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2 relative flex w-full flex-1 flex-col",
1625
+ className
1626
+ ),
1627
+ ...props
1628
+ }
1629
+ );
1630
+ }
1631
+ function SidebarHeader({ className, ...props }) {
1632
+ return /* @__PURE__ */ jsx21(
1633
+ "div",
1634
+ {
1635
+ "data-slot": "sidebar-header",
1636
+ "data-sidebar": "header",
1637
+ className: cn("gap-2 p-2 flex flex-col", className),
1638
+ ...props
1639
+ }
1640
+ );
1641
+ }
1642
+ function SidebarFooter({ className, ...props }) {
1643
+ return /* @__PURE__ */ jsx21(
1644
+ "div",
1645
+ {
1646
+ "data-slot": "sidebar-footer",
1647
+ "data-sidebar": "footer",
1648
+ className: cn("gap-2 p-2 flex flex-col", className),
1649
+ ...props
1650
+ }
1651
+ );
1652
+ }
1653
+ function SidebarSeparator({
1654
+ className,
1655
+ ...props
1656
+ }) {
1657
+ return /* @__PURE__ */ jsx21(
1658
+ Separator,
1659
+ {
1660
+ "data-slot": "sidebar-separator",
1661
+ "data-sidebar": "separator",
1662
+ className: cn("bg-sidebar-border mx-2 w-auto", className),
1663
+ ...props
1664
+ }
1665
+ );
1666
+ }
1667
+ function SidebarContent({ className, ...props }) {
1668
+ return /* @__PURE__ */ jsx21(
1669
+ "div",
1670
+ {
1671
+ "data-slot": "sidebar-content",
1672
+ "data-sidebar": "content",
1673
+ className: cn(
1674
+ "no-scrollbar gap-2 flex min-h-0 flex-1 flex-col overflow-auto group-data-[collapsible=icon]:overflow-hidden",
1675
+ className
1676
+ ),
1677
+ ...props
1678
+ }
1679
+ );
1680
+ }
1681
+ function SidebarGroup({ className, ...props }) {
1682
+ return /* @__PURE__ */ jsx21(
1683
+ "div",
1684
+ {
1685
+ "data-slot": "sidebar-group",
1686
+ "data-sidebar": "group",
1687
+ className: cn(
1688
+ "p-2 relative flex w-full min-w-0 flex-col",
1689
+ className
1690
+ ),
1691
+ ...props
1692
+ }
1693
+ );
1694
+ }
1695
+ function SidebarGroupLabel({
1696
+ className,
1697
+ asChild = false,
1698
+ ...props
1699
+ }) {
1700
+ const Comp = asChild ? Slot3.Root : "div";
1701
+ return /* @__PURE__ */ jsx21(
1702
+ Comp,
1703
+ {
1704
+ "data-slot": "sidebar-group-label",
1705
+ "data-sidebar": "group-label",
1706
+ className: cn(
1707
+ "text-sidebar-foreground/70 ring-sidebar-ring h-8 rounded-md px-2 text-xs font-medium transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 flex shrink-0 items-center outline-hidden [&>svg]:shrink-0",
1708
+ className
1709
+ ),
1710
+ ...props
1711
+ }
1712
+ );
1713
+ }
1714
+ function SidebarGroupContent({
1715
+ className,
1716
+ ...props
1717
+ }) {
1718
+ return /* @__PURE__ */ jsx21(
1719
+ "div",
1720
+ {
1721
+ "data-slot": "sidebar-group-content",
1722
+ "data-sidebar": "group-content",
1723
+ className: cn("text-sm w-full", className),
1724
+ ...props
1725
+ }
1726
+ );
1727
+ }
1728
+ function SidebarMenu({ className, ...props }) {
1729
+ return /* @__PURE__ */ jsx21(
1730
+ "ul",
1731
+ {
1732
+ "data-slot": "sidebar-menu",
1733
+ "data-sidebar": "menu",
1734
+ className: cn("gap-1 flex w-full min-w-0 flex-col", className),
1735
+ ...props
1736
+ }
1737
+ );
1738
+ }
1739
+ function SidebarMenuItem({ className, ...props }) {
1740
+ return /* @__PURE__ */ jsx21(
1741
+ "li",
1742
+ {
1743
+ "data-slot": "sidebar-menu-item",
1744
+ "data-sidebar": "menu-item",
1745
+ className: cn("group/menu-item relative", className),
1746
+ ...props
1747
+ }
1748
+ );
1749
+ }
1750
+ var sidebarMenuButtonVariants = cva4(
1751
+ "ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground gap-2 rounded-md p-2 text-left text-sm transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! focus-visible:ring-2 data-active:font-medium peer/menu-button flex w-full items-center overflow-hidden outline-hidden group/menu-button disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&_svg]:size-4 [&_svg]:shrink-0",
1752
+ {
1753
+ variants: {
1754
+ variant: {
1755
+ default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
1756
+ outline: "bg-background hover:bg-sidebar-accent hover:text-sidebar-accent-foreground shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]"
1757
+ },
1758
+ size: {
1759
+ default: "h-8 text-sm",
1760
+ sm: "h-7 text-xs",
1761
+ lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!"
1762
+ }
1763
+ },
1764
+ defaultVariants: {
1765
+ variant: "default",
1766
+ size: "default"
1767
+ }
1768
+ }
1769
+ );
1770
+ function SidebarMenuButton({
1771
+ asChild = false,
1772
+ isActive = false,
1773
+ variant = "default",
1774
+ size = "default",
1775
+ tooltip,
1776
+ className,
1777
+ ...props
1778
+ }) {
1779
+ const Comp = asChild ? Slot3.Root : "button";
1780
+ const { isMobile, state } = useSidebar();
1781
+ const button = /* @__PURE__ */ jsx21(
1782
+ Comp,
1783
+ {
1784
+ "data-slot": "sidebar-menu-button",
1785
+ "data-sidebar": "menu-button",
1786
+ "data-size": size,
1787
+ "data-active": isActive,
1788
+ className: cn(sidebarMenuButtonVariants({ variant, size }), className),
1789
+ ...props
1790
+ }
1791
+ );
1792
+ if (!tooltip) {
1793
+ return button;
1794
+ }
1795
+ if (typeof tooltip === "string") {
1796
+ tooltip = {
1797
+ children: tooltip
1798
+ };
1799
+ }
1800
+ return /* @__PURE__ */ jsxs9(Tooltip, { children: [
1801
+ /* @__PURE__ */ jsx21(TooltipTrigger, { asChild: true, children: button }),
1802
+ /* @__PURE__ */ jsx21(
1803
+ TooltipContent,
1804
+ {
1805
+ side: "right",
1806
+ align: "center",
1807
+ hidden: state !== "collapsed" || isMobile,
1808
+ ...tooltip
1809
+ }
1810
+ )
1811
+ ] });
1812
+ }
1813
+ function SidebarMenuSub({ className, ...props }) {
1814
+ return /* @__PURE__ */ jsx21(
1815
+ "ul",
1816
+ {
1817
+ "data-slot": "sidebar-menu-sub",
1818
+ "data-sidebar": "menu-sub",
1819
+ className: cn("border-sidebar-border mx-3.5 translate-x-px gap-1 border-l px-2.5 py-0.5 group-data-[collapsible=icon]:hidden flex min-w-0 flex-col", className),
1820
+ ...props
1821
+ }
1822
+ );
1823
+ }
1824
+ function SidebarMenuSubItem({
1825
+ className,
1826
+ ...props
1827
+ }) {
1828
+ return /* @__PURE__ */ jsx21(
1829
+ "li",
1830
+ {
1831
+ "data-slot": "sidebar-menu-sub-item",
1832
+ "data-sidebar": "menu-sub-item",
1833
+ className: cn("group/menu-sub-item relative", className),
1834
+ ...props
1835
+ }
1836
+ );
1837
+ }
1838
+ function SidebarMenuSubButton({
1839
+ asChild = false,
1840
+ size = "md",
1841
+ isActive = false,
1842
+ className,
1843
+ ...props
1844
+ }) {
1845
+ const Comp = asChild ? Slot3.Root : "a";
1846
+ return /* @__PURE__ */ jsx21(
1847
+ Comp,
1848
+ {
1849
+ "data-slot": "sidebar-menu-sub-button",
1850
+ "data-sidebar": "menu-sub-button",
1851
+ "data-size": size,
1852
+ "data-active": isActive,
1853
+ className: cn(
1854
+ "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground h-7 gap-2 rounded-md px-2 focus-visible:ring-2 data-[size=md]:text-sm data-[size=sm]:text-xs [&>svg]:size-4 flex min-w-0 -translate-x-px items-center overflow-hidden outline-hidden group-data-[collapsible=icon]:hidden disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:shrink-0",
1855
+ className
1856
+ ),
1857
+ ...props
1858
+ }
1859
+ );
1860
+ }
1861
+
1862
+ // src/components/ui/alert.tsx
1863
+ import { cva as cva5 } from "class-variance-authority";
1864
+ import { jsx as jsx22 } from "react/jsx-runtime";
1865
+ var alertVariants = cva5("grid gap-0.5 rounded-lg border px-4 py-3 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2.5 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4 w-full relative group/alert", {
1866
+ variants: {
1867
+ variant: {
1868
+ default: "bg-card text-card-foreground",
1869
+ destructive: "text-destructive bg-card *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current"
1870
+ }
1871
+ },
1872
+ defaultVariants: {
1873
+ variant: "default"
1874
+ }
1875
+ });
1876
+ function Alert({
1877
+ className,
1878
+ variant,
1879
+ ...props
1880
+ }) {
1881
+ return /* @__PURE__ */ jsx22(
1882
+ "div",
1883
+ {
1884
+ "data-slot": "alert",
1885
+ role: "alert",
1886
+ className: cn(alertVariants({ variant }), className),
1887
+ ...props
1888
+ }
1889
+ );
1890
+ }
1891
+ function AlertTitle({ className, ...props }) {
1892
+ return /* @__PURE__ */ jsx22(
1893
+ "div",
1894
+ {
1895
+ "data-slot": "alert-title",
1896
+ className: cn(
1897
+ "font-medium group-has-[>svg]/alert:col-start-2 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3",
1898
+ className
1899
+ ),
1900
+ ...props
1901
+ }
1902
+ );
1903
+ }
1904
+ function AlertDescription({
1905
+ className,
1906
+ ...props
1907
+ }) {
1908
+ return /* @__PURE__ */ jsx22(
1909
+ "div",
1910
+ {
1911
+ "data-slot": "alert-description",
1912
+ className: cn(
1913
+ "text-muted-foreground text-sm text-balance md:text-pretty [&_p:not(:last-child)]:mb-4 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3",
1914
+ className
1915
+ ),
1916
+ ...props
1917
+ }
1918
+ );
1919
+ }
1920
+
1921
+ // src/components/ui/breadcrumb.tsx
1922
+ import { Slot as Slot4 } from "radix-ui";
1923
+ import { ChevronRight as ChevronRight2, MoreHorizontal } from "lucide-react";
1924
+ import { jsx as jsx23, jsxs as jsxs10 } from "react/jsx-runtime";
1925
+ function Breadcrumb({ className, ...props }) {
1926
+ return /* @__PURE__ */ jsx23(
1927
+ "nav",
1928
+ {
1929
+ "aria-label": "breadcrumb",
1930
+ "data-slot": "breadcrumb",
1931
+ className: cn(className),
1932
+ ...props
1933
+ }
1934
+ );
1935
+ }
1936
+ function BreadcrumbList({ className, ...props }) {
1937
+ return /* @__PURE__ */ jsx23(
1938
+ "ol",
1939
+ {
1940
+ "data-slot": "breadcrumb-list",
1941
+ className: cn(
1942
+ "text-muted-foreground gap-1.5 text-sm sm:gap-2.5 flex flex-wrap items-center wrap-break-word",
1943
+ className
1944
+ ),
1945
+ ...props
1946
+ }
1947
+ );
1948
+ }
1949
+ function BreadcrumbItem({ className, ...props }) {
1950
+ return /* @__PURE__ */ jsx23(
1951
+ "li",
1952
+ {
1953
+ "data-slot": "breadcrumb-item",
1954
+ className: cn("gap-1.5 inline-flex items-center", className),
1955
+ ...props
1956
+ }
1957
+ );
1958
+ }
1959
+ function BreadcrumbLink({
1960
+ asChild,
1961
+ className,
1962
+ ...props
1963
+ }) {
1964
+ const Comp = asChild ? Slot4.Root : "a";
1965
+ return /* @__PURE__ */ jsx23(
1966
+ Comp,
1967
+ {
1968
+ "data-slot": "breadcrumb-link",
1969
+ className: cn("hover:text-foreground transition-colors", className),
1970
+ ...props
1971
+ }
1972
+ );
1973
+ }
1974
+ function BreadcrumbPage({ className, ...props }) {
1975
+ return /* @__PURE__ */ jsx23(
1976
+ "span",
1977
+ {
1978
+ "data-slot": "breadcrumb-page",
1979
+ role: "link",
1980
+ "aria-disabled": "true",
1981
+ "aria-current": "page",
1982
+ className: cn("text-foreground font-normal", className),
1983
+ ...props
1984
+ }
1985
+ );
1986
+ }
1987
+ function BreadcrumbSeparator({
1988
+ children,
1989
+ className,
1990
+ ...props
1991
+ }) {
1992
+ return /* @__PURE__ */ jsx23(
1993
+ "li",
1994
+ {
1995
+ "data-slot": "breadcrumb-separator",
1996
+ role: "presentation",
1997
+ "aria-hidden": "true",
1998
+ className: cn("[&>svg]:size-3.5", className),
1999
+ ...props,
2000
+ children: children ?? /* @__PURE__ */ jsx23(ChevronRight2, {})
2001
+ }
2002
+ );
2003
+ }
2004
+
2005
+ // src/components/ui/collapsible.tsx
2006
+ import { Collapsible as CollapsiblePrimitive } from "radix-ui";
2007
+ import { jsx as jsx24 } from "react/jsx-runtime";
2008
+ function Collapsible({
2009
+ ...props
2010
+ }) {
2011
+ return /* @__PURE__ */ jsx24(CollapsiblePrimitive.Root, { "data-slot": "collapsible", ...props });
2012
+ }
2013
+ function CollapsibleTrigger({
2014
+ ...props
2015
+ }) {
2016
+ return /* @__PURE__ */ jsx24(
2017
+ CollapsiblePrimitive.CollapsibleTrigger,
2018
+ {
2019
+ "data-slot": "collapsible-trigger",
2020
+ ...props
2021
+ }
2022
+ );
2023
+ }
2024
+ function CollapsibleContent({
2025
+ ...props
2026
+ }) {
2027
+ return /* @__PURE__ */ jsx24(
2028
+ CollapsiblePrimitive.CollapsibleContent,
2029
+ {
2030
+ "data-slot": "collapsible-content",
2031
+ ...props
2032
+ }
2033
+ );
2034
+ }
2035
+ export {
2036
+ Alert,
2037
+ AlertDescription,
2038
+ AlertDialog,
2039
+ AlertDialogAction,
2040
+ AlertDialogCancel,
2041
+ AlertDialogContent,
2042
+ AlertDialogDescription,
2043
+ AlertDialogFooter,
2044
+ AlertDialogHeader,
2045
+ AlertDialogOverlay,
2046
+ AlertDialogPortal,
2047
+ AlertDialogTitle,
2048
+ AlertDialogTrigger,
2049
+ AlertTitle,
2050
+ Avatar,
2051
+ AvatarFallback,
2052
+ AvatarImage,
2053
+ Badge,
2054
+ Breadcrumb,
2055
+ BreadcrumbItem,
2056
+ BreadcrumbLink,
2057
+ BreadcrumbList,
2058
+ BreadcrumbPage,
2059
+ BreadcrumbSeparator,
2060
+ Button,
2061
+ Card,
2062
+ CardContent,
2063
+ CardDescription,
2064
+ CardFooter,
2065
+ CardHeader,
2066
+ CardTitle,
2067
+ Collapsible,
2068
+ CollapsibleContent,
2069
+ CollapsibleTrigger,
2070
+ Command,
2071
+ CommandEmpty,
2072
+ CommandGroup,
2073
+ CommandInput,
2074
+ CommandItem,
2075
+ CommandList,
2076
+ CommandSeparator,
2077
+ CommandShortcut,
2078
+ Dialog,
2079
+ DialogClose,
2080
+ DialogContent,
2081
+ DialogDescription,
2082
+ DialogFooter,
2083
+ DialogHeader,
2084
+ DialogOverlay,
2085
+ DialogPortal,
2086
+ DialogTitle,
2087
+ DialogTrigger,
2088
+ DropdownMenu,
2089
+ DropdownMenuContent,
2090
+ DropdownMenuGroup,
2091
+ DropdownMenuItem,
2092
+ DropdownMenuLabel,
2093
+ DropdownMenuSeparator,
2094
+ DropdownMenuTrigger,
2095
+ Input,
2096
+ Label,
2097
+ Progress,
2098
+ ScrollArea,
2099
+ ScrollBar,
2100
+ Select,
2101
+ SelectContent,
2102
+ SelectGroup,
2103
+ SelectItem,
2104
+ SelectLabel,
2105
+ SelectScrollDownButton,
2106
+ SelectScrollUpButton,
2107
+ SelectSeparator,
2108
+ SelectTrigger,
2109
+ SelectValue,
2110
+ Separator,
2111
+ Sheet,
2112
+ SheetClose,
2113
+ SheetContent,
2114
+ SheetDescription,
2115
+ SheetFooter,
2116
+ SheetHeader,
2117
+ SheetTitle,
2118
+ SheetTrigger,
2119
+ Sidebar,
2120
+ SidebarContent,
2121
+ SidebarFooter,
2122
+ SidebarGroup,
2123
+ SidebarGroupContent,
2124
+ SidebarGroupLabel,
2125
+ SidebarHeader,
2126
+ SidebarInset,
2127
+ SidebarMenu,
2128
+ SidebarMenuButton,
2129
+ SidebarMenuItem,
2130
+ SidebarMenuSub,
2131
+ SidebarMenuSubButton,
2132
+ SidebarMenuSubItem,
2133
+ SidebarProvider,
2134
+ SidebarRail,
2135
+ SidebarSeparator,
2136
+ SidebarTrigger,
2137
+ Skeleton,
2138
+ Table,
2139
+ TableBody,
2140
+ TableCaption,
2141
+ TableCell,
2142
+ TableFooter,
2143
+ TableHead,
2144
+ TableHeader,
2145
+ TableRow,
2146
+ Tabs,
2147
+ TabsContent,
2148
+ TabsList,
2149
+ TabsTrigger,
2150
+ Textarea,
2151
+ Tooltip,
2152
+ TooltipContent,
2153
+ TooltipProvider,
2154
+ TooltipTrigger,
2155
+ badgeVariants,
2156
+ buttonVariants,
2157
+ cn,
2158
+ tabsListVariants,
2159
+ useSidebar
2160
+ };
2161
+ //# sourceMappingURL=ui.js.map