@assure-one/design-system 1.30.0 → 1.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import * as React39 from 'react';
3
3
  import { forwardRef, useId, useRef, useState, useEffect, useCallback, useImperativeHandle, useMemo, createContext, Fragment as Fragment$1, useContext } from 'react';
4
4
  import * as AccordionPrimitive from '@radix-ui/react-accordion';
5
5
  import { clsx } from 'clsx';
6
- import { twMerge } from 'tailwind-merge';
6
+ import { extendTailwindMerge } from 'tailwind-merge';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
8
  import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
9
9
  import { cva } from 'class-variance-authority';
@@ -11,13 +11,13 @@ import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio';
11
11
  import { Slot } from '@radix-ui/react-slot';
12
12
  import * as AvatarPrimitive from '@radix-ui/react-avatar';
13
13
  import { DayPicker } from 'react-day-picker';
14
- import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
14
+ import { parse, isValid, format, startOfMonth, startOfYear, subYears, endOfMonth, endOfYear, addYears } from 'date-fns';
15
15
  import * as SelectPrimitive from '@radix-ui/react-select';
16
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
16
17
  import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';
17
18
  import { Command } from 'cmdk';
18
19
  import * as DialogPrimitive from '@radix-ui/react-dialog';
19
20
  import * as ContextMenuPrimitive from '@radix-ui/react-context-menu';
20
- import { parse, isValid, format } from 'date-fns';
21
21
  import * as PopoverPrimitive from '@radix-ui/react-popover';
22
22
  import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
23
23
  import * as HoverCardPrimitive from '@radix-ui/react-hover-card';
@@ -42,52 +42,52 @@ import * as VisuallyHiddenPrimitive from '@radix-ui/react-visually-hidden';
42
42
  // src/tokens/reference.ts
43
43
  var colors = {
44
44
  /* Surfaces */
45
- bg: "#FDFDFC",
46
- bg2: "#F7F7F5",
47
- bg3: "#F0F0ED",
48
- surface: "#FFFFFF",
49
- surface2: "#FAFAF8",
45
+ bg: "#ffffff",
46
+ bg2: "#f1f3f8",
47
+ bg3: "#e7eaf1",
48
+ surface: "#ffffff",
49
+ surface2: "#f7f8fc",
50
50
  /* Foreground */
51
- fg: "#0A0A0A",
52
- fg2: "#38383B",
53
- fg3: "#6B6B70",
54
- fg4: "#9A9AA0",
55
- fg5: "#C4C4C8",
51
+ fg: "#0a0a0a",
52
+ fg2: "#38383b",
53
+ fg3: "#5f5f64",
54
+ fg4: "#6b6b70",
55
+ fg5: "#9a9aa0",
56
56
  /* Rules */
57
- rule: "#EAEAE6",
58
- ruleSoft: "#F0F0EC",
59
- ruleStrong: "#DADAD4",
57
+ rule: "#e4e7ef",
58
+ ruleSoft: "#eef0f5",
59
+ ruleStrong: "#d3d8e3",
60
60
  /* Accent (cyan) */
61
- accent: "#0066FF",
62
- accent2: "#0052CC",
63
- accentTint: "#E8F0FF",
64
- accentHover: "#005BE6",
65
- accentActive: "#004FCC",
61
+ accent: "#6c42f8",
62
+ accent2: "#5127e8",
63
+ accentTint: "#efeaff",
64
+ accentHover: "#5e35f2",
65
+ accentActive: "#5127e8",
66
66
  /* Pro (purple) */
67
- proBg: "#F4F1FF",
68
- proBgHover: "#EEE9FF",
69
- proBgActive: "#E4DDFF",
70
- proFg: "#6C42F8",
71
- proHover: "#5E35F2",
72
- proActive: "#5127E8",
73
- proDisabled: "#B7A7F3",
74
- proLine: "#7B5BD8",
67
+ proBg: "#f4f1ff",
68
+ proBgHover: "#eee9ff",
69
+ proBgActive: "#e4ddff",
70
+ proFg: "#6c42f8",
71
+ proHover: "#5e35f2",
72
+ proActive: "#5127e8",
73
+ proDisabled: "#b7a7f3",
74
+ proLine: "#7b5bd8",
75
75
  /* Disabled */
76
- fgDisabled: "#A7A7AC",
77
- bgDisabled: "#F3F3F1",
76
+ fgDisabled: "#a7a7ac",
77
+ bgDisabled: "#f3f3f1",
78
78
  /* Status */
79
- successFg: "#1F7A3D",
80
- successBg: "#EAF6EE",
81
- successLine: "#C5E5CF",
82
- warningFg: "#B45F0A",
83
- warningBg: "#FFF3E5",
84
- warningLine: "#F5D5A8",
85
- dangerFg: "#C43838",
86
- dangerBg: "#FBEAEA",
87
- dangerLine: "#ECC5C5",
79
+ successFg: "#1f7a3d",
80
+ successBg: "#eaf6ee",
81
+ successLine: "#c5e5cf",
82
+ warningFg: "#8a4606",
83
+ warningBg: "#fff3e5",
84
+ warningLine: "#f5d5a8",
85
+ dangerFg: "#c43838",
86
+ dangerBg: "#fbeaea",
87
+ dangerLine: "#ecc5c5",
88
88
  /* On-brand */
89
- fgOnAccent: "#FFFFFF",
90
- fgOnPro: "#FFFFFF"
89
+ fgOnAccent: "#ffffff",
90
+ fgOnPro: "#ffffff"
91
91
  };
92
92
  var typography = {
93
93
  family: {
@@ -113,17 +113,17 @@ var radii = {
113
113
  full: "9999px"
114
114
  };
115
115
  var shadows = {
116
- quiet: "0 1px 2px rgba(10,10,10,0.03)",
117
- card: "0 12px 28px -16px rgba(10,10,10,0.18), 0 1px 2px rgba(10,10,10,0.04)",
118
- pop: "0 30px 80px -30px rgba(10,10,10,0.18), 0 8px 24px -8px rgba(10,10,10,0.06)",
119
- focusRing: "0 0 0 2px rgba(0, 102, 255, 0.18)"
116
+ quiet: "0 1px 2px rgba(10, 10, 10, 0.03)",
117
+ card: "0 12px 28px -16px rgba(10, 10, 10, 0.18), 0 1px 2px rgba(10, 10, 10, 0.04)",
118
+ pop: "0 30px 80px -30px rgba(10, 10, 10, 0.18), 0 8px 24px -8px rgba(10, 10, 10, 0.06)",
119
+ focusRing: "0 0 0 2px rgba(108, 66, 248, 0.18)"
120
120
  };
121
121
  var overlays = {
122
122
  hover: "rgba(10, 10, 10, 0.03)",
123
123
  active: "rgba(10, 10, 10, 0.05)"
124
124
  };
125
125
  var layout = {
126
- shellSidebarWidth: "256px",
126
+ shellSidebarWidth: "200px",
127
127
  shellHeaderHeight: "56px",
128
128
  contentPad: "32px"
129
129
  };
@@ -144,10 +144,10 @@ var spacing = {
144
144
  180: "180px"
145
145
  };
146
146
  var surfaces = {
147
- bg: "#FDFDFC",
148
- bg2: "#F7F7F5",
149
- surface: "#FFFFFF",
150
- surface2: "#FAFAF8"
147
+ bg: "#ffffff",
148
+ bg2: "#f1f3f8",
149
+ surface: "#ffffff",
150
+ surface2: "#f7f8fc"
151
151
  };
152
152
  var motion = {
153
153
  ease: {
@@ -201,6 +201,11 @@ var systemTokens = {
201
201
  accentHover: "var(--color-accent-hover)",
202
202
  accentActive: "var(--color-accent-active)",
203
203
  accentRing: "var(--color-accent-ring)",
204
+ /* Stable cross-product CTA; deliberately independent of [data-brand]. */
205
+ suiteAction: "var(--color-suite-action)",
206
+ suiteActionHover: "var(--color-suite-action-hover)",
207
+ suiteActionActive: "var(--color-suite-action-active)",
208
+ fgOnSuiteAction: "var(--color-fg-on-suite-action)",
204
209
  /* Brand — ambient product family; follows the active [data-brand] scope,
205
210
  defaulting to Pro. Prefer these (and the generated bg-brand / text-brand
206
211
  / border-brand-line / text-fg-on-brand utilities) for scope-aware chrome
@@ -349,6 +354,20 @@ var systemTokens = {
349
354
  fast: "var(--duration-fast)",
350
355
  normal: "var(--duration-normal)",
351
356
  slow: "var(--duration-slow)"
357
+ },
358
+ semantic: {
359
+ duration: {
360
+ press: "var(--motion-duration-press)",
361
+ feedback: "var(--motion-duration-feedback)",
362
+ overlay: "var(--motion-duration-overlay)",
363
+ spatial: "var(--motion-duration-spatial)",
364
+ deliberate: "var(--motion-duration-deliberate)"
365
+ },
366
+ ease: {
367
+ enter: "var(--motion-ease-enter)",
368
+ exit: "var(--motion-ease-exit)",
369
+ move: "var(--motion-ease-move)"
370
+ }
352
371
  }
353
372
  },
354
373
  layout: {
@@ -367,6 +386,29 @@ var systemTokens = {
367
386
  tooltip: "var(--z-tooltip)"
368
387
  }
369
388
  };
389
+ var split = (values) => values.split(" ");
390
+ var DS_RADIUS = split("badges btn buttons card cards general icon input inputs pill");
391
+ var DS_SHADOW = split("card focus focus-ring pop quiet subtle");
392
+ var DS_EASE = split("out-quart");
393
+ var DS_FONT = split("body display");
394
+ var DS_ANIMATE = split("accordion-down accordion-up collapsible-down collapsible-up pulse-soft");
395
+ var isDsShadowVar = (value) => /^\[var\(--shadow-[a-z0-9-]*\)\]$/.test(value);
396
+ var dsMergeConfig = {
397
+ extend: {
398
+ theme: {
399
+ radius: DS_RADIUS,
400
+ shadow: DS_SHADOW,
401
+ ease: DS_EASE,
402
+ font: DS_FONT,
403
+ animate: DS_ANIMATE
404
+ },
405
+ classGroups: {
406
+ shadow: [{ shadow: [isDsShadowVar] }]
407
+ }
408
+ }
409
+ };
410
+ var extendMerge = extendTailwindMerge;
411
+ var twMerge = extendMerge(dsMergeConfig);
370
412
  function cn(...inputs) {
371
413
  return twMerge(clsx(inputs));
372
414
  }
@@ -2435,6 +2477,254 @@ var AccordionContent = React39.forwardRef(function AccordionContent2({ children,
2435
2477
  );
2436
2478
  });
2437
2479
  AccordionContent.displayName = AccordionPrimitive.Content.displayName;
2480
+
2481
+ // src/foundation/anatomy/define.ts
2482
+ var ROOT_PART = "root";
2483
+ var NAME_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
2484
+ var registry = /* @__PURE__ */ new Map();
2485
+ function assertName(value, what) {
2486
+ if (!NAME_PATTERN.test(value)) {
2487
+ throw new TypeError(
2488
+ `anatomy: ${what} must be lower-case kebab-case, received ${JSON.stringify(value)}`
2489
+ );
2490
+ }
2491
+ }
2492
+ function defineAnatomy(name, parts) {
2493
+ assertName(name, "component name");
2494
+ if (parts.length === 0) {
2495
+ throw new TypeError(`anatomy: ${name} must declare at least one part`);
2496
+ }
2497
+ const seen = /* @__PURE__ */ new Set();
2498
+ for (const part of parts) {
2499
+ assertName(part, `part name of ${name}`);
2500
+ if (seen.has(part)) {
2501
+ throw new TypeError(`anatomy: ${name} declares the part ${JSON.stringify(part)} twice`);
2502
+ }
2503
+ seen.add(part);
2504
+ }
2505
+ if (registry.has(name)) {
2506
+ throw new TypeError(`anatomy: ${name} is already registered`);
2507
+ }
2508
+ const attr = (part) => part === ROOT_PART ? name : `${name}-${String(part)}`;
2509
+ const anatomy = {
2510
+ name,
2511
+ parts: [...parts],
2512
+ attrs: parts.map((part) => attr(part)),
2513
+ attr,
2514
+ has: (part) => seen.has(part)
2515
+ };
2516
+ registry.set(name, anatomy);
2517
+ return anatomy;
2518
+ }
2519
+
2520
+ // src/foundation/anatomy/slots.ts
2521
+ defineAnatomy("agreement-viewer", ["root"]);
2522
+ defineAnatomy("message-composer", [
2523
+ "root",
2524
+ "header",
2525
+ "chips",
2526
+ "editor",
2527
+ "below-editor",
2528
+ "footer"
2529
+ ]);
2530
+ var buttonAnatomy = defineAnatomy("button", ["root", "icon-start", "icon-end", "spinner"]);
2531
+ var linkButtonAnatomy = defineAnatomy("link-button", ["root", "icon-start", "icon-end"]);
2532
+ var badgeAnatomy = defineAnatomy("badge", ["root", "dot", "icon"]);
2533
+ var inputAnatomy = defineAnatomy("input", [
2534
+ "root",
2535
+ "label",
2536
+ "icon-start",
2537
+ "icon-end",
2538
+ "password-toggle",
2539
+ "error"
2540
+ ]);
2541
+ var textareaAnatomy = defineAnatomy("textarea", ["root", "label", "error", "count"]);
2542
+ var searchInputAnatomy = defineAnatomy("search-input", [
2543
+ "root",
2544
+ "control",
2545
+ "icon",
2546
+ "clear"
2547
+ ]);
2548
+ var selectAnatomy = defineAnatomy("select", [
2549
+ "trigger",
2550
+ "icon",
2551
+ "content",
2552
+ "viewport",
2553
+ "item",
2554
+ "item-indicator",
2555
+ "label",
2556
+ "separator",
2557
+ "scroll-up-button",
2558
+ "scroll-down-button"
2559
+ ]);
2560
+ var checkboxAnatomy = defineAnatomy("checkbox", ["root", "indicator", "label"]);
2561
+ var radioGroupAnatomy = defineAnatomy("radio-group", [
2562
+ "root",
2563
+ "item",
2564
+ "indicator",
2565
+ "label"
2566
+ ]);
2567
+ var switchAnatomy = defineAnatomy("switch", ["root", "thumb", "label"]);
2568
+ var labelAnatomy = defineAnatomy("label", ["root", "required"]);
2569
+ var fileUploadAnatomy = defineAnatomy("file-upload", [
2570
+ "root",
2571
+ "dropzone",
2572
+ "input",
2573
+ "error"
2574
+ ]);
2575
+ var dialogAnatomy = defineAnatomy("dialog", [
2576
+ "overlay",
2577
+ "content",
2578
+ "header",
2579
+ "title",
2580
+ "description",
2581
+ "footer",
2582
+ "close"
2583
+ ]);
2584
+ var alertDialogAnatomy = defineAnatomy("alert-dialog", [
2585
+ "overlay",
2586
+ "content",
2587
+ "header",
2588
+ "title",
2589
+ "description",
2590
+ "footer",
2591
+ "action",
2592
+ "cancel"
2593
+ ]);
2594
+ var sheetAnatomy = defineAnatomy("sheet", [
2595
+ "overlay",
2596
+ "content",
2597
+ "header",
2598
+ "title",
2599
+ "description",
2600
+ "footer",
2601
+ "close"
2602
+ ]);
2603
+ var sideDrawerAnatomy = defineAnatomy("side-drawer", [
2604
+ "overlay",
2605
+ "root",
2606
+ "header",
2607
+ "heading",
2608
+ "subtitle",
2609
+ "close",
2610
+ "body",
2611
+ "footer"
2612
+ ]);
2613
+ var popoverAnatomy = defineAnatomy("popover", ["content"]);
2614
+ var dropdownMenuAnatomy = defineAnatomy("dropdown-menu", [
2615
+ "content",
2616
+ "item",
2617
+ "checkbox-item",
2618
+ "radio-item",
2619
+ "item-indicator",
2620
+ "label",
2621
+ "separator",
2622
+ "shortcut",
2623
+ "sub-trigger",
2624
+ "sub-content"
2625
+ ]);
2626
+ var contextMenuAnatomy = defineAnatomy("context-menu", [
2627
+ "content",
2628
+ "item",
2629
+ "checkbox-item",
2630
+ "radio-item",
2631
+ "item-indicator",
2632
+ "label",
2633
+ "separator",
2634
+ "shortcut",
2635
+ "sub-trigger",
2636
+ "sub-content"
2637
+ ]);
2638
+ var tooltipAnatomy = defineAnatomy("tooltip", ["content"]);
2639
+ var toastAnatomy = defineAnatomy("toast", [
2640
+ "region",
2641
+ "root",
2642
+ "icon",
2643
+ "title",
2644
+ "description",
2645
+ "action",
2646
+ "close"
2647
+ ]);
2648
+ var tableAnatomy = defineAnatomy("table", [
2649
+ "root",
2650
+ "wrapper",
2651
+ "header",
2652
+ "body",
2653
+ "footer",
2654
+ "row",
2655
+ "head",
2656
+ "cell",
2657
+ "caption"
2658
+ ]);
2659
+ var dataTableAnatomy = defineAnatomy("data-table", [
2660
+ "root",
2661
+ "toolbar",
2662
+ "spacer",
2663
+ "results-count",
2664
+ "header",
2665
+ "body",
2666
+ "row",
2667
+ "head",
2668
+ "head-button",
2669
+ "head-indicator",
2670
+ "cell",
2671
+ "checkbox-cell"
2672
+ ]);
2673
+ var paginationAnatomy = defineAnatomy("pagination", [
2674
+ "root",
2675
+ "label",
2676
+ "pages",
2677
+ "previous",
2678
+ "next",
2679
+ "page",
2680
+ "ellipsis"
2681
+ ]);
2682
+ var shellAnatomy = defineAnatomy("shell", ["root", "main", "content"]);
2683
+ var sidebarAnatomy = defineAnatomy("sidebar", [
2684
+ "root",
2685
+ "trigger",
2686
+ "pin",
2687
+ "brand",
2688
+ "brand-text",
2689
+ "section",
2690
+ "section-header",
2691
+ "section-label",
2692
+ "link",
2693
+ "link-label",
2694
+ "link-action",
2695
+ "link-badge",
2696
+ "group",
2697
+ "group-link",
2698
+ "group-trigger",
2699
+ "group-content",
2700
+ "footer",
2701
+ "user",
2702
+ "user-name",
2703
+ "user-subtitle"
2704
+ ]);
2705
+ var sidebarBrandSwitcherAnatomy = defineAnatomy("sidebar-brand-switcher", [
2706
+ "root",
2707
+ "trigger",
2708
+ "icon"
2709
+ ]);
2710
+
2711
+ // src/foundation/anatomy/slot.ts
2712
+ function slot(anatomy, part) {
2713
+ return { "data-slot": anatomy.attr(part) };
2714
+ }
2715
+ var BOOLEAN_STATES = ["disabled", "invalid", "loading", "selected"];
2716
+ var VALUE_STATES = ["state", "size", "variant", "intent", "orientation"];
2717
+ function stateAttributes(input) {
2718
+ const attributes = {};
2719
+ for (const key of BOOLEAN_STATES) {
2720
+ if (input[key]) attributes[`data-${key}`] = "";
2721
+ }
2722
+ for (const key of VALUE_STATES) {
2723
+ const value = input[key];
2724
+ if (value !== void 0) attributes[`data-${key}`] = value;
2725
+ }
2726
+ return attributes;
2727
+ }
2438
2728
  var AlertDialog = AlertDialogPrimitive.Root;
2439
2729
  var AlertDialogTrigger = AlertDialogPrimitive.Trigger;
2440
2730
  var AlertDialogPortal = AlertDialogPrimitive.Portal;
@@ -2442,6 +2732,7 @@ var AlertDialogOverlay = React39.forwardRef(({ className, ...props }, ref) => /*
2442
2732
  AlertDialogPrimitive.Overlay,
2443
2733
  {
2444
2734
  ref,
2735
+ ...slot(alertDialogAnatomy, "overlay"),
2445
2736
  className: cn(
2446
2737
  "bg-overlay fixed inset-0 z-[var(--z-overlay)] backdrop-blur-[4px]",
2447
2738
  "transition-opacity duration-[var(--duration-overlay)] ease-[var(--ease-out-quart)]",
@@ -2459,6 +2750,7 @@ var AlertDialogContent = React39.forwardRef(({ className, ...props }, ref) => /*
2459
2750
  AlertDialogPrimitive.Content,
2460
2751
  {
2461
2752
  ref,
2753
+ ...slot(alertDialogAnatomy, "content"),
2462
2754
  className: cn(
2463
2755
  "fixed top-1/2 left-1/2 z-[var(--z-modal)] w-full max-w-lg",
2464
2756
  "scrollbar-thin max-h-[calc(100vh-6rem)] overflow-y-auto",
@@ -2475,11 +2767,19 @@ var AlertDialogContent = React39.forwardRef(({ className, ...props }, ref) => /*
2475
2767
  )
2476
2768
  ] }));
2477
2769
  AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
2478
- var AlertDialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("mb-4 flex flex-col gap-1.5", className), ...props });
2770
+ var AlertDialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx(
2771
+ "div",
2772
+ {
2773
+ ...slot(alertDialogAnatomy, "header"),
2774
+ className: cn("mb-4 flex flex-col gap-1.5", className),
2775
+ ...props
2776
+ }
2777
+ );
2479
2778
  AlertDialogHeader.displayName = "AlertDialogHeader";
2480
2779
  var AlertDialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
2481
2780
  "div",
2482
2781
  {
2782
+ ...slot(alertDialogAnatomy, "footer"),
2483
2783
  className: cn(
2484
2784
  "mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:items-center sm:justify-end",
2485
2785
  className
@@ -2492,6 +2792,7 @@ var AlertDialogTitle = React39.forwardRef(({ className, ...props }, ref) => /* @
2492
2792
  AlertDialogPrimitive.Title,
2493
2793
  {
2494
2794
  ref,
2795
+ ...slot(alertDialogAnatomy, "title"),
2495
2796
  className: cn(
2496
2797
  "font-display text-fg text-base leading-tight font-medium tracking-tight",
2497
2798
  className
@@ -2504,6 +2805,7 @@ var AlertDialogDescription = React39.forwardRef(({ className, ...props }, ref) =
2504
2805
  AlertDialogPrimitive.Description,
2505
2806
  {
2506
2807
  ref,
2808
+ ...slot(alertDialogAnatomy, "description"),
2507
2809
  className: cn("text-fg-3 text-sm", className),
2508
2810
  ...props
2509
2811
  }
@@ -2513,6 +2815,7 @@ var AlertDialogAction = React39.forwardRef(({ className, ...props }, ref) => /*
2513
2815
  AlertDialogPrimitive.Action,
2514
2816
  {
2515
2817
  ref,
2818
+ ...slot(alertDialogAnatomy, "action"),
2516
2819
  className: cn(
2517
2820
  "rounded-btn inline-flex h-10 items-center justify-center px-4 text-sm font-medium whitespace-nowrap",
2518
2821
  "bg-destructive text-destructive-foreground transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
@@ -2529,6 +2832,7 @@ var AlertDialogCancel = React39.forwardRef(({ className, children, ...props }, r
2529
2832
  AlertDialogPrimitive.Cancel,
2530
2833
  {
2531
2834
  ref,
2835
+ ...slot(alertDialogAnatomy, "cancel"),
2532
2836
  className: cn(
2533
2837
  "rounded-btn border-rule-strong bg-surface inline-flex h-10 items-center justify-center border px-4 text-sm font-medium whitespace-nowrap",
2534
2838
  "text-fg-2 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
@@ -2732,6 +3036,14 @@ var AspectRatio = React39.forwardRef(function AspectRatio2({ className, ratio =
2732
3036
  );
2733
3037
  });
2734
3038
  AspectRatio.displayName = AspectRatioPrimitive.Root.displayName;
3039
+
3040
+ // src/lib/micro-interactions.ts
3041
+ var microInteractions = {
3042
+ control: "transition-[color,background-color,border-color,box-shadow] duration-[var(--motion-duration-feedback)] ease-[var(--motion-ease-enter)] motion-reduce:transition-none",
3043
+ pressable: "transition-[color,background-color,border-color,box-shadow,transform] duration-[var(--motion-duration-feedback)] ease-[var(--motion-ease-enter)] active:scale-[0.98] motion-reduce:transform-none motion-reduce:transition-none",
3044
+ selection: "transition-[color,background-color,border-color,box-shadow] duration-[var(--motion-duration-press)] ease-[var(--motion-ease-enter)] motion-reduce:transition-none",
3045
+ overlay: "transition-[opacity,transform] duration-[var(--motion-duration-overlay)] ease-[var(--motion-ease-enter)] motion-reduce:transform-none motion-reduce:transition-none",
3046
+ progress: "transition-[width,height,stroke-dashoffset,background-color] duration-[var(--motion-duration-deliberate)] ease-[var(--motion-ease-enter)] motion-reduce:transition-none"};
2735
3047
  var spinnerVariants = cva(
2736
3048
  "inline-flex shrink-0 items-center justify-center [&_svg]:motion-reduce:animate-none",
2737
3049
  {
@@ -2777,10 +3089,10 @@ Spinner.displayName = "Spinner";
2777
3089
  var buttonVariants = cva(
2778
3090
  cn(
2779
3091
  "inline-flex items-center justify-center rounded-btn font-medium whitespace-nowrap cursor-pointer",
2780
- "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
3092
+ microInteractions.pressable,
2781
3093
  "focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)]",
2782
- "disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-fg-disabled",
2783
- "motion-reduce:transition-none",
3094
+ "disabled:pointer-events-none [&:disabled:not([data-loading=true])]:bg-bg-disabled [&:disabled:not([data-loading=true])]:text-fg-disabled",
3095
+ "data-[loading=true]:cursor-wait",
2784
3096
  "[&_svg]:size-4 [&_svg]:shrink-0"
2785
3097
  ),
2786
3098
  {
@@ -2792,14 +3104,17 @@ var buttonVariants = cva(
2792
3104
  success: "bg-success-fg text-fg-on-success hover:bg-success-fg-hover active:bg-success-fg-active",
2793
3105
  ghost: "bg-control-bg text-control-fg hover:bg-control-hover-bg hover:text-control-hover-fg",
2794
3106
  outline: "border border-control-border-strong bg-control-bg text-control-fg hover:bg-control-hover-bg hover:border-control-border-hover",
2795
- link: "bg-transparent text-accent underline-offset-4 hover:underline p-0 h-auto",
2796
- accent: "bg-accent text-fg-on-accent hover:bg-accent-hover active:bg-accent-active",
3107
+ link: "bg-transparent text-accent underline-offset-4 hover:underline p-0 h-auto active:scale-100",
3108
+ accent: "bg-suite-action text-fg-on-suite-action hover:bg-suite-action-hover active:bg-suite-action-active",
2797
3109
  dashed: "border-2 border-dashed border-control-border bg-control-bg text-control-muted-fg hover:border-control-border-hover hover:bg-control-hover-bg hover:text-control-hover-fg"
2798
3110
  },
2799
3111
  size: {
2800
3112
  sm: "h-8 px-3 text-[13px] gap-1.5",
2801
3113
  md: "h-10 px-4 text-sm gap-2",
2802
3114
  lg: "h-12 px-6 text-base gap-2",
3115
+ compact: "h-8 px-3 text-[13px] gap-1.5",
3116
+ default: "h-10 px-4 text-sm gap-2",
3117
+ comfortable: "h-12 px-6 text-base gap-2",
2803
3118
  // Icon-only sizes. Hit target ≥ 24px (WCAG 2.5.5 floor).
2804
3119
  // `icon-xs` / `icon-sm` are for dense in-row action stacks where
2805
3120
  // `size="icon"` (40×40) would visually crowd the row.
@@ -2827,20 +3142,59 @@ var Button = forwardRef(function Button2({
2827
3142
  ...props
2828
3143
  }, ref) {
2829
3144
  const Comp = asChild ? Slot : "button";
3145
+ const resolvedVariant = variant ?? "primary";
3146
+ const resolvedSize = size ?? "md";
3147
+ const state = stateAttributes({
3148
+ variant: resolvedVariant,
3149
+ size: resolvedSize,
3150
+ // `asChild` drops `disabled`/`loading` (Slot renders the child's own
3151
+ // element), so the state attribute is not claimed there either.
3152
+ disabled: asChild ? void 0 : disabled || loading
3153
+ });
2830
3154
  if (asChild) {
2831
- return /* @__PURE__ */ jsx(Comp, { ref, className: cn(buttonVariants({ variant, size }), className), ...props, children });
3155
+ return /* @__PURE__ */ jsx(
3156
+ Comp,
3157
+ {
3158
+ ref,
3159
+ ...slot(buttonAnatomy, "root"),
3160
+ ...state,
3161
+ className: cn(buttonVariants({ variant, size }), className),
3162
+ ...props,
3163
+ children
3164
+ }
3165
+ );
2832
3166
  }
2833
3167
  return /* @__PURE__ */ jsxs(
2834
3168
  Comp,
2835
3169
  {
2836
3170
  ref,
2837
3171
  disabled: disabled || loading,
3172
+ "aria-busy": loading || void 0,
3173
+ "data-loading": loading || void 0,
3174
+ ...slot(buttonAnatomy, "root"),
3175
+ ...state,
2838
3176
  className: cn(buttonVariants({ variant, size }), className),
2839
3177
  ...props,
2840
3178
  children: [
2841
- loading ? /* @__PURE__ */ jsx(Spinner, { size: "sm" }) : iconLeft && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconLeft }),
3179
+ loading ? /* @__PURE__ */ jsx(Spinner, { size: "sm", ...slot(buttonAnatomy, "spinner") }) : iconLeft && /* @__PURE__ */ jsx(
3180
+ "span",
3181
+ {
3182
+ ...slot(buttonAnatomy, "icon-start"),
3183
+ className: "inline-flex shrink-0",
3184
+ "aria-hidden": "true",
3185
+ children: iconLeft
3186
+ }
3187
+ ),
2842
3188
  children,
2843
- iconRight && !loading && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconRight })
3189
+ iconRight && !loading && /* @__PURE__ */ jsx(
3190
+ "span",
3191
+ {
3192
+ ...slot(buttonAnatomy, "icon-end"),
3193
+ className: "inline-flex shrink-0",
3194
+ "aria-hidden": "true",
3195
+ children: iconRight
3196
+ }
3197
+ )
2844
3198
  ]
2845
3199
  }
2846
3200
  );
@@ -3152,11 +3506,36 @@ var badgeVariants = cva(
3152
3506
  }
3153
3507
  );
