@assure-one/design-system 1.1.0 → 1.3.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
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import * as React36 from 'react';
3
- import { forwardRef, useState, useCallback, useId, useRef, useImperativeHandle, useMemo, useEffect, createContext, useContext } from 'react';
2
+ import * as React37 from 'react';
3
+ import { forwardRef, useId, useRef, useState, useEffect, useCallback, useImperativeHandle, useMemo, createContext, useContext } from 'react';
4
4
  import * as AccordionPrimitive from '@radix-ui/react-accordion';
5
5
  import { clsx } from 'clsx';
6
6
  import { twMerge } from 'tailwind-merge';
@@ -8,8 +8,8 @@ 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';
10
10
  import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio';
11
- import * as AvatarPrimitive from '@radix-ui/react-avatar';
12
11
  import { Slot } from '@radix-ui/react-slot';
12
+ import * as AvatarPrimitive from '@radix-ui/react-avatar';
13
13
  import { DayPicker } from 'react-day-picker';
14
14
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
15
15
  import * as SelectPrimitive from '@radix-ui/react-select';
@@ -91,9 +91,9 @@ var colors = {
91
91
  };
92
92
  var typography = {
93
93
  family: {
94
- display: '"Inter", -apple-system, system-ui, sans-serif',
95
- body: '"Inter", -apple-system, system-ui, sans-serif',
96
- mono: '"Inter", -apple-system, system-ui, sans-serif'
94
+ display: '"Plus Jakarta Sans", -apple-system, system-ui, sans-serif',
95
+ body: '"Plus Jakarta Sans", -apple-system, system-ui, sans-serif',
96
+ mono: '"Plus Jakarta Sans", -apple-system, system-ui, sans-serif'
97
97
  },
98
98
  weight: {
99
99
  regular: 400,
@@ -194,7 +194,7 @@ var systemTokens = {
194
194
  rule: "var(--color-rule)",
195
195
  ruleSoft: "var(--color-rule-soft)",
196
196
  ruleStrong: "var(--color-rule-strong)",
197
- /* Accent (cyan) */
197
+ /* Accent (purple) */
198
198
  accent: "var(--color-accent)",
199
199
  accent2: "var(--color-accent-2)",
200
200
  accentTint: "var(--color-accent-tint)",
@@ -229,8 +229,30 @@ var systemTokens = {
229
229
  warningLine: "var(--color-warning-line)",
230
230
  dangerFg: "var(--color-danger-fg)",
231
231
  dangerBg: "var(--color-danger-bg)",
232
- dangerLine: "var(--color-danger-line)"
232
+ dangerLine: "var(--color-danger-line)",
233
+ /* Data-viz — chart series ramp + area gradient stops */
234
+ chart1: "var(--color-chart-1)",
235
+ chart2: "var(--color-chart-2)",
236
+ chart3: "var(--color-chart-3)",
237
+ chart4: "var(--color-chart-4)",
238
+ chartLine: "var(--color-chart-line)",
239
+ chartAreaFrom: "var(--color-chart-area-from)",
240
+ chartAreaTo: "var(--color-chart-area-to)",
241
+ /* Practice service tones — fill + track tint */
242
+ serviceTax: "var(--color-service-tax)",
243
+ serviceTaxBg: "var(--color-service-tax-bg)",
244
+ serviceAudit: "var(--color-service-audit)",
245
+ serviceAuditBg: "var(--color-service-audit-bg)",
246
+ serviceAccounting: "var(--color-service-accounting)",
247
+ serviceAccountingBg: "var(--color-service-accounting-bg)"
233
248
  },
249
+ /** Ordered chart series ramp — index a series by position, cycle with `% 4`. */
250
+ chart: [
251
+ "var(--color-chart-1)",
252
+ "var(--color-chart-2)",
253
+ "var(--color-chart-3)",
254
+ "var(--color-chart-4)"
255
+ ],
234
256
  gradient: {
235
257
  brand: "var(--gradient-brand)",
236
258
  pro: "var(--gradient-pro)",
@@ -507,6 +529,45 @@ function BuildingIcon({ size = 24, ...props }) {
507
529
  }
508
530
  ) });
509
531
  }
