@timbal-ai/timbal-react 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +18 -4
  3. package/dist/app.cjs +3532 -1483
  4. package/dist/app.d.cts +75 -30
  5. package/dist/app.d.ts +75 -30
  6. package/dist/app.esm.js +29 -7
  7. package/dist/{chart-artifact-CMnDys2t.d.ts → chart-artifact-2OTDTRwM.d.ts} +194 -40
  8. package/dist/{chart-artifact-C8-Py6lc.d.cts → chart-artifact-CS3qyGIY.d.cts} +194 -40
  9. package/dist/chat.cjs +264 -107
  10. package/dist/chat.d.cts +2 -2
  11. package/dist/chat.d.ts +2 -2
  12. package/dist/chat.esm.js +4 -3
  13. package/dist/chunk-5ECRZ5O7.esm.js +899 -0
  14. package/dist/{chunk-QU7ET55D.esm.js → chunk-AZL2WANO.esm.js} +320 -177
  15. package/dist/{chunk-OH23AX2V.esm.js → chunk-B4XAC4G7.esm.js} +430 -780
  16. package/dist/chunk-EDEKQYSU.esm.js +10 -0
  17. package/dist/{chunk-GQBYZRD7.esm.js → chunk-IGHBLJV3.esm.js} +38 -27
  18. package/dist/{chunk-OFWC4MIY.esm.js → chunk-JYDJRGDE.esm.js} +5 -3
  19. package/dist/{chunk-VOWNCS3F.esm.js → chunk-SZDYIRMB.esm.js} +1567 -490
  20. package/dist/chunk-TZI3ID3C.esm.js +232 -0
  21. package/dist/{chunk-THBA27QY.esm.js → chunk-WMKPT5BV.esm.js} +242 -123
  22. package/dist/{chunk-VXMM2HX7.esm.js → chunk-ZNYAETFD.esm.js} +1 -1
  23. package/dist/{circular-progress-Ci8L-Hfa.d.cts → circular-progress-CDsJwIPF.d.cts} +19 -77
  24. package/dist/{circular-progress-Ci8L-Hfa.d.ts → circular-progress-CDsJwIPF.d.ts} +19 -77
  25. package/dist/index.cjs +5506 -3626
  26. package/dist/index.d.cts +7 -6
  27. package/dist/index.d.ts +7 -6
  28. package/dist/index.esm.js +45 -33
  29. package/dist/kanban-U5xNe9py.d.cts +212 -0
  30. package/dist/kanban-U5xNe9py.d.ts +212 -0
  31. package/dist/{layout-BTJyU8wd.d.ts → layout-B8r6Jbat.d.ts} +1 -1
  32. package/dist/{layout-C2G-FcER.d.cts → layout-Cu7Ijn04.d.cts} +1 -1
  33. package/dist/site.cjs +358 -0
  34. package/dist/site.d.cts +184 -0
  35. package/dist/site.d.ts +184 -0
  36. package/dist/site.esm.js +322 -0
  37. package/dist/studio.cjs +702 -343
  38. package/dist/studio.d.cts +1 -1
  39. package/dist/studio.d.ts +1 -1
  40. package/dist/studio.esm.js +7 -5
  41. package/dist/styles.css +56 -0
  42. package/dist/{timbal-v2-button-CNfdwGq4.d.cts → timbal-v2-button-B7vPs7gg.d.cts} +2 -2
  43. package/dist/{timbal-v2-button-CNfdwGq4.d.ts → timbal-v2-button-B7vPs7gg.d.ts} +2 -2
  44. package/dist/ui.cjs +1504 -659
  45. package/dist/ui.d.cts +11 -4
  46. package/dist/ui.d.ts +11 -4
  47. package/dist/ui.esm.js +35 -26
  48. package/dist/{welcome-DXqsGTwH.d.ts → welcome-DduQAC4K.d.ts} +4 -0
  49. package/dist/{welcome-BFGRoNfK.d.cts → welcome-NXZlcihe.d.cts} +4 -0
  50. package/package.json +9 -1
  51. package/dist/button-BoyX5pM_.d.cts +0 -18
  52. package/dist/button-BoyX5pM_.d.ts +0 -18
  53. package/dist/chunk-UCGVL7ZY.esm.js +0 -52
package/dist/ui.cjs CHANGED
@@ -169,6 +169,7 @@ __export(ui_exports, {
169
169
  InputOTPHiddenInput: () => InputOTPHiddenInput,
170
170
  InputOTPSeparator: () => InputOTPSeparator,
171
171
  InputOTPSlot: () => InputOTPSlot,
172
+ Kanban: () => Kanban,
172
173
  Kbd: () => Kbd,
173
174
  KbdGroup: () => KbdGroup,
174
175
  Label: () => Label,
@@ -273,6 +274,7 @@ __export(ui_exports, {
273
274
  TooltipContent: () => TooltipContent,
274
275
  TooltipProvider: () => TooltipProvider,
275
276
  TooltipTrigger: () => TooltipTrigger,
277
+ UntitledButton: () => UntitledButton,
276
278
  alertVariants: () => alertVariants,
277
279
  avatarChartVariantClass: () => avatarChartVariantClass,
278
280
  badgeVariants: () => badgeVariants,
@@ -286,6 +288,7 @@ __export(ui_exports, {
286
288
  overlaySurfaceClass: () => overlaySurfaceClass,
287
289
  toast: () => toast,
288
290
  toggleVariants: () => toggleVariants,
291
+ untitledButtonVariants: () => untitledButtonVariants,
289
292
  useChart: () => useChart,
290
293
  useToast: () => useToast
291
294
  });
@@ -293,6 +296,7 @@ module.exports = __toCommonJS(ui_exports);
293
296
 
294
297
  // src/ui/button.tsx
295
298
  var import_class_variance_authority = require("class-variance-authority");
299
+ var import_radix_ui = require("radix-ui");
296
300
 
297
301
  // src/utils.ts
298
302
  var import_clsx = require("clsx");
@@ -301,6 +305,387 @@ function cn(...inputs) {
301
305
  return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
302
306
  }
303
307
 
308
+ // src/ui/button.tsx
309
+ var import_jsx_runtime = require("react/jsx-runtime");
310
+ var SOLID_SKEUOMORPHIC_SHADOW = "shadow-skeuomorphic-solid";
311
+ var BORDERED_SKEUOMORPHIC_SHADOW = "shadow-skeuomorphic-bordered";
312
+ var buttonVariants = (0, import_class_variance_authority.cva)(
313
+ cn(
314
+ "relative inline-flex shrink-0 cursor-pointer select-none items-center justify-center whitespace-nowrap font-medium",
315
+ "transition-all duration-300 ease-in-out outline-none border",
316
+ "focus-visible:ring-4 focus-visible:ring-primary/20 focus-visible:ring-offset-0",
317
+ "disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:pointer-events-none",
318
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-5",
319
+ // Overflow hidden can clip out-of-bounds shadow, so we use precise overflow management and rounded-[inherit] on pseudo overlays
320
+ "after:absolute after:inset-0 after:rounded-[inherit] after:pointer-events-none after:transition-opacity after:duration-300 after:ease-in-out after:opacity-0"
321
+ ),
322
+ {
323
+ variants: {
324
+ color: {
325
+ primary: cn(
326
+ // Exact Premium Untitled UI primary BLACK / dark charcoal: gradient + borders
327
+ "bg-gradient-to-b from-[#344054] to-[#0F1117] text-white border-[#1A1E29]",
328
+ "hover:border-[#181C26]",
329
+ "active:border-[#0A0D14]",
330
+ SOLID_SKEUOMORPHIC_SHADOW,
331
+ // Hover/active overlays for beautiful animation (the gradient is static, the overlay opacity is transitioned)
332
+ "after:bg-white/[0.08] hover:after:opacity-100 active:after:bg-black/[0.12]",
333
+ // Premium Dark Mode inversion: Primary becomes white, popping out elegantly
334
+ "dark:bg-gradient-to-b dark:from-white dark:to-[#F9FAFB] dark:text-[#10121C] dark:border-white",
335
+ "dark:hover:border-[#D0D5DD] dark:hover:text-[#10121C]",
336
+ "dark:shadow-skeuomorphic-bordered",
337
+ "dark:after:bg-black/[0.04] dark:active:after:bg-black/[0.08]"
338
+ ),
339
+ secondary: cn(
340
+ // Exact Untitled UI secondary: premium white/gray gradient + borders
341
+ "bg-gradient-to-b from-white to-[#F9FAFB] text-[#344054] border-[#D0D5DD]",
342
+ "hover:text-[#1D2939] hover:border-[#D0D5DD]",
343
+ BORDERED_SKEUOMORPHIC_SHADOW,
344
+ // Hover/active overlays for white/gray gradient
345
+ "after:bg-black/[0.03] hover:after:opacity-100 active:after:bg-black/[0.08]",
346
+ // Premium Dark Mode inversion: Secondary becomes dark charcoal/gray, merging into the background
347
+ "dark:bg-gradient-to-b dark:from-[#1F242F] dark:to-[#10121C] dark:text-[#D1D5DB] dark:border-[#344054]",
348
+ "dark:hover:border-[#475467] dark:hover:text-white",
349
+ "dark:shadow-skeuomorphic-solid",
350
+ "dark:after:bg-white/[0.06] dark:active:after:bg-black/[0.15]"
351
+ ),
352
+ tertiary: cn(
353
+ "bg-transparent text-[#475467] border-transparent",
354
+ "hover:bg-[#F9FAFB] hover:text-[#344054]",
355
+ "active:bg-[#F2F4F7] active:text-[#1D2939]",
356
+ "after:hidden",
357
+ // No overlay needed for transparent surfaces
358
+ // Dark Mode
359
+ "dark:text-[#9CA3AF] dark:hover:bg-[#1F242F] dark:hover:text-white dark:active:bg-[#11131A]"
360
+ ),
361
+ link: cn(
362
+ "h-auto! bg-transparent p-0! border-transparent text-[#1F242F] hover:text-[#10121C]",
363
+ "hover:underline",
364
+ "after:hidden",
365
+ // Dark Mode
366
+ "dark:text-[#9CA3AF] dark:hover:text-white"
367
+ ),
368
+ "primary-destructive": cn(
369
+ // Exact Untitled UI primary destructive: premium red gradient + borders (vibrant and subtle, not too dark)
370
+ "bg-gradient-to-b from-[#D92D20] to-[#B42318] text-white border-[#B42318]",
371
+ "hover:border-[#9E1B12]",
372
+ "active:border-[#84140D]",
373
+ SOLID_SKEUOMORPHIC_SHADOW,
374
+ // Destructive red hover/active overlays
375
+ "after:bg-white/[0.12] hover:after:opacity-100 active:after:bg-black/[0.15]"
376
+ ),
377
+ "secondary-destructive": cn(
378
+ // Exact Untitled UI secondary destructive: soft red bordered
379
+ "bg-gradient-to-b from-white to-[#F9FAFB] text-[#B42318] border-[#FDA29B]",
380
+ "hover:text-[#9E1B12] hover:border-[#FDA29B]",
381
+ BORDERED_SKEUOMORPHIC_SHADOW,
382
+ // Hover overlay
383
+ "after:bg-red-500/[0.04] hover:after:opacity-100 active:after:bg-red-950/[0.08]",
384
+ // Dark Mode Secondary Destructive: Charcoal fill with red borders and label
385
+ "dark:bg-gradient-to-b dark:from-[#1F242F] dark:to-[#10121C] dark:text-[#F87171] dark:border-[#9E1B12]/50",
386
+ "dark:hover:border-[#F87171]/40",
387
+ "dark:shadow-skeuomorphic-solid",
388
+ "dark:after:bg-white/[0.06] dark:active:after:bg-black/[0.15]"
389
+ )
390
+ },
391
+ size: {
392
+ xs: "h-8 gap-1 rounded-md px-2.5 text-xs",
393
+ sm: "h-9 gap-1.5 rounded-lg px-3 text-sm",
394
+ md: "h-10 gap-1.5 rounded-lg px-3.5 text-sm",
395
+ lg: "h-11 gap-2 rounded-lg px-4 text-base",
396
+ xl: "h-12 gap-2 rounded-lg px-5 text-base",
397
+ default: "h-10 gap-1.5 rounded-lg px-3.5 text-sm",
398
+ icon: "h-10 w-10 rounded-lg",
399
+ "icon-xs": "h-8 w-8 rounded-md",
400
+ "icon-sm": "h-9 w-9 rounded-lg",
401
+ "icon-lg": "h-11 w-11 rounded-lg"
402
+ },
403
+ shape: {
404
+ pill: "rounded-full!",
405
+ rounded: ""
406
+ // defaults to the size variant's standard rounded-lg
407
+ }
408
+ },
409
+ defaultVariants: {
410
+ color: "primary",
411
+ size: "default",
412
+ shape: "rounded"
413
+ }
414
+ }
415
+ );
416
+ function Button({
417
+ className,
418
+ variant,
419
+ color,
420
+ size,
421
+ shape,
422
+ iconLeading,
423
+ iconTrailing,
424
+ isLoading = false,
425
+ asChild = false,
426
+ disabled,
427
+ type = "button",
428
+ children,
429
+ ...props
430
+ }) {
431
+ const isDisabled = disabled || isLoading;
432
+ let resolvedColor = "primary";
433
+ if (color) {
434
+ resolvedColor = color;
435
+ } else if (variant) {
436
+ if (variant === "default" || variant === "informative") resolvedColor = "primary";
437
+ else if (variant === "secondary" || variant === "outline") resolvedColor = "secondary";
438
+ else if (variant === "destructive") resolvedColor = "primary-destructive";
439
+ else if (variant === "ghost") resolvedColor = "tertiary";
440
+ else if (variant === "link") resolvedColor = "link";
441
+ }
442
+ const classes = cn(
443
+ buttonVariants({
444
+ color: resolvedColor,
445
+ size: size ?? "default",
446
+ shape: shape ?? "rounded"
447
+ }),
448
+ className
449
+ );
450
+ if (asChild) {
451
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
452
+ import_radix_ui.Slot.Root,
453
+ {
454
+ className: classes,
455
+ "aria-disabled": isDisabled ? true : void 0,
456
+ "data-slot": "button",
457
+ "data-variant": resolvedColor,
458
+ ...props,
459
+ children
460
+ }
461
+ );
462
+ }
463
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
464
+ "button",
465
+ {
466
+ type,
467
+ disabled: isDisabled,
468
+ "data-slot": "button",
469
+ "data-variant": resolvedColor,
470
+ className: classes,
471
+ ...props,
472
+ children: [
473
+ isLoading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
474
+ "span",
475
+ {
476
+ "aria-hidden": true,
477
+ className: "size-4 animate-spin rounded-full border-2 border-current border-t-transparent"
478
+ }
479
+ ) : iconLeading,
480
+ children,
481
+ !isLoading ? iconTrailing : null
482
+ ]
483
+ }
484
+ );
485
+ }
486
+
487
+ // src/ui/untitled-button.tsx
488
+ var import_class_variance_authority2 = require("class-variance-authority");
489
+ var import_radix_ui2 = require("radix-ui");
490
+ var import_jsx_runtime2 = require("react/jsx-runtime");
491
+ var SOLID_SKEUOMORPHIC_SHADOW2 = "shadow-skeuomorphic-solid";
492
+ var BORDERED_SKEUOMORPHIC_SHADOW2 = "shadow-skeuomorphic-bordered";
493
+ var untitledButtonVariants = (0, import_class_variance_authority2.cva)(
494
+ cn(
495
+ "relative inline-flex shrink-0 cursor-pointer select-none items-center justify-center whitespace-nowrap font-medium",
496
+ "transition-all duration-300 ease-in-out outline-none border",
497
+ "focus-visible:ring-4 focus-visible:ring-primary/20 focus-visible:ring-offset-0",
498
+ "disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50",
499
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-5",
500
+ // Overflow hidden can clip out-of-bounds shadow, so we use precise overflow management and rounded-[inherit] on pseudo overlays
501
+ "after:absolute after:inset-0 after:rounded-[inherit] after:pointer-events-none after:transition-opacity after:duration-300 after:ease-in-out after:opacity-0"
502
+ ),
503
+ {
504
+ variants: {
505
+ color: {
506
+ primary: cn(
507
+ // Exact Premium Untitled UI primary BLACK / dark charcoal: gradient + borders
508
+ "bg-gradient-to-b from-[#344054] to-[#0F1117] text-white border-[#1A1E29]",
509
+ "hover:border-[#181C26]",
510
+ "active:border-[#0A0D14]",
511
+ SOLID_SKEUOMORPHIC_SHADOW2,
512
+ // Hover/active overlays for beautiful animation (the gradient is static, the overlay opacity is transitioned)
513
+ "after:bg-white/[0.08] hover:after:opacity-100 active:after:bg-black/[0.12]",
514
+ // Premium Dark Mode inversion: Primary becomes white, popping out elegantly
515
+ "dark:bg-gradient-to-b dark:from-white dark:to-[#F9FAFB] dark:text-[#10121C] dark:border-white",
516
+ "dark:hover:border-[#D0D5DD] dark:hover:text-[#10121C]",
517
+ "dark:shadow-skeuomorphic-bordered",
518
+ "dark:after:bg-black/[0.04] dark:active:after:bg-black/[0.08]"
519
+ ),
520
+ secondary: cn(
521
+ // Exact Untitled UI secondary: premium white/gray gradient + borders
522
+ "bg-gradient-to-b from-white to-[#F9FAFB] text-[#344054] border-[#D0D5DD]",
523
+ "hover:text-[#1D2939] hover:border-[#D0D5DD]",
524
+ BORDERED_SKEUOMORPHIC_SHADOW2,
525
+ // Hover/active overlays for white/gray gradient
526
+ "after:bg-black/[0.03] hover:after:opacity-100 active:after:bg-black/[0.08]",
527
+ // Premium Dark Mode inversion: Secondary becomes dark charcoal/gray, merging into the background
528
+ "dark:bg-gradient-to-b dark:from-[#1F242F] dark:to-[#10121C] dark:text-[#D1D5DB] dark:border-[#344054]",
529
+ "dark:hover:border-[#475467] dark:hover:text-white",
530
+ "dark:shadow-skeuomorphic-solid",
531
+ "dark:after:bg-white/[0.06] dark:active:after:bg-black/[0.15]"
532
+ ),
533
+ tertiary: cn(
534
+ "bg-transparent text-[#475467] border-transparent",
535
+ "hover:bg-[#F9FAFB] hover:text-[#344054]",
536
+ "active:bg-[#F2F4F7] active:text-[#1D2939]",
537
+ "after:hidden",
538
+ // No overlay needed for transparent surfaces
539
+ // Dark Mode
540
+ "dark:text-[#9CA3AF] dark:hover:bg-[#1F242F] dark:hover:text-white dark:active:bg-[#11131A]"
541
+ ),
542
+ link: cn(
543
+ "h-auto! bg-transparent p-0! border-transparent text-[#1F242F] hover:text-[#10121C]",
544
+ "hover:underline",
545
+ "after:hidden",
546
+ // Dark Mode
547
+ "dark:text-[#9CA3AF] dark:hover:text-white"
548
+ ),
549
+ "primary-destructive": cn(
550
+ // Exact Untitled UI primary destructive: premium red gradient + borders (vibrant and subtle, not too dark)
551
+ "bg-gradient-to-b from-[#D92D20] to-[#B42318] text-white border-[#B42318]",
552
+ "hover:border-[#9E1B12]",
553
+ "active:border-[#84140D]",
554
+ SOLID_SKEUOMORPHIC_SHADOW2,
555
+ // Destructive red hover/active overlays
556
+ "after:bg-white/[0.12] hover:after:opacity-100 active:after:bg-black/[0.15]"
557
+ ),
558
+ "secondary-destructive": cn(
559
+ // Exact Untitled UI secondary destructive: soft red bordered
560
+ "bg-gradient-to-b from-white to-[#F9FAFB] text-[#B42318] border-[#FDA29B]",
561
+ "hover:text-[#9E1B12] hover:border-[#FDA29B]",
562
+ BORDERED_SKEUOMORPHIC_SHADOW2,
563
+ // Hover overlay
564
+ "after:bg-red-500/[0.04] hover:after:opacity-100 active:after:bg-red-950/[0.08]",
565
+ // Dark Mode Secondary Destructive: Charcoal fill with red borders and label
566
+ "dark:bg-gradient-to-b dark:from-[#1F242F] dark:to-[#10121C] dark:text-[#F87171] dark:border-[#9E1B12]/50",
567
+ "dark:hover:border-[#F87171]/40",
568
+ "dark:shadow-skeuomorphic-solid",
569
+ "dark:after:bg-white/[0.06] dark:active:after:bg-black/[0.15]"
570
+ )
571
+ },
572
+ size: {
573
+ sm: "h-9 gap-1.5 rounded-lg px-3 text-sm",
574
+ md: "h-10 gap-1.5 rounded-lg px-3.5 text-sm",
575
+ lg: "h-11 gap-2 rounded-lg px-4 text-base",
576
+ xl: "h-12 gap-2 rounded-lg px-5 text-base"
577
+ }
578
+ },
579
+ defaultVariants: {
580
+ color: "primary",
581
+ size: "md"
582
+ }
583
+ }
584
+ );
585
+ function UntitledButton({
586
+ className,
587
+ color,
588
+ size,
589
+ iconLeading,
590
+ iconTrailing,
591
+ isLoading = false,
592
+ asChild = false,
593
+ disabled,
594
+ type = "button",
595
+ children,
596
+ ...props
597
+ }) {
598
+ const isDisabled = disabled || isLoading;
599
+ const classes = cn(untitledButtonVariants({ color, size }), className);
600
+ if (asChild) {
601
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
602
+ import_radix_ui2.Slot.Root,
603
+ {
604
+ className: classes,
605
+ "aria-disabled": isDisabled ? true : void 0,
606
+ "data-slot": "untitled-button",
607
+ ...props,
608
+ children
609
+ }
610
+ );
611
+ }
612
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
613
+ "button",
614
+ {
615
+ type,
616
+ disabled: isDisabled,
617
+ "data-slot": "untitled-button",
618
+ className: classes,
619
+ ...props,
620
+ children: [
621
+ isLoading ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
622
+ "span",
623
+ {
624
+ "aria-hidden": true,
625
+ className: "size-4 animate-spin rounded-full border-2 border-current border-t-transparent"
626
+ }
627
+ ) : iconLeading,
628
+ children,
629
+ !isLoading ? iconTrailing : null
630
+ ]
631
+ }
632
+ );
633
+ }
634
+
635
+ // src/ui/tooltip.tsx
636
+ var import_radix_ui3 = require("radix-ui");
637
+ var import_jsx_runtime3 = require("react/jsx-runtime");
638
+ function TooltipProvider({
639
+ delayDuration = 0,
640
+ ...props
641
+ }) {
642
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
643
+ import_radix_ui3.Tooltip.Provider,
644
+ {
645
+ "data-slot": "tooltip-provider",
646
+ delayDuration,
647
+ ...props
648
+ }
649
+ );
650
+ }
651
+ function Tooltip({
652
+ ...props
653
+ }) {
654
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_radix_ui3.Tooltip.Root, { "data-slot": "tooltip", ...props });
655
+ }
656
+ function TooltipTrigger({
657
+ ...props
658
+ }) {
659
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_radix_ui3.Tooltip.Trigger, { "data-slot": "tooltip-trigger", ...props });
660
+ }
661
+ function TooltipContent({
662
+ className,
663
+ sideOffset = 0,
664
+ children,
665
+ ...props
666
+ }) {
667
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_radix_ui3.Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
668
+ import_radix_ui3.Tooltip.Content,
669
+ {
670
+ "data-slot": "tooltip-content",
671
+ sideOffset,
672
+ className: cn(
673
+ "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-2.5 py-1 text-xs text-balance",
674
+ className
675
+ ),
676
+ ...props,
677
+ children: [
678
+ children,
679
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_radix_ui3.Tooltip.Arrow, { className: "bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" })
680
+ ]
681
+ }
682
+ ) });
683
+ }
684
+
685
+ // src/ui/avatar.tsx
686
+ var React = __toESM(require("react"), 1);
687
+ var import_radix_ui4 = require("radix-ui");
688
+
304
689
  // src/design/button-tokens.ts