3154
3508
  var Badge = forwardRef(function Badge2({ variant, size, dot, icon, children, className, ...props }, ref) {
3155
- return /* @__PURE__ */ jsxs("span", { ref, className: cn(badgeVariants({ variant, size }), className), ...props, children: [
3156
- dot && /* @__PURE__ */ jsx("span", { className: "size-1.5 rounded-full bg-current", "aria-hidden": "true" }),
3157
- icon && /* @__PURE__ */ jsx("span", { className: "inline-flex size-3.5 shrink-0", "aria-hidden": "true", children: icon }),
3158
- children
3159
- ] });
3509
+ return /* @__PURE__ */ jsxs(
3510
+ "span",
3511
+ {
3512
+ ref,
3513
+ ...slot(badgeAnatomy, "root"),
3514
+ ...stateAttributes({ variant: variant ?? "default", size: size ?? "sm" }),
3515
+ className: cn(badgeVariants({ variant, size }), className),
3516
+ ...props,
3517
+ children: [
3518
+ dot && /* @__PURE__ */ jsx(
3519
+ "span",
3520
+ {
3521
+ ...slot(badgeAnatomy, "dot"),
3522
+ className: "size-1.5 rounded-full bg-current",
3523
+ "aria-hidden": "true"
3524
+ }
3525
+ ),
3526
+ icon && /* @__PURE__ */ jsx(
3527
+ "span",
3528
+ {
3529
+ ...slot(badgeAnatomy, "icon"),
3530
+ className: "inline-flex size-3.5 shrink-0",
3531
+ "aria-hidden": "true",
3532
+ children: icon
3533
+ }
3534
+ ),
3535
+ children
3536
+ ]
3537
+ }
3538
+ );
3160
3539
  });
3161
3540
  Badge.displayName = "Badge";
3162
3541
  var Blockquote = forwardRef(function Blockquote2({ children, author, role: authorRole, className, ...props }, ref) {
@@ -3300,6 +3679,303 @@ var BreadcrumbSeparator = forwardRef(
3300
3679
  }
3301
3680
  );
3302
3681
  BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
3682
+ var SelectRoot = SelectPrimitive.Root;
3683
+ var SelectGroup = SelectPrimitive.Group;
3684
+ var SelectValue = SelectPrimitive.Value;
3685
+ function useTriggerOpen(node) {
3686
+ const [open, setOpen] = React39.useState(false);
3687
+ React39.useEffect(() => {
3688
+ if (!node) return;
3689
+ const sync = () => setOpen(node.getAttribute("data-state") === "open");
3690
+ sync();
3691
+ const observer = new MutationObserver(sync);
3692
+ observer.observe(node, { attributes: true, attributeFilter: ["data-state"] });
3693
+ return () => observer.disconnect();
3694
+ }, [node]);
3695
+ return open;
3696
+ }
3697
+ var SelectTrigger = React39.forwardRef(({ className, children, tabIndex, ...props }, ref) => {
3698
+ const [node, setNode] = React39.useState(null);
3699
+ const open = useTriggerOpen(node);
3700
+ const composedRef = React39.useCallback(
3701
+ (element) => {
3702
+ setNode(element);
3703
+ if (typeof ref === "function") ref(element);
3704
+ else if (ref) ref.current = element;
3705
+ },
3706
+ [ref]
3707
+ );
3708
+ return /* @__PURE__ */ jsxs(
3709
+ SelectPrimitive.Trigger,
3710
+ {
3711
+ ref: composedRef,
3712
+ tabIndex: open ? -1 : tabIndex,
3713
+ ...slot(selectAnatomy, "trigger"),
3714
+ className: cn(
3715
+ "rounded-input border-rule-strong bg-surface font-body text-fg flex h-9 w-full items-center justify-between gap-2 border px-3 py-2 text-[13px]",
3716
+ "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
3717
+ "motion-reduce:transition-none",
3718
+ "placeholder:text-fg-4",
3719
+ "focus-visible:[border-color:var(--focus-ring-border)] focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
3720
+ "disabled:bg-bg-disabled disabled:text-fg-disabled disabled:cursor-not-allowed",
3721
+ "data-[placeholder]:text-fg-4",
3722
+ "aria-[invalid=true]:border-danger-line aria-[invalid=true]:focus-visible:border-danger-fg",
3723
+ "aria-[invalid=true]:focus-visible:[box-shadow:0_0_0_2px_var(--color-danger-bg)]",
3724
+ "[&>span]:line-clamp-1 [&>span]:text-left",
3725
+ className
3726
+ ),
3727
+ ...props,
3728
+ children: [
3729
+ children,
3730
+ /* @__PURE__ */ jsx(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx(
3731
+ ChevronDownIcon,
3732
+ {
3733
+ ...slot(selectAnatomy, "icon"),
3734
+ className: "text-fg-3 size-4 shrink-0 transition-transform duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] data-[state=open]:rotate-180 motion-reduce:transition-none",
3735
+ "aria-hidden": "true"
3736
+ }
3737
+ ) })
3738
+ ]
3739
+ }
3740
+ );
3741
+ });
3742
+ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
3743
+ var SelectScrollUpButton = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3744
+ SelectPrimitive.ScrollUpButton,
3745
+ {
3746
+ ref,
3747
+ ...slot(selectAnatomy, "scroll-up-button"),
3748
+ className: cn("text-fg-3 flex cursor-default items-center justify-center py-1", className),
3749
+ ...props,
3750
+ children: /* @__PURE__ */ jsx(ChevronUpIcon, { className: "size-4", "aria-hidden": "true" })
3751
+ }
3752
+ ));
3753
+ SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
3754
+ var SelectScrollDownButton = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3755
+ SelectPrimitive.ScrollDownButton,
3756
+ {
3757
+ ref,
3758
+ ...slot(selectAnatomy, "scroll-down-button"),
3759
+ className: cn("text-fg-3 flex cursor-default items-center justify-center py-1", className),
3760
+ ...props,
3761
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4", "aria-hidden": "true" })
3762
+ }
3763
+ ));
3764
+ SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
3765
+ var SelectContent = React39.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
3766
+ SelectPrimitive.Content,
3767
+ {
3768
+ ref,
3769
+ position,
3770
+ ...slot(selectAnatomy, "content"),
3771
+ className: cn(
3772
+ "rounded-card border-rule bg-surface text-fg shadow-pop relative z-[var(--z-dropdown)] max-h-(--radix-select-content-available-height) min-w-[8rem] overflow-hidden border",
3773
+ "data-[state=open]:animate-in data-[state=closed]:animate-out",
3774
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
3775
+ "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
3776
+ "data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2",
3777
+ "data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
3778
+ "motion-reduce:transition-none",
3779
+ position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
3780
+ className
3781
+ ),
3782
+ ...props,
3783
+ children: [
3784
+ /* @__PURE__ */ jsx(SelectScrollUpButton, {}),
3785
+ /* @__PURE__ */ jsx(
3786
+ SelectPrimitive.Viewport,
3787
+ {
3788
+ ...slot(selectAnatomy, "viewport"),
3789
+ className: cn(
3790
+ "p-1",
3791
+ position === "popper" && "h-(--radix-select-trigger-height) w-full min-w-(--radix-select-trigger-width)"
3792
+ ),
3793
+ children
3794
+ }
3795
+ ),
3796
+ /* @__PURE__ */ jsx(SelectScrollDownButton, {})
3797
+ ]
3798
+ }
3799
+ ) }));
3800
+ SelectContent.displayName = SelectPrimitive.Content.displayName;
3801
+ var SelectLabel = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3802
+ SelectPrimitive.Label,
3803
+ {
3804
+ ref,
3805
+ ...slot(selectAnatomy, "label"),
3806
+ className: cn(
3807
+ "text-fg-3 px-2 py-1.5 font-mono text-[11px] tracking-wider uppercase",
3808
+ className
3809
+ ),
3810
+ ...props
3811
+ }
3812
+ ));
3813
+ SelectLabel.displayName = SelectPrimitive.Label.displayName;
3814
+ var SelectItem = React39.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3815
+ SelectPrimitive.Item,
3816
+ {
3817
+ ref,
3818
+ ...slot(selectAnatomy, "item"),
3819
+ className: cn(
3820
+ "rounded-pill relative flex w-full cursor-default items-center gap-2 py-1.5 pr-8 pl-2 text-[13px] outline-none select-none",
3821
+ "text-fg-2 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
3822
+ "focus:bg-bg-2 focus:text-fg",
3823
+ "data-[state=checked]:bg-brand-bg data-[state=checked]:text-brand",
3824
+ "data-[disabled]:text-fg-disabled data-[disabled]:pointer-events-none",
3825
+ "[&_svg]:size-4 [&_svg]:shrink-0",
3826
+ className
3827
+ ),
3828
+ ...props,
3829
+ children: [
3830
+ /* @__PURE__ */ jsx(SelectPrimitive.ItemText, { children }),
3831
+ /* @__PURE__ */ jsx("span", { className: "absolute right-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx(SelectPrimitive.ItemIndicator, { ...slot(selectAnatomy, "item-indicator"), children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5", "aria-hidden": "true" }) }) })
3832
+ ]
3833
+ }
3834
+ ));
3835
+ SelectItem.displayName = SelectPrimitive.Item.displayName;
3836
+ var SelectSeparator = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3837
+ SelectPrimitive.Separator,
3838
+ {
3839
+ ref,
3840
+ ...slot(selectAnatomy, "separator"),
3841
+ className: cn("bg-rule -mx-1 my-1 h-px", className),
3842
+ ...props
3843
+ }
3844
+ ));
3845
+ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
3846
+ function Select({
3847
+ options,
3848
+ value,
3849
+ defaultValue,
3850
+ onValueChange,
3851
+ placeholder = "Select...",
3852
+ searchable,
3853
+ disabled,
3854
+ name,
3855
+ required,
3856
+ className,
3857
+ triggerClassName,
3858
+ contentClassName,
3859
+ "aria-invalid": ariaInvalid,
3860
+ "aria-label": ariaLabel
3861
+ }) {
3862
+ if (process.env.NODE_ENV !== "production" && searchable) {
3863
+ console.warn(
3864
+ "[Select] `searchable` is not supported by Radix Select. Use <SearchSelect /> for filterable selection."
3865
+ );
3866
+ }
3867
+ return /* @__PURE__ */ jsxs(
3868
+ SelectRoot,
3869
+ {
3870
+ value,
3871
+ defaultValue,
3872
+ onValueChange,
3873
+ disabled,
3874
+ name,
3875
+ required,
3876
+ children: [
3877
+ /* @__PURE__ */ jsx(
3878
+ SelectTrigger,
3879
+ {
3880
+ "aria-invalid": ariaInvalid || void 0,
3881
+ "aria-label": ariaLabel ?? placeholder,
3882
+ className: cn(triggerClassName, className),
3883
+ children: /* @__PURE__ */ jsx(SelectValue, { placeholder })
3884
+ }
3885
+ ),
3886
+ /* @__PURE__ */ jsx(SelectContent, { className: contentClassName, children: options.map((opt) => /* @__PURE__ */ jsx(SelectItem, { value: opt.value, disabled: opt.disabled, children: /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [
3887
+ /* @__PURE__ */ jsx("span", { className: "line-clamp-1", children: opt.label }),
3888
+ opt.labelSuffix
3889
+ ] }) }, opt.value)) })
3890
+ ]
3891
+ }
3892
+ );
3893
+ }
3894
+ Select.displayName = "Select";
3895
+ var DEFAULT_YEARS_BACK = 100;
3896
+ var DEFAULT_YEARS_FORWARD = 20;
3897
+ function CalendarDropdown({
3898
+ options = [],
3899
+ value,
3900
+ onChange,
3901
+ disabled,
3902
+ className,
3903
+ "aria-label": ariaLabel
3904
+ }) {
3905
+ const current = value === void 0 || value === null ? void 0 : String(value);
3906
+ const selected = options.find((option) => String(option.value) === current);
3907
+ return /* @__PURE__ */ jsxs(
3908
+ SelectRoot,
3909
+ {
3910
+ value: current,
3911
+ disabled,
3912
+ onValueChange: (next) => {
3913
+ onChange?.({ target: { value: next } });
3914
+ },
3915
+ children: [
3916
+ /* @__PURE__ */ jsx(
3917
+ SelectTrigger,
3918
+ {
3919
+ "aria-label": ariaLabel,
3920
+ className: cn(
3921
+ "h-7 w-auto min-w-0 gap-1 border-transparent bg-transparent px-1.5 py-0",
3922
+ "font-display font-medium",
3923
+ "hover:bg-bg-2",
3924
+ "[&>svg]:size-3.5",
3925
+ className
3926
+ ),
3927
+ children: /* @__PURE__ */ jsx(SelectValue, { children: selected?.label })
3928
+ }
3929
+ ),
3930
+ /* @__PURE__ */ jsx(SelectContent, { align: "center", className: "max-h-64 min-w-[6rem]", children: options.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: String(option.value), disabled: option.disabled, children: option.label }, option.value)) })
3931
+ ]
3932
+ }
3933
+ );
3934
+ }
3935
+ function CalendarChevron({
3936
+ orientation,
3937
+ className
3938
+ }) {
3939
+ const Icon3 = orientation === "right" ? ChevronRightIcon : ChevronLeftIcon;
3940
+ return /* @__PURE__ */ jsx(Icon3, { className: cn("text-fg-3 size-4", className), "aria-hidden": "true" });
3941
+ }
3942
+ var CALENDAR_CAPTION_COMPONENTS = {
3943
+ Chevron: CalendarChevron,
3944
+ Dropdown: CalendarDropdown
3945
+ };
3946
+ var NAV_BUTTON = "absolute top-0 inline-flex size-7 items-center justify-center rounded-input text-fg-3 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none hover:bg-bg-2 hover:text-fg focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)] disabled:cursor-not-allowed disabled:text-fg-disabled disabled:pointer-events-none aria-disabled:cursor-not-allowed aria-disabled:text-fg-disabled aria-disabled:pointer-events-none";
3947
+ var CALENDAR_CAPTION_CLASSNAMES = {
3948
+ month: "relative space-y-3",
3949
+ // px-7 keeps the caption clear of the two absolutely-pinned size-7 chevrons.
3950
+ // Font size is applied by each calendar (they own their type scale).
3951
+ month_caption: "flex h-7 items-center justify-center px-7 font-display font-medium text-fg",
3952
+ caption_label: "tabular-nums",
3953
+ // No root-level <nav> with navLayout="around"; the buttons render inline.
3954
+ nav: "contents",
3955
+ button_previous: cn("left-0", NAV_BUTTON),
3956
+ button_next: cn("right-0", NAV_BUTTON),
3957
+ dropdowns: "flex items-center justify-center gap-1",
3958
+ dropdown_root: "relative",
3959
+ months_dropdown: "",
3960
+ years_dropdown: "font-mono tabular-nums"
3961
+ };
3962
+ function resolveCalendarNavRange({
3963
+ minDate,
3964
+ maxDate,
3965
+ selected,
3966
+ today = /* @__PURE__ */ new Date()
3967
+ }) {
3968
+ let startMonth = minDate ? startOfMonth(minDate) : startOfYear(subYears(today, DEFAULT_YEARS_BACK));
3969
+ let endMonth = maxDate ? endOfMonth(maxDate) : endOfYear(addYears(today, DEFAULT_YEARS_FORWARD));
3970
+ const picks = (Array.isArray(selected) ? selected : [selected]).filter(
3971
+ (d) => d instanceof Date && !Number.isNaN(d.getTime())
3972
+ );
3973
+ for (const pick of picks) {
3974
+ if (pick < startMonth) startMonth = startOfMonth(pick);
3975
+ if (pick > endMonth) endMonth = endOfMonth(pick);
3976
+ }
3977
+ return { startMonth, endMonth };
3978
+ }
3303
3979
  var HIGHLIGHT_COLORS = {
3304
3980
  primary: "after:bg-brand",
3305
3981
  success: "after:bg-success-fg",
@@ -3315,6 +3991,11 @@ function Calendar({
3315
3991
  maxDate,
3316
3992
  className,
3317
3993
  classNames,
3994
+ captionLayout = "dropdown",
3995
+ navLayout = "around",
3996
+ startMonth,
3997
+ endMonth,
3998
+ components,
3318
3999
  ...props
3319
4000
  }) {
3320
4001
  const { modifiers, modifiersClassNames } = React39.useMemo(() => {
@@ -3338,6 +4019,10 @@ function Calendar({
3338
4019
  if (minDate) return { before: minDate };
3339
4020
  return { after: maxDate };
3340
4021
  }, [minDate, maxDate]);
4022
+ const navRange = React39.useMemo(
4023
+ () => captionLayout === "label" ? void 0 : resolveCalendarNavRange({ minDate, maxDate, selected }),
4024
+ [captionLayout, minDate, maxDate, selected]
4025
+ );
3341
4026
  return /* @__PURE__ */ jsx(
3342
4027
  DayPicker,
3343
4028
  {
@@ -3350,22 +4035,17 @@ function Calendar({
3350
4035
  modifiers,
3351
4036
  modifiersClassNames,
3352
4037
  showOutsideDays: true,
3353
- components: {
3354
- Chevron: ({ orientation, className: chevClass }) => {
3355
- const Icon3 = orientation === "right" ? ChevronRightIcon : ChevronLeftIcon;
3356
- return /* @__PURE__ */ jsx(Icon3, { className: cn("text-fg-3 size-4", chevClass), "aria-hidden": "true" });
3357
- }
3358
- },
4038
+ captionLayout,
4039
+ navLayout,
4040
+ startMonth: startMonth ?? navRange?.startMonth,
4041
+ endMonth: endMonth ?? navRange?.endMonth,
4042
+ components: { ...CALENDAR_CAPTION_COMPONENTS, ...components },
3359
4043
  className: cn("font-body text-fg select-none", className),
3360
4044
  classNames: {
3361
4045
  root: "p-3 min-w-[280px]",
3362
4046
  months: "flex flex-col gap-4",
3363
- month: "space-y-3",
3364
- month_caption: "flex h-8 items-center justify-center font-display text-[13px] font-medium text-fg",
3365
- caption_label: "tabular-nums",
3366
- nav: "flex items-center justify-between absolute left-3 right-3 top-3",
3367
- button_previous: "inline-flex size-7 items-center justify-center rounded-input text-fg-3 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none hover:bg-bg-2 hover:text-fg focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)] disabled:cursor-not-allowed disabled:text-fg-disabled disabled:pointer-events-none",
3368
- button_next: "inline-flex size-7 items-center justify-center rounded-input text-fg-3 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none hover:bg-bg-2 hover:text-fg focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)] disabled:cursor-not-allowed disabled:text-fg-disabled disabled:pointer-events-none",
4047
+ ...CALENDAR_CAPTION_CLASSNAMES,
4048
+ month_caption: cn(CALENDAR_CAPTION_CLASSNAMES.month_caption, "text-[13px]"),
3369
4049
  month_grid: "w-full border-collapse",
3370
4050
  weekdays: "flex",
3371
4051
  weekday: "flex-1 text-center text-[11px] font-medium uppercase tracking-wide text-fg-4 pb-1",
@@ -3520,10 +4200,11 @@ var Checkbox = React39.forwardRef(function Checkbox2({
3520
4200
  id,
3521
4201
  checked: resolvedChecked,
3522
4202
  defaultChecked,
4203
+ ...slot(checkboxAnatomy, "root"),
3523
4204
  className: cn(
3524
4205
  "peer border-rule-strong bg-surface text-brand flex size-4 shrink-0 items-center justify-center border",
3525
4206
  shape === "circle" ? "rounded-full" : "rounded-[4px]",
3526
- "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)]",
4207
+ microInteractions.selection,
3527
4208
  "hover:border-fg-4",
3528
4209
  "focus-visible:[border-color:var(--focus-ring-border)] focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
3529
4210
  "data-[state=checked]:border-brand data-[state=checked]:bg-brand-bg",
@@ -3533,199 +4214,28 @@ var Checkbox = React39.forwardRef(function Checkbox2({
3533
4214
  className
3534
4215
  ),
3535
4216
  ...props,
3536
- children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-current", children: resolvedChecked === "indeterminate" ? /* @__PURE__ */ jsx(MinusIcon, { className: "size-3", strokeWidth: 3, "aria-hidden": "true" }) : shape === "circle" ? /* @__PURE__ */ jsx("span", { className: "size-1.5 rounded-full bg-current", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(CheckIcon, { className: "size-3", strokeWidth: 3, "aria-hidden": "true" }) })
4217
+ children: /* @__PURE__ */ jsx(
4218
+ CheckboxPrimitive.Indicator,
4219
+ {
4220
+ ...slot(checkboxAnatomy, "indicator"),
4221
+ className: "flex items-center justify-center text-current",
4222
+ children: resolvedChecked === "indeterminate" ? /* @__PURE__ */ jsx(MinusIcon, { className: "size-3", strokeWidth: 3, "aria-hidden": "true" }) : shape === "circle" ? /* @__PURE__ */ jsx("span", { className: "size-1.5 rounded-full bg-current", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(CheckIcon, { className: "size-3", strokeWidth: 3, "aria-hidden": "true" })
4223
+ }
4224
+ )
3537
4225
  }
3538
4226
  ),
3539
4227
  label && /* @__PURE__ */ jsx(
3540
4228
  "label",
3541
4229
  {
3542
4230
  htmlFor: id,
4231
+ ...slot(checkboxAnatomy, "label"),
3543
4232
  className: "text-fg peer-disabled:text-fg-disabled cursor-pointer text-[13px] leading-none select-none peer-disabled:cursor-not-allowed",
3544
- children: label
3545
- }
3546
- )
3547
- ] });
3548
- });
3549
- Checkbox.displayName = CheckboxPrimitive.Root.displayName;
3550
- var SelectRoot = SelectPrimitive.Root;
3551
- var SelectGroup = SelectPrimitive.Group;
3552
- var SelectValue = SelectPrimitive.Value;
3553
- var SelectTrigger = React39.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3554
- SelectPrimitive.Trigger,
3555
- {
3556
- ref,
3557
- className: cn(
3558
- "rounded-input border-rule-strong bg-surface font-body text-fg flex h-9 w-full items-center justify-between gap-2 border px-3 py-2 text-[13px]",
3559
- "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
3560
- "motion-reduce:transition-none",
3561
- "placeholder:text-fg-4",
3562
- "focus-visible:[border-color:var(--focus-ring-border)] focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
3563
- "disabled:bg-bg-disabled disabled:text-fg-disabled disabled:cursor-not-allowed",
3564
- "data-[placeholder]:text-fg-4",
3565
- "aria-[invalid=true]:border-danger-line aria-[invalid=true]:focus-visible:border-danger-fg",
3566
- "aria-[invalid=true]:focus-visible:[box-shadow:0_0_0_2px_var(--color-danger-bg)]",
3567
- "[&>span]:line-clamp-1 [&>span]:text-left",
3568
- className
3569
- ),
3570
- ...props,
3571
- children: [
3572
- children,
3573
- /* @__PURE__ */ jsx(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx(
3574
- ChevronDownIcon,
3575
- {
3576
- className: "text-fg-3 size-4 shrink-0 transition-transform duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] data-[state=open]:rotate-180 motion-reduce:transition-none",
3577
- "aria-hidden": "true"
3578
- }
3579
- ) })
3580
- ]
3581
- }
3582
- ));
3583
- SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
3584
- var SelectScrollUpButton = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3585
- SelectPrimitive.ScrollUpButton,
3586
- {
3587
- ref,
3588
- className: cn("text-fg-3 flex cursor-default items-center justify-center py-1", className),
3589
- ...props,
3590
- children: /* @__PURE__ */ jsx(ChevronUpIcon, { className: "size-4", "aria-hidden": "true" })
3591
- }
3592
- ));
3593
- SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
3594
- var SelectScrollDownButton = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3595
- SelectPrimitive.ScrollDownButton,
3596
- {
3597
- ref,
3598
- className: cn("text-fg-3 flex cursor-default items-center justify-center py-1", className),
3599
- ...props,
3600
- children: /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4", "aria-hidden": "true" })
3601
- }
3602
- ));
3603
- SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
3604
- var SelectContent = React39.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
3605
- SelectPrimitive.Content,
3606
- {
3607
- ref,
3608
- position,
3609
- className: cn(
3610
- "rounded-card border-rule bg-surface text-fg shadow-pop relative z-[var(--z-dropdown)] max-h-(--radix-select-content-available-height) min-w-[8rem] overflow-hidden border",
3611
- "data-[state=open]:animate-in data-[state=closed]:animate-out",
3612
- "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
3613
- "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
3614
- "data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2",
3615
- "data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
3616
- "motion-reduce:transition-none",
3617
- position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
3618
- className
3619
- ),
3620
- ...props,
3621
- children: [
3622
- /* @__PURE__ */ jsx(SelectScrollUpButton, {}),
3623
- /* @__PURE__ */ jsx(
3624
- SelectPrimitive.Viewport,
3625
- {
3626
- className: cn(
3627
- "p-1",
3628
- position === "popper" && "h-(--radix-select-trigger-height) w-full min-w-(--radix-select-trigger-width)"
3629
- ),
3630
- children
3631
- }
3632
- ),
3633
- /* @__PURE__ */ jsx(SelectScrollDownButton, {})
3634
- ]
3635
- }
3636
- ) }));
3637
- SelectContent.displayName = SelectPrimitive.Content.displayName;
3638
- var SelectLabel = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3639
- SelectPrimitive.Label,
3640
- {
3641
- ref,
3642
- className: cn(
3643
- "text-fg-3 px-2 py-1.5 font-mono text-[11px] tracking-wider uppercase",
3644
- className
3645
- ),
3646
- ...props
3647
- }
3648
- ));
3649
- SelectLabel.displayName = SelectPrimitive.Label.displayName;
3650
- var SelectItem = React39.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3651
- SelectPrimitive.Item,
3652
- {
3653
- ref,
3654
- className: cn(
3655
- "rounded-pill relative flex w-full cursor-default items-center gap-2 py-1.5 pr-8 pl-2 text-[13px] outline-none select-none",
3656
- "text-fg-2 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
3657
- "focus:bg-bg-2 focus:text-fg",
3658
- "data-[state=checked]:bg-brand-bg data-[state=checked]:text-brand",
3659
- "data-[disabled]:text-fg-disabled data-[disabled]:pointer-events-none",
3660
- "[&_svg]:size-4 [&_svg]:shrink-0",
3661
- className
3662
- ),
3663
- ...props,
3664
- children: [
3665
- /* @__PURE__ */ jsx(SelectPrimitive.ItemText, { children }),
3666
- /* @__PURE__ */ jsx("span", { className: "absolute right-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5", "aria-hidden": "true" }) }) })
3667
- ]
3668
- }
3669
- ));
3670
- SelectItem.displayName = SelectPrimitive.Item.displayName;
3671
- var SelectSeparator = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3672
- SelectPrimitive.Separator,
3673
- {
3674
- ref,
3675
- className: cn("bg-rule -mx-1 my-1 h-px", className),
3676
- ...props
3677
- }
3678
- ));
3679
- SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
3680
- function Select({
3681
- options,
3682
- value,
3683
- defaultValue,
3684
- onValueChange,
3685
- placeholder = "Select...",
3686
- searchable,
3687
- disabled,
3688
- name,
3689
- required,
3690
- className,
3691
- triggerClassName,
3692
- contentClassName,
3693
- "aria-invalid": ariaInvalid,
3694
- "aria-label": ariaLabel
3695
- }) {
3696
- if (process.env.NODE_ENV !== "production" && searchable) {
3697
- console.warn(
3698
- "[Select] `searchable` is not supported by Radix Select. Use <SearchSelect /> for filterable selection."
3699
- );
3700
- }
3701
- return /* @__PURE__ */ jsxs(
3702
- SelectRoot,
3703
- {
3704
- value,
3705
- defaultValue,
3706
- onValueChange,
3707
- disabled,
3708
- name,
3709
- required,
3710
- children: [
3711
- /* @__PURE__ */ jsx(
3712
- SelectTrigger,
3713
- {
3714
- "aria-invalid": ariaInvalid || void 0,
3715
- "aria-label": ariaLabel ?? placeholder,
3716
- className: cn(triggerClassName, className),
3717
- children: /* @__PURE__ */ jsx(SelectValue, { placeholder })
3718
- }
3719
- ),
3720
- /* @__PURE__ */ jsx(SelectContent, { className: contentClassName, children: options.map((opt) => /* @__PURE__ */ jsx(SelectItem, { value: opt.value, disabled: opt.disabled, children: /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [
3721
- /* @__PURE__ */ jsx("span", { className: "line-clamp-1", children: opt.label }),
3722
- opt.labelSuffix
3723
- ] }) }, opt.value)) })
3724
- ]
3725
- }
3726
- );
3727
- }
3728
- Select.displayName = "Select";
4233
+ children: label
4234
+ }
4235
+ )
4236
+ ] });
4237
+ });
4238
+ Checkbox.displayName = CheckboxPrimitive.Root.displayName;
3729
4239
  function ClientSelect({
3730
4240
  clients,
3731
4241
  value,
@@ -3853,11 +4363,11 @@ var DialogOverlay = React39.forwardRef(({ className, ...props }, ref) => /* @__P
3853
4363
  DialogPrimitive.Overlay,
3854
4364
  {
3855
4365
  ref,
4366
+ ...slot(dialogAnatomy, "overlay"),
3856
4367
  className: cn(
3857
4368
  "bg-overlay fixed inset-0 z-[var(--z-overlay)] backdrop-blur-[4px]",
3858
- "transition-opacity duration-[var(--duration-overlay)] ease-[var(--ease-out-quart)]",
4369
+ microInteractions.overlay,
3859
4370
  "data-[state=closed]:opacity-0 data-[state=open]:opacity-100",
3860
- "motion-reduce:transition-none",
3861
4371
  className
3862
4372
  ),
3863
4373
  ...props
@@ -3876,16 +4386,17 @@ var DialogContent = React39.forwardRef(({ size = "md", showCloseButton = true, c
3876
4386
  DialogPrimitive.Content,
3877
4387
  {
3878
4388
  ref,
4389
+ ...slot(dialogAnatomy, "content"),
4390
+ ...stateAttributes({ size }),
3879
4391
  className: cn(
3880
4392
  "fixed top-1/2 left-1/2 z-[var(--z-modal)] w-full",
3881
4393
  "scrollbar-thin max-h-[calc(100vh-6rem)] overflow-y-auto",
3882
4394
  "rounded-card border-rule bg-surface shadow-pop border p-6",
3883
4395
  "font-body text-fg",
3884
4396
  // motion: scale + fade keyed off data-state
3885
- "transition-[opacity,transform] duration-[var(--duration-overlay)] ease-[var(--ease-out-quart)]",
4397
+ microInteractions.overlay,
3886
4398
  "data-[state=closed]:-translate-x-1/2 data-[state=closed]:-translate-y-[48%] data-[state=closed]:scale-95 data-[state=closed]:opacity-0",
3887
4399
  "data-[state=open]:-translate-x-1/2 data-[state=open]:-translate-y-1/2 data-[state=open]:scale-100 data-[state=open]:opacity-100",
3888
- "motion-reduce:transition-none",
3889
4400
  dialogSizeStyles[size],
3890
4401
  className
3891
4402
  ),
@@ -3895,6 +4406,7 @@ var DialogContent = React39.forwardRef(({ size = "md", showCloseButton = true, c
3895
4406
  showCloseButton && /* @__PURE__ */ jsx(
3896
4407
  DialogPrimitive.Close,
3897
4408
  {
4409
+ ...slot(dialogAnatomy, "close"),
3898
4410
  className: cn(
3899
4411
  "absolute top-4 right-4 inline-flex size-7 items-center justify-center",
3900
4412
  "rounded-icon text-fg-4 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
@@ -3911,13 +4423,29 @@ var DialogContent = React39.forwardRef(({ size = "md", showCloseButton = true, c
3911
4423
  )
3912
4424
  ] }));
3913
4425
  DialogContent.displayName = DialogPrimitive.Content.displayName;
3914
- var DialogClose = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Close, { ref, className: cn(className), ...props }));
4426
+ var DialogClose = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
4427
+ DialogPrimitive.Close,
4428
+ {
4429
+ ref,
4430
+ ...slot(dialogAnatomy, "close"),
4431
+ className: cn(className),
4432
+ ...props
4433
+ }
4434
+ ));
3915
4435
  DialogClose.displayName = "DialogClose";
