@assure-one/design-system 1.1.0 → 1.2.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
2
  import * as React36 from 'react';
3
- import { forwardRef, useState, useCallback, useId, useRef, useImperativeHandle, useMemo, useEffect, createContext, useContext } 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';
@@ -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)",
@@ -2473,6 +2495,103 @@ var AlertDescription = forwardRef(function AlertDescription2({ className, ...pro
2473
2495
  return /* @__PURE__ */ jsx("p", { ref, className: cn("text-sm", className), ...props });
2474
2496
  });
2475
2497
  AlertDescription.displayName = "AlertDescription";
2498
+ var defaultFormat = (n) => n.toLocaleString();
2499
+ var AreaChart = forwardRef(function AreaChart2({ data, height = 140, formatValue = defaultFormat, showAxis = true, className, ...props }, ref) {
2500
+ const gradientId = useId();
2501
+ const wrapRef = useRef(null);
2502
+ const [width, setWidth] = useState(620);
2503
+ const [hover, setHover] = useState(null);
2504
+ useEffect(() => {
2505
+ const el = wrapRef.current;
2506
+ if (!el) return;
2507
+ const ro = new ResizeObserver((entries) => {
2508
+ for (const entry of entries) setWidth(entry.contentRect.width);
2509
+ });
2510
+ ro.observe(el);
2511
+ return () => ro.disconnect();
2512
+ }, []);
2513
+ const padX = 10;
2514
+ const padTop = 14;
2515
+ const padBot = 8;
2516
+ const max = Math.max(...data.map((d) => d.value), 1) * 1.15;
2517
+ const step = data.length > 1 ? (width - padX * 2) / (data.length - 1) : 0;
2518
+ const pts = data.map(
2519
+ (d, i) => [padX + i * step, height - padBot - d.value / max * (height - padTop - padBot)]
2520
+ );
2521
+ const line = pts.map((p, i) => `${i ? "L" : "M"}${p[0].toFixed(1)} ${p[1].toFixed(1)}`).join(" ");
2522
+ const area = pts.length > 0 ? `${line} L${pts[pts.length - 1][0].toFixed(1)} ${height} L${pts[0][0].toFixed(1)} ${height} Z` : "";
2523
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn("w-full", className), ...props, children: [
2524
+ /* @__PURE__ */ jsxs("div", { ref: wrapRef, className: "relative w-full", children: [
2525
+ /* @__PURE__ */ jsxs(
2526
+ "svg",
2527
+ {
2528
+ width,
2529
+ height,
2530
+ viewBox: `0 0 ${width} ${height}`,
2531
+ role: "img",
2532
+ "aria-label": "Area trend chart",
2533
+ onMouseLeave: () => setHover(null),
2534
+ children: [
2535
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [
2536
+ /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: "var(--color-chart-area-from)" }),
2537
+ /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: "var(--color-chart-area-to)" })
2538
+ ] }) }),
2539
+ area && /* @__PURE__ */ jsx("path", { d: area, fill: `url(#${gradientId})` }),
2540
+ line && /* @__PURE__ */ jsx(
2541
+ "path",
2542
+ {
2543
+ d: line,
2544
+ fill: "none",
2545
+ stroke: "var(--color-chart-line)",
2546
+ strokeWidth: "2.5",
2547
+ strokeLinecap: "round",
2548
+ strokeLinejoin: "round"
2549
+ }
2550
+ ),
2551
+ pts.map((p, i) => /* @__PURE__ */ jsxs("g", { children: [
2552
+ /* @__PURE__ */ jsx(
2553
+ "circle",
2554
+ {
2555
+ cx: p[0],
2556
+ cy: p[1],
2557
+ r: hover === i ? 5.5 : 4,
2558
+ fill: "var(--color-surface)",
2559
+ stroke: "var(--color-chart-line)",
2560
+ strokeWidth: "2.5",
2561
+ className: "transition-[r] duration-[var(--duration-instant)] ease-[var(--ease-out-quart)] motion-reduce:transition-none"
2562
+ }
2563
+ ),
2564
+ /* @__PURE__ */ jsx(
2565
+ "rect",
2566
+ {
2567
+ x: p[0] - (step || width) / 2,
2568
+ y: 0,
2569
+ width: step || width,
2570
+ height,
2571
+ fill: "transparent",
2572
+ onMouseEnter: () => setHover(i)
2573
+ }
2574
+ )
2575
+ ] }, i))
2576
+ ]
2577
+ }
2578
+ ),
2579
+ hover != null && pts[hover] && /* @__PURE__ */ jsxs(
2580
+ "div",
2581
+ {
2582
+ 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)]",
2583
+ style: { left: `${pts[hover][0] / width * 100}%` },
2584
+ children: [
2585
+ /* @__PURE__ */ jsx("span", { className: "block text-xs font-semibold tabular-nums", children: formatValue(data[hover].value) }),
2586
+ /* @__PURE__ */ jsx("span", { className: "block text-[10px] opacity-70", children: data[hover].label })
2587
+ ]
2588
+ }
2589
+ )
2590
+ ] }),
2591
+ 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)) })
2592
+ ] });
2593
+ });
2594
+ AreaChart.displayName = "AreaChart";
2476
2595
  var AspectRatio = React36.forwardRef(function AspectRatio2({ className, ratio = 16 / 9, ...props }, ref) {
2477
2596
  return /* @__PURE__ */ jsx(
2478
2597
  AspectRatioPrimitive.Root,
@@ -2794,7 +2913,7 @@ var Spinner = forwardRef(function Spinner2({ size, tone, label, className, ...pr
2794
2913
  Spinner.displayName = "Spinner";
2795
2914
  var buttonVariants = cva(
2796
2915
  cn(
2797
- "inline-flex items-center justify-center rounded-btn font-medium whitespace-nowrap",
2916
+ "inline-flex items-center justify-center rounded-btn font-medium whitespace-nowrap cursor-pointer",
2798
2917
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
2799
2918
  "focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)]",
2800
2919
  "disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-fg-disabled",
@@ -4511,6 +4630,123 @@ var DismissibleChip = React36.forwardRef(function DismissibleChip2({ label, onDi
4511
4630
  }
4512
4631
  );
4513
4632
  });
4633
+ var RAMP = [
4634
+ "var(--color-chart-1)",
4635
+ "var(--color-chart-2)",
4636
+ "var(--color-chart-3)",
4637
+ "var(--color-chart-4)"
4638
+ ];
4639
+ var DonutChart = forwardRef(function DonutChart2({
4640
+ segments,
4641
+ size = 132,
4642
+ strokeWidth = 16,
4643
+ centerLabel = "Total",
4644
+ center,
4645
+ legend = true,
4646
+ className,
4647
+ ...props
4648
+ }, ref) {
4649
+ const [hover, setHover] = useState(null);
4650
+ const titleId = useId();
4651
+ const total = segments.reduce((sum, s) => sum + s.value, 0) || 1;
4652
+ const radius = (size - strokeWidth) / 2;
4653
+ const circumference = 2 * Math.PI * radius;
4654
+ let acc = 0;
4655
+ const arcs = segments.map((s, i) => {
4656
+ const frac = s.value / total;
4657
+ const arc = {
4658
+ ...s,
4659
+ color: s.color ?? RAMP[i % RAMP.length],
4660
+ dash: frac * circumference,
4661
+ offset: acc * circumference
4662
+ };
4663
+ acc += frac;
4664
+ return arc;
4665
+ });
4666
+ const active = hover != null ? arcs[hover] : null;
4667
+ return /* @__PURE__ */ jsxs(
4668
+ "div",
4669
+ {
4670
+ ref,
4671
+ className: cn("flex items-center gap-6", className),
4672
+ role: "img",
4673
+ "aria-labelledby": titleId,
4674
+ ...props,
4675
+ children: [
4676
+ /* @__PURE__ */ jsxs("span", { id: titleId, className: "sr-only", children: [
4677
+ "Donut chart: ",
4678
+ arcs.map((a) => `${a.label} ${a.value}`).join(", ")
4679
+ ] }),
4680
+ /* @__PURE__ */ jsxs("div", { className: "relative shrink-0", style: { width: size, height: size }, children: [
4681
+ /* @__PURE__ */ jsxs("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, "aria-hidden": "true", children: [
4682
+ /* @__PURE__ */ jsx(
4683
+ "circle",
4684
+ {
4685
+ cx: size / 2,
4686
+ cy: size / 2,
4687
+ r: radius,
4688
+ fill: "none",
4689
+ stroke: "var(--color-bg-3)",
4690
+ strokeWidth
4691
+ }
4692
+ ),
4693
+ arcs.map((s, i) => /* @__PURE__ */ jsx(
4694
+ "circle",
4695
+ {
4696
+ cx: size / 2,
4697
+ cy: size / 2,
4698
+ r: radius,
4699
+ fill: "none",
4700
+ stroke: s.color,
4701
+ strokeWidth: hover === i ? strokeWidth + 3 : strokeWidth,
4702
+ strokeDasharray: `${s.dash} ${circumference - s.dash}`,
4703
+ strokeDashoffset: -s.offset,
4704
+ strokeLinecap: "butt",
4705
+ transform: `rotate(-90 ${size / 2} ${size / 2})`,
4706
+ className: "cursor-pointer transition-[stroke-width,opacity] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
4707
+ style: { opacity: hover != null && hover !== i ? 0.35 : 1 },
4708
+ onMouseEnter: () => setHover(i),
4709
+ onMouseLeave: () => setHover(null)
4710
+ },
4711
+ i
4712
+ ))
4713
+ ] }),
4714
+ /* @__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: [
4715
+ /* @__PURE__ */ jsx("span", { className: "text-fg text-2xl font-semibold tabular-nums", children: active ? active.value : total }),
4716
+ /* @__PURE__ */ jsx("span", { className: "text-fg-3 text-xs", children: active ? active.label : centerLabel })
4717
+ ] }) })
4718
+ ] }),
4719
+ 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(
4720
+ "button",
4721
+ {
4722
+ type: "button",
4723
+ onMouseEnter: () => setHover(i),
4724
+ onMouseLeave: () => setHover(null),
4725
+ onFocus: () => setHover(i),
4726
+ onBlur: () => setHover(null),
4727
+ className: cn(
4728
+ "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",
4729
+ hover === i ? "bg-bg-2" : "hover:bg-bg-2"
4730
+ ),
4731
+ children: [
4732
+ /* @__PURE__ */ jsx(
4733
+ "span",
4734
+ {
4735
+ "aria-hidden": "true",
4736
+ className: "size-2.5 shrink-0 rounded-[3px]",
4737
+ style: { background: s.color }
4738
+ }
4739
+ ),
4740
+ /* @__PURE__ */ jsx("span", { className: "text-fg-2 min-w-0 flex-1 truncate", children: s.label }),
4741
+ /* @__PURE__ */ jsx("span", { className: "text-fg tabular-nums", children: s.value })
4742
+ ]
4743
+ }
4744
+ ) }, i)) })
4745
+ ]
4746
+ }
4747
+ );
4748
+ });
4749
+ DonutChart.displayName = "DonutChart";
4514
4750
  var DropdownMenu = DropdownMenuPrimitive.Root;
