@nebutra/ui 0.2.2 → 2.0.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 (43) hide show
  1. package/dist/animate-in-BlvjVh2S.d.ts +250 -0
  2. package/dist/{canonical-CrO71UPO.d.ts → canonical-Bf4czR2u.d.ts} +225 -211
  3. package/dist/chat/index.d.ts +1 -0
  4. package/dist/chat/index.js +3 -0
  5. package/dist/chat/index.js.map +1 -0
  6. package/dist/components/index.d.ts +58 -123
  7. package/dist/components/index.js +504 -203
  8. package/dist/components/index.js.map +1 -1
  9. package/dist/editorial/index.d.ts +404 -0
  10. package/dist/editorial/index.js +868 -0
  11. package/dist/editorial/index.js.map +1 -0
  12. package/dist/icons/index.d.ts +1 -0
  13. package/dist/layout/index.d.ts +2 -2
  14. package/dist/layout/index.js +116 -26
  15. package/dist/layout/index.js.map +1 -1
  16. package/dist/layouts/index.d.ts +80 -2
  17. package/dist/layouts/index.js +13 -11
  18. package/dist/layouts/index.js.map +1 -1
  19. package/dist/patterns/index.d.ts +4 -5
  20. package/dist/patterns/index.js +221 -106
  21. package/dist/patterns/index.js.map +1 -1
  22. package/dist/primitives/canonical.d.ts +4 -3
  23. package/dist/primitives/canonical.js +609 -197
  24. package/dist/primitives/canonical.js.map +1 -1
  25. package/dist/primitives/index.d.ts +213 -21
  26. package/dist/primitives/index.js +2209 -1317
  27. package/dist/primitives/index.js.map +1 -1
  28. package/dist/tailwind.preset.d.ts +2 -2
  29. package/dist/tailwind.preset.js +1 -1
  30. package/dist/tailwind.preset.js.map +1 -1
  31. package/dist/typography/fonts.css +21 -26
  32. package/dist/typography/index.d.ts +4 -4
  33. package/dist/typography/index.js +1 -1
  34. package/dist/typography/index.js.map +1 -1
  35. package/dist/utils/auth-surfaces.d.ts +33 -0
  36. package/dist/utils/auth-surfaces.js +9 -0
  37. package/dist/utils/auth-surfaces.js.map +1 -0
  38. package/dist/utils/index.d.ts +33 -5
  39. package/dist/utils/index.js +15 -3
  40. package/dist/utils/index.js.map +1 -1
  41. package/package.json +43 -9
  42. package/src/styles/sources.css +10 -0
  43. package/src/typography/fonts.css +21 -26
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { Accordion as Accordion$1 } from '@base-ui/react/accordion';
3
- import { ChevronUpDown, Check, ChevronRight, ChevronDown, MagnifyingGlass, Plus, Cross, MoreHorizontal, Status, Copy, Hash, Code, Link, Information, Warning, External, LoaderCircle, EyeOff, Eye, Minus, LockClosed, CheckCircle, MoreVertical, DeviceDesktop, Sun, Moon, FolderOpen, FolderClosed, File, ChevronLeft, ChevronUp, FileText } from '@nebutra/icons';
3
+ import { ChevronUpDown, Check, ChevronRight, ChevronDown, MagnifyingGlass, Plus, Cross, MoreHorizontal, Status, Copy, Information, Warning, External, LoaderCircle, EyeOff, Eye, Minus, LockClosed, CheckCircle, MoreVertical, DeviceDesktop, Sun, Moon, Hash, Code, Link, FolderOpen, FolderClosed, File, ChevronLeft, ChevronUp, FileText } from '@nebutra/icons';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -8,9 +8,9 @@ import { cva } from 'class-variance-authority';
8
8
  import { AlertDialog as AlertDialog$1 } from '@base-ui/react/alert-dialog';
9
9
  import * as React24 from 'react';
10
10
  import React24__default, { createContext, useId, useRef, useState, useMemo, use, useCallback, useEffect, Children, isValidElement, cloneElement } from 'react';
11
- import { colors, flow, emerge } from '@nebutra/brand';
11
+ import { colors, brandSpring, flow, emerge } from '@nebutra/brand';
12
12
  export { brandSpring } from '@nebutra/brand';
13
- import { useReducedMotion, motion, AnimatePresence, LazyMotion, domAnimation, m } from 'framer-motion';
13
+ import { useReducedMotion, LazyMotion, domAnimation, AnimatePresence, motion, m } from 'framer-motion';
14
14
  import { Avatar as Avatar$1 } from '@base-ui/react/avatar';
15
15
  import { Prism } from 'react-syntax-highlighter';
16
16
  import { nightOwl } from 'react-syntax-highlighter/dist/esm/styles/prism';
@@ -41,6 +41,10 @@ function cn(...inputs) {
41
41
  }
42
42
 
43
43
  // src/utils/primitive-props.ts
44
+ function asPlainStyle(style) {
45
+ if (style == null || typeof style === "function") return {};
46
+ return style;
47
+ }
44
48
  function withHtmlProps(Component) {
45
49
  return Component;
46
50
  }
