@assure-one/design-system 1.0.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';
@@ -25,6 +25,7 @@ import * as LabelPrimitive from '@radix-ui/react-label';
25
25
  import Link from 'next/link';
26
26
  import Image2 from 'next/image';
27
27
  import { OTPInput as OTPInput$1, REGEXP_ONLY_DIGITS } from 'input-otp';
28
+ import * as AllFlags from 'country-flag-icons/react/3x2';
28
29
  import * as ProgressPrimitive from '@radix-ui/react-progress';
29
30
  import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
30
31
  import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
@@ -90,9 +91,9 @@ var colors = {
90
91
  };
91
92
  var typography = {
92
93
  family: {
93
- display: '"Inter", -apple-system, system-ui, sans-serif',
94
- body: '"Inter", -apple-system, system-ui, sans-serif',
95
- 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'
96
97
  },
97
98
  weight: {
98
99
  regular: 400,
@@ -193,7 +194,7 @@ var systemTokens = {
193
194
  rule: "var(--color-rule)",
194
195
  ruleSoft: "var(--color-rule-soft)",
195
196
  ruleStrong: "var(--color-rule-strong)",
196
- /* Accent (cyan) */
197
+ /* Accent (purple) */
197
198
  accent: "var(--color-accent)",
198
199
  accent2: "var(--color-accent-2)",
199
200
  accentTint: "var(--color-accent-tint)",
@@ -228,8 +229,30 @@ var systemTokens = {
228
229
  warningLine: "var(--color-warning-line)",
229
230
  dangerFg: "var(--color-danger-fg)",
230
231
  dangerBg: "var(--color-danger-bg)",
231
- 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)"
232
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
+ ],
233
256
  gradient: {
234
257
  brand: "var(--gradient-brand)",
235
258
  pro: "var(--gradient-pro)",
@@ -2472,6 +2495,103 @@ var AlertDescription = forwardRef(function AlertDescription2({ className, ...pro
2472
2495
  return /* @__PURE__ */ jsx("p", { ref, className: cn("text-sm", className), ...props });
2473
2496
  });
2474
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";
2475
2595
  var AspectRatio = React36.forwardRef(function AspectRatio2({ className, ratio = 16 / 9, ...props }, ref) {
2476
2596
  return /* @__PURE__ */ jsx(
2477
2597
  AspectRatioPrimitive.Root,
@@ -2793,7 +2913,7 @@ var Spinner = forwardRef(function Spinner2({ size, tone, label, className, ...pr
2793
2913
  Spinner.displayName = "Spinner";
2794
2914
  var buttonVariants = cva(
2795
2915
  cn(
2796
- "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",
2797
2917
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
2798
2918
  "focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)]",
2799
2919
  "disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-fg-disabled",
@@ -4510,6 +4630,123 @@ var DismissibleChip = React36.forwardRef(function DismissibleChip2({ label, onDi
4510
4630
  }
4511
4631
  );
4512
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";
4513
4750
  var DropdownMenu = DropdownMenuPrimitive.Root;
4514
4751
  var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
4515
4752
  var DropdownMenuGroup = DropdownMenuPrimitive.Group;
@@ -4691,6 +4928,44 @@ var EmptyState = forwardRef(function EmptyState2({ icon, title, description, act
4691
4928
  );
4692
4929
  });
4693
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";
4694
4969
  function FileUpload({
4695
4970
  accept,
4696
4971
  maxSize,
@@ -5684,6 +5959,367 @@ var PhoneInput = forwardRef(function PhoneInput2({ value, defaultValue, onChange
5684
5959
  ] });
5685
5960
  });
5686
5961
  PhoneInput.displayName = "PhoneInput";
5962
+
5963
+ // src/lib/country-codes.ts
5964
+ var COUNTRY_CODES = [
5965
+ { iso: "US", name: "United States", dialCode: "+1" },
5966
+ { iso: "CA", name: "Canada", dialCode: "+1" },
5967
+ { iso: "GB", name: "United Kingdom", dialCode: "+44" },
5968
+ { iso: "AU", name: "Australia", dialCode: "+61" },
5969
+ { iso: "IN", name: "India", dialCode: "+91" },
5970
+ { iso: "AF", name: "Afghanistan", dialCode: "+93" },
5971
+ { iso: "AL", name: "Albania", dialCode: "+355" },
5972
+ { iso: "DZ", name: "Algeria", dialCode: "+213" },
5973
+ { iso: "AD", name: "Andorra", dialCode: "+376" },
5974
+ { iso: "AO", name: "Angola", dialCode: "+244" },
5975
+ { iso: "AG", name: "Antigua and Barbuda", dialCode: "+1268" },
5976
+ { iso: "AR", name: "Argentina", dialCode: "+54" },
5977
+ { iso: "AM", name: "Armenia", dialCode: "+374" },
5978
+ { iso: "AT", name: "Austria", dialCode: "+43" },
5979
+ { iso: "AZ", name: "Azerbaijan", dialCode: "+994" },
5980
+ { iso: "BS", name: "Bahamas", dialCode: "+1242" },
5981
+ { iso: "BH", name: "Bahrain", dialCode: "+973" },
5982
+ { iso: "BD", name: "Bangladesh", dialCode: "+880" },
5983
+ { iso: "BB", name: "Barbados", dialCode: "+1246" },
5984
+ { iso: "BY", name: "Belarus", dialCode: "+375" },
5985
+ { iso: "BE", name: "Belgium", dialCode: "+32" },
5986
+ { iso: "BZ", name: "Belize", dialCode: "+501" },
5987
+ { iso: "BJ", name: "Benin", dialCode: "+229" },
5988
+ { iso: "BT", name: "Bhutan", dialCode: "+975" },
5989
+ { iso: "BO", name: "Bolivia", dialCode: "+591" },
5990
+ { iso: "BA", name: "Bosnia and Herzegovina", dialCode: "+387" },
5991
+ { iso: "BW", name: "Botswana", dialCode: "+267" },
5992
+ { iso: "BR", name: "Brazil", dialCode: "+55" },
5993
+ { iso: "BN", name: "Brunei", dialCode: "+673" },
5994
+ { iso: "BG", name: "Bulgaria", dialCode: "+359" },
5995
+ { iso: "BF", name: "Burkina Faso", dialCode: "+226" },
5996
+ { iso: "BI", name: "Burundi", dialCode: "+257" },
5997
+ { iso: "KH", name: "Cambodia", dialCode: "+855" },
5998
+ { iso: "CM", name: "Cameroon", dialCode: "+237" },
5999
+ { iso: "CV", name: "Cape Verde", dialCode: "+238" },
6000
+ { iso: "CF", name: "Central African Republic", dialCode: "+236" },
6001
+ { iso: "TD", name: "Chad", dialCode: "+235" },
6002
+ { iso: "CL", name: "Chile", dialCode: "+56" },
6003
+ { iso: "CN", name: "China", dialCode: "+86" },
6004
+ { iso: "CO", name: "Colombia", dialCode: "+57" },
6005
+ { iso: "KM", name: "Comoros", dialCode: "+269" },
6006
+ { iso: "CG", name: "Congo", dialCode: "+242" },
6007
+ { iso: "CD", name: "Congo, DR", dialCode: "+243" },
6008
+ { iso: "CR", name: "Costa Rica", dialCode: "+506" },
6009
+ { iso: "HR", name: "Croatia", dialCode: "+385" },
6010
+ { iso: "CU", name: "Cuba", dialCode: "+53" },
6011
+ { iso: "CY", name: "Cyprus", dialCode: "+357" },
6012
+ { iso: "CZ", name: "Czech Republic", dialCode: "+420" },
6013
+ { iso: "DK", name: "Denmark", dialCode: "+45" },
6014
+ { iso: "DJ", name: "Djibouti", dialCode: "+253" },
6015
+ { iso: "DM", name: "Dominica", dialCode: "+1767" },
6016
+ { iso: "DO", name: "Dominican Republic", dialCode: "+1809" },
6017
+ { iso: "EC", name: "Ecuador", dialCode: "+593" },
6018
+ { iso: "EG", name: "Egypt", dialCode: "+20" },
6019
+ { iso: "SV", name: "El Salvador", dialCode: "+503" },
6020
+ { iso: "GQ", name: "Equatorial Guinea", dialCode: "+240" },
6021
+ { iso: "ER", name: "Eritrea", dialCode: "+291" },
6022
+ { iso: "EE", name: "Estonia", dialCode: "+372" },
6023
+ { iso: "SZ", name: "Eswatini", dialCode: "+268" },
6024
+ { iso: "ET", name: "Ethiopia", dialCode: "+251" },
6025
+ { iso: "FJ", name: "Fiji", dialCode: "+679" },
6026
+ { iso: "FI", name: "Finland", dialCode: "+358" },
6027
+ { iso: "FR", name: "France", dialCode: "+33" },
6028
+ { iso: "GA", name: "Gabon", dialCode: "+241" },
6029
+ { iso: "GM", name: "Gambia", dialCode: "+220" },
6030
+ { iso: "GE", name: "Georgia", dialCode: "+995" },
6031
+ { iso: "DE", name: "Germany", dialCode: "+49" },
6032
+ { iso: "GH", name: "Ghana", dialCode: "+233" },
6033
+ { iso: "GR", name: "Greece", dialCode: "+30" },
6034
+ { iso: "GD", name: "Grenada", dialCode: "+1473" },
6035
+ { iso: "GT", name: "Guatemala", dialCode: "+502" },
6036
+ { iso: "GN", name: "Guinea", dialCode: "+224" },
6037
+ { iso: "GW", name: "Guinea-Bissau", dialCode: "+245" },
6038
+ { iso: "GY", name: "Guyana", dialCode: "+592" },
6039
+ { iso: "HT", name: "Haiti", dialCode: "+509" },
6040
+ { iso: "HN", name: "Honduras", dialCode: "+504" },
6041
+ { iso: "HK", name: "Hong Kong", dialCode: "+852" },
6042
+ { iso: "HU", name: "Hungary", dialCode: "+36" },
6043
+ { iso: "IS", name: "Iceland", dialCode: "+354" },
6044
+ { iso: "ID", name: "Indonesia", dialCode: "+62" },
6045
+ { iso: "IR", name: "Iran", dialCode: "+98" },
6046
+ { iso: "IQ", name: "Iraq", dialCode: "+964" },
6047
+ { iso: "IE", name: "Ireland", dialCode: "+353" },
6048
+ { iso: "IL", name: "Israel", dialCode: "+972" },
6049
+ { iso: "IT", name: "Italy", dialCode: "+39" },
6050
+ { iso: "CI", name: "Ivory Coast", dialCode: "+225" },
6051
+ { iso: "JM", name: "Jamaica", dialCode: "+1876" },
6052
+ { iso: "JP", name: "Japan", dialCode: "+81" },
6053
+ { iso: "JO", name: "Jordan", dialCode: "+962" },
6054
+ { iso: "KZ", name: "Kazakhstan", dialCode: "+7" },
6055
+ { iso: "KE", name: "Kenya", dialCode: "+254" },
6056
+ { iso: "KI", name: "Kiribati", dialCode: "+686" },
6057
+ { iso: "KW", name: "Kuwait", dialCode: "+965" },
6058
+ { iso: "KG", name: "Kyrgyzstan", dialCode: "+996" },
6059
+ { iso: "LA", name: "Laos", dialCode: "+856" },
6060
+ { iso: "LV", name: "Latvia", dialCode: "+371" },
6061
+ { iso: "LB", name: "Lebanon", dialCode: "+961" },
6062
+ { iso: "LS", name: "Lesotho", dialCode: "+266" },
6063
+ { iso: "LR", name: "Liberia", dialCode: "+231" },
6064
+ { iso: "LY", name: "Libya", dialCode: "+218" },
6065
+ { iso: "LI", name: "Liechtenstein", dialCode: "+423" },
6066
+ { iso: "LT", name: "Lithuania", dialCode: "+370" },
6067
+ { iso: "LU", name: "Luxembourg", dialCode: "+352" },
6068
+ { iso: "MO", name: "Macau", dialCode: "+853" },
6069
+ { iso: "MG", name: "Madagascar", dialCode: "+261" },
6070
+ { iso: "MW", name: "Malawi", dialCode: "+265" },
6071
+ { iso: "MY", name: "Malaysia", dialCode: "+60" },
6072
+ { iso: "MV", name: "Maldives", dialCode: "+960" },
6073
+ { iso: "ML", name: "Mali", dialCode: "+223" },
6074
+ { iso: "MT", name: "Malta", dialCode: "+356" },
6075
+ { iso: "MH", name: "Marshall Islands", dialCode: "+692" },
6076
+ { iso: "MR", name: "Mauritania", dialCode: "+222" },
6077
+ { iso: "MU", name: "Mauritius", dialCode: "+230" },
6078
+ { iso: "MX", name: "Mexico", dialCode: "+52" },
6079
+ { iso: "FM", name: "Micronesia", dialCode: "+691" },
6080
+ { iso: "MD", name: "Moldova", dialCode: "+373" },
6081
+ { iso: "MC", name: "Monaco", dialCode: "+377" },
6082
+ { iso: "MN", name: "Mongolia", dialCode: "+976" },
6083
+ { iso: "ME", name: "Montenegro", dialCode: "+382" },
6084
+ { iso: "MA", name: "Morocco", dialCode: "+212" },
6085
+ { iso: "MZ", name: "Mozambique", dialCode: "+258" },
6086
+ { iso: "MM", name: "Myanmar", dialCode: "+95" },
6087
+ { iso: "NA", name: "Namibia", dialCode: "+264" },
6088
+ { iso: "NR", name: "Nauru", dialCode: "+674" },
6089
+ { iso: "NP", name: "Nepal", dialCode: "+977" },
6090
+ { iso: "NL", name: "Netherlands", dialCode: "+31" },
6091
+ { iso: "NZ", name: "New Zealand", dialCode: "+64" },
6092
+ { iso: "NI", name: "Nicaragua", dialCode: "+505" },
6093
+ { iso: "NE", name: "Niger", dialCode: "+227" },
6094
+ { iso: "NG", name: "Nigeria", dialCode: "+234" },
6095
+ { iso: "KP", name: "North Korea", dialCode: "+850" },
6096
+ { iso: "MK", name: "North Macedonia", dialCode: "+389" },
6097
+ { iso: "NO", name: "Norway", dialCode: "+47" },
6098
+ { iso: "OM", name: "Oman", dialCode: "+968" },
6099
+ { iso: "PK", name: "Pakistan", dialCode: "+92" },
6100
+ { iso: "PW", name: "Palau", dialCode: "+680" },
6101
+ { iso: "PS", name: "Palestine", dialCode: "+970" },
6102
+ { iso: "PA", name: "Panama", dialCode: "+507" },
6103
+ { iso: "PG", name: "Papua New Guinea", dialCode: "+675" },
6104
+ { iso: "PY", name: "Paraguay", dialCode: "+595" },
6105
+ { iso: "PE", name: "Peru", dialCode: "+51" },
6106
+ { iso: "PH", name: "Philippines", dialCode: "+63" },
6107
+ { iso: "PL", name: "Poland", dialCode: "+48" },
6108
+ { iso: "PT", name: "Portugal", dialCode: "+351" },
6109
+ { iso: "PR", name: "Puerto Rico", dialCode: "+1787" },
6110
+ { iso: "QA", name: "Qatar", dialCode: "+974" },
6111
+ { iso: "RO", name: "Romania", dialCode: "+40" },
6112
+ { iso: "RU", name: "Russia", dialCode: "+7" },
6113
+ { iso: "RW", name: "Rwanda", dialCode: "+250" },
6114
+ { iso: "KN", name: "Saint Kitts and Nevis", dialCode: "+1869" },
6115
+ { iso: "LC", name: "Saint Lucia", dialCode: "+1758" },
6116
+ { iso: "VC", name: "Saint Vincent", dialCode: "+1784" },
6117
+ { iso: "WS", name: "Samoa", dialCode: "+685" },
6118
+ { iso: "SM", name: "San Marino", dialCode: "+378" },
6119
+ { iso: "ST", name: "Sao Tome and Principe", dialCode: "+239" },
6120
+ { iso: "SA", name: "Saudi Arabia", dialCode: "+966" },
6121
+ { iso: "SN", name: "Senegal", dialCode: "+221" },
6122
+ { iso: "RS", name: "Serbia", dialCode: "+381" },
6123
+ { iso: "SC", name: "Seychelles", dialCode: "+248" },
6124
+ { iso: "SL", name: "Sierra Leone", dialCode: "+232" },
6125
+ { iso: "SG", name: "Singapore", dialCode: "+65" },
6126
+ { iso: "SK", name: "Slovakia", dialCode: "+421" },
6127
+ { iso: "SI", name: "Slovenia", dialCode: "+386" },
6128
+ { iso: "SB", name: "Solomon Islands", dialCode: "+677" },
6129
+ { iso: "SO", name: "Somalia", dialCode: "+252" },
6130
+ { iso: "ZA", name: "South Africa", dialCode: "+27" },
6131
+ { iso: "KR", name: "South Korea", dialCode: "+82" },
6132
+ { iso: "SS", name: "South Sudan", dialCode: "+211" },
6133
+ { iso: "ES", name: "Spain", dialCode: "+34" },
6134
+ { iso: "LK", name: "Sri Lanka", dialCode: "+94" },
6135
+ { iso: "SD", name: "Sudan", dialCode: "+249" },
6136
+ { iso: "SR", name: "Suriname", dialCode: "+597" },
6137
+ { iso: "SE", name: "Sweden", dialCode: "+46" },
6138
+ { iso: "CH", name: "Switzerland", dialCode: "+41" },
6139
+ { iso: "SY", name: "Syria", dialCode: "+963" },
6140
+ { iso: "TW", name: "Taiwan", dialCode: "+886" },
6141
+ { iso: "TJ", name: "Tajikistan", dialCode: "+992" },
6142
+ { iso: "TZ", name: "Tanzania", dialCode: "+255" },
6143
+ { iso: "TH", name: "Thailand", dialCode: "+66" },
6144
+ { iso: "TL", name: "Timor-Leste", dialCode: "+670" },
6145
+ { iso: "TG", name: "Togo", dialCode: "+228" },
6146
+ { iso: "TO", name: "Tonga", dialCode: "+676" },
6147
+ { iso: "TT", name: "Trinidad and Tobago", dialCode: "+1868" },
6148
+ { iso: "TN", name: "Tunisia", dialCode: "+216" },
6149
+ { iso: "TR", name: "Turkey", dialCode: "+90" },
6150
+ { iso: "TM", name: "Turkmenistan", dialCode: "+993" },
6151
+ { iso: "TV", name: "Tuvalu", dialCode: "+688" },
6152
+ { iso: "UG", name: "Uganda", dialCode: "+256" },
6153
+ { iso: "UA", name: "Ukraine", dialCode: "+380" },
6154
+ { iso: "AE", name: "United Arab Emirates", dialCode: "+971" },
6155
+ { iso: "UY", name: "Uruguay", dialCode: "+598" },
6156
+ { iso: "UZ", name: "Uzbekistan", dialCode: "+998" },
6157
+ { iso: "VU", name: "Vanuatu", dialCode: "+678" },
6158
+ { iso: "VE", name: "Venezuela", dialCode: "+58" },
6159
+ { iso: "VN", name: "Vietnam", dialCode: "+84" },
6160
+ { iso: "YE", name: "Yemen", dialCode: "+967" },
6161
+ { iso: "ZM", name: "Zambia", dialCode: "+260" },
6162
+ { iso: "ZW", name: "Zimbabwe", dialCode: "+263" }
6163
+ ];
6164
+ function getFlagEmoji(iso) {
6165
+ return iso.toUpperCase().split("").map((c) => String.fromCodePoint(127456 + c.charCodeAt(0) - 65)).join("");
6166
+ }
6167
+ function parsePhoneForEditing(phone) {
6168
+ if (!phone || !phone.startsWith("+")) {
6169
+ return { iso: "US", localPhone: phone };
6170
+ }
6171
+ const sorted = [...COUNTRY_CODES].sort((a, b) => b.dialCode.length - a.dialCode.length);
6172
+ for (const c of sorted) {
6173
+ if (phone.startsWith(c.dialCode)) {
6174
+ return { iso: c.iso, localPhone: phone.slice(c.dialCode.length).trimStart() };
6175
+ }
6176
+ }
6177
+ return { iso: "US", localPhone: phone };
6178
+ }
6179
+ function CountryFlag({ iso }) {
6180
+ const Flag = AllFlags[iso];
6181
+ if (!Flag) return /* @__PURE__ */ jsx("span", { className: "text-[10px] font-mono", children: iso });
6182
+ return /* @__PURE__ */ jsx(Flag, { style: { width: 20, height: 14, borderRadius: 2, display: "block", flexShrink: 0 } });
6183
+ }
6184
+ function CountrySelect({
6185
+ value,
6186
+ onChange,
6187
+ disabled
6188
+ }) {
6189
+ const [open, setOpen] = useState(false);
6190
+ const [search, setSearch] = useState("");
6191
+ const searchRef = useRef(null);
6192
+ const selected = COUNTRY_CODES.find((c) => c.iso === value) ?? COUNTRY_CODES[0];
6193
+ const filtered = useMemo(() => {
6194
+ const q = search.toLowerCase();
6195
+ if (!q) return COUNTRY_CODES;
6196
+ return COUNTRY_CODES.filter(
6197
+ (c) => c.name.toLowerCase().includes(q) || c.dialCode.includes(q) || c.iso.toLowerCase().includes(q)
6198
+ );
6199
+ }, [search]);
6200
+ return /* @__PURE__ */ jsxs(
6201
+ PopoverPrimitive.Root,
6202
+ {
6203
+ modal: true,
6204
+ open,
6205
+ onOpenChange: (next) => {
6206
+ setOpen(next);
6207
+ if (!next) setSearch("");
6208
+ },
6209
+ children: [
6210
+ /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
6211
+ "button",
6212
+ {
6213
+ type: "button",
6214
+ disabled,
6215
+ "aria-label": "Select country code",
6216
+ className: "flex h-10 w-[90px] shrink-0 items-center gap-1.5 rounded-lg border border-input bg-input-background px-2.5 text-sm text-foreground focus-visible:outline-none focus-visible:[box-shadow:var(--shadow-focus-ring)] disabled:cursor-not-allowed disabled:opacity-50",
6217
+ children: [
6218
+ /* @__PURE__ */ jsx(CountryFlag, { iso: selected.iso }),
6219
+ /* @__PURE__ */ jsx("span", { className: "text-xs tabular-nums text-muted-foreground", children: selected.dialCode }),
6220
+ /* @__PURE__ */ jsx("svg", { className: "ml-auto size-3 shrink-0 text-muted-foreground", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }) })
6221
+ ]
6222
+ }
6223
+ ) }),
6224
+ /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
6225
+ PopoverPrimitive.Content,
6226
+ {
6227
+ side: "bottom",
6228
+ align: "start",
6229
+ sideOffset: 4,
6230
+ style: { zIndex: 9999, minWidth: 248 },
6231
+ className: "rounded-xl border border-border bg-popover shadow-xl outline-none",
6232
+ onOpenAutoFocus: (e) => {
6233
+ e.preventDefault();
6234
+ searchRef.current?.focus({ preventScroll: true });
6235
+ },
6236
+ onCloseAutoFocus: (e) => e.preventDefault(),
6237
+ onKeyDown: (e) => {
6238
+ if (e.key !== "Escape") e.stopPropagation();
6239
+ },
6240
+ children: [
6241
+ /* @__PURE__ */ jsx("div", { className: "rounded-t-xl border-b border-border px-3 py-2.5", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 rounded-lg border border-input bg-input-background px-2.5", children: [
6242
+ /* @__PURE__ */ jsxs("svg", { className: "size-3.5 shrink-0 text-muted-foreground", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [
6243
+ /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "8" }),
6244
+ /* @__PURE__ */ jsx("path", { d: "m21 21-4.35-4.35" })
6245
+ ] }),
6246
+ /* @__PURE__ */ jsx(
6247
+ "input",
6248
+ {
6249
+ ref: searchRef,
6250
+ value: search,
6251
+ onChange: (e) => setSearch(e.target.value),
6252
+ onKeyDown: (e) => e.stopPropagation(),
6253
+ placeholder: "Search country or code...",
6254
+ className: "h-8 flex-1 bg-transparent text-xs text-foreground placeholder:text-muted-foreground focus:outline-none"
6255
+ }
6256
+ )
6257
+ ] }) }),
6258
+ /* @__PURE__ */ jsx(
6259
+ "div",
6260
+ {
6261
+ className: "max-h-56 overflow-y-auto rounded-b-xl",
6262
+ style: { overscrollBehavior: "contain" },
6263
+ onWheel: (e) => e.stopPropagation(),
6264
+ children: filtered.length === 0 ? /* @__PURE__ */ jsx("p", { className: "px-4 py-3 text-center text-xs text-muted-foreground", children: "No countries found" }) : filtered.map((c) => /* @__PURE__ */ jsxs(
6265
+ "button",
6266
+ {
6267
+ type: "button",
6268
+ onMouseDown: (e) => e.preventDefault(),
6269
+ onClick: () => {
6270
+ onChange(c.iso);
6271
+ setOpen(false);
6272
+ setSearch("");
6273
+ },
6274
+ className: cn(
6275
+ "flex w-full items-center gap-3 px-3 py-2 text-left transition-colors hover:bg-muted/60",
6276
+ c.iso === value && "bg-primary/5"
6277
+ ),
6278
+ children: [
6279
+ /* @__PURE__ */ jsx(CountryFlag, { iso: c.iso }),
6280
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-xs text-foreground", children: c.name }),
6281
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs tabular-nums text-muted-foreground", children: c.dialCode })
6282
+ ]
6283
+ },
6284
+ c.iso
6285
+ ))
6286
+ }
6287
+ )
6288
+ ]
6289
+ }
6290
+ ) })
6291
+ ]
6292
+ }
6293
+ );
6294
+ }
6295
+ function PhoneCountryInput({
6296
+ countryIso,
6297
+ localPhone,
6298
+ onCountryChange,
6299
+ onPhoneChange,
6300
+ placeholder,
6301
+ error,
6302
+ disabled,
6303
+ id
6304
+ }) {
6305
+ return /* @__PURE__ */ jsxs("div", { children: [
6306
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-1.5", children: [
6307
+ /* @__PURE__ */ jsx(CountrySelect, { value: countryIso, onChange: onCountryChange, disabled }),
6308
+ /* @__PURE__ */ jsx(
6309
+ Input,
6310
+ {
6311
+ id,
6312
+ value: localPhone,
6313
+ onChange: (e) => onPhoneChange(e.target.value),
6314
+ placeholder: placeholder ?? "(555) 555-0100",
6315
+ disabled,
6316
+ className: "flex-1"
6317
+ }
6318
+ )
6319
+ ] }),
6320
+ error && /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-destructive", children: error })
6321
+ ] });
6322
+ }
5687
6323
  var BARS = [
5688
6324
  { x: 1.5, y: 9, height: 5 },
5689
6325
  // bar 1 (shortest)
@@ -5911,6 +6547,56 @@ var RadioGroupItem = React36.forwardRef(function RadioGroupItem2({ className, la
5911
6547
  ] });
5912
6548
  });