3916
- var DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("mb-4 flex flex-col gap-1.5 pr-8", className), ...props });
4436
+ var DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx(
4437
+ "div",
4438
+ {
4439
+ ...slot(dialogAnatomy, "header"),
4440
+ className: cn("mb-4 flex flex-col gap-1.5 pr-8", className),
4441
+ ...props
4442
+ }
4443
+ );
3917
4444
  DialogHeader.displayName = "DialogHeader";
3918
4445
  var DialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
3919
4446
  "div",
3920
4447
  {
4448
+ ...slot(dialogAnatomy, "footer"),
3921
4449
  className: cn(
3922
4450
  "mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:items-center sm:justify-end",
3923
4451
  className
@@ -3930,6 +4458,7 @@ var DialogTitle = React39.forwardRef(({ className, ...props }, ref) => /* @__PUR
3930
4458
  DialogPrimitive.Title,
3931
4459
  {
3932
4460
  ref,
4461
+ ...slot(dialogAnatomy, "title"),
3933
4462
  className: cn(
3934
4463
  "font-display text-fg text-base leading-tight font-medium tracking-tight",
3935
4464
  className
@@ -3942,6 +4471,7 @@ var DialogDescription = React39.forwardRef(({ className, ...props }, ref) => /*
3942
4471
  DialogPrimitive.Description,
3943
4472
  {
3944
4473
  ref,
4474
+ ...slot(dialogAnatomy, "description"),
3945
4475
  className: cn("text-fg-3 text-sm", className),
3946
4476
  ...props
3947
4477
  }
@@ -4199,6 +4729,7 @@ var ContextMenuSubTrigger = React39.forwardRef(({ className, inset, children, ..
4199
4729
  ContextMenuPrimitive.SubTrigger,
4200
4730
  {
4201
4731
  ref,
4732
+ ...slot(contextMenuAnatomy, "sub-trigger"),
4202
4733
  className: cn(
4203
4734
  "rounded-pill flex cursor-default items-center gap-2 px-2 py-1.5 text-sm outline-none select-none",
4204
4735
  "text-fg-2 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
@@ -4226,6 +4757,7 @@ var ContextMenuSubContent = React39.forwardRef(({ className, ...props }, ref) =>
4226
4757
  ContextMenuPrimitive.SubContent,
4227
4758
  {
4228
4759
  ref,
4760
+ ...slot(contextMenuAnatomy, "sub-content"),
4229
4761
  className: cn(
4230
4762
  "rounded-card border-rule bg-surface text-fg shadow-pop z-[var(--z-dropdown)] min-w-[8rem] overflow-hidden border p-1",
4231
4763
  "transition-[opacity,transform] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
@@ -4243,6 +4775,7 @@ var ContextMenuContent = React39.forwardRef(({ className, ...props }, ref) => /*
4243
4775
  ContextMenuPrimitive.Content,
4244
4776
  {
4245
4777
  ref,
4778
+ ...slot(contextMenuAnatomy, "content"),
4246
4779
  className: cn(
4247
4780
  "rounded-card border-rule bg-surface text-fg shadow-pop z-[var(--z-dropdown)] min-w-[10rem] overflow-hidden border p-1",
4248
4781
  "transition-[opacity,transform] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
@@ -4259,6 +4792,7 @@ var ContextMenuItem = React39.forwardRef(({ className, destructive, inset, ...pr
4259
4792
  ContextMenuPrimitive.Item,
4260
4793
  {
4261
4794
  ref,
4795
+ ...slot(contextMenuAnatomy, "item"),
4262
4796
  className: cn(
4263
4797
  "rounded-pill relative flex cursor-default items-center gap-2 px-2 py-1.5 text-sm outline-none select-none",
4264
4798
  "text-fg-2 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
@@ -4277,6 +4811,7 @@ var ContextMenuCheckboxItem = React39.forwardRef(({ className, children, checked
4277
4811
  ContextMenuPrimitive.CheckboxItem,
4278
4812
  {
4279
4813
  ref,
4814
+ ...slot(contextMenuAnatomy, "checkbox-item"),
4280
4815
  checked,
4281
4816
  className: cn(
4282
4817
  "rounded-pill relative flex cursor-default items-center gap-2 py-1.5 pr-2 pl-8 text-sm outline-none select-none",
@@ -4287,7 +4822,7 @@ var ContextMenuCheckboxItem = React39.forwardRef(({ className, children, checked
4287
4822
  ),
4288
4823
  ...props,
4289
4824
  children: [
4290
- /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5", "aria-hidden": "true" }) }) }),
4825
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { ...slot(contextMenuAnatomy, "item-indicator"), children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5", "aria-hidden": "true" }) }) }),
4291
4826
  children
4292
4827
  ]
4293
4828
  }
@@ -4297,6 +4832,7 @@ var ContextMenuRadioItem = React39.forwardRef(({ className, children, ...props }
4297
4832
  ContextMenuPrimitive.RadioItem,
4298
4833
  {
4299
4834
  ref,
4835
+ ...slot(contextMenuAnatomy, "radio-item"),
4300
4836
  className: cn(
4301
4837
  "rounded-pill relative flex cursor-default items-center gap-2 py-1.5 pr-2 pl-8 text-sm outline-none select-none",
4302
4838
  "text-fg-2 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
@@ -4306,7 +4842,7 @@ var ContextMenuRadioItem = React39.forwardRef(({ className, children, ...props }
4306
4842
  ),
4307
4843
  ...props,
4308
4844
  children: [
4309
- /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CircleIcon, { className: "size-2 fill-current", "aria-hidden": "true" }) }) }),
4845
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx(ContextMenuPrimitive.ItemIndicator, { ...slot(contextMenuAnatomy, "item-indicator"), children: /* @__PURE__ */ jsx(CircleIcon, { className: "size-2 fill-current", "aria-hidden": "true" }) }) }),
4310
4846
  children
4311
4847
  ]
4312
4848
  }
