@nebutra/ui 0.2.3 → 3.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 (51) hide show
  1. package/dist/animate-in-BlvjVh2S.d.ts +250 -0
  2. package/dist/{canonical-Drca5UMj.d.ts → canonical-DEhT4VfS.d.ts} +83 -369
  3. package/dist/card-DunB1gKE.d.ts +105 -0
  4. package/dist/chat/index.d.ts +1 -0
  5. package/dist/chat/index.js +3 -0
  6. package/dist/chat/index.js.map +1 -0
  7. package/dist/components/index.d.ts +90 -126
  8. package/dist/components/index.js +433 -182
  9. package/dist/components/index.js.map +1 -1
  10. package/dist/editorial/index.d.ts +404 -0
  11. package/dist/editorial/index.js +942 -0
  12. package/dist/editorial/index.js.map +1 -0
  13. package/dist/empty-state-bmfHCOuN.d.ts +86 -0
  14. package/dist/hooks/index.d.ts +18 -1
  15. package/dist/hooks/index.js +120 -5
  16. package/dist/hooks/index.js.map +1 -1
  17. package/dist/icons/index.d.ts +1 -0
  18. package/dist/index.d.ts +1 -1
  19. package/dist/layout/index.d.ts +17 -58
  20. package/dist/layout/index.js +368 -127
  21. package/dist/layout/index.js.map +1 -1
  22. package/dist/layouts/index.d.ts +1 -1
  23. package/dist/layouts/index.js +93 -28
  24. package/dist/layouts/index.js.map +1 -1
  25. package/dist/patterns/index.d.ts +39 -46
  26. package/dist/patterns/index.js +534 -323
  27. package/dist/patterns/index.js.map +1 -1
  28. package/dist/primitives/canonical.d.ts +5 -2
  29. package/dist/primitives/canonical.js +598 -288
  30. package/dist/primitives/canonical.js.map +1 -1
  31. package/dist/primitives/index.d.ts +165 -63
  32. package/dist/primitives/index.js +1251 -983
  33. package/dist/primitives/index.js.map +1 -1
  34. package/dist/tailwind.preset.d.ts +32 -32
  35. package/dist/tailwind.preset.js +24 -20
  36. package/dist/tailwind.preset.js.map +1 -1
  37. package/dist/theme/index.d.ts +1 -110
  38. package/dist/typography/fonts.css +8 -16
  39. package/dist/typography/index.d.ts +29 -45
  40. package/dist/typography/index.js +26 -14
  41. package/dist/typography/index.js.map +1 -1
  42. package/dist/utils/auth-surfaces.d.ts +33 -0
  43. package/dist/utils/auth-surfaces.js +9 -0
  44. package/dist/utils/auth-surfaces.js.map +1 -0
  45. package/dist/utils/index.d.ts +20 -16
  46. package/dist/utils/index.js +99 -20
  47. package/dist/utils/index.js.map +1 -1
  48. package/package.json +25 -11
  49. package/src/typography/fonts.css +8 -16
  50. package/dist/styles/brand-override.css +0 -61
  51. package/src/styles/brand-override.css +0 -61
@@ -2,7 +2,7 @@
2
2
  import { Accordion as Accordion$1 } from '@base-ui/react/accordion';
3
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
- import { twMerge } from 'tailwind-merge';
5
+ import { extendTailwindMerge } from 'tailwind-merge';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
7
  import { cva } from 'class-variance-authority';
8
8
  import { AlertDialog as AlertDialog$1 } from '@base-ui/react/alert-dialog';
@@ -10,6 +10,7 @@ import * as React24 from 'react';
10
10
  import React24__default, { createContext, useId, useRef, useState, useMemo, use, useCallback, useEffect, Children, isValidElement, cloneElement } from 'react';
11
11
  import { colors, brandSpring, flow, emerge } from '@nebutra/brand';
12
12
  export { brandSpring } from '@nebutra/brand';
13
+ import { tokenColor, fontStack } from '@nebutra/tokens/values';
13
14
  import { useReducedMotion, LazyMotion, domAnimation, AnimatePresence, motion, m } from 'framer-motion';
14
15
  import { Avatar as Avatar$1 } from '@base-ui/react/avatar';
15
16
  import { Prism } from 'react-syntax-highlighter';
@@ -36,6 +37,80 @@ import { Tabs as Tabs$1 } from '@base-ui/react/tabs';
36
37
  import { useTheme } from '@nebutra/tokens';
37
38
 
38
39
  // src/primitives/accordion.tsx
40
+
41
+ // src/utils/tw-merge-theme.generated.ts
42
+ var TW_MERGE_THEME = {
43
+ breakpoint: ["3xl", "shell", "tight", "xs"],
44
+ container: ["content", "text", "wide"],
45
+ ease: ["brand", "in", "in-out", "out", "spring"],
46
+ font: ["cn", "display", "heading", "mono", "sans"],
47
+ leading: ["display", "heading"],
48
+ radius: ["2xl", "3xl", "button", "card", "full", "lg", "md", "none", "panel", "sm", "xl", "xs"],
49
+ shadow: [
50
+ "2xl",
51
+ "ambient-glow",
52
+ "ambient-lg",
53
+ "ambient-md",
54
+ "ambient-sm",
55
+ "brand",
56
+ "brand-lg",
57
+ "glass-lg",
58
+ "glass-md",
59
+ "glass-sm",
60
+ "glow-accent",
61
+ "glow-accent-lg",
62
+ "glow-accent-sm",
63
+ "glow-primary",
64
+ "lg",
65
+ "md",
66
+ "sheen",
67
+ "sm",
68
+ "xl",
69
+ "xs"
70
+ ],
71
+ text: [
72
+ "2xl",
73
+ "2xs",
74
+ "3xl",
75
+ "4xl",
76
+ "5xl",
77
+ "6xl",
78
+ "7xl",
79
+ "8xl",
80
+ "9xl",
81
+ "base",
82
+ "body",
83
+ "display",
84
+ "label",
85
+ "lg",
86
+ "meta",
87
+ "sm",
88
+ "ui",
89
+ "xl",
90
+ "xs"
91
+ ],
92
+ tracking: ["display", "heading", "label", "tight"]
93
+ };
94
+ var TW_MERGE_CLASS_GROUPS = {
95
+ duration: [{ duration: ["cinematic", "flow", "micro", "reveal"] }]
96
+ };
97
+
98
+ // src/utils/cn.ts
99
+ var twMerge = extendTailwindMerge({
100
+ extend: {
101
+ theme: Object.fromEntries(
102
+ Object.entries(TW_MERGE_THEME).map(([key, values]) => [key, [...values]])
103
+ ),
104
+ classGroups: Object.fromEntries(
105
+ Object.entries(TW_MERGE_CLASS_GROUPS).map(([key, groups]) => [
106
+ key,
107
+ groups.map(
108
+ (group) => Object.fromEntries(Object.entries(group).map(([k, v]) => [k, [...v]]))
109
+ )
110
+ ])
111
+ )
112
+ }
113
+ });
39
114
  function cn(...inputs) {
40
115
  return twMerge(clsx(inputs));
41
116
  }