305
690
  var TIMBAL_V2_ELEVATED_GRADIENT = "bg-gradient-to-b from-elevated-from to-elevated-to";
306
691
  var TIMBAL_V2_MODAL_SURFACE = cn(
@@ -308,14 +693,6 @@ var TIMBAL_V2_MODAL_SURFACE = cn(
308
693
  "border border-border shadow-card-elevated"
309
694
  );
310
695
  var TIMBAL_V2_PRIMARY_GRADIENT = "bg-gradient-to-b from-primary-fill-from to-primary-fill-to";
311
- var TIMBAL_V2_FROM_LEGACY_BUTTON = {
312
- default: "primary",
313
- destructive: "destructive",
314
- outline: "secondary",
315
- secondary: "secondary",
316
- ghost: "ghost",
317
- link: "link"
318
- };
319
696
  var TIMBAL_V2_SIZE_HEIGHT = {
320
697
  xs: "min-h-8 h-8",
321
698
  sm: "min-h-9 h-9",
@@ -351,6 +728,11 @@ var TIMBAL_V2_FILL = {
351
728
  "group-hover/tbv2:from-destructive-fill-hover-from group-hover/tbv2:to-destructive-fill-hover-to",
352
729
  "group-active/tbv2:from-destructive-fill-active-from group-active/tbv2:to-destructive-fill-active-to"
353
730
  ].join(" "),
731
+ "destructive-solid": [
732
+ "bg-gradient-to-b from-destructive-solid-from to-destructive-solid-to",
733
+ "group-hover/tbv2:from-destructive-solid-hover-from group-hover/tbv2:to-destructive-solid-hover-to",
734
+ "group-active/tbv2:from-destructive-solid-active-from group-active/tbv2:to-destructive-solid-active-to"
735
+ ].join(" "),
354
736
  secondary: [
355
737
  TIMBAL_V2_ELEVATED_GRADIENT,
356
738
  "group-hover/tbv2:from-secondary-fill-hover-from group-hover/tbv2:to-secondary-fill-hover-to",
@@ -367,6 +749,7 @@ var TIMBAL_V2_LABEL = {
367
749
  primary: "text-primary-foreground",
368
750
  informative: "text-primary-foreground",
369
751
  destructive: "text-destructive",
752
+ "destructive-solid": "text-destructive-foreground",
370
753
  secondary: "text-foreground",
371
754
  ghost: "text-foreground",
372
755
  link: "text-foreground underline decoration-foreground/25 underline-offset-2 group-hover/tbv2:decoration-foreground/45"
@@ -375,6 +758,7 @@ var TIMBAL_V2_BORDER = {
375
758
  primary: "",
376
759
  informative: "border border-foreground/15",
377
760
  destructive: "border border-destructive/45",
761
+ "destructive-solid": "",
378
762
  secondary: "border border-border",
379
763
  ghost: "",
380
764
  link: ""
@@ -383,6 +767,7 @@ var TIMBAL_V2_SHADOW = {
383
767
  primary: "shadow-card",
384
768
  informative: "shadow-card",
385
769
  destructive: "shadow-card",
770
+ "destructive-solid": "shadow-card",
386
771
  secondary: "shadow-card",
387
772
  ghost: "",
388
773
  link: ""
@@ -420,270 +805,26 @@ var TIMBAL_V2_SWITCH_TRACK_OFF = cn(
420
805
  );
421
806
  var TIMBAL_V2_SWITCH_THUMB = cn(
422
807
  TIMBAL_V2_ELEVATED_GRADIENT,
423
- "border border-border/80 shadow-sm"
424
- );
425
- var TIMBAL_V2_ELEVATED_SURFACE = cn(
426
- TIMBAL_V2_ELEVATED_GRADIENT,
427
- "border border-border shadow-card"
428
- );
429
- var TIMBAL_V2_SECONDARY_CHROME = [
430
- TIMBAL_V2_ELEVATED_GRADIENT,
431
- "border border-border shadow-card",
432
- "transition-[background-color,box-shadow,border-color] duration-200 ease-in-out",
433
- "hover:from-secondary-fill-hover-from hover:to-secondary-fill-hover-to",
434
- "active:from-secondary-fill-active-from active:to-secondary-fill-active-to"
435
- ].join(" ");
436
- var TIMBAL_V2_LOGO_TILE = cn(
437
- "bg-gradient-to-b from-white to-neutral-100",
438
- "border border-neutral-200",
439
- "shadow-[0_1px_2px_-0.5px_rgba(0,0,0,0.08)]"
440
- );
441
-
442
- // src/ui/timbal-v2-button.tsx
443
- var React = __toESM(require("react"), 1);
444
- var import_radix_ui = require("radix-ui");
445
- var import_jsx_runtime = require("react/jsx-runtime");
446
- var TIMBAL_V2_FILL_AS_CHILD = {
447
- primary: [
448
- "bg-gradient-to-b from-primary-fill-from to-primary-fill-to",
449
- "hover:from-primary-fill-hover-from hover:to-primary-fill-hover-to",
450
- "active:from-primary-fill-active-from active:to-primary-fill-active-to"
451
- ].join(" "),
452
- informative: [
453
- TIMBAL_V2_PRIMARY_GRADIENT,
454
- "hover:from-primary-fill-hover-from hover:to-primary-fill-hover-to",
455
- "active:from-primary-fill-active-from active:to-primary-fill-active-to",
456
- "active:[background-image:linear-gradient(to_top,rgba(0,0,0,0.08),transparent_55%)]"
457
- ].join(" "),
458
- destructive: [
459
- TIMBAL_V2_ELEVATED_GRADIENT,
460
- "hover:from-destructive-fill-hover-from hover:to-destructive-fill-hover-to",
461
- "active:from-destructive-fill-active-from active:to-destructive-fill-active-to"
462
- ].join(" "),
463
- secondary: [
464
- TIMBAL_V2_ELEVATED_GRADIENT,
465
- "hover:from-secondary-fill-hover-from hover:to-secondary-fill-hover-to",
466
- "active:from-secondary-fill-active-from active:to-secondary-fill-active-to"
467
- ].join(" "),
468
- ghost: [
469
- "bg-transparent",
470
- "hover:bg-ghost-fill-hover",
471
- "active:bg-ghost-fill-active"
472
- ].join(" "),
473
- link: "bg-transparent"
474
- };
475
- var TIMBAL_V2_LABEL_AS_CHILD = {
476
- ...TIMBAL_V2_LABEL,
477
- link: "text-foreground underline decoration-foreground/25 underline-offset-2 hover:decoration-foreground/45"
478
- };
479
- var TimbalV2Button = React.forwardRef(function TimbalV2Button2({
480
- variant = "secondary",
481
- size = "sm",
482
- isIconOnly = false,
483
- isLoading = false,
484
- fullWidth = false,
485
- shape: _shape = "pill",
486
- asChild = false,
487
- className,
488
- disabled,
489
- type = "button",
490
- children,
491
- ...props
492
- }, ref) {
493
- const isDisabled = disabled || isLoading;
494
- const sizeClass2 = isIconOnly ? TIMBAL_V2_SIZE_ICON[size] : TIMBAL_V2_SIZE_HEIGHT[size];
495
- const radiusClass = "rounded-full";
496
- const sharedRootClass = cn(
497
- "relative box-border inline-flex items-center justify-center gap-2 whitespace-nowrap border-0 text-sm font-normal shadow-none transition duration-200 ease-in-out",
498
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/60 focus-visible:ring-offset-1 focus-visible:ring-offset-background",
499
- sizeClass2,
500
- radiusClass,
501
- TIMBAL_V2_BORDER[variant],
502
- TIMBAL_V2_SHADOW[variant],
503
- fullWidth && "w-full",
504
- isDisabled && "pointer-events-none opacity-50",
505
- className
506
- );
507
- if (asChild) {
508
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
509
- import_radix_ui.Slot.Root,
510
- {
511
- ref,
512
- "aria-disabled": isDisabled ? true : void 0,
513
- "data-slot": "timbal-v2-button",
514
- "data-variant": variant,
515
- className: cn(
516
- sharedRootClass,
517
- TIMBAL_V2_FILL_AS_CHILD[variant],
518
- !isIconOnly && TIMBAL_V2_SIZE_LABEL_PX[size],
519
- TIMBAL_V2_LABEL_AS_CHILD[variant]
520
- ),
521
- ...props,
522
- children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "size-4 animate-spin rounded-full border-2 border-current border-t-transparent" }) : children
523
- }
524
- );
525
- }
526
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
527
- "button",
528
- {
529
- ref,
530
- type,
531
- disabled: isDisabled,
532
- "data-slot": "timbal-v2-button",
533
- "data-variant": variant,
534
- className: cn(
535
- "group/tbv2 flex-col items-stretch overflow-hidden bg-transparent p-0",
536
- sharedRootClass
537
- ),
538
- ...props,
539
- children: [
540
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
541
- "span",
542
- {
543
- "aria-hidden": true,
544
- className: cn(
545
- "pointer-events-none absolute inset-0 transition duration-200 ease-in-out",
546
- TIMBAL_V2_FILL[variant]
547
- )
548
- }
549
- ),
550
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
551
- "span",
552
- {
553
- className: cn(
554
- "relative z-10 flex min-h-0 flex-1 items-center justify-center gap-1 leading-tight",
555
- !isIconOnly && TIMBAL_V2_SIZE_LABEL_PX[size],
556
- TIMBAL_V2_LABEL[variant]
557
- ),
558
- children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "size-4 animate-spin rounded-full border-2 border-current border-t-transparent" }) : children
559
- }
560
- )
561
- ]
562
- }
563
- );
564
- });
565
-
566
- // src/ui/button.tsx
567
- var import_jsx_runtime2 = require("react/jsx-runtime");
568
- var LEGACY_SIZE_TO_V2 = {
569
- default: "md",
570
- xs: "xs",
571
- sm: "sm",
572
- lg: "lg",
573
- icon: "sm",
574
- "icon-xs": "xs",
575
- "icon-sm": "sm",
576
- "icon-lg": "lg"
577
- };
578
- var buttonVariants = (0, import_class_variance_authority.cva)(
579
- "inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0",
580
- {
581
- variants: {
582
- variant: {
583
- default: "",
584
- destructive: "",
585
- outline: "",
586
- secondary: "",
587
- ghost: "",
588
- link: ""
589
- },
590
- size: {
591
- default: "",
592
- xs: "",
593
- sm: "",
594
- lg: "",
595
- icon: "",
596
- "icon-xs": "",
597
- "icon-sm": "",
598
- "icon-lg": ""
599
- }
600
- },
601
- defaultVariants: {
602
- variant: "default",
603
- size: "default"
604
- }
605
- }
808
+ "border border-border/80 shadow-sm"
809
+ );
810
+ var TIMBAL_V2_ELEVATED_SURFACE = cn(
811
+ TIMBAL_V2_ELEVATED_GRADIENT,
812
+ "border border-border shadow-card"
813
+ );
814
+ var TIMBAL_V2_SECONDARY_CHROME = [
815
+ TIMBAL_V2_ELEVATED_GRADIENT,
816
+ "border border-border shadow-card",
817
+ "transition-[background-color,box-shadow,border-color] duration-200 ease-in-out",
818
+ "hover:from-secondary-fill-hover-from hover:to-secondary-fill-hover-to",
819
+ "active:from-secondary-fill-active-from active:to-secondary-fill-active-to"
820
+ ].join(" ");
821
+ var TIMBAL_V2_LOGO_TILE = cn(
822
+ "bg-gradient-to-b from-white to-neutral-100",
823
+ "border border-neutral-200",
824
+ "shadow-[0_1px_2px_-0.5px_rgba(0,0,0,0.08)]"
606
825
  );
607
- function Button({
608
- className,
609
- variant = "default",
610
- size = "default",
611
- asChild = false,
612
- ...props
613
- }) {
614
- const v2Variant = TIMBAL_V2_FROM_LEGACY_BUTTON[variant ?? "default"];
615
- const v2Size = LEGACY_SIZE_TO_V2[size ?? "default"];
616
- const isIconOnly = typeof size === "string" && size.startsWith("icon");
617
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
618
- TimbalV2Button,
619
- {
620
- "data-slot": "button",
621
- "data-variant": variant,
622
- "data-size": size,
623
- variant: v2Variant,
624
- size: v2Size,
625
- shape: "pill",
626
- isIconOnly,
627
- asChild,
628
- className: cn(buttonVariants({ variant, size, className })),
629
- ...props
630
- }
631
- );
632
- }
633
-
634
- // src/ui/tooltip.tsx
635
- var import_radix_ui2 = require("radix-ui");
636
- var import_jsx_runtime3 = require("react/jsx-runtime");
637
- function TooltipProvider({
638
- delayDuration = 0,
639
- ...props
640
- }) {
641
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
642
- import_radix_ui2.Tooltip.Provider,
643
- {
644
- "data-slot": "tooltip-provider",
645
- delayDuration,
646
- ...props
647
- }
648
- );
649
- }
650
- function Tooltip({
651
- ...props
652
- }) {
653
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_radix_ui2.Tooltip.Root, { "data-slot": "tooltip", ...props });
654
- }
655
- function TooltipTrigger({
656
- ...props
657
- }) {
658
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_radix_ui2.Tooltip.Trigger, { "data-slot": "tooltip-trigger", ...props });
659
- }
660
- function TooltipContent({
661
- className,
662
- sideOffset = 0,
663
- children,
664
- ...props
665
- }) {
666
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_radix_ui2.Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
667
- import_radix_ui2.Tooltip.Content,
668
- {
669
- "data-slot": "tooltip-content",
670
- sideOffset,
671
- className: cn(
672
- "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
673
- className
674
- ),
675
- ...props,
676
- children: [
677
- children,
678
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_radix_ui2.Tooltip.Arrow, { className: "bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" })
679
- ]
680
- }
681
- ) });
682
- }
683
826
 
684
827
  // src/ui/avatar.tsx
685
- var React2 = __toESM(require("react"), 1);
686
- var import_radix_ui3 = require("radix-ui");
687
828
  var import_jsx_runtime4 = require("react/jsx-runtime");