@@ -4316,6 +4852,7 @@ var ContextMenuLabel = React39.forwardRef(({ className, inset, ...props }, ref)
4316
4852
  ContextMenuPrimitive.Label,
4317
4853
  {
4318
4854
  ref,
4855
+ ...slot(contextMenuAnatomy, "label"),
4319
4856
  className: cn(
4320
4857
  "text-fg-3 px-2 py-1.5 font-mono text-[11px] tracking-wider uppercase",
4321
4858
  inset && "pl-8",
@@ -4329,6 +4866,7 @@ var ContextMenuSeparator = React39.forwardRef(({ className, ...props }, ref) =>
4329
4866
  ContextMenuPrimitive.Separator,
4330
4867
  {
4331
4868
  ref,
4869
+ ...slot(contextMenuAnatomy, "separator"),
4332
4870
  className: cn("bg-rule -mx-1 my-1 h-px", className),
4333
4871
  ...props
4334
4872
  }
@@ -4427,12 +4965,12 @@ var PopoverContent = React39.forwardRef(({ className, align = "center", side = "
4427
4965
  align,
4428
4966
  side,
4429
4967
  sideOffset,
4968
+ ...slot(popoverAnatomy, "content"),
4430
4969
  className: cn(
4431
4970
  "rounded-card border-rule bg-surface text-fg shadow-pop z-[var(--z-dropdown)] w-72 border p-4 outline-none",
4432
- "transition-[opacity,transform] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
4971
+ microInteractions.overlay,
4433
4972
  "data-[state=closed]:scale-95 data-[state=closed]:opacity-0",
4434
4973
  "data-[state=open]:scale-100 data-[state=open]:opacity-100",
4435
- "motion-reduce:transition-none",
4436
4974
  className
4437
4975
  ),
4438
4976
  ...props
@@ -4545,7 +5083,9 @@ var DatePicker = forwardRef(function DatePicker2({
4545
5083
  "aria-label": ariaLabel,
4546
5084
  picker = "day",
4547
5085
  formatLabel,
4548
- iconPosition = "right"
5086
+ iconPosition = "right",
5087
+ captionLayout = "dropdown",
5088
+ inputClassName
4549
5089
  }, ref) {
4550
5090
  const isYearMode = picker === "year";
4551
5091
  const hasCustomYearLabel = isYearMode && !!formatLabel;
@@ -4666,7 +5206,8 @@ var DatePicker = forwardRef(function DatePicker2({
4666
5206
  "disabled:bg-bg-disabled disabled:text-fg-disabled disabled:cursor-not-allowed",
4667
5207
  "aria-[invalid=true]:border-danger-line aria-[invalid=true]:focus-visible:border-danger-fg",
4668
5208
  "aria-[invalid=true]:focus-visible:[box-shadow:0_0_0_2px_var(--color-danger-bg)]",
4669
- hasCustomYearLabel && "cursor-pointer"
5209
+ hasCustomYearLabel && "cursor-pointer",
5210
+ inputClassName
4670
5211
  )
4671
5212
  }
4672
5213
  ),
@@ -4715,6 +5256,7 @@ var DatePicker = forwardRef(function DatePicker2({
4715
5256
  minDate,
4716
5257
  maxDate,
4717
5258
  defaultMonth: selectedDate ?? minDate ?? void 0,
5259
+ captionLayout,
4718
5260
  autoFocus: true
4719
5261
  }
4720
5262
  )
@@ -4743,7 +5285,8 @@ var DateRangePicker = forwardRef(
4743
5285
  min,
4744
5286
  max,
4745
5287
  iconPosition = "right",
4746
- "aria-label": ariaLabel
5288
+ "aria-label": ariaLabel,
5289
+ captionLayout = "dropdown"
4747
5290
  }, ref) {
4748
5291
  const generatedId = useId();
4749
5292
  const id = providedId ?? generatedId;
@@ -4802,6 +5345,14 @@ var DateRangePicker = forwardRef(
4802
5345
  to: isoToDate(current.to ?? "")
4803
5346
  };
4804
5347
  const selectedRange = draftRange ?? committedRange;
5348
+ const navRange = useMemo(
5349
+ () => captionLayout === "label" ? void 0 : resolveCalendarNavRange({
5350
+ minDate,
5351
+ maxDate,
5352
+ selected: [selectedRange.from, selectedRange.to]
5353
+ }),
5354
+ [captionLayout, minDate, maxDate, selectedRange.from, selectedRange.to]
5355
+ );
4805
5356
  const disabledMatcher = (() => {
4806
5357
  if (!minDate && !maxDate) return void 0;
4807
5358
  if (minDate && maxDate) return [{ before: minDate }, { after: maxDate }];
@@ -4878,38 +5429,25 @@ var DateRangePicker = forwardRef(
4878
5429
  mode: "range",
4879
5430
  numberOfMonths: 2,
4880
5431
  navLayout: "around",
5432
+ captionLayout,
5433
+ startMonth: navRange?.startMonth,
5434
+ endMonth: navRange?.endMonth,
4881
5435
  selected: selectedRange.from ? { from: selectedRange.from, to: selectedRange.to } : void 0,
4882
5436
  onSelect: handleCalendarSelect,
4883
5437
  disabled: disabledMatcher,
4884
5438
  showOutsideDays: true,
4885
5439
  autoFocus: true,
4886
5440
  defaultMonth: selectedRange.from ?? minDate ?? void 0,
4887
- components: {
4888
- Chevron: ({ orientation, className: chevClass }) => {
4889
- const Icon3 = orientation === "right" ? ChevronRightIcon : ChevronLeftIcon;
4890
- return /* @__PURE__ */ jsx(Icon3, { className: cn("text-fg-3 size-4", chevClass), "aria-hidden": "true" });
4891
- }
4892
- },
5441
+ components: CALENDAR_CAPTION_COMPONENTS,
4893
5442
  className: "font-body text-fg select-none",
4894
5443
  classNames: {
4895
5444
  root: "p-3",
4896
5445
  months: "flex flex-col gap-6 sm:flex-row sm:gap-4",
4897
- month: "relative space-y-3 w-[16rem] flex-none",
4898
- // With navLayout="around", the chevron buttons live inside
4899
- // the caption row, one on each side of the month title.
4900
- // The caption row distributes them via space-between so
4901
- // each chevron stays in its natural inline flow — no
4902
- // absolute positioning gymnastics.
4903
- month_caption: "flex h-7 items-center justify-center font-display text-[13px] font-medium text-fg",
4904
- caption_label: "tabular-nums",
4905
- nav: "contents",
4906
- // navLayout="around" renders Prev as a sibling BEFORE the
4907
- // left month's caption, and Next as a sibling AFTER the
4908
- // right month's caption. Absolute-position each so they
4909
- // sit at their own month's top corners without disturbing
4910
- // the centered caption row.
4911
- button_previous: "absolute left-0 top-0 z-10 inline-flex size-7 items-center justify-center rounded-input text-fg-3 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none hover:bg-bg-2 hover:text-fg focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)] disabled:cursor-not-allowed disabled:text-fg-disabled disabled:pointer-events-none",
4912
- button_next: "absolute right-0 top-0 z-10 inline-flex size-7 items-center justify-center rounded-input text-fg-3 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none hover:bg-bg-2 hover:text-fg focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)] disabled:cursor-not-allowed disabled:text-fg-disabled disabled:pointer-events-none",
5446
+ ...CALENDAR_CAPTION_CLASSNAMES,
5447
+ // Two side-by-side months; each keeps the shared relative
5448
+ // caption/nav contract and a fixed width.
5449
+ month: cn(CALENDAR_CAPTION_CLASSNAMES.month, "w-[16rem] flex-none"),
5450
+ month_caption: cn(CALENDAR_CAPTION_CLASSNAMES.month_caption, "text-[13px]"),
4913
5451
  month_grid: "w-full border-collapse",
4914
5452
  weekdays: "flex",
4915
5453
  weekday: "flex-1 text-center text-[11px] font-medium uppercase tracking-wide text-fg-4 pb-1",
@@ -4956,8 +5494,8 @@ var chipVariants = cva(
4956
5494
  {
4957
5495
  variants: {
4958
5496
  variant: {
4959
- primary: "bg-primary/10 text-primary hover:bg-primary/15",
4960
- neutral: "bg-muted text-fg-2 hover:bg-muted/80"
5497
+ primary: "bg-brand-bg text-brand hover:bg-brand-bg-hover",
5498
+ neutral: "bg-bg-2 text-fg-2 hover:bg-bg-3"
4961
5499
  }
4962
5500
  },
4963
5501
  defaultVariants: {
@@ -5172,6 +5710,7 @@ var DropdownMenuSubTrigger = React39.forwardRef(({ className, inset, children, .
5172
5710
  DropdownMenuPrimitive.SubTrigger,
5173
5711
  {
5174
5712
  ref,
5713
+ ...slot(dropdownMenuAnatomy, "sub-trigger"),
5175
5714
  className: cn(
5176
5715
  "rounded-pill flex cursor-default items-center gap-2 px-2 py-1.5 text-sm outline-none select-none",
5177
5716
  "text-menu-item-fg transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
@@ -5199,6 +5738,7 @@ var DropdownMenuSubContent = React39.forwardRef(({ className, ...props }, ref) =
5199
5738
  DropdownMenuPrimitive.SubContent,
5200
5739
  {
5201
5740
  ref,
5741
+ ...slot(dropdownMenuAnatomy, "sub-content"),
5202
5742
  className: cn(
5203
5743
  "rounded-card border-menu-border bg-menu-bg text-menu-fg shadow-pop z-[var(--z-dropdown)] min-w-[8rem] overflow-hidden border p-1",
5204
5744
  "transition-[opacity,transform] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
@@ -5216,6 +5756,7 @@ var DropdownMenuContent = React39.forwardRef(({ className, sideOffset = 6, align
5216
5756
  DropdownMenuPrimitive.Content,
5217
5757
  {
5218
5758
  ref,
5759
+ ...slot(dropdownMenuAnatomy, "content"),
5219
5760
  sideOffset,
5220
5761
  align,
5221
5762
  className: cn(
@@ -5234,6 +5775,7 @@ var DropdownMenuItem = React39.forwardRef(({ className, destructive, inset, ...p
5234
5775
  DropdownMenuPrimitive.Item,
5235
5776
  {
5236
5777
  ref,
5778
+ ...slot(dropdownMenuAnatomy, "item"),
5237
5779
  className: cn(
5238
5780
  "rounded-pill relative flex cursor-default items-center gap-2 px-2 py-1.5 text-sm outline-none select-none",
5239
5781
  "text-menu-item-fg transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
@@ -5252,6 +5794,7 @@ var DropdownMenuCheckboxItem = React39.forwardRef(({ className, children, checke
5252
5794
  DropdownMenuPrimitive.CheckboxItem,
5253
5795
  {
5254
5796
  ref,
5797
+ ...slot(dropdownMenuAnatomy, "checkbox-item"),
5255
5798
  checked,
5256
5799
  className: cn(
5257
5800
  "rounded-pill relative flex cursor-default items-center gap-2 py-1.5 pr-2 pl-8 text-sm outline-none select-none",
@@ -5262,7 +5805,7 @@ var DropdownMenuCheckboxItem = React39.forwardRef(({ className, children, checke
5262
5805
  ),
5263
5806
  ...props,
5264
5807
  children: [
5265
- /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5", "aria-hidden": "true" }) }) }),
5808
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { ...slot(dropdownMenuAnatomy, "item-indicator"), children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5", "aria-hidden": "true" }) }) }),
5266
5809
  children
5267
5810
  ]
5268
5811
  }
@@ -5272,6 +5815,7 @@ var DropdownMenuRadioItem = React39.forwardRef(({ className, children, ...props
5272
5815
  DropdownMenuPrimitive.RadioItem,
5273
5816
  {
5274
5817
  ref,
5818
+ ...slot(dropdownMenuAnatomy, "radio-item"),
5275
5819
  className: cn(
5276
5820
  "rounded-pill relative flex cursor-default items-center gap-2 py-1.5 pr-2 pl-8 text-sm outline-none select-none",
5277
5821
  "text-menu-item-fg transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
@@ -5281,7 +5825,7 @@ var DropdownMenuRadioItem = React39.forwardRef(({ className, children, ...props
5281
5825
  ),
5282
5826
  ...props,
5283
5827
  children: [
5284
- /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CircleIcon, { className: "size-2 fill-current", "aria-hidden": "true" }) }) }),
5828
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { ...slot(dropdownMenuAnatomy, "item-indicator"), children: /* @__PURE__ */ jsx(CircleIcon, { className: "size-2 fill-current", "aria-hidden": "true" }) }) }),
5285
5829
  children
5286
5830
  ]
5287
5831
  }
@@ -5291,6 +5835,7 @@ var DropdownMenuLabel = React39.forwardRef(({ className, inset, ...props }, ref)
5291
5835
  DropdownMenuPrimitive.Label,
5292
5836
  {
5293
5837
  ref,
5838
+ ...slot(dropdownMenuAnatomy, "label"),
5294
5839
  className: cn(
5295
5840
  "text-menu-label-fg px-2 py-1.5 font-mono text-[11px] tracking-wider uppercase",
5296
5841
  inset && "pl-8",
@@ -5304,6 +5849,7 @@ var DropdownMenuSeparator = React39.forwardRef(({ className, ...props }, ref) =>
5304
5849
  DropdownMenuPrimitive.Separator,
5305
5850
  {
5306
5851
  ref,
5852
+ ...slot(dropdownMenuAnatomy, "separator"),
5307
5853
  className: cn("bg-menu-border -mx-1 my-1 h-px", className),
5308
5854
  ...props
5309
5855
  }
@@ -5312,6 +5858,7 @@ DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
5312
5858
  var DropdownMenuShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx(
5313
5859
  "span",
5314
5860
  {
5861
+ ...slot(dropdownMenuAnatomy, "shortcut"),
5315
5862
  className: cn("text-menu-shortcut-fg ml-auto font-mono text-[11px] tracking-wider", className),
5316
5863
  ...props
5317
5864
  }
@@ -5395,6 +5942,7 @@ function FileUpload({
5395
5942
  const inputId = useId();
5396
5943
  const [isDragOver, setIsDragOver] = useState(false);
5397
5944
  const [error, setError] = useState(null);
5945
+ const wrapperOwnsFocus = props.tabIndex !== void 0 || props.role !== void 0;
5398
5946
  const validateFiles = useCallback(
5399
5947
  (files) => {
5400
5948
  setError(null);
@@ -5431,78 +5979,105 @@ function FileUpload({
5431
5979
  if (disabled) return;
5432
5980
  handleFiles(e.dataTransfer.files);
5433
5981
  }
5434
- return /* @__PURE__ */ jsxs("div", { className: cn("w-full", className), ...props, children: [
5435
- /* @__PURE__ */ jsxs(
5436
- "label",
5437
- {
5438
- htmlFor: inputId,
5439
- onDragOver: (e) => {
5440
- e.preventDefault();
5441
- if (!disabled) setIsDragOver(true);
5442
- },
5443
- onDragLeave: () => setIsDragOver(false),
5444
- onDrop: handleDrop,
5445
- className: cn(
5446
- "flex flex-col items-center justify-center gap-2",
5447
- "rounded-card border-rule-strong bg-surface border border-dashed",
5448
- "font-body p-8 text-center",
5449
- "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
5450
- "motion-reduce:transition-none",
5451
- // Hover (when not disabled)
5452
- !disabled && "hover:border-brand-line hover:bg-brand-bg/40",
5453
- // Drag-over → Pro purple highlight
5454
- isDragOver && "border-brand-line bg-brand-bg",
5455
- disabled && "border-rule bg-bg-disabled text-fg-disabled cursor-not-allowed",
5456
- !disabled && "cursor-pointer"
5457
- ),
5458
- children: [
5459
- /* @__PURE__ */ jsx(
5460
- "input",
5461
- {
5462
- ref: inputRef,
5463
- id: inputId,
5464
- type: "file",
5465
- accept,
5466
- multiple,
5467
- onChange: (e) => {
5468
- if (e.target.files) handleFiles(e.target.files);
5469
- e.target.value = "";
5470
- },
5471
- className: "fixed -top-[9999px] -left-[9999px] opacity-0",
5472
- disabled,
5473
- tabIndex: -1
5474
- }
5475
- ),
5476
- children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
5477
- /* @__PURE__ */ jsx(
5478
- "div",
5479
- {
5480
- className: cn(
5481
- "rounded-icon flex size-10 items-center justify-center transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
5482
- isDragOver ? "bg-brand text-fg-on-brand" : "bg-brand-bg text-brand"
5483
- ),
5484
- "aria-hidden": "true",
5485
- children: /* @__PURE__ */ jsx(UploadIcon, { className: "size-5" })
5486
- }
5982
+ return /* @__PURE__ */ jsxs(
5983
+ "div",
5984
+ {
5985
+ ...slot(fileUploadAnatomy, "root"),
5986
+ ...stateAttributes({ disabled, invalid: !!error }),
5987
+ className: cn("w-full", className),
5988
+ ...props,
5989
+ children: [
5990
+ /* @__PURE__ */ jsxs(
5991
+ "label",
5992
+ {
5993
+ htmlFor: inputId,
5994
+ ...slot(fileUploadAnatomy, "dropzone"),
5995
+ ...stateAttributes({ disabled, state: isDragOver ? "drag-over" : void 0 }),
5996
+ onDragOver: (e) => {
5997
+ e.preventDefault();
5998
+ if (!disabled) setIsDragOver(true);
5999
+ },
6000
+ onDragLeave: () => setIsDragOver(false),
6001
+ onDrop: handleDrop,
6002
+ className: cn(
6003
+ "flex flex-col items-center justify-center gap-2",
6004
+ "rounded-card border-rule-strong bg-surface border border-dashed",
6005
+ "font-body p-8 text-center",
6006
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
6007
+ "motion-reduce:transition-none",
6008
+ // Hover (when not disabled)
6009
+ !disabled && "hover:border-brand-line hover:bg-brand-bg/40",
6010
+ // Drag-over → Pro purple highlight
6011
+ isDragOver && "border-brand-line bg-brand-bg",
6012
+ disabled && "border-rule bg-bg-disabled text-fg-disabled cursor-not-allowed",
6013
+ !disabled && "cursor-pointer",
6014
+ // Keyboard focus lands on the (visually hidden) file input.
6015
+ "has-[input:focus-visible]:[box-shadow:var(--shadow-focus-ring)]"
5487
6016
  ),
5488
- /* @__PURE__ */ jsxs("div", { className: "text-fg-3 text-sm", children: [
5489
- /* @__PURE__ */ jsx("span", { className: "text-fg font-medium", children: "Click to upload" }),
5490
- " or drag and drop"
5491
- ] }),
5492
- accept && /* @__PURE__ */ jsxs("p", { className: "text-fg-4 font-mono text-[10.5px]", children: [
5493
- "Accepted: ",
5494
- accept
5495
- ] }),
5496
- maxSize && /* @__PURE__ */ jsxs("p", { className: "text-fg-4 font-mono text-[10.5px]", children: [
5497
- "Max size: ",
5498
- formatBytes(maxSize)
5499
- ] })
5500
- ] })
5501
- ]
5502
- }
5503
- ),
5504
- error && /* @__PURE__ */ jsx("p", { role: "alert", className: "text-danger-fg mt-2 text-sm", children: error })
5505
- ] });
6017
+ children: [
6018
+ /* @__PURE__ */ jsx(
6019
+ "input",
6020
+ {
6021
+ ref: inputRef,
6022
+ id: inputId,
6023
+ type: "file",
6024
+ ...slot(fileUploadAnatomy, "input"),
6025
+ accept,
6026
+ multiple,
6027
+ onChange: (e) => {
6028
+ if (e.target.files) handleFiles(e.target.files);
6029
+ e.target.value = "";
6030
+ },
6031
+ className: "fixed -top-[9999px] -left-[9999px] opacity-0",
6032
+ onKeyDown: (e) => {
6033
+ if (e.key !== "Enter" && e.key !== " ") return;
6034
+ e.preventDefault();
6035
+ e.currentTarget.click();
6036
+ },
6037
+ disabled,
6038
+ tabIndex: wrapperOwnsFocus ? -1 : void 0
6039
+ }
6040
+ ),
6041
+ children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
6042
+ /* @__PURE__ */ jsx(
6043
+ "div",
6044
+ {
6045
+ className: cn(
6046
+ "rounded-icon flex size-10 items-center justify-center transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
6047
+ isDragOver ? "bg-brand text-fg-on-brand" : "bg-brand-bg text-brand"
6048
+ ),
6049
+ "aria-hidden": "true",
6050
+ children: /* @__PURE__ */ jsx(UploadIcon, { className: "size-5" })
6051
+ }
6052
+ ),
6053
+ /* @__PURE__ */ jsxs("div", { className: "text-fg-3 text-sm", children: [
6054
+ /* @__PURE__ */ jsx("span", { className: "text-fg font-medium", children: "Click to upload" }),
6055
+ " or drag and drop"
6056
+ ] }),
6057
+ accept && /* @__PURE__ */ jsxs("p", { className: "text-fg-4 font-mono text-[10.5px]", children: [
6058
+ "Accepted: ",
6059
+ accept
6060
+ ] }),
6061
+ maxSize && /* @__PURE__ */ jsxs("p", { className: "text-fg-4 font-mono text-[10.5px]", children: [
6062
+ "Max size: ",
6063
+ formatBytes(maxSize)
6064
+ ] })
6065
+ ] })
6066
+ ]
6067
+ }
6068
+ ),
6069
+ error && /* @__PURE__ */ jsx(
6070
+ "p",
6071
+ {
6072
+ role: "alert",
6073
+ ...slot(fileUploadAnatomy, "error"),
6074
+ className: "text-danger-fg mt-2 text-sm",
6075
+ children: error
6076
+ }
6077
+ )
6078
+ ]
6079
+ }
6080
+ );
5506
6081
  }
5507
6082
  function formatBytes(bytes) {
5508
6083
  if (bytes < 1024) return `${bytes} B`;
@@ -5609,7 +6184,7 @@ IconTile.displayName = "IconTile";
5609
6184
  var inputVariants = cva(
5610
6185
  [
5611
6186
  "flex w-full rounded-input border bg-surface font-body text-fg",
5612
- "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)]",
6187
+ microInteractions.control,
5613
6188
  "placeholder:text-fg-4",
5614
6189
  "focus-visible:outline-none focus-visible:[border-color:var(--focus-ring-border)]",
5615
6190
  "focus-visible:[box-shadow:var(--shadow-focus-ring)]",
@@ -5627,7 +6202,10 @@ var inputVariants = cva(
5627
6202
  inputSize: {
5628
6203
  sm: "h-8 px-2.5 py-1 text-xs",
5629
6204
  md: "h-9 px-3 py-2 text-[13px]",
5630
- lg: "h-11 px-3.5 py-2.5 text-sm"
6205
+ lg: "h-11 px-3.5 py-2.5 text-sm",
6206
+ compact: "h-8 px-2.5 py-1 text-[13px]",
6207
+ default: "h-10 px-3 py-2 text-sm",
6208
+ comfortable: "h-12 px-3.5 py-2.5 text-base"
5631
6209
  }
5632
6210
  },
5633
6211
  defaultVariants: {
@@ -5639,7 +6217,10 @@ var inputVariants = cva(
5639
6217
  var floatingLabelSize = {
5640
6218
  sm: "text-xs",
5641
6219
  md: "text-[13px]",
5642
- lg: "text-sm"
6220
+ lg: "text-sm",
6221
+ compact: "text-[13px]",
6222
+ default: "text-sm",
6223
+ comfortable: "text-base"
5643
6224
  };
5644
6225
  var Input = forwardRef(function Input2({
5645
6226
  label,
@@ -5653,6 +6234,7 @@ var Input = forwardRef(function Input2({
5653
6234
  className,
5654
6235
  id: providedId,
5655
6236
  placeholder,
6237
+ onWheel,
5656
6238
  ...props
5657
6239
  }, ref) {
5658
6240
  const generatedId = useId();
@@ -5663,12 +6245,25 @@ var Input = forwardRef(function Input2({
5663
6245
  const inputType = isPassword && showPassword ? "text" : type;
5664
6246
  const isFloating = !!floatingLabel && !!label;
5665
6247
  const resolvedPlaceholder = isFloating ? placeholder ?? " " : placeholder;
6248
+ const handleWheel = inputType === "number" ? (event) => {
6249
+ onWheel?.(event);
6250
+ if (!event.defaultPrevented) event.currentTarget.blur();
6251
+ } : onWheel;
5666
6252
  return /* @__PURE__ */ jsxs("div", { className: "w-full", children: [
5667
- label && !isFloating && /* @__PURE__ */ jsx("label", { htmlFor: id, className: "text-fg mb-1.5 block text-[13px] leading-none font-medium", children: label }),
6253
+ label && !isFloating && /* @__PURE__ */ jsx(
6254
+ "label",
6255
+ {
6256
+ htmlFor: id,
6257
+ ...slot(inputAnatomy, "label"),
6258
+ className: "text-fg mb-1.5 block text-[13px] leading-none font-medium",
6259
+ children: label
6260
+ }
6261
+ ),
5668
6262
  /* @__PURE__ */ jsxs("div", { className: "relative", children: [
5669
6263
  prefixIcon && /* @__PURE__ */ jsx(
5670
6264
  "span",
5671
6265
  {
6266
+ ...slot(inputAnatomy, "icon-start"),
5672
6267
  className: "text-fg-4 pointer-events-none absolute top-1/2 left-3 -translate-y-1/2 [&>svg]:size-4",
5673
6268
  "aria-hidden": "true",
5674
6269
  children: prefixIcon
@@ -5683,13 +6278,21 @@ var Input = forwardRef(function Input2({
5683
6278
  placeholder: resolvedPlaceholder,
5684
6279
  "aria-invalid": !!error || void 0,
5685
6280
  "aria-describedby": error ? errorId : void 0,
6281
+ ...slot(inputAnatomy, "root"),
6282
+ ...stateAttributes({
6283
+ variant: variant ?? "default",
6284
+ size: inputSize ?? "md",
6285
+ disabled: props.disabled,
6286
+ invalid: !!error
6287
+ }),
5686
6288
  className: cn(
5687
6289
  inputVariants({ variant, inputSize }),
5688
6290
  prefixIcon && "pl-9",
5689
6291
  (suffixIcon || isPassword) && "pr-9",
5690
- isFloating && "peer placeholder:text-transparent focus:placeholder:text-fg-4",
6292
+ isFloating && "peer focus:placeholder:text-fg-4 placeholder:text-transparent",
5691
6293
  className
5692
6294
  ),
6295
+ onWheel: handleWheel,
5693
6296
  ...props
5694
6297
  }
5695
6298
  ),
@@ -5699,6 +6302,7 @@ var Input = forwardRef(function Input2({
5699
6302
  "label",
5700
6303
  {
5701
6304
  htmlFor: id,
6305
+ ...slot(inputAnatomy, "label"),
5702
6306
  className: cn(
5703
6307
  "pointer-events-none absolute left-3 origin-left px-1 leading-none",
5704
6308
  "bg-surface text-fg-4",
@@ -5724,22 +6328,32 @@ var Input = forwardRef(function Input2({
5724
6328
  {
5725
6329
  type: "button",
5726
6330
  onClick: () => setShowPassword((prev) => !prev),
6331
+ ...slot(inputAnatomy, "password-toggle"),
5727
6332
  className: "text-fg-4 hover:text-fg absolute top-1/2 right-2.5 -translate-y-1/2 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none motion-reduce:transition-none",
5728
6333
  "aria-label": showPassword ? "Hide password" : "Show password",
5729
- tabIndex: -1,
5730
6334
  children: showPassword ? /* @__PURE__ */ jsx(EyeOffIcon, { className: "size-4", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(EyeIcon, { className: "size-4", "aria-hidden": "true" })
5731
6335
  }
5732
6336
  ),
5733
6337
  suffixIcon && !isPassword && /* @__PURE__ */ jsx(
5734
6338
  "span",
5735
6339
  {
6340
+ ...slot(inputAnatomy, "icon-end"),
5736
6341
  className: "text-fg-4 pointer-events-none absolute top-1/2 right-3 -translate-y-1/2 [&>svg]:size-4",
5737
6342
  "aria-hidden": "true",
5738
6343
  children: suffixIcon
5739
6344
  }
5740
6345
  )
5741
6346
  ] }),
5742
- error && /* @__PURE__ */ jsx("p", { id: errorId, role: "alert", className: "text-danger-fg mt-1.5 text-xs", children: error })
6347
+ error && /* @__PURE__ */ jsx(
6348
+ "p",
6349
+ {
6350
+ id: errorId,
6351
+ role: "alert",
6352
+ ...slot(inputAnatomy, "error"),
6353
+ className: "text-danger-fg mt-1.5 text-xs",
6354
+ children: error
6355
+ }
6356
+ )
5743
6357
  ] });
5744
6358
  });
5745
6359
  Input.displayName = "Input";
@@ -5822,10 +6436,27 @@ var labelVariants = cva(
5822
6436
  );
5823
6437
  var Label4 = React39.forwardRef(
5824
6438
  function Label5({ children, required, className, ...props }, ref) {
5825
- return /* @__PURE__ */ jsxs(LabelPrimitive.Root, { ref, className: cn(labelVariants(), className), ...props, children: [
5826
- children,
5827
- required && /* @__PURE__ */ jsx("span", { className: "text-danger-fg ml-0.5", "aria-hidden": "true", children: "*" })
5828
- ] });
6439
+ return /* @__PURE__ */ jsxs(
6440
+ LabelPrimitive.Root,
6441
+ {
6442
+ ref,
6443
+ ...slot(labelAnatomy, "root"),
6444
+ className: cn(labelVariants(), className),
6445
+ ...props,
6446
+ children: [
6447
+ children,
6448
+ required && /* @__PURE__ */ jsx(
6449
+ "span",
6450
+ {
6451
+ ...slot(labelAnatomy, "required"),
6452
+ className: "text-danger-fg ml-0.5",
6453
+ "aria-hidden": "true",
6454
+ children: "*"
6455
+ }
6456
+ )
6457
+ ]
6458
+ }
6459
+ );
5829
6460
  }
5830
6461
  );
5831
6462
  Label4.displayName = LabelPrimitive.Root.displayName;
@@ -5843,10 +6474,27 @@ var LinkButton = forwardRef(function LinkButton2({
5843
6474
  ...props
5844
6475
  }, ref) {
5845
6476
  const classes = cn(buttonVariants({ variant, size }), className);
6477
+ const root = { ...slot(linkButtonAnatomy, "root"), ...stateAttributes({ variant, size }) };
5846
6478
  const content = /* @__PURE__ */ jsxs(Fragment, { children: [
5847
- iconLeft && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconLeft }),
6479
+ iconLeft && /* @__PURE__ */ jsx(
6480
+ "span",
6481
+ {
6482
+ ...slot(linkButtonAnatomy, "icon-start"),
6483
+ className: "inline-flex shrink-0",
6484
+ "aria-hidden": "true",
6485
+ children: iconLeft
6486
+ }
6487
+ ),
5848
6488
  children,
5849
- iconRight && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconRight })
6489
+ iconRight && /* @__PURE__ */ jsx(
6490
+ "span",
6491
+ {
6492
+ ...slot(linkButtonAnatomy, "icon-end"),
6493
+ className: "inline-flex shrink-0",
6494
+ "aria-hidden": "true",
6495
+ children: iconRight
6496
+ }
6497
+ )
5850
6498
  ] });
5851
6499
  if (external) {
5852
6500
  const safeRel = rel ?? (target === "_blank" ? "noopener noreferrer" : void 0);
@@ -5855,6 +6503,7 @@ var LinkButton = forwardRef(function LinkButton2({
5855
6503
  {
5856
6504
  ref,
5857
6505
  href,
6506
+ ...root,
5858
6507
  className: classes,
5859
6508
  target,
5860
6509
  rel: safeRel,
@@ -5863,7 +6512,7 @@ var LinkButton = forwardRef(function LinkButton2({
5863
6512
  }
5864
6513
  );
5865
6514
  }
5866
- return /* @__PURE__ */ jsx(Link, { ref, href, className: classes, target, rel, ...props, children: content });
6515
+ return /* @__PURE__ */ jsx(Link, { ref, href, ...root, className: classes, target, rel, ...props, children: content });
5867
6516
  });
5868
6517
  LinkButton.displayName = "LinkButton";
5869
6518
  var Skeleton = forwardRef(function Skeleton2({ className, ...props }, ref) {
@@ -5871,7 +6520,7 @@ var Skeleton = forwardRef(function Skeleton2({ className, ...props }, ref) {
5871
6520
  "div",
5872
6521
  {
5873
6522
  ref,
5874
- className: cn("skeleton bg-bg-3 rounded-icon animate-pulse", className),
6523
+ className: cn("skeleton bg-bg-3 rounded-icon animate-pulse motion-reduce:animate-none", className),
5875
6524
  "aria-hidden": "true",
5876
6525
  ...props
5877
6526
  }
@@ -5883,7 +6532,7 @@ var SkeletonText = forwardRef(function SkeletonText2({ lines = 3, className, ...
5883
6532
  "div",
5884
6533
  {
5885
6534
  className: cn(
5886
- "skeleton bg-bg-3 rounded-icon h-4 animate-pulse",
6535
+ "skeleton bg-bg-3 rounded-icon h-4 animate-pulse motion-reduce:animate-none",
5887
6536
  i === lines - 1 && "w-3/4"
5888
6537
  )
5889
6538
  },
@@ -5897,7 +6546,7 @@ var SkeletonCircle = forwardRef(
5897
6546
  "div",
5898
6547
  {
5899
6548
  ref,
5900
- className: cn("skeleton bg-bg-3 animate-pulse rounded-full", className),
6549
+ className: cn("skeleton bg-bg-3 animate-pulse rounded-full motion-reduce:animate-none", className),
5901
6550
  style: { width: size, height: size },
5902
6551
  "aria-hidden": "true",
5903
6552
  ...props
@@ -6366,7 +7015,7 @@ function OTPInput({
6366
7015
  "has-[:disabled]:[&_[aria-hidden=true]]:border-rule",
6367
7016
  "has-[:disabled]:[&_[aria-hidden=true]]:text-fg-disabled"
6368
7017
  ),
6369
- render: ({ slots }) => /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2.5", role: "group", "aria-label": "One-time password", children: slots.map((slot, idx) => /* @__PURE__ */ jsx(OTPSlot, { ...slot, hasError: !!error }, idx)) })
7018
+ render: ({ slots }) => /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2.5", role: "group", "aria-label": "One-time password", children: slots.map((slot2, idx) => /* @__PURE__ */ jsx(OTPSlot, { ...slot2, hasError: !!error }, idx)) })
6370
7019
  }
6371
7020
  ),
6372
7021
  error && /* @__PURE__ */ jsx("p", { id: errorId, role: "alert", className: "text-danger-fg text-center text-xs", children: error })
@@ -6420,7 +7069,7 @@ function getPageNumbers(current, total, siblings) {
6420
7069
  }
6421
7070
  return [1, "ellipsis", ...range(leftSibling, rightSibling), "ellipsis", total];
6422
7071
  }
6423
- var NAV_BUTTON = cn(
7072
+ var NAV_BUTTON2 = cn(
6424
7073
  "inline-flex size-7 items-center justify-center rounded-btn text-fg-3",
6425
7074
  "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
6426
7075
  "hover:bg-bg-2 hover:text-fg",
@@ -6458,18 +7107,28 @@ var Pagination = forwardRef(function Pagination2({
6458
7107
  {
6459
7108
  ref,
6460
7109
  "aria-label": `Pagination, page ${currentPage} of ${totalPages}`,
7110
+ ...slot(paginationAnatomy, "root"),
6461
7111
  className: cn("flex items-center justify-between gap-4", className),
6462
7112
  ...props,
6463
7113
  children: [
6464
- /* @__PURE__ */ jsx("span", { className: "text-fg-4 shrink-0 font-mono text-[11px] tracking-[0.02em] tabular-nums", children: contextLabel }),
6465
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-0.5", children: [
7114
+ /* @__PURE__ */ jsx(
7115
+ "span",
7116
+ {
7117
+ ...slot(paginationAnatomy, "label"),
7118
+ className: "text-fg-4 shrink-0 font-mono text-[11px] tracking-[0.02em] tabular-nums",
7119
+ children: contextLabel
7120
+ }
7121
+ ),
7122
+ /* @__PURE__ */ jsxs("div", { ...slot(paginationAnatomy, "pages"), className: "flex items-center gap-0.5", children: [
6466
7123
  /* @__PURE__ */ jsx(
6467
7124
  "button",
6468
7125
  {
6469
7126
  type: "button",
6470
7127
  onClick: () => onPageChange(currentPage - 1),
6471
7128
  disabled: currentPage <= 1,
6472
- className: NAV_BUTTON,
7129
+ ...slot(paginationAnatomy, "previous"),
7130
+ ...stateAttributes({ disabled: currentPage <= 1 }),
7131
+ className: NAV_BUTTON2,
6473
7132
  "aria-label": "Previous page",
6474
7133
  children: /* @__PURE__ */ jsx(ChevronLeftIcon, { className: "size-3.5", "aria-hidden": "true" })
6475
7134
  }
@@ -6478,6 +7137,7 @@ var Pagination = forwardRef(function Pagination2({
6478
7137
  (page, i) => page === "ellipsis" ? /* @__PURE__ */ jsx(
6479
7138
  "span",
6480
7139
  {
7140
+ ...slot(paginationAnatomy, "ellipsis"),
6481
7141
  className: "text-fg-5 flex h-7 w-5 items-center justify-center select-none",
6482
7142
  "aria-hidden": "true",
6483
7143
  children: /* @__PURE__ */ jsx(MoreHorizontalIcon, { className: "size-3.5" })
@@ -6489,6 +7149,8 @@ var Pagination = forwardRef(function Pagination2({
6489
7149
  type: "button",
6490
7150
  onClick: () => onPageChange(page),
6491
7151
  "aria-current": page === currentPage ? "page" : void 0,
7152
+ ...slot(paginationAnatomy, "page"),
7153
+ ...stateAttributes({ selected: page === currentPage }),
6492
7154
  className: cn(
6493
7155
  PAGE_BUTTON_BASE,
6494
7156
  page === currentPage ? "bg-accent-tint text-accent-2 border border-[color:var(--color-accent-tint)]" : "text-fg-3 hover:bg-bg-2 hover:text-fg"
@@ -6504,7 +7166,9 @@ var Pagination = forwardRef(function Pagination2({
6504
7166
  type: "button",
6505
7167
  onClick: () => onPageChange(currentPage + 1),
6506
7168
  disabled: currentPage >= totalPages,
6507
- className: NAV_BUTTON,
7169
+ ...slot(paginationAnatomy, "next"),
7170
+ ...stateAttributes({ disabled: currentPage >= totalPages }),
7171
+ className: NAV_BUTTON2,
6508
7172
  "aria-label": "Next page",
6509
7173
  children: /* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-3.5", "aria-hidden": "true" })
6510
7174
  }
@@ -7016,11 +7680,11 @@ function CountrySelect({
7016
7680
  type: "button",
7017
7681
  disabled,
7018
7682
  "aria-label": "Select country code",
7019
- className: "rounded-input flex h-9 w-[90px] shrink-0 items-center gap-1.5 border border-input bg-input-background px-2.5 text-sm text-foreground focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)] disabled:cursor-not-allowed disabled:opacity-50",
7683
+ className: "rounded-input flex h-9 w-[90px] shrink-0 items-center gap-1.5 border border-rule-strong bg-surface px-2.5 text-sm text-fg transition-colors focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none motion-reduce:transition-none disabled:cursor-not-allowed disabled:bg-bg-disabled disabled:text-fg-disabled",
7020
7684
  children: [
7021
7685
  /* @__PURE__ */ jsx(CountryFlag, { iso: selected.iso }),
7022
- /* @__PURE__ */ jsx("span", { className: "text-xs tabular-nums text-muted-foreground", children: selected.dialCode }),
7023
- /* @__PURE__ */ jsx("svg", { className: "ml-auto size-3 shrink-0 text-muted-foreground", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }) })
7686
+ /* @__PURE__ */ jsx("span", { className: "text-xs tabular-nums text-fg-3", children: selected.dialCode }),
7687
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "ml-auto size-3 shrink-0 text-fg-3", "aria-hidden": "true" })
7024
7688
  ]
7025
7689
  }
7026
7690
  ) }),
@@ -7031,7 +7695,7 @@ function CountrySelect({
7031
7695
  align: "start",
7032
7696
  sideOffset: 4,
7033
7697
  style: { zIndex: 9999, minWidth: 248 },
7034
- className: "rounded-card border border-border bg-popover shadow-xl outline-none",
7698
+ className: "rounded-card border border-rule bg-surface shadow-xl outline-none motion-reduce:transition-none",
7035
7699
  onOpenAutoFocus: (e) => {
7036
7700
  e.preventDefault();
7037
7701
  searchRef.current?.focus({ preventScroll: true });
@@ -7041,11 +7705,8 @@ function CountrySelect({
7041
7705
  if (e.key !== "Escape") e.stopPropagation();
7042
7706
  },
7043
7707
  children: [
7044
- /* @__PURE__ */ jsx("div", { className: "rounded-t-card border-b border-border px-3 py-2.5", children: /* @__PURE__ */ jsxs("div", { className: "rounded-input flex items-center gap-2 border border-input bg-input-background px-2.5", children: [
7045
- /* @__PURE__ */ jsxs("svg", { className: "size-3.5 shrink-0 text-muted-foreground", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [
7046
- /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "8" }),
7047
- /* @__PURE__ */ jsx("path", { d: "m21 21-4.35-4.35" })
7048
- ] }),
7708
+ /* @__PURE__ */ jsx("div", { className: "rounded-t-card border-b border-rule px-3 py-2.5", children: /* @__PURE__ */ jsxs("div", { className: "rounded-input flex items-center gap-2 border border-rule-strong bg-surface px-2.5", children: [
7709
+ /* @__PURE__ */ jsx(SearchIcon, { className: "size-3.5 shrink-0 text-fg-3", "aria-hidden": "true" }),
7049
7710
  /* @__PURE__ */ jsx(
7050
7711
  "input",
7051
7712
  {
@@ -7054,7 +7715,7 @@ function CountrySelect({
7054
7715
  onChange: (e) => setSearch(e.target.value),
7055
7716
  onKeyDown: (e) => e.stopPropagation(),
7056
7717
  placeholder: "Search country or code...",
7057
- className: "h-8 flex-1 bg-transparent text-xs text-foreground placeholder:text-muted-foreground focus:outline-none"
7718
+ className: "h-8 flex-1 bg-transparent text-xs text-fg placeholder:text-fg-3 focus:outline-none"
7058
7719
  }
7059
7720
  )
7060
7721
  ] }) }),
@@ -7064,7 +7725,7 @@ function CountrySelect({
7064
7725
  className: "rounded-b-card max-h-56 overflow-y-auto",
7065
7726
  style: { overscrollBehavior: "contain" },
7066
7727
  onWheel: (e) => e.stopPropagation(),
7067
- children: filtered.length === 0 ? /* @__PURE__ */ jsx("p", { className: "px-4 py-3 text-center text-xs text-muted-foreground", children: "No countries found" }) : filtered.map((c) => /* @__PURE__ */ jsxs(
7728
+ children: filtered.length === 0 ? /* @__PURE__ */ jsx("p", { className: "px-4 py-3 text-center text-xs text-fg-3", children: "No countries found" }) : filtered.map((c) => /* @__PURE__ */ jsxs(
7068
7729
  "button",
7069
7730
  {
7070
7731
  type: "button",
@@ -7075,13 +7736,13 @@ function CountrySelect({
7075
7736
  setSearch("");
7076
7737
  },
7077
7738
  className: cn(
7078
- "flex w-full items-center gap-3 px-3 py-2 text-left transition-colors hover:bg-muted/60",
7079
- c.iso === value && "bg-primary/5"
7739
+ "flex w-full items-center gap-3 px-3 py-2 text-left transition-colors hover:bg-bg-2/60 motion-reduce:transition-none",
7740
+ c.iso === value && "bg-brand-bg"
7080
7741
  ),
7081
7742
  children: [
7082
7743
  /* @__PURE__ */ jsx(CountryFlag, { iso: c.iso }),
7083
- /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-xs text-foreground", children: c.name }),
7084
- /* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs tabular-nums text-muted-foreground", children: c.dialCode })
7744
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-xs text-fg", children: c.name }),
7745
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs tabular-nums text-fg-3", children: c.dialCode })
7085
7746
  ]
7086
7747
  },
7087
7748
  c.iso
@@ -7120,7 +7781,7 @@ function PhoneCountryInput({
7120
7781
  }
7121
7782
  )
7122
7783
  ] }),
7123
- error && /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-destructive", children: error })
7784
+ error && /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-danger-fg", children: error })
7124
7785
  ] });
7125
7786
  }
7126
7787
  var BARS = [
@@ -7182,7 +7843,7 @@ function PriorityIcon({ priority, size = 16, className, ...props }) {
7182
7843
  );
7183
7844
  }
7184
7845
  var progressBarVariants = cva(
7185
- "h-full rounded-full transition-[width,background-color] duration-[var(--duration-slow)] ease-[var(--ease-out-quart)]",
7846
+ cn("h-full rounded-full", microInteractions.progress),
7186
7847
  {
7187
7848
  variants: {
7188
7849
  variant: {
@@ -7222,7 +7883,7 @@ var ProgressBar = forwardRef(function ProgressBar2({ value, max = 100, label, sh
7222
7883
  {
7223
7884
  className: cn(
7224
7885
  progressBarVariants({ variant: resolvedVariant }),
7225
- isIndeterminate && "absolute inset-y-0 left-0 w-1/3 animate-[progress-indeterminate_1.4s_var(--ease-out-quart)_infinite]"
7886
+ isIndeterminate && "absolute inset-y-0 left-0 w-1/3 animate-[progress-indeterminate_1.4s_var(--ease-out-quart)_infinite] motion-reduce:animate-none"
7226
7887
  ),
7227
7888
  style: isIndeterminate ? void 0 : { width: `${percentage}%` }
7228
7889
  }
@@ -7239,7 +7900,7 @@ var ProgressBar = forwardRef(function ProgressBar2({ value, max = 100, label, sh
7239
7900
  });
7240
7901
  ProgressBar.displayName = "ProgressBar";
7241
7902
  var progressRingVariants = cva(
7242
- "transition-[stroke-dashoffset,stroke] duration-[var(--duration-slow)] ease-[var(--ease-out-quart)]",
7903
+ "transition-[stroke-dashoffset,stroke] duration-[var(--duration-slow)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7243
7904
  {
7244
7905
  variants: {
7245
7906
  variant: {
@@ -7311,7 +7972,15 @@ var ProgressRing = forwardRef(function ProgressRing2({ value, max = 100, size =
7311
7972
  });
7312
7973
  ProgressRing.displayName = "ProgressRing";
7313
7974
  var RadioGroup3 = React39.forwardRef(function RadioGroup4({ className, ...props }, ref) {
7314
- return /* @__PURE__ */ jsx(RadioGroupPrimitive.Root, { ref, className: cn("grid gap-2", className), ...props });
7975
+ return /* @__PURE__ */ jsx(
7976
+ RadioGroupPrimitive.Root,
7977
+ {
7978
+ ref,
7979
+ ...slot(radioGroupAnatomy, "root"),
7980
+ className: cn("grid gap-2", className),
7981
+ ...props
7982
+ }
7983
+ );
7315
7984
  });
7316
7985
  RadioGroup3.displayName = RadioGroupPrimitive.Root.displayName;
7317
7986
  var RadioGroupItem = React39.forwardRef(function RadioGroupItem2({ className, label, id: providedId, ...props }, ref) {
@@ -7322,9 +7991,10 @@ var RadioGroupItem = React39.forwardRef(function RadioGroupItem2({ className, la
7322
7991
  {
7323
7992
  ref,
7324
7993
  id,
7994
+ ...slot(radioGroupAnatomy, "item"),
7325
7995
  className: cn(
7326
7996
  "peer border-rule-strong bg-surface text-brand aspect-square size-4 shrink-0 rounded-full border",
7327
- "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)]",
7997
+ microInteractions.selection,
7328
7998
  "hover:border-fg-4",
7329
7999
  "focus-visible:[border-color:var(--focus-ring-border)] focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
7330
8000
  "data-[state=checked]:border-brand",
@@ -7333,7 +8003,14 @@ var RadioGroupItem = React39.forwardRef(function RadioGroupItem2({ className, la
7333
8003
  className
7334
8004
  ),
7335
8005
  ...props,
7336
- children: /* @__PURE__ */ jsx(RadioGroupPrimitive.Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(CircleIcon, { className: "fill-brand text-brand size-2", "aria-hidden": "true" }) })
8006
+ children: /* @__PURE__ */ jsx(
8007
+ RadioGroupPrimitive.Indicator,
8008
+ {
8009
+ ...slot(radioGroupAnatomy, "indicator"),
8010
+ className: "flex items-center justify-center",
8011
+ children: /* @__PURE__ */ jsx(CircleIcon, { className: "fill-brand text-brand size-2", "aria-hidden": "true" })
8012
+ }
8013
+ )
7337
8014
  }
7338
8015
  );
7339
8016
  if (!label) return root;
@@ -7343,6 +8020,7 @@ var RadioGroupItem = React39.forwardRef(function RadioGroupItem2({ className, la
7343
8020
  "label",
7344
8021
  {
7345
8022
  htmlFor: id,
8023
+ ...slot(radioGroupAnatomy, "label"),
7346
8024
  className: "text-fg peer-disabled:text-fg-disabled cursor-pointer text-[13px] leading-none select-none peer-disabled:cursor-not-allowed",
7347
8025
  children: label
7348
8026
  }
@@ -7410,6 +8088,7 @@ var SheetOverlay = React39.forwardRef(({ className, ...props }, ref) => /* @__PU
7410
8088
  DialogPrimitive.Overlay,
7411
8089
  {
7412
8090
  ref,
8091
+ ...slot(sheetAnatomy, "overlay"),
7413
8092
  className: cn(
7414
8093
  "bg-overlay fixed inset-0 z-[var(--z-overlay)] backdrop-blur-[4px]",
7415
8094
  "transition-opacity duration-[var(--duration-overlay)] ease-[var(--ease-out-quart)]",
@@ -7471,6 +8150,8 @@ var SheetContent = React39.forwardRef(
7471
8150
  DialogPrimitive.Content,
7472
8151
  {
7473
8152
  ref,
8153
+ ...slot(sheetAnatomy, "content"),
8154
+ ...stateAttributes({ size: width }),
7474
8155
  className: cn(sheetVariants({ side: resolvedSide }), widthClass, className),
7475
8156
  style: widthStyle,
7476
8157
  ...props,
@@ -7479,6 +8160,7 @@ var SheetContent = React39.forwardRef(
7479
8160
  showCloseButton && /* @__PURE__ */ jsx(
7480
8161
  DialogPrimitive.Close,
7481
8162
  {
8163
+ ...slot(sheetAnatomy, "close"),
7482
8164
  className: cn(
7483
8165
  "absolute top-4 right-4 inline-flex size-7 items-center justify-center",
7484
8166
  "rounded-icon text-fg-4 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
@@ -7497,11 +8179,19 @@ var SheetContent = React39.forwardRef(
7497
8179
  }
7498
8180
  );
7499
8181
  SheetContent.displayName = DialogPrimitive.Content.displayName;
7500
- var SheetHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-1.5 p-6 pr-12 pb-0", className), ...props });
8182
+ var SheetHeader = ({ className, ...props }) => /* @__PURE__ */ jsx(
8183
+ "div",
8184
+ {
8185
+ ...slot(sheetAnatomy, "header"),
8186
+ className: cn("flex flex-col gap-1.5 p-6 pr-12 pb-0", className),
8187
+ ...props
8188
+ }
8189
+ );
7501
8190
  SheetHeader.displayName = "SheetHeader";
7502
8191
  var SheetFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
7503
8192
  "div",
7504
8193
  {
8194
+ ...slot(sheetAnatomy, "footer"),
7505
8195
  className: cn(
7506
8196
  "border-rule mt-auto flex flex-col-reverse gap-2 border-t p-6 sm:flex-row sm:items-center sm:justify-end",
7507
8197
  className
@@ -7514,6 +8204,7 @@ var SheetTitle = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE
7514
8204
  DialogPrimitive.Title,
7515
8205
  {
7516
8206
  ref,
8207
+ ...slot(sheetAnatomy, "title"),
7517
8208
  className: cn(
7518
8209
  "font-display text-fg text-base leading-tight font-medium tracking-tight",
7519
8210
  className
@@ -7522,7 +8213,15 @@ var SheetTitle = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE
7522
8213
  }
7523
8214
  ));
7524
8215
  SheetTitle.displayName = DialogPrimitive.Title.displayName;
7525
- var SheetDescription = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Description, { ref, className: cn("text-fg-3 text-sm", className), ...props }));
8216
+ var SheetDescription = React39.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
8217
+ DialogPrimitive.Description,
8218
+ {
8219
+ ref,
8220
+ ...slot(sheetAnatomy, "description"),
8221
+ className: cn("text-fg-3 text-sm", className),
8222
+ ...props
8223
+ }
8224
+ ));
7526
8225
  SheetDescription.displayName = DialogPrimitive.Description.displayName;
7527
8226
  var MOBILE_QUERY = "(max-width: 639.98px)";
7528
8227
  function useIsMobile() {
@@ -7601,7 +8300,8 @@ var RouteTransition = forwardRef(
7601
8300
  {
7602
8301
  className: cn(
7603
8302
  "animate-in fade-in-0 slide-in-from-bottom-2",
7604
- "duration-[var(--duration-normal)] ease-[var(--ease-out-quart)]"
8303
+ "duration-[var(--duration-normal)] ease-[var(--ease-out-quart)]",
8304
+ "motion-reduce:animate-none"
7605
8305
  ),
7606
8306
  children
7607
8307
  },
@@ -7672,8 +8372,7 @@ function useDebounce(value, delay = 300) {
7672
8372
  var searchInputVariants = cva(
7673
8373
  [
7674
8374
  "flex w-full rounded-input border border-rule-strong bg-surface font-body text-fg",
7675
- "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
7676
- "motion-reduce:transition-none",
8375
+ microInteractions.control,
7677
8376
  "placeholder:text-fg-4",
7678
8377
  "focus-visible:outline-none focus-visible:[border-color:var(--focus-ring-border)]",
7679
8378
  "focus-visible:[box-shadow:var(--shadow-focus-ring)]",
@@ -7690,7 +8389,10 @@ var searchInputVariants = cva(
7690
8389
  // FilterChip at their `sm` tier in a toolbar row.
7691
8390
  sm: "h-8 pl-8 pr-8 text-[13px]",
7692
8391
  md: "h-9 pl-9 pr-9 text-[13px]",
7693
- lg: "h-11 pl-10 pr-10 text-sm"
8392
+ lg: "h-11 pl-10 pr-10 text-sm",
8393
+ compact: "h-8 pl-8 pr-8 text-[13px]",
8394
+ default: "h-10 pl-9 pr-9 text-sm",
8395
+ comfortable: "h-12 pl-10 pr-10 text-base"
7694
8396
  }
7695
8397
  },
7696
8398
  defaultVariants: {
@@ -7720,53 +8422,64 @@ var SearchInput = React39.forwardRef(
7720
8422
  onSearch?.(debouncedValue);
7721
8423
  }, [debouncedValue, onSearch]);
7722
8424
  const sz = inputSize ?? "md";
7723
- const iconLeftClass = sz === "sm" ? "left-2.5" : sz === "lg" ? "left-3" : "left-3";
7724
- const iconRightClass = sz === "sm" ? "right-2" : sz === "lg" ? "right-3" : "right-2.5";
7725
- const iconSizeClass = sz === "sm" ? "size-3.5" : "size-4";
7726
- return /* @__PURE__ */ jsxs("div", { className: cn("relative w-full", className), children: [
7727
- /* @__PURE__ */ jsx(
7728
- SearchIcon,
7729
- {
7730
- className: cn(
7731
- "text-fg-4 pointer-events-none absolute top-1/2 -translate-y-1/2",
7732
- iconLeftClass,
7733
- iconSizeClass
8425
+ const isCompact = sz === "sm" || sz === "compact";
8426
+ const isComfortable = sz === "lg" || sz === "comfortable";
8427
+ const iconLeftClass = isCompact ? "left-2.5" : "left-3";
8428
+ const iconRightClass = isCompact ? "right-2" : isComfortable ? "right-3" : "right-2.5";
8429
+ const iconSizeClass = isCompact ? "size-3.5" : "size-4";
8430
+ return /* @__PURE__ */ jsxs(
8431
+ "div",
8432
+ {
8433
+ ...slot(searchInputAnatomy, "root"),
8434
+ ...stateAttributes({ size: sz, disabled }),
8435
+ className: cn("relative w-full", className),
8436
+ children: [
8437
+ /* @__PURE__ */ jsx(
8438
+ SearchIcon,
8439
+ {
8440
+ ...slot(searchInputAnatomy, "icon"),
8441
+ className: cn(
8442
+ "text-fg-4 pointer-events-none absolute top-1/2 -translate-y-1/2",
8443
+ iconLeftClass,
8444
+ iconSizeClass
8445
+ ),
8446
+ "aria-hidden": "true"
8447
+ }
7734
8448
  ),
7735
- "aria-hidden": "true"
7736
- }
7737
- ),
7738
- /* @__PURE__ */ jsx(
7739
- "input",
7740
- {
7741
- ref,
7742
- type: "search",
7743
- value,
7744
- onChange: (e) => onValueChange(e.target.value),
7745
- placeholder,
7746
- disabled,
7747
- className: cn(searchInputVariants({ inputSize })),
7748
- ...props
7749
- }
7750
- ),
7751
- value && !disabled && /* @__PURE__ */ jsx(
7752
- "button",
7753
- {
7754
- type: "button",
7755
- onClick: () => onValueChange(""),
7756
- className: cn(
7757
- "rounded-pill text-fg-4 absolute top-1/2 -translate-y-1/2 p-0.5",
7758
- "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
7759
- "motion-reduce:transition-none",
7760
- "hover:text-fg",
7761
- "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
7762
- iconRightClass
8449
+ /* @__PURE__ */ jsx(
8450
+ "input",
8451
+ {
8452
+ ref,
8453
+ type: "search",
8454
+ value,
8455
+ onChange: (e) => onValueChange(e.target.value),
8456
+ placeholder,
8457
+ disabled,
8458
+ ...slot(searchInputAnatomy, "control"),
8459
+ className: cn(searchInputVariants({ inputSize })),
8460
+ ...props
8461
+ }
7763
8462
  ),
7764
- "aria-label": "Clear search",
7765
- tabIndex: -1,
7766
- children: /* @__PURE__ */ jsx(XIcon, { className: iconSizeClass, "aria-hidden": "true" })
7767
- }
7768
- )
7769
- ] });
8463
+ value && !disabled && /* @__PURE__ */ jsx(
8464
+ "button",
8465
+ {
8466
+ type: "button",
8467
+ onClick: () => onValueChange(""),
8468
+ ...slot(searchInputAnatomy, "clear"),
8469
+ className: cn(
8470
+ "rounded-pill text-fg-4 absolute top-1/2 -translate-y-1/2 p-0.5",
8471
+ microInteractions.control,
8472
+ "hover:text-fg",
8473
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
8474
+ iconRightClass
8475
+ ),
8476
+ "aria-label": "Clear search",
8477
+ children: /* @__PURE__ */ jsx(XIcon, { className: iconSizeClass, "aria-hidden": "true" })
8478
+ }
8479
+ )
8480
+ ]
8481
+ }
8482
+ );
7770
8483
  }
7771
8484
  );
7772
8485
  SearchInput.displayName = "SearchInput";
@@ -7874,20 +8587,39 @@ function SearchSelect({
7874
8587
  }
7875
8588
  }, [onCreate, trimmedSearch]);
7876
8589
  const inputRef = React39.useRef(null);
8590
+ const listRef = React39.useRef(null);
7877
8591
  const listboxId = React39.useId();
7878
- const setInputRef = React39.useCallback((node) => {
7879
- inputRef.current = node;
7880
- node?.removeAttribute("aria-labelledby");
7881
- node?.setAttribute("aria-controls", listboxId);
7882
- node?.removeAttribute("aria-activedescendant");
8592
+ const syncInputRelationships = React39.useCallback(() => {
8593
+ const input = inputRef.current;
8594
+ if (!input) return;
8595
+ input.removeAttribute("aria-labelledby");
8596
+ input.removeAttribute("aria-activedescendant");
8597
+ const controls = listRef.current?.id || listboxId;
8598
+ if (controls && input.ownerDocument.getElementById(controls)) {
8599
+ input.setAttribute("aria-controls", controls);
8600
+ } else {
8601
+ input.removeAttribute("aria-controls");
8602
+ }
7883
8603
  }, [listboxId]);
8604
+ const setInputRef = React39.useCallback(
8605
+ (node) => {
8606
+ inputRef.current = node;
8607
+ syncInputRelationships();
8608
+ },
8609
+ [syncInputRelationships]
8610
+ );
8611
+ const setListRef = React39.useCallback(
8612
+ (node) => {
8613
+ listRef.current = node;
8614
+ syncInputRelationships();
8615
+ },
8616
+ [syncInputRelationships]
8617
+ );
7884
8618
  const singleValue = closeOnSelect ? selected[0] ?? null : null;
7885
8619
  const showValue = singleValue !== null && !open;
7886
8620
  const popoverOpen = open && !disabled;
7887
8621
  React39.useEffect(() => {
7888
- inputRef.current?.removeAttribute("aria-labelledby");
7889
- inputRef.current?.setAttribute("aria-controls", listboxId);
7890
- inputRef.current?.removeAttribute("aria-activedescendant");
8622
+ syncInputRelationships();
7891
8623
  });
7892
8624
  React39.useEffect(() => {
7893
8625
  if (open && closeOnSelect) {
@@ -8048,7 +8780,6 @@ function SearchSelect({
8048
8780
  },
8049
8781
  placeholder,
8050
8782
  "aria-label": placeholder,
8051
- "aria-controls": listboxId,
8052
8783
  disabled,
8053
8784
  className: cn(
8054
8785
  "font-body text-fg flex-1 bg-transparent py-2 pr-3 pl-9 text-[13px] outline-none",
@@ -8097,7 +8828,7 @@ function SearchSelect({
8097
8828
  /* @__PURE__ */ jsxs(
8098
8829
  Command.List,
8099
8830
  {
8100
- id: listboxId,
8831
+ ref: setListRef,
8101
8832
  className: cn(
8102
8833
  // No top padding: a sticky group heading pins at top-0, so any
8103
8834
  // top padding would leave a strip above it where the previous
@@ -8401,6 +9132,7 @@ function SideDrawer({
8401
9132
  /* @__PURE__ */ jsx(
8402
9133
  DialogPrimitive.Overlay,
8403
9134
  {
9135
+ ...slot(sideDrawerAnatomy, "overlay"),
8404
9136
  className: cn(
8405
9137
  "bg-overlay fixed inset-0 z-[var(--z-overlay)] backdrop-blur-[4px]",
8406
9138
  "transition-opacity duration-[var(--duration-overlay)] ease-[var(--ease-out-quart)]",
@@ -8412,6 +9144,8 @@ function SideDrawer({
8412
9144
  /* @__PURE__ */ jsxs(
8413
9145
  DialogPrimitive.Content,
8414
9146
  {
9147
+ ...slot(sideDrawerAnatomy, "root"),
9148
+ ...stateAttributes({ size: width }),
8415
9149
  className: cn(sideDrawerVariants({ side, width })),
8416
9150
  "aria-describedby": void 0,
8417
9151
  children: [
@@ -8425,35 +9159,58 @@ function SideDrawer({
8425
9159
  );
8426
9160
  }
8427
9161
  function SideDrawerHeader({ title, subtitle, onClose, className }) {
8428
- return /* @__PURE__ */ jsx("div", { className: cn("border-rule bg-surface shrink-0 border-b px-6 py-4", className), children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4", children: [
8429
- /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
8430
- /* @__PURE__ */ jsx("h2", { className: "font-display text-fg line-clamp-1 text-base leading-tight font-medium tracking-tight", children: title }),
8431
- subtitle && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-1 text-sm", children: subtitle })
8432
- ] }),
8433
- onClose && /* @__PURE__ */ jsx(
8434
- "button",
8435
- {
8436
- type: "button",
8437
- onClick: onClose,
8438
- className: cn(
8439
- "inline-flex size-7 shrink-0 items-center justify-center",
8440
- "rounded-icon text-fg-4 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
8441
- "hover:bg-overlay-hover hover:text-fg",
8442
- "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none"
8443
- ),
8444
- "aria-label": "Close",
8445
- children: /* @__PURE__ */ jsx(XIcon, { className: "size-4", "aria-hidden": "true" })
8446
- }
8447
- )
8448
- ] }) });
9162
+ return /* @__PURE__ */ jsx(
9163
+ "div",
9164
+ {
9165
+ ...slot(sideDrawerAnatomy, "header"),
9166
+ className: cn("border-rule bg-surface shrink-0 border-b px-6 py-4", className),
9167
+ children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4", children: [
9168
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
9169
+ /* @__PURE__ */ jsx(
9170
+ "h2",
9171
+ {
9172
+ ...slot(sideDrawerAnatomy, "heading"),
9173
+ className: "font-display text-fg line-clamp-1 text-base leading-tight font-medium tracking-tight",
9174
+ children: title
9175
+ }
9176
+ ),
9177
+ subtitle && /* @__PURE__ */ jsx("p", { ...slot(sideDrawerAnatomy, "subtitle"), className: "text-fg-3 mt-1 text-sm", children: subtitle })
9178
+ ] }),
9179
+ onClose && /* @__PURE__ */ jsx(
9180
+ "button",
9181
+ {
9182
+ type: "button",
9183
+ onClick: onClose,
9184
+ ...slot(sideDrawerAnatomy, "close"),
9185
+ className: cn(
9186
+ "inline-flex size-7 shrink-0 items-center justify-center",
9187
+ "rounded-icon text-fg-4 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
9188
+ "hover:bg-overlay-hover hover:text-fg",
9189
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none"
9190
+ ),
9191
+ "aria-label": "Close",
9192
+ children: /* @__PURE__ */ jsx(XIcon, { className: "size-4", "aria-hidden": "true" })
9193
+ }
9194
+ )
9195
+ ] })
9196
+ }
9197
+ );
8449
9198
  }
8450
9199
  function SideDrawerBody({ children, className }) {
8451
- return /* @__PURE__ */ jsx("div", { className: cn("scrollbar-thin flex-1 overflow-y-auto px-6 py-4", className), children });
9200
+ return /* @__PURE__ */ jsx(
9201
+ "div",
9202
+ {
9203
+ ...slot(sideDrawerAnatomy, "body"),
9204
+ className: cn("scrollbar-thin flex-1 overflow-y-auto px-6 py-4", className),
9205
+ children
9206
+ }
9207
+ );
8452
9208
  }
8453
9209
  function SideDrawerFooter({ children, className }) {
8454
9210
  return /* @__PURE__ */ jsx(
8455
9211
  "div",
8456
9212
  {
9213
+ ...slot(sideDrawerAnatomy, "footer"),
8457
9214
  className: cn(
8458
9215
  "border-rule bg-surface shrink-0 border-t px-6 py-4",
8459
9216
  "flex items-center justify-end gap-3",
@@ -9451,9 +10208,17 @@ var Switch = React39.forwardRef(
9451
10208
  {
9452
10209
  ref,
9453
10210
  id,
10211
+ ...slot(switchAnatomy, "root"),
10212
+ ...stateAttributes({ size: size ?? "md" }),
9454
10213
  className: cn(switchVariants({ size }), className),
9455
10214
  ...props,
9456
- children: /* @__PURE__ */ jsx(SwitchPrimitive.Thumb, { className: cn(switchThumbVariants({ size })) })
10215
+ children: /* @__PURE__ */ jsx(
10216
+ SwitchPrimitive.Thumb,
10217
+ {
10218
+ ...slot(switchAnatomy, "thumb"),
10219
+ className: cn(switchThumbVariants({ size }))
10220
+ }
10221
+ )
9457
10222
  }
9458
10223
  );
9459
10224
  if (!label) return root;
@@ -9463,6 +10228,7 @@ var Switch = React39.forwardRef(
9463
10228
  "label",
9464
10229
  {
9465
10230
  htmlFor: id,
10231
+ ...slot(switchAnatomy, "label"),
9466
10232
  className: "text-fg peer-disabled:text-fg-disabled cursor-pointer text-[13px] leading-none select-none peer-disabled:cursor-not-allowed",
9467
10233
  children: label
9468
10234
  }
@@ -9475,6 +10241,7 @@ var Table = forwardRef(function Table2({ className, wrapperClassName, ...props }
9475
10241
  return /* @__PURE__ */ jsx(
9476
10242
  "div",
9477
10243
  {
10244
+ ...slot(tableAnatomy, "wrapper"),
9478
10245
  className: cn(
9479
10246
  "rounded-card border-rule-strong bg-surface w-full overflow-x-auto border shadow-quiet",
9480
10247
  wrapperClassName
@@ -9483,6 +10250,7 @@ var Table = forwardRef(function Table2({ className, wrapperClassName, ...props }
9483
10250
  "table",
9484
10251
  {
9485
10252
  ref,
10253
+ ...slot(tableAnatomy, "root"),
9486
10254
  className: cn("w-full caption-bottom border-collapse text-sm", className),
9487
10255
  ...props
9488
10256
  }
@@ -9493,12 +10261,28 @@ var Table = forwardRef(function Table2({ className, wrapperClassName, ...props }
9493
10261
  Table.displayName = "Table";
9494
10262
  var TableHeader = forwardRef(
9495
10263
  function TableHeader2({ className, ...props }, ref) {
9496
- return /* @__PURE__ */ jsx("thead", { ref, className: cn("[&_tr]:border-rule [&_tr]:border-b", className), ...props });
10264
+ return /* @__PURE__ */ jsx(
10265
+ "thead",
10266
+ {
10267
+ ref,
10268
+ ...slot(tableAnatomy, "header"),
10269
+ className: cn("[&_tr]:border-rule [&_tr]:border-b", className),
10270
+ ...props
10271
+ }
10272
+ );
9497
10273
  }
9498
10274
  );
9499
10275
  TableHeader.displayName = "TableHeader";
9500
10276
  var TableBody = forwardRef(function TableBody2({ className, ...props }, ref) {
9501
- return /* @__PURE__ */ jsx("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props });
10277
+ return /* @__PURE__ */ jsx(
10278
+ "tbody",
10279
+ {
10280
+ ref,
10281
+ ...slot(tableAnatomy, "body"),
10282
+ className: cn("[&_tr:last-child]:border-0", className),
10283
+ ...props
10284
+ }
10285
+ );
9502
10286
  });
9503
10287
  TableBody.displayName = "TableBody";
9504
10288
  var TableFooter = forwardRef(
@@ -9507,6 +10291,7 @@ var TableFooter = forwardRef(
9507
10291
  "tfoot",
9508
10292
  {
9509
10293
  ref,
10294
+ ...slot(tableAnatomy, "footer"),
9510
10295
  className: cn(
9511
10296
  "border-rule bg-surface-2 border-t font-medium [&>tr]:last:border-b-0",
9512
10297
  className
@@ -9522,6 +10307,7 @@ var TableRow = forwardRef(function TableRow2({ className, ...props }, ref) {
9522
10307
  "tr",
9523
10308
  {
9524
10309
  ref,
10310
+ ...slot(tableAnatomy, "row"),
9525
10311
  className: cn(
9526
10312
  "border-rule-soft border-b transition-colors duration-[var(--duration-instant)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
9527
10313
  // G15 compound: selected wins over hover; selected+hover uses the
@@ -9540,6 +10326,7 @@ var TableHead = forwardRef(function TableHead2({ className, ...props }, ref) {
9540
10326
  "th",
9541
10327
  {
9542
10328
  ref,
10329
+ ...slot(tableAnatomy, "head"),
9543
10330
  className: cn(
9544
10331
  // Sentence-case column labels in the body font (Plus Jakarta Sans),
9545
10332
  // quiet gray — not mono uppercase eyebrows.
@@ -9560,6 +10347,7 @@ var TableCell = forwardRef(function TableCell2({ className, ...props }, ref) {
9560
10347
  "td",
9561
10348
  {
9562
10349
  ref,
10350
+ ...slot(tableAnatomy, "cell"),
9563
10351
  className: cn(
9564
10352
  // 13px, fg-2, soft 1px row divider, tabular nums; airier vertical
9565
10353
  // rhythm (py-3) for the taller rows in the catalog layout.
@@ -9574,7 +10362,15 @@ var TableCell = forwardRef(function TableCell2({ className, ...props }, ref) {
9574
10362
  TableCell.displayName = "TableCell";
9575
10363
  var TableCaption = forwardRef(
9576
10364
  function TableCaption2({ className, ...props }, ref) {
9577
- return /* @__PURE__ */ jsx("caption", { ref, className: cn("text-fg-3 mt-3 text-sm", className), ...props });
10365
+ return /* @__PURE__ */ jsx(
10366
+ "caption",
10367
+ {
10368
+ ref,
10369
+ ...slot(tableAnatomy, "caption"),
10370
+ className: cn("text-fg-3 mt-3 text-sm", className),
10371
+ ...props
10372
+ }
10373
+ );
9578
10374
  }
9579
10375
  );
9580
10376
  TableCaption.displayName = "TableCaption";
@@ -9598,8 +10394,8 @@ TabsList.displayName = TabsPrimitive.List.displayName;
9598
10394
  var triggerVariants = cva(
9599
10395
  cn(
9600
10396
  "inline-flex items-center justify-center gap-2 text-[13px] font-medium",
9601
- "text-fg-3 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
9602
- "motion-reduce:transition-none",
10397
+ "text-fg-3",
10398
+ microInteractions.selection,
9603
10399
  "focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)]",
9604
10400
  "disabled:pointer-events-none disabled:cursor-not-allowed disabled:text-fg-disabled",
9605
10401
  "hover:text-fg"
@@ -9712,6 +10508,7 @@ var textareaVariants = cva(
9712
10508
  [
9713
10509
  "flex w-full rounded-input border bg-surface font-body text-fg",
9714
10510
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)]",
10511
+ "motion-reduce:transition-none",
9715
10512
  "placeholder:text-fg-4",
9716
10513
  "focus-visible:outline-none focus-visible:[border-color:var(--focus-ring-border)]",
9717
10514
  "focus-visible:[box-shadow:var(--shadow-focus-ring)]",
@@ -9775,7 +10572,15 @@ var Textarea = forwardRef(function Textarea2({
9775
10572
  }, [value, adjustHeight]);
9776
10573
  const currentLength = typeof value === "string" ? value.length : typeof defaultValue === "string" ? defaultValue.length : 0;
9777
10574
  return /* @__PURE__ */ jsxs("div", { className: "w-full", children: [
9778
- label && /* @__PURE__ */ jsx("label", { htmlFor: id, className: "text-fg mb-1.5 block text-[13px] leading-none font-medium", children: label }),
10575
+ label && /* @__PURE__ */ jsx(
10576
+ "label",
10577
+ {
10578
+ htmlFor: id,
10579
+ ...slot(textareaAnatomy, "label"),
10580
+ className: "text-fg mb-1.5 block text-[13px] leading-none font-medium",
10581
+ children: label
10582
+ }
10583
+ ),
9779
10584
  /* @__PURE__ */ jsx(
9780
10585
  "textarea",
9781
10586
  {
@@ -9786,6 +10591,13 @@ var Textarea = forwardRef(function Textarea2({
9786
10591
  maxLength,
9787
10592
  "aria-invalid": !!error || void 0,
9788
10593
  "aria-describedby": error ? errorId : void 0,
10594
+ ...slot(textareaAnatomy, "root"),
10595
+ ...stateAttributes({
10596
+ variant: variant ?? "default",
10597
+ size: inputSize ?? "md",
10598
+ disabled: props.disabled,
10599
+ invalid: !!error
10600
+ }),
9789
10601
  onChange: (e) => {
9790
10602
  onChange?.(e);
9791
10603
  adjustHeight();
@@ -9799,12 +10611,28 @@ var Textarea = forwardRef(function Textarea2({
9799
10611
  }
9800
10612
  ),
9801
10613
  (error || showCount && maxLength) && /* @__PURE__ */ jsxs("div", { className: "mt-1.5 flex items-center justify-between gap-2", children: [
9802
- error ? /* @__PURE__ */ jsx("p", { id: errorId, role: "alert", className: "text-danger-fg text-xs", children: error }) : /* @__PURE__ */ jsx("span", {}),
9803
- showCount && maxLength && /* @__PURE__ */ jsxs("span", { className: "text-fg-4 ml-auto font-mono text-[11px]", children: [
9804
- currentLength,
9805
- "/",
9806
- maxLength
9807
- ] })
10614
+ error ? /* @__PURE__ */ jsx(
10615
+ "p",
10616
+ {
10617
+ id: errorId,
10618
+ role: "alert",
10619
+ ...slot(textareaAnatomy, "error"),
10620
+ className: "text-danger-fg text-xs",
10621
+ children: error
10622
+ }
10623
+ ) : /* @__PURE__ */ jsx("span", {}),
10624
+ showCount && maxLength && /* @__PURE__ */ jsxs(
10625
+ "span",
10626
+ {
10627
+ ...slot(textareaAnatomy, "count"),
10628
+ className: "text-fg-4 ml-auto font-mono text-[11px]",
10629
+ children: [
10630
+ currentLength,
10631
+ "/",
10632
+ maxLength
10633
+ ]
10634
+ }
10635
+ )
9808
10636
  ] })
9809
10637
  ] });
9810
10638
  });
@@ -9877,6 +10705,7 @@ function ToastProvider({ children }) {
9877
10705
  /* @__PURE__ */ jsx(
9878
10706
  "div",
9879
10707
  {
10708
+ ...slot(toastAnatomy, "region"),
9880
10709
  className: "pointer-events-none fixed top-4 right-4 z-[var(--z-toast)] flex flex-col gap-2",
9881
10710
  role: "region",
9882
10711
  "aria-live": "polite",
@@ -10000,6 +10829,8 @@ function ToastItem({ toast, onDismiss }) {
10000
10829
  role: hasContent ? "group" : isError ? "alert" : "status",
10001
10830
  "aria-atomic": hasContent ? void 0 : true,
10002
10831
  "data-state": exiting ? "closed" : "open",
10832
+ ...slot(toastAnatomy, "root"),
10833
+ ...stateAttributes({ variant: toast.variant ?? "default" }),
10003
10834
  onPointerEnter: () => setPaused(true),
10004
10835
  onPointerLeave: () => {
10005
10836
  if (!dragRef.current) setPaused(false);
@@ -10036,6 +10867,7 @@ function ToastItem({ toast, onDismiss }) {
10036
10867
  /* @__PURE__ */ jsx(
10037
10868
  "span",
10038
10869
  {
10870
+ ...slot(toastAnatomy, "icon"),
10039
10871
  className: cn(
10040
10872
  // Same-hue inset ring gives the tinted chip a crafted edge instead
10041
10873
  // of a flat fill — definition without a heavy border.
@@ -10053,8 +10885,22 @@ function ToastItem({ toast, onDismiss }) {
10053
10885
  }
10054
10886
  ),
10055
10887
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
10056
- toast.title && /* @__PURE__ */ jsx("p", { className: "text-fg text-sm leading-tight font-semibold", children: toast.title }),
10057
- toast.description && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-0.5 text-sm leading-snug", children: toast.description }),
10888
+ toast.title && /* @__PURE__ */ jsx(
10889
+ "p",
10890
+ {
10891
+ ...slot(toastAnatomy, "title"),
10892
+ className: "text-fg text-sm leading-tight font-semibold",
10893
+ children: toast.title
10894
+ }
10895
+ ),
10896
+ toast.description && /* @__PURE__ */ jsx(
10897
+ "p",
10898
+ {
10899
+ ...slot(toastAnatomy, "description"),
10900
+ className: "text-fg-3 mt-0.5 text-sm leading-snug",
10901
+ children: toast.description
10902
+ }
10903
+ ),
10058
10904
  toast.action && /* @__PURE__ */ jsx(
10059
10905
  "button",
10060
10906
  {
@@ -10063,6 +10909,7 @@ function ToastItem({ toast, onDismiss }) {
10063
10909
  toast.action?.onClick();
10064
10910
  close();
10065
10911
  },
10912
+ ...slot(toastAnatomy, "action"),
10066
10913
  className: cn(
10067
10914
  "text-brand mt-2 text-sm font-semibold",
10068
10915
  "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] hover:underline motion-reduce:transition-none",
@@ -10077,6 +10924,7 @@ function ToastItem({ toast, onDismiss }) {
10077
10924
  {
10078
10925
  type: "button",
10079
10926
  onClick: close,
10927
+ ...slot(toastAnatomy, "close"),
10080
10928
  className: cn(
10081
10929
  // size-7 click target with a -m-1 offset so the glyph keeps its
10082
10930
  // top-right optical position while the hit area (and ring) grow.
@@ -10140,8 +10988,8 @@ function ToastItem({ toast, onDismiss }) {
10140
10988
  var itemVariants = cva(
10141
10989
  cn(
10142
10990
  "inline-flex items-center justify-center rounded-pill px-3 py-1.5 text-[13px] font-medium",
10143
- "text-fg-3 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
10144
- "motion-reduce:transition-none",
10991
+ "text-fg-3",
10992
+ microInteractions.selection,
10145
10993
  "hover:bg-bg-2 hover:text-fg",
10146
10994
  "focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)]",
10147
10995
  "disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-bg-disabled disabled:text-fg-disabled",
@@ -10199,6 +11047,7 @@ var TooltipContent = React39.forwardRef(({ className, sideOffset = 6, ...props }
10199
11047
  {
10200
11048
  ref,
10201
11049
  sideOffset,
11050
+ ...slot(tooltipAnatomy, "content"),
10202
11051
  className: cn(
10203
11052
  "rounded-input border-rule-strong bg-surface z-[var(--z-tooltip)] max-w-xs border px-2.5 py-1.5",
10204
11053
  "font-body text-fg shadow-pop text-xs leading-tight",
@@ -10221,11 +11070,11 @@ var VisuallyHidden = forwardRef(
10221
11070
  VisuallyHidden.displayName = "VisuallyHidden";
10222
11071
  var TONE_DOT = {
10223
11072
  brand: "bg-brand",
10224
- info: "bg-info",
10225
- success: "bg-success",
10226
- warning: "bg-warning",
10227
- muted: "bg-muted-foreground/40",
10228
- danger: "bg-destructive"
11073
+ info: "bg-accent-2",
11074
+ success: "bg-success-fg",
11075
+ warning: "bg-warning-fg",
11076
+ muted: "bg-fg-4/40",
11077
+ danger: "bg-danger-fg"
10229
11078
  };
10230
11079
  function ChannelTabs({ tabs, value, onChange, className, ...props }) {
10231
11080
  return /* @__PURE__ */ jsx(
@@ -10233,7 +11082,7 @@ function ChannelTabs({ tabs, value, onChange, className, ...props }) {
10233
11082
  {
10234
11083
  role: "tablist",
10235
11084
  "aria-label": "Channel",
10236
- className: cn("flex items-center gap-1 border-b border-border bg-card px-3 py-2", className),
11085
+ className: cn("flex items-center gap-1 border-b border-rule bg-surface px-3 py-2", className),
10237
11086
  ...props,
10238
11087
  children: tabs.map((tab) => {
10239
11088
  const active = value === tab.value;
@@ -10246,9 +11095,9 @@ function ChannelTabs({ tabs, value, onChange, className, ...props }) {
10246
11095
  "aria-selected": active,
10247
11096
  onClick: () => onChange(tab.value),
10248
11097
  className: cn(
10249
- "flex items-center gap-2 rounded-md border px-3 py-1.5 text-sm font-medium transition-colors",
10250
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
10251
- active ? "border-brand bg-brand/5 text-brand" : "border-transparent text-muted-foreground hover:text-foreground"
11098
+ "flex items-center gap-2 rounded-md border px-3 py-1.5 text-sm font-medium transition-colors motion-reduce:transition-none",
11099
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
11100
+ active ? "border-brand bg-brand/5 text-brand" : "border-transparent text-fg-3 hover:text-fg"
10252
11101
  ),
10253
11102
  children: [
10254
11103
  /* @__PURE__ */ jsx(
@@ -10256,7 +11105,7 @@ function ChannelTabs({ tabs, value, onChange, className, ...props }) {
10256
11105
  {
10257
11106
  className: cn(
10258
11107
  "size-1.5 rounded-full",
10259
- active ? TONE_DOT[tab.tone ?? "muted"] : "bg-muted-foreground/40"
11108
+ active ? TONE_DOT[tab.tone ?? "muted"] : "bg-fg-4/40"
10260
11109
  ),
10261
11110
  "aria-hidden": true
10262
11111
  }
@@ -10267,7 +11116,7 @@ function ChannelTabs({ tabs, value, onChange, className, ...props }) {
10267
11116
  {
10268
11117
  className: cn(
10269
11118
  "ml-0.5 inline-flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[10px] font-semibold tabular-nums",
10270
- active ? "bg-background/60" : "bg-muted text-muted-foreground"
11119
+ active ? "bg-bg/60" : "bg-bg-2 text-fg-3"
10271
11120
  ),
10272
11121
  children: count
10273
11122
  }
@@ -10283,12 +11132,12 @@ function ChannelTabs({ tabs, value, onChange, className, ...props }) {
10283
11132
  ChannelTabs.displayName = "ChannelTabs";
10284
11133
  var TONE_STYLES = {
10285
11134
  brand: "bg-brand/10 text-brand border-brand/30",
10286
- info: "bg-info/10 text-info border-info/30",
10287
- primary: "bg-primary/10 text-primary border-primary/30",
10288
- success: "bg-success/10 text-success border-success/30",
10289
- warning: "bg-warning/10 text-warning border-warning/30",
10290
- danger: "bg-destructive/10 text-destructive border-destructive/30",
10291
- muted: "bg-muted text-muted-foreground border-border"
11135
+ info: "bg-accent-tint text-accent-2 border-accent/30",
11136
+ primary: "bg-brand-bg text-brand border-brand-line",
11137
+ success: "bg-success-bg text-success-fg border-success-line",
11138
+ warning: "bg-warning-bg text-warning-fg border-warning-line",
11139
+ danger: "bg-danger-bg text-danger-fg border-danger-line",
11140
+ muted: "bg-bg-2 text-fg-3 border-rule"
10292
11141
  };
10293
11142
  function IntentBadge({ tone = "muted", icon, children, className, ...props }) {
10294
11143
  return /* @__PURE__ */ jsxs(
@@ -11563,7 +12412,7 @@ var Grid = forwardRef(function Grid2({
11563
12412
  return /* @__PURE__ */ jsx("div", { ref, className: cn("overflow-x-auto", className), ...props, children: /* @__PURE__ */ jsxs(
11564
12413
  "div",
11565
12414
  {
11566
- role: "table",
12415
+ role: "group",
11567
12416
  "aria-label": ariaLabel,
11568
12417
  className: "grid gap-2",
11569
12418
  style: {
@@ -12139,6 +12988,7 @@ function QuestionOptionButton({
12139
12988
  className: cn(
12140
12989
  "group bg-surface flex w-full items-center gap-3 border text-left",
12141
12990
  "transition-[border-color,background-color,color,box-shadow,transform] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
12991
+ "motion-reduce:transition-none",
12142
12992
  "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
12143
12993
  "disabled:bg-bg-disabled disabled:text-fg-disabled disabled:cursor-not-allowed",
12144
12994
  compact ? "h-10 max-w-max rounded-[10px] px-3" : "min-h-16 rounded-[12px] px-7 py-4",
@@ -12152,7 +13002,7 @@ function QuestionOptionButton({
12152
13002
  {
12153
13003
  "aria-hidden": "true",
12154
13004
  className: cn(
12155
- "grid shrink-0 place-items-center rounded-full border transition-colors duration-[var(--duration-fast)]",
13005
+ "grid shrink-0 place-items-center rounded-full border transition-colors duration-[var(--duration-fast)] motion-reduce:transition-none",
12156
13006
  compact ? "size-5" : "size-4",
12157
13007
  selected ? "border-brand bg-brand text-fg-on-brand" : "border-rule-strong bg-surface group-hover:border-brand-line text-transparent"
12158
13008
  ),
@@ -12904,7 +13754,7 @@ var EngagementTimelineStep = forwardRef(
12904
13754
  }
12905
13755
  );
12906
13756
  EngagementTimelineStep.displayName = "EngagementTimelineStep";
12907
- var ROW_BASE = "group/row flex w-full items-center gap-1.5 rounded-lg px-2.5 py-1 text-left text-[12px] font-medium transition-colors duration-[120ms] motion-reduce:transition-none";
13757
+ var ROW_BASE = "group/row flex w-full items-center gap-1.5 rounded-lg px-2.5 py-1 text-left text-[12px] font-medium transition-colors duration-[var(--motion-duration-feedback)] motion-reduce:transition-none";
12908
13758
  var ROW_INACTIVE = "text-fg-2 hover:bg-surface-2 hover:text-fg";
12909
13759
  var ROW_ACTIVE = "bg-brand-bg text-brand font-semibold";
12910
13760
  var BADGE_BASE = "ml-auto min-w-[18px] rounded-full px-[5px] py-px text-center text-[10px] font-[650] tabular-nums";
@@ -12948,7 +13798,7 @@ var FolderTree = forwardRef(function FolderTree2({ nodes, activeId, onSelect, de
12948
13798
  toggle(node.id);
12949
13799
  },
12950
13800
  className: cn(
12951
- "shrink-0 text-fg-4 transition-transform duration-[150ms] motion-reduce:transition-none",
13801
+ "shrink-0 text-fg-4 transition-transform duration-[var(--motion-duration-feedback)] motion-reduce:transition-none",
12952
13802
  isOpen && "rotate-90"
12953
13803
  ),
12954
13804
  children: /* @__PURE__ */ jsx(ChevronRightIcon, { size: 13, "aria-hidden": "true" })
@@ -13011,7 +13861,7 @@ var ClientRailItem = forwardRef(
13011
13861
  // Layout
13012
13862
  "relative flex w-full items-center gap-[11px] border-b border-rule px-[14px] py-[11px] text-left",
13013
13863
  // Motion
13014
- "transition-colors duration-[120ms] motion-reduce:transition-none",
13864
+ "transition-colors duration-[var(--motion-duration-feedback)] motion-reduce:transition-none",
13015
13865
  // Cursor
13016
13866
  "cursor-pointer",
13017
13867
  // State — hover only when not active to avoid override
@@ -13143,7 +13993,7 @@ function CheckboxSlot({
13143
13993
  "div",
13144
13994
  {
13145
13995
  className: cn(
13146
- "shrink-0 transition-opacity duration-[120ms] motion-reduce:transition-none",
13996
+ "shrink-0 transition-opacity duration-[var(--motion-duration-feedback)] motion-reduce:transition-none",
13147
13997
  selected ? "opacity-100" : "opacity-0 group-hover:opacity-100",
13148
13998
  className
13149
13999
  ),
@@ -13170,7 +14020,7 @@ function MoreActions({ menu }) {
13170
14020
  type: "button",
13171
14021
  className: cn(
13172
14022
  "grid size-[30px] place-items-center rounded-[8px] text-fg-4",
13173
- "transition-colors duration-[120ms] motion-reduce:transition-none",
14023
+ "transition-colors duration-[var(--motion-duration-feedback)] motion-reduce:transition-none",
13174
14024
  "group-hover:text-fg-2 hover:bg-surface hover:text-brand hover:shadow-sm"
13175
14025
  ),
13176
14026
  "aria-label": "More actions",
@@ -13210,7 +14060,7 @@ var DocumentFileRow = React39.forwardRef(
13210
14060
  ref,
13211
14061
  className: cn(
13212
14062
  "group flex cursor-pointer items-center gap-[13px] border-b border-rule px-[14px] py-3",
13213
- "transition-colors duration-[120ms] motion-reduce:transition-none hover:bg-surface-2",
14063
+ "transition-colors duration-[var(--motion-duration-feedback)] motion-reduce:transition-none hover:bg-surface-2",
13214
14064
  selected && "bg-brand-bg",
13215
14065
  className
13216
14066
  ),
@@ -13277,7 +14127,7 @@ var DocumentFileCard = React39.forwardRef(
13277
14127
  ref,
13278
14128
  className: cn(
13279
14129
  "group relative cursor-pointer rounded-2xl border border-rule bg-surface p-3",
13280
- "transition-[border-color,box-shadow,transform] duration-[120ms] motion-reduce:transition-none",
14130
+ "transition-[border-color,box-shadow,transform] duration-[var(--motion-duration-feedback)] motion-reduce:transition-none",
13281
14131
  "hover:-translate-y-0.5 hover:border-rule-strong hover:shadow-sm",
13282
14132
  selected && "border-brand bg-brand-bg",
13283
14133
  className
@@ -13342,7 +14192,7 @@ var DocumentFileLine = React39.forwardRef(
13342
14192
  ref,
13343
14193
  className: cn(
13344
14194
  "flex items-center gap-2.5 rounded-[10px] px-2.5 py-2",
13345
- "transition-colors duration-[120ms] motion-reduce:transition-none hover:bg-surface-2",
14195
+ "transition-colors duration-[var(--motion-duration-feedback)] motion-reduce:transition-none hover:bg-surface-2",
13346
14196
  className
13347
14197
  ),
13348
14198
  ...props,
@@ -13377,7 +14227,7 @@ var DocumentFileLine = React39.forwardRef(
13377
14227
  onClick: onOpen,
13378
14228
  className: cn(
13379
14229
  "grid size-7 shrink-0 place-items-center rounded-lg text-fg-4",
13380
- "transition-colors duration-[120ms] motion-reduce:transition-none",
14230
+ "transition-colors duration-[var(--motion-duration-feedback)] motion-reduce:transition-none",
13381
14231
  "hover:bg-surface hover:text-brand",
13382
14232
  "focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)]"
13383
14233
  ),
@@ -13451,7 +14301,7 @@ function ChecklistItemRow({ item }) {
13451
14301
  "div",
13452
14302
  {
13453
14303
  className: cn(
13454
- "rounded-xl border px-3.5 py-2.5 shadow-quiet transition-colors duration-[120ms] motion-reduce:transition-none",
14304
+ "rounded-xl border px-3.5 py-2.5 shadow-quiet transition-colors duration-[var(--motion-duration-feedback)] motion-reduce:transition-none",
13455
14305
  done ? "border-success-line/70 bg-success-bg/30" : item.status === "in-review" ? "border-warning-line/70 bg-warning-bg/25" : "border-rule bg-surface"
13456
14306
  ),
13457
14307
  children: [
@@ -13603,7 +14453,7 @@ var DocumentRequestField = forwardRef(
13603
14453
  className: cn(
13604
14454
  "ml-auto size-[26px] rounded-[7px] grid place-items-center",
13605
14455
  "text-fg-4",
13606
- "transition-colors duration-[120ms] motion-reduce:transition-none",
14456
+ "transition-colors duration-[var(--motion-duration-feedback)] motion-reduce:transition-none",
13607
14457
  "hover:bg-danger-bg hover:text-danger-fg",
13608
14458
  "focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)]"
13609
14459
  ),
@@ -13748,7 +14598,15 @@ var NewMenu = forwardRef(function NewMenu2({ actions, groups, triggerLabel = "Ne
13748
14598
  });
13749
14599
  NewMenu.displayName = "NewMenu";
13750
14600
  var Shell = forwardRef(function Shell2({ className, ...props }, ref) {
13751
- return /* @__PURE__ */ jsx("div", { ref, className: cn("bg-bg flex h-dvh w-full", className), ...props });
14601
+ return /* @__PURE__ */ jsx(
14602
+ "div",
14603
+ {
14604
+ ref,
14605
+ ...slot(shellAnatomy, "root"),
14606
+ className: cn("bg-bg flex h-dvh w-full", className),
14607
+ ...props
14608
+ }
14609
+ );
13752
14610
  });
13753
14611
  Shell.displayName = "Shell";
13754
14612
  var Main = forwardRef(function Main2({ className, ...props }, ref) {
@@ -13756,6 +14614,7 @@ var Main = forwardRef(function Main2({ className, ...props }, ref) {
13756
14614
  "main",
13757
14615
  {
13758
14616
  ref,
14617
+ ...slot(shellAnatomy, "main"),
13759
14618
  className: cn("flex min-w-0 flex-1 flex-col overflow-hidden", className),
13760
14619
  ...props
13761
14620
  }
@@ -13775,6 +14634,7 @@ var Content16 = forwardRef(function Content17({ padTop, padBottom, className, st
13775
14634
  role: "region",
13776
14635
  "aria-label": "Page content",
13777
14636
  tabIndex: 0,
14637
+ ...slot(shellAnatomy, "content"),
13778
14638
  className: cn("flex-1 overflow-y-auto p-[var(--content-pad)]", className),
13779
14639
  style: paddingStyle,
13780
14640
  ...props
@@ -13958,6 +14818,7 @@ var Sidebar = React39.forwardRef(function Sidebar2({
13958
14818
  "data-labels": labelsHidden ? "hide" : "show",
13959
14819
  "data-collapsible": collapsible ? "true" : void 0,
13960
14820
  "data-variant": variant,
14821
+ ...slot(sidebarAnatomy, "root"),
13961
14822
  onMouseEnter: handleEnter,
13962
14823
  onMouseLeave: handleLeave,
13963
14824
  style: { width: effectiveWidth, ...style },
@@ -13975,7 +14836,7 @@ var Sidebar = React39.forwardRef(function Sidebar2({
13975
14836
  // movement) but well short of `--duration-slow` (which feels
13976
14837
  // sluggish). `will-change` hints the compositor so the column
13977
14838
  // doesn't repaint every frame mid-transition.
13978
- "transition-[width,box-shadow] duration-[220ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
14839
+ "transition-[width,box-shadow] duration-[var(--motion-duration-spatial)] ease-[var(--motion-ease-move)] motion-reduce:transition-none",
13979
14840
  "[will-change:width]",
13980
14841
  // Overlay (hover-peek OR programmatic peek-lock): float above the
13981
14842
  // canvas without reflowing layout. Driven by `data-overlay` so a
@@ -14017,6 +14878,7 @@ var SidebarTrigger = React39.forwardRef(
14017
14878
  onClick?.(e);
14018
14879
  if (!e.defaultPrevented) toggle();
14019
14880
  },
14881
+ ...slot(sidebarAnatomy, "trigger"),
14020
14882
  className: cn(
14021
14883
  "inline-flex size-7 shrink-0 items-center justify-center rounded-md",
14022
14884
  "text-fg-3 hover:bg-bg-3 hover:text-fg",
@@ -14063,6 +14925,8 @@ var SidebarPinButton = React39.forwardRef(
14063
14925
  onClick?.(e);
14064
14926
  if (!e.defaultPrevented) setState(isPinned ? "rail" : "expanded");
14065
14927
  },
14928
+ ...slot(sidebarAnatomy, "pin"),
14929
+ ...stateAttributes({ selected: isPinned }),
14066
14930
  className: cn(
14067
14931
  "inline-flex size-7 shrink-0 items-center justify-center rounded-md",
14068
14932
  "text-fg-4 hover:bg-bg-3 hover:text-fg aria-pressed:text-fg",
@@ -14119,6 +14983,7 @@ var SidebarBrand = React39.forwardRef(
14119
14983
  "div",
14120
14984
  {
14121
14985
  ref,
14986
+ ...slot(sidebarAnatomy, "brand"),
14122
14987
  className: cn(
14123
14988
  "flex min-w-0 items-center gap-2 px-2.5 pt-1 pb-4",
14124
14989
  className
@@ -14136,6 +15001,7 @@ var SidebarBrandText = React39.forwardRef(
14136
15001
  {
14137
15002
  ref,
14138
15003
  "aria-hidden": "false",
15004
+ ...slot(sidebarAnatomy, "brand-text"),
14139
15005
  className: cn(
14140
15006
  // line-clamp-1 (not `truncate`) so multi-word wordmarks clip at a
14141
15007
  // word boundary instead of mid-word when the rail is narrow.
@@ -14143,7 +15009,7 @@ var SidebarBrandText = React39.forwardRef(
14143
15009
  // Smooth fade + width collapse on rail. Keeps the wordmark
14144
15010
  // legible up to the moment the column reaches rail width, then
14145
15011
  // fully drops out (visibility:hidden cuts hit-testing).
14146
- "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
15012
+ "transition-[opacity,max-width] duration-[var(--motion-duration-spatial)] ease-[var(--motion-ease-move)] motion-reduce:transition-none",
14147
15013
  "max-w-[160px] opacity-100",
14148
15014
  "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible",
14149
15015
  className
@@ -14173,6 +15039,7 @@ var SidebarSection = React39.forwardRef(
14173
15039
  ref,
14174
15040
  role: ariaLabel ? "group" : void 0,
14175
15041
  "aria-label": ariaLabel,
15042
+ ...slot(sidebarAnatomy, "section"),
14176
15043
  className: cn(
14177
15044
  "mb-4",
14178
15045
  // In rail, the visible section labels disappear and the only
@@ -14187,15 +15054,17 @@ var SidebarSection = React39.forwardRef(
14187
15054
  label != null && /* @__PURE__ */ jsx(
14188
15055
  "div",
14189
15056
  {
15057
+ ...slot(sidebarAnatomy, "section-header"),
14190
15058
  className: cn(
14191
15059
  "mb-1 flex items-center justify-between px-2.5 py-1",
14192
- "transition-opacity duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
15060
+ "transition-opacity duration-[var(--motion-duration-spatial)] ease-[var(--motion-ease-move)] motion-reduce:transition-none",
14193
15061
  "opacity-100",
14194
15062
  "group-data-[labels=hide]/sidebar:invisible group-data-[labels=hide]/sidebar:opacity-0"
14195
15063
  ),
14196
15064
  children: /* @__PURE__ */ jsx(
14197
15065
  "span",
14198
15066
  {
15067
+ ...slot(sidebarAnatomy, "section-label"),
14199
15068
  className: cn(
14200
15069
  "font-mono text-[11px] tracking-[0.14em] uppercase",
14201
15070
  tone === "muted" ? "text-fg-3" : "text-brand"
@@ -14237,6 +15106,7 @@ var SidebarLink = React39.forwardRef(
14237
15106
  "data-active": active ? "true" : void 0,
14238
15107
  "aria-current": active ? "page" : void 0,
14239
15108
  "aria-label": accessibleLabel,
15109
+ ...slot(sidebarAnatomy, "link"),
14240
15110
  className: cn(
14241
15111
  "group/link relative mb-px flex items-center gap-2.5 rounded-md px-2.5 py-1.5",
14242
15112
  "text-fg-2 text-[13px] font-normal no-underline",
@@ -14276,6 +15146,7 @@ var SidebarLink = React39.forwardRef(
14276
15146
  /* @__PURE__ */ jsx(
14277
15147
  "span",
14278
15148
  {
15149
+ ...slot(sidebarAnatomy, "link-label"),
14279
15150
  className: cn(
14280
15151
  // Flex row so a trailing <SidebarLinkBadge> (ml-auto) aligns
14281
15152
  // to the right edge with a gap from the label, instead of
@@ -14283,7 +15154,7 @@ var SidebarLink = React39.forwardRef(
14283
15154
  // auto margin, which is why "Billing$48k" rendered glued.
14284
15155
  // Single-line label clips via overflow; badge stays put.
14285
15156
  "flex min-w-0 flex-1 items-center gap-1.5 overflow-hidden whitespace-nowrap",
14286
- "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
15157
+ "transition-[opacity,max-width] duration-[var(--motion-duration-spatial)] ease-[var(--motion-ease-move)] motion-reduce:transition-none",
14287
15158
  "max-w-full opacity-100",
14288
15159
  "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible"
14289
15160
  ),
@@ -14307,6 +15178,7 @@ var SidebarLinkLabel = React39.forwardRef(
14307
15178
  "span",
14308
15179
  {
14309
15180
  ref,
15181
+ ...slot(sidebarAnatomy, "link-label"),
14310
15182
  className: cn(
14311
15183
  // line-clamp-1 (not `truncate`) so multi-word labels clip at a
14312
15184
  // word boundary; collapses cleanly with the rail-mode max-width
@@ -14315,7 +15187,7 @@ var SidebarLinkLabel = React39.forwardRef(
14315
15187
  // Fade + collapse instead of hard display:none so a single
14316
15188
  // 180ms opacity tween covers all labels in lockstep with the
14317
15189
  // 220ms aside-width transition — no snap on the last frame.
14318
- "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
15190
+ "transition-[opacity,max-width] duration-[var(--motion-duration-spatial)] ease-[var(--motion-ease-move)] motion-reduce:transition-none",
14319
15191
  "max-w-full opacity-100",
14320
15192
  "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible",
14321
15193
  className
@@ -14332,8 +15204,9 @@ var SidebarLinkAction = React39.forwardRef(
14332
15204
  "span",
14333
15205
  {
14334
15206
  ref,
15207
+ ...slot(sidebarAnatomy, "link-action"),
14335
15208
  className: cn(
14336
- "transition-opacity duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
15209
+ "transition-opacity duration-[var(--motion-duration-spatial)] ease-[var(--motion-ease-move)] motion-reduce:transition-none",
14337
15210
  "opacity-100",
14338
15211
  "group-data-[labels=hide]/sidebar:invisible group-data-[labels=hide]/sidebar:opacity-0",
14339
15212
  className
@@ -14360,7 +15233,15 @@ var sidebarLinkBadgeVariants = cva(
14360
15233
  );
14361
15234
  var SidebarLinkBadge = React39.forwardRef(
14362
15235
  function SidebarLinkBadge2({ tone, className, ...props }, ref) {
14363
- return /* @__PURE__ */ jsx("span", { ref, className: cn(sidebarLinkBadgeVariants({ tone }), className), ...props });
15236
+ return /* @__PURE__ */ jsx(
15237
+ "span",
15238
+ {
15239
+ ref,
15240
+ ...slot(sidebarAnatomy, "link-badge"),
15241
+ className: cn(sidebarLinkBadgeVariants({ tone }), className),
15242
+ ...props
15243
+ }
15244
+ );
14364
15245
  }
14365
15246
  );
14366
15247
  SidebarLinkBadge.displayName = "SidebarLinkBadge";
@@ -14431,72 +15312,86 @@ var SidebarLinkGroup = React39.forwardRef(
14431
15312
  const labelSpan = /* @__PURE__ */ jsx(
14432
15313
  "span",
14433
15314
  {
15315
+ ...slot(sidebarAnatomy, "link-label"),
14434
15316
  className: cn(
14435
15317
  // line-clamp-1 (not `truncate`) so multi-word labels clip at a
14436
15318
  // word boundary; collapses cleanly with the rail-mode max-width
14437
15319
  // animation since both rules only constrain visible content.
14438
15320
  "min-w-0 flex-1 line-clamp-1",
14439
- "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
15321
+ "transition-[opacity,max-width] duration-[var(--motion-duration-spatial)] ease-[var(--motion-ease-move)] motion-reduce:transition-none",
14440
15322
  "max-w-full opacity-100",
14441
15323
  "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible"
14442
15324
  ),
14443
15325
  children: label
14444
15326
  }
14445
15327
  );
14446
- return /* @__PURE__ */ jsx("div", { ref, className: cn("mb-px", className), ...props, children: /* @__PURE__ */ jsxs(Collapsible, { open, onOpenChange: setOpen, children: [
14447
- /* @__PURE__ */ jsxs("div", { className: "flex items-stretch", children: [
14448
- /* @__PURE__ */ jsxs(
14449
- "a",
14450
- {
14451
- href,
14452
- "data-active": active ? "true" : void 0,
14453
- "aria-current": active ? "page" : void 0,
14454
- "aria-label": getTextContent(label) || void 0,
14455
- onClick: handleBodyClick,
14456
- className: bodyClassName,
14457
- children: [
14458
- icon,
14459
- labelSpan
14460
- ]
14461
- }
14462
- ),
14463
- /* @__PURE__ */ jsx(
14464
- "button",
14465
- {
14466
- type: "button",
14467
- "aria-expanded": open,
14468
- "aria-controls": contentId,
14469
- "aria-label": open ? "Collapse section" : "Expand section",
14470
- onClick: handleChevronClick,
14471
- className: cn(
14472
- "ml-px inline-flex size-7 shrink-0 items-center justify-center rounded-md",
14473
- "text-fg-4 hover:bg-bg-3 hover:text-fg-2",
14474
- "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
14475
- "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
14476
- "[&_svg]:size-3.5 [&_svg]:shrink-0 [&_svg]:transition-transform [&_svg]:duration-[var(--duration-fast)] [&_svg]:ease-[var(--ease-out-quart)] motion-reduce:[&_svg]:transition-none",
14477
- // Hide in rail — content tree is hidden too, so the
14478
- // affordance has nothing to control.
14479
- "group-data-[labels=hide]/sidebar:hidden"
15328
+ return /* @__PURE__ */ jsx(
15329
+ "div",
15330
+ {
15331
+ ref,
15332
+ ...slot(sidebarAnatomy, "group"),
15333
+ ...stateAttributes({ state: open ? "open" : "closed" }),
15334
+ className: cn("mb-px", className),
15335
+ ...props,
15336
+ children: /* @__PURE__ */ jsxs(Collapsible, { open, onOpenChange: setOpen, children: [
15337
+ /* @__PURE__ */ jsxs("div", { className: "flex items-stretch", children: [
15338
+ /* @__PURE__ */ jsxs(
15339
+ "a",
15340
+ {
15341
+ href,
15342
+ "data-active": active ? "true" : void 0,
15343
+ "aria-current": active ? "page" : void 0,
15344
+ "aria-label": getTextContent(label) || void 0,
15345
+ onClick: handleBodyClick,
15346
+ ...slot(sidebarAnatomy, "group-link"),
15347
+ className: bodyClassName,
15348
+ children: [
15349
+ icon,
15350
+ labelSpan
15351
+ ]
15352
+ }
14480
15353
  ),
14481
- children: /* @__PURE__ */ jsx(ChevronDownIcon, { className: open ? "" : "-rotate-90" })
14482
- }
14483
- )
14484
- ] }),
14485
- /* @__PURE__ */ jsx(
14486
- CollapsibleContent,
14487
- {
14488
- id: contentId,
14489
- className: cn(
14490
- // Indent column + connecting rule. Children render as
14491
- // standard <SidebarLink>s and keep their own active-rail
14492
- // indicator, which lands flush at the indented column's
14493
- // left edge.
14494
- "group-data-[labels=hide]/sidebar:hidden"
14495
- ),
14496
- children: /* @__PURE__ */ jsx("div", { className: "border-rule mt-px ml-[18px] border-l pl-2", children })
14497
- }
14498
- )
14499
- ] }) });
15354
+ /* @__PURE__ */ jsx(
15355
+ "button",
15356
+ {
15357
+ type: "button",
15358
+ "aria-expanded": open,
15359
+ "aria-controls": contentId,
15360
+ "aria-label": open ? "Collapse section" : "Expand section",
15361
+ onClick: handleChevronClick,
15362
+ ...slot(sidebarAnatomy, "group-trigger"),
15363
+ className: cn(
15364
+ "ml-px inline-flex size-7 shrink-0 items-center justify-center rounded-md",
15365
+ "text-fg-4 hover:bg-bg-3 hover:text-fg-2",
15366
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
15367
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
15368
+ "[&_svg]:size-3.5 [&_svg]:shrink-0 [&_svg]:transition-transform [&_svg]:duration-[var(--duration-fast)] [&_svg]:ease-[var(--ease-out-quart)] motion-reduce:[&_svg]:transition-none",
15369
+ // Hide in rail content tree is hidden too, so the
15370
+ // affordance has nothing to control.
15371
+ "group-data-[labels=hide]/sidebar:hidden"
15372
+ ),
15373
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, { className: open ? "" : "-rotate-90" })
15374
+ }
15375
+ )
15376
+ ] }),
15377
+ /* @__PURE__ */ jsx(
15378
+ CollapsibleContent,
15379
+ {
15380
+ id: contentId,
15381
+ ...slot(sidebarAnatomy, "group-content"),
15382
+ className: cn(
15383
+ // Indent column + connecting rule. Children render as
15384
+ // standard <SidebarLink>s and keep their own active-rail
15385
+ // indicator, which lands flush at the indented column's
15386
+ // left edge.
15387
+ "group-data-[labels=hide]/sidebar:hidden"
15388
+ ),
15389
+ children: /* @__PURE__ */ jsx("div", { className: "border-rule mt-px ml-[18px] border-l pl-2", children })
15390
+ }
15391
+ )
15392
+ ] })
15393
+ }
15394
+ );
14500
15395
  }
14501
15396
  );
14502
15397
  SidebarLinkGroup.displayName = "SidebarLinkGroup";
@@ -14506,6 +15401,7 @@ var SidebarFooter = React39.forwardRef(
14506
15401
  "div",
14507
15402
  {
14508
15403
  ref,
15404
+ ...slot(sidebarAnatomy, "footer"),
14509
15405
  className: cn(
14510
15406
  "border-rule mt-auto flex items-center gap-2.5 border-t px-2 pt-2.5 pb-1",
14511
15407
  "text-fg-3 text-xs",
@@ -14518,24 +15414,47 @@ var SidebarFooter = React39.forwardRef(
14518
15414
  );
14519
15415
  SidebarFooter.displayName = "SidebarFooter";
14520
15416
  var SidebarUser = React39.forwardRef(function SidebarUser2({ name, subtitle, avatarSrc, className, ...props }, ref) {
14521
- return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex min-w-0 items-center gap-2.5", className), ...props, children: [
14522
- /* @__PURE__ */ jsx(Avatar, { size: "sm", variant: "branded", name, src: avatarSrc ?? void 0 }),
14523
- /* @__PURE__ */ jsxs(
14524
- "div",
14525
- {
14526
- className: cn(
14527
- "min-w-0 leading-tight",
14528
- "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
14529
- "max-w-full opacity-100",
14530
- "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible"
14531
- ),
14532
- children: [
14533
- /* @__PURE__ */ jsx("div", { className: "text-fg line-clamp-1 text-[13px] font-medium", children: name }),
14534
- subtitle != null && /* @__PURE__ */ jsx("div", { className: "text-fg-4 line-clamp-1 font-mono text-[10.5px]", children: subtitle })
14535
- ]
14536
- }
14537
- )
14538
- ] });
15417
+ return /* @__PURE__ */ jsxs(
15418
+ "div",
15419
+ {
15420
+ ref,
15421
+ ...slot(sidebarAnatomy, "user"),
15422
+ className: cn("flex min-w-0 items-center gap-2.5", className),
15423
+ ...props,
15424
+ children: [
15425
+ /* @__PURE__ */ jsx(Avatar, { size: "sm", variant: "branded", name, src: avatarSrc ?? void 0 }),
15426
+ /* @__PURE__ */ jsxs(
15427
+ "div",
15428
+ {
15429
+ className: cn(
15430
+ "min-w-0 leading-tight",
15431
+ "transition-[opacity,max-width] duration-[var(--motion-duration-spatial)] ease-[var(--motion-ease-move)] motion-reduce:transition-none",
15432
+ "max-w-full opacity-100",
15433
+ "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible"
15434
+ ),
15435
+ children: [
15436
+ /* @__PURE__ */ jsx(
15437
+ "div",
15438
+ {
15439
+ ...slot(sidebarAnatomy, "user-name"),
15440
+ className: "text-fg line-clamp-1 text-[13px] font-medium",
15441
+ children: name
15442
+ }
15443
+ ),
15444
+ subtitle != null && /* @__PURE__ */ jsx(
15445
+ "div",
15446
+ {
15447
+ ...slot(sidebarAnatomy, "user-subtitle"),
15448
+ className: "text-fg-4 line-clamp-1 font-mono text-[10.5px]",
15449
+ children: subtitle
15450
+ }
15451
+ )
15452
+ ]
15453
+ }
15454
+ )
15455
+ ]
15456
+ }
15457
+ );
14539
15458
  });
14540
15459
  SidebarUser.displayName = "SidebarUser";
14541
15460
  var SidebarBrandSwitcher = React39.forwardRef(
@@ -14572,6 +15491,7 @@ var SidebarBrandSwitcher = React39.forwardRef(
14572
15491
  "div",
14573
15492
  {
14574
15493
  ref,
15494
+ ...slot(sidebarBrandSwitcherAnatomy, "root"),
14575
15495
  className: cn("flex min-w-0 items-center gap-2 px-2.5 pt-1 pb-4", className),
14576
15496
  children: [
14577
15497
  /* @__PURE__ */ jsxs(DropdownMenu, { open, onOpenChange: setOpen, children: [
@@ -14579,6 +15499,7 @@ var SidebarBrandSwitcher = React39.forwardRef(
14579
15499
  DropdownMenuTrigger,
14580
15500
  {
14581
15501
  "aria-label": triggerLabel,
15502
+ ...slot(sidebarBrandSwitcherAnatomy, "trigger"),
14582
15503
  className: cn(
14583
15504
  // Negative left margin pulls the trigger's hover-bg toward
14584
15505
  // the column edge while the inner padding holds the brand
@@ -14596,6 +15517,7 @@ var SidebarBrandSwitcher = React39.forwardRef(
14596
15517
  /* @__PURE__ */ jsx(
14597
15518
  ChevronDownIcon,
14598
15519
  {
15520
+ ...slot(sidebarBrandSwitcherAnatomy, "icon"),
14599
15521
  className: cn(
14600
15522
  "ml-auto size-3.5 shrink-0 text-fg-4",
14601
15523
  "transition-transform duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
@@ -15150,6 +16072,7 @@ var DataTable = forwardRef(function DataTable2({ withToolbar, className, childre
15150
16072
  {
15151
16073
  ref,
15152
16074
  "data-with-toolbar": withToolbar ? "true" : void 0,
16075
+ ...slot(dataTableAnatomy, "root"),
15153
16076
  className: cn(
15154
16077
  // Outer frame on the whole component: a single visible border +
15155
16078
  // quiet shadow wrapping the toolbar (if any) and the table as one
@@ -15171,6 +16094,7 @@ var DataTableToolbar = forwardRef(
15171
16094
  "div",
15172
16095
  {
15173
16096
  ref,
16097
+ ...slot(dataTableAnatomy, "toolbar"),
15174
16098
  className: cn(
15175
16099
  "flex items-center gap-2 px-3 py-2.5",
15176
16100
  "border-rule bg-surface border-b",
@@ -15201,7 +16125,16 @@ var DataTableSearch = forwardRef(
15201
16125
  DataTableSearch.displayName = "DataTableSearch";
15202
16126
  var DataTableSpacer = forwardRef(
15203
16127
  function DataTableSpacer2({ className, ...props }, ref) {
15204
- return /* @__PURE__ */ jsx("span", { ref, "aria-hidden": "true", className: cn("flex-1", className), ...props });
16128
+ return /* @__PURE__ */ jsx(
16129
+ "span",
16130
+ {
16131
+ ref,
16132
+ "aria-hidden": "true",
16133
+ ...slot(dataTableAnatomy, "spacer"),
16134
+ className: cn("flex-1", className),
16135
+ ...props
16136
+ }
16137
+ );
15205
16138
  }
15206
16139
  );
15207
16140
  DataTableSpacer.displayName = "DataTableSpacer";
@@ -15211,7 +16144,11 @@ var DataTableResultsCount = forwardRef(
15211
16144
  "span",
15212
16145
  {
15213
16146
  ref,
15214
- className: cn("text-fg-4 mr-1 font-sans text-[11px] tabular-nums", className),
16147
+ ...slot(dataTableAnatomy, "results-count"),
16148
+ className: cn(
16149
+ "text-fg-4 mr-1 shrink-0 font-sans text-[11px] whitespace-nowrap tabular-nums",
16150
+ className
16151
+ ),
15215
16152
  ...props,
15216
16153
  children: [
15217
16154
  current.toLocaleString(),
@@ -15225,13 +16162,29 @@ var DataTableResultsCount = forwardRef(
15225
16162
  DataTableResultsCount.displayName = "DataTableResultsCount";
15226
16163
  var DataTableHead = forwardRef(
15227
16164
  function DataTableHead2({ className, ...props }, ref) {
15228
- return /* @__PURE__ */ jsx("thead", { ref, className: cn("[&_tr]:border-rule [&_tr]:border-b", className), ...props });
16165
+ return /* @__PURE__ */ jsx(
16166
+ "thead",
16167
+ {
16168
+ ref,
16169
+ ...slot(dataTableAnatomy, "header"),
16170
+ className: cn("[&_tr]:border-rule [&_tr]:border-b", className),
16171
+ ...props
16172
+ }
16173
+ );
15229
16174
  }
15230
16175
  );
15231
16176
  DataTableHead.displayName = "DataTableHead";
15232
16177
  var DataTableBody = forwardRef(
15233
16178
  function DataTableBody2({ className, ...props }, ref) {
15234
- return /* @__PURE__ */ jsx("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props });
16179
+ return /* @__PURE__ */ jsx(
16180
+ "tbody",
16181
+ {
16182
+ ref,
16183
+ ...slot(dataTableAnatomy, "body"),
16184
+ className: cn("[&_tr:last-child]:border-0", className),
16185
+ ...props
16186
+ }
16187
+ );
15235
16188
  }
15236
16189
  );
15237
16190
  DataTableBody.displayName = "DataTableBody";
@@ -15242,8 +16195,10 @@ var DataTableRow = forwardRef(
15242
16195
  {
15243
16196
  ref,
15244
16197
  "data-state": selected ? "selected" : void 0,
16198
+ ...slot(dataTableAnatomy, "row"),
15245
16199
  className: cn(
15246
- "border-rule-soft border-b transition-colors duration-[var(--duration-instant)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
16200
+ "border-rule-soft border-b",
16201
+ microInteractions.selection,
15247
16202
  // Selected hover stays in the brand tint (G15) — when both states fire,
15248
16203
  // hover:bg-bg-2 was previously winning and dropping the row out of
15249
16204
  // the selected tint, which read as the row deselecting on hover.
@@ -15281,6 +16236,7 @@ var DataTableHeader = forwardRef(
15281
16236
  "span",
15282
16237
  {
15283
16238
  "aria-hidden": "true",
16239
+ ...slot(dataTableAnatomy, "head-indicator"),
15284
16240
  className: cn(
15285
16241
  "text-fg-5 ml-1 inline-flex shrink-0 items-center justify-center",
15286
16242
  currentSort && "text-fg-3"
@@ -15295,6 +16251,8 @@ var DataTableHeader = forwardRef(
15295
16251
  ref,
15296
16252
  scope: "col",
15297
16253
  "aria-sort": ariaSort,
16254
+ ...slot(dataTableAnatomy, "head"),
16255
+ ...stateAttributes({ state: currentSort ?? void 0 }),
15298
16256
  className: cn(
15299
16257
  "h-11 px-4 py-2.5 text-left align-middle whitespace-nowrap",
15300
16258
  "font-sans text-[14px] font-medium tracking-normal normal-case",
@@ -15309,6 +16267,7 @@ var DataTableHeader = forwardRef(
15309
16267
  {
15310
16268
  type: "button",
15311
16269
  onClick: handleClick,
16270
+ ...slot(dataTableAnatomy, "head-button"),
15312
16271
  className: cn(
15313
16272
  "-mx-1 -my-1 inline-flex items-center gap-1 rounded-[4px] px-1 py-1",
15314
16273
  "font-sans text-[14px] font-medium tracking-normal normal-case",
@@ -15334,6 +16293,7 @@ var DataTableCell = forwardRef(
15334
16293
  "td",
15335
16294
  {
15336
16295
  ref,
16296
+ ...slot(dataTableAnatomy, "cell"),
15337
16297
  className: cn(
15338
16298
  cellBase,
15339
16299
  "text-fg-2 text-[13px]",
@@ -15352,6 +16312,8 @@ var DataTableCellName = forwardRef(
15352
16312
  "td",
15353
16313
  {
15354
16314
  ref,
16315
+ ...slot(dataTableAnatomy, "cell"),
16316
+ ...stateAttributes({ variant: "name" }),
15355
16317
  className: cn(cellBase, "font-display text-fg text-[13px] font-medium", className),
15356
16318
  ...props
15357
16319
  }
@@ -15365,6 +16327,8 @@ var DataTableCellMono = forwardRef(
15365
16327
  "td",
15366
16328
  {
15367
16329
  ref,
16330
+ ...slot(dataTableAnatomy, "cell"),
16331
+ ...stateAttributes({ variant: "mono" }),
15368
16332
  className: cn(cellBase, "font-sans text-fg-2 text-[13px] tabular-nums", className),
15369
16333
  style,
15370
16334
  ...props
@@ -15379,6 +16343,8 @@ var DataTableCellId = forwardRef(
15379
16343
  "td",
15380
16344
  {
15381
16345
  ref,
16346
+ ...slot(dataTableAnatomy, "cell"),
16347
+ ...stateAttributes({ variant: "id" }),
15382
16348
  className: cn(cellBase, "font-sans text-fg-4 text-xs tabular-nums", className),
15383
16349
  style,
15384
16350
  ...props
@@ -15404,6 +16370,8 @@ var DataTableCellDue = forwardRef(
15404
16370
  {
15405
16371
  ref,
15406
16372
  "data-due-state": ariaState,
16373
+ ...slot(dataTableAnatomy, "cell"),
16374
+ ...stateAttributes({ variant: "due" }),
15407
16375
  className: cn(cellBase, "font-sans text-[13px] tabular-nums", tone, className),
15408
16376
  style,
15409
16377
  ...props,
@@ -15429,6 +16397,7 @@ var DataTableCheckbox = forwardRef(
15429
16397
  Cell,
15430
16398
  {
15431
16399
  ref,
16400
+ ...slot(dataTableAnatomy, "checkbox-cell"),
15432
16401
  className: cn(
15433
16402
  "w-8 px-4 py-3 pr-0 align-middle",
15434
16403
  asHeader && "bg-surface-2 border-rule h-11 border-b",
@@ -16794,7 +17763,7 @@ var MessageBubble = forwardRef(function MessageBubble2({ avatar, name, timestamp
16794
17763
  "span",
16795
17764
  {
16796
17765
  className: cn(
16797
- "ml-auto opacity-0 transition-opacity",
17766
+ "ml-auto opacity-0 transition-opacity motion-reduce:transition-none",
16798
17767
  "group-hover/bubble:opacity-100 group-focus-within/bubble:opacity-100"
16799
17768
  ),
16800
17769
  children: actions
@@ -16904,7 +17873,7 @@ var MessageComposer = forwardRef(
16904
17873
  className: cn(
16905
17874
  "relative flex flex-col",
16906
17875
  "border-rule bg-input-background rounded-xl border",
16907
- "transition-shadow duration-150",
17876
+ "transition-shadow duration-[var(--motion-duration-feedback)] motion-reduce:transition-none",
16908
17877
  "focus-within:border-accent-ring focus-within:bg-surface focus-within:shadow-sm",
16909
17878
  isDisabled && "pointer-events-none opacity-60",
16910
17879
  className
@@ -16923,7 +17892,7 @@ var MessageComposer = forwardRef(
16923
17892
  "div",
16924
17893
  {
16925
17894
  "aria-hidden": "true",
16926
- className: "bg-bg-3 h-6 w-20 shrink-0 animate-pulse rounded-full"
17895
+ className: "bg-bg-3 h-6 w-20 shrink-0 animate-pulse rounded-full motion-reduce:animate-none"
16927
17896
  },
16928
17897
  i
16929
17898
  )) : chips.map((chip) => /* @__PURE__ */ jsx(
@@ -16935,7 +17904,7 @@ var MessageComposer = forwardRef(
16935
17904
  className: cn(
16936
17905
  "inline-flex h-6 shrink-0 items-center rounded-full px-2.5",
16937
17906
  "text-[11px] font-medium text-fg-2",
16938
- "bg-bg-2 transition-colors hover:bg-bg-3 hover:text-fg",
17907
+ "bg-bg-2 transition-colors hover:bg-bg-3 hover:text-fg motion-reduce:transition-none",
16939
17908
  "focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)]"
16940
17909
  ),
16941
17910
  children: chip.label
@@ -16953,17 +17922,16 @@ var MessageComposer = forwardRef(
16953
17922
  className: "flex shrink-0 items-center justify-between gap-2 px-2 pb-1.5 pt-1",
16954
17923
  children: [
16955
17924
  /* @__PURE__ */ jsx("div", { className: "flex min-w-0 items-center gap-2", children: startSlot }),
16956
- /* @__PURE__ */ jsxs(
17925
+ /* @__PURE__ */ jsx(
16957
17926
  Button,
16958
17927
  {
16959
17928
  size: "sm",
16960
17929
  disabled: isSubmitDisabled,
17930
+ loading: submitting,
17931
+ iconLeft: /* @__PURE__ */ jsx(SendIcon, { size: 14, "aria-hidden": "true" }),
16961
17932
  onClick: onSubmit,
16962
17933
  className: "gap-1.5",
16963
- children: [
16964
- /* @__PURE__ */ jsx(SendIcon, { size: 14, "aria-hidden": "true" }),
16965
- submitting ? submittingLabel : submitLabel
16966
- ]
17934
+ children: submitting ? submittingLabel : submitLabel
16967
17935
  }
16968
17936
  )
16969
17937
  ]
@@ -18001,15 +18969,15 @@ function SuggestionPills({
18001
18969
  "div",
18002
18970
  {
18003
18971
  className: cn(
18004
- "ds-suggestion-bar flex items-center gap-2 overflow-x-auto border-t border-border/60 bg-gradient-to-b from-brand-soft/40 to-transparent px-4 py-2.5 [scrollbar-width:none]",
18972
+ "ds-suggestion-bar flex items-center gap-2 overflow-x-auto border-t border-rule/60 bg-gradient-to-b from-brand-bg/40 to-transparent px-4 py-2.5 motion-reduce:animate-none [scrollbar-width:none]",
18005
18973
  className
18006
18974
  ),
18007
18975
  children: [
18008
- /* @__PURE__ */ jsxs("span", { className: "flex shrink-0 items-center gap-1.5 text-[11px] font-medium text-muted-foreground", children: [
18976
+ /* @__PURE__ */ jsxs("span", { className: "flex shrink-0 items-center gap-1.5 text-[11px] font-medium text-fg-3", children: [
18009
18977
  /* @__PURE__ */ jsx(SparkleIcon, { className: "ds-suggestion-spark size-3.5 text-brand", "aria-hidden": "true" }),
18010
18978
  label
18011
18979
  ] }),
18012
- loading ? [0, 1].map((i) => /* @__PURE__ */ jsx("span", { className: "h-7 w-32 shrink-0 animate-pulse rounded-full bg-muted" }, i)) : suggestions.map((text, i) => /* @__PURE__ */ jsx(
18980
+ loading ? [0, 1].map((i) => /* @__PURE__ */ jsx("span", { className: "h-7 w-32 shrink-0 animate-pulse rounded-full bg-bg-2 motion-reduce:animate-none" }, i)) : suggestions.map((text, i) => /* @__PURE__ */ jsx(
18013
18981
  "button",
18014
18982
  {
18015
18983
  type: "button",
@@ -18017,10 +18985,10 @@ function SuggestionPills({
18017
18985
  title: text,
18018
18986
  style: { animationDelay: `${i * 110}ms` },
18019
18987
  className: cn(
18020
- "ds-suggestion-pill max-w-[260px] shrink-0 truncate whitespace-nowrap rounded-full border px-3.5 py-1.5 text-[12px] font-medium",
18021
- "border-brand/30 bg-brand-soft text-brand-soft-foreground shadow-[0_1px_6px_rgba(108,66,248,0.14)]",
18022
- "transition-all hover:-translate-y-0.5 hover:border-brand/50 hover:bg-brand/10 hover:shadow-[0_3px_10px_rgba(108,66,248,0.22)]",
18023
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
18988
+ "ds-suggestion-pill max-w-[260px] shrink-0 truncate whitespace-nowrap rounded-full border px-3.5 py-1.5 text-[12px] font-medium motion-reduce:animate-none",
18989
+ "border-brand/30 bg-brand-bg text-brand shadow-quiet",
18990
+ "transition-[color,background-color,border-color,box-shadow,transform] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] hover:-translate-y-0.5 hover:border-brand/50 hover:bg-brand-bg-hover hover:shadow-card motion-reduce:transform-none motion-reduce:transition-none",
18991
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none"
18024
18992
  ),
18025
18993
  children: text
18026
18994
  },
@@ -18068,10 +19036,10 @@ function AiDraftCard({
18068
19036
  ] });
18069
19037
  }
18070
19038
  if (state === "error") {
18071
- return /* @__PURE__ */ jsxs("div", { className: cn("rounded-lg border border-destructive/20 bg-destructive/5 p-3", className), children: [
18072
- /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive", children: error ?? "Something went wrong." }),
19039
+ return /* @__PURE__ */ jsxs("div", { className: cn("rounded-lg border border-danger-line bg-danger-bg p-3", className), children: [
19040
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-danger-fg", children: error ?? "Something went wrong." }),
18073
19041
  (onRetry || onDismiss) && /* @__PURE__ */ jsxs("div", { className: "mt-2 flex gap-2", children: [
18074
- onRetry && /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: onRetry, className: "text-destructive", children: "Retry" }),
19042
+ onRetry && /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: onRetry, className: "text-danger-fg", children: "Retry" }),
18075
19043
  onDismiss && /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: onDismiss, children: "Dismiss" })
18076
19044
  ] })
18077
19045
  ] });
@@ -18080,7 +19048,7 @@ function AiDraftCard({
18080
19048
  /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2", !collapsed && "mb-2"), children: [
18081
19049
  /* @__PURE__ */ jsx(SparkleIcon, { size: 14, className: "text-brand" }),
18082
19050
  /* @__PURE__ */ jsx("span", { className: "text-xs font-bold text-brand", children: title }),
18083
- contextLine && /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-muted-foreground", children: contextLine }),
19051
+ contextLine && /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-fg-3", children: contextLine }),
18084
19052
  /* @__PURE__ */ jsx(
18085
19053
  "button",
18086
19054
  {
@@ -18089,14 +19057,23 @@ function AiDraftCard({
18089
19057
  "aria-expanded": !collapsed,
18090
19058
  "aria-label": collapsed ? "Expand AI draft" : "Collapse AI draft",
18091
19059
  title: collapsed ? "Show draft" : "Hide draft",
18092
- className: "ml-auto -mr-1 shrink-0 rounded p-1 text-brand/70 transition-colors hover:bg-brand/10 hover:text-brand focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
18093
- children: /* @__PURE__ */ jsx(ChevronDownIcon, { size: 16, className: cn("transition-transform", collapsed && "-rotate-90") })
19060
+ className: "ml-auto -mr-1 shrink-0 rounded p-1 text-brand/70 transition-colors hover:bg-brand-bg hover:text-brand focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none motion-reduce:transition-none",
19061
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, { size: 16, className: cn("transition-transform motion-reduce:transition-none", collapsed && "-rotate-90") })
18094
19062
  }
18095
19063
  )
18096
19064
  ] }),
18097
19065
  !collapsed && /* @__PURE__ */ jsxs(Fragment, { children: [
18098
- subject && /* @__PURE__ */ jsx("p", { className: "mb-1.5 text-sm font-semibold text-foreground", children: subject }),
18099
- /* @__PURE__ */ jsx("div", { className: "max-h-[140px] overflow-y-auto text-sm font-medium leading-relaxed text-foreground", children }),
19066
+ subject && /* @__PURE__ */ jsx("p", { className: "mb-1.5 text-sm font-semibold text-fg", children: subject }),
19067
+ /* @__PURE__ */ jsx(
19068
+ "div",
19069
+ {
19070
+ role: "region",
19071
+ "aria-label": `${title} content`,
19072
+ tabIndex: 0,
19073
+ className: "max-h-[140px] overflow-y-auto text-sm font-medium leading-relaxed text-fg focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
19074
+ children
19075
+ }
19076
+ ),
18100
19077
  actions && /* @__PURE__ */ jsx("div", { className: "mt-3 flex flex-wrap items-center gap-2", children: actions })
18101
19078
  ] })
18102
19079
  ] });
@@ -18138,36 +19115,36 @@ function EmailMessageCard({
18138
19115
  !isOutbound && avatar && /* @__PURE__ */ jsx("span", { className: "mt-7 shrink-0", children: avatar }),
18139
19116
  /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-col gap-1", isOutbound ? "items-end" : "items-start"), children: [
18140
19117
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 px-1", children: [
18141
- /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-foreground", children: senderName }),
18142
- /* @__PURE__ */ jsxs("span", { className: "text-[10px] text-muted-foreground", children: [
19118
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-fg", children: senderName }),
19119
+ /* @__PURE__ */ jsxs("span", { className: "text-[10px] text-fg-3", children: [
18143
19120
  "via ",
18144
19121
  via
18145
19122
  ] }),
18146
- /* @__PURE__ */ jsx("span", { className: "text-[10px] text-muted-foreground", children: "\xB7" }),
18147
- /* @__PURE__ */ jsx("span", { className: "text-[10px] text-muted-foreground", children: time })
19123
+ /* @__PURE__ */ jsx("span", { className: "text-[10px] text-fg-3", children: "\xB7" }),
19124
+ /* @__PURE__ */ jsx("span", { className: "text-[10px] text-fg-3", children: time })
18148
19125
  ] }),
18149
19126
  /* @__PURE__ */ jsxs(
18150
19127
  "div",
18151
19128
  {
18152
19129
  className: cn(
18153
- "w-full max-w-2xl overflow-hidden rounded-xl border bg-card shadow-sm",
18154
- isOutbound ? "border-brand/30" : "border-border"
19130
+ "w-full max-w-2xl overflow-hidden rounded-xl border bg-surface shadow-sm",
19131
+ isOutbound ? "border-brand/30" : "border-rule"
18155
19132
  ),
18156
19133
  children: [
18157
- /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2.5 border-b border-border bg-brand/5 px-3.5 py-2.5", children: [
19134
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2.5 border-b border-rule bg-brand-bg px-3.5 py-2.5", children: [
18158
19135
  /* @__PURE__ */ jsx("span", { className: "flex size-8 shrink-0 items-center justify-center rounded-lg border border-brand/20 bg-brand/10 text-brand", children: /* @__PURE__ */ jsx(MailIcon, { size: 16 }) }),
18159
19136
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
18160
19137
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
18161
19138
  /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded px-1.5 py-px text-[10px] font-bold uppercase tracking-wider text-brand", children: "Email" }),
18162
- subjectText && /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate text-sm font-semibold text-foreground", children: subjectText })
19139
+ subjectText && /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate text-sm font-semibold text-fg", children: subjectText })
18163
19140
  ] }),
18164
- /* @__PURE__ */ jsxs("div", { className: "mt-0.5 flex flex-wrap items-center gap-1.5 text-[10px] text-muted-foreground", children: [
19141
+ /* @__PURE__ */ jsxs("div", { className: "mt-0.5 flex flex-wrap items-center gap-1.5 text-[10px] text-fg-3", children: [
18165
19142
  /* @__PURE__ */ jsxs("span", { children: [
18166
19143
  "From ",
18167
- /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground/80", children: senderName })
19144
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-fg/80", children: senderName })
18168
19145
  ] }),
18169
19146
  ccCount > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
18170
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground/60", children: "\xB7" }),
19147
+ /* @__PURE__ */ jsx("span", { className: "text-fg-3/60", children: "\xB7" }),
18171
19148
  /* @__PURE__ */ jsxs("span", { children: [
18172
19149
  "Cc ",
18173
19150
  ccCount
@@ -18175,7 +19152,7 @@ function EmailMessageCard({
18175
19152
  ] })
18176
19153
  ] })
18177
19154
  ] }),
18178
- /* @__PURE__ */ jsx("span", { className: "shrink-0 whitespace-nowrap pt-0.5 text-[10px] text-muted-foreground", children: time })
19155
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 whitespace-nowrap pt-0.5 text-[10px] text-fg-3", children: time })
18179
19156
  ] }),
18180
19157
  /* @__PURE__ */ jsxs("div", { className: "relative", children: [
18181
19158
  /* @__PURE__ */ jsx(
@@ -18183,13 +19160,13 @@ function EmailMessageCard({
18183
19160
  {
18184
19161
  ref: bodyRef,
18185
19162
  className: cn(
18186
- "px-4 py-3 text-sm leading-relaxed text-foreground",
19163
+ "px-4 py-3 text-sm leading-relaxed text-fg",
18187
19164
  clamped && "max-h-56 overflow-hidden"
18188
19165
  ),
18189
19166
  children
18190
19167
  }
18191
19168
  ),
18192
- clamped && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-0 h-14 bg-gradient-to-b from-transparent to-card" })
19169
+ clamped && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-0 h-14 bg-gradient-to-b from-transparent to-surface" })
18193
19170
  ] }),
18194
19171
  needsClamp && /* @__PURE__ */ jsxs(
18195
19172
  "button",
@@ -18197,14 +19174,14 @@ function EmailMessageCard({
18197
19174
  type: "button",
18198
19175
  onClick: () => setExpanded((v) => !v),
18199
19176
  "aria-expanded": expanded,
18200
- className: "flex w-full items-center justify-center gap-1.5 border-t border-border/60 bg-card py-1.5 text-xs font-medium text-brand transition-colors hover:bg-muted/40",
19177
+ className: "flex w-full items-center justify-center gap-1.5 border-t border-rule/60 bg-surface py-1.5 text-xs font-medium text-brand transition-colors hover:bg-bg-2/40 motion-reduce:transition-none",
18201
19178
  children: [
18202
19179
  expanded ? "Show less" : "Show full email",
18203
- /* @__PURE__ */ jsx(ChevronDownIcon, { size: 13, className: cn("transition-transform", expanded && "rotate-180") })
19180
+ /* @__PURE__ */ jsx(ChevronDownIcon, { size: 13, className: cn("transition-transform motion-reduce:transition-none", expanded && "rotate-180") })
18204
19181
  ]
18205
19182
  }
18206
19183
  ),
18207
- hasFooter && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2 border-t border-border bg-muted/30 px-3 py-2", children: [
19184
+ hasFooter && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2 border-t border-rule bg-bg-2/30 px-3 py-2", children: [
18208
19185
  /* @__PURE__ */ jsx("div", { className: "min-w-0", children: attachments }),
18209
19186
  /* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
18210
19187
  status,
@@ -18232,8 +19209,8 @@ function SignatureEditor({
18232
19209
  className
18233
19210
  }) {
18234
19211
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col", className), children: [
18235
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-border px-3 py-2", children: [
18236
- /* @__PURE__ */ jsx("p", { className: "text-xs font-semibold text-foreground", children: title }),
19212
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-b border-rule px-3 py-2", children: [
19213
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-semibold text-fg", children: title }),
18237
19214
  onAddImage && /* @__PURE__ */ jsxs(
18238
19215
  Button,
18239
19216
  {
@@ -18251,8 +19228,8 @@ function SignatureEditor({
18251
19228
  }
18252
19229
  )
18253
19230
  ] }),
18254
- /* @__PURE__ */ jsx("div", { className: "p-3", children: loading ? /* @__PURE__ */ jsx("div", { className: "h-32 animate-pulse rounded-md bg-muted" }) : children }),
18255
- (onSave || onInsert) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-2 border-t border-border px-3 py-2", children: [
19231
+ /* @__PURE__ */ jsx("div", { className: "p-3", children: loading ? /* @__PURE__ */ jsx("div", { className: "h-32 animate-pulse rounded-md bg-bg-2 motion-reduce:animate-none" }) : children }),
19232
+ (onSave || onInsert) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-2 border-t border-rule px-3 py-2", children: [
18256
19233
  onSave && /* @__PURE__ */ jsx(
18257
19234
  Button,
18258
19235
  {
@@ -18400,7 +19377,7 @@ function DisplayMenu({
18400
19377
  showDot && /* @__PURE__ */ jsx(
18401
19378
  "span",
18402
19379
  {
18403
- className: "absolute -right-1 -top-1 size-2 rounded-full bg-foreground",
19380
+ className: "absolute -right-1 -top-1 size-2 rounded-full bg-fg",
18404
19381
  "aria-hidden": "true"
18405
19382
  }
18406
19383
  )
@@ -18424,8 +19401,8 @@ function DisplayMenu({
18424
19401
  }
18425
19402
  },
18426
19403
  children: /* @__PURE__ */ jsxs("div", { ref: panelRef, className: "relative", children: [
18427
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 border-b border-border px-2.5 py-1.5", children: [
18428
- /* @__PURE__ */ jsx(SearchIcon, { size: 13, className: "shrink-0 text-muted-foreground", "aria-hidden": "true" }),
19404
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 border-b border-rule px-2.5 py-1.5", children: [
19405
+ /* @__PURE__ */ jsx(SearchIcon, { size: 13, className: "shrink-0 text-fg-3", "aria-hidden": "true" }),
18429
19406
  /* @__PURE__ */ jsx(
18430
19407
  "input",
18431
19408
  {
@@ -18434,7 +19411,7 @@ function DisplayMenu({
18434
19411
  onChange: (e) => setRootQuery(e.target.value),
18435
19412
  placeholder: "Filter\u2026",
18436
19413
  "aria-label": "Filter options and values",
18437
- className: "h-6 w-full bg-transparent text-[13px] text-foreground outline-none placeholder:text-muted-foreground"
19414
+ className: "h-6 w-full bg-transparent text-[13px] text-fg outline-none placeholder:text-fg-3"
18438
19415
  }
18439
19416
  )
18440
19417
  ] }),
@@ -18460,19 +19437,19 @@ function DisplayMenu({
18460
19437
  setOpenKey(null);
18461
19438
  },
18462
19439
  onClick: () => section2.onSelect(option.key),
18463
- className: "flex w-full items-center gap-1.5 rounded-md px-2 py-1.5 text-left text-[13px] transition-colors hover:bg-muted/60 focus-visible:bg-muted/60 focus-visible:outline-none",
19440
+ className: "flex w-full items-center gap-1.5 rounded-md px-2 py-1.5 text-left text-[13px] transition-colors hover:bg-bg-2/60 focus-visible:bg-bg-2/60 focus-visible:outline-none motion-reduce:transition-none",
18464
19441
  children: [
18465
- section2.icon && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-muted-foreground", "aria-hidden": "true", children: section2.icon }),
18466
- /* @__PURE__ */ jsx("span", { className: "shrink-0 truncate text-muted-foreground", children: section2.label }),
19442
+ section2.icon && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-fg-3", "aria-hidden": "true", children: section2.icon }),
19443
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 truncate text-fg-3", children: section2.label }),
18467
19444
  /* @__PURE__ */ jsx(
18468
19445
  ChevronRightIcon,
18469
19446
  {
18470
19447
  size: 12,
18471
- className: "shrink-0 text-muted-foreground",
19448
+ className: "shrink-0 text-fg-3",
18472
19449
  "aria-hidden": "true"
18473
19450
  }
18474
19451
  ),
18475
- /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-foreground", children: option.label }),
19452
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-fg", children: option.label }),
18476
19453
  isActive && /* @__PURE__ */ jsx(CheckIcon, { size: 14, className: "shrink-0 text-brand" })
18477
19454
  ]
18478
19455
  },
@@ -18519,15 +19496,15 @@ function DisplayMenu({
18519
19496
  }
18520
19497
  },
18521
19498
  className: cn(
18522
- "flex min-w-0 flex-1 items-center gap-2 rounded-md px-2 py-1.5 text-left text-[13px] text-foreground transition-colors hover:bg-muted/60 focus-visible:bg-muted/60 focus-visible:outline-none",
18523
- isOpen && "bg-muted/60"
19499
+ "flex min-w-0 flex-1 items-center gap-2 rounded-md px-2 py-1.5 text-left text-[13px] text-fg transition-colors hover:bg-bg-2/60 focus-visible:bg-bg-2/60 focus-visible:outline-none motion-reduce:transition-none",
19500
+ isOpen && "bg-bg-2/60"
18524
19501
  ),
18525
19502
  children: [
18526
- section.icon && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-muted-foreground", "aria-hidden": "true", children: section.icon }),
19503
+ section.icon && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-fg-3", "aria-hidden": "true", children: section.icon }),
18527
19504
  /* @__PURE__ */ jsx("span", { className: "flex-1 truncate", children: section.label }),
18528
19505
  section.mode === "multi" && count > 0 && /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded-full bg-brand-bg px-1.5 text-[11px] font-medium text-brand", children: count }),
18529
- section.mode !== "multi" && valueLabel && /* @__PURE__ */ jsx("span", { className: "max-w-24 shrink-0 truncate text-[13px] text-muted-foreground", children: valueLabel }),
18530
- /* @__PURE__ */ jsx(ChevronRightIcon, { size: 13, className: "shrink-0 text-muted-foreground" })
19506
+ section.mode !== "multi" && valueLabel && /* @__PURE__ */ jsx("span", { className: "max-w-24 shrink-0 truncate text-[13px] text-fg-3", children: valueLabel }),
19507
+ /* @__PURE__ */ jsx(ChevronRightIcon, { size: 13, className: "shrink-0 text-fg-3" })
18531
19508
  ]
18532
19509
  }
18533
19510
  ),
@@ -18540,14 +19517,14 @@ function DisplayMenu({
18540
19517
  })
18541
19518
  }
18542
19519
  ),
18543
- /* @__PURE__ */ jsx("div", { className: "border-t border-border p-1", children: /* @__PURE__ */ jsxs(
19520
+ /* @__PURE__ */ jsx("div", { className: "border-t border-rule p-1", children: /* @__PURE__ */ jsxs(
18544
19521
  Button,
18545
19522
  {
18546
19523
  variant: "ghost",
18547
19524
  size: "sm",
18548
19525
  onClick: onReset,
18549
19526
  disabled: isAtDefault,
18550
- className: "h-7 w-full justify-start gap-1.5 px-2 text-xs text-muted-foreground hover:text-foreground",
19527
+ className: "h-7 w-full justify-start gap-1.5 px-2 text-xs text-fg-3 hover:text-fg",
18551
19528
  children: [
18552
19529
  /* @__PURE__ */ jsx(RotateCcwIcon, { size: 13 }),
18553
19530
  "Reset to default"
@@ -18566,7 +19543,7 @@ function DisplayMenu({
18566
19543
  // Column + overflow-hidden so the option list (the only flexible
18567
19544
  // part) absorbs the height cap, while the search box and Clear
18568
19545
  // footer stay pinned and fully visible.
18569
- "absolute z-50 flex flex-col overflow-hidden rounded-lg border border-border bg-popover shadow-md",
19546
+ "absolute z-50 flex flex-col overflow-hidden rounded-lg border border-rule bg-surface shadow-md motion-reduce:transition-none",
18570
19547
  // -mx-1 lets the flyout tuck against the panel so there's no
18571
19548
  // dead gap for the cursor to fall through on the way over.
18572
19549
  flyout.side === "left" ? "right-full -mr-1" : "left-full -ml-1"
@@ -18574,8 +19551,8 @@ function DisplayMenu({
18574
19551
  onMouseEnter: clearTimers,
18575
19552
  onMouseLeave: scheduleClose,
18576
19553
  children: [
18577
- showFlyoutSearch && /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-1.5 border-b border-border px-2.5 py-1.5", children: [
18578
- /* @__PURE__ */ jsx(SearchIcon, { size: 13, className: "shrink-0 text-muted-foreground", "aria-hidden": "true" }),
19554
+ showFlyoutSearch && /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-1.5 border-b border-rule px-2.5 py-1.5", children: [
19555
+ /* @__PURE__ */ jsx(SearchIcon, { size: 13, className: "shrink-0 text-fg-3", "aria-hidden": "true" }),
18579
19556
  /* @__PURE__ */ jsx(
18580
19557
  "input",
18581
19558
  {
@@ -18584,7 +19561,7 @@ function DisplayMenu({
18584
19561
  onChange: (e) => setSectionQuery(e.target.value),
18585
19562
  placeholder: `Filter ${activeSection.label.toLowerCase()}\u2026`,
18586
19563
  "aria-label": `Filter ${activeSection.label}`,
18587
- className: "h-6 w-full bg-transparent text-[13px] text-foreground outline-none placeholder:text-muted-foreground"
19564
+ className: "h-6 w-full bg-transparent text-[13px] text-fg outline-none placeholder:text-fg-3"
18588
19565
  }
18589
19566
  )
18590
19567
  ] }),
@@ -18619,8 +19596,8 @@ function DisplayMenu({
18619
19596
  }
18620
19597
  },
18621
19598
  className: cn(
18622
- "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-[13px] transition-colors hover:bg-muted/60 focus-visible:bg-muted/60 focus-visible:outline-none",
18623
- isActive ? "text-foreground" : "text-muted-foreground hover:text-foreground"
19599
+ "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-[13px] transition-colors hover:bg-bg-2/60 focus-visible:bg-bg-2/60 focus-visible:outline-none motion-reduce:transition-none",
19600
+ isActive ? "text-fg" : "text-fg-3 hover:text-fg"
18624
19601
  ),
18625
19602
  children: [
18626
19603
  isMulti && /* @__PURE__ */ jsx(
@@ -18629,7 +19606,7 @@ function DisplayMenu({
18629
19606
  "aria-hidden": "true",
18630
19607
  className: cn(
18631
19608
  "flex size-3.5 shrink-0 items-center justify-center rounded border transition-colors",
18632
- isActive ? "border-brand bg-brand text-fg-on-brand" : "border-border"
19609
+ isActive ? "border-brand bg-brand text-fg-on-brand" : "border-rule"
18633
19610
  ),
18634
19611
  children: isActive && /* @__PURE__ */ jsx(CheckIcon, { size: 10 })
18635
19612
  }
@@ -18641,13 +19618,13 @@ function DisplayMenu({
18641
19618
  option.key
18642
19619
  );
18643
19620
  }) }),
18644
- activeSection.mode === "multi" && activeSection.selected.size > 0 && activeSection.onClear && /* @__PURE__ */ jsx("div", { className: "shrink-0 border-t border-border p-1", children: /* @__PURE__ */ jsxs(
19621
+ activeSection.mode === "multi" && activeSection.selected.size > 0 && activeSection.onClear && /* @__PURE__ */ jsx("div", { className: "shrink-0 border-t border-rule p-1", children: /* @__PURE__ */ jsxs(
18645
19622
  Button,
18646
19623
  {
18647
19624
  variant: "ghost",
18648
19625
  size: "sm",
18649
19626
  onClick: activeSection.onClear,
18650
- className: "h-6 w-full justify-start px-2 text-[11px] text-muted-foreground hover:text-foreground",
19627
+ className: "h-6 w-full justify-start px-2 text-[11px] text-fg-3 hover:text-fg",
18651
19628
  children: [
18652
19629
  "Clear ",
18653
19630
  activeSection.selected.size,
@@ -18664,8 +19641,168 @@ function DisplayMenu({
18664
19641
  ] });
18665
19642
  }
18666
19643
  function EmptyRow({ label = "No matches" }) {
18667
- return /* @__PURE__ */ jsx("p", { className: "px-2 py-3 text-center text-[11px] text-muted-foreground", children: label });
19644
+ return /* @__PURE__ */ jsx("p", { className: "px-2 py-3 text-center text-[11px] text-fg-3", children: label });
19645
+ }
19646
+ var StickyStackContext = React39.createContext(null);
19647
+ function StickyStack({ layers, top = 0, children }) {
19648
+ const [layerHeights, setLayerHeights] = React39.useState({});
19649
+ const normalizedLayers = React39.useMemo(() => {
19650
+ const names = [...layers];
19651
+ if (new Set(names).size !== names.length) {
19652
+ throw new Error("StickyStack layer names must be unique.");
19653
+ }
19654
+ return names;
19655
+ }, [layers]);
19656
+ const setLayerHeight = React39.useCallback((name, height) => {
19657
+ setLayerHeights((current) => {
19658
+ if (current[name] === height) return current;
19659
+ return { ...current, [name]: height };
19660
+ });
19661
+ }, []);
19662
+ const value = React39.useMemo(
19663
+ () => ({ layers: normalizedLayers, layerHeights, setLayerHeight, top }),
19664
+ [layerHeights, normalizedLayers, setLayerHeight, top]
19665
+ );
19666
+ return /* @__PURE__ */ jsx(StickyStackContext, { value, children });
18668
19667
  }
19668
+ function useStickyStack(componentName) {
19669
+ const context = React39.use(StickyStackContext);
19670
+ if (!context) {
19671
+ throw new Error(`${componentName} must be rendered inside StickyStack.`);
19672
+ }
19673
+ return context;
19674
+ }
19675
+ function cssLength(value) {
19676
+ return typeof value === "number" ? `${value}px` : value ?? "0px";
19677
+ }
19678
+ function stackOffset(context, layerName, includeNamedLayer) {
19679
+ const { layers, layerHeights, top } = context;
19680
+ let endIndex = layers.length;
19681
+ if (layerName !== void 0) {
19682
+ const index = layers.indexOf(layerName);
19683
+ if (index === -1) {
19684
+ throw new Error(`Unknown StickyStack layer "${layerName}".`);
19685
+ }
19686
+ endIndex = includeNamedLayer ? index + 1 : index;
19687
+ }
19688
+ const measuredOffset = layers.slice(0, endIndex).reduce((total, name) => total + (layerHeights[name] ?? 0), 0);
19689
+ const base = cssLength(top);
19690
+ return measuredOffset === 0 ? base : `calc(${base} + ${measuredOffset}px)`;
19691
+ }
19692
+ var StickyStackLayer = React39.forwardRef(
19693
+ function StickyStackLayer2({ name, hostClassName, className, children, style, ...props }, forwardedRef) {
19694
+ const context = useStickyStack("StickyStackLayer");
19695
+ const { setLayerHeight } = context;
19696
+ const top = stackOffset(context, name, false);
19697
+ const hostRef = React39.useRef(null);
19698
+ const layerRef = React39.useRef(null);
19699
+ const [bounds, setBounds] = React39.useState({
19700
+ height: 0,
19701
+ left: 0,
19702
+ ready: false,
19703
+ width: 0
19704
+ });
19705
+ const setLayerRef = React39.useCallback(
19706
+ (node) => {
19707
+ layerRef.current = node;
19708
+ if (typeof forwardedRef === "function") forwardedRef(node);
19709
+ else if (forwardedRef) forwardedRef.current = node;
19710
+ },
19711
+ [forwardedRef]
19712
+ );
19713
+ const measure = React39.useCallback(() => {
19714
+ const host = hostRef.current;
19715
+ const layer = layerRef.current;
19716
+ if (!host || !layer) return;
19717
+ const hostRect = host.getBoundingClientRect();
19718
+ const layerRect = layer.getBoundingClientRect();
19719
+ const next = {
19720
+ height: Math.ceil(layerRect.height),
19721
+ left: hostRect.left,
19722
+ ready: hostRect.width > 0,
19723
+ width: hostRect.width
19724
+ };
19725
+ setBounds(
19726
+ (current) => current.height === next.height && current.left === next.left && current.ready === next.ready && current.width === next.width ? current : next
19727
+ );
19728
+ setLayerHeight(name, next.height);
19729
+ }, [name, setLayerHeight]);
19730
+ React39.useLayoutEffect(() => {
19731
+ measure();
19732
+ let frame = 0;
19733
+ const scheduleMeasure = () => {
19734
+ cancelAnimationFrame(frame);
19735
+ frame = requestAnimationFrame(measure);
19736
+ };
19737
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(scheduleMeasure);
19738
+ if (hostRef.current) observer?.observe(hostRef.current);
19739
+ if (layerRef.current) observer?.observe(layerRef.current);
19740
+ window.addEventListener("resize", scheduleMeasure);
19741
+ window.addEventListener("scroll", scheduleMeasure, true);
19742
+ return () => {
19743
+ cancelAnimationFrame(frame);
19744
+ observer?.disconnect();
19745
+ window.removeEventListener("resize", scheduleMeasure);
19746
+ window.removeEventListener("scroll", scheduleMeasure, true);
19747
+ setLayerHeight(name, 0);
19748
+ };
19749
+ }, [measure, name, setLayerHeight]);
19750
+ return /* @__PURE__ */ jsx(
19751
+ "div",
19752
+ {
19753
+ ref: hostRef,
19754
+ className: cn("relative", hostClassName),
19755
+ style: { height: bounds.ready ? bounds.height : void 0 },
19756
+ "data-sticky-stack-host": name,
19757
+ children: /* @__PURE__ */ jsx(
19758
+ "div",
19759
+ {
19760
+ ref: setLayerRef,
19761
+ className,
19762
+ style: {
19763
+ ...style,
19764
+ position: bounds.ready ? "fixed" : "sticky",
19765
+ top,
19766
+ left: bounds.ready ? bounds.left : void 0,
19767
+ width: bounds.ready ? bounds.width : void 0,
19768
+ boxSizing: "border-box",
19769
+ zIndex: style?.zIndex ?? "var(--z-sticky)"
19770
+ },
19771
+ "data-sticky-stack-layer": name,
19772
+ ...props,
19773
+ children
19774
+ }
19775
+ )
19776
+ }
19777
+ );
19778
+ }
19779
+ );
19780
+ StickyStackLayer.displayName = "StickyStackLayer";
19781
+ var StickyStackSticky = React39.forwardRef(
19782
+ function StickyStackSticky2({ after, className, style, ...props }, ref) {
19783
+ const context = useStickyStack("StickyStackSticky");
19784
+ const top = stackOffset(context, after, true);
19785
+ return /* @__PURE__ */ jsx(
19786
+ "div",
19787
+ {
19788
+ ref,
19789
+ className: cn("sticky", className),
19790
+ style: {
19791
+ ...style,
19792
+ top,
19793
+ zIndex: style?.zIndex ?? "calc(var(--z-sticky) - 1)"
19794
+ },
19795
+ "data-sticky-stack-sticky": "",
19796
+ ...props
19797
+ }
19798
+ );
19799
+ }
19800
+ );
19801
+ StickyStackSticky.displayName = "StickyStackSticky";
19802
+ var StickyStackSectionHeader = React39.forwardRef(function StickyStackSectionHeader2(props, ref) {
19803
+ return /* @__PURE__ */ jsx(StickyStackSticky, { ref, "data-sticky-stack-section-header": "", ...props });
19804
+ });
19805
+ StickyStackSectionHeader.displayName = "StickyStackSectionHeader";
18669
19806
  function brandScope(product) {
18670
19807
  return { "data-brand": product };
18671
19808
  }
@@ -18691,6 +19828,6 @@ var BrandScope = forwardRef(function BrandScope2({ product, children, ...props }
18691
19828
  });
18692
19829
  BrandScope.displayName = "BrandScope";
18693
19830
 
18694
- export { AIReceiptPanel, Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityEventItem, ActivityItem, ActivityList, AgreementPaneHeading, AgreementViewer, AiDraftCard, Alert, AlertCircleIcon, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AlertTriangleIcon, AlertTriangleSolidIcon, AppHeader, AppHeaderActions, AppHeaderBreadcrumb, AppHeaderSearch, AppHeaderTitle, AreaChart, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightSmallIcon, ArrowUpIcon, AspectRatio, Assignee, AssureAuditBrandIcon, AssureBooksBrandIcon, AssureProBrandIcon, AssureTaxBrandIcon, AtSignIcon, AttachmentChip, AttentionItem, Avatar, BRAND_PRODUCTS, Badge, BarChartIcon, BellIcon, Blockquote, BoldIcon, BottomNav, BrandScope, BrandScopeProvider, Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BriefcaseIcon, Building2Icon, BuildingIcon, BulkActionBar, BulkActionBarAction, BulkActionBarSeparator, Button, COUNTRY_CODES, Calendar, CalendarIcon, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CategoryDivider, CategoryTag, ChannelTabs, ChatBubbleIcon, CheckCircle2Icon, CheckCircleSolidIcon, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, ClientRailGroupHeader, ClientRailItem, ClientSelect, ClipboardCheckIcon, ClockIcon, CloseIcon, Collapsible, CollapsibleContent, CollapsibleTrigger, ComingSoon, CommandIcon, CommandPalette, ConfirmActionButton, Content16 as Content, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyIcon, CornerDownLeftIcon, CountryFlag, CountrySelect, CreditCardIcon, DATE_DISPLAY_PLACEHOLDER, DangerAction, Dash, DashGrid, DataItem, DataTable, DataTableBody, DataTableCell, DataTableCellDue, DataTableCellId, DataTableCellMono, DataTableCellName, DataTableCheckbox, DataTableHead, DataTableHeader, DataTablePagination, DataTableResultsCount, DataTableRow, DataTableSearch, DataTableSpacer, DataTableToolbar, DataTableView, DatePicker, DateRangePicker, DetailGrid, DetailMain, DetailSpine, DetailSpineHeader, DetailSpineSection, DetailSpineStats, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DismissibleChip, DisplayMenu, DocumentChecklist, DocumentDetailActions, DocumentDetailBody, DocumentDetailHeader, DocumentDetailMetaRow, DocumentDetailPanel, DocumentDetailRequester, DocumentDetailTitle, DocumentFileCard, DocumentFileLine, DocumentFileRow, DocumentIcon, DocumentList, DocumentListSection, DocumentRequestCard, DocumentRequestDetail, DocumentRequestField, DocumentRequestUpload, DocumentRow, DocumentSourceFilter, DocumentSourceTag, DocumentsWorkspaceLayout, DollarSignIcon, DonutChart, DownloadIcon, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmailMessageCard, EmptyState, EngagementCard, EngagementTimeline, EngagementTimelineStep, ExtractIcon, EyeIcon, EyeOffIcon, Eyebrow, FileChip, FileIcon, FileReturnIcon, FileTextIcon, FileTypeBadge, FileUpload, FilterChip, FilterIcon, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FolderTree, FolderUpIcon, FormError, FormSection, FormSuccess, GlobeIcon, GoogleBrandIcon, Grid, HelpCircleIcon, HistoryIcon, HomeIcon, HoverCard, HoverCardContent, HoverCardPortal, HoverCardTrigger, IconAction, IconTile, InboxIcon, InfoCircleSolidIcon, InfoIcon, Input, IntentBadge, ItalicIcon, Kanban, KanbanCard, KanbanColumn, KanbanIcon, KbdHint, KeyIcon, KeyboardShortcutsDialog, KpiCard, Label4 as Label, LandmarkIcon, LayoutDashboardIcon, LayoutGridIcon, LayoutListIcon, LightningIcon, Link2Icon, LinkAction, LinkButton, LinkIcon, ListChecksIcon, ListIcon, ListOrderedIcon, LoaderIcon, LoadingRows, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, Logo, MailIcon, Main, MapPinIcon, MasterDetailLayout, MenuIcon, MessageBubble, MessageBubbleAction, MessageBubbleTombstone, MessageCircleIcon, MessageCircleWarningIcon, MessageComposer, MetadataGrid, MicrosoftBrandIcon, MinusIcon, MissingDocumentsPanel, MoneyCell, MonitorIcon, MoonIcon, MoreHorizontalIcon, MoveIcon, MultiFilterPill, MultiSelectField, MutedSpec, NewMenu, NotificationFilter, NotificationItem, NotificationList, NotificationPanel, NotificationPanelFooter, NotificationPanelHeader, Numeric, OTPInput, PageHeader, PageHeaderSep, PageHeaderSpec, Pagination, PaletteIcon, PanelLeftCloseIcon, PanelLeftIcon, PaperclipIcon, PauseIcon, PdfPreview, PenSignIcon, PenToolIcon, PencilIcon, PhoneCountryInput, PhoneIcon, PhoneInput, PlayIcon, PlusIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PrimaryAction, PriorityIcon, ProgressBar, ProgressRing, ProposalAddOn, ProposalBillingTerms, ProposalConsentGate, ProposalCustomPage, ProposalNote, ProposalPackageCard, ProposalPaymentCapture, ProposalPricingSummary, ProposalServiceRow, ProposalSignatureBlock, ProposalSignerList, QuestionnairePanel, Questions, RadioGroup3 as RadioGroup, RadioGroupItem, RankedBars, ReceiptIcon, ReplyIcon, ResponsiveDialog, RotateCcwIcon, RouteTransition, SERVICE_TONES, SaveIcon, ScrollArea, ScrollBar, SearchIcon, SearchInput, SearchSelect, SecondaryAction, Section, SectionHead, SectionHeader, SegmentedProgress, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectRoot, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SelectableKpiCard, SendIcon, Separator4 as Separator, SettingsIcon, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Shell, ShieldIcon, SideDrawer, Sidebar, SidebarBrand, SidebarBrandSwitcher, SidebarBrandSwitcherTile, SidebarBrandText, SidebarFooter, SidebarLink, SidebarLinkAction, SidebarLinkBadge, SidebarLinkGroup, SidebarLinkLabel, SidebarPinButton, SidebarProvider, SidebarSection, SidebarTrigger, SidebarUser, SignatureEditor, Skeleton, SkeletonCircle, SkeletonText, SlashIcon, Slider, SmartphoneIcon, SparkleIcon, SparklesIcon, Spinner, SpreadsheetPreview, StackedBarChart, StagePill, StarIcon, StarRating, Stat, StatusDot, StatusIcon, StatusPill, Stepper, StickyActionBar, StopIcon, StrikethroughIcon, SubmitButton, SuggestionPills, SuiteProgress, SunIcon, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableIcon, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagIcon, TagsCell, TeamIcon, TeamMemberSelect, Textarea, TimeLogger, TimeLoggerActions, TimeLoggerBillable, TimeLoggerContextRow, TimeLoggerEntry, TimeLoggerEntryList, TimeLoggerField, TimeLoggerFooter, TimeLoggerHeader, TimeLoggerNotes, TimeLoggerTimer, ToastProvider, ToggleGroup, ToggleGroupItem, Toolbar, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Trash2Icon, TrashIcon, TrendingDownIcon, TrendingUpIcon, UnderlineIcon, UploadIcon, UserCircleIcon, UserIcon, UsersIcon, VisuallyHidden, WorkflowIcon, XCircleSolidIcon, XIcon, YEAR_DISPLAY_PLACEHOLDER, ZoomInIcon, ZoomOutIcon, alertVariants, applyMask, applyYearMask, attachmentChipVariants, badgeVariants, brandLabel, brandScope, buttonVariants, cardVariants, cn, colors, dateToIso, displayToIso, fileTypeBadgeVariants, fileTypeFromName, filterChipVariants, formatClock, formatCurrency, formatDuration, getFlagEmoji, iconTileVariants, inputVariants, isoToDate, isoToDisplay, isoToYear, labelVariants, parseDuration, parsePhoneForEditing, progressBarVariants, progressRingVariants, radii, reference, searchInputVariants, serviceToneLabel, serviceToneStyle, shadows, sidebarLinkBadgeVariants, spacing, spinnerVariants, starRatingVariants, statusDotVariants, suiteProgressFillVariants, surfaces, systemTokens, textareaVariants, typography, useBrandScope, useSidebarPeekLock, useSidebarState, useStopwatch, useToast, yearToIso };
19831
+ export { AIReceiptPanel, Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityEventItem, ActivityItem, ActivityList, AgreementPaneHeading, AgreementViewer, AiDraftCard, Alert, AlertCircleIcon, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AlertTriangleIcon, AlertTriangleSolidIcon, AppHeader, AppHeaderActions, AppHeaderBreadcrumb, AppHeaderSearch, AppHeaderTitle, AreaChart, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightSmallIcon, ArrowUpIcon, AspectRatio, Assignee, AssureAuditBrandIcon, AssureBooksBrandIcon, AssureProBrandIcon, AssureTaxBrandIcon, AtSignIcon, AttachmentChip, AttentionItem, Avatar, BRAND_PRODUCTS, Badge, BarChartIcon, BellIcon, Blockquote, BoldIcon, BottomNav, BrandScope, BrandScopeProvider, Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BriefcaseIcon, Building2Icon, BuildingIcon, BulkActionBar, BulkActionBarAction, BulkActionBarSeparator, Button, COUNTRY_CODES, Calendar, CalendarIcon, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CategoryDivider, CategoryTag, ChannelTabs, ChatBubbleIcon, CheckCircle2Icon, CheckCircleSolidIcon, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, ClientRailGroupHeader, ClientRailItem, ClientSelect, ClipboardCheckIcon, ClockIcon, CloseIcon, Collapsible, CollapsibleContent, CollapsibleTrigger, ComingSoon, CommandIcon, CommandPalette, ConfirmActionButton, Content16 as Content, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyIcon, CornerDownLeftIcon, CountryFlag, CountrySelect, CreditCardIcon, DATE_DISPLAY_PLACEHOLDER, DangerAction, Dash, DashGrid, DataItem, DataTable, DataTableBody, DataTableCell, DataTableCellDue, DataTableCellId, DataTableCellMono, DataTableCellName, DataTableCheckbox, DataTableHead, DataTableHeader, DataTablePagination, DataTableResultsCount, DataTableRow, DataTableSearch, DataTableSpacer, DataTableToolbar, DataTableView, DatePicker, DateRangePicker, DetailGrid, DetailMain, DetailSpine, DetailSpineHeader, DetailSpineSection, DetailSpineStats, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DismissibleChip, DisplayMenu, DocumentChecklist, DocumentDetailActions, DocumentDetailBody, DocumentDetailHeader, DocumentDetailMetaRow, DocumentDetailPanel, DocumentDetailRequester, DocumentDetailTitle, DocumentFileCard, DocumentFileLine, DocumentFileRow, DocumentIcon, DocumentList, DocumentListSection, DocumentRequestCard, DocumentRequestDetail, DocumentRequestField, DocumentRequestUpload, DocumentRow, DocumentSourceFilter, DocumentSourceTag, DocumentsWorkspaceLayout, DollarSignIcon, DonutChart, DownloadIcon, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmailMessageCard, EmptyState, EngagementCard, EngagementTimeline, EngagementTimelineStep, ExtractIcon, EyeIcon, EyeOffIcon, Eyebrow, FileChip, FileIcon, FileReturnIcon, FileTextIcon, FileTypeBadge, FileUpload, FilterChip, FilterIcon, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FolderTree, FolderUpIcon, FormError, FormSection, FormSuccess, GlobeIcon, GoogleBrandIcon, Grid, HelpCircleIcon, HistoryIcon, HomeIcon, HoverCard, HoverCardContent, HoverCardPortal, HoverCardTrigger, IconAction, IconTile, InboxIcon, InfoCircleSolidIcon, InfoIcon, Input, IntentBadge, ItalicIcon, Kanban, KanbanCard, KanbanColumn, KanbanIcon, KbdHint, KeyIcon, KeyboardShortcutsDialog, KpiCard, Label4 as Label, LandmarkIcon, LayoutDashboardIcon, LayoutGridIcon, LayoutListIcon, LightningIcon, Link2Icon, LinkAction, LinkButton, LinkIcon, ListChecksIcon, ListIcon, ListOrderedIcon, LoaderIcon, LoadingRows, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, Logo, MailIcon, Main, MapPinIcon, MasterDetailLayout, MenuIcon, MessageBubble, MessageBubbleAction, MessageBubbleTombstone, MessageCircleIcon, MessageCircleWarningIcon, MessageComposer, MetadataGrid, MicrosoftBrandIcon, MinusIcon, MissingDocumentsPanel, MoneyCell, MonitorIcon, MoonIcon, MoreHorizontalIcon, MoveIcon, MultiFilterPill, MultiSelectField, MutedSpec, NewMenu, NotificationFilter, NotificationItem, NotificationList, NotificationPanel, NotificationPanelFooter, NotificationPanelHeader, Numeric, OTPInput, PageHeader, PageHeaderSep, PageHeaderSpec, Pagination, PaletteIcon, PanelLeftCloseIcon, PanelLeftIcon, PaperclipIcon, PauseIcon, PdfPreview, PenSignIcon, PenToolIcon, PencilIcon, PhoneCountryInput, PhoneIcon, PhoneInput, PlayIcon, PlusIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PrimaryAction, PriorityIcon, ProgressBar, ProgressRing, ProposalAddOn, ProposalBillingTerms, ProposalConsentGate, ProposalCustomPage, ProposalNote, ProposalPackageCard, ProposalPaymentCapture, ProposalPricingSummary, ProposalServiceRow, ProposalSignatureBlock, ProposalSignerList, QuestionnairePanel, Questions, RadioGroup3 as RadioGroup, RadioGroupItem, RankedBars, ReceiptIcon, ReplyIcon, ResponsiveDialog, RotateCcwIcon, RouteTransition, SERVICE_TONES, SaveIcon, ScrollArea, ScrollBar, SearchIcon, SearchInput, SearchSelect, SecondaryAction, Section, SectionHead, SectionHeader, SegmentedProgress, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectRoot, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SelectableKpiCard, SendIcon, Separator4 as Separator, SettingsIcon, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Shell, ShieldIcon, SideDrawer, Sidebar, SidebarBrand, SidebarBrandSwitcher, SidebarBrandSwitcherTile, SidebarBrandText, SidebarFooter, SidebarLink, SidebarLinkAction, SidebarLinkBadge, SidebarLinkGroup, SidebarLinkLabel, SidebarPinButton, SidebarProvider, SidebarSection, SidebarTrigger, SidebarUser, SignatureEditor, Skeleton, SkeletonCircle, SkeletonText, SlashIcon, Slider, SmartphoneIcon, SparkleIcon, SparklesIcon, Spinner, SpreadsheetPreview, StackedBarChart, StagePill, StarIcon, StarRating, Stat, StatusDot, StatusIcon, StatusPill, Stepper, StickyActionBar, StickyStack, StickyStackLayer, StickyStackSectionHeader, StickyStackSticky, StopIcon, StrikethroughIcon, SubmitButton, SuggestionPills, SuiteProgress, SunIcon, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableIcon, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagIcon, TagsCell, TeamIcon, TeamMemberSelect, Textarea, TimeLogger, TimeLoggerActions, TimeLoggerBillable, TimeLoggerContextRow, TimeLoggerEntry, TimeLoggerEntryList, TimeLoggerField, TimeLoggerFooter, TimeLoggerHeader, TimeLoggerNotes, TimeLoggerTimer, ToastProvider, ToggleGroup, ToggleGroupItem, Toolbar, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Trash2Icon, TrashIcon, TrendingDownIcon, TrendingUpIcon, UnderlineIcon, UploadIcon, UserCircleIcon, UserIcon, UsersIcon, VisuallyHidden, WorkflowIcon, XCircleSolidIcon, XIcon, YEAR_DISPLAY_PLACEHOLDER, ZoomInIcon, ZoomOutIcon, alertVariants, applyMask, applyYearMask, attachmentChipVariants, badgeVariants, brandLabel, brandScope, buttonVariants, cardVariants, cn, colors, dateToIso, displayToIso, fileTypeBadgeVariants, fileTypeFromName, filterChipVariants, formatClock, formatCurrency, formatDuration, getFlagEmoji, iconTileVariants, inputVariants, isoToDate, isoToDisplay, isoToYear, labelVariants, parseDuration, parsePhoneForEditing, progressBarVariants, progressRingVariants, radii, reference, searchInputVariants, serviceToneLabel, serviceToneStyle, shadows, sidebarLinkBadgeVariants, spacing, spinnerVariants, starRatingVariants, statusDotVariants, suiteProgressFillVariants, surfaces, systemTokens, textareaVariants, typography, useBrandScope, useSidebarPeekLock, useSidebarState, useStopwatch, useToast, yearToIso };
18695
19832
  //# sourceMappingURL=index.js.map
18696
19833
  //# sourceMappingURL=index.js.map