4515
4751
  var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
4516
4752
  var DropdownMenuGroup = DropdownMenuPrimitive.Group;
@@ -4692,6 +4928,44 @@ var EmptyState = forwardRef(function EmptyState2({ icon, title, description, act
4692
4928
  );
4693
4929
  });
4694
4930
  EmptyState.displayName = "EmptyState";
4931
+ var kindTile = {
4932
+ doc: "bg-danger-bg text-danger-fg",
4933
+ sheet: "bg-success-bg text-success-fg",
4934
+ image: "bg-accent-tint text-accent",
4935
+ generic: "bg-bg-3 text-fg-3"
4936
+ };
4937
+ var FileChip = forwardRef(function FileChip2({ name, meta, kind = "doc", icon, action, className, ...props }, ref) {
4938
+ return /* @__PURE__ */ jsxs(
4939
+ "div",
4940
+ {
4941
+ ref,
4942
+ className: cn(
4943
+ "border-rule bg-surface flex items-center gap-3 rounded-[var(--radius-input)] border p-2.5",
4944
+ className
4945
+ ),
4946
+ ...props,
4947
+ children: [
4948
+ /* @__PURE__ */ jsx(
4949
+ "span",
4950
+ {
4951
+ "aria-hidden": "true",
4952
+ className: cn(
4953
+ "flex size-9 shrink-0 items-center justify-center rounded-[var(--radius-icon)] [&_svg]:size-4.5",
4954
+ kindTile[kind]
4955
+ ),
4956
+ children: icon ?? /* @__PURE__ */ jsx(FileTextIcon, {})
4957
+ }
4958
+ ),
4959
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
4960
+ /* @__PURE__ */ jsx("p", { className: "text-fg truncate text-sm font-medium", children: name }),
4961
+ meta != null && /* @__PURE__ */ jsx("p", { className: "text-fg-3 truncate text-xs", children: meta })
4962
+ ] }),
4963
+ action && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: action })
4964
+ ]
4965
+ }
4966
+ );
4967
+ });
4968
+ FileChip.displayName = "FileChip";
4695
4969
  function FileUpload({
4696
4970
  accept,
4697
4971
  maxSize,
@@ -6273,6 +6547,56 @@ var RadioGroupItem = React36.forwardRef(function RadioGroupItem2({ className, la
6273
6547
  ] });
6274
6548
  });
6275
6549
  RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