688
829
  var AVATAR_PRIMARY_FALLBACK_CLASS = cn(
689
830
  TIMBAL_V2_SECONDARY_PILL_ROOT,
@@ -693,11 +834,11 @@ var AVATAR_PRIMARY_FALLBACK_CLASS = cn(
693
834
  var AVATAR_SECONDARY_FILL_STYLE = {
694
835
  backgroundImage: "linear-gradient(to bottom, var(--elevated-from), var(--elevated-to))"
695
836
  };
696
- var AvatarChromeContext = React2.createContext(
837
+ var AvatarChromeContext = React.createContext(
697
838
  null
698
839
  );
699
840
  function useAvatarChrome() {
700
- return React2.useContext(AvatarChromeContext);
841
+ return React.useContext(AvatarChromeContext);
701
842
  }
702
843
  function isBrandedVariant(variant) {
703
844
  return variant === "secondary" || variant === "primary" || variant === "chart";
@@ -717,15 +858,15 @@ function Avatar({
717
858
  children,
718
859
  ...props
719
860
  }) {
720
- const [chrome, setChrome] = React2.useState(rootVariant ?? "muted");
721
- React2.useLayoutEffect(() => {
861
+ const [chrome, setChrome] = React.useState(rootVariant ?? "muted");
862
+ React.useLayoutEffect(() => {
722
863
  if (rootVariant !== void 0) {
723
864
  setChrome(rootVariant);
724
865
  }
725
866
  }, [rootVariant]);
726
867
  const branded = isBrandedVariant(chrome);
727
868
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(AvatarChromeContext.Provider, { value: { chrome, setChrome }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
728
- import_radix_ui3.Avatar.Root,
869
+ import_radix_ui4.Avatar.Root,
729
870
  {
730
871
  "data-slot": "avatar",
731
872
  "data-size": size,
@@ -756,7 +897,7 @@ function AvatarImage({
756
897
  ...props
757
898
  }) {
758
899
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
759
- import_radix_ui3.Avatar.Image,
900
+ import_radix_ui4.Avatar.Image,
760
901
  {
761
902
  "data-slot": "avatar-image",
762
903
  className: cn(
@@ -776,12 +917,12 @@ function AvatarFallback({
776
917
  ...props
777
918
  }) {
778
919
  const chromeCtx = useAvatarChrome();
779
- React2.useLayoutEffect(() => {
920
+ React.useLayoutEffect(() => {
780
921
  chromeCtx?.setChrome(variant);
781
922
  }, [chromeCtx, variant]);
782
923
  const branded = isBrandedVariant(variant);
783
924
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
784
- import_radix_ui3.Avatar.Fallback,
925
+ import_radix_ui4.Avatar.Fallback,
785
926
  {
786
927
  "data-slot": "avatar-fallback",
787
928
  "data-variant": branded ? "secondary" : variant,
@@ -790,8 +931,8 @@ function AvatarFallback({
790
931
  branded ? cn(
791
932
  "bg-transparent font-medium",
792
933
  TIMBAL_V2_LABEL.secondary,
793
- "text-sm group-data-[size=sm]/avatar:text-xs"
794
- ) : "bg-muted font-normal text-muted-foreground text-sm group-data-[size=sm]/avatar:text-xs",
934
+ "text-xs group-data-[size=sm]/avatar:text-[10px]"
935
+ ) : "bg-muted font-normal text-muted-foreground text-xs group-data-[size=sm]/avatar:text-[10px]",
795
936
  className
796
937
  ),
797
938
  style,
@@ -803,34 +944,34 @@ function AvatarFallback({
803
944
 
804
945
  // src/ui/dialog.tsx
805
946
  var import_lucide_react = require("lucide-react");
806
- var import_radix_ui4 = require("radix-ui");
947
+ var import_radix_ui5 = require("radix-ui");
807
948
  var import_jsx_runtime5 = require("react/jsx-runtime");
808
949
  function Dialog({
809
950
  ...props
810
951
  }) {
811
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_radix_ui4.Dialog.Root, { "data-slot": "dialog", ...props });
952
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_radix_ui5.Dialog.Root, { "data-slot": "dialog", ...props });
812
953
  }
813
954
  function DialogTrigger({
814
955
  ...props
815
956
  }) {
816
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_radix_ui4.Dialog.Trigger, { "data-slot": "dialog-trigger", ...props });
957
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_radix_ui5.Dialog.Trigger, { "data-slot": "dialog-trigger", ...props });
817
958
  }
818
959
  function DialogPortal({
819
960
  ...props
820
961
  }) {
821
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_radix_ui4.Dialog.Portal, { "data-slot": "dialog-portal", ...props });
962
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_radix_ui5.Dialog.Portal, { "data-slot": "dialog-portal", ...props });
822
963
  }
823
964
  function DialogClose({
824
965
  ...props
825
966
  }) {
826
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_radix_ui4.Dialog.Close, { "data-slot": "dialog-close", ...props });
967
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_radix_ui5.Dialog.Close, { "data-slot": "dialog-close", ...props });
827
968
  }
828
969
  function DialogOverlay({
829
970
  className,
830
971
  ...props
831
972
  }) {
832
973
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
833
- import_radix_ui4.Dialog.Overlay,
974
+ import_radix_ui5.Dialog.Overlay,
834
975
  {
835
976
  "data-slot": "dialog-overlay",
836
977
  className: cn(
@@ -850,7 +991,7 @@ function DialogContent({
850
991
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(DialogPortal, { "data-slot": "dialog-portal", children: [
851
992
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(DialogOverlay, {}),
852
993
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
853
- import_radix_ui4.Dialog.Content,
994
+ import_radix_ui5.Dialog.Content,
854
995
  {
855
996
  "data-slot": "dialog-content",
856
997
  className: cn(
@@ -862,7 +1003,7 @@ function DialogContent({
862
1003
  children: [
863
1004
  children,
864
1005
  showCloseButton && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
865
- import_radix_ui4.Dialog.Close,
1006
+ import_radix_ui5.Dialog.Close,
866
1007
  {
867
1008
  "data-slot": "dialog-close",
868
1009
  className: "ring-offset-background focus:ring-ring data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-[opacity,background-color] hover:bg-ghost-fill-hover hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
@@ -882,7 +1023,7 @@ function DialogTitle({
882
1023
  ...props
883
1024
  }) {
884
1025
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
885
- import_radix_ui4.Dialog.Title,
1026
+ import_radix_ui5.Dialog.Title,
886
1027
  {
887
1028
  "data-slot": "dialog-title",
888
1029
  className: cn("text-lg leading-none font-semibold", className),
@@ -895,7 +1036,7 @@ function DialogDescription({
895
1036
  ...props
896
1037
  }) {
897
1038
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
898
- import_radix_ui4.Dialog.Description,
1039
+ import_radix_ui5.Dialog.Description,
899
1040
  {
900
1041
  "data-slot": "dialog-description",
901
1042
  className: cn("text-sm text-muted-foreground", className),
@@ -928,7 +1069,7 @@ function DialogFooter({ className, ...props }) {
928
1069
  }
929
1070
 
930
1071
  // src/ui/dropdown-menu.tsx
931
- var import_radix_ui5 = require("radix-ui");
1072
+ var import_radix_ui6 = require("radix-ui");
932
1073
  var import_lucide_react2 = require("lucide-react");
933
1074
 
934
1075
  // src/design/control-surface.ts
@@ -969,13 +1110,13 @@ var import_jsx_runtime6 = require("react/jsx-runtime");
969
1110
  function DropdownMenu({
970
1111
  ...props
971
1112
  }) {
972
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_radix_ui5.DropdownMenu.Root, { "data-slot": "dropdown-menu", ...props });
1113
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_radix_ui6.DropdownMenu.Root, { "data-slot": "dropdown-menu", ...props });
973
1114
  }
974
1115
  function DropdownMenuTrigger({
975
1116
  ...props
976
1117
  }) {
977
1118
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
978
- import_radix_ui5.DropdownMenu.Trigger,
1119
+ import_radix_ui6.DropdownMenu.Trigger,
979
1120
  {
980
1121
  "data-slot": "dropdown-menu-trigger",
981
1122
  ...props
@@ -985,15 +1126,15 @@ function DropdownMenuTrigger({
985
1126
  function DropdownMenuGroup({
986
1127
  ...props
987
1128
  }) {
988
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_radix_ui5.DropdownMenu.Group, { "data-slot": "dropdown-menu-group", ...props });
1129
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_radix_ui6.DropdownMenu.Group, { "data-slot": "dropdown-menu-group", ...props });
989
1130
  }
990
1131
  function DropdownMenuContent({
991
1132
  className,
992
1133
  sideOffset = 4,
993
1134
  ...props
994
1135
  }) {
995
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_radix_ui5.DropdownMenu.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
996
- import_radix_ui5.DropdownMenu.Content,
1136
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_radix_ui6.DropdownMenu.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1137
+ import_radix_ui6.DropdownMenu.Content,
997
1138
  {
998
1139
  "data-slot": "dropdown-menu-content",
999
1140
  sideOffset,
@@ -1013,7 +1154,7 @@ function DropdownMenuItem({
1013
1154
  ...props
1014
1155
  }) {
1015
1156
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1016
- import_radix_ui5.DropdownMenu.Item,
1157
+ import_radix_ui6.DropdownMenu.Item,
1017
1158
  {
1018
1159
  "data-slot": "dropdown-menu-item",
1019
1160
  "data-inset": inset,
@@ -1034,14 +1175,14 @@ function DropdownMenuCheckboxItem({
1034
1175
  ...props
1035
1176
  }) {
1036
1177
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1037
- import_radix_ui5.DropdownMenu.CheckboxItem,
1178
+ import_radix_ui6.DropdownMenu.CheckboxItem,
1038
1179
  {
1039
1180
  "data-slot": "dropdown-menu-checkbox-item",
1040
1181
  className: cn(overlayItemClass, "py-1.5 pr-2 pl-8", className),
1041
1182
  checked,
1042
1183
  ...props,
1043
1184
  children: [
1044
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_radix_ui5.DropdownMenu.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react2.CheckIcon, { className: "size-4" }) }) }),
1185
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_radix_ui6.DropdownMenu.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react2.CheckIcon, { className: "size-4" }) }) }),
1045
1186
  children
1046
1187
  ]
1047
1188
  }
@@ -1051,7 +1192,7 @@ function DropdownMenuRadioGroup({
1051
1192
  ...props
1052
1193
  }) {
1053
1194
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1054
- import_radix_ui5.DropdownMenu.RadioGroup,
1195
+ import_radix_ui6.DropdownMenu.RadioGroup,
1055
1196
  {
1056
1197
  "data-slot": "dropdown-menu-radio-group",
1057
1198
  ...props
@@ -1064,13 +1205,13 @@ function DropdownMenuRadioItem({
1064
1205
  ...props
1065
1206
  }) {
1066
1207
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1067
- import_radix_ui5.DropdownMenu.RadioItem,
1208
+ import_radix_ui6.DropdownMenu.RadioItem,
1068
1209
  {
1069
1210
  "data-slot": "dropdown-menu-radio-item",
1070
1211
  className: cn(overlayItemClass, "py-1.5 pr-2 pl-8", className),
1071
1212
  ...props,
1072
1213
  children: [
1073
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_radix_ui5.DropdownMenu.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react2.CircleIcon, { className: "size-2 fill-current" }) }) }),
1214
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_radix_ui6.DropdownMenu.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react2.CircleIcon, { className: "size-2 fill-current" }) }) }),
1074
1215
  children
1075
1216
  ]
1076
1217
  }
@@ -1082,7 +1223,7 @@ function DropdownMenuLabel({
1082
1223
  ...props
1083
1224
  }) {
1084
1225
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1085
- import_radix_ui5.DropdownMenu.Label,
1226
+ import_radix_ui6.DropdownMenu.Label,
1086
1227
  {
1087
1228
  "data-slot": "dropdown-menu-label",
1088
1229
  "data-inset": inset,
@@ -1099,7 +1240,7 @@ function DropdownMenuSeparator({
1099
1240
  ...props
1100
1241
  }) {
1101
1242
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1102
- import_radix_ui5.DropdownMenu.Separator,
1243
+ import_radix_ui6.DropdownMenu.Separator,
1103
1244
  {
1104
1245
  "data-slot": "dropdown-menu-separator",
1105
1246
  className: cn("-mx-1 my-1 h-px bg-border", className),
@@ -1126,7 +1267,7 @@ function DropdownMenuShortcut({
1126
1267
  function DropdownMenuSub({
1127
1268
  ...props
1128
1269
  }) {
1129
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_radix_ui5.DropdownMenu.Sub, { "data-slot": "dropdown-menu-sub", ...props });
1270
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_radix_ui6.DropdownMenu.Sub, { "data-slot": "dropdown-menu-sub", ...props });
1130
1271
  }
1131
1272
  function DropdownMenuSubTrigger({
1132
1273
  className,
@@ -1135,7 +1276,7 @@ function DropdownMenuSubTrigger({
1135
1276
  ...props
1136
1277
  }) {
1137
1278
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
1138
- import_radix_ui5.DropdownMenu.SubTrigger,
1279
+ import_radix_ui6.DropdownMenu.SubTrigger,
1139
1280
  {
1140
1281
  "data-slot": "dropdown-menu-sub-trigger",
1141
1282
  "data-inset": inset,
@@ -1157,7 +1298,7 @@ function DropdownMenuSubContent({
1157
1298
  ...props
1158
1299
  }) {
1159
1300
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1160
- import_radix_ui5.DropdownMenu.SubContent,
1301
+ import_radix_ui6.DropdownMenu.SubContent,
1161
1302
  {
1162
1303
  "data-slot": "dropdown-menu-sub-content",
1163
1304
  className: cn(
@@ -1171,22 +1312,22 @@ function DropdownMenuSubContent({
1171
1312
  }
1172
1313
 
1173
1314
  // src/ui/popover.tsx
1174
- var import_radix_ui6 = require("radix-ui");
1315
+ var import_radix_ui7 = require("radix-ui");
1175
1316
  var import_jsx_runtime7 = require("react/jsx-runtime");
1176
1317
  function Popover({
1177
1318
  ...props
1178
1319
  }) {
1179
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_radix_ui6.Popover.Root, { "data-slot": "popover", ...props });
1320
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_radix_ui7.Popover.Root, { "data-slot": "popover", ...props });
1180
1321
  }
1181
1322
  function PopoverTrigger({
1182
1323
  ...props
1183
1324
  }) {
1184
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_radix_ui6.Popover.Trigger, { "data-slot": "popover-trigger", ...props });
1325
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_radix_ui7.Popover.Trigger, { "data-slot": "popover-trigger", ...props });
1185
1326
  }
1186
1327
  function PopoverAnchor({
1187
1328
  ...props
1188
1329
  }) {
1189
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_radix_ui6.Popover.Anchor, { "data-slot": "popover-anchor", ...props });
1330
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_radix_ui7.Popover.Anchor, { "data-slot": "popover-anchor", ...props });
1190
1331
  }
1191
1332
  function PopoverContent({
1192
1333
  className,
@@ -1195,8 +1336,8 @@ function PopoverContent({
1195
1336
  variant = "default",
1196
1337
  ...props
1197
1338
  }) {
1198
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_radix_ui6.Popover.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1199
- import_radix_ui6.Popover.Content,
1339
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_radix_ui7.Popover.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1340
+ import_radix_ui7.Popover.Content,
1200
1341
  {
1201
1342
  "data-slot": "popover-content",
1202
1343
  "data-variant": variant,
@@ -1218,23 +1359,23 @@ function PopoverContent({
1218
1359
  }
1219
1360
 
1220
1361
  // src/ui/select.tsx
1221
- var import_radix_ui7 = require("radix-ui");
1362
+ var import_radix_ui8 = require("radix-ui");
1222
1363
  var import_lucide_react3 = require("lucide-react");
1223
1364
  var import_jsx_runtime8 = require("react/jsx-runtime");
1224
1365
  function Select({
1225
1366
  ...props
1226
1367
  }) {
1227
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui7.Select.Root, { "data-slot": "select", ...props });
1368
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui8.Select.Root, { "data-slot": "select", ...props });
1228
1369
  }
1229
1370
  function SelectGroup({
1230
1371
  ...props
1231
1372
  }) {
1232
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui7.Select.Group, { "data-slot": "select-group", ...props });
1373
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui8.Select.Group, { "data-slot": "select-group", ...props });
1233
1374
  }
1234
1375
  function SelectValue({
1235
1376
  ...props
1236
1377
  }) {
1237
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui7.Select.Value, { "data-slot": "select-value", ...props });
1378
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui8.Select.Value, { "data-slot": "select-value", ...props });
1238
1379
  }
1239
1380
  function SelectTrigger({
1240
1381
  className,
@@ -1243,7 +1384,7 @@ function SelectTrigger({
1243
1384
  ...props
1244
1385
  }) {
1245
1386
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1246
- import_radix_ui7.Select.Trigger,
1387
+ import_radix_ui8.Select.Trigger,
1247
1388
  {
1248
1389
  "data-slot": "select-trigger",
1249
1390
  "data-size": size,
@@ -1255,7 +1396,7 @@ function SelectTrigger({
1255
1396
  ...props,
1256
1397
  children: [
1257
1398
  children,
1258
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui7.Select.Icon, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_lucide_react3.ChevronDownIcon, { className: "size-4 opacity-50" }) })
1399
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui8.Select.Icon, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_lucide_react3.ChevronDownIcon, { className: "size-4 opacity-50" }) })
1259
1400
  ]
1260
1401
  }
1261
1402
  );
@@ -1266,8 +1407,8 @@ function SelectContent({
1266
1407
  position = "popper",
1267
1408
  ...props
1268
1409
  }) {
1269
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui7.Select.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1270
- import_radix_ui7.Select.Content,
1410
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui8.Select.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1411
+ import_radix_ui8.Select.Content,
1271
1412
  {
1272
1413
  "data-slot": "select-content",
1273
1414
  className: cn(
@@ -1281,7 +1422,7 @@ function SelectContent({
1281
1422
  children: [
1282
1423
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(SelectScrollUpButton, {}),
1283
1424
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1284
- import_radix_ui7.Select.Viewport,
1425
+ import_radix_ui8.Select.Viewport,
1285
1426
  {
1286
1427
  className: cn(
1287
1428
  "p-1",
@@ -1300,7 +1441,7 @@ function SelectLabel({
1300
1441
  ...props
1301
1442
  }) {
1302
1443
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1303
- import_radix_ui7.Select.Label,
1444
+ import_radix_ui8.Select.Label,
1304
1445
  {
1305
1446
  "data-slot": "select-label",
1306
1447
  className: cn("px-2 py-1.5 text-xs font-medium text-muted-foreground", className),
@@ -1314,7 +1455,7 @@ function SelectItem({
1314
1455
  ...props
1315
1456
  }) {
1316
1457
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1317
- import_radix_ui7.Select.Item,
1458
+ import_radix_ui8.Select.Item,
1318
1459
  {
1319
1460
  "data-slot": "select-item",
1320
1461
  className: cn(
@@ -1324,8 +1465,8 @@ function SelectItem({
1324
1465
  ),
1325
1466
  ...props,
1326
1467
  children: [
1327
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "absolute right-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui7.Select.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_lucide_react3.CheckIcon, { className: "size-4" }) }) }),
1328
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui7.Select.ItemText, { children })
1468
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "absolute right-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui8.Select.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_lucide_react3.CheckIcon, { className: "size-4" }) }) }),
1469
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_radix_ui8.Select.ItemText, { children })
1329
1470
  ]
1330
1471
  }
1331
1472
  );
@@ -1335,7 +1476,7 @@ function SelectSeparator({
1335
1476
  ...props
1336
1477
  }) {
1337
1478
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1338
- import_radix_ui7.Select.Separator,
1479
+ import_radix_ui8.Select.Separator,
1339
1480
  {
1340
1481
  "data-slot": "select-separator",
1341
1482
  className: cn("-mx-1 my-1 h-px bg-border", className),
@@ -1348,7 +1489,7 @@ function SelectScrollUpButton({
1348
1489
  ...props
1349
1490
  }) {
1350
1491
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1351
- import_radix_ui7.Select.ScrollUpButton,
1492
+ import_radix_ui8.Select.ScrollUpButton,
1352
1493
  {
1353
1494
  "data-slot": "select-scroll-up-button",
1354
1495
  className: cn("flex cursor-default items-center justify-center py-1", className),
@@ -1362,7 +1503,7 @@ function SelectScrollDownButton({
1362
1503
  ...props
1363
1504
  }) {
1364
1505
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1365
- import_radix_ui7.Select.ScrollDownButton,
1506
+ import_radix_ui8.Select.ScrollDownButton,
1366
1507
  {
1367
1508
  "data-slot": "select-scroll-down-button",
1368
1509
  className: cn("flex cursor-default items-center justify-center py-1", className),
@@ -1413,14 +1554,14 @@ function Textarea({ className, ...props }) {
1413
1554
  }
1414
1555
 
1415
1556
  // src/ui/label.tsx
1416
- var import_radix_ui8 = require("radix-ui");
1557
+ var import_radix_ui9 = require("radix-ui");
1417
1558
  var import_jsx_runtime11 = require("react/jsx-runtime");
1418
1559
  function Label({
1419
1560
  className,
1420
1561
  ...props
1421
1562
  }) {
1422
1563
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1423
- import_radix_ui8.Label.Root,
1564
+ import_radix_ui9.Label.Root,
1424
1565
  {
1425
1566
  "data-slot": "label",
1426
1567
  className: cn(
@@ -1434,7 +1575,7 @@ function Label({
1434
1575
  }
1435
1576
 
1436
1577
  // src/ui/checkbox.tsx
1437
- var import_radix_ui9 = require("radix-ui");
1578
+ var import_radix_ui10 = require("radix-ui");
1438
1579
  var import_lucide_react4 = require("lucide-react");
1439
1580
  var import_jsx_runtime12 = require("react/jsx-runtime");
1440
1581
  function Checkbox({
@@ -1442,7 +1583,7 @@ function Checkbox({
1442
1583
  ...props
1443
1584
  }) {
1444
1585
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1445
- import_radix_ui9.Checkbox.Root,
1586
+ import_radix_ui10.Checkbox.Root,
1446
1587
  {
1447
1588
  "data-slot": "checkbox",
1448
1589
  className: cn(
@@ -1453,11 +1594,11 @@ function Checkbox({
1453
1594
  ),
1454
1595
  ...props,
1455
1596
  children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1456
- import_radix_ui9.Checkbox.Indicator,
1597
+ import_radix_ui10.Checkbox.Indicator,
1457
1598
  {
1458
1599
  "data-slot": "checkbox-indicator",
1459
- className: "flex items-center justify-center text-current transition-none",
1460
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react4.CheckIcon, { className: "size-3.5" })
1600
+ className: "flex items-center justify-center text-current animate-checkbox-pop",
1601
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_lucide_react4.CheckIcon, { className: "size-2.5 stroke-[3.5px]" })
1461
1602
  }
1462
1603
  )
1463
1604
  }
@@ -1465,14 +1606,14 @@ function Checkbox({
1465
1606
  }
1466
1607
 
1467
1608
  // src/ui/switch.tsx
1468
- var import_radix_ui10 = require("radix-ui");
1609
+ var import_radix_ui11 = require("radix-ui");
1469
1610
  var import_jsx_runtime13 = require("react/jsx-runtime");
1470
1611
  function Switch({
1471
1612
  className,
1472
1613
  ...props
1473
1614
  }) {
1474
1615
  return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1475
- import_radix_ui10.Switch.Root,
1616
+ import_radix_ui11.Switch.Root,
1476
1617
  {
1477
1618
  "data-slot": "switch",
1478
1619
  className: cn(
@@ -1484,7 +1625,7 @@ function Switch({
1484
1625
  ),
1485
1626
  ...props,
1486
1627
  children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1487
- import_radix_ui10.Switch.Thumb,
1628
+ import_radix_ui11.Switch.Thumb,
1488
1629
  {
1489
1630
  "data-slot": "switch-thumb",
1490
1631
  className: cn(
@@ -1498,7 +1639,7 @@ function Switch({
1498
1639
  }
1499
1640
 
1500
1641
  // src/ui/radio-group.tsx
1501
- var import_radix_ui11 = require("radix-ui");
1642
+ var import_radix_ui12 = require("radix-ui");
1502
1643
  var import_lucide_react5 = require("lucide-react");
1503
1644
  var import_jsx_runtime14 = require("react/jsx-runtime");
1504
1645
  function RadioGroup({
@@ -1506,7 +1647,7 @@ function RadioGroup({
1506
1647
  ...props
1507
1648
  }) {
1508
1649
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1509
- import_radix_ui11.RadioGroup.Root,
1650
+ import_radix_ui12.RadioGroup.Root,
1510
1651
  {
1511
1652
  "data-slot": "radio-group",
1512
1653
  className: cn("grid gap-2.5", className),
@@ -1519,7 +1660,7 @@ function RadioGroupItem({
1519
1660
  ...props
1520
1661
  }) {
1521
1662
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1522
- import_radix_ui11.RadioGroup.Item,
1663
+ import_radix_ui12.RadioGroup.Item,
1523
1664
  {
1524
1665
  "data-slot": "radio-group-item",
1525
1666
  className: cn(
@@ -1530,7 +1671,7 @@ function RadioGroupItem({
1530
1671
  ),
1531
1672
  ...props,
1532
1673
  children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1533
- import_radix_ui11.RadioGroup.Indicator,
1674
+ import_radix_ui12.RadioGroup.Indicator,
1534
1675
  {
1535
1676
  "data-slot": "radio-group-indicator",
1536
1677
  className: "flex items-center justify-center",
@@ -1542,15 +1683,15 @@ function RadioGroupItem({
1542
1683
  }
1543
1684
 
1544
1685
  // src/ui/form.tsx
1545
- var import_radix_ui12 = require("radix-ui");
1686
+ var import_radix_ui13 = require("radix-ui");
1546
1687
  var import_jsx_runtime15 = require("react/jsx-runtime");
1547
1688
  function Form({ ...props }) {
1548
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_radix_ui12.Form.Root, { "data-slot": "form", ...props });
1689
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_radix_ui13.Form.Root, { "data-slot": "form", ...props });
1549
1690
  }
1550
1691
  function FormField({
1551
1692
  ...props
1552
1693
  }) {
1553
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_radix_ui12.Form.Field, { "data-slot": "form-field", ...props });
1694
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_radix_ui13.Form.Field, { "data-slot": "form-field", ...props });
1554
1695
  }
1555
1696
  function FormItem({ className, ...props }) {
1556
1697
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
@@ -1566,19 +1707,19 @@ function FormLabel({
1566
1707
  className,
1567
1708
  ...props
1568
1709
  }) {
1569
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_radix_ui12.Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Label, { "data-slot": "form-label", className, ...props }) });
1710
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_radix_ui13.Form.Label, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Label, { "data-slot": "form-label", className, ...props }) });
1570
1711
  }
1571
1712
  function FormControl({
1572
1713
  ...props
1573
1714
  }) {
1574
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_radix_ui12.Form.Control, { "data-slot": "form-control", ...props });
1715
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_radix_ui13.Form.Control, { "data-slot": "form-control", ...props });
1575
1716
  }
1576
1717
  function FormMessage({
1577
1718
  className,
1578
1719
  ...props
1579
1720
  }) {
1580
1721
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1581
- import_radix_ui12.Form.Message,
1722
+ import_radix_ui13.Form.Message,
1582
1723
  {
1583
1724
  "data-slot": "form-message",
1584
1725
  className: cn("text-xs text-destructive", className),
@@ -1591,7 +1732,7 @@ function FormSubmit({
1591
1732
  ...props
1592
1733
  }) {
1593
1734
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1594
- import_radix_ui12.Form.Submit,
1735
+ import_radix_ui13.Form.Submit,
1595
1736
  {
1596
1737
  "data-slot": "form-submit",
1597
1738
  className,
@@ -1601,17 +1742,17 @@ function FormSubmit({
1601
1742
  }
1602
1743
 
1603
1744
  // src/ui/aspect-ratio.tsx
1604
- var import_radix_ui13 = require("radix-ui");
1745
+ var import_radix_ui14 = require("radix-ui");
1605
1746
  var import_jsx_runtime16 = require("react/jsx-runtime");
1606
1747
  function AspectRatio({
1607
1748
  ...props
1608
1749
  }) {
1609
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_radix_ui13.AspectRatio.Root, { "data-slot": "aspect-ratio", ...props });
1750
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_radix_ui14.AspectRatio.Root, { "data-slot": "aspect-ratio", ...props });
1610
1751
  }
1611
1752
 
1612
1753
  // src/ui/breadcrumb.tsx
1613
1754
  var import_lucide_react6 = require("lucide-react");
1614
- var import_radix_ui14 = require("radix-ui");
1755
+ var import_radix_ui15 = require("radix-ui");
1615
1756
  var import_jsx_runtime17 = require("react/jsx-runtime");
1616
1757
  function Breadcrumb({ ...props }) {
1617
1758
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("nav", { "data-slot": "breadcrumb", "aria-label": "Breadcrumb", ...props });
@@ -1644,7 +1785,7 @@ function BreadcrumbLink({
1644
1785
  asChild,
1645
1786
  ...props
1646
1787
  }) {
1647
- const Comp = asChild ? import_radix_ui14.Slot.Root : "a";
1788
+ const Comp = asChild ? import_radix_ui15.Slot.Root : "a";
1648
1789
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1649
1790
  Comp,
1650
1791
  {
@@ -1803,14 +1944,14 @@ function PaginationEllipsis({
1803
1944
  }
1804
1945
 
1805
1946
  // src/ui/toolbar.tsx
1806
- var import_radix_ui15 = require("radix-ui");
1947
+ var import_radix_ui16 = require("radix-ui");
1807
1948
  var import_jsx_runtime19 = require("react/jsx-runtime");
1808
1949
  function Toolbar({
1809
1950
  className,
1810
1951
  ...props
1811
1952
  }) {
1812
1953
  return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1813
- import_radix_ui15.Toolbar.Root,
1954
+ import_radix_ui16.Toolbar.Root,
1814
1955
  {
1815
1956
  "data-slot": "toolbar",
1816
1957
  className: cn(
@@ -1826,7 +1967,7 @@ function ToolbarButton({
1826
1967
  ...props
1827
1968
  }) {
1828
1969
  return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1829
- import_radix_ui15.Toolbar.Button,
1970
+ import_radix_ui16.Toolbar.Button,
1830
1971
  {
1831
1972
  "data-slot": "toolbar-button",
1832
1973
  className: cn(
@@ -1843,7 +1984,7 @@ function ToolbarSeparator({
1843
1984
  ...props
1844
1985
  }) {
1845
1986
  return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1846
- import_radix_ui15.Toolbar.Separator,
1987
+ import_radix_ui16.Toolbar.Separator,
1847
1988
  {
1848
1989
  "data-slot": "toolbar-separator",
1849
1990
  className: cn("mx-1 h-6 w-px bg-border", className),
@@ -1856,7 +1997,7 @@ function ToolbarToggleGroup({
1856
1997
  ...props
1857
1998
  }) {
1858
1999
  return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1859
- import_radix_ui15.Toolbar.ToggleGroup,
2000
+ import_radix_ui16.Toolbar.ToggleGroup,
1860
2001
  {
1861
2002
  "data-slot": "toolbar-toggle-group",
1862
2003
  className: cn("flex items-center gap-0.5", className),
@@ -1869,7 +2010,7 @@ function ToolbarToggleItem({
1869
2010
  ...props
1870
2011
  }) {
1871
2012
  return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1872
- import_radix_ui15.Toolbar.ToggleItem,
2013
+ import_radix_ui16.Toolbar.ToggleItem,
1873
2014
  {
1874
2015
  "data-slot": "toolbar-toggle-item",
1875
2016
  className: cn(
@@ -1887,7 +2028,7 @@ function ToolbarLink({
1887
2028
  ...props
1888
2029
  }) {
1889
2030
  return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1890
- import_radix_ui15.Toolbar.Link,
2031
+ import_radix_ui16.Toolbar.Link,
1891
2032
  {
1892
2033
  "data-slot": "toolbar-link",
1893
2034
  className: cn(
@@ -1900,7 +2041,7 @@ function ToolbarLink({
1900
2041
  }
1901
2042
 
1902
2043
  // src/ui/menubar.tsx
1903
- var import_radix_ui16 = require("radix-ui");
2044
+ var import_radix_ui17 = require("radix-ui");
1904
2045
  var import_lucide_react8 = require("lucide-react");
1905
2046
  var import_jsx_runtime20 = require("react/jsx-runtime");
1906
2047
  function Menubar({
@@ -1908,7 +2049,7 @@ function Menubar({
1908
2049
  ...props
1909
2050
  }) {
1910
2051
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1911
- import_radix_ui16.Menubar.Root,
2052
+ import_radix_ui17.Menubar.Root,
1912
2053
  {
1913
2054
  "data-slot": "menubar",
1914
2055
  className: cn(
@@ -1922,14 +2063,14 @@ function Menubar({
1922
2063
  function MenubarMenu({
1923
2064
  ...props
1924
2065
  }) {
1925
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui16.Menubar.Menu, { "data-slot": "menubar-menu", ...props });
2066
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui17.Menubar.Menu, { "data-slot": "menubar-menu", ...props });
1926
2067
  }
1927
2068
  function MenubarTrigger({
1928
2069
  className,
1929
2070
  ...props
1930
2071
  }) {
1931
2072
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1932
- import_radix_ui16.Menubar.Trigger,
2073
+ import_radix_ui17.Menubar.Trigger,
1933
2074
  {
1934
2075
  "data-slot": "menubar-trigger",
1935
2076
  className: cn(
@@ -1948,8 +2089,8 @@ function MenubarContent({
1948
2089
  sideOffset = 8,
1949
2090
  ...props
1950
2091
  }) {
1951
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui16.Menubar.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1952
- import_radix_ui16.Menubar.Content,
2092
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui17.Menubar.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2093
+ import_radix_ui17.Menubar.Content,
1953
2094
  {
1954
2095
  "data-slot": "menubar-content",
1955
2096
  align,
@@ -1971,7 +2112,7 @@ function MenubarItem({
1971
2112
  ...props
1972
2113
  }) {
1973
2114
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1974
- import_radix_ui16.Menubar.Item,
2115
+ import_radix_ui17.Menubar.Item,
1975
2116
  {
1976
2117
  "data-slot": "menubar-item",
1977
2118
  "data-inset": inset,
@@ -1992,14 +2133,14 @@ function MenubarCheckboxItem({
1992
2133
  ...props
1993
2134
  }) {
1994
2135
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1995
- import_radix_ui16.Menubar.CheckboxItem,
2136
+ import_radix_ui17.Menubar.CheckboxItem,
1996
2137
  {
1997
2138
  "data-slot": "menubar-checkbox-item",
1998
2139
  className: cn(overlayItemClass, "py-1.5 pr-2 pl-8", className),
1999
2140
  checked,
2000
2141
  ...props,
2001
2142
  children: [
2002
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui16.Menubar.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react8.CheckIcon, { className: "size-4" }) }) }),
2143
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui17.Menubar.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react8.CheckIcon, { className: "size-4" }) }) }),
2003
2144
  children
2004
2145
  ]
2005
2146
  }
@@ -2008,7 +2149,7 @@ function MenubarCheckboxItem({
2008
2149
  function MenubarRadioGroup({
2009
2150
  ...props
2010
2151
  }) {
2011
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui16.Menubar.RadioGroup, { "data-slot": "menubar-radio-group", ...props });
2152
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui17.Menubar.RadioGroup, { "data-slot": "menubar-radio-group", ...props });
2012
2153
  }
2013
2154
  function MenubarRadioItem({
2014
2155
  className,
@@ -2016,13 +2157,13 @@ function MenubarRadioItem({
2016
2157
  ...props
2017
2158
  }) {
2018
2159
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
2019
- import_radix_ui16.Menubar.RadioItem,
2160
+ import_radix_ui17.Menubar.RadioItem,
2020
2161
  {
2021
2162
  "data-slot": "menubar-radio-item",
2022
2163
  className: cn(overlayItemClass, "py-1.5 pr-2 pl-8", className),
2023
2164
  ...props,
2024
2165
  children: [
2025
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui16.Menubar.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react8.CircleIcon, { className: "size-2 fill-current" }) }) }),
2166
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui17.Menubar.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react8.CircleIcon, { className: "size-2 fill-current" }) }) }),
2026
2167
  children
2027
2168
  ]
2028
2169
  }
@@ -2034,7 +2175,7 @@ function MenubarLabel({
2034
2175
  ...props
2035
2176
  }) {
2036
2177
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2037
- import_radix_ui16.Menubar.Label,
2178
+ import_radix_ui17.Menubar.Label,
2038
2179
  {
2039
2180
  "data-slot": "menubar-label",
2040
2181
  "data-inset": inset,
@@ -2051,7 +2192,7 @@ function MenubarSeparator({
2051
2192
  ...props
2052
2193
  }) {
2053
2194
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2054
- import_radix_ui16.Menubar.Separator,
2195
+ import_radix_ui17.Menubar.Separator,
2055
2196
  {
2056
2197
  "data-slot": "menubar-separator",
2057
2198
  className: cn("-mx-1 my-1 h-px bg-border", className),
@@ -2078,7 +2219,7 @@ function MenubarShortcut({
2078
2219
  function MenubarSub({
2079
2220
  ...props
2080
2221
  }) {
2081
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui16.Menubar.Sub, { "data-slot": "menubar-sub", ...props });
2222
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui17.Menubar.Sub, { "data-slot": "menubar-sub", ...props });
2082
2223
  }
2083
2224
  function MenubarSubTrigger({
2084
2225
  className,
@@ -2087,7 +2228,7 @@ function MenubarSubTrigger({
2087
2228
  ...props
2088
2229
  }) {
2089
2230
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
2090
- import_radix_ui16.Menubar.SubTrigger,
2231
+ import_radix_ui17.Menubar.SubTrigger,
2091
2232
  {
2092
2233
  "data-slot": "menubar-sub-trigger",
2093
2234
  "data-inset": inset,
@@ -2109,7 +2250,7 @@ function MenubarSubContent({
2109
2250
  ...props
2110
2251
  }) {
2111
2252
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2112
- import_radix_ui16.Menubar.SubContent,
2253
+ import_radix_ui17.Menubar.SubContent,
2113
2254
  {
2114
2255
  "data-slot": "menubar-sub-content",
2115
2256
  className: cn(
@@ -2123,9 +2264,9 @@ function MenubarSubContent({
2123
2264
  }
2124
2265
 
2125
2266
  // src/ui/navigation-menu.tsx
2126
- var import_radix_ui17 = require("radix-ui");
2267
+ var import_radix_ui18 = require("radix-ui");
2127
2268
  var import_lucide_react9 = require("lucide-react");
2128
- var import_class_variance_authority2 = require("class-variance-authority");
2269
+ var import_class_variance_authority3 = require("class-variance-authority");
2129
2270
  var import_jsx_runtime21 = require("react/jsx-runtime");
2130
2271
  function NavigationMenu({
2131
2272
  className,
@@ -2134,7 +2275,7 @@ function NavigationMenu({
2134
2275
  ...props
2135
2276
  }) {
2136
2277
  return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
2137
- import_radix_ui17.NavigationMenu.Root,
2278
+ import_radix_ui18.NavigationMenu.Root,
2138
2279
  {
2139
2280
  "data-slot": "navigation-menu",
2140
2281
  "data-viewport": viewport,
@@ -2155,7 +2296,7 @@ function NavigationMenuList({
2155
2296
  ...props
2156
2297
  }) {
2157
2298
  return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2158
- import_radix_ui17.NavigationMenu.List,
2299
+ import_radix_ui18.NavigationMenu.List,
2159
2300
  {
2160
2301
  "data-slot": "navigation-menu-list",
2161
2302
  className: cn(
@@ -2169,9 +2310,9 @@ function NavigationMenuList({
2169
2310
  function NavigationMenuItem({
2170
2311
  ...props
2171
2312
  }) {
2172
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_radix_ui17.NavigationMenu.Item, { "data-slot": "navigation-menu-item", ...props });
2313
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_radix_ui18.NavigationMenu.Item, { "data-slot": "navigation-menu-item", ...props });
2173
2314
  }
2174
- var navigationMenuTriggerStyle = (0, import_class_variance_authority2.cva)(
2315
+ var navigationMenuTriggerStyle = (0, import_class_variance_authority3.cva)(
2175
2316
  "group inline-flex h-9 w-max items-center justify-center rounded-lg bg-transparent px-4 py-2 text-sm font-medium transition-colors hover:bg-muted hover:text-foreground focus:bg-muted focus:text-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-muted/80 data-[state=open]:text-foreground"
2176
2317
  );
2177
2318
  function NavigationMenuTrigger({
@@ -2180,7 +2321,7 @@ function NavigationMenuTrigger({
2180
2321
  ...props
2181
2322
  }) {
2182
2323
  return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
2183
- import_radix_ui17.NavigationMenu.Trigger,
2324
+ import_radix_ui18.NavigationMenu.Trigger,
2184
2325
  {
2185
2326
  "data-slot": "navigation-menu-trigger",
2186
2327
  className: cn(navigationMenuTriggerStyle(), "group", className),
@@ -2204,11 +2345,11 @@ function NavigationMenuContent({
2204
2345
  ...props
2205
2346
  }) {
2206
2347
  return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2207
- import_radix_ui17.NavigationMenu.Content,
2348
+ import_radix_ui18.NavigationMenu.Content,
2208
2349
  {
2209
2350
  "data-slot": "navigation-menu-content",
2210
2351
  className: cn(
2211
- "data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 top-0 left-0 w-full p-2 pr-2.5 md:absolute md:w-auto",
2352
+ "data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 top-0 left-0 w-full p-1 md:absolute md:w-auto",
2212
2353
  "group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95 group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-lg group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:border-border group-data-[viewport=false]/navigation-menu:shadow-card",
2213
2354
  className
2214
2355
  ),
@@ -2221,7 +2362,7 @@ function NavigationMenuViewport({
2221
2362
  ...props
2222
2363
  }) {
2223
2364
  return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: cn("absolute top-full left-0 isolate z-[80] flex justify-center"), children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2224
- import_radix_ui17.NavigationMenu.Viewport,
2365
+ import_radix_ui18.NavigationMenu.Viewport,
2225
2366
  {
2226
2367
  "data-slot": "navigation-menu-viewport",
2227
2368
  className: cn(
@@ -2238,11 +2379,11 @@ function NavigationMenuLink({
2238
2379
  ...props
2239
2380
  }) {
2240
2381
  return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2241
- import_radix_ui17.NavigationMenu.Link,
2382
+ import_radix_ui18.NavigationMenu.Link,
2242
2383
  {
2243
2384
  "data-slot": "navigation-menu-link",
2244
2385
  className: cn(
2245
- "flex flex-col gap-1 rounded-md p-2 text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground [&_svg:not([class*='size-'])]:size-4",
2386
+ "flex flex-col gap-1 rounded-md px-3 py-1.5 text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground [&_svg:not([class*='size-'])]:size-4",
2246
2387
  className
2247
2388
  ),
2248
2389
  ...props
@@ -2254,7 +2395,7 @@ function NavigationMenuIndicator({
2254
2395
  ...props
2255
2396
  }) {
2256
2397
  return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2257
- import_radix_ui17.NavigationMenu.Indicator,
2398
+ import_radix_ui18.NavigationMenu.Indicator,
2258
2399
  {
2259
2400
  "data-slot": "navigation-menu-indicator",
2260
2401
  className: cn(
@@ -2425,7 +2566,7 @@ function CommandShortcut({
2425
2566
  }
2426
2567
 
2427
2568
  // src/ui/calendar.tsx
2428
- var React3 = __toESM(require("react"), 1);
2569
+ var React2 = __toESM(require("react"), 1);
2429
2570
  var import_lucide_react11 = require("lucide-react");
2430
2571
  var import_react_day_picker = require("react-day-picker");
2431
2572
  var import_jsx_runtime23 = require("react/jsx-runtime");
@@ -2519,8 +2660,8 @@ function CalendarDayButton({
2519
2660
  modifiers,
2520
2661
  ...props
2521
2662
  }) {
2522
- const ref = React3.useRef(null);
2523
- React3.useEffect(() => {
2663
+ const ref = React2.useRef(null);
2664
+ React2.useEffect(() => {
2524
2665
  if (modifiers.focused) ref.current?.focus();
2525
2666
  }, [modifiers.focused]);
2526
2667
  const isSingle = modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle;
@@ -2731,7 +2872,7 @@ function DatePickerButton({
2731
2872
 
2732
2873
  // src/ui/input-otp.tsx
2733
2874
  var import_lucide_react14 = require("lucide-react");
2734
- var import_radix_ui18 = require("radix-ui");
2875
+ var import_radix_ui19 = require("radix-ui");
2735
2876
  var import_jsx_runtime26 = require("react/jsx-runtime");
2736
2877
  function InputOTP({
2737
2878
  className,
@@ -2740,7 +2881,7 @@ function InputOTP({
2740
2881
  ...props
2741
2882
  }) {
2742
2883
  return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2743
- import_radix_ui18.unstable_OneTimePasswordField.Root,
2884
+ import_radix_ui19.unstable_OneTimePasswordField.Root,
2744
2885
  {
2745
2886
  "data-slot": "input-otp",
2746
2887
  className: cn(
@@ -2771,7 +2912,7 @@ function InputOTPSlot({
2771
2912
  ...props
2772
2913
  }) {
2773
2914
  return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2774
- import_radix_ui18.unstable_OneTimePasswordField.Input,
2915
+ import_radix_ui19.unstable_OneTimePasswordField.Input,
2775
2916
  {
2776
2917
  "data-slot": "input-otp-slot",
2777
2918
  className: cn(
@@ -2788,7 +2929,7 @@ function InputOTPSlot({
2788
2929
  function InputOTPHiddenInput({
2789
2930
  ...props
2790
2931
  }) {
2791
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_radix_ui18.unstable_OneTimePasswordField.HiddenInput, { "data-slot": "input-otp-hidden-input", ...props });
2932
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_radix_ui19.unstable_OneTimePasswordField.HiddenInput, { "data-slot": "input-otp-hidden-input", ...props });
2792
2933
  }
2793
2934
  function InputOTPSeparator({
2794
2935
  className,
@@ -2946,20 +3087,20 @@ function InputGroupText({
2946
3087
  }
2947
3088
 
2948
3089
  // src/ui/accordion.tsx
2949
- var import_radix_ui19 = require("radix-ui");
3090
+ var import_radix_ui20 = require("radix-ui");
2950
3091
  var import_lucide_react15 = require("lucide-react");
2951
3092
  var import_jsx_runtime30 = require("react/jsx-runtime");
2952
3093
  function Accordion({
2953
3094
  ...props
2954
3095
  }) {
2955
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_radix_ui19.Accordion.Root, { "data-slot": "accordion", ...props });
3096
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_radix_ui20.Accordion.Root, { "data-slot": "accordion", ...props });
2956
3097
  }
2957
3098
  function AccordionItem({
2958
3099
  className,
2959
3100
  ...props
2960
3101
  }) {
2961
3102
  return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
2962
- import_radix_ui19.Accordion.Item,
3103
+ import_radix_ui20.Accordion.Item,
2963
3104
  {
2964
3105
  "data-slot": "accordion-item",
2965
3106
  className: cn("border-b border-border last:border-b-0", className),
@@ -2972,8 +3113,8 @@ function AccordionTrigger({
2972
3113
  children,
2973
3114
  ...props
2974
3115
  }) {
2975
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_radix_ui19.Accordion.Header, { className: "flex", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
2976
- import_radix_ui19.Accordion.Trigger,
3116
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_radix_ui20.Accordion.Header, { className: "flex", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
3117
+ import_radix_ui20.Accordion.Trigger,
2977
3118
  {
2978
3119
  "data-slot": "accordion-trigger",
2979
3120
  className: cn(
@@ -2996,7 +3137,7 @@ function AccordionContent({
2996
3137
  ...props
2997
3138
  }) {
2998
3139
  return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
2999
- import_radix_ui19.Accordion.Content,
3140
+ import_radix_ui20.Accordion.Content,
3000
3141
  {
3001
3142
  "data-slot": "accordion-content",
3002
3143
  className: "overflow-hidden text-sm text-muted-foreground data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
@@ -3007,7 +3148,7 @@ function AccordionContent({
3007
3148
  }
3008
3149
 
3009
3150
  // src/ui/separator.tsx
3010
- var import_radix_ui20 = require("radix-ui");
3151
+ var import_radix_ui21 = require("radix-ui");
3011
3152
  var import_jsx_runtime31 = require("react/jsx-runtime");
3012
3153
  function Separator({
3013
3154
  className,
@@ -3016,7 +3157,7 @@ function Separator({
3016
3157
  ...props
3017
3158
  }) {
3018
3159
  return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
3019
- import_radix_ui20.Separator.Root,
3160
+ import_radix_ui21.Separator.Root,
3020
3161
  {
3021
3162
  "data-slot": "separator",
3022
3163
  decorative,
@@ -3031,8 +3172,8 @@ function Separator({
3031
3172
  }
3032
3173
 
3033
3174
  // src/ui/slider.tsx
3034
- var React4 = __toESM(require("react"), 1);
3035
- var import_radix_ui21 = require("radix-ui");
3175
+ var React3 = __toESM(require("react"), 1);
3176
+ var import_radix_ui22 = require("radix-ui");
3036
3177
  var import_jsx_runtime32 = require("react/jsx-runtime");
3037
3178
  function Slider({
3038
3179
  className,
@@ -3042,13 +3183,13 @@ function Slider({
3042
3183
  max = 100,
3043
3184
  ...props
3044
3185
  }) {
3045
- const thumbs = React4.useMemo(() => {
3186
+ const thumbs = React3.useMemo(() => {
3046
3187
  if (Array.isArray(value)) return value;
3047
3188
  if (Array.isArray(defaultValue)) return defaultValue;
3048
3189
  return [min];
3049
3190
  }, [value, defaultValue, min]);
3050
3191
  return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
3051
- import_radix_ui21.Slider.Root,
3192
+ import_radix_ui22.Slider.Root,
3052
3193
  {
3053
3194
  "data-slot": "slider",
3054
3195
  defaultValue,
@@ -3063,12 +3204,12 @@ function Slider({
3063
3204
  ...props,
3064
3205
  children: [
3065
3206
  /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
3066
- import_radix_ui21.Slider.Track,
3207
+ import_radix_ui22.Slider.Track,
3067
3208
  {
3068
3209
  "data-slot": "slider-track",
3069
3210
  className: "relative grow overflow-hidden rounded-full bg-muted data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5",
3070
3211
  children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
3071
- import_radix_ui21.Slider.Range,
3212
+ import_radix_ui22.Slider.Range,
3072
3213
  {
3073
3214
  "data-slot": "slider-range",
3074
3215
  className: "absolute bg-gradient-to-b from-primary-fill-from to-primary-fill-to data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full"
@@ -3077,7 +3218,7 @@ function Slider({
3077
3218
  }
3078
3219
  ),
3079
3220
  Array.from({ length: thumbs.length }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
3080
- import_radix_ui21.Slider.Thumb,
3221
+ import_radix_ui22.Slider.Thumb,
3081
3222
  {
3082
3223
  "data-slot": "slider-thumb",
3083
3224
  className: "block size-4 shrink-0 rounded-full border border-border bg-gradient-to-b from-elevated-from to-elevated-to shadow-card outline-none transition-[box-shadow] focus-visible:ring-2 focus-visible:ring-foreground/10 disabled:pointer-events-none disabled:opacity-50"
@@ -3090,7 +3231,7 @@ function Slider({
3090
3231
  }
3091
3232
 
3092
3233
  // src/ui/progress.tsx
3093
- var import_radix_ui22 = require("radix-ui");
3234
+ var import_radix_ui23 = require("radix-ui");
3094
3235
  var import_jsx_runtime33 = require("react/jsx-runtime");
3095
3236
  function Progress({
3096
3237
  className,
@@ -3098,7 +3239,7 @@ function Progress({
3098
3239
  ...props
3099
3240
  }) {
3100
3241
  return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3101
- import_radix_ui22.Progress.Root,
3242
+ import_radix_ui23.Progress.Root,
3102
3243
  {
3103
3244
  "data-slot": "progress",
3104
3245
  className: cn(
@@ -3107,7 +3248,7 @@ function Progress({
3107
3248
  ),
3108
3249
  ...props,
3109
3250
  children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3110
- import_radix_ui22.Progress.Indicator,
3251
+ import_radix_ui23.Progress.Indicator,
3111
3252
  {
3112
3253
  "data-slot": "progress-indicator",
3113
3254
  className: "h-full w-full flex-1 bg-gradient-to-b from-primary-fill-from to-primary-fill-to transition-transform",
@@ -3119,10 +3260,10 @@ function Progress({
3119
3260
  }
3120
3261
 
3121
3262
  // src/ui/badge.tsx
3122
- var import_radix_ui23 = require("radix-ui");
3123
- var import_class_variance_authority3 = require("class-variance-authority");
3263
+ var import_radix_ui24 = require("radix-ui");
3264
+ var import_class_variance_authority4 = require("class-variance-authority");
3124
3265
  var import_jsx_runtime34 = require("react/jsx-runtime");
3125
- var badgeVariants = (0, import_class_variance_authority3.cva)(
3266
+ var badgeVariants = (0, import_class_variance_authority4.cva)(
3126
3267
  "inline-flex w-fit shrink-0 items-center justify-center gap-1 whitespace-nowrap rounded-md border px-2 py-0.5 text-xs font-medium [&>svg]:pointer-events-none [&>svg]:size-3",
3127
3268
  {
3128
3269
  variants: {
@@ -3144,7 +3285,7 @@ function Badge({
3144
3285
  asChild = false,
3145
3286
  ...props
3146
3287
  }) {
3147
- const Comp = asChild ? import_radix_ui23.Slot.Root : "span";
3288
+ const Comp = asChild ? import_radix_ui24.Slot.Root : "span";
3148
3289
  return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
3149
3290
  Comp,
3150
3291
  {
@@ -3157,59 +3298,85 @@ function Badge({
3157
3298
 
3158
3299
  // src/ui/sheet.tsx
3159
3300
  var import_lucide_react16 = require("lucide-react");
3160
- var import_radix_ui24 = require("radix-ui");
3161
- var import_class_variance_authority4 = require("class-variance-authority");
3301
+ var import_radix_ui25 = require("radix-ui");
3302
+ var import_class_variance_authority5 = require("class-variance-authority");
3162
3303
  var import_jsx_runtime35 = require("react/jsx-runtime");
3163
3304
  function Sheet({ ...props }) {
3164
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_radix_ui24.Dialog.Root, { "data-slot": "sheet", ...props });
3305
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_radix_ui25.Dialog.Root, { "data-slot": "sheet", ...props });
3165
3306
  }
3166
3307
  function SheetTrigger({
3167
3308
  ...props
3168
3309
  }) {
3169
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_radix_ui24.Dialog.Trigger, { "data-slot": "sheet-trigger", ...props });
3310
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_radix_ui25.Dialog.Trigger, { "data-slot": "sheet-trigger", ...props });
3170
3311
  }
3171
3312
  function SheetClose({
3172
3313
  ...props
3173
3314
  }) {
3174
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_radix_ui24.Dialog.Close, { "data-slot": "sheet-close", ...props });
3315
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_radix_ui25.Dialog.Close, { "data-slot": "sheet-close", ...props });
3175
3316
  }
3176
3317
  function SheetPortal({
3177
3318
  ...props
3178
3319
  }) {
3179
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_radix_ui24.Dialog.Portal, { "data-slot": "sheet-portal", ...props });
3320
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_radix_ui25.Dialog.Portal, { "data-slot": "sheet-portal", ...props });
3180
3321
  }
3181
3322
  function SheetOverlay({
3182
3323
  className,
3183
3324
  ...props
3184
3325
  }) {
3185
3326
  return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
3186
- import_radix_ui24.Dialog.Overlay,
3327
+ import_radix_ui25.Dialog.Overlay,
3187
3328
  {
3188
3329
  "data-slot": "sheet-overlay",
3189
3330
  className: cn(
3190
- "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-[70] bg-black/50",
3331
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-[70] bg-black/40 backdrop-blur-[2px] duration-300",
3191
3332
  className
3192
3333
  ),
3193
3334
  ...props
3194
3335
  }
3195
3336
  );
3196
3337
  }
3197
- var sheetContentVariants = (0, import_class_variance_authority4.cva)(
3338
+ var sheetContentVariants = (0, import_class_variance_authority5.cva)(
3198
3339
  cn(
3199
3340
  TIMBAL_V2_MODAL_SURFACE,
3200
- "data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-[70] flex flex-col gap-4 shadow-card-elevated transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500"
3341
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0 fixed z-[70] flex flex-col gap-4 shadow-card-elevated duration-300"
3201
3342
  ),
3202
3343
  {
3203
3344
  variants: {
3204
3345
  side: {
3205
- top: "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 border-b p-6",
3206
- bottom: "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 border-t p-6",
3207
- left: "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r p-6 sm:max-w-sm",
3208
- right: "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l p-6 sm:max-w-sm"
3346
+ top: "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top fixed top-4 inset-x-4 mx-auto w-[calc(100vw-2rem)] sm:max-w-lg rounded-2xl p-6",
3347
+ bottom: "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom fixed bottom-4 inset-x-4 mx-auto w-[calc(100vw-2rem)] sm:max-w-lg rounded-2xl p-6",
3348
+ left: "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left fixed top-4 bottom-4 left-4 w-[calc(100vw-2rem)] rounded-2xl p-6",
3349
+ right: "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right fixed top-4 bottom-4 right-4 w-[calc(100vw-2rem)] rounded-2xl p-6"
3350
+ },
3351
+ size: {
3352
+ default: "",
3353
+ sm: "",
3354
+ md: "",
3355
+ lg: "",
3356
+ xl: "",
3357
+ "2xl": "",
3358
+ full: ""
3209
3359
  }
3210
3360
  },
3361
+ compoundVariants: [
3362
+ { side: "left", size: "default", class: "sm:max-w-md md:max-w-lg" },
3363
+ { side: "right", size: "default", class: "sm:max-w-md md:max-w-lg" },
3364
+ { side: "left", size: "sm", class: "sm:max-w-sm md:max-w-md" },
3365
+ { side: "right", size: "sm", class: "sm:max-w-sm md:max-w-md" },
3366
+ { side: "left", size: "md", class: "sm:max-w-md md:max-w-lg" },
3367
+ { side: "right", size: "md", class: "sm:max-w-md md:max-w-lg" },
3368
+ { side: "left", size: "lg", class: "sm:max-w-lg md:max-w-xl lg:max-w-2xl" },
3369
+ { side: "right", size: "lg", class: "sm:max-w-lg md:max-w-xl lg:max-w-2xl" },
3370
+ { side: "left", size: "xl", class: "sm:max-w-xl md:max-w-3xl lg:max-w-4xl" },
3371
+ { side: "right", size: "xl", class: "sm:max-w-xl md:max-w-3xl lg:max-w-4xl" },
3372
+ { side: "left", size: "2xl", class: "sm:max-w-2xl md:max-w-4xl lg:max-w-5xl xl:max-w-6xl" },
3373
+ { side: "right", size: "2xl", class: "sm:max-w-2xl md:max-w-4xl lg:max-w-5xl xl:max-w-6xl" },
3374
+ { side: "left", size: "full", class: "max-w-[calc(100vw-2rem)]" },
3375
+ { side: "right", size: "full", class: "max-w-[calc(100vw-2rem)]" }
3376
+ ],
3211
3377
  defaultVariants: {
3212
- side: "right"
3378
+ side: "right",
3379
+ size: "default"
3213
3380
  }
3214
3381
  }
3215
3382
  );
@@ -3217,20 +3384,21 @@ function SheetContent({
3217
3384
  className,
3218
3385
  children,
3219
3386
  side = "right",
3387
+ size = "default",
3220
3388
  showCloseButton = true,
3221
3389
  ...props
3222
3390
  }) {
3223
3391
  return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(SheetPortal, { children: [
3224
3392
  /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SheetOverlay, {}),
3225
3393
  /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
3226
- import_radix_ui24.Dialog.Content,
3394
+ import_radix_ui25.Dialog.Content,
3227
3395
  {
3228
3396
  "data-slot": "sheet-content",
3229
- className: cn(sheetContentVariants({ side }), className),
3397
+ className: cn(sheetContentVariants({ side, size }), className),
3230
3398
  ...props,
3231
3399
  children: [
3232
3400
  children,
3233
- showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_radix_ui24.Dialog.Close, { className: "absolute top-4 right-4 rounded-xs opacity-70 transition-[opacity,background-color] hover:bg-ghost-fill-hover hover:opacity-100 focus:ring-2 focus:ring-foreground/10 focus:outline-hidden disabled:pointer-events-none", children: [
3401
+ showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_radix_ui25.Dialog.Close, { className: "absolute top-4 right-4 rounded-xs opacity-70 transition-[opacity,background-color] hover:bg-ghost-fill-hover hover:opacity-100 focus:ring-2 focus:ring-foreground/10 focus:outline-hidden disabled:pointer-events-none", children: [
3234
3402
  /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_lucide_react16.XIcon, { className: "size-4" }),
3235
3403
  /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "sr-only", children: "Close" })
3236
3404
  ] }) : null
@@ -3264,7 +3432,7 @@ function SheetTitle({
3264
3432
  ...props
3265
3433
  }) {
3266
3434
  return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
3267
- import_radix_ui24.Dialog.Title,
3435
+ import_radix_ui25.Dialog.Title,
3268
3436
  {
3269
3437
  "data-slot": "sheet-title",
3270
3438
  className: cn("text-lg font-semibold text-foreground", className),
@@ -3277,7 +3445,7 @@ function SheetDescription({
3277
3445
  ...props
3278
3446
  }) {
3279
3447
  return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
3280
- import_radix_ui24.Dialog.Description,
3448
+ import_radix_ui25.Dialog.Description,
3281
3449
  {
3282
3450
  "data-slot": "sheet-description",
3283
3451
  className: cn("text-sm text-muted-foreground", className),
@@ -3287,29 +3455,29 @@ function SheetDescription({
3287
3455
  }
3288
3456
 
3289
3457
  // src/ui/alert-dialog.tsx
3290
- var import_radix_ui25 = require("radix-ui");
3458
+ var import_radix_ui26 = require("radix-ui");
3291
3459
  var import_jsx_runtime36 = require("react/jsx-runtime");
3292
3460
  function AlertDialog({
3293
3461
  ...props
3294
3462
  }) {
3295
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_radix_ui25.AlertDialog.Root, { "data-slot": "alert-dialog", ...props });
3463
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_radix_ui26.AlertDialog.Root, { "data-slot": "alert-dialog", ...props });
3296
3464
  }
3297
3465
  function AlertDialogTrigger({
3298
3466
  ...props
3299
3467
  }) {
3300
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_radix_ui25.AlertDialog.Trigger, { "data-slot": "alert-dialog-trigger", ...props });
3468
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_radix_ui26.AlertDialog.Trigger, { "data-slot": "alert-dialog-trigger", ...props });
3301
3469
  }
3302
3470
  function AlertDialogPortal({
3303
3471
  ...props
3304
3472
  }) {
3305
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_radix_ui25.AlertDialog.Portal, { "data-slot": "alert-dialog-portal", ...props });
3473
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_radix_ui26.AlertDialog.Portal, { "data-slot": "alert-dialog-portal", ...props });
3306
3474
  }
3307
3475
  function AlertDialogOverlay({
3308
3476
  className,
3309
3477
  ...props
3310
3478
  }) {
3311
3479
  return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3312
- import_radix_ui25.AlertDialog.Overlay,
3480
+ import_radix_ui26.AlertDialog.Overlay,
3313
3481
  {
3314
3482
  "data-slot": "alert-dialog-overlay",
3315
3483
  className: cn(
@@ -3327,7 +3495,7 @@ function AlertDialogContent({
3327
3495
  return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(AlertDialogPortal, { children: [
3328
3496
  /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(AlertDialogOverlay, {}),
3329
3497
  /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3330
- import_radix_ui25.AlertDialog.Content,
3498
+ import_radix_ui26.AlertDialog.Content,
3331
3499
  {
3332
3500
  "data-slot": "alert-dialog-content",
3333
3501
  className: cn(
@@ -3368,7 +3536,7 @@ function AlertDialogTitle({
3368
3536
  ...props
3369
3537
  }) {
3370
3538
  return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3371
- import_radix_ui25.AlertDialog.Title,
3539
+ import_radix_ui26.AlertDialog.Title,
3372
3540
  {
3373
3541
  "data-slot": "alert-dialog-title",
3374
3542
  className: cn("text-lg font-semibold", className),
@@ -3381,7 +3549,7 @@ function AlertDialogDescription({
3381
3549
  ...props
3382
3550
  }) {
3383
3551
  return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3384
- import_radix_ui25.AlertDialog.Description,
3552
+ import_radix_ui26.AlertDialog.Description,
3385
3553
  {
3386
3554
  "data-slot": "alert-dialog-description",
3387
3555
  className: cn("text-sm text-muted-foreground", className),
@@ -3394,7 +3562,7 @@ function AlertDialogAction({
3394
3562
  ...props
3395
3563
  }) {
3396
3564
  return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Button, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3397
- import_radix_ui25.AlertDialog.Action,
3565
+ import_radix_ui26.AlertDialog.Action,
3398
3566
  {
3399
3567
  "data-slot": "alert-dialog-action",
3400
3568
  className,
@@ -3407,7 +3575,7 @@ function AlertDialogCancel({
3407
3575
  ...props
3408
3576
  }) {
3409
3577
  return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Button, { asChild: true, variant: "outline", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
3410
- import_radix_ui25.AlertDialog.Cancel,
3578
+ import_radix_ui26.AlertDialog.Cancel,
3411
3579
  {
3412
3580
  "data-slot": "alert-dialog-cancel",
3413
3581
  className,
@@ -3417,24 +3585,24 @@ function AlertDialogCancel({
3417
3585
  }
3418
3586
 
3419
3587
  // src/ui/collapsible.tsx
3420
- var import_radix_ui26 = require("radix-ui");
3588
+ var import_radix_ui27 = require("radix-ui");
3421
3589
  var import_jsx_runtime37 = require("react/jsx-runtime");
3422
3590
  function Collapsible({
3423
3591
  ...props
3424
3592
  }) {
3425
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_radix_ui26.Collapsible.Root, { "data-slot": "collapsible", ...props });
3593
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_radix_ui27.Collapsible.Root, { "data-slot": "collapsible", ...props });
3426
3594
  }
3427
3595
  function CollapsibleTrigger({
3428
3596
  ...props
3429
3597
  }) {
3430
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_radix_ui26.Collapsible.Trigger, { "data-slot": "collapsible-trigger", ...props });
3598
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_radix_ui27.Collapsible.Trigger, { "data-slot": "collapsible-trigger", ...props });
3431
3599
  }
3432
3600
  function CollapsibleContent({
3433
3601
  className,
3434
3602
  ...props
3435
3603
  }) {
3436
3604
  return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
3437
- import_radix_ui26.Collapsible.Content,
3605
+ import_radix_ui27.Collapsible.Content,
3438
3606
  {
3439
3607
  "data-slot": "collapsible-content",
3440
3608
  className: cn(
@@ -3447,7 +3615,7 @@ function CollapsibleContent({
3447
3615
  }
3448
3616
 
3449
3617
  // src/ui/scroll-area.tsx
3450
- var import_radix_ui27 = require("radix-ui");
3618
+ var import_radix_ui28 = require("radix-ui");
3451
3619
  var import_jsx_runtime38 = require("react/jsx-runtime");
3452
3620
  function ScrollArea({
3453
3621
  className,
@@ -3455,14 +3623,14 @@ function ScrollArea({
3455
3623
  ...props
3456
3624
  }) {
3457
3625
  return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
3458
- import_radix_ui27.ScrollArea.Root,
3626
+ import_radix_ui28.ScrollArea.Root,
3459
3627
  {
3460
3628
  "data-slot": "scroll-area",
3461
3629
  className: cn("relative overflow-hidden", className),
3462
3630
  ...props,
3463
3631
  children: [
3464
3632
  /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3465
- import_radix_ui27.ScrollArea.Viewport,
3633
+ import_radix_ui28.ScrollArea.Viewport,
3466
3634
  {
3467
3635
  "data-slot": "scroll-area-viewport",
3468
3636
  className: "size-full rounded-[inherit] outline-none transition-[color,box-shadow] focus-visible:ring-2 focus-visible:ring-foreground/10",
@@ -3470,7 +3638,7 @@ function ScrollArea({
3470
3638
  }
3471
3639
  ),
3472
3640
  /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ScrollBar, {}),
3473
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_radix_ui27.ScrollArea.Corner, {})
3641
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_radix_ui28.ScrollArea.Corner, {})
3474
3642
  ]
3475
3643
  }
3476
3644
  );
@@ -3481,7 +3649,7 @@ function ScrollBar({
3481
3649
  ...props
3482
3650
  }) {
3483
3651
  return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3484
- import_radix_ui27.ScrollArea.ScrollAreaScrollbar,
3652
+ import_radix_ui28.ScrollArea.ScrollAreaScrollbar,
3485
3653
  {
3486
3654
  "data-slot": "scroll-area-scrollbar",
3487
3655
  orientation,
@@ -3493,7 +3661,7 @@ function ScrollBar({
3493
3661
  ),
3494
3662
  ...props,
3495
3663
  children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
3496
- import_radix_ui27.ScrollArea.ScrollAreaThumb,
3664
+ import_radix_ui28.ScrollArea.ScrollAreaThumb,
3497
3665
  {
3498
3666
  "data-slot": "scroll-area-thumb",
3499
3667
  className: "relative flex-1 rounded-full bg-border"
@@ -3504,10 +3672,10 @@ function ScrollBar({
3504
3672
  }
3505
3673
 
3506
3674
  // src/ui/toggle.tsx
3507
- var import_radix_ui28 = require("radix-ui");
3508
- var import_class_variance_authority5 = require("class-variance-authority");
3675
+ var import_radix_ui29 = require("radix-ui");
3676
+ var import_class_variance_authority6 = require("class-variance-authority");
3509
3677
  var import_jsx_runtime39 = require("react/jsx-runtime");
3510
- var toggleVariants = (0, import_class_variance_authority5.cva)(
3678
+ var toggleVariants = (0, import_class_variance_authority6.cva)(
3511
3679
  "inline-flex items-center justify-center gap-2 rounded-lg text-sm font-medium whitespace-nowrap outline-none transition-[color,box-shadow,background-color,border-color] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0",
3512
3680
  {
3513
3681
  variants: {
@@ -3544,7 +3712,7 @@ function Toggle({
3544
3712
  ...props
3545
3713
  }) {
3546
3714
  return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
3547
- import_radix_ui28.Toggle.Root,
3715
+ import_radix_ui29.Toggle.Root,
3548
3716
  {
3549
3717
  "data-slot": "toggle",
3550
3718
  className: cn(toggleVariants({ variant, size, className })),
@@ -3554,14 +3722,14 @@ function Toggle({
3554
3722
  }
3555
3723
 
3556
3724
  // src/ui/toggle-group.tsx
3557
- var import_radix_ui29 = require("radix-ui");
3725
+ var import_radix_ui30 = require("radix-ui");
3558
3726
  var import_jsx_runtime40 = require("react/jsx-runtime");
3559
3727
  function ToggleGroup({
3560
3728
  className,
3561
3729
  ...props
3562
3730
  }) {
3563
3731
  return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
3564
- import_radix_ui29.ToggleGroup.Root,
3732
+ import_radix_ui30.ToggleGroup.Root,
3565
3733
  {
3566
3734
  "data-slot": "toggle-group",
3567
3735
  className: cn("flex items-center gap-1", className),
@@ -3574,7 +3742,7 @@ function ToggleGroupItem({
3574
3742
  ...props
3575
3743
  }) {
3576
3744
  return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
3577
- import_radix_ui29.ToggleGroup.Item,
3745
+ import_radix_ui30.ToggleGroup.Item,
3578
3746
  {
3579
3747
  "data-slot": "toggle-group-item",
3580
3748
  className: cn(toggleVariants({ variant: "default", size: "default" }), className),
@@ -3584,17 +3752,17 @@ function ToggleGroupItem({
3584
3752
  }
3585
3753
 
3586
3754
  // src/ui/hover-card.tsx
3587
- var import_radix_ui30 = require("radix-ui");
3755
+ var import_radix_ui31 = require("radix-ui");
3588
3756
  var import_jsx_runtime41 = require("react/jsx-runtime");
3589
3757
  function HoverCard({
3590
3758
  ...props
3591
3759
  }) {
3592
- return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_radix_ui30.HoverCard.Root, { "data-slot": "hover-card", ...props });
3760
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_radix_ui31.HoverCard.Root, { "data-slot": "hover-card", ...props });
3593
3761
  }
3594
3762
  function HoverCardTrigger({
3595
3763
  ...props
3596
3764
  }) {
3597
- return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_radix_ui30.HoverCard.Trigger, { "data-slot": "hover-card-trigger", ...props });
3765
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_radix_ui31.HoverCard.Trigger, { "data-slot": "hover-card-trigger", ...props });
3598
3766
  }
3599
3767
  function HoverCardContent({
3600
3768
  className,
@@ -3602,8 +3770,8 @@ function HoverCardContent({
3602
3770
  sideOffset = 4,
3603
3771
  ...props
3604
3772
  }) {
3605
- return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_radix_ui30.HoverCard.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
3606
- import_radix_ui30.HoverCard.Content,
3773
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_radix_ui31.HoverCard.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
3774
+ import_radix_ui31.HoverCard.Content,
3607
3775
  {
3608
3776
  "data-slot": "hover-card-content",
3609
3777
  align,
@@ -3619,30 +3787,30 @@ function HoverCardContent({
3619
3787
  }
3620
3788
 
3621
3789
  // src/ui/context-menu.tsx
3622
- var import_radix_ui31 = require("radix-ui");
3790
+ var import_radix_ui32 = require("radix-ui");
3623
3791
  var import_lucide_react17 = require("lucide-react");
3624
3792
  var import_jsx_runtime42 = require("react/jsx-runtime");
3625
3793
  function ContextMenu({
3626
3794
  ...props
3627
3795
  }) {
3628
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui31.ContextMenu.Root, { "data-slot": "context-menu", ...props });
3796
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui32.ContextMenu.Root, { "data-slot": "context-menu", ...props });
3629
3797
  }
3630
3798
  function ContextMenuTrigger({
3631
3799
  ...props
3632
3800
  }) {
3633
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui31.ContextMenu.Trigger, { "data-slot": "context-menu-trigger", ...props });
3801
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui32.ContextMenu.Trigger, { "data-slot": "context-menu-trigger", ...props });
3634
3802
  }
3635
3803
  function ContextMenuGroup({
3636
3804
  ...props
3637
3805
  }) {
3638
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui31.ContextMenu.Group, { "data-slot": "context-menu-group", ...props });
3806
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui32.ContextMenu.Group, { "data-slot": "context-menu-group", ...props });
3639
3807
  }
3640
3808
  function ContextMenuContent({
3641
3809
  className,
3642
3810
  ...props
3643
3811
  }) {
3644
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui31.ContextMenu.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
3645
- import_radix_ui31.ContextMenu.Content,
3812
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui32.ContextMenu.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
3813
+ import_radix_ui32.ContextMenu.Content,
3646
3814
  {
3647
3815
  "data-slot": "context-menu-content",
3648
3816
  className: cn(
@@ -3661,7 +3829,7 @@ function ContextMenuItem({
3661
3829
  ...props
3662
3830
  }) {
3663
3831
  return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
3664
- import_radix_ui31.ContextMenu.Item,
3832
+ import_radix_ui32.ContextMenu.Item,
3665
3833
  {
3666
3834
  "data-slot": "context-menu-item",
3667
3835
  "data-inset": inset,
@@ -3682,14 +3850,14 @@ function ContextMenuCheckboxItem({
3682
3850
  ...props
3683
3851
  }) {
3684
3852
  return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
3685
- import_radix_ui31.ContextMenu.CheckboxItem,
3853
+ import_radix_ui32.ContextMenu.CheckboxItem,
3686
3854
  {
3687
3855
  "data-slot": "context-menu-checkbox-item",
3688
3856
  className: cn(overlayItemClass, "py-1.5 pr-2 pl-8", className),
3689
3857
  checked,
3690
3858
  ...props,
3691
3859
  children: [
3692
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui31.ContextMenu.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_lucide_react17.CheckIcon, { className: "size-4" }) }) }),
3860
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui32.ContextMenu.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_lucide_react17.CheckIcon, { className: "size-4" }) }) }),
3693
3861
  children
3694
3862
  ]
3695
3863
  }
@@ -3699,7 +3867,7 @@ function ContextMenuRadioGroup({
3699
3867
  ...props
3700
3868
  }) {
3701
3869
  return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
3702
- import_radix_ui31.ContextMenu.RadioGroup,
3870
+ import_radix_ui32.ContextMenu.RadioGroup,
3703
3871
  {
3704
3872
  "data-slot": "context-menu-radio-group",
3705
3873
  ...props
@@ -3712,13 +3880,13 @@ function ContextMenuRadioItem({
3712
3880
  ...props
3713
3881
  }) {
3714
3882
  return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
3715
- import_radix_ui31.ContextMenu.RadioItem,
3883
+ import_radix_ui32.ContextMenu.RadioItem,
3716
3884
  {
3717
3885
  "data-slot": "context-menu-radio-item",
3718
3886
  className: cn(overlayItemClass, "py-1.5 pr-2 pl-8", className),
3719
3887
  ...props,
3720
3888
  children: [
3721
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui31.ContextMenu.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_lucide_react17.CircleIcon, { className: "size-2 fill-current" }) }) }),
3889
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui32.ContextMenu.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_lucide_react17.CircleIcon, { className: "size-2 fill-current" }) }) }),
3722
3890
  children
3723
3891
  ]
3724
3892
  }
@@ -3730,7 +3898,7 @@ function ContextMenuLabel({
3730
3898
  ...props
3731
3899
  }) {
3732
3900
  return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
3733
- import_radix_ui31.ContextMenu.Label,
3901
+ import_radix_ui32.ContextMenu.Label,
3734
3902
  {
3735
3903
  "data-slot": "context-menu-label",
3736
3904
  "data-inset": inset,
@@ -3747,7 +3915,7 @@ function ContextMenuSeparator({
3747
3915
  ...props
3748
3916
  }) {
3749
3917
  return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
3750
- import_radix_ui31.ContextMenu.Separator,
3918
+ import_radix_ui32.ContextMenu.Separator,
3751
3919
  {
3752
3920
  "data-slot": "context-menu-separator",
3753
3921
  className: cn("-mx-1 my-1 h-px bg-border", className),
@@ -3774,7 +3942,7 @@ function ContextMenuShortcut({
3774
3942
  function ContextMenuSub({
3775
3943
  ...props
3776
3944
  }) {
3777
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui31.ContextMenu.Sub, { "data-slot": "context-menu-sub", ...props });
3945
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_radix_ui32.ContextMenu.Sub, { "data-slot": "context-menu-sub", ...props });
3778
3946
  }
3779
3947
  function ContextMenuSubTrigger({
3780
3948
  className,
@@ -3783,7 +3951,7 @@ function ContextMenuSubTrigger({
3783
3951
  ...props
3784
3952
  }) {
3785
3953
  return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
3786
- import_radix_ui31.ContextMenu.SubTrigger,
3954
+ import_radix_ui32.ContextMenu.SubTrigger,
3787
3955
  {
3788
3956
  "data-slot": "context-menu-sub-trigger",
3789
3957
  "data-inset": inset,
@@ -3805,7 +3973,7 @@ function ContextMenuSubContent({
3805
3973
  ...props
3806
3974
  }) {
3807
3975
  return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
3808
- import_radix_ui31.ContextMenu.SubContent,
3976
+ import_radix_ui32.ContextMenu.SubContent,
3809
3977
  {
3810
3978
  "data-slot": "context-menu-sub-content",
3811
3979
  className: cn(
@@ -3819,9 +3987,9 @@ function ContextMenuSubContent({
3819
3987
  }
3820
3988
 
3821
3989
  // src/ui/alert.tsx
3822
- var import_class_variance_authority6 = require("class-variance-authority");
3990
+ var import_class_variance_authority7 = require("class-variance-authority");
3823
3991
  var import_jsx_runtime43 = require("react/jsx-runtime");
3824
- var alertVariants = (0, import_class_variance_authority6.cva)(
3992
+ var alertVariants = (0, import_class_variance_authority7.cva)(
3825
3993
  "relative grid w-full gap-1 rounded-xl border px-4 py-3 text-sm [&>svg]:absolute [&>svg]:top-3.5 [&>svg]:left-4 [&>svg]:size-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11",
3826
3994
  {
3827
3995
  variants: {
@@ -3945,13 +4113,13 @@ function Skeleton({ className, ...props }) {
3945
4113
  }
3946
4114
 
3947
4115
  // src/ui/chart.tsx
3948
- var React5 = __toESM(require("react"), 1);
4116
+ var React4 = __toESM(require("react"), 1);
3949
4117
  var RechartsPrimitive = __toESM(require("recharts"), 1);
3950
4118
  var import_jsx_runtime46 = require("react/jsx-runtime");
3951
4119
  var THEMES = { light: "", dark: ".dark" };
3952
- var ChartContext = React5.createContext(null);
4120
+ var ChartContext = React4.createContext(null);
3953
4121
  function useChart() {
3954
- const context = React5.useContext(ChartContext);
4122
+ const context = React4.useContext(ChartContext);
3955
4123
  if (!context) {
3956
4124
  throw new Error("useChart must be used within a <ChartContainer />");
3957
4125
  }
@@ -3964,7 +4132,7 @@ function ChartContainer({
3964
4132
  config,
3965
4133
  ...props
3966
4134
  }) {
3967
- const uniqueId = React5.useId();
4135
+ const uniqueId = React4.useId();
3968
4136
  const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
3969
4137
  return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(ChartContext.Provider, { value: { config }, children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(
3970
4138
  "div",
@@ -3978,7 +4146,7 @@ function ChartContainer({
3978
4146
  ...props,
3979
4147
  children: [
3980
4148
  /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(ChartStyle, { id: chartId, config }),
3981
- /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(RechartsPrimitive.ResponsiveContainer, { children })
4149
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(RechartsPrimitive.ResponsiveContainer, { width: "100%", height: "100%", children })
3982
4150
  ]
3983
4151
  }
3984
4152
  ) });
@@ -4009,6 +4177,36 @@ ${colorConfig.map(([key, itemConfig]) => {
4009
4177
  );
4010
4178
  };
4011
4179
  var ChartTooltip = RechartsPrimitive.Tooltip;
4180
+ var CHART_TOOLTIP_SURFACE = "rounded-xl border px-5 py-4 text-left text-[11px] leading-snug shadow-[0_12px_40px_-10px_rgba(0,0,0,0.55)] border-white/10 bg-gradient-to-b from-neutral-800 to-neutral-950 text-white dark:border-black/10 dark:from-white dark:to-neutral-100 dark:text-neutral-900";
4181
+ var CHART_TOOLTIP_TEXT = "text-white dark:text-neutral-900";
4182
+ var CHART_TOOLTIP_MUTED = "text-neutral-300 dark:text-neutral-600";
4183
+ function isCssColor(value) {
4184
+ return typeof value === "string" && value.length > 0 && !value.startsWith("url(");
4185
+ }
4186
+ function resolvePayloadConfigKey(payload, key) {
4187
+ if (typeof payload !== "object" || payload === null) {
4188
+ return key;
4189
+ }
4190
+ const row = payload;
4191
+ const nested = "payload" in row && typeof row.payload === "object" && row.payload !== null ? row.payload : void 0;
4192
+ if (key in row && typeof row[key] === "string") {
4193
+ return row[key];
4194
+ }
4195
+ if (nested && key in nested && typeof nested[key] === "string") {
4196
+ return nested[key];
4197
+ }
4198
+ if (typeof row.value === "string") {
4199
+ return row.value;
4200
+ }
4201
+ return key;
4202
+ }
4203
+ function resolveSwatchColor(itemConfig, configKey, ...candidates) {
4204
+ for (const candidate of candidates) {
4205
+ if (isCssColor(candidate)) return candidate;
4206
+ }
4207
+ if (isCssColor(itemConfig?.color)) return itemConfig.color;
4208
+ return `var(--color-${configKey})`;
4209
+ }
4012
4210
  function ChartTooltipContent({
4013
4211
  active,
4014
4212
  payload,
@@ -4020,12 +4218,13 @@ function ChartTooltipContent({
4020
4218
  labelFormatter,
4021
4219
  labelClassName,
4022
4220
  formatter,
4221
+ valueFormatter,
4023
4222
  color,
4024
4223
  nameKey,
4025
4224
  labelKey
4026
4225
  }) {
4027
4226
  const { config } = useChart();
4028
- const tooltipLabel = React5.useMemo(() => {
4227
+ const tooltipLabel = React4.useMemo(() => {
4029
4228
  if (hideLabel || !payload?.length) {
4030
4229
  return null;
4031
4230
  }
@@ -4034,12 +4233,12 @@ function ChartTooltipContent({
4034
4233
  const itemConfig = getPayloadConfigFromPayload(config, item, key);
4035
4234
  const value = !labelKey && typeof label === "string" ? config[label]?.label || label : itemConfig?.label;
4036
4235
  if (labelFormatter) {
4037
- return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: cn("font-medium", labelClassName), children: labelFormatter(value, payload) });
4236
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: cn("font-medium leading-none", labelClassName), children: labelFormatter(value, payload) });
4038
4237
  }
4039
4238
  if (!value) {
4040
4239
  return null;
4041
4240
  }
4042
- return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: cn("font-medium", labelClassName), children: value });
4241
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: cn("font-medium leading-none", labelClassName), children: value });
4043
4242
  }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey]);
4044
4243
  if (!active || !payload?.length) {
4045
4244
  return null;
@@ -4049,7 +4248,8 @@ function ChartTooltipContent({
4049
4248
  "div",
4050
4249
  {
4051
4250
  className: cn(
4052
- "border-border/50 bg-background grid min-w-[8rem] items-start gap-1.5 rounded-lg border px-2.5 py-1.5 text-xs shadow-xl",
4251
+ "grid min-w-[8rem] items-start gap-1.5",
4252
+ CHART_TOOLTIP_SURFACE,
4053
4253
  "animate-in fade-in-0 zoom-in-95 duration-150",
4054
4254
  className
4055
4255
  ),
@@ -4057,31 +4257,35 @@ function ChartTooltipContent({
4057
4257
  !nestLabel ? tooltipLabel : null,
4058
4258
  /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "grid gap-1.5", children: payload.filter((item) => item.type !== "none").map((item, index) => {
4059
4259
  const key = `${nameKey || item.name || item.dataKey || "value"}`;
4260
+ const configKey = resolvePayloadConfigKey(item, key);
4060
4261
  const itemConfig = getPayloadConfigFromPayload(config, item, key);
4061
- const indicatorColor = color || item.payload?.fill || item.color;
4262
+ const indicatorColor = resolveSwatchColor(
4263
+ itemConfig,
4264
+ configKey,
4265
+ color,
4266
+ item.payload?.fill,
4267
+ item.color
4268
+ );
4062
4269
  return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
4063
4270
  "div",
4064
4271
  {
4065
4272
  className: cn(
4066
- "[&>svg]:text-muted-foreground flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5",
4273
+ "flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-neutral-500 dark:[&>svg]:text-neutral-400",
4067
4274
  indicator === "dot" && "items-center"
4068
4275
  ),
4069
4276
  children: formatter && item?.value !== void 0 && item.name ? formatter(item.value, item.name, item, index, item.payload) : /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_jsx_runtime46.Fragment, { children: [
4070
4277
  itemConfig?.icon ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(itemConfig.icon, {}) : !hideIndicator && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
4071
4278
  "div",
4072
4279
  {
4073
- className: cn(
4074
- "shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)",
4075
- {
4076
- "h-2.5 w-2.5": indicator === "dot",
4077
- "w-1": indicator === "line",
4078
- "w-0 border-[1.5px] border-dashed bg-transparent": indicator === "dashed",
4079
- "my-0.5": nestLabel && indicator === "dashed"
4080
- }
4081
- ),
4280
+ className: cn("shrink-0 rounded-[2px]", {
4281
+ "h-2.5 w-2.5": indicator === "dot",
4282
+ "w-1": indicator === "line",
4283
+ "w-0 border-[1.5px] border-dashed bg-transparent": indicator === "dashed",
4284
+ "my-0.5": nestLabel && indicator === "dashed"
4285
+ }),
4082
4286
  style: {
4083
- "--color-bg": indicatorColor,
4084
- "--color-border": indicatorColor
4287
+ backgroundColor: indicator === "dashed" ? void 0 : indicatorColor,
4288
+ borderColor: indicatorColor
4085
4289
  }
4086
4290
  }
4087
4291
  ),
@@ -4089,15 +4293,15 @@ function ChartTooltipContent({
4089
4293
  "div",
4090
4294
  {
4091
4295
  className: cn(
4092
- "flex flex-1 justify-between leading-none",
4296
+ "flex flex-1 justify-between gap-3 leading-none",
4093
4297
  nestLabel ? "items-end" : "items-center"
4094
4298
  ),
4095
4299
  children: [
4096
4300
  /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "grid gap-1.5", children: [
4097
4301
  nestLabel ? tooltipLabel : null,
4098
- /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "text-muted-foreground", children: itemConfig?.label || item.name })
4302
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: CHART_TOOLTIP_MUTED, children: itemConfig?.label || item.name })
4099
4303
  ] }),
4100
- item.value != null && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "text-foreground font-mono font-medium tabular-nums", children: typeof item.value === "number" ? item.value.toLocaleString() : String(item.value) })
4304
+ item.value != null && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: cn("font-medium tabular-nums", CHART_TOOLTIP_TEXT), children: valueFormatter ? valueFormatter(item.value, item) : typeof item.value === "number" ? item.value.toLocaleString() : String(item.value) })
4101
4305
  ]
4102
4306
  }
4103
4307
  )
@@ -4132,7 +4336,9 @@ function ChartLegendContent({
4132
4336
  ),
4133
4337
  children: payload.filter((item) => item.type !== "none").map((item, index) => {
4134
4338
  const key = `${nameKey || item.dataKey || "value"}`;
4339
+ const configKey = resolvePayloadConfigKey(item, key);
4135
4340
  const itemConfig = getPayloadConfigFromPayload(config, item, key);
4341
+ const swatchColor = resolveSwatchColor(itemConfig, configKey, item.color);
4136
4342
  return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(
4137
4343
  "div",
4138
4344
  {
@@ -4142,7 +4348,7 @@ function ChartLegendContent({
4142
4348
  "div",
4143
4349
  {
4144
4350
  className: "h-2 w-2 shrink-0 rounded-[2px]",
4145
- style: { backgroundColor: item.color }
4351
+ style: { backgroundColor: swatchColor }
4146
4352
  }
4147
4353
  ),
4148
4354
  /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "min-w-0 truncate", children: itemConfig?.label ?? (item.value != null ? String(item.value) : null) })
@@ -4158,13 +4364,7 @@ function getPayloadConfigFromPayload(config, payload, key) {
4158
4364
  if (typeof payload !== "object" || payload === null) {
4159
4365
  return void 0;
4160
4366
  }
4161
- const payloadPayload = "payload" in payload && typeof payload.payload === "object" && payload.payload !== null ? payload.payload : void 0;
4162
- let configLabelKey = key;
4163
- if (key in payload && typeof payload[key] === "string") {
4164
- configLabelKey = payload[key];
4165
- } else if (payloadPayload && key in payloadPayload && typeof payloadPayload[key] === "string") {
4166
- configLabelKey = payloadPayload[key];
4167
- }
4367
+ const configLabelKey = resolvePayloadConfigKey(payload, key);
4168
4368
  return configLabelKey in config ? config[configLabelKey] : config[key];
4169
4369
  }
4170
4370
 
@@ -4264,20 +4464,20 @@ function TableCaption({ className, ...props }) {
4264
4464
  }
4265
4465
 
4266
4466
  // src/ui/toast.tsx
4267
- var import_radix_ui32 = require("radix-ui");
4467
+ var import_radix_ui33 = require("radix-ui");
4268
4468
  var import_lucide_react18 = require("lucide-react");
4269
4469
  var import_jsx_runtime48 = require("react/jsx-runtime");
4270
4470
  function ToastProvider({
4271
4471
  ...props
4272
4472
  }) {
4273
- return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_radix_ui32.Toast.Provider, { "data-slot": "toast-provider", ...props });
4473
+ return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_radix_ui33.Toast.Provider, { "data-slot": "toast-provider", ...props });
4274
4474
  }
4275
4475
  function ToastViewport({
4276
4476
  className,
4277
4477
  ...props
4278
4478
  }) {
4279
4479
  return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
4280
- import_radix_ui32.Toast.Viewport,
4480
+ import_radix_ui33.Toast.Viewport,
4281
4481
  {
4282
4482
  "data-slot": "toast-viewport",
4283
4483
  className: cn(
@@ -4294,7 +4494,7 @@ function Toast({
4294
4494
  ...props
4295
4495
  }) {
4296
4496
  return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
4297
- import_radix_ui32.Toast.Root,
4497
+ import_radix_ui33.Toast.Root,
4298
4498
  {
4299
4499
  "data-slot": "toast",
4300
4500
  className: cn(
@@ -4313,7 +4513,7 @@ function ToastAction({
4313
4513
  ...props
4314
4514
  }) {
4315
4515
  return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
4316
- import_radix_ui32.Toast.Action,
4516
+ import_radix_ui33.Toast.Action,
4317
4517
  {
4318
4518
  "data-slot": "toast-action",
4319
4519
  className: cn(
@@ -4329,7 +4529,7 @@ function ToastClose({
4329
4529
  ...props
4330
4530
  }) {
4331
4531
  return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
4332
- import_radix_ui32.Toast.Close,
4532
+ import_radix_ui33.Toast.Close,
4333
4533
  {
4334
4534
  "data-slot": "toast-close",
4335
4535
  className: cn(
@@ -4347,7 +4547,7 @@ function ToastTitle({
4347
4547
  ...props
4348
4548
  }) {
4349
4549
  return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
4350
- import_radix_ui32.Toast.Title,
4550
+ import_radix_ui33.Toast.Title,
4351
4551
  {
4352
4552
  "data-slot": "toast-title",
4353
4553
  className: cn("text-sm font-medium", className),
@@ -4360,7 +4560,7 @@ function ToastDescription({
4360
4560
  ...props
4361
4561
  }) {
4362
4562
  return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
4363
- import_radix_ui32.Toast.Description,
4563
+ import_radix_ui33.Toast.Description,
4364
4564
  {
4365
4565
  "data-slot": "toast-description",
4366
4566
  className: cn("text-sm text-muted-foreground", className),
@@ -4370,7 +4570,7 @@ function ToastDescription({
4370
4570
  }
4371
4571
 
4372
4572
  // src/ui/use-toast.ts
4373
- var React6 = __toESM(require("react"), 1);
4573
+ var React5 = __toESM(require("react"), 1);
4374
4574
  var TOAST_LIMIT = 3;
4375
4575
  var TOAST_REMOVE_DELAY = 5e3;
4376
4576
  var listeners = /* @__PURE__ */ new Set();
@@ -4423,8 +4623,8 @@ function toast(input) {
4423
4623
  return memoryState.add(input);
4424
4624
  }
4425
4625
  function useToast() {
4426
- const [state, setState] = React6.useState(memoryState);
4427
- React6.useEffect(() => {
4626
+ const [state, setState] = React5.useState(memoryState);
4627
+ React5.useEffect(() => {
4428
4628
  listeners.add(setState);
4429
4629
  return () => {
4430
4630
  listeners.delete(setState);
@@ -4479,30 +4679,159 @@ var ShimmerComponent = ({
4479
4679
  () => (children?.length ?? 0) * spread,
4480
4680
  [children, spread]
4481
4681
  );
4482
- return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
4483
- MotionComponent,
4682
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
4683
+ MotionComponent,
4684
+ {
4685
+ animate: { backgroundPosition: "0% center" },
4686
+ className: cn(
4687
+ "relative inline-block bg-[length:250%_100%,auto] bg-clip-text text-transparent",
4688
+ "[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-background),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]",
4689
+ className
4690
+ ),
4691
+ initial: { backgroundPosition: "100% center" },
4692
+ style: {
4693
+ "--spread": `${dynamicSpread}px`,
4694
+ backgroundImage: "var(--bg), linear-gradient(var(--color-muted-foreground), var(--color-muted-foreground))"
4695
+ },
4696
+ transition: {
4697
+ repeat: Number.POSITIVE_INFINITY,
4698
+ duration,
4699
+ ease: "linear"
4700
+ },
4701
+ children
4702
+ }
4703
+ );
4704
+ };
4705
+ var Shimmer = (0, import_react2.memo)(ShimmerComponent);
4706
+
4707
+ // src/ui/timbal-v2-button.tsx
4708
+ var React6 = __toESM(require("react"), 1);
4709
+ var import_radix_ui34 = require("radix-ui");
4710
+ var import_jsx_runtime51 = require("react/jsx-runtime");
4711
+ var TIMBAL_V2_FILL_AS_CHILD = {
4712
+ primary: [
4713
+ "bg-gradient-to-b from-primary-fill-from to-primary-fill-to",
4714
+ "hover:from-primary-fill-hover-from hover:to-primary-fill-hover-to",
4715
+ "active:from-primary-fill-active-from active:to-primary-fill-active-to"
4716
+ ].join(" "),
4717
+ informative: [
4718
+ TIMBAL_V2_PRIMARY_GRADIENT,
4719
+ "hover:from-primary-fill-hover-from hover:to-primary-fill-hover-to",
4720
+ "active:from-primary-fill-active-from active:to-primary-fill-active-to",
4721
+ "active:[background-image:linear-gradient(to_top,rgba(0,0,0,0.08),transparent_55%)]"
4722
+ ].join(" "),
4723
+ destructive: [
4724
+ TIMBAL_V2_ELEVATED_GRADIENT,
4725
+ "hover:from-destructive-fill-hover-from hover:to-destructive-fill-hover-to",
4726
+ "active:from-destructive-fill-active-from active:to-destructive-fill-active-to"
4727
+ ].join(" "),
4728
+ "destructive-solid": [
4729
+ "bg-gradient-to-b from-destructive-solid-from to-destructive-solid-to",
4730
+ "hover:from-destructive-solid-hover-from hover:to-destructive-solid-hover-to",
4731
+ "active:from-destructive-solid-active-from active:to-destructive-solid-active-to"
4732
+ ].join(" "),
4733
+ secondary: [
4734
+ TIMBAL_V2_ELEVATED_GRADIENT,
4735
+ "hover:from-secondary-fill-hover-from hover:to-secondary-fill-hover-to",
4736
+ "active:from-secondary-fill-active-from active:to-secondary-fill-active-to"
4737
+ ].join(" "),
4738
+ ghost: [
4739
+ "bg-transparent",
4740
+ "hover:bg-ghost-fill-hover",
4741
+ "active:bg-ghost-fill-active"
4742
+ ].join(" "),
4743
+ link: "bg-transparent"
4744
+ };
4745
+ var TIMBAL_V2_LABEL_AS_CHILD = {
4746
+ ...TIMBAL_V2_LABEL,
4747
+ link: "text-foreground underline decoration-foreground/25 underline-offset-2 hover:decoration-foreground/45"
4748
+ };
4749
+ var TimbalV2Button = React6.forwardRef(function TimbalV2Button2({
4750
+ variant = "secondary",
4751
+ size = "sm",
4752
+ isIconOnly = false,
4753
+ isLoading = false,
4754
+ fullWidth = false,
4755
+ shape = "pill",
4756
+ asChild = false,
4757
+ className,
4758
+ disabled,
4759
+ type = "button",
4760
+ children,
4761
+ ...props
4762
+ }, ref) {
4763
+ const isDisabled = disabled || isLoading;
4764
+ const sizeClass2 = isIconOnly ? TIMBAL_V2_SIZE_ICON[size] : TIMBAL_V2_SIZE_HEIGHT[size];
4765
+ const radiusClass = shape === "rect" ? "rounded-lg" : "rounded-full";
4766
+ const sharedRootClass = cn(
4767
+ "relative box-border inline-flex items-center justify-center gap-2 whitespace-nowrap border-0 text-sm font-normal shadow-none transition duration-200 ease-in-out",
4768
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/60 focus-visible:ring-offset-1 focus-visible:ring-offset-background",
4769
+ sizeClass2,
4770
+ radiusClass,
4771
+ TIMBAL_V2_BORDER[variant],
4772
+ TIMBAL_V2_SHADOW[variant],
4773
+ fullWidth && "w-full",
4774
+ isDisabled && "pointer-events-none opacity-50",
4775
+ className
4776
+ );
4777
+ if (asChild) {
4778
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
4779
+ import_radix_ui34.Slot.Root,
4780
+ {
4781
+ ref,
4782
+ "aria-disabled": isDisabled ? true : void 0,
4783
+ "data-slot": "timbal-v2-button",
4784
+ "data-variant": variant,
4785
+ className: cn(
4786
+ sharedRootClass,
4787
+ TIMBAL_V2_FILL_AS_CHILD[variant],
4788
+ !isIconOnly && TIMBAL_V2_SIZE_LABEL_PX[size],
4789
+ TIMBAL_V2_LABEL_AS_CHILD[variant]
4790
+ ),
4791
+ ...props,
4792
+ children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("span", { className: "size-4 animate-spin rounded-full border-2 border-current border-t-transparent" }) : children
4793
+ }
4794
+ );
4795
+ }
4796
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
4797
+ "button",
4484
4798
  {
4485
- animate: { backgroundPosition: "0% center" },
4799
+ ref,
4800
+ type,
4801
+ disabled: isDisabled,
4802
+ "data-slot": "timbal-v2-button",
4803
+ "data-variant": variant,
4486
4804
  className: cn(
4487
- "relative inline-block bg-[length:250%_100%,auto] bg-clip-text text-transparent",
4488
- "[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-background),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]",
4489
- className
4805
+ "group/tbv2 flex-col items-stretch overflow-hidden bg-transparent p-0",
4806
+ sharedRootClass
4490
4807
  ),
4491
- initial: { backgroundPosition: "100% center" },
4492
- style: {
4493
- "--spread": `${dynamicSpread}px`,
4494
- backgroundImage: "var(--bg), linear-gradient(var(--color-muted-foreground), var(--color-muted-foreground))"
4495
- },
4496
- transition: {
4497
- repeat: Number.POSITIVE_INFINITY,
4498
- duration,
4499
- ease: "linear"
4500
- },
4501
- children
4808
+ ...props,
4809
+ children: [
4810
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
4811
+ "span",
4812
+ {
4813
+ "aria-hidden": true,
4814
+ className: cn(
4815
+ "pointer-events-none absolute inset-0 transition duration-200 ease-in-out",
4816
+ TIMBAL_V2_FILL[variant]
4817
+ )
4818
+ }
4819
+ ),
4820
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
4821
+ "span",
4822
+ {
4823
+ className: cn(
4824
+ "relative z-10 flex min-h-0 flex-1 items-center justify-center gap-1 leading-tight",
4825
+ !isIconOnly && TIMBAL_V2_SIZE_LABEL_PX[size],
4826
+ TIMBAL_V2_LABEL[variant]
4827
+ ),
4828
+ children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("span", { className: "size-4 animate-spin rounded-full border-2 border-current border-t-transparent" }) : children
4829
+ }
4830
+ )
4831
+ ]
4502
4832
  }
4503
4833
  );
4504
- };
4505
- var Shimmer = (0, import_react2.memo)(ShimmerComponent);
4834
+ });
4506
4835
 
4507
4836
  // src/ui/pill-segmented-tabs.tsx
4508
4837
  var import_react3 = require("react");
@@ -4539,7 +4868,7 @@ var pillSegmentedActiveIndicatorClass = cn(
4539
4868
  );
4540
4869
 
4541
4870
  // src/ui/pill-segmented-tabs.tsx
4542
- var import_jsx_runtime51 = require("react/jsx-runtime");
4871
+ var import_jsx_runtime52 = require("react/jsx-runtime");
4543
4872
  var PillTab = ({
4544
4873
  tabKey,
4545
4874
  label,
@@ -4553,7 +4882,7 @@ var PillTab = ({
4553
4882
  const handlePress = (0, import_react3.useCallback)(() => {
4554
4883
  if (!disabled) onSelect(tabKey);
4555
4884
  }, [disabled, onSelect, tabKey]);
4556
- return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
4885
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
4557
4886
  "button",
4558
4887
  {
4559
4888
  type: "button",
@@ -4566,15 +4895,15 @@ var PillTab = ({
4566
4895
  !disabled && (isActive ? "text-foreground" : "text-muted-foreground hover:text-foreground")
4567
4896
  ),
4568
4897
  children: [
4569
- isActive && animateIndicator ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
4898
+ isActive && animateIndicator ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
4570
4899
  import_react4.motion.div,
4571
4900
  {
4572
4901
  layoutId,
4573
4902
  className: pillSegmentedActiveIndicatorClass,
4574
4903
  transition: { type: "spring", duration: 0.3, bounce: 0.15 }
4575
4904
  }
4576
- ) : isActive ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: pillSegmentedActiveIndicatorClass, "aria-hidden": true }) : null,
4577
- /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("span", { className: "relative z-10 whitespace-nowrap", children: label })
4905
+ ) : isActive ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: pillSegmentedActiveIndicatorClass, "aria-hidden": true }) : null,
4906
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("span", { className: "relative z-10 whitespace-nowrap", children: label })
4578
4907
  ]
4579
4908
  }
4580
4909
  );
@@ -4594,7 +4923,7 @@ var PillSegmentedTabs = ({
4594
4923
  const isFlush = trackVariant === "flush";
4595
4924
  const trackClass = isFlush ? pillSegmentedTrackFlushClass : pillSegmentedTrackClass;
4596
4925
  const segmentClassName = isFlush ? pillSegmentedFlushSegmentClass : pillSegmentedSegmentClass;
4597
- return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { role: "group", "aria-label": ariaLabel, className: cn(trackClass, className), children: tabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
4926
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { role: "group", "aria-label": ariaLabel, className: cn(trackClass, className), children: tabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
4598
4927
  PillTab,
4599
4928
  {
4600
4929
  tabKey: tab.key,
@@ -4613,7 +4942,7 @@ var MemoPillSegmentedTabs = (0, import_react3.memo)(PillSegmentedTabs);
4613
4942
 
4614
4943
  // src/ui/avatar-group.tsx
4615
4944
  var React7 = __toESM(require("react"), 1);
4616
- var import_jsx_runtime52 = require("react/jsx-runtime");
4945
+ var import_jsx_runtime53 = require("react/jsx-runtime");
4617
4946
  var spacingClass = {
4618
4947
  sm: "-space-x-2",
4619
4948
  md: "-space-x-3"
@@ -4628,7 +4957,7 @@ function AvatarGroup({
4628
4957
  const items = React7.Children.toArray(children);
4629
4958
  const overflow = typeof max === "number" ? items.length - max : 0;
4630
4959
  const visible = typeof max === "number" ? items.slice(0, max) : items;
4631
- return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
4960
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
4632
4961
  "div",
4633
4962
  {
4634
4963
  "data-slot": "avatar-group",
@@ -4641,7 +4970,7 @@ function AvatarGroup({
4641
4970
  ...props,
4642
4971
  children: [
4643
4972
  visible,
4644
- overflow > 0 ? /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
4973
+ overflow > 0 ? /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
4645
4974
  "span",
4646
4975
  {
4647
4976
  "aria-label": `${overflow} more`,
@@ -4659,7 +4988,7 @@ function AvatarGroup({
4659
4988
 
4660
4989
  // src/ui/stepper.tsx
4661
4990
  var import_lucide_react19 = require("lucide-react");
4662
- var import_jsx_runtime53 = require("react/jsx-runtime");
4991
+ var import_jsx_runtime54 = require("react/jsx-runtime");
4663
4992
  function Stepper({
4664
4993
  steps,
4665
4994
  current,
@@ -4668,7 +4997,7 @@ function Stepper({
4668
4997
  ...props
4669
4998
  }) {
4670
4999
  const isVertical = orientation === "vertical";
4671
- return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
5000
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
4672
5001
  "ol",
4673
5002
  {
4674
5003
  "data-slot": "stepper",
@@ -4683,7 +5012,7 @@ function Stepper({
4683
5012
  const active = index === current;
4684
5013
  const last = index === steps.length - 1;
4685
5014
  const connectorFilled = index < current;
4686
- return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
5015
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
4687
5016
  "li",
4688
5017
  {
4689
5018
  "aria-current": active ? "step" : void 0,
@@ -4693,8 +5022,8 @@ function Stepper({
4693
5022
  last && !isVertical && "flex-none"
4694
5023
  ),
4695
5024
  children: [
4696
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: cn("flex items-center gap-2", isVertical && "flex-col"), children: [
4697
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
5025
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: cn("flex items-center gap-2", isVertical && "flex-col"), children: [
5026
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
4698
5027
  "span",
4699
5028
  {
4700
5029
  className: cn(
@@ -4703,10 +5032,10 @@ function Stepper({
4703
5032
  active && "border-primary text-primary",
4704
5033
  !complete && !active && "border-border text-muted-foreground"
4705
5034
  ),
4706
- children: complete ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_lucide_react19.CheckIcon, { className: "size-3.5", "aria-hidden": true }) : index + 1
5035
+ children: complete ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react19.CheckIcon, { className: "size-3.5", "aria-hidden": true }) : index + 1
4707
5036
  }
4708
5037
  ),
4709
- !last ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
5038
+ !last ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
4710
5039
  "span",
4711
5040
  {
4712
5041
  "aria-hidden": true,
@@ -4718,8 +5047,8 @@ function Stepper({
4718
5047
  }
4719
5048
  ) : null
4720
5049
  ] }),
4721
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: cn("min-w-0", isVertical && "pb-4"), children: [
4722
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
5050
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: cn("min-w-0", isVertical && "pb-4"), children: [
5051
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
4723
5052
  "p",
4724
5053
  {
4725
5054
  className: cn(
@@ -4729,7 +5058,7 @@ function Stepper({
4729
5058
  children: step.label
4730
5059
  }
4731
5060
  ),
4732
- step.description ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("p", { className: "truncate text-xs text-muted-foreground", children: step.description }) : null
5061
+ step.description ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: "truncate text-xs text-muted-foreground", children: step.description }) : null
4733
5062
  ] })
4734
5063
  ]
4735
5064
  },
@@ -4741,49 +5070,104 @@ function Stepper({
4741
5070
  }
4742
5071
 
4743
5072
  // src/ui/timeline.tsx
4744
- var import_jsx_runtime54 = require("react/jsx-runtime");
4745
- var dotToneClass = {
4746
- default: "border-border bg-card",
4747
- primary: "border-primary bg-primary",
4748
- success: "border-emerald-500 bg-emerald-500",
4749
- warn: "border-amber-500 bg-amber-500",
4750
- danger: "border-destructive bg-destructive"
5073
+ var import_jsx_runtime55 = require("react/jsx-runtime");
5074
+ var timelineRowGap = {
5075
+ sm: "pb-4",
5076
+ default: "pb-6"
4751
5077
  };
4752
- function Timeline({ items, className, ...props }) {
4753
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("ol", { "data-slot": "timeline", className: cn("flex flex-col", className), ...props, children: items.map((item, index) => {
5078
+ var toneStyles = {
5079
+ default: {
5080
+ border: "border-neutral-300 dark:border-neutral-700",
5081
+ dot: "bg-neutral-400 dark:bg-neutral-500",
5082
+ icon: "text-neutral-500 dark:text-neutral-400"
5083
+ },
5084
+ primary: {
5085
+ border: "border-primary/50 dark:border-primary/40",
5086
+ dot: "bg-primary",
5087
+ icon: "text-primary"
5088
+ },
5089
+ success: {
5090
+ border: "border-emerald-500/40 dark:border-emerald-500/30",
5091
+ dot: "bg-emerald-500",
5092
+ icon: "text-emerald-500"
5093
+ },
5094
+ warn: {
5095
+ border: "border-amber-500/40 dark:border-amber-500/30",
5096
+ dot: "bg-amber-500",
5097
+ icon: "text-amber-500"
5098
+ },
5099
+ danger: {
5100
+ border: "border-destructive/40 dark:border-destructive/30",
5101
+ dot: "bg-destructive",
5102
+ icon: "text-destructive"
5103
+ }
5104
+ };
5105
+ function Timeline({ items, size = "default", className, ...props }) {
5106
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("ol", { "data-slot": "timeline", className: cn("flex flex-col", className), ...props, children: items.map((item, index) => {
4754
5107
  const last = index === items.length - 1;
4755
5108
  const tone = item.tone ?? "default";
4756
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("li", { className: "relative flex gap-3 pb-5 last:pb-0", children: [
4757
- /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex flex-col items-center", children: [
4758
- /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
4759
- "span",
4760
- {
4761
- className: cn(
4762
- "z-[1] mt-0.5 inline-flex size-3 shrink-0 items-center justify-center rounded-full border-2",
4763
- dotToneClass[tone],
4764
- item.icon && "size-6"
4765
- ),
4766
- children: item.icon
4767
- }
4768
- ),
4769
- !last ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { "aria-hidden": true, className: "w-px flex-1 bg-border" }) : null
4770
- ] }),
4771
- /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "min-w-0 flex-1 pb-0.5", children: [
4772
- /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-start justify-between gap-2", children: [
4773
- /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: "text-sm font-medium text-foreground", children: item.title }),
4774
- item.meta ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: "shrink-0 text-xs text-muted-foreground tabular-nums", children: item.meta }) : null
4775
- ] }),
4776
- item.description ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: "mt-0.5 text-sm text-muted-foreground", children: item.description }) : null
4777
- ] })
4778
- ] }, item.id);
5109
+ const styles = toneStyles[tone];
5110
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
5111
+ "li",
5112
+ {
5113
+ className: cn("relative flex gap-3.5 last:pb-0", timelineRowGap[size]),
5114
+ children: [
5115
+ !last ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
5116
+ "span",
5117
+ {
5118
+ "aria-hidden": true,
5119
+ className: cn(
5120
+ "absolute left-2.5 bottom-0 w-[1.5px] -translate-x-1/2 bg-neutral-200 dark:bg-neutral-800",
5121
+ item.icon ? "top-6" : "top-3"
5122
+ )
5123
+ }
5124
+ ) : null,
5125
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "relative flex w-5 shrink-0 justify-center pt-0.5", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
5126
+ "span",
5127
+ {
5128
+ className: cn(
5129
+ "relative z-10 flex shrink-0 items-center justify-center rounded-full border-[1.5px] bg-background transition-colors",
5130
+ styles.border,
5131
+ item.icon ? "size-6" : "size-4"
5132
+ ),
5133
+ children: item.icon ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: cn("text-xs", styles.icon), children: item.icon }) : /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
5134
+ "span",
5135
+ {
5136
+ className: cn(
5137
+ "size-1.5 rounded-full",
5138
+ styles.dot
5139
+ )
5140
+ }
5141
+ )
5142
+ }
5143
+ ) }),
5144
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "min-w-0 flex-1 pb-0.5", children: [
5145
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "flex items-start justify-between gap-2", children: [
5146
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("p", { className: "text-sm font-normal text-foreground", children: item.title }),
5147
+ item.meta ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { className: "shrink-0 text-xs text-muted-foreground tabular-nums", children: item.meta }) : null
5148
+ ] }),
5149
+ item.description ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("p", { className: "mt-0.5 text-[13px] leading-relaxed text-muted-foreground", children: item.description }) : null
5150
+ ] })
5151
+ ]
5152
+ },
5153
+ item.id
5154
+ );
4779
5155
  }) });
4780
5156
  }
4781
5157
 
4782
5158
  // src/ui/rating.tsx
4783
5159
  var React8 = __toESM(require("react"), 1);
4784
5160
  var import_lucide_react20 = require("lucide-react");
4785
- var import_jsx_runtime55 = require("react/jsx-runtime");
5161
+ var import_jsx_runtime56 = require("react/jsx-runtime");
4786
5162
  var sizeClass = { sm: "size-4", md: "size-5", lg: "size-6" };
5163
+ var ratingFillClass = {
5164
+ amber: "fill-amber-400 text-amber-400",
5165
+ primary: "fill-primary text-primary",
5166
+ success: "fill-emerald-500 text-emerald-500",
5167
+ warn: "fill-amber-500 text-amber-500",
5168
+ danger: "fill-destructive text-destructive"
5169
+ };
5170
+ var ratingEmptyClass = "fill-transparent text-muted-foreground/40";
4787
5171
  function Rating({
4788
5172
  value: valueProp,
4789
5173
  defaultValue = 0,
@@ -4792,6 +5176,7 @@ function Rating({
4792
5176
  readOnly = false,
4793
5177
  disabled = false,
4794
5178
  size = "md",
5179
+ tone = "amber",
4795
5180
  label = "Rating",
4796
5181
  className
4797
5182
  }) {
@@ -4807,20 +5192,20 @@ function Rating({
4807
5192
  onChange?.(next);
4808
5193
  };
4809
5194
  if (!interactive) {
4810
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
5195
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
4811
5196
  "span",
4812
5197
  {
4813
5198
  "data-slot": "rating",
4814
5199
  role: "img",
4815
5200
  "aria-label": `${label}: ${value} of ${max}`,
4816
5201
  className: cn("inline-flex items-center gap-0.5", disabled && "opacity-50", className),
4817
- children: Array.from({ length: max }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
5202
+ children: Array.from({ length: max }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
4818
5203
  import_lucide_react20.StarIcon,
4819
5204
  {
4820
5205
  "aria-hidden": true,
4821
5206
  className: cn(
4822
5207
  sizeClass[size],
4823
- i < value ? "fill-amber-400 text-amber-400" : "fill-transparent text-muted-foreground/40"
5208
+ i < value ? ratingFillClass[tone] : ratingEmptyClass
4824
5209
  )
4825
5210
  },
4826
5211
  i
@@ -4828,7 +5213,7 @@ function Rating({
4828
5213
  }
4829
5214
  );
4830
5215
  }
4831
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
5216
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
4832
5217
  "span",
4833
5218
  {
4834
5219
  "data-slot": "rating",
@@ -4839,7 +5224,7 @@ function Rating({
4839
5224
  children: Array.from({ length: max }, (_, i) => {
4840
5225
  const unit = i + 1;
4841
5226
  const filled = unit <= shown;
4842
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
5227
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
4843
5228
  "button",
4844
5229
  {
4845
5230
  type: "button",
@@ -4851,13 +5236,13 @@ function Rating({
4851
5236
  onFocus: () => setHover(unit),
4852
5237
  onBlur: () => setHover(null),
4853
5238
  className: "rounded-sm p-0.5 transition-transform hover:scale-110 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground/15",
4854
- children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
5239
+ children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
4855
5240
  import_lucide_react20.StarIcon,
4856
5241
  {
4857
5242
  className: cn(
4858
5243
  sizeClass[size],
4859
5244
  "transition-colors",
4860
- filled ? "fill-amber-400 text-amber-400" : "fill-transparent text-muted-foreground/40"
5245
+ filled ? ratingFillClass[tone] : ratingEmptyClass
4861
5246
  )
4862
5247
  }
4863
5248
  )
@@ -4872,7 +5257,7 @@ function Rating({
4872
5257
  // src/ui/number-field.tsx
4873
5258
  var React9 = __toESM(require("react"), 1);
4874
5259
  var import_lucide_react21 = require("lucide-react");
4875
- var import_jsx_runtime56 = require("react/jsx-runtime");
5260
+ var import_jsx_runtime57 = require("react/jsx-runtime");
4876
5261
  var heightClass = { sm: "h-9", default: "h-10" };
4877
5262
  var stepButtonClass = "inline-flex aspect-square h-full items-center justify-center text-muted-foreground transition-colors hover:bg-accent hover:text-foreground disabled:pointer-events-none disabled:opacity-40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-foreground/15";
4878
5263
  function clamp(n, min, max) {
@@ -4901,7 +5286,7 @@ function NumberField({
4901
5286
  if (!isControlled) setUncontrolled(clamped);
4902
5287
  onValueChange?.(clamped);
4903
5288
  };
4904
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
5289
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
4905
5290
  "div",
4906
5291
  {
4907
5292
  "data-slot": "number-field",
@@ -4913,7 +5298,7 @@ function NumberField({
4913
5298
  className
4914
5299
  ),
4915
5300
  children: [
4916
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
5301
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
4917
5302
  "button",
4918
5303
  {
4919
5304
  type: "button",
@@ -4922,10 +5307,10 @@ function NumberField({
4922
5307
  disabled: disabled || typeof min === "number" && value <= min,
4923
5308
  onClick: () => commit(value - step),
4924
5309
  className: cn(stepButtonClass, "border-r border-border"),
4925
- children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_lucide_react21.MinusIcon, { className: "size-4" })
5310
+ children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react21.MinusIcon, { className: "size-4" })
4926
5311
  }
4927
5312
  ),
4928
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
5313
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
4929
5314
  "input",
4930
5315
  {
4931
5316
  type: "number",
@@ -4949,7 +5334,7 @@ function NumberField({
4949
5334
  ...inputProps
4950
5335
  }
4951
5336
  ),
4952
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
5337
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
4953
5338
  "button",
4954
5339
  {
4955
5340
  type: "button",
@@ -4958,7 +5343,7 @@ function NumberField({
4958
5343
  disabled: disabled || typeof max === "number" && value >= max,
4959
5344
  onClick: () => commit(value + step),
4960
5345
  className: cn(stepButtonClass, "border-l border-border"),
4961
- children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_lucide_react21.PlusIcon, { className: "size-4" })
5346
+ children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react21.PlusIcon, { className: "size-4" })
4962
5347
  }
4963
5348
  )
4964
5349
  ]
@@ -4969,7 +5354,11 @@ function NumberField({
4969
5354
  // src/ui/tag-input.tsx
4970
5355
  var React10 = __toESM(require("react"), 1);
4971
5356
  var import_lucide_react22 = require("lucide-react");
4972
- var import_jsx_runtime57 = require("react/jsx-runtime");
5357
+ var import_jsx_runtime58 = require("react/jsx-runtime");
5358
+ var tagInputSizeClass = {
5359
+ sm: "min-h-9 gap-1 px-1.5 py-1",
5360
+ default: "min-h-10 gap-1.5 px-2 py-1.5"
5361
+ };
4973
5362
  function TagInput({
4974
5363
  value: valueProp,
4975
5364
  defaultValue = [],
@@ -4979,6 +5368,7 @@ function TagInput({
4979
5368
  dedupe = true,
4980
5369
  max,
4981
5370
  disabled,
5371
+ size = "default",
4982
5372
  ariaLabel,
4983
5373
  className,
4984
5374
  inputClassName
@@ -5013,38 +5403,39 @@ function TagInput({
5013
5403
  removeAt(tags.length - 1);
5014
5404
  }
5015
5405
  };
5016
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
5406
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
5017
5407
  "div",
5018
5408
  {
5019
5409
  "data-slot": "tag-input",
5020
5410
  className: cn(
5021
5411
  controlSurfaceClass,
5022
- "flex min-h-10 w-full flex-wrap items-center gap-1.5 rounded-lg px-2 py-1.5",
5412
+ "flex w-full flex-wrap items-center rounded-lg",
5413
+ tagInputSizeClass[size],
5023
5414
  disabled && "pointer-events-none opacity-50",
5024
5415
  className
5025
5416
  ),
5026
5417
  children: [
5027
- tags.map((tag, index) => /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
5418
+ tags.map((tag, index) => /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
5028
5419
  "span",
5029
5420
  {
5030
5421
  className: "inline-flex items-center gap-1 rounded-md bg-muted py-0.5 pl-2 pr-1 text-xs font-medium text-foreground",
5031
5422
  children: [
5032
5423
  tag,
5033
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
5424
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
5034
5425
  "button",
5035
5426
  {
5036
5427
  type: "button",
5037
5428
  "aria-label": `Remove ${tag}`,
5038
5429
  onClick: () => removeAt(index),
5039
5430
  className: "inline-flex size-4 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:bg-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground/20",
5040
- children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react22.XIcon, { className: "size-3", "aria-hidden": true })
5431
+ children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react22.XIcon, { className: "size-3", "aria-hidden": true })
5041
5432
  }
5042
5433
  )
5043
5434
  ]
5044
5435
  },
5045
5436
  `${tag}-${index}`
5046
5437
  )),
5047
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
5438
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
5048
5439
  "input",
5049
5440
  {
5050
5441
  type: "text",
@@ -5068,16 +5459,41 @@ function TagInput({
5068
5459
 
5069
5460
  // src/ui/banner.tsx
5070
5461
  var import_lucide_react23 = require("lucide-react");
5071
- var import_jsx_runtime58 = require("react/jsx-runtime");
5072
- var bannerToneClass = {
5073
- default: "border-border bg-muted/50 text-foreground",
5074
- primary: "border-primary/20 bg-primary/10 text-foreground",
5075
- success: "border-emerald-500/25 bg-emerald-500/10 text-foreground [&_[data-banner-icon]]:text-emerald-600 dark:[&_[data-banner-icon]]:text-emerald-400",
5076
- warn: "border-amber-500/25 bg-amber-500/10 text-foreground [&_[data-banner-icon]]:text-amber-600 dark:[&_[data-banner-icon]]:text-amber-400",
5077
- danger: "border-destructive/25 bg-destructive/10 text-foreground [&_[data-banner-icon]]:text-destructive"
5462
+ var import_jsx_runtime59 = require("react/jsx-runtime");
5463
+ var bannerSoftClass = {
5464
+ default: "border-border/50 bg-muted/30 text-foreground/90 dark:bg-muted/15",
5465
+ primary: "border-primary/15 bg-primary/5 text-primary-800 dark:text-primary-200 [&_[data-banner-icon]]:text-primary",
5466
+ success: "border-emerald-500/15 bg-emerald-500/5 text-emerald-800 dark:text-emerald-300 [&_[data-banner-icon]]:text-emerald-600 dark:[&_[data-banner-icon]]:text-emerald-400",
5467
+ warn: "border-amber-500/15 bg-amber-500/5 text-amber-800 dark:text-amber-300 [&_[data-banner-icon]]:text-amber-600 dark:[&_[data-banner-icon]]:text-amber-400",
5468
+ danger: "border-destructive/15 bg-destructive/5 text-destructive dark:text-red-300 [&_[data-banner-icon]]:text-destructive"
5469
+ };
5470
+ var bannerSolidClass = {
5471
+ default: "border-transparent bg-foreground text-background shadow-sm",
5472
+ primary: "border-transparent bg-gradient-to-r from-primary to-primary/95 text-primary-foreground shadow-sm shadow-primary/5",
5473
+ success: "border-transparent bg-gradient-to-r from-emerald-600 to-emerald-500 text-white shadow-sm shadow-emerald-500/5 dark:from-emerald-500 dark:to-emerald-400",
5474
+ warn: "border-transparent bg-gradient-to-r from-amber-500 to-amber-400 text-white shadow-sm shadow-amber-500/5 dark:from-amber-500 dark:to-amber-400",
5475
+ danger: "border-transparent bg-gradient-to-r from-destructive to-destructive/95 text-destructive-foreground shadow-sm shadow-destructive/5"
5476
+ };
5477
+ var bannerOutlineClass = {
5478
+ default: "border-border/80 bg-background/50 text-foreground/90 backdrop-blur-sm shadow-sm",
5479
+ primary: "border-primary/30 bg-primary/[0.02] text-foreground [&_[data-banner-icon]]:text-primary shadow-sm",
5480
+ success: "border-emerald-500/30 bg-emerald-500/[0.02] text-foreground [&_[data-banner-icon]]:text-emerald-600 dark:[&_[data-banner-icon]]:text-emerald-400 shadow-sm",
5481
+ warn: "border-amber-500/30 bg-amber-500/[0.02] text-foreground [&_[data-banner-icon]]:text-amber-600 dark:[&_[data-banner-icon]]:text-amber-400 shadow-sm",
5482
+ danger: "border-destructive/30 bg-destructive/[0.02] text-foreground [&_[data-banner-icon]]:text-destructive shadow-sm"
5483
+ };
5484
+ var bannerVariantClass = {
5485
+ soft: bannerSoftClass,
5486
+ solid: bannerSolidClass,
5487
+ outline: bannerOutlineClass
5488
+ };
5489
+ var bannerSizeClass = {
5490
+ sm: "gap-2.5 px-3.5 py-2 text-xs",
5491
+ default: "gap-3 px-4 py-3 text-sm"
5078
5492
  };
5079
5493
  function Banner({
5080
5494
  tone = "default",
5495
+ variant = "soft",
5496
+ size = "default",
5081
5497
  icon,
5082
5498
  title,
5083
5499
  actions,
@@ -5086,32 +5502,60 @@ function Banner({
5086
5502
  children,
5087
5503
  ...props
5088
5504
  }) {
5089
- return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
5505
+ const isSolid = variant === "solid";
5506
+ const isSingleLine = !title;
5507
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
5090
5508
  "div",
5091
5509
  {
5092
5510
  "data-slot": "banner",
5511
+ "data-variant": variant,
5093
5512
  role: "status",
5094
5513
  className: cn(
5095
- "flex w-full items-start gap-3 rounded-lg border px-4 py-3 text-sm",
5096
- bannerToneClass[tone],
5514
+ "flex w-full rounded-xl border transition-all duration-200",
5515
+ isSingleLine ? "items-center" : "items-start",
5516
+ bannerSizeClass[size],
5517
+ bannerVariantClass[variant][tone],
5097
5518
  className
5098
5519
  ),
5099
5520
  ...props,
5100
5521
  children: [
5101
- icon ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { "data-banner-icon": true, className: "mt-0.5 shrink-0 [&_svg]:size-4", children: icon }) : null,
5102
- /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "min-w-0 flex-1", children: [
5103
- title ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: "font-medium", children: title }) : null,
5104
- children ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: cn("text-muted-foreground", title && "mt-0.5"), children }) : null
5522
+ icon ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
5523
+ "span",
5524
+ {
5525
+ "data-banner-icon": true,
5526
+ className: cn(
5527
+ "shrink-0 [&_svg]:size-4",
5528
+ isSingleLine ? "self-center" : "mt-0.5"
5529
+ ),
5530
+ children: icon
5531
+ }
5532
+ ) : null,
5533
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("div", { className: "min-w-0 flex-1", children: [
5534
+ title ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("p", { className: "font-medium tracking-tight", children: title }) : null,
5535
+ children ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
5536
+ "div",
5537
+ {
5538
+ className: cn(
5539
+ isSolid ? "opacity-90" : "text-muted-foreground",
5540
+ title && "mt-0.5"
5541
+ ),
5542
+ children
5543
+ }
5544
+ ) : null
5105
5545
  ] }),
5106
- actions ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "flex shrink-0 items-center gap-2", children: actions }) : null,
5107
- onDismiss ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
5546
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: "flex shrink-0 items-center gap-2", children: actions }) : null,
5547
+ onDismiss ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
5108
5548
  "button",
5109
5549
  {
5110
5550
  type: "button",
5111
5551
  "aria-label": "Dismiss",
5112
5552
  onClick: onDismiss,
5113
- className: "-mr-1 -mt-0.5 inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground/15",
5114
- children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react23.XIcon, { className: "size-4", "aria-hidden": true })
5553
+ className: cn(
5554
+ "-mr-1 inline-flex size-7 shrink-0 items-center justify-center rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground/15",
5555
+ isSingleLine ? "self-center" : "-mt-0.5",
5556
+ isSolid ? "opacity-80 hover:bg-background/15 hover:opacity-100" : "text-muted-foreground hover:bg-foreground/10 hover:text-foreground"
5557
+ ),
5558
+ children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_lucide_react23.XIcon, { className: "size-4", "aria-hidden": true })
5115
5559
  }
5116
5560
  ) : null
5117
5561
  ]
@@ -5122,7 +5566,7 @@ function Banner({
5122
5566
  // src/ui/copy-button.tsx
5123
5567
  var React11 = __toESM(require("react"), 1);
5124
5568
  var import_lucide_react24 = require("lucide-react");
5125
- var import_jsx_runtime59 = require("react/jsx-runtime");
5569
+ var import_jsx_runtime60 = require("react/jsx-runtime");
5126
5570
  function CopyButton({
5127
5571
  value,
5128
5572
  timeout = 1500,
@@ -5148,7 +5592,7 @@ function CopyButton({
5148
5592
  }
5149
5593
  };
5150
5594
  const Icon = copied ? import_lucide_react24.CheckIcon : import_lucide_react24.CopyIcon;
5151
- return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
5595
+ return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
5152
5596
  "button",
5153
5597
  {
5154
5598
  type: "button",
@@ -5165,7 +5609,7 @@ function CopyButton({
5165
5609
  ),
5166
5610
  ...props,
5167
5611
  children: [
5168
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Icon, { className: "size-4 shrink-0", "aria-hidden": true }),
5612
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(Icon, { className: "size-4 shrink-0", "aria-hidden": true }),
5169
5613
  children
5170
5614
  ]
5171
5615
  }
@@ -5173,34 +5617,54 @@ function CopyButton({
5173
5617
  }
5174
5618
 
5175
5619
  // src/ui/snippet.tsx
5176
- var import_jsx_runtime60 = require("react/jsx-runtime");
5620
+ var import_jsx_runtime61 = require("react/jsx-runtime");
5621
+ var snippetVariantClass = {
5622
+ muted: "border-border bg-muted/40",
5623
+ outline: "border-border bg-transparent",
5624
+ ghost: "border-transparent bg-foreground/[0.04]"
5625
+ };
5626
+ var snippetSizeClass = {
5627
+ sm: "gap-1.5 py-1 pl-2.5 pr-1 text-xs",
5628
+ default: "gap-2 py-1.5 pl-3 pr-1.5 text-sm"
5629
+ };
5177
5630
  function Snippet({
5178
5631
  children,
5179
5632
  symbol,
5633
+ variant = "muted",
5634
+ size = "default",
5180
5635
  hideCopy = false,
5181
5636
  className,
5182
5637
  ...props
5183
5638
  }) {
5184
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
5639
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
5185
5640
  "div",
5186
5641
  {
5187
5642
  "data-slot": "snippet",
5643
+ "data-variant": variant,
5188
5644
  className: cn(
5189
- "flex items-center gap-2 rounded-lg border border-border bg-muted/40 py-1.5 pl-3 pr-1.5 font-mono text-sm",
5645
+ "flex items-center rounded-lg border font-mono",
5646
+ snippetVariantClass[variant],
5647
+ snippetSizeClass[size],
5190
5648
  className
5191
5649
  ),
5192
5650
  ...props,
5193
5651
  children: [
5194
- symbol ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("span", { "aria-hidden": true, className: "select-none text-muted-foreground", children: symbol }) : null,
5195
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("code", { className: "min-w-0 flex-1 truncate text-foreground", children }),
5196
- hideCopy ? null : /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(CopyButton, { value: children, className: "size-7 shrink-0" })
5652
+ symbol ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", { "aria-hidden": true, className: "select-none text-muted-foreground", children: symbol }) : null,
5653
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("code", { className: "min-w-0 flex-1 truncate text-foreground", children }),
5654
+ hideCopy ? null : /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
5655
+ CopyButton,
5656
+ {
5657
+ value: children,
5658
+ className: cn("shrink-0", size === "sm" ? "size-6" : "size-7")
5659
+ }
5660
+ )
5197
5661
  ]
5198
5662
  }
5199
5663
  );
5200
5664
  }
5201
5665
 
5202
5666
  // src/ui/circular-progress.tsx
5203
- var import_jsx_runtime61 = require("react/jsx-runtime");
5667
+ var import_jsx_runtime62 = require("react/jsx-runtime");
5204
5668
  var toneClass = {
5205
5669
  primary: "text-primary",
5206
5670
  success: "text-emerald-500",
@@ -5223,7 +5687,7 @@ function CircularProgress({
5223
5687
  const circumference = 2 * Math.PI * radius;
5224
5688
  const pct = indeterminate ? 0.25 : Math.min(Math.max(value / max, 0), 1);
5225
5689
  const dashOffset = circumference * (1 - pct);
5226
- return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
5690
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(
5227
5691
  "div",
5228
5692
  {
5229
5693
  "data-slot": "circular-progress",
@@ -5235,7 +5699,7 @@ function CircularProgress({
5235
5699
  style: { width: size, height: size },
5236
5700
  ...props,
5237
5701
  children: [
5238
- /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
5702
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(
5239
5703
  "svg",
5240
5704
  {
5241
5705
  width: size,
@@ -5243,7 +5707,7 @@ function CircularProgress({
5243
5707
  viewBox: `0 0 ${size} ${size}`,
5244
5708
  className: cn(toneClass[tone], indeterminate && "animate-spin"),
5245
5709
  children: [
5246
- /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
5710
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
5247
5711
  "circle",
5248
5712
  {
5249
5713
  cx: size / 2,
@@ -5254,7 +5718,7 @@ function CircularProgress({
5254
5718
  className: "stroke-current opacity-15"
5255
5719
  }
5256
5720
  ),
5257
- /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
5721
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
5258
5722
  "circle",
5259
5723
  {
5260
5724
  cx: size / 2,
@@ -5272,7 +5736,385 @@ function CircularProgress({
5272
5736
  ]
5273
5737
  }
5274
5738
  ),
5275
- showLabel && !indeterminate ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", { className: "absolute inset-0 flex items-center justify-center text-[0.7rem] font-medium tabular-nums text-foreground", children: label ?? `${Math.round(pct * 100)}%` }) : null
5739
+ showLabel && !indeterminate ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("span", { className: "absolute inset-0 flex items-center justify-center text-[0.7rem] font-medium tabular-nums text-foreground", children: label ?? `${Math.round(pct * 100)}%` }) : null
5740
+ ]
5741
+ }
5742
+ );
5743
+ }
5744
+
5745
+ // src/ui/kanban.tsx
5746
+ var React12 = __toESM(require("react"), 1);
5747
+ var import_core = require("@dnd-kit/core");
5748
+ var import_sortable = require("@dnd-kit/sortable");
5749
+ var import_utilities = require("@dnd-kit/utilities");
5750
+ var import_lucide_react25 = require("lucide-react");
5751
+ var import_jsx_runtime63 = require("react/jsx-runtime");
5752
+ var columnTitleToneClass = {
5753
+ default: "text-foreground",
5754
+ primary: "text-blue-600 dark:text-blue-400",
5755
+ success: "text-emerald-600 dark:text-emerald-400",
5756
+ warn: "text-amber-600 dark:text-amber-400",
5757
+ danger: "text-rose-600 dark:text-rose-400"
5758
+ };
5759
+ var cardVariantClass = {
5760
+ default: "border border-border/70 bg-card shadow-sm hover:border-border hover:shadow-md",
5761
+ outline: "border border-border bg-card hover:border-foreground/25",
5762
+ muted: "border border-transparent bg-muted/60 hover:bg-muted"
5763
+ };
5764
+ var cardToneClass = {
5765
+ default: "bg-card shadow-sm hover:shadow-md",
5766
+ primary: "bg-card shadow-sm hover:shadow-md",
5767
+ success: "bg-card shadow-sm hover:shadow-md",
5768
+ warn: "bg-card shadow-sm hover:shadow-md",
5769
+ danger: "bg-card shadow-sm hover:shadow-md"
5770
+ };
5771
+ function cardSurfaceClass(variant, tone) {
5772
+ return variant === "tonal" ? cardToneClass[tone] : cardVariantClass[variant];
5773
+ }
5774
+ var densityColumnClass = {
5775
+ default: "w-72 gap-2.5",
5776
+ compact: "w-64 gap-2"
5777
+ };
5778
+ var densityListClass = {
5779
+ default: "gap-2.5",
5780
+ compact: "gap-2"
5781
+ };
5782
+ var densityCardClass = {
5783
+ default: "rounded-lg p-2",
5784
+ compact: "rounded-lg p-1.5"
5785
+ };
5786
+ function defaultGetCardId(card) {
5787
+ return card.id;
5788
+ }
5789
+ function SortableCard({
5790
+ card,
5791
+ cardId,
5792
+ column,
5793
+ density,
5794
+ variant,
5795
+ disabled,
5796
+ dragHandle,
5797
+ className,
5798
+ renderCard
5799
+ }) {
5800
+ const {
5801
+ attributes,
5802
+ listeners: listeners2,
5803
+ setNodeRef,
5804
+ transform,
5805
+ transition,
5806
+ isDragging
5807
+ } = (0, import_sortable.useSortable)({ id: cardId, disabled });
5808
+ const style = {
5809
+ transform: import_utilities.CSS.Translate.toString(transform),
5810
+ transition
5811
+ };
5812
+ const dragHandleProps = disabled ? void 0 : { ...attributes, ...listeners2 };
5813
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
5814
+ "div",
5815
+ {
5816
+ ref: setNodeRef,
5817
+ style,
5818
+ "data-slot": "kanban-card",
5819
+ "data-dragging": isDragging ? "" : void 0,
5820
+ className: cn(
5821
+ "group/kanban-card relative text-sm text-foreground transition",
5822
+ densityCardClass[density],
5823
+ cardSurfaceClass(variant, column.tone ?? "default"),
5824
+ isDragging && "opacity-40",
5825
+ className
5826
+ ),
5827
+ children: [
5828
+ !disabled && dragHandle === "auto" ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
5829
+ "button",
5830
+ {
5831
+ type: "button",
5832
+ "aria-label": "Drag card",
5833
+ className: "absolute right-1.5 top-1.5 z-10 grid size-6 cursor-grab touch-none place-items-center rounded-md text-muted-foreground/40 opacity-0 transition hover:bg-foreground/5 hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground/15 group-hover/kanban-card:opacity-100 active:cursor-grabbing",
5834
+ ...attributes,
5835
+ ...listeners2,
5836
+ children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_lucide_react25.GripVerticalIcon, { className: "size-4", "aria-hidden": true })
5837
+ }
5838
+ ) : null,
5839
+ renderCard(card, { column, isDragging, isOverlay: false, dragHandleProps })
5840
+ ]
5841
+ }
5842
+ );
5843
+ }
5844
+ function KanbanColumnView({
5845
+ column,
5846
+ cardIds,
5847
+ density,
5848
+ cardVariant,
5849
+ disabled,
5850
+ dragHandle,
5851
+ emptyColumnLabel,
5852
+ className,
5853
+ cardClassName,
5854
+ getCardId,
5855
+ renderColumnHeader,
5856
+ renderCard
5857
+ }) {
5858
+ const tone = column.tone ?? "default";
5859
+ const { setNodeRef, isOver } = (0, import_core.useDroppable)({ id: column.id, disabled });
5860
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
5861
+ "div",
5862
+ {
5863
+ "data-slot": "kanban-column",
5864
+ className: cn(
5865
+ "flex shrink-0 flex-col",
5866
+ densityColumnClass[density],
5867
+ className
5868
+ ),
5869
+ children: [
5870
+ renderColumnHeader ? renderColumnHeader(column) : /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { className: "flex flex-col gap-0.5 px-1 pb-0.5", children: [
5871
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { className: "flex items-center gap-2", children: [
5872
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
5873
+ "h3",
5874
+ {
5875
+ className: cn(
5876
+ "min-w-0 flex-1 truncate text-xs font-medium",
5877
+ columnTitleToneClass[tone]
5878
+ ),
5879
+ children: column.title
5880
+ }
5881
+ ),
5882
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("span", { className: "shrink-0 text-xs font-normal tabular-nums text-muted-foreground/60", children: column.cards.length }),
5883
+ column.action ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "shrink-0", children: column.action }) : null
5884
+ ] }),
5885
+ column.description ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("p", { className: "truncate text-xs text-muted-foreground", children: column.description }) : null
5886
+ ] }),
5887
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_sortable.SortableContext, { items: cardIds, strategy: import_sortable.verticalListSortingStrategy, children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
5888
+ "div",
5889
+ {
5890
+ ref: setNodeRef,
5891
+ "data-slot": "kanban-column-body",
5892
+ className: cn(
5893
+ "flex min-h-16 flex-1 flex-col rounded-xl transition-colors",
5894
+ densityListClass[density],
5895
+ isOver && "bg-muted/50"
5896
+ ),
5897
+ children: column.cards.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "flex flex-1 items-center justify-center rounded-xl border border-dashed border-border/60 px-2 py-8 text-center text-xs text-muted-foreground/70", children: emptyColumnLabel ?? "Drop here" }) : column.cards.map((card) => {
5898
+ const id = getCardId(card);
5899
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
5900
+ SortableCard,
5901
+ {
5902
+ card,
5903
+ cardId: id,
5904
+ column,
5905
+ density,
5906
+ variant: cardVariant,
5907
+ disabled,
5908
+ dragHandle,
5909
+ className: cardClassName,
5910
+ renderCard
5911
+ },
5912
+ id
5913
+ );
5914
+ })
5915
+ }
5916
+ ) }),
5917
+ column.footer ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "px-0.5 pt-0.5", children: column.footer }) : null
5918
+ ]
5919
+ }
5920
+ );
5921
+ }
5922
+ function cloneColumns(columns) {
5923
+ return columns.map((col) => ({ ...col, cards: [...col.cards] }));
5924
+ }
5925
+ function locateCard(columns, getCardId, cardId) {
5926
+ for (const col of columns) {
5927
+ const index = col.cards.findIndex((c) => getCardId(c) === cardId);
5928
+ if (index !== -1) return { columnId: col.id, index };
5929
+ }
5930
+ return null;
5931
+ }
5932
+ function Kanban({
5933
+ columns: columnsProp,
5934
+ defaultColumns,
5935
+ onColumnsChange,
5936
+ onMove,
5937
+ renderCard,
5938
+ renderColumnHeader,
5939
+ getCardId = defaultGetCardId,
5940
+ emptyColumnLabel,
5941
+ density = "default",
5942
+ cardVariant = "default",
5943
+ dragHandle = "auto",
5944
+ disabled = false,
5945
+ className,
5946
+ columnClassName,
5947
+ cardClassName,
5948
+ ...rest
5949
+ }) {
5950
+ const ariaLabel = rest["aria-label"] ?? "Kanban board";
5951
+ const isControlled = columnsProp !== void 0;
5952
+ const [internal, setInternal] = React12.useState(
5953
+ () => cloneColumns(defaultColumns ?? columnsProp ?? [])
5954
+ );
5955
+ const [activeId, setActiveId] = React12.useState(null);
5956
+ const dragOriginRef = React12.useRef(null);
5957
+ React12.useEffect(() => {
5958
+ if (isControlled && activeId === null) {
5959
+ setInternal(cloneColumns(columnsProp));
5960
+ }
5961
+ }, [columnsProp, isControlled, activeId]);
5962
+ const columns = internal;
5963
+ const columnIds = React12.useMemo(
5964
+ () => new Set(columns.map((c) => c.id)),
5965
+ [columns]
5966
+ );
5967
+ const sensors = (0, import_core.useSensors)(
5968
+ (0, import_core.useSensor)(import_core.PointerSensor, { activationConstraint: { distance: 6 } }),
5969
+ (0, import_core.useSensor)(import_core.KeyboardSensor, { coordinateGetter: import_sortable.sortableKeyboardCoordinates })
5970
+ );
5971
+ const activeCard = React12.useMemo(() => {
5972
+ if (!activeId) return null;
5973
+ for (const col of columns) {
5974
+ const card = col.cards.find((c) => getCardId(c) === activeId);
5975
+ if (card) return { card, column: col };
5976
+ }
5977
+ return null;
5978
+ }, [activeId, columns, getCardId]);
5979
+ const resolveTargetColumnId = (overId) => {
5980
+ if (columnIds.has(overId)) return overId;
5981
+ const loc = locateCard(columns, getCardId, overId);
5982
+ return loc?.columnId;
5983
+ };
5984
+ const handleDragStart = (event) => {
5985
+ const id = String(event.active.id);
5986
+ setActiveId(id);
5987
+ dragOriginRef.current = locateCard(columns, getCardId, id);
5988
+ };
5989
+ const handleDragOver = (event) => {
5990
+ const { active, over } = event;
5991
+ if (!over) return;
5992
+ const activeCardId = String(active.id);
5993
+ const overId = String(over.id);
5994
+ const from = locateCard(columns, getCardId, activeCardId);
5995
+ const toColumnId = resolveTargetColumnId(overId);
5996
+ if (!from || !toColumnId || from.columnId === toColumnId) return;
5997
+ setInternal((prev) => {
5998
+ const next = cloneColumns(prev);
5999
+ const fromCol = next.find((c) => c.id === from.columnId);
6000
+ const toCol = next.find((c) => c.id === toColumnId);
6001
+ if (!fromCol || !toCol) return prev;
6002
+ const movingIndex = fromCol.cards.findIndex(
6003
+ (c) => getCardId(c) === activeCardId
6004
+ );
6005
+ if (movingIndex === -1) return prev;
6006
+ const [moving] = fromCol.cards.splice(movingIndex, 1);
6007
+ const overIsCard = !columnIds.has(overId);
6008
+ const overIndex = overIsCard ? toCol.cards.findIndex((c) => getCardId(c) === overId) : toCol.cards.length;
6009
+ const insertAt = overIndex === -1 ? toCol.cards.length : overIndex;
6010
+ toCol.cards.splice(insertAt, 0, moving);
6011
+ return next;
6012
+ });
6013
+ };
6014
+ const finishDrag = (event) => {
6015
+ const { active, over } = event;
6016
+ const origin = dragOriginRef.current;
6017
+ const movedCard = activeCard?.card;
6018
+ dragOriginRef.current = null;
6019
+ setActiveId(null);
6020
+ if (!over || !origin) return;
6021
+ const activeCardId = String(active.id);
6022
+ const overId = String(over.id);
6023
+ let next = columns;
6024
+ const current = locateCard(columns, getCardId, activeCardId);
6025
+ const toColumnId = resolveTargetColumnId(overId) ?? current?.columnId;
6026
+ if (current && toColumnId && current.columnId === toColumnId) {
6027
+ const col = columns.find((c) => c.id === toColumnId);
6028
+ if (col) {
6029
+ const oldIndex = col.cards.findIndex((c) => getCardId(c) === activeCardId);
6030
+ const overIsCard = !columnIds.has(overId);
6031
+ const overIndex = overIsCard ? col.cards.findIndex((c) => getCardId(c) === overId) : col.cards.length - 1;
6032
+ const newIndex = overIndex === -1 ? col.cards.length - 1 : overIndex;
6033
+ if (oldIndex !== -1 && newIndex !== -1 && oldIndex !== newIndex) {
6034
+ next = columns.map(
6035
+ (c) => c.id === toColumnId ? { ...c, cards: (0, import_sortable.arrayMove)(c.cards, oldIndex, newIndex) } : c
6036
+ );
6037
+ }
6038
+ }
6039
+ }
6040
+ if (next !== columns) setInternal(next);
6041
+ const finalLoc = locateCard(next, getCardId, activeCardId);
6042
+ const moved = finalLoc && (finalLoc.columnId !== origin.columnId || finalLoc.index !== origin.index);
6043
+ if (moved) {
6044
+ if (movedCard) {
6045
+ onMove?.({
6046
+ card: movedCard,
6047
+ cardId: activeCardId,
6048
+ from: origin,
6049
+ to: finalLoc,
6050
+ columns: next
6051
+ });
6052
+ }
6053
+ onColumnsChange?.(next);
6054
+ }
6055
+ };
6056
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
6057
+ import_core.DndContext,
6058
+ {
6059
+ sensors,
6060
+ collisionDetection: import_core.closestCorners,
6061
+ onDragStart: handleDragStart,
6062
+ onDragOver: handleDragOver,
6063
+ onDragEnd: finishDrag,
6064
+ onDragCancel: () => {
6065
+ dragOriginRef.current = null;
6066
+ setActiveId(null);
6067
+ if (isControlled) setInternal(cloneColumns(columnsProp));
6068
+ },
6069
+ children: [
6070
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
6071
+ "div",
6072
+ {
6073
+ "data-slot": "kanban",
6074
+ role: "list",
6075
+ "aria-label": ariaLabel,
6076
+ className: cn(
6077
+ "flex w-full items-start overflow-x-auto p-1.5 pb-6 -m-1.5",
6078
+ density === "compact" ? "gap-3" : "gap-4",
6079
+ className
6080
+ ),
6081
+ children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
6082
+ KanbanColumnView,
6083
+ {
6084
+ column,
6085
+ cardIds: column.cards.map(getCardId),
6086
+ density,
6087
+ cardVariant,
6088
+ disabled,
6089
+ dragHandle,
6090
+ emptyColumnLabel,
6091
+ className: columnClassName,
6092
+ cardClassName,
6093
+ getCardId,
6094
+ renderColumnHeader,
6095
+ renderCard
6096
+ },
6097
+ column.id
6098
+ ))
6099
+ }
6100
+ ),
6101
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_core.DragOverlay, { children: activeCard ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
6102
+ "div",
6103
+ {
6104
+ "data-slot": "kanban-card-overlay",
6105
+ className: cn(
6106
+ "text-sm text-foreground shadow-xl ring-1 ring-black/5",
6107
+ densityCardClass[density],
6108
+ cardSurfaceClass(cardVariant, activeCard.column.tone ?? "default"),
6109
+ "rotate-2 cursor-grabbing"
6110
+ ),
6111
+ children: renderCard(activeCard.card, {
6112
+ column: activeCard.column,
6113
+ isDragging: true,
6114
+ isOverlay: true
6115
+ })
6116
+ }
6117
+ ) : null })
5276
6118
  ]
5277
6119
  }
5278
6120
  );
@@ -5418,6 +6260,7 @@ function CircularProgress({
5418
6260
  InputOTPHiddenInput,
5419
6261
  InputOTPSeparator,
5420
6262
  InputOTPSlot,
6263
+ Kanban,
5421
6264
  Kbd,
5422
6265
  KbdGroup,
5423
6266
  Label,
@@ -5522,6 +6365,7 @@ function CircularProgress({
5522
6365
  TooltipContent,
5523
6366
  TooltipProvider,
5524
6367
  TooltipTrigger,
6368
+ UntitledButton,
5525
6369
  alertVariants,
5526
6370
  avatarChartVariantClass,
5527
6371
  badgeVariants,
@@ -5535,6 +6379,7 @@ function CircularProgress({
5535
6379
  overlaySurfaceClass,
5536
6380
  toast,
5537
6381
  toggleVariants,
6382
+ untitledButtonVariants,
5538
6383
  useChart,
5539
6384
  useToast
5540
6385
  });