5913
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";
5914
6600
  var ScrollArea = React36.forwardRef(function ScrollArea2({ className, children, ...props }, ref) {
5915
6601
  return /* @__PURE__ */ jsxs(
5916
6602
  ScrollAreaPrimitive.Root,
@@ -6595,6 +7281,45 @@ var SectionHead = forwardRef(function SectionHead2({ eyebrow, title, meta, class
6595
7281
  );
6596
7282
  });
6597
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";
6598
7323
  var Separator4 = React36.forwardRef(function Separator5({ className, orientation = "horizontal", decorative = true, ...props }, ref) {
6599
7324
  return /* @__PURE__ */ jsx(
6600
7325
  SeparatorPrimitive.Root,
@@ -7116,6 +7841,25 @@ function StatusIcon({
7116
7841
  }
7117
7842
  );
7118
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";
7119
7863
  var Stepper = forwardRef(function Stepper2({ steps, currentStep, orientation = "horizontal", className, ...props }, ref) {
7120
7864
  const isVertical = orientation === "vertical";
7121
7865
  return /* @__PURE__ */ jsx(
@@ -7306,7 +8050,7 @@ var Table = forwardRef(function Table2({ className, wrapperClassName, ...props }
7306
8050
  "div",
7307
8051
  {
7308
8052
  className: cn(
7309
- "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",
7310
8054
  wrapperClassName
7311
8055
  ),
7312
8056
  children: /* @__PURE__ */ jsx(
@@ -7371,10 +8115,11 @@ var TableHead = forwardRef(function TableHead2({ className, ...props }, ref) {
7371
8115
  {
7372
8116
  ref,
7373
8117
  className: cn(
7374
- // .data-table th — mono, 10px, uppercase, tight tracking 0.12em
7375
- "h-9 px-3.5 py-2 text-left align-middle whitespace-nowrap",
7376
- "font-mono text-[10px] font-medium tracking-[0.12em] uppercase",
7377
- "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",
7378
8123
  "border-rule border-b",
7379
8124
  "[&:has([role=checkbox])]:pr-0",
7380
8125
  className
@@ -7390,8 +8135,9 @@ var TableCell = forwardRef(function TableCell2({ className, ...props }, ref) {
7390
8135
  {
7391
8136
  ref,
7392
8137
  className: cn(
7393
- // .data-table td — 13px, fg-2, soft 1px row divider, tabular nums
7394
- "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",
7395
8141
  "[&:has([role=checkbox])]:pr-0",
7396
8142
  className
7397
8143
  ),
@@ -7417,7 +8163,7 @@ var TabsList = React36.forwardRef(function TabsList2({ className, ...props }, re
7417
8163
  TabsPrimitive.List,
7418
8164
  {
7419
8165
  ref,
7420
- 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),
7421
8167
  ...props
7422
8168
  }
7423
8169
  );
@@ -7883,6 +8629,637 @@ var VisuallyHidden = forwardRef(
7883
8629
  }
7884
8630
  );
7885
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";
7886
9263
  var Shell = forwardRef(function Shell2({ className, ...props }, ref) {
7887
9264
  return /* @__PURE__ */ jsx("div", { ref, className: cn("bg-bg flex h-dvh w-full", className), ...props });
7888
9265
  });
@@ -7898,7 +9275,7 @@ var Main = forwardRef(function Main2({ className, ...props }, ref) {
7898
9275
  );
7899
9276
  });
7900
9277
  Main.displayName = "Main";
7901
- var Content15 = forwardRef(function Content16({ padTop, padBottom, className, style, ...props }, ref) {
9278
+ var Content16 = forwardRef(function Content17({ padTop, padBottom, className, style, ...props }, ref) {
7902
9279
  const paddingStyle = padTop || padBottom ? {
7903
9280
  ...padTop ? { paddingTop: padTop } : null,
7904
9281
  ...padBottom ? { paddingBottom: padBottom } : null,
@@ -7917,7 +9294,7 @@ var Content15 = forwardRef(function Content16({ padTop, padBottom, className, st
7917
9294
  }
7918
9295
  );
7919
9296
  });
7920
- Content15.displayName = "Content";
9297
+ Content16.displayName = "Content";
7921
9298
  var SidebarContext = React36.createContext(null);
7922
9299
  var NOOP_CONTEXT = {
7923
9300
  state: "expanded",
@@ -9197,14 +10574,14 @@ var DataTable = forwardRef(function DataTable2({ withToolbar, className, childre
9197
10574
  "div",
9198
10575
  {
9199
10576
  ref,
10577
+ "data-with-toolbar": withToolbar ? "true" : void 0,
9200
10578
  className: cn(
9201
- "w-full",
9202
- // 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",
9203
10584
  "[&_table]:bg-surface [&_table]:w-full [&_table]:border-collapse",
9204
- "[&_table]:border-rule [&_table]:border",
9205
- withToolbar ? "[&_table]:rounded-b-card [&_table]:border-t-0" : "[&_table]:rounded-card",
9206
- // Clip cell backgrounds at the rounded corners.
9207
- "[&_table]:overflow-hidden",
9208
10585
  className
9209
10586
  ),
9210
10587
  ...props,
@@ -9221,7 +10598,7 @@ var DataTableToolbar = forwardRef(
9221
10598
  ref,
9222
10599
  className: cn(
9223
10600
  "flex items-center gap-2 px-3 py-2.5",
9224
- "rounded-t-card border-rule bg-surface border",
10601
+ "border-rule bg-surface border-b",
9225
10602
  className
9226
10603
  ),
9227
10604
  ...props
@@ -9259,7 +10636,7 @@ var DataTableResultsCount = forwardRef(
9259
10636
  "span",
9260
10637
  {
9261
10638
  ref,
9262
- 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),
9263
10640
  ...props,
9264
10641
  children: [
9265
10642
  current.toLocaleString(),
@@ -9344,9 +10721,9 @@ var DataTableHeader = forwardRef(
9344
10721
  scope: "col",
9345
10722
  "aria-sort": ariaSort,
9346
10723
  className: cn(
9347
- "h-9 px-3.5 py-2 text-left align-middle whitespace-nowrap",
9348
- "font-mono text-[10px] font-medium tracking-[0.12em] uppercase",
9349
- "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",
9350
10727
  "border-rule border-b",
9351
10728
  "[&:has([role=checkbox])]:pr-0",
9352
10729
  className
@@ -9359,9 +10736,9 @@ var DataTableHeader = forwardRef(
9359
10736
  onClick: handleClick,
9360
10737
  className: cn(
9361
10738
  "-mx-1 -my-1 inline-flex items-center gap-1 rounded-[4px] px-1 py-1",
9362
- "font-mono text-[10px] font-medium tracking-[0.12em] uppercase",
9363
- "text-fg-4 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
9364
- "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",
9365
10742
  "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none"
9366
10743
  ),
9367
10744
  children: [
@@ -9375,7 +10752,7 @@ var DataTableHeader = forwardRef(
9375
10752
  }
9376
10753
  );
9377
10754
  DataTableHeader.displayName = "DataTableHeader";
9378
- var cellBase = "px-3.5 py-2.5 align-middle";
10755
+ var cellBase = "px-4 py-3 align-middle";
9379
10756
  var DataTableCell = forwardRef(
9380
10757
  function DataTableCell2({ className, ...props }, ref) {
9381
10758
  return /* @__PURE__ */ jsx(
@@ -9413,7 +10790,7 @@ var DataTableCellMono = forwardRef(
9413
10790
  "td",
9414
10791
  {
9415
10792
  ref,
9416
- 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),
9417
10794
  style,
9418
10795
  ...props
9419
10796
  }
@@ -9427,7 +10804,7 @@ var DataTableCellId = forwardRef(
9427
10804
  "td",
9428
10805
  {
9429
10806
  ref,
9430
- 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),
9431
10808
  style,
9432
10809
  ...props
9433
10810
  }
@@ -9452,7 +10829,7 @@ var DataTableCellDue = forwardRef(
9452
10829
  {
9453
10830
  ref,
9454
10831
  "data-due-state": ariaState,
9455
- className: cn(cellBase, "font-spec text-[12.5px]", tone, className),
10832
+ className: cn(cellBase, "font-sans text-[13px] tabular-nums", tone, className),
9456
10833
  style,
9457
10834
  ...props,
9458
10835
  children: children ?? dueDateFormatter.format(value)
@@ -9478,8 +10855,8 @@ var DataTableCheckbox = forwardRef(
9478
10855
  {
9479
10856
  ref,
9480
10857
  className: cn(
9481
- "w-8 px-3.5 py-2.5 pr-0 align-middle",
9482
- 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",
9483
10860
  className
9484
10861
  ),
9485
10862
  ...props,
@@ -10943,6 +12320,6 @@ var KbdHint = forwardRef(function KbdHint2({ className, children, ...props }, re
10943
12320
  });
10944
12321
  KbdHint.displayName = "KbdHint";
10945
12322
 
10946
- 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, 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, Content15 as Content, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyIcon, CornerDownLeftIcon, 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, 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, inputVariants, isoToDate, isoToDisplay, isoToYear, labelVariants, parseDuration, 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 };
10947
12324
  //# sourceMappingURL=index.js.map
10948
12325
  //# sourceMappingURL=index.js.map