@ship-it-ui/ui 0.0.8 → 0.0.10

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
@@ -138,14 +138,16 @@ function useOutsideClick(ref, handler, enabled = true) {
138
138
  }
139
139
 
140
140
  // src/hooks/useTheme.ts
141
- import { useCallback as useCallback4, useEffect as useEffect4, useState as useState4 } from "react";
141
+ import { useCallback as useCallback4, useEffect as useEffect4, useRef as useRef3, useState as useState4 } from "react";
142
142
  function useTheme() {
143
143
  const [theme, setThemeState] = useState4("dark");
144
+ const internalMutation = useRef3(false);
144
145
  const setTheme = useCallback4((next) => {
145
146
  if (typeof document === "undefined") {
146
147
  setThemeState(next);
147
148
  return;
148
149
  }
150
+ internalMutation.current = true;
149
151
  if (next === "light") {
150
152
  document.documentElement.setAttribute("data-theme", "light");
151
153
  } else {
@@ -160,6 +162,10 @@ function useTheme() {
160
162
  const initial = document.documentElement.getAttribute("data-theme");
161
163
  setThemeState(initial === "light" ? "light" : "dark");
162
164
  const observer = new MutationObserver(() => {
165
+ if (internalMutation.current) {
166
+ internalMutation.current = false;
167
+ return;
168
+ }
163
169
  const attr = document.documentElement.getAttribute("data-theme");
164
170
  setThemeState(attr === "light" ? "light" : "dark");
165
171
  });
@@ -544,7 +550,7 @@ import {
544
550
  useCallback as useCallback5,
545
551
  useEffect as useEffect5,
546
552
  useImperativeHandle,
547
- useRef as useRef3,
553
+ useRef as useRef4,
548
554
  useState as useState5
549
555
  } from "react";
550
556
  import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
@@ -612,7 +618,7 @@ var InlineEdit = forwardRef7(function InlineEdit2({
612
618
  });
613
619
  const [draft, setDraft] = useState5(value);
614
620
  const [error, setError] = useState5(null);
615
- const inputRef = useRef3(null);
621
+ const inputRef = useRef4(null);
616
622
  useEffect5(() => {
617
623
  if (!editing) {
618
624
  setDraft(value);
@@ -855,7 +861,7 @@ import {
855
861
  useCallback as useCallback6,
856
862
  useEffect as useEffect6,
857
863
  useId as useId3,
858
- useRef as useRef4
864
+ useRef as useRef5
859
865
  } from "react";
860
866
  import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
861
867
  var wrapperSizes = {
@@ -891,8 +897,8 @@ var NumberInput = forwardRef10(function NumberInput2({
891
897
  });
892
898
  const reactId = useId3();
893
899
  const id = idProp ?? `ni-${reactId}`;
894
- const repeatTimer = useRef4(void 0);
895
- const repeatInterval = useRef4(void 0);
900
+ const repeatTimer = useRef5(void 0);
901
+ const repeatInterval = useRef5(void 0);
896
902
  const clamp = useCallback6((n) => Math.min(max, Math.max(min, n)), [min, max]);
897
903
  const bump = useCallback6(
898
904
  (dir) => {
@@ -1008,13 +1014,13 @@ import {
1008
1014
  forwardRef as forwardRef11,
1009
1015
  useId as useId4,
1010
1016
  useImperativeHandle as useImperativeHandle2,
1011
- useRef as useRef5,
1017
+ useRef as useRef6,
1012
1018
  useState as useState6
1013
1019
  } from "react";
1014
1020
  import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
1015
1021
  var OTP = forwardRef11(function OTP2({ length = 6, onComplete, onChange, defaultValue = "", ariaLabel = "Code", className, disabled }, ref) {
1016
1022
  const baseId = useId4();
1017
- const refs = useRef5([]);
1023
+ const refs = useRef6([]);
1018
1024
  const [values, setValues] = useState6(
1019
1025
  () => Array.from({ length }, (_, i) => defaultValue[i] ?? "")
1020
1026
  );
@@ -1563,6 +1569,53 @@ AccordionContent.displayName = "AccordionContent";
1563
1569
  import * as RadixAvatar from "@radix-ui/react-avatar";
1564
1570
  import { forwardRef as forwardRef20 } from "react";
1565
1571
 
1572
+ // src/utils/color-override.ts
1573
+ var HEX = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
1574
+ var FUNCTIONAL = /^(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color|color-mix)\([^()]*(?:\([^()]*\)[^()]*)*\)$/;
1575
+ var KEYWORDS = /* @__PURE__ */ new Set([
1576
+ "transparent",
1577
+ "currentColor",
1578
+ "currentcolor",
1579
+ "inherit",
1580
+ "initial",
1581
+ "unset",
1582
+ "red",
1583
+ "green",
1584
+ "blue",
1585
+ "black",
1586
+ "white",
1587
+ "gray",
1588
+ "grey",
1589
+ "orange",
1590
+ "yellow",
1591
+ "purple",
1592
+ "pink",
1593
+ "brown",
1594
+ "cyan",
1595
+ "magenta"
1596
+ ]);
1597
+ var isValid = (value) => {
1598
+ const v = value.trim();
1599
+ if (!v) return false;
1600
+ if (typeof CSS !== "undefined" && typeof CSS.supports === "function") {
1601
+ return CSS.supports("color", v);
1602
+ }
1603
+ return HEX.test(v) || FUNCTIONAL.test(v) || KEYWORDS.has(v);
1604
+ };
1605
+ var warnIfInvalidColor = (value, component) => {
1606
+ if (isValid(value)) return true;
1607
+ if (process.env.NODE_ENV !== "production") {
1608
+ console.warn(
1609
+ `[${component}] Invalid color value "${value}". Falling back to the default variant. Use a hex, rgb/rgba, hsl, oklch, lab/lch, color(), color-mix(), or a CSS color keyword.`
1610
+ );
1611
+ }
1612
+ return false;
1613
+ };
1614
+ var tintStyle = (color) => ({
1615
+ background: `color-mix(in oklab, ${color}, transparent 85%)`,
1616
+ color
1617
+ });
1618
+
1566
1619
  // src/components/StatusDot/StatusDot.tsx
1567
1620
  import { forwardRef as forwardRef19 } from "react";
1568
1621
  import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
@@ -1590,13 +1643,14 @@ var stateLabel = {
1590
1643
  sync: "Syncing",
1591
1644
  accent: "Active"
1592
1645
  };
1593
- var StatusDot = forwardRef19(function StatusDot2({ state = "ok", label, pulse, size = 8, className, ...props }, ref) {
1646
+ var StatusDot = forwardRef19(function StatusDot2({ state = "ok", color, label, pulse, size = 8, className, ...props }, ref) {
1647
+ const useColor = color && warnIfInvalidColor(color, "StatusDot");
1594
1648
  return /* @__PURE__ */ jsxs16(
1595
1649
  "span",
1596
1650
  {
1597
1651
  ref,
1598
1652
  role: label ? "status" : "img",
1599
- "aria-label": !label ? stateLabel[state] : void 0,
1653
+ "aria-label": !label ? useColor ? "Status" : stateLabel[state] : void 0,
1600
1654
  className: cn("inline-flex items-center gap-[6px]", className),
1601
1655
  ...props,
1602
1656
  children: [
@@ -1605,11 +1659,15 @@ var StatusDot = forwardRef19(function StatusDot2({ state = "ok", label, pulse, s
1605
1659
  {
1606
1660
  className: cn(
1607
1661
  "inline-block rounded-full",
1608
- stateColor[state],
1609
- pulse && "animate-[ship-pulse-ring_1.6s_infinite]",
1610
- stateText[state]
1662
+ !useColor && stateColor[state],
1663
+ !useColor && stateText[state],
1664
+ pulse && "animate-[ship-pulse-ring_1.6s_infinite]"
1611
1665
  ),
1612
- style: { width: size, height: size }
1666
+ style: {
1667
+ width: size,
1668
+ height: size,
1669
+ ...useColor ? { backgroundColor: color, color } : {}
1670
+ }
1613
1671
  }
1614
1672
  ),
1615
1673
  label && /* @__PURE__ */ jsx20("span", { className: "text-text-muted text-[12px]", children: label })
@@ -1644,10 +1702,12 @@ function hashHue(str) {
1644
1702
  for (let i = 0; i < str.length; i++) h = (h * 31 + str.charCodeAt(i)) % 360;
1645
1703
  return h;
1646
1704
  }
1647
- var Avatar = forwardRef20(function Avatar2({ name = "?", src, size = "md", status, initials, className, style, ...props }, ref) {
1705
+ var Avatar = forwardRef20(function Avatar2({ name = "?", src, size = "md", status, initials, color, className, style, ...props }, ref) {
1648
1706
  const dim = sizePx[size];
1649
1707
  const hue = hashHue(name);
1650
1708
  const computedInitials = initials ?? initialsFor(name);
1709
+ const useColor = color && warnIfInvalidColor(color, "Avatar");
1710
+ const fallbackBg = useColor ? color : `oklch(var(--color-avatar-fallback-l) var(--color-avatar-fallback-c) ${hue})`;
1651
1711
  return /* @__PURE__ */ jsxs17(
1652
1712
  "span",
1653
1713
  {
@@ -1661,7 +1721,7 @@ var Avatar = forwardRef20(function Avatar2({ name = "?", src, size = "md", statu
1661
1721
  {
1662
1722
  className: "border-border relative inline-flex h-full w-full shrink-0 overflow-hidden rounded-full border",
1663
1723
  style: {
1664
- background: src ? void 0 : `oklch(var(--color-avatar-fallback-l) var(--color-avatar-fallback-c) ${hue})`
1724
+ background: src ? void 0 : fallbackBg
1665
1725
  },
1666
1726
  children: [
1667
1727
  src && /* @__PURE__ */ jsx21(RadixAvatar.Image, { src, alt: name, className: "h-full w-full object-cover" }),
@@ -1729,6 +1789,16 @@ AvatarGroup.displayName = "AvatarGroup";
1729
1789
  import { cva as cva6 } from "class-variance-authority";
1730
1790
  import { forwardRef as forwardRef22 } from "react";
1731
1791
  import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
1792
+ var badgeStructural = cva6("inline-flex items-center font-sans leading-none whitespace-nowrap", {
1793
+ variants: {
1794
+ size: {
1795
+ sm: "h-[18px] px-[6px] py-[1px] text-[10px] gap-1 rounded-full",
1796
+ md: "h-[22px] px-2 py-[2px] text-[11px] gap-[5px] rounded-full",
1797
+ lg: "h-[26px] px-[10px] py-[3px] text-[12px] gap-[6px] rounded-full"
1798
+ }
1799
+ },
1800
+ defaultVariants: { size: "md" }
1801
+ });
1732
1802
  var badgeStyles = cva6("inline-flex items-center font-sans leading-none whitespace-nowrap", {
1733
1803
  variants: {
1734
1804
  variant: {
@@ -1762,20 +1832,53 @@ var dotColorClass = {
1762
1832
  solid: "bg-bg"
1763
1833
  };
1764
1834
  var dotSize = { sm: "h-[5px] w-[5px]", md: "h-[6px] w-[6px]", lg: "h-[7px] w-[7px]" };
1765
- var Badge = forwardRef22(function Badge2({ variant = "neutral", size = "md", dot, icon, className, children, ...props }, ref) {
1835
+ var Badge = forwardRef22(function Badge2({ variant = "neutral", size = "md", dot, icon, className, children, color, style, ...props }, ref) {
1766
1836
  const sz = size ?? "md";
1767
- const v = variant ?? "neutral";
1768
- return /* @__PURE__ */ jsxs19("span", { ref, className: cn(badgeStyles({ variant, size }), className), ...props, children: [
1769
- dot && /* @__PURE__ */ jsx23(
1837
+ const useColor = color && warnIfInvalidColor(color, "Badge");
1838
+ if (useColor) {
1839
+ return /* @__PURE__ */ jsxs19(
1770
1840
  "span",
1771
1841
  {
1772
- "aria-hidden": true,
1773
- className: cn("inline-block rounded-full", dotSize[sz], dotColorClass[v])
1842
+ ref,
1843
+ className: cn(badgeStructural({ size }), className),
1844
+ style: { ...tintStyle(color), ...style },
1845
+ ...props,
1846
+ children: [
1847
+ dot && /* @__PURE__ */ jsx23(
1848
+ "span",
1849
+ {
1850
+ "aria-hidden": true,
1851
+ className: cn("inline-block rounded-full", dotSize[sz]),
1852
+ style: { background: color }
1853
+ }
1854
+ ),
1855
+ icon && /* @__PURE__ */ jsx23("span", { className: "inline-flex leading-none", children: icon }),
1856
+ children
1857
+ ]
1774
1858
  }
1775
- ),
1776
- icon && /* @__PURE__ */ jsx23("span", { className: "inline-flex leading-none", children: icon }),
1777
- children
1778
- ] });
1859
+ );
1860
+ }
1861
+ const v = variant ?? "neutral";
1862
+ return /* @__PURE__ */ jsxs19(
1863
+ "span",
1864
+ {
1865
+ ref,
1866
+ className: cn(badgeStyles({ variant, size }), className),
1867
+ style,
1868
+ ...props,
1869
+ children: [
1870
+ dot && /* @__PURE__ */ jsx23(
1871
+ "span",
1872
+ {
1873
+ "aria-hidden": true,
1874
+ className: cn("inline-block rounded-full", dotSize[sz], dotColorClass[v])
1875
+ }
1876
+ ),
1877
+ icon && /* @__PURE__ */ jsx23("span", { className: "inline-flex leading-none", children: icon }),
1878
+ children
1879
+ ]
1880
+ }
1881
+ );
1779
1882
  });
1780
1883
  Badge.displayName = "Badge";
1781
1884
 
@@ -1923,18 +2026,23 @@ StatCard.displayName = "StatCard";
1923
2026
  // src/components/Chip/Chip.tsx
1924
2027
  import { forwardRef as forwardRef25 } from "react";
1925
2028
  import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
1926
- var Chip = forwardRef25(function Chip2({ icon, onRemove, density = "comfortable", className, children, ...props }, ref) {
2029
+ var Chip = forwardRef25(function Chip2({ icon, onRemove, density = "comfortable", color, className, children, style, ...props }, ref) {
1927
2030
  const isTouch = density === "touch";
2031
+ const useColor = color && warnIfInvalidColor(color, "Chip");
2032
+ const structural = cn(
2033
+ "inline-flex items-center gap-[6px] font-sans rounded-full border",
2034
+ isTouch ? "text-m-mono h-8 py-[5px] pr-[6px] pl-3" : "h-[26px] py-[4px] pr-1 pl-[10px] text-[12px]"
2035
+ );
2036
+ const defaultPaint = "bg-panel-2 text-text border-border";
1928
2037
  return /* @__PURE__ */ jsxs22(
1929
2038
  "span",
1930
2039
  {
1931
2040
  ref,
1932
- className: cn(
1933
- "inline-flex items-center gap-[6px] font-sans",
1934
- isTouch ? "text-m-mono h-8 py-[5px] pr-[6px] pl-3" : "h-[26px] py-[4px] pr-1 pl-[10px] text-[12px]",
1935
- "bg-panel-2 text-text border-border rounded-full border",
1936
- className
1937
- ),
2041
+ className: cn(structural, !useColor && defaultPaint, className),
2042
+ style: {
2043
+ ...useColor ? { ...tintStyle(color), borderColor: "transparent" } : {},
2044
+ ...style
2045
+ },
1938
2046
  ...props,
1939
2047
  children: [
1940
2048
  icon && /* @__PURE__ */ jsx26("span", { className: cn("text-text-dim inline-flex", isTouch ? "text-[12px]" : "text-[10px]"), children: icon }),
@@ -1985,7 +2093,7 @@ import {
1985
2093
  forwardRef as forwardRef27,
1986
2094
  useEffect as useEffect7,
1987
2095
  useId as useId7,
1988
- useRef as useRef6
2096
+ useRef as useRef7
1989
2097
  } from "react";
1990
2098
  import { jsx as jsx28, jsxs as jsxs23 } from "react/jsx-runtime";
1991
2099
  var sizeMap = {
@@ -2003,8 +2111,10 @@ var Rating = forwardRef27(function Rating2({
2003
2111
  readOnly = false,
2004
2112
  className,
2005
2113
  "aria-label": ariaLabel,
2114
+ color,
2006
2115
  ...props
2007
2116
  }, ref) {
2117
+ const useColor = color && warnIfInvalidColor(color, "Rating");
2008
2118
  const [current, setCurrent] = useControllableState({
2009
2119
  value,
2010
2120
  defaultValue: defaultValue ?? 0,
@@ -2013,8 +2123,8 @@ var Rating = forwardRef27(function Rating2({
2013
2123
  const reactId = useId7();
2014
2124
  const px = sizeMap[size];
2015
2125
  const currentInt = Math.round(current ?? 0);
2016
- const buttonsRef = useRef6([]);
2017
- const shouldFocusRef = useRef6(false);
2126
+ const buttonsRef = useRef7([]);
2127
+ const shouldFocusRef = useRef7(false);
2018
2128
  useEffect7(() => {
2019
2129
  if (!shouldFocusRef.current) return;
2020
2130
  shouldFocusRef.current = false;
@@ -2058,10 +2168,19 @@ var Rating = forwardRef27(function Rating2({
2058
2168
  /* @__PURE__ */ jsx28(
2059
2169
  "div",
2060
2170
  {
2171
+ "data-filled-stars": true,
2061
2172
  className: "pointer-events-none absolute inset-0 inline-flex items-center gap-0.5 overflow-hidden",
2062
- style: { width: `${fillPct}%` },
2173
+ style: { width: `${fillPct}%`, ...useColor ? { color } : {} },
2063
2174
  "aria-hidden": true,
2064
- children: Array.from({ length: max }).map((_, i) => /* @__PURE__ */ jsx28(IconGlyph3, { name: "star", size: px, className: "text-rating shrink-0" }, i))
2175
+ children: Array.from({ length: max }).map((_, i) => /* @__PURE__ */ jsx28(
2176
+ IconGlyph3,
2177
+ {
2178
+ name: "star",
2179
+ size: px,
2180
+ className: cn("shrink-0", !useColor && "text-rating")
2181
+ },
2182
+ i
2183
+ ))
2065
2184
  }
2066
2185
  )
2067
2186
  ]
@@ -2076,6 +2195,7 @@ var Rating = forwardRef27(function Rating2({
2076
2195
  "aria-label": ariaLabel ?? "Rating",
2077
2196
  tabIndex: -1,
2078
2197
  className: cn("inline-flex items-center gap-0.5", className),
2198
+ style: useColor ? { color } : void 0,
2079
2199
  onKeyDown: handleKey,
2080
2200
  ...props,
2081
2201
  children: Array.from({ length: max }).map((_, i) => {
@@ -2099,8 +2219,8 @@ var Rating = forwardRef27(function Rating2({
2099
2219
  "inline-flex shrink-0 cursor-pointer items-center justify-center rounded-sm",
2100
2220
  "focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]",
2101
2221
  "transition-colors duration-(--duration-micro)",
2102
- filled ? "text-rating" : "text-rating-dim",
2103
- "hover:text-rating"
2222
+ useColor ? filled ? "" : "opacity-30" : filled ? "text-rating" : "text-rating-dim",
2223
+ !useColor && "hover:text-rating"
2104
2224
  ),
2105
2225
  children: /* @__PURE__ */ jsx28(IconGlyph3, { name: "star", size: px })
2106
2226
  },
@@ -2226,17 +2346,20 @@ SkeletonGroup.displayName = "SkeletonGroup";
2226
2346
  // src/components/Tag/Tag.tsx
2227
2347
  import { forwardRef as forwardRef30 } from "react";
2228
2348
  import { jsx as jsx31, jsxs as jsxs25 } from "react/jsx-runtime";
2229
- var Tag = forwardRef30(function Tag2({ onRemove, icon, size = 22, className, children, ...props }, ref) {
2349
+ var Tag = forwardRef30(function Tag2({ onRemove, icon, size = 22, color, className, children, style, ...props }, ref) {
2350
+ const useColor = color && warnIfInvalidColor(color, "Tag");
2351
+ const structural = "inline-flex items-center gap-[6px] px-2 py-[3px] font-sans text-[11px] rounded-xs border";
2352
+ const defaultPaint = "bg-panel-2 text-text border-border";
2230
2353
  return /* @__PURE__ */ jsxs25(
2231
2354
  "span",
2232
2355
  {
2233
2356
  ref,
2234
- className: cn(
2235
- "inline-flex items-center gap-[6px] px-2 py-[3px] font-sans text-[11px]",
2236
- "bg-panel-2 text-text border-border rounded-xs border",
2237
- className
2238
- ),
2239
- style: { height: size },
2357
+ className: cn(structural, !useColor && defaultPaint, className),
2358
+ style: {
2359
+ height: size,
2360
+ ...useColor ? { ...tintStyle(color), borderColor: "transparent" } : {},
2361
+ ...style
2362
+ },
2240
2363
  ...props,
2241
2364
  children: [
2242
2365
  icon && /* @__PURE__ */ jsx31("span", { className: "text-text-dim inline-flex", children: icon }),
@@ -2365,18 +2488,25 @@ var DialogContent = forwardRef32(function DialogContent2({ className, width = 46
2365
2488
  });
2366
2489
  DialogContent.displayName = "DialogContent";
2367
2490
  function Dialog({ title, description, footer, width, children, ...rootProps }) {
2368
- return /* @__PURE__ */ jsx33(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs27(DialogContent, { width, children: [
2369
- title && /* @__PURE__ */ jsx33(
2370
- RadixDialog.Title,
2371
- {
2372
- className: cn("text-[16px] font-medium", description ? "mb-[6px]" : "mb-4"),
2373
- children: title
2374
- }
2375
- ),
2376
- description && /* @__PURE__ */ jsx33(RadixDialog.Description, { className: "text-text-muted mb-[18px] text-[13px] leading-[1.55]", children: description }),
2377
- children,
2378
- footer && /* @__PURE__ */ jsx33("div", { className: "mt-5 flex justify-end gap-2", children: footer })
2379
- ] }) });
2491
+ return /* @__PURE__ */ jsx33(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs27(
2492
+ DialogContent,
2493
+ {
2494
+ width,
2495
+ ...description ? {} : { "aria-describedby": void 0 },
2496
+ children: [
2497
+ title && /* @__PURE__ */ jsx33(
2498
+ RadixDialog.Title,
2499
+ {
2500
+ className: cn("text-[16px] font-medium", description ? "mb-[6px]" : "mb-4"),
2501
+ children: title
2502
+ }
2503
+ ),
2504
+ description && /* @__PURE__ */ jsx33(RadixDialog.Description, { className: "text-text-muted mb-[18px] text-[13px] leading-[1.55]", children: description }),
2505
+ children,
2506
+ footer && /* @__PURE__ */ jsx33("div", { className: "mt-5 flex justify-end gap-2", children: footer })
2507
+ ]
2508
+ }
2509
+ ) });
2380
2510
  }
2381
2511
 
2382
2512
  // src/components/Dialog/Drawer.tsx
@@ -2494,7 +2624,13 @@ var AlertDialog = forwardRef35(function AlertDialog2({ title, description, foote
2494
2624
  children: title
2495
2625
  }
2496
2626
  ),
2497
- description && /* @__PURE__ */ jsx36(RadixAlert.Description, { className: "text-text-muted mb-[18px] text-[13px] leading-[1.55]", children: description }),
2627
+ description ? /* @__PURE__ */ jsx36(RadixAlert.Description, { className: "text-text-muted mb-[18px] text-[13px] leading-[1.55]", children: description }) : (
2628
+ // Radix AlertDialog requires a description for screen-reader users
2629
+ // and warns in dev mode when one is missing. When the caller opts
2630
+ // out of a visible description, fall back to the title text in a
2631
+ // visually-hidden Description so the a11y contract is still met.
2632
+ /* @__PURE__ */ jsx36(RadixAlert.Description, { className: "sr-only", children: title })
2633
+ ),
2498
2634
  children,
2499
2635
  footer && /* @__PURE__ */ jsx36("div", { className: "mt-5 flex justify-end gap-2", children: footer })
2500
2636
  ]
@@ -2944,7 +3080,7 @@ import {
2944
3080
  forwardRef as forwardRef44,
2945
3081
  useCallback as useCallback9,
2946
3082
  useEffect as useEffect8,
2947
- useRef as useRef7
3083
+ useRef as useRef8
2948
3084
  } from "react";
2949
3085
  import { Fragment, jsx as jsx45, jsxs as jsxs38 } from "react/jsx-runtime";
2950
3086
  var Carousel = forwardRef44(function Carousel2({
@@ -2966,7 +3102,7 @@ var Carousel = forwardRef44(function Carousel2({
2966
3102
  defaultValue: defaultIndex ?? 0,
2967
3103
  onChange: onIndexChange
2968
3104
  });
2969
- const viewportRef = useRef7(null);
3105
+ const viewportRef = useRef8(null);
2970
3106
  const goTo = useCallback9(
2971
3107
  (i) => {
2972
3108
  const clamped = Math.max(0, Math.min(items.length - 1, i));
@@ -3104,7 +3240,7 @@ import {
3104
3240
  useEffect as useEffect9,
3105
3241
  useId as useId8,
3106
3242
  useMemo as useMemo2,
3107
- useRef as useRef8,
3243
+ useRef as useRef9,
3108
3244
  useState as useState9
3109
3245
  } from "react";
3110
3246
  import { jsx as jsx46, jsxs as jsxs39 } from "react/jsx-runtime";
@@ -3163,7 +3299,7 @@ var Combobox = forwardRef45(function Combobox2({
3163
3299
  onChange: onQueryChange
3164
3300
  });
3165
3301
  const [open, setOpen] = useState9(false);
3166
- const wrapperRef = useRef8(null);
3302
+ const wrapperRef = useRef9(null);
3167
3303
  useOutsideClick(wrapperRef, () => setOpen(false));
3168
3304
  const filtered = useMemo2(
3169
3305
  () => query ? normalized.filter((o) => filter(o, query)) : normalized,
@@ -3443,7 +3579,7 @@ function filterCommandItems(query, groups) {
3443
3579
  }
3444
3580
 
3445
3581
  // src/patterns/DataTable/DataTable.tsx
3446
- import { useEffect as useEffect11, useMemo as useMemo4, useRef as useRef9 } from "react";
3582
+ import { useEffect as useEffect11, useMemo as useMemo4, useRef as useRef10 } from "react";
3447
3583
  import { jsx as jsx48, jsxs as jsxs41 } from "react/jsx-runtime";
3448
3584
  var alignClass = {
3449
3585
  left: "text-left",
@@ -3500,7 +3636,7 @@ function DataTable(props) {
3500
3636
  const selectedSet = selected ?? EMPTY_SET;
3501
3637
  const allSelected = allIds.length > 0 && allIds.every((id) => selectedSet.has(id));
3502
3638
  const someSelected = !allSelected && allIds.some((id) => selectedSet.has(id));
3503
- const headerCheckRef = useRef9(null);
3639
+ const headerCheckRef = useRef10(null);
3504
3640
  useEffect11(() => {
3505
3641
  if (headerCheckRef.current) headerCheckRef.current.indeterminate = someSelected;
3506
3642
  }, [someSelected]);
@@ -3532,7 +3668,7 @@ function DataTable(props) {
3532
3668
  return next;
3533
3669
  });
3534
3670
  };
3535
- return /* @__PURE__ */ jsxs41("table", { ref, className: cn("w-full border-collapse text-[12px]", className), children: [
3671
+ return /* @__PURE__ */ jsxs41("table", { ref, className: cn("relative w-full border-collapse text-[12px]", className), children: [
3536
3672
  caption && /* @__PURE__ */ jsx48("caption", { className: "sr-only", children: caption }),
3537
3673
  /* @__PURE__ */ jsx48("thead", { className: cn("bg-panel-2", stickyHeader && "z-raised sticky top-0"), children: /* @__PURE__ */ jsxs41("tr", { children: [
3538
3674
  selectable && /* @__PURE__ */ jsx48("th", { scope: "col", className: "border-border w-8 border-b px-3 py-2 text-left", children: /* @__PURE__ */ jsx48(
@@ -3627,7 +3763,7 @@ import {
3627
3763
  forwardRef as forwardRef47,
3628
3764
  useCallback as useCallback10,
3629
3765
  useEffect as useEffect12,
3630
- useRef as useRef10,
3766
+ useRef as useRef11,
3631
3767
  useState as useState10
3632
3768
  } from "react";
3633
3769
  import { jsx as jsx49, jsxs as jsxs42 } from "react/jsx-runtime";
@@ -3721,8 +3857,8 @@ var Calendar = forwardRef47(function Calendar2({
3721
3857
  }, [selectedDate]);
3722
3858
  const focusedInVisibleMonth = focusedDate.getMonth() === month && focusedDate.getFullYear() === year;
3723
3859
  const effectiveFocusDay = focusedInVisibleMonth ? focusedDate.getDate() : clampDay(year, month, focusedDate.getDate());
3724
- const dayRefs = useRef10(/* @__PURE__ */ new Map());
3725
- const shouldFocusRef = useRef10(false);
3860
+ const dayRefs = useRef11(/* @__PURE__ */ new Map());
3861
+ const shouldFocusRef = useRef11(false);
3726
3862
  useEffect12(() => {
3727
3863
  if (!shouldFocusRef.current) return;
3728
3864
  shouldFocusRef.current = false;
@@ -4213,10 +4349,31 @@ Lightbox.displayName = "Lightbox";
4213
4349
 
4214
4350
  // src/patterns/ListingCard/ListingCard.tsx
4215
4351
  import { IconGlyph as IconGlyph7 } from "@ship-it-ui/icons";
4216
- import { forwardRef as forwardRef51 } from "react";
4352
+ import { cva as cva11 } from "class-variance-authority";
4353
+ import { forwardRef as forwardRef51, useState as useState13 } from "react";
4217
4354
  import { jsx as jsx53, jsxs as jsxs46 } from "react/jsx-runtime";
4355
+ var hoverVariants = cva11("", {
4356
+ variants: {
4357
+ hoverEffect: {
4358
+ lift: "transition-[transform,box-shadow,border-color] duration-(--duration-micro) hover:-translate-y-px hover:shadow hover:border-border-strong",
4359
+ glow: "transition-[box-shadow,border-color] duration-(--duration-micro) hover:ring-[3px] hover:ring-accent-dim hover:border-accent",
4360
+ none: ""
4361
+ }
4362
+ }
4363
+ });
4364
+ var flagToneClass = {
4365
+ accent: "bg-accent-dim text-accent",
4366
+ purple: "bg-[color-mix(in_oklab,var(--color-purple),transparent_75%)] text-purple",
4367
+ pink: "bg-[color-mix(in_oklab,var(--color-pink),transparent_75%)] text-pink",
4368
+ ok: "bg-[color-mix(in_oklab,var(--color-ok),transparent_75%)] text-ok",
4369
+ warn: "bg-[color-mix(in_oklab,var(--color-warn),transparent_75%)] text-warn"
4370
+ };
4218
4371
  var ListingCard = forwardRef51(function ListingCard2({
4372
+ variant = "default",
4219
4373
  photos,
4374
+ renderPhoto,
4375
+ onClick,
4376
+ hoverEffect,
4220
4377
  title,
4221
4378
  eyebrow,
4222
4379
  rating,
@@ -4224,31 +4381,50 @@ var ListingCard = forwardRef51(function ListingCard2({
4224
4381
  price,
4225
4382
  priceUnit = "/day",
4226
4383
  originalPrice,
4384
+ pricePrefix,
4227
4385
  host,
4228
4386
  distance,
4229
4387
  verified,
4230
4388
  href,
4231
4389
  onFavorite,
4232
4390
  favorited,
4233
- width = 280,
4391
+ width = variant === "spec" ? 320 : 280,
4392
+ flag,
4393
+ category,
4394
+ meta,
4395
+ specs,
4396
+ cta,
4397
+ hidePhotoCounter,
4398
+ classNames: cls = {},
4234
4399
  className,
4235
4400
  ...props
4236
4401
  }, ref) {
4402
+ const [photoIndex, setPhotoIndex] = useState13(0);
4403
+ const isSpec = variant === "spec";
4404
+ const stretchedLinkSupported = !isSpec || !cta && !!href;
4405
+ const isInteractive = Boolean(onClick) || Boolean(href);
4406
+ const effectiveHover = hoverEffect ?? (isInteractive ? "lift" : "none");
4407
+ const hoverClass = hoverVariants({ hoverEffect: effectiveHover });
4237
4408
  return /* @__PURE__ */ jsxs46(
4238
4409
  Card,
4239
4410
  {
4240
4411
  ref,
4241
- className: cn("relative overflow-hidden !p-0", className),
4412
+ className: cn("relative isolate overflow-hidden !p-0", hoverClass, cls.root, className),
4242
4413
  style: { width },
4243
4414
  ...props,
4244
4415
  children: [
4245
- /* @__PURE__ */ jsxs46("div", { className: "relative", children: [
4416
+ /* @__PURE__ */ jsxs46("div", { className: cn("relative", cls.photos), children: [
4246
4417
  /* @__PURE__ */ jsx53(
4247
4418
  Carousel,
4248
4419
  {
4249
4420
  items: photos,
4421
+ ...isSpec ? {
4422
+ index: photoIndex,
4423
+ onIndexChange: setPhotoIndex,
4424
+ showDots: false
4425
+ } : {},
4250
4426
  "aria-label": typeof title === "string" ? `${title} photos` : "Listing photos",
4251
- renderItem: (src) => /* @__PURE__ */ jsx53(
4427
+ renderItem: (src, i) => renderPhoto ? renderPhoto(src, i) : /* @__PURE__ */ jsx53(
4252
4428
  "img",
4253
4429
  {
4254
4430
  src,
@@ -4259,15 +4435,133 @@ var ListingCard = forwardRef51(function ListingCard2({
4259
4435
  )
4260
4436
  }
4261
4437
  ),
4262
- verified && /* @__PURE__ */ jsx53("div", { className: "pointer-events-none absolute top-3 left-3 z-10", children: /* @__PURE__ */ jsxs46(Badge, { variant: "ok", size: "sm", children: [
4438
+ !isSpec && verified && /* @__PURE__ */ jsx53("div", { className: "pointer-events-none absolute top-3 left-3 z-10", children: /* @__PURE__ */ jsxs46(Badge, { variant: "ok", size: "sm", children: [
4263
4439
  /* @__PURE__ */ jsx53(IconGlyph7, { name: "verified", size: 11 }),
4264
4440
  " Verified host"
4265
- ] }) })
4441
+ ] }) }),
4442
+ isSpec && flag && /* @__PURE__ */ jsx53("div", { className: "pointer-events-none absolute top-3 left-3 z-10", children: /* @__PURE__ */ jsxs46(
4443
+ "span",
4444
+ {
4445
+ className: cn(
4446
+ "inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium backdrop-blur",
4447
+ flagToneClass[flag.tone ?? "accent"],
4448
+ cls.flag
4449
+ ),
4450
+ children: [
4451
+ flag.icon && /* @__PURE__ */ jsx53(IconGlyph7, { name: flag.icon, size: 11 }),
4452
+ flag.label
4453
+ ]
4454
+ }
4455
+ ) }),
4456
+ isSpec && !hidePhotoCounter && photos.length > 1 && /* @__PURE__ */ jsxs46(
4457
+ "div",
4458
+ {
4459
+ "aria-hidden": true,
4460
+ className: cn(
4461
+ "pointer-events-none absolute top-3 right-3 z-10 rounded-full bg-black/55 px-2.5 py-1 font-mono text-[11px] text-white backdrop-blur",
4462
+ cls.photoCounter
4463
+ ),
4464
+ children: [
4465
+ photoIndex + 1,
4466
+ " / ",
4467
+ photos.length
4468
+ ]
4469
+ }
4470
+ )
4266
4471
  ] }),
4267
- /* @__PURE__ */ jsxs46("div", { className: "flex flex-col gap-1 p-3", children: [
4268
- eyebrow && /* @__PURE__ */ jsx53("span", { className: "text-text-dim font-mono text-[10px] tracking-wide uppercase", children: eyebrow }),
4269
- /* @__PURE__ */ jsxs46("div", { className: "flex items-start justify-between gap-2", children: [
4270
- /* @__PURE__ */ jsx53("span", { className: "text-text text-[14px] leading-snug font-semibold", children: title }),
4472
+ isSpec ? /* @__PURE__ */ jsxs46("div", { className: cn("flex flex-col", cls.body), children: [
4473
+ /* @__PURE__ */ jsxs46("div", { className: cn("flex flex-col gap-2 p-4 pb-3", cls.header), children: [
4474
+ /* @__PURE__ */ jsxs46("div", { className: "flex items-start justify-between gap-2", children: [
4475
+ /* @__PURE__ */ jsx53("span", { className: cn("text-text text-[15px] leading-snug font-semibold", cls.title), children: title }),
4476
+ category && /* @__PURE__ */ jsx53(
4477
+ "span",
4478
+ {
4479
+ className: cn(
4480
+ "border-border bg-panel-2 text-text-muted shrink-0 rounded-full border px-2 py-0.5 text-[10px] tracking-wide uppercase",
4481
+ cls.category
4482
+ ),
4483
+ children: category
4484
+ }
4485
+ )
4486
+ ] }),
4487
+ meta && /* @__PURE__ */ jsx53("span", { className: cn("text-text-dim font-mono text-[11px] tracking-wide", cls.meta), children: meta }),
4488
+ specs && specs.length > 0 && /* @__PURE__ */ jsx53(
4489
+ "dl",
4490
+ {
4491
+ className: cn(
4492
+ "border-border mt-1 grid gap-2 border-t pt-3",
4493
+ specs.length === 2 && "grid-cols-2",
4494
+ specs.length === 3 && "grid-cols-3",
4495
+ specs.length >= 4 && "grid-cols-4",
4496
+ cls.specs
4497
+ ),
4498
+ children: specs.map((s, i) => /* @__PURE__ */ jsxs46("div", { className: cn("flex flex-col gap-0.5", cls.specCell), children: [
4499
+ /* @__PURE__ */ jsx53(
4500
+ "dt",
4501
+ {
4502
+ className: cn(
4503
+ "text-text-dim text-[10px] tracking-wider uppercase",
4504
+ cls.specLabel
4505
+ ),
4506
+ children: s.label
4507
+ }
4508
+ ),
4509
+ /* @__PURE__ */ jsx53("dd", { className: cn("text-text text-[13px] font-medium", cls.specValue), children: s.value })
4510
+ ] }, i))
4511
+ }
4512
+ )
4513
+ ] }),
4514
+ /* @__PURE__ */ jsxs46(
4515
+ "div",
4516
+ {
4517
+ className: cn(
4518
+ "border-border bg-panel-2 relative z-10 flex items-center justify-between gap-2 border-t px-4 py-3",
4519
+ cls.footer
4520
+ ),
4521
+ children: [
4522
+ /* @__PURE__ */ jsx53("div", { className: "flex flex-col leading-tight", children: /* @__PURE__ */ jsxs46("div", { className: "flex items-baseline gap-1.5", children: [
4523
+ pricePrefix && /* @__PURE__ */ jsx53("span", { className: "text-text-dim text-[11px]", children: pricePrefix }),
4524
+ originalPrice && /* @__PURE__ */ jsx53("span", { className: "text-text-dim decoration-sale text-[11px] line-through", children: originalPrice }),
4525
+ /* @__PURE__ */ jsx53("span", { className: cn("text-text text-[15px] font-semibold", cls.price), children: price }),
4526
+ /* @__PURE__ */ jsx53("span", { className: cn("text-text-dim text-[11px]", cls.priceUnit), children: priceUnit })
4527
+ ] }) }),
4528
+ cta && (cta.href ? /* @__PURE__ */ jsx53(
4529
+ Button,
4530
+ {
4531
+ asChild: true,
4532
+ variant: "primary",
4533
+ size: "sm",
4534
+ disabled: cta.disabled,
4535
+ className: cls.cta,
4536
+ children: /* @__PURE__ */ jsx53("a", { href: cta.href, onClick: cta.onClick, children: cta.label })
4537
+ }
4538
+ ) : /* @__PURE__ */ jsx53(
4539
+ Button,
4540
+ {
4541
+ variant: "primary",
4542
+ size: "sm",
4543
+ onClick: cta.onClick,
4544
+ disabled: cta.disabled,
4545
+ className: cls.cta,
4546
+ children: cta.label
4547
+ }
4548
+ ))
4549
+ ]
4550
+ }
4551
+ )
4552
+ ] }) : /* @__PURE__ */ jsxs46("div", { className: cn("flex flex-col gap-1 p-3", cls.body), children: [
4553
+ eyebrow && /* @__PURE__ */ jsx53(
4554
+ "span",
4555
+ {
4556
+ className: cn(
4557
+ "text-text-dim font-mono text-[10px] tracking-wide uppercase",
4558
+ cls.eyebrow
4559
+ ),
4560
+ children: eyebrow
4561
+ }
4562
+ ),
4563
+ /* @__PURE__ */ jsxs46("div", { className: cn("flex items-start justify-between gap-2", cls.header), children: [
4564
+ /* @__PURE__ */ jsx53("span", { className: cn("text-text text-[14px] leading-snug font-semibold", cls.title), children: title }),
4271
4565
  rating !== void 0 && /* @__PURE__ */ jsxs46("span", { className: "inline-flex shrink-0 items-center gap-1 text-[12px]", children: [
4272
4566
  /* @__PURE__ */ jsx53(IconGlyph7, { name: "star", size: 12, className: "text-rating" }),
4273
4567
  /* @__PURE__ */ jsx53("span", { className: "text-text font-medium", children: rating.toFixed(1) }),
@@ -4278,19 +4572,29 @@ var ListingCard = forwardRef51(function ListingCard2({
4278
4572
  ] })
4279
4573
  ] })
4280
4574
  ] }),
4281
- (host || distance) && /* @__PURE__ */ jsxs46("div", { className: "text-text-dim flex items-center gap-2 text-[12px]", children: [
4575
+ (host || distance) && /* @__PURE__ */ jsxs46("div", { className: cn("text-text-dim flex items-center gap-2 text-[12px]", cls.meta), children: [
4282
4576
  host && /* @__PURE__ */ jsx53("span", { children: host }),
4283
4577
  host && distance && /* @__PURE__ */ jsx53("span", { "aria-hidden": true, children: "\xB7" }),
4284
4578
  distance && /* @__PURE__ */ jsx53("span", { children: distance })
4285
4579
  ] }),
4286
- /* @__PURE__ */ jsxs46("div", { className: "mt-2 flex items-baseline gap-2", children: [
4580
+ /* @__PURE__ */ jsxs46("div", { className: cn("mt-2 flex items-baseline gap-2", cls.footer), children: [
4287
4581
  originalPrice && /* @__PURE__ */ jsx53("span", { className: "text-text-dim decoration-sale text-[12px] line-through", children: originalPrice }),
4288
- /* @__PURE__ */ jsx53("span", { className: "text-text text-[15px] font-semibold", children: price }),
4289
- /* @__PURE__ */ jsx53("span", { className: "text-text-dim text-[12px]", children: priceUnit })
4582
+ /* @__PURE__ */ jsx53("span", { className: cn("text-text text-[15px] font-semibold", cls.price), children: price }),
4583
+ /* @__PURE__ */ jsx53("span", { className: cn("text-text-dim text-[12px]", cls.priceUnit), children: priceUnit })
4290
4584
  ] }),
4291
- rating !== void 0 && /* @__PURE__ */ jsx53(Rating, { value: rating, max: 5, precision: "half", size: "sm", readOnly: true, className: "sr-only" })
4585
+ rating !== void 0 && /* @__PURE__ */ jsx53(
4586
+ Rating,
4587
+ {
4588
+ value: rating,
4589
+ max: 5,
4590
+ precision: "half",
4591
+ size: "sm",
4592
+ readOnly: true,
4593
+ className: "sr-only"
4594
+ }
4595
+ )
4292
4596
  ] }),
4293
- href && /* @__PURE__ */ jsx53(
4597
+ href && stretchedLinkSupported && !onClick && /* @__PURE__ */ jsx53(
4294
4598
  "a",
4295
4599
  {
4296
4600
  href,
@@ -4298,7 +4602,16 @@ var ListingCard = forwardRef51(function ListingCard2({
4298
4602
  className: "absolute inset-0 z-0 no-underline"
4299
4603
  }
4300
4604
  ),
4301
- onFavorite && /* @__PURE__ */ jsx53(
4605
+ onClick && /* @__PURE__ */ jsx53(
4606
+ "button",
4607
+ {
4608
+ type: "button",
4609
+ onClick,
4610
+ "aria-label": typeof title === "string" ? `View ${title}` : "View listing",
4611
+ className: "focus-visible:ring-accent-dim absolute inset-0 z-0 cursor-pointer bg-transparent outline-none focus-visible:ring-[3px]"
4612
+ }
4613
+ ),
4614
+ !isSpec && onFavorite && /* @__PURE__ */ jsx53(
4302
4615
  "button",
4303
4616
  {
4304
4617
  type: "button",
@@ -4308,7 +4621,8 @@ var ListingCard = forwardRef51(function ListingCard2({
4308
4621
  className: cn(
4309
4622
  "absolute top-3 right-3 z-20 inline-grid h-8 w-8 cursor-pointer place-items-center rounded-full",
4310
4623
  "bg-panel/85 hover:bg-panel border-border border shadow-sm backdrop-blur",
4311
- favorited ? "text-err" : "text-text-dim hover:text-text"
4624
+ favorited ? "text-err" : "text-text-dim hover:text-text",
4625
+ cls.favorite
4312
4626
  ),
4313
4627
  children: /* @__PURE__ */ jsx53(IconGlyph7, { name: "heart", size: 16 })
4314
4628
  }
@@ -4319,8 +4633,355 @@ var ListingCard = forwardRef51(function ListingCard2({
4319
4633
  });
4320
4634
  ListingCard.displayName = "ListingCard";
4321
4635
 
4636
+ // src/patterns/ListingDetail/ListingDetail.tsx
4637
+ import * as RadixDialog6 from "@radix-ui/react-dialog";
4638
+ import { IconGlyph as IconGlyph8 } from "@ship-it-ui/icons";
4639
+ import { forwardRef as forwardRef52, useState as useState14 } from "react";
4640
+ import { jsx as jsx54, jsxs as jsxs47 } from "react/jsx-runtime";
4641
+ function renderAction(action, variant) {
4642
+ if (action.href) {
4643
+ return /* @__PURE__ */ jsx54(Button, { asChild: true, variant, disabled: action.disabled, children: /* @__PURE__ */ jsx54("a", { href: action.href, onClick: action.onClick, children: action.label }) });
4644
+ }
4645
+ return /* @__PURE__ */ jsx54(Button, { variant, onClick: action.onClick, disabled: action.disabled, children: action.label });
4646
+ }
4647
+ var flagToneClass2 = {
4648
+ accent: "bg-accent-dim text-accent",
4649
+ purple: "bg-[color-mix(in_oklab,var(--color-purple),transparent_75%)] text-purple",
4650
+ pink: "bg-[color-mix(in_oklab,var(--color-pink),transparent_75%)] text-pink",
4651
+ ok: "bg-[color-mix(in_oklab,var(--color-ok),transparent_75%)] text-ok",
4652
+ warn: "bg-[color-mix(in_oklab,var(--color-warn),transparent_75%)] text-warn"
4653
+ };
4654
+ var ListingDetail = forwardRef52(function ListingDetail2({
4655
+ variant = "default",
4656
+ open,
4657
+ defaultOpen,
4658
+ onOpenChange,
4659
+ photos,
4660
+ renderPhoto,
4661
+ title,
4662
+ eyebrow,
4663
+ description,
4664
+ rating,
4665
+ reviewCount,
4666
+ price,
4667
+ priceUnit = "/day",
4668
+ originalPrice,
4669
+ pricePrefix,
4670
+ host,
4671
+ features,
4672
+ primaryAction,
4673
+ secondaryAction,
4674
+ flag,
4675
+ category,
4676
+ meta,
4677
+ specs,
4678
+ cta,
4679
+ hidePhotoCounter,
4680
+ classNames: cls = {}
4681
+ }, ref) {
4682
+ const [galleryIndex, setGalleryIndex] = useState14(0);
4683
+ const [lightboxOpen, setLightboxOpen] = useState14(false);
4684
+ const isSpec = variant === "spec";
4685
+ const lightboxTitle = typeof title === "string" ? `${title} photos` : "Listing photos";
4686
+ return /* @__PURE__ */ jsxs47(RadixDialog6.Root, { open, defaultOpen, onOpenChange, children: [
4687
+ /* @__PURE__ */ jsxs47(RadixDialog6.Portal, { children: [
4688
+ /* @__PURE__ */ jsx54(
4689
+ RadixDialog6.Overlay,
4690
+ {
4691
+ className: cn(
4692
+ "z-overlay fixed inset-0 bg-black/55 backdrop-blur-[4px]",
4693
+ "data-[state=open]:animate-[ship-fade-in_150ms_ease]",
4694
+ cls.overlay
4695
+ )
4696
+ }
4697
+ ),
4698
+ /* @__PURE__ */ jsxs47(
4699
+ RadixDialog6.Content,
4700
+ {
4701
+ ref,
4702
+ ...description ? {} : { "aria-describedby": void 0 },
4703
+ className: cn(
4704
+ "z-modal fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2",
4705
+ "w-[calc(100%-32px)] max-w-[960px]",
4706
+ "max-h-[min(92vh,820px)] overflow-hidden",
4707
+ "bg-panel border-border-strong rounded-lg border shadow-lg outline-none",
4708
+ "data-[state=open]:animate-[ship-dialog-in_180ms_var(--easing-out)]",
4709
+ "flex flex-col",
4710
+ cls.content
4711
+ ),
4712
+ children: [
4713
+ /* @__PURE__ */ jsxs47(
4714
+ "div",
4715
+ {
4716
+ className: cn(
4717
+ "grid grid-cols-1 gap-6 overflow-y-auto p-6 md:grid-cols-[1.1fr_1fr]",
4718
+ isSpec && cta && "pb-4",
4719
+ cls.grid
4720
+ ),
4721
+ children: [
4722
+ /* @__PURE__ */ jsxs47("div", { className: cn("flex flex-col gap-3", cls.photos), children: [
4723
+ /* @__PURE__ */ jsxs47("div", { className: "relative overflow-hidden rounded-md", children: [
4724
+ /* @__PURE__ */ jsx54(
4725
+ Carousel,
4726
+ {
4727
+ items: photos,
4728
+ index: galleryIndex,
4729
+ onIndexChange: setGalleryIndex,
4730
+ ...isSpec ? { showDots: false } : {},
4731
+ "aria-label": typeof title === "string" ? `${title} photos` : "Listing photos",
4732
+ renderItem: (src, i) => renderPhoto ? renderPhoto(src, i, "gallery") : /* @__PURE__ */ jsx54(
4733
+ "img",
4734
+ {
4735
+ src,
4736
+ alt: "",
4737
+ className: "block h-full w-full object-cover",
4738
+ loading: "lazy"
4739
+ }
4740
+ )
4741
+ }
4742
+ ),
4743
+ isSpec && flag ? /* @__PURE__ */ jsx54("div", { className: "pointer-events-none absolute top-3 left-3 z-10", children: /* @__PURE__ */ jsxs47(
4744
+ "span",
4745
+ {
4746
+ className: cn(
4747
+ "inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium backdrop-blur",
4748
+ flagToneClass2[flag.tone ?? "accent"],
4749
+ cls.flag
4750
+ ),
4751
+ children: [
4752
+ flag.icon && /* @__PURE__ */ jsx54(IconGlyph8, { name: flag.icon, size: 11 }),
4753
+ flag.label
4754
+ ]
4755
+ }
4756
+ ) }) : null,
4757
+ /* @__PURE__ */ jsx54(
4758
+ "button",
4759
+ {
4760
+ type: "button",
4761
+ onClick: () => setLightboxOpen(true),
4762
+ "aria-label": "Open photo viewer",
4763
+ className: cn(
4764
+ "bg-panel/85 hover:bg-panel border-border text-text-muted hover:text-text focus-visible:ring-accent-dim absolute z-10 inline-grid h-8 w-8 cursor-pointer place-items-center rounded-full border shadow-sm backdrop-blur outline-none focus-visible:ring-[3px]",
4765
+ isSpec ? "right-3 bottom-3" : "top-3 left-3"
4766
+ ),
4767
+ children: /* @__PURE__ */ jsx54(IconGlyph8, { name: "maximize", size: 14 })
4768
+ }
4769
+ ),
4770
+ isSpec && !hidePhotoCounter && photos.length > 1 && /* @__PURE__ */ jsxs47(
4771
+ "div",
4772
+ {
4773
+ "aria-hidden": true,
4774
+ className: cn(
4775
+ "pointer-events-none absolute top-3 right-3 z-10 rounded-full bg-black/55 px-2.5 py-1 font-mono text-[11px] text-white backdrop-blur",
4776
+ cls.photoCounter
4777
+ ),
4778
+ children: [
4779
+ galleryIndex + 1,
4780
+ " / ",
4781
+ photos.length
4782
+ ]
4783
+ }
4784
+ )
4785
+ ] }),
4786
+ !isSpec && features && features.length > 0 && /* @__PURE__ */ jsx54("ul", { className: cn("flex flex-wrap gap-2", cls.features), children: features.map((f, i) => /* @__PURE__ */ jsxs47(
4787
+ "li",
4788
+ {
4789
+ className: "border-border bg-panel-2 text-text-muted inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[12px]",
4790
+ children: [
4791
+ /* @__PURE__ */ jsx54(IconGlyph8, { name: f.icon, size: 12 }),
4792
+ f.label
4793
+ ]
4794
+ },
4795
+ i
4796
+ )) })
4797
+ ] }),
4798
+ /* @__PURE__ */ jsxs47("div", { className: cn("flex flex-col gap-4", cls.info), children: [
4799
+ /* @__PURE__ */ jsxs47("header", { className: cn("flex flex-col gap-1.5", cls.header), children: [
4800
+ eyebrow && !isSpec && /* @__PURE__ */ jsx54("span", { className: "text-text-dim font-mono text-[10px] tracking-wide uppercase", children: eyebrow }),
4801
+ /* @__PURE__ */ jsxs47("div", { className: "flex items-start justify-between gap-3", children: [
4802
+ /* @__PURE__ */ jsx54(RadixDialog6.Title, { asChild: true, children: /* @__PURE__ */ jsx54(
4803
+ "h2",
4804
+ {
4805
+ className: cn("text-text text-[22px] leading-tight font-semibold", cls.title),
4806
+ children: title
4807
+ }
4808
+ ) }),
4809
+ isSpec && category && /* @__PURE__ */ jsx54(
4810
+ "span",
4811
+ {
4812
+ className: cn(
4813
+ "border-border bg-panel-2 text-text-muted mt-1 shrink-0 rounded-full border px-2 py-0.5 text-[10px] tracking-wide uppercase",
4814
+ cls.category
4815
+ ),
4816
+ children: category
4817
+ }
4818
+ )
4819
+ ] }),
4820
+ isSpec && meta && /* @__PURE__ */ jsx54(
4821
+ "span",
4822
+ {
4823
+ className: cn("text-text-dim font-mono text-[12px] tracking-wide", cls.meta),
4824
+ children: meta
4825
+ }
4826
+ ),
4827
+ rating !== void 0 && /* @__PURE__ */ jsxs47("div", { className: "text-text-muted mt-1 flex items-center gap-2 text-[13px]", children: [
4828
+ /* @__PURE__ */ jsx54(IconGlyph8, { name: "star", size: 13, className: "text-rating" }),
4829
+ /* @__PURE__ */ jsx54("span", { className: "text-text font-medium", children: rating.toFixed(2) }),
4830
+ reviewCount !== void 0 && /* @__PURE__ */ jsxs47("span", { children: [
4831
+ "(",
4832
+ reviewCount,
4833
+ " reviews)"
4834
+ ] }),
4835
+ /* @__PURE__ */ jsx54(
4836
+ Rating,
4837
+ {
4838
+ value: rating,
4839
+ max: 5,
4840
+ precision: "half",
4841
+ size: "sm",
4842
+ readOnly: true,
4843
+ className: "sr-only"
4844
+ }
4845
+ )
4846
+ ] })
4847
+ ] }),
4848
+ isSpec && specs && specs.length > 0 && /* @__PURE__ */ jsx54(
4849
+ "dl",
4850
+ {
4851
+ className: cn(
4852
+ "border-border grid grid-cols-2 gap-3 border-t pt-4 sm:grid-cols-3",
4853
+ cls.specs
4854
+ ),
4855
+ children: specs.map((s, i) => /* @__PURE__ */ jsxs47("div", { className: cn("flex flex-col gap-0.5", cls.specCell), children: [
4856
+ /* @__PURE__ */ jsx54(
4857
+ "dt",
4858
+ {
4859
+ className: cn(
4860
+ "text-text-dim text-[10px] tracking-wider uppercase",
4861
+ cls.specLabel
4862
+ ),
4863
+ children: s.label
4864
+ }
4865
+ ),
4866
+ /* @__PURE__ */ jsx54("dd", { className: cn("text-text text-[15px] font-semibold", cls.specValue), children: s.value })
4867
+ ] }, i))
4868
+ }
4869
+ ),
4870
+ host && /* @__PURE__ */ jsxs47(
4871
+ "div",
4872
+ {
4873
+ className: cn("border-border flex items-center gap-3 border-t pt-4", cls.host),
4874
+ children: [
4875
+ /* @__PURE__ */ jsx54(
4876
+ Avatar,
4877
+ {
4878
+ size: "md",
4879
+ name: typeof host.name === "string" ? host.name : "Host",
4880
+ src: host.avatarUrl
4881
+ }
4882
+ ),
4883
+ /* @__PURE__ */ jsxs47("div", { className: "flex flex-col", children: [
4884
+ /* @__PURE__ */ jsxs47("div", { className: "text-text inline-flex items-center gap-1.5 text-[13px] font-medium", children: [
4885
+ /* @__PURE__ */ jsxs47("span", { children: [
4886
+ "Hosted by ",
4887
+ host.name
4888
+ ] }),
4889
+ host.verified && /* @__PURE__ */ jsxs47(Badge, { variant: "ok", size: "sm", children: [
4890
+ /* @__PURE__ */ jsx54(IconGlyph8, { name: "verified", size: 11 }),
4891
+ " Verified"
4892
+ ] })
4893
+ ] }),
4894
+ host.meta && /* @__PURE__ */ jsx54("span", { className: "text-text-dim text-[12px]", children: host.meta })
4895
+ ] })
4896
+ ]
4897
+ }
4898
+ ),
4899
+ description && /* @__PURE__ */ jsx54(RadixDialog6.Description, { asChild: true, children: /* @__PURE__ */ jsx54("p", { className: cn("text-text-muted text-[13px] leading-[1.6]", cls.description), children: description }) }),
4900
+ !isSpec && /* @__PURE__ */ jsxs47(
4901
+ "div",
4902
+ {
4903
+ className: cn(
4904
+ "border-border mt-auto flex flex-col gap-3 border-t pt-4",
4905
+ cls.footer
4906
+ ),
4907
+ children: [
4908
+ /* @__PURE__ */ jsxs47("div", { className: "flex items-baseline gap-2", children: [
4909
+ originalPrice && /* @__PURE__ */ jsx54("span", { className: "text-text-dim decoration-sale text-[13px] line-through", children: originalPrice }),
4910
+ /* @__PURE__ */ jsx54("span", { className: cn("text-text text-[22px] font-semibold", cls.price), children: price }),
4911
+ /* @__PURE__ */ jsx54("span", { className: cn("text-text-dim text-[13px]", cls.priceUnit), children: priceUnit })
4912
+ ] }),
4913
+ (primaryAction || secondaryAction) && /* @__PURE__ */ jsxs47("div", { className: "flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-end", children: [
4914
+ secondaryAction && renderAction(secondaryAction, "ghost"),
4915
+ primaryAction && renderAction(primaryAction, "primary")
4916
+ ] })
4917
+ ]
4918
+ }
4919
+ )
4920
+ ] })
4921
+ ]
4922
+ }
4923
+ ),
4924
+ isSpec && (cta || price) && /* @__PURE__ */ jsxs47(
4925
+ "div",
4926
+ {
4927
+ className: cn(
4928
+ "border-border bg-panel-2 flex items-center justify-between gap-3 border-t px-6 py-4",
4929
+ cls.footer
4930
+ ),
4931
+ children: [
4932
+ /* @__PURE__ */ jsxs47("div", { className: "flex items-baseline gap-2", children: [
4933
+ pricePrefix && /* @__PURE__ */ jsx54("span", { className: "text-text-dim text-[12px]", children: pricePrefix }),
4934
+ originalPrice && /* @__PURE__ */ jsx54("span", { className: "text-text-dim decoration-sale text-[13px] line-through", children: originalPrice }),
4935
+ /* @__PURE__ */ jsx54("span", { className: cn("text-text text-[20px] font-semibold", cls.price), children: price }),
4936
+ /* @__PURE__ */ jsx54("span", { className: cn("text-text-dim text-[13px]", cls.priceUnit), children: priceUnit })
4937
+ ] }),
4938
+ cta && (cta.href ? /* @__PURE__ */ jsx54(Button, { asChild: true, variant: "primary", disabled: cta.disabled, className: cls.cta, children: /* @__PURE__ */ jsx54("a", { href: cta.href, onClick: cta.onClick, children: cta.label }) }) : /* @__PURE__ */ jsx54(
4939
+ Button,
4940
+ {
4941
+ variant: "primary",
4942
+ onClick: cta.onClick,
4943
+ disabled: cta.disabled,
4944
+ className: cls.cta,
4945
+ children: cta.label
4946
+ }
4947
+ ))
4948
+ ]
4949
+ }
4950
+ ),
4951
+ /* @__PURE__ */ jsx54(RadixDialog6.Close, { asChild: true, children: /* @__PURE__ */ jsx54(
4952
+ "button",
4953
+ {
4954
+ type: "button",
4955
+ "aria-label": "Close listing details",
4956
+ className: cn(
4957
+ "bg-panel-2 hover:bg-panel-2/80 text-text-muted hover:text-text border-border focus-visible:ring-accent-dim absolute top-3 right-3 inline-grid h-9 w-9 cursor-pointer place-items-center rounded-full border outline-none focus-visible:ring-[3px]",
4958
+ cls.close
4959
+ ),
4960
+ children: /* @__PURE__ */ jsx54(IconGlyph8, { name: "close", size: 16 })
4961
+ }
4962
+ ) })
4963
+ ]
4964
+ }
4965
+ )
4966
+ ] }),
4967
+ /* @__PURE__ */ jsx54(
4968
+ Lightbox,
4969
+ {
4970
+ open: lightboxOpen,
4971
+ onOpenChange: setLightboxOpen,
4972
+ items: photos,
4973
+ index: galleryIndex,
4974
+ onIndexChange: setGalleryIndex,
4975
+ title: lightboxTitle,
4976
+ renderItem: (src, i) => renderPhoto ? renderPhoto(src, i, "lightbox") : /* @__PURE__ */ jsx54("img", { src, alt: "", className: "max-h-[88vh] max-w-[92vw] object-contain" })
4977
+ }
4978
+ )
4979
+ ] });
4980
+ });
4981
+ ListingDetail.displayName = "ListingDetail";
4982
+
4322
4983
  // src/patterns/PhoneInput/PhoneInput.tsx
4323
- import { forwardRef as forwardRef52, useEffect as useEffect14, useMemo as useMemo5, useRef as useRef11, useState as useState13 } from "react";
4984
+ import { forwardRef as forwardRef53, useEffect as useEffect14, useMemo as useMemo5, useRef as useRef12, useState as useState15 } from "react";
4324
4985
 
4325
4986
  // src/patterns/PhoneInput/countries.ts
4326
4987
  var phoneCountries = [
@@ -4364,7 +5025,7 @@ var phoneCountries = [
4364
5025
  ];
4365
5026
 
4366
5027
  // src/patterns/PhoneInput/PhoneInput.tsx
4367
- import { jsx as jsx54, jsxs as jsxs47 } from "react/jsx-runtime";
5028
+ import { jsx as jsx55, jsxs as jsxs48 } from "react/jsx-runtime";
4368
5029
  function parseE164(value, list) {
4369
5030
  if (!value.startsWith("+")) return null;
4370
5031
  const digits = value.slice(1);
@@ -4378,7 +5039,7 @@ function toE164(country, national) {
4378
5039
  if (cleaned.length === 0) return "";
4379
5040
  return `+${country.dialCode}${cleaned}`;
4380
5041
  }
4381
- var PhoneInput = forwardRef52(function PhoneInput2({
5042
+ var PhoneInput = forwardRef53(function PhoneInput2({
4382
5043
  value,
4383
5044
  defaultValue,
4384
5045
  onValueChange,
@@ -4394,11 +5055,11 @@ var PhoneInput = forwardRef52(function PhoneInput2({
4394
5055
  onChange: onValueChange
4395
5056
  });
4396
5057
  const parsed = useMemo5(() => parseE164(committed ?? "", countries), [committed, countries]);
4397
- const [country, setCountry] = useState13(
5058
+ const [country, setCountry] = useState15(
4398
5059
  parsed?.country ?? countries.find((c) => c.code === defaultCountry) ?? countries[0]
4399
5060
  );
4400
- const [national, setNational] = useState13(parsed?.national ?? "");
4401
- const lastEmittedRef = useRef11(committed ?? "");
5061
+ const [national, setNational] = useState15(parsed?.national ?? "");
5062
+ const lastEmittedRef = useRef12(committed ?? "");
4402
5063
  useEffect14(() => {
4403
5064
  const current = committed ?? "";
4404
5065
  if (current === lastEmittedRef.current) return;
@@ -4431,7 +5092,7 @@ var PhoneInput = forwardRef52(function PhoneInput2({
4431
5092
  })),
4432
5093
  [countries]
4433
5094
  );
4434
- return /* @__PURE__ */ jsxs47(
5095
+ return /* @__PURE__ */ jsxs48(
4435
5096
  "div",
4436
5097
  {
4437
5098
  className: cn(
@@ -4440,7 +5101,7 @@ var PhoneInput = forwardRef52(function PhoneInput2({
4440
5101
  disabled && "opacity-50"
4441
5102
  ),
4442
5103
  children: [
4443
- /* @__PURE__ */ jsx54(
5104
+ /* @__PURE__ */ jsx55(
4444
5105
  Select,
4445
5106
  {
4446
5107
  options: selectOptions,
@@ -4450,7 +5111,7 @@ var PhoneInput = forwardRef52(function PhoneInput2({
4450
5111
  "aria-label": "Country"
4451
5112
  }
4452
5113
  ),
4453
- /* @__PURE__ */ jsx54(
5114
+ /* @__PURE__ */ jsx55(
4454
5115
  "input",
4455
5116
  {
4456
5117
  ref,
@@ -4472,8 +5133,8 @@ var PhoneInput = forwardRef52(function PhoneInput2({
4472
5133
  PhoneInput.displayName = "PhoneInput";
4473
5134
 
4474
5135
  // src/patterns/PriceBreakdown/PriceBreakdown.tsx
4475
- import { forwardRef as forwardRef53 } from "react";
4476
- import { jsx as jsx55, jsxs as jsxs48 } from "react/jsx-runtime";
5136
+ import { forwardRef as forwardRef54 } from "react";
5137
+ import { jsx as jsx56, jsxs as jsxs49 } from "react/jsx-runtime";
4477
5138
  function PriceBreakdownRoot({
4478
5139
  items,
4479
5140
  total,
@@ -4483,30 +5144,30 @@ function PriceBreakdownRoot({
4483
5144
  children,
4484
5145
  ...props
4485
5146
  }, ref) {
4486
- return /* @__PURE__ */ jsxs48("div", { ref, className: cn("flex flex-col gap-2", className), ...props, children: [
4487
- items?.map((item, i) => /* @__PURE__ */ jsx55(PriceBreakdownLine, { ...item }, i)),
5147
+ return /* @__PURE__ */ jsxs49("div", { ref, className: cn("flex flex-col gap-2", className), ...props, children: [
5148
+ items?.map((item, i) => /* @__PURE__ */ jsx56(PriceBreakdownLine, { ...item }, i)),
4488
5149
  children,
4489
- total !== void 0 && /* @__PURE__ */ jsxs48("div", { className: "border-border mt-2 flex items-baseline justify-between border-t pt-3", children: [
4490
- /* @__PURE__ */ jsx55("span", { className: "text-text text-[14px] font-semibold", children: totalLabel }),
4491
- /* @__PURE__ */ jsxs48("span", { className: "text-text text-[16px] font-semibold", children: [
5150
+ total !== void 0 && /* @__PURE__ */ jsxs49("div", { className: "border-border mt-2 flex items-baseline justify-between border-t pt-3", children: [
5151
+ /* @__PURE__ */ jsx56("span", { className: "text-text text-[14px] font-semibold", children: totalLabel }),
5152
+ /* @__PURE__ */ jsxs49("span", { className: "text-text text-[16px] font-semibold", children: [
4492
5153
  total,
4493
- currency && /* @__PURE__ */ jsx55("span", { className: "text-text-dim ml-1 text-[12px] font-normal", children: currency })
5154
+ currency && /* @__PURE__ */ jsx56("span", { className: "text-text-dim ml-1 text-[12px] font-normal", children: currency })
4494
5155
  ] })
4495
5156
  ] })
4496
5157
  ] });
4497
5158
  }
4498
- var PriceBreakdown = forwardRef53(PriceBreakdownRoot);
5159
+ var PriceBreakdown = forwardRef54(PriceBreakdownRoot);
4499
5160
  PriceBreakdown.displayName = "PriceBreakdown";
4500
- var PriceBreakdownLine = forwardRef53(
5161
+ var PriceBreakdownLine = forwardRef54(
4501
5162
  function PriceBreakdownLine2({ label, subLabel, amount, originalAmount, discount, className }, ref) {
4502
- return /* @__PURE__ */ jsxs48("div", { ref, className: cn("flex items-baseline justify-between gap-3", className), children: [
4503
- /* @__PURE__ */ jsxs48("div", { className: "flex min-w-0 flex-col", children: [
4504
- /* @__PURE__ */ jsx55("span", { className: "text-text text-[13px]", children: label }),
4505
- subLabel && /* @__PURE__ */ jsx55("span", { className: "text-text-dim text-[11px]", children: subLabel })
5163
+ return /* @__PURE__ */ jsxs49("div", { ref, className: cn("flex items-baseline justify-between gap-3", className), children: [
5164
+ /* @__PURE__ */ jsxs49("div", { className: "flex min-w-0 flex-col", children: [
5165
+ /* @__PURE__ */ jsx56("span", { className: "text-text text-[13px]", children: label }),
5166
+ subLabel && /* @__PURE__ */ jsx56("span", { className: "text-text-dim text-[11px]", children: subLabel })
4506
5167
  ] }),
4507
- /* @__PURE__ */ jsxs48("div", { className: "inline-flex shrink-0 items-baseline gap-2", children: [
4508
- originalAmount && /* @__PURE__ */ jsx55("span", { className: "text-text-dim decoration-sale text-[12px] line-through", children: originalAmount }),
4509
- /* @__PURE__ */ jsx55(
5168
+ /* @__PURE__ */ jsxs49("div", { className: "inline-flex shrink-0 items-baseline gap-2", children: [
5169
+ originalAmount && /* @__PURE__ */ jsx56("span", { className: "text-text-dim decoration-sale text-[12px] line-through", children: originalAmount }),
5170
+ /* @__PURE__ */ jsx56(
4510
5171
  "span",
4511
5172
  {
4512
5173
  className: cn("text-[13px] font-medium", discount ? "text-sale-text" : "text-text"),
@@ -4521,19 +5182,19 @@ PriceBreakdownLine.displayName = "PriceBreakdownLine";
4521
5182
  PriceBreakdown.Line = PriceBreakdownLine;
4522
5183
 
4523
5184
  // src/patterns/ReviewCard/ReviewCard.tsx
4524
- import { IconGlyph as IconGlyph8 } from "@ship-it-ui/icons";
4525
- import { forwardRef as forwardRef54 } from "react";
4526
- import { jsx as jsx56, jsxs as jsxs49 } from "react/jsx-runtime";
4527
- var ReviewCard = forwardRef54(function ReviewCard2({ author, authorAvatar, rating, date, body, photos, verified, subtitle, className, ...props }, ref) {
4528
- return /* @__PURE__ */ jsxs49(
5185
+ import { IconGlyph as IconGlyph9 } from "@ship-it-ui/icons";
5186
+ import { forwardRef as forwardRef55 } from "react";
5187
+ import { jsx as jsx57, jsxs as jsxs50 } from "react/jsx-runtime";
5188
+ var ReviewCard = forwardRef55(function ReviewCard2({ author, authorAvatar, rating, date, body, photos, verified, subtitle, className, ...props }, ref) {
5189
+ return /* @__PURE__ */ jsxs50(
4529
5190
  "article",
4530
5191
  {
4531
5192
  ref,
4532
5193
  className: cn("border-border bg-panel flex flex-col gap-3 rounded-md border p-4", className),
4533
5194
  ...props,
4534
5195
  children: [
4535
- /* @__PURE__ */ jsxs49("header", { className: "flex items-start gap-3", children: [
4536
- /* @__PURE__ */ jsx56(
5196
+ /* @__PURE__ */ jsxs50("header", { className: "flex items-start gap-3", children: [
5197
+ /* @__PURE__ */ jsx57(
4537
5198
  Avatar,
4538
5199
  {
4539
5200
  src: authorAvatar,
@@ -4541,24 +5202,24 @@ var ReviewCard = forwardRef54(function ReviewCard2({ author, authorAvatar, ratin
4541
5202
  size: "md"
4542
5203
  }
4543
5204
  ),
4544
- /* @__PURE__ */ jsxs49("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
4545
- /* @__PURE__ */ jsxs49("div", { className: "flex items-center gap-2", children: [
4546
- /* @__PURE__ */ jsx56("span", { className: "text-text text-[14px] leading-tight font-semibold", children: author }),
4547
- verified && /* @__PURE__ */ jsxs49(Badge, { variant: "ok", size: "sm", children: [
4548
- /* @__PURE__ */ jsx56(IconGlyph8, { name: "verified", size: 11 }),
5205
+ /* @__PURE__ */ jsxs50("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
5206
+ /* @__PURE__ */ jsxs50("div", { className: "flex items-center gap-2", children: [
5207
+ /* @__PURE__ */ jsx57("span", { className: "text-text text-[14px] leading-tight font-semibold", children: author }),
5208
+ verified && /* @__PURE__ */ jsxs50(Badge, { variant: "ok", size: "sm", children: [
5209
+ /* @__PURE__ */ jsx57(IconGlyph9, { name: "verified", size: 11 }),
4549
5210
  " Verified trip"
4550
5211
  ] })
4551
5212
  ] }),
4552
- subtitle && /* @__PURE__ */ jsx56("span", { className: "text-text-dim text-[11px]", children: subtitle }),
4553
- /* @__PURE__ */ jsxs49("div", { className: "mt-1 flex items-center gap-2", children: [
4554
- /* @__PURE__ */ jsx56(Rating, { value: rating, max: 5, precision: "half", size: "sm", readOnly: true }),
4555
- /* @__PURE__ */ jsx56("span", { className: "text-text-dim text-[11px]", children: "\xB7" }),
4556
- /* @__PURE__ */ jsx56("time", { className: "text-text-dim text-[11px]", children: date })
5213
+ subtitle && /* @__PURE__ */ jsx57("span", { className: "text-text-dim text-[11px]", children: subtitle }),
5214
+ /* @__PURE__ */ jsxs50("div", { className: "mt-1 flex items-center gap-2", children: [
5215
+ /* @__PURE__ */ jsx57(Rating, { value: rating, max: 5, precision: "half", size: "sm", readOnly: true }),
5216
+ /* @__PURE__ */ jsx57("span", { className: "text-text-dim text-[11px]", children: "\xB7" }),
5217
+ /* @__PURE__ */ jsx57("time", { className: "text-text-dim text-[11px]", children: date })
4557
5218
  ] })
4558
5219
  ] })
4559
5220
  ] }),
4560
- /* @__PURE__ */ jsx56("p", { className: "text-text text-[13px] leading-relaxed", children: body }),
4561
- photos && photos.length > 0 && /* @__PURE__ */ jsx56("div", { className: "flex gap-2 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", children: photos.map((src, i) => /* @__PURE__ */ jsx56(
5221
+ /* @__PURE__ */ jsx57("p", { className: "text-text text-[13px] leading-relaxed", children: body }),
5222
+ photos && photos.length > 0 && /* @__PURE__ */ jsx57("div", { className: "flex gap-2 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", children: photos.map((src, i) => /* @__PURE__ */ jsx57(
4562
5223
  "img",
4563
5224
  {
4564
5225
  src,
@@ -4575,11 +5236,11 @@ var ReviewCard = forwardRef54(function ReviewCard2({ author, authorAvatar, ratin
4575
5236
  ReviewCard.displayName = "ReviewCard";
4576
5237
 
4577
5238
  // src/patterns/Dots/Dots.tsx
4578
- import { forwardRef as forwardRef55 } from "react";
4579
- import { jsx as jsx57 } from "react/jsx-runtime";
4580
- var Dots = forwardRef55(function Dots2({ total, current, onChange, className, "aria-label": ariaLabel = "Progress", ...props }, ref) {
5239
+ import { forwardRef as forwardRef56 } from "react";
5240
+ import { jsx as jsx58 } from "react/jsx-runtime";
5241
+ var Dots = forwardRef56(function Dots2({ total, current, onChange, className, "aria-label": ariaLabel = "Progress", ...props }, ref) {
4581
5242
  const interactive = typeof onChange === "function";
4582
- return /* @__PURE__ */ jsx57(
5243
+ return /* @__PURE__ */ jsx58(
4583
5244
  "nav",
4584
5245
  {
4585
5246
  ref,
@@ -4593,7 +5254,7 @@ var Dots = forwardRef55(function Dots2({ total, current, onChange, className, "a
4593
5254
  isActive ? "w-[18px] bg-accent" : "w-[6px] bg-panel-2"
4594
5255
  );
4595
5256
  if (interactive) {
4596
- return /* @__PURE__ */ jsx57(
5257
+ return /* @__PURE__ */ jsx58(
4597
5258
  "button",
4598
5259
  {
4599
5260
  type: "button",
@@ -4610,7 +5271,7 @@ var Dots = forwardRef55(function Dots2({ total, current, onChange, className, "a
4610
5271
  i
4611
5272
  );
4612
5273
  }
4613
- return /* @__PURE__ */ jsx57("span", { "aria-hidden": true, className: sharedClass }, i);
5274
+ return /* @__PURE__ */ jsx58("span", { "aria-hidden": true, className: sharedClass }, i);
4614
5275
  })
4615
5276
  }
4616
5277
  );
@@ -4619,15 +5280,15 @@ Dots.displayName = "Dots";
4619
5280
 
4620
5281
  // src/patterns/Dropzone/Dropzone.tsx
4621
5282
  import {
4622
- forwardRef as forwardRef56,
4623
- useState as useState14
5283
+ forwardRef as forwardRef57,
5284
+ useState as useState16
4624
5285
  } from "react";
4625
- import { jsx as jsx58, jsxs as jsxs50 } from "react/jsx-runtime";
5286
+ import { jsx as jsx59, jsxs as jsxs51 } from "react/jsx-runtime";
4626
5287
  function listToArray(list) {
4627
5288
  if (!list) return [];
4628
5289
  return Array.from(list);
4629
5290
  }
4630
- var Dropzone = forwardRef56(function Dropzone2({
5291
+ var Dropzone = forwardRef57(function Dropzone2({
4631
5292
  onFiles,
4632
5293
  accept,
4633
5294
  multiple = true,
@@ -4638,7 +5299,7 @@ var Dropzone = forwardRef56(function Dropzone2({
4638
5299
  className,
4639
5300
  ...props
4640
5301
  }, ref) {
4641
- const [isDragging, setIsDragging] = useState14(false);
5302
+ const [isDragging, setIsDragging] = useState16(false);
4642
5303
  const onDragOver = (e) => {
4643
5304
  if (disabled) return;
4644
5305
  e.preventDefault();
@@ -4652,7 +5313,7 @@ var Dropzone = forwardRef56(function Dropzone2({
4652
5313
  const files = listToArray(e.dataTransfer.files);
4653
5314
  if (files.length) onFiles?.(files);
4654
5315
  };
4655
- return /* @__PURE__ */ jsxs50(
5316
+ return /* @__PURE__ */ jsxs51(
4656
5317
  "label",
4657
5318
  {
4658
5319
  ref,
@@ -4669,7 +5330,7 @@ var Dropzone = forwardRef56(function Dropzone2({
4669
5330
  ),
4670
5331
  ...props,
4671
5332
  children: [
4672
- /* @__PURE__ */ jsx58(
5333
+ /* @__PURE__ */ jsx59(
4673
5334
  "input",
4674
5335
  {
4675
5336
  type: "file",
@@ -4685,7 +5346,7 @@ var Dropzone = forwardRef56(function Dropzone2({
4685
5346
  }
4686
5347
  }
4687
5348
  ),
4688
- /* @__PURE__ */ jsx58(
5349
+ /* @__PURE__ */ jsx59(
4689
5350
  "div",
4690
5351
  {
4691
5352
  "aria-hidden": true,
@@ -4693,8 +5354,8 @@ var Dropzone = forwardRef56(function Dropzone2({
4693
5354
  children: icon
4694
5355
  }
4695
5356
  ),
4696
- /* @__PURE__ */ jsx58("div", { className: "mb-1 text-[13px] font-medium", children: title }),
4697
- description && /* @__PURE__ */ jsx58("div", { className: "text-text-dim text-[11px]", children: description })
5357
+ /* @__PURE__ */ jsx59("div", { className: "mb-1 text-[13px] font-medium", children: title }),
5358
+ description && /* @__PURE__ */ jsx59("div", { className: "text-text-dim text-[11px]", children: description })
4698
5359
  ]
4699
5360
  }
4700
5361
  );
@@ -4702,10 +5363,10 @@ var Dropzone = forwardRef56(function Dropzone2({
4702
5363
  Dropzone.displayName = "Dropzone";
4703
5364
 
4704
5365
  // src/patterns/EmptyState/EmptyState.tsx
4705
- import { cva as cva11 } from "class-variance-authority";
4706
- import { forwardRef as forwardRef57 } from "react";
4707
- import { jsx as jsx59, jsxs as jsxs51 } from "react/jsx-runtime";
4708
- var plateStyles = cva11("grid h-12 w-12 place-items-center rounded-base text-[22px]", {
5366
+ import { cva as cva12 } from "class-variance-authority";
5367
+ import { forwardRef as forwardRef58 } from "react";
5368
+ import { jsx as jsx60, jsxs as jsxs52 } from "react/jsx-runtime";
5369
+ var plateStyles = cva12("grid h-12 w-12 place-items-center rounded-base text-[22px]", {
4709
5370
  variants: {
4710
5371
  tone: {
4711
5372
  neutral: "bg-panel-2 text-text-muted",
@@ -4717,8 +5378,8 @@ var plateStyles = cva11("grid h-12 w-12 place-items-center rounded-base text-[22
4717
5378
  },
4718
5379
  defaultVariants: { tone: "neutral" }
4719
5380
  });
4720
- var EmptyState = forwardRef57(function EmptyState2({ icon, title, description, action, chips, tone, className, ...props }, ref) {
4721
- return /* @__PURE__ */ jsxs51(
5381
+ var EmptyState = forwardRef58(function EmptyState2({ icon, title, description, action, chips, tone, className, ...props }, ref) {
5382
+ return /* @__PURE__ */ jsxs52(
4722
5383
  "div",
4723
5384
  {
4724
5385
  ref,
@@ -4728,10 +5389,10 @@ var EmptyState = forwardRef57(function EmptyState2({ icon, title, description, a
4728
5389
  ),
4729
5390
  ...props,
4730
5391
  children: [
4731
- icon != null && /* @__PURE__ */ jsx59("span", { "aria-hidden": true, className: plateStyles({ tone: tone ?? "neutral" }), children: icon }),
4732
- /* @__PURE__ */ jsx59("div", { className: "text-[14px] font-medium", children: title }),
4733
- description && /* @__PURE__ */ jsx59("div", { className: "text-text-muted max-w-[260px] text-[12px] leading-[1.5]", children: description }),
4734
- chips && chips.length > 0 && /* @__PURE__ */ jsx59("div", { className: "flex w-full flex-col gap-1", children: chips.map((c, i) => /* @__PURE__ */ jsx59(
5392
+ icon != null && /* @__PURE__ */ jsx60("span", { "aria-hidden": true, className: plateStyles({ tone: tone ?? "neutral" }), children: icon }),
5393
+ /* @__PURE__ */ jsx60("div", { className: "text-[14px] font-medium", children: title }),
5394
+ description && /* @__PURE__ */ jsx60("div", { className: "text-text-muted max-w-[260px] text-[12px] leading-[1.5]", children: description }),
5395
+ chips && chips.length > 0 && /* @__PURE__ */ jsx60("div", { className: "flex w-full flex-col gap-1", children: chips.map((c, i) => /* @__PURE__ */ jsx60(
4735
5396
  "button",
4736
5397
  {
4737
5398
  type: "button",
@@ -4753,18 +5414,18 @@ var EmptyState = forwardRef57(function EmptyState2({ icon, title, description, a
4753
5414
  EmptyState.displayName = "EmptyState";
4754
5415
 
4755
5416
  // src/patterns/FileChip/FileChip.tsx
4756
- import { forwardRef as forwardRef58 } from "react";
4757
- import { jsx as jsx60, jsxs as jsxs52 } from "react/jsx-runtime";
5417
+ import { forwardRef as forwardRef59 } from "react";
5418
+ import { jsx as jsx61, jsxs as jsxs53 } from "react/jsx-runtime";
4758
5419
  function deriveExt(name) {
4759
5420
  const dot = name.lastIndexOf(".");
4760
5421
  if (dot < 0) return "FILE";
4761
5422
  return name.slice(dot + 1).slice(0, 4).toUpperCase();
4762
5423
  }
4763
- var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onRemove, failed, className, ...props }, ref) {
5424
+ var FileChip = forwardRef59(function FileChip2({ name, size, progress, icon, onRemove, failed, className, ...props }, ref) {
4764
5425
  const ext = deriveExt(name);
4765
5426
  const showProgress = typeof progress === "number";
4766
5427
  const isComplete = showProgress && progress >= 100;
4767
- return /* @__PURE__ */ jsxs52(
5428
+ return /* @__PURE__ */ jsxs53(
4768
5429
  "div",
4769
5430
  {
4770
5431
  ref,
@@ -4774,7 +5435,7 @@ var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onR
4774
5435
  ),
4775
5436
  ...props,
4776
5437
  children: [
4777
- /* @__PURE__ */ jsx60(
5438
+ /* @__PURE__ */ jsx61(
4778
5439
  "span",
4779
5440
  {
4780
5441
  "aria-hidden": true,
@@ -4782,17 +5443,17 @@ var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onR
4782
5443
  children: icon ?? ext
4783
5444
  }
4784
5445
  ),
4785
- /* @__PURE__ */ jsxs52("div", { className: "min-w-0 flex-1", children: [
4786
- /* @__PURE__ */ jsx60("div", { className: "truncate text-[12px] font-medium", children: name }),
4787
- /* @__PURE__ */ jsxs52("div", { className: cn("font-mono text-[10px]", failed ? "text-err" : "text-text-dim"), children: [
5446
+ /* @__PURE__ */ jsxs53("div", { className: "min-w-0 flex-1", children: [
5447
+ /* @__PURE__ */ jsx61("div", { className: "truncate text-[12px] font-medium", children: name }),
5448
+ /* @__PURE__ */ jsxs53("div", { className: cn("font-mono text-[10px]", failed ? "text-err" : "text-text-dim"), children: [
4788
5449
  size,
4789
- showProgress && !isComplete && /* @__PURE__ */ jsxs52("span", { children: [
5450
+ showProgress && !isComplete && /* @__PURE__ */ jsxs53("span", { children: [
4790
5451
  " \xB7 ",
4791
5452
  Math.round(progress),
4792
5453
  "%"
4793
5454
  ] })
4794
5455
  ] }),
4795
- showProgress && !isComplete && /* @__PURE__ */ jsx60("div", { className: "bg-panel mt-1 h-[2px] overflow-hidden rounded-full", children: /* @__PURE__ */ jsx60(
5456
+ showProgress && !isComplete && /* @__PURE__ */ jsx61("div", { className: "bg-panel mt-1 h-[2px] overflow-hidden rounded-full", children: /* @__PURE__ */ jsx61(
4796
5457
  "div",
4797
5458
  {
4798
5459
  className: cn(
@@ -4803,7 +5464,7 @@ var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onR
4803
5464
  }
4804
5465
  ) })
4805
5466
  ] }),
4806
- onRemove && /* @__PURE__ */ jsx60(
5467
+ onRemove && /* @__PURE__ */ jsx61(
4807
5468
  "button",
4808
5469
  {
4809
5470
  type: "button",
@@ -4823,10 +5484,10 @@ var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onR
4823
5484
  FileChip.displayName = "FileChip";
4824
5485
 
4825
5486
  // src/patterns/FilterPanel/FilterPanel.tsx
4826
- import { forwardRef as forwardRef59, useCallback as useCallback12, useState as useState15 } from "react";
4827
- import { jsx as jsx61, jsxs as jsxs53 } from "react/jsx-runtime";
5487
+ import { forwardRef as forwardRef60, useCallback as useCallback12, useState as useState17 } from "react";
5488
+ import { jsx as jsx62, jsxs as jsxs54 } from "react/jsx-runtime";
4828
5489
  var EMPTY = Object.freeze({});
4829
- var FilterPanel = forwardRef59(function FilterPanel2({
5490
+ var FilterPanel = forwardRef60(function FilterPanel2({
4830
5491
  facets,
4831
5492
  value,
4832
5493
  defaultValue,
@@ -4859,7 +5520,7 @@ var FilterPanel = forwardRef59(function FilterPanel2({
4859
5520
  setSelection(EMPTY);
4860
5521
  onReset?.();
4861
5522
  }, [setSelection, onReset]);
4862
- return /* @__PURE__ */ jsxs53(
5523
+ return /* @__PURE__ */ jsxs54(
4863
5524
  "div",
4864
5525
  {
4865
5526
  ref,
@@ -4871,10 +5532,10 @@ var FilterPanel = forwardRef59(function FilterPanel2({
4871
5532
  ),
4872
5533
  ...props,
4873
5534
  children: [
4874
- /* @__PURE__ */ jsxs53("div", { className: "flex items-center gap-2", children: [
4875
- /* @__PURE__ */ jsx61("span", { className: "text-text-dim font-mono text-[10px] tracking-[1.4px] uppercase", children: title }),
4876
- total > 0 && /* @__PURE__ */ jsx61(Badge, { size: "sm", variant: "accent", children: total }),
4877
- /* @__PURE__ */ jsx61(
5535
+ /* @__PURE__ */ jsxs54("div", { className: "flex items-center gap-2", children: [
5536
+ /* @__PURE__ */ jsx62("span", { className: "text-text-dim font-mono text-[10px] tracking-[1.4px] uppercase", children: title }),
5537
+ total > 0 && /* @__PURE__ */ jsx62(Badge, { size: "sm", variant: "accent", children: total }),
5538
+ /* @__PURE__ */ jsx62(
4878
5539
  Button,
4879
5540
  {
4880
5541
  type: "button",
@@ -4887,7 +5548,7 @@ var FilterPanel = forwardRef59(function FilterPanel2({
4887
5548
  }
4888
5549
  )
4889
5550
  ] }),
4890
- facets.map((facet) => /* @__PURE__ */ jsx61(
5551
+ facets.map((facet) => /* @__PURE__ */ jsx62(
4891
5552
  FilterFacetGroup,
4892
5553
  {
4893
5554
  facet,
@@ -4904,12 +5565,12 @@ var FilterPanel = forwardRef59(function FilterPanel2({
4904
5565
  FilterPanel.displayName = "FilterPanel";
4905
5566
  function FilterFacetGroup({ facet, selected, counts, onToggle }) {
4906
5567
  const collapsible = facet.collapsible ?? true;
4907
- const [open, setOpen] = useState15(facet.defaultOpen ?? true);
5568
+ const [open, setOpen] = useState17(facet.defaultOpen ?? true);
4908
5569
  const isOpen = !collapsible || open;
4909
5570
  const selectedCount = selected.length;
4910
5571
  const headingClass = "text-text-muted flex items-center gap-[6px] font-mono text-[10px] tracking-[1.4px] uppercase";
4911
- return /* @__PURE__ */ jsxs53("section", { className: "flex flex-col gap-1", children: [
4912
- collapsible ? /* @__PURE__ */ jsxs53(
5572
+ return /* @__PURE__ */ jsxs54("section", { className: "flex flex-col gap-1", children: [
5573
+ collapsible ? /* @__PURE__ */ jsxs54(
4913
5574
  "button",
4914
5575
  {
4915
5576
  type: "button",
@@ -4922,20 +5583,20 @@ function FilterFacetGroup({ facet, selected, counts, onToggle }) {
4922
5583
  "hover:text-text"
4923
5584
  ),
4924
5585
  children: [
4925
- /* @__PURE__ */ jsx61("span", { className: "flex-1 text-left", children: facet.label }),
4926
- selectedCount > 0 && /* @__PURE__ */ jsx61(Badge, { size: "sm", variant: "neutral", children: selectedCount }),
4927
- /* @__PURE__ */ jsx61("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
5586
+ /* @__PURE__ */ jsx62("span", { className: "flex-1 text-left", children: facet.label }),
5587
+ selectedCount > 0 && /* @__PURE__ */ jsx62(Badge, { size: "sm", variant: "neutral", children: selectedCount }),
5588
+ /* @__PURE__ */ jsx62("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
4928
5589
  ]
4929
5590
  }
4930
- ) : /* @__PURE__ */ jsxs53("div", { className: cn(headingClass, "px-1 py-[2px]"), children: [
4931
- /* @__PURE__ */ jsx61("span", { className: "flex-1", children: facet.label }),
4932
- selectedCount > 0 && /* @__PURE__ */ jsx61(Badge, { size: "sm", variant: "neutral", children: selectedCount })
5591
+ ) : /* @__PURE__ */ jsxs54("div", { className: cn(headingClass, "px-1 py-[2px]"), children: [
5592
+ /* @__PURE__ */ jsx62("span", { className: "flex-1", children: facet.label }),
5593
+ selectedCount > 0 && /* @__PURE__ */ jsx62(Badge, { size: "sm", variant: "neutral", children: selectedCount })
4933
5594
  ] }),
4934
- isOpen && /* @__PURE__ */ jsx61("ul", { className: "m-0 flex list-none flex-col gap-[2px] p-0", children: facet.options.map((option) => {
5595
+ isOpen && /* @__PURE__ */ jsx62("ul", { className: "m-0 flex list-none flex-col gap-[2px] p-0", children: facet.options.map((option) => {
4935
5596
  const isSelected = selected.includes(option.value);
4936
5597
  const count = counts?.[option.value];
4937
- return /* @__PURE__ */ jsxs53("li", { className: "flex items-center gap-2 px-1 py-[3px]", children: [
4938
- /* @__PURE__ */ jsx61(
5598
+ return /* @__PURE__ */ jsxs54("li", { className: "flex items-center gap-2 px-1 py-[3px]", children: [
5599
+ /* @__PURE__ */ jsx62(
4939
5600
  Checkbox,
4940
5601
  {
4941
5602
  checked: isSelected,
@@ -4943,25 +5604,25 @@ function FilterFacetGroup({ facet, selected, counts, onToggle }) {
4943
5604
  label: option.label
4944
5605
  }
4945
5606
  ),
4946
- typeof count === "number" && /* @__PURE__ */ jsx61("span", { className: "text-text-dim ml-auto font-mono text-[10px] tabular-nums", children: count })
5607
+ typeof count === "number" && /* @__PURE__ */ jsx62("span", { className: "text-text-dim ml-auto font-mono text-[10px] tabular-nums", children: count })
4947
5608
  ] }, option.value);
4948
5609
  }) })
4949
5610
  ] });
4950
5611
  }
4951
5612
 
4952
5613
  // src/patterns/HealthScore/HealthScore.tsx
4953
- import { forwardRef as forwardRef61 } from "react";
5614
+ import { forwardRef as forwardRef62 } from "react";
4954
5615
 
4955
5616
  // src/patterns/RadialProgress/RadialProgress.tsx
4956
- import { forwardRef as forwardRef60 } from "react";
4957
- import { jsx as jsx62, jsxs as jsxs54 } from "react/jsx-runtime";
5617
+ import { forwardRef as forwardRef61 } from "react";
5618
+ import { jsx as jsx63, jsxs as jsxs55 } from "react/jsx-runtime";
4958
5619
  var toneStrokeClass = {
4959
5620
  accent: "stroke-accent",
4960
5621
  ok: "stroke-ok",
4961
5622
  warn: "stroke-warn",
4962
5623
  err: "stroke-err"
4963
5624
  };
4964
- var RadialProgress = forwardRef60(
5625
+ var RadialProgress = forwardRef61(
4965
5626
  function RadialProgress2({
4966
5627
  value,
4967
5628
  max = 100,
@@ -4979,7 +5640,7 @@ var RadialProgress = forwardRef60(
4979
5640
  const c = 2 * Math.PI * r;
4980
5641
  const dash = pct / 100 * c;
4981
5642
  const resolvedTone = tone ?? (clamped >= max ? "ok" : "accent");
4982
- return /* @__PURE__ */ jsxs54(
5643
+ return /* @__PURE__ */ jsxs55(
4983
5644
  "div",
4984
5645
  {
4985
5646
  ref,
@@ -4992,8 +5653,8 @@ var RadialProgress = forwardRef60(
4992
5653
  style: { width: size, height: size },
4993
5654
  ...props,
4994
5655
  children: [
4995
- /* @__PURE__ */ jsxs54("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, children: [
4996
- /* @__PURE__ */ jsx62(
5656
+ /* @__PURE__ */ jsxs55("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, children: [
5657
+ /* @__PURE__ */ jsx63(
4997
5658
  "circle",
4998
5659
  {
4999
5660
  cx: size / 2,
@@ -5004,7 +5665,7 @@ var RadialProgress = forwardRef60(
5004
5665
  className: "stroke-panel-2"
5005
5666
  }
5006
5667
  ),
5007
- /* @__PURE__ */ jsx62(
5668
+ /* @__PURE__ */ jsx63(
5008
5669
  "circle",
5009
5670
  {
5010
5671
  cx: size / 2,
@@ -5022,7 +5683,7 @@ var RadialProgress = forwardRef60(
5022
5683
  }
5023
5684
  )
5024
5685
  ] }),
5025
- /* @__PURE__ */ jsx62("div", { className: "absolute inset-0 grid place-items-center font-mono text-[11px] font-medium tabular-nums", children: children ?? `${Math.round(pct)}%` })
5686
+ /* @__PURE__ */ jsx63("div", { className: "absolute inset-0 grid place-items-center font-mono text-[11px] font-medium tabular-nums", children: children ?? `${Math.round(pct)}%` })
5026
5687
  ]
5027
5688
  }
5028
5689
  );
@@ -5031,7 +5692,7 @@ var RadialProgress = forwardRef60(
5031
5692
  RadialProgress.displayName = "RadialProgress";
5032
5693
 
5033
5694
  // src/patterns/HealthScore/HealthScore.tsx
5034
- import { jsx as jsx63, jsxs as jsxs55 } from "react/jsx-runtime";
5695
+ import { jsx as jsx64, jsxs as jsxs56 } from "react/jsx-runtime";
5035
5696
  function deltaTone(delta) {
5036
5697
  if (delta > 0) return "ok";
5037
5698
  if (delta < 0) return "err";
@@ -5048,7 +5709,7 @@ var toneTextClass = {
5048
5709
  warn: "text-warn",
5049
5710
  err: "text-err"
5050
5711
  };
5051
- var HealthScore = forwardRef61(function HealthScore2({
5712
+ var HealthScore = forwardRef62(function HealthScore2({
5052
5713
  value,
5053
5714
  max = 100,
5054
5715
  delta,
@@ -5063,7 +5724,7 @@ var HealthScore = forwardRef61(function HealthScore2({
5063
5724
  const pct = max > 0 ? Math.round(Math.min(max, Math.max(0, value)) / max * 100) : 0;
5064
5725
  const resolvedTone = tone ?? (pct >= 80 ? "ok" : pct >= 50 ? "accent" : "warn");
5065
5726
  const indicatorTone = typeof delta === "number" ? deltaTone(delta) : "accent";
5066
- const core = /* @__PURE__ */ jsxs55(
5727
+ const core = /* @__PURE__ */ jsxs56(
5067
5728
  "div",
5068
5729
  {
5069
5730
  ref,
@@ -5071,10 +5732,10 @@ var HealthScore = forwardRef61(function HealthScore2({
5071
5732
  "aria-label": ariaLabel ?? `${pct}% health`,
5072
5733
  ...props,
5073
5734
  children: [
5074
- /* @__PURE__ */ jsx63(RadialProgress, { value, max, size, tone: resolvedTone }),
5075
- label && /* @__PURE__ */ jsx63("div", { className: "text-text-muted mt-1 text-[12px] leading-tight", children: label }),
5076
- typeof delta === "number" && /* @__PURE__ */ jsxs55("div", { className: cn("font-mono text-[11px] tabular-nums", toneTextClass[indicatorTone]), children: [
5077
- /* @__PURE__ */ jsx63("span", { "aria-hidden": true, children: deltaGlyph(delta) }),
5735
+ /* @__PURE__ */ jsx64(RadialProgress, { value, max, size, tone: resolvedTone }),
5736
+ label && /* @__PURE__ */ jsx64("div", { className: "text-text-muted mt-1 text-[12px] leading-tight", children: label }),
5737
+ typeof delta === "number" && /* @__PURE__ */ jsxs56("div", { className: cn("font-mono text-[11px] tabular-nums", toneTextClass[indicatorTone]), children: [
5738
+ /* @__PURE__ */ jsx64("span", { "aria-hidden": true, children: deltaGlyph(delta) }),
5078
5739
  " ",
5079
5740
  Math.abs(delta)
5080
5741
  ] })
@@ -5084,15 +5745,15 @@ var HealthScore = forwardRef61(function HealthScore2({
5084
5745
  if (!breakdown || breakdown.length === 0) {
5085
5746
  return core;
5086
5747
  }
5087
- return /* @__PURE__ */ jsx63(
5748
+ return /* @__PURE__ */ jsx64(
5088
5749
  HoverCard,
5089
5750
  {
5090
- trigger: /* @__PURE__ */ jsx63("span", { className: "inline-flex", children: core }),
5091
- content: /* @__PURE__ */ jsxs55("div", { className: "flex min-w-[180px] flex-col gap-2", children: [
5092
- /* @__PURE__ */ jsx63("div", { className: "text-text-dim font-mono text-[9px] tracking-[1.4px] uppercase", children: "Breakdown" }),
5093
- /* @__PURE__ */ jsx63("ul", { className: "m-0 flex list-none flex-col gap-1 p-0 text-[12px]", children: breakdown.map((entry, i) => /* @__PURE__ */ jsxs55("li", { className: "flex items-center gap-2", children: [
5094
- /* @__PURE__ */ jsx63("span", { className: "text-text-muted flex-1 truncate", children: entry.label }),
5095
- /* @__PURE__ */ jsx63(
5751
+ trigger: /* @__PURE__ */ jsx64("span", { className: "inline-flex", children: core }),
5752
+ content: /* @__PURE__ */ jsxs56("div", { className: "flex min-w-[180px] flex-col gap-2", children: [
5753
+ /* @__PURE__ */ jsx64("div", { className: "text-text-dim font-mono text-[9px] tracking-[1.4px] uppercase", children: "Breakdown" }),
5754
+ /* @__PURE__ */ jsx64("ul", { className: "m-0 flex list-none flex-col gap-1 p-0 text-[12px]", children: breakdown.map((entry, i) => /* @__PURE__ */ jsxs56("li", { className: "flex items-center gap-2", children: [
5755
+ /* @__PURE__ */ jsx64("span", { className: "text-text-muted flex-1 truncate", children: entry.label }),
5756
+ /* @__PURE__ */ jsx64(
5096
5757
  "span",
5097
5758
  {
5098
5759
  className: cn(
@@ -5110,21 +5771,21 @@ var HealthScore = forwardRef61(function HealthScore2({
5110
5771
  HealthScore.displayName = "HealthScore";
5111
5772
 
5112
5773
  // src/patterns/LargeTitle/LargeTitle.tsx
5113
- import { forwardRef as forwardRef62 } from "react";
5114
- import { jsx as jsx64, jsxs as jsxs56 } from "react/jsx-runtime";
5115
- var LargeTitle = forwardRef62(function LargeTitle2({ title, eyebrow, trailing, className, ...props }, ref) {
5116
- return /* @__PURE__ */ jsxs56(
5774
+ import { forwardRef as forwardRef63 } from "react";
5775
+ import { jsx as jsx65, jsxs as jsxs57 } from "react/jsx-runtime";
5776
+ var LargeTitle = forwardRef63(function LargeTitle2({ title, eyebrow, trailing, className, ...props }, ref) {
5777
+ return /* @__PURE__ */ jsxs57(
5117
5778
  "header",
5118
5779
  {
5119
5780
  ref,
5120
5781
  className: cn("px-screen flex items-end justify-between gap-3 py-3 pb-4", className),
5121
5782
  ...props,
5122
5783
  children: [
5123
- /* @__PURE__ */ jsxs56("div", { className: "min-w-0 flex-1", children: [
5124
- eyebrow && /* @__PURE__ */ jsx64("div", { className: "text-m-eyebrow text-accent mb-[6px] font-mono tracking-wide uppercase", children: eyebrow }),
5125
- /* @__PURE__ */ jsx64("h1", { className: "text-m-h1 m-0 truncate leading-tight font-medium tracking-tight", children: title })
5784
+ /* @__PURE__ */ jsxs57("div", { className: "min-w-0 flex-1", children: [
5785
+ eyebrow && /* @__PURE__ */ jsx65("div", { className: "text-m-eyebrow text-accent mb-[6px] font-mono tracking-wide uppercase", children: eyebrow }),
5786
+ /* @__PURE__ */ jsx65("h1", { className: "text-m-h1 m-0 truncate leading-tight font-medium tracking-tight", children: title })
5126
5787
  ] }),
5127
- trailing && /* @__PURE__ */ jsx64("div", { className: "shrink-0", children: trailing })
5788
+ trailing && /* @__PURE__ */ jsx65("div", { className: "shrink-0", children: trailing })
5128
5789
  ]
5129
5790
  }
5130
5791
  );
@@ -5133,10 +5794,10 @@ LargeTitle.displayName = "LargeTitle";
5133
5794
 
5134
5795
  // src/patterns/Menubar/Menubar.tsx
5135
5796
  import * as RadixMenubar from "@radix-ui/react-menubar";
5136
- import { forwardRef as forwardRef63 } from "react";
5137
- import { jsx as jsx65, jsxs as jsxs57 } from "react/jsx-runtime";
5138
- var Menubar = forwardRef63(function Menubar2({ className, ...props }, ref) {
5139
- return /* @__PURE__ */ jsx65(
5797
+ import { forwardRef as forwardRef64 } from "react";
5798
+ import { jsx as jsx66, jsxs as jsxs58 } from "react/jsx-runtime";
5799
+ var Menubar = forwardRef64(function Menubar2({ className, ...props }, ref) {
5800
+ return /* @__PURE__ */ jsx66(
5140
5801
  RadixMenubar.Root,
5141
5802
  {
5142
5803
  ref,
@@ -5150,9 +5811,9 @@ var Menubar = forwardRef63(function Menubar2({ className, ...props }, ref) {
5150
5811
  });
5151
5812
  Menubar.displayName = "Menubar";
5152
5813
  var MenubarMenu = RadixMenubar.Menu;
5153
- var MenubarTrigger = forwardRef63(
5814
+ var MenubarTrigger = forwardRef64(
5154
5815
  function MenubarTrigger2({ className, ...props }, ref) {
5155
- return /* @__PURE__ */ jsx65(
5816
+ return /* @__PURE__ */ jsx66(
5156
5817
  RadixMenubar.Trigger,
5157
5818
  {
5158
5819
  ref,
@@ -5169,9 +5830,9 @@ var MenubarTrigger = forwardRef63(
5169
5830
  }
5170
5831
  );
5171
5832
  MenubarTrigger.displayName = "MenubarTrigger";
5172
- var MenubarContent = forwardRef63(
5833
+ var MenubarContent = forwardRef64(
5173
5834
  function MenubarContent2({ className, sideOffset = 6, align = "start", ...props }, ref) {
5174
- return /* @__PURE__ */ jsx65(RadixMenubar.Portal, { children: /* @__PURE__ */ jsx65(
5835
+ return /* @__PURE__ */ jsx66(RadixMenubar.Portal, { children: /* @__PURE__ */ jsx66(
5175
5836
  RadixMenubar.Content,
5176
5837
  {
5177
5838
  ref,
@@ -5193,24 +5854,24 @@ var itemBase3 = cn(
5193
5854
  "data-[highlighted]:bg-panel-2",
5194
5855
  "data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed"
5195
5856
  );
5196
- var MenubarItem = forwardRef63(function MenubarItem2({ trailing, destructive, className, children, ...props }, ref) {
5197
- return /* @__PURE__ */ jsxs57(
5857
+ var MenubarItem = forwardRef64(function MenubarItem2({ trailing, destructive, className, children, ...props }, ref) {
5858
+ return /* @__PURE__ */ jsxs58(
5198
5859
  RadixMenubar.Item,
5199
5860
  {
5200
5861
  ref,
5201
5862
  className: cn(itemBase3, destructive ? "text-err" : "text-text", className),
5202
5863
  ...props,
5203
5864
  children: [
5204
- /* @__PURE__ */ jsx65("span", { className: "flex-1", children }),
5205
- trailing && /* @__PURE__ */ jsx65("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
5865
+ /* @__PURE__ */ jsx66("span", { className: "flex-1", children }),
5866
+ trailing && /* @__PURE__ */ jsx66("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
5206
5867
  ]
5207
5868
  }
5208
5869
  );
5209
5870
  });
5210
5871
  MenubarItem.displayName = "MenubarItem";
5211
- var MenubarSeparator = forwardRef63(
5872
+ var MenubarSeparator = forwardRef64(
5212
5873
  function MenubarSeparator2({ className, ...props }, ref) {
5213
- return /* @__PURE__ */ jsx65(
5874
+ return /* @__PURE__ */ jsx66(
5214
5875
  RadixMenubar.Separator,
5215
5876
  {
5216
5877
  ref,
@@ -5225,22 +5886,22 @@ MenubarSeparator.displayName = "MenubarSeparator";
5225
5886
  // src/patterns/NavBar/NavBar.tsx
5226
5887
  import * as RadixNav from "@radix-ui/react-navigation-menu";
5227
5888
  import {
5228
- forwardRef as forwardRef65,
5889
+ forwardRef as forwardRef66,
5229
5890
  useCallback as useCallback14,
5230
5891
  useEffect as useEffect15,
5231
- useRef as useRef12,
5232
- useState as useState17
5892
+ useRef as useRef13,
5893
+ useState as useState19
5233
5894
  } from "react";
5234
5895
 
5235
5896
  // src/patterns/Sidebar/Sidebar.tsx
5236
5897
  import {
5237
- forwardRef as forwardRef64,
5898
+ forwardRef as forwardRef65,
5238
5899
  useCallback as useCallback13,
5239
- useState as useState16
5900
+ useState as useState18
5240
5901
  } from "react";
5241
- import { Fragment as Fragment4, jsx as jsx66, jsxs as jsxs58 } from "react/jsx-runtime";
5242
- var Sidebar = forwardRef64(function Sidebar2({ width = 240, className, style, ...props }, ref) {
5243
- return /* @__PURE__ */ jsx66(
5902
+ import { Fragment as Fragment4, jsx as jsx67, jsxs as jsxs59 } from "react/jsx-runtime";
5903
+ var Sidebar = forwardRef65(function Sidebar2({ width = 240, className, style, ...props }, ref) {
5904
+ return /* @__PURE__ */ jsx67(
5244
5905
  "aside",
5245
5906
  {
5246
5907
  ref,
@@ -5254,12 +5915,12 @@ var Sidebar = forwardRef64(function Sidebar2({ width = 240, className, style, ..
5254
5915
  );
5255
5916
  });
5256
5917
  Sidebar.displayName = "Sidebar";
5257
- var NavItem = forwardRef64(
5918
+ var NavItem = forwardRef65(
5258
5919
  function NavItem2({ icon, label, active, badge, href, disabled, className, ...props }, ref) {
5259
- const inner = /* @__PURE__ */ jsxs58(Fragment4, { children: [
5260
- icon && /* @__PURE__ */ jsx66("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: icon }),
5261
- /* @__PURE__ */ jsx66("span", { className: "flex-1 truncate", children: label }),
5262
- badge != null && /* @__PURE__ */ jsx66(
5920
+ const inner = /* @__PURE__ */ jsxs59(Fragment4, { children: [
5921
+ icon && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: icon }),
5922
+ /* @__PURE__ */ jsx67("span", { className: "flex-1 truncate", children: label }),
5923
+ badge != null && /* @__PURE__ */ jsx67(
5263
5924
  "span",
5264
5925
  {
5265
5926
  className: cn(
@@ -5280,7 +5941,7 @@ var NavItem = forwardRef64(
5280
5941
  );
5281
5942
  if (href) {
5282
5943
  const anchorProps = props;
5283
- return /* @__PURE__ */ jsx66(
5944
+ return /* @__PURE__ */ jsx67(
5284
5945
  "a",
5285
5946
  {
5286
5947
  ref,
@@ -5294,7 +5955,7 @@ var NavItem = forwardRef64(
5294
5955
  );
5295
5956
  }
5296
5957
  const buttonProps = props;
5297
- return /* @__PURE__ */ jsx66(
5958
+ return /* @__PURE__ */ jsx67(
5298
5959
  "button",
5299
5960
  {
5300
5961
  ref,
@@ -5309,7 +5970,7 @@ var NavItem = forwardRef64(
5309
5970
  }
5310
5971
  );
5311
5972
  NavItem.displayName = "NavItem";
5312
- var NavSection = forwardRef64(function NavSection2({
5973
+ var NavSection = forwardRef65(function NavSection2({
5313
5974
  label,
5314
5975
  icon,
5315
5976
  action,
@@ -5323,7 +5984,7 @@ var NavSection = forwardRef64(function NavSection2({
5323
5984
  ...props
5324
5985
  }, ref) {
5325
5986
  const isControlled = open !== void 0;
5326
- const [internalOpen, setInternalOpen] = useState16(defaultOpen);
5987
+ const [internalOpen, setInternalOpen] = useState18(defaultOpen);
5327
5988
  const isOpen = !collapsible || (isControlled ? open : internalOpen);
5328
5989
  const toggle = useCallback13(() => {
5329
5990
  const next = !isOpen;
@@ -5331,8 +5992,8 @@ var NavSection = forwardRef64(function NavSection2({
5331
5992
  onOpenChange?.(next);
5332
5993
  }, [isOpen, isControlled, onOpenChange]);
5333
5994
  const eyebrowClass = "text-text-dim flex items-center gap-[6px] px-2 pt-2 font-mono text-[9px] tracking-[1.4px] uppercase";
5334
- return /* @__PURE__ */ jsxs58("div", { ref, className: cn("flex flex-col gap-1", className), ...props, children: [
5335
- collapsible ? /* @__PURE__ */ jsxs58(
5995
+ return /* @__PURE__ */ jsxs59("div", { ref, className: cn("flex flex-col gap-1", className), ...props, children: [
5996
+ collapsible ? /* @__PURE__ */ jsxs59(
5336
5997
  "button",
5337
5998
  {
5338
5999
  type: "button",
@@ -5345,18 +6006,18 @@ var NavSection = forwardRef64(function NavSection2({
5345
6006
  "hover:text-text-muted"
5346
6007
  ),
5347
6008
  children: [
5348
- icon != null && /* @__PURE__ */ jsx66("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
5349
- /* @__PURE__ */ jsx66("span", { className: "flex-1 text-left", children: label }),
6009
+ icon != null && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
6010
+ /* @__PURE__ */ jsx67("span", { className: "flex-1 text-left", children: label }),
5350
6011
  action,
5351
- /* @__PURE__ */ jsx66("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
6012
+ /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
5352
6013
  ]
5353
6014
  }
5354
- ) : /* @__PURE__ */ jsxs58("div", { className: eyebrowClass, children: [
5355
- icon != null && /* @__PURE__ */ jsx66("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
5356
- /* @__PURE__ */ jsx66("span", { className: "flex-1", children: label }),
6015
+ ) : /* @__PURE__ */ jsxs59("div", { className: eyebrowClass, children: [
6016
+ icon != null && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
6017
+ /* @__PURE__ */ jsx67("span", { className: "flex-1", children: label }),
5357
6018
  action
5358
6019
  ] }),
5359
- isOpen && /* @__PURE__ */ jsx66(
6020
+ isOpen && /* @__PURE__ */ jsx67(
5360
6021
  "div",
5361
6022
  {
5362
6023
  className: cn("flex flex-col gap-[2px]", indent > 0 && "border-border ml-2 border-l"),
@@ -5369,12 +6030,12 @@ var NavSection = forwardRef64(function NavSection2({
5369
6030
  NavSection.displayName = "NavSection";
5370
6031
 
5371
6032
  // src/patterns/NavBar/NavBar.tsx
5372
- import { Fragment as Fragment5, jsx as jsx67, jsxs as jsxs59 } from "react/jsx-runtime";
6033
+ import { Fragment as Fragment5, jsx as jsx68, jsxs as jsxs60 } from "react/jsx-runtime";
5373
6034
  function isActiveTree(item, activeId) {
5374
6035
  if (item.id === activeId) return true;
5375
6036
  return item.children?.some((c) => isActiveTree(c, activeId)) ?? false;
5376
6037
  }
5377
- var NavBar = forwardRef65(function NavBar2({
6038
+ var NavBar = forwardRef66(function NavBar2({
5378
6039
  orientation = "horizontal",
5379
6040
  items,
5380
6041
  brand,
@@ -5388,9 +6049,9 @@ var NavBar = forwardRef65(function NavBar2({
5388
6049
  ...props
5389
6050
  }, ref) {
5390
6051
  const isControlled = value !== void 0;
5391
- const [internalValue, setInternalValue] = useState17(defaultValue);
6052
+ const [internalValue, setInternalValue] = useState19(defaultValue);
5392
6053
  const activeId = isControlled ? value : internalValue;
5393
- const [drawerOpen, setDrawerOpen] = useState17(false);
6054
+ const [drawerOpen, setDrawerOpen] = useState19(false);
5394
6055
  const select = useCallback14(
5395
6056
  (id) => {
5396
6057
  if (!isControlled) setInternalValue(id);
@@ -5410,7 +6071,7 @@ var NavBar = forwardRef65(function NavBar2({
5410
6071
  // drawer is open on a viewport that's resizing past `md`, both navs can
5411
6072
  // sit in the DOM together. Identical accessible names would trip axe's
5412
6073
  // `landmark-unique` rule.
5413
- /* @__PURE__ */ jsx67("nav", { "aria-label": "Mobile navigation", className: "flex flex-col gap-1", children: items.map((item) => /* @__PURE__ */ jsx67(
6074
+ /* @__PURE__ */ jsx68("nav", { "aria-label": "Mobile navigation", className: "flex flex-col gap-1", children: items.map((item) => /* @__PURE__ */ jsx68(
5414
6075
  VerticalItem,
5415
6076
  {
5416
6077
  item,
@@ -5420,14 +6081,14 @@ var NavBar = forwardRef65(function NavBar2({
5420
6081
  item.id
5421
6082
  )) })
5422
6083
  );
5423
- const mobileBar = responsive ? /* @__PURE__ */ jsxs59(
6084
+ const mobileBar = responsive ? /* @__PURE__ */ jsxs60(
5424
6085
  "div",
5425
6086
  {
5426
6087
  className: cn(
5427
6088
  "border-border bg-panel z-overlay sticky top-0 flex h-[52px] items-center gap-4 border-b px-5 md:hidden"
5428
6089
  ),
5429
6090
  children: [
5430
- /* @__PURE__ */ jsx67(
6091
+ /* @__PURE__ */ jsx68(
5431
6092
  "button",
5432
6093
  {
5433
6094
  type: "button",
@@ -5437,15 +6098,15 @@ var NavBar = forwardRef65(function NavBar2({
5437
6098
  children: "\u2630"
5438
6099
  }
5439
6100
  ),
5440
- brand && /* @__PURE__ */ jsx67("div", { className: "flex flex-1 items-center text-[13px] font-medium whitespace-nowrap", children: brand }),
5441
- actions && /* @__PURE__ */ jsx67("div", { className: "flex items-center gap-3", children: actions })
6101
+ brand && /* @__PURE__ */ jsx68("div", { className: "flex flex-1 items-center text-[13px] font-medium whitespace-nowrap", children: brand }),
6102
+ actions && /* @__PURE__ */ jsx68("div", { className: "flex items-center gap-3", children: actions })
5442
6103
  ]
5443
6104
  }
5444
6105
  ) : null;
5445
6106
  if (orientation === "horizontal") {
5446
- return /* @__PURE__ */ jsxs59(Fragment5, { children: [
6107
+ return /* @__PURE__ */ jsxs60(Fragment5, { children: [
5447
6108
  mobileBar,
5448
- /* @__PURE__ */ jsxs59(
6109
+ /* @__PURE__ */ jsxs60(
5449
6110
  "header",
5450
6111
  {
5451
6112
  ref,
@@ -5456,10 +6117,10 @@ var NavBar = forwardRef65(function NavBar2({
5456
6117
  ),
5457
6118
  ...props,
5458
6119
  children: [
5459
- brand && /* @__PURE__ */ jsx67("div", { className: "shrink-0 text-[13px] font-medium whitespace-nowrap", children: brand }),
5460
- /* @__PURE__ */ jsxs59(RadixNav.Root, { className: "relative flex-1", delayDuration: 120, children: [
5461
- /* @__PURE__ */ jsx67(RadixNav.List, { className: "m-0! flex list-none! items-center gap-1 p-0! [&_li]:m-0!", children: items.map(
5462
- (item) => item.children?.length ? /* @__PURE__ */ jsx67(
6120
+ brand && /* @__PURE__ */ jsx68("div", { className: "shrink-0 text-[13px] font-medium whitespace-nowrap", children: brand }),
6121
+ /* @__PURE__ */ jsxs60(RadixNav.Root, { className: "relative flex-1", delayDuration: 120, children: [
6122
+ /* @__PURE__ */ jsx68(RadixNav.List, { className: "m-0! flex list-none! items-center gap-1 p-0! [&_li]:m-0!", children: items.map(
6123
+ (item) => item.children?.length ? /* @__PURE__ */ jsx68(
5463
6124
  HorizontalDropdown,
5464
6125
  {
5465
6126
  item,
@@ -5468,7 +6129,7 @@ var NavBar = forwardRef65(function NavBar2({
5468
6129
  onActivate: handleItemActivate
5469
6130
  },
5470
6131
  item.id
5471
- ) : /* @__PURE__ */ jsx67(RadixNav.Item, { children: /* @__PURE__ */ jsx67(
6132
+ ) : /* @__PURE__ */ jsx68(RadixNav.Item, { children: /* @__PURE__ */ jsx68(
5472
6133
  HorizontalLink,
5473
6134
  {
5474
6135
  item,
@@ -5477,13 +6138,13 @@ var NavBar = forwardRef65(function NavBar2({
5477
6138
  }
5478
6139
  ) }, item.id)
5479
6140
  ) }),
5480
- /* @__PURE__ */ jsx67("div", { className: "z-popover absolute top-full left-0 flex justify-start", children: /* @__PURE__ */ jsx67(RadixNav.Viewport, { className: "origin-top-left data-[state=open]:animate-[ship-fade-in_120ms_var(--easing-out)]" }) })
6141
+ /* @__PURE__ */ jsx68("div", { className: "z-popover absolute top-full left-0 flex justify-start", children: /* @__PURE__ */ jsx68(RadixNav.Viewport, { className: "origin-top-left data-[state=open]:animate-[ship-fade-in_120ms_var(--easing-out)]" }) })
5481
6142
  ] }),
5482
- actions && /* @__PURE__ */ jsx67("div", { className: "flex items-center gap-3", children: actions })
6143
+ actions && /* @__PURE__ */ jsx68("div", { className: "flex items-center gap-3", children: actions })
5483
6144
  ]
5484
6145
  }
5485
6146
  ),
5486
- responsive && /* @__PURE__ */ jsx67(
6147
+ responsive && /* @__PURE__ */ jsx68(
5487
6148
  Drawer,
5488
6149
  {
5489
6150
  open: drawerOpen,
@@ -5496,9 +6157,9 @@ var NavBar = forwardRef65(function NavBar2({
5496
6157
  )
5497
6158
  ] });
5498
6159
  }
5499
- return /* @__PURE__ */ jsxs59(Fragment5, { children: [
6160
+ return /* @__PURE__ */ jsxs60(Fragment5, { children: [
5500
6161
  mobileBar,
5501
- /* @__PURE__ */ jsxs59(
6162
+ /* @__PURE__ */ jsxs60(
5502
6163
  "aside",
5503
6164
  {
5504
6165
  ref,
@@ -5511,8 +6172,8 @@ var NavBar = forwardRef65(function NavBar2({
5511
6172
  ),
5512
6173
  ...props,
5513
6174
  children: [
5514
- brand && /* @__PURE__ */ jsx67("div", { className: "px-2 py-1 text-[13px] font-medium", children: brand }),
5515
- /* @__PURE__ */ jsx67("nav", { "aria-label": "Sidebar navigation", className: "flex flex-1 flex-col gap-1 overflow-y-auto", children: items.map((item) => /* @__PURE__ */ jsx67(
6175
+ brand && /* @__PURE__ */ jsx68("div", { className: "px-2 py-1 text-[13px] font-medium", children: brand }),
6176
+ /* @__PURE__ */ jsx68("nav", { "aria-label": "Sidebar navigation", className: "flex flex-1 flex-col gap-1 overflow-y-auto", children: items.map((item) => /* @__PURE__ */ jsx68(
5516
6177
  VerticalItem,
5517
6178
  {
5518
6179
  item,
@@ -5521,11 +6182,11 @@ var NavBar = forwardRef65(function NavBar2({
5521
6182
  },
5522
6183
  item.id
5523
6184
  )) }),
5524
- actions && /* @__PURE__ */ jsx67("div", { className: "border-border mt-auto flex flex-col gap-2 border-t pt-3", children: actions })
6185
+ actions && /* @__PURE__ */ jsx68("div", { className: "border-border mt-auto flex flex-col gap-2 border-t pt-3", children: actions })
5525
6186
  ]
5526
6187
  }
5527
6188
  ),
5528
- responsive && /* @__PURE__ */ jsx67(
6189
+ responsive && /* @__PURE__ */ jsx68(
5529
6190
  Drawer,
5530
6191
  {
5531
6192
  open: drawerOpen,
@@ -5554,13 +6215,13 @@ function HorizontalLink({ item, active, onActivate }) {
5554
6215
  }
5555
6216
  onActivate(item.id);
5556
6217
  };
5557
- const inner = /* @__PURE__ */ jsxs59(Fragment5, { children: [
5558
- item.icon != null && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
5559
- /* @__PURE__ */ jsx67("span", { children: item.label }),
5560
- item.badge != null && /* @__PURE__ */ jsx67(ItemBadge, { active, children: item.badge })
6218
+ const inner = /* @__PURE__ */ jsxs60(Fragment5, { children: [
6219
+ item.icon != null && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
6220
+ /* @__PURE__ */ jsx68("span", { children: item.label }),
6221
+ item.badge != null && /* @__PURE__ */ jsx68(ItemBadge, { active, children: item.badge })
5561
6222
  ] });
5562
6223
  if (item.href) {
5563
- return /* @__PURE__ */ jsx67(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx67(
6224
+ return /* @__PURE__ */ jsx68(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx68(
5564
6225
  "a",
5565
6226
  {
5566
6227
  href: item.href,
@@ -5572,7 +6233,7 @@ function HorizontalLink({ item, active, onActivate }) {
5572
6233
  }
5573
6234
  ) });
5574
6235
  }
5575
- return /* @__PURE__ */ jsx67(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx67(
6236
+ return /* @__PURE__ */ jsx68(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx68(
5576
6237
  "button",
5577
6238
  {
5578
6239
  type: "button",
@@ -5585,8 +6246,8 @@ function HorizontalLink({ item, active, onActivate }) {
5585
6246
  ) });
5586
6247
  }
5587
6248
  function HorizontalDropdown({ item, active, activeId, onActivate }) {
5588
- return /* @__PURE__ */ jsxs59(RadixNav.Item, { children: [
5589
- /* @__PURE__ */ jsxs59(
6249
+ return /* @__PURE__ */ jsxs60(RadixNav.Item, { children: [
6250
+ /* @__PURE__ */ jsxs60(
5590
6251
  RadixNav.Trigger,
5591
6252
  {
5592
6253
  className: cn(
@@ -5598,9 +6259,9 @@ function HorizontalDropdown({ item, active, activeId, onActivate }) {
5598
6259
  ),
5599
6260
  disabled: item.disabled,
5600
6261
  children: [
5601
- item.icon != null && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
5602
- /* @__PURE__ */ jsx67("span", { children: item.label }),
5603
- /* @__PURE__ */ jsx67(
6262
+ item.icon != null && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
6263
+ /* @__PURE__ */ jsx68("span", { children: item.label }),
6264
+ /* @__PURE__ */ jsx68(
5604
6265
  "span",
5605
6266
  {
5606
6267
  "aria-hidden": true,
@@ -5611,7 +6272,7 @@ function HorizontalDropdown({ item, active, activeId, onActivate }) {
5611
6272
  ]
5612
6273
  }
5613
6274
  ),
5614
- /* @__PURE__ */ jsx67(RadixNav.Content, { className: "border-border bg-panel min-w-[220px] rounded-xs border p-2 shadow-lg", children: /* @__PURE__ */ jsx67("ul", { className: "m-0! flex list-none! flex-col gap-[2px] p-0! [&_li]:m-0!", children: item.children.map((child) => /* @__PURE__ */ jsx67("li", { children: /* @__PURE__ */ jsx67(DropdownLink, { item: child, active: child.id === activeId, onActivate }) }, child.id)) }) })
6275
+ /* @__PURE__ */ jsx68(RadixNav.Content, { className: "border-border bg-panel min-w-[220px] rounded-xs border p-2 shadow-lg", children: /* @__PURE__ */ jsx68("ul", { className: "m-0! flex list-none! flex-col gap-[2px] p-0! [&_li]:m-0!", children: item.children.map((child) => /* @__PURE__ */ jsx68("li", { children: /* @__PURE__ */ jsx68(DropdownLink, { item: child, active: child.id === activeId, onActivate }) }, child.id)) }) })
5615
6276
  ] });
5616
6277
  }
5617
6278
  function DropdownLink({ item, active, onActivate }) {
@@ -5628,13 +6289,13 @@ function DropdownLink({ item, active, onActivate }) {
5628
6289
  }
5629
6290
  onActivate(item.id);
5630
6291
  };
5631
- const inner = /* @__PURE__ */ jsxs59(Fragment5, { children: [
5632
- item.icon != null && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
5633
- /* @__PURE__ */ jsx67("span", { className: "flex-1", children: item.label }),
5634
- item.badge != null && /* @__PURE__ */ jsx67(ItemBadge, { active, children: item.badge })
6292
+ const inner = /* @__PURE__ */ jsxs60(Fragment5, { children: [
6293
+ item.icon != null && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
6294
+ /* @__PURE__ */ jsx68("span", { className: "flex-1", children: item.label }),
6295
+ item.badge != null && /* @__PURE__ */ jsx68(ItemBadge, { active, children: item.badge })
5635
6296
  ] });
5636
6297
  if (item.href) {
5637
- return /* @__PURE__ */ jsx67(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx67(
6298
+ return /* @__PURE__ */ jsx68(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx68(
5638
6299
  "a",
5639
6300
  {
5640
6301
  href: item.href,
@@ -5646,7 +6307,7 @@ function DropdownLink({ item, active, onActivate }) {
5646
6307
  }
5647
6308
  ) });
5648
6309
  }
5649
- return /* @__PURE__ */ jsx67(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx67(
6310
+ return /* @__PURE__ */ jsx68(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx68(
5650
6311
  "button",
5651
6312
  {
5652
6313
  type: "button",
@@ -5661,8 +6322,8 @@ function DropdownLink({ item, active, onActivate }) {
5661
6322
  function VerticalItem({ item, activeId, onActivate }) {
5662
6323
  const hasChildren = (item.children?.length ?? 0) > 0;
5663
6324
  const treeActive = isActiveTree(item, activeId);
5664
- const [open, setOpen] = useState17(treeActive);
5665
- const prevTreeActive = useRef12(treeActive);
6325
+ const [open, setOpen] = useState19(treeActive);
6326
+ const prevTreeActive = useRef13(treeActive);
5666
6327
  useEffect15(() => {
5667
6328
  if (treeActive && !prevTreeActive.current) setOpen(true);
5668
6329
  prevTreeActive.current = treeActive;
@@ -5675,7 +6336,7 @@ function VerticalItem({ item, activeId, onActivate }) {
5675
6336
  }
5676
6337
  onActivate(item.id);
5677
6338
  };
5678
- return /* @__PURE__ */ jsx67(
6339
+ return /* @__PURE__ */ jsx68(
5679
6340
  NavItem,
5680
6341
  {
5681
6342
  icon: item.icon,
@@ -5688,8 +6349,8 @@ function VerticalItem({ item, activeId, onActivate }) {
5688
6349
  }
5689
6350
  );
5690
6351
  }
5691
- return /* @__PURE__ */ jsxs59("div", { className: "flex flex-col", children: [
5692
- /* @__PURE__ */ jsxs59(
6352
+ return /* @__PURE__ */ jsxs60("div", { className: "flex flex-col", children: [
6353
+ /* @__PURE__ */ jsxs60(
5693
6354
  "button",
5694
6355
  {
5695
6356
  type: "button",
@@ -5705,18 +6366,18 @@ function VerticalItem({ item, activeId, onActivate }) {
5705
6366
  item.disabled && "pointer-events-none opacity-50"
5706
6367
  ),
5707
6368
  children: [
5708
- item.icon != null && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: item.icon }),
5709
- /* @__PURE__ */ jsx67("span", { className: "flex-1 truncate", children: item.label }),
5710
- item.badge != null && /* @__PURE__ */ jsx67(ItemBadge, { active: treeActive, children: item.badge }),
5711
- /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "text-[10px] opacity-60", children: open ? "\u25BE" : "\u25B8" })
6369
+ item.icon != null && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: item.icon }),
6370
+ /* @__PURE__ */ jsx68("span", { className: "flex-1 truncate", children: item.label }),
6371
+ item.badge != null && /* @__PURE__ */ jsx68(ItemBadge, { active: treeActive, children: item.badge }),
6372
+ /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "text-[10px] opacity-60", children: open ? "\u25BE" : "\u25B8" })
5712
6373
  ]
5713
6374
  }
5714
6375
  ),
5715
- open && /* @__PURE__ */ jsx67("div", { className: "border-border mt-1 ml-[18px] flex flex-col gap-[2px] border-l pl-3", children: item.children.map((child) => /* @__PURE__ */ jsx67(VerticalItem, { item: child, activeId, onActivate }, child.id)) })
6376
+ open && /* @__PURE__ */ jsx68("div", { className: "border-border mt-1 ml-[18px] flex flex-col gap-[2px] border-l pl-3", children: item.children.map((child) => /* @__PURE__ */ jsx68(VerticalItem, { item: child, activeId, onActivate }, child.id)) })
5716
6377
  ] });
5717
6378
  }
5718
6379
  function ItemBadge({ active, children }) {
5719
- return /* @__PURE__ */ jsx67(
6380
+ return /* @__PURE__ */ jsx68(
5720
6381
  "span",
5721
6382
  {
5722
6383
  className: cn(
@@ -5729,8 +6390,8 @@ function ItemBadge({ active, children }) {
5729
6390
  }
5730
6391
 
5731
6392
  // src/patterns/OnboardingChecklist/OnboardingChecklist.tsx
5732
- import { forwardRef as forwardRef66 } from "react";
5733
- import { Fragment as Fragment6, jsx as jsx68, jsxs as jsxs60 } from "react/jsx-runtime";
6393
+ import { forwardRef as forwardRef67 } from "react";
6394
+ import { Fragment as Fragment6, jsx as jsx69, jsxs as jsxs61 } from "react/jsx-runtime";
5734
6395
  var statusDot = {
5735
6396
  pending: "off",
5736
6397
  "in-progress": "sync",
@@ -5741,11 +6402,11 @@ var labelStateClass = {
5741
6402
  "in-progress": "text-text",
5742
6403
  done: "text-text-dim line-through"
5743
6404
  };
5744
- var OnboardingChecklist = forwardRef66(
6405
+ var OnboardingChecklist = forwardRef67(
5745
6406
  function OnboardingChecklist2({ items, onItemClick, title = "Get started", progressLabel, hideProgress, className, ...props }, ref) {
5746
6407
  const total = items.length;
5747
6408
  const done = items.filter((i) => i.status === "done").length;
5748
- return /* @__PURE__ */ jsxs60(
6409
+ return /* @__PURE__ */ jsxs61(
5749
6410
  "section",
5750
6411
  {
5751
6412
  ref,
@@ -5756,11 +6417,11 @@ var OnboardingChecklist = forwardRef66(
5756
6417
  ),
5757
6418
  ...props,
5758
6419
  children: [
5759
- /* @__PURE__ */ jsxs60("header", { className: "flex items-center gap-2", children: [
5760
- /* @__PURE__ */ jsx68("span", { className: "text-[14px] font-medium", children: title }),
5761
- /* @__PURE__ */ jsx68("span", { className: "text-text-dim ml-auto font-mono text-[11px] tabular-nums", children: progressLabel ?? `${done} of ${total} complete` })
6420
+ /* @__PURE__ */ jsxs61("header", { className: "flex items-center gap-2", children: [
6421
+ /* @__PURE__ */ jsx69("span", { className: "text-[14px] font-medium", children: title }),
6422
+ /* @__PURE__ */ jsx69("span", { className: "text-text-dim ml-auto font-mono text-[11px] tabular-nums", children: progressLabel ?? `${done} of ${total} complete` })
5762
6423
  ] }),
5763
- !hideProgress && total > 0 && /* @__PURE__ */ jsx68(
6424
+ !hideProgress && total > 0 && /* @__PURE__ */ jsx69(
5764
6425
  "div",
5765
6426
  {
5766
6427
  role: "progressbar",
@@ -5769,7 +6430,7 @@ var OnboardingChecklist = forwardRef66(
5769
6430
  "aria-valuenow": done,
5770
6431
  "aria-label": typeof title === "string" ? `${title} progress` : "Setup progress",
5771
6432
  className: "bg-panel-2 h-[3px] w-full overflow-hidden rounded-full",
5772
- children: /* @__PURE__ */ jsx68(
6433
+ children: /* @__PURE__ */ jsx69(
5773
6434
  "span",
5774
6435
  {
5775
6436
  "aria-hidden": true,
@@ -5782,10 +6443,10 @@ var OnboardingChecklist = forwardRef66(
5782
6443
  )
5783
6444
  }
5784
6445
  ),
5785
- /* @__PURE__ */ jsx68("ul", { className: "m-0 flex list-none flex-col gap-1 p-0", children: items.map((item) => {
6446
+ /* @__PURE__ */ jsx69("ul", { className: "m-0 flex list-none flex-col gap-1 p-0", children: items.map((item) => {
5786
6447
  const interactive = typeof onItemClick === "function";
5787
- const labelBlock = /* @__PURE__ */ jsxs60(Fragment6, { children: [
5788
- /* @__PURE__ */ jsx68(
6448
+ const labelBlock = /* @__PURE__ */ jsxs61(Fragment6, { children: [
6449
+ /* @__PURE__ */ jsx69(
5789
6450
  StatusDot,
5790
6451
  {
5791
6452
  state: statusDot[item.status],
@@ -5794,17 +6455,17 @@ var OnboardingChecklist = forwardRef66(
5794
6455
  className: "mt-[3px]"
5795
6456
  }
5796
6457
  ),
5797
- /* @__PURE__ */ jsxs60("div", { className: "flex min-w-0 flex-1 flex-col gap-[2px]", children: [
5798
- /* @__PURE__ */ jsx68("span", { className: cn("text-[13px]", labelStateClass[item.status]), children: item.label }),
5799
- item.description && /* @__PURE__ */ jsx68("span", { className: "text-text-muted text-[12px] leading-[1.45]", children: item.description })
6458
+ /* @__PURE__ */ jsxs61("div", { className: "flex min-w-0 flex-1 flex-col gap-[2px]", children: [
6459
+ /* @__PURE__ */ jsx69("span", { className: cn("text-[13px]", labelStateClass[item.status]), children: item.label }),
6460
+ item.description && /* @__PURE__ */ jsx69("span", { className: "text-text-muted text-[12px] leading-[1.45]", children: item.description })
5800
6461
  ] })
5801
6462
  ] });
5802
6463
  const labelRegionClass = cn(
5803
6464
  "flex flex-1 items-start gap-3 rounded-md px-2 py-2 text-left transition-colors duration-(--duration-micro)",
5804
6465
  interactive && "cursor-pointer outline-none hover:bg-panel-2 focus-visible:ring-[3px] focus-visible:ring-accent-dim"
5805
6466
  );
5806
- return /* @__PURE__ */ jsxs60("li", { className: "flex items-start gap-2", children: [
5807
- interactive ? /* @__PURE__ */ jsx68(
6467
+ return /* @__PURE__ */ jsxs61("li", { className: "flex items-start gap-2", children: [
6468
+ interactive ? /* @__PURE__ */ jsx69(
5808
6469
  "button",
5809
6470
  {
5810
6471
  type: "button",
@@ -5813,8 +6474,8 @@ var OnboardingChecklist = forwardRef66(
5813
6474
  className: labelRegionClass,
5814
6475
  children: labelBlock
5815
6476
  }
5816
- ) : /* @__PURE__ */ jsx68("div", { className: labelRegionClass, children: labelBlock }),
5817
- item.action && /* @__PURE__ */ jsx68("div", { className: "shrink-0 self-center", children: item.action })
6477
+ ) : /* @__PURE__ */ jsx69("div", { className: labelRegionClass, children: labelBlock }),
6478
+ item.action && /* @__PURE__ */ jsx69("div", { className: "shrink-0 self-center", children: item.action })
5818
6479
  ] }, item.id);
5819
6480
  }) })
5820
6481
  ]
@@ -5825,8 +6486,8 @@ var OnboardingChecklist = forwardRef66(
5825
6486
  OnboardingChecklist.displayName = "OnboardingChecklist";
5826
6487
 
5827
6488
  // src/patterns/Pagination/Pagination.tsx
5828
- import { forwardRef as forwardRef67 } from "react";
5829
- import { jsx as jsx69, jsxs as jsxs61 } from "react/jsx-runtime";
6489
+ import { forwardRef as forwardRef68 } from "react";
6490
+ import { jsx as jsx70, jsxs as jsxs62 } from "react/jsx-runtime";
5830
6491
  function buildRange(page, total, siblings) {
5831
6492
  if (total <= 0) return [];
5832
6493
  const items = [];
@@ -5839,9 +6500,9 @@ function buildRange(page, total, siblings) {
5839
6500
  if (total > 1) items.push(total);
5840
6501
  return items;
5841
6502
  }
5842
- var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange, siblings = 1, className, ...props }, ref) {
6503
+ var Pagination = forwardRef68(function Pagination2({ page, total, onPageChange, siblings = 1, className, ...props }, ref) {
5843
6504
  const items = buildRange(page, total, siblings);
5844
- return /* @__PURE__ */ jsxs61(
6505
+ return /* @__PURE__ */ jsxs62(
5845
6506
  "nav",
5846
6507
  {
5847
6508
  ref,
@@ -5849,7 +6510,7 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
5849
6510
  className: cn("inline-flex items-center gap-1", className),
5850
6511
  ...props,
5851
6512
  children: [
5852
- /* @__PURE__ */ jsx69(
6513
+ /* @__PURE__ */ jsx70(
5853
6514
  IconButton,
5854
6515
  {
5855
6516
  size: "sm",
@@ -5862,7 +6523,7 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
5862
6523
  ),
5863
6524
  items.map((item, i) => {
5864
6525
  if (item === "start-ellipsis" || item === "end-ellipsis") {
5865
- return /* @__PURE__ */ jsx69(
6526
+ return /* @__PURE__ */ jsx70(
5866
6527
  "span",
5867
6528
  {
5868
6529
  "aria-hidden": true,
@@ -5873,7 +6534,7 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
5873
6534
  );
5874
6535
  }
5875
6536
  const isActive = item === page;
5876
- return /* @__PURE__ */ jsx69(
6537
+ return /* @__PURE__ */ jsx70(
5877
6538
  "button",
5878
6539
  {
5879
6540
  type: "button",
@@ -5891,7 +6552,7 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
5891
6552
  item
5892
6553
  );
5893
6554
  }),
5894
- /* @__PURE__ */ jsx69(
6555
+ /* @__PURE__ */ jsx70(
5895
6556
  IconButton,
5896
6557
  {
5897
6558
  size: "sm",
@@ -5909,10 +6570,10 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
5909
6570
  Pagination.displayName = "Pagination";
5910
6571
 
5911
6572
  // src/patterns/Progress/Progress.tsx
5912
- import { cva as cva12 } from "class-variance-authority";
5913
- import { forwardRef as forwardRef68 } from "react";
5914
- import { jsx as jsx70, jsxs as jsxs62 } from "react/jsx-runtime";
5915
- var trackStyles = cva12("w-full rounded-full bg-panel-2 overflow-hidden", {
6573
+ import { cva as cva13 } from "class-variance-authority";
6574
+ import { forwardRef as forwardRef69 } from "react";
6575
+ import { jsx as jsx71, jsxs as jsxs63 } from "react/jsx-runtime";
6576
+ var trackStyles = cva13("w-full rounded-full bg-panel-2 overflow-hidden", {
5916
6577
  variants: {
5917
6578
  size: {
5918
6579
  sm: "h-[3px]",
@@ -5922,7 +6583,7 @@ var trackStyles = cva12("w-full rounded-full bg-panel-2 overflow-hidden", {
5922
6583
  },
5923
6584
  defaultVariants: { size: "md" }
5924
6585
  });
5925
- var fillStyles = cva12("h-full rounded-full transition-[width] duration-(--duration-step)", {
6586
+ var fillStyles = cva13("h-full rounded-full transition-[width] duration-(--duration-step)", {
5926
6587
  variants: {
5927
6588
  tone: {
5928
6589
  accent: "bg-accent",
@@ -5933,7 +6594,7 @@ var fillStyles = cva12("h-full rounded-full transition-[width] duration-(--durat
5933
6594
  },
5934
6595
  defaultVariants: { tone: "accent" }
5935
6596
  });
5936
- var Progress = forwardRef68(function Progress2({
6597
+ var Progress = forwardRef69(function Progress2({
5937
6598
  value = 0,
5938
6599
  max = 100,
5939
6600
  indeterminate = false,
@@ -5947,15 +6608,15 @@ var Progress = forwardRef68(function Progress2({
5947
6608
  const clamped = Math.min(max, Math.max(0, value));
5948
6609
  const pct = max > 0 ? clamped / max * 100 : 0;
5949
6610
  const display = Math.round(pct);
5950
- return /* @__PURE__ */ jsxs62("div", { ref, className: cn("flex w-full flex-col gap-2", className), ...props, children: [
5951
- label != null && /* @__PURE__ */ jsxs62("div", { className: "flex text-[12px]", children: [
5952
- /* @__PURE__ */ jsx70("span", { className: "text-text-muted", children: label }),
5953
- showValue && !indeterminate && /* @__PURE__ */ jsxs62("span", { className: "text-text ml-auto font-mono tabular-nums", children: [
6611
+ return /* @__PURE__ */ jsxs63("div", { ref, className: cn("flex w-full flex-col gap-2", className), ...props, children: [
6612
+ label != null && /* @__PURE__ */ jsxs63("div", { className: "flex text-[12px]", children: [
6613
+ /* @__PURE__ */ jsx71("span", { className: "text-text-muted", children: label }),
6614
+ showValue && !indeterminate && /* @__PURE__ */ jsxs63("span", { className: "text-text ml-auto font-mono tabular-nums", children: [
5954
6615
  display,
5955
6616
  "%"
5956
6617
  ] })
5957
6618
  ] }),
5958
- /* @__PURE__ */ jsx70(
6619
+ /* @__PURE__ */ jsx71(
5959
6620
  "div",
5960
6621
  {
5961
6622
  role: "progressbar",
@@ -5964,7 +6625,7 @@ var Progress = forwardRef68(function Progress2({
5964
6625
  "aria-valuenow": indeterminate ? void 0 : display,
5965
6626
  "aria-label": typeof label === "string" ? label : void 0,
5966
6627
  className: trackStyles({ size }),
5967
- children: indeterminate ? /* @__PURE__ */ jsx70(
6628
+ children: indeterminate ? /* @__PURE__ */ jsx71(
5968
6629
  "span",
5969
6630
  {
5970
6631
  "aria-hidden": true,
@@ -5974,7 +6635,7 @@ var Progress = forwardRef68(function Progress2({
5974
6635
  "animate-[ship-indeterminate_1.4s_linear_infinite]"
5975
6636
  )
5976
6637
  }
5977
- ) : /* @__PURE__ */ jsx70("span", { "aria-hidden": true, className: fillStyles({ tone }), style: { width: `${pct}%` } })
6638
+ ) : /* @__PURE__ */ jsx71("span", { "aria-hidden": true, className: fillStyles({ tone }), style: { width: `${pct}%` } })
5978
6639
  }
5979
6640
  )
5980
6641
  ] });
@@ -5982,18 +6643,18 @@ var Progress = forwardRef68(function Progress2({
5982
6643
  Progress.displayName = "Progress";
5983
6644
 
5984
6645
  // src/patterns/PullToRefresh/PullToRefresh.tsx
5985
- import { forwardRef as forwardRef69 } from "react";
5986
- import { jsx as jsx71, jsxs as jsxs63 } from "react/jsx-runtime";
6646
+ import { forwardRef as forwardRef70 } from "react";
6647
+ import { jsx as jsx72, jsxs as jsxs64 } from "react/jsx-runtime";
5987
6648
  var labels = {
5988
6649
  idle: "Pull to refresh",
5989
6650
  pulling: "Pull to refresh",
5990
6651
  ready: "Release to refresh",
5991
6652
  loading: "Refreshing\u2026"
5992
6653
  };
5993
- var PullToRefresh = forwardRef69(function PullToRefresh2({ state = "idle", label, className, ...props }, ref) {
6654
+ var PullToRefresh = forwardRef70(function PullToRefresh2({ state = "idle", label, className, ...props }, ref) {
5994
6655
  const isLoading = state === "loading";
5995
6656
  const transform = state === "ready" ? "rotate(180deg)" : state === "pulling" ? "rotate(90deg)" : "rotate(0deg)";
5996
- return /* @__PURE__ */ jsxs63(
6657
+ return /* @__PURE__ */ jsxs64(
5997
6658
  "div",
5998
6659
  {
5999
6660
  ref,
@@ -6003,7 +6664,7 @@ var PullToRefresh = forwardRef69(function PullToRefresh2({ state = "idle", label
6003
6664
  className: cn("text-text-muted flex flex-col items-center gap-[6px] py-3", className),
6004
6665
  ...props,
6005
6666
  children: [
6006
- /* @__PURE__ */ jsx71(
6667
+ /* @__PURE__ */ jsx72(
6007
6668
  "div",
6008
6669
  {
6009
6670
  "aria-hidden": true,
@@ -6019,7 +6680,7 @@ var PullToRefresh = forwardRef69(function PullToRefresh2({ state = "idle", label
6019
6680
  }
6020
6681
  }
6021
6682
  ),
6022
- /* @__PURE__ */ jsx71("span", { className: "text-m-eyebrow font-mono tracking-wide uppercase", children: label ?? labels[state] })
6683
+ /* @__PURE__ */ jsx72("span", { className: "text-m-eyebrow font-mono tracking-wide uppercase", children: label ?? labels[state] })
6023
6684
  ]
6024
6685
  }
6025
6686
  );
@@ -6027,8 +6688,8 @@ var PullToRefresh = forwardRef69(function PullToRefresh2({ state = "idle", label
6027
6688
  PullToRefresh.displayName = "PullToRefresh";
6028
6689
 
6029
6690
  // src/patterns/Sparkline/Sparkline.tsx
6030
- import { forwardRef as forwardRef70, useMemo as useMemo6 } from "react";
6031
- import { jsx as jsx72, jsxs as jsxs64 } from "react/jsx-runtime";
6691
+ import { forwardRef as forwardRef71, useMemo as useMemo6 } from "react";
6692
+ import { jsx as jsx73, jsxs as jsxs65 } from "react/jsx-runtime";
6032
6693
  function buildPath(values, w, h) {
6033
6694
  if (values.length === 0) return { line: "", area: "" };
6034
6695
  const pad = 2;
@@ -6047,7 +6708,7 @@ function buildPath(values, w, h) {
6047
6708
  )} L${pad.toFixed(2)},${(h - pad).toFixed(2)} Z`;
6048
6709
  return { line, area };
6049
6710
  }
6050
- var Sparkline = forwardRef70(function Sparkline2({
6711
+ var Sparkline = forwardRef71(function Sparkline2({
6051
6712
  values,
6052
6713
  width = 160,
6053
6714
  height = 32,
@@ -6059,7 +6720,7 @@ var Sparkline = forwardRef70(function Sparkline2({
6059
6720
  ...props
6060
6721
  }, ref) {
6061
6722
  const { line, area } = useMemo6(() => buildPath(values, width, height), [values, width, height]);
6062
- return /* @__PURE__ */ jsxs64(
6723
+ return /* @__PURE__ */ jsxs65(
6063
6724
  "svg",
6064
6725
  {
6065
6726
  ref,
@@ -6071,8 +6732,8 @@ var Sparkline = forwardRef70(function Sparkline2({
6071
6732
  className: cn("inline-block", className),
6072
6733
  ...props,
6073
6734
  children: [
6074
- fill && /* @__PURE__ */ jsx72("path", { d: area, fill: stroke, fillOpacity: 0.16, stroke: "none" }),
6075
- /* @__PURE__ */ jsx72(
6735
+ fill && /* @__PURE__ */ jsx73("path", { d: area, fill: stroke, fillOpacity: 0.16, stroke: "none" }),
6736
+ /* @__PURE__ */ jsx73(
6076
6737
  "path",
6077
6738
  {
6078
6739
  d: line,
@@ -6090,16 +6751,16 @@ var Sparkline = forwardRef70(function Sparkline2({
6090
6751
  Sparkline.displayName = "Sparkline";
6091
6752
 
6092
6753
  // src/patterns/Spinner/Spinner.tsx
6093
- import { forwardRef as forwardRef71 } from "react";
6094
- import { jsx as jsx73 } from "react/jsx-runtime";
6754
+ import { forwardRef as forwardRef72 } from "react";
6755
+ import { jsx as jsx74 } from "react/jsx-runtime";
6095
6756
  var sizes = {
6096
6757
  sm: { box: "h-3 w-3", border: "border-[2px]" },
6097
6758
  md: { box: "h-4 w-4", border: "border-[2px]" },
6098
6759
  lg: { box: "h-5 w-5", border: "border-[2px]" }
6099
6760
  };
6100
- var Spinner2 = forwardRef71(function Spinner3({ size = "md", label = "Loading", className, ...props }, ref) {
6761
+ var Spinner2 = forwardRef72(function Spinner3({ size = "md", label = "Loading", className, ...props }, ref) {
6101
6762
  const s = sizes[size];
6102
- return /* @__PURE__ */ jsx73(
6763
+ return /* @__PURE__ */ jsx74(
6103
6764
  "span",
6104
6765
  {
6105
6766
  ref,
@@ -6107,7 +6768,7 @@ var Spinner2 = forwardRef71(function Spinner3({ size = "md", label = "Loading",
6107
6768
  "aria-label": label,
6108
6769
  className: cn("inline-block", className),
6109
6770
  ...props,
6110
- children: /* @__PURE__ */ jsx73(
6771
+ children: /* @__PURE__ */ jsx74(
6111
6772
  "span",
6112
6773
  {
6113
6774
  "aria-hidden": true,
@@ -6124,8 +6785,8 @@ var Spinner2 = forwardRef71(function Spinner3({ size = "md", label = "Loading",
6124
6785
  Spinner2.displayName = "Spinner";
6125
6786
 
6126
6787
  // src/patterns/Stepper/Stepper.tsx
6127
- import { forwardRef as forwardRef72, Fragment as Fragment7 } from "react";
6128
- import { jsx as jsx74, jsxs as jsxs65 } from "react/jsx-runtime";
6788
+ import { forwardRef as forwardRef73, Fragment as Fragment7 } from "react";
6789
+ import { jsx as jsx75, jsxs as jsxs66 } from "react/jsx-runtime";
6129
6790
  var dotBase = "h-6 w-6 rounded-full grid place-items-center text-[11px] font-mono font-semibold border";
6130
6791
  var dotStateClass = {
6131
6792
  done: "bg-accent text-on-accent border-accent",
@@ -6142,8 +6803,8 @@ function stateFor(index, current) {
6142
6803
  if (index === current) return "current";
6143
6804
  return "upcoming";
6144
6805
  }
6145
- var Stepper = forwardRef72(function Stepper2({ steps, current, className, ...props }, ref) {
6146
- return /* @__PURE__ */ jsx74(
6806
+ var Stepper = forwardRef73(function Stepper2({ steps, current, className, ...props }, ref) {
6807
+ return /* @__PURE__ */ jsx75(
6147
6808
  "ol",
6148
6809
  {
6149
6810
  ref,
@@ -6155,19 +6816,19 @@ var Stepper = forwardRef72(function Stepper2({ steps, current, className, ...pro
6155
6816
  const id = typeof step === "string" ? void 0 : step.id;
6156
6817
  const state = stateFor(i, current);
6157
6818
  const connectorActive = i < current;
6158
- return /* @__PURE__ */ jsxs65(Fragment7, { children: [
6159
- /* @__PURE__ */ jsxs65(
6819
+ return /* @__PURE__ */ jsxs66(Fragment7, { children: [
6820
+ /* @__PURE__ */ jsxs66(
6160
6821
  "li",
6161
6822
  {
6162
6823
  "aria-current": state === "current" ? "step" : void 0,
6163
6824
  className: "flex items-center gap-2",
6164
6825
  children: [
6165
- /* @__PURE__ */ jsx74("span", { "aria-hidden": true, className: cn(dotBase, dotStateClass[state]), children: state === "done" ? "\u2713" : i + 1 }),
6166
- /* @__PURE__ */ jsx74("span", { className: cn("text-[12px]", labelStateClass2[state]), children: label })
6826
+ /* @__PURE__ */ jsx75("span", { "aria-hidden": true, className: cn(dotBase, dotStateClass[state]), children: state === "done" ? "\u2713" : i + 1 }),
6827
+ /* @__PURE__ */ jsx75("span", { className: cn("text-[12px]", labelStateClass2[state]), children: label })
6167
6828
  ]
6168
6829
  }
6169
6830
  ),
6170
- i < steps.length - 1 && /* @__PURE__ */ jsx74(
6831
+ i < steps.length - 1 && /* @__PURE__ */ jsx75(
6171
6832
  "span",
6172
6833
  {
6173
6834
  "aria-hidden": true,
@@ -6183,14 +6844,14 @@ Stepper.displayName = "Stepper";
6183
6844
 
6184
6845
  // src/patterns/TabBar/TabBar.tsx
6185
6846
  import {
6186
- forwardRef as forwardRef73,
6847
+ forwardRef as forwardRef74,
6187
6848
  useCallback as useCallback15,
6188
- useState as useState18
6849
+ useState as useState20
6189
6850
  } from "react";
6190
- import { jsx as jsx75, jsxs as jsxs66 } from "react/jsx-runtime";
6191
- var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValueChange, className, ...props }, ref) {
6851
+ import { jsx as jsx76, jsxs as jsxs67 } from "react/jsx-runtime";
6852
+ var TabBar = forwardRef74(function TabBar2({ items, value, defaultValue, onValueChange, className, ...props }, ref) {
6192
6853
  const isControlled = value !== void 0;
6193
- const [internalValue, setInternalValue] = useState18(defaultValue);
6854
+ const [internalValue, setInternalValue] = useState20(defaultValue);
6194
6855
  const activeId = isControlled ? value : internalValue;
6195
6856
  const handleSelect = useCallback15(
6196
6857
  (id, e) => {
@@ -6200,7 +6861,7 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
6200
6861
  },
6201
6862
  [isControlled, onValueChange]
6202
6863
  );
6203
- return /* @__PURE__ */ jsx75(
6864
+ return /* @__PURE__ */ jsx76(
6204
6865
  "nav",
6205
6866
  {
6206
6867
  ref,
@@ -6215,7 +6876,7 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
6215
6876
  children: items.map((item) => {
6216
6877
  const isActive = item.id === activeId;
6217
6878
  if (item.elevated) {
6218
- return /* @__PURE__ */ jsx75("div", { className: "grid place-items-center", children: /* @__PURE__ */ jsxs66(
6879
+ return /* @__PURE__ */ jsx76("div", { className: "grid place-items-center", children: /* @__PURE__ */ jsxs67(
6219
6880
  "button",
6220
6881
  {
6221
6882
  type: "button",
@@ -6231,13 +6892,13 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
6231
6892
  "disabled:cursor-not-allowed disabled:opacity-40"
6232
6893
  ),
6233
6894
  children: [
6234
- /* @__PURE__ */ jsx75("span", { "aria-hidden": true, children: item.icon }),
6235
- /* @__PURE__ */ jsx75("span", { className: "sr-only", children: item.label })
6895
+ /* @__PURE__ */ jsx76("span", { "aria-hidden": true, children: item.icon }),
6896
+ /* @__PURE__ */ jsx76("span", { className: "sr-only", children: item.label })
6236
6897
  ]
6237
6898
  }
6238
6899
  ) }, item.id);
6239
6900
  }
6240
- return /* @__PURE__ */ jsxs66(
6901
+ return /* @__PURE__ */ jsxs67(
6241
6902
  "button",
6242
6903
  {
6243
6904
  type: "button",
@@ -6252,9 +6913,9 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
6252
6913
  isActive ? "text-accent-text" : "text-text-muted hover:text-text"
6253
6914
  ),
6254
6915
  children: [
6255
- /* @__PURE__ */ jsxs66("span", { className: "relative inline-flex", "aria-hidden": true, children: [
6916
+ /* @__PURE__ */ jsxs67("span", { className: "relative inline-flex", "aria-hidden": true, children: [
6256
6917
  item.icon,
6257
- item.badge != null && /* @__PURE__ */ jsx75(
6918
+ item.badge != null && /* @__PURE__ */ jsx76(
6258
6919
  "span",
6259
6920
  {
6260
6921
  className: cn(
@@ -6265,9 +6926,9 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
6265
6926
  }
6266
6927
  )
6267
6928
  ] }),
6268
- /* @__PURE__ */ jsxs66("span", { className: "text-[10px] font-medium tracking-tight", children: [
6929
+ /* @__PURE__ */ jsxs67("span", { className: "text-[10px] font-medium tracking-tight", children: [
6269
6930
  item.label,
6270
- item.badge != null && /* @__PURE__ */ jsxs66("span", { className: "sr-only", children: [
6931
+ item.badge != null && /* @__PURE__ */ jsxs67("span", { className: "sr-only", children: [
6271
6932
  ", ",
6272
6933
  item.badge,
6273
6934
  " unread"
@@ -6285,11 +6946,11 @@ TabBar.displayName = "TabBar";
6285
6946
 
6286
6947
  // src/patterns/Tabs/Tabs.tsx
6287
6948
  import * as RadixTabs from "@radix-ui/react-tabs";
6288
- import { cva as cva13 } from "class-variance-authority";
6289
- import { createContext as createContext2, forwardRef as forwardRef74, useContext as useContext2 } from "react";
6290
- import { jsx as jsx76 } from "react/jsx-runtime";
6949
+ import { cva as cva14 } from "class-variance-authority";
6950
+ import { createContext as createContext2, forwardRef as forwardRef75, useContext as useContext2 } from "react";
6951
+ import { jsx as jsx77 } from "react/jsx-runtime";
6291
6952
  var TabsVariantContext = createContext2("underline");
6292
- var tabsListStyles = cva13("", {
6953
+ var tabsListStyles = cva14("", {
6293
6954
  variants: {
6294
6955
  variant: {
6295
6956
  underline: "flex gap-6 border-b border-border",
@@ -6297,7 +6958,7 @@ var tabsListStyles = cva13("", {
6297
6958
  }
6298
6959
  }
6299
6960
  });
6300
- var tabsTriggerStyles = cva13(
6961
+ var tabsTriggerStyles = cva14(
6301
6962
  "cursor-pointer outline-none transition-colors duration-(--duration-micro) focus-visible:ring-[3px] focus-visible:ring-accent-dim",
6302
6963
  {
6303
6964
  variants: {
@@ -6318,8 +6979,8 @@ var tabsTriggerStyles = cva13(
6318
6979
  }
6319
6980
  }
6320
6981
  );
6321
- var Tabs = forwardRef74(function Tabs2({ variant = "underline", className, ...props }, ref) {
6322
- return /* @__PURE__ */ jsx76(TabsVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx76(
6982
+ var Tabs = forwardRef75(function Tabs2({ variant = "underline", className, ...props }, ref) {
6983
+ return /* @__PURE__ */ jsx77(TabsVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx77(
6323
6984
  RadixTabs.Root,
6324
6985
  {
6325
6986
  ref,
@@ -6329,14 +6990,14 @@ var Tabs = forwardRef74(function Tabs2({ variant = "underline", className, ...pr
6329
6990
  ) });
6330
6991
  });
6331
6992
  Tabs.displayName = "Tabs";
6332
- var TabsList = forwardRef74(function TabsList2({ className, ...props }, ref) {
6993
+ var TabsList = forwardRef75(function TabsList2({ className, ...props }, ref) {
6333
6994
  const variant = useContext2(TabsVariantContext);
6334
- return /* @__PURE__ */ jsx76(RadixTabs.List, { ref, className: cn(tabsListStyles({ variant }), className), ...props });
6995
+ return /* @__PURE__ */ jsx77(RadixTabs.List, { ref, className: cn(tabsListStyles({ variant }), className), ...props });
6335
6996
  });
6336
6997
  TabsList.displayName = "TabsList";
6337
- var Tab = forwardRef74(function Tab2({ className, ...props }, ref) {
6998
+ var Tab = forwardRef75(function Tab2({ className, ...props }, ref) {
6338
6999
  const variant = useContext2(TabsVariantContext);
6339
- return /* @__PURE__ */ jsx76(
7000
+ return /* @__PURE__ */ jsx77(
6340
7001
  RadixTabs.Trigger,
6341
7002
  {
6342
7003
  ref,
@@ -6346,9 +7007,9 @@ var Tab = forwardRef74(function Tab2({ className, ...props }, ref) {
6346
7007
  );
6347
7008
  });
6348
7009
  Tab.displayName = "Tab";
6349
- var TabsContent = forwardRef74(
7010
+ var TabsContent = forwardRef75(
6350
7011
  function TabsContent2({ className, ...props }, ref) {
6351
- return /* @__PURE__ */ jsx76(
7012
+ return /* @__PURE__ */ jsx77(
6352
7013
  RadixTabs.Content,
6353
7014
  {
6354
7015
  ref,
@@ -6364,8 +7025,8 @@ var TabsContent = forwardRef74(
6364
7025
  TabsContent.displayName = "TabsContent";
6365
7026
 
6366
7027
  // src/patterns/Timeline/Timeline.tsx
6367
- import { forwardRef as forwardRef75 } from "react";
6368
- import { jsx as jsx77, jsxs as jsxs67 } from "react/jsx-runtime";
7028
+ import { forwardRef as forwardRef76 } from "react";
7029
+ import { jsx as jsx78, jsxs as jsxs68 } from "react/jsx-runtime";
6369
7030
  var ringClass = {
6370
7031
  accent: "border-accent",
6371
7032
  ok: "border-ok",
@@ -6373,8 +7034,8 @@ var ringClass = {
6373
7034
  err: "border-err",
6374
7035
  muted: "border-text-dim"
6375
7036
  };
6376
- var Timeline = forwardRef75(function Timeline2({ events, className, children, ...props }, ref) {
6377
- return /* @__PURE__ */ jsx77(
7037
+ var Timeline = forwardRef76(function Timeline2({ events, className, children, ...props }, ref) {
7038
+ return /* @__PURE__ */ jsx78(
6378
7039
  "ol",
6379
7040
  {
6380
7041
  ref,
@@ -6384,14 +7045,14 @@ var Timeline = forwardRef75(function Timeline2({ events, className, children, ..
6384
7045
  className
6385
7046
  ),
6386
7047
  ...props,
6387
- children: events ? events.map((e, i) => /* @__PURE__ */ jsx77(TimelineItem, { tone: e.tone, time: e.time, description: e.description, children: e.title }, i)) : children
7048
+ children: events ? events.map((e, i) => /* @__PURE__ */ jsx78(TimelineItem, { tone: e.tone, time: e.time, description: e.description, children: e.title }, i)) : children
6388
7049
  }
6389
7050
  );
6390
7051
  });
6391
7052
  Timeline.displayName = "Timeline";
6392
- var TimelineItem = forwardRef75(function TimelineItem2({ tone = "accent", description, time, className, children, ...props }, ref) {
6393
- return /* @__PURE__ */ jsxs67("li", { ref, className: cn("relative mb-[18px] last:mb-0", className), ...props, children: [
6394
- /* @__PURE__ */ jsx77(
7053
+ var TimelineItem = forwardRef76(function TimelineItem2({ tone = "accent", description, time, className, children, ...props }, ref) {
7054
+ return /* @__PURE__ */ jsxs68("li", { ref, className: cn("relative mb-[18px] last:mb-0", className), ...props, children: [
7055
+ /* @__PURE__ */ jsx78(
6395
7056
  "span",
6396
7057
  {
6397
7058
  "aria-hidden": true,
@@ -6401,15 +7062,15 @@ var TimelineItem = forwardRef75(function TimelineItem2({ tone = "accent", descri
6401
7062
  )
6402
7063
  }
6403
7064
  ),
6404
- /* @__PURE__ */ jsx77("div", { className: "text-[13px] font-medium", children }),
6405
- description && /* @__PURE__ */ jsx77("div", { className: "text-text-muted text-[12px]", children: description }),
6406
- time && /* @__PURE__ */ jsx77("div", { className: "text-text-dim mt-[2px] font-mono text-[10px]", children: time })
7065
+ /* @__PURE__ */ jsx78("div", { className: "text-[13px] font-medium", children }),
7066
+ description && /* @__PURE__ */ jsx78("div", { className: "text-text-muted text-[12px]", children: description }),
7067
+ time && /* @__PURE__ */ jsx78("div", { className: "text-text-dim mt-[2px] font-mono text-[10px]", children: time })
6407
7068
  ] });
6408
7069
  });
6409
7070
  TimelineItem.displayName = "TimelineItem";
6410
7071
 
6411
7072
  // src/patterns/Timeline/ActivityTimeline.tsx
6412
- import { forwardRef as forwardRef76 } from "react";
7073
+ import { forwardRef as forwardRef77 } from "react";
6413
7074
 
6414
7075
  // src/patterns/Timeline/formatRelative.ts
6415
7076
  var SECOND = 1e3;
@@ -6444,7 +7105,7 @@ function formatRelative(input, now = /* @__PURE__ */ new Date()) {
6444
7105
  }
6445
7106
 
6446
7107
  // src/patterns/Timeline/ActivityTimeline.tsx
6447
- import { jsx as jsx78, jsxs as jsxs68 } from "react/jsx-runtime";
7108
+ import { jsx as jsx79, jsxs as jsxs69 } from "react/jsx-runtime";
6448
7109
  var ringClass2 = {
6449
7110
  accent: "border-accent",
6450
7111
  ok: "border-ok",
@@ -6452,10 +7113,10 @@ var ringClass2 = {
6452
7113
  err: "border-err",
6453
7114
  muted: "border-text-dim"
6454
7115
  };
6455
- var ActivityTimeline = forwardRef76(
7116
+ var ActivityTimeline = forwardRef77(
6456
7117
  function ActivityTimeline2({ events, relativeNow, className, ...props }, ref) {
6457
7118
  const now = relativeNow ?? /* @__PURE__ */ new Date();
6458
- return /* @__PURE__ */ jsx78(
7119
+ return /* @__PURE__ */ jsx79(
6459
7120
  "ol",
6460
7121
  {
6461
7122
  ref,
@@ -6468,8 +7129,8 @@ var ActivityTimeline = forwardRef76(
6468
7129
  children: events.map((event) => {
6469
7130
  const tone = event.tone ?? "accent";
6470
7131
  const time = formatRelative(event.at, now);
6471
- return /* @__PURE__ */ jsxs68("li", { className: "relative mb-4 last:mb-0", children: [
6472
- /* @__PURE__ */ jsx78(
7132
+ return /* @__PURE__ */ jsxs69("li", { className: "relative mb-4 last:mb-0", children: [
7133
+ /* @__PURE__ */ jsx79(
6473
7134
  "span",
6474
7135
  {
6475
7136
  "aria-hidden": true,
@@ -6479,16 +7140,16 @@ var ActivityTimeline = forwardRef76(
6479
7140
  )
6480
7141
  }
6481
7142
  ),
6482
- /* @__PURE__ */ jsxs68("div", { className: "flex items-baseline gap-2", children: [
6483
- event.icon && /* @__PURE__ */ jsx78("span", { "aria-hidden": true, className: "text-text-muted font-mono text-[12px]", children: event.icon }),
6484
- /* @__PURE__ */ jsx78("div", { className: "text-[13px] font-medium", children: event.title }),
6485
- time && /* @__PURE__ */ jsx78("time", { className: "text-text-dim ml-auto font-mono text-[10px]", children: time })
7143
+ /* @__PURE__ */ jsxs69("div", { className: "flex items-baseline gap-2", children: [
7144
+ event.icon && /* @__PURE__ */ jsx79("span", { "aria-hidden": true, className: "text-text-muted font-mono text-[12px]", children: event.icon }),
7145
+ /* @__PURE__ */ jsx79("div", { className: "text-[13px] font-medium", children: event.title }),
7146
+ time && /* @__PURE__ */ jsx79("time", { className: "text-text-dim ml-auto font-mono text-[10px]", children: time })
6486
7147
  ] }),
6487
- event.actor && /* @__PURE__ */ jsxs68("div", { className: "text-text-muted mt-[2px] flex items-center gap-[6px] text-[12px]", children: [
6488
- event.actor.avatar && /* @__PURE__ */ jsx78("span", { "aria-hidden": true, className: "inline-flex", children: event.actor.avatar }),
6489
- /* @__PURE__ */ jsx78("span", { children: event.actor.name })
7148
+ event.actor && /* @__PURE__ */ jsxs69("div", { className: "text-text-muted mt-[2px] flex items-center gap-[6px] text-[12px]", children: [
7149
+ event.actor.avatar && /* @__PURE__ */ jsx79("span", { "aria-hidden": true, className: "inline-flex", children: event.actor.avatar }),
7150
+ /* @__PURE__ */ jsx79("span", { children: event.actor.name })
6490
7151
  ] }),
6491
- event.payload && /* @__PURE__ */ jsx78("div", { className: "border-border bg-panel-2 mt-2 rounded-md border px-3 py-2 font-mono text-[11px] leading-[1.5]", children: event.payload })
7152
+ event.payload && /* @__PURE__ */ jsx79("div", { className: "border-border bg-panel-2 mt-2 rounded-md border px-3 py-2 font-mono text-[11px] leading-[1.5]", children: event.payload })
6492
7153
  ] }, event.id);
6493
7154
  })
6494
7155
  }
@@ -6498,9 +7159,9 @@ var ActivityTimeline = forwardRef76(
6498
7159
  ActivityTimeline.displayName = "ActivityTimeline";
6499
7160
 
6500
7161
  // src/patterns/Topbar/Topbar.tsx
6501
- import { forwardRef as forwardRef77 } from "react";
6502
- import { jsx as jsx79, jsxs as jsxs69 } from "react/jsx-runtime";
6503
- var Topbar = forwardRef77(function Topbar2({
7162
+ import { forwardRef as forwardRef78 } from "react";
7163
+ import { jsx as jsx80, jsxs as jsxs70 } from "react/jsx-runtime";
7164
+ var Topbar = forwardRef78(function Topbar2({
6504
7165
  title,
6505
7166
  eyebrow,
6506
7167
  leading,
@@ -6514,7 +7175,7 @@ var Topbar = forwardRef77(function Topbar2({
6514
7175
  }, ref) {
6515
7176
  const isTouch = density === "touch";
6516
7177
  const backHandler = typeof back === "function" ? back : back ? onBack : void 0;
6517
- return /* @__PURE__ */ jsxs69(
7178
+ return /* @__PURE__ */ jsxs70(
6518
7179
  "header",
6519
7180
  {
6520
7181
  ref,
@@ -6525,7 +7186,7 @@ var Topbar = forwardRef77(function Topbar2({
6525
7186
  ),
6526
7187
  ...props,
6527
7188
  children: [
6528
- isTouch && back && /* @__PURE__ */ jsx79(
7189
+ isTouch && back && /* @__PURE__ */ jsx80(
6529
7190
  "button",
6530
7191
  {
6531
7192
  type: "button",
@@ -6539,7 +7200,7 @@ var Topbar = forwardRef77(function Topbar2({
6539
7200
  "hover:bg-panel-2 h-touch w-touch",
6540
7201
  "focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]"
6541
7202
  ),
6542
- children: /* @__PURE__ */ jsx79(
7203
+ children: /* @__PURE__ */ jsx80(
6543
7204
  "svg",
6544
7205
  {
6545
7206
  width: "20",
@@ -6549,15 +7210,15 @@ var Topbar = forwardRef77(function Topbar2({
6549
7210
  stroke: "currentColor",
6550
7211
  strokeWidth: "2",
6551
7212
  "aria-hidden": true,
6552
- children: /* @__PURE__ */ jsx79("path", { d: "m15 18-6-6 6-6" })
7213
+ children: /* @__PURE__ */ jsx80("path", { d: "m15 18-6-6 6-6" })
6553
7214
  }
6554
7215
  )
6555
7216
  }
6556
7217
  ),
6557
7218
  leading,
6558
- (title || isTouch && eyebrow) && /* @__PURE__ */ jsxs69("div", { className: cn("min-w-0", isTouch && "flex-1"), children: [
6559
- isTouch && eyebrow && /* @__PURE__ */ jsx79("div", { className: "text-m-eyebrow text-accent font-mono tracking-wide uppercase", children: eyebrow }),
6560
- title && /* @__PURE__ */ jsx79(
7219
+ (title || isTouch && eyebrow) && /* @__PURE__ */ jsxs70("div", { className: cn("min-w-0", isTouch && "flex-1"), children: [
7220
+ isTouch && eyebrow && /* @__PURE__ */ jsx80("div", { className: "text-m-eyebrow text-accent font-mono tracking-wide uppercase", children: eyebrow }),
7221
+ title && /* @__PURE__ */ jsx80(
6561
7222
  "div",
6562
7223
  {
6563
7224
  className: cn(
@@ -6567,8 +7228,8 @@ var Topbar = forwardRef77(function Topbar2({
6567
7228
  }
6568
7229
  )
6569
7230
  ] }),
6570
- !isTouch && /* @__PURE__ */ jsx79("div", { className: "flex flex-1 items-center" }),
6571
- actions && /* @__PURE__ */ jsx79("div", { className: cn("flex items-center", isTouch ? "gap-1" : "gap-3"), children: actions }),
7231
+ !isTouch && /* @__PURE__ */ jsx80("div", { className: "flex flex-1 items-center" }),
7232
+ actions && /* @__PURE__ */ jsx80("div", { className: cn("flex items-center", isTouch ? "gap-1" : "gap-3"), children: actions }),
6572
7233
  children
6573
7234
  ]
6574
7235
  }
@@ -6578,14 +7239,15 @@ Topbar.displayName = "Topbar";
6578
7239
 
6579
7240
  // src/patterns/Tree/Tree.tsx
6580
7241
  import {
6581
- forwardRef as forwardRef78,
7242
+ forwardRef as forwardRef79,
6582
7243
  useCallback as useCallback16,
6583
7244
  useEffect as useEffect16,
6584
7245
  useMemo as useMemo7,
6585
- useRef as useRef13,
6586
- useState as useState19
7246
+ useRef as useRef14,
7247
+ useState as useState21
6587
7248
  } from "react";
6588
- import { jsx as jsx80, jsxs as jsxs70 } from "react/jsx-runtime";
7249
+ import { flushSync } from "react-dom";
7250
+ import { jsx as jsx81, jsxs as jsxs71 } from "react/jsx-runtime";
6589
7251
  var EMPTY_SET2 = /* @__PURE__ */ new Set();
6590
7252
  function flattenVisible(items, expanded, level, parentId, out) {
6591
7253
  for (const item of items) {
@@ -6596,7 +7258,7 @@ function flattenVisible(items, expanded, level, parentId, out) {
6596
7258
  }
6597
7259
  }
6598
7260
  }
6599
- var Tree = forwardRef78(function Tree2({
7261
+ var Tree = forwardRef79(function Tree2({
6600
7262
  items,
6601
7263
  expanded: expandedProp,
6602
7264
  defaultExpanded,
@@ -6624,7 +7286,7 @@ var Tree = forwardRef78(function Tree2({
6624
7286
  flattenVisible(items, expandedSet, 1, null, out);
6625
7287
  return out;
6626
7288
  }, [items, expandedSet]);
6627
- const [activeId, setActiveId] = useState19(null);
7289
+ const [activeId, setActiveId] = useState21(null);
6628
7290
  useEffect16(() => {
6629
7291
  if (activeId && !flatVisible.some((f) => f.id === activeId)) {
6630
7292
  setActiveId(null);
@@ -6635,7 +7297,7 @@ var Tree = forwardRef78(function Tree2({
6635
7297
  if (value && flatVisible.some((f) => f.id === value)) return value;
6636
7298
  return flatVisible[0]?.id ?? null;
6637
7299
  }, [activeId, flatVisible, value]);
6638
- const listRef = useRef13(null);
7300
+ const listRef = useRef14(null);
6639
7301
  const setRefs = useCallback16(
6640
7302
  (node) => {
6641
7303
  listRef.current = node;
@@ -6652,8 +7314,8 @@ var Tree = forwardRef78(function Tree2({
6652
7314
  }, []);
6653
7315
  const moveActive = useCallback16(
6654
7316
  (id) => {
6655
- setActiveId(id);
6656
- queueMicrotask(() => focusItem(id));
7317
+ flushSync(() => setActiveId(id));
7318
+ focusItem(id);
6657
7319
  },
6658
7320
  [focusItem]
6659
7321
  );
@@ -6778,7 +7440,7 @@ var Tree = forwardRef78(function Tree2({
6778
7440
  toggle
6779
7441
  ]
6780
7442
  );
6781
- return /* @__PURE__ */ jsx80(
7443
+ return /* @__PURE__ */ jsx81(
6782
7444
  "ul",
6783
7445
  {
6784
7446
  ref: setRefs,
@@ -6786,7 +7448,7 @@ var Tree = forwardRef78(function Tree2({
6786
7448
  className: cn("flex flex-col gap-px text-[12px]", className),
6787
7449
  onKeyDown: handleKeyDown,
6788
7450
  ...props,
6789
- children: items.map((item) => /* @__PURE__ */ jsx80(
7451
+ children: items.map((item) => /* @__PURE__ */ jsx81(
6790
7452
  TreeItemRow,
6791
7453
  {
6792
7454
  item,
@@ -6821,8 +7483,8 @@ function TreeItemRow({
6821
7483
  const isExpanded = hasChildren && expanded.has(item.id);
6822
7484
  const isSelected = selected === item.id;
6823
7485
  const isTabStop = tabStopId === item.id;
6824
- return /* @__PURE__ */ jsxs70("li", { role: "none", children: [
6825
- /* @__PURE__ */ jsxs70(
7486
+ return /* @__PURE__ */ jsxs71("li", { role: "none", children: [
7487
+ /* @__PURE__ */ jsxs71(
6826
7488
  "div",
6827
7489
  {
6828
7490
  role: "treeitem",
@@ -6845,14 +7507,14 @@ function TreeItemRow({
6845
7507
  isSelected ? "bg-accent-dim text-accent" : "text-text hover:bg-panel-2"
6846
7508
  ),
6847
7509
  children: [
6848
- /* @__PURE__ */ jsx80("span", { "aria-hidden": true, className: "text-text-dim grid w-3 place-items-center text-[10px]", children: hasChildren ? isExpanded ? "\u25BE" : "\u25B8" : "" }),
6849
- item.icon && /* @__PURE__ */ jsx80("span", { "aria-hidden": true, className: "text-[12px] opacity-80", children: item.icon }),
6850
- /* @__PURE__ */ jsx80("span", { className: "flex-1 truncate", children: item.label }),
7510
+ /* @__PURE__ */ jsx81("span", { "aria-hidden": true, className: "text-text-dim grid w-3 place-items-center text-[10px]", children: hasChildren ? isExpanded ? "\u25BE" : "\u25B8" : "" }),
7511
+ item.icon && /* @__PURE__ */ jsx81("span", { "aria-hidden": true, className: "text-[12px] opacity-80", children: item.icon }),
7512
+ /* @__PURE__ */ jsx81("span", { className: "flex-1 truncate", children: item.label }),
6851
7513
  item.trailing
6852
7514
  ]
6853
7515
  }
6854
7516
  ),
6855
- hasChildren && isExpanded && /* @__PURE__ */ jsx80("ul", { role: "group", className: "flex flex-col gap-px", children: (item.children ?? []).map((child) => /* @__PURE__ */ jsx80(
7517
+ hasChildren && isExpanded && /* @__PURE__ */ jsx81("ul", { role: "group", className: "flex flex-col gap-px", children: (item.children ?? []).map((child) => /* @__PURE__ */ jsx81(
6856
7518
  TreeItemRow,
6857
7519
  {
6858
7520
  item: child,
@@ -6870,10 +7532,10 @@ function TreeItemRow({
6870
7532
  }
6871
7533
 
6872
7534
  // src/patterns/WizardDialog/WizardDialog.tsx
6873
- import * as RadixDialog6 from "@radix-ui/react-dialog";
6874
- import { forwardRef as forwardRef79, useCallback as useCallback17, useMemo as useMemo8, useState as useState20 } from "react";
6875
- import { jsx as jsx81, jsxs as jsxs71 } from "react/jsx-runtime";
6876
- var WizardDialog = forwardRef79(function WizardDialog2({
7535
+ import * as RadixDialog7 from "@radix-ui/react-dialog";
7536
+ import { forwardRef as forwardRef80, useCallback as useCallback17, useMemo as useMemo8, useState as useState22 } from "react";
7537
+ import { jsx as jsx82, jsxs as jsxs72 } from "react/jsx-runtime";
7538
+ var WizardDialog = forwardRef80(function WizardDialog2({
6877
7539
  open,
6878
7540
  defaultOpen,
6879
7541
  onOpenChange,
@@ -6889,7 +7551,7 @@ var WizardDialog = forwardRef79(function WizardDialog2({
6889
7551
  cancelLabel,
6890
7552
  onCancel
6891
7553
  }, ref) {
6892
- const [current, setCurrent] = useState20(initialStep);
7554
+ const [current, setCurrent] = useState22(initialStep);
6893
7555
  const total = steps.length;
6894
7556
  const safeCurrent = Math.min(current, Math.max(0, total - 1));
6895
7557
  const step = steps[safeCurrent];
@@ -6924,23 +7586,36 @@ var WizardDialog = forwardRef79(function WizardDialog2({
6924
7586
  goNext();
6925
7587
  }
6926
7588
  };
6927
- return /* @__PURE__ */ jsx81(DialogRoot, { open, defaultOpen, onOpenChange, children: /* @__PURE__ */ jsxs71(DialogContent, { ref, width, children: [
6928
- title && /* @__PURE__ */ jsx81(WizardTitle, { children: title }),
6929
- description && /* @__PURE__ */ jsx81(WizardDescription, { children: description }),
6930
- /* @__PURE__ */ jsx81("div", { className: "mb-5", children: /* @__PURE__ */ jsx81(Stepper, { steps: stepperSteps, current: safeCurrent }) }),
6931
- /* @__PURE__ */ jsx81("div", { className: "mb-5", children: body }),
6932
- /* @__PURE__ */ jsxs71("div", { className: "flex justify-end gap-2", children: [
6933
- cancelLabel && /* @__PURE__ */ jsx81(Button, { type: "button", variant: "ghost", onClick: onCancel, children: cancelLabel }),
6934
- /* @__PURE__ */ jsx81(Button, { type: "button", variant: "secondary", onClick: goBack, disabled: ctx.isFirst, children: backLabel }),
6935
- /* @__PURE__ */ jsx81(Button, { type: "button", variant: "primary", onClick: handlePrimary, disabled: !canAdvance, children: ctx.isLast ? completeLabel : nextLabel })
6936
- ] })
6937
- ] }) });
7589
+ return /* @__PURE__ */ jsx82(DialogRoot, { open, defaultOpen, onOpenChange, children: /* @__PURE__ */ jsxs72(
7590
+ DialogContent,
7591
+ {
7592
+ ref,
7593
+ width,
7594
+ ...description ? {} : { "aria-describedby": void 0 },
7595
+ children: [
7596
+ title ? /* @__PURE__ */ jsx82(WizardTitle, { children: title }) : (
7597
+ // Radix Dialog requires a Title for assistive tech and warns in dev
7598
+ // mode without one. Fall back to a visually-hidden generic title so
7599
+ // the contract is met even when no title prop is supplied.
7600
+ /* @__PURE__ */ jsx82(RadixDialog7.Title, { className: "sr-only", children: "Wizard" })
7601
+ ),
7602
+ description && /* @__PURE__ */ jsx82(WizardDescription, { children: description }),
7603
+ /* @__PURE__ */ jsx82("div", { className: "mb-5", children: /* @__PURE__ */ jsx82(Stepper, { steps: stepperSteps, current: safeCurrent }) }),
7604
+ /* @__PURE__ */ jsx82("div", { className: "mb-5", children: body }),
7605
+ /* @__PURE__ */ jsxs72("div", { className: "flex justify-end gap-2", children: [
7606
+ cancelLabel && /* @__PURE__ */ jsx82(Button, { type: "button", variant: "ghost", onClick: onCancel, children: cancelLabel }),
7607
+ /* @__PURE__ */ jsx82(Button, { type: "button", variant: "secondary", onClick: goBack, disabled: ctx.isFirst, children: backLabel }),
7608
+ /* @__PURE__ */ jsx82(Button, { type: "button", variant: "primary", onClick: handlePrimary, disabled: !canAdvance, children: ctx.isLast ? completeLabel : nextLabel })
7609
+ ] })
7610
+ ]
7611
+ }
7612
+ ) });
6938
7613
  });
6939
7614
  function WizardTitle({ children }) {
6940
- return /* @__PURE__ */ jsx81(RadixDialog6.Title, { className: "mb-2 text-[16px] font-medium", children });
7615
+ return /* @__PURE__ */ jsx82(RadixDialog7.Title, { className: "mb-2 text-[16px] font-medium", children });
6941
7616
  }
6942
7617
  function WizardDescription({ children }) {
6943
- return /* @__PURE__ */ jsx81(RadixDialog6.Description, { className: "text-text-muted mb-4 text-[13px] leading-[1.55]", children });
7618
+ return /* @__PURE__ */ jsx82(RadixDialog7.Description, { className: "text-text-muted mb-4 text-[13px] leading-[1.55]", children });
6944
7619
  }
6945
7620
  WizardDialog.displayName = "WizardDialog";
6946
7621
  export {
@@ -7017,6 +7692,7 @@ export {
7017
7692
  LargeTitle,
7018
7693
  Lightbox,
7019
7694
  ListingCard,
7695
+ ListingDetail,
7020
7696
  MenuCheckboxItem,
7021
7697
  MenuItem,
7022
7698
  MenuSeparator,