532
+ function LandmarkIcon({ size = 24, ...props }) {
533
+ return /* @__PURE__ */ jsx(Icon, { size, ...props, children: /* @__PURE__ */ jsx(
534
+ "path",
535
+ {
536
+ d: "M3 22h18M6 18v-7M10 18v-7M14 18v-7M18 18v-7M12 2 20 7 4 7Z",
537
+ stroke: "currentColor",
538
+ strokeWidth: "1.5",
539
+ strokeLinecap: "round",
540
+ strokeLinejoin: "round"
541
+ }
542
+ ) });
543
+ }
544
+ function FolderUpIcon({ size = 24, ...props }) {
545
+ return /* @__PURE__ */ jsx(Icon, { size, ...props, children: /* @__PURE__ */ jsx(
546
+ "path",
547
+ {
548
+ d: "M20 20a2 2 0 002-2V8a2 2 0 00-2-2h-7.9a2 2 0 01-1.69-.9L9.6 3.9A2 2 0 007.93 3H4a2 2 0 00-2 2v13a2 2 0 002 2ZM12 10v6M9 13l3-3 3 3",
549
+ stroke: "currentColor",
550
+ strokeWidth: "1.5",
551
+ strokeLinecap: "round",
552
+ strokeLinejoin: "round"
553
+ }
554
+ ) });
555
+ }
556
+ function PenToolIcon({ size = 24, ...props }) {
557
+ return /* @__PURE__ */ jsxs(Icon, { size, ...props, children: [
558
+ /* @__PURE__ */ jsx(
559
+ "path",
560
+ {
561
+ d: "M15.7 21.3a1 1 0 01-1.4 0l-1.6-1.6a1 1 0 010-1.4l5.6-5.6a1 1 0 011.4 0l1.6 1.6a1 1 0 010 1.4zM18 13l-1.4-6.9a1 1 0 00-.7-.8L3.2 2a1 1 0 00-1.2 1.2l3.3 12.7a1 1 0 00.8.7L13 18M2.3 2.3l7.3 7.3",
562
+ stroke: "currentColor",
563
+ strokeWidth: "1.5",
564
+ strokeLinecap: "round",
565
+ strokeLinejoin: "round"
566
+ }
567
+ ),
568
+ /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "2", stroke: "currentColor", strokeWidth: "1.5" })
569
+ ] });
570
+ }
510
571
  function MapPinIcon({ size = 24, ...props }) {
511
572
  return /* @__PURE__ */ jsxs(Icon, { size, ...props, children: [
512
573
  /* @__PURE__ */ jsx(
@@ -2224,7 +2285,7 @@ function PauseIcon({ size = 24, ...props }) {
2224
2285
  function StopIcon({ size = 24, ...props }) {
2225
2286
  return /* @__PURE__ */ jsx(Icon, { size, ...props, children: /* @__PURE__ */ jsx("rect", { x: "6", y: "6", width: "12", height: "12", rx: "2", fill: "currentColor" }) });
2226
2287
  }
2227
- var Accordion = React36.forwardRef(function Accordion2({ className, ...props }, ref) {
2288
+ var Accordion = React37.forwardRef(function Accordion2({ className, ...props }, ref) {
2228
2289
  return /* @__PURE__ */ jsx(
2229
2290
  AccordionPrimitive.Root,
2230
2291
  {
@@ -2235,11 +2296,11 @@ var Accordion = React36.forwardRef(function Accordion2({ className, ...props },
2235
2296
  );
2236
2297
  });
2237
2298
  Accordion.displayName = AccordionPrimitive.Root.displayName;
2238
- var AccordionItem = React36.forwardRef(function AccordionItem2({ className, ...props }, ref) {
2299
+ var AccordionItem = React37.forwardRef(function AccordionItem2({ className, ...props }, ref) {
2239
2300
  return /* @__PURE__ */ jsx(AccordionPrimitive.Item, { ref, className: cn(className), ...props });
2240
2301
  });
2241
2302
  AccordionItem.displayName = AccordionPrimitive.Item.displayName;
2242
- var AccordionTrigger = React36.forwardRef(function AccordionTrigger2({ children, className, ...props }, ref) {
2303
+ var AccordionTrigger = React37.forwardRef(function AccordionTrigger2({ children, className, ...props }, ref) {
2243
2304
  return /* @__PURE__ */ jsx(AccordionPrimitive.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
2244
2305
  AccordionPrimitive.Trigger,
2245
2306
  {
@@ -2268,7 +2329,7 @@ var AccordionTrigger = React36.forwardRef(function AccordionTrigger2({ children,
2268
2329
  ) });
2269
2330
  });
2270
2331
  AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
2271
- var AccordionContent = React36.forwardRef(function AccordionContent2({ children, className, ...props }, ref) {
2332
+ var AccordionContent = React37.forwardRef(function AccordionContent2({ children, className, ...props }, ref) {
2272
2333
  return /* @__PURE__ */ jsx(
2273
2334
  AccordionPrimitive.Content,
2274
2335
  {
@@ -2288,7 +2349,7 @@ AccordionContent.displayName = AccordionPrimitive.Content.displayName;
2288
2349
  var AlertDialog = AlertDialogPrimitive.Root;
2289
2350
  var AlertDialogTrigger = AlertDialogPrimitive.Trigger;
2290
2351
  var AlertDialogPortal = AlertDialogPrimitive.Portal;
2291
- var AlertDialogOverlay = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2352
+ var AlertDialogOverlay = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2292
2353
  AlertDialogPrimitive.Overlay,
2293
2354
  {
2294
2355
  ref,
@@ -2303,7 +2364,7 @@ var AlertDialogOverlay = React36.forwardRef(({ className, ...props }, ref) => /*
2303
2364
  }
2304
2365
  ));
2305
2366
  AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
2306
- var AlertDialogContent = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs(AlertDialogPortal, { children: [
2367
+ var AlertDialogContent = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs(AlertDialogPortal, { children: [
2307
2368
  /* @__PURE__ */ jsx(AlertDialogOverlay, {}),
2308
2369
  /* @__PURE__ */ jsx(
2309
2370
  AlertDialogPrimitive.Content,
@@ -2338,7 +2399,7 @@ var AlertDialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
2338
2399
  }
2339
2400
  );
2340
2401
  AlertDialogFooter.displayName = "AlertDialogFooter";
2341
- var AlertDialogTitle = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2402
+ var AlertDialogTitle = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2342
2403
  AlertDialogPrimitive.Title,
2343
2404
  {
2344
2405
  ref,
@@ -2350,7 +2411,7 @@ var AlertDialogTitle = React36.forwardRef(({ className, ...props }, ref) => /* @
2350
2411
  }
2351
2412
  ));
2352
2413
  AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
2353
- var AlertDialogDescription = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2414
+ var AlertDialogDescription = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2354
2415
  AlertDialogPrimitive.Description,
2355
2416
  {
2356
2417
  ref,
@@ -2359,7 +2420,7 @@ var AlertDialogDescription = React36.forwardRef(({ className, ...props }, ref) =
2359
2420
  }
2360
2421
  ));
2361
2422
  AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
2362
- var AlertDialogAction = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2423
+ var AlertDialogAction = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
2363
2424
  AlertDialogPrimitive.Action,
2364
2425
  {
2365
2426
  ref,
@@ -2375,7 +2436,7 @@ var AlertDialogAction = React36.forwardRef(({ className, ...props }, ref) => /*
2375
2436
  }
2376
2437
  ));
2377
2438
  AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
2378
- var AlertDialogCancel = React36.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
2439
+ var AlertDialogCancel = React37.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
2379
2440
  AlertDialogPrimitive.Cancel,
2380
2441
  {
2381
2442
  ref,
@@ -2473,7 +2534,104 @@ var AlertDescription = forwardRef(function AlertDescription2({ className, ...pro
2473
2534
  return /* @__PURE__ */ jsx("p", { ref, className: cn("text-sm", className), ...props });
2474
2535
  });
2475
2536
  AlertDescription.displayName = "AlertDescription";
2476
- var AspectRatio = React36.forwardRef(function AspectRatio2({ className, ratio = 16 / 9, ...props }, ref) {
2537
+ var defaultFormat = (n) => n.toLocaleString();
2538
+ var AreaChart = forwardRef(function AreaChart2({ data, height = 140, formatValue = defaultFormat, showAxis = true, className, ...props }, ref) {
2539
+ const gradientId = useId();
2540
+ const wrapRef = useRef(null);
2541
+ const [width, setWidth] = useState(620);
2542
+ const [hover, setHover] = useState(null);
2543
+ useEffect(() => {
2544
+ const el = wrapRef.current;
2545
+ if (!el) return;
2546
+ const ro = new ResizeObserver((entries) => {
2547
+ for (const entry of entries) setWidth(entry.contentRect.width);
2548
+ });
2549
+ ro.observe(el);
2550
+ return () => ro.disconnect();
2551
+ }, []);
2552
+ const padX = 10;
2553
+ const padTop = 14;
2554
+ const padBot = 8;
2555
+ const max = Math.max(...data.map((d) => d.value), 1) * 1.15;
2556
+ const step = data.length > 1 ? (width - padX * 2) / (data.length - 1) : 0;
2557
+ const pts = data.map(
2558
+ (d, i) => [padX + i * step, height - padBot - d.value / max * (height - padTop - padBot)]
2559
+ );
2560
+ const line = pts.map((p, i) => `${i ? "L" : "M"}${p[0].toFixed(1)} ${p[1].toFixed(1)}`).join(" ");
2561
+ const area = pts.length > 0 ? `${line} L${pts[pts.length - 1][0].toFixed(1)} ${height} L${pts[0][0].toFixed(1)} ${height} Z` : "";
2562
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn("w-full", className), ...props, children: [
2563
+ /* @__PURE__ */ jsxs("div", { ref: wrapRef, className: "relative w-full", children: [
2564
+ /* @__PURE__ */ jsxs(
2565
+ "svg",
2566
+ {
2567
+ width,
2568
+ height,
2569
+ viewBox: `0 0 ${width} ${height}`,
2570
+ role: "img",
2571
+ "aria-label": "Area trend chart",
2572
+ onMouseLeave: () => setHover(null),
2573
+ children: [
2574
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [
2575
+ /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: "var(--color-chart-area-from)" }),
2576
+ /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: "var(--color-chart-area-to)" })
2577
+ ] }) }),
2578
+ area && /* @__PURE__ */ jsx("path", { d: area, fill: `url(#${gradientId})` }),
2579
+ line && /* @__PURE__ */ jsx(
2580
+ "path",
2581
+ {
2582
+ d: line,
2583
+ fill: "none",
2584
+ stroke: "var(--color-chart-line)",
2585
+ strokeWidth: "2.5",
2586
+ strokeLinecap: "round",
2587
+ strokeLinejoin: "round"
2588
+ }
2589
+ ),
2590
+ pts.map((p, i) => /* @__PURE__ */ jsxs("g", { children: [
2591
+ /* @__PURE__ */ jsx(
2592
+ "circle",
2593
+ {
2594
+ cx: p[0],
2595
+ cy: p[1],
2596
+ r: hover === i ? 5.5 : 4,
2597
+ fill: "var(--color-surface)",
2598
+ stroke: "var(--color-chart-line)",
2599
+ strokeWidth: "2.5",
2600
+ className: "transition-[r] duration-[var(--duration-instant)] ease-[var(--ease-out-quart)] motion-reduce:transition-none"
2601
+ }
2602
+ ),
2603
+ /* @__PURE__ */ jsx(
2604
+ "rect",
2605
+ {
2606
+ x: p[0] - (step || width) / 2,
2607
+ y: 0,
2608
+ width: step || width,
2609
+ height,
2610
+ fill: "transparent",
2611
+ onMouseEnter: () => setHover(i)
2612
+ }
2613
+ )
2614
+ ] }, i))
2615
+ ]
2616
+ }
2617
+ ),
2618
+ hover != null && pts[hover] && /* @__PURE__ */ jsxs(
2619
+ "div",
2620
+ {
2621
+ className: "bg-fg text-bg pointer-events-none absolute top-0 z-[var(--z-tooltip)] -translate-x-1/2 -translate-y-1 rounded-[var(--radius-icon)] px-2 py-1 text-center shadow-[var(--shadow-pop)]",
2622
+ style: { left: `${pts[hover][0] / width * 100}%` },
2623
+ children: [
2624
+ /* @__PURE__ */ jsx("span", { className: "block text-xs font-semibold tabular-nums", children: formatValue(data[hover].value) }),
2625
+ /* @__PURE__ */ jsx("span", { className: "block text-[10px] opacity-70", children: data[hover].label })
2626
+ ]
2627
+ }
2628
+ )
2629
+ ] }),
2630
+ showAxis && /* @__PURE__ */ jsx("div", { className: "text-fg-4 mt-1.5 flex justify-between text-[11px] tabular-nums", children: data.map((d) => /* @__PURE__ */ jsx("span", { children: d.label }, d.label)) })
2631
+ ] });
2632
+ });
2633
+ AreaChart.displayName = "AreaChart";
2634
+ var AspectRatio = React37.forwardRef(function AspectRatio2({ className, ratio = 16 / 9, ...props }, ref) {
2477
2635
  return /* @__PURE__ */ jsx(
2478
2636
  AspectRatioPrimitive.Root,
2479
2637
  {
@@ -2485,6 +2643,292 @@ var AspectRatio = React36.forwardRef(function AspectRatio2({ className, ratio =
2485
2643
  );
2486
2644
  });
2487
2645
  AspectRatio.displayName = AspectRatioPrimitive.Root.displayName;
2646
+ var spinnerVariants = cva(
2647
+ "inline-flex shrink-0 items-center justify-center [&_svg]:motion-reduce:animate-none",
2648
+ {
2649
+ variants: {
2650
+ size: {
2651
+ xs: "[&_svg]:size-3",
2652
+ sm: "[&_svg]:size-4",
2653
+ md: "[&_svg]:size-5",
2654
+ lg: "[&_svg]:size-6"
2655
+ },
2656
+ tone: {
2657
+ current: "text-current",
2658
+ muted: "text-fg-3",
2659
+ accent: "text-accent",
2660
+ success: "text-success-fg",
2661
+ warning: "text-warning-fg",
2662
+ destructive: "text-danger-fg"
2663
+ }
2664
+ },
2665
+ defaultVariants: {
2666
+ size: "md",
2667
+ tone: "current"
2668
+ }
2669
+ }
2670
+ );
2671
+ var Spinner = forwardRef(function Spinner2({ size, tone, label, className, ...props }, ref) {
2672
+ return /* @__PURE__ */ jsxs(
2673
+ "span",
2674
+ {
2675
+ ref,
2676
+ role: label ? "status" : void 0,
2677
+ "aria-live": label ? "polite" : void 0,
2678
+ className: cn(spinnerVariants({ size, tone }), className),
2679
+ ...props,
2680
+ children: [
2681
+ /* @__PURE__ */ jsx(LoaderIcon, { className: "animate-spin", "aria-hidden": "true" }),
2682
+ label && /* @__PURE__ */ jsx("span", { className: "sr-only", children: label })
2683
+ ]
2684
+ }
2685
+ );
2686
+ });
2687
+ Spinner.displayName = "Spinner";
2688
+ var buttonVariants = cva(
2689
+ cn(
2690
+ "inline-flex items-center justify-center rounded-btn font-medium whitespace-nowrap cursor-pointer",
2691
+ "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
2692
+ "focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)]",
2693
+ "disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-fg-disabled",
2694
+ "motion-reduce:transition-none",
2695
+ "[&_svg]:size-4 [&_svg]:shrink-0"
2696
+ ),
2697
+ {
2698
+ variants: {
2699
+ variant: {
2700
+ primary: "bg-pro-fg text-fg-on-pro hover:bg-pro-hover active:bg-pro-active",
2701
+ secondary: "bg-control-secondary-bg text-control-fg border border-control-border hover:bg-control-active-bg hover:border-control-border-strong",
2702
+ destructive: "bg-danger-fg text-fg-on-danger hover:bg-danger-fg-hover active:bg-danger-fg-active",
2703
+ success: "bg-success-fg text-fg-on-success hover:bg-success-fg-hover active:bg-success-fg-active",
2704
+ ghost: "bg-control-bg text-control-fg hover:bg-control-hover-bg hover:text-control-hover-fg",
2705
+ outline: "border border-control-border-strong bg-control-bg text-control-fg hover:bg-control-hover-bg hover:border-control-border-hover",
2706
+ link: "bg-transparent text-accent underline-offset-4 hover:underline p-0 h-auto",
2707
+ accent: "bg-accent text-fg-on-accent hover:bg-accent-hover active:bg-accent-active",
2708
+ 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"
2709
+ },
2710
+ size: {
2711
+ sm: "h-8 px-3 text-[13px] gap-1.5",
2712
+ md: "h-10 px-4 text-sm gap-2",
2713
+ lg: "h-12 px-6 text-base gap-2",
2714
+ // Icon-only sizes. Hit target ≥ 24px (WCAG 2.5.5 floor).
2715
+ // `icon-xs` / `icon-sm` are for dense in-row action stacks where
2716
+ // `size="icon"` (40×40) would visually crowd the row.
2717
+ "icon-xs": "size-6 [&_svg]:size-3.5",
2718
+ "icon-sm": "size-7 [&_svg]:size-4",
2719
+ icon: "size-10"
2720
+ }
2721
+ },
2722
+ defaultVariants: {
2723
+ variant: "primary",
2724
+ size: "md"
2725
+ }
2726
+ }
2727
+ );
2728
+ var Button = forwardRef(function Button2({
2729
+ variant,
2730
+ size,
2731
+ asChild = false,
2732
+ loading,
2733
+ iconLeft,
2734
+ iconRight,
2735
+ disabled,
2736
+ children,
2737
+ className,
2738
+ ...props
2739
+ }, ref) {
2740
+ const Comp = asChild ? Slot : "button";
2741
+ if (asChild) {
2742
+ return /* @__PURE__ */ jsx(Comp, { ref, className: cn(buttonVariants({ variant, size }), className), ...props, children });
2743
+ }
2744
+ return /* @__PURE__ */ jsxs(
2745
+ Comp,
2746
+ {
2747
+ ref,
2748
+ disabled: disabled || loading,
2749
+ className: cn(buttonVariants({ variant, size }), className),
2750
+ ...props,
2751
+ children: [
2752
+ loading ? /* @__PURE__ */ jsx(Spinner, { size: "sm" }) : iconLeft && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconLeft }),
2753
+ children,
2754
+ iconRight && !loading && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconRight })
2755
+ ]
2756
+ }
2757
+ );
2758
+ });
2759
+ Button.displayName = "Button";
2760
+ var fileTypeBadgeVariants = cva(
2761
+ cn(
2762
+ "inline-grid shrink-0 select-none place-items-center",
2763
+ "font-extrabold uppercase leading-none tracking-wide"
2764
+ ),
2765
+ {
2766
+ variants: {
2767
+ size: {
2768
+ sm: "size-8 rounded-btn text-[9px]",
2769
+ md: "size-10 rounded-card text-[10px]"
2770
+ }
2771
+ },
2772
+ defaultVariants: {
2773
+ size: "md"
2774
+ }
2775
+ }
2776
+ );
2777
+ var toneStyles = {
2778
+ danger: "bg-danger-bg text-danger-fg",
2779
+ info: "bg-accent-tint text-accent",
2780
+ accent: "bg-accent-tint text-accent-2",
2781
+ success: "bg-success-bg text-success-fg",
2782
+ warning: "bg-warning-bg text-warning-fg",
2783
+ neutral: "bg-surface-3 text-fg-3"
2784
+ };
2785
+ var EXT_TO_TYPE = {
2786
+ pdf: "PDF",
2787
+ img: "IMG",
2788
+ image: "IMG",
2789
+ png: "IMG",
2790
+ jpg: "IMG",
2791
+ jpeg: "IMG",
2792
+ gif: "IMG",
2793
+ svg: "IMG",
2794
+ webp: "IMG",
2795
+ heic: "IMG",
2796
+ heif: "IMG",
2797
+ bmp: "IMG",
2798
+ tif: "IMG",
2799
+ tiff: "IMG",
2800
+ doc: "DOC",
2801
+ docx: "DOC",
2802
+ rtf: "DOC",
2803
+ txt: "DOC",
2804
+ odt: "DOC",
2805
+ pages: "DOC",
2806
+ xls: "XLS",
2807
+ xlsx: "XLS",
2808
+ ods: "XLS",
2809
+ numbers: "XLS",
2810
+ csv: "CSV",
2811
+ ppt: "PPT",
2812
+ pptx: "PPT",
2813
+ odp: "PPT",
2814
+ key: "PPT",
2815
+ zip: "ZIP",
2816
+ rar: "ZIP",
2817
+ "7z": "ZIP",
2818
+ tar: "ZIP",
2819
+ gz: "ZIP",
2820
+ gzip: "ZIP"
2821
+ };
2822
+ var TYPE_TO_TONE = {
2823
+ PDF: "danger",
2824
+ IMG: "info",
2825
+ DOC: "accent",
2826
+ XLS: "success",
2827
+ CSV: "success",
2828
+ PPT: "warning",
2829
+ ZIP: "neutral"
2830
+ };
2831
+ function normalizeFileType(input) {
2832
+ const key = input.trim().toLowerCase().replace(/^\.+/, "");
2833
+ if (!key) return "FILE";
2834
+ return EXT_TO_TYPE[key] ?? key.toUpperCase().slice(0, 3);
2835
+ }
2836
+ function fileTypeFromName(fileName) {
2837
+ const dot = fileName.lastIndexOf(".");
2838
+ const ext = dot >= 0 && dot < fileName.length - 1 ? fileName.slice(dot + 1) : "";
2839
+ return normalizeFileType(ext);
2840
+ }
2841
+ var FileTypeBadge = forwardRef(function FileTypeBadge2({ format: format2, type, fileName, tone = "auto", size, className, "aria-label": ariaLabel, ...props }, ref) {
2842
+ const raw = format2 ?? type ?? (fileName != null ? fileTypeFromName(fileName) : void 0) ?? "FILE";
2843
+ const code = normalizeFileType(raw);
2844
+ const resolvedTone = tone !== "auto" ? tone : TYPE_TO_TONE[code] ?? "neutral";
2845
+ return /* @__PURE__ */ jsx(
2846
+ "span",
2847
+ {
2848
+ ref,
2849
+ role: "img",
2850
+ "aria-label": ariaLabel ?? `${code} file`,
2851
+ className: cn(fileTypeBadgeVariants({ size }), toneStyles[resolvedTone], className),
2852
+ ...props,
2853
+ children: code
2854
+ }
2855
+ );
2856
+ });
2857
+ FileTypeBadge.displayName = "FileTypeBadge";
2858
+ var attachmentChipVariants = cva(
2859
+ cn(
2860
+ "flex items-center gap-3 rounded-card border px-3 py-2.5 text-left",
2861
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none"
2862
+ ),
2863
+ {
2864
+ variants: {
2865
+ variant: {
2866
+ default: "border-rule bg-surface hover:bg-bg-2",
2867
+ onAccent: "border-white/25 bg-white/15 hover:bg-white/25"
2868
+ }
2869
+ },
2870
+ defaultVariants: {
2871
+ variant: "default"
2872
+ }
2873
+ }
2874
+ );
2875
+ function deriveFileType(name) {
2876
+ const dot = name.lastIndexOf(".");
2877
+ if (dot === -1 || dot === name.length - 1) return "FILE";
2878
+ return name.slice(dot + 1).toUpperCase();
2879
+ }
2880
+ var AttachmentChip = forwardRef(
2881
+ function AttachmentChip2({ name, fileType, meta, onView, onDownload, href, variant, className, ...props }, ref) {
2882
+ const resolvedType = fileType ?? deriveFileType(name);
2883
+ const onAccent = variant === "onAccent";
2884
+ const actionClassName = onAccent ? "text-fg-on-pro hover:bg-white/20 hover:text-fg-on-pro" : void 0;
2885
+ const showView = Boolean(onView) || Boolean(href);
2886
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn(attachmentChipVariants({ variant }), className), ...props, children: [
2887
+ /* @__PURE__ */ jsx(FileTypeBadge, { format: resolvedType, size: "md", className: "shrink-0" }),
2888
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
2889
+ /* @__PURE__ */ jsx("p", { className: cn("truncate text-sm font-medium", onAccent ? "text-fg-on-pro" : "text-fg"), children: name }),
2890
+ meta && /* @__PURE__ */ jsx("p", { className: cn("truncate text-xs", onAccent ? "text-fg-on-pro/75" : "text-fg-3"), children: meta })
2891
+ ] }),
2892
+ (showView || onDownload) && /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-0.5", children: [
2893
+ showView && (onView ? /* @__PURE__ */ jsx(
2894
+ Button,
2895
+ {
2896
+ type: "button",
2897
+ variant: "ghost",
2898
+ size: "icon-sm",
2899
+ "aria-label": `View ${name}`,
2900
+ onClick: onView,
2901
+ className: actionClassName,
2902
+ children: /* @__PURE__ */ jsx(EyeIcon, { size: 16 })
2903
+ }
2904
+ ) : /* @__PURE__ */ jsx(
2905
+ Button,
2906
+ {
2907
+ asChild: true,
2908
+ variant: "ghost",
2909
+ size: "icon-sm",
2910
+ "aria-label": `View ${name}`,
2911
+ className: actionClassName,
2912
+ children: /* @__PURE__ */ jsx("a", { href, target: "_blank", rel: "noopener noreferrer", children: /* @__PURE__ */ jsx(EyeIcon, { size: 16 }) })
2913
+ }
2914
+ )),
2915
+ onDownload && /* @__PURE__ */ jsx(
2916
+ Button,
2917
+ {
2918
+ type: "button",
2919
+ variant: "ghost",
2920
+ size: "icon-sm",
2921
+ "aria-label": `Download ${name}`,
2922
+ onClick: onDownload,
2923
+ className: actionClassName,
2924
+ children: /* @__PURE__ */ jsx(DownloadIcon, { size: 16 })
2925
+ }
2926
+ )
2927
+ ] })
2928
+ ] });
2929
+ }
2930
+ );
2931
+ AttachmentChip.displayName = "AttachmentChip";
2488
2932
  var avatarVariants = cva(
2489
2933
  cn(
2490
2934
  "relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full",
@@ -2526,7 +2970,7 @@ var statusDotSizes = {
2526
2970
  function getInitials(name) {
2527
2971
  return name.split(" ").map((part) => part[0]).filter(Boolean).slice(0, 2).join("").toUpperCase();
2528
2972
  }
2529
- var Avatar = React36.forwardRef(
2973
+ var Avatar = React37.forwardRef(
2530
2974
  function Avatar2({ src, alt, name, size = "md", variant = "initials", status, className, ...props }, ref) {
2531
2975
  const initials = name ? getInitials(name) : "?";
2532
2976
  const resolvedSize = size ?? "md";
@@ -2750,120 +3194,6 @@ var BreadcrumbSeparator = forwardRef(
2750
3194
  }
2751
3195
  );
2752
3196
  BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
2753
- var spinnerVariants = cva(
2754
- "inline-flex shrink-0 items-center justify-center [&_svg]:motion-reduce:animate-none",
2755
- {
2756
- variants: {
2757
- size: {
2758
- xs: "[&_svg]:size-3",
2759
- sm: "[&_svg]:size-4",
2760
- md: "[&_svg]:size-5",
2761
- lg: "[&_svg]:size-6"
2762
- },
2763
- tone: {
2764
- current: "text-current",
2765
- muted: "text-fg-3",
2766
- accent: "text-accent",
2767
- success: "text-success-fg",
2768
- warning: "text-warning-fg",
2769
- destructive: "text-danger-fg"
2770
- }
2771
- },
2772
- defaultVariants: {
2773
- size: "md",
2774
- tone: "current"
2775
- }
2776
- }
2777
- );
2778
- var Spinner = forwardRef(function Spinner2({ size, tone, label, className, ...props }, ref) {
2779
- return /* @__PURE__ */ jsxs(
2780
- "span",
2781
- {
2782
- ref,
2783
- role: label ? "status" : void 0,
2784
- "aria-live": label ? "polite" : void 0,
2785
- className: cn(spinnerVariants({ size, tone }), className),
2786
- ...props,
2787
- children: [
2788
- /* @__PURE__ */ jsx(LoaderIcon, { className: "animate-spin", "aria-hidden": "true" }),
2789
- label && /* @__PURE__ */ jsx("span", { className: "sr-only", children: label })
2790
- ]
2791
- }
2792
- );
2793
- });
2794
- Spinner.displayName = "Spinner";
2795
- var buttonVariants = cva(
2796
- cn(
2797
- "inline-flex items-center justify-center rounded-btn font-medium whitespace-nowrap",
2798
- "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
2799
- "focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)]",
2800
- "disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-fg-disabled",
2801
- "motion-reduce:transition-none",
2802
- "[&_svg]:size-4 [&_svg]:shrink-0"
2803
- ),
2804
- {
2805
- variants: {
2806
- variant: {
2807
- primary: "bg-pro-fg text-fg-on-pro hover:bg-pro-hover active:bg-pro-active",
2808
- secondary: "bg-control-secondary-bg text-control-fg border border-control-border hover:bg-control-active-bg hover:border-control-border-strong",
2809
- destructive: "bg-danger-fg text-fg-on-danger hover:bg-danger-fg-hover active:bg-danger-fg-active",
2810
- success: "bg-success-fg text-fg-on-success hover:bg-success-fg-hover active:bg-success-fg-active",
2811
- ghost: "bg-control-bg text-control-fg hover:bg-control-hover-bg hover:text-control-hover-fg",
2812
- outline: "border border-control-border-strong bg-control-bg text-control-fg hover:bg-control-hover-bg hover:border-control-border-hover",
2813
- link: "bg-transparent text-accent underline-offset-4 hover:underline p-0 h-auto",
2814
- accent: "bg-accent text-fg-on-accent hover:bg-accent-hover active:bg-accent-active",
2815
- 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"
2816
- },
2817
- size: {
2818
- sm: "h-8 px-3 text-[13px] gap-1.5",
2819
- md: "h-10 px-4 text-sm gap-2",
2820
- lg: "h-12 px-6 text-base gap-2",
2821
- // Icon-only sizes. Hit target ≥ 24px (WCAG 2.5.5 floor).
2822
- // `icon-xs` / `icon-sm` are for dense in-row action stacks where
2823
- // `size="icon"` (40×40) would visually crowd the row.
2824
- "icon-xs": "size-6 [&_svg]:size-3.5",
2825
- "icon-sm": "size-7 [&_svg]:size-4",
2826
- icon: "size-10"
2827
- }
2828
- },
2829
- defaultVariants: {
2830
- variant: "primary",
2831
- size: "md"
2832
- }
2833
- }
2834
- );
2835
- var Button = forwardRef(function Button2({
2836
- variant,
2837
- size,
2838
- asChild = false,
2839
- loading,
2840
- iconLeft,
2841
- iconRight,
2842
- disabled,
2843
- children,
2844
- className,
2845
- ...props
2846
- }, ref) {
2847
- const Comp = asChild ? Slot : "button";
2848
- if (asChild) {
2849
- return /* @__PURE__ */ jsx(Comp, { ref, className: cn(buttonVariants({ variant, size }), className), ...props, children });
2850
- }
2851
- return /* @__PURE__ */ jsxs(
2852
- Comp,
2853
- {
2854
- ref,
2855
- disabled: disabled || loading,
2856
- className: cn(buttonVariants({ variant, size }), className),
2857
- ...props,
2858
- children: [
2859
- loading ? /* @__PURE__ */ jsx(Spinner, { size: "sm" }) : iconLeft && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconLeft }),
2860
- children,
2861
- iconRight && !loading && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", "aria-hidden": "true", children: iconRight })
2862
- ]
2863
- }
2864
- );
2865
- });
2866
- Button.displayName = "Button";
2867
3197
  var HIGHLIGHT_COLORS = {
2868
3198
  primary: "after:bg-pro-fg",
2869
3199
  success: "after:bg-success-fg",
@@ -2881,7 +3211,7 @@ function Calendar({
2881
3211
  classNames,
2882
3212
  ...props
2883
3213
  }) {
2884
- const { modifiers, modifiersClassNames } = React36.useMemo(() => {
3214
+ const { modifiers, modifiersClassNames } = React37.useMemo(() => {
2885
3215
  const buckets = {};
2886
3216
  for (const h of highlights) {
2887
3217
  const key = h.color ?? "primary";
@@ -2896,7 +3226,7 @@ function Calendar({
2896
3226
  }
2897
3227
  return { modifiers: mods, modifiersClassNames: modClasses };
2898
3228
  }, [highlights]);
2899
- const disabledMatcher = React36.useMemo(() => {
3229
+ const disabledMatcher = React37.useMemo(() => {
2900
3230
  if (!minDate && !maxDate) return void 0;
2901
3231
  if (minDate && maxDate) return [{ before: minDate }, { after: maxDate }];
2902
3232
  if (minDate) return { before: minDate };
@@ -3028,7 +3358,42 @@ var CardAction = forwardRef(
3028
3358
  }
3029
3359
  );
3030
3360
  CardAction.displayName = "CardAction";
3031
- var Checkbox = React36.forwardRef(function Checkbox2({
3361
+ var categoryTagVariants = cva(
3362
+ cn(
3363
+ "inline-flex shrink-0 items-center gap-1.5 rounded-full px-2.5 py-1",
3364
+ "text-xs font-bold tracking-tight"
3365
+ ),
3366
+ {
3367
+ variants: {
3368
+ tone: {
3369
+ brand: "text-brand-pro bg-[color-mix(in_srgb,var(--color-brand-pro)_12%,transparent)]",
3370
+ audit: "text-brand-audit bg-[color-mix(in_srgb,var(--color-brand-audit)_12%,transparent)]",
3371
+ books: "text-brand-books bg-[color-mix(in_srgb,var(--color-brand-books)_12%,transparent)]",
3372
+ tax: "text-brand-tax bg-[color-mix(in_srgb,var(--color-brand-tax)_12%,transparent)]",
3373
+ neutral: "text-fg-3 bg-[color-mix(in_srgb,var(--color-fg-3)_12%,transparent)]"
3374
+ }
3375
+ },
3376
+ defaultVariants: { tone: "neutral" }
3377
+ }
3378
+ );
3379
+ var CategoryTag = forwardRef(function CategoryTag2({ label, icon, tone, className, ...props }, ref) {
3380
+ return /* @__PURE__ */ jsxs("span", { ref, className: cn(categoryTagVariants({ tone }), className), ...props, children: [
3381
+ icon && /* @__PURE__ */ jsx("span", { className: "inline-flex size-3.5 shrink-0", "aria-hidden": "true", children: icon }),
3382
+ label
3383
+ ] });
3384
+ });
3385
+ CategoryTag.displayName = "CategoryTag";
3386
+ var CategoryDivider = forwardRef(
3387
+ function CategoryDivider2({ label, icon, tone, count, className, ...props }, ref) {
3388
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex items-center gap-3", className), ...props, children: [
3389
+ /* @__PURE__ */ jsx(CategoryTag, { label, icon, tone }),
3390
+ /* @__PURE__ */ jsx("span", { className: "bg-rule h-px flex-1", "aria-hidden": "true" }),
3391
+ count !== void 0 && /* @__PURE__ */ jsx("span", { className: "text-fg-3 bg-surface-2 border-rule inline-flex h-5 min-w-5 shrink-0 items-center justify-center rounded-full border px-1.5 text-[11px] font-bold", children: count })
3392
+ ] });
3393
+ }
3394
+ );
3395
+ CategoryDivider.displayName = "CategoryDivider";
3396
+ var Checkbox = React37.forwardRef(function Checkbox2({
3032
3397
  label,
3033
3398
  indeterminate,
3034
3399
  checked,
@@ -3038,7 +3403,7 @@ var Checkbox = React36.forwardRef(function Checkbox2({
3038
3403
  id: providedId,
3039
3404
  ...props
3040
3405
  }, ref) {
3041
- const generatedId = React36.useId();
3406
+ const generatedId = React37.useId();
3042
3407
  const id = providedId ?? generatedId;
3043
3408
  const resolvedChecked = indeterminate ? "indeterminate" : checked;
3044
3409
  return /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-2", children: [
@@ -3079,7 +3444,7 @@ Checkbox.displayName = CheckboxPrimitive.Root.displayName;
3079
3444
  var SelectRoot = SelectPrimitive.Root;
3080
3445
  var SelectGroup = SelectPrimitive.Group;
3081
3446
  var SelectValue = SelectPrimitive.Value;
3082
- var SelectTrigger = React36.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3447
+ var SelectTrigger = React37.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3083
3448
  SelectPrimitive.Trigger,
3084
3449
  {
3085
3450
  ref,
@@ -3110,7 +3475,7 @@ var SelectTrigger = React36.forwardRef(({ className, children, ...props }, ref)
3110
3475
  }
3111
3476
  ));
3112
3477
  SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
3113
- var SelectScrollUpButton = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3478
+ var SelectScrollUpButton = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3114
3479
  SelectPrimitive.ScrollUpButton,
3115
3480
  {
3116
3481
  ref,
@@ -3120,7 +3485,7 @@ var SelectScrollUpButton = React36.forwardRef(({ className, ...props }, ref) =>
3120
3485
  }
3121
3486
  ));
3122
3487
  SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
3123
- var SelectScrollDownButton = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3488
+ var SelectScrollDownButton = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3124
3489
  SelectPrimitive.ScrollDownButton,
3125
3490
  {
3126
3491
  ref,
@@ -3130,7 +3495,7 @@ var SelectScrollDownButton = React36.forwardRef(({ className, ...props }, ref) =
3130
3495
  }
3131
3496
  ));
3132
3497
  SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
3133
- var SelectContent = React36.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
3498
+ var SelectContent = React37.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
3134
3499
  SelectPrimitive.Content,
3135
3500
  {
3136
3501
  ref,
@@ -3164,7 +3529,7 @@ var SelectContent = React36.forwardRef(({ className, children, position = "poppe
3164
3529
  }
3165
3530
  ) }));
3166
3531
  SelectContent.displayName = SelectPrimitive.Content.displayName;
3167
- var SelectLabel = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3532
+ var SelectLabel = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3168
3533
  SelectPrimitive.Label,
3169
3534
  {
3170
3535
  ref,
@@ -3176,7 +3541,7 @@ var SelectLabel = React36.forwardRef(({ className, ...props }, ref) => /* @__PUR
3176
3541
  }
3177
3542
  ));
3178
3543
  SelectLabel.displayName = SelectPrimitive.Label.displayName;
3179
- var SelectItem = React36.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3544
+ var SelectItem = React37.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3180
3545
  SelectPrimitive.Item,
3181
3546
  {
3182
3547
  ref,
@@ -3197,7 +3562,7 @@ var SelectItem = React36.forwardRef(({ className, children, ...props }, ref) =>
3197
3562
  }
3198
3563
  ));
3199
3564
  SelectItem.displayName = SelectPrimitive.Item.displayName;
3200
- var SelectSeparator = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3565
+ var SelectSeparator = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3201
3566
  SelectPrimitive.Separator,
3202
3567
  {
3203
3568
  ref,
@@ -3282,11 +3647,11 @@ function ClientSelect({
3282
3647
  ] });
3283
3648
  }
3284
3649
  ClientSelect.displayName = "ClientSelect";
3285
- var Collapsible = React36.forwardRef(function Collapsible2({ className, ...props }, ref) {
3650
+ var Collapsible = React37.forwardRef(function Collapsible2({ className, ...props }, ref) {
3286
3651
  return /* @__PURE__ */ jsx(CollapsiblePrimitive.Root, { ref, className: cn(className), ...props });
3287
3652
  });
3288
3653
  Collapsible.displayName = CollapsiblePrimitive.Root.displayName;
3289
- var CollapsibleTrigger = React36.forwardRef(function CollapsibleTrigger2({ className, ...props }, ref) {
3654
+ var CollapsibleTrigger = React37.forwardRef(function CollapsibleTrigger2({ className, ...props }, ref) {
3290
3655
  return /* @__PURE__ */ jsx(
3291
3656
  CollapsiblePrimitive.Trigger,
3292
3657
  {
@@ -3301,7 +3666,7 @@ var CollapsibleTrigger = React36.forwardRef(function CollapsibleTrigger2({ class
3301
3666
  );
3302
3667
  });
3303
3668
  CollapsibleTrigger.displayName = CollapsiblePrimitive.Trigger.displayName;
3304
- var CollapsibleContent = React36.forwardRef(function CollapsibleContent2({ className, ...props }, ref) {
3669
+ var CollapsibleContent = React37.forwardRef(function CollapsibleContent2({ className, ...props }, ref) {
3305
3670
  return /* @__PURE__ */ jsx(
3306
3671
  CollapsiblePrimitive.Content,
3307
3672
  {
@@ -3378,7 +3743,7 @@ ComingSoon.displayName = "ComingSoon";
3378
3743
  var Dialog = DialogPrimitive.Root;
3379
3744
  var DialogTrigger = DialogPrimitive.Trigger;
3380
3745
  var DialogPortal = DialogPrimitive.Portal;
3381
- var DialogOverlay = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3746
+ var DialogOverlay = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3382
3747
  DialogPrimitive.Overlay,
3383
3748
  {
3384
3749
  ref,
@@ -3399,7 +3764,7 @@ var dialogSizeStyles = {
3399
3764
  lg: "max-w-2xl",
3400
3765
  full: "max-w-[calc(100vw-2rem)]"
3401
3766
  };
3402
- var DialogContent = React36.forwardRef(({ size = "md", showCloseButton = true, className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DialogPortal, { children: [
3767
+ var DialogContent = React37.forwardRef(({ size = "md", showCloseButton = true, className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DialogPortal, { children: [
3403
3768
  /* @__PURE__ */ jsx(DialogOverlay, {}),
3404
3769
  /* @__PURE__ */ jsxs(
3405
3770
  DialogPrimitive.Content,
@@ -3440,7 +3805,7 @@ var DialogContent = React36.forwardRef(({ size = "md", showCloseButton = true, c
3440
3805
  )
3441
3806
  ] }));
3442
3807
  DialogContent.displayName = DialogPrimitive.Content.displayName;
3443
- var DialogClose = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Close, { ref, className: cn(className), ...props }));
3808
+ var DialogClose = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Close, { ref, className: cn(className), ...props }));
3444
3809
  DialogClose.displayName = "DialogClose";
3445
3810
  var DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("mb-4 flex flex-col gap-1.5 pr-8", className), ...props });
3446
3811
  DialogHeader.displayName = "DialogHeader";
@@ -3455,7 +3820,7 @@ var DialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
3455
3820
  }
3456
3821
  );
3457
3822
  DialogFooter.displayName = "DialogFooter";
3458
- var DialogTitle = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3823
+ var DialogTitle = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3459
3824
  DialogPrimitive.Title,
3460
3825
  {
3461
3826
  ref,
@@ -3467,7 +3832,7 @@ var DialogTitle = React36.forwardRef(({ className, ...props }, ref) => /* @__PUR
3467
3832
  }
3468
3833
  ));
3469
3834
  DialogTitle.displayName = DialogPrimitive.Title.displayName;
3470
- var DialogDescription = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3835
+ var DialogDescription = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3471
3836
  DialogPrimitive.Description,
3472
3837
  {
3473
3838
  ref,
@@ -3497,17 +3862,17 @@ function CommandPalette({
3497
3862
  onOpenChange,
3498
3863
  placeholder = "Type a command or search..."
3499
3864
  }) {
3500
- const [internalOpen, setInternalOpen] = React36.useState(false);
3865
+ const [internalOpen, setInternalOpen] = React37.useState(false);
3501
3866
  const isControlled = controlledOpen !== void 0;
3502
3867
  const open = isControlled ? controlledOpen : internalOpen;
3503
- const setOpen = React36.useCallback(
3868
+ const setOpen = React37.useCallback(
3504
3869
  (value) => {
3505
3870
  if (!isControlled) setInternalOpen(value);
3506
3871
  onOpenChange?.(value);
3507
3872
  },
3508
3873
  [isControlled, onOpenChange]
3509
3874
  );
3510
- React36.useEffect(() => {
3875
+ React37.useEffect(() => {
3511
3876
  function handleKeyDown(e) {
3512
3877
  if ((e.metaKey || e.ctrlKey) && e.key === "k") {
3513
3878
  e.preventDefault();
@@ -3662,10 +4027,10 @@ function ConfirmActionButton({
3662
4027
  onOpenChange
3663
4028
  }) {
3664
4029
  const isControlled = open !== void 0;
3665
- const [uncontrolledOpen, setUncontrolledOpen] = React36.useState(defaultOpen);
4030
+ const [uncontrolledOpen, setUncontrolledOpen] = React37.useState(defaultOpen);
3666
4031
  const resolvedOpen = isControlled ? open : uncontrolledOpen;
3667
- const [pending, setPending] = React36.useState(false);
3668
- const setDialogOpen = React36.useCallback(
4032
+ const [pending, setPending] = React37.useState(false);
4033
+ const setDialogOpen = React37.useCallback(
3669
4034
  (nextOpen) => {
3670
4035
  onOpenChange?.(nextOpen);
3671
4036
  if (!isControlled) {
@@ -3724,7 +4089,7 @@ var ContextMenuGroup = ContextMenuPrimitive.Group;
3724
4089
  var ContextMenuPortal = ContextMenuPrimitive.Portal;
3725
4090
  var ContextMenuSub = ContextMenuPrimitive.Sub;
3726
4091
  var ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;
3727
- var ContextMenuSubTrigger = React36.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
4092
+ var ContextMenuSubTrigger = React37.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3728
4093
  ContextMenuPrimitive.SubTrigger,
3729
4094
  {
3730
4095
  ref,
@@ -3745,7 +4110,7 @@ var ContextMenuSubTrigger = React36.forwardRef(({ className, inset, children, ..
3745
4110
  }
3746
4111
  ));
3747
4112
  ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName;
3748
- var ContextMenuSubContent = React36.forwardRef(({ className, ...props }, ref) => (
4113
+ var ContextMenuSubContent = React37.forwardRef(({ className, ...props }, ref) => (
3749
4114
  // Portal the sub-content to the body. The parent Content keeps a persistent
3750
4115
  // `scale-100` transform (its open-state animation), which makes it the
3751
4116
  // containing block for `position: fixed` descendants — and its
@@ -3768,7 +4133,7 @@ var ContextMenuSubContent = React36.forwardRef(({ className, ...props }, ref) =>
3768
4133
  ) })
3769
4134
  ));
3770
4135
  ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName;
3771
- var ContextMenuContent = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(ContextMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
4136
+ var ContextMenuContent = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(ContextMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
3772
4137
  ContextMenuPrimitive.Content,
3773
4138
  {
3774
4139
  ref,
@@ -3784,7 +4149,7 @@ var ContextMenuContent = React36.forwardRef(({ className, ...props }, ref) => /*
3784
4149
  }
3785
4150
  ) }));
3786
4151
  ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName;
3787
- var ContextMenuItem = React36.forwardRef(({ className, destructive, inset, ...props }, ref) => /* @__PURE__ */ jsx(
4152
+ var ContextMenuItem = React37.forwardRef(({ className, destructive, inset, ...props }, ref) => /* @__PURE__ */ jsx(
3788
4153
  ContextMenuPrimitive.Item,
3789
4154
  {
3790
4155
  ref,
@@ -3802,7 +4167,7 @@ var ContextMenuItem = React36.forwardRef(({ className, destructive, inset, ...pr
3802
4167
  }
3803
4168
  ));
3804
4169
  ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName;
3805
- var ContextMenuCheckboxItem = React36.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
4170
+ var ContextMenuCheckboxItem = React37.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
3806
4171
  ContextMenuPrimitive.CheckboxItem,
3807
4172
  {
3808
4173
  ref,
@@ -3822,7 +4187,7 @@ var ContextMenuCheckboxItem = React36.forwardRef(({ className, children, checked
3822
4187
  }
3823
4188
  ));
3824
4189
  ContextMenuCheckboxItem.displayName = ContextMenuPrimitive.CheckboxItem.displayName;
3825
- var ContextMenuRadioItem = React36.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
4190
+ var ContextMenuRadioItem = React37.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
3826
4191
  ContextMenuPrimitive.RadioItem,
3827
4192
  {
3828
4193
  ref,
@@ -3841,7 +4206,7 @@ var ContextMenuRadioItem = React36.forwardRef(({ className, children, ...props }
3841
4206
  }
3842
4207
  ));
3843
4208
  ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName;
3844
- var ContextMenuLabel = React36.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
4209
+ var ContextMenuLabel = React37.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
3845
4210
  ContextMenuPrimitive.Label,
3846
4211
  {
3847
4212
  ref,
@@ -3854,7 +4219,7 @@ var ContextMenuLabel = React36.forwardRef(({ className, inset, ...props }, ref)
3854
4219
  }
3855
4220
  ));
3856
4221
  ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName;
3857
- var ContextMenuSeparator = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
4222
+ var ContextMenuSeparator = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
3858
4223
  ContextMenuPrimitive.Separator,
3859
4224
  {
3860
4225
  ref,
@@ -3949,7 +4314,7 @@ var PopoverTrigger = PopoverPrimitive.Trigger;
3949
4314
  var PopoverAnchor = PopoverPrimitive.Anchor;
3950
4315
  var PopoverPortal = PopoverPrimitive.Portal;
3951
4316
  var PopoverClose = PopoverPrimitive.Close;
3952
- var PopoverContent = React36.forwardRef(({ className, align = "center", side = "bottom", sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
4317
+ var PopoverContent = React37.forwardRef(({ className, align = "center", side = "bottom", sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
3953
4318
  PopoverPrimitive.Content,
3954
4319
  {
3955
4320
  ref,
@@ -4494,7 +4859,7 @@ var chipVariants = cva(
4494
4859
  }
4495
4860
  }
4496
4861
  );
4497
- var DismissibleChip = React36.forwardRef(function DismissibleChip2({ label, onDismiss, variant, className, ...props }, ref) {
4862
+ var DismissibleChip = React37.forwardRef(function DismissibleChip2({ label, onDismiss, variant, className, ...props }, ref) {
4498
4863
  return /* @__PURE__ */ jsxs(
4499
4864
  "button",
4500
4865
  {
@@ -4511,13 +4876,130 @@ var DismissibleChip = React36.forwardRef(function DismissibleChip2({ label, onDi
4511
4876
  }
4512
4877
  );
4513
4878
  });
4879
+ var RAMP = [
4880
+ "var(--color-chart-1)",
4881
+ "var(--color-chart-2)",
4882
+ "var(--color-chart-3)",
4883
+ "var(--color-chart-4)"
4884
+ ];
4885
+ var DonutChart = forwardRef(function DonutChart2({
4886
+ segments,
4887
+ size = 132,
4888
+ strokeWidth = 16,
4889
+ centerLabel = "Total",
4890
+ center,
4891
+ legend = true,
4892
+ className,
4893
+ ...props
4894
+ }, ref) {
4895
+ const [hover, setHover] = useState(null);
4896
+ const titleId = useId();
4897
+ const total = segments.reduce((sum, s) => sum + s.value, 0) || 1;
4898
+ const radius = (size - strokeWidth) / 2;
4899
+ const circumference = 2 * Math.PI * radius;
4900
+ let acc = 0;
4901
+ const arcs = segments.map((s, i) => {
4902
+ const frac = s.value / total;
4903
+ const arc = {
4904
+ ...s,
4905
+ color: s.color ?? RAMP[i % RAMP.length],
4906
+ dash: frac * circumference,
4907
+ offset: acc * circumference
4908
+ };
4909
+ acc += frac;
4910
+ return arc;
4911
+ });
4912
+ const active = hover != null ? arcs[hover] : null;
4913
+ return /* @__PURE__ */ jsxs(
4914
+ "div",
4915
+ {
4916
+ ref,
4917
+ className: cn("flex items-center gap-6", className),
4918
+ role: "img",
4919
+ "aria-labelledby": titleId,
4920
+ ...props,
4921
+ children: [
4922
+ /* @__PURE__ */ jsxs("span", { id: titleId, className: "sr-only", children: [
4923
+ "Donut chart: ",
4924
+ arcs.map((a) => `${a.label} ${a.value}`).join(", ")
4925
+ ] }),
4926
+ /* @__PURE__ */ jsxs("div", { className: "relative shrink-0", style: { width: size, height: size }, children: [
4927
+ /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, "aria-hidden": "true", children: [
4928
+ /* @__PURE__ */ jsx(
4929
+ "circle",
4930
+ {
4931
+ cx: size / 2,
4932
+ cy: size / 2,
4933
+ r: radius,
4934
+ fill: "none",
4935
+ stroke: "var(--color-bg-3)",
4936
+ strokeWidth
4937
+ }
4938
+ ),
4939
+ arcs.map((s, i) => /* @__PURE__ */ jsx(
4940
+ "circle",
4941
+ {
4942
+ cx: size / 2,
4943
+ cy: size / 2,
4944
+ r: radius,
4945
+ fill: "none",
4946
+ stroke: s.color,
4947
+ strokeWidth: hover === i ? strokeWidth + 3 : strokeWidth,
4948
+ strokeDasharray: `${s.dash} ${circumference - s.dash}`,
4949
+ strokeDashoffset: -s.offset,
4950
+ strokeLinecap: "butt",
4951
+ transform: `rotate(-90 ${size / 2} ${size / 2})`,
4952
+ className: "cursor-pointer transition-[stroke-width,opacity] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
4953
+ style: { opacity: hover != null && hover !== i ? 0.35 : 1 },
4954
+ onMouseEnter: () => setHover(i),
4955
+ onMouseLeave: () => setHover(null)
4956
+ },
4957
+ i
4958
+ ))
4959
+ ] }),
4960
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 flex flex-col items-center justify-center text-center", children: center ?? /* @__PURE__ */ jsxs(Fragment, { children: [
4961
+ /* @__PURE__ */ jsx("span", { className: "text-fg text-2xl font-semibold tabular-nums", children: active ? active.value : total }),
4962
+ /* @__PURE__ */ jsx("span", { className: "text-fg-3 text-xs", children: active ? active.label : centerLabel })
4963
+ ] }) })
4964
+ ] }),
4965
+ legend && /* @__PURE__ */ jsx("ul", { className: "flex min-w-0 flex-col gap-1.5", children: arcs.map((s, i) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
4966
+ "button",
4967
+ {
4968
+ type: "button",
4969
+ onMouseEnter: () => setHover(i),
4970
+ onMouseLeave: () => setHover(null),
4971
+ onFocus: () => setHover(i),
4972
+ onBlur: () => setHover(null),
4973
+ className: cn(
4974
+ "flex w-full items-center gap-2 rounded-[var(--radius-icon)] px-1.5 py-1 text-left text-sm transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
4975
+ hover === i ? "bg-bg-2" : "hover:bg-bg-2"
4976
+ ),
4977
+ children: [
4978
+ /* @__PURE__ */ jsx(
4979
+ "span",
4980
+ {
4981
+ "aria-hidden": "true",
4982
+ className: "size-2.5 shrink-0 rounded-[3px]",
4983
+ style: { background: s.color }
4984
+ }
4985
+ ),
4986
+ /* @__PURE__ */ jsx("span", { className: "text-fg-2 min-w-0 flex-1 truncate", children: s.label }),
4987
+ /* @__PURE__ */ jsx("span", { className: "text-fg tabular-nums", children: s.value })
4988
+ ]
4989
+ }
4990
+ ) }, i)) })
4991
+ ]
4992
+ }
4993
+ );
4994
+ });
4995
+ DonutChart.displayName = "DonutChart";
4514
4996
  var DropdownMenu = DropdownMenuPrimitive.Root;
4515
4997
  var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
4516
4998
  var DropdownMenuGroup = DropdownMenuPrimitive.Group;
4517
4999
  var DropdownMenuPortal = DropdownMenuPrimitive.Portal;
4518
5000
  var DropdownMenuSub = DropdownMenuPrimitive.Sub;
4519
5001
  var DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
4520
- var DropdownMenuSubTrigger = React36.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
5002
+ var DropdownMenuSubTrigger = React37.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(
4521
5003
  DropdownMenuPrimitive.SubTrigger,
4522
5004
  {
4523
5005
  ref,
@@ -4538,7 +5020,7 @@ var DropdownMenuSubTrigger = React36.forwardRef(({ className, inset, children, .
4538
5020
  }
4539
5021
  ));
4540
5022
  DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
4541
- var DropdownMenuSubContent = React36.forwardRef(({ className, ...props }, ref) => (
5023
+ var DropdownMenuSubContent = React37.forwardRef(({ className, ...props }, ref) => (
4542
5024
  // Portal the sub-content to the body. The parent Content keeps a persistent
4543
5025
  // `scale-100` transform (its open-state animation), which makes it the
4544
5026
  // containing block for `position: fixed` descendants — and its
@@ -4561,7 +5043,7 @@ var DropdownMenuSubContent = React36.forwardRef(({ className, ...props }, ref) =
4561
5043
  ) })
4562
5044
  ));
4563
5045
  DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
4564
- var DropdownMenuContent = React36.forwardRef(({ className, sideOffset = 6, align = "start", ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
5046
+ var DropdownMenuContent = React37.forwardRef(({ className, sideOffset = 6, align = "start", ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(
4565
5047
  DropdownMenuPrimitive.Content,
4566
5048
  {
4567
5049
  ref,
@@ -4579,7 +5061,7 @@ var DropdownMenuContent = React36.forwardRef(({ className, sideOffset = 6, align
4579
5061
  }
4580
5062
  ) }));
4581
5063
  DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
4582
- var DropdownMenuItem = React36.forwardRef(({ className, destructive, inset, ...props }, ref) => /* @__PURE__ */ jsx(
5064
+ var DropdownMenuItem = React37.forwardRef(({ className, destructive, inset, ...props }, ref) => /* @__PURE__ */ jsx(
4583
5065
  DropdownMenuPrimitive.Item,
4584
5066
  {
4585
5067
  ref,
@@ -4597,7 +5079,7 @@ var DropdownMenuItem = React36.forwardRef(({ className, destructive, inset, ...p
4597
5079
  }
4598
5080
  ));
4599
5081
  DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
4600
- var DropdownMenuCheckboxItem = React36.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
5082
+ var DropdownMenuCheckboxItem = React37.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(
4601
5083
  DropdownMenuPrimitive.CheckboxItem,
4602
5084
  {
4603
5085
  ref,
@@ -4617,7 +5099,7 @@ var DropdownMenuCheckboxItem = React36.forwardRef(({ className, children, checke
4617
5099
  }
4618
5100
  ));
4619
5101
  DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
4620
- var DropdownMenuRadioItem = React36.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
5102
+ var DropdownMenuRadioItem = React37.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
4621
5103
  DropdownMenuPrimitive.RadioItem,
4622
5104
  {
4623
5105
  ref,
@@ -4636,7 +5118,7 @@ var DropdownMenuRadioItem = React36.forwardRef(({ className, children, ...props
4636
5118
  }
4637
5119
  ));
4638
5120
  DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
4639
- var DropdownMenuLabel = React36.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
5121
+ var DropdownMenuLabel = React37.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(
4640
5122
  DropdownMenuPrimitive.Label,
4641
5123
  {
4642
5124
  ref,
@@ -4649,7 +5131,7 @@ var DropdownMenuLabel = React36.forwardRef(({ className, inset, ...props }, ref)
4649
5131
  }
4650
5132
  ));
4651
5133
  DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
4652
- var DropdownMenuSeparator = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
5134
+ var DropdownMenuSeparator = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
4653
5135
  DropdownMenuPrimitive.Separator,
4654
5136
  {
4655
5137
  ref,
@@ -4692,6 +5174,44 @@ var EmptyState = forwardRef(function EmptyState2({ icon, title, description, act
4692
5174
  );
4693
5175
  });
4694
5176
  EmptyState.displayName = "EmptyState";
5177
+ var kindTile = {
5178
+ doc: "bg-danger-bg text-danger-fg",
5179
+ sheet: "bg-success-bg text-success-fg",
5180
+ image: "bg-accent-tint text-accent",
5181
+ generic: "bg-bg-3 text-fg-3"
5182
+ };
5183
+ var FileChip = forwardRef(function FileChip2({ name, meta, kind = "doc", icon, action, className, ...props }, ref) {
5184
+ return /* @__PURE__ */ jsxs(
5185
+ "div",
5186
+ {
5187
+ ref,
5188
+ className: cn(
5189
+ "border-rule bg-surface flex items-center gap-3 rounded-[var(--radius-input)] border p-2.5",
5190
+ className
5191
+ ),
5192
+ ...props,
5193
+ children: [
5194
+ /* @__PURE__ */ jsx(
5195
+ "span",
5196
+ {
5197
+ "aria-hidden": "true",
5198
+ className: cn(
5199
+ "flex size-9 shrink-0 items-center justify-center rounded-[var(--radius-icon)] [&_svg]:size-4.5",
5200
+ kindTile[kind]
5201
+ ),
5202
+ children: icon ?? /* @__PURE__ */ jsx(FileTextIcon, {})
5203
+ }
5204
+ ),
5205
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
5206
+ /* @__PURE__ */ jsx("p", { className: "text-fg truncate text-sm font-medium", children: name }),
5207
+ meta != null && /* @__PURE__ */ jsx("p", { className: "text-fg-3 truncate text-xs", children: meta })
5208
+ ] }),
5209
+ action && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: action })
5210
+ ]
5211
+ }
5212
+ );
5213
+ });
5214
+ FileChip.displayName = "FileChip";
4695
5215
  function FileUpload({
4696
5216
  accept,
4697
5217
  maxSize,
@@ -4864,7 +5384,7 @@ FormSection.displayName = "FormSection";
4864
5384
  var HoverCard = HoverCardPrimitive.Root;
4865
5385
  var HoverCardTrigger = HoverCardPrimitive.Trigger;
4866
5386
  var HoverCardPortal = HoverCardPrimitive.Portal;
4867
- var HoverCardContent = React36.forwardRef(({ className, align = "center", side = "bottom", sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx(HoverCardPrimitive.Portal, { children: /* @__PURE__ */ jsx(
5387
+ var HoverCardContent = React37.forwardRef(({ className, align = "center", side = "bottom", sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx(HoverCardPrimitive.Portal, { children: /* @__PURE__ */ jsx(
4868
5388
  HoverCardPrimitive.Content,
4869
5389
  {
4870
5390
  ref,
@@ -4883,6 +5403,40 @@ var HoverCardContent = React36.forwardRef(({ className, align = "center", side =
4883
5403
  }
4884
5404
  ) }));
4885
5405
  HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
5406
+ var iconTileVariants = cva(
5407
+ cn("relative grid shrink-0 place-items-center", "[&_svg]:shrink-0"),
5408
+ {
5409
+ variants: {
5410
+ tone: {
5411
+ pro: "bg-pro-bg text-pro-fg",
5412
+ neutral: "bg-bg-2 text-fg-3",
5413
+ info: "bg-accent-tint text-accent-2",
5414
+ success: "bg-success-bg text-success-fg",
5415
+ warning: "bg-warning-bg text-warning-fg",
5416
+ danger: "bg-danger-bg text-danger-fg",
5417
+ audit: "bg-[color-mix(in_srgb,var(--color-brand-audit)_12%,transparent)] text-brand-audit",
5418
+ books: "bg-[color-mix(in_srgb,var(--color-brand-books)_12%,transparent)] text-brand-books",
5419
+ tax: "bg-[color-mix(in_srgb,var(--color-brand-tax)_12%,transparent)] text-brand-tax"
5420
+ },
5421
+ size: {
5422
+ sm: "size-[30px] rounded-[8px] [&_svg]:size-4",
5423
+ md: "size-[38px] rounded-[10px] [&_svg]:size-[18px]",
5424
+ lg: "size-[42px] rounded-[12px] [&_svg]:size-5"
5425
+ }
5426
+ },
5427
+ defaultVariants: {
5428
+ tone: "pro",
5429
+ size: "md"
5430
+ }
5431
+ }
5432
+ );
5433
+ var IconTile = forwardRef(function IconTile2({ icon, tone, size, badge, className, ...props }, ref) {
5434
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn(iconTileVariants({ tone, size }), className), ...props, children: [
5435
+ icon,
5436
+ badge != null && /* @__PURE__ */ jsx("span", { className: "absolute -top-1.5 -right-1.5 z-10 flex", children: badge })
5437
+ ] });
5438
+ });
5439
+ IconTile.displayName = "IconTile";
4886
5440
  var inputVariants = cva(
4887
5441
  [
4888
5442
  "flex w-full rounded-input border bg-surface font-body text-fg",
@@ -5002,8 +5556,8 @@ function KeyboardShortcutsDialog({
5002
5556
  sections,
5003
5557
  hotkey = "?"
5004
5558
  } = {}) {
5005
- const [open, setOpen] = React36.useState(false);
5006
- React36.useEffect(() => {
5559
+ const [open, setOpen] = React37.useState(false);
5560
+ React37.useEffect(() => {
5007
5561
  if (hotkey === null) return;
5008
5562
  function handleKeyDown(e) {
5009
5563
  const target = e.target;
@@ -5041,7 +5595,7 @@ function KeyboardShortcutsDialog({
5041
5595
  className: "flex items-center justify-between gap-3 py-1",
5042
5596
  children: [
5043
5597
  /* @__PURE__ */ jsx("span", { className: "text-fg text-sm", children: shortcut.description }),
5044
- /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-1", children: shortcut.keys.map((key, i) => /* @__PURE__ */ jsxs(React36.Fragment, { children: [
5598
+ /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-1", children: shortcut.keys.map((key, i) => /* @__PURE__ */ jsxs(React37.Fragment, { children: [
5045
5599
  i > 0 && /* @__PURE__ */ jsx("span", { className: "text-fg-4 mx-0.5 text-[11px]", children: "then" }),
5046
5600
  /* @__PURE__ */ jsx("kbd", { className: kbdClass2, children: key })
5047
5601
  ] }, i)) })
@@ -5060,7 +5614,7 @@ function KeyboardShortcutsDialog({
5060
5614
  var labelVariants = cva(
5061
5615
  "text-[13px] font-medium leading-none text-fg select-none peer-disabled:cursor-not-allowed peer-disabled:text-fg-disabled has-[+input:disabled]:text-fg-disabled"
5062
5616
  );
5063
- var Label4 = React36.forwardRef(
5617
+ var Label4 = React37.forwardRef(
5064
5618
  function Label5({ children, required, className, ...props }, ref) {
5065
5619
  return /* @__PURE__ */ jsxs(LabelPrimitive.Root, { ref, className: cn(labelVariants(), className), ...props, children: [
5066
5620
  children,
@@ -5226,6 +5780,80 @@ function Logo({
5226
5780
  }
5227
5781
  );
5228
5782
  }
5783
+ var MasterDetailLayout = forwardRef(
5784
+ function MasterDetailLayout2({
5785
+ list,
5786
+ detail,
5787
+ detailOpen = false,
5788
+ onBack,
5789
+ backLabel = "Back",
5790
+ listWidth = 340,
5791
+ className,
5792
+ style,
5793
+ ...props
5794
+ }, ref) {
5795
+ const resolvedWidth = typeof listWidth === "number" ? `${listWidth}px` : listWidth;
5796
+ return /* @__PURE__ */ jsxs(
5797
+ "div",
5798
+ {
5799
+ ref,
5800
+ "data-detail-open": detailOpen ? "true" : "false",
5801
+ className: cn(
5802
+ "bg-surface relative flex h-full min-h-0 w-full overflow-hidden",
5803
+ className
5804
+ ),
5805
+ style: { "--master-list-width": resolvedWidth, ...style },
5806
+ ...props,
5807
+ children: [
5808
+ /* @__PURE__ */ jsx(
5809
+ "div",
5810
+ {
5811
+ className: cn(
5812
+ "bg-surface flex min-h-0 w-full flex-col overflow-auto",
5813
+ "md:w-[var(--master-list-width)] md:shrink-0 md:border-rule md:border-r"
5814
+ ),
5815
+ children: list
5816
+ }
5817
+ ),
5818
+ /* @__PURE__ */ jsxs(
5819
+ "div",
5820
+ {
5821
+ className: cn(
5822
+ "bg-surface-2 flex min-h-0 flex-col overflow-auto",
5823
+ // mobile: overlay the list and slide in from the right
5824
+ "max-md:absolute max-md:inset-0 max-md:z-[var(--z-modal)]",
5825
+ "max-md:transition-transform max-md:duration-[var(--duration-normal)] max-md:ease-[var(--ease-out-quart)]",
5826
+ "motion-reduce:transition-none",
5827
+ detailOpen ? "max-md:translate-x-0" : "max-md:pointer-events-none max-md:translate-x-full",
5828
+ // desktop: reset to a static, independently-scrolling flex column
5829
+ "md:static md:z-auto md:flex-1 md:translate-x-0 md:transition-none md:pointer-events-auto"
5830
+ ),
5831
+ children: [
5832
+ onBack && /* @__PURE__ */ jsx("div", { className: "border-rule bg-surface sticky top-0 z-[var(--z-sticky)] flex h-12 shrink-0 items-center border-b px-2 md:hidden", children: /* @__PURE__ */ jsx(
5833
+ "button",
5834
+ {
5835
+ type: "button",
5836
+ onClick: onBack,
5837
+ "aria-label": backLabel,
5838
+ className: cn(
5839
+ "rounded-icon text-fg-3 inline-flex size-9 items-center justify-center",
5840
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
5841
+ "hover:bg-surface-2 hover:text-fg",
5842
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none"
5843
+ ),
5844
+ children: /* @__PURE__ */ jsx(ArrowLeftIcon, { className: "size-4", "aria-hidden": "true" })
5845
+ }
5846
+ ) }),
5847
+ detail
5848
+ ]
5849
+ }
5850
+ )
5851
+ ]
5852
+ }
5853
+ );
5854
+ }
5855
+ );
5856
+ MasterDetailLayout.displayName = "MasterDetailLayout";
5229
5857
  var TRIGGER_SIZE = {
5230
5858
  sm: "h-8 gap-1.5 px-2.5 text-[13px]",
5231
5859
  md: "h-9 gap-2 px-3 text-sm",
@@ -5391,7 +6019,7 @@ function MultiSelectField({
5391
6019
  size = "md",
5392
6020
  id
5393
6021
  }) {
5394
- const selected = React36.useMemo(
6022
+ const selected = React37.useMemo(
5395
6023
  () => new Set(value ? value.split(",").filter(Boolean) : []),
5396
6024
  [value]
5397
6025
  );
@@ -5404,7 +6032,7 @@ function MultiSelectField({
5404
6032
  }
5405
6033
  onChange(Array.from(next).join(","));
5406
6034
  };
5407
- const generatedId = React36.useId();
6035
+ const generatedId = React37.useId();
5408
6036
  const groupId = id ?? generatedId;
5409
6037
  return /* @__PURE__ */ jsxs("div", { className: cn("w-full", className), children: [
5410
6038
  /* @__PURE__ */ jsx(
@@ -6233,12 +6861,12 @@ var ProgressRing = forwardRef(function ProgressRing2({ value, max = 100, size =
6233
6861
  );
6234
6862
  });
6235
6863
  ProgressRing.displayName = "ProgressRing";
6236
- var RadioGroup3 = React36.forwardRef(function RadioGroup4({ className, ...props }, ref) {
6864
+ var RadioGroup3 = React37.forwardRef(function RadioGroup4({ className, ...props }, ref) {
6237
6865
  return /* @__PURE__ */ jsx(RadioGroupPrimitive.Root, { ref, className: cn("grid gap-2", className), ...props });
6238
6866
  });
6239
6867
  RadioGroup3.displayName = RadioGroupPrimitive.Root.displayName;
6240
- var RadioGroupItem = React36.forwardRef(function RadioGroupItem2({ className, label, id: providedId, ...props }, ref) {
6241
- const generatedId = React36.useId();
6868
+ var RadioGroupItem = React37.forwardRef(function RadioGroupItem2({ className, label, id: providedId, ...props }, ref) {
6869
+ const generatedId = React37.useId();
6242
6870
  const id = providedId ?? generatedId;
6243
6871
  const root = /* @__PURE__ */ jsx(
6244
6872
  RadioGroupPrimitive.Item,
@@ -6273,30 +6901,290 @@ var RadioGroupItem = React36.forwardRef(function RadioGroupItem2({ className, la
6273
6901
  ] });
6274
6902
  });
6275
6903
  RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
6276
- var ScrollArea = React36.forwardRef(function ScrollArea2({ className, children, ...props }, ref) {
6277
- return /* @__PURE__ */ jsxs(
6278
- ScrollAreaPrimitive.Root,
6279
- {
6280
- ref,
6281
- className: cn("relative overflow-hidden", className),
6282
- ...props,
6283
- children: [
6284
- /* @__PURE__ */ jsx(
6285
- ScrollAreaPrimitive.Viewport,
6904
+ var RAMP2 = [
6905
+ "var(--color-chart-1)",
6906
+ "var(--color-chart-2)",
6907
+ "var(--color-chart-3)",
6908
+ "var(--color-chart-4)"
6909
+ ];
6910
+ var RankedBars = forwardRef(function RankedBars2({ items, className, ...props }, ref) {
6911
+ return /* @__PURE__ */ jsx("ul", { ref, className: cn("flex flex-col gap-4", className), ...props, children: items.map((bar, i) => {
6912
+ const up = (bar.change ?? 0) >= 0;
6913
+ const ChangeIcon = up ? TrendingUpIcon : TrendingDownIcon;
6914
+ return /* @__PURE__ */ jsxs("li", { className: "flex flex-col gap-1.5", children: [
6915
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [
6916
+ /* @__PURE__ */ jsx("span", { className: "text-fg-2 text-sm font-medium", children: bar.label }),
6917
+ bar.value != null && /* @__PURE__ */ jsx("span", { className: "text-fg text-sm font-semibold tabular-nums", children: bar.value })
6918
+ ] }),
6919
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
6920
+ /* @__PURE__ */ jsx("div", { className: "bg-bg-3 h-2 flex-1 overflow-hidden rounded-full", children: /* @__PURE__ */ jsx(
6921
+ "div",
6286
6922
  {
6287
- tabIndex: 0,
6288
- className: "h-full w-full rounded-[inherit] focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
6289
- children
6923
+ className: "h-full rounded-full transition-[width] duration-[var(--duration-slow)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
6924
+ style: {
6925
+ width: `${Math.min(100, Math.max(0, bar.pct))}%`,
6926
+ background: bar.color ?? RAMP2[i % RAMP2.length]
6927
+ }
6290
6928
  }
6291
- ),
6292
- /* @__PURE__ */ jsx(ScrollBar, {}),
6929
+ ) }),
6930
+ bar.change != null && /* @__PURE__ */ jsxs(
6931
+ "span",
6932
+ {
6933
+ className: cn(
6934
+ "inline-flex shrink-0 items-center gap-0.5 text-xs font-semibold tabular-nums",
6935
+ up ? "text-success-fg" : "text-danger-fg"
6936
+ ),
6937
+ children: [
6938
+ /* @__PURE__ */ jsx(ChangeIcon, { className: "size-3", "aria-hidden": "true" }),
6939
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
6940
+ up ? "Up" : "Down",
6941
+ " "
6942
+ ] }),
6943
+ Math.abs(bar.change),
6944
+ "%"
6945
+ ]
6946
+ }
6947
+ )
6948
+ ] }),
6949
+ bar.sublabel != null && /* @__PURE__ */ jsx("span", { className: "text-fg-3 text-xs", children: bar.sublabel })
6950
+ ] }, i);
6951
+ }) });
6952
+ });
6953
+ RankedBars.displayName = "RankedBars";
6954
+ var SheetSideContext = React37.createContext({});
6955
+ var Sheet = ({ side, children, ...props }) => /* @__PURE__ */ jsx(DialogPrimitive.Root, { ...props, children: /* @__PURE__ */ jsx(SheetSideContext, { value: { side }, children }) });
6956
+ Sheet.displayName = "Sheet";
6957
+ var SheetTrigger = DialogPrimitive.Trigger;
6958
+ var SheetClose = DialogPrimitive.Close;
6959
+ var SheetPortal = DialogPrimitive.Portal;
6960
+ var SheetOverlay = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
6961
+ DialogPrimitive.Overlay,
6962
+ {
6963
+ ref,
6964
+ className: cn(
6965
+ "bg-overlay fixed inset-0 z-[var(--z-overlay)] backdrop-blur-[4px]",
6966
+ "transition-opacity duration-[var(--duration-overlay)] ease-[var(--ease-out-quart)]",
6967
+ "data-[state=closed]:opacity-0 data-[state=open]:opacity-100",
6968
+ "motion-reduce:transition-none",
6969
+ className
6970
+ ),
6971
+ ...props
6972
+ }
6973
+ ));
6974
+ SheetOverlay.displayName = DialogPrimitive.Overlay.displayName;
6975
+ var sheetVariants = cva(
6976
+ cn(
6977
+ "fixed z-[var(--z-modal)] flex flex-col gap-4 bg-surface text-fg shadow-pop",
6978
+ "transition ease-in-out duration-[var(--duration-normal)] ease-[var(--ease-out-quart)]",
6979
+ "motion-reduce:transition-none"
6980
+ ),
6981
+ {
6982
+ variants: {
6983
+ side: {
6984
+ top: cn(
6985
+ "inset-x-0 top-0 border-b border-rule",
6986
+ "data-[state=closed]:-translate-y-full data-[state=open]:translate-y-0"
6987
+ ),
6988
+ bottom: cn(
6989
+ "inset-x-0 bottom-0 border-t border-rule max-h-[85vh]",
6990
+ "data-[state=closed]:translate-y-full data-[state=open]:translate-y-0"
6991
+ ),
6992
+ left: cn(
6993
+ "inset-y-0 left-0 h-full w-3/4 max-w-sm border-r border-rule",
6994
+ "data-[state=closed]:-translate-x-full data-[state=open]:translate-x-0"
6995
+ ),
6996
+ right: cn(
6997
+ "inset-y-0 right-0 h-full w-3/4 max-w-sm border-l border-rule",
6998
+ "data-[state=closed]:translate-x-full data-[state=open]:translate-x-0"
6999
+ )
7000
+ }
7001
+ },
7002
+ defaultVariants: { side: "right" }
7003
+ }
7004
+ );
7005
+ var sheetWidthClasses = {
7006
+ sm: "w-[95vw] max-w-[95vw] sm:w-[420px]",
7007
+ md: "w-[95vw] max-w-[95vw] sm:w-[520px]",
7008
+ lg: "w-[95vw] max-w-[95vw] sm:w-[640px]",
7009
+ xl: "w-[95vw] max-w-[95vw] sm:w-[760px]",
7010
+ full: "w-full max-w-none"
7011
+ };
7012
+ var SheetContent = React37.forwardRef(
7013
+ ({ side, width = "default", customWidth, className, children, showCloseButton = true, style, ...props }, ref) => {
7014
+ const ctx = React37.use(SheetSideContext);
7015
+ const resolvedSide = side ?? ctx.side ?? "right";
7016
+ const supportsWidth = resolvedSide === "left" || resolvedSide === "right";
7017
+ const widthClass = supportsWidth && width !== "default" ? sheetWidthClasses[width] : null;
7018
+ const widthStyle = supportsWidth && customWidth ? { width: customWidth, maxWidth: "95vw", ...style } : style;
7019
+ return /* @__PURE__ */ jsxs(SheetPortal, { children: [
7020
+ /* @__PURE__ */ jsx(SheetOverlay, {}),
7021
+ /* @__PURE__ */ jsxs(
7022
+ DialogPrimitive.Content,
7023
+ {
7024
+ ref,
7025
+ className: cn(sheetVariants({ side: resolvedSide }), widthClass, className),
7026
+ style: widthStyle,
7027
+ ...props,
7028
+ children: [
7029
+ children,
7030
+ showCloseButton && /* @__PURE__ */ jsx(
7031
+ DialogPrimitive.Close,
7032
+ {
7033
+ className: cn(
7034
+ "absolute top-4 right-4 inline-flex size-7 items-center justify-center",
7035
+ "rounded-icon text-fg-4 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7036
+ "hover:bg-overlay-hover hover:text-fg",
7037
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
7038
+ "disabled:pointer-events-none"
7039
+ ),
7040
+ "aria-label": "Close",
7041
+ children: /* @__PURE__ */ jsx(XIcon, { className: "size-4", "aria-hidden": "true" })
7042
+ }
7043
+ )
7044
+ ]
7045
+ }
7046
+ )
7047
+ ] });
7048
+ }
7049
+ );
7050
+ SheetContent.displayName = DialogPrimitive.Content.displayName;
7051
+ var SheetHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-1.5 p-6 pr-12 pb-0", className), ...props });
7052
+ SheetHeader.displayName = "SheetHeader";
7053
+ var SheetFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
7054
+ "div",
7055
+ {
7056
+ className: cn(
7057
+ "border-rule mt-auto flex flex-col-reverse gap-2 border-t p-6 sm:flex-row sm:items-center sm:justify-end",
7058
+ className
7059
+ ),
7060
+ ...props
7061
+ }
7062
+ );
7063
+ SheetFooter.displayName = "SheetFooter";
7064
+ var SheetTitle = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
7065
+ DialogPrimitive.Title,
7066
+ {
7067
+ ref,
7068
+ className: cn(
7069
+ "font-display text-fg text-base leading-tight font-medium tracking-tight",
7070
+ className
7071
+ ),
7072
+ ...props
7073
+ }
7074
+ ));
7075
+ SheetTitle.displayName = DialogPrimitive.Title.displayName;
7076
+ var SheetDescription = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Description, { ref, className: cn("text-fg-3 text-sm", className), ...props }));
7077
+ SheetDescription.displayName = DialogPrimitive.Description.displayName;
7078
+ var MOBILE_QUERY = "(max-width: 639.98px)";
7079
+ function useIsMobile() {
7080
+ const [state, setState] = React37.useState({ isMobile: false, mounted: false });
7081
+ React37.useEffect(() => {
7082
+ const mql = window.matchMedia(MOBILE_QUERY);
7083
+ const update = () => setState({ isMobile: mql.matches, mounted: true });
7084
+ update();
7085
+ mql.addEventListener("change", update);
7086
+ return () => mql.removeEventListener("change", update);
7087
+ }, []);
7088
+ return state;
7089
+ }
7090
+ function ResponsiveDialog({
7091
+ open,
7092
+ onOpenChange,
7093
+ title,
7094
+ description,
7095
+ children,
7096
+ footer,
7097
+ className,
7098
+ side = "bottom",
7099
+ size = "md"
7100
+ }) {
7101
+ const { isMobile, mounted } = useIsMobile();
7102
+ const close = React37.useCallback(() => onOpenChange(false), [onOpenChange]);
7103
+ const resolvedFooter = typeof footer === "function" ? footer(close) : footer;
7104
+ const hasHeader = Boolean(title || description);
7105
+ if (mounted && isMobile) {
7106
+ return /* @__PURE__ */ jsx(Sheet, { open, onOpenChange, children: /* @__PURE__ */ jsxs(
7107
+ SheetContent,
7108
+ {
7109
+ side,
7110
+ className: cn(side === "bottom" && "rounded-t-card", className),
7111
+ children: [
7112
+ side === "bottom" && /* @__PURE__ */ jsx(
7113
+ "span",
7114
+ {
7115
+ "aria-hidden": "true",
7116
+ className: "mx-auto mt-2.5 h-1 w-9 shrink-0 rounded-full bg-[color:var(--color-rule-strong)]"
7117
+ }
7118
+ ),
7119
+ hasHeader ? /* @__PURE__ */ jsxs(SheetHeader, { children: [
7120
+ /* @__PURE__ */ jsx(SheetTitle, { className: cn(!title && "sr-only"), children: title ?? "Dialog" }),
7121
+ description && /* @__PURE__ */ jsx(SheetDescription, { children: description })
7122
+ ] }) : /* @__PURE__ */ jsx(SheetTitle, { className: "sr-only", children: "Dialog" }),
7123
+ /* @__PURE__ */ jsx(
7124
+ "div",
7125
+ {
7126
+ className: cn(
7127
+ "scrollbar-thin flex-1 overflow-y-auto px-6",
7128
+ !resolvedFooter && "pb-6"
7129
+ ),
7130
+ children
7131
+ }
7132
+ ),
7133
+ resolvedFooter && /* @__PURE__ */ jsx(SheetFooter, { children: resolvedFooter })
7134
+ ]
7135
+ }
7136
+ ) });
7137
+ }
7138
+ return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(DialogContent, { size, className, children: [
7139
+ hasHeader ? /* @__PURE__ */ jsxs(DialogHeader, { children: [
7140
+ /* @__PURE__ */ jsx(DialogTitle, { className: cn(!title && "sr-only"), children: title ?? "Dialog" }),
7141
+ description && /* @__PURE__ */ jsx(DialogDescription, { children: description })
7142
+ ] }) : /* @__PURE__ */ jsx(DialogTitle, { className: "sr-only", children: "Dialog" }),
7143
+ children,
7144
+ resolvedFooter && /* @__PURE__ */ jsx(DialogFooter, { children: resolvedFooter })
7145
+ ] }) });
7146
+ }
7147
+ ResponsiveDialog.displayName = "ResponsiveDialog";
7148
+ var RouteTransition = forwardRef(
7149
+ function RouteTransition2({ routeKey, className, children, ...props }, ref) {
7150
+ return /* @__PURE__ */ jsx("div", { ref, className: cn(className), ...props, children: /* @__PURE__ */ jsx(
7151
+ "div",
7152
+ {
7153
+ className: cn(
7154
+ "animate-in fade-in-0 slide-in-from-bottom-2",
7155
+ "duration-[var(--duration-normal)] ease-[var(--ease-out-quart)]"
7156
+ ),
7157
+ children
7158
+ },
7159
+ routeKey
7160
+ ) });
7161
+ }
7162
+ );
7163
+ RouteTransition.displayName = "RouteTransition";
7164
+ var ScrollArea = React37.forwardRef(function ScrollArea2({ className, children, ...props }, ref) {
7165
+ return /* @__PURE__ */ jsxs(
7166
+ ScrollAreaPrimitive.Root,
7167
+ {
7168
+ ref,
7169
+ className: cn("relative overflow-hidden", className),
7170
+ ...props,
7171
+ children: [
7172
+ /* @__PURE__ */ jsx(
7173
+ ScrollAreaPrimitive.Viewport,
7174
+ {
7175
+ tabIndex: 0,
7176
+ className: "h-full w-full rounded-[inherit] focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
7177
+ children
7178
+ }
7179
+ ),
7180
+ /* @__PURE__ */ jsx(ScrollBar, {}),
6293
7181
  /* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})
6294
7182
  ]
6295
7183
  }
6296
7184
  );
6297
7185
  });
6298
7186
  ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
6299
- var ScrollBar = React36.forwardRef(function ScrollBar2({ className, orientation = "vertical", ...props }, ref) {
7187
+ var ScrollBar = React37.forwardRef(function ScrollBar2({ className, orientation = "vertical", ...props }, ref) {
6300
7188
  return /* @__PURE__ */ jsx(
6301
7189
  ScrollAreaPrimitive.ScrollAreaScrollbar,
6302
7190
  {
@@ -6361,7 +7249,7 @@ var searchInputVariants = cva(
6361
7249
  }
6362
7250
  }
6363
7251
  );
6364
- var SearchInput = React36.forwardRef(
7252
+ var SearchInput = React37.forwardRef(
6365
7253
  function SearchInput2({
6366
7254
  value,
6367
7255
  onValueChange,
@@ -6374,8 +7262,8 @@ var SearchInput = React36.forwardRef(
6374
7262
  ...props
6375
7263
  }, ref) {
6376
7264
  const debouncedValue = useDebounce(value, debounceMs);
6377
- const isFirstRender = React36.useRef(true);
6378
- React36.useEffect(() => {
7265
+ const isFirstRender = React37.useRef(true);
7266
+ React37.useEffect(() => {
6379
7267
  if (isFirstRender.current) {
6380
7268
  isFirstRender.current = false;
6381
7269
  return;
@@ -6453,15 +7341,15 @@ function SearchSelect({
6453
7341
  descriptionVariant = "inline"
6454
7342
  }) {
6455
7343
  const isSingleMode = value !== void 0 || onValueChange !== void 0;
6456
- const singleSelectedOption = React36.useMemo(
7344
+ const singleSelectedOption = React37.useMemo(
6457
7345
  () => isSingleMode && value ? options.find((o) => o.id === value) ?? null : null,
6458
7346
  [isSingleMode, value, options]
6459
7347
  );
6460
- const selected = React36.useMemo(
7348
+ const selected = React37.useMemo(
6461
7349
  () => isSingleMode ? singleSelectedOption ? [singleSelectedOption] : [] : selectedProp ?? [],
6462
7350
  [isSingleMode, singleSelectedOption, selectedProp]
6463
7351
  );
6464
- const onSelect = React36.useCallback(
7352
+ const onSelect = React37.useCallback(
6465
7353
  (option) => {
6466
7354
  if (isSingleMode) {
6467
7355
  onValueChange?.(option.id);
@@ -6471,7 +7359,7 @@ function SearchSelect({
6471
7359
  },
6472
7360
  [isSingleMode, onValueChange, onSelectProp]
6473
7361
  );
6474
- const onRemove = React36.useCallback(
7362
+ const onRemove = React37.useCallback(
6475
7363
  (option) => {
6476
7364
  if (isSingleMode) {
6477
7365
  onValueChange?.("");
@@ -6482,15 +7370,15 @@ function SearchSelect({
6482
7370
  [isSingleMode, onValueChange, onRemoveProp]
6483
7371
  );
6484
7372
  const closeOnSelect = isSingleMode || closeOnSelectProp;
6485
- const [search, setSearch] = React36.useState("");
6486
- const [open, setOpen] = React36.useState(false);
6487
- const [activeChip, setActiveChip] = React36.useState(null);
6488
- const selectedIds = React36.useMemo(() => new Set(selected.map((s) => s.id)), [selected]);
6489
- const filtered = React36.useMemo(
7373
+ const [search, setSearch] = React37.useState("");
7374
+ const [open, setOpen] = React37.useState(false);
7375
+ const [activeChip, setActiveChip] = React37.useState(null);
7376
+ const selectedIds = React37.useMemo(() => new Set(selected.map((s) => s.id)), [selected]);
7377
+ const filtered = React37.useMemo(
6490
7378
  () => options.filter((opt) => !selectedIds.has(opt.id)),
6491
7379
  [options, selectedIds]
6492
7380
  );
6493
- const groups = React36.useMemo(() => {
7381
+ const groups = React37.useMemo(() => {
6494
7382
  const order = [];
6495
7383
  const byGroup = /* @__PURE__ */ new Map();
6496
7384
  for (const opt of filtered) {
@@ -6502,25 +7390,25 @@ function SearchSelect({
6502
7390
  }
6503
7391
  return order.map((g) => [g, byGroup.get(g)]);
6504
7392
  }, [filtered]);
6505
- const hasGroups = React36.useMemo(() => groups.some(([g]) => g != null), [groups]);
6506
- const pinnedSet = React36.useMemo(() => new Set(pinnedGroups ?? []), [pinnedGroups]);
6507
- const chips = React36.useMemo(() => {
7393
+ const hasGroups = React37.useMemo(() => groups.some(([g]) => g != null), [groups]);
7394
+ const pinnedSet = React37.useMemo(() => new Set(pinnedGroups ?? []), [pinnedGroups]);
7395
+ const chips = React37.useMemo(() => {
6508
7396
  if (!groupFilter || !hasGroups) return [];
6509
7397
  return groups.map(([g]) => g).filter((g) => g != null && !pinnedSet.has(g));
6510
7398
  }, [groupFilter, hasGroups, groups, pinnedSet]);
6511
- const visibleGroups = React36.useMemo(() => {
7399
+ const visibleGroups = React37.useMemo(() => {
6512
7400
  if (chips.length > 0 && activeChip) {
6513
7401
  return groups.filter(([g]) => g === activeChip);
6514
7402
  }
6515
7403
  return groups;
6516
7404
  }, [groups, chips.length, activeChip]);
6517
7405
  const trimmedSearch = search.trim();
6518
- const hasExactMatch = React36.useMemo(
7406
+ const hasExactMatch = React37.useMemo(
6519
7407
  () => options.some((opt) => opt.label.toLowerCase() === trimmedSearch.toLowerCase()),
6520
7408
  [options, trimmedSearch]
6521
7409
  );
6522
7410
  const showCreate = !!onCreate && trimmedSearch.length > 0 && !hasExactMatch;
6523
- const handleSelect = React36.useCallback(
7411
+ const handleSelect = React37.useCallback(
6524
7412
  (option) => {
6525
7413
  onSelect(option);
6526
7414
  setSearch("");
@@ -6528,16 +7416,16 @@ function SearchSelect({
6528
7416
  },
6529
7417
  [onSelect, closeOnSelect]
6530
7418
  );
6531
- const handleCreate = React36.useCallback(() => {
7419
+ const handleCreate = React37.useCallback(() => {
6532
7420
  if (onCreate && trimmedSearch) {
6533
7421
  onCreate(trimmedSearch);
6534
7422
  setSearch("");
6535
7423
  setOpen(false);
6536
7424
  }
6537
7425
  }, [onCreate, trimmedSearch]);
6538
- const inputRef = React36.useRef(null);
6539
- const listboxId = React36.useId();
6540
- const setInputRef = React36.useCallback((node) => {
7426
+ const inputRef = React37.useRef(null);
7427
+ const listboxId = React37.useId();
7428
+ const setInputRef = React37.useCallback((node) => {
6541
7429
  inputRef.current = node;
6542
7430
  node?.removeAttribute("aria-labelledby");
6543
7431
  node?.setAttribute("aria-controls", listboxId);
@@ -6546,12 +7434,12 @@ function SearchSelect({
6546
7434
  const singleValue = closeOnSelect ? selected[0] ?? null : null;
6547
7435
  const showValue = singleValue !== null && !open;
6548
7436
  const popoverOpen = open && !disabled;
6549
- React36.useEffect(() => {
7437
+ React37.useEffect(() => {
6550
7438
  inputRef.current?.removeAttribute("aria-labelledby");
6551
7439
  inputRef.current?.setAttribute("aria-controls", listboxId);
6552
7440
  inputRef.current?.removeAttribute("aria-activedescendant");
6553
7441
  });
6554
- React36.useEffect(() => {
7442
+ React37.useEffect(() => {
6555
7443
  if (open && closeOnSelect) {
6556
7444
  const raf = requestAnimationFrame(() => inputRef.current?.focus());
6557
7445
  return () => cancelAnimationFrame(raf);
@@ -6957,7 +7845,46 @@ var SectionHead = forwardRef(function SectionHead2({ eyebrow, title, meta, class
6957
7845
  );
6958
7846
  });
6959
7847
  SectionHead.displayName = "SectionHead";
6960
- var Separator4 = React36.forwardRef(function Separator5({ className, orientation = "horizontal", decorative = true, ...props }, ref) {
7848
+ var toneFill = {
7849
+ default: "var(--color-pro-fg)",
7850
+ success: "var(--color-success-fg)",
7851
+ warning: "var(--color-warning-fg)",
7852
+ destructive: "var(--color-danger-fg)",
7853
+ info: "var(--color-accent)",
7854
+ tax: "var(--color-service-tax)",
7855
+ audit: "var(--color-service-audit)",
7856
+ accounting: "var(--color-service-accounting)"
7857
+ };
7858
+ var SegmentedProgress = forwardRef(
7859
+ function SegmentedProgress2({ steps, current, tone = "default", thickness = 6, label, className, style, ...props }, ref) {
7860
+ const filled = Math.min(steps, Math.max(0, current));
7861
+ return /* @__PURE__ */ jsx(
7862
+ "div",
7863
+ {
7864
+ ref,
7865
+ role: "progressbar",
7866
+ "aria-valuenow": filled,
7867
+ "aria-valuemin": 0,
7868
+ "aria-valuemax": steps,
7869
+ "aria-label": label ?? `Step ${filled} of ${steps}`,
7870
+ className: cn("flex w-full items-center gap-1", className),
7871
+ style: { height: thickness, ...style },
7872
+ ...props,
7873
+ children: Array.from({ length: steps }, (_, i) => /* @__PURE__ */ jsx(
7874
+ "span",
7875
+ {
7876
+ "aria-hidden": "true",
7877
+ className: "h-full flex-1 rounded-full transition-colors duration-[var(--duration-normal)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7878
+ style: { background: i < filled ? toneFill[tone] : "var(--color-bg-3)" }
7879
+ },
7880
+ i
7881
+ ))
7882
+ }
7883
+ );
7884
+ }
7885
+ );
7886
+ SegmentedProgress.displayName = "SegmentedProgress";
7887
+ var Separator4 = React37.forwardRef(function Separator5({ className, orientation = "horizontal", decorative = true, ...props }, ref) {
6961
7888
  return /* @__PURE__ */ jsx(
6962
7889
  SeparatorPrimitive.Root,
6963
7890
  {
@@ -6974,160 +7901,36 @@ var Separator4 = React36.forwardRef(function Separator5({ className, orientation
6974
7901
  );
6975
7902
  });
6976
7903
  Separator4.displayName = SeparatorPrimitive.Root.displayName;
6977
- var SheetSideContext = React36.createContext({});
6978
- var Sheet = ({ side, children, ...props }) => /* @__PURE__ */ jsx(DialogPrimitive.Root, { ...props, children: /* @__PURE__ */ jsx(SheetSideContext, { value: { side }, children }) });
6979
- Sheet.displayName = "Sheet";
6980
- var SheetTrigger = DialogPrimitive.Trigger;
6981
- var SheetClose = DialogPrimitive.Close;
6982
- var SheetPortal = DialogPrimitive.Portal;
6983
- var SheetOverlay = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
6984
- DialogPrimitive.Overlay,
6985
- {
6986
- ref,
6987
- className: cn(
6988
- "bg-overlay fixed inset-0 z-[var(--z-overlay)] backdrop-blur-[4px]",
6989
- "transition-opacity duration-[var(--duration-overlay)] ease-[var(--ease-out-quart)]",
6990
- "data-[state=closed]:opacity-0 data-[state=open]:opacity-100",
6991
- "motion-reduce:transition-none",
6992
- className
6993
- ),
6994
- ...props
6995
- }
6996
- ));
6997
- SheetOverlay.displayName = DialogPrimitive.Overlay.displayName;
6998
- var sheetVariants = cva(
7904
+ var sideDrawerVariants = cva(
6999
7905
  cn(
7000
- "fixed z-[var(--z-modal)] flex flex-col gap-4 bg-surface text-fg shadow-pop",
7906
+ "fixed inset-y-0 z-[var(--z-modal)] flex h-full flex-col bg-surface text-fg shadow-pop",
7907
+ "font-body",
7001
7908
  "transition ease-in-out duration-[var(--duration-normal)] ease-[var(--ease-out-quart)]",
7002
7909
  "motion-reduce:transition-none"
7003
7910
  ),
7004
7911
  {
7005
7912
  variants: {
7006
7913
  side: {
7007
- top: cn(
7008
- "inset-x-0 top-0 border-b border-rule",
7009
- "data-[state=closed]:-translate-y-full data-[state=open]:translate-y-0"
7010
- ),
7011
- bottom: cn(
7012
- "inset-x-0 bottom-0 border-t border-rule max-h-[85vh]",
7013
- "data-[state=closed]:translate-y-full data-[state=open]:translate-y-0"
7914
+ right: cn(
7915
+ "right-0 border-l border-rule",
7916
+ "data-[state=closed]:translate-x-full data-[state=open]:translate-x-0",
7917
+ "data-[state=open]:animate-in data-[state=open]:slide-in-from-right",
7918
+ "data-[state=closed]:animate-out data-[state=closed]:slide-out-to-right"
7014
7919
  ),
7015
7920
  left: cn(
7016
- "inset-y-0 left-0 h-full w-3/4 max-w-sm border-r border-rule",
7017
- "data-[state=closed]:-translate-x-full data-[state=open]:translate-x-0"
7018
- ),
7019
- right: cn(
7020
- "inset-y-0 right-0 h-full w-3/4 max-w-sm border-l border-rule",
7021
- "data-[state=closed]:translate-x-full data-[state=open]:translate-x-0"
7921
+ "left-0 border-r border-rule",
7922
+ "data-[state=closed]:-translate-x-full data-[state=open]:translate-x-0",
7923
+ "data-[state=open]:animate-in data-[state=open]:slide-in-from-left",
7924
+ "data-[state=closed]:animate-out data-[state=closed]:slide-out-to-left"
7022
7925
  )
7926
+ },
7927
+ width: {
7928
+ sm: "w-[420px] max-md:w-[95vw]",
7929
+ md: "w-[640px] max-lg:w-[80vw] max-md:w-[95vw]",
7930
+ lg: "w-[50vw] max-lg:w-[80vw] max-md:w-[95vw]"
7023
7931
  }
7024
7932
  },
7025
- defaultVariants: { side: "right" }
7026
- }
7027
- );
7028
- var sheetWidthClasses = {
7029
- sm: "w-[95vw] max-w-[95vw] sm:w-[420px]",
7030
- md: "w-[95vw] max-w-[95vw] sm:w-[520px]",
7031
- lg: "w-[95vw] max-w-[95vw] sm:w-[640px]",
7032
- xl: "w-[95vw] max-w-[95vw] sm:w-[760px]",
7033
- full: "w-full max-w-none"
7034
- };
7035
- var SheetContent = React36.forwardRef(
7036
- ({ side, width = "default", customWidth, className, children, showCloseButton = true, style, ...props }, ref) => {
7037
- const ctx = React36.use(SheetSideContext);
7038
- const resolvedSide = side ?? ctx.side ?? "right";
7039
- const supportsWidth = resolvedSide === "left" || resolvedSide === "right";
7040
- const widthClass = supportsWidth && width !== "default" ? sheetWidthClasses[width] : null;
7041
- const widthStyle = supportsWidth && customWidth ? { width: customWidth, maxWidth: "95vw", ...style } : style;
7042
- return /* @__PURE__ */ jsxs(SheetPortal, { children: [
7043
- /* @__PURE__ */ jsx(SheetOverlay, {}),
7044
- /* @__PURE__ */ jsxs(
7045
- DialogPrimitive.Content,
7046
- {
7047
- ref,
7048
- className: cn(sheetVariants({ side: resolvedSide }), widthClass, className),
7049
- style: widthStyle,
7050
- ...props,
7051
- children: [
7052
- children,
7053
- showCloseButton && /* @__PURE__ */ jsx(
7054
- DialogPrimitive.Close,
7055
- {
7056
- className: cn(
7057
- "absolute top-4 right-4 inline-flex size-7 items-center justify-center",
7058
- "rounded-icon text-fg-4 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7059
- "hover:bg-overlay-hover hover:text-fg",
7060
- "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
7061
- "disabled:pointer-events-none"
7062
- ),
7063
- "aria-label": "Close",
7064
- children: /* @__PURE__ */ jsx(XIcon, { className: "size-4", "aria-hidden": "true" })
7065
- }
7066
- )
7067
- ]
7068
- }
7069
- )
7070
- ] });
7071
- }
7072
- );
7073
- SheetContent.displayName = DialogPrimitive.Content.displayName;
7074
- var SheetHeader = ({ className, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-1.5 p-6 pr-12 pb-0", className), ...props });
7075
- SheetHeader.displayName = "SheetHeader";
7076
- var SheetFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
7077
- "div",
7078
- {
7079
- className: cn(
7080
- "border-rule mt-auto flex flex-col-reverse gap-2 border-t p-6 sm:flex-row sm:items-center sm:justify-end",
7081
- className
7082
- ),
7083
- ...props
7084
- }
7085
- );
7086
- SheetFooter.displayName = "SheetFooter";
7087
- var SheetTitle = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
7088
- DialogPrimitive.Title,
7089
- {
7090
- ref,
7091
- className: cn(
7092
- "font-display text-fg text-base leading-tight font-medium tracking-tight",
7093
- className
7094
- ),
7095
- ...props
7096
- }
7097
- ));
7098
- SheetTitle.displayName = DialogPrimitive.Title.displayName;
7099
- var SheetDescription = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Description, { ref, className: cn("text-fg-3 text-sm", className), ...props }));
7100
- SheetDescription.displayName = DialogPrimitive.Description.displayName;
7101
- var sideDrawerVariants = cva(
7102
- cn(
7103
- "fixed inset-y-0 z-[var(--z-modal)] flex h-full flex-col bg-surface text-fg shadow-pop",
7104
- "font-body",
7105
- "transition ease-in-out duration-[var(--duration-normal)] ease-[var(--ease-out-quart)]",
7106
- "motion-reduce:transition-none"
7107
- ),
7108
- {
7109
- variants: {
7110
- side: {
7111
- right: cn(
7112
- "right-0 border-l border-rule",
7113
- "data-[state=closed]:translate-x-full data-[state=open]:translate-x-0",
7114
- "data-[state=open]:animate-in data-[state=open]:slide-in-from-right",
7115
- "data-[state=closed]:animate-out data-[state=closed]:slide-out-to-right"
7116
- ),
7117
- left: cn(
7118
- "left-0 border-r border-rule",
7119
- "data-[state=closed]:-translate-x-full data-[state=open]:translate-x-0",
7120
- "data-[state=open]:animate-in data-[state=open]:slide-in-from-left",
7121
- "data-[state=closed]:animate-out data-[state=closed]:slide-out-to-left"
7122
- )
7123
- },
7124
- width: {
7125
- sm: "w-[420px] max-md:w-[95vw]",
7126
- md: "w-[640px] max-lg:w-[80vw] max-md:w-[95vw]",
7127
- lg: "w-[50vw] max-lg:w-[80vw] max-md:w-[95vw]"
7128
- }
7129
- },
7130
- defaultVariants: { side: "right", width: "lg" }
7933
+ defaultVariants: { side: "right", width: "lg" }
7131
7934
  }
7132
7935
  );
7133
7936
  function SideDrawer({
@@ -7213,7 +8016,7 @@ function SideDrawerFooter({ children, className }) {
7213
8016
  SideDrawer.Header = SideDrawerHeader;
7214
8017
  SideDrawer.Body = SideDrawerBody;
7215
8018
  SideDrawer.Footer = SideDrawerFooter;
7216
- var Slider = React36.forwardRef(
8019
+ var Slider = React37.forwardRef(
7217
8020
  function Slider2({
7218
8021
  className,
7219
8022
  label,
@@ -7225,7 +8028,7 @@ var Slider = React36.forwardRef(
7225
8028
  defaultValue,
7226
8029
  ...props
7227
8030
  }, ref) {
7228
- const generatedId = React36.useId();
8031
+ const generatedId = React37.useId();
7229
8032
  const id = providedId ?? generatedId;
7230
8033
  const displayValue = (() => {
7231
8034
  const v = value ?? defaultValue;
@@ -7358,6 +8161,52 @@ var Stat = forwardRef(function Stat2({ value, label, className, ...props }, ref)
7358
8161
  ] });
7359
8162
  });
7360
8163
  Stat.displayName = "Stat";
8164
+ var statusDotVariants = cva("relative inline-flex shrink-0 rounded-full bg-current", {
8165
+ variants: {
8166
+ tone: {
8167
+ danger: "text-danger-fg",
8168
+ warning: "text-warning-fg",
8169
+ info: "text-accent",
8170
+ success: "text-success-fg",
8171
+ pro: "text-pro-fg",
8172
+ neutral: "text-fg-4"
8173
+ },
8174
+ size: {
8175
+ sm: "size-[7px]",
8176
+ md: "size-[9px]"
8177
+ },
8178
+ ring: {
8179
+ true: "shadow-[0_0_0_2px_var(--color-surface)]",
8180
+ false: ""
8181
+ }
8182
+ },
8183
+ defaultVariants: {
8184
+ tone: "danger",
8185
+ size: "sm",
8186
+ ring: false
8187
+ }
8188
+ });
8189
+ var StatusDot = forwardRef(function StatusDot2({ tone, size, ring, pulse, className, ...props }, ref) {
8190
+ const ariaLabel = props["aria-label"];
8191
+ return /* @__PURE__ */ jsx(
8192
+ "span",
8193
+ {
8194
+ ref,
8195
+ role: ariaLabel ? "img" : void 0,
8196
+ "aria-hidden": ariaLabel ? void 0 : true,
8197
+ className: cn(statusDotVariants({ tone, size, ring }), className),
8198
+ ...props,
8199
+ children: pulse && /* @__PURE__ */ jsx(
8200
+ "span",
8201
+ {
8202
+ "aria-hidden": "true",
8203
+ className: "absolute inset-0 inline-flex animate-ping rounded-full bg-current opacity-75 motion-reduce:hidden"
8204
+ }
8205
+ )
8206
+ }
8207
+ );
8208
+ });
8209
+ StatusDot.displayName = "StatusDot";
7361
8210
  var CENTER = 8;
7362
8211
  var RING_RADIUS = 6;
7363
8212
  var STROKE_WIDTH = 2;
@@ -7478,6 +8327,25 @@ function StatusIcon({
7478
8327
  }
7479
8328
  );
7480
8329
  }
8330
+ var statusMap = {
8331
+ requested: { variant: "warning", label: "Requested" },
8332
+ "in-review": { variant: "info", label: "In review" },
8333
+ "needs-revision": { variant: "destructive", label: "Needs revision" },
8334
+ accepted: { variant: "success", label: "Accepted" },
8335
+ signed: { variant: "success", label: "Signed" },
8336
+ approved: { variant: "success", label: "Approved" },
8337
+ paid: { variant: "success", label: "Paid" },
8338
+ complete: { variant: "success", label: "Complete" },
8339
+ draft: { variant: "secondary", label: "Draft" },
8340
+ pending: { variant: "secondary", label: "Pending" },
8341
+ overdue: { variant: "destructive", label: "Overdue" },
8342
+ declined: { variant: "destructive", label: "Declined" }
8343
+ };
8344
+ var StatusPill = forwardRef(function StatusPill2({ status, dot = true, children, ...props }, ref) {
8345
+ const { variant, label } = statusMap[status];
8346
+ return /* @__PURE__ */ jsx(Badge, { ref, variant, dot, ...props, children: children ?? label });
8347
+ });
8348
+ StatusPill.displayName = "StatusPill";
7481
8349
  var Stepper = forwardRef(function Stepper2({ steps, currentStep, orientation = "horizontal", className, ...props }, ref) {
7482
8350
  const isVertical = orientation === "vertical";
7483
8351
  return /* @__PURE__ */ jsx(
@@ -7576,6 +8444,29 @@ var Stepper = forwardRef(function Stepper2({ steps, currentStep, orientation = "
7576
8444
  );
7577
8445
  });
7578
8446
  Stepper.displayName = "Stepper";
8447
+ var StickyActionBar = forwardRef(
8448
+ function StickyActionBar2({ children, hint, offsetForMobileNav, className, ...props }, ref) {
8449
+ return /* @__PURE__ */ jsxs(
8450
+ "div",
8451
+ {
8452
+ ref,
8453
+ className: cn(
8454
+ "sticky inset-x-0 z-20 flex flex-wrap items-center gap-3",
8455
+ "border-t border-rule bg-surface/80 px-4 py-3 backdrop-blur-md sm:px-6",
8456
+ "supports-[backdrop-filter]:bg-surface/80",
8457
+ offsetForMobileNav ? "bottom-[calc(3.5rem_+_env(safe-area-inset-bottom))] sm:bottom-0" : "bottom-0",
8458
+ className
8459
+ ),
8460
+ ...props,
8461
+ children: [
8462
+ hint != null && /* @__PURE__ */ jsx("div", { className: "flex min-w-0 items-center gap-2 text-sm font-medium text-fg-3", children: hint }),
8463
+ /* @__PURE__ */ jsx("div", { className: "ml-auto flex items-center gap-2", children })
8464
+ ]
8465
+ }
8466
+ );
8467
+ }
8468
+ );
8469
+ StickyActionBar.displayName = "StickyActionBar";
7579
8470
  var SubmitButton = forwardRef(function SubmitButton2({ pendingText, children, className, ...props }, ref) {
7580
8471
  const { pending } = useFormStatus();
7581
8472
  return /* @__PURE__ */ jsx(
@@ -7592,6 +8483,87 @@ var SubmitButton = forwardRef(function SubmitButton2({ pendingText, children, cl
7592
8483
  );
7593
8484
  });
7594
8485
  SubmitButton.displayName = "SubmitButton";
8486
+ var suiteProgressFillVariants = cva("", {
8487
+ variants: {
8488
+ tone: {
8489
+ pro: "bg-brand-pro",
8490
+ audit: "bg-brand-audit",
8491
+ books: "bg-brand-books",
8492
+ tax: "bg-brand-tax"
8493
+ }
8494
+ },
8495
+ defaultVariants: { tone: "pro" }
8496
+ });
8497
+ var SIZE_STYLES = {
8498
+ sm: { row: "gap-2", track: "gap-0.5", segment: "h-1", text: "text-xs" },
8499
+ md: { row: "gap-3", track: "gap-1", segment: "h-[5px]", text: "text-sm" }
8500
+ };
8501
+ var SuiteProgress = forwardRef(
8502
+ function SuiteProgress2({
8503
+ value,
8504
+ total,
8505
+ showPercent = true,
8506
+ percent,
8507
+ tone = "pro",
8508
+ size = "md",
8509
+ label,
8510
+ segmentClassName,
8511
+ className,
8512
+ ...props
8513
+ }, ref) {
8514
+ const styles = SIZE_STYLES[size];
8515
+ const safeTotal = Math.max(1, Math.floor(total));
8516
+ const safeValue = Math.min(safeTotal, Math.max(0, Math.floor(value)));
8517
+ const resolvedPercent = percent != null ? Math.min(100, Math.max(0, Math.round(percent))) : Math.round(safeValue / safeTotal * 100);
8518
+ return /* @__PURE__ */ jsxs(
8519
+ "div",
8520
+ {
8521
+ ref,
8522
+ role: "progressbar",
8523
+ "aria-valuenow": resolvedPercent,
8524
+ "aria-valuemin": 0,
8525
+ "aria-valuemax": 100,
8526
+ "aria-valuetext": `${safeValue} of ${safeTotal}`,
8527
+ "aria-label": label ?? "Progress",
8528
+ className: cn("flex items-center", styles.row, className),
8529
+ ...props,
8530
+ children: [
8531
+ label && /* @__PURE__ */ jsx("span", { className: cn("text-fg-2 flex-none font-medium", styles.text), children: label }),
8532
+ /* @__PURE__ */ jsx("div", { className: cn("flex min-w-0 flex-1", styles.track), "aria-hidden": "true", children: Array.from({ length: safeTotal }, (_, i) => {
8533
+ const filled = i < safeValue;
8534
+ return /* @__PURE__ */ jsx(
8535
+ "div",
8536
+ {
8537
+ className: cn(
8538
+ "flex-1 rounded-full",
8539
+ styles.segment,
8540
+ "transition-colors duration-[var(--duration-overlay)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
8541
+ filled ? suiteProgressFillVariants({ tone }) : "bg-surface-3",
8542
+ segmentClassName
8543
+ )
8544
+ },
8545
+ i
8546
+ );
8547
+ }) }),
8548
+ showPercent && /* @__PURE__ */ jsxs(
8549
+ "span",
8550
+ {
8551
+ className: cn(
8552
+ "text-fg flex-none font-bold tracking-tight tabular-nums",
8553
+ styles.text
8554
+ ),
8555
+ children: [
8556
+ resolvedPercent,
8557
+ /* @__PURE__ */ jsx("span", { className: "text-fg-4 ml-px text-[0.72em] font-semibold", children: "%" })
8558
+ ]
8559
+ }
8560
+ )
8561
+ ]
8562
+ }
8563
+ );
8564
+ }
8565
+ );
8566
+ SuiteProgress.displayName = "SuiteProgress";
7595
8567
  var switchVariants = cva(
7596
8568
  [
7597
8569
  "peer inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent",
@@ -7634,9 +8606,9 @@ var switchThumbVariants = cva(
7634
8606
  }
7635
8607
  }
7636
8608
  );
7637
- var Switch = React36.forwardRef(
8609
+ var Switch = React37.forwardRef(
7638
8610
  function Switch2({ label, size, className, id: providedId, ...props }, ref) {
7639
- const generatedId = React36.useId();
8611
+ const generatedId = React37.useId();
7640
8612
  const id = providedId ?? generatedId;
7641
8613
  const root = /* @__PURE__ */ jsx(
7642
8614
  SwitchPrimitive.Root,
@@ -7668,7 +8640,7 @@ var Table = forwardRef(function Table2({ className, wrapperClassName, ...props }
7668
8640
  "div",
7669
8641
  {
7670
8642
  className: cn(
7671
- "rounded-card border-rule bg-surface w-full overflow-x-auto border",
8643
+ "rounded-card border-rule-strong bg-surface w-full overflow-x-auto border shadow-quiet",
7672
8644
  wrapperClassName
7673
8645
  ),
7674
8646
  children: /* @__PURE__ */ jsx(
@@ -7733,10 +8705,11 @@ var TableHead = forwardRef(function TableHead2({ className, ...props }, ref) {
7733
8705
  {
7734
8706
  ref,
7735
8707
  className: cn(
7736
- // .data-table th mono, 10px, uppercase, tight tracking 0.12em
7737
- "h-9 px-3.5 py-2 text-left align-middle whitespace-nowrap",
7738
- "font-mono text-[10px] font-medium tracking-[0.12em] uppercase",
7739
- "text-fg-4 bg-surface-2",
8708
+ // Sentence-case column labels in the body font (Plus Jakarta Sans),
8709
+ // quiet gray not mono uppercase eyebrows.
8710
+ "h-11 px-4 py-2.5 text-left align-middle whitespace-nowrap",
8711
+ "font-sans text-[14px] font-medium tracking-normal normal-case",
8712
+ "text-fg-3 bg-surface-2",
7740
8713
  "border-rule border-b",
7741
8714
  "[&:has([role=checkbox])]:pr-0",
7742
8715
  className
@@ -7752,8 +8725,9 @@ var TableCell = forwardRef(function TableCell2({ className, ...props }, ref) {
7752
8725
  {
7753
8726
  ref,
7754
8727
  className: cn(
7755
- // .data-table td — 13px, fg-2, soft 1px row divider, tabular nums
7756
- "text-fg-2 px-3.5 py-2.5 align-middle text-[13px] tabular-nums",
8728
+ // 13px, fg-2, soft 1px row divider, tabular nums; airier vertical
8729
+ // rhythm (py-3) for the taller rows in the catalog layout.
8730
+ "text-fg-2 px-4 py-3 align-middle text-[13px] tabular-nums",
7757
8731
  "[&:has([role=checkbox])]:pr-0",
7758
8732
  className
7759
8733
  ),
@@ -7768,18 +8742,18 @@ var TableCaption = forwardRef(
7768
8742
  }
7769
8743
  );
7770
8744
  TableCaption.displayName = "TableCaption";
7771
- var Tabs = React36.forwardRef(
8745
+ var Tabs = React37.forwardRef(
7772
8746
  function Tabs2({ className, ...props }, ref) {
7773
8747
  return /* @__PURE__ */ jsx(TabsPrimitive.Root, { ref, className: cn(className), ...props });
7774
8748
  }
7775
8749
  );
7776
8750
  Tabs.displayName = TabsPrimitive.Root.displayName;
7777
- var TabsList = React36.forwardRef(function TabsList2({ className, ...props }, ref) {
8751
+ var TabsList = React37.forwardRef(function TabsList2({ className, ...props }, ref) {
7778
8752
  return /* @__PURE__ */ jsx(
7779
8753
  TabsPrimitive.List,
7780
8754
  {
7781
8755
  ref,
7782
- className: cn("border-rule inline-flex items-center gap-0 border-b", className),
8756
+ className: cn("border-rule flex items-center gap-0 border-b", className),
7783
8757
  ...props
7784
8758
  }
7785
8759
  );
@@ -7819,7 +8793,7 @@ var triggerVariants = cva(
7819
8793
  }
7820
8794
  }
7821
8795
  );
7822
- var TabsTrigger = React36.forwardRef(function TabsTrigger2({ className, variant, ...props }, ref) {
8796
+ var TabsTrigger = React37.forwardRef(function TabsTrigger2({ className, variant, ...props }, ref) {
7823
8797
  return /* @__PURE__ */ jsx(
7824
8798
  TabsPrimitive.Trigger,
7825
8799
  {
@@ -7830,7 +8804,7 @@ var TabsTrigger = React36.forwardRef(function TabsTrigger2({ className, variant,
7830
8804
  );
7831
8805
  });
7832
8806
  TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
7833
- var TabsContent = React36.forwardRef(function TabsContent2({ className, ...props }, ref) {
8807
+ var TabsContent = React37.forwardRef(function TabsContent2({ className, ...props }, ref) {
7834
8808
  return /* @__PURE__ */ jsx(
7835
8809
  TabsPrimitive.Content,
7836
8810
  {
@@ -7855,7 +8829,7 @@ function TeamMemberSelect({
7855
8829
  placeholder = "Select team member...",
7856
8830
  className
7857
8831
  }) {
7858
- const options = React36.useMemo(() => {
8832
+ const options = React37.useMemo(() => {
7859
8833
  const meBadge = /* @__PURE__ */ jsx(
7860
8834
  Badge,
7861
8835
  {
@@ -8185,10 +9159,10 @@ var itemVariants = cva(
8185
9159
  }
8186
9160
  }
8187
9161
  );
8188
- var ToggleGroupContext = React36.createContext({
9162
+ var ToggleGroupContext = React37.createContext({
8189
9163
  variant: "default"
8190
9164
  });
8191
- var ToggleGroup = React36.forwardRef(function ToggleGroup2({ className, variant, children, ...props }, ref) {
9165
+ var ToggleGroup = React37.forwardRef(function ToggleGroup2({ className, variant, children, ...props }, ref) {
8192
9166
  return /* @__PURE__ */ jsx(
8193
9167
  ToggleGroupPrimitive.Root,
8194
9168
  {
@@ -8200,8 +9174,8 @@ var ToggleGroup = React36.forwardRef(function ToggleGroup2({ className, variant,
8200
9174
  );
8201
9175
  });
8202
9176
  ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;
8203
- var ToggleGroupItem = React36.forwardRef(function ToggleGroupItem2({ className, variant, ...props }, ref) {
8204
- const ctx = React36.useContext(ToggleGroupContext);
9177
+ var ToggleGroupItem = React37.forwardRef(function ToggleGroupItem2({ className, variant, ...props }, ref) {
9178
+ const ctx = React37.useContext(ToggleGroupContext);
8205
9179
  return /* @__PURE__ */ jsx(
8206
9180
  ToggleGroupPrimitive.Item,
8207
9181
  {
@@ -8220,7 +9194,7 @@ var Tooltip = ({ delayMs, delayDuration, children, ...props }) => {
8220
9194
  return /* @__PURE__ */ jsx(TooltipPrimitive.Provider, { delayDuration: resolvedDelay, children: /* @__PURE__ */ jsx(TooltipPrimitive.Root, { delayDuration: resolvedDelay, ...props, children }) });
8221
9195
  };
8222
9196
  Tooltip.displayName = "Tooltip";
8223
- var TooltipContent = React36.forwardRef(({ className, sideOffset = 6, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
9197
+ var TooltipContent = React37.forwardRef(({ className, sideOffset = 6, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
8224
9198
  TooltipPrimitive.Content,
8225
9199
  {
8226
9200
  ref,
@@ -8245,6 +9219,637 @@ var VisuallyHidden = forwardRef(
8245
9219
  }
8246
9220
  );
8247
9221
  VisuallyHidden.displayName = "VisuallyHidden";
9222
+ function AiSpark({ size = 16, className }) {
9223
+ const id = useId();
9224
+ return /* @__PURE__ */ jsxs(
9225
+ "svg",
9226
+ {
9227
+ width: size,
9228
+ height: size * 12 / 16,
9229
+ viewBox: "0 0 16 12",
9230
+ fill: "none",
9231
+ className: cn("block shrink-0", className),
9232
+ "aria-hidden": "true",
9233
+ children: [
9234
+ /* @__PURE__ */ jsx(
9235
+ "path",
9236
+ {
9237
+ d: "M6.24553 5.34293C5.91553 5.23294 5.91553 4.76699 6.24553 4.657L8.18254 4.01207C8.60834 3.87011 8.99522 3.63094 9.31252 3.3135C9.62982 2.99607 9.8688 2.6091 10.0105 2.18327L10.6555 0.247473C10.7655 -0.0824911 11.2315 -0.0824912 11.3415 0.247473L11.9866 2.18427C12.1285 2.61002 12.3677 2.99686 12.6852 3.31412C13.0027 3.63139 13.3897 3.87035 13.8156 4.01207L15.7516 4.657C15.8238 4.68071 15.8868 4.72664 15.9314 4.78823C15.976 4.84982 16 4.92392 16 4.99996C16 5.07601 15.976 5.15011 15.9314 5.2117C15.8868 5.27329 15.8238 5.31921 15.7516 5.34293L13.8146 5.98786C13.3889 6.12971 13.0021 6.36874 12.6848 6.68599C12.3675 7.00324 12.1284 7.39001 11.9866 7.81566L11.3415 9.75245C11.3178 9.82471 11.2719 9.88763 11.2103 9.93223C11.1487 9.97684 11.0746 10.0009 10.9985 10.0009C10.9225 10.0009 10.8484 9.97684 10.7868 9.93223C10.7252 9.88763 10.6793 9.82471 10.6555 9.75245L10.0105 7.81566C9.86867 7.39001 9.62962 7.00324 9.31233 6.68599C8.99505 6.36874 8.60823 6.12971 8.18254 5.98786L6.24553 5.34293ZM1.14651 9.20551C1.1032 9.19117 1.06552 9.16355 1.03881 9.12658C1.0121 9.0896 0.99772 9.04515 0.99772 8.99954C0.99772 8.95392 1.0121 8.90947 1.03881 8.87249C1.06552 8.83552 1.1032 8.8079 1.14651 8.79356L2.30851 8.4066C2.82651 8.23362 3.23252 7.82766 3.40552 7.30972L3.79252 6.14784C3.80686 6.10454 3.83448 6.06686 3.87146 6.04015C3.90844 6.01345 3.9529 5.99907 3.99852 5.99907C4.04414 5.99907 4.0886 6.01345 4.12558 6.04015C4.16256 6.06686 4.19018 6.10454 4.20452 6.14784L4.59152 7.30972C4.67664 7.56516 4.82009 7.79728 5.0105 7.98767C5.20091 8.17806 5.43305 8.32149 5.68853 8.4066L6.85053 8.79356C6.89384 8.8079 6.93152 8.83551 6.95823 8.87249C6.98494 8.90947 6.99932 8.95392 6.99932 8.99954C6.99932 9.04515 6.98494 9.0896 6.95823 9.12658C6.93152 9.16355 6.89384 9.19117 6.85053 9.20551L5.68853 9.59247C5.43305 9.67758 5.20091 9.82101 5.0105 10.0114C4.82009 10.2018 4.67664 10.4339 4.59152 10.6894L4.20452 11.8512C4.19018 11.8945 4.16256 11.9322 4.12558 11.9589C4.0886 11.9856 4.04414 12 3.99852 12C3.9529 12 3.90844 11.9856 3.87146 11.9589C3.83448 11.9322 3.80686 11.8945 3.79252 11.8512L3.40552 10.6894C3.3204 10.4339 3.17695 10.2018 2.98654 10.0114C2.79613 9.82101 2.56399 9.67758 2.30851 9.59247L1.14651 9.20551ZM0.097503 2.13727C0.0690292 2.1274 0.0443387 2.1089 0.0268643 2.08435C0.00938996 2.0598 1.317e-09 2.03042 0 2.00029C-1.318e-09 1.97015 0.00938995 1.94077 0.0268643 1.91622C0.0443387 1.89167 0.0690292 1.87317 0.097503 1.8633L0.871506 1.60533C1.21751 1.49034 1.48851 1.21937 1.60351 0.873408L1.86151 0.0994903C1.87138 0.0710193 1.88988 0.0463306 1.91443 0.0288584C1.93899 0.0113861 1.96837 0.00199815 1.99851 0.00199814C2.02865 0.00199814 2.05803 0.0113861 2.08259 0.0288583C2.10714 0.0463306 2.12564 0.0710193 2.13551 0.0994903L2.39351 0.873408C2.45024 1.0439 2.54593 1.19882 2.673 1.32588C2.80006 1.45293 2.955 1.54861 3.12552 1.60533L3.89952 1.8633C3.92799 1.87317 3.95268 1.89167 3.97016 1.91622C3.98763 1.94077 3.99702 1.97015 3.99702 2.00029C3.99702 2.03042 3.98763 2.0598 3.97016 2.08435C3.95268 2.1089 3.92799 2.1274 3.89952 2.13727L3.12552 2.39524C2.955 2.45196 2.80006 2.54764 2.673 2.6747C2.54593 2.80175 2.45024 2.95667 2.39351 3.12717L2.13551 3.90008C2.12564 3.92855 2.10714 3.95324 2.08259 3.97071C2.05804 3.98819 2.02865 3.99757 1.99851 3.99757C1.96837 3.99757 1.93899 3.98819 1.91443 3.97071C1.88988 3.95324 1.87138 3.92855 1.86151 3.90008L1.60351 3.12617C1.48851 2.7802 1.21751 2.50923 0.871506 2.39424L0.097503 2.13727Z",
9238
+ fill: `url(#${id})`
9239
+ }
9240
+ ),
9241
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs(
9242
+ "linearGradient",
9243
+ {
9244
+ id,
9245
+ x1: "0.265576",
9246
+ y1: "0.856805",
9247
+ x2: "13.5",
9248
+ y2: "12",
9249
+ gradientUnits: "userSpaceOnUse",
9250
+ children: [
9251
+ /* @__PURE__ */ jsx("stop", { stopColor: "#9E32FF" }),
9252
+ /* @__PURE__ */ jsx("stop", { offset: "1", stopColor: "#1BB6FF" })
9253
+ ]
9254
+ }
9255
+ ) })
9256
+ ]
9257
+ }
9258
+ );
9259
+ }
9260
+ function Field({ label, value, confirmed }) {
9261
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5", children: [
9262
+ /* @__PURE__ */ jsx("span", { className: "text-fg-3 text-[11px]", children: label }),
9263
+ /* @__PURE__ */ jsxs("span", { className: "text-fg inline-flex items-center gap-1 text-sm font-medium", children: [
9264
+ value,
9265
+ confirmed && /* @__PURE__ */ jsx(CheckIcon, { className: "text-success-fg size-3", strokeWidth: 3 })
9266
+ ] })
9267
+ ] });
9268
+ }
9269
+ var AIReceiptPanel = forwardRef(function AIReceiptPanel2({ state = "idle", result, onAttach, onRemove, onViewFile, className, ...props }, ref) {
9270
+ if (state === "reading") {
9271
+ return /* @__PURE__ */ jsxs(
9272
+ "div",
9273
+ {
9274
+ ref,
9275
+ role: "status",
9276
+ "aria-live": "polite",
9277
+ className: cn(
9278
+ "border-rule bg-surface-2 flex items-center gap-3 rounded-[var(--radius-input)] border p-3",
9279
+ className
9280
+ ),
9281
+ ...props,
9282
+ children: [
9283
+ /* @__PURE__ */ jsx(AiSpark, { size: 18, className: "motion-safe:animate-pulse" }),
9284
+ /* @__PURE__ */ jsxs("div", { children: [
9285
+ /* @__PURE__ */ jsx("p", { className: "text-fg text-sm font-medium", children: "Reading your receipt\u2026" }),
9286
+ /* @__PURE__ */ jsx("p", { className: "text-fg-3 text-xs", children: "Pulling the vendor, amount and a suggested category." })
9287
+ ] })
9288
+ ]
9289
+ }
9290
+ );
9291
+ }
9292
+ if (state === "done" && result) {
9293
+ return /* @__PURE__ */ jsxs(
9294
+ "div",
9295
+ {
9296
+ ref,
9297
+ className: cn(
9298
+ "border-rule bg-surface-2 flex flex-col gap-3 rounded-[var(--radius-input)] border p-3",
9299
+ className
9300
+ ),
9301
+ ...props,
9302
+ children: [
9303
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
9304
+ /* @__PURE__ */ jsxs("span", { className: "text-fg-2 inline-flex items-center gap-1.5 text-xs font-semibold", children: [
9305
+ /* @__PURE__ */ jsx(AiSpark, { size: 14 }),
9306
+ " Auto-filled from receipt"
9307
+ ] }),
9308
+ onRemove && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: onRemove, children: "Remove" })
9309
+ ] }),
9310
+ /* @__PURE__ */ jsx(
9311
+ FileChip,
9312
+ {
9313
+ name: result.file.name,
9314
+ meta: result.file.meta,
9315
+ className: "bg-surface",
9316
+ action: onViewFile && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: onViewFile, children: "View" })
9317
+ }
9318
+ ),
9319
+ /* @__PURE__ */ jsxs("div", { className: "border-rule grid grid-cols-3 gap-3 border-t pt-3", children: [
9320
+ /* @__PURE__ */ jsx(Field, { label: "Vendor", value: result.vendor }),
9321
+ /* @__PURE__ */ jsx(Field, { label: "Amount", value: result.amount, confirmed: true }),
9322
+ /* @__PURE__ */ jsx(Field, { label: "Date", value: result.date, confirmed: true })
9323
+ ] })
9324
+ ]
9325
+ }
9326
+ );
9327
+ }
9328
+ return /* @__PURE__ */ jsxs(
9329
+ "button",
9330
+ {
9331
+ ref,
9332
+ type: "button",
9333
+ onClick: onAttach,
9334
+ className: cn(
9335
+ "group border-rule-strong bg-surface hover:border-pro-fg/50 hover:bg-pro-bg/40 flex w-full items-center gap-3 rounded-[var(--radius-input)] border-2 border-dashed p-3 text-left transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)] motion-reduce:transition-none",
9336
+ className
9337
+ ),
9338
+ ...props,
9339
+ children: [
9340
+ /* @__PURE__ */ jsx(AiSpark, { size: 19 }),
9341
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
9342
+ /* @__PURE__ */ jsx("span", { className: "text-fg block text-sm font-medium", children: "Attach receipt \u2014 auto-fill with AI" }),
9343
+ /* @__PURE__ */ jsx("span", { className: "text-fg-3 block text-xs", children: "We'll read the vendor, amount & suggest a category" })
9344
+ ] }),
9345
+ /* @__PURE__ */ jsx(UploadIcon, { className: "text-fg-3 size-4.5 shrink-0", "aria-hidden": "true" })
9346
+ ]
9347
+ }
9348
+ );
9349
+ });
9350
+ AIReceiptPanel.displayName = "AIReceiptPanel";
9351
+
9352
+ // src/lib/service-tone.ts
9353
+ var toneToken = {
9354
+ tax: { fill: "var(--color-service-tax)", bg: "var(--color-service-tax-bg)" },
9355
+ audit: { fill: "var(--color-service-audit)", bg: "var(--color-service-audit-bg)" },
9356
+ accounting: {
9357
+ fill: "var(--color-service-accounting)",
9358
+ bg: "var(--color-service-accounting-bg)"
9359
+ },
9360
+ neutral: { fill: "var(--color-pro-fg)", bg: "var(--color-pro-bg)" }
9361
+ };
9362
+ function serviceToneStyle(tone) {
9363
+ const { fill, bg } = toneToken[tone];
9364
+ return { "--tone": fill, "--tone-bg": bg };
9365
+ }
9366
+ var SERVICE_TONES = ["tax", "audit", "accounting", "neutral"];
9367
+ var serviceToneLabel = {
9368
+ tax: "Tax",
9369
+ audit: "Audit",
9370
+ accounting: "Accounting",
9371
+ neutral: "General"
9372
+ };
9373
+ var urgencyTile = {
9374
+ default: "[background:var(--tone-bg)] [color:var(--tone)]",
9375
+ warning: "bg-warning-bg text-warning-fg",
9376
+ danger: "bg-danger-bg text-danger-fg"
9377
+ };
9378
+ var AttentionItem = forwardRef(function AttentionItem2({ icon, title, description, tone = "neutral", urgency = "default", action, onClick, className, style, ...props }, ref) {
9379
+ const interactive = Boolean(onClick);
9380
+ const body = /* @__PURE__ */ jsxs(Fragment, { children: [
9381
+ /* @__PURE__ */ jsx(
9382
+ "span",
9383
+ {
9384
+ "aria-hidden": "true",
9385
+ className: cn(
9386
+ "flex size-9 shrink-0 items-center justify-center rounded-[var(--radius-input)] [&_svg]:size-4.5",
9387
+ urgencyTile[urgency]
9388
+ ),
9389
+ children: icon
9390
+ }
9391
+ ),
9392
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
9393
+ /* @__PURE__ */ jsx("p", { className: "text-fg text-sm font-medium", children: title }),
9394
+ description != null && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-0.5 text-xs", children: description })
9395
+ ] }),
9396
+ action ?? (interactive && /* @__PURE__ */ jsx(ArrowRightIcon, { className: "text-fg-4 size-4 shrink-0 self-center", "aria-hidden": "true" }))
9397
+ ] });
9398
+ const rootClass = cn(
9399
+ "border-rule bg-surface flex items-start gap-3 rounded-[var(--radius-input)] border p-3 text-left",
9400
+ interactive && "w-full transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] hover:bg-bg-2 focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)] motion-reduce:transition-none",
9401
+ className
9402
+ );
9403
+ const rootStyle = { ...serviceToneStyle(tone), ...style };
9404
+ if (interactive) {
9405
+ return /* @__PURE__ */ jsx(
9406
+ "button",
9407
+ {
9408
+ ref,
9409
+ type: "button",
9410
+ onClick,
9411
+ className: rootClass,
9412
+ style: rootStyle,
9413
+ ...props,
9414
+ children: body
9415
+ }
9416
+ );
9417
+ }
9418
+ return /* @__PURE__ */ jsx("div", { ref, className: rootClass, style: rootStyle, ...props, children: body });
9419
+ });
9420
+ AttentionItem.displayName = "AttentionItem";
9421
+ var BottomNav = forwardRef(function BottomNav2({ tabs, value, onChange, className, ...props }, ref) {
9422
+ return /* @__PURE__ */ jsx(
9423
+ "nav",
9424
+ {
9425
+ ref,
9426
+ "aria-label": "Primary",
9427
+ className: cn(
9428
+ "border-rule bg-surface/95 sticky bottom-0 z-[var(--z-sticky)] flex items-stretch border-t pb-[env(safe-area-inset-bottom)] backdrop-blur",
9429
+ className
9430
+ ),
9431
+ ...props,
9432
+ children: tabs.map((tab) => {
9433
+ const active = tab.id === value;
9434
+ return /* @__PURE__ */ jsxs(
9435
+ "button",
9436
+ {
9437
+ type: "button",
9438
+ "aria-current": active ? "page" : void 0,
9439
+ onClick: () => onChange(tab.id),
9440
+ className: cn(
9441
+ "relative flex flex-1 flex-col items-center gap-1 px-1 py-2 text-[11px] font-medium transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)] motion-reduce:transition-none",
9442
+ active ? "text-pro-fg" : "text-fg-4 hover:text-fg-2"
9443
+ ),
9444
+ children: [
9445
+ /* @__PURE__ */ jsxs("span", { className: "relative [&_svg]:size-5", children: [
9446
+ tab.icon,
9447
+ tab.badge != null && tab.badge !== false && /* @__PURE__ */ jsx(
9448
+ "span",
9449
+ {
9450
+ className: cn(
9451
+ "bg-danger-fg text-fg-on-danger absolute -top-1 -right-1.5 flex min-w-3.5 items-center justify-center rounded-full px-1 text-[9px] leading-none font-semibold tabular-nums",
9452
+ tab.badge === true && "size-2 min-w-0 px-0"
9453
+ ),
9454
+ children: typeof tab.badge === "number" ? tab.badge : null
9455
+ }
9456
+ )
9457
+ ] }),
9458
+ /* @__PURE__ */ jsx("span", { className: "max-w-full truncate", children: tab.label })
9459
+ ]
9460
+ },
9461
+ tab.id
9462
+ );
9463
+ })
9464
+ }
9465
+ );
9466
+ });
9467
+ BottomNav.displayName = "BottomNav";
9468
+ function readOrder(storageKey) {
9469
+ if (!storageKey || typeof window === "undefined") return null;
9470
+ try {
9471
+ const raw = window.localStorage.getItem(storageKey);
9472
+ return raw ? JSON.parse(raw) : null;
9473
+ } catch {
9474
+ return null;
9475
+ }
9476
+ }
9477
+ var colsClass = {
9478
+ 2: "lg:grid-cols-2",
9479
+ 3: "lg:grid-cols-3",
9480
+ 4: "lg:grid-cols-4"
9481
+ };
9482
+ var spanClass = {
9483
+ 1: "",
9484
+ 2: "lg:col-span-2",
9485
+ 3: "lg:col-span-3"
9486
+ };
9487
+ var DashGrid = forwardRef(function DashGrid2({ widgets, storageKey, onReorder, columns = 3, className, ...props }, ref) {
9488
+ const [order, setOrder] = useState(() => {
9489
+ const stored = readOrder(storageKey);
9490
+ const ids = widgets.map((w) => w.id);
9491
+ if (!stored) return ids;
9492
+ const kept = stored.filter((id) => ids.includes(id));
9493
+ const added = ids.filter((id) => !kept.includes(id));
9494
+ return [...kept, ...added];
9495
+ });
9496
+ const [dragId, setDragId] = useState(null);
9497
+ const [overId, setOverId] = useState(null);
9498
+ const commit = (next) => {
9499
+ setOrder(next);
9500
+ onReorder?.(next);
9501
+ if (storageKey && typeof window !== "undefined") {
9502
+ try {
9503
+ window.localStorage.setItem(storageKey, JSON.stringify(next));
9504
+ } catch {
9505
+ }
9506
+ }
9507
+ };
9508
+ const move = (from, to) => {
9509
+ if (from === to) return;
9510
+ const next = [...order];
9511
+ const fromIdx = next.indexOf(from);
9512
+ const toIdx = next.indexOf(to);
9513
+ if (fromIdx < 0 || toIdx < 0) return;
9514
+ next.splice(toIdx, 0, next.splice(fromIdx, 1)[0]);
9515
+ commit(next);
9516
+ };
9517
+ const byId = new Map(widgets.map((w) => [w.id, w]));
9518
+ const ordered = order.map((id) => byId.get(id)).filter(Boolean);
9519
+ return /* @__PURE__ */ jsx(
9520
+ "div",
9521
+ {
9522
+ ref,
9523
+ suppressHydrationWarning: true,
9524
+ className: cn("grid grid-cols-1 gap-4 sm:grid-cols-2", colsClass[columns], className),
9525
+ ...props,
9526
+ children: ordered.map((widget) => {
9527
+ const isDragging = dragId === widget.id;
9528
+ const isOver = overId === widget.id && dragId !== widget.id;
9529
+ return (
9530
+ // The wrapper is an HTML5 drag DROP target: onDragOver/onDrop carry
9531
+ // no click semantics and aren't keyboard-reachable by design — the
9532
+ // grab handle below is the focusable control. Pointer reordering is
9533
+ // an enhancement (same precedent as the sidebar hover-peek); there
9534
+ // is intentionally no keyboard analogue on the drop zone itself.
9535
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
9536
+ /* @__PURE__ */ jsxs(
9537
+ "div",
9538
+ {
9539
+ className: cn(
9540
+ "group/dash relative transition-[opacity,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
9541
+ spanClass[widget.span ?? 1],
9542
+ isDragging && "opacity-40",
9543
+ isOver && "rounded-card [box-shadow:var(--shadow-focus-ring)]"
9544
+ ),
9545
+ onDragOver: (e) => {
9546
+ if (!dragId) return;
9547
+ e.preventDefault();
9548
+ setOverId(widget.id);
9549
+ },
9550
+ onDrop: (e) => {
9551
+ e.preventDefault();
9552
+ if (dragId) move(dragId, widget.id);
9553
+ setDragId(null);
9554
+ setOverId(null);
9555
+ },
9556
+ children: [
9557
+ /* @__PURE__ */ jsx(
9558
+ "button",
9559
+ {
9560
+ type: "button",
9561
+ "aria-label": `Reorder widget`,
9562
+ draggable: true,
9563
+ onDragStart: (e) => {
9564
+ setDragId(widget.id);
9565
+ e.dataTransfer.effectAllowed = "move";
9566
+ },
9567
+ onDragEnd: () => {
9568
+ setDragId(null);
9569
+ setOverId(null);
9570
+ },
9571
+ className: "absolute top-3 right-3 z-[var(--z-base)] flex cursor-grab touch-none items-center justify-center rounded-[var(--radius-icon)] p-1 text-fg-4 opacity-0 transition-opacity duration-[var(--duration-fast)] hover:bg-bg-2 hover:text-fg-2 focus-visible:opacity-100 focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)] active:cursor-grabbing group-hover/dash:opacity-100 motion-reduce:transition-none",
9572
+ children: /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "grid grid-cols-2 gap-[3px]", children: Array.from({ length: 6 }, (_, i) => /* @__PURE__ */ jsx("span", { className: "size-[3px] rounded-full bg-current" }, i)) })
9573
+ }
9574
+ ),
9575
+ widget.content
9576
+ ]
9577
+ },
9578
+ widget.id
9579
+ )
9580
+ );
9581
+ })
9582
+ }
9583
+ );
9584
+ });
9585
+ DashGrid.displayName = "DashGrid";
9586
+ var toneToSegment = {
9587
+ tax: "tax",
9588
+ audit: "audit",
9589
+ accounting: "accounting",
9590
+ neutral: "default"
9591
+ };
9592
+ var EngagementCard = forwardRef(function EngagementCard2({
9593
+ service,
9594
+ serviceIcon,
9595
+ tone = "neutral",
9596
+ title,
9597
+ status,
9598
+ current,
9599
+ steps,
9600
+ stepLabel,
9601
+ eta,
9602
+ ring,
9603
+ onOpen,
9604
+ className,
9605
+ style,
9606
+ ...props
9607
+ }, ref) {
9608
+ const pct = steps > 0 ? Math.round(current / steps * 100) : 0;
9609
+ const interactive = Boolean(onOpen);
9610
+ const body = /* @__PURE__ */ jsxs(Fragment, { children: [
9611
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
9612
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5 text-sm font-semibold [color:var(--tone)] [&_svg]:size-[15px]", children: [
9613
+ serviceIcon,
9614
+ service
9615
+ ] }),
9616
+ status
9617
+ ] }),
9618
+ /* @__PURE__ */ jsx("p", { className: "text-fg mt-2 text-base leading-snug font-medium", children: title }),
9619
+ stepLabel != null && /* @__PURE__ */ jsxs("p", { className: "text-fg-3 mt-1 text-xs", children: [
9620
+ stepLabel,
9621
+ " \xB7 Step ",
9622
+ current,
9623
+ " of ",
9624
+ steps
9625
+ ] }),
9626
+ ring ? /* @__PURE__ */ jsxs("div", { className: "mt-3 flex items-center gap-3", children: [
9627
+ /* @__PURE__ */ jsx(
9628
+ ProgressRing,
9629
+ {
9630
+ value: pct,
9631
+ size: 52,
9632
+ strokeWidth: 6,
9633
+ label: `${pct}%`,
9634
+ className: "[&_circle:last-child]:[stroke:var(--tone)]"
9635
+ }
9636
+ ),
9637
+ /* @__PURE__ */ jsx("span", { className: "text-fg-3 text-xs", children: "complete" })
9638
+ ] }) : /* @__PURE__ */ jsxs("div", { className: "mt-3 flex items-center gap-3", children: [
9639
+ /* @__PURE__ */ jsx(SegmentedProgress, { steps, current, tone: toneToSegment[tone] }),
9640
+ /* @__PURE__ */ jsxs("span", { className: "shrink-0 text-sm font-semibold tabular-nums [color:var(--tone)]", children: [
9641
+ pct,
9642
+ /* @__PURE__ */ jsx("span", { className: "text-fg-4 text-xs font-normal", children: "%" })
9643
+ ] })
9644
+ ] }),
9645
+ /* @__PURE__ */ jsxs("div", { className: "border-rule-soft mt-3 flex items-center justify-between gap-2 border-t pt-3", children: [
9646
+ eta != null && /* @__PURE__ */ jsxs("span", { className: "text-fg-3 inline-flex items-center gap-1.5 text-xs [&_svg]:size-3.5", children: [
9647
+ /* @__PURE__ */ jsx(CalendarIcon, { "aria-hidden": "true" }),
9648
+ eta
9649
+ ] }),
9650
+ interactive && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-xs font-medium [color:var(--tone)] [&_svg]:size-3.5", children: [
9651
+ "Open ",
9652
+ /* @__PURE__ */ jsx(ArrowRightIcon, { "aria-hidden": "true" })
9653
+ ] })
9654
+ ] })
9655
+ ] });
9656
+ const rootClass = cn(
9657
+ "border-rule bg-surface block w-full rounded-card border p-4 text-left shadow-quiet",
9658
+ interactive && "transition-[border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] hover:border-[color:var(--tone)] hover:shadow-card focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)] motion-reduce:transition-none",
9659
+ className
9660
+ );
9661
+ const rootStyle = { ...serviceToneStyle(tone), ...style };
9662
+ if (interactive) {
9663
+ return /* @__PURE__ */ jsx(
9664
+ "button",
9665
+ {
9666
+ ref,
9667
+ type: "button",
9668
+ onClick: onOpen,
9669
+ className: rootClass,
9670
+ style: rootStyle,
9671
+ ...props,
9672
+ children: body
9673
+ }
9674
+ );
9675
+ }
9676
+ return /* @__PURE__ */ jsx("div", { ref, className: rootClass, style: rootStyle, ...props, children: body });
9677
+ });
9678
+ EngagementCard.displayName = "EngagementCard";
9679
+ var EngagementTimeline = forwardRef(
9680
+ function EngagementTimeline2({ tone = "neutral", className, style, children, ...props }, ref) {
9681
+ return /* @__PURE__ */ jsx(
9682
+ "ol",
9683
+ {
9684
+ ref,
9685
+ className: cn("flex flex-col", className),
9686
+ style: { ...serviceToneStyle(tone), ...style },
9687
+ ...props,
9688
+ children
9689
+ }
9690
+ );
9691
+ }
9692
+ );
9693
+ EngagementTimeline.displayName = "EngagementTimeline";
9694
+ var stateBadge = {
9695
+ done: { label: "Done", className: "text-success-fg" },
9696
+ active: { label: "In progress", className: "[color:var(--tone)]" },
9697
+ todo: { label: "Upcoming", className: "text-fg-4" }
9698
+ };
9699
+ var EngagementTimelineStep = forwardRef(
9700
+ function EngagementTimelineStep2({ state, name, index, note, date, actions, last, className, ...props }, ref) {
9701
+ const badge = stateBadge[state];
9702
+ return /* @__PURE__ */ jsxs("li", { ref, className: cn("flex gap-3", className), ...props, children: [
9703
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
9704
+ /* @__PURE__ */ jsx(
9705
+ "span",
9706
+ {
9707
+ "aria-hidden": "true",
9708
+ className: cn(
9709
+ "flex size-7 shrink-0 items-center justify-center rounded-full text-xs font-semibold tabular-nums",
9710
+ state === "done" && "bg-success-fg text-fg-on-success",
9711
+ state === "active" && "bg-surface border-2 [border-color:var(--tone)] [color:var(--tone)]",
9712
+ state === "todo" && "bg-bg-3 text-fg-4"
9713
+ ),
9714
+ children: state === "done" ? /* @__PURE__ */ jsx(CheckIcon, { className: "size-4", strokeWidth: 3 }) : index
9715
+ }
9716
+ ),
9717
+ !last && /* @__PURE__ */ jsx(
9718
+ "span",
9719
+ {
9720
+ "aria-hidden": "true",
9721
+ className: cn("w-0.5 flex-1", state === "done" ? "bg-success-line" : "bg-rule")
9722
+ }
9723
+ )
9724
+ ] }),
9725
+ /* @__PURE__ */ jsxs("div", { className: cn("min-w-0 flex-1", last ? "pb-0" : "pb-6"), children: [
9726
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
9727
+ /* @__PURE__ */ jsx(
9728
+ "span",
9729
+ {
9730
+ className: cn(
9731
+ "text-sm font-medium",
9732
+ state === "todo" ? "text-fg-3" : "text-fg"
9733
+ ),
9734
+ children: name
9735
+ }
9736
+ ),
9737
+ /* @__PURE__ */ jsx("span", { className: cn("shrink-0 text-[11px] font-semibold", badge.className), children: badge.label })
9738
+ ] }),
9739
+ note != null && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-0.5 text-xs", children: note }),
9740
+ state === "done" && date != null && /* @__PURE__ */ jsxs("p", { className: "text-success-fg mt-1 inline-flex items-center gap-1 text-[11px]", children: [
9741
+ /* @__PURE__ */ jsx(CheckIcon, { className: "size-3", strokeWidth: 3, "aria-hidden": "true" }),
9742
+ " Completed ",
9743
+ date
9744
+ ] }),
9745
+ state === "active" && actions && /* @__PURE__ */ jsx("div", { className: "mt-2 flex flex-wrap gap-2", children: actions })
9746
+ ] })
9747
+ ] });
9748
+ }
9749
+ );
9750
+ EngagementTimelineStep.displayName = "EngagementTimelineStep";
9751
+ var INDENT = 18;
9752
+ var FolderTree = forwardRef(function FolderTree2({ nodes, activeId, onSelect, defaultOpenIds, openIds, onOpenChange, className, ...props }, ref) {
9753
+ const isControlled = openIds !== void 0;
9754
+ const [internalOpen, setInternalOpen] = useState(() => new Set(defaultOpenIds ?? []));
9755
+ const open = isControlled ? new Set(openIds) : internalOpen;
9756
+ const toggle = (id) => {
9757
+ const next = new Set(open);
9758
+ if (next.has(id)) next.delete(id);
9759
+ else next.add(id);
9760
+ if (isControlled) onOpenChange?.([...next]);
9761
+ else {
9762
+ setInternalOpen(next);
9763
+ onOpenChange?.([...next]);
9764
+ }
9765
+ };
9766
+ const renderNode = (node, depth) => {
9767
+ const hasChildren = Boolean(node.children?.length);
9768
+ const isOpen = open.has(node.id);
9769
+ const isActive = activeId === node.id;
9770
+ return /* @__PURE__ */ jsxs("li", { children: [
9771
+ /* @__PURE__ */ jsxs(
9772
+ "div",
9773
+ {
9774
+ className: cn(
9775
+ "group/row flex items-stretch rounded-[var(--radius-icon)]",
9776
+ isActive ? "bg-pro-bg" : "hover:bg-bg-2"
9777
+ ),
9778
+ children: [
9779
+ /* @__PURE__ */ jsx(
9780
+ "button",
9781
+ {
9782
+ type: "button",
9783
+ "aria-expanded": hasChildren ? isOpen : void 0,
9784
+ "aria-label": isOpen ? `Collapse ${node.name}` : `Expand ${node.name}`,
9785
+ onClick: () => hasChildren && toggle(node.id),
9786
+ disabled: !hasChildren,
9787
+ className: "flex w-6 shrink-0 items-center justify-center self-stretch text-fg-4 disabled:opacity-0",
9788
+ style: { marginLeft: depth * INDENT },
9789
+ tabIndex: hasChildren ? 0 : -1,
9790
+ children: /* @__PURE__ */ jsx(
9791
+ ChevronRightIcon,
9792
+ {
9793
+ className: cn(
9794
+ "size-3.5 transition-transform duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
9795
+ isOpen && "rotate-90"
9796
+ ),
9797
+ "aria-hidden": "true"
9798
+ }
9799
+ )
9800
+ }
9801
+ ),
9802
+ /* @__PURE__ */ jsxs(
9803
+ "button",
9804
+ {
9805
+ type: "button",
9806
+ onClick: () => onSelect?.(node.id),
9807
+ "aria-current": isActive ? "true" : void 0,
9808
+ className: cn(
9809
+ "flex min-w-0 flex-1 items-center gap-2 py-1.5 pr-2 text-left text-sm focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)]",
9810
+ isActive ? "text-pro-fg font-medium" : "text-fg-2"
9811
+ ),
9812
+ children: [
9813
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "shrink-0 [&_svg]:size-4", children: isOpen && hasChildren ? /* @__PURE__ */ jsx(FolderOpenIcon, {}) : /* @__PURE__ */ jsx(FolderClosedIcon, {}) }),
9814
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: node.name }),
9815
+ node.count != null && /* @__PURE__ */ jsx("span", { className: "text-fg-4 shrink-0 text-xs tabular-nums", children: node.count })
9816
+ ]
9817
+ }
9818
+ )
9819
+ ]
9820
+ }
9821
+ ),
9822
+ hasChildren && isOpen && /* @__PURE__ */ jsx("ul", { className: "flex flex-col", children: node.children.map((child) => renderNode(child, depth + 1)) })
9823
+ ] }, node.id);
9824
+ };
9825
+ return /* @__PURE__ */ jsx("div", { ref, className: cn("w-full", className), ...props, children: /* @__PURE__ */ jsx("ul", { className: "flex flex-col", children: nodes.map((node) => renderNode(node, 0)) }) });
9826
+ });
9827
+ FolderTree.displayName = "FolderTree";
9828
+ function renderAction(action) {
9829
+ return /* @__PURE__ */ jsxs(DropdownMenuItem, { onSelect: action.onSelect, children: [
9830
+ action.icon && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-fg-3 [&_svg]:size-4", children: action.icon }),
9831
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-col", children: [
9832
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: action.label }),
9833
+ action.description && /* @__PURE__ */ jsx("span", { className: "text-fg-3 truncate text-xs", children: action.description })
9834
+ ] }),
9835
+ action.shortcut && /* @__PURE__ */ jsx(DropdownMenuShortcut, { children: action.shortcut })
9836
+ ] }, action.id);
9837
+ }
9838
+ var NewMenu = forwardRef(function NewMenu2({ actions, groups, triggerLabel = "New", trigger, align = "end" }, ref) {
9839
+ const sections = groups ?? (actions ? [{ actions }] : []);
9840
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
9841
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: trigger ?? /* @__PURE__ */ jsxs(Button, { ref, iconLeft: /* @__PURE__ */ jsx(PlusIcon, {}), children: [
9842
+ triggerLabel,
9843
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4 opacity-70" })
9844
+ ] }) }),
9845
+ /* @__PURE__ */ jsx(DropdownMenuContent, { align, className: "w-60", children: sections.map((section, i) => /* @__PURE__ */ jsxs("div", { children: [
9846
+ i > 0 && /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
9847
+ section.label && /* @__PURE__ */ jsx(DropdownMenuLabel, { children: section.label }),
9848
+ section.actions.map(renderAction)
9849
+ ] }, i)) })
9850
+ ] });
9851
+ });
9852
+ NewMenu.displayName = "NewMenu";
8248
9853
  var Shell = forwardRef(function Shell2({ className, ...props }, ref) {
8249
9854
  return /* @__PURE__ */ jsx("div", { ref, className: cn("bg-bg flex h-dvh w-full", className), ...props });
8250
9855
  });
@@ -8280,7 +9885,7 @@ var Content16 = forwardRef(function Content17({ padTop, padBottom, className, st
8280
9885
  );
8281
9886
  });
8282
9887
  Content16.displayName = "Content";
8283
- var SidebarContext = React36.createContext(null);
9888
+ var SidebarContext = React37.createContext(null);
8284
9889
  var NOOP_CONTEXT = {
8285
9890
  state: "expanded",
8286
9891
  setState: () => {
@@ -8293,7 +9898,7 @@ var NOOP_CONTEXT = {
8293
9898
  }
8294
9899
  };
8295
9900
  function useSidebarState() {
8296
- return React36.useContext(SidebarContext) ?? NOOP_CONTEXT;
9901
+ return React37.useContext(SidebarContext) ?? NOOP_CONTEXT;
8297
9902
  }
8298
9903
  var DEFAULT_SHORTCUT = "Mod+\\";
8299
9904
  function readStorage(key) {
@@ -8313,16 +9918,16 @@ function SidebarProvider({
8313
9918
  storageKey,
8314
9919
  shortcut = DEFAULT_SHORTCUT
8315
9920
  }) {
8316
- const [uncontrolled, setUncontrolled] = React36.useState(
9921
+ const [uncontrolled, setUncontrolled] = React37.useState(
8317
9922
  controlled ?? defaultState
8318
9923
  );
8319
- React36.useEffect(() => {
9924
+ React37.useEffect(() => {
8320
9925
  if (controlled !== void 0) return;
8321
9926
  const stored = readStorage(storageKey);
8322
9927
  if (stored && stored !== uncontrolled) setUncontrolled(stored);
8323
9928
  }, []);
8324
9929
  const state = controlled ?? uncontrolled;
8325
- const setState = React36.useCallback(
9930
+ const setState = React37.useCallback(
8326
9931
  (next) => {
8327
9932
  if (controlled === void 0) setUncontrolled(next);
8328
9933
  onStateChange?.(next);
@@ -8335,11 +9940,11 @@ function SidebarProvider({
8335
9940
  },
8336
9941
  [controlled, onStateChange, storageKey]
8337
9942
  );
8338
- const toggle = React36.useCallback(() => {
9943
+ const toggle = React37.useCallback(() => {
8339
9944
  setState(state === "expanded" ? "rail" : "expanded");
8340
9945
  }, [state, setState]);
8341
- const [peekLockCount, setPeekLockCount] = React36.useState(0);
8342
- const acquirePeekLock = React36.useCallback(() => {
9946
+ const [peekLockCount, setPeekLockCount] = React37.useState(0);
9947
+ const acquirePeekLock = React37.useCallback(() => {
8343
9948
  setPeekLockCount((n) => n + 1);
8344
9949
  let released = false;
8345
9950
  return () => {
@@ -8348,7 +9953,7 @@ function SidebarProvider({
8348
9953
  setPeekLockCount((n) => Math.max(0, n - 1));
8349
9954
  };
8350
9955
  }, []);
8351
- React36.useEffect(() => {
9956
+ React37.useEffect(() => {
8352
9957
  if (!shortcut) return;
8353
9958
  const parts = shortcut.split("+");
8354
9959
  const key = parts.pop() ?? "";
@@ -8368,7 +9973,7 @@ function SidebarProvider({
8368
9973
  window.addEventListener("keydown", onKey);
8369
9974
  return () => window.removeEventListener("keydown", onKey);
8370
9975
  }, [shortcut, toggle]);
8371
- const value = React36.useMemo(
9976
+ const value = React37.useMemo(
8372
9977
  () => ({ state, setState, toggle, collapsible: true, peekLockCount, acquirePeekLock }),
8373
9978
  [state, setState, toggle, peekLockCount, acquirePeekLock]
8374
9979
  );
@@ -8377,15 +9982,15 @@ function SidebarProvider({
8377
9982
  SidebarProvider.displayName = "SidebarProvider";
8378
9983
  var PEEK_ENTER_DELAY_MS = 100;
8379
9984
  var PEEK_LEAVE_DELAY_MS = 200;
8380
- var Sidebar = React36.forwardRef(function Sidebar2({ className, collapsible = false, variant = "classic", onMouseEnter, onMouseLeave, style, ...props }, ref) {
9985
+ var Sidebar = React37.forwardRef(function Sidebar2({ className, collapsible = false, variant = "classic", onMouseEnter, onMouseLeave, style, ...props }, ref) {
8381
9986
  const isFloating = variant === "floating";
8382
- const ctx = React36.useContext(SidebarContext);
9987
+ const ctx = React37.useContext(SidebarContext);
8383
9988
  const state = collapsible && ctx ? ctx.state : "expanded";
8384
9989
  const peekLockCount = collapsible && ctx ? ctx.peekLockCount : 0;
8385
- const [peek, setPeek] = React36.useState(false);
8386
- const enterTimer = React36.useRef(null);
8387
- const leaveTimer = React36.useRef(null);
8388
- const clearTimers = React36.useCallback(() => {
9990
+ const [peek, setPeek] = React37.useState(false);
9991
+ const enterTimer = React37.useRef(null);
9992
+ const leaveTimer = React37.useRef(null);
9993
+ const clearTimers = React37.useCallback(() => {
8389
9994
  if (enterTimer.current != null) {
8390
9995
  window.clearTimeout(enterTimer.current);
8391
9996
  enterTimer.current = null;
@@ -8395,8 +10000,8 @@ var Sidebar = React36.forwardRef(function Sidebar2({ className, collapsible = fa
8395
10000
  leaveTimer.current = null;
8396
10001
  }
8397
10002
  }, []);
8398
- React36.useEffect(() => () => clearTimers(), [clearTimers]);
8399
- React36.useEffect(() => {
10003
+ React37.useEffect(() => () => clearTimers(), [clearTimers]);
10004
+ React37.useEffect(() => {
8400
10005
  if (state === "expanded") {
8401
10006
  clearTimers();
8402
10007
  setPeek(false);
@@ -8477,7 +10082,7 @@ var Sidebar = React36.forwardRef(function Sidebar2({ className, collapsible = fa
8477
10082
  );
8478
10083
  });
8479
10084
  Sidebar.displayName = "Sidebar";
8480
- var SidebarTrigger = React36.forwardRef(
10085
+ var SidebarTrigger = React37.forwardRef(
8481
10086
  function SidebarTrigger2({
8482
10087
  className,
8483
10088
  expandLabel = "Expand sidebar",
@@ -8485,7 +10090,7 @@ var SidebarTrigger = React36.forwardRef(
8485
10090
  onClick,
8486
10091
  ...props
8487
10092
  }, ref) {
8488
- const ctx = React36.useContext(SidebarContext);
10093
+ const ctx = React37.useContext(SidebarContext);
8489
10094
  if (!ctx) return null;
8490
10095
  const { state, toggle } = ctx;
8491
10096
  const label = state === "expanded" ? collapseLabel : expandLabel;
@@ -8516,14 +10121,14 @@ var SidebarTrigger = React36.forwardRef(
8516
10121
  );
8517
10122
  SidebarTrigger.displayName = "SidebarTrigger";
8518
10123
  function useSidebarPeekLock(active) {
8519
- const ctx = React36.useContext(SidebarContext);
8520
- React36.useEffect(() => {
10124
+ const ctx = React37.useContext(SidebarContext);
10125
+ React37.useEffect(() => {
8521
10126
  if (!active || !ctx) return;
8522
10127
  const release = ctx.acquirePeekLock();
8523
10128
  return release;
8524
10129
  }, [active, ctx]);
8525
10130
  }
8526
- var SidebarPinButton = React36.forwardRef(
10131
+ var SidebarPinButton = React37.forwardRef(
8527
10132
  function SidebarPinButton2({
8528
10133
  pinLabel = "Pin sidebar",
8529
10134
  unpinLabel = "Unpin sidebar",
@@ -8531,7 +10136,7 @@ var SidebarPinButton = React36.forwardRef(
8531
10136
  onClick,
8532
10137
  ...props
8533
10138
  }, ref) {
8534
- const ctx = React36.useContext(SidebarContext);
10139
+ const ctx = React37.useContext(SidebarContext);
8535
10140
  if (!ctx || !ctx.collapsible) return null;
8536
10141
  const { state, setState } = ctx;
8537
10142
  const isPinned = state === "expanded";
@@ -8596,7 +10201,7 @@ function PinGlyph({
8596
10201
  }
8597
10202
  );
8598
10203
  }
8599
- var SidebarBrand = React36.forwardRef(
10204
+ var SidebarBrand = React37.forwardRef(
8600
10205
  function SidebarBrand2({ className, ...props }, ref) {
8601
10206
  return /* @__PURE__ */ jsx(
8602
10207
  "div",
@@ -8612,7 +10217,7 @@ var SidebarBrand = React36.forwardRef(
8612
10217
  }
8613
10218
  );
8614
10219
  SidebarBrand.displayName = "SidebarBrand";
8615
- var SidebarBrandText = React36.forwardRef(
10220
+ var SidebarBrandText = React37.forwardRef(
8616
10221
  function SidebarBrandText2({ className, ...props }, ref) {
8617
10222
  return /* @__PURE__ */ jsx(
8618
10223
  "span",
@@ -8637,16 +10242,16 @@ var SidebarBrandText = React36.forwardRef(
8637
10242
  }
8638
10243
  );
8639
10244
  SidebarBrandText.displayName = "SidebarBrandText";
8640
- var SidebarGroupScopeContext = React36.createContext(null);
8641
- var SidebarSection = React36.forwardRef(
10245
+ var SidebarGroupScopeContext = React37.createContext(null);
10246
+ var SidebarSection = React37.forwardRef(
8642
10247
  function SidebarSection2({ label, tone = "pro", className, children, ...props }, ref) {
8643
10248
  const ariaLabel = typeof label === "string" ? label : typeof label === "number" ? String(label) : void 0;
8644
- const [exclusiveId, setExclusiveIdState] = React36.useState(null);
8645
- const setExclusive = React36.useCallback(
10249
+ const [exclusiveId, setExclusiveIdState] = React37.useState(null);
10250
+ const setExclusive = React37.useCallback(
8646
10251
  (id) => setExclusiveIdState(id),
8647
10252
  []
8648
10253
  );
8649
- const scope = React36.useMemo(
10254
+ const scope = React37.useMemo(
8650
10255
  () => ({ exclusiveId, setExclusive }),
8651
10256
  [exclusiveId, setExclusive]
8652
10257
  );
@@ -8699,12 +10304,12 @@ function getTextContent(node) {
8699
10304
  if (node == null || typeof node === "boolean") return "";
8700
10305
  if (typeof node === "string" || typeof node === "number") return String(node);
8701
10306
  if (Array.isArray(node)) return node.map(getTextContent).filter(Boolean).join(" ");
8702
- if (React36.isValidElement(node)) {
10307
+ if (React37.isValidElement(node)) {
8703
10308
  return getTextContent(node.props.children);
8704
10309
  }
8705
10310
  return "";
8706
10311
  }
8707
- var SidebarLink = React36.forwardRef(
10312
+ var SidebarLink = React37.forwardRef(
8708
10313
  function SidebarLink2({ href, icon, active = false, asChild, className, children, "aria-label": ariaLabel, ...props }, ref) {
8709
10314
  const Comp = asChild ? Slot : "a";
8710
10315
  const accessibleLabel = ariaLabel ?? (asChild ? void 0 : getTextContent(children) || void 0);
@@ -8775,7 +10380,7 @@ var SidebarLink = React36.forwardRef(
8775
10380
  }
8776
10381
  );
8777
10382
  SidebarLink.displayName = "SidebarLink";
8778
- var SidebarLinkLabel = React36.forwardRef(
10383
+ var SidebarLinkLabel = React37.forwardRef(
8779
10384
  function SidebarLinkLabel2({ className, ...props }, ref) {
8780
10385
  return /* @__PURE__ */ jsx(
8781
10386
  "span",
@@ -8800,7 +10405,7 @@ var SidebarLinkLabel = React36.forwardRef(
8800
10405
  }
8801
10406
  );
8802
10407
  SidebarLinkLabel.displayName = "SidebarLinkLabel";
8803
- var SidebarLinkAction = React36.forwardRef(
10408
+ var SidebarLinkAction = React37.forwardRef(
8804
10409
  function SidebarLinkAction2({ className, ...props }, ref) {
8805
10410
  return /* @__PURE__ */ jsx(
8806
10411
  "span",
@@ -8832,13 +10437,13 @@ var sidebarLinkBadgeVariants = cva(
8832
10437
  defaultVariants: { tone: "default" }
8833
10438
  }
8834
10439
  );
8835
- var SidebarLinkBadge = React36.forwardRef(
10440
+ var SidebarLinkBadge = React37.forwardRef(
8836
10441
  function SidebarLinkBadge2({ tone, className, ...props }, ref) {
8837
10442
  return /* @__PURE__ */ jsx("span", { ref, className: cn(sidebarLinkBadgeVariants({ tone }), className), ...props });
8838
10443
  }
8839
10444
  );
8840
10445
  SidebarLinkBadge.displayName = "SidebarLinkBadge";
8841
- var SidebarLinkGroup = React36.forwardRef(
10446
+ var SidebarLinkGroup = React37.forwardRef(
8842
10447
  function SidebarLinkGroup2({
8843
10448
  id: idProp,
8844
10449
  icon,
@@ -8853,19 +10458,19 @@ var SidebarLinkGroup = React36.forwardRef(
8853
10458
  children,
8854
10459
  ...props
8855
10460
  }, ref) {
8856
- const reactId = React36.useId();
10461
+ const reactId = React37.useId();
8857
10462
  const id = idProp ?? reactId;
8858
- const scope = React36.useContext(SidebarGroupScopeContext);
8859
- const [uncontrolledOpen, setUncontrolledOpen] = React36.useState(defaultOpen);
10463
+ const scope = React37.useContext(SidebarGroupScopeContext);
10464
+ const [uncontrolledOpen, setUncontrolledOpen] = React37.useState(defaultOpen);
8860
10465
  const open = controlled ?? uncontrolledOpen;
8861
- const setOpen = React36.useCallback(
10466
+ const setOpen = React37.useCallback(
8862
10467
  (next) => {
8863
10468
  if (controlled === void 0) setUncontrolledOpen(next);
8864
10469
  onOpenChange?.(next);
8865
10470
  },
8866
10471
  [controlled, onOpenChange]
8867
10472
  );
8868
- React36.useEffect(() => {
10473
+ React37.useEffect(() => {
8869
10474
  if (scope?.exclusiveId && scope.exclusiveId !== id && open) {
8870
10475
  setOpen(false);
8871
10476
  }
@@ -8974,7 +10579,7 @@ var SidebarLinkGroup = React36.forwardRef(
8974
10579
  }
8975
10580
  );
8976
10581
  SidebarLinkGroup.displayName = "SidebarLinkGroup";
8977
- var SidebarFooter = React36.forwardRef(
10582
+ var SidebarFooter = React37.forwardRef(
8978
10583
  function SidebarFooter2({ className, ...props }, ref) {
8979
10584
  return /* @__PURE__ */ jsx(
8980
10585
  "div",
@@ -8991,7 +10596,7 @@ var SidebarFooter = React36.forwardRef(
8991
10596
  }
8992
10597
  );
8993
10598
  SidebarFooter.displayName = "SidebarFooter";
8994
- var SidebarUser = React36.forwardRef(function SidebarUser2({ name, subtitle, avatarSrc, className, ...props }, ref) {
10599
+ var SidebarUser = React37.forwardRef(function SidebarUser2({ name, subtitle, avatarSrc, className, ...props }, ref) {
8995
10600
  return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex min-w-0 items-center gap-2.5", className), ...props, children: [
8996
10601
  /* @__PURE__ */ jsx(Avatar, { size: "sm", variant: "branded", name, src: avatarSrc ?? void 0 }),
8997
10602
  /* @__PURE__ */ jsxs(
@@ -9012,7 +10617,7 @@ var SidebarUser = React36.forwardRef(function SidebarUser2({ name, subtitle, ava
9012
10617
  ] });
9013
10618
  });
9014
10619
  SidebarUser.displayName = "SidebarUser";
9015
- var SidebarBrandSwitcher = React36.forwardRef(
10620
+ var SidebarBrandSwitcher = React37.forwardRef(
9016
10621
  function SidebarBrandSwitcher2({
9017
10622
  brand,
9018
10623
  label,
@@ -9030,7 +10635,7 @@ var SidebarBrandSwitcher = React36.forwardRef(
9030
10635
  contentClassName,
9031
10636
  trailing
9032
10637
  }, ref) {
9033
- const [open, setOpen] = React36.useState(false);
10638
+ const [open, setOpen] = React37.useState(false);
9034
10639
  useSidebarPeekLock(open);
9035
10640
  const others = items.filter((p) => p.id !== current.id);
9036
10641
  return (
@@ -9150,7 +10755,7 @@ function SidebarBrandSwitcherOtherRow({
9150
10755
  unavailableBadge
9151
10756
  }) {
9152
10757
  const reachable = item.available !== false;
9153
- const [launching, setLaunching] = React36.useState(false);
10758
+ const [launching, setLaunching] = React37.useState(false);
9154
10759
  const handleSelect = async () => {
9155
10760
  if (!reachable || launching || !onLaunch) return;
9156
10761
  setLaunching(true);
@@ -9559,14 +11164,14 @@ var DataTable = forwardRef(function DataTable2({ withToolbar, className, childre
9559
11164
  "div",
9560
11165
  {
9561
11166
  ref,
11167
+ "data-with-toolbar": withToolbar ? "true" : void 0,
9562
11168
  className: cn(
9563
- "w-full",
9564
- // Surface card chrome on the descendant `<table>`.
11169
+ // Outer frame on the whole component: a single visible border +
11170
+ // quiet shadow wrapping the toolbar (if any) and the table as one
11171
+ // card. overflow-hidden clips the header/cell backgrounds to the
11172
+ // rounded corners.
11173
+ "w-full overflow-hidden rounded-card border border-rule-strong bg-surface shadow-quiet",
9565
11174
  "[&_table]:bg-surface [&_table]:w-full [&_table]:border-collapse",
9566
- "[&_table]:border-rule [&_table]:border",
9567
- withToolbar ? "[&_table]:rounded-b-card [&_table]:border-t-0" : "[&_table]:rounded-card",
9568
- // Clip cell backgrounds at the rounded corners.
9569
- "[&_table]:overflow-hidden",
9570
11175
  className
9571
11176
  ),
9572
11177
  ...props,
@@ -9583,7 +11188,7 @@ var DataTableToolbar = forwardRef(
9583
11188
  ref,
9584
11189
  className: cn(
9585
11190
  "flex items-center gap-2 px-3 py-2.5",
9586
- "rounded-t-card border-rule bg-surface border",
11191
+ "border-rule bg-surface border-b",
9587
11192
  className
9588
11193
  ),
9589
11194
  ...props
@@ -9621,7 +11226,7 @@ var DataTableResultsCount = forwardRef(
9621
11226
  "span",
9622
11227
  {
9623
11228
  ref,
9624
- className: cn("text-fg-4 mr-1 font-mono text-[11px] tabular-nums", className),
11229
+ className: cn("text-fg-4 mr-1 font-sans text-[11px] tabular-nums", className),
9625
11230
  ...props,
9626
11231
  children: [
9627
11232
  current.toLocaleString(),
@@ -9706,9 +11311,9 @@ var DataTableHeader = forwardRef(
9706
11311
  scope: "col",
9707
11312
  "aria-sort": ariaSort,
9708
11313
  className: cn(
9709
- "h-9 px-3.5 py-2 text-left align-middle whitespace-nowrap",
9710
- "font-mono text-[10px] font-medium tracking-[0.12em] uppercase",
9711
- "text-fg-4 bg-surface-2",
11314
+ "h-11 px-4 py-2.5 text-left align-middle whitespace-nowrap",
11315
+ "font-sans text-[14px] font-medium tracking-normal normal-case",
11316
+ "text-fg-3 bg-surface-2",
9712
11317
  "border-rule border-b",
9713
11318
  "[&:has([role=checkbox])]:pr-0",
9714
11319
  className
@@ -9721,9 +11326,9 @@ var DataTableHeader = forwardRef(
9721
11326
  onClick: handleClick,
9722
11327
  className: cn(
9723
11328
  "-mx-1 -my-1 inline-flex items-center gap-1 rounded-[4px] px-1 py-1",
9724
- "font-mono text-[10px] font-medium tracking-[0.12em] uppercase",
9725
- "text-fg-4 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
9726
- "hover:text-fg-2",
11329
+ "font-sans text-[14px] font-medium tracking-normal normal-case",
11330
+ "text-fg-3 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
11331
+ "hover:text-fg",
9727
11332
  "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none"
9728
11333
  ),
9729
11334
  children: [
@@ -9737,7 +11342,7 @@ var DataTableHeader = forwardRef(
9737
11342
  }
9738
11343
  );
9739
11344
  DataTableHeader.displayName = "DataTableHeader";
9740
- var cellBase = "px-3.5 py-2.5 align-middle";
11345
+ var cellBase = "px-4 py-3 align-middle";
9741
11346
  var DataTableCell = forwardRef(
9742
11347
  function DataTableCell2({ className, ...props }, ref) {
9743
11348
  return /* @__PURE__ */ jsx(
@@ -9775,7 +11380,7 @@ var DataTableCellMono = forwardRef(
9775
11380
  "td",
9776
11381
  {
9777
11382
  ref,
9778
- className: cn(cellBase, "font-spec text-fg-2 text-[12.5px]", className),
11383
+ className: cn(cellBase, "font-sans text-fg-2 text-[13px] tabular-nums", className),
9779
11384
  style,
9780
11385
  ...props
9781
11386
  }
@@ -9789,7 +11394,7 @@ var DataTableCellId = forwardRef(
9789
11394
  "td",
9790
11395
  {
9791
11396
  ref,
9792
- className: cn(cellBase, "font-spec text-fg-4 text-xs", className),
11397
+ className: cn(cellBase, "font-sans text-fg-4 text-xs tabular-nums", className),
9793
11398
  style,
9794
11399
  ...props
9795
11400
  }
@@ -9814,7 +11419,7 @@ var DataTableCellDue = forwardRef(
9814
11419
  {
9815
11420
  ref,
9816
11421
  "data-due-state": ariaState,
9817
- className: cn(cellBase, "font-spec text-[12.5px]", tone, className),
11422
+ className: cn(cellBase, "font-sans text-[13px] tabular-nums", tone, className),
9818
11423
  style,
9819
11424
  ...props,
9820
11425
  children: children ?? dueDateFormatter.format(value)
@@ -9840,8 +11445,8 @@ var DataTableCheckbox = forwardRef(
9840
11445
  {
9841
11446
  ref,
9842
11447
  className: cn(
9843
- "w-8 px-3.5 py-2.5 pr-0 align-middle",
9844
- asHeader && "bg-surface-2 border-rule h-9 border-b",
11448
+ "w-8 px-4 py-3 pr-0 align-middle",
11449
+ asHeader && "bg-surface-2 border-rule h-11 border-b",
9845
11450
  className
9846
11451
  ),
9847
11452
  ...props,
@@ -11067,7 +12672,7 @@ var FilterChip = forwardRef(function FilterChip2({ active = false, size, count,
11067
12672
  );
11068
12673
  });
11069
12674
  FilterChip.displayName = "FilterChip";
11070
- var BulkActionBarContext = React36.createContext({ tone: "surface" });
12675
+ var BulkActionBarContext = React37.createContext({ tone: "surface" });
11071
12676
  function actionClasses(tone, destructive) {
11072
12677
  const base = cn(
11073
12678
  "inline-flex h-8 items-center gap-1.5 rounded-btn px-3 text-[13px] font-medium",
@@ -11090,8 +12695,8 @@ function actionClasses(tone, destructive) {
11090
12695
  destructive ? "text-control-destructive-fg hover:bg-control-destructive-hover-bg" : "text-control-fg hover:bg-control-hover-bg hover:text-control-hover-fg"
11091
12696
  );
11092
12697
  }
11093
- var BulkActionBarAction = React36.forwardRef(function BulkActionBarAction2({ asChild = false, destructive, className, type, ...props }, ref) {
11094
- const { tone } = React36.use(BulkActionBarContext);
12698
+ var BulkActionBarAction = React37.forwardRef(function BulkActionBarAction2({ asChild = false, destructive, className, type, ...props }, ref) {
12699
+ const { tone } = React37.use(BulkActionBarContext);
11095
12700
  const Comp = asChild ? Slot : "button";
11096
12701
  return /* @__PURE__ */ jsx(
11097
12702
  Comp,
@@ -11105,7 +12710,7 @@ var BulkActionBarAction = React36.forwardRef(function BulkActionBarAction2({ asC
11105
12710
  });
11106
12711
  BulkActionBarAction.displayName = "BulkActionBarAction";
11107
12712
  function BulkActionBarSeparator({ className }) {
11108
- const { tone } = React36.use(BulkActionBarContext);
12713
+ const { tone } = React37.use(BulkActionBarContext);
11109
12714
  return /* @__PURE__ */ jsx(
11110
12715
  "span",
11111
12716
  {
@@ -11305,6 +12910,6 @@ var KbdHint = forwardRef(function KbdHint2({ className, children, ...props }, re
11305
12910
  });
11306
12911
  KbdHint.displayName = "KbdHint";
11307
12912
 
11308
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityEventItem, ActivityItem, ActivityList, Alert, AlertCircleIcon, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AlertTriangleIcon, AlertTriangleSolidIcon, AppHeader, AppHeaderActions, AppHeaderBreadcrumb, AppHeaderSearch, AppHeaderTitle, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightSmallIcon, ArrowUpIcon, AspectRatio, AssureAuditBrandIcon, AssureBooksBrandIcon, AssureProBrandIcon, AssureTaxBrandIcon, AtSignIcon, Avatar, Badge, BarChartIcon, BellIcon, Blockquote, BoldIcon, Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BriefcaseIcon, Building2Icon, BuildingIcon, BulkActionBar, BulkActionBarAction, BulkActionBarSeparator, Button, COUNTRY_CODES, Calendar, CalendarIcon, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ChatBubbleIcon, CheckCircle2Icon, CheckCircleSolidIcon, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, 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, DataItem, DataTable, DataTableBody, DataTableCell, DataTableCellDue, DataTableCellId, DataTableCellMono, DataTableCellName, DataTableCheckbox, DataTableHead, DataTableHeader, DataTablePagination, DataTableResultsCount, DataTableRow, DataTableSearch, DataTableSpacer, DataTableToolbar, DatePicker, DateRangePicker, DetailGrid, DetailMain, DetailSpine, DetailSpineHeader, DetailSpineSection, DetailSpineStats, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DismissibleChip, DocumentIcon, DollarSignIcon, DownloadIcon, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EyeIcon, EyeOffIcon, Eyebrow, FileIcon, FileReturnIcon, FileTextIcon, FileUpload, FilterChip, FilterIcon, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FormError, FormSection, FormSuccess, GlobeIcon, GoogleBrandIcon, HelpCircleIcon, HistoryIcon, HomeIcon, HoverCard, HoverCardContent, HoverCardPortal, HoverCardTrigger, IconAction, InboxIcon, InfoCircleSolidIcon, InfoIcon, Input, ItalicIcon, Kanban, KanbanCard, KanbanColumn, KanbanIcon, KbdHint, KeyIcon, KeyboardShortcutsDialog, KpiCard, Label4 as Label, LayoutDashboardIcon, LayoutGridIcon, LayoutListIcon, LightningIcon, Link2Icon, LinkAction, LinkButton, LinkIcon, ListChecksIcon, ListIcon, ListOrderedIcon, LoaderIcon, LoadingRows, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, Logo, MailIcon, Main, MapPinIcon, MenuIcon, MessageBubble, MessageBubbleAction, MessageBubbleTombstone, MessageCircleIcon, MessageCircleWarningIcon, MessageComposer, MetadataGrid, MicrosoftBrandIcon, MinusIcon, MonitorIcon, MoonIcon, MoreHorizontalIcon, MoveIcon, MultiFilterPill, MultiSelectField, MutedSpec, NotificationFilter, NotificationItem, NotificationList, NotificationPanel, NotificationPanelFooter, NotificationPanelHeader, Numeric, OTPInput, PageHeader, PageHeaderSep, PageHeaderSpec, Pagination, PaletteIcon, PanelLeftCloseIcon, PanelLeftIcon, PaperclipIcon, PauseIcon, PenSignIcon, PencilIcon, PhoneCountryInput, PhoneIcon, PhoneInput, PlayIcon, PlusIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PrimaryAction, PriorityIcon, ProgressBar, ProgressRing, RadioGroup3 as RadioGroup, RadioGroupItem, ReceiptIcon, ReplyIcon, RotateCcwIcon, SaveIcon, ScrollArea, ScrollBar, SearchIcon, SearchInput, SearchSelect, SecondaryAction, Section, SectionHead, SectionHeader, 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, Skeleton, SkeletonCircle, SkeletonText, SlashIcon, Slider, SmartphoneIcon, SparkleIcon, SparklesIcon, Spinner, StarIcon, StarRating, Stat, StatusIcon, Stepper, StopIcon, StrikethroughIcon, SubmitButton, SunIcon, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableIcon, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagIcon, 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, badgeVariants, buttonVariants, cardVariants, cn, colors, dateToIso, displayToIso, filterChipVariants, formatClock, formatCurrency, formatDuration, getFlagEmoji, inputVariants, isoToDate, isoToDisplay, isoToYear, labelVariants, parseDuration, parsePhoneForEditing, progressBarVariants, progressRingVariants, radii, reference, searchInputVariants, shadows, sidebarLinkBadgeVariants, spacing, spinnerVariants, starRatingVariants, surfaces, systemTokens, textareaVariants, typography, useSidebarPeekLock, useSidebarState, useStopwatch, useToast, yearToIso };
12913
+ export { AIReceiptPanel, Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityEventItem, ActivityItem, ActivityList, 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, AssureAuditBrandIcon, AssureBooksBrandIcon, AssureProBrandIcon, AssureTaxBrandIcon, AtSignIcon, AttachmentChip, AttentionItem, Avatar, Badge, BarChartIcon, BellIcon, Blockquote, BoldIcon, BottomNav, 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, ChatBubbleIcon, CheckCircle2Icon, CheckCircleSolidIcon, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, 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, DashGrid, DataItem, DataTable, DataTableBody, DataTableCell, DataTableCellDue, DataTableCellId, DataTableCellMono, DataTableCellName, DataTableCheckbox, DataTableHead, DataTableHeader, DataTablePagination, DataTableResultsCount, DataTableRow, DataTableSearch, DataTableSpacer, DataTableToolbar, DatePicker, DateRangePicker, DetailGrid, DetailMain, DetailSpine, DetailSpineHeader, DetailSpineSection, DetailSpineStats, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DismissibleChip, DocumentIcon, DollarSignIcon, DonutChart, DownloadIcon, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EngagementCard, EngagementTimeline, EngagementTimelineStep, EyeIcon, EyeOffIcon, Eyebrow, FileChip, FileIcon, FileReturnIcon, FileTextIcon, FileTypeBadge, FileUpload, FilterChip, FilterIcon, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FolderTree, FolderUpIcon, FormError, FormSection, FormSuccess, GlobeIcon, GoogleBrandIcon, HelpCircleIcon, HistoryIcon, HomeIcon, HoverCard, HoverCardContent, HoverCardPortal, HoverCardTrigger, IconAction, IconTile, InboxIcon, InfoCircleSolidIcon, InfoIcon, Input, 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, 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, PenSignIcon, PenToolIcon, PencilIcon, PhoneCountryInput, PhoneIcon, PhoneInput, PlayIcon, PlusIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PrimaryAction, PriorityIcon, ProgressBar, ProgressRing, 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, Skeleton, SkeletonCircle, SkeletonText, SlashIcon, Slider, SmartphoneIcon, SparkleIcon, SparklesIcon, Spinner, StarIcon, StarRating, Stat, StatusDot, StatusIcon, StatusPill, Stepper, StickyActionBar, StopIcon, StrikethroughIcon, SubmitButton, SuiteProgress, SunIcon, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableIcon, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagIcon, 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, 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, useSidebarPeekLock, useSidebarState, useStopwatch, useToast, yearToIso };
11309
12914
  //# sourceMappingURL=index.js.map
11310
12915
  //# sourceMappingURL=index.js.map