6550
+ var RAMP2 = [
6551
+ "var(--color-chart-1)",
6552
+ "var(--color-chart-2)",
6553
+ "var(--color-chart-3)",
6554
+ "var(--color-chart-4)"
6555
+ ];
6556
+ var RankedBars = forwardRef(function RankedBars2({ items, className, ...props }, ref) {
6557
+ return /* @__PURE__ */ jsx("ul", { ref, className: cn("flex flex-col gap-4", className), ...props, children: items.map((bar, i) => {
6558
+ const up = (bar.change ?? 0) >= 0;
6559
+ const ChangeIcon = up ? TrendingUpIcon : TrendingDownIcon;
6560
+ return /* @__PURE__ */ jsxs("li", { className: "flex flex-col gap-1.5", children: [
6561
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [
6562
+ /* @__PURE__ */ jsx("span", { className: "text-fg-2 text-sm font-medium", children: bar.label }),
6563
+ bar.value != null && /* @__PURE__ */ jsx("span", { className: "text-fg text-sm font-semibold tabular-nums", children: bar.value })
6564
+ ] }),
6565
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
6566
+ /* @__PURE__ */ jsx("div", { className: "bg-bg-3 h-2 flex-1 overflow-hidden rounded-full", children: /* @__PURE__ */ jsx(
6567
+ "div",
6568
+ {
6569
+ className: "h-full rounded-full transition-[width] duration-[var(--duration-slow)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
6570
+ style: {
6571
+ width: `${Math.min(100, Math.max(0, bar.pct))}%`,
6572
+ background: bar.color ?? RAMP2[i % RAMP2.length]
6573
+ }
6574
+ }
6575
+ ) }),
6576
+ bar.change != null && /* @__PURE__ */ jsxs(
6577
+ "span",
6578
+ {
6579
+ className: cn(
6580
+ "inline-flex shrink-0 items-center gap-0.5 text-xs font-semibold tabular-nums",
6581
+ up ? "text-success-fg" : "text-danger-fg"
6582
+ ),
6583
+ children: [
6584
+ /* @__PURE__ */ jsx(ChangeIcon, { className: "size-3", "aria-hidden": "true" }),
6585
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
6586
+ up ? "Up" : "Down",
6587
+ " "
6588
+ ] }),
6589
+ Math.abs(bar.change),
6590
+ "%"
6591
+ ]
6592
+ }
6593
+ )
6594
+ ] }),
6595
+ bar.sublabel != null && /* @__PURE__ */ jsx("span", { className: "text-fg-3 text-xs", children: bar.sublabel })
6596
+ ] }, i);
6597
+ }) });
6598
+ });
6599
+ RankedBars.displayName = "RankedBars";
6276
6600
  var ScrollArea = React36.forwardRef(function ScrollArea2({ className, children, ...props }, ref) {
6277
6601
  return /* @__PURE__ */ jsxs(
6278
6602
  ScrollAreaPrimitive.Root,
@@ -6957,6 +7281,45 @@ var SectionHead = forwardRef(function SectionHead2({ eyebrow, title, meta, class
6957
7281
  );
6958
7282
  });
6959
7283
  SectionHead.displayName = "SectionHead";
7284
+ var toneFill = {
7285
+ default: "var(--color-pro-fg)",
7286
+ success: "var(--color-success-fg)",
7287
+ warning: "var(--color-warning-fg)",
7288
+ destructive: "var(--color-danger-fg)",
7289
+ info: "var(--color-accent)",
7290
+ tax: "var(--color-service-tax)",
7291
+ audit: "var(--color-service-audit)",
7292
+ accounting: "var(--color-service-accounting)"
7293
+ };
7294
+ var SegmentedProgress = forwardRef(
7295
+ function SegmentedProgress2({ steps, current, tone = "default", thickness = 6, label, className, style, ...props }, ref) {
7296
+ const filled = Math.min(steps, Math.max(0, current));
7297
+ return /* @__PURE__ */ jsx(
7298
+ "div",
7299
+ {
7300
+ ref,
7301
+ role: "progressbar",
7302
+ "aria-valuenow": filled,
7303
+ "aria-valuemin": 0,
7304
+ "aria-valuemax": steps,
7305
+ "aria-label": label ?? `Step ${filled} of ${steps}`,
7306
+ className: cn("flex w-full items-center gap-1", className),
7307
+ style: { height: thickness, ...style },
7308
+ ...props,
7309
+ children: Array.from({ length: steps }, (_, i) => /* @__PURE__ */ jsx(
7310
+ "span",
7311
+ {
7312
+ "aria-hidden": "true",
7313
+ className: "h-full flex-1 rounded-full transition-colors duration-[var(--duration-normal)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7314
+ style: { background: i < filled ? toneFill[tone] : "var(--color-bg-3)" }
7315
+ },
7316
+ i
7317
+ ))
7318
+ }
7319
+ );
7320
+ }
7321
+ );
7322
+ SegmentedProgress.displayName = "SegmentedProgress";
6960
7323
  var Separator4 = React36.forwardRef(function Separator5({ className, orientation = "horizontal", decorative = true, ...props }, ref) {
6961
7324
  return /* @__PURE__ */ jsx(
6962
7325
  SeparatorPrimitive.Root,
@@ -7478,6 +7841,25 @@ function StatusIcon({
7478
7841
  }
7479
7842
  );
7480
7843
  }
7844
+ var statusMap = {
7845
+ requested: { variant: "warning", label: "Requested" },
7846
+ "in-review": { variant: "info", label: "In review" },
7847
+ "needs-revision": { variant: "destructive", label: "Needs revision" },
7848
+ accepted: { variant: "success", label: "Accepted" },
7849
+ signed: { variant: "success", label: "Signed" },
7850
+ approved: { variant: "success", label: "Approved" },
7851
+ paid: { variant: "success", label: "Paid" },
7852
+ complete: { variant: "success", label: "Complete" },
7853
+ draft: { variant: "secondary", label: "Draft" },
7854
+ pending: { variant: "secondary", label: "Pending" },
7855
+ overdue: { variant: "destructive", label: "Overdue" },
7856
+ declined: { variant: "destructive", label: "Declined" }
7857
+ };
7858
+ var StatusPill = forwardRef(function StatusPill2({ status, dot = true, children, ...props }, ref) {
7859
+ const { variant, label } = statusMap[status];
7860
+ return /* @__PURE__ */ jsx(Badge, { ref, variant, dot, ...props, children: children ?? label });
7861
+ });
7862
+ StatusPill.displayName = "StatusPill";
7481
7863
  var Stepper = forwardRef(function Stepper2({ steps, currentStep, orientation = "horizontal", className, ...props }, ref) {
7482
7864
  const isVertical = orientation === "vertical";
7483
7865
  return /* @__PURE__ */ jsx(
@@ -7668,7 +8050,7 @@ var Table = forwardRef(function Table2({ className, wrapperClassName, ...props }
7668
8050
  "div",
7669
8051
  {
7670
8052
  className: cn(
7671
- "rounded-card border-rule bg-surface w-full overflow-x-auto border",
8053
+ "rounded-card border-rule-strong bg-surface w-full overflow-x-auto border shadow-quiet",
7672
8054
  wrapperClassName
7673
8055
  ),
7674
8056
  children: /* @__PURE__ */ jsx(
@@ -7733,10 +8115,11 @@ var TableHead = forwardRef(function TableHead2({ className, ...props }, ref) {
7733
8115
  {
7734
8116
  ref,
7735
8117
  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",
8118
+ // Sentence-case column labels in the body font (Plus Jakarta Sans),
8119
+ // quiet gray — not mono uppercase eyebrows.
8120
+ "h-11 px-4 py-2.5 text-left align-middle whitespace-nowrap",
8121
+ "font-sans text-[14px] font-medium tracking-normal normal-case",
8122
+ "text-fg-3 bg-surface-2",
7740
8123
  "border-rule border-b",
7741
8124
  "[&:has([role=checkbox])]:pr-0",
7742
8125
  className
@@ -7752,8 +8135,9 @@ var TableCell = forwardRef(function TableCell2({ className, ...props }, ref) {
7752
8135
  {
7753
8136
  ref,
7754
8137
  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",
8138
+ // 13px, fg-2, soft 1px row divider, tabular nums; airier vertical
8139
+ // rhythm (py-3) for the taller rows in the catalog layout.
8140
+ "text-fg-2 px-4 py-3 align-middle text-[13px] tabular-nums",
7757
8141
  "[&:has([role=checkbox])]:pr-0",
7758
8142
  className
7759
8143
  ),
@@ -7779,7 +8163,7 @@ var TabsList = React36.forwardRef(function TabsList2({ className, ...props }, re
7779
8163
  TabsPrimitive.List,
7780
8164
  {
7781
8165
  ref,
7782
- className: cn("border-rule inline-flex items-center gap-0 border-b", className),
8166
+ className: cn("border-rule flex items-center gap-0 border-b", className),
7783
8167
  ...props
7784
8168
  }
7785
8169
  );
@@ -8245,6 +8629,637 @@ var VisuallyHidden = forwardRef(
8245
8629
  }
8246
8630
  );
8247
8631
  VisuallyHidden.displayName = "VisuallyHidden";
8632
+ function AiSpark({ size = 16, className }) {
8633
+ const id = useId();
8634
+ return /* @__PURE__ */ jsxs(
8635
+ "svg",
8636
+ {
8637
+ width: size,
8638
+ height: size * 12 / 16,
8639
+ viewBox: "0 0 16 12",
8640
+ fill: "none",
8641
+ className: cn("block shrink-0", className),
8642
+ "aria-hidden": "true",
8643
+ children: [
8644
+ /* @__PURE__ */ jsx(
8645
+ "path",
8646
+ {
8647
+ 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",
8648
+ fill: `url(#${id})`
8649
+ }
8650
+ ),
8651
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs(
8652
+ "linearGradient",
8653
+ {
8654
+ id,
8655
+ x1: "0.265576",
8656
+ y1: "0.856805",
8657
+ x2: "13.5",
8658
+ y2: "12",
8659
+ gradientUnits: "userSpaceOnUse",
8660
+ children: [
8661
+ /* @__PURE__ */ jsx("stop", { stopColor: "#9E32FF" }),
8662
+ /* @__PURE__ */ jsx("stop", { offset: "1", stopColor: "#1BB6FF" })
8663
+ ]
8664
+ }
8665
+ ) })
8666
+ ]
8667
+ }
8668
+ );
8669
+ }
8670
+ function Field({ label, value, confirmed }) {
8671
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5", children: [
8672
+ /* @__PURE__ */ jsx("span", { className: "text-fg-3 text-[11px]", children: label }),
8673
+ /* @__PURE__ */ jsxs("span", { className: "text-fg inline-flex items-center gap-1 text-sm font-medium", children: [
8674
+ value,
8675
+ confirmed && /* @__PURE__ */ jsx(CheckIcon, { className: "text-success-fg size-3", strokeWidth: 3 })
8676
+ ] })
8677
+ ] });
8678
+ }
8679
+ var AIReceiptPanel = forwardRef(function AIReceiptPanel2({ state = "idle", result, onAttach, onRemove, onViewFile, className, ...props }, ref) {
8680
+ if (state === "reading") {
8681
+ return /* @__PURE__ */ jsxs(
8682
+ "div",
8683
+ {
8684
+ ref,
8685
+ role: "status",
8686
+ "aria-live": "polite",
8687
+ className: cn(
8688
+ "border-rule bg-surface-2 flex items-center gap-3 rounded-[var(--radius-input)] border p-3",
8689
+ className
8690
+ ),
8691
+ ...props,
8692
+ children: [
8693
+ /* @__PURE__ */ jsx(AiSpark, { size: 18, className: "motion-safe:animate-pulse" }),
8694
+ /* @__PURE__ */ jsxs("div", { children: [
8695
+ /* @__PURE__ */ jsx("p", { className: "text-fg text-sm font-medium", children: "Reading your receipt\u2026" }),
8696
+ /* @__PURE__ */ jsx("p", { className: "text-fg-3 text-xs", children: "Pulling the vendor, amount and a suggested category." })
8697
+ ] })
8698
+ ]
8699
+ }
8700
+ );
8701
+ }
8702
+ if (state === "done" && result) {
8703
+ return /* @__PURE__ */ jsxs(
8704
+ "div",
8705
+ {
8706
+ ref,
8707
+ className: cn(
8708
+ "border-rule bg-surface-2 flex flex-col gap-3 rounded-[var(--radius-input)] border p-3",
8709
+ className
8710
+ ),
8711
+ ...props,
8712
+ children: [
8713
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
8714
+ /* @__PURE__ */ jsxs("span", { className: "text-fg-2 inline-flex items-center gap-1.5 text-xs font-semibold", children: [
8715
+ /* @__PURE__ */ jsx(AiSpark, { size: 14 }),
8716
+ " Auto-filled from receipt"
8717
+ ] }),
8718
+ onRemove && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: onRemove, children: "Remove" })
8719
+ ] }),
8720
+ /* @__PURE__ */ jsx(
8721
+ FileChip,
8722
+ {
8723
+ name: result.file.name,
8724
+ meta: result.file.meta,
8725
+ className: "bg-surface",
8726
+ action: onViewFile && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: onViewFile, children: "View" })
8727
+ }
8728
+ ),
8729
+ /* @__PURE__ */ jsxs("div", { className: "border-rule grid grid-cols-3 gap-3 border-t pt-3", children: [
8730
+ /* @__PURE__ */ jsx(Field, { label: "Vendor", value: result.vendor }),
8731
+ /* @__PURE__ */ jsx(Field, { label: "Amount", value: result.amount, confirmed: true }),
8732
+ /* @__PURE__ */ jsx(Field, { label: "Date", value: result.date, confirmed: true })
8733
+ ] })
8734
+ ]
8735
+ }
8736
+ );
8737
+ }
8738
+ return /* @__PURE__ */ jsxs(
8739
+ "button",
8740
+ {
8741
+ ref,
8742
+ type: "button",
8743
+ onClick: onAttach,
8744
+ className: cn(
8745
+ "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",
8746
+ className
8747
+ ),
8748
+ ...props,
8749
+ children: [
8750
+ /* @__PURE__ */ jsx(AiSpark, { size: 19 }),
8751
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
8752
+ /* @__PURE__ */ jsx("span", { className: "text-fg block text-sm font-medium", children: "Attach receipt \u2014 auto-fill with AI" }),
8753
+ /* @__PURE__ */ jsx("span", { className: "text-fg-3 block text-xs", children: "We'll read the vendor, amount & suggest a category" })
8754
+ ] }),
8755
+ /* @__PURE__ */ jsx(UploadIcon, { className: "text-fg-3 size-4.5 shrink-0", "aria-hidden": "true" })
8756
+ ]
8757
+ }
8758
+ );
8759
+ });
8760
+ AIReceiptPanel.displayName = "AIReceiptPanel";
8761
+
8762
+ // src/lib/service-tone.ts
8763
+ var toneToken = {
8764
+ tax: { fill: "var(--color-service-tax)", bg: "var(--color-service-tax-bg)" },
8765
+ audit: { fill: "var(--color-service-audit)", bg: "var(--color-service-audit-bg)" },
8766
+ accounting: {
8767
+ fill: "var(--color-service-accounting)",
8768
+ bg: "var(--color-service-accounting-bg)"
8769
+ },
8770
+ neutral: { fill: "var(--color-pro-fg)", bg: "var(--color-pro-bg)" }
8771
+ };
8772
+ function serviceToneStyle(tone) {
8773
+ const { fill, bg } = toneToken[tone];
8774
+ return { "--tone": fill, "--tone-bg": bg };
8775
+ }
8776
+ var SERVICE_TONES = ["tax", "audit", "accounting", "neutral"];
8777
+ var serviceToneLabel = {
8778
+ tax: "Tax",
8779
+ audit: "Audit",
8780
+ accounting: "Accounting",
8781
+ neutral: "General"
8782
+ };
8783
+ var urgencyTile = {
8784
+ default: "[background:var(--tone-bg)] [color:var(--tone)]",
8785
+ warning: "bg-warning-bg text-warning-fg",
8786
+ danger: "bg-danger-bg text-danger-fg"
8787
+ };
8788
+ var AttentionItem = forwardRef(function AttentionItem2({ icon, title, description, tone = "neutral", urgency = "default", action, onClick, className, style, ...props }, ref) {
8789
+ const interactive = Boolean(onClick);
8790
+ const body = /* @__PURE__ */ jsxs(Fragment, { children: [
8791
+ /* @__PURE__ */ jsx(
8792
+ "span",
8793
+ {
8794
+ "aria-hidden": "true",
8795
+ className: cn(
8796
+ "flex size-9 shrink-0 items-center justify-center rounded-[var(--radius-input)] [&_svg]:size-4.5",
8797
+ urgencyTile[urgency]
8798
+ ),
8799
+ children: icon
8800
+ }
8801
+ ),
8802
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
8803
+ /* @__PURE__ */ jsx("p", { className: "text-fg text-sm font-medium", children: title }),
8804
+ description != null && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-0.5 text-xs", children: description })
8805
+ ] }),
8806
+ action ?? (interactive && /* @__PURE__ */ jsx(ArrowRightIcon, { className: "text-fg-4 size-4 shrink-0 self-center", "aria-hidden": "true" }))
8807
+ ] });
8808
+ const rootClass = cn(
8809
+ "border-rule bg-surface flex items-start gap-3 rounded-[var(--radius-input)] border p-3 text-left",
8810
+ 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",
8811
+ className
8812
+ );
8813
+ const rootStyle = { ...serviceToneStyle(tone), ...style };
8814
+ if (interactive) {
8815
+ return /* @__PURE__ */ jsx(
8816
+ "button",
8817
+ {
8818
+ ref,
8819
+ type: "button",
8820
+ onClick,
8821
+ className: rootClass,
8822
+ style: rootStyle,
8823
+ ...props,
8824
+ children: body
8825
+ }
8826
+ );
8827
+ }
8828
+ return /* @__PURE__ */ jsx("div", { ref, className: rootClass, style: rootStyle, ...props, children: body });
8829
+ });
8830
+ AttentionItem.displayName = "AttentionItem";
8831
+ var BottomNav = forwardRef(function BottomNav2({ tabs, value, onChange, className, ...props }, ref) {
8832
+ return /* @__PURE__ */ jsx(
8833
+ "nav",
8834
+ {
8835
+ ref,
8836
+ "aria-label": "Primary",
8837
+ className: cn(
8838
+ "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",
8839
+ className
8840
+ ),
8841
+ ...props,
8842
+ children: tabs.map((tab) => {
8843
+ const active = tab.id === value;
8844
+ return /* @__PURE__ */ jsxs(
8845
+ "button",
8846
+ {
8847
+ type: "button",
8848
+ "aria-current": active ? "page" : void 0,
8849
+ onClick: () => onChange(tab.id),
8850
+ className: cn(
8851
+ "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",
8852
+ active ? "text-pro-fg" : "text-fg-4 hover:text-fg-2"
8853
+ ),
8854
+ children: [
8855
+ /* @__PURE__ */ jsxs("span", { className: "relative [&_svg]:size-5", children: [
8856
+ tab.icon,
8857
+ tab.badge != null && tab.badge !== false && /* @__PURE__ */ jsx(
8858
+ "span",
8859
+ {
8860
+ className: cn(
8861
+ "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",
8862
+ tab.badge === true && "size-2 min-w-0 px-0"
8863
+ ),
8864
+ children: typeof tab.badge === "number" ? tab.badge : null
8865
+ }
8866
+ )
8867
+ ] }),
8868
+ /* @__PURE__ */ jsx("span", { className: "max-w-full truncate", children: tab.label })
8869
+ ]
8870
+ },
8871
+ tab.id
8872
+ );
8873
+ })
8874
+ }
8875
+ );
8876
+ });
8877
+ BottomNav.displayName = "BottomNav";
8878
+ function readOrder(storageKey) {
8879
+ if (!storageKey || typeof window === "undefined") return null;
8880
+ try {
8881
+ const raw = window.localStorage.getItem(storageKey);
8882
+ return raw ? JSON.parse(raw) : null;
8883
+ } catch {
8884
+ return null;
8885
+ }
8886
+ }
8887
+ var colsClass = {
8888
+ 2: "lg:grid-cols-2",
8889
+ 3: "lg:grid-cols-3",
8890
+ 4: "lg:grid-cols-4"
8891
+ };
8892
+ var spanClass = {
8893
+ 1: "",
8894
+ 2: "lg:col-span-2",
8895
+ 3: "lg:col-span-3"
8896
+ };
8897
+ var DashGrid = forwardRef(function DashGrid2({ widgets, storageKey, onReorder, columns = 3, className, ...props }, ref) {
8898
+ const [order, setOrder] = useState(() => {
8899
+ const stored = readOrder(storageKey);
8900
+ const ids = widgets.map((w) => w.id);
8901
+ if (!stored) return ids;
8902
+ const kept = stored.filter((id) => ids.includes(id));
8903
+ const added = ids.filter((id) => !kept.includes(id));
8904
+ return [...kept, ...added];
8905
+ });
8906
+ const [dragId, setDragId] = useState(null);
8907
+ const [overId, setOverId] = useState(null);
8908
+ const commit = (next) => {
8909
+ setOrder(next);
8910
+ onReorder?.(next);
8911
+ if (storageKey && typeof window !== "undefined") {
8912
+ try {
8913
+ window.localStorage.setItem(storageKey, JSON.stringify(next));
8914
+ } catch {
8915
+ }
8916
+ }
8917
+ };
8918
+ const move = (from, to) => {
8919
+ if (from === to) return;
8920
+ const next = [...order];
8921
+ const fromIdx = next.indexOf(from);
8922
+ const toIdx = next.indexOf(to);
8923
+ if (fromIdx < 0 || toIdx < 0) return;
8924
+ next.splice(toIdx, 0, next.splice(fromIdx, 1)[0]);
8925
+ commit(next);
8926
+ };
8927
+ const byId = new Map(widgets.map((w) => [w.id, w]));
8928
+ const ordered = order.map((id) => byId.get(id)).filter(Boolean);
8929
+ return /* @__PURE__ */ jsx(
8930
+ "div",
8931
+ {
8932
+ ref,
8933
+ suppressHydrationWarning: true,
8934
+ className: cn("grid grid-cols-1 gap-4 sm:grid-cols-2", colsClass[columns], className),
8935
+ ...props,
8936
+ children: ordered.map((widget) => {
8937
+ const isDragging = dragId === widget.id;
8938
+ const isOver = overId === widget.id && dragId !== widget.id;
8939
+ return (
8940
+ // The wrapper is an HTML5 drag DROP target: onDragOver/onDrop carry
8941
+ // no click semantics and aren't keyboard-reachable by design — the
8942
+ // grab handle below is the focusable control. Pointer reordering is
8943
+ // an enhancement (same precedent as the sidebar hover-peek); there
8944
+ // is intentionally no keyboard analogue on the drop zone itself.
8945
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
8946
+ /* @__PURE__ */ jsxs(
8947
+ "div",
8948
+ {
8949
+ className: cn(
8950
+ "group/dash relative transition-[opacity,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
8951
+ spanClass[widget.span ?? 1],
8952
+ isDragging && "opacity-40",
8953
+ isOver && "rounded-card [box-shadow:var(--shadow-focus-ring)]"
8954
+ ),
8955
+ onDragOver: (e) => {
8956
+ if (!dragId) return;
8957
+ e.preventDefault();
8958
+ setOverId(widget.id);
8959
+ },
8960
+ onDrop: (e) => {
8961
+ e.preventDefault();
8962
+ if (dragId) move(dragId, widget.id);
8963
+ setDragId(null);
8964
+ setOverId(null);
8965
+ },
8966
+ children: [
8967
+ /* @__PURE__ */ jsx(
8968
+ "button",
8969
+ {
8970
+ type: "button",
8971
+ "aria-label": `Reorder widget`,
8972
+ draggable: true,
8973
+ onDragStart: (e) => {
8974
+ setDragId(widget.id);
8975
+ e.dataTransfer.effectAllowed = "move";
8976
+ },
8977
+ onDragEnd: () => {
8978
+ setDragId(null);
8979
+ setOverId(null);
8980
+ },
8981
+ 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",
8982
+ 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)) })
8983
+ }
8984
+ ),
8985
+ widget.content
8986
+ ]
8987
+ },
8988
+ widget.id
8989
+ )
8990
+ );
8991
+ })
8992
+ }
8993
+ );
8994
+ });
8995
+ DashGrid.displayName = "DashGrid";
8996
+ var toneToSegment = {
8997
+ tax: "tax",
8998
+ audit: "audit",
8999
+ accounting: "accounting",
9000
+ neutral: "default"
9001
+ };
9002
+ var EngagementCard = forwardRef(function EngagementCard2({
9003
+ service,
9004
+ serviceIcon,
9005
+ tone = "neutral",
9006
+ title,
9007
+ status,
9008
+ current,
9009
+ steps,
9010
+ stepLabel,
9011
+ eta,
9012
+ ring,
9013
+ onOpen,
9014
+ className,
9015
+ style,
9016
+ ...props
9017
+ }, ref) {
9018
+ const pct = steps > 0 ? Math.round(current / steps * 100) : 0;
9019
+ const interactive = Boolean(onOpen);
9020
+ const body = /* @__PURE__ */ jsxs(Fragment, { children: [
9021
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
9022
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5 text-sm font-semibold [color:var(--tone)] [&_svg]:size-[15px]", children: [
9023
+ serviceIcon,
9024
+ service
9025
+ ] }),
9026
+ status
9027
+ ] }),
9028
+ /* @__PURE__ */ jsx("p", { className: "text-fg mt-2 text-base leading-snug font-medium", children: title }),
9029
+ stepLabel != null && /* @__PURE__ */ jsxs("p", { className: "text-fg-3 mt-1 text-xs", children: [
9030
+ stepLabel,
9031
+ " \xB7 Step ",
9032
+ current,
9033
+ " of ",
9034
+ steps
9035
+ ] }),
9036
+ ring ? /* @__PURE__ */ jsxs("div", { className: "mt-3 flex items-center gap-3", children: [
9037
+ /* @__PURE__ */ jsx(
9038
+ ProgressRing,
9039
+ {
9040
+ value: pct,
9041
+ size: 52,
9042
+ strokeWidth: 6,
9043
+ label: `${pct}%`,
9044
+ className: "[&_circle:last-child]:[stroke:var(--tone)]"
9045
+ }
9046
+ ),
9047
+ /* @__PURE__ */ jsx("span", { className: "text-fg-3 text-xs", children: "complete" })
9048
+ ] }) : /* @__PURE__ */ jsxs("div", { className: "mt-3 flex items-center gap-3", children: [
9049
+ /* @__PURE__ */ jsx(SegmentedProgress, { steps, current, tone: toneToSegment[tone] }),
9050
+ /* @__PURE__ */ jsxs("span", { className: "shrink-0 text-sm font-semibold tabular-nums [color:var(--tone)]", children: [
9051
+ pct,
9052
+ /* @__PURE__ */ jsx("span", { className: "text-fg-4 text-xs font-normal", children: "%" })
9053
+ ] })
9054
+ ] }),
9055
+ /* @__PURE__ */ jsxs("div", { className: "border-rule-soft mt-3 flex items-center justify-between gap-2 border-t pt-3", children: [
9056
+ eta != null && /* @__PURE__ */ jsxs("span", { className: "text-fg-3 inline-flex items-center gap-1.5 text-xs [&_svg]:size-3.5", children: [
9057
+ /* @__PURE__ */ jsx(CalendarIcon, { "aria-hidden": "true" }),
9058
+ eta
9059
+ ] }),
9060
+ interactive && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-xs font-medium [color:var(--tone)] [&_svg]:size-3.5", children: [
9061
+ "Open ",
9062
+ /* @__PURE__ */ jsx(ArrowRightIcon, { "aria-hidden": "true" })
9063
+ ] })
9064
+ ] })
9065
+ ] });
9066
+ const rootClass = cn(
9067
+ "border-rule bg-surface block w-full rounded-card border p-4 text-left shadow-quiet",
9068
+ 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",
9069
+ className
9070
+ );
9071
+ const rootStyle = { ...serviceToneStyle(tone), ...style };
9072
+ if (interactive) {
9073
+ return /* @__PURE__ */ jsx(
9074
+ "button",
9075
+ {
9076
+ ref,
9077
+ type: "button",
9078
+ onClick: onOpen,
9079
+ className: rootClass,
9080
+ style: rootStyle,
9081
+ ...props,
9082
+ children: body
9083
+ }
9084
+ );
9085
+ }
9086
+ return /* @__PURE__ */ jsx("div", { ref, className: rootClass, style: rootStyle, ...props, children: body });
9087
+ });
9088
+ EngagementCard.displayName = "EngagementCard";
9089
+ var EngagementTimeline = forwardRef(
9090
+ function EngagementTimeline2({ tone = "neutral", className, style, children, ...props }, ref) {
9091
+ return /* @__PURE__ */ jsx(
9092
+ "ol",
9093
+ {
9094
+ ref,
9095
+ className: cn("flex flex-col", className),
9096
+ style: { ...serviceToneStyle(tone), ...style },
9097
+ ...props,
9098
+ children
9099
+ }
9100
+ );
9101
+ }
9102
+ );
9103
+ EngagementTimeline.displayName = "EngagementTimeline";
9104
+ var stateBadge = {
9105
+ done: { label: "Done", className: "text-success-fg" },
9106
+ active: { label: "In progress", className: "[color:var(--tone)]" },
9107
+ todo: { label: "Upcoming", className: "text-fg-4" }
9108
+ };
9109
+ var EngagementTimelineStep = forwardRef(
9110
+ function EngagementTimelineStep2({ state, name, index, note, date, actions, last, className, ...props }, ref) {
9111
+ const badge = stateBadge[state];
9112
+ return /* @__PURE__ */ jsxs("li", { ref, className: cn("flex gap-3", className), ...props, children: [
9113
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
9114
+ /* @__PURE__ */ jsx(
9115
+ "span",
9116
+ {
9117
+ "aria-hidden": "true",
9118
+ className: cn(
9119
+ "flex size-7 shrink-0 items-center justify-center rounded-full text-xs font-semibold tabular-nums",
9120
+ state === "done" && "bg-success-fg text-fg-on-success",
9121
+ state === "active" && "bg-surface border-2 [border-color:var(--tone)] [color:var(--tone)]",
9122
+ state === "todo" && "bg-bg-3 text-fg-4"
9123
+ ),
9124
+ children: state === "done" ? /* @__PURE__ */ jsx(CheckIcon, { className: "size-4", strokeWidth: 3 }) : index
9125
+ }
9126
+ ),
9127
+ !last && /* @__PURE__ */ jsx(
9128
+ "span",
9129
+ {
9130
+ "aria-hidden": "true",
9131
+ className: cn("w-0.5 flex-1", state === "done" ? "bg-success-line" : "bg-rule")
9132
+ }
9133
+ )
9134
+ ] }),
9135
+ /* @__PURE__ */ jsxs("div", { className: cn("min-w-0 flex-1", last ? "pb-0" : "pb-6"), children: [
9136
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
9137
+ /* @__PURE__ */ jsx(
9138
+ "span",
9139
+ {
9140
+ className: cn(
9141
+ "text-sm font-medium",
9142
+ state === "todo" ? "text-fg-3" : "text-fg"
9143
+ ),
9144
+ children: name
9145
+ }
9146
+ ),
9147
+ /* @__PURE__ */ jsx("span", { className: cn("shrink-0 text-[11px] font-semibold", badge.className), children: badge.label })
9148
+ ] }),
9149
+ note != null && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-0.5 text-xs", children: note }),
9150
+ state === "done" && date != null && /* @__PURE__ */ jsxs("p", { className: "text-success-fg mt-1 inline-flex items-center gap-1 text-[11px]", children: [
9151
+ /* @__PURE__ */ jsx(CheckIcon, { className: "size-3", strokeWidth: 3, "aria-hidden": "true" }),
9152
+ " Completed ",
9153
+ date
9154
+ ] }),
9155
+ state === "active" && actions && /* @__PURE__ */ jsx("div", { className: "mt-2 flex flex-wrap gap-2", children: actions })
9156
+ ] })
9157
+ ] });
9158
+ }
9159
+ );
9160
+ EngagementTimelineStep.displayName = "EngagementTimelineStep";
9161
+ var INDENT = 18;
9162
+ var FolderTree = forwardRef(function FolderTree2({ nodes, activeId, onSelect, defaultOpenIds, openIds, onOpenChange, className, ...props }, ref) {
9163
+ const isControlled = openIds !== void 0;
9164
+ const [internalOpen, setInternalOpen] = useState(() => new Set(defaultOpenIds ?? []));
9165
+ const open = isControlled ? new Set(openIds) : internalOpen;
9166
+ const toggle = (id) => {
9167
+ const next = new Set(open);
9168
+ if (next.has(id)) next.delete(id);
9169
+ else next.add(id);
9170
+ if (isControlled) onOpenChange?.([...next]);
9171
+ else {
9172
+ setInternalOpen(next);
9173
+ onOpenChange?.([...next]);
9174
+ }
9175
+ };
9176
+ const renderNode = (node, depth) => {
9177
+ const hasChildren = Boolean(node.children?.length);
9178
+ const isOpen = open.has(node.id);
9179
+ const isActive = activeId === node.id;
9180
+ return /* @__PURE__ */ jsxs("li", { children: [
9181
+ /* @__PURE__ */ jsxs(
9182
+ "div",
9183
+ {
9184
+ className: cn(
9185
+ "group/row flex items-stretch rounded-[var(--radius-icon)]",
9186
+ isActive ? "bg-pro-bg" : "hover:bg-bg-2"
9187
+ ),
9188
+ children: [
9189
+ /* @__PURE__ */ jsx(
9190
+ "button",
9191
+ {
9192
+ type: "button",
9193
+ "aria-expanded": hasChildren ? isOpen : void 0,
9194
+ "aria-label": isOpen ? `Collapse ${node.name}` : `Expand ${node.name}`,
9195
+ onClick: () => hasChildren && toggle(node.id),
9196
+ disabled: !hasChildren,
9197
+ className: "flex w-6 shrink-0 items-center justify-center self-stretch text-fg-4 disabled:opacity-0",
9198
+ style: { marginLeft: depth * INDENT },
9199
+ tabIndex: hasChildren ? 0 : -1,
9200
+ children: /* @__PURE__ */ jsx(
9201
+ ChevronRightIcon,
9202
+ {
9203
+ className: cn(
9204
+ "size-3.5 transition-transform duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
9205
+ isOpen && "rotate-90"
9206
+ ),
9207
+ "aria-hidden": "true"
9208
+ }
9209
+ )
9210
+ }
9211
+ ),
9212
+ /* @__PURE__ */ jsxs(
9213
+ "button",
9214
+ {
9215
+ type: "button",
9216
+ onClick: () => onSelect?.(node.id),
9217
+ "aria-current": isActive ? "true" : void 0,
9218
+ className: cn(
9219
+ "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)]",
9220
+ isActive ? "text-pro-fg font-medium" : "text-fg-2"
9221
+ ),
9222
+ children: [
9223
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "shrink-0 [&_svg]:size-4", children: isOpen && hasChildren ? /* @__PURE__ */ jsx(FolderOpenIcon, {}) : /* @__PURE__ */ jsx(FolderClosedIcon, {}) }),
9224
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: node.name }),
9225
+ node.count != null && /* @__PURE__ */ jsx("span", { className: "text-fg-4 shrink-0 text-xs tabular-nums", children: node.count })
9226
+ ]
9227
+ }
9228
+ )
9229
+ ]
9230
+ }
9231
+ ),
9232
+ hasChildren && isOpen && /* @__PURE__ */ jsx("ul", { className: "flex flex-col", children: node.children.map((child) => renderNode(child, depth + 1)) })
9233
+ ] }, node.id);
9234
+ };
9235
+ 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)) }) });
9236
+ });
9237
+ FolderTree.displayName = "FolderTree";
9238
+ function renderAction(action) {
9239
+ return /* @__PURE__ */ jsxs(DropdownMenuItem, { onSelect: action.onSelect, children: [
9240
+ action.icon && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-fg-3 [&_svg]:size-4", children: action.icon }),
9241
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-col", children: [
9242
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: action.label }),
9243
+ action.description && /* @__PURE__ */ jsx("span", { className: "text-fg-3 truncate text-xs", children: action.description })
9244
+ ] }),
9245
+ action.shortcut && /* @__PURE__ */ jsx(DropdownMenuShortcut, { children: action.shortcut })
9246
+ ] }, action.id);
9247
+ }
9248
+ var NewMenu = forwardRef(function NewMenu2({ actions, groups, triggerLabel = "New", trigger, align = "end" }, ref) {
9249
+ const sections = groups ?? (actions ? [{ actions }] : []);
9250
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
9251
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: trigger ?? /* @__PURE__ */ jsxs(Button, { ref, iconLeft: /* @__PURE__ */ jsx(PlusIcon, {}), children: [
9252
+ triggerLabel,
9253
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4 opacity-70" })
9254
+ ] }) }),
9255
+ /* @__PURE__ */ jsx(DropdownMenuContent, { align, className: "w-60", children: sections.map((section, i) => /* @__PURE__ */ jsxs("div", { children: [
9256
+ i > 0 && /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
9257
+ section.label && /* @__PURE__ */ jsx(DropdownMenuLabel, { children: section.label }),
9258
+ section.actions.map(renderAction)
9259
+ ] }, i)) })
9260
+ ] });
9261
+ });
9262
+ NewMenu.displayName = "NewMenu";
8248
9263
  var Shell = forwardRef(function Shell2({ className, ...props }, ref) {
8249
9264
  return /* @__PURE__ */ jsx("div", { ref, className: cn("bg-bg flex h-dvh w-full", className), ...props });
8250
9265
  });