@@ -48,17 +123,17 @@ function asPlainStyle(style) {
48
123
  function withHtmlProps(Component) {
49
124
  return Component;
50
125
  }
51
- var RadixItem = withHtmlProps(Accordion$1.Item);
52
- var RadixHeader = withHtmlProps(Accordion$1.Header);
53
- var RadixTrigger = withHtmlProps(Accordion$1.Trigger);
54
- var RadixContent = withHtmlProps(Accordion$1.Panel);
126
+ var AccordionItemBase = withHtmlProps(Accordion$1.Item);
127
+ var AccordionHeaderBase = withHtmlProps(Accordion$1.Header);
128
+ var AccordionTriggerBase = withHtmlProps(Accordion$1.Trigger);
129
+ var AccordionPanelBase = withHtmlProps(Accordion$1.Panel);
55
130
  var Accordion = Accordion$1.Root;
56
131
  var AccordionItem = ({
57
132
  className,
58
133
  ref,
59
134
  ...props
60
135
  }) => /* @__PURE__ */ jsx(
61
- RadixItem,
136
+ AccordionItemBase,
62
137
  {
63
138
  ref,
64
139
  className: cn("border-b border-border/70 last:border-b-0", className),
@@ -72,8 +147,8 @@ var AccordionTrigger = ({
72
147
  size = "default",
73
148
  ref,
74
149
  ...props
75
- }) => /* @__PURE__ */ jsx(RadixHeader, { className: "flex", children: /* @__PURE__ */ jsxs(
76
- RadixTrigger,
150
+ }) => /* @__PURE__ */ jsx(AccordionHeaderBase, { className: "flex", children: /* @__PURE__ */ jsxs(
151
+ AccordionTriggerBase,
77
152
  {
78
153
  ref,
79
154
  className: cn(
@@ -105,11 +180,11 @@ var AccordionContent = ({
105
180
  ref,
106
181
  ...props
107
182
  }) => /* @__PURE__ */ jsx(
108
- RadixContent,
183
+ AccordionPanelBase,
109
184
  {
110
185
  ref,
111
186
  ...keepMounted ? { keepMounted: true } : {},
112
- className: "text-sm leading-relaxed data-[ending-style]:animate-accordion-up data-[open]:animate-accordion-down overflow-hidden text-muted-foreground transition-[height,opacity] duration-flow ease-out",
187
+ className: "text-sm leading-relaxed h-[var(--accordion-panel-height,auto)] data-[starting-style]:h-0 data-[ending-style]:h-0 overflow-hidden text-muted-foreground transition-[height,opacity] duration-flow ease-out",
113
188
  ...props,
114
189
  children: /* @__PURE__ */ jsx("div", { className: cn(size === "small" ? "pb-2.5 pt-0" : "pb-4 pt-0", className), children })
115
190
  }
@@ -195,7 +270,7 @@ var alertVariants = cva("flex items-stretch w-full gap-2 group-[.toaster]:w-(--w
195
270
  {
196
271
  variant: "destructive",
197
272
  appearance: "outline",
198
- className: "border border-border bg-background text-destructive [&_[data-slot=alert-close]]:text-foreground"
273
+ className: "border border-border bg-background text-destructive-strong [&_[data-slot=alert-close]]:text-foreground"
199
274
  },
200
275
  {
201
276
  variant: "success",
@@ -265,7 +340,7 @@ var alertVariants = cva("flex items-stretch w-full gap-2 group-[.toaster]:w-(--w
265
340
  {
266
341
  variant: "mono",
267
342
  icon: "destructive",
268
- className: "[&_[data-slot=alert-icon]]:text-destructive"
343
+ className: "[&_[data-slot=alert-icon]]:text-destructive-strong"
269
344
  },
270
345
  {
271
346
  variant: "mono",
@@ -287,6 +362,7 @@ function Alert({
287
362
  appearance,
288
363
  close = false,
289
364
  onClose,
365
+ closeLabel = "Dismiss",
290
366
  children,
291
367
  ...props
292
368
  }) {
@@ -304,7 +380,7 @@ function Alert({
304
380
  {
305
381
  type: "button",
306
382
  onClick: onClose,
307
- "aria-label": "Dismiss",
383
+ "aria-label": closeLabel,
308
384
  "data-slot": "alert-close",
309
385
  className: cn(
310
386
  "group shrink-0 size-4 inline-flex items-center justify-center rounded-[var(--radius-sm)]",
@@ -348,7 +424,7 @@ function AlertContent({ className, ...props }) {
348
424
  );
349
425
  }
350
426
  ({
351
- // Nebutra Blue (云毓蓝) — technology & trust — VI: #0033FE
427
+ // Nebutra Blue (云毓蓝) — technology & trust
352
428
  blue50: colors.primary[50],
353
429
  blue100: colors.primary[100],
354
430
  blue200: colors.primary[200],
@@ -361,7 +437,7 @@ function AlertContent({ className, ...props }) {
361
437
  blue800: colors.primary[800],
362
438
  blue900: colors.primary[900],
363
439
  blue950: colors.primary[950],
364
- // Nebutra Cyan (云毓青) — data flow & intelligence — VI: #0BF1C3
440
+ // Nebutra Cyan (云毓青) — data flow & intelligence
365
441
  cyan50: colors.accent[50],
366
442
  cyan100: colors.accent[100],
367
443
  cyan200: colors.accent[200],
@@ -386,6 +462,13 @@ function AlertContent({ className, ...props }) {
386
462
  neutral800: colors.neutral[800],
387
463
  neutral900: colors.neutral[900],
388
464
  neutral950: colors.neutral[950],
465
+ // deepest — used as dark background
466
+ // Semantic raw colors — VI §Color Specifications. The 500s are the status
467
+ // tokens; the 600 hover steps have no token of their own.
468
+ // NOTE: info = brand blue, not sky/teal
469
+ red500: tokenColor("--status-danger"),
470
+ green500: tokenColor("--status-success"),
471
+ amber500: tokenColor("--status-warning"),
389
472
  white: colors.white,
390
473
  black: colors.black
391
474
  });
@@ -441,6 +524,18 @@ var primitiveFontWeight = {
441
524
  normal: 400,
442
525
  medium: 500,
443
526
  semibold: 600};
527
+ ({
528
+ /** Default body/UI stack — Geist with CJK falling through to MiSans */
529
+ sans: fontStack("--font-sans"),
530
+ /** CJK-locale stack (same order as sans, minus Latin-only system faces) */
531
+ cnSans: fontStack("--font-cn"),
532
+ /** Display / hero headlines */
533
+ display: fontStack("--font-display"),
534
+ /** Headings */
535
+ heading: fontStack("--font-heading"),
536
+ /** Code / monospace */
537
+ mono: fontStack("--font-mono")
538
+ });
444
539
  var primitiveShadow = {
445
540
  sm: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
446
541
  md: "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)",
@@ -458,7 +553,7 @@ var primitiveTransition = {
458
553
  // hero entrance, big delight moments
459
554
  },
460
555
  easing: {
461
- default: "ease-out",
556
+ default: "var(--ease-brand)",
462
557
  inOut: "cubic-bezier(0.4, 0, 0.2, 1)"
463
558
  }
464
559
  };
@@ -472,8 +567,7 @@ var primitiveFocusRing = {
472
567
  // src/tokens/shadows.ts
473
568
  var shadowClasses = {
474
569
  md: "shadow-md",
475
- xl: "shadow-xl",
476
- "2xl": "shadow-2xl"};
570
+ xl: "shadow-xl"};
477
571
 
478
572
  // src/tokens/components/overlay.ts
479
573
  var overlayFocusRingClassName = "outline-none";
@@ -492,71 +586,80 @@ var overlayTokens = {
492
586
  }};
493
587
  var overlayClassNames = {
494
588
  focusRing: overlayFocusRingClassName,
495
- 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",
589
+ backdrop: (
590
+ // allow-palette: dialog backdrop dims arbitrary app content behind it, must stay dark in both themes
591
+ "fixed inset-0 bg-black/40 transition-[opacity] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)] data-ending-style:opacity-0 data-starting-style:opacity-0 data-ending-style:duration-[var(--motion-duration-micro)] motion-reduce:transition-none"
592
+ ),
496
593
  modalSurface: [
497
594
  "fixed left-1/2 top-1/2 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4",
498
- "border border-border/60 bg-background/95 p-6 text-foreground backdrop-blur-xl",
595
+ "bg-background p-6 text-foreground",
499
596
  "rounded-[var(--radius-xl)]",
500
- shadowClasses["2xl"],
597
+ "shadow-[0_0_0_1px_var(--edge-soft),var(--elevation-overlay)]",
501
598
  "outline-none",
502
- "transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
503
- "data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0",
599
+ "transition-[opacity,transform] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
600
+ "data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0 data-ending-style:duration-[var(--motion-duration-micro)]",
504
601
  "motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none"
505
602
  ].join(" "),
506
603
  menuSurface: [
507
- "min-w-32 overflow-hidden rounded-[var(--radius-lg)] border border-border/70 bg-popover/95 p-1 text-popover-foreground backdrop-blur-md",
604
+ "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",
508
605
  shadowClasses.xl,
509
- "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
510
- "data-[starting-style]:scale-95 data-[starting-style]:opacity-0 data-[ending-style]:scale-95 data-[ending-style]:opacity-0",
606
+ "outline-none transition-[opacity,transform] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
607
+ "data-[starting-style]:scale-[0.97] data-[starting-style]:opacity-0 data-ending-style:scale-[0.97] data-ending-style:opacity-0 data-ending-style:duration-[var(--motion-duration-micro)]",
511
608
  "motion-reduce:transition-none motion-reduce:data-[starting-style]:transform-none motion-reduce:data-[ending-style]:transform-none"
512
609
  ].join(" "),
513
610
  selectSurface: [
514
- "max-h-[var(--select-content-max-height)] min-w-[var(--select-content-min-width)] overflow-hidden",
611
+ "max-h-[var(--select-content-max-height)] min-w-[var(--select-content-min-width)] origin-[var(--transform-origin)] overflow-hidden",
515
612
  "rounded-[var(--select-content-radius)] border border-border/70 bg-popover/95 text-popover-foreground backdrop-blur-md",
516
613
  "shadow-[var(--select-content-shadow)] outline-none",
517
- "transition-[opacity,transform,display] duration-[var(--select-duration)] ease-[var(--select-easing)]",
518
- "data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0",
614
+ "transition-[opacity,transform] duration-[var(--select-duration)] ease-[var(--ease-brand)]",
615
+ "data-starting-style:scale-[0.97] data-starting-style:opacity-0 data-ending-style:scale-[0.97] data-ending-style:opacity-0",
519
616
  "motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none"
520
617
  ].join(" "),
521
618
  navigationMenuSurface: [
522
- "min-w-32 overflow-hidden rounded-[var(--radius-xl)] border border-border/70 bg-popover/95 text-popover-foreground backdrop-blur-md",
619
+ "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",
523
620
  shadowClasses.xl,
524
- "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
525
- "data-[starting-style]:scale-95 data-[starting-style]:opacity-0 data-[ending-style]:scale-95 data-[ending-style]:opacity-0",
621
+ "outline-none transition-[opacity,transform] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
622
+ "data-[starting-style]:scale-[0.97] data-[starting-style]:opacity-0 data-ending-style:scale-[0.97] data-ending-style:opacity-0 data-ending-style:duration-[var(--motion-duration-micro)]",
526
623
  "motion-reduce:transition-none motion-reduce:data-[starting-style]:transform-none motion-reduce:data-[ending-style]:transform-none"
527
624
  ].join(" "),
528
625
  popoverSurface: [
529
- "w-72 rounded-[var(--radius-lg)] border border-border/70 bg-popover/95 p-4 text-popover-foreground backdrop-blur-md",
626
+ "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",
530
627
  shadowClasses.xl,
531
- "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
532
- "data-[open]:opacity-100 data-[closed]:opacity-0 data-[closed]:scale-95 data-[open]:scale-100",
628
+ "outline-none transition-[opacity,transform] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
629
+ "data-[open]:opacity-100 data-[closed]:opacity-0 data-[closed]:scale-[0.97] data-[open]:scale-100 data-[closed]:duration-[var(--motion-duration-micro)]",
533
630
  "motion-reduce:transition-none motion-reduce:data-[closed]:transform-none motion-reduce:data-[open]:transform-none"
534
631
  ].join(" "),
535
632
  tooltipSurface: [
536
- "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",
633
+ "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",
537
634
  shadowClasses.md,
538
- "transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
539
- "data-starting-style:scale-95 data-starting-style:opacity-0 data-ending-style:scale-95 data-ending-style:opacity-0",
635
+ "transition-[opacity,transform] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
636
+ "data-starting-style:scale-[0.97] data-starting-style:opacity-0 data-ending-style:scale-[0.97] data-ending-style:opacity-0 data-ending-style:duration-[var(--motion-duration-micro)]",
637
+ "data-[instant]:duration-0",
540
638
  "motion-reduce:transition-none motion-reduce:data-starting-style:transform-none motion-reduce:data-ending-style:transform-none"
541
639
  ].join(" "),
542
640
  sheetBackdrop: [
543
641
  "fixed inset-0 bg-[var(--sheet-overlay-background)] backdrop-blur-[var(--sheet-overlay-blur)]",
544
- "transition-[opacity,backdrop-filter,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
545
- "data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none"
642
+ "transition-[opacity] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
643
+ "data-ending-style:opacity-0 data-starting-style:opacity-0 data-ending-style:duration-[var(--motion-duration-micro)] motion-reduce:transition-none"
546
644
  ].join(" "),
547
645
  sheetSurface: [
548
646
  "fixed flex flex-col overflow-hidden border border-border bg-[var(--sheet-background)] text-foreground shadow-[var(--sheet-shadow)]",
549
- "outline-none transition-[opacity,transform,display] duration-[var(--motion-duration-flow)] ease-[var(--ease-out)]",
550
- "data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none"
647
+ "outline-none transition-[opacity,transform] duration-[var(--motion-duration-flow)] ease-[var(--ease-brand)]",
648
+ "data-ending-style:opacity-0 data-starting-style:opacity-0 data-ending-style:duration-[var(--motion-duration-micro)] motion-reduce:transition-none"
551
649
  ].join(" "),
552
- 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`
650
+ 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`
553
651
  };
554
652
  var buttonVariants = cva(
555
653
  [
556
654
  "inline-flex items-center justify-center gap-2 whitespace-nowrap",
557
655
  "rounded-[var(--btn-default-radius,var(--radius-md))]",
558
656
  "text-[length:var(--control-font-size-md,0.875rem)] font-[number:var(--font-weight-medium,500)]",
559
- "transition-colors duration-micro ease-out",
657
+ // `transform` is in the property list on purpose: without it the
658
+ // active:scale-[0.97] press snapped instantly and the button felt dead
659
+ // under the finger. Duration/ease stay on the flow rail — motion
660
+ // governance pins them (primitives/__tests__/motion-governance.test.ts).
661
+ "transition-[color,background-color,border-color,box-shadow,transform] duration-flow ease-[var(--ease-brand)]",
662
+ "active:scale-[0.97] motion-reduce:active:scale-100 motion-reduce:transition-none",
560
663
  "disabled:pointer-events-none disabled:opacity-50",
561
664
  "aria-busy:cursor-wait"
562
665
  ].join(" "),
@@ -565,7 +668,7 @@ var buttonVariants = cva(
565
668
  variant: {
566
669
  // Recipe-driven via packages/design/tokens/recipe.css (.btn-brand-default)
567
670
  default: "btn-brand-default",
568
- ink: "bg-[var(--neutral-12)] text-[var(--neutral-1)] ring-1 ring-inset ring-[color:var(--neutral-1)]/5 hover:bg-[var(--neutral-11)] hover:-translate-y-px active:translate-y-0 transition-[transform,background-color] duration-micro",
671
+ ink: "bg-neutral-12 text-neutral-1 ring-1 ring-inset ring-neutral-1/5 hover:bg-neutral-11 hover:-translate-y-px active:translate-y-0 transition-[transform,background-color] duration-micro",
569
672
  destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
570
673
  outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
571
674
  secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
@@ -822,13 +925,13 @@ var motionDurations = {
822
925
  cinematic: 500
823
926
  };
824
927
  var easings = {
825
- easeOut: [0, 0, 0.2, 1],
928
+ easeOut: [0.16, 1, 0.3, 1],
826
929
  easeInOut: [0.4, 0, 0.2, 1]};
827
930
  var motionVariants = {
828
931
  fadeInUp: {
829
- initial: { opacity: 0, y: 20 },
830
- animate: { opacity: 1, y: 0 },
831
- exit: { opacity: 0, y: 10 }
932
+ initial: { opacity: 0, transform: "translateY(20px)" },
933
+ animate: { opacity: 1, transform: "translateY(0px)" },
934
+ exit: { opacity: 0, transform: "translateY(10px)" }
832
935
  },
833
936
  scaleIn: {
834
937
  initial: { opacity: 0, scale: 0.95 },
@@ -838,15 +941,15 @@ var motionVariants = {
838
941
  var staggerContainers = {
839
942
  fast: {
840
943
  initial: {},
841
- animate: { transition: { staggerChildren: 0.05, delayChildren: 0.1 } }
944
+ animate: { transition: { staggerChildren: 0.04, delayChildren: 0 } }
842
945
  },
843
946
  normal: {
844
947
  initial: {},
845
- animate: { transition: { staggerChildren: 0.1, delayChildren: 0.2 } }
948
+ animate: { transition: { staggerChildren: 0.06, delayChildren: 0.04 } }
846
949
  },
847
950
  slow: {
848
951
  initial: {},
849
- animate: { transition: { staggerChildren: 0.15, delayChildren: 0.3 } }
952
+ animate: { transition: { staggerChildren: 0.08, delayChildren: 0.05 } }
850
953
  }
851
954
  };
852
955
  var viewportSettings = {
@@ -885,37 +988,37 @@ var PRESETS = {
885
988
  * Pair with `AnimateSwap`.
886
989
  */
887
990
  swap: {
888
- initial: { opacity: 0, y: 10, filter: "blur(4px)" },
889
- animate: { opacity: 1, y: 0, filter: "blur(0px)" },
890
- exit: { opacity: 0, y: -10, filter: "blur(4px)" },
991
+ initial: { opacity: 0, transform: "translateY(10px)", filter: "blur(4px)" },
992
+ animate: { opacity: 1, transform: "translateY(0px)", filter: "blur(0px)" },
993
+ exit: { opacity: 0, transform: "translateY(-10px)", filter: "blur(4px)" },
891
994
  transition: { duration: motionDurations.reveal / 1e3 }
892
995
  },
893
996
  /** Off-canvas panel entering from the right edge (drawer, sheet). */
894
997
  slideFromRight: {
895
- initial: { x: "100%" },
896
- animate: { x: 0 },
897
- exit: { x: "100%" },
998
+ initial: { transform: "translateX(100%)" },
999
+ animate: { transform: "translateX(0%)" },
1000
+ exit: { transform: "translateX(100%)" },
898
1001
  transition: brandSpring.default
899
1002
  },
900
1003
  /** Off-canvas panel entering from the left edge. */
901
1004
  slideFromLeft: {
902
- initial: { x: "-100%" },
903
- animate: { x: 0 },
904
- exit: { x: "-100%" },
1005
+ initial: { transform: "translateX(-100%)" },
1006
+ animate: { transform: "translateX(0%)" },
1007
+ exit: { transform: "translateX(-100%)" },
905
1008
  transition: brandSpring.default
906
1009
  },
907
1010
  /** Off-canvas panel entering from the top edge (banner, command bar). */
908
1011
  slideFromTop: {
909
- initial: { y: "-100%" },
910
- animate: { y: 0 },
911
- exit: { y: "-100%" },
1012
+ initial: { transform: "translateY(-100%)" },
1013
+ animate: { transform: "translateY(0%)" },
1014
+ exit: { transform: "translateY(-100%)" },
912
1015
  transition: brandSpring.default
913
1016
  },
914
1017
  /** Off-canvas panel entering from the bottom edge (mobile action sheet). */
915
1018
  slideFromBottom: {
916
- initial: { y: "100%" },
917
- animate: { y: 0 },
918
- exit: { y: "100%" },
1019
+ initial: { transform: "translateY(100%)" },
1020
+ animate: { transform: "translateY(0%)" },
1021
+ exit: { transform: "translateY(100%)" },
919
1022
  transition: brandSpring.default
920
1023
  }
921
1024
  };
@@ -925,7 +1028,7 @@ function MotionDiv(props) {
925
1028
  function AnimateIn(props) {
926
1029
  const {
927
1030
  children,
928
- preset = "emerge",
1031
+ preset = "fade",
929
1032
  delay = 0,
930
1033
  duration,
931
1034
  inView = false,
@@ -933,7 +1036,7 @@ function AnimateIn(props) {
933
1036
  ...rest
934
1037
  } = props;
935
1038
  const shouldReduce = useReducedMotion();
936
- const base = PRESETS[preset] || PRESETS.emerge;
1039
+ const base = PRESETS[preset] || PRESETS.fade;
937
1040
  const initial = shouldReduce ? { opacity: 0 } : base.initial;
938
1041
  const animate2 = shouldReduce ? { opacity: 1 } : base.animate;
939
1042
  const exit = shouldReduce ? { opacity: 0 } : "exit" in base ? base.exit : void 0;
@@ -1300,8 +1403,14 @@ var badgeVariants = cva(
1300
1403
  "teal-subtle": "bg-info/10 text-info fill-current border-transparent",
1301
1404
  inverted: "bg-foreground text-background fill-current",
1302
1405
  // Special visual treatments (intentional product design, not brand hex)
1303
- trial: "bg-gradient-to-br from-trial-start to-trial-end text-primary-foreground fill-current",
1304
- turbo: "bg-gradient-to-br from-turbo-start to-turbo-end text-primary-foreground fill-current",
1406
+ trial: (
1407
+ // allow-palette: the trial gradient is fixed and vivid in both themes, so its ink is fixed white
1408
+ "bg-gradient-to-br from-trial-start to-trial-end text-white fill-current"
1409
+ ),
1410
+ turbo: (
1411
+ // allow-palette: the turbo gradient is fixed and vivid in both themes, so its ink is fixed white
1412
+ "bg-gradient-to-br from-turbo-start to-turbo-end text-white fill-current"
1413
+ ),
1305
1414
  pill: "bg-background text-foreground fill-foreground border-border hover:bg-muted/50 focus-visible:bg-muted/50",
1306
1415
  beta: "border-transparent bg-muted text-muted-foreground",
1307
1416
  new: "border-transparent bg-primary/10 text-primary",
@@ -1416,8 +1525,9 @@ var Slot = React24.forwardRef(
1416
1525
  Slot.displayName = "Slot";
1417
1526
  var Breadcrumb = ({
1418
1527
  ref,
1528
+ "aria-label": ariaLabel = "breadcrumb",
1419
1529
  ...props
1420
- }) => /* @__PURE__ */ jsx("nav", { ref, "aria-label": "breadcrumb", ...props });
1530
+ }) => /* @__PURE__ */ jsx("nav", { ref, "aria-label": ariaLabel, ...props });
1421
1531
  Breadcrumb.displayName = "Breadcrumb";
1422
1532
  var BreadcrumbList = ({
1423
1533
  className,
@@ -1514,10 +1624,10 @@ function Spinner({ className }) {
1514
1624
  }
1515
1625
  );
1516
1626
  }
1517
- function getIconSizeClass(size, iconSize2) {
1518
- if (iconSize2 === "sm") return "[&>svg]:size-3.5";
1519
- if (iconSize2 === "md") return "[&>svg]:size-3.5";
1520
- if (iconSize2 === "lg") return "[&>svg]:size-4";
1627
+ function getIconSizeClass(size, iconSize3) {
1628
+ if (iconSize3 === "sm") return "[&>svg]:size-3.5";
1629
+ if (iconSize3 === "md") return "[&>svg]:size-3.5";
1630
+ if (iconSize3 === "lg") return "[&>svg]:size-4";
1521
1631
  switch (size) {
1522
1632
  case "tiny":
1523
1633
  return "[&>svg]:size-3";
@@ -1532,10 +1642,10 @@ function getIconSizeClass(size, iconSize2) {
1532
1642
  return "[&>svg]:size-4";
1533
1643
  }
1534
1644
  }
1535
- function getSpinnerSizeClass(size, iconSize2) {
1536
- if (iconSize2 === "sm") return "size-3.5";
1537
- if (iconSize2 === "md") return "size-3.5";
1538
- if (iconSize2 === "lg") return "size-4";
1645
+ function getSpinnerSizeClass(size, iconSize3) {
1646
+ if (iconSize3 === "sm") return "size-3.5";
1647
+ if (iconSize3 === "md") return "size-3.5";
1648
+ if (iconSize3 === "lg") return "size-4";
1539
1649
  switch (size) {
1540
1650
  case "tiny":
1541
1651
  return "size-3";
@@ -1560,10 +1670,10 @@ function resolveShadowClass(shadow) {
1560
1670
  const level = shadow === true ? "md" : shadow;
1561
1671
  return SHADOW_CLASSES[level];
1562
1672
  }
1563
- function ButtonContent({ loading, prefix, suffix, size, iconSize: iconSize2, children }) {
1564
- const iconSizeClass = getIconSizeClass(size, iconSize2);
1673
+ function ButtonContent({ loading, prefix, suffix, size, iconSize: iconSize3, children }) {
1674
+ const iconSizeClass = getIconSizeClass(size, iconSize3);
1565
1675
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1566
- loading && /* @__PURE__ */ jsx(Spinner, { className: getSpinnerSizeClass(size, iconSize2) }),
1676
+ loading && /* @__PURE__ */ jsx(Spinner, { className: getSpinnerSizeClass(size, iconSize3) }),
1567
1677
  prefix != null && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: cn("shrink-0", iconSizeClass), children: prefix }),
1568
1678
  children,
1569
1679
  suffix != null && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: cn("shrink-0", iconSizeClass), children: suffix })
@@ -1574,7 +1684,7 @@ var Button = ({
1574
1684
  variant,
1575
1685
  size,
1576
1686
  shape,
1577
- iconSize: iconSize2,
1687
+ iconSize: iconSize3,
1578
1688
  asChild = false,
1579
1689
  loading = false,
1580
1690
  disabled,
@@ -1592,7 +1702,7 @@ var Button = ({
1592
1702
  Comp,
1593
1703
  {
1594
1704
  ref,
1595
- className: cn(buttonVariants({ variant, size, shape, iconSize: iconSize2 }), shadowClass, className),
1705
+ className: cn(buttonVariants({ variant, size, shape, iconSize: iconSize3 }), shadowClass, className),
1596
1706
  disabled: isDisabled,
1597
1707
  "aria-busy": loading || void 0,
1598
1708
  ...props,
@@ -1603,7 +1713,7 @@ var Button = ({
1603
1713
  prefix,
1604
1714
  suffix,
1605
1715
  size,
1606
- iconSize: iconSize2,
1716
+ iconSize: iconSize3,
1607
1717
  children
1608
1718
  }
1609
1719
  )
@@ -1616,7 +1726,7 @@ var ButtonLink = ({
1616
1726
  variant,
1617
1727
  size,
1618
1728
  shape,
1619
- iconSize: iconSize2,
1729
+ iconSize: iconSize3,
1620
1730
  prefix,
1621
1731
  suffix,
1622
1732
  shadow,
@@ -1636,7 +1746,7 @@ var ButtonLink = ({
1636
1746
  {
1637
1747
  ref,
1638
1748
  className: cn(
1639
- buttonVariants({ variant, size, shape, iconSize: iconSize2 }),
1749
+ buttonVariants({ variant, size, shape, iconSize: iconSize3 }),
1640
1750
  shadowClass,
1641
1751
  loading && "pointer-events-none opacity-50",
1642
1752
  className
@@ -1650,7 +1760,7 @@ var ButtonLink = ({
1650
1760
  prefix,
1651
1761
  suffix,
1652
1762
  size,
1653
- iconSize: iconSize2,
1763
+ iconSize: iconSize3,
1654
1764
  children
1655
1765
  }
1656
1766
  )
@@ -1658,68 +1768,119 @@ var ButtonLink = ({
1658
1768
  );
1659
1769
  };
1660
1770
  ButtonLink.displayName = "ButtonLink";
1661
- var Card = ({
1771
+ var cardVariants = cva(
1772
+ "rounded-[var(--radius-card,var(--radius-lg))] text-card-foreground transition-[box-shadow,background-color] duration-micro",
1773
+ {
1774
+ variants: {
1775
+ variant: {
1776
+ default: "bg-card shadow-[var(--elevation-card)] ring-1 ring-[var(--edge-soft)]",
1777
+ elevated: "bg-card shadow-ambient-md ring-1 ring-[var(--edge-soft)]",
1778
+ outline: "bg-transparent ring-1 ring-border",
1779
+ ghost: "bg-transparent"
1780
+ },
1781
+ padding: {
1782
+ none: "",
1783
+ sm: "p-4",
1784
+ md: "p-6",
1785
+ lg: "p-8"
1786
+ },
1787
+ interactive: {
1788
+ true: "cursor-pointer hover:shadow-ambient-md",
1789
+ false: ""
1790
+ }
1791
+ },
1792
+ defaultVariants: { variant: "default", padding: "none", interactive: false }
1793
+ }
1794
+ );
1795
+ var CardPaddedContext = React24.createContext(false);
1796
+ var CardRoot = ({
1662
1797
  className,
1798
+ variant,
1799
+ padding = "none",
1800
+ interactive,
1663
1801
  ref,
1664
1802
  ...props
1665
- }) => /* @__PURE__ */ jsx(
1803
+ }) => /* @__PURE__ */ jsx(CardPaddedContext.Provider, { value: padding !== "none", children: /* @__PURE__ */ jsx(
1666
1804
  "div",
1667
1805
  {
1668
1806
  ref,
1669
- className: cn(
1670
- "rounded-[var(--radius-lg)] border border-border bg-card text-card-foreground shadow-sm",
1671
- className
1672
- ),
1807
+ className: cn(cardVariants({ variant, padding, interactive }), className),
1673
1808
  ...props
1674
1809
  }
1675
- );
1676
- Card.displayName = "Card";
1677
- var CardHeader = ({
1678
- className,
1679
- ref,
1680
- ...props
1681
- }) => /* @__PURE__ */ jsx("div", { ref, className: cn("flex flex-col space-y-1.5 p-6", className), ...props });
1810
+ ) });
1811
+ CardRoot.displayName = "Card";
1812
+ var CardHeader = ({ className, ref, ...props }) => {
1813
+ const padded = React24.use(CardPaddedContext);
1814
+ return /* @__PURE__ */ jsx(
1815
+ "div",
1816
+ {
1817
+ ref,
1818
+ className: cn("flex flex-col gap-1.5", !padded && "p-6", className),
1819
+ ...props
1820
+ }
1821
+ );
1822
+ };
1682
1823
  CardHeader.displayName = "CardHeader";
1683
- var CardTitle = ({
1684
- className,
1685
- children,
1686
- ref,
1687
- ...props
1688
- }) => /* @__PURE__ */ jsx(
1689
- "h3",
1824
+ var CardTitle = ({ className, as: Tag = "h3", ref, ...props }) => /* @__PURE__ */ jsx(
1825
+ Tag,
1690
1826
  {
1691
1827
  ref,
1692
- className: cn("text-2xl font-semibold leading-none tracking-tight", className),
1693
- ...props,
1694
- children
1828
+ className: cn("text-lg font-semibold leading-tight tracking-tight text-foreground", className),
1829
+ ...props
1695
1830
  }
1696
1831
  );
1697
1832
  CardTitle.displayName = "CardTitle";
1698
- var CardDescription = ({
1699
- className,
1700
- as: Tag = "p",
1833
+ var CardDescription = ({ className, as: Tag = "p", ref, ...props }) => React24.createElement(Tag, {
1701
1834
  ref,
1835
+ className: cn("text-sm leading-relaxed text-muted-foreground", className),
1702
1836
  ...props
1703
- }) => {
1704
- return React24.createElement(Tag, {
1705
- ref,
1706
- className: cn("text-sm text-muted-foreground", className),
1707
- ...props
1708
- });
1709
- };
1837
+ });
1710
1838
  CardDescription.displayName = "CardDescription";
1711
- var CardContent = ({
1712
- className,
1713
- ref,
1714
- ...props
1715
- }) => /* @__PURE__ */ jsx("div", { ref, className: cn("p-6 pt-0", className), ...props });
1839
+ var CardContent = ({ className, ref, ...props }) => {
1840
+ const padded = React24.use(CardPaddedContext);
1841
+ return /* @__PURE__ */ jsx("div", { ref, className: cn(padded ? "mt-4 first:mt-0" : "p-6 pt-0", className), ...props });
1842
+ };
1716
1843
  CardContent.displayName = "CardContent";
1717
- var CardFooter = ({
1718
- className,
1719
- ref,
1720
- ...props
1721
- }) => /* @__PURE__ */ jsx("div", { ref, className: cn("flex items-center p-6 pt-0", className), ...props });
1844
+ var CardFooter = ({ className, ref, ...props }) => {
1845
+ const padded = React24.use(CardPaddedContext);
1846
+ return /* @__PURE__ */ jsx(
1847
+ "div",
1848
+ {
1849
+ ref,
1850
+ className: cn(
1851
+ "flex items-center",
1852
+ padded ? "mt-6 border-t border-border/50 pt-4 first:mt-0" : "p-6 pt-0",
1853
+ className
1854
+ ),
1855
+ ...props
1856
+ }
1857
+ );
1858
+ };
1722
1859
  CardFooter.displayName = "CardFooter";
1860
+ var iconSize = { sm: "size-8", md: "size-10", lg: "size-12" };
1861
+ var CardIcon = ({ className, size = "md", ref, ...props }) => /* @__PURE__ */ jsx(
1862
+ "div",
1863
+ {
1864
+ ref,
1865
+ className: cn(
1866
+ "flex shrink-0 items-center justify-center rounded-[var(--radius-lg)] bg-muted/50",
1867
+ iconSize[size],
1868
+ className
1869
+ ),
1870
+ ...props
1871
+ }
1872
+ );
1873
+ CardIcon.displayName = "CardIcon";
1874
+ var Card = Object.assign(CardRoot, {
1875
+ Header: CardHeader,
1876
+ Title: CardTitle,
1877
+ Description: CardDescription,
1878
+ Content: CardContent,
1879
+ Body: CardContent,
1880
+ Footer: CardFooter,
1881
+ Icon: CardIcon
1882
+ });
1883
+ var CardBody = CardContent;
1723
1884
  var DEFAULT_STROKE_WIDTH = 1.6;
1724
1885
  function CheckGlyph({
1725
1886
  size = 16,
@@ -1780,35 +1941,36 @@ function IndeterminateGlyph({
1780
1941
  }
1781
1942
  );
1782
1943
  }
1783
- var getInputClasses = (checked, disabled, indeterminate) => {
1784
- let className = "relative border w-4 h-4 duration-micro rounded inline-flex items-center justify-center";
1785
- if (disabled) {
1786
- if (!checked || indeterminate) {
1787
- className += " bg-geist-gray-100 border-geist-gray-500";
1788
- className += indeterminate ? " stroke-geist-gray-500" : " fill-geist-gray-100 stroke-geist-gray-100";
1789
- } else {
1790
- className += " bg-geist-gray-600 border-geist-gray-600 fill-geist-gray-600 stroke-geist-gray-100";
1791
- }
1792
- } else {
1793
- if (!checked || indeterminate) {
1794
- className += " bg-geist-background-100 border-geist-gray-700 group-hover:bg-geist-gray-200";
1795
- className += indeterminate ? " stroke-geist-gray-700" : " fill-geist-background-100 stroke-geist-background-100 group-hover:stroke-geist-gray-200 group-hover:fill-geist-gray-200";
1796
- } else {
1797
- className += " bg-geist-gray-1000 border-geist-gray-1000 fill-geist-gray-1000 stroke-geist-gray-100";
1798
- }
1799
- }
1800
- return className;
1944
+
1945
+ // src/primitives/form-control.ts
1946
+ var formControlFocusClassNames = {
1947
+ input: "outline-none focus:border-ring focus:ring-[length:var(--input-focus-ring-width)] focus:ring-ring/30",
1948
+ textarea: "outline-none focus:border-ring focus:ring-[length:var(--textarea-focus-ring-width)] focus:ring-ring/30",
1949
+ select: "outline-none focus:border-ring focus:ring-[length:var(--select-focus-ring-width)] focus:ring-ring/30"
1801
1950
  };
1951
+ var formControlInvalidClassNames = {
1952
+ input: "aria-invalid:border-destructive/60 aria-invalid:focus:border-destructive aria-invalid:focus:ring-destructive/20",
1953
+ textarea: "aria-invalid:border-destructive/60 aria-invalid:focus:border-destructive aria-invalid:focus:ring-destructive/20",
1954
+ select: "aria-invalid:border-destructive/60 aria-invalid:focus:border-destructive aria-invalid:focus:ring-destructive/20"
1955
+ };
1956
+ var controlFocusProxyClassName = "peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-[hsl(var(--ring))]";
1957
+ var boxClassName = (on) => cn(
1958
+ "relative inline-flex size-4 shrink-0 items-center justify-center rounded-[4px] border",
1959
+ "stroke-current fill-none transition-[background-color,border-color,color] duration-micro",
1960
+ on ? "border-primary bg-primary text-primary-foreground" : "border-[var(--control-border)] bg-background text-transparent group-hover:border-muted-foreground",
1961
+ "peer-disabled:opacity-50",
1962
+ controlFocusProxyClassName
1963
+ );
1802
1964
  var Checkbox = ({
1803
1965
  checked: controlledChecked,
1804
1966
  defaultChecked = false,
1805
- onChange,
1967
+ onChange: legacyOnChange,
1968
+ onCheckedChange: onChange = legacyOnChange,
1806
1969
  disabled = false,
1807
1970
  indeterminate = false,
1808
1971
  children,
1809
1972
  className,
1810
- id,
1811
- name
1973
+ ...inputProps
1812
1974
  }) => {
1813
1975
  const [internalChecked, setInternalChecked] = React24__default.useState(defaultChecked);
1814
1976
  const isControlled = controlledChecked !== void 0;
@@ -1817,34 +1979,28 @@ var Checkbox = ({
1817
1979
  "label",
1818
1980
  {
1819
1981
  className: cn(
1820
- "flex items-center text-[13px] font-sans group",
1821
- disabled ? "text-geist-gray-500 cursor-not-allowed" : "text-geist-gray-1000 cursor-pointer",
1982
+ "group flex items-center text-[13px] font-sans",
1983
+ disabled ? "cursor-not-allowed text-muted-foreground" : "cursor-pointer text-foreground",
1822
1984
  className
1823
1985
  ),
1824
1986
  children: [
1825
1987
  /* @__PURE__ */ jsx(
1826
1988
  "input",
1827
1989
  {
1828
- id,
1829
- name,
1990
+ ...inputProps,
1830
1991
  disabled,
1831
1992
  type: "checkbox",
1832
1993
  checked,
1994
+ "aria-checked": indeterminate ? "mixed" : void 0,
1833
1995
  onChange: (e) => {
1834
- if (!indeterminate) {
1835
- if (!isControlled) {
1836
- setInternalChecked(e.target.checked);
1837
- }
1838
- if (onChange) {
1839
- onChange(e.target.checked);
1840
- }
1841
- }
1996
+ if (indeterminate) return;
1997
+ if (!isControlled) setInternalChecked(e.target.checked);
1998
+ onChange?.(e.target.checked);
1842
1999
  },
1843
- "aria-label": typeof children === "string" ? children : "checkbox",
1844
- className: "sr-only"
2000
+ className: "peer sr-only"
1845
2001
  }
1846
2002
  ),
1847
- /* @__PURE__ */ jsx("span", { className: getInputClasses(checked, disabled, indeterminate), children: indeterminate ? /* @__PURE__ */ jsx(IndeterminateGlyph, {}) : /* @__PURE__ */ jsx(CheckGlyph, {}) }),
2003
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: boxClassName(checked || indeterminate), children: indeterminate ? /* @__PURE__ */ jsx(IndeterminateGlyph, {}) : /* @__PURE__ */ jsx(CheckGlyph, {}) }),
1848
2004
  children && /* @__PURE__ */ jsx("span", { className: "ml-2", children })
1849
2005
  ]
1850
2006
  }
@@ -2070,9 +2226,9 @@ var overlayPrimitiveClassNames = {
2070
2226
  menuItemBaseClassName,
2071
2227
  "min-h-8 gap-2",
2072
2228
  menuHighlightedClassName,
2073
- "data-[variant=destructive]:text-destructive",
2229
+ "data-[variant=destructive]:text-destructive-strong",
2074
2230
  "data-[variant=destructive]:data-[highlighted]:bg-destructive/10",
2075
- "data-[variant=destructive]:data-[highlighted]:text-destructive"
2231
+ "data-[variant=destructive]:data-[highlighted]:text-destructive-strong"
2076
2232
  ].join(" "),
2077
2233
  menuItem: [menuItemBaseClassName, menuHighlightedClassName].join(" "),
2078
2234
  menuSubTrigger: [
@@ -2196,7 +2352,7 @@ var DropdownMenuSubContent = ({
2196
2352
  style,
2197
2353
  ref,
2198
2354
  ...props
2199
- }) => /* @__PURE__ */ jsx(Menu$1.Portal, { children: /* @__PURE__ */ jsx(Menu$1.Positioner, { children: /* @__PURE__ */ jsx(
2355
+ }) => /* @__PURE__ */ jsx(Menu$1.Portal, { children: /* @__PURE__ */ jsx(Menu$1.Positioner, { style: { zIndex: overlayZIndex.popover }, children: /* @__PURE__ */ jsx(
2200
2356
  Menu$1.Popup,
2201
2357
  {
2202
2358
  ref,
@@ -2226,6 +2382,7 @@ var DropdownMenuContent = ({
2226
2382
  align,
2227
2383
  alignOffset,
2228
2384
  side,
2385
+ style: { zIndex: overlayZIndex.popover },
2229
2386
  children: /* @__PURE__ */ jsx(
2230
2387
  Menu$1.Popup,
2231
2388
  {
@@ -2526,7 +2683,8 @@ function CodeBlock(props) {
2526
2683
  onLineReference,
2527
2684
  languageIcons,
2528
2685
  showLanguageIcon = true,
2529
- "aria-label": ariaLabel
2686
+ "aria-label": ariaLabel,
2687
+ copyLabel = "Copy code"
2530
2688
  } = props;
2531
2689
  const resolvedHide = props.hideLineNumbers;
2532
2690
  const resolvedShow = props.showLineNumbers;
@@ -2748,7 +2906,9 @@ function CodeBlock(props) {
2748
2906
  /* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", className: "max-h-60 overflow-y-auto", children: controlledSwitcher.options.map((opt) => /* @__PURE__ */ jsxs(
2749
2907
  DropdownMenuItem,
2750
2908
  {
2751
- onClick: () => controlledSwitcher.onChange(opt.value),
2909
+ onClick: () => (controlledSwitcher.onValueChange ?? controlledSwitcher.onChange)?.(
2910
+ opt.value
2911
+ ),
2752
2912
  className: cn(
2753
2913
  "text-xs",
2754
2914
  opt.value === controlledSwitcher.value && "bg-accent font-medium"
@@ -2820,7 +2980,7 @@ function CodeBlock(props) {
2820
2980
  type: "button",
2821
2981
  onClick: () => copyToClipboard(code),
2822
2982
  className: "inline-flex h-8 w-8 items-center justify-center rounded-[var(--radius-md)] hover:bg-accent hover:text-accent-foreground",
2823
- "aria-label": "Copy code",
2983
+ "aria-label": copyLabel,
2824
2984
  children: copied ? /* @__PURE__ */ jsx(
2825
2985
  motion.div,
2826
2986
  {
@@ -2958,11 +3118,7 @@ var commandFrameClassName = cn(
2958
3118
  "[&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-2.5",
2959
3119
  "[&_[cmdk-item]_svg]:h-4 [&_[cmdk-item]_svg]:w-4"
2960
3120
  );
2961
- var commandInputWrapperClassName = cn(
2962
- "flex items-center border-b border-border px-3",
2963
- "transition-[border-color] duration-micro ease-out",
2964
- "has-[:focus-visible]:border-ring/60"
2965
- );
3121
+ var commandInputWrapperClassName = cn("flex items-center border-b border-border px-3");
2966
3122
  var commandInputClassName = cn(
2967
3123
  "flex h-11 w-full appearance-none border-0 bg-transparent py-3 text-sm text-foreground shadow-none outline-none",
2968
3124
  "placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
@@ -3393,6 +3549,7 @@ function PopoverContent({
3393
3549
  return /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(
3394
3550
  Popover$1.Positioner,
3395
3551
  {
3552
+ style: { zIndex: overlayZIndex.popover },
3396
3553
  "data-slot": "popover-positioner",
3397
3554
  sideOffset,
3398
3555
  align,
@@ -3407,7 +3564,7 @@ function PopoverContent({
3407
3564
  overlayPrimitiveClassNames.popoverSurface,
3408
3565
  className
3409
3566
  ),
3410
- style: { zIndex: overlayZIndex.popover, ...style },
3567
+ style,
3411
3568
  ...props,
3412
3569
  children: [
3413
3570
  children,
@@ -3483,7 +3640,11 @@ var comboboxSizeTokens = {
3483
3640
  var comboboxTriggerVariants = cva(
3484
3641
  [
3485
3642
  "flex w-full items-center justify-between gap-2 whitespace-nowrap",
3486
- "h-[var(--combobox-trigger-height)] rounded-[var(--radius-md)] border border-input bg-background px-[var(--combobox-trigger-padding-x)]",
3643
+ // --input-radius, not the generic md step: this trigger is a form control and
3644
+ // should round like Input and Select do. Reading the scale step meant it
3645
+ // tracked whatever a language did to medium surfaces instead of what it
3646
+ // decided for its fields.
3647
+ "h-[var(--combobox-trigger-height)] rounded-[var(--input-radius,var(--radius-md))] border border-input bg-background px-[var(--combobox-trigger-padding-x)]",
3487
3648
  "text-[length:var(--combobox-font-size)] ring-offset-background",
3488
3649
  "transition-colors duration-micro ease-out",
3489
3650
  "placeholder:text-muted-foreground",
@@ -3595,7 +3756,8 @@ function toCssLength(value) {
3595
3756
  function ComboboxRoot({
3596
3757
  options,
3597
3758
  value: controlledValue,
3598
- onChange,
3759
+ onChange: legacyOnChange,
3760
+ onValueChange: onChange = legacyOnChange,
3599
3761
  defaultValue = null,
3600
3762
  disabled = false,
3601
3763
  errored,
@@ -3793,6 +3955,7 @@ var ContextMenuContent = ({
3793
3955
  }) => /* @__PURE__ */ jsx(ContextMenu$1.Portal, { children: /* @__PURE__ */ jsx(
3794
3956
  ContextMenu$1.Positioner,
3795
3957
  {
3958
+ style: { zIndex: overlayZIndex.popover },
3796
3959
  alignOffset,
3797
3960
  align,
3798
3961
  sideOffset,
@@ -4002,20 +4165,65 @@ var ContextMenu = Object.assign(ContextMenuRoot, {
4002
4165
  SubTrigger: ContextMenuSubTrigger,
4003
4166
  SubContent: ContextMenuSubContent
4004
4167
  });
4005
- var DEFAULT_TOOLTIP_DELAY_MS = 150;
4168
+
4169
+ // src/tokens/components/interaction.ts
4170
+ var interaction = {
4171
+ /**
4172
+ * Tooltips. The first one waits so a sweeping pointer does not strobe;
4173
+ * once one is open, its neighbours open instantly if the pointer arrives
4174
+ * within the skip window. Radix Tooltip defaults: delayDuration 700,
4175
+ * skipDelayDuration 300. Vercel/Kowalski: "delay the first tooltip only".
4176
+ */
4177
+ tooltip: { delayMs: 700, skipWindowMs: 300 }};
4178
+ var DEFAULT_TOOLTIP_DELAY_MS = interaction.tooltip.delayMs;
4179
+ var SKIP_DELAY_WINDOW_MS = interaction.tooltip.skipWindowMs;
4180
+ var lastTooltipOpenAt = 0;
4181
+ var skipDelayListeners = /* @__PURE__ */ new Set();
4182
+ function markTooltipOpened() {
4183
+ lastTooltipOpenAt = Date.now();
4184
+ for (const listener of skipDelayListeners) listener();
4185
+ }
4186
+ function shouldSkipDelay() {
4187
+ return Date.now() - lastTooltipOpenAt < SKIP_DELAY_WINDOW_MS;
4188
+ }
4189
+ function useSkipDelay() {
4190
+ const [, tick] = React24.useReducer((count) => count + 1, 0);
4191
+ React24.useEffect(() => {
4192
+ skipDelayListeners.add(tick);
4193
+ return () => {
4194
+ skipDelayListeners.delete(tick);
4195
+ };
4196
+ }, []);
4197
+ return shouldSkipDelay();
4198
+ }
4199
+ var TooltipInstantContext = React24.createContext(false);
4006
4200
  var TooltipProvider = ({
4007
4201
  children,
4008
4202
  delayDuration = DEFAULT_TOOLTIP_DELAY_MS
4009
4203
  }) => {
4010
- return /* @__PURE__ */ jsx(Tooltip$1.Provider, { delay: delayDuration, children });
4204
+ const skipDelay = useSkipDelay();
4205
+ return /* @__PURE__ */ jsx(Tooltip$1.Provider, { delay: skipDelay ? 0 : delayDuration, children });
4011
4206
  };
4012
4207
  var Tooltip = ({
4013
4208
  delayDuration,
4014
4209
  children,
4210
+ onOpenChange,
4015
4211
  ...props
4016
4212
  }) => {
4017
- const delay = delayDuration ?? DEFAULT_TOOLTIP_DELAY_MS;
4018
- return /* @__PURE__ */ jsx(Tooltip$1.Provider, { delay, children: /* @__PURE__ */ jsx(Tooltip$1.Root, { ...props, children }) });
4213
+ const skipDelay = useSkipDelay();
4214
+ const instant = delayDuration == null && skipDelay;
4215
+ const delay = delayDuration ?? (instant ? 0 : DEFAULT_TOOLTIP_DELAY_MS);
4216
+ return /* @__PURE__ */ jsx(TooltipInstantContext.Provider, { value: instant, children: /* @__PURE__ */ jsx(Tooltip$1.Provider, { delay, children: /* @__PURE__ */ jsx(
4217
+ Tooltip$1.Root,
4218
+ {
4219
+ ...props,
4220
+ onOpenChange: (open, eventDetails) => {
4221
+ if (open) markTooltipOpened();
4222
+ onOpenChange?.(open, eventDetails);
4223
+ },
4224
+ children
4225
+ }
4226
+ ) }) });
4019
4227
  };
4020
4228
  var TooltipTrigger = ({
4021
4229
  asChild,
@@ -4045,25 +4253,29 @@ var TooltipContent = ({
4045
4253
  alignOffset = 0,
4046
4254
  ref,
4047
4255
  ...props
4048
- }) => /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsx(
4049
- Tooltip$1.Positioner,
4050
- {
4051
- side,
4052
- align,
4053
- sideOffset,
4054
- alignOffset,
4055
- style: { zIndex: overlayZIndex.tooltip },
4056
- children: /* @__PURE__ */ jsx(
4057
- Tooltip$1.Popup,
4058
- {
4059
- ref,
4060
- className: cn(overlayClassNames.tooltipSurface, className),
4061
- style: { zIndex: overlayZIndex.tooltip, ...style },
4062
- ...props
4063
- }
4064
- )
4065
- }
4066
- ) });
4256
+ }) => {
4257
+ const instant = React24.use(TooltipInstantContext);
4258
+ return /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsx(
4259
+ Tooltip$1.Positioner,
4260
+ {
4261
+ side,
4262
+ align,
4263
+ sideOffset,
4264
+ alignOffset,
4265
+ style: { zIndex: overlayZIndex.tooltip },
4266
+ children: /* @__PURE__ */ jsx(
4267
+ Tooltip$1.Popup,
4268
+ {
4269
+ ref,
4270
+ className: cn(overlayClassNames.tooltipSurface, className),
4271
+ "data-instant": instant || void 0,
4272
+ style: { zIndex: overlayZIndex.tooltip, ...style },
4273
+ ...props
4274
+ }
4275
+ )
4276
+ }
4277
+ ) });
4278
+ };
4067
4279
  TooltipContent.displayName = "TooltipContent";
4068
4280
  var COPIED_TINT = "text-[hsl(var(--success-strong))]";
4069
4281
  function CopiedAnnouncement({ copied, message }) {
@@ -4386,7 +4598,7 @@ var ContextCardTrigger = ({
4386
4598
  align,
4387
4599
  sideOffset,
4388
4600
  alignOffset,
4389
- className: "z-50",
4601
+ style: { zIndex: overlayZIndex.popover },
4390
4602
  children: /* @__PURE__ */ jsx(
4391
4603
  Popover$1.Popup,
4392
4604
  {
@@ -4408,7 +4620,7 @@ var ContextCardTrigger = ({
4408
4620
  "rounded-[var(--context-card-radius)] border border-border bg-popover",
4409
4621
  "px-[var(--context-card-padding-x)] py-[var(--context-card-padding-y)]",
4410
4622
  "text-[length:var(--context-card-body-size)] text-popover-foreground shadow-md outline-none",
4411
- "transition-[opacity,transform,display] duration-[var(--context-card-duration)] ease-[var(--context-card-easing)]",
4623
+ "transition-[opacity,transform] duration-[var(--context-card-duration)] ease-[var(--context-card-easing)]",
4412
4624
  "data-starting-style:opacity-0 data-ending-style:opacity-0 data-starting-style:scale-[0.98] data-ending-style:scale-[0.98]",
4413
4625
  "motion-reduce:transition-none motion-reduce:data-starting-style:scale-100 motion-reduce:data-ending-style:scale-100",
4414
4626
  "",
@@ -4655,6 +4867,70 @@ var emptyStateTokens = {
4655
4867
  descriptionLineHeight: primitiveSpacing[6]
4656
4868
  }
4657
4869
  };
4870
+ var SIZE_MAP = {
4871
+ sm: { box: "h-8 w-8", halo: "h-16 w-16 -inset-4", glyph: "h-3.5 w-3.5" },
4872
+ md: { box: "h-10 w-10", halo: "h-20 w-20 -inset-5", glyph: "h-4 w-4" },
4873
+ lg: { box: "h-14 w-14", halo: "h-28 w-28 -inset-7", glyph: "h-5 w-5" },
4874
+ xl: { box: "h-20 w-20", halo: "h-40 w-40 -inset-10", glyph: "h-7 w-7" }
4875
+ };
4876
+ function BrandMark({
4877
+ children,
4878
+ variant = "gradient",
4879
+ size = "md",
4880
+ className,
4881
+ halo = false,
4882
+ ariaHidden = true
4883
+ }) {
4884
+ const sizes = SIZE_MAP[size];
4885
+ return /* @__PURE__ */ jsxs(
4886
+ "span",
4887
+ {
4888
+ "aria-hidden": ariaHidden,
4889
+ className: cn("relative inline-flex shrink-0 items-center justify-center", className),
4890
+ children: [
4891
+ halo && /* @__PURE__ */ jsx(
4892
+ "span",
4893
+ {
4894
+ "aria-hidden": "true",
4895
+ className: cn(
4896
+ "pointer-events-none absolute rounded-full bg-brand-mark opacity-30 blur-2xl",
4897
+ sizes.halo
4898
+ )
4899
+ }
4900
+ ),
4901
+ /* @__PURE__ */ jsx(
4902
+ "span",
4903
+ {
4904
+ className: cn(
4905
+ "relative inline-flex items-center justify-center rounded-[var(--radius-2xl)]",
4906
+ sizes.box,
4907
+ variant === "gradient" && "bg-brand-mark text-brand-mark-foreground shadow-sm",
4908
+ variant === "soft" && "bg-brand-mark/10 text-brand-mark dark:bg-brand-mark/20",
4909
+ variant === "outline" && "border border-border bg-background text-foreground"
4910
+ ),
4911
+ children: children ?? /* @__PURE__ */ jsx(DefaultGlyph, { className: sizes.glyph })
4912
+ }
4913
+ )
4914
+ ]
4915
+ }
4916
+ );
4917
+ }
4918
+ function DefaultGlyph({ className }) {
4919
+ return /* @__PURE__ */ jsxs(
4920
+ "svg",
4921
+ {
4922
+ viewBox: "0 0 16 16",
4923
+ fill: "none",
4924
+ "aria-hidden": "true",
4925
+ className,
4926
+ xmlns: "http://www.w3.org/2000/svg",
4927
+ children: [
4928
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "3", fill: "currentColor" }),
4929
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "6.5", stroke: "currentColor", strokeOpacity: "0.35" })
4930
+ ]
4931
+ }
4932
+ );
4933
+ }
4658
4934
  var variantClassName = {
4659
4935
  "blank-slate": "border border-dashed border-border bg-background",
4660
4936
  informational: "border border-border bg-card",
@@ -4673,7 +4949,7 @@ var iconToneClassName = {
4673
4949
  "no-results": "text-muted-foreground",
4674
4950
  cleared: "text-muted-foreground",
4675
4951
  permission: "text-muted-foreground",
4676
- error: "text-destructive"
4952
+ error: "text-destructive-strong"
4677
4953
  };
4678
4954
  var emptyStateCssVars = (size) => ({
4679
4955
  "--empty-state-min-height": `${emptyStateTokens.root.minHeight[size]}px`,
@@ -4773,16 +5049,47 @@ var EmptyStateRoot = ({
4773
5049
  );
4774
5050
  };
4775
5051
  EmptyStateRoot.displayName = "EmptyState.Root";
4776
- var EmptyState = {
5052
+ var toneVariant = {
5053
+ default: "blank-slate",
5054
+ branded: "informational",
5055
+ subtle: "guide"
5056
+ };
5057
+ function EmptyStateSimple({
5058
+ title,
5059
+ description,
5060
+ mascot,
5061
+ icon,
5062
+ action,
5063
+ secondaryAction,
5064
+ tone = "default",
5065
+ size = "md",
5066
+ className
5067
+ }) {
5068
+ const visual = mascot ?? icon ?? (tone === "branded" ? /* @__PURE__ */ jsx(BrandMark, { size: size === "lg" ? "lg" : "md" }) : null);
5069
+ return /* @__PURE__ */ jsx(
5070
+ EmptyStateRoot,
5071
+ {
5072
+ action,
5073
+ className: cn(tone === "subtle" && "border-0 bg-transparent", className),
5074
+ description,
5075
+ icon: visual ? /* @__PURE__ */ jsx(EmptyStateIcon, { icon: visual }) : void 0,
5076
+ link: secondaryAction,
5077
+ size,
5078
+ title,
5079
+ variant: toneVariant[tone]
5080
+ }
5081
+ );
5082
+ }
5083
+ var EmptyState = Object.assign(EmptyStateSimple, {
4777
5084
  Root: EmptyStateRoot,
4778
5085
  Icon: EmptyStateIcon
4779
- };
5086
+ });
4780
5087
  var textSize = {
4781
5088
  small: "text-xs",
4782
5089
  medium: "text-sm",
4783
5090
  large: "text-base"
4784
5091
  };
4785
- var iconSize = {
5092
+ var iconSize2 = {
4786
5093
  small: 12,
4787
5094
  medium: 14,
4788
5095
  large: 16
@@ -4818,9 +5125,13 @@ var ErrorMessage = ({
4818
5125
  {
4819
5126
  ref,
4820
5127
  role: "alert",
4821
- className: cn("inline-flex items-center gap-1.5 text-destructive", textSize[sz], className),
5128
+ className: cn(
5129
+ "inline-flex items-center gap-1.5 text-destructive-strong",
5130
+ textSize[sz],
5131
+ className
5132
+ ),
4822
5133
  children: [
4823
- /* @__PURE__ */ jsx(Warning, { size: iconSize[sz], "aria-hidden": "true", className: "shrink-0" }),
5134
+ /* @__PURE__ */ jsx(Warning, { size: iconSize2[sz], "aria-hidden": "true", className: "shrink-0" }),
4824
5135
  /* @__PURE__ */ jsxs("span", { children: [
4825
5136
  label && /* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
4826
5137
  label,
@@ -4892,12 +5203,12 @@ var ErrorSurface = ({
4892
5203
  "span",
4893
5204
  {
4894
5205
  "aria-hidden": "true",
4895
- className: "mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-[var(--radius-sm)] border border-destructive/20 bg-background text-destructive",
5206
+ className: "mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-[var(--radius-sm)] border border-destructive/20 bg-background text-destructive-strong",
4896
5207
  children: /* @__PURE__ */ jsx(Warning, { size: surfaceIconSize[size] })
4897
5208
  }
4898
5209
  ),
4899
5210
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
4900
- label && showLabel ? /* @__PURE__ */ jsx("p", { className: "mb-1 text-xs font-medium uppercase tracking-normal text-destructive", children: label }) : null,
5211
+ label && showLabel ? /* @__PURE__ */ jsx("p", { className: "mb-1 text-xs font-medium uppercase tracking-normal text-destructive-strong", children: label }) : null,
4901
5212
  resolvedTitle ? /* @__PURE__ */ jsx("p", { className: "font-semibold leading-6 text-foreground", children: resolvedTitle }) : null,
4902
5213
  message ? /* @__PURE__ */ jsx("p", { className: cn("leading-5 text-muted-foreground", resolvedTitle && "mt-1"), children: message }) : null,
4903
5214
  resolvedErrorId ? /* @__PURE__ */ jsxs("details", { className: "mt-3 text-xs text-muted-foreground", children: [
@@ -4946,10 +5257,10 @@ var Field = ({
4946
5257
  ...props
4947
5258
  }) => {
4948
5259
  return /* @__PURE__ */ jsxs("div", { ref, className: cn("grid gap-2", className), ...props, children: [
4949
- /* @__PURE__ */ jsx(Label, { htmlFor, className: cn(error && "text-destructive"), children: label }),
5260
+ /* @__PURE__ */ jsx(Label, { htmlFor, className: cn(error && "text-destructive-strong"), children: label }),
4950
5261
  children,
4951
5262
  description && !error && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: description }),
4952
- error && /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-destructive", children: error })
5263
+ error && /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-destructive-strong", children: error })
4953
5264
  ] });
4954
5265
  };
4955
5266
  Field.displayName = "Field";
@@ -4998,7 +5309,7 @@ var FormLabel = ({
4998
5309
  Label,
4999
5310
  {
5000
5311
  ref,
5001
- className: cn(error && "text-destructive", className),
5312
+ className: cn(error && "text-destructive-strong", className),
5002
5313
  htmlFor: formItemId,
5003
5314
  ...props
5004
5315
  }
@@ -5055,7 +5366,7 @@ var FormMessage = ({
5055
5366
  {
5056
5367
  ref,
5057
5368
  id: formMessageId,
5058
- className: cn("text-sm font-medium text-destructive", className),
5369
+ className: cn("text-sm font-medium text-destructive-strong", className),
5059
5370
  ...props,
5060
5371
  children: body
5061
5372
  }
@@ -5284,20 +5595,29 @@ var HoverCardContent = ({
5284
5595
  style,
5285
5596
  ref,
5286
5597
  ...props
5287
- }) => /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(Popover$1.Positioner, { side, align, sideOffset, children: /* @__PURE__ */ jsx(
5288
- Popover$1.Popup,
5598
+ }) => /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(
5599
+ Popover$1.Positioner,
5289
5600
  {
5290
- ref,
5291
- className: cn(
5292
- overlayClassNames.popoverSurface,
5293
- overlayPrimitiveClassNames.popoverSurface,
5294
- "w-64",
5295
- className
5296
- ),
5297
- style: { zIndex: overlayZIndex.popover, ...style },
5298
- ...props
5601
+ style: { zIndex: overlayZIndex.popover },
5602
+ side,
5603
+ align,
5604
+ sideOffset,
5605
+ children: /* @__PURE__ */ jsx(
5606
+ Popover$1.Popup,
5607
+ {
5608
+ ref,
5609
+ className: cn(
5610
+ overlayClassNames.popoverSurface,
5611
+ overlayPrimitiveClassNames.popoverSurface,
5612
+ "w-64",
5613
+ className
5614
+ ),
5615
+ style: { zIndex: overlayZIndex.popover, ...style },
5616
+ ...props
5617
+ }
5618
+ )
5299
5619
  }
5300
- ) }) });
5620
+ ) });
5301
5621
  HoverCardContent.displayName = "HoverCardContent";
5302
5622
  var HoverCardTrigger = ({
5303
5623
  asChild,
@@ -5401,18 +5721,6 @@ var inputTokens = {
5401
5721
  },
5402
5722
  focusRingWidth: 3,
5403
5723
  fieldGap: primitiveSpacing[2] - primitiveSpacing[1] / 2};
5404
-
5405
- // src/primitives/form-control.ts
5406
- var formControlFocusClassNames = {
5407
- input: "outline-none focus:border-ring focus:ring-[length:var(--input-focus-ring-width)] focus:ring-ring/30",
5408
- textarea: "outline-none focus:border-ring focus:ring-[length:var(--textarea-focus-ring-width)] focus:ring-ring/30",
5409
- select: "outline-none focus:border-ring focus:ring-[length:var(--select-focus-ring-width)] focus:ring-ring/30"
5410
- };
5411
- var formControlInvalidClassNames = {
5412
- input: "aria-invalid:border-destructive/60 aria-invalid:focus:border-destructive aria-invalid:focus:ring-destructive/20",
5413
- textarea: "aria-invalid:border-destructive/60 aria-invalid:focus:border-destructive aria-invalid:focus:ring-destructive/20",
5414
- select: "aria-invalid:border-destructive/60 aria-invalid:focus:border-destructive aria-invalid:focus:ring-destructive/20"
5415
- };
5416
5724
  var inputVariants = cva(
5417
5725
  [
5418
5726
  "flex h-[var(--input-height)] w-full rounded-[var(--input-radius)]",
@@ -5459,7 +5767,7 @@ var inputVariants = cva(
5459
5767
  * the ring surrounds the whole group rather than a box inside it.
5460
5768
  */
5461
5769
  tone: {
5462
- bordered: `border border-input bg-background shadow-xs ${formControlFocusClassNames.input}`,
5770
+ bordered: `border border-input bg-background ${formControlFocusClassNames.input}`,
5463
5771
  bare: "border-0 bg-transparent shadow-none"
5464
5772
  }
5465
5773
  },
@@ -5488,7 +5796,7 @@ var inputControlButtonVariants = cva(
5488
5796
  [
5489
5797
  "absolute right-[var(--input-control-inset)] top-1/2 flex size-[var(--input-control-size)] -translate-y-1/2 items-center justify-center",
5490
5798
  "rounded-[var(--radius-sm)] text-muted-foreground transition-colors duration-micro ease-out",
5491
- "hover:bg-accent hover:text-foreground",
5799
+ "hover:bg-accent hover:text-accent-foreground",
5492
5800
  "focus-visible:outline-none",
5493
5801
  "disabled:pointer-events-none disabled:opacity-50",
5494
5802
  "[&_svg]:size-[var(--input-control-icon-size)]"
@@ -5498,7 +5806,7 @@ var fieldMessageVariants = cva("text-xs", {
5498
5806
  variants: {
5499
5807
  tone: {
5500
5808
  description: "text-muted-foreground",
5501
- error: "font-medium text-destructive"
5809
+ error: "font-medium text-destructive-strong"
5502
5810
  }
5503
5811
  }
5504
5812
  });
@@ -5565,6 +5873,7 @@ var Input = ({
5565
5873
  revealable,
5566
5874
  revealLabel = "Show password",
5567
5875
  hideLabel = "Hide password",
5876
+ clearLabel = "Clear input",
5568
5877
  clearOnEscape,
5569
5878
  wrapperClassName,
5570
5879
  fieldClassName,
@@ -5715,7 +6024,7 @@ var Input = ({
5715
6024
  "button",
5716
6025
  {
5717
6026
  type: "button",
5718
- "aria-label": "Clear input",
6027
+ "aria-label": clearLabel,
5719
6028
  disabled,
5720
6029
  className: inputControlButtonVariants(),
5721
6030
  style: getInputStyle(size, void 0),
@@ -5787,8 +6096,11 @@ var InputOTP = ({
5787
6096
  children,
5788
6097
  render,
5789
6098
  ref,
5790
- ...props
6099
+ onValueChange,
6100
+ onChange: legacyOnChange,
6101
+ ...rest
5791
6102
  }) => {
6103
+ const props = { ...rest, onChange: onValueChange ?? legacyOnChange };
5792
6104
  const otpProps = render ? { render, ...props } : { children, ...props };
5793
6105
  return /* @__PURE__ */ jsx(
5794
6106
  OTPInput,
@@ -6090,7 +6402,7 @@ var MenuItem = function MenuItem2({
6090
6402
  /* @__PURE__ */ jsx("span", { className: "flex-1 truncate", children }),
6091
6403
  suffix && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "inline-flex shrink-0 [&_svg]:size-4", children: suffix })
6092
6404
  ] });
6093
- const errorClass = type === "error" ? "text-destructive data-[highlighted]:bg-destructive/10 data-[highlighted]:text-destructive" : "";
6405
+ const errorClass = type === "error" ? "text-destructive-strong data-[highlighted]:bg-destructive/10 data-[highlighted]:text-destructive-strong" : "";
6094
6406
  const passthrough = {};
6095
6407
  if (onClick !== void 0) passthrough.onClick = onClick;
6096
6408
  if (disabled !== void 0) passthrough.disabled = disabled;
@@ -6901,6 +7213,7 @@ var MultiSelectContent = ({
6901
7213
  alignOffset = 0,
6902
7214
  width = "md",
6903
7215
  onKeyDown,
7216
+ "aria-label": ariaLabel = "Multi select options",
6904
7217
  ref,
6905
7218
  ...props
6906
7219
  }) => {
@@ -6916,7 +7229,7 @@ var MultiSelectContent = ({
6916
7229
  {
6917
7230
  align,
6918
7231
  alignOffset,
6919
- className: "z-50",
7232
+ style: { zIndex: overlayZIndex.popover },
6920
7233
  side,
6921
7234
  sideOffset,
6922
7235
  children: /* @__PURE__ */ jsx(
@@ -6924,11 +7237,11 @@ var MultiSelectContent = ({
6924
7237
  {
6925
7238
  ref: composeRefs2(contentRef, ref),
6926
7239
  role: "dialog",
6927
- "aria-label": "Multi select options",
7240
+ "aria-label": ariaLabel,
6928
7241
  className: cn(
6929
7242
  "z-50 max-h-[var(--multi-select-content-max-height)] w-[var(--multi-select-width)] overflow-y-auto",
6930
7243
  "rounded-[var(--multi-select-content-radius)] border border-border bg-popover p-[var(--multi-select-content-padding)] text-popover-foreground shadow-md outline-none",
6931
- "transition-[opacity,transform,display] duration-[var(--multi-select-popover-duration)] ease-[var(--multi-select-easing)]",
7244
+ "transition-[opacity,transform] duration-[var(--multi-select-popover-duration)] ease-[var(--multi-select-easing)]",
6932
7245
  "data-starting-style:translate-y-1 data-starting-style:opacity-0 data-ending-style:translate-y-1 data-ending-style:opacity-0",
6933
7246
  "motion-reduce:transition-none motion-reduce:data-starting-style:translate-y-0 motion-reduce:data-ending-style:translate-y-0",
6934
7247
  className
@@ -8355,16 +8668,16 @@ var Progress = function Progress2({
8355
8668
  };
8356
8669
  var variantMap = {
8357
8670
  success: {
8358
- container: "border-success/40 bg-success/10 text-success fill-success",
8359
- cta: "text-success decoration-success/50 hover:text-success hover:decoration-success"
8671
+ container: "border-success/40 bg-success/10 text-success-strong fill-success-strong",
8672
+ cta: "text-success-strong decoration-success/50 hover:text-success-strong hover:decoration-success"
8360
8673
  },
8361
8674
  warning: {
8362
- container: "border-warning/40 bg-warning/10 text-warning fill-warning",
8363
- cta: "text-warning decoration-warning/50 hover:text-warning hover:decoration-warning"
8675
+ container: "border-warning/40 bg-warning/10 text-warning-strong fill-warning-strong",
8676
+ cta: "text-warning-strong decoration-warning/50 hover:text-warning-strong hover:decoration-warning"
8364
8677
  },
8365
8678
  error: {
8366
- container: "border-destructive/40 bg-destructive/10 text-destructive fill-destructive",
8367
- cta: "text-destructive decoration-destructive/50 hover:text-destructive hover:decoration-destructive"
8679
+ container: "border-destructive/40 bg-destructive/10 text-destructive-strong fill-destructive-strong",
8680
+ cta: "text-destructive-strong decoration-destructive/50 hover:text-destructive-strong hover:decoration-destructive"
8368
8681
  },
8369
8682
  info: {
8370
8683
  container: "border-border bg-muted text-foreground fill-foreground",
@@ -8426,13 +8739,15 @@ var itemStyle = {
8426
8739
  "--radio-motion-easing": radioTokens.motion.easing
8427
8740
  };
8428
8741
  var radioControlClassName = cn(
8429
- "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",
8742
+ "relative inline-flex shrink-0 items-center justify-center rounded-[var(--radius-full)] border-[length:var(--radio-border-width)] border-[var(--control-border)] bg-background text-foreground",
8430
8743
  "size-[var(--radio-control-size)]",
8431
8744
  "transition-[background-color,border-color,box-shadow] duration-[var(--radio-motion-duration)] ease-[var(--radio-motion-easing)]",
8432
- "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-['']",
8433
- "peer-checked:border-[var(--neutral-12)] peer-checked:after:scale-100 peer-checked:after:opacity-100",
8434
- "peer-focus-visible:outline-none",
8435
- "peer-disabled:border-[var(--neutral-5)] peer-disabled:bg-muted peer-disabled:text-[var(--neutral-8)]"
8745
+ "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-['']",
8746
+ // "On" is the action colour, as for checkbox / toggle / slider / choicebox —
8747
+ // it was --neutral-12, which only matched the House ink by coincidence.
8748
+ "peer-checked:border-primary peer-checked:text-primary peer-checked:after:scale-100 peer-checked:after:opacity-100",
8749
+ controlFocusProxyClassName,
8750
+ "peer-disabled:border-neutral-5 peer-disabled:bg-muted peer-disabled:text-neutral-8"
8436
8751
  );
8437
8752
  function useRadioGroupContext() {
8438
8753
  return use(RadioGroupContext);
@@ -9091,7 +9406,7 @@ function NativeSelect({
9091
9406
  style: { borderRadius: "var(--select-radius)" },
9092
9407
  className: cn(
9093
9408
  "h-[var(--select-height)] w-full appearance-none rounded-[var(--select-radius)] border font-sans",
9094
- "bg-background text-[length:var(--select-font-size)] text-foreground shadow-xs outline-none",
9409
+ "bg-background text-[length:var(--select-font-size)] text-foreground outline-none",
9095
9410
  "transition-[background-color,border-color,box-shadow,color] duration-[var(--select-duration)] ease-[var(--select-easing)]",
9096
9411
  formControlFocusClassNames.select,
9097
9412
  "disabled:cursor-not-allowed disabled:bg-muted disabled:text-muted-foreground",
@@ -9275,7 +9590,7 @@ var SelectTrigger = ({
9275
9590
  ref,
9276
9591
  className: cn(
9277
9592
  "flex h-[var(--select-height)] w-full items-center justify-between whitespace-nowrap rounded-[var(--select-radius)] border border-input bg-background",
9278
- "px-[var(--select-padding-x)] text-[length:var(--select-font-size)] text-foreground shadow-xs",
9593
+ "px-[var(--select-padding-x)] text-[length:var(--select-font-size)] text-foreground",
9279
9594
  "transition-[background-color,border-color,box-shadow,color] duration-micro ease-out placeholder:text-muted-foreground",
9280
9595
  formControlFocusClassNames.select,
9281
9596
  "disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
@@ -9309,6 +9624,7 @@ var SelectContent = ({
9309
9624
  }) => /* @__PURE__ */ jsx(Select$1.Portal, { children: /* @__PURE__ */ jsx(
9310
9625
  Select$1.Positioner,
9311
9626
  {
9627
+ style: { zIndex: overlayZIndex.popover },
9312
9628
  alignItemWithTrigger: position === "item-aligned",
9313
9629
  sideOffset: selectTokens.content.sideOffset,
9314
9630
  children: /* @__PURE__ */ jsx(
@@ -9512,6 +9828,7 @@ var SheetContent = ({
9512
9828
  noOverlay = false,
9513
9829
  showClose,
9514
9830
  close,
9831
+ closeLabel = "Close",
9515
9832
  style,
9516
9833
  ref,
9517
9834
  ...props
@@ -9533,7 +9850,7 @@ var SheetContent = ({
9533
9850
  shouldRenderClose ? /* @__PURE__ */ jsxs(
9534
9851
  SheetClose,
9535
9852
  {
9536
- "aria-label": "Close",
9853
+ "aria-label": closeLabel,
9537
9854
  className: cn(
9538
9855
  "absolute right-[var(--sheet-close-offset)] top-[var(--sheet-close-offset)] inline-flex size-[var(--sheet-close-size)] items-center justify-center rounded-[var(--sheet-close-radius)] text-muted-foreground",
9539
9856
  "transition-[background-color,color,box-shadow] duration-[var(--motion-duration-micro)] ease-[var(--ease-out)] hover:bg-muted hover:text-foreground",
@@ -9542,7 +9859,7 @@ var SheetContent = ({
9542
9859
  ),
9543
9860
  children: [
9544
9861
  /* @__PURE__ */ jsx(Cross, { "aria-hidden": "true", className: "size-[var(--sheet-close-icon-size)]" }),
9545
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
9862
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: closeLabel })
9546
9863
  ]
9547
9864
  }
9548
9865
  ) : null
@@ -9699,13 +10016,7 @@ var ShowMore = ({
9699
10016
  style: cssVars,
9700
10017
  ...props,
9701
10018
  children: [
9702
- !noBorder && /* @__PURE__ */ jsx(
9703
- "div",
9704
- {
9705
- "aria-hidden": "true",
9706
- className: cn("h-px flex-1 bg-[var(--neutral-7)]", dividerClassName)
9707
- }
9708
- ),
10019
+ !noBorder && /* @__PURE__ */ jsx("div", { "aria-hidden": "true", className: cn("h-px flex-1 bg-neutral-7", dividerClassName) }),
9709
10020
  /* @__PURE__ */ jsx("div", { className: "shrink-0 bg-background px-[var(--show-more-gap)]", children: /* @__PURE__ */ jsxs(
9710
10021
  "button",
9711
10022
  {
@@ -9739,13 +10050,7 @@ var ShowMore = ({
9739
10050
  ]
9740
10051
  }
9741
10052
  ) }),
9742
- !noBorder && /* @__PURE__ */ jsx(
9743
- "div",
9744
- {
9745
- "aria-hidden": "true",
9746
- className: cn("h-px flex-1 bg-[var(--neutral-7)]", dividerClassName)
9747
- }
9748
- )
10053
+ !noBorder && /* @__PURE__ */ jsx("div", { "aria-hidden": "true", className: cn("h-px flex-1 bg-neutral-7", dividerClassName) })
9749
10054
  ]
9750
10055
  }
9751
10056
  );
@@ -10520,6 +10825,7 @@ var SwitchControl = function SwitchControl2({
10520
10825
  "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)]",
10521
10826
  "text-muted-foreground transition-[background-color,box-shadow,color] duration-[var(--switch-duration)] ease-[var(--switch-easing)]",
10522
10827
  "peer-checked:bg-background peer-checked:text-foreground peer-checked:shadow-sm",
10828
+ controlFocusProxyClassName,
10523
10829
  "",
10524
10830
  "peer-disabled:pointer-events-none peer-disabled:text-muted-foreground/60",
10525
10831
  "[&_svg]:size-[var(--switch-icon-size)]"
@@ -11030,7 +11336,7 @@ function TabsContent({ className, forceMount, keepMounted, variant, ...props })
11030
11336
  );
11031
11337
  }
11032
11338
  var fieldMessageClassName = "text-xs text-muted-foreground";
11033
- var fieldErrorClassName = "text-xs font-medium text-destructive";
11339
+ var fieldErrorClassName = "text-xs font-medium text-destructive-strong";
11034
11340
  function getTextareaStyle(size, style) {
11035
11341
  const token = textareaTokens.sizes[size];
11036
11342
  return {
@@ -11065,6 +11371,7 @@ var Textarea = ({
11065
11371
  description,
11066
11372
  error,
11067
11373
  fieldClassName,
11374
+ tone = "bordered",
11068
11375
  id,
11069
11376
  onChange,
11070
11377
  onValueChange,
@@ -11090,10 +11397,10 @@ var Textarea = ({
11090
11397
  "textarea",
11091
11398
  {
11092
11399
  className: cn(
11093
- "flex min-h-[var(--textarea-min-height)] w-full resize-y rounded-[var(--textarea-radius)] border border-input bg-background",
11094
- "px-[var(--textarea-padding-x)] py-[var(--textarea-padding-y)] text-[length:var(--textarea-font-size)] text-foreground shadow-xs",
11400
+ "flex min-h-[var(--textarea-min-height)] w-full resize-y rounded-[var(--textarea-radius)]",
11401
+ "px-[var(--textarea-padding-x)] py-[var(--textarea-padding-y)] text-[length:var(--textarea-font-size)] text-foreground",
11095
11402
  "transition-[background-color,border-color,box-shadow,color] duration-micro ease-out placeholder:text-muted-foreground",
11096
- formControlFocusClassNames.textarea,
11403
+ tone === "bordered" ? `border border-input bg-background ${formControlFocusClassNames.textarea}` : "border-0 bg-transparent shadow-none",
11097
11404
  "disabled:cursor-not-allowed disabled:opacity-50 read-only:cursor-default read-only:bg-muted/70",
11098
11405
  formControlInvalidClassNames.textarea,
11099
11406
  className
@@ -11164,7 +11471,8 @@ function isThemeSwitcherValue(value) {
11164
11471
  var ThemeSwitcher = ({
11165
11472
  value,
11166
11473
  defaultValue = "system",
11167
- onChange,
11474
+ onChange: legacyOnChange,
11475
+ onValueChange: onChange = legacyOnChange,
11168
11476
  disabled = false,
11169
11477
  size = "medium",
11170
11478
  name,
@@ -11312,7 +11620,8 @@ function playToggleSound(lastPlayedAt) {
11312
11620
  var ThemeToggle = ({
11313
11621
  value,
11314
11622
  defaultValue,
11315
- onChange,
11623
+ onChange: legacyOnChange,
11624
+ onValueChange: onChange = legacyOnChange,
11316
11625
  size = "md",
11317
11626
  sound = false,
11318
11627
  applyToDocument = false,
@@ -11724,6 +12033,7 @@ var Toggle = ({
11724
12033
  "aria-hidden": "true",
11725
12034
  className: cn(
11726
12035
  "relative inline-flex h-[var(--toggle-track-height)] w-[var(--toggle-track-width)] items-center rounded-[var(--toggle-radius)] border bg-[var(--toggle-track-off)] p-px",
12036
+ controlFocusProxyClassName,
11727
12037
  "border-[var(--toggle-track-border)] transition-[background-color,border-color] duration-[var(--toggle-duration)] ease-[var(--toggle-easing)]",
11728
12038
  "peer-checked:bg-[var(--toggle-track-on)]",
11729
12039
  "peer-checked:[&>span]:translate-x-[var(--toggle-thumb-translate)] peer-checked:[&>span]:text-[var(--toggle-icon-on)]",
@@ -12264,6 +12574,6 @@ var TreeIcon = ({ icon, hasChildren = false, className, ...props }) => {
12264
12574
  };
12265
12575
  var TreeLabel = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { className: cn("font flex-1 truncate text-sm", className), ...props });
12266
12576
 
12267
- 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 };
12577
+ 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, CardBody, CardContent, CardDescription, CardFooter, CardHeader, CardIcon, CardRoot, 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, cardVariants, containerWidths, flexLayouts, gridLayouts, labelVariants, navigationMenuTriggerStyle, progressIndicatorVariants, progressVariants, tabsContentVariants, tabsListVariants, tabsTriggerVariants, toggleGroupItemVariants, toggleGroupVariants, useCopyToClipboard, useFormField, useToasts, zIndex };
12268
12578
  //# sourceMappingURL=canonical.js.map
12269
12579
  //# sourceMappingURL=canonical.js.map