@@ -73,7 +77,7 @@ var AccordionTrigger = ({
73
77
  {
74
78
  ref,
75
79
  className: cn(
76
- "font-medium flex flex-1 items-center justify-between transition-[color,box-shadow] duration-flow ease-out hover:text-muted-foreground focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:outline-none [&[data-panel-open]>svg]:rotate-45",
80
+ "font-medium flex flex-1 items-center justify-between transition-[color,box-shadow] duration-flow ease-out hover:text-muted-foreground focus-visible:outline-none [&[data-panel-open]>svg]:rotate-45",
77
81
  size === "small" ? "py-2.5 text-sm" : "py-4 text-[15px]",
78
82
  className
79
83
  ),
@@ -305,7 +309,7 @@ function Alert({
305
309
  className: cn(
306
310
  "group shrink-0 size-4 inline-flex items-center justify-center rounded-[var(--radius-sm)]",
307
311
  "opacity-70 hover:opacity-100 transition-opacity",
308
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
312
+ "focus-visible:outline-none"
309
313
  ),
310
314
  children: /* @__PURE__ */ jsx(Cross, { className: "size-4" })
311
315
  }
@@ -454,7 +458,7 @@ var primitiveTransition = {
454
458
  // hero entrance, big delight moments
455
459
  },
456
460
  easing: {
457
- default: "ease-out",
461
+ default: "var(--ease-brand)",
458
462
  inOut: "cubic-bezier(0.4, 0, 0.2, 1)"
459
463
  }
460
464
  };
@@ -472,7 +476,7 @@ var shadowClasses = {
472
476
  "2xl": "shadow-2xl"};
473
477
 
474
478
  // src/tokens/components/overlay.ts
475
- var overlayFocusRingClassName = "outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2";
479
+ var overlayFocusRingClassName = "outline-none";
476
480
  var overlayZIndex = {
477
481
  backdrop: 1040,
478
482
  modal: 1050,
@@ -488,72 +492,73 @@ var overlayTokens = {
488
492
  }};
489
493
  var overlayClassNames = {
490
494
  focusRing: overlayFocusRingClassName,
491
- backdrop: "fixed inset-0 bg-black/40 backdrop-blur-sm transition-[opacity,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)] data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none",
495
+ backdrop: "fixed inset-0 bg-black/40 backdrop-blur-sm transition-[opacity,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)] data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none",
492
496
  modalSurface: [
493
497
  "fixed left-1/2 top-1/2 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4",
494
498
  "border border-border/60 bg-background/95 p-6 text-foreground backdrop-blur-xl",
495
499
  "rounded-[var(--radius-xl)]",
496
500
  shadowClasses["2xl"],
497
501
  "outline-none",
498
- "transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
502
+ "transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
499
503
  "data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0",
500
504
  "motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none"
501
505
  ].join(" "),
502
506
  menuSurface: [
503
- "min-w-32 overflow-hidden rounded-[var(--radius-lg)] border border-border/70 bg-popover/95 p-1 text-popover-foreground backdrop-blur-md",
507
+ "min-w-32 origin-[var(--transform-origin)] overflow-hidden rounded-[var(--radius-lg)] border border-border/70 bg-popover/95 p-1 text-popover-foreground backdrop-blur-md",
504
508
  shadowClasses.xl,
505
- "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
506
- "data-[starting-style]:scale-95 data-[starting-style]:opacity-0 data-[ending-style]:scale-95 data-[ending-style]:opacity-0",
509
+ "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
510
+ "data-[starting-style]:scale-[0.97] data-[starting-style]:opacity-0 data-[ending-style]:scale-[0.97] data-[ending-style]:opacity-0",
507
511
  "motion-reduce:transition-none motion-reduce:data-[starting-style]:transform-none motion-reduce:data-[ending-style]:transform-none"
508
512
  ].join(" "),
509
513
  selectSurface: [
510
- "max-h-[var(--select-content-max-height)] min-w-[var(--select-content-min-width)] overflow-hidden",
514
+ "max-h-[var(--select-content-max-height)] min-w-[var(--select-content-min-width)] origin-[var(--transform-origin)] overflow-hidden",
511
515
  "rounded-[var(--select-content-radius)] border border-border/70 bg-popover/95 text-popover-foreground backdrop-blur-md",
512
516
  "shadow-[var(--select-content-shadow)] outline-none",
513
- "transition-[opacity,transform,display] duration-[var(--select-duration)] ease-[var(--select-easing)]",
514
- "data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0",
517
+ "transition-[opacity,transform,display] duration-[var(--select-duration)] ease-[var(--ease-brand)]",
518
+ "data-starting-style:scale-[0.97] data-starting-style:opacity-0 data-ending-style:scale-[0.97] data-ending-style:opacity-0",
515
519
  "motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none"
516
520
  ].join(" "),
517
521
  navigationMenuSurface: [
518
- "min-w-32 overflow-hidden rounded-[var(--radius-xl)] border border-border/70 bg-popover/95 text-popover-foreground backdrop-blur-md",
522
+ "min-w-32 origin-[var(--transform-origin)] overflow-hidden rounded-[var(--radius-xl)] border border-border/70 bg-popover/95 text-popover-foreground backdrop-blur-md",
519
523
  shadowClasses.xl,
520
- "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
521
- "data-[starting-style]:scale-95 data-[starting-style]:opacity-0 data-[ending-style]:scale-95 data-[ending-style]:opacity-0",
524
+ "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
525
+ "data-[starting-style]:scale-[0.97] data-[starting-style]:opacity-0 data-[ending-style]:scale-[0.97] data-[ending-style]:opacity-0",
522
526
  "motion-reduce:transition-none motion-reduce:data-[starting-style]:transform-none motion-reduce:data-[ending-style]:transform-none"
523
527
  ].join(" "),
524
528
  popoverSurface: [
525
- "w-72 rounded-[var(--radius-lg)] border border-border/70 bg-popover/95 p-4 text-popover-foreground backdrop-blur-md",
529
+ "w-72 origin-[var(--transform-origin)] rounded-[var(--radius-lg)] border border-border/70 bg-popover/95 p-4 text-popover-foreground backdrop-blur-md",
526
530
  shadowClasses.xl,
527
- "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
528
- "data-[open]:opacity-100 data-[closed]:opacity-0 data-[closed]:scale-95 data-[open]:scale-100",
531
+ "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
532
+ "data-[open]:opacity-100 data-[closed]:opacity-0 data-[closed]:scale-[0.97] data-[open]:scale-100",
529
533
  "motion-reduce:transition-none motion-reduce:data-[closed]:transform-none motion-reduce:data-[open]:transform-none"
530
534
  ].join(" "),
531
535
  tooltipSurface: [
532
- "overflow-hidden rounded-[var(--radius-md)] border border-border/70 bg-popover/95 px-3 py-1.5 text-sm text-popover-foreground backdrop-blur-md",
536
+ "origin-[var(--transform-origin)] overflow-hidden rounded-[var(--radius-md)] border border-border/70 bg-popover/95 px-3 py-1.5 text-sm text-popover-foreground backdrop-blur-md",
533
537
  shadowClasses.md,
534
- "transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
535
- "data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0",
538
+ "transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
539
+ "data-starting-style:scale-[0.97] data-starting-style:opacity-0 data-ending-style:scale-[0.97] data-ending-style:opacity-0",
540
+ "data-[instant]:duration-0",
536
541
  "motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none"
537
542
  ].join(" "),
538
543
  sheetBackdrop: [
539
544
  "fixed inset-0 bg-[var(--sheet-overlay-background)] backdrop-blur-[var(--sheet-overlay-blur)]",
540
- "transition-[opacity,backdrop-filter,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
545
+ "transition-[opacity,backdrop-filter,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
541
546
  "data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none"
542
547
  ].join(" "),
543
548
  sheetSurface: [
544
549
  "fixed flex flex-col overflow-hidden border border-border bg-[var(--sheet-background)] text-foreground shadow-[var(--sheet-shadow)]",
545
- "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
550
+ "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
546
551
  "data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none"
547
552
  ].join(" "),
548
- closeButton: `absolute right-4 top-4 rounded-[var(--radius-sm)] opacity-70 ring-offset-background ${overlayFocusRingClassName} transition-opacity duration-[var(--motion-duration-micro)] ease-[var(--ease-out)] hover:opacity-100 disabled:pointer-events-none data-[open]:bg-accent data-[open]:text-muted-foreground motion-reduce:transition-none`
553
+ closeButton: `absolute right-4 top-4 rounded-[var(--radius-sm)] opacity-70 ring-offset-background ${overlayFocusRingClassName} transition-opacity duration-[var(--motion-duration-micro)] ease-[var(--ease-brand)] hover:opacity-100 disabled:pointer-events-none data-[open]:bg-accent data-[open]:text-muted-foreground motion-reduce:transition-none`
549
554
  };
550
555
  var buttonVariants = cva(
551
556
  [
552
557
  "inline-flex items-center justify-center gap-2 whitespace-nowrap",
553
558
  "rounded-[var(--btn-default-radius,var(--radius-md))]",
554
559
  "text-[length:var(--control-font-size-md,0.875rem)] font-[number:var(--font-weight-medium,500)]",
555
- "transition-colors duration-micro ease-out",
556
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
560
+ "transition-[color,background-color,border-color,transform] duration-flow ease-[var(--ease-brand)]",
561
+ "active:scale-[0.97] motion-reduce:active:scale-100 motion-reduce:transition-none",
557
562
  "disabled:pointer-events-none disabled:opacity-50",
558
563
  "aria-busy:cursor-wait"
559
564
  ].join(" "),
@@ -580,8 +585,30 @@ var buttonVariants = cva(
580
585
  },
581
586
  shape: {
582
587
  default: "",
583
- square: "",
584
- circle: ""
588
+ // Radius from --btn-default-radius / --radius-md — brand-switchable.
589
+ // Do not hardcode rounded-md here; a language must be able to retarget
590
+ // the corner treatment of every icon trigger at once.
591
+ square: "rounded-[var(--btn-default-radius,var(--radius-md))]",
592
+ // Pill radius token, not Tailwind rounded-full — same 9999px default,
593
+ // but a brand that ships a softer "circle" can override --radius-pill.
594
+ circle: "rounded-[var(--radius-pill,9999px)]",
595
+ pill: "rounded-[var(--radius-pill,9999px)]"
596
+ },
597
+ // Icon-only box size — orthogonal to `size` (which tunes text-button
598
+ // height/padding/font together) and to `shape` (which picks the
599
+ // corner treatment). Only takes effect combined with shape="square"
600
+ // or shape="circle" (see compoundVariants below); every other
601
+ // combination ignores it. 28/32/36 cover the icon-trigger sizes that
602
+ // actually occur in the app — 24/40/48 are already reachable via
603
+ // shape + size (tiny/default/lg). Heights read --control-height-icon-*
604
+ // so density-aware Brand Packages can scale them with the ladder.
605
+ iconSize: {
606
+ sm: "",
607
+ // 28px default
608
+ md: "",
609
+ // 32px default
610
+ lg: ""
611
+ // 36px default
585
612
  }
586
613
  },
587
614
  compoundVariants: [
@@ -592,22 +619,56 @@ var buttonVariants = cva(
592
619
  {
593
620
  shape: "circle",
594
621
  size: "tiny",
595
- className: "w-[var(--control-height-tiny,1.5rem)] px-0 rounded-full"
622
+ className: "w-[var(--control-height-tiny,1.5rem)] px-0"
596
623
  },
597
624
  {
598
625
  shape: "circle",
599
626
  size: "sm",
600
- className: "w-[var(--control-height-sm,2rem)] px-0 rounded-full"
627
+ className: "w-[var(--control-height-sm,2rem)] px-0"
601
628
  },
602
629
  {
603
630
  shape: "circle",
604
631
  size: "default",
605
- className: "w-[var(--control-height-md,2.5rem)] px-0 rounded-full"
632
+ className: "w-[var(--control-height-md,2.5rem)] px-0"
606
633
  },
607
634
  {
608
635
  shape: "circle",
609
636
  size: "lg",
610
- className: "w-[var(--control-height-lg,3rem)] px-0 rounded-full"
637
+ className: "w-[var(--control-height-lg,3rem)] px-0"
638
+ },
639
+ // iconSize wins over the size-driven box above — matched on shape +
640
+ // iconSize only, so it applies regardless of whatever `size` was
641
+ // passed (or left at its "default" fallback). Corner treatment stays
642
+ // on the shape variant (token-backed); only the box is set here.
643
+ {
644
+ shape: "square",
645
+ iconSize: "sm",
646
+ className: "h-[var(--control-height-icon-sm,1.75rem)] w-[var(--control-height-icon-sm,1.75rem)] px-0"
647
+ },
648
+ {
649
+ shape: "square",
650
+ iconSize: "md",
651
+ className: "h-[var(--control-height-icon-md,2rem)] w-[var(--control-height-icon-md,2rem)] px-0"
652
+ },
653
+ {
654
+ shape: "square",
655
+ iconSize: "lg",
656
+ className: "h-[var(--control-height-icon-lg,2.25rem)] w-[var(--control-height-icon-lg,2.25rem)] px-0"
657
+ },
658
+ {
659
+ shape: "circle",
660
+ iconSize: "sm",
661
+ className: "h-[var(--control-height-icon-sm,1.75rem)] w-[var(--control-height-icon-sm,1.75rem)] px-0"
662
+ },
663
+ {
664
+ shape: "circle",
665
+ iconSize: "md",
666
+ className: "h-[var(--control-height-icon-md,2rem)] w-[var(--control-height-icon-md,2rem)] px-0"
667
+ },
668
+ {
669
+ shape: "circle",
670
+ iconSize: "lg",
671
+ className: "h-[var(--control-height-icon-lg,2.25rem)] w-[var(--control-height-icon-lg,2.25rem)] px-0"
611
672
  }
612
673
  ],
613
674
  defaultVariants: {
@@ -763,13 +824,13 @@ var motionDurations = {
763
824
  cinematic: 500
764
825
  };
765
826
  var easings = {
766
- easeOut: [0, 0, 0.2, 1],
827
+ easeOut: [0.16, 1, 0.3, 1],
767
828
  easeInOut: [0.4, 0, 0.2, 1]};
768
829
  var motionVariants = {
769
830
  fadeInUp: {
770
- initial: { opacity: 0, y: 20 },
771
- animate: { opacity: 1, y: 0 },
772
- exit: { opacity: 0, y: 10 }
831
+ initial: { opacity: 0, transform: "translateY(20px)" },
832
+ animate: { opacity: 1, transform: "translateY(0px)" },
833
+ exit: { opacity: 0, transform: "translateY(10px)" }
773
834
  },
774
835
  scaleIn: {
775
836
  initial: { opacity: 0, scale: 0.95 },
@@ -779,15 +840,15 @@ var motionVariants = {
779
840
  var staggerContainers = {
780
841
  fast: {
781
842
  initial: {},
782
- animate: { transition: { staggerChildren: 0.05, delayChildren: 0.1 } }
843
+ animate: { transition: { staggerChildren: 0.04, delayChildren: 0 } }
783
844
  },
784
845
  normal: {
785
846
  initial: {},
786
- animate: { transition: { staggerChildren: 0.1, delayChildren: 0.2 } }
847
+ animate: { transition: { staggerChildren: 0.06, delayChildren: 0.04 } }
787
848
  },
788
849
  slow: {
789
850
  initial: {},
790
- animate: { transition: { staggerChildren: 0.15, delayChildren: 0.3 } }
851
+ animate: { transition: { staggerChildren: 0.08, delayChildren: 0.05 } }
791
852
  }
792
853
  };
793
854
  var viewportSettings = {
@@ -818,15 +879,63 @@ var PRESETS = {
818
879
  /** Fade + rise */
819
880
  fadeUp: motionVariants.fadeInUp,
820
881
  /** Scale in */
821
- scale: motionVariants.scaleIn
882
+ scale: motionVariants.scaleIn,
883
+ /**
884
+ * Keyed content swap — short, symmetric, blur-softened. Rises in, sinks out.
885
+ * Shorter and shallower than `emerge` on purpose: a swap replaces content the
886
+ * reader is already looking at, so it must resolve inside the reveal rail.
887
+ * Pair with `AnimateSwap`.
888
+ */
889
+ swap: {
890
+ initial: { opacity: 0, transform: "translateY(10px)", filter: "blur(4px)" },
891
+ animate: { opacity: 1, transform: "translateY(0px)", filter: "blur(0px)" },
892
+ exit: { opacity: 0, transform: "translateY(-10px)", filter: "blur(4px)" },
893
+ transition: { duration: motionDurations.reveal / 1e3 }
894
+ },
895
+ /** Off-canvas panel entering from the right edge (drawer, sheet). */
896
+ slideFromRight: {
897
+ initial: { transform: "translateX(100%)" },
898
+ animate: { transform: "translateX(0%)" },
899
+ exit: { transform: "translateX(100%)" },
900
+ transition: brandSpring.default
901
+ },
902
+ /** Off-canvas panel entering from the left edge. */
903
+ slideFromLeft: {
904
+ initial: { transform: "translateX(-100%)" },
905
+ animate: { transform: "translateX(0%)" },
906
+ exit: { transform: "translateX(-100%)" },
907
+ transition: brandSpring.default
908
+ },
909
+ /** Off-canvas panel entering from the top edge (banner, command bar). */
910
+ slideFromTop: {
911
+ initial: { transform: "translateY(-100%)" },
912
+ animate: { transform: "translateY(0%)" },
913
+ exit: { transform: "translateY(-100%)" },
914
+ transition: brandSpring.default
915
+ },
916
+ /** Off-canvas panel entering from the bottom edge (mobile action sheet). */
917
+ slideFromBottom: {
918
+ initial: { transform: "translateY(100%)" },
919
+ animate: { transform: "translateY(0%)" },
920
+ exit: { transform: "translateY(100%)" },
921
+ transition: brandSpring.default
922
+ }
822
923
  };
823
924
  function MotionDiv(props) {
824
925
  return /* @__PURE__ */ jsx(LazyMotion, { features: domAnimation, children: /* @__PURE__ */ jsx(m.div, { ...props }) });
825
926
  }
826
927
  function AnimateIn(props) {
827
- const { children, preset = "emerge", delay = 0, duration, inView = false, className } = props;
928
+ const {
929
+ children,
930
+ preset = "fade",
931
+ delay = 0,
932
+ duration,
933
+ inView = false,
934
+ className,
935
+ ...rest
936
+ } = props;
828
937
  const shouldReduce = useReducedMotion();
829
- const base = PRESETS[preset] || PRESETS.emerge;
938
+ const base = PRESETS[preset] || PRESETS.fade;
830
939
  const initial = shouldReduce ? { opacity: 0 } : base.initial;
831
940
  const animate2 = shouldReduce ? { opacity: 1 } : base.animate;
832
941
  const exit = shouldReduce ? { opacity: 0 } : "exit" in base ? base.exit : void 0;
@@ -839,6 +948,7 @@ function AnimateIn(props) {
839
948
  return /* @__PURE__ */ jsx(
840
949
  MotionDiv,
841
950
  {
951
+ ...rest,
842
952
  className,
843
953
  initial,
844
954
  whileInView: animate2,
@@ -852,6 +962,7 @@ function AnimateIn(props) {
852
962
  return /* @__PURE__ */ jsx(
853
963
  MotionDiv,
854
964
  {
965
+ ...rest,
855
966
  className,
856
967
  initial,
857
968
  animate: animate2,
@@ -861,6 +972,10 @@ function AnimateIn(props) {
861
972
  }
862
973
  );
863
974
  }
975
+ function AnimateSwap(props) {
976
+ const { swapKey, ...animateInProps } = props;
977
+ return /* @__PURE__ */ jsx(LazyMotion, { features: domAnimation, children: /* @__PURE__ */ jsx(AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsx(AnimateIn, { ...animateInProps }, swapKey) }) });
978
+ }
864
979
  function AnimateInGroup(props) {
865
980
  const { children, stagger = "normal", inView = false, className } = props;
866
981
  const shouldReduce = useReducedMotion();
@@ -963,9 +1078,18 @@ function getAvatarFallbackClass(size) {
963
1078
  }
964
1079
  function getAvatarStyle(size, style) {
965
1080
  if (typeof size !== "number") return style;
966
- return {
1081
+ const numericVars = {
967
1082
  "--avatar-size": `${size}px`,
968
- "--avatar-font-size": `${Math.max(10, Math.round(size * 0.375))}px`,
1083
+ "--avatar-font-size": `${Math.max(10, Math.round(size * 0.375))}px`
1084
+ };
1085
+ if (typeof style === "function") {
1086
+ return (state) => ({
1087
+ ...numericVars,
1088
+ ...style(state)
1089
+ });
1090
+ }
1091
+ return {
1092
+ ...numericVars,
969
1093
  ...style
970
1094
  };
971
1095
  }
@@ -1134,7 +1258,7 @@ function AvatarGroup({
1134
1258
  ] });
1135
1259
  }
1136
1260
  var badgeVariants = cva(
1137
- "inline-flex justify-center items-center align-middle shrink-0 rounded-full font-sans font-medium whitespace-nowrap tabular-nums transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 border border-transparent",
1261
+ "inline-flex justify-center items-center align-middle shrink-0 rounded-full font-sans font-medium whitespace-nowrap tabular-nums transition-colors focus-visible:outline-none border border-transparent",
1138
1262
  {
1139
1263
  variants: {
1140
1264
  variant: {
@@ -1156,15 +1280,26 @@ var badgeVariants = cva(
1156
1280
  purple: "bg-secondary text-secondary-foreground fill-current",
1157
1281
  "purple-subtle": "bg-secondary/40 text-secondary-foreground fill-current border-transparent",
1158
1282
  amber: "bg-warning text-warning-foreground fill-current",
1159
- "amber-subtle": "bg-warning/15 text-warning fill-current border-transparent",
1283
+ "amber-subtle": (
1284
+ // --warning is a FILL (2.13:1). As ink on its own tint it measured 1.91:1.
1285
+ // --warning-strong is the AA-safe amber foreground: 5.01:1 light / 6.20:1 dark.
1286
+ "bg-warning/10 text-[hsl(var(--warning-strong))] fill-current border-transparent"
1287
+ ),
1160
1288
  red: "bg-destructive text-destructive-foreground fill-current",
1161
- "red-subtle": "bg-destructive/15 text-destructive fill-current border-transparent",
1289
+ "red-subtle": (
1290
+ // --destructive is fill-only in dark (2.01:1 as ink on its own tint).
1291
+ // --destructive-strong: 4.58:1 light / 4.97:1 dark.
1292
+ "bg-destructive/10 text-[hsl(var(--destructive-strong))] fill-current border-transparent"
1293
+ ),
1162
1294
  pink: "bg-accent text-accent-foreground fill-current",
1163
1295
  "pink-subtle": "bg-accent/40 text-accent-foreground fill-current border-transparent",
1164
1296
  green: "bg-success text-success-foreground fill-current",
1165
- "green-subtle": "bg-success/15 text-success fill-current border-transparent",
1297
+ "green-subtle": (
1298
+ // --success-strong closes the 4.49:1 light gap: 4.99:1 light / 4.83:1 dark.
1299
+ "bg-success/10 text-[hsl(var(--success-strong))] fill-current border-transparent"
1300
+ ),
1166
1301
  teal: "bg-info text-info-foreground fill-current",
1167
- "teal-subtle": "bg-info/15 text-info fill-current border-transparent",
1302
+ "teal-subtle": "bg-info/10 text-info fill-current border-transparent",
1168
1303
  inverted: "bg-foreground text-background fill-current",
1169
1304
  // Special visual treatments (intentional product design, not brand hex)
1170
1305
  trial: "bg-gradient-to-br from-trial-start to-trial-end text-primary-foreground fill-current",
@@ -1381,7 +1516,10 @@ function Spinner({ className }) {
1381
1516
  }
1382
1517
  );
1383
1518
  }
1384
- function getIconSizeClass(size) {
1519
+ function getIconSizeClass(size, iconSize2) {
1520
+ if (iconSize2 === "sm") return "[&>svg]:size-3.5";
1521
+ if (iconSize2 === "md") return "[&>svg]:size-3.5";
1522
+ if (iconSize2 === "lg") return "[&>svg]:size-4";
1385
1523
  switch (size) {
1386
1524
  case "tiny":
1387
1525
  return "[&>svg]:size-3";
@@ -1396,7 +1534,10 @@ function getIconSizeClass(size) {
1396
1534
  return "[&>svg]:size-4";
1397
1535
  }
1398
1536
  }
1399
- function getSpinnerSizeClass(size) {
1537
+ function getSpinnerSizeClass(size, iconSize2) {
1538
+ if (iconSize2 === "sm") return "size-3.5";
1539
+ if (iconSize2 === "md") return "size-3.5";
1540
+ if (iconSize2 === "lg") return "size-4";
1400
1541
  switch (size) {
1401
1542
  case "tiny":
1402
1543
  return "size-3";
@@ -1421,10 +1562,10 @@ function resolveShadowClass(shadow) {
1421
1562
  const level = shadow === true ? "md" : shadow;
1422
1563
  return SHADOW_CLASSES[level];
1423
1564
  }
1424
- function ButtonContent({ loading, prefix, suffix, size, children }) {
1425
- const iconSizeClass = getIconSizeClass(size);
1565
+ function ButtonContent({ loading, prefix, suffix, size, iconSize: iconSize2, children }) {
1566
+ const iconSizeClass = getIconSizeClass(size, iconSize2);
1426
1567
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1427
- loading && /* @__PURE__ */ jsx(Spinner, { className: getSpinnerSizeClass(size) }),
1568
+ loading && /* @__PURE__ */ jsx(Spinner, { className: getSpinnerSizeClass(size, iconSize2) }),
1428
1569
  prefix != null && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: cn("shrink-0", iconSizeClass), children: prefix }),
1429
1570
  children,
1430
1571
  suffix != null && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: cn("shrink-0", iconSizeClass), children: suffix })
@@ -1435,6 +1576,7 @@ var Button = ({
1435
1576
  variant,
1436
1577
  size,
1437
1578
  shape,
1579
+ iconSize: iconSize2,
1438
1580
  asChild = false,
1439
1581
  loading = false,
1440
1582
  disabled,
@@ -1452,11 +1594,21 @@ var Button = ({
1452
1594
  Comp,
1453
1595
  {
1454
1596
  ref,
1455
- className: cn(buttonVariants({ variant, size, shape }), shadowClass, className),
1597
+ className: cn(buttonVariants({ variant, size, shape, iconSize: iconSize2 }), shadowClass, className),
1456
1598
  disabled: isDisabled,
1457
1599
  "aria-busy": loading || void 0,
1458
1600
  ...props,
1459
- children: asChild ? children : /* @__PURE__ */ jsx(ButtonContent, { loading, prefix, suffix, size, children })
1601
+ children: asChild ? children : /* @__PURE__ */ jsx(
1602
+ ButtonContent,
1603
+ {
1604
+ loading,
1605
+ prefix,
1606
+ suffix,
1607
+ size,
1608
+ iconSize: iconSize2,
1609
+ children
1610
+ }
1611
+ )
1460
1612
  }
1461
1613
  );
1462
1614
  };
@@ -1466,6 +1618,7 @@ var ButtonLink = ({
1466
1618
  variant,
1467
1619
  size,
1468
1620
  shape,
1621
+ iconSize: iconSize2,
1469
1622
  prefix,
1470
1623
  suffix,
1471
1624
  shadow,
@@ -1485,14 +1638,24 @@ var ButtonLink = ({
1485
1638
  {
1486
1639
  ref,
1487
1640
  className: cn(
1488
- buttonVariants({ variant, size, shape }),
1641
+ buttonVariants({ variant, size, shape, iconSize: iconSize2 }),
1489
1642
  shadowClass,
1490
1643
  loading && "pointer-events-none opacity-50",
1491
1644
  className
1492
1645
  ),
1493
1646
  ...loadingProps,
1494
1647
  ...props,
1495
- children: /* @__PURE__ */ jsx(ButtonContent, { loading, prefix, suffix, size, children })
1648
+ children: /* @__PURE__ */ jsx(
1649
+ ButtonContent,
1650
+ {
1651
+ loading,
1652
+ prefix,
1653
+ suffix,
1654
+ size,
1655
+ iconSize: iconSize2,
1656
+ children
1657
+ }
1658
+ )
1496
1659
  }
1497
1660
  );
1498
1661
  };
@@ -1559,8 +1722,68 @@ var CardFooter = ({
1559
1722
  ...props
1560
1723
  }) => /* @__PURE__ */ jsx("div", { ref, className: cn("flex items-center p-6 pt-0", className), ...props });
1561
1724
  CardFooter.displayName = "CardFooter";
1725
+ var DEFAULT_STROKE_WIDTH = 1.6;
1726
+ function CheckGlyph({
1727
+ size = 16,
1728
+ width,
1729
+ height,
1730
+ strokeWidth = DEFAULT_STROKE_WIDTH,
1731
+ ...props
1732
+ }) {
1733
+ return /* @__PURE__ */ jsx(
1734
+ "svg",
1735
+ {
1736
+ "aria-hidden": "true",
1737
+ className: "shrink-0",
1738
+ viewBox: "0 0 16 16",
1739
+ width: width ?? size,
1740
+ height: height ?? size,
1741
+ ...props,
1742
+ children: /* @__PURE__ */ jsx(
1743
+ "path",
1744
+ {
1745
+ d: "M11.2 5.6L6.8 10L4.8 8",
1746
+ strokeLinecap: "round",
1747
+ strokeLinejoin: "round",
1748
+ strokeWidth
1749
+ }
1750
+ )
1751
+ }
1752
+ );
1753
+ }
1754
+ function IndeterminateGlyph({
1755
+ size = 16,
1756
+ width,
1757
+ height,
1758
+ strokeWidth = DEFAULT_STROKE_WIDTH,
1759
+ ...props
1760
+ }) {
1761
+ return /* @__PURE__ */ jsx(
1762
+ "svg",
1763
+ {
1764
+ "aria-hidden": "true",
1765
+ className: "shrink-0",
1766
+ viewBox: "0 0 16 16",
1767
+ width: width ?? size,
1768
+ height: height ?? size,
1769
+ ...props,
1770
+ children: /* @__PURE__ */ jsx(
1771
+ "line",
1772
+ {
1773
+ x1: "4",
1774
+ x2: "12",
1775
+ y1: "8",
1776
+ y2: "8",
1777
+ strokeLinecap: "round",
1778
+ strokeLinejoin: "round",
1779
+ strokeWidth
1780
+ }
1781
+ )
1782
+ }
1783
+ );
1784
+ }
1562
1785
  var getInputClasses = (checked, disabled, indeterminate) => {
1563
- let className = "relative border w-4 h-4 duration-200 rounded inline-flex items-center justify-center";
1786
+ let className = "relative border w-4 h-4 duration-micro rounded inline-flex items-center justify-center";
1564
1787
  if (disabled) {
1565
1788
  if (!checked || indeterminate) {
1566
1789
  className += " bg-geist-gray-100 border-geist-gray-500";
@@ -1623,26 +1846,7 @@ var Checkbox = ({
1623
1846
  className: "sr-only"
1624
1847
  }
1625
1848
  ),
1626
- /* @__PURE__ */ jsx("span", { className: getInputClasses(checked, disabled, indeterminate), children: /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", className: "shrink-0", height: "16", viewBox: "0 0 20 20", width: "16", children: indeterminate ? /* @__PURE__ */ jsx(
1627
- "line",
1628
- {
1629
- strokeLinecap: "round",
1630
- strokeLinejoin: "round",
1631
- strokeWidth: "2",
1632
- x1: "5",
1633
- x2: "15",
1634
- y1: "10",
1635
- y2: "10"
1636
- }
1637
- ) : /* @__PURE__ */ jsx(
1638
- "path",
1639
- {
1640
- d: "M14 7L8.5 12.5L6 10",
1641
- strokeLinecap: "round",
1642
- strokeLinejoin: "round",
1643
- strokeWidth: "2"
1644
- }
1645
- ) }) }),
1849
+ /* @__PURE__ */ jsx("span", { className: getInputClasses(checked, disabled, indeterminate), children: indeterminate ? /* @__PURE__ */ jsx(IndeterminateGlyph, {}) : /* @__PURE__ */ jsx(CheckGlyph, {}) }),
1646
1850
  children && /* @__PURE__ */ jsx("span", { className: "ml-2", children })
1647
1851
  ]
1648
1852
  }
@@ -1878,6 +2082,11 @@ var overlayPrimitiveClassNames = {
1878
2082
  "data-[highlighted]:bg-accent data-[popup-open]:bg-accent"
1879
2083
  ].join(" "),
1880
2084
  menuCheckboxItem: [menuItemBaseClassName, menuHighlightedClassName, "pl-8"].join(" "),
2085
+ menuFilterInput: [
2086
+ "h-7 w-full rounded-[var(--radius-sm)] bg-muted px-2 text-sm text-foreground",
2087
+ "placeholder:text-muted-foreground outline-none"
2088
+ ].join(" "),
2089
+ menuEmpty: "px-2 py-3 text-center text-sm text-muted-foreground",
1881
2090
  menuIndicator: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center text-muted-foreground",
1882
2091
  menubarRoot: "flex h-10 items-center space-x-1 rounded-[var(--radius-md)] border border-border bg-background p-1 outline-none",
1883
2092
  menubarTrigger: [
@@ -1989,7 +2198,7 @@ var DropdownMenuSubContent = ({
1989
2198
  style,
1990
2199
  ref,
1991
2200
  ...props
1992
- }) => /* @__PURE__ */ jsx(Menu$1.Portal, { children: /* @__PURE__ */ jsx(Menu$1.Positioner, { children: /* @__PURE__ */ jsx(
2201
+ }) => /* @__PURE__ */ jsx(Menu$1.Portal, { children: /* @__PURE__ */ jsx(Menu$1.Positioner, { style: { zIndex: overlayZIndex.popover }, children: /* @__PURE__ */ jsx(
1993
2202
  Menu$1.Popup,
1994
2203
  {
1995
2204
  ref,
@@ -2019,6 +2228,7 @@ var DropdownMenuContent = ({
2019
2228
  align,
2020
2229
  alignOffset,
2021
2230
  side,
2231
+ style: { zIndex: overlayZIndex.popover },
2022
2232
  children: /* @__PURE__ */ jsx(
2023
2233
  Menu$1.Popup,
2024
2234
  {
@@ -2087,6 +2297,40 @@ var DropdownMenuRadioItem = ({
2087
2297
  }
2088
2298
  );
2089
2299
  DropdownMenuRadioItem.displayName = "DropdownMenuRadioItem";
2300
+ var MENU_RESERVED_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "Enter", "Tab"]);
2301
+ var DropdownMenuFilterInput = ({
2302
+ className,
2303
+ onKeyDown,
2304
+ ref,
2305
+ ...props
2306
+ }) => /* @__PURE__ */ jsx(
2307
+ "input",
2308
+ {
2309
+ ref,
2310
+ type: "search",
2311
+ className: cn(overlayPrimitiveClassNames.menuFilterInput, className),
2312
+ onKeyDown: (event) => {
2313
+ onKeyDown?.(event);
2314
+ if (!MENU_RESERVED_KEYS.has(event.key)) {
2315
+ event.stopPropagation();
2316
+ }
2317
+ },
2318
+ ...props
2319
+ }
2320
+ );
2321
+ DropdownMenuFilterInput.displayName = "DropdownMenuFilterInput";
2322
+ var DropdownMenuEmpty = ({
2323
+ className,
2324
+ ...props
2325
+ }) => /* @__PURE__ */ jsx(
2326
+ "div",
2327
+ {
2328
+ role: "presentation",
2329
+ className: cn(overlayPrimitiveClassNames.menuEmpty, className),
2330
+ ...props
2331
+ }
2332
+ );
2333
+ DropdownMenuEmpty.displayName = "DropdownMenuEmpty";
2090
2334
  var DropdownMenuLabel = ({
2091
2335
  className,
2092
2336
  inset,
@@ -3242,11 +3486,14 @@ var comboboxSizeTokens = {
3242
3486
  var comboboxTriggerVariants = cva(
3243
3487
  [
3244
3488
  "flex w-full items-center justify-between gap-2 whitespace-nowrap",
3245
- "h-[var(--combobox-trigger-height)] rounded-[var(--radius-md)] border border-input bg-background px-[var(--combobox-trigger-padding-x)]",
3489
+ // --input-radius, not the generic md step: this trigger is a form control and
3490
+ // should round like Input and Select do. Reading the scale step meant it
3491
+ // tracked whatever a language did to medium surfaces instead of what it
3492
+ // decided for its fields.
3493
+ "h-[var(--combobox-trigger-height)] rounded-[var(--input-radius,var(--radius-md))] border border-input bg-background px-[var(--combobox-trigger-padding-x)]",
3246
3494
  "text-[length:var(--combobox-font-size)] ring-offset-background",
3247
3495
  "transition-colors duration-micro ease-out",
3248
3496
  "placeholder:text-muted-foreground",
3249
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
3250
3497
  "disabled:cursor-not-allowed disabled:opacity-50",
3251
3498
  "[&>span]:line-clamp-1 [&>span]:text-left"
3252
3499
  ].join(" "),
@@ -3258,7 +3505,7 @@ var comboboxTriggerVariants = cva(
3258
3505
  large: ""
3259
3506
  },
3260
3507
  error: {
3261
- true: "border-destructive focus-visible:ring-destructive",
3508
+ true: "border-destructive",
3262
3509
  false: ""
3263
3510
  }
3264
3511
  },
@@ -3763,19 +4010,54 @@ var ContextMenu = Object.assign(ContextMenuRoot, {
3763
4010
  SubContent: ContextMenuSubContent
3764
4011
  });
3765
4012
  var DEFAULT_TOOLTIP_DELAY_MS = 150;
4013
+ var SKIP_DELAY_WINDOW_MS = 400;
4014
+ var lastTooltipOpenAt = 0;
4015
+ var skipDelayListeners = /* @__PURE__ */ new Set();
4016
+ function markTooltipOpened() {
4017
+ lastTooltipOpenAt = Date.now();
4018
+ for (const listener of skipDelayListeners) listener();
4019
+ }
4020
+ function shouldSkipDelay() {
4021
+ return Date.now() - lastTooltipOpenAt < SKIP_DELAY_WINDOW_MS;
4022
+ }
4023
+ function useSkipDelay() {
4024
+ const [, tick] = React24.useReducer((count) => count + 1, 0);
4025
+ React24.useEffect(() => {
4026
+ skipDelayListeners.add(tick);
4027
+ return () => {
4028
+ skipDelayListeners.delete(tick);
4029
+ };
4030
+ }, []);
4031
+ return shouldSkipDelay();
4032
+ }
4033
+ var TooltipInstantContext = React24.createContext(false);
3766
4034
  var TooltipProvider = ({
3767
4035
  children,
3768
4036
  delayDuration = DEFAULT_TOOLTIP_DELAY_MS
3769
4037
  }) => {
3770
- return /* @__PURE__ */ jsx(Tooltip$1.Provider, { delay: delayDuration, children });
4038
+ const skipDelay = useSkipDelay();
4039
+ return /* @__PURE__ */ jsx(Tooltip$1.Provider, { delay: skipDelay ? 0 : delayDuration, children });
3771
4040
  };
3772
4041
  var Tooltip = ({
3773
4042
  delayDuration,
3774
4043
  children,
4044
+ onOpenChange,
3775
4045
  ...props
3776
4046
  }) => {
3777
- const delay = delayDuration ?? DEFAULT_TOOLTIP_DELAY_MS;
3778
- return /* @__PURE__ */ jsx(Tooltip$1.Provider, { delay, children: /* @__PURE__ */ jsx(Tooltip$1.Root, { ...props, children }) });
4047
+ const skipDelay = useSkipDelay();
4048
+ const instant = delayDuration == null && skipDelay;
4049
+ const delay = delayDuration ?? (instant ? 0 : DEFAULT_TOOLTIP_DELAY_MS);
4050
+ return /* @__PURE__ */ jsx(TooltipInstantContext.Provider, { value: instant, children: /* @__PURE__ */ jsx(Tooltip$1.Provider, { delay, children: /* @__PURE__ */ jsx(
4051
+ Tooltip$1.Root,
4052
+ {
4053
+ ...props,
4054
+ onOpenChange: (open, eventDetails) => {
4055
+ if (open) markTooltipOpened();
4056
+ onOpenChange?.(open, eventDetails);
4057
+ },
4058
+ children
4059
+ }
4060
+ ) }) });
3779
4061
  };
3780
4062
  var TooltipTrigger = ({
3781
4063
  asChild,
@@ -3805,40 +4087,51 @@ var TooltipContent = ({
3805
4087
  alignOffset = 0,
3806
4088
  ref,
3807
4089
  ...props
3808
- }) => /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsx(
3809
- Tooltip$1.Positioner,
3810
- {
3811
- side,
3812
- align,
3813
- sideOffset,
3814
- alignOffset,
3815
- style: { zIndex: overlayZIndex.tooltip },
3816
- children: /* @__PURE__ */ jsx(
3817
- Tooltip$1.Popup,
3818
- {
3819
- ref,
3820
- className: cn(overlayClassNames.tooltipSurface, className),
3821
- style: { zIndex: overlayZIndex.tooltip, ...style },
3822
- ...props
3823
- }
3824
- )
3825
- }
3826
- ) });
4090
+ }) => {
4091
+ const instant = React24.use(TooltipInstantContext);
4092
+ return /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsx(
4093
+ Tooltip$1.Positioner,
4094
+ {
4095
+ side,
4096
+ align,
4097
+ sideOffset,
4098
+ alignOffset,
4099
+ style: { zIndex: overlayZIndex.tooltip },
4100
+ children: /* @__PURE__ */ jsx(
4101
+ Tooltip$1.Popup,
4102
+ {
4103
+ ref,
4104
+ className: cn(overlayClassNames.tooltipSurface, className),
4105
+ "data-instant": instant || void 0,
4106
+ style: { zIndex: overlayZIndex.tooltip, ...style },
4107
+ ...props
4108
+ }
4109
+ )
4110
+ }
4111
+ ) });
4112
+ };
3827
4113
  TooltipContent.displayName = "TooltipContent";
4114
+ var COPIED_TINT = "text-[hsl(var(--success-strong))]";
4115
+ function CopiedAnnouncement({ copied, message }) {
4116
+ return /* @__PURE__ */ jsx("span", { "aria-live": "polite", className: "sr-only", children: copied ? message : "" });
4117
+ }
3828
4118
  function CopyButton({
3829
4119
  value,
3830
4120
  label,
4121
+ copiedLabel = "Copied",
3831
4122
  successMessage = "Copied to clipboard",
3832
4123
  tooltipText = "Copy",
3833
4124
  iconType = "copy",
4125
+ iconPosition = "leading",
3834
4126
  showToast = true,
4127
+ timeout = 2e3,
3835
4128
  onCopied,
3836
4129
  variant = "ghost",
3837
4130
  size = "icon",
3838
4131
  className,
3839
4132
  ...props
3840
4133
  }) {
3841
- const [copied, setCopied] = React24.useState(false);
4134
+ const { copied, copy } = useCopyToClipboard({ successMessage, showToast, timeout });
3842
4135
  const IconComponent = {
3843
4136
  copy: Copy,
3844
4137
  link: Link,
@@ -3846,38 +4139,30 @@ function CopyButton({
3846
4139
  hash: Hash
3847
4140
  }[iconType];
3848
4141
  const handleCopy = async () => {
3849
- try {
3850
- await navigator.clipboard.writeText(value);
3851
- setCopied(true);
3852
- if (showToast) {
3853
- toast.success(successMessage);
3854
- }
3855
- onCopied?.(value);
3856
- setTimeout(() => setCopied(false), 2e3);
3857
- } catch (error) {
3858
- console.error("Failed to copy:", error);
3859
- toast.error("Failed to copy to clipboard");
3860
- }
4142
+ if (await copy(value)) onCopied?.(value);
3861
4143
  };
4144
+ const icon = copied ? /* @__PURE__ */ jsx(Check, { className: COPIED_TINT }) : /* @__PURE__ */ jsx(IconComponent, {});
4145
+ const iconSlot = iconPosition === "trailing" ? { suffix: icon } : { prefix: icon };
3862
4146
  const button = /* @__PURE__ */ jsxs(
3863
4147
  Button,
3864
4148
  {
3865
4149
  variant,
3866
4150
  size,
3867
4151
  onClick: handleCopy,
3868
- className: cn("transition-colors", copied && "text-green-600 dark:text-green-400", className),
4152
+ className: cn("transition-colors", className),
4153
+ ...iconSlot,
3869
4154
  ...props,
3870
4155
  children: [
3871
- copied ? /* @__PURE__ */ jsx(Check, { className: "size-4" }) : /* @__PURE__ */ jsx(IconComponent, { className: "size-4" }),
3872
- label && /* @__PURE__ */ jsx("span", { className: "ml-1.5", children: label }),
3873
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: tooltipText })
4156
+ label && /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: copied && copiedLabel ? copiedLabel : label }),
4157
+ !label && /* @__PURE__ */ jsx("span", { className: "sr-only", children: tooltipText }),
4158
+ /* @__PURE__ */ jsx(CopiedAnnouncement, { copied, message: successMessage })
3874
4159
  ]
3875
4160
  }
3876
4161
  );
3877
4162
  if (!label) {
3878
4163
  return /* @__PURE__ */ jsxs(Tooltip, { children: [
3879
4164
  /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: button }),
3880
- /* @__PURE__ */ jsx(TooltipContent, { children: /* @__PURE__ */ jsx("p", { children: copied ? "Copied!" : tooltipText }) })
4165
+ /* @__PURE__ */ jsx(TooltipContent, { children: /* @__PURE__ */ jsx("p", { children: copied ? "Copied" : tooltipText }) })
3881
4166
  ] });
3882
4167
  }
3883
4168
  return button;
@@ -3933,6 +4218,36 @@ function CopyCodeButton({
3933
4218
  }
3934
4219
  );
3935
4220
  }
4221
+ function CopyMenuItem({
4222
+ value,
4223
+ children,
4224
+ successMessage = "Copied to clipboard",
4225
+ showToast = false,
4226
+ timeout = 2e3,
4227
+ closeOnCopy = false,
4228
+ onCopied,
4229
+ className,
4230
+ ...props
4231
+ }) {
4232
+ const { copied, copy } = useCopyToClipboard({ successMessage, showToast, timeout });
4233
+ const handleCopy = async () => {
4234
+ if (await copy(value)) onCopied?.(value);
4235
+ };
4236
+ return /* @__PURE__ */ jsxs(
4237
+ DropdownMenuItem,
4238
+ {
4239
+ closeOnClick: closeOnCopy,
4240
+ onClick: handleCopy,
4241
+ className: cn("cursor-pointer", className),
4242
+ ...props,
4243
+ children: [
4244
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children }),
4245
+ copied ? /* @__PURE__ */ jsx(Check, { "aria-hidden": "true", className: cn("size-4", COPIED_TINT) }) : /* @__PURE__ */ jsx(Copy, { "aria-hidden": "true", className: "size-4 text-muted-foreground" }),
4246
+ /* @__PURE__ */ jsx(CopiedAnnouncement, { copied, message: successMessage })
4247
+ ]
4248
+ }
4249
+ );
4250
+ }
3936
4251
  function CopyableField({ value, label, truncate = true, className }) {
3937
4252
  return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2", className), children: [
3938
4253
  label && /* @__PURE__ */ jsxs("span", { className: "text-sm text-muted-foreground shrink-0", children: [
@@ -4142,7 +4457,7 @@ var ContextCardTrigger = ({
4142
4457
  "transition-[opacity,transform,display] duration-[var(--context-card-duration)] ease-[var(--context-card-easing)]",
4143
4458
  "data-starting-style:opacity-0 data-ending-style:opacity-0 data-starting-style:scale-[0.98] data-ending-style:scale-[0.98]",
4144
4459
  "motion-reduce:transition-none motion-reduce:data-starting-style:scale-100 motion-reduce:data-ending-style:scale-100",
4145
- "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
4460
+ "",
4146
4461
  "data-[side=bottom]:origin-top data-[side=left]:origin-right data-[side=right]:origin-left data-[side=top]:origin-bottom",
4147
4462
  className
4148
4463
  ),
@@ -5146,11 +5461,11 @@ var formControlInvalidClassNames = {
5146
5461
  };
5147
5462
  var inputVariants = cva(
5148
5463
  [
5149
- "flex h-[var(--input-height)] w-full rounded-[var(--input-radius)] border border-input bg-background",
5150
- "px-[var(--input-padding-x)] text-[length:var(--input-font-size)] text-foreground shadow-xs",
5464
+ "flex h-[var(--input-height)] w-full rounded-[var(--input-radius)]",
5465
+ "px-[var(--input-padding-x)] text-[length:var(--input-font-size)] text-foreground",
5151
5466
  "transition-[background-color,border-color,box-shadow,color] duration-micro ease-out",
5152
5467
  "placeholder:text-muted-foreground",
5153
- formControlFocusClassNames.input,
5468
+ "outline-none",
5154
5469
  "disabled:cursor-not-allowed disabled:opacity-50",
5155
5470
  "read-only:bg-muted/70 read-only:cursor-default",
5156
5471
  "file:h-full file:border-0 file:border-e file:border-solid file:border-input file:bg-transparent",
@@ -5173,11 +5488,31 @@ var inputVariants = cva(
5173
5488
  prefix: "pl-[var(--input-padding-left)]",
5174
5489
  suffix: "pr-[var(--input-padding-right)]",
5175
5490
  both: "pl-[var(--input-padding-left)] pr-[var(--input-padding-right)]"
5491
+ },
5492
+ /**
5493
+ * `bare` drops the field's own stroke, fill and lift so it can sit inside
5494
+ * a container that already provides them — a footer subscribe group, a
5495
+ * search well, a segmented composer. Those surfaces were each being built
5496
+ * by hand with a raw <input>, because overriding the bordered look from
5497
+ * outside is not reliable: `border-transparent` passed via className and
5498
+ * `border-input` from the base are both border-color utilities, so which
5499
+ * one wins depends on their order in the generated stylesheet rather than
5500
+ * on the order they were written. That is why the stroke, fill and shadow
5501
+ * live in this variant instead of the base — the two tones now never emit
5502
+ * a competing declaration.
5503
+ *
5504
+ * A bare field draws no focus ring of its own. The container owns it, so
5505
+ * the ring surrounds the whole group rather than a box inside it.
5506
+ */
5507
+ tone: {
5508
+ bordered: `border border-input bg-background shadow-xs ${formControlFocusClassNames.input}`,
5509
+ bare: "border-0 bg-transparent shadow-none"
5176
5510
  }
5177
5511
  },
5178
5512
  defaultVariants: {
5179
5513
  size: "md",
5180
- affix: "none"
5514
+ affix: "none",
5515
+ tone: "bordered"
5181
5516
  }
5182
5517
  }
5183
5518
  );
@@ -5199,8 +5534,8 @@ var inputControlButtonVariants = cva(
5199
5534
  [
5200
5535
  "absolute right-[var(--input-control-inset)] top-1/2 flex size-[var(--input-control-size)] -translate-y-1/2 items-center justify-center",
5201
5536
  "rounded-[var(--radius-sm)] text-muted-foreground transition-colors duration-micro ease-out",
5202
- "hover:bg-accent hover:text-foreground",
5203
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
5537
+ "hover:bg-accent hover:text-accent-foreground",
5538
+ "focus-visible:outline-none",
5204
5539
  "disabled:pointer-events-none disabled:opacity-50",
5205
5540
  "[&_svg]:size-[var(--input-control-icon-size)]"
5206
5541
  ].join(" ")
@@ -5239,7 +5574,7 @@ function getInputStyle(size, style) {
5239
5574
  "--input-focus-ring-width": `${inputTokens.focusRingWidth}px`,
5240
5575
  borderRadius: "var(--input-radius)",
5241
5576
  outline: "none",
5242
- ...style
5577
+ ...asPlainStyle(style)
5243
5578
  };
5244
5579
  }
5245
5580
  function getAffixMode(prefix, hasRightAdornment) {
@@ -5265,6 +5600,7 @@ var Input = ({
5265
5600
  className,
5266
5601
  type = "text",
5267
5602
  size = "md",
5603
+ tone = "bordered",
5268
5604
  prefix,
5269
5605
  suffix,
5270
5606
  clearable,
@@ -5384,7 +5720,7 @@ var Input = ({
5384
5720
  "aria-describedby": describedBy,
5385
5721
  "aria-busy": loading || void 0,
5386
5722
  className: cn(
5387
- inputVariants({ size, affix }),
5723
+ inputVariants({ size, affix, tone }),
5388
5724
  type === "file" && "p-0 pr-[var(--input-padding-x)] text-muted-foreground",
5389
5725
  className
5390
5726
  ),
@@ -6577,7 +6913,7 @@ var MultiSelectTrigger = ({
6577
6913
  "gap-[var(--multi-select-trigger-gap)] rounded-[var(--multi-select-trigger-radius)] border border-input bg-background",
6578
6914
  "px-[var(--multi-select-trigger-padding-x)] text-left text-[length:var(--multi-select-trigger-font-size)] text-foreground shadow-xs",
6579
6915
  "transition-[background-color,border-color,box-shadow,color] duration-[var(--multi-select-duration)] ease-[var(--multi-select-easing)]",
6580
- "hover:bg-accent/60 focus-visible:border-ring focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
6916
+ "hover:bg-accent/60 focus-visible:border-ring focus-visible:outline-none",
6581
6917
  "disabled:cursor-not-allowed disabled:opacity-50",
6582
6918
  className
6583
6919
  ),
@@ -6768,7 +7104,7 @@ var MultiSelectRow = ({
6768
7104
  "peer size-[var(--multi-select-checkbox-size)] appearance-none rounded-[var(--radius-sm)] border border-input bg-background",
6769
7105
  "transition-[background-color,border-color,box-shadow] duration-[var(--multi-select-duration)] ease-[var(--multi-select-easing)]",
6770
7106
  "hover:border-ring checked:border-primary checked:bg-primary",
6771
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
7107
+ "focus-visible:outline-none"
6772
7108
  )
6773
7109
  }
6774
7110
  ),
@@ -6798,7 +7134,7 @@ var MultiSelectRow = ({
6798
7134
  className: cn(
6799
7135
  "min-w-[var(--multi-select-action-min-width)] shrink-0 rounded-[var(--radius-sm)] px-2 py-1 text-right text-[length:var(--multi-select-row-description-size)] font-medium text-muted-foreground",
6800
7136
  "opacity-0 transition-[background-color,color,opacity] duration-[var(--multi-select-duration)] ease-[var(--multi-select-easing)]",
6801
- "hover:bg-background hover:text-foreground focus-visible:bg-background focus-visible:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
7137
+ "hover:bg-background hover:text-foreground focus-visible:bg-background focus-visible:text-foreground focus-visible:opacity-100 focus-visible:outline-none",
6802
7138
  "group-hover:opacity-100 group-focus-within:opacity-100"
6803
7139
  ),
6804
7140
  children: action.label
@@ -7848,7 +8184,7 @@ function PaginationRail({
7848
8184
  "group flex min-h-[var(--pagination-min-height)] min-w-0 items-center gap-[var(--pagination-gap)] rounded-[var(--pagination-radius)] border border-border bg-background",
7849
8185
  "px-[var(--pagination-padding-x)] py-[var(--pagination-padding-y)] text-foreground shadow-xs",
7850
8186
  "transition-[background-color,border-color,box-shadow,color,transform] duration-[var(--pagination-duration)] ease-[var(--pagination-easing)]",
7851
- "hover:border-ring hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
8187
+ "hover:border-ring hover:bg-accent focus-visible:outline-none",
7852
8188
  "motion-reduce:transition-none",
7853
8189
  isPrevious ? "justify-start text-left" : "justify-end text-right"
7854
8190
  ),
@@ -8081,7 +8417,7 @@ var variantMap = {
8081
8417
  cta: "text-foreground decoration-border hover:text-foreground hover:decoration-foreground"
8082
8418
  }
8083
8419
  };
8084
- var ctaBase = "font-medium underline underline-offset-[5px] transition-colors duration-100";
8420
+ var ctaBase = "font-medium underline underline-offset-[5px] transition-colors duration-micro";
8085
8421
  function ProjectBanner({
8086
8422
  variant = "info",
8087
8423
  label,
@@ -8139,9 +8475,9 @@ var radioControlClassName = cn(
8139
8475
  "relative inline-flex shrink-0 items-center justify-center rounded-[var(--radius-full)] border-[length:var(--radio-border-width)] border-border bg-background text-foreground",
8140
8476
  "size-[var(--radio-control-size)]",
8141
8477
  "transition-[background-color,border-color,box-shadow] duration-[var(--radio-motion-duration)] ease-[var(--radio-motion-easing)]",
8142
- "after:size-[var(--radio-dot-size)] after:scale-0 after:rounded-[var(--radius-full)] after:bg-current after:opacity-0 after:transition-[opacity,transform] after:duration-[var(--radio-motion-duration)] after:ease-[var(--radio-motion-easing)] after:content-['']",
8478
+ "after:size-[var(--radio-dot-size)] after:scale-95 after:rounded-[var(--radius-full)] after:bg-current after:opacity-0 after:transition-[opacity,transform] after:duration-[var(--radio-motion-duration)] after:ease-[var(--radio-motion-easing)] after:content-['']",
8143
8479
  "peer-checked:border-[var(--neutral-12)] peer-checked:after:scale-100 peer-checked:after:opacity-100",
8144
- "peer-focus-visible:outline-none peer-focus-visible:ring-2 peer-focus-visible:ring-ring peer-focus-visible:ring-offset-2",
8480
+ "peer-focus-visible:outline-none",
8145
8481
  "peer-disabled:border-[var(--neutral-5)] peer-disabled:bg-muted peer-disabled:text-[var(--neutral-8)]"
8146
8482
  );
8147
8483
  function useRadioGroupContext() {
@@ -8360,7 +8696,7 @@ var ResizableHandle = ({
8360
8696
  Separator,
8361
8697
  {
8362
8698
  className: cn(
8363
- "relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90",
8699
+ "relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90",
8364
8700
  className
8365
8701
  ),
8366
8702
  ...props,
@@ -8505,7 +8841,7 @@ function ScrollerButton({
8505
8841
  "absolute z-20 grid size-[var(--scroller-button-size)] place-items-center rounded-[var(--scroller-button-radius)]",
8506
8842
  "border border-border bg-background text-muted-foreground shadow-[var(--scroller-button-shadow)]",
8507
8843
  "transition-[background-color,border-color,color,opacity,transform] duration-[var(--scroller-duration)] ease-[var(--scroller-easing)]",
8508
- "hover:border-ring hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
8844
+ "hover:border-ring hover:text-foreground focus-visible:outline-none",
8509
8845
  "disabled:pointer-events-none disabled:opacity-0 motion-reduce:transition-none",
8510
8846
  axis === "x" && direction === "previous" && "left-[var(--scroller-button-offset)] top-1/2 -translate-y-1/2",
8511
8847
  axis === "x" && direction === "next" && "right-[var(--scroller-button-offset)] top-1/2 -translate-y-1/2",
@@ -8600,7 +8936,7 @@ function Scroller({
8600
8936
  onScroll: updateEdgeState,
8601
8937
  className: cn(
8602
8938
  "h-[var(--scroller-height)] rounded-[var(--scroller-radius)] outline-none",
8603
- "scroll-smooth overscroll-contain focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 motion-reduce:scroll-auto",
8939
+ "scroll-smooth overscroll-contain motion-reduce:scroll-auto",
8604
8940
  resolveScrollClasses(overflow)
8605
8941
  ),
8606
8942
  children: /* @__PURE__ */ jsx(
@@ -8651,7 +8987,7 @@ function getSelectTriggerStyle(size, style) {
8651
8987
  "--select-focus-ring-width": `${selectTokens.focusRingWidth}px`,
8652
8988
  borderRadius: "var(--select-radius)",
8653
8989
  outline: "none",
8654
- ...style
8990
+ ...asPlainStyle(style)
8655
8991
  };
8656
8992
  }
8657
8993
  function getNativeSelectStyle(size, style) {
@@ -8670,7 +9006,7 @@ function getNativeSelectStyle(size, style) {
8670
9006
  "--select-message-gap": `${selectTokens.messageGap}px`,
8671
9007
  "--select-duration": `${selectTokens.motion.duration}ms`,
8672
9008
  "--select-easing": selectTokens.motion.easing,
8673
- ...style
9009
+ ...asPlainStyle(style)
8674
9010
  };
8675
9011
  }
8676
9012
  function getSelectContentStyle(style) {
@@ -8690,7 +9026,7 @@ function getSelectContentStyle(style) {
8690
9026
  "--select-item-indicator-size": `${selectTokens.item.indicatorSize}px`,
8691
9027
  "--select-item-indicator-icon-size": `${selectTokens.item.indicatorIconSize}px`,
8692
9028
  zIndex: overlayZIndex.popover,
8693
- ...style
9029
+ ...asPlainStyle(style)
8694
9030
  };
8695
9031
  }
8696
9032
  function textOf(node) {
@@ -9126,7 +9462,7 @@ function getSheetStyle(style) {
9126
9462
  "--sheet-shadow": sheetTokens.surface.shadow,
9127
9463
  "--sheet-duration": `${overlayTokens.motion.duration}ms`,
9128
9464
  "--sheet-easing": overlayTokens.motion.easing,
9129
- ...style
9465
+ ...asPlainStyle(style)
9130
9466
  };
9131
9467
  }
9132
9468
  function Sheet({ modal = "trap-focus", disablePointerDismissal = true, ...props }) {
@@ -9428,7 +9764,7 @@ var ShowMore = ({
9428
9764
  "h-[var(--show-more-trigger-height)] rounded-[var(--show-more-radius)] px-[var(--show-more-trigger-padding-x)]",
9429
9765
  "transition-[background-color,border-color,color] duration-[var(--show-more-duration)] ease-[var(--show-more-easing)]",
9430
9766
  "hover:border-border hover:bg-muted",
9431
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
9767
+ "focus-visible:outline-none",
9432
9768
  "disabled:pointer-events-none disabled:opacity-50",
9433
9769
  "motion-reduce:transition-none",
9434
9770
  buttonClassName
@@ -9581,7 +9917,7 @@ function getSliderStyle(progress, style) {
9581
9917
  "--slider-duration": `${sliderTokens.motion.duration}ms`,
9582
9918
  "--slider-easing": sliderTokens.motion.easing,
9583
9919
  "--slider-progress": `${progress}%`,
9584
- ...style
9920
+ ...asPlainStyle(style)
9585
9921
  };
9586
9922
  }
9587
9923
  function formatSliderValue(value, unit) {
@@ -9697,7 +10033,7 @@ var Slider = ({
9697
10033
  onBlur,
9698
10034
  className: cn(
9699
10035
  "h-[var(--slider-height)] w-full cursor-pointer appearance-none rounded-[var(--slider-radius)] bg-[linear-gradient(to_right,var(--slider-track-fill)_0,var(--slider-track-fill)_var(--slider-progress),var(--slider-track-background)_var(--slider-progress),var(--slider-track-background)_100%)] bg-[length:100%_var(--slider-track-height)] bg-center bg-no-repeat outline-none",
9700
- "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
10036
+ "disabled:cursor-not-allowed disabled:opacity-50",
9701
10037
  "[&::-moz-range-thumb]:size-[var(--slider-thumb-size)] [&::-moz-range-thumb]:appearance-none [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border [&::-moz-range-thumb]:border-border [&::-moz-range-thumb]:bg-[var(--slider-thumb-background)] [&::-moz-range-thumb]:shadow-[var(--slider-thumb-shadow)]",
9702
10038
  "[&::-webkit-slider-thumb]:size-[var(--slider-thumb-size)] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border [&::-webkit-slider-thumb]:border-border [&::-webkit-slider-thumb]:bg-[var(--slider-thumb-background)] [&::-webkit-slider-thumb]:shadow-[var(--slider-thumb-shadow)]",
9703
10039
  "[&::-moz-range-thumb]:transition-transform [&::-moz-range-thumb]:duration-[var(--slider-duration)] [&::-moz-range-thumb]:ease-[var(--slider-easing)]",
@@ -9730,7 +10066,7 @@ function getSpinnerStyle(size, style) {
9730
10066
  "--spinner-bar-radius": `${spinnerTokens.barRadius}px`,
9731
10067
  "--spinner-duration": `${spinnerTokens.motion.duration}ms`,
9732
10068
  "--spinner-easing": spinnerTokens.motion.easing,
9733
- ...style
10069
+ ...asPlainStyle(style)
9734
10070
  };
9735
10071
  }
9736
10072
  function getBarOpacity(index) {
@@ -10109,7 +10445,7 @@ function getSwitchStyle(size, style) {
10109
10445
  "--switch-control-radius": `${switchTokens.controlRadius}px`,
10110
10446
  "--switch-duration": `${switchTokens.motion.duration}ms`,
10111
10447
  "--switch-easing": switchTokens.motion.easing,
10112
- ...style
10448
+ ...asPlainStyle(style)
10113
10449
  };
10114
10450
  }
10115
10451
  function getSwitchControlStyle(size, style) {
@@ -10120,7 +10456,7 @@ function getSwitchControlStyle(size, style) {
10120
10456
  "--switch-control-padding-x": `${sizeTokens.paddingX}px`,
10121
10457
  "--switch-icon-size": `${sizeTokens.iconSize}px`,
10122
10458
  "--switch-font-size": `${sizeTokens.fontSize}px`,
10123
- ...style
10459
+ ...asPlainStyle(style)
10124
10460
  };
10125
10461
  }
10126
10462
  var SwitchRoot = function SwitchRoot2({
@@ -10230,7 +10566,7 @@ var SwitchControl = function SwitchControl2({
10230
10566
  "inline-flex h-full w-full items-center justify-center gap-1.5 whitespace-nowrap rounded-[var(--switch-control-radius)] px-[var(--switch-control-padding-x)] font-medium text-[length:var(--switch-font-size)]",
10231
10567
  "text-muted-foreground transition-[background-color,box-shadow,color] duration-[var(--switch-duration)] ease-[var(--switch-easing)]",
10232
10568
  "peer-checked:bg-background peer-checked:text-foreground peer-checked:shadow-sm",
10233
- "peer-focus-visible:ring-2 peer-focus-visible:ring-ring peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-background",
10569
+ "",
10234
10570
  "peer-disabled:pointer-events-none peer-disabled:text-muted-foreground/60",
10235
10571
  "[&_svg]:size-[var(--switch-icon-size)]"
10236
10572
  ),
@@ -10249,7 +10585,12 @@ SwitchControl.displayName = "Switch.Control";
10249
10585
  var Switch = Object.assign(SwitchRoot, {
10250
10586
  Control: SwitchControl
10251
10587
  });
10252
- function createTableVars(style) {
10588
+ var ALIGNMENT_CLASS = {
10589
+ start: "text-left",
10590
+ center: "text-center",
10591
+ end: "text-right"
10592
+ };
10593
+ function createTableVars(style, bare) {
10253
10594
  return {
10254
10595
  "--table-min-width": `${tableTokens.wrapper.minWidth}px`,
10255
10596
  "--table-padding": `${tableTokens.wrapper.padding}px`,
@@ -10261,7 +10602,7 @@ function createTableVars(style) {
10261
10602
  "--table-font-size": `${tableTokens.typography.size}px`,
10262
10603
  "--table-heading-weight": tableTokens.typography.headingWeight,
10263
10604
  "--table-body-weight": tableTokens.typography.bodyWeight,
10264
- "--table-body-spacer": `${tableTokens.spacer.bodyTop}px`,
10605
+ "--table-body-spacer": bare ? "0px" : `${tableTokens.spacer.bodyTop}px`,
10265
10606
  "--table-motion-duration": `${tableTokens.motion.duration}ms`,
10266
10607
  "--table-motion-easing": tableTokens.motion.easing,
10267
10608
  ...style
@@ -10272,16 +10613,18 @@ var TableRoot = ({
10272
10613
  wrapperClassName,
10273
10614
  wrapperStyle,
10274
10615
  style,
10616
+ bare = false,
10275
10617
  ref,
10276
10618
  ...props
10277
10619
  }) => /* @__PURE__ */ jsx(
10278
10620
  "div",
10279
10621
  {
10280
10622
  className: cn(
10281
- "relative w-full min-w-[var(--table-min-width)] overflow-auto rounded-[var(--table-radius)] border border-border bg-card p-[var(--table-padding)]",
10623
+ "relative w-full overflow-auto",
10624
+ !bare && "min-w-[var(--table-min-width)] rounded-[var(--table-radius)] border border-border bg-card p-[var(--table-padding)]",
10282
10625
  wrapperClassName
10283
10626
  ),
10284
- style: createTableVars(wrapperStyle),
10627
+ style: createTableVars(wrapperStyle, bare),
10285
10628
  children: /* @__PURE__ */ jsx(
10286
10629
  "table",
10287
10630
  {
@@ -10367,6 +10710,7 @@ TableRow.displayName = "TableRow";
10367
10710
  var TableHead = ({
10368
10711
  className,
10369
10712
  numeric = false,
10713
+ alignment,
10370
10714
  scope = "col",
10371
10715
  ref,
10372
10716
  ...props
@@ -10377,8 +10721,10 @@ var TableHead = ({
10377
10721
  scope,
10378
10722
  className: cn(
10379
10723
  "h-[var(--table-header-height)] px-[var(--table-cell-padding-x)] text-left align-middle font-[var(--table-heading-weight)] text-muted-foreground",
10380
- "last:text-right [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-px",
10724
+ "[&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-px",
10725
+ !alignment && "last:text-right",
10381
10726
  numeric && "text-right font-mono tabular-nums",
10727
+ alignment && ALIGNMENT_CLASS[alignment],
10382
10728
  className
10383
10729
  ),
10384
10730
  ...props
@@ -10388,6 +10734,7 @@ TableHead.displayName = "TableHead";
10388
10734
  var TableCell = ({
10389
10735
  className,
10390
10736
  numeric = false,
10737
+ alignment,
10391
10738
  ref,
10392
10739
  ...props
10393
10740
  }) => /* @__PURE__ */ jsx(
@@ -10396,8 +10743,10 @@ var TableCell = ({
10396
10743
  ref,
10397
10744
  className: cn(
10398
10745
  "px-[var(--table-cell-padding-x)] py-[var(--table-cell-padding-y)] align-middle",
10399
- "last:text-right [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-px",
10746
+ "[&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-px",
10747
+ !alignment && "last:text-right",
10400
10748
  numeric && "text-right font-mono tabular-nums",
10749
+ alignment && ALIGNMENT_CLASS[alignment],
10401
10750
  className
10402
10751
  ),
10403
10752
  ...props
@@ -10464,7 +10813,7 @@ var tabsListVariants = cva(
10464
10813
  }
10465
10814
  );
10466
10815
  var tabsTriggerVariants = cva(
10467
- "relative inline-flex h-[calc(var(--tabs-height)-var(--tabs-padding)*2)] min-w-[var(--tabs-trigger-min-width)] shrink-0 cursor-pointer items-center justify-center gap-[var(--tabs-trigger-gap)] whitespace-nowrap rounded-[var(--tabs-trigger-radius)] px-[var(--tabs-trigger-padding-x)] font-medium text-[length:var(--tabs-font-size)] outline-none transition-[background-color,border-color,box-shadow,color,opacity] duration-[var(--tabs-duration)] ease-[var(--tabs-easing)] focus-visible:ring-[length:var(--tabs-focus-ring-width)] focus-visible:ring-ring focus-visible:ring-offset-[length:var(--tabs-focus-ring-offset)] focus-visible:ring-offset-background disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 [&_svg]:size-[var(--tabs-icon-size)] [&_svg]:shrink-0",
10816
+ "relative inline-flex h-[calc(var(--tabs-height)-var(--tabs-padding)*2)] min-w-[var(--tabs-trigger-min-width)] shrink-0 cursor-pointer items-center justify-center gap-[var(--tabs-trigger-gap)] whitespace-nowrap rounded-[var(--tabs-trigger-radius)] px-[var(--tabs-trigger-padding-x)] font-medium text-[length:var(--tabs-font-size)] outline-none transition-[background-color,border-color,box-shadow,color,opacity] duration-[var(--tabs-duration)] ease-[var(--tabs-easing)] disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 [&_svg]:size-[var(--tabs-icon-size)] [&_svg]:shrink-0",
10468
10817
  {
10469
10818
  variants: {
10470
10819
  variant: {
@@ -10501,7 +10850,7 @@ var tabsIndicatorVariants = cva(
10501
10850
  }
10502
10851
  );
10503
10852
  var tabsContentVariants = cva(
10504
- "mt-[var(--tabs-panel-gap)] text-[length:var(--tabs-font-size)] text-muted-foreground focus-visible:outline-none focus-visible:ring-[length:var(--tabs-focus-ring-width)] focus-visible:ring-ring focus-visible:ring-offset-[length:var(--tabs-focus-ring-offset)] focus-visible:ring-offset-background",
10853
+ "mt-[var(--tabs-panel-gap)] text-[length:var(--tabs-font-size)] text-muted-foreground focus-visible:outline-none",
10505
10854
  {
10506
10855
  variants: {
10507
10856
  variant: {
@@ -10543,7 +10892,7 @@ function getTabsStyle(size, style) {
10543
10892
  "--tabs-badge-font-size": `${tabsTokens.badgeFontSize}px`,
10544
10893
  "--tabs-duration": `${tabsTokens.motion.duration}ms`,
10545
10894
  "--tabs-easing": tabsTokens.motion.easing,
10546
- ...style
10895
+ ...asPlainStyle(style)
10547
10896
  };
10548
10897
  }
10549
10898
  function getFirstEnabledValue(tabs) {
@@ -10739,7 +11088,7 @@ function getTextareaStyle(size, style) {
10739
11088
  "--textarea-focus-ring-width": `${textareaTokens.focusRingWidth}px`,
10740
11089
  borderRadius: "var(--textarea-radius)",
10741
11090
  outline: "none",
10742
- ...style
11091
+ ...asPlainStyle(style)
10743
11092
  };
10744
11093
  }
10745
11094
  function getTextareaFieldStyle() {
@@ -10852,7 +11201,7 @@ function getThemeSwitcherStyle(size, style) {
10852
11201
  "--theme-switcher-focus-ring-offset": `${themeSwitcherTokens.focusRingOffset}px`,
10853
11202
  "--theme-switcher-duration": `${themeSwitcherTokens.motion.duration}ms`,
10854
11203
  "--theme-switcher-easing": themeSwitcherTokens.motion.easing,
10855
- ...style
11204
+ ...asPlainStyle(style)
10856
11205
  };
10857
11206
  }
10858
11207
  function isThemeSwitcherValue(value) {
@@ -10951,7 +11300,7 @@ function getThemeToggleStyle(size, style) {
10951
11300
  "--theme-toggle-radius": `${token.radius}px`,
10952
11301
  "--theme-toggle-duration": `${themeToggleTokens.motion.duration}ms`,
10953
11302
  "--theme-toggle-easing": themeToggleTokens.motion.easing,
10954
- ...style
11303
+ ...asPlainStyle(style)
10955
11304
  };
10956
11305
  }
10957
11306
  function readDocumentTheme() {
@@ -11076,7 +11425,6 @@ var ThemeToggle = ({
11076
11425
  "inline-flex size-[var(--theme-toggle-size)] shrink-0 items-center justify-center rounded-[var(--theme-toggle-radius)] p-[var(--theme-toggle-padding)] text-foreground",
11077
11426
  "transition-[background-color,color,box-shadow] duration-[var(--theme-toggle-duration)] ease-[var(--theme-toggle-easing)]",
11078
11427
  "hover:bg-accent hover:text-accent-foreground",
11079
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
11080
11428
  "disabled:pointer-events-none disabled:opacity-50",
11081
11429
  "motion-reduce:transition-none",
11082
11430
  className
@@ -11351,7 +11699,7 @@ function getToggleStyle(size, color, style) {
11351
11699
  "--toggle-thumb": colorTokens.thumb,
11352
11700
  "--toggle-icon-on": colorTokens.iconOn,
11353
11701
  "--toggle-icon-off": colorTokens.iconOff,
11354
- ...style
11702
+ ...asPlainStyle(style)
11355
11703
  };
11356
11704
  }
11357
11705
  var Toggle = ({
@@ -11425,7 +11773,7 @@ var Toggle = ({
11425
11773
  "border-[var(--toggle-track-border)] transition-[background-color,border-color] duration-[var(--toggle-duration)] ease-[var(--toggle-easing)]",
11426
11774
  "peer-checked:bg-[var(--toggle-track-on)]",
11427
11775
  "peer-checked:[&>span]:translate-x-[var(--toggle-thumb-translate)] peer-checked:[&>span]:text-[var(--toggle-icon-on)]",
11428
- "peer-focus-visible:ring-2 peer-focus-visible:ring-ring peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-background",
11776
+ "",
11429
11777
  "peer-disabled:cursor-not-allowed peer-disabled:opacity-60",
11430
11778
  "motion-reduce:transition-none"
11431
11779
  ),
@@ -11478,7 +11826,10 @@ var toggleGroupVariants = cva(
11478
11826
  variants: {
11479
11827
  variant: {
11480
11828
  default: "",
11481
- outline: "bg-transparent border"
11829
+ outline: "bg-transparent border",
11830
+ // Segmented pill look — theme-toggle / mode-pills style. Rounded-full
11831
+ // track with a rounded-full active segment (see toggleGroupItemVariants).
11832
+ pill: "rounded-full bg-neutral-2 p-0.5"
11482
11833
  }
11483
11834
  },
11484
11835
  defaultVariants: {
@@ -11487,12 +11838,13 @@ var toggleGroupVariants = cva(
11487
11838
  }
11488
11839
  );
11489
11840
  var toggleGroupItemVariants = cva(
11490
- "inline-flex items-center justify-center whitespace-nowrap rounded-[var(--radius-md)] px-3 py-1.5 text-sm font-medium ring-offset-background transition-[background-color,box-shadow,color,opacity] duration-flow ease-out motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-background data-[state=on]:text-foreground data-[state=on]:shadow-sm",
11841
+ "inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-[var(--radius-md)] px-3 py-1.5 text-sm font-medium ring-offset-background transition-[background-color,box-shadow,color,opacity] duration-flow ease-out motion-reduce:transition-none disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-background data-[state=on]:text-foreground data-[state=on]:shadow-sm",
11491
11842
  {
11492
11843
  variants: {
11493
11844
  variant: {
11494
11845
  default: "",
11495
- outline: "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground data-[state=on]:bg-accent data-[state=on]:text-accent-foreground"
11846
+ outline: "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground data-[state=on]:bg-accent data-[state=on]:text-accent-foreground",
11847
+ pill: "rounded-full text-neutral-11 hover:text-neutral-12 data-[state=on]:bg-primary/5 data-[state=on]:text-primary data-[state=on]:shadow-none"
11496
11848
  },
11497
11849
  size: {
11498
11850
  default: "h-9 px-3",
@@ -11550,7 +11902,17 @@ var ToggleGroup = ({
11550
11902
  }
11551
11903
  onValueChange?.(newValue);
11552
11904
  }
11553
- return /* @__PURE__ */ jsx("div", { ref, className: cn(toggleGroupVariants({ variant }), className), ...props, children: /* @__PURE__ */ jsx(ToggleGroupTypeContext.Provider, { value: type, children: /* @__PURE__ */ jsx(ToggleGroupValueContext.Provider, { value, children: /* @__PURE__ */ jsx(ToggleGroupChangeContext.Provider, { value: changeToggleGroupValue, children: /* @__PURE__ */ jsx(ToggleGroupDisabledContext.Provider, { value: disabled, children: /* @__PURE__ */ jsx(ToggleGroupVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx(ToggleGroupSizeContext.Provider, { value: size, children }) }) }) }) }) }) });
11905
+ return /* @__PURE__ */ jsx(
11906
+ "div",
11907
+ {
11908
+ ref,
11909
+ role: type === "single" ? "radiogroup" : "group",
11910
+ "data-toggle-group-root": "",
11911
+ className: cn(toggleGroupVariants({ variant }), className),
11912
+ ...props,
11913
+ children: /* @__PURE__ */ jsx(ToggleGroupTypeContext.Provider, { value: type, children: /* @__PURE__ */ jsx(ToggleGroupValueContext.Provider, { value, children: /* @__PURE__ */ jsx(ToggleGroupChangeContext.Provider, { value: changeToggleGroupValue, children: /* @__PURE__ */ jsx(ToggleGroupDisabledContext.Provider, { value: disabled, children: /* @__PURE__ */ jsx(ToggleGroupVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx(ToggleGroupSizeContext.Provider, { value: size, children }) }) }) }) }) })
11914
+ }
11915
+ );
11554
11916
  };
11555
11917
  ToggleGroup.displayName = "ToggleGroup";
11556
11918
  var ToggleGroupItem = ({
@@ -11568,7 +11930,8 @@ var ToggleGroupItem = ({
11568
11930
  function toggleItemSelection(event) {
11569
11931
  if (isDisabled) return;
11570
11932
  if (context.type === "single") {
11571
- context.onValueChange(isSelected ? "" : value);
11933
+ if (isSelected) return;
11934
+ context.onValueChange(value);
11572
11935
  } else {
11573
11936
  const currentArray = Array.isArray(context.value) ? context.value : [];
11574
11937
  context.onValueChange(
@@ -11577,26 +11940,75 @@ var ToggleGroupItem = ({
11577
11940
  }
11578
11941
  props.onClick?.(event);
11579
11942
  }
11580
- return /* @__PURE__ */ jsx(
11581
- "button",
11582
- {
11583
- ref,
11584
- type: "button",
11585
- disabled: isDisabled,
11586
- "data-state": isSelected ? "on" : "off",
11587
- "aria-pressed": isSelected,
11588
- className: cn(
11589
- toggleGroupItemVariants({
11590
- variant: variant ?? context.variant,
11591
- size: size ?? context.size
11592
- }),
11593
- className,
11594
- "focus-visible:z-10"
11595
- ),
11596
- onClick: toggleItemSelection,
11597
- ...props,
11598
- children
11599
- }
11943
+ function handleItemKeyDown(event) {
11944
+ props.onKeyDown?.(event);
11945
+ if (context.type !== "single" || event.defaultPrevented) return;
11946
+ const container = event.currentTarget.closest("[data-toggle-group-root]");
11947
+ if (!container) return;
11948
+ const items = Array.from(
11949
+ container.querySelectorAll("[data-toggle-item]:not(:disabled)")
11950
+ );
11951
+ const currentIndex = items.indexOf(event.currentTarget);
11952
+ if (currentIndex === -1 || items.length === 0) return;
11953
+ const focusAndSelect = (targetIndex) => {
11954
+ const wrapped = (targetIndex % items.length + items.length) % items.length;
11955
+ const target = items[wrapped];
11956
+ if (!target) return;
11957
+ target.focus();
11958
+ const targetValue = target.dataset.toggleValue;
11959
+ if (targetValue !== void 0) context.onValueChange(targetValue);
11960
+ };
11961
+ switch (event.key) {
11962
+ case "ArrowRight":
11963
+ case "ArrowDown":
11964
+ event.preventDefault();
11965
+ focusAndSelect(currentIndex + 1);
11966
+ break;
11967
+ case "ArrowLeft":
11968
+ case "ArrowUp":
11969
+ event.preventDefault();
11970
+ focusAndSelect(currentIndex - 1);
11971
+ break;
11972
+ case "Home":
11973
+ event.preventDefault();
11974
+ focusAndSelect(0);
11975
+ break;
11976
+ case "End":
11977
+ event.preventDefault();
11978
+ focusAndSelect(items.length - 1);
11979
+ break;
11980
+ }
11981
+ }
11982
+ const rovingTabIndex = context.type === "single" ? isSelected || context.value === "" ? 0 : -1 : void 0;
11983
+ return (
11984
+ // biome-ignore lint/a11y/useAriaPropsSupportedByRole: see comment above.
11985
+ /* @__PURE__ */ jsx(
11986
+ "button",
11987
+ {
11988
+ ref,
11989
+ type: "button",
11990
+ disabled: isDisabled,
11991
+ "data-state": isSelected ? "on" : "off",
11992
+ "data-toggle-item": "",
11993
+ "data-toggle-value": value,
11994
+ role: context.type === "single" ? "radio" : void 0,
11995
+ "aria-checked": context.type === "single" ? isSelected : void 0,
11996
+ "aria-pressed": context.type === "multiple" ? isSelected : void 0,
11997
+ tabIndex: rovingTabIndex,
11998
+ className: cn(
11999
+ toggleGroupItemVariants({
12000
+ variant: variant ?? context.variant,
12001
+ size: size ?? context.size
12002
+ }),
12003
+ className,
12004
+ "focus-visible:z-10"
12005
+ ),
12006
+ onClick: toggleItemSelection,
12007
+ ...props,
12008
+ onKeyDown: handleItemKeyDown,
12009
+ children
12010
+ }
12011
+ )
11600
12012
  );
11601
12013
  };
11602
12014
  ToggleGroupItem.displayName = "ToggleGroupItem";
@@ -11898,6 +12310,6 @@ var TreeIcon = ({ icon, hasChildren = false, className, ...props }) => {
11898
12310
  };
11899
12311
  var TreeLabel = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { className: cn("font flex-1 truncate text-sm", className), ...props });
11900
12312
 
11901
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertContent, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertIcon, AlertTitle, AlertToolbar, AnimateIn, AnimateInGroup, AnimatedThemeToggler, AspectRatio, Avatar, AvatarFallback, AvatarGroup, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonLink, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, CheckboxGroup, CodeBlock, Collapse, CollapseGroup, Combobox, ComboboxEmpty, ComboboxGroupSub, ComboboxInput, ComboboxList, ComboboxOptionItem, ComboboxRoot, ComboboxSeparator, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandResults, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuRoot, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyCodeButton, CopyIdButton, CopyLinkButton, CopyableField, Description, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStateIcon, EmptyStateRoot, ErrorSurface as Error, ErrorMessage, Field, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Gauge, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Kbd, Label, LoadingDots, Menu, MenuButton, MenuContainer, MenuItem, MenuItemLocked, MenuLink, MenuSection, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Modal, MultiSelectContent, MultiSelectRoot, MultiSelectRow, MultiSelectTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Note, Pagination, Popover, PopoverAnchor, PopoverContent, PopoverPositioner, PopoverTrigger, Progress, ProjectBanner, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, Scroller, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator2 as Separator, Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, ShowMore, Skeleton, SkeletonAvatar, SkeletonCard, SkeletonText, Slider, Spinner2 as Spinner, SplitButton, SplitButtonMenuItem, Stack, StatusDot, Switch, Table, TableBody, TableCaption, TableCell, TableCol, TableColgroup, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, ThemeSwitcher, ThemeToggle, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TreeExpander, TreeIcon, TreeLabel, TreeLines, TreeNode, TreeNodeContent, TreeNodeTrigger, TreeProvider, TreeView, alertVariants, badgeVariants, buttonVariants, containerWidths, flexLayouts, gridLayouts, labelVariants, navigationMenuTriggerStyle, progressIndicatorVariants, progressVariants, tabsContentVariants, tabsListVariants, tabsTriggerVariants, toggleGroupItemVariants, toggleGroupVariants, useCopyToClipboard, useFormField, useToasts, zIndex };
12313
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertContent, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertIcon, AlertTitle, AlertToolbar, AnimateIn, AnimateInGroup, AnimateSwap, AnimatedThemeToggler, AspectRatio, Avatar, AvatarFallback, AvatarGroup, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonLink, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, CheckboxGroup, CodeBlock, Collapse, CollapseGroup, Combobox, ComboboxEmpty, ComboboxGroupSub, ComboboxInput, ComboboxList, ComboboxOptionItem, ComboboxRoot, ComboboxSeparator, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandResults, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuRoot, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyCodeButton, CopyIdButton, CopyLinkButton, CopyMenuItem, CopyableField, Description, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuEmpty, DropdownMenuFilterInput, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStateIcon, EmptyStateRoot, ErrorSurface as Error, ErrorMessage, Field, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Gauge, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Kbd, Label, LoadingDots, Menu, MenuButton, MenuContainer, MenuItem, MenuItemLocked, MenuLink, MenuSection, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Modal, MultiSelectContent, MultiSelectRoot, MultiSelectRow, MultiSelectTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Note, Pagination, Popover, PopoverAnchor, PopoverContent, PopoverPositioner, PopoverTrigger, Progress, ProjectBanner, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, Scroller, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator2 as Separator, Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, ShowMore, Skeleton, SkeletonAvatar, SkeletonCard, SkeletonText, Slider, Spinner2 as Spinner, SplitButton, SplitButtonMenuItem, Stack, StatusDot, Switch, Table, TableBody, TableCaption, TableCell, TableCol, TableColgroup, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, ThemeSwitcher, ThemeToggle, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TreeExpander, TreeIcon, TreeLabel, TreeLines, TreeNode, TreeNodeContent, TreeNodeTrigger, TreeProvider, TreeView, alertVariants, badgeVariants, buttonVariants, containerWidths, flexLayouts, gridLayouts, labelVariants, navigationMenuTriggerStyle, progressIndicatorVariants, progressVariants, tabsContentVariants, tabsListVariants, tabsTriggerVariants, toggleGroupItemVariants, toggleGroupVariants, useCopyToClipboard, useFormField, useToasts, zIndex };
11902
12314
  //# sourceMappingURL=canonical.js.map
11903
12315
  //# sourceMappingURL=canonical.js.map