@@ -9559,14 +10574,14 @@ var DataTable = forwardRef(function DataTable2({ withToolbar, className, childre
9559
10574
  "div",
9560
10575
  {
9561
10576
  ref,
10577
+ "data-with-toolbar": withToolbar ? "true" : void 0,
9562
10578
  className: cn(
9563
- "w-full",
9564
- // Surface card chrome on the descendant `<table>`.
10579
+ // Outer frame on the whole component: a single visible border +
10580
+ // quiet shadow wrapping the toolbar (if any) and the table as one
10581
+ // card. overflow-hidden clips the header/cell backgrounds to the
10582
+ // rounded corners.
10583
+ "w-full overflow-hidden rounded-card border border-rule-strong bg-surface shadow-quiet",
9565
10584
  "[&_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
10585
  className
9571
10586
  ),
9572
10587
  ...props,
@@ -9583,7 +10598,7 @@ var DataTableToolbar = forwardRef(
9583
10598
  ref,
9584
10599
  className: cn(
9585
10600
  "flex items-center gap-2 px-3 py-2.5",
9586
- "rounded-t-card border-rule bg-surface border",
10601
+ "border-rule bg-surface border-b",
9587
10602
  className
9588
10603
  ),
9589
10604
  ...props
@@ -9621,7 +10636,7 @@ var DataTableResultsCount = forwardRef(
9621
10636
  "span",
9622
10637
  {
9623
10638
  ref,
9624
- className: cn("text-fg-4 mr-1 font-mono text-[11px] tabular-nums", className),
10639
+ className: cn("text-fg-4 mr-1 font-sans text-[11px] tabular-nums", className),
9625
10640
  ...props,
9626
10641
  children: [
9627
10642
  current.toLocaleString(),
@@ -9706,9 +10721,9 @@ var DataTableHeader = forwardRef(
9706
10721
  scope: "col",
9707
10722
  "aria-sort": ariaSort,
9708
10723
  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",
10724
+ "h-11 px-4 py-2.5 text-left align-middle whitespace-nowrap",
10725
+ "font-sans text-[14px] font-medium tracking-normal normal-case",
10726
+ "text-fg-3 bg-surface-2",
9712
10727
  "border-rule border-b",
9713
10728
  "[&:has([role=checkbox])]:pr-0",
9714
10729
  className
@@ -9721,9 +10736,9 @@ var DataTableHeader = forwardRef(
9721
10736
  onClick: handleClick,
9722
10737
  className: cn(
9723
10738
  "-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",
10739
+ "font-sans text-[14px] font-medium tracking-normal normal-case",
10740
+ "text-fg-3 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
10741
+ "hover:text-fg",
9727
10742
  "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none"
9728
10743
  ),
9729
10744
  children: [
@@ -9737,7 +10752,7 @@ var DataTableHeader = forwardRef(
9737
10752
  }
9738
10753
  );
9739
10754
  DataTableHeader.displayName = "DataTableHeader";
9740
- var cellBase = "px-3.5 py-2.5 align-middle";
10755
+ var cellBase = "px-4 py-3 align-middle";
9741
10756
  var DataTableCell = forwardRef(
9742
10757
  function DataTableCell2({ className, ...props }, ref) {
9743
10758
  return /* @__PURE__ */ jsx(
@@ -9775,7 +10790,7 @@ var DataTableCellMono = forwardRef(
9775
10790
  "td",
9776
10791
  {
9777
10792
  ref,
9778
- className: cn(cellBase, "font-spec text-fg-2 text-[12.5px]", className),
10793
+ className: cn(cellBase, "font-sans text-fg-2 text-[13px] tabular-nums", className),
9779
10794
  style,
9780
10795
  ...props
9781
10796
  }
@@ -9789,7 +10804,7 @@ var DataTableCellId = forwardRef(
9789
10804
  "td",
9790
10805
  {
9791
10806
  ref,
9792
- className: cn(cellBase, "font-spec text-fg-4 text-xs", className),
10807
+ className: cn(cellBase, "font-sans text-fg-4 text-xs tabular-nums", className),
9793
10808
  style,
9794
10809
  ...props
9795
10810
  }
@@ -9814,7 +10829,7 @@ var DataTableCellDue = forwardRef(
9814
10829
  {
9815
10830
  ref,
9816
10831
  "data-due-state": ariaState,
9817
- className: cn(cellBase, "font-spec text-[12.5px]", tone, className),
10832
+ className: cn(cellBase, "font-sans text-[13px] tabular-nums", tone, className),
9818
10833
  style,
9819
10834
  ...props,
9820
10835
  children: children ?? dueDateFormatter.format(value)
@@ -9840,8 +10855,8 @@ var DataTableCheckbox = forwardRef(
9840
10855
  {
9841
10856
  ref,
9842
10857
  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",
10858
+ "w-8 px-4 py-3 pr-0 align-middle",
10859
+ asHeader && "bg-surface-2 border-rule h-11 border-b",
9845
10860
  className
9846
10861
  ),
9847
10862
  ...props,
@@ -11305,6 +12320,6 @@ var KbdHint = forwardRef(function KbdHint2({ className, children, ...props }, re
11305
12320
  });
11306
12321
  KbdHint.displayName = "KbdHint";
11307
12322
 
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 };
12323
+ 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, 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, 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, FileUpload, FilterChip, FilterIcon, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FolderTree, 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, NewMenu, 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, RankedBars, ReceiptIcon, ReplyIcon, RotateCcwIcon, 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, StatusIcon, StatusPill, 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, serviceToneLabel, serviceToneStyle, shadows, sidebarLinkBadgeVariants, spacing, spinnerVariants, starRatingVariants, surfaces, systemTokens, textareaVariants, typography, useSidebarPeekLock, useSidebarState, useStopwatch, useToast, yearToIso };
11309
12324
  //# sourceMappingURL=index.js.map
11310
12325
  //# sourceMappingURL=index.js.map