@tapizlabs/ui 0.2.16 → 0.2.20

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
@@ -621,6 +621,20 @@ var LogoMark = ({
621
621
  fill: "none"
622
622
  }
623
623
  )
624
+ ] }),
625
+ variant === "pulse" && /* @__PURE__ */ jsxs6(Fragment, { children: [
626
+ /* @__PURE__ */ jsx6(
627
+ "path",
628
+ {
629
+ d: "M10 34 L20 34 L25 20 L30 46 L35 28 L39 34 L54 34",
630
+ stroke: glyph,
631
+ strokeWidth: "4.5",
632
+ strokeLinecap: "round",
633
+ strokeLinejoin: "round",
634
+ fill: "none"
635
+ }
636
+ ),
637
+ /* @__PURE__ */ jsx6("circle", { cx: "30", cy: "20", r: "3.5", fill: accentDetail })
624
638
  ] })
625
639
  ]
626
640
  }
@@ -1900,33 +1914,13 @@ function StatusBadge({ label, variant = "default", className = "" }) {
1900
1914
  }
1901
1915
 
1902
1916
  // src/components/shared/ActionMenu.tsx
1903
- import { useEffect as useEffect2, useLayoutEffect, useRef as useRef2, useState as useState5 } from "react";
1917
+ import { useEffect as useEffect2, useRef as useRef2, useState as useState6 } from "react";
1904
1918
  import { createPortal as createPortal4 } from "react-dom";
1905
- import { Fragment as Fragment2, jsx as jsx42, jsxs as jsxs28 } from "react/jsx-runtime";
1906
- var defaultMenuStyle = {
1907
- background: "var(--color-ink-200)",
1908
- border: "1px solid var(--color-border-hi)",
1909
- borderTop: "2px solid var(--color-primary-300)",
1910
- boxShadow: "0 16px 48px -8px rgba(0,0,0,0.45)",
1911
- maxHeight: "min(320px, calc(100vh - 180px))"
1912
- };
1913
- var itemBaseClass = "flex w-full items-center gap-2.5 border-l-2 border-transparent px-4 py-2.5 text-left text-sm transition-colors duration-100 hover:border-[var(--color-primary-300)] disabled:cursor-not-allowed disabled:opacity-40";
1914
- function ActionMenu({
1915
- label,
1916
- items,
1917
- icon,
1918
- buttonSize = "sm",
1919
- buttonVariant = "secondary",
1920
- buttonClassName = "",
1921
- menuClassName,
1922
- menuStyle,
1923
- fullWidth = false,
1924
- closeLabel
1925
- }) {
1926
- const [open, setOpen] = useState5(false);
1919
+
1920
+ // src/components/shared/useMenuPosition.ts
1921
+ import { useLayoutEffect, useState as useState5 } from "react";
1922
+ function useMenuPosition(open, btnRef, itemCount) {
1927
1923
  const [pos, setPos] = useState5(null);
1928
- const btnRef = useRef2(null);
1929
- const menuRef = useRef2(null);
1930
1924
  useLayoutEffect(() => {
1931
1925
  if (!open || !btnRef.current) return;
1932
1926
  const updatePosition = () => {
@@ -1940,7 +1934,7 @@ function ActionMenu({
1940
1934
  viewportPadding,
1941
1935
  Math.min(rect.right - menuW, window.innerWidth - menuW - viewportPadding)
1942
1936
  );
1943
- const estimatedMenuHeight = Math.min(320, items.length * 44 + 16);
1937
+ const estimatedMenuHeight = Math.min(320, itemCount * 44 + 16);
1944
1938
  const spaceAbove = Math.max(0, rect.top - viewportPadding - menuOffset);
1945
1939
  const spaceBelow = Math.max(0, window.innerHeight - rect.bottom - viewportPadding - menuOffset);
1946
1940
  const preferBelow = spaceBelow >= estimatedMenuHeight || spaceBelow >= spaceAbove;
@@ -1967,7 +1961,36 @@ function ActionMenu({
1967
1961
  window.removeEventListener("resize", updatePosition);
1968
1962
  document.removeEventListener("scroll", updatePosition, true);
1969
1963
  };
1970
- }, [items.length, open]);
1964
+ }, [itemCount, open, btnRef]);
1965
+ return pos;
1966
+ }
1967
+
1968
+ // src/components/shared/ActionMenu.tsx
1969
+ import { Fragment as Fragment2, jsx as jsx42, jsxs as jsxs28 } from "react/jsx-runtime";
1970
+ var defaultMenuStyle = {
1971
+ background: "var(--color-ink-200)",
1972
+ border: "1px solid var(--color-border-hi)",
1973
+ borderTop: "2px solid var(--color-primary-300)",
1974
+ boxShadow: "0 16px 48px -8px rgba(0,0,0,0.45)",
1975
+ maxHeight: "min(320px, calc(100vh - 180px))"
1976
+ };
1977
+ var itemBaseClass = "flex w-full items-center gap-2.5 border-l-2 border-transparent px-4 py-2.5 text-left text-sm transition-colors duration-100 hover:border-[var(--color-primary-300)] disabled:cursor-not-allowed disabled:opacity-40";
1978
+ function ActionMenu({
1979
+ label,
1980
+ items,
1981
+ icon,
1982
+ buttonSize = "sm",
1983
+ buttonVariant = "secondary",
1984
+ buttonClassName = "",
1985
+ menuClassName,
1986
+ menuStyle,
1987
+ fullWidth = false,
1988
+ closeLabel
1989
+ }) {
1990
+ const [open, setOpen] = useState6(false);
1991
+ const btnRef = useRef2(null);
1992
+ const menuRef = useRef2(null);
1993
+ const pos = useMenuPosition(open, btnRef, items.length);
1971
1994
  useEffect2(() => {
1972
1995
  if (!open) return;
1973
1996
  function handle(e) {
@@ -1986,6 +2009,7 @@ function ActionMenu({
1986
2009
  document.removeEventListener("keydown", handle);
1987
2010
  };
1988
2011
  }, [open]);
2012
+ void closeLabel;
1989
2013
  const menuNode = open && pos ? /* @__PURE__ */ jsxs28(Fragment2, { children: [
1990
2014
  /* @__PURE__ */ jsx42("div", { className: "fixed inset-0 z-9998", onClick: () => setOpen(false) }),
1991
2015
  /* @__PURE__ */ jsx42(
@@ -2046,9 +2070,6 @@ function ActionMenu({
2046
2070
  ] });
2047
2071
  }
2048
2072
 
2049
- // src/components/table/DataTable.tsx
2050
- import { useMemo as useMemo2, useState as useState6 } from "react";
2051
-
2052
2073
  // src/components/table/DataTableRow.tsx
2053
2074
  import { memo } from "react";
2054
2075
  import { jsx as jsx43, jsxs as jsxs29 } from "react/jsx-runtime";
@@ -2080,13 +2101,21 @@ function DataTableRowInner({ row, columns, onRowClick, rowActions, densityCellCl
2080
2101
  }
2081
2102
  var DataTableRow = memo(DataTableRowInner);
2082
2103
 
2083
- // src/components/table/DataTable.tsx
2084
- import { jsx as jsx44, jsxs as jsxs30 } from "react/jsx-runtime";
2085
- var ALIGN_CLASS2 = {
2086
- left: "text-left",
2087
- center: "text-center",
2088
- right: "text-right"
2089
- };
2104
+ // src/components/table/DataTableMobileCard.tsx
2105
+ import { jsx as jsx44 } from "react/jsx-runtime";
2106
+ function DataTableMobileCard({
2107
+ data,
2108
+ isLoading,
2109
+ loadingRows,
2110
+ emptyState,
2111
+ rowKey,
2112
+ mobileCard
2113
+ }) {
2114
+ return /* @__PURE__ */ jsx44("div", { className: "md:hidden", children: isLoading ? Array.from({ length: loadingRows }).map((_, i) => /* @__PURE__ */ jsx44("div", { className: "h-16 animate-pulse bg-ink-300" }, i)) : data.length === 0 ? emptyState : data.map((row) => /* @__PURE__ */ jsx44("div", { children: mobileCard(row) }, rowKey(row))) });
2115
+ }
2116
+
2117
+ // src/components/table/useSortedData.ts
2118
+ import { useMemo as useMemo2, useState as useState7 } from "react";
2090
2119
  function compareValues(a, b) {
2091
2120
  if (a == null && b == null) return 0;
2092
2121
  if (a == null) return -1;
@@ -2096,6 +2125,37 @@ function compareValues(a, b) {
2096
2125
  if (typeof a === "boolean" && typeof b === "boolean") return Number(a) - Number(b);
2097
2126
  return String(a).localeCompare(String(b));
2098
2127
  }
2128
+ function useSortedData(data, columns, serverSort) {
2129
+ const [sort, setSort] = useState7(null);
2130
+ const sortedData = useMemo2(() => {
2131
+ if (serverSort) return data;
2132
+ if (!sort) return data;
2133
+ const column = columns.find((c) => c.id === sort.columnId);
2134
+ if (!column?.sortAccessor) return data;
2135
+ const accessor = column.sortAccessor;
2136
+ const factor = sort.direction === "asc" ? 1 : -1;
2137
+ return [...data].sort((a, b) => compareValues(accessor(a), accessor(b)) * factor);
2138
+ }, [data, columns, sort, serverSort]);
2139
+ const toggleSort = (columnId) => {
2140
+ if (serverSort) {
2141
+ serverSort.onSort(columnId);
2142
+ return;
2143
+ }
2144
+ setSort((prev) => {
2145
+ if (prev?.columnId !== columnId) return { columnId, direction: "asc" };
2146
+ return { columnId, direction: prev.direction === "asc" ? "desc" : "asc" };
2147
+ });
2148
+ };
2149
+ return { sortedData, sort, toggleSort };
2150
+ }
2151
+
2152
+ // src/components/table/DataTable.tsx
2153
+ import { jsx as jsx45, jsxs as jsxs30 } from "react/jsx-runtime";
2154
+ var ALIGN_CLASS2 = {
2155
+ left: "text-left",
2156
+ center: "text-center",
2157
+ right: "text-right"
2158
+ };
2099
2159
  function ariaSort(active, direction) {
2100
2160
  if (!active) return "none";
2101
2161
  return direction === "asc" ? "ascending" : "descending";
@@ -2118,26 +2178,7 @@ function DataTable({
2118
2178
  striped = true,
2119
2179
  className = ""
2120
2180
  }) {
2121
- const [sort, setSort] = useState6(null);
2122
- const sortedData = useMemo2(() => {
2123
- if (serverSort) return data;
2124
- if (!sort) return data;
2125
- const column = columns.find((c) => c.id === sort.columnId);
2126
- if (!column?.sortAccessor) return data;
2127
- const accessor = column.sortAccessor;
2128
- const factor = sort.direction === "asc" ? 1 : -1;
2129
- return [...data].sort((a, b) => compareValues(accessor(a), accessor(b)) * factor);
2130
- }, [data, columns, sort, serverSort]);
2131
- const toggleSort = (columnId) => {
2132
- if (serverSort) {
2133
- serverSort.onSort(columnId);
2134
- return;
2135
- }
2136
- setSort((prev) => {
2137
- if (prev?.columnId !== columnId) return { columnId, direction: "asc" };
2138
- return { columnId, direction: prev.direction === "asc" ? "desc" : "asc" };
2139
- });
2140
- };
2181
+ const { sortedData, sort, toggleSort } = useSortedData(data, columns, serverSort);
2141
2182
  const hasActions = rowActions !== void 0;
2142
2183
  const colCount = columns.length + (hasActions ? 1 : 0);
2143
2184
  const tableClass = mobileCard !== void 0 ? "hidden md:table w-full text-sm table-collapse" : "w-full text-sm table-collapse";
@@ -2145,22 +2186,32 @@ function DataTable({
2145
2186
  const densityCellClass = density === "compact" ? "px-3 py-2" : density === "spacious" ? "px-4 py-4" : "px-3 py-2.5";
2146
2187
  const wrapperClass = [
2147
2188
  "overflow-x-auto",
2148
- variant === "brutal" ? "border-2 border-[var(--tapiz-border-strong)] shadow-[var(--tapiz-shadow-brutal)]" : "border border-[var(--tapiz-border-subtle)]",
2189
+ variant === "brutal" ? "border-2 border-[var(--tapiz-border-strong)] shadow-[var(--tapiz-shadow-brutal)]" : "border border-(--tapiz-border-subtle)",
2149
2190
  variant === "enterprise" ? "bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-md)]" : "",
2150
2191
  className
2151
2192
  ].filter(Boolean).join(" ");
2152
2193
  return /* @__PURE__ */ jsxs30("div", { className: wrapperClass, children: [
2153
- mobileCard !== void 0 && /* @__PURE__ */ jsx44("div", { className: "md:hidden", children: isLoading ? Array.from({ length: loadingRows }).map((_, i) => /* @__PURE__ */ jsx44("div", { className: "h-16 animate-pulse bg-ink-300" }, i)) : sortedData.length === 0 ? emptyState : sortedData.map((row) => /* @__PURE__ */ jsx44("div", { children: mobileCard(row) }, rowKey(row))) }),
2194
+ mobileCard !== void 0 && /* @__PURE__ */ jsx45(
2195
+ DataTableMobileCard,
2196
+ {
2197
+ data: sortedData,
2198
+ isLoading,
2199
+ loadingRows,
2200
+ emptyState,
2201
+ rowKey,
2202
+ mobileCard
2203
+ }
2204
+ ),
2154
2205
  /* @__PURE__ */ jsxs30("table", { className: tableClass, children: [
2155
- /* @__PURE__ */ jsx44("thead", { children: /* @__PURE__ */ jsxs30("tr", { className: "border-b border-border bg-ink-300", children: [
2206
+ /* @__PURE__ */ jsx45("thead", { children: /* @__PURE__ */ jsxs30("tr", { className: "border-b border-border bg-ink-300", children: [
2156
2207
  columns.map((column) => {
2157
2208
  const baseClass = `${densityHeaderClass} ${stickyHeader ? "sticky top-0 z-10" : ""} ${ALIGN_CLASS2[column.align ?? "left"]} font-mono text-[11px] tracking-[.08em] text-txt-4 font-semibold whitespace-nowrap`;
2158
2209
  if (!column.sortable || !column.sortAccessor) {
2159
- return /* @__PURE__ */ jsx44("th", { scope: "col", className: baseClass, children: column.header }, column.id);
2210
+ return /* @__PURE__ */ jsx45("th", { scope: "col", className: baseClass, children: column.header }, column.id);
2160
2211
  }
2161
2212
  const active = serverSort ? serverSort.field === column.id : sort?.columnId === column.id;
2162
2213
  const direction = serverSort ? serverSort.dir : sort?.direction ?? "asc";
2163
- return /* @__PURE__ */ jsx44(
2214
+ return /* @__PURE__ */ jsx45(
2164
2215
  "th",
2165
2216
  {
2166
2217
  scope: "col",
@@ -2174,7 +2225,7 @@ function DataTable({
2174
2225
  className: `inline-flex items-center gap-1 select-none transition-colors hover:text-txt-1 ${active ? "text-txt-1" : ""}`,
2175
2226
  children: [
2176
2227
  column.header,
2177
- active && (direction === "asc" ? /* @__PURE__ */ jsx44(ChevronUp, { size: 12 }) : /* @__PURE__ */ jsx44(ChevronDown, { size: 12 }))
2228
+ active && (direction === "asc" ? /* @__PURE__ */ jsx45(ChevronUp, { size: 12 }) : /* @__PURE__ */ jsx45(ChevronDown, { size: 12 }))
2178
2229
  ]
2179
2230
  }
2180
2231
  )
@@ -2182,9 +2233,9 @@ function DataTable({
2182
2233
  column.id
2183
2234
  );
2184
2235
  }),
2185
- hasActions && /* @__PURE__ */ jsx44("th", { scope: "col", className: "px-3 py-2.5 text-right font-mono text-[11px] tracking-[.08em] text-txt-4 font-semibold whitespace-nowrap" })
2236
+ hasActions && /* @__PURE__ */ jsx45("th", { scope: "col", className: "px-3 py-2.5 text-right font-mono text-[11px] tracking-[.08em] text-txt-4 font-semibold whitespace-nowrap" })
2186
2237
  ] }) }),
2187
- /* @__PURE__ */ jsx44("tbody", { children: isLoading ? Array.from({ length: loadingRows }).map((_, rowIndex) => /* @__PURE__ */ jsx44("tr", { className: "border-b border-[var(--tapiz-border-subtle)]", children: Array.from({ length: colCount }).map((__, colIndex) => /* @__PURE__ */ jsx44("td", { className: densityCellClass, children: /* @__PURE__ */ jsx44("div", { className: "h-4 w-24 animate-pulse bg-[var(--tapiz-bg-surface-muted)]" }) }, colIndex)) }, rowIndex)) : sortedData.length === 0 ? /* @__PURE__ */ jsx44("tr", { children: /* @__PURE__ */ jsx44("td", { colSpan: colCount, className: "px-4 py-10 text-center text-txt-4 text-sm font-mono", children: emptyState }) }) : sortedData.map((row) => /* @__PURE__ */ jsx44(
2238
+ /* @__PURE__ */ jsx45("tbody", { children: isLoading ? Array.from({ length: loadingRows }).map((_, rowIndex) => /* @__PURE__ */ jsx45("tr", { className: "border-b border-(--tapiz-border-subtle)", children: Array.from({ length: colCount }).map((__, colIndex) => /* @__PURE__ */ jsx45("td", { className: densityCellClass, children: /* @__PURE__ */ jsx45("div", { className: "h-4 w-24 animate-pulse bg-(--tapiz-bg-surface-muted)" }) }, colIndex)) }, rowIndex)) : sortedData.length === 0 ? /* @__PURE__ */ jsx45("tr", { children: /* @__PURE__ */ jsx45("td", { colSpan: colCount, className: "px-4 py-10 text-center text-txt-4 text-sm font-mono", children: emptyState }) }) : sortedData.map((row) => /* @__PURE__ */ jsx45(
2188
2239
  DataTableRow,
2189
2240
  {
2190
2241
  row,
@@ -2202,77 +2253,101 @@ function DataTable({
2202
2253
  }
2203
2254
 
2204
2255
  // src/components/marketing/CTASection.tsx
2205
- import { jsx as jsx45, jsxs as jsxs31 } from "react/jsx-runtime";
2256
+ import { jsx as jsx46, jsxs as jsxs31 } from "react/jsx-runtime";
2206
2257
  function CTASection({ eyebrow, title, description, actions, className = "" }) {
2207
- return /* @__PURE__ */ jsx45("section", { className: `mx-auto max-w-7xl px-[var(--tapiz-space-page-x)] py-[var(--tapiz-space-section-y)] ${className}`, children: /* @__PURE__ */ jsxs31("div", { className: "border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] p-8 shadow-[var(--tapiz-shadow-brutal-lg)] md:p-12", children: [
2208
- eyebrow ? /* @__PURE__ */ jsx45("div", { className: "kicker mb-3", children: eyebrow }) : null,
2258
+ return /* @__PURE__ */ jsx46("section", { className: `mx-auto max-w-7xl px-[var(--tapiz-space-page-x)] py-[var(--tapiz-space-section-y)] ${className}`, children: /* @__PURE__ */ jsxs31("div", { className: "border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] p-8 shadow-[var(--tapiz-shadow-brutal-lg)] md:p-12", children: [
2259
+ eyebrow ? /* @__PURE__ */ jsx46("div", { className: "kicker mb-3", children: eyebrow }) : null,
2209
2260
  /* @__PURE__ */ jsxs31("div", { className: "grid gap-6 lg:grid-cols-[1fr_auto] lg:items-end", children: [
2210
2261
  /* @__PURE__ */ jsxs31("div", { children: [
2211
- /* @__PURE__ */ jsx45("h2", { className: "max-w-3xl text-3xl font-semibold tracking-[-0.05em] md:text-5xl", children: title }),
2212
- description ? /* @__PURE__ */ jsx45("p", { className: "mt-4 max-w-2xl text-base leading-7 text-[var(--tapiz-text-secondary)]", children: description }) : null
2262
+ /* @__PURE__ */ jsx46("h2", { className: "max-w-3xl text-3xl font-semibold tracking-[-0.05em] md:text-5xl", children: title }),
2263
+ description ? /* @__PURE__ */ jsx46("p", { className: "mt-4 max-w-2xl text-base leading-7 text-[var(--tapiz-text-secondary)]", children: description }) : null
2213
2264
  ] }),
2214
- actions ? /* @__PURE__ */ jsx45("div", { className: "flex flex-wrap gap-3", children: actions }) : null
2265
+ actions ? /* @__PURE__ */ jsx46("div", { className: "flex flex-wrap gap-3", children: actions }) : null
2215
2266
  ] })
2216
2267
  ] }) });
2217
2268
  }
2218
2269
 
2219
2270
  // src/components/marketing/ComparisonTable.tsx
2220
- import { jsx as jsx46, jsxs as jsxs32 } from "react/jsx-runtime";
2271
+ import { jsx as jsx47, jsxs as jsxs32 } from "react/jsx-runtime";
2221
2272
  function ComparisonTable({ rows, featureHeader = "Feature", includedHeader = "Tapiz", alternativeHeader = "Other", className = "" }) {
2222
- return /* @__PURE__ */ jsx46("div", { className: `overflow-x-auto border border-[var(--tapiz-border-strong)] ${className}`, children: /* @__PURE__ */ jsxs32("table", { className: "w-full text-sm", children: [
2223
- /* @__PURE__ */ jsx46("thead", { children: /* @__PURE__ */ jsxs32("tr", { children: [
2224
- /* @__PURE__ */ jsx46("th", { className: "px-4 py-3 text-left", children: featureHeader }),
2225
- /* @__PURE__ */ jsx46("th", { className: "px-4 py-3 text-left", children: includedHeader }),
2226
- /* @__PURE__ */ jsx46("th", { className: "px-4 py-3 text-left", children: alternativeHeader })
2273
+ return /* @__PURE__ */ jsx47("div", { className: `overflow-x-auto border border-[var(--tapiz-border-strong)] ${className}`, children: /* @__PURE__ */ jsxs32("table", { className: "w-full text-sm", children: [
2274
+ /* @__PURE__ */ jsx47("thead", { children: /* @__PURE__ */ jsxs32("tr", { children: [
2275
+ /* @__PURE__ */ jsx47("th", { className: "px-4 py-3 text-left", children: featureHeader }),
2276
+ /* @__PURE__ */ jsx47("th", { className: "px-4 py-3 text-left", children: includedHeader }),
2277
+ /* @__PURE__ */ jsx47("th", { className: "px-4 py-3 text-left", children: alternativeHeader })
2227
2278
  ] }) }),
2228
- /* @__PURE__ */ jsx46("tbody", { children: rows.map((row, index) => /* @__PURE__ */ jsxs32("tr", { className: "border-t border-[var(--tapiz-border-subtle)]", children: [
2229
- /* @__PURE__ */ jsx46("td", { className: "px-4 py-3 font-medium text-[var(--tapiz-text-primary)]", children: row.feature }),
2230
- /* @__PURE__ */ jsx46("td", { className: "px-4 py-3 text-[var(--tapiz-text-secondary)]", children: row.included }),
2231
- /* @__PURE__ */ jsx46("td", { className: "px-4 py-3 text-[var(--tapiz-text-muted)]", children: row.alternative })
2279
+ /* @__PURE__ */ jsx47("tbody", { children: rows.map((row, index) => /* @__PURE__ */ jsxs32("tr", { className: "border-t border-[var(--tapiz-border-subtle)]", children: [
2280
+ /* @__PURE__ */ jsx47("td", { className: "px-4 py-3 font-medium text-[var(--tapiz-text-primary)]", children: row.feature }),
2281
+ /* @__PURE__ */ jsx47("td", { className: "px-4 py-3 text-[var(--tapiz-text-secondary)]", children: row.included }),
2282
+ /* @__PURE__ */ jsx47("td", { className: "px-4 py-3 text-[var(--tapiz-text-muted)]", children: row.alternative })
2232
2283
  ] }, index)) })
2233
2284
  ] }) });
2234
2285
  }
2235
2286
 
2236
2287
  // src/components/marketing/FeatureCard.tsx
2237
- import { jsx as jsx47, jsxs as jsxs33 } from "react/jsx-runtime";
2288
+ import { jsx as jsx48, jsxs as jsxs33 } from "react/jsx-runtime";
2238
2289
  function FeatureCard({ title, description, icon, eyebrow, children, className = "", variant = "surface" }) {
2239
2290
  return /* @__PURE__ */ jsxs33(Card, { variant, hover: true, className: `group ${className}`, children: [
2240
2291
  /* @__PURE__ */ jsxs33("div", { className: "flex items-start gap-4", children: [
2241
- icon ? /* @__PURE__ */ jsx47("div", { className: "grid h-11 w-11 shrink-0 place-items-center border border-[var(--tapiz-border-strong)] bg-[var(--color-icon-bg)] text-[var(--tapiz-accent)] group-hover:translate-x-[-1px] group-hover:translate-y-[-1px]", children: icon }) : null,
2292
+ icon ? /* @__PURE__ */ jsx48("div", { className: "grid h-11 w-11 shrink-0 place-items-center border border-[var(--tapiz-border-strong)] bg-[var(--color-icon-bg)] text-[var(--tapiz-accent)] group-hover:translate-x-[-1px] group-hover:translate-y-[-1px]", children: icon }) : null,
2242
2293
  /* @__PURE__ */ jsxs33("div", { className: "min-w-0", children: [
2243
- eyebrow ? /* @__PURE__ */ jsx47("div", { className: "kicker mb-1", children: eyebrow }) : null,
2244
- /* @__PURE__ */ jsx47("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: title }),
2245
- description ? /* @__PURE__ */ jsx47("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
2294
+ eyebrow ? /* @__PURE__ */ jsx48("div", { className: "kicker mb-1", children: eyebrow }) : null,
2295
+ /* @__PURE__ */ jsx48("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: title }),
2296
+ description ? /* @__PURE__ */ jsx48("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
2246
2297
  ] })
2247
2298
  ] }),
2248
- children ? /* @__PURE__ */ jsx47("div", { className: "mt-5", children }) : null
2299
+ children ? /* @__PURE__ */ jsx48("div", { className: "mt-5", children }) : null
2249
2300
  ] });
2250
2301
  }
2251
2302
 
2252
2303
  // src/components/marketing/FeatureGrid.tsx
2253
- import { jsx as jsx48 } from "react/jsx-runtime";
2304
+ import { jsx as jsx49 } from "react/jsx-runtime";
2254
2305
  function FeatureGrid({ children, className = "" }) {
2255
- return /* @__PURE__ */ jsx48("div", { className: `grid gap-4 md:grid-cols-2 xl:grid-cols-3 ${className}`, children });
2306
+ return /* @__PURE__ */ jsx49("div", { className: `grid gap-4 md:grid-cols-2 xl:grid-cols-3 ${className}`, children });
2256
2307
  }
2257
2308
 
2258
2309
  // src/components/marketing/HeroFrame.tsx
2259
- import { jsx as jsx49, jsxs as jsxs34 } from "react/jsx-runtime";
2310
+ import { jsx as jsx50, jsxs as jsxs34 } from "react/jsx-runtime";
2260
2311
  function HeroFrame({ eyebrow, title, description, actions, visual, meta, className = "" }) {
2261
2312
  return /* @__PURE__ */ jsxs34("section", { className: `mx-auto grid max-w-7xl gap-10 px-[var(--tapiz-space-page-x)] py-[var(--tapiz-space-section-y)] lg:grid-cols-[1fr_0.9fr] lg:items-center ${className}`, children: [
2262
2313
  /* @__PURE__ */ jsxs34("div", { className: "animate-fade-in-up", children: [
2263
- eyebrow ? /* @__PURE__ */ jsx49("div", { className: "kicker mb-4", children: eyebrow }) : null,
2264
- /* @__PURE__ */ jsx49("h1", { className: "max-w-4xl text-5xl font-semibold leading-[0.95] tracking-[-0.07em] text-[var(--tapiz-text-primary)] md:text-7xl", children: title }),
2265
- description ? /* @__PURE__ */ jsx49("p", { className: "mt-6 max-w-2xl text-base leading-7 text-[var(--tapiz-text-secondary)] md:text-lg", children: description }) : null,
2266
- actions ? /* @__PURE__ */ jsx49("div", { className: "mt-8 flex flex-wrap gap-3", children: actions }) : null,
2267
- meta ? /* @__PURE__ */ jsx49("div", { className: "mt-8 border-l-2 border-[var(--tapiz-accent)] pl-4 font-mono text-xs text-[var(--tapiz-text-muted)]", children: meta }) : null
2314
+ eyebrow ? /* @__PURE__ */ jsx50("div", { className: "kicker mb-4", children: eyebrow }) : null,
2315
+ /* @__PURE__ */ jsx50("h1", { className: "max-w-4xl text-5xl font-semibold leading-[0.95] tracking-[-0.07em] text-[var(--tapiz-text-primary)] md:text-7xl", children: title }),
2316
+ description ? /* @__PURE__ */ jsx50("p", { className: "mt-6 max-w-2xl text-base leading-7 text-[var(--tapiz-text-secondary)] md:text-lg", children: description }) : null,
2317
+ actions ? /* @__PURE__ */ jsx50("div", { className: "mt-8 flex flex-wrap gap-3", children: actions }) : null,
2318
+ meta ? /* @__PURE__ */ jsx50("div", { className: "mt-8 border-l-2 border-[var(--tapiz-accent)] pl-4 font-mono text-xs text-[var(--tapiz-text-muted)]", children: meta }) : null
2268
2319
  ] }),
2269
- visual ? /* @__PURE__ */ jsx49("div", { className: "animate-scale-in border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] p-3 shadow-[var(--tapiz-shadow-brutal-lg)]", children: visual }) : null
2320
+ visual ? /* @__PURE__ */ jsx50("div", { className: "animate-scale-in border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] p-3 shadow-[var(--tapiz-shadow-brutal-lg)]", children: visual }) : null
2270
2321
  ] });
2271
2322
  }
2272
2323
 
2324
+ // src/components/marketing/useDrawerState.ts
2325
+ import { useEffect as useEffect3, useState as useState8 } from "react";
2326
+ function useDrawerState() {
2327
+ const [open, setOpen] = useState8(false);
2328
+ const [renderDrawer, setRenderDrawer] = useState8(false);
2329
+ useEffect3(() => {
2330
+ if (open) {
2331
+ setRenderDrawer(true);
2332
+ document.body.style.overflow = "hidden";
2333
+ document.body.classList.add("tapiz-landing-navbar-open");
2334
+ return () => {
2335
+ document.body.style.overflow = "";
2336
+ document.body.classList.remove("tapiz-landing-navbar-open");
2337
+ };
2338
+ }
2339
+ const timeoutId = window.setTimeout(() => {
2340
+ setRenderDrawer(false);
2341
+ document.body.style.overflow = "";
2342
+ document.body.classList.remove("tapiz-landing-navbar-open");
2343
+ }, 220);
2344
+ return () => window.clearTimeout(timeoutId);
2345
+ }, [open]);
2346
+ return { open, setOpen, renderDrawer };
2347
+ }
2348
+
2273
2349
  // src/components/marketing/LandingNavbarShell.tsx
2274
- import { useEffect as useEffect3, useState as useState7 } from "react";
2275
- import { Fragment as Fragment3, jsx as jsx50, jsxs as jsxs35 } from "react/jsx-runtime";
2350
+ import { Fragment as Fragment3, jsx as jsx51, jsxs as jsxs35 } from "react/jsx-runtime";
2276
2351
  function LandingNavbarShell({
2277
2352
  ariaNavLabel,
2278
2353
  brand,
@@ -2291,53 +2366,35 @@ function LandingNavbarShell({
2291
2366
  theme,
2292
2367
  themeLabels
2293
2368
  }) {
2294
- const [open, setOpen] = useState7(false);
2295
- const [renderDrawer, setRenderDrawer] = useState7(false);
2296
- useEffect3(() => {
2297
- if (open) {
2298
- setRenderDrawer(true);
2299
- document.body.style.overflow = "hidden";
2300
- document.body.classList.add("tapiz-landing-navbar-open");
2301
- return () => {
2302
- document.body.style.overflow = "";
2303
- document.body.classList.remove("tapiz-landing-navbar-open");
2304
- };
2305
- }
2306
- const timeoutId = window.setTimeout(() => {
2307
- setRenderDrawer(false);
2308
- document.body.style.overflow = "";
2309
- document.body.classList.remove("tapiz-landing-navbar-open");
2310
- }, 220);
2311
- return () => window.clearTimeout(timeoutId);
2312
- }, [open]);
2369
+ const { open, setOpen, renderDrawer } = useDrawerState();
2313
2370
  const drawerLabel = mobileDialogLabel ?? menuLabel;
2314
2371
  const resolvedCloseMenuLabel = closeMenuLabel ?? menuLabel;
2315
2372
  const resolvedMobileNavLabel = mobileNavLabel ?? ariaNavLabel;
2316
2373
  const themeLabel = theme === "dark" ? themeLabels.light : themeLabels.dark;
2317
2374
  return /* @__PURE__ */ jsxs35(Fragment3, { children: [
2318
- /* @__PURE__ */ jsx50("header", { className: ["tapiz-landing-navbar", className].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxs35("div", { className: ["tapiz-landing-navbar__container", containerClassName].filter(Boolean).join(" "), children: [
2319
- /* @__PURE__ */ jsx50("div", { className: "tapiz-landing-navbar__brand", children: brand }),
2320
- /* @__PURE__ */ jsx50("nav", { className: "tapiz-landing-navbar__links", "aria-label": ariaNavLabel, children: items.map((item) => /* @__PURE__ */ jsxs35("a", { href: item.href, className: "tapiz-landing-navbar__link", children: [
2321
- item.icon ? /* @__PURE__ */ jsx50("span", { "aria-hidden": "true", className: "tapiz-landing-navbar__link-icon", children: item.icon }) : null,
2322
- /* @__PURE__ */ jsx50("span", { children: item.label })
2375
+ /* @__PURE__ */ jsx51("header", { className: ["tapiz-landing-navbar", className].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxs35("div", { className: ["tapiz-landing-navbar__container", containerClassName].filter(Boolean).join(" "), children: [
2376
+ /* @__PURE__ */ jsx51("div", { className: "tapiz-landing-navbar__brand", children: brand }),
2377
+ /* @__PURE__ */ jsx51("nav", { className: "tapiz-landing-navbar__links", "aria-label": ariaNavLabel, children: items.map((item) => /* @__PURE__ */ jsxs35("a", { href: item.href, className: "tapiz-landing-navbar__link", children: [
2378
+ item.icon ? /* @__PURE__ */ jsx51("span", { "aria-hidden": "true", className: "tapiz-landing-navbar__link-icon", children: item.icon }) : null,
2379
+ /* @__PURE__ */ jsx51("span", { children: item.label })
2323
2380
  ] }, item.href)) }),
2324
2381
  /* @__PURE__ */ jsxs35("div", { className: "tapiz-landing-navbar__actions", children: [
2325
- desktopLanguageSwitcher ? /* @__PURE__ */ jsx50("div", { className: "tapiz-landing-navbar__language tapiz-landing-navbar__language--desktop", children: desktopLanguageSwitcher }) : null,
2326
- /* @__PURE__ */ jsx50(
2382
+ desktopLanguageSwitcher ? /* @__PURE__ */ jsx51("div", { className: "tapiz-landing-navbar__language tapiz-landing-navbar__language--desktop", children: desktopLanguageSwitcher }) : null,
2383
+ /* @__PURE__ */ jsx51(
2327
2384
  "button",
2328
2385
  {
2329
2386
  type: "button",
2330
2387
  className: `tapiz-landing-navbar__theme is-${theme}`,
2331
2388
  "aria-label": themeLabel,
2332
2389
  onClick: onThemeToggle,
2333
- children: /* @__PURE__ */ jsx50("span", { className: "tapiz-landing-navbar__theme-track", "aria-hidden": "true", children: /* @__PURE__ */ jsxs35("span", { className: "tapiz-landing-navbar__theme-thumb", children: [
2334
- /* @__PURE__ */ jsx50(Sun, { size: 13, className: "tapiz-landing-navbar__theme-sun" }),
2335
- /* @__PURE__ */ jsx50(Moon, { size: 13, className: "tapiz-landing-navbar__theme-moon" })
2390
+ children: /* @__PURE__ */ jsx51("span", { className: "tapiz-landing-navbar__theme-track", "aria-hidden": "true", children: /* @__PURE__ */ jsxs35("span", { className: "tapiz-landing-navbar__theme-thumb", children: [
2391
+ /* @__PURE__ */ jsx51(Sun, { size: 13, className: "tapiz-landing-navbar__theme-sun" }),
2392
+ /* @__PURE__ */ jsx51(Moon, { size: 13, className: "tapiz-landing-navbar__theme-moon" })
2336
2393
  ] }) })
2337
2394
  }
2338
2395
  ),
2339
- desktopActions ? /* @__PURE__ */ jsx50("div", { className: "tapiz-landing-navbar__desktop-actions", children: desktopActions }) : null,
2340
- /* @__PURE__ */ jsx50(
2396
+ desktopActions ? /* @__PURE__ */ jsx51("div", { className: "tapiz-landing-navbar__desktop-actions", children: desktopActions }) : null,
2397
+ /* @__PURE__ */ jsx51(
2341
2398
  "button",
2342
2399
  {
2343
2400
  type: "button",
@@ -2345,12 +2402,12 @@ function LandingNavbarShell({
2345
2402
  "aria-label": menuLabel,
2346
2403
  "aria-expanded": open,
2347
2404
  onClick: () => setOpen((value) => !value),
2348
- children: open ? /* @__PURE__ */ jsx50(X, { size: 18 }) : /* @__PURE__ */ jsx50(Menu, { size: 18 })
2405
+ children: open ? /* @__PURE__ */ jsx51(X, { size: 18 }) : /* @__PURE__ */ jsx51(Menu, { size: 18 })
2349
2406
  }
2350
2407
  )
2351
2408
  ] })
2352
2409
  ] }) }),
2353
- renderDrawer ? /* @__PURE__ */ jsx50(
2410
+ renderDrawer ? /* @__PURE__ */ jsx51(
2354
2411
  "button",
2355
2412
  {
2356
2413
  type: "button",
@@ -2369,21 +2426,21 @@ function LandingNavbarShell({
2369
2426
  "aria-modal": "true",
2370
2427
  "aria-label": drawerLabel,
2371
2428
  children: [
2372
- /* @__PURE__ */ jsx50("nav", { className: "tapiz-landing-navbar__drawer-nav", "aria-label": resolvedMobileNavLabel, children: items.map((item) => /* @__PURE__ */ jsxs35(
2429
+ /* @__PURE__ */ jsx51("nav", { className: "tapiz-landing-navbar__drawer-nav", "aria-label": resolvedMobileNavLabel, children: items.map((item) => /* @__PURE__ */ jsxs35(
2373
2430
  "a",
2374
2431
  {
2375
2432
  href: item.href,
2376
2433
  className: "tapiz-landing-navbar__drawer-link",
2377
2434
  onClick: () => setOpen(false),
2378
2435
  children: [
2379
- item.icon ? /* @__PURE__ */ jsx50("span", { "aria-hidden": "true", className: "tapiz-landing-navbar__link-icon", children: item.icon }) : null,
2380
- /* @__PURE__ */ jsx50("span", { children: item.label })
2436
+ item.icon ? /* @__PURE__ */ jsx51("span", { "aria-hidden": "true", className: "tapiz-landing-navbar__link-icon", children: item.icon }) : null,
2437
+ /* @__PURE__ */ jsx51("span", { children: item.label })
2381
2438
  ]
2382
2439
  },
2383
2440
  item.href
2384
2441
  )) }),
2385
- mobileLanguageSwitcher ? /* @__PURE__ */ jsx50("div", { className: "tapiz-landing-navbar__language tapiz-landing-navbar__language--mobile", children: mobileLanguageSwitcher }) : null,
2386
- mobileActions ? /* @__PURE__ */ jsx50("div", { className: "tapiz-landing-navbar__drawer-actions", children: mobileActions }) : null
2442
+ mobileLanguageSwitcher ? /* @__PURE__ */ jsx51("div", { className: "tapiz-landing-navbar__language tapiz-landing-navbar__language--mobile", children: mobileLanguageSwitcher }) : null,
2443
+ mobileActions ? /* @__PURE__ */ jsx51("div", { className: "tapiz-landing-navbar__drawer-actions", children: mobileActions }) : null
2387
2444
  ]
2388
2445
  }
2389
2446
  ) : null
@@ -2391,9 +2448,9 @@ function LandingNavbarShell({
2391
2448
  }
2392
2449
 
2393
2450
  // src/components/marketing/MarketingShell.tsx
2394
- import { jsx as jsx51 } from "react/jsx-runtime";
2451
+ import { jsx as jsx52 } from "react/jsx-runtime";
2395
2452
  function MarketingShell({ children, className = "", grid = true, noise = true }) {
2396
- return /* @__PURE__ */ jsx51(
2453
+ return /* @__PURE__ */ jsx52(
2397
2454
  "main",
2398
2455
  {
2399
2456
  className: [
@@ -2408,24 +2465,24 @@ function MarketingShell({ children, className = "", grid = true, noise = true })
2408
2465
  }
2409
2466
 
2410
2467
  // src/components/marketing/MockupFrame.tsx
2411
- import { jsx as jsx52, jsxs as jsxs36 } from "react/jsx-runtime";
2468
+ import { jsx as jsx53, jsxs as jsxs36 } from "react/jsx-runtime";
2412
2469
  function MockupFrame({ children, title, toolbar, className = "" }) {
2413
2470
  return /* @__PURE__ */ jsxs36("div", { className: `overflow-hidden border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-brutal)] ${className}`, children: [
2414
2471
  /* @__PURE__ */ jsxs36("div", { className: "flex items-center justify-between border-b border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)] px-3 py-2", children: [
2415
2472
  /* @__PURE__ */ jsxs36("div", { className: "flex items-center gap-1.5", children: [
2416
- /* @__PURE__ */ jsx52("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-danger)]" }),
2417
- /* @__PURE__ */ jsx52("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-warning)]" }),
2418
- /* @__PURE__ */ jsx52("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-success)]" })
2473
+ /* @__PURE__ */ jsx53("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-danger)]" }),
2474
+ /* @__PURE__ */ jsx53("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-warning)]" }),
2475
+ /* @__PURE__ */ jsx53("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-success)]" })
2419
2476
  ] }),
2420
- title ? /* @__PURE__ */ jsx52("div", { className: "font-mono text-[10px] uppercase tracking-widest text-[var(--tapiz-text-muted)]", children: title }) : null,
2421
- /* @__PURE__ */ jsx52("div", { children: toolbar })
2477
+ title ? /* @__PURE__ */ jsx53("div", { className: "font-mono text-[10px] uppercase tracking-widest text-[var(--tapiz-text-muted)]", children: title }) : null,
2478
+ /* @__PURE__ */ jsx53("div", { children: toolbar })
2422
2479
  ] }),
2423
- /* @__PURE__ */ jsx52("div", { className: "p-4", children })
2480
+ /* @__PURE__ */ jsx53("div", { className: "p-4", children })
2424
2481
  ] });
2425
2482
  }
2426
2483
 
2427
2484
  // src/components/layout/AppShell.tsx
2428
- import { jsx as jsx53, jsxs as jsxs37 } from "react/jsx-runtime";
2485
+ import { jsx as jsx54, jsxs as jsxs37 } from "react/jsx-runtime";
2429
2486
  var variantClasses4 = {
2430
2487
  default: "bg-[var(--tapiz-bg-page)]",
2431
2488
  grid: "bg-[var(--tapiz-bg-page)] tapiz-grid-bg",
@@ -2435,15 +2492,15 @@ function AppShell({ sidebar, topbar, children, aside, className = "", contentCla
2435
2492
  return /* @__PURE__ */ jsxs37("div", { className: `min-h-screen text-[var(--tapiz-text-primary)] ${variantClasses4[variant]} ${className}`, children: [
2436
2493
  topbar,
2437
2494
  /* @__PURE__ */ jsxs37("div", { className: "mx-auto flex w-full max-w-[1600px]", children: [
2438
- sidebar ? /* @__PURE__ */ jsx53("aside", { className: "hidden min-h-[calc(100vh-1px)] w-72 shrink-0 border-r border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] lg:block", children: sidebar }) : null,
2439
- /* @__PURE__ */ jsx53("main", { className: `min-w-0 flex-1 px-[var(--tapiz-space-page-x)] py-6 ${contentClassName}`, children }),
2440
- aside ? /* @__PURE__ */ jsx53("aside", { className: "hidden w-80 shrink-0 border-l border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] xl:block", children: aside }) : null
2495
+ sidebar ? /* @__PURE__ */ jsx54("aside", { className: "hidden min-h-[calc(100vh-1px)] w-72 shrink-0 border-r border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] lg:block", children: sidebar }) : null,
2496
+ /* @__PURE__ */ jsx54("main", { className: `min-w-0 flex-1 px-[var(--tapiz-space-page-x)] py-6 ${contentClassName}`, children }),
2497
+ aside ? /* @__PURE__ */ jsx54("aside", { className: "hidden w-80 shrink-0 border-l border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] xl:block", children: aside }) : null
2441
2498
  ] })
2442
2499
  ] });
2443
2500
  }
2444
2501
 
2445
2502
  // src/components/layout/SplitPane.tsx
2446
- import { jsx as jsx54, jsxs as jsxs38 } from "react/jsx-runtime";
2503
+ import { jsx as jsx55, jsxs as jsxs38 } from "react/jsx-runtime";
2447
2504
  var ratios = {
2448
2505
  "50/50": "lg:grid-cols-2",
2449
2506
  "60/40": "lg:grid-cols-[minmax(0,3fr)_minmax(320px,2fr)]",
@@ -2451,79 +2508,79 @@ var ratios = {
2451
2508
  };
2452
2509
  function SplitPane({ primary, secondary, ratio = "60/40", reverseOnMobile = false, className = "" }) {
2453
2510
  return /* @__PURE__ */ jsxs38("div", { className: `grid gap-5 ${ratios[ratio]} ${className}`, children: [
2454
- /* @__PURE__ */ jsx54("div", { className: reverseOnMobile ? "order-2 lg:order-1" : "", children: primary }),
2455
- /* @__PURE__ */ jsx54("div", { className: reverseOnMobile ? "order-1 lg:order-2" : "", children: secondary })
2511
+ /* @__PURE__ */ jsx55("div", { className: reverseOnMobile ? "order-2 lg:order-1" : "", children: primary }),
2512
+ /* @__PURE__ */ jsx55("div", { className: reverseOnMobile ? "order-1 lg:order-2" : "", children: secondary })
2456
2513
  ] });
2457
2514
  }
2458
2515
 
2459
2516
  // src/components/layout/Stack.tsx
2460
- import { jsx as jsx55 } from "react/jsx-runtime";
2517
+ import { jsx as jsx56 } from "react/jsx-runtime";
2461
2518
  var gapClasses = { xs: "gap-1", sm: "gap-2", md: "gap-4", lg: "gap-6", xl: "gap-8" };
2462
2519
  var alignClasses = { start: "items-start", center: "items-center", end: "items-end", stretch: "items-stretch" };
2463
2520
  var justifyClasses = { start: "justify-start", center: "justify-center", between: "justify-between", end: "justify-end" };
2464
2521
  function Stack({ children, gap = "md", direction = "vertical", align = "stretch", justify = "start", wrap = false, className = "" }) {
2465
- return /* @__PURE__ */ jsx55("div", { className: `flex ${direction === "vertical" ? "flex-col" : "flex-row"} ${gapClasses[gap]} ${alignClasses[align]} ${justifyClasses[justify]} ${wrap ? "flex-wrap" : ""} ${className}`, children });
2522
+ return /* @__PURE__ */ jsx56("div", { className: `flex ${direction === "vertical" ? "flex-col" : "flex-row"} ${gapClasses[gap]} ${alignClasses[align]} ${justifyClasses[justify]} ${wrap ? "flex-wrap" : ""} ${className}`, children });
2466
2523
  }
2467
2524
 
2468
2525
  // src/components/layout/Cluster.tsx
2469
- import { jsx as jsx56 } from "react/jsx-runtime";
2526
+ import { jsx as jsx57 } from "react/jsx-runtime";
2470
2527
  var gapClasses2 = { xs: "gap-1", sm: "gap-2", md: "gap-3", lg: "gap-5" };
2471
2528
  var alignClasses2 = { start: "items-start", center: "items-center", end: "items-end" };
2472
2529
  var justifyClasses2 = { start: "justify-start", center: "justify-center", between: "justify-between", end: "justify-end" };
2473
2530
  function Cluster({ children, gap = "sm", align = "center", justify = "start", className = "" }) {
2474
- return /* @__PURE__ */ jsx56("div", { className: `flex flex-wrap ${gapClasses2[gap]} ${alignClasses2[align]} ${justifyClasses2[justify]} ${className}`, children });
2531
+ return /* @__PURE__ */ jsx57("div", { className: `flex flex-wrap ${gapClasses2[gap]} ${alignClasses2[align]} ${justifyClasses2[justify]} ${className}`, children });
2475
2532
  }
2476
2533
 
2477
2534
  // src/components/navigation/Breadcrumbs.tsx
2478
- import { jsx as jsx57, jsxs as jsxs39 } from "react/jsx-runtime";
2535
+ import { jsx as jsx58, jsxs as jsxs39 } from "react/jsx-runtime";
2479
2536
  function Breadcrumbs({ items, separator = "/", className = "" }) {
2480
- return /* @__PURE__ */ jsx57("nav", { "aria-label": "Breadcrumb", className: `font-mono text-[10px] uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)] ${className}`, children: /* @__PURE__ */ jsx57("ol", { className: "flex flex-wrap items-center gap-2", children: items.map((item, index) => /* @__PURE__ */ jsxs39("li", { className: "flex items-center gap-2", children: [
2481
- index > 0 ? /* @__PURE__ */ jsx57("span", { "aria-hidden": "true", className: "text-[var(--tapiz-text-disabled)]", children: separator }) : null,
2482
- item.href && !item.current ? /* @__PURE__ */ jsx57("a", { className: "hover:text-[var(--tapiz-accent)]", href: item.href, children: item.label }) : /* @__PURE__ */ jsx57("span", { "aria-current": item.current ? "page" : void 0, className: item.current ? "text-[var(--tapiz-text-primary)]" : "", children: item.label })
2537
+ return /* @__PURE__ */ jsx58("nav", { "aria-label": "Breadcrumb", className: `font-mono text-[10px] uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)] ${className}`, children: /* @__PURE__ */ jsx58("ol", { className: "flex flex-wrap items-center gap-2", children: items.map((item, index) => /* @__PURE__ */ jsxs39("li", { className: "flex items-center gap-2", children: [
2538
+ index > 0 ? /* @__PURE__ */ jsx58("span", { "aria-hidden": "true", className: "text-[var(--tapiz-text-disabled)]", children: separator }) : null,
2539
+ item.href && !item.current ? /* @__PURE__ */ jsx58("a", { className: "hover:text-[var(--tapiz-accent)]", href: item.href, children: item.label }) : /* @__PURE__ */ jsx58("span", { "aria-current": item.current ? "page" : void 0, className: item.current ? "text-[var(--tapiz-text-primary)]" : "", children: item.label })
2483
2540
  ] }, index)) }) });
2484
2541
  }
2485
2542
 
2486
2543
  // src/components/navigation/SidebarNav.tsx
2487
- import { Fragment as Fragment4, jsx as jsx58, jsxs as jsxs40 } from "react/jsx-runtime";
2544
+ import { Fragment as Fragment4, jsx as jsx59, jsxs as jsxs40 } from "react/jsx-runtime";
2488
2545
  function SidebarNav({ groups, header, footer, className = "" }) {
2489
- return /* @__PURE__ */ jsxs40("div", { className: `flex h-full min-h-screen flex-col bg-[var(--tapiz-bg-surface)] ${className}`, children: [
2490
- header ? /* @__PURE__ */ jsx58("div", { className: "border-b border-[var(--tapiz-border-subtle)] p-4", children: header }) : null,
2491
- /* @__PURE__ */ jsx58("nav", { className: "flex-1 space-y-6 p-3", children: groups.map((group, groupIndex) => /* @__PURE__ */ jsxs40("div", { children: [
2492
- group.label ? /* @__PURE__ */ jsx58("div", { className: "mb-2 px-2 font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: group.label }) : null,
2493
- /* @__PURE__ */ jsx58("div", { className: "space-y-1", children: group.items.map((item, itemIndex) => /* @__PURE__ */ jsx58(SidebarNavLink, { item }, itemIndex)) })
2546
+ return /* @__PURE__ */ jsxs40("div", { className: `flex h-full min-h-screen flex-col bg-(--tapiz-bg-surface) ${className}`, children: [
2547
+ header ? /* @__PURE__ */ jsx59("div", { className: "border-b border-(--tapiz-border-subtle) p-4", children: header }) : null,
2548
+ /* @__PURE__ */ jsx59("nav", { className: "flex-1 space-y-6 p-3", children: groups.map((group, groupIndex) => /* @__PURE__ */ jsxs40("div", { children: [
2549
+ group.label ? /* @__PURE__ */ jsx59("div", { className: "mb-2 px-2 font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-(--tapiz-text-muted)", children: group.label }) : null,
2550
+ /* @__PURE__ */ jsx59("div", { className: "space-y-1", children: group.items.map((item, itemIndex) => /* @__PURE__ */ jsx59(SidebarNavLink, { item }, itemIndex)) })
2494
2551
  ] }, groupIndex)) }),
2495
- footer ? /* @__PURE__ */ jsx58("div", { className: "border-t border-[var(--tapiz-border-subtle)] p-4", children: footer }) : null
2552
+ footer ? /* @__PURE__ */ jsx59("div", { className: "border-t border-(--tapiz-border-subtle) p-4", children: footer }) : null
2496
2553
  ] });
2497
2554
  }
2498
2555
  function SidebarNavLink({ item }) {
2499
2556
  const className = [
2500
2557
  "flex w-full items-center gap-3 border px-3 py-2 text-left text-sm font-medium",
2501
- item.active ? "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-text-primary)] shadow-[inset_3px_0_0_var(--tapiz-accent)]" : "border-transparent text-[var(--tapiz-text-secondary)] hover:border-[var(--tapiz-border-subtle)] hover:bg-[var(--tapiz-bg-surface-muted)] hover:text-[var(--tapiz-text-primary)]",
2558
+ item.active ? "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-text-primary)] shadow-[inset_3px_0_0_var(--tapiz-accent)]" : "border-transparent text-[var(--tapiz-text-secondary)] hover:border-(--tapiz-border-subtle) hover:bg-[var(--tapiz-bg-surface-muted)] hover:text-[var(--tapiz-text-primary)]",
2502
2559
  item.disabled ? "pointer-events-none opacity-40" : ""
2503
2560
  ].filter(Boolean).join(" ");
2504
2561
  const content = /* @__PURE__ */ jsxs40(Fragment4, { children: [
2505
- item.icon ? /* @__PURE__ */ jsx58("span", { className: "grid size-5 place-items-center text-[var(--tapiz-text-muted)]", children: item.icon }) : null,
2506
- /* @__PURE__ */ jsx58("span", { className: "min-w-0 flex-1 truncate", children: item.label }),
2507
- item.badge ? /* @__PURE__ */ jsx58("span", { children: item.badge }) : null
2562
+ item.icon ? /* @__PURE__ */ jsx59("span", { className: "grid size-5 place-items-center text-(--tapiz-text-muted)", children: item.icon }) : null,
2563
+ /* @__PURE__ */ jsx59("span", { className: "min-w-0 flex-1 truncate", children: item.label }),
2564
+ item.badge ? /* @__PURE__ */ jsx59("span", { children: item.badge }) : null
2508
2565
  ] });
2509
- return item.href ? /* @__PURE__ */ jsx58("a", { className, href: item.href, children: content }) : /* @__PURE__ */ jsx58("button", { type: "button", className, onClick: item.onClick, disabled: item.disabled, children: content });
2566
+ return item.href ? /* @__PURE__ */ jsx59("a", { className, href: item.href, children: content }) : /* @__PURE__ */ jsx59("button", { type: "button", className, onClick: item.onClick, disabled: item.disabled, children: content });
2510
2567
  }
2511
2568
 
2512
2569
  // src/components/navigation/TopNav.tsx
2513
- import { jsx as jsx59, jsxs as jsxs41 } from "react/jsx-runtime";
2570
+ import { jsx as jsx60, jsxs as jsxs41 } from "react/jsx-runtime";
2514
2571
  function TopNav({ brand, links = [], actions, className = "", sticky = true }) {
2515
- return /* @__PURE__ */ jsx59("header", { className: `${sticky ? "sticky top-0 z-40" : ""} border-b border-[var(--tapiz-border-subtle)] bg-[color-mix(in_srgb,var(--tapiz-bg-surface)_88%,transparent)] backdrop-blur-xl ${className}`, children: /* @__PURE__ */ jsxs41("div", { className: "mx-auto flex h-16 max-w-[1600px] items-center gap-6 px-[var(--tapiz-space-page-x)]", children: [
2516
- brand ? /* @__PURE__ */ jsx59("div", { className: "shrink-0", children: brand }) : null,
2517
- /* @__PURE__ */ jsx59("nav", { className: "hidden items-center gap-1 md:flex", children: links.map((link, index) => {
2572
+ return /* @__PURE__ */ jsx60("header", { className: `${sticky ? "sticky top-0 z-40" : ""} border-b border-[var(--tapiz-border-subtle)] bg-[color-mix(in_srgb,var(--tapiz-bg-surface)_88%,transparent)] backdrop-blur-xl ${className}`, children: /* @__PURE__ */ jsxs41("div", { className: "mx-auto flex h-16 max-w-[1600px] items-center gap-6 px-[var(--tapiz-space-page-x)]", children: [
2573
+ brand ? /* @__PURE__ */ jsx60("div", { className: "shrink-0", children: brand }) : null,
2574
+ /* @__PURE__ */ jsx60("nav", { className: "hidden items-center gap-1 md:flex", children: links.map((link, index) => {
2518
2575
  const cls = `border px-3 py-1.5 text-sm font-medium ${link.active ? "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)] text-[var(--tapiz-text-primary)]" : "border-transparent text-[var(--tapiz-text-secondary)] hover:border-[var(--tapiz-border-subtle)] hover:text-[var(--tapiz-text-primary)]"}`;
2519
- return link.href ? /* @__PURE__ */ jsx59("a", { href: link.href, className: cls, children: link.label }, index) : /* @__PURE__ */ jsx59("button", { type: "button", onClick: link.onClick, className: cls, children: link.label }, index);
2576
+ return link.href ? /* @__PURE__ */ jsx60("a", { href: link.href, className: cls, children: link.label }, index) : /* @__PURE__ */ jsx60("button", { type: "button", onClick: link.onClick, className: cls, children: link.label }, index);
2520
2577
  }) }),
2521
- actions ? /* @__PURE__ */ jsx59("div", { className: "ml-auto flex items-center gap-2", children: actions }) : null
2578
+ actions ? /* @__PURE__ */ jsx60("div", { className: "ml-auto flex items-center gap-2", children: actions }) : null
2522
2579
  ] }) });
2523
2580
  }
2524
2581
 
2525
2582
  // src/components/disclosure/Tabs.tsx
2526
- import { jsx as jsx60, jsxs as jsxs42 } from "react/jsx-runtime";
2583
+ import { jsx as jsx61, jsxs as jsxs42 } from "react/jsx-runtime";
2527
2584
  var variants = {
2528
2585
  line: "border-b border-[var(--tapiz-border-subtle)]",
2529
2586
  boxed: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-1",
@@ -2532,7 +2589,7 @@ var variants = {
2532
2589
  function Tabs({ items, activeId, onChange, className = "", variant = "line" }) {
2533
2590
  const active = items.find((item) => item.id === activeId) ?? items[0];
2534
2591
  return /* @__PURE__ */ jsxs42("div", { className, children: [
2535
- /* @__PURE__ */ jsx60("div", { role: "tablist", className: `flex flex-wrap gap-1 ${variants[variant]}`, children: items.map((item) => {
2592
+ /* @__PURE__ */ jsx61("div", { role: "tablist", className: `flex flex-wrap gap-1 ${variants[variant]}`, children: items.map((item) => {
2536
2593
  const selected = item.id === active?.id;
2537
2594
  return /* @__PURE__ */ jsxs42(
2538
2595
  "button",
@@ -2551,17 +2608,88 @@ function Tabs({ items, activeId, onChange, className = "", variant = "line" }) {
2551
2608
  item.id
2552
2609
  );
2553
2610
  }) }),
2554
- /* @__PURE__ */ jsx60("div", { role: "tabpanel", className: "pt-4", children: active?.content })
2611
+ /* @__PURE__ */ jsx61("div", { role: "tabpanel", className: "pt-4", children: active?.content })
2555
2612
  ] });
2556
2613
  }
2557
2614
 
2615
+ // src/components/disclosure/SegmentedTabs.tsx
2616
+ import { useLayoutEffect as useLayoutEffect2, useRef as useRef3, useState as useState9 } from "react";
2617
+ import { jsx as jsx62, jsxs as jsxs43 } from "react/jsx-runtime";
2618
+ function SegmentedTabs({
2619
+ items,
2620
+ activeId,
2621
+ onChange,
2622
+ className = "",
2623
+ buttonClassName = ""
2624
+ }) {
2625
+ const refs = useRef3([]);
2626
+ const [indicator, setIndicator] = useState9({ left: 0, width: 0 });
2627
+ useLayoutEffect2(() => {
2628
+ const activeIndex = items.findIndex((item) => item.id === activeId);
2629
+ const activeNode = refs.current[activeIndex];
2630
+ if (!activeNode) return;
2631
+ setIndicator({
2632
+ left: activeNode.offsetLeft,
2633
+ width: activeNode.offsetWidth
2634
+ });
2635
+ }, [activeId, items]);
2636
+ return /* @__PURE__ */ jsxs43(
2637
+ "div",
2638
+ {
2639
+ className: `relative inline-flex w-fit max-w-full flex-wrap items-center gap-1 rounded-[11px] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] px-1.5 py-1 ${className}`,
2640
+ children: [
2641
+ /* @__PURE__ */ jsx62(
2642
+ "span",
2643
+ {
2644
+ "aria-hidden": "true",
2645
+ className: "pointer-events-none absolute bottom-1 top-1 rounded-[8px] border border-[color:color-mix(in_srgb,var(--tapiz-accent)_50%,transparent)] bg-[color:color-mix(in_srgb,var(--tapiz-accent)_12%,transparent)] shadow-[0_0_0_1px_color-mix(in_srgb,var(--tapiz-accent)_8%,transparent)] transition-[left,width] duration-300 ease-out",
2646
+ style: { left: indicator.left, width: indicator.width }
2647
+ }
2648
+ ),
2649
+ items.map((item, index) => {
2650
+ const active = item.id === activeId;
2651
+ return /* @__PURE__ */ jsxs43(
2652
+ "button",
2653
+ {
2654
+ ref: (node) => {
2655
+ refs.current[index] = node;
2656
+ },
2657
+ type: "button",
2658
+ onClick: () => onChange(item.id),
2659
+ className: `group relative z-10 inline-flex items-center gap-2 rounded-[8px] border px-4 py-1 text-sm font-medium transition-[color,border-color,background-color,box-shadow] duration-200 ease-out ${active ? "border-transparent bg-transparent text-[var(--tapiz-accent)]" : "border-transparent text-[var(--tapiz-text-muted)] hover:border-[var(--tapiz-border-subtle)] hover:bg-[var(--tapiz-bg-surface)] hover:text-[var(--tapiz-text-primary)]"} ${buttonClassName}`,
2660
+ children: [
2661
+ item.icon ? /* @__PURE__ */ jsx62(
2662
+ "span",
2663
+ {
2664
+ className: active ? "text-[var(--tapiz-accent)]" : "text-[var(--tapiz-text-subtle)] transition-colors duration-200 group-hover:text-[var(--tapiz-text-primary)]",
2665
+ children: item.icon
2666
+ }
2667
+ ) : null,
2668
+ /* @__PURE__ */ jsx62("span", { className: "flex items-center gap-2.5", children: item.label }),
2669
+ item.badge ? /* @__PURE__ */ jsx62(
2670
+ "span",
2671
+ {
2672
+ className: `inline-flex min-w-7 items-center justify-center rounded-[6px] border px-1.5 py-[2px] text-xs font-semibold tabular-nums ${active ? "border-[color:color-mix(in_srgb,var(--tapiz-accent)_30%,transparent)] bg-[color:color-mix(in_srgb,var(--tapiz-accent)_14%,transparent)] text-[var(--tapiz-accent)]" : "border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-muted)]"}`,
2673
+ children: item.badge
2674
+ }
2675
+ ) : null
2676
+ ]
2677
+ },
2678
+ item.id
2679
+ );
2680
+ })
2681
+ ]
2682
+ }
2683
+ );
2684
+ }
2685
+
2558
2686
  // src/components/disclosure/Accordion.tsx
2559
- import { jsx as jsx61, jsxs as jsxs43 } from "react/jsx-runtime";
2687
+ import { jsx as jsx63, jsxs as jsxs44 } from "react/jsx-runtime";
2560
2688
  function Accordion({ items, openIds = [], onToggle, className = "" }) {
2561
- return /* @__PURE__ */ jsx61("div", { className: `divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: items.map((item) => {
2689
+ return /* @__PURE__ */ jsx63("div", { className: `divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: items.map((item) => {
2562
2690
  const open = openIds.includes(item.id);
2563
- return /* @__PURE__ */ jsxs43("section", { children: [
2564
- /* @__PURE__ */ jsxs43(
2691
+ return /* @__PURE__ */ jsxs44("section", { children: [
2692
+ /* @__PURE__ */ jsxs44(
2565
2693
  "button",
2566
2694
  {
2567
2695
  type: "button",
@@ -2570,21 +2698,21 @@ function Accordion({ items, openIds = [], onToggle, className = "" }) {
2570
2698
  onClick: () => onToggle?.(item.id),
2571
2699
  className: "flex w-full items-center justify-between gap-4 px-4 py-3 text-left disabled:opacity-40",
2572
2700
  children: [
2573
- /* @__PURE__ */ jsx61("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
2574
- /* @__PURE__ */ jsxs43("span", { className: "flex items-center gap-3 text-[var(--tapiz-text-muted)]", children: [
2701
+ /* @__PURE__ */ jsx63("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
2702
+ /* @__PURE__ */ jsxs44("span", { className: "flex items-center gap-3 text-[var(--tapiz-text-muted)]", children: [
2575
2703
  item.meta,
2576
- /* @__PURE__ */ jsx61("span", { "aria-hidden": "true", className: "font-mono text-lg", children: open ? "\u2212" : "+" })
2704
+ /* @__PURE__ */ jsx63("span", { "aria-hidden": "true", className: "font-mono text-lg", children: open ? "\u2212" : "+" })
2577
2705
  ] })
2578
2706
  ]
2579
2707
  }
2580
2708
  ),
2581
- open ? /* @__PURE__ */ jsx61("div", { className: "border-t border-[var(--tapiz-border-subtle)] px-4 py-4 text-sm text-[var(--tapiz-text-secondary)]", children: item.content }) : null
2709
+ open ? /* @__PURE__ */ jsx63("div", { className: "border-t border-[var(--tapiz-border-subtle)] px-4 py-4 text-sm text-[var(--tapiz-text-secondary)]", children: item.content }) : null
2582
2710
  ] }, item.id);
2583
2711
  }) });
2584
2712
  }
2585
2713
 
2586
2714
  // src/components/disclosure/Stepper.tsx
2587
- import { jsx as jsx62, jsxs as jsxs44 } from "react/jsx-runtime";
2715
+ import { jsx as jsx64, jsxs as jsxs45 } from "react/jsx-runtime";
2588
2716
  var tone = {
2589
2717
  complete: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
2590
2718
  current: "border-[var(--tapiz-accent)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-accent)]",
@@ -2592,65 +2720,65 @@ var tone = {
2592
2720
  error: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]"
2593
2721
  };
2594
2722
  function Stepper({ steps, orientation = "horizontal", className = "" }) {
2595
- return /* @__PURE__ */ jsx62("ol", { className: `grid gap-3 ${orientation === "horizontal" ? "md:grid-cols-[repeat(auto-fit,minmax(0,1fr))]" : ""} ${className}`, children: steps.map((step, index) => {
2723
+ return /* @__PURE__ */ jsx64("ol", { className: `grid gap-3 ${orientation === "horizontal" ? "md:grid-cols-[repeat(auto-fit,minmax(0,1fr))]" : ""} ${className}`, children: steps.map((step, index) => {
2596
2724
  const status = step.status ?? "upcoming";
2597
- return /* @__PURE__ */ jsxs44("li", { className: "flex gap-3", children: [
2598
- /* @__PURE__ */ jsx62("span", { className: `grid size-8 shrink-0 place-items-center border font-mono text-xs font-bold ${tone[status]}`, children: status === "complete" ? "\u2713" : index + 1 }),
2599
- /* @__PURE__ */ jsxs44("span", { className: "min-w-0", children: [
2600
- /* @__PURE__ */ jsx62("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: step.label }),
2601
- step.description ? /* @__PURE__ */ jsx62("span", { className: "mt-1 block text-xs text-[var(--tapiz-text-muted)]", children: step.description }) : null
2725
+ return /* @__PURE__ */ jsxs45("li", { className: "flex gap-3", children: [
2726
+ /* @__PURE__ */ jsx64("span", { className: `grid size-8 shrink-0 place-items-center border font-mono text-xs font-bold ${tone[status]}`, children: status === "complete" ? "\u2713" : index + 1 }),
2727
+ /* @__PURE__ */ jsxs45("span", { className: "min-w-0", children: [
2728
+ /* @__PURE__ */ jsx64("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: step.label }),
2729
+ step.description ? /* @__PURE__ */ jsx64("span", { className: "mt-1 block text-xs text-[var(--tapiz-text-muted)]", children: step.description }) : null
2602
2730
  ] })
2603
2731
  ] }, step.id);
2604
2732
  }) });
2605
2733
  }
2606
2734
 
2607
2735
  // src/components/overlays/Drawer.tsx
2608
- import { jsx as jsx63, jsxs as jsxs45 } from "react/jsx-runtime";
2736
+ import { jsx as jsx65, jsxs as jsxs46 } from "react/jsx-runtime";
2609
2737
  function Drawer({ open, onClose, title, description, children, footer, side = "right", className = "" }) {
2610
2738
  if (!open) return null;
2611
- return /* @__PURE__ */ jsxs45("div", { className: "fixed inset-0 z-50", children: [
2612
- /* @__PURE__ */ jsx63("button", { type: "button", "aria-label": "Close drawer", className: "absolute inset-0 bg-(--tapiz-bg-overlay)", onClick: onClose }),
2613
- /* @__PURE__ */ jsxs45("section", { className: `absolute top-0 h-full w-full max-w-md border-(--tapiz-border-strong) bg-(--tapiz-bg-surface) shadow-(--tapiz-shadow-lg) ${side === "right" ? "right-0 border-l" : "left-0 border-r"} ${className}`, children: [
2614
- /* @__PURE__ */ jsxs45("header", { className: "flex items-start justify-between gap-4 border-b border-(--tapiz-border-subtle) p-5", children: [
2615
- /* @__PURE__ */ jsxs45("div", { children: [
2616
- title ? /* @__PURE__ */ jsx63("h2", { className: "text-lg font-semibold text-(--tapiz-text-primary)", children: title }) : null,
2617
- description ? /* @__PURE__ */ jsx63("p", { className: "mt-1 text-sm text-(--tapiz-text-muted)", children: description }) : null
2739
+ return /* @__PURE__ */ jsxs46("div", { className: "fixed inset-0 z-50", children: [
2740
+ /* @__PURE__ */ jsx65("button", { type: "button", "aria-label": "Close drawer", className: "absolute inset-0 bg-(--tapiz-bg-overlay)", onClick: onClose }),
2741
+ /* @__PURE__ */ jsxs46("section", { className: `absolute top-0 h-full w-full max-w-md border-(--tapiz-border-strong) bg-(--tapiz-bg-surface) shadow-(--tapiz-shadow-lg) ${side === "right" ? "right-0 border-l" : "left-0 border-r"} ${className}`, children: [
2742
+ /* @__PURE__ */ jsxs46("header", { className: "flex items-start justify-between gap-4 border-b border-(--tapiz-border-subtle) p-5", children: [
2743
+ /* @__PURE__ */ jsxs46("div", { children: [
2744
+ title ? /* @__PURE__ */ jsx65("h2", { className: "text-lg font-semibold text-(--tapiz-text-primary)", children: title }) : null,
2745
+ description ? /* @__PURE__ */ jsx65("p", { className: "mt-1 text-sm text-(--tapiz-text-muted)", children: description }) : null
2618
2746
  ] }),
2619
- /* @__PURE__ */ jsx63("button", { type: "button", onClick: onClose, className: "border border-(--tapiz-border-subtle) px-2 py-1 font-mono text-sm text-(--tapiz-text-muted) hover:text-(--tapiz-text-primary)", children: "\xD7" })
2747
+ /* @__PURE__ */ jsx65("button", { type: "button", onClick: onClose, className: "border border-(--tapiz-border-subtle) px-2 py-1 font-mono text-sm text-(--tapiz-text-muted) hover:text-(--tapiz-text-primary)", children: "\xD7" })
2620
2748
  ] }),
2621
- /* @__PURE__ */ jsx63("div", { className: "max-h-[calc(100vh-9rem)] overflow-auto p-5", children }),
2622
- footer ? /* @__PURE__ */ jsx63("footer", { className: "border-t border-(--tapiz-border-subtle) p-4", children: footer }) : null
2749
+ /* @__PURE__ */ jsx65("div", { className: "max-h-[calc(100vh-9rem)] overflow-auto p-5", children }),
2750
+ footer ? /* @__PURE__ */ jsx65("footer", { className: "border-t border-(--tapiz-border-subtle) p-4", children: footer }) : null
2623
2751
  ] })
2624
2752
  ] });
2625
2753
  }
2626
2754
 
2627
2755
  // src/components/overlays/Popover.tsx
2628
- import { jsx as jsx64, jsxs as jsxs46 } from "react/jsx-runtime";
2756
+ import { jsx as jsx66, jsxs as jsxs47 } from "react/jsx-runtime";
2629
2757
  function Popover({ trigger, children, open = false, align = "start", className = "" }) {
2630
- return /* @__PURE__ */ jsxs46("div", { className: `relative inline-block ${className}`, children: [
2758
+ return /* @__PURE__ */ jsxs47("div", { className: `relative inline-block ${className}`, children: [
2631
2759
  trigger,
2632
- open ? /* @__PURE__ */ jsx64("div", { className: `absolute top-full z-40 mt-2 min-w-64 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] p-2 shadow-[var(--tapiz-shadow-md)] ${align === "end" ? "right-0" : "left-0"}`, children }) : null
2760
+ open ? /* @__PURE__ */ jsx66("div", { className: `absolute top-full z-40 mt-2 min-w-64 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] p-2 shadow-[var(--tapiz-shadow-md)] ${align === "end" ? "right-0" : "left-0"}`, children }) : null
2633
2761
  ] });
2634
2762
  }
2635
2763
 
2636
2764
  // src/components/overlays/CommandMenu.tsx
2637
- import { jsx as jsx65, jsxs as jsxs47 } from "react/jsx-runtime";
2765
+ import { jsx as jsx67, jsxs as jsxs48 } from "react/jsx-runtime";
2638
2766
  function CommandMenu({ open, onClose, query = "", onQueryChange, groups, placeholder = "Search commands\u2026", empty = "No commands found." }) {
2639
2767
  if (!open) return null;
2640
2768
  const hasItems = groups.some((group) => group.items.length > 0);
2641
- return /* @__PURE__ */ jsx65("div", { className: "fixed inset-0 z-50 grid place-items-start bg-[var(--tapiz-bg-overlay)] px-4 pt-[12vh]", onClick: onClose, children: /* @__PURE__ */ jsxs47("div", { className: "mx-auto w-full max-w-2xl border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-brutal-lg)]", onClick: (e) => e.stopPropagation(), children: [
2642
- /* @__PURE__ */ jsx65("div", { className: "border-b border-[var(--tapiz-border-subtle)] p-3", children: /* @__PURE__ */ jsx65(SearchInput, { value: query, onChange: (value) => onQueryChange?.(value), placeholder, autoFocus: true }) }),
2643
- /* @__PURE__ */ jsxs47("div", { className: "max-h-[50vh] overflow-auto p-2", children: [
2644
- !hasItems ? /* @__PURE__ */ jsx65("div", { className: "p-6 text-center text-sm text-[var(--tapiz-text-muted)]", children: empty }) : null,
2645
- groups.map((group, groupIndex) => /* @__PURE__ */ jsxs47("div", { className: "py-2", children: [
2646
- group.label ? /* @__PURE__ */ jsx65("div", { className: "px-2 pb-2 font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: group.label }) : null,
2647
- group.items.map((item) => /* @__PURE__ */ jsxs47("button", { type: "button", disabled: item.disabled, onClick: item.onSelect, className: "flex w-full items-center gap-3 border border-transparent px-3 py-2 text-left hover:border-[var(--tapiz-border-subtle)] hover:bg-[var(--tapiz-bg-surface-muted)] disabled:opacity-40", children: [
2648
- item.icon ? /* @__PURE__ */ jsx65("span", { className: "grid size-8 place-items-center border border-[var(--tapiz-border-subtle)] text-[var(--tapiz-text-muted)]", children: item.icon }) : null,
2649
- /* @__PURE__ */ jsxs47("span", { className: "min-w-0 flex-1", children: [
2650
- /* @__PURE__ */ jsx65("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.label }),
2651
- item.description ? /* @__PURE__ */ jsx65("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: item.description }) : null
2769
+ return /* @__PURE__ */ jsx67("div", { className: "fixed inset-0 z-50 grid place-items-start bg-[var(--tapiz-bg-overlay)] px-4 pt-[12vh]", onClick: onClose, children: /* @__PURE__ */ jsxs48("div", { className: "mx-auto w-full max-w-2xl border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-brutal-lg)]", onClick: (e) => e.stopPropagation(), children: [
2770
+ /* @__PURE__ */ jsx67("div", { className: "border-b border-[var(--tapiz-border-subtle)] p-3", children: /* @__PURE__ */ jsx67(SearchInput, { value: query, onChange: (value) => onQueryChange?.(value), placeholder, autoFocus: true }) }),
2771
+ /* @__PURE__ */ jsxs48("div", { className: "max-h-[50vh] overflow-auto p-2", children: [
2772
+ !hasItems ? /* @__PURE__ */ jsx67("div", { className: "p-6 text-center text-sm text-[var(--tapiz-text-muted)]", children: empty }) : null,
2773
+ groups.map((group, groupIndex) => /* @__PURE__ */ jsxs48("div", { className: "py-2", children: [
2774
+ group.label ? /* @__PURE__ */ jsx67("div", { className: "px-2 pb-2 font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: group.label }) : null,
2775
+ group.items.map((item) => /* @__PURE__ */ jsxs48("button", { type: "button", disabled: item.disabled, onClick: item.onSelect, className: "flex w-full items-center gap-3 border border-transparent px-3 py-2 text-left hover:border-[var(--tapiz-border-subtle)] hover:bg-[var(--tapiz-bg-surface-muted)] disabled:opacity-40", children: [
2776
+ item.icon ? /* @__PURE__ */ jsx67("span", { className: "grid size-8 place-items-center border border-[var(--tapiz-border-subtle)] text-[var(--tapiz-text-muted)]", children: item.icon }) : null,
2777
+ /* @__PURE__ */ jsxs48("span", { className: "min-w-0 flex-1", children: [
2778
+ /* @__PURE__ */ jsx67("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.label }),
2779
+ item.description ? /* @__PURE__ */ jsx67("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: item.description }) : null
2652
2780
  ] }),
2653
- item.shortcut ? /* @__PURE__ */ jsx65("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.shortcut }) : null
2781
+ item.shortcut ? /* @__PURE__ */ jsx67("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.shortcut }) : null
2654
2782
  ] }, item.id))
2655
2783
  ] }, groupIndex))
2656
2784
  ] })
@@ -2658,23 +2786,23 @@ function CommandMenu({ open, onClose, query = "", onQueryChange, groups, placeho
2658
2786
  }
2659
2787
 
2660
2788
  // src/components/forms/FormField.tsx
2661
- import { jsx as jsx66, jsxs as jsxs48 } from "react/jsx-runtime";
2789
+ import { jsx as jsx68, jsxs as jsxs49 } from "react/jsx-runtime";
2662
2790
  function FormField({ label, hint, error, required, htmlFor, children, className = "" }) {
2663
- return /* @__PURE__ */ jsxs48("div", { className: `space-y-1.5 ${className}`, children: [
2664
- label ? /* @__PURE__ */ jsxs48(FieldLabel, { htmlFor, children: [
2791
+ return /* @__PURE__ */ jsxs49("div", { className: `space-y-1.5 ${className}`, children: [
2792
+ label ? /* @__PURE__ */ jsxs49(FieldLabel, { htmlFor, children: [
2665
2793
  label,
2666
2794
  required ? " *" : ""
2667
2795
  ] }) : null,
2668
2796
  children,
2669
- error ? /* @__PURE__ */ jsx66(FormError, { message: String(error) }) : hint ? /* @__PURE__ */ jsx66(FieldHint, { children: hint }) : null
2797
+ error ? /* @__PURE__ */ jsx68(FormError, { message: String(error) }) : hint ? /* @__PURE__ */ jsx68(FieldHint, { children: hint }) : null
2670
2798
  ] });
2671
2799
  }
2672
2800
 
2673
2801
  // src/components/forms/Switch.tsx
2674
- import { jsx as jsx67, jsxs as jsxs49 } from "react/jsx-runtime";
2802
+ import { jsx as jsx69, jsxs as jsxs50 } from "react/jsx-runtime";
2675
2803
  function Switch({ checked = false, onChange, disabled, label, description, className = "" }) {
2676
- return /* @__PURE__ */ jsxs49("label", { className: `flex cursor-pointer items-start gap-3 ${disabled ? "cursor-not-allowed opacity-50" : ""} ${className}`, children: [
2677
- /* @__PURE__ */ jsx67(
2804
+ return /* @__PURE__ */ jsxs50("label", { className: `flex cursor-pointer items-start gap-3 ${disabled ? "cursor-not-allowed opacity-50" : ""} ${className}`, children: [
2805
+ /* @__PURE__ */ jsx69(
2678
2806
  "button",
2679
2807
  {
2680
2808
  type: "button",
@@ -2683,22 +2811,22 @@ function Switch({ checked = false, onChange, disabled, label, description, class
2683
2811
  disabled,
2684
2812
  onClick: () => onChange?.(!checked),
2685
2813
  className: `relative mt-0.5 h-6 w-11 border border-[var(--tapiz-border-strong)] ${checked ? "bg-[var(--tapiz-accent)]" : "bg-[var(--tapiz-bg-surface-muted)]"}`,
2686
- children: /* @__PURE__ */ jsx67("span", { className: `absolute top-0.5 size-4 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] transition-transform ${checked ? "left-5" : "left-0.5"}` })
2814
+ children: /* @__PURE__ */ jsx69("span", { className: `absolute top-0.5 size-4 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] transition-transform ${checked ? "left-5" : "left-0.5"}` })
2687
2815
  }
2688
2816
  ),
2689
- label || description ? /* @__PURE__ */ jsxs49("span", { children: [
2690
- label ? /* @__PURE__ */ jsx67("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: label }) : null,
2691
- description ? /* @__PURE__ */ jsx67("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: description }) : null
2817
+ label || description ? /* @__PURE__ */ jsxs50("span", { children: [
2818
+ label ? /* @__PURE__ */ jsx69("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: label }) : null,
2819
+ description ? /* @__PURE__ */ jsx69("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: description }) : null
2692
2820
  ] }) : null
2693
2821
  ] });
2694
2822
  }
2695
2823
 
2696
2824
  // src/components/forms/ToggleGroup.tsx
2697
- import { jsx as jsx68 } from "react/jsx-runtime";
2825
+ import { jsx as jsx70 } from "react/jsx-runtime";
2698
2826
  function ToggleGroup({ options, value, onChange, className = "", fullWidth = false }) {
2699
- return /* @__PURE__ */ jsx68("div", { className: `inline-flex border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)] p-1 ${fullWidth ? "w-full" : ""} ${className}`, children: options.map((option) => {
2827
+ return /* @__PURE__ */ jsx70("div", { className: `inline-flex border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)] p-1 ${fullWidth ? "w-full" : ""} ${className}`, children: options.map((option) => {
2700
2828
  const selected = option.value === value;
2701
- return /* @__PURE__ */ jsx68(
2829
+ return /* @__PURE__ */ jsx70(
2702
2830
  "button",
2703
2831
  {
2704
2832
  type: "button",
@@ -2713,17 +2841,17 @@ function ToggleGroup({ options, value, onChange, className = "", fullWidth = fal
2713
2841
  }
2714
2842
 
2715
2843
  // src/components/forms/InputGroup.tsx
2716
- import { jsx as jsx69, jsxs as jsxs50 } from "react/jsx-runtime";
2844
+ import { jsx as jsx71, jsxs as jsxs51 } from "react/jsx-runtime";
2717
2845
  function InputGroup({ prefix, suffix, children, className = "" }) {
2718
- return /* @__PURE__ */ jsxs50("div", { className: `flex items-stretch border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] focus-within:border-[var(--tapiz-border-focus)] focus-within:shadow-[inset_3px_0_0_var(--tapiz-signal)] ${className}`, children: [
2719
- prefix ? /* @__PURE__ */ jsx69("div", { className: "flex items-center border-r border-[var(--tapiz-border-subtle)] px-3 text-sm text-[var(--tapiz-text-muted)]", children: prefix }) : null,
2720
- /* @__PURE__ */ jsx69("div", { className: "min-w-0 flex-1 [&_input]:border-0 [&_input]:shadow-none [&_input]:focus:shadow-none", children }),
2721
- suffix ? /* @__PURE__ */ jsx69("div", { className: "flex items-center border-l border-[var(--tapiz-border-subtle)] px-3 text-sm text-[var(--tapiz-text-muted)]", children: suffix }) : null
2846
+ return /* @__PURE__ */ jsxs51("div", { className: `flex items-stretch border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] focus-within:border-[var(--tapiz-border-focus)] focus-within:shadow-[inset_3px_0_0_var(--tapiz-signal)] ${className}`, children: [
2847
+ prefix ? /* @__PURE__ */ jsx71("div", { className: "flex items-center border-r border-[var(--tapiz-border-subtle)] px-3 text-sm text-[var(--tapiz-text-muted)]", children: prefix }) : null,
2848
+ /* @__PURE__ */ jsx71("div", { className: "min-w-0 flex-1 [&_input]:border-0 [&_input]:shadow-none [&_input]:focus:shadow-none", children }),
2849
+ suffix ? /* @__PURE__ */ jsx71("div", { className: "flex items-center border-l border-[var(--tapiz-border-subtle)] px-3 text-sm text-[var(--tapiz-text-muted)]", children: suffix }) : null
2722
2850
  ] });
2723
2851
  }
2724
2852
 
2725
2853
  // src/components/feedback/Alert.tsx
2726
- import { jsx as jsx70, jsxs as jsxs51 } from "react/jsx-runtime";
2854
+ import { jsx as jsx72, jsxs as jsxs52 } from "react/jsx-runtime";
2727
2855
  var toneClasses = {
2728
2856
  info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)] text-[var(--tapiz-info)]",
2729
2857
  success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
@@ -2732,18 +2860,18 @@ var toneClasses = {
2732
2860
  neutral: "border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-secondary)]"
2733
2861
  };
2734
2862
  function Alert2({ tone: tone2 = "info", title, children, icon, actions, className = "" }) {
2735
- return /* @__PURE__ */ jsxs51("div", { className: `flex gap-3 border p-4 ${toneClasses[tone2]} ${className}`, children: [
2736
- icon ? /* @__PURE__ */ jsx70("div", { className: "mt-0.5 shrink-0", children: icon }) : null,
2737
- /* @__PURE__ */ jsxs51("div", { className: "min-w-0 flex-1", children: [
2738
- title ? /* @__PURE__ */ jsx70("div", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
2739
- children ? /* @__PURE__ */ jsx70("div", { className: "mt-1 text-sm text-[var(--tapiz-text-secondary)]", children }) : null
2863
+ return /* @__PURE__ */ jsxs52("div", { className: `flex gap-3 border p-4 ${toneClasses[tone2]} ${className}`, children: [
2864
+ icon ? /* @__PURE__ */ jsx72("div", { className: "mt-0.5 shrink-0", children: icon }) : null,
2865
+ /* @__PURE__ */ jsxs52("div", { className: "min-w-0 flex-1", children: [
2866
+ title ? /* @__PURE__ */ jsx72("div", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
2867
+ children ? /* @__PURE__ */ jsx72("div", { className: "mt-1 text-sm text-[var(--tapiz-text-secondary)]", children }) : null
2740
2868
  ] }),
2741
- actions ? /* @__PURE__ */ jsx70("div", { className: "shrink-0", children: actions }) : null
2869
+ actions ? /* @__PURE__ */ jsx72("div", { className: "shrink-0", children: actions }) : null
2742
2870
  ] });
2743
2871
  }
2744
2872
 
2745
2873
  // src/components/feedback/Progress.tsx
2746
- import { jsx as jsx71, jsxs as jsxs52 } from "react/jsx-runtime";
2874
+ import { jsx as jsx73, jsxs as jsxs53 } from "react/jsx-runtime";
2747
2875
  var tones = {
2748
2876
  accent: "bg-[var(--tapiz-accent)]",
2749
2877
  success: "bg-[var(--tapiz-success)]",
@@ -2752,34 +2880,34 @@ var tones = {
2752
2880
  };
2753
2881
  function Progress({ value, max = 100, label, showValue = false, tone: tone2 = "accent", className = "" }) {
2754
2882
  const percentage = Math.max(0, Math.min(100, value / max * 100));
2755
- return /* @__PURE__ */ jsxs52("div", { className, children: [
2756
- label || showValue ? /* @__PURE__ */ jsxs52("div", { className: "mb-1 flex items-center justify-between gap-3 text-xs text-[var(--tapiz-text-muted)]", children: [
2757
- label ? /* @__PURE__ */ jsx71("span", { children: label }) : /* @__PURE__ */ jsx71("span", {}),
2758
- showValue ? /* @__PURE__ */ jsxs52("span", { className: "font-mono", children: [
2883
+ return /* @__PURE__ */ jsxs53("div", { className, children: [
2884
+ label || showValue ? /* @__PURE__ */ jsxs53("div", { className: "mb-1 flex items-center justify-between gap-3 text-xs text-[var(--tapiz-text-muted)]", children: [
2885
+ label ? /* @__PURE__ */ jsx73("span", { children: label }) : /* @__PURE__ */ jsx73("span", {}),
2886
+ showValue ? /* @__PURE__ */ jsxs53("span", { className: "font-mono", children: [
2759
2887
  Math.round(percentage),
2760
2888
  "%"
2761
2889
  ] }) : null
2762
2890
  ] }) : null,
2763
- /* @__PURE__ */ jsx71("div", { className: "h-2 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx71("div", { className: `h-full ${tones[tone2]}`, style: { width: `${percentage}%` } }) })
2891
+ /* @__PURE__ */ jsx73("div", { className: "h-2 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx73("div", { className: `h-full ${tones[tone2]}`, style: { width: `${percentage}%` } }) })
2764
2892
  ] });
2765
2893
  }
2766
2894
 
2767
2895
  // src/components/shared/Avatar.tsx
2768
- import { jsx as jsx72 } from "react/jsx-runtime";
2896
+ import { jsx as jsx74 } from "react/jsx-runtime";
2769
2897
  var sizes = { xs: "size-6 text-[10px]", sm: "size-8 text-xs", md: "size-10 text-sm", lg: "size-14 text-base" };
2770
2898
  function Avatar({ src, name = "?", size = "md", className = "" }) {
2771
2899
  const initials = name.split(" ").filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase()).join("") || "?";
2772
- return src ? /* @__PURE__ */ jsx72("img", { src, alt: name, className: `border border-[var(--tapiz-border-strong)] object-cover ${sizes[size]} ${className}` }) : /* @__PURE__ */ jsx72("span", { className: `inline-grid place-items-center border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)] font-mono font-bold text-[var(--tapiz-accent)] ${sizes[size]} ${className}`, children: initials });
2900
+ return src ? /* @__PURE__ */ jsx74("img", { src, alt: name, className: `border border-[var(--tapiz-border-strong)] object-cover ${sizes[size]} ${className}` }) : /* @__PURE__ */ jsx74("span", { className: `inline-grid place-items-center border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)] font-mono font-bold text-[var(--tapiz-accent)] ${sizes[size]} ${className}`, children: initials });
2773
2901
  }
2774
2902
 
2775
2903
  // src/components/shared/Kbd.tsx
2776
- import { jsx as jsx73 } from "react/jsx-runtime";
2904
+ import { jsx as jsx75 } from "react/jsx-runtime";
2777
2905
  function Kbd({ children, className = "" }) {
2778
- return /* @__PURE__ */ jsx73("kbd", { className: `inline-flex min-w-5 items-center justify-center border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)] px-1.5 py-0.5 font-mono text-[10px] font-bold text-[var(--tapiz-text-secondary)] shadow-[1px_1px_0_var(--tapiz-border-strong)] ${className}`, children });
2906
+ return /* @__PURE__ */ jsx75("kbd", { className: `inline-flex min-w-5 items-center justify-center border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)] px-1.5 py-0.5 font-mono text-[10px] font-bold text-[var(--tapiz-text-secondary)] shadow-[1px_1px_0_var(--tapiz-border-strong)] ${className}`, children });
2779
2907
  }
2780
2908
 
2781
2909
  // src/components/shared/Timeline.tsx
2782
- import { jsx as jsx74, jsxs as jsxs53 } from "react/jsx-runtime";
2910
+ import { jsx as jsx76, jsxs as jsxs54 } from "react/jsx-runtime";
2783
2911
  var tones2 = {
2784
2912
  neutral: "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-muted)]",
2785
2913
  info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)] text-[var(--tapiz-info)]",
@@ -2788,94 +2916,94 @@ var tones2 = {
2788
2916
  danger: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]"
2789
2917
  };
2790
2918
  function Timeline({ items, className = "" }) {
2791
- return /* @__PURE__ */ jsx74("ol", { className: `relative space-y-4 before:absolute before:left-4 before:top-2 before:h-[calc(100%-1rem)] before:w-px before:bg-[var(--tapiz-border-subtle)] ${className}`, children: items.map((item) => /* @__PURE__ */ jsxs53("li", { className: "relative flex gap-3", children: [
2792
- /* @__PURE__ */ jsx74("span", { className: `z-10 grid size-8 shrink-0 place-items-center border text-xs ${tones2[item.tone ?? "neutral"]}`, children: item.icon ?? "\u2022" }),
2793
- /* @__PURE__ */ jsxs53("span", { className: "min-w-0 flex-1 pb-2", children: [
2794
- /* @__PURE__ */ jsxs53("span", { className: "flex flex-wrap items-baseline justify-between gap-2", children: [
2795
- /* @__PURE__ */ jsx74("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
2796
- item.time ? /* @__PURE__ */ jsx74("span", { className: "font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: item.time }) : null
2919
+ return /* @__PURE__ */ jsx76("ol", { className: `relative space-y-4 before:absolute before:left-4 before:top-2 before:h-[calc(100%-1rem)] before:w-px before:bg-[var(--tapiz-border-subtle)] ${className}`, children: items.map((item) => /* @__PURE__ */ jsxs54("li", { className: "relative flex gap-3", children: [
2920
+ /* @__PURE__ */ jsx76("span", { className: `z-10 grid size-8 shrink-0 place-items-center border text-xs ${tones2[item.tone ?? "neutral"]}`, children: item.icon ?? "\u2022" }),
2921
+ /* @__PURE__ */ jsxs54("span", { className: "min-w-0 flex-1 pb-2", children: [
2922
+ /* @__PURE__ */ jsxs54("span", { className: "flex flex-wrap items-baseline justify-between gap-2", children: [
2923
+ /* @__PURE__ */ jsx76("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
2924
+ item.time ? /* @__PURE__ */ jsx76("span", { className: "font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: item.time }) : null
2797
2925
  ] }),
2798
- item.description ? /* @__PURE__ */ jsx74("span", { className: "mt-1 block text-sm text-[var(--tapiz-text-secondary)]", children: item.description }) : null
2926
+ item.description ? /* @__PURE__ */ jsx76("span", { className: "mt-1 block text-sm text-[var(--tapiz-text-secondary)]", children: item.description }) : null
2799
2927
  ] })
2800
2928
  ] }, item.id)) });
2801
2929
  }
2802
2930
 
2803
2931
  // src/components/shared/KeyValueList.tsx
2804
- import { jsx as jsx75, jsxs as jsxs54 } from "react/jsx-runtime";
2932
+ import { jsx as jsx77, jsxs as jsxs55 } from "react/jsx-runtime";
2805
2933
  function KeyValueList({ items, className = "", density = "normal" }) {
2806
- return /* @__PURE__ */ jsx75("dl", { className: `divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: items.map((item, index) => /* @__PURE__ */ jsxs54("div", { className: `grid gap-2 ${density === "compact" ? "p-3 md:grid-cols-[160px_1fr]" : "p-4 md:grid-cols-[220px_1fr]"}`, children: [
2807
- /* @__PURE__ */ jsx75("dt", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: item.keyLabel }),
2808
- /* @__PURE__ */ jsxs54("dd", { children: [
2809
- /* @__PURE__ */ jsx75("div", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.value }),
2810
- item.description ? /* @__PURE__ */ jsx75("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.description }) : null
2934
+ return /* @__PURE__ */ jsx77("dl", { className: `divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: items.map((item, index) => /* @__PURE__ */ jsxs55("div", { className: `grid gap-2 ${density === "compact" ? "p-3 md:grid-cols-[160px_1fr]" : "p-4 md:grid-cols-[220px_1fr]"}`, children: [
2935
+ /* @__PURE__ */ jsx77("dt", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: item.keyLabel }),
2936
+ /* @__PURE__ */ jsxs55("dd", { children: [
2937
+ /* @__PURE__ */ jsx77("div", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.value }),
2938
+ item.description ? /* @__PURE__ */ jsx77("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.description }) : null
2811
2939
  ] })
2812
2940
  ] }, index)) });
2813
2941
  }
2814
2942
 
2815
2943
  // src/components/shared/CodeBlock.tsx
2816
- import { jsx as jsx76, jsxs as jsxs55 } from "react/jsx-runtime";
2944
+ import { jsx as jsx78, jsxs as jsxs56 } from "react/jsx-runtime";
2817
2945
  function CodeBlock({ children, language, title, actions, className = "" }) {
2818
- return /* @__PURE__ */ jsxs55("figure", { className: `overflow-hidden border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
2819
- title || language || actions ? /* @__PURE__ */ jsxs55("figcaption", { className: "flex items-center justify-between gap-3 border-b border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] px-3 py-2", children: [
2820
- /* @__PURE__ */ jsx76("span", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: title ?? language }),
2946
+ return /* @__PURE__ */ jsxs56("figure", { className: `overflow-hidden border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
2947
+ title || language || actions ? /* @__PURE__ */ jsxs56("figcaption", { className: "flex items-center justify-between gap-3 border-b border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] px-3 py-2", children: [
2948
+ /* @__PURE__ */ jsx78("span", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: title ?? language }),
2821
2949
  actions
2822
2950
  ] }) : null,
2823
- /* @__PURE__ */ jsx76("pre", { className: "overflow-auto p-4 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children: /* @__PURE__ */ jsx76("code", { children }) })
2951
+ /* @__PURE__ */ jsx78("pre", { className: "overflow-auto p-4 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children: /* @__PURE__ */ jsx78("code", { children }) })
2824
2952
  ] });
2825
2953
  }
2826
2954
 
2827
2955
  // src/components/marketing/LogoCloud.tsx
2828
- import { jsx as jsx77, jsxs as jsxs56 } from "react/jsx-runtime";
2956
+ import { jsx as jsx79, jsxs as jsxs57 } from "react/jsx-runtime";
2829
2957
  function LogoCloud({ title, items, className = "" }) {
2830
- return /* @__PURE__ */ jsx77("section", { className: `border-y border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] py-8 ${className}`, children: /* @__PURE__ */ jsxs56("div", { className: "mx-auto max-w-7xl px-[var(--tapiz-space-page-x)]", children: [
2831
- title ? /* @__PURE__ */ jsx77("p", { className: "mb-6 text-center font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: title }) : null,
2832
- /* @__PURE__ */ jsx77("div", { className: "grid grid-cols-2 gap-3 md:grid-cols-4 lg:grid-cols-6", children: items.map((item) => /* @__PURE__ */ jsx77("div", { className: "grid min-h-20 place-items-center border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] px-4 text-center text-sm font-semibold text-[var(--tapiz-text-secondary)]", children: item.logo ?? item.name }, item.name)) })
2958
+ return /* @__PURE__ */ jsx79("section", { className: `border-y border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] py-8 ${className}`, children: /* @__PURE__ */ jsxs57("div", { className: "mx-auto max-w-7xl px-[var(--tapiz-space-page-x)]", children: [
2959
+ title ? /* @__PURE__ */ jsx79("p", { className: "mb-6 text-center font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: title }) : null,
2960
+ /* @__PURE__ */ jsx79("div", { className: "grid grid-cols-2 gap-3 md:grid-cols-4 lg:grid-cols-6", children: items.map((item) => /* @__PURE__ */ jsx79("div", { className: "grid min-h-20 place-items-center border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] px-4 text-center text-sm font-semibold text-[var(--tapiz-text-secondary)]", children: item.logo ?? item.name }, item.name)) })
2833
2961
  ] }) });
2834
2962
  }
2835
2963
 
2836
2964
  // src/components/marketing/TestimonialCard.tsx
2837
- import { jsx as jsx78, jsxs as jsxs57 } from "react/jsx-runtime";
2965
+ import { jsx as jsx80, jsxs as jsxs58 } from "react/jsx-runtime";
2838
2966
  function TestimonialCard({ quote, author, role, avatarSrc, className = "", variant = "surface" }) {
2839
- return /* @__PURE__ */ jsxs57("figure", { className: `border bg-[var(--tapiz-bg-surface)] p-5 ${variant === "brutal" ? "border-2 border-[var(--tapiz-border-strong)] shadow-[var(--tapiz-shadow-brutal)]" : "border-[var(--tapiz-border-subtle)] shadow-[var(--tapiz-shadow-sm)]"} ${className}`, children: [
2840
- /* @__PURE__ */ jsxs57("blockquote", { className: "text-base leading-7 text-[var(--tapiz-text-secondary)]", children: [
2967
+ return /* @__PURE__ */ jsxs58("figure", { className: `border bg-[var(--tapiz-bg-surface)] p-5 ${variant === "brutal" ? "border-2 border-[var(--tapiz-border-strong)] shadow-[var(--tapiz-shadow-brutal)]" : "border-[var(--tapiz-border-subtle)] shadow-[var(--tapiz-shadow-sm)]"} ${className}`, children: [
2968
+ /* @__PURE__ */ jsxs58("blockquote", { className: "text-base leading-7 text-[var(--tapiz-text-secondary)]", children: [
2841
2969
  "\u201C",
2842
2970
  quote,
2843
2971
  "\u201D"
2844
2972
  ] }),
2845
- /* @__PURE__ */ jsxs57("figcaption", { className: "mt-5 flex items-center gap-3", children: [
2846
- /* @__PURE__ */ jsx78(Avatar, { name: author, src: avatarSrc, size: "sm" }),
2847
- /* @__PURE__ */ jsxs57("span", { children: [
2848
- /* @__PURE__ */ jsx78("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: author }),
2849
- role ? /* @__PURE__ */ jsx78("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: role }) : null
2973
+ /* @__PURE__ */ jsxs58("figcaption", { className: "mt-5 flex items-center gap-3", children: [
2974
+ /* @__PURE__ */ jsx80(Avatar, { name: author, src: avatarSrc, size: "sm" }),
2975
+ /* @__PURE__ */ jsxs58("span", { children: [
2976
+ /* @__PURE__ */ jsx80("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: author }),
2977
+ role ? /* @__PURE__ */ jsx80("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: role }) : null
2850
2978
  ] })
2851
2979
  ] })
2852
2980
  ] });
2853
2981
  }
2854
2982
 
2855
2983
  // src/components/marketing/PricingCard.tsx
2856
- import { jsx as jsx79, jsxs as jsxs58 } from "react/jsx-runtime";
2984
+ import { jsx as jsx81, jsxs as jsxs59 } from "react/jsx-runtime";
2857
2985
  function PricingCard({ name, price, description, features = [], cta, highlighted = false, className = "" }) {
2858
- return /* @__PURE__ */ jsxs58("section", { className: `flex h-full flex-col border bg-[var(--tapiz-bg-surface)] p-6 ${highlighted ? "border-2 border-[var(--tapiz-border-strong)] shadow-[var(--tapiz-shadow-brutal-lg)]" : "border-[var(--tapiz-border-subtle)] shadow-[var(--tapiz-shadow-sm)]"} ${className}`, children: [
2859
- /* @__PURE__ */ jsxs58("div", { className: "flex-1", children: [
2860
- /* @__PURE__ */ jsx79("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: name }),
2861
- description ? /* @__PURE__ */ jsx79("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null,
2862
- /* @__PURE__ */ jsx79("div", { className: "mt-6 text-4xl font-semibold tracking-tight text-[var(--tapiz-text-primary)]", children: price }),
2863
- /* @__PURE__ */ jsx79("ul", { className: "mt-6 space-y-3 text-sm text-[var(--tapiz-text-secondary)]", children: features.map((feature, index) => /* @__PURE__ */ jsxs58("li", { className: "flex gap-2", children: [
2864
- /* @__PURE__ */ jsx79("span", { className: "text-[var(--tapiz-success)]", children: "\u2713" }),
2865
- /* @__PURE__ */ jsx79("span", { children: feature })
2986
+ return /* @__PURE__ */ jsxs59("section", { className: `flex h-full flex-col border bg-[var(--tapiz-bg-surface)] p-6 ${highlighted ? "border-2 border-[var(--tapiz-border-strong)] shadow-[var(--tapiz-shadow-brutal-lg)]" : "border-[var(--tapiz-border-subtle)] shadow-[var(--tapiz-shadow-sm)]"} ${className}`, children: [
2987
+ /* @__PURE__ */ jsxs59("div", { className: "flex-1", children: [
2988
+ /* @__PURE__ */ jsx81("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: name }),
2989
+ description ? /* @__PURE__ */ jsx81("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null,
2990
+ /* @__PURE__ */ jsx81("div", { className: "mt-6 text-4xl font-semibold tracking-tight text-[var(--tapiz-text-primary)]", children: price }),
2991
+ /* @__PURE__ */ jsx81("ul", { className: "mt-6 space-y-3 text-sm text-[var(--tapiz-text-secondary)]", children: features.map((feature, index) => /* @__PURE__ */ jsxs59("li", { className: "flex gap-2", children: [
2992
+ /* @__PURE__ */ jsx81("span", { className: "text-[var(--tapiz-success)]", children: "\u2713" }),
2993
+ /* @__PURE__ */ jsx81("span", { children: feature })
2866
2994
  ] }, index)) })
2867
2995
  ] }),
2868
- /* @__PURE__ */ jsx79("div", { className: "mt-6", children: cta ?? /* @__PURE__ */ jsx79(Button, { variant: highlighted ? "primary" : "secondary", fullWidth: true, children: "Get started" }) })
2996
+ /* @__PURE__ */ jsx81("div", { className: "mt-6", children: cta ?? /* @__PURE__ */ jsx81(Button, { variant: highlighted ? "primary" : "secondary", fullWidth: true, children: "Get started" }) })
2869
2997
  ] });
2870
2998
  }
2871
2999
 
2872
3000
  // src/components/marketing/StatsBand.tsx
2873
- import { jsx as jsx80, jsxs as jsxs59 } from "react/jsx-runtime";
3001
+ import { jsx as jsx82, jsxs as jsxs60 } from "react/jsx-runtime";
2874
3002
  function StatsBand({ items, className = "" }) {
2875
- return /* @__PURE__ */ jsx80("section", { className: `border-y border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-inverse)] text-[var(--tapiz-text-inverse)] ${className}`, children: /* @__PURE__ */ jsx80("div", { className: "mx-auto grid max-w-7xl divide-y divide-[color-mix(in_srgb,var(--tapiz-text-inverse)_24%,transparent)] px-[var(--tapiz-space-page-x)] md:grid-cols-3 md:divide-x md:divide-y-0", children: items.map((item, index) => /* @__PURE__ */ jsxs59("div", { className: "p-6 md:p-8", children: [
2876
- /* @__PURE__ */ jsx80("div", { className: "text-3xl font-semibold tracking-tight", children: item.value }),
2877
- /* @__PURE__ */ jsx80("div", { className: "mt-2 font-mono text-[10px] font-bold uppercase tracking-[0.18em] opacity-70", children: item.label }),
2878
- item.description ? /* @__PURE__ */ jsx80("div", { className: "mt-3 text-sm opacity-70", children: item.description }) : null
3003
+ return /* @__PURE__ */ jsx82("section", { className: `border-y border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-inverse)] text-[var(--tapiz-text-inverse)] ${className}`, children: /* @__PURE__ */ jsx82("div", { className: "mx-auto grid max-w-7xl divide-y divide-[color-mix(in_srgb,var(--tapiz-text-inverse)_24%,transparent)] px-[var(--tapiz-space-page-x)] md:grid-cols-3 md:divide-x md:divide-y-0", children: items.map((item, index) => /* @__PURE__ */ jsxs60("div", { className: "p-6 md:p-8", children: [
3004
+ /* @__PURE__ */ jsx82("div", { className: "text-3xl font-semibold tracking-tight", children: item.value }),
3005
+ /* @__PURE__ */ jsx82("div", { className: "mt-2 font-mono text-[10px] font-bold uppercase tracking-[0.18em] opacity-70", children: item.label }),
3006
+ item.description ? /* @__PURE__ */ jsx82("div", { className: "mt-3 text-sm opacity-70", children: item.description }) : null
2879
3007
  ] }, index)) }) });
2880
3008
  }
2881
3009
 
@@ -2914,7 +3042,7 @@ var tapizFrameworkPresets = {
2914
3042
  };
2915
3043
 
2916
3044
  // src/components/layout/Container.tsx
2917
- import { jsx as jsx81 } from "react/jsx-runtime";
3045
+ import { jsx as jsx83 } from "react/jsx-runtime";
2918
3046
  var sizeClasses2 = {
2919
3047
  sm: "max-w-3xl",
2920
3048
  md: "max-w-5xl",
@@ -2923,7 +3051,7 @@ var sizeClasses2 = {
2923
3051
  full: "max-w-none"
2924
3052
  };
2925
3053
  function Container({ children, size = "lg", padded = true, className = "", style }) {
2926
- return /* @__PURE__ */ jsx81(
3054
+ return /* @__PURE__ */ jsx83(
2927
3055
  "div",
2928
3056
  {
2929
3057
  className: ["mx-auto w-full", sizeClasses2[size], padded ? "px-[var(--tapiz-space-page-x)]" : "", className].filter(Boolean).join(" "),
@@ -2934,7 +3062,7 @@ function Container({ children, size = "lg", padded = true, className = "", style
2934
3062
  }
2935
3063
 
2936
3064
  // src/components/layout/Surface.tsx
2937
- import { jsx as jsx82 } from "react/jsx-runtime";
3065
+ import { jsx as jsx84 } from "react/jsx-runtime";
2938
3066
  var variantClasses5 = {
2939
3067
  canvas: "bg-[var(--tapiz-bg-page)] text-[var(--tapiz-text-primary)]",
2940
3068
  surface: "bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-primary)]",
@@ -2951,7 +3079,7 @@ var paddingClasses2 = {
2951
3079
  xl: "p-8"
2952
3080
  };
2953
3081
  function Surface({ children, variant = "surface", padding = "md", bordered = true, className = "", style }) {
2954
- return /* @__PURE__ */ jsx82(
3082
+ return /* @__PURE__ */ jsx84(
2955
3083
  "section",
2956
3084
  {
2957
3085
  className: [variantClasses5[variant], paddingClasses2[padding], bordered && variant !== "brutal" ? "border border-[var(--tapiz-border-subtle)]" : "", className].filter(Boolean).join(" "),
@@ -2962,23 +3090,23 @@ function Surface({ children, variant = "surface", padding = "md", bordered = tru
2962
3090
  }
2963
3091
 
2964
3092
  // src/components/layout/Divider.tsx
2965
- import { jsx as jsx83, jsxs as jsxs60 } from "react/jsx-runtime";
3093
+ import { jsx as jsx85, jsxs as jsxs61 } from "react/jsx-runtime";
2966
3094
  function Divider({ orientation = "horizontal", label, className = "" }) {
2967
3095
  if (orientation === "vertical") {
2968
- return /* @__PURE__ */ jsx83("div", { className: `mx-2 min-h-6 w-px bg-[var(--tapiz-border-subtle)] ${className}`, "aria-hidden": "true" });
3096
+ return /* @__PURE__ */ jsx85("div", { className: `mx-2 min-h-6 w-px bg-[var(--tapiz-border-subtle)] ${className}`, "aria-hidden": "true" });
2969
3097
  }
2970
3098
  if (label) {
2971
- return /* @__PURE__ */ jsxs60("div", { className: `flex items-center gap-3 ${className}`, children: [
2972
- /* @__PURE__ */ jsx83("div", { className: "h-px flex-1 bg-[var(--tapiz-border-subtle)]" }),
2973
- /* @__PURE__ */ jsx83("span", { className: "font-mono text-[10px] uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: label }),
2974
- /* @__PURE__ */ jsx83("div", { className: "h-px flex-1 bg-[var(--tapiz-border-subtle)]" })
3099
+ return /* @__PURE__ */ jsxs61("div", { className: `flex items-center gap-3 ${className}`, children: [
3100
+ /* @__PURE__ */ jsx85("div", { className: "h-px flex-1 bg-[var(--tapiz-border-subtle)]" }),
3101
+ /* @__PURE__ */ jsx85("span", { className: "font-mono text-[10px] uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: label }),
3102
+ /* @__PURE__ */ jsx85("div", { className: "h-px flex-1 bg-[var(--tapiz-border-subtle)]" })
2975
3103
  ] });
2976
3104
  }
2977
- return /* @__PURE__ */ jsx83("hr", { className: `border-[var(--tapiz-border-subtle)] ${className}` });
3105
+ return /* @__PURE__ */ jsx85("hr", { className: `border-[var(--tapiz-border-subtle)] ${className}` });
2978
3106
  }
2979
3107
 
2980
3108
  // src/components/layout/ResponsiveGrid.tsx
2981
- import { jsx as jsx84 } from "react/jsx-runtime";
3109
+ import { jsx as jsx86 } from "react/jsx-runtime";
2982
3110
  var gapClasses3 = {
2983
3111
  sm: "gap-3",
2984
3112
  md: "gap-4",
@@ -2986,7 +3114,7 @@ var gapClasses3 = {
2986
3114
  xl: "gap-8"
2987
3115
  };
2988
3116
  function ResponsiveGrid({ children, min = "18rem", gap = "md", className = "", style }) {
2989
- return /* @__PURE__ */ jsx84(
3117
+ return /* @__PURE__ */ jsx86(
2990
3118
  "div",
2991
3119
  {
2992
3120
  className: `grid ${gapClasses3[gap]} ${className}`,
@@ -2997,7 +3125,7 @@ function ResponsiveGrid({ children, min = "18rem", gap = "md", className = "", s
2997
3125
  }
2998
3126
 
2999
3127
  // src/components/data-display/Sparkline.tsx
3000
- import { jsx as jsx85, jsxs as jsxs61 } from "react/jsx-runtime";
3128
+ import { jsx as jsx87, jsxs as jsxs62 } from "react/jsx-runtime";
3001
3129
  function Sparkline({ values, width = 160, height = 48, label = "Trend", className = "", style }) {
3002
3130
  const safeValues = values.length ? values : [0];
3003
3131
  const min = Math.min(...safeValues);
@@ -3009,40 +3137,40 @@ function Sparkline({ values, width = 160, height = 48, label = "Trend", classNam
3009
3137
  const y = height - (value - min) / range * (height - 6) - 3;
3010
3138
  return `${x},${y}`;
3011
3139
  }).join(" ");
3012
- return /* @__PURE__ */ jsxs61("svg", { className, style, width, height, viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": label, children: [
3013
- /* @__PURE__ */ jsx85("polyline", { points, fill: "none", stroke: "var(--tapiz-accent)", strokeWidth: "2", strokeLinecap: "square", strokeLinejoin: "miter" }),
3014
- /* @__PURE__ */ jsx85("line", { x1: "0", x2: width, y1: height - 1, y2: height - 1, stroke: "var(--tapiz-border-subtle)", strokeWidth: "1" })
3140
+ return /* @__PURE__ */ jsxs62("svg", { className, style, width, height, viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": label, children: [
3141
+ /* @__PURE__ */ jsx87("polyline", { points, fill: "none", stroke: "var(--tapiz-accent)", strokeWidth: "2", strokeLinecap: "square", strokeLinejoin: "miter" }),
3142
+ /* @__PURE__ */ jsx87("line", { x1: "0", x2: width, y1: height - 1, y2: height - 1, stroke: "var(--tapiz-border-subtle)", strokeWidth: "1" })
3015
3143
  ] });
3016
3144
  }
3017
3145
 
3018
3146
  // src/components/data-display/BarList.tsx
3019
- import { jsx as jsx86, jsxs as jsxs62 } from "react/jsx-runtime";
3147
+ import { jsx as jsx88, jsxs as jsxs63 } from "react/jsx-runtime";
3020
3148
  function BarList({ items, max, valueFormatter = (value) => value, className = "" }) {
3021
3149
  const computedMax = max ?? Math.max(1, ...items.map((item) => item.value));
3022
- return /* @__PURE__ */ jsx86("div", { className: `space-y-3 ${className}`, children: items.map((item, index) => {
3150
+ return /* @__PURE__ */ jsx88("div", { className: `space-y-3 ${className}`, children: items.map((item, index) => {
3023
3151
  const percent = Math.max(0, Math.min(100, item.value / computedMax * 100));
3024
- return /* @__PURE__ */ jsxs62("div", { children: [
3025
- /* @__PURE__ */ jsxs62("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
3026
- /* @__PURE__ */ jsx86("span", { className: "font-medium text-[var(--tapiz-text-secondary)]", children: item.label }),
3027
- /* @__PURE__ */ jsx86("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: valueFormatter(item.value) })
3152
+ return /* @__PURE__ */ jsxs63("div", { children: [
3153
+ /* @__PURE__ */ jsxs63("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
3154
+ /* @__PURE__ */ jsx88("span", { className: "font-medium text-[var(--tapiz-text-secondary)]", children: item.label }),
3155
+ /* @__PURE__ */ jsx88("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: valueFormatter(item.value) })
3028
3156
  ] }),
3029
- /* @__PURE__ */ jsx86("div", { className: "h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx86("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${percent}%` } }) }),
3030
- item.detail ? /* @__PURE__ */ jsx86("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.detail }) : null
3157
+ /* @__PURE__ */ jsx88("div", { className: "h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx88("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${percent}%` } }) }),
3158
+ item.detail ? /* @__PURE__ */ jsx88("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.detail }) : null
3031
3159
  ] }, index);
3032
3160
  }) });
3033
3161
  }
3034
3162
 
3035
3163
  // src/components/data-display/DonutMetric.tsx
3036
- import { jsx as jsx87, jsxs as jsxs63 } from "react/jsx-runtime";
3164
+ import { jsx as jsx89, jsxs as jsxs64 } from "react/jsx-runtime";
3037
3165
  function DonutMetric({ value, max = 100, label, caption, size = 112, className = "" }) {
3038
3166
  const radius = 42;
3039
3167
  const circumference = 2 * Math.PI * radius;
3040
3168
  const ratio = Math.max(0, Math.min(1, value / max));
3041
3169
  const offset = circumference * (1 - ratio);
3042
- return /* @__PURE__ */ jsxs63("div", { className: `inline-flex items-center gap-4 ${className}`, children: [
3043
- /* @__PURE__ */ jsxs63("svg", { width: size, height: size, viewBox: "0 0 112 112", role: "img", "aria-label": `${Math.round(ratio * 100)}%`, children: [
3044
- /* @__PURE__ */ jsx87("circle", { cx: "56", cy: "56", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
3045
- /* @__PURE__ */ jsx87(
3170
+ return /* @__PURE__ */ jsxs64("div", { className: `inline-flex items-center gap-4 ${className}`, children: [
3171
+ /* @__PURE__ */ jsxs64("svg", { width: size, height: size, viewBox: "0 0 112 112", role: "img", "aria-label": `${Math.round(ratio * 100)}%`, children: [
3172
+ /* @__PURE__ */ jsx89("circle", { cx: "56", cy: "56", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
3173
+ /* @__PURE__ */ jsx89(
3046
3174
  "circle",
3047
3175
  {
3048
3176
  cx: "56",
@@ -3057,22 +3185,22 @@ function DonutMetric({ value, max = 100, label, caption, size = 112, className =
3057
3185
  transform: "rotate(-90 56 56)"
3058
3186
  }
3059
3187
  ),
3060
- /* @__PURE__ */ jsxs63("text", { x: "56", y: "61", textAnchor: "middle", className: "fill-[var(--tapiz-text-primary)] font-mono text-lg font-bold", children: [
3188
+ /* @__PURE__ */ jsxs64("text", { x: "56", y: "61", textAnchor: "middle", className: "fill-[var(--tapiz-text-primary)] font-mono text-lg font-bold", children: [
3061
3189
  Math.round(ratio * 100),
3062
3190
  "%"
3063
3191
  ] })
3064
3192
  ] }),
3065
- label || caption ? /* @__PURE__ */ jsxs63("div", { children: [
3066
- label ? /* @__PURE__ */ jsx87("div", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: label }) : null,
3067
- caption ? /* @__PURE__ */ jsx87("div", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: caption }) : null
3193
+ label || caption ? /* @__PURE__ */ jsxs64("div", { children: [
3194
+ label ? /* @__PURE__ */ jsx89("div", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: label }) : null,
3195
+ caption ? /* @__PURE__ */ jsx89("div", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: caption }) : null
3068
3196
  ] }) : null
3069
3197
  ] });
3070
3198
  }
3071
3199
 
3072
3200
  // src/components/data-display/FilterChip.tsx
3073
- import { jsx as jsx88, jsxs as jsxs64 } from "react/jsx-runtime";
3201
+ import { jsx as jsx90, jsxs as jsxs65 } from "react/jsx-runtime";
3074
3202
  function FilterChip({ children, active = false, onRemove, className = "" }) {
3075
- return /* @__PURE__ */ jsxs64(
3203
+ return /* @__PURE__ */ jsxs65(
3076
3204
  "span",
3077
3205
  {
3078
3206
  className: [
@@ -3082,56 +3210,56 @@ function FilterChip({ children, active = false, onRemove, className = "" }) {
3082
3210
  ].join(" "),
3083
3211
  children: [
3084
3212
  children,
3085
- onRemove ? /* @__PURE__ */ jsx88("button", { type: "button", onClick: onRemove, className: "text-[var(--tapiz-text-muted)] hover:text-[var(--tapiz-danger)]", "aria-label": "Remove filter", children: "\xD7" }) : null
3213
+ onRemove ? /* @__PURE__ */ jsx90("button", { type: "button", onClick: onRemove, className: "text-[var(--tapiz-text-muted)] hover:text-[var(--tapiz-danger)]", "aria-label": "Remove filter", children: "\xD7" }) : null
3086
3214
  ]
3087
3215
  }
3088
3216
  );
3089
3217
  }
3090
3218
 
3091
3219
  // src/components/data-display/DataToolbar.tsx
3092
- import { jsx as jsx89, jsxs as jsxs65 } from "react/jsx-runtime";
3220
+ import { jsx as jsx91, jsxs as jsxs66 } from "react/jsx-runtime";
3093
3221
  function DataToolbar({ title, description, search, filters, actions, className = "" }) {
3094
- return /* @__PURE__ */ jsxs65("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4 ${className}`, children: [
3095
- /* @__PURE__ */ jsxs65("div", { className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between", children: [
3096
- /* @__PURE__ */ jsxs65("div", { children: [
3097
- title ? /* @__PURE__ */ jsx89("h3", { className: "text-base font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
3098
- description ? /* @__PURE__ */ jsx89("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null
3222
+ return /* @__PURE__ */ jsxs66("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4 ${className}`, children: [
3223
+ /* @__PURE__ */ jsxs66("div", { className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between", children: [
3224
+ /* @__PURE__ */ jsxs66("div", { children: [
3225
+ title ? /* @__PURE__ */ jsx91("h3", { className: "text-base font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
3226
+ description ? /* @__PURE__ */ jsx91("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null
3099
3227
  ] }),
3100
- actions ? /* @__PURE__ */ jsx89("div", { className: "flex flex-wrap gap-2", children: actions }) : null
3228
+ actions ? /* @__PURE__ */ jsx91("div", { className: "flex flex-wrap gap-2", children: actions }) : null
3101
3229
  ] }),
3102
- search || filters ? /* @__PURE__ */ jsxs65("div", { className: "mt-4 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between", children: [
3103
- search ? /* @__PURE__ */ jsx89("div", { className: "min-w-0 flex-1", children: search }) : null,
3104
- filters ? /* @__PURE__ */ jsx89("div", { className: "flex flex-wrap gap-2", children: filters }) : null
3230
+ search || filters ? /* @__PURE__ */ jsxs66("div", { className: "mt-4 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between", children: [
3231
+ search ? /* @__PURE__ */ jsx91("div", { className: "min-w-0 flex-1", children: search }) : null,
3232
+ filters ? /* @__PURE__ */ jsx91("div", { className: "flex flex-wrap gap-2", children: filters }) : null
3105
3233
  ] }) : null
3106
3234
  ] });
3107
3235
  }
3108
3236
 
3109
3237
  // src/components/framework/ResourceCard.tsx
3110
- import { Fragment as Fragment5, jsx as jsx90, jsxs as jsxs66 } from "react/jsx-runtime";
3238
+ import { Fragment as Fragment5, jsx as jsx92, jsxs as jsxs67 } from "react/jsx-runtime";
3111
3239
  function ResourceCard({ title, description, eyebrow, icon, meta, status, actions, href, className = "" }) {
3112
- const content = /* @__PURE__ */ jsxs66(Fragment5, { children: [
3113
- /* @__PURE__ */ jsxs66("div", { className: "flex items-start justify-between gap-4", children: [
3114
- /* @__PURE__ */ jsxs66("div", { className: "flex min-w-0 items-start gap-3", children: [
3115
- icon ? /* @__PURE__ */ jsx90("div", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-2 text-[var(--tapiz-accent)]", children: icon }) : null,
3116
- /* @__PURE__ */ jsxs66("div", { className: "min-w-0", children: [
3117
- eyebrow ? /* @__PURE__ */ jsx90("div", { className: "kicker mb-2", children: eyebrow }) : null,
3118
- /* @__PURE__ */ jsx90("h3", { className: "truncate text-base font-semibold text-[var(--tapiz-text-primary)]", children: title }),
3119
- description ? /* @__PURE__ */ jsx90("p", { className: "mt-2 line-clamp-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
3240
+ const content = /* @__PURE__ */ jsxs67(Fragment5, { children: [
3241
+ /* @__PURE__ */ jsxs67("div", { className: "flex items-start justify-between gap-4", children: [
3242
+ /* @__PURE__ */ jsxs67("div", { className: "flex min-w-0 items-start gap-3", children: [
3243
+ icon ? /* @__PURE__ */ jsx92("div", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-2 text-[var(--tapiz-accent)]", children: icon }) : null,
3244
+ /* @__PURE__ */ jsxs67("div", { className: "min-w-0", children: [
3245
+ eyebrow ? /* @__PURE__ */ jsx92("div", { className: "kicker mb-2", children: eyebrow }) : null,
3246
+ /* @__PURE__ */ jsx92("h3", { className: "truncate text-base font-semibold text-[var(--tapiz-text-primary)]", children: title }),
3247
+ description ? /* @__PURE__ */ jsx92("p", { className: "mt-2 line-clamp-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
3120
3248
  ] })
3121
3249
  ] }),
3122
- status ? /* @__PURE__ */ jsx90(Badge, { children: status }) : null
3250
+ status ? /* @__PURE__ */ jsx92(Badge, { children: status }) : null
3123
3251
  ] }),
3124
- meta || actions ? /* @__PURE__ */ jsxs66("div", { className: "mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-[var(--tapiz-border-subtle)] pt-4", children: [
3125
- meta ? /* @__PURE__ */ jsx90("div", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: meta }) : /* @__PURE__ */ jsx90("span", {}),
3126
- actions ? /* @__PURE__ */ jsx90("div", { className: "flex flex-wrap gap-2", children: actions }) : null
3252
+ meta || actions ? /* @__PURE__ */ jsxs67("div", { className: "mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-[var(--tapiz-border-subtle)] pt-4", children: [
3253
+ meta ? /* @__PURE__ */ jsx92("div", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: meta }) : /* @__PURE__ */ jsx92("span", {}),
3254
+ actions ? /* @__PURE__ */ jsx92("div", { className: "flex flex-wrap gap-2", children: actions }) : null
3127
3255
  ] }) : null
3128
3256
  ] });
3129
3257
  const classes = `block border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5 shadow-[var(--tapiz-shadow-sm)] hover:border-[var(--tapiz-border-strong)] hover:shadow-[var(--tapiz-shadow-md)] ${className}`;
3130
- return href ? /* @__PURE__ */ jsx90("a", { href, className: classes, children: content }) : /* @__PURE__ */ jsx90("article", { className: classes, children: content });
3258
+ return href ? /* @__PURE__ */ jsx92("a", { href, className: classes, children: content }) : /* @__PURE__ */ jsx92("article", { className: classes, children: content });
3131
3259
  }
3132
3260
 
3133
3261
  // src/components/framework/IntegrationCard.tsx
3134
- import { jsx as jsx91, jsxs as jsxs67 } from "react/jsx-runtime";
3262
+ import { jsx as jsx93, jsxs as jsxs68 } from "react/jsx-runtime";
3135
3263
  var statusLabel = {
3136
3264
  connected: "Connected",
3137
3265
  disconnected: "Disconnected",
@@ -3145,26 +3273,26 @@ var statusVariant = {
3145
3273
  error: "danger"
3146
3274
  };
3147
3275
  function IntegrationCard({ name, description, logo, status = "disconnected", lastSync, actions, className = "" }) {
3148
- return /* @__PURE__ */ jsxs67("article", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5 ${className}`, children: [
3149
- /* @__PURE__ */ jsxs67("div", { className: "flex items-start justify-between gap-4", children: [
3150
- /* @__PURE__ */ jsxs67("div", { className: "flex items-start gap-3", children: [
3151
- /* @__PURE__ */ jsx91("div", { className: "flex size-11 items-center justify-center border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)] text-[var(--tapiz-accent)]", children: logo ?? /* @__PURE__ */ jsx91("span", { className: "font-mono text-xs", children: "API" }) }),
3152
- /* @__PURE__ */ jsxs67("div", { children: [
3153
- /* @__PURE__ */ jsx91("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: name }),
3154
- description ? /* @__PURE__ */ jsx91("p", { className: "mt-1 text-sm leading-5 text-[var(--tapiz-text-muted)]", children: description }) : null
3276
+ return /* @__PURE__ */ jsxs68("article", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5 ${className}`, children: [
3277
+ /* @__PURE__ */ jsxs68("div", { className: "flex items-start justify-between gap-4", children: [
3278
+ /* @__PURE__ */ jsxs68("div", { className: "flex items-start gap-3", children: [
3279
+ /* @__PURE__ */ jsx93("div", { className: "flex size-11 items-center justify-center border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)] text-[var(--tapiz-accent)]", children: logo ?? /* @__PURE__ */ jsx93("span", { className: "font-mono text-xs", children: "API" }) }),
3280
+ /* @__PURE__ */ jsxs68("div", { children: [
3281
+ /* @__PURE__ */ jsx93("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: name }),
3282
+ description ? /* @__PURE__ */ jsx93("p", { className: "mt-1 text-sm leading-5 text-[var(--tapiz-text-muted)]", children: description }) : null
3155
3283
  ] })
3156
3284
  ] }),
3157
- /* @__PURE__ */ jsx91(StatusBadge, { variant: statusVariant[status], label: statusLabel[status] })
3285
+ /* @__PURE__ */ jsx93(StatusBadge, { variant: statusVariant[status], label: statusLabel[status] })
3158
3286
  ] }),
3159
- /* @__PURE__ */ jsxs67("div", { className: "mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-[var(--tapiz-border-subtle)] pt-4", children: [
3160
- /* @__PURE__ */ jsx91("div", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: lastSync ?? "No sync yet" }),
3161
- actions ? /* @__PURE__ */ jsx91("div", { className: "flex gap-2", children: actions }) : null
3287
+ /* @__PURE__ */ jsxs68("div", { className: "mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-[var(--tapiz-border-subtle)] pt-4", children: [
3288
+ /* @__PURE__ */ jsx93("div", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: lastSync ?? "No sync yet" }),
3289
+ actions ? /* @__PURE__ */ jsx93("div", { className: "flex gap-2", children: actions }) : null
3162
3290
  ] })
3163
3291
  ] });
3164
3292
  }
3165
3293
 
3166
3294
  // src/components/framework/HealthIndicator.tsx
3167
- import { jsx as jsx92, jsxs as jsxs68 } from "react/jsx-runtime";
3295
+ import { jsx as jsx94, jsxs as jsxs69 } from "react/jsx-runtime";
3168
3296
  var toneClasses2 = {
3169
3297
  operational: "bg-[var(--tapiz-success)]",
3170
3298
  degraded: "bg-[var(--tapiz-warning)]",
@@ -3178,34 +3306,34 @@ var defaultLabel = {
3178
3306
  unknown: "Unknown"
3179
3307
  };
3180
3308
  function HealthIndicator({ tone: tone2 = "unknown", label, detail, className = "" }) {
3181
- return /* @__PURE__ */ jsxs68("div", { className: `inline-flex items-center gap-3 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] px-3 py-2 ${className}`, children: [
3182
- /* @__PURE__ */ jsx92("span", { className: `size-2.5 ${toneClasses2[tone2]}`, "aria-hidden": "true" }),
3183
- /* @__PURE__ */ jsx92("span", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: label ?? defaultLabel[tone2] }),
3184
- detail ? /* @__PURE__ */ jsx92("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: detail }) : null
3309
+ return /* @__PURE__ */ jsxs69("div", { className: `inline-flex items-center gap-3 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] px-3 py-2 ${className}`, children: [
3310
+ /* @__PURE__ */ jsx94("span", { className: `size-2.5 ${toneClasses2[tone2]}`, "aria-hidden": "true" }),
3311
+ /* @__PURE__ */ jsx94("span", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: label ?? defaultLabel[tone2] }),
3312
+ detail ? /* @__PURE__ */ jsx94("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: detail }) : null
3185
3313
  ] });
3186
3314
  }
3187
3315
 
3188
3316
  // src/components/framework/AuditLog.tsx
3189
- import { jsx as jsx93, jsxs as jsxs69 } from "react/jsx-runtime";
3317
+ import { jsx as jsx95, jsxs as jsxs70 } from "react/jsx-runtime";
3190
3318
  function AuditLog({ items, className = "" }) {
3191
- return /* @__PURE__ */ jsx93("div", { className: `divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: items.map((item, index) => /* @__PURE__ */ jsxs69("div", { className: "flex gap-3 p-4", children: [
3192
- /* @__PURE__ */ jsx93(Avatar, { name: item.initials ?? item.actor, size: "sm" }),
3193
- /* @__PURE__ */ jsxs69("div", { className: "min-w-0 flex-1", children: [
3194
- /* @__PURE__ */ jsxs69("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
3195
- /* @__PURE__ */ jsxs69("p", { className: "text-sm text-[var(--tapiz-text-secondary)]", children: [
3196
- /* @__PURE__ */ jsx93("strong", { className: "text-[var(--tapiz-text-primary)]", children: item.actor }),
3319
+ return /* @__PURE__ */ jsx95("div", { className: `divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: items.map((item, index) => /* @__PURE__ */ jsxs70("div", { className: "flex gap-3 p-4", children: [
3320
+ /* @__PURE__ */ jsx95(Avatar, { name: item.initials ?? item.actor, size: "sm" }),
3321
+ /* @__PURE__ */ jsxs70("div", { className: "min-w-0 flex-1", children: [
3322
+ /* @__PURE__ */ jsxs70("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
3323
+ /* @__PURE__ */ jsxs70("p", { className: "text-sm text-[var(--tapiz-text-secondary)]", children: [
3324
+ /* @__PURE__ */ jsx95("strong", { className: "text-[var(--tapiz-text-primary)]", children: item.actor }),
3197
3325
  " ",
3198
3326
  item.action
3199
3327
  ] }),
3200
- /* @__PURE__ */ jsx93("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.timestamp })
3328
+ /* @__PURE__ */ jsx95("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.timestamp })
3201
3329
  ] }),
3202
- item.detail ? /* @__PURE__ */ jsx93("div", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: item.detail }) : null
3330
+ item.detail ? /* @__PURE__ */ jsx95("div", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: item.detail }) : null
3203
3331
  ] })
3204
3332
  ] }, index)) });
3205
3333
  }
3206
3334
 
3207
3335
  // src/components/framework/KanbanBoard.tsx
3208
- import { jsx as jsx94, jsxs as jsxs70 } from "react/jsx-runtime";
3336
+ import { jsx as jsx96, jsxs as jsxs71 } from "react/jsx-runtime";
3209
3337
  var toneClasses3 = {
3210
3338
  default: "border-[var(--tapiz-border-subtle)]",
3211
3339
  accent: "border-[var(--tapiz-accent)]",
@@ -3214,65 +3342,65 @@ var toneClasses3 = {
3214
3342
  danger: "border-[var(--tapiz-danger)]"
3215
3343
  };
3216
3344
  function KanbanBoard({ columns, className = "" }) {
3217
- return /* @__PURE__ */ jsx94("div", { className: `grid gap-4 overflow-x-auto md:grid-flow-col md:auto-cols-[minmax(18rem,1fr)] ${className}`, children: columns.map((column) => /* @__PURE__ */ jsxs70("section", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-3", children: [
3218
- /* @__PURE__ */ jsxs70("div", { className: "mb-3 flex items-start justify-between gap-3", children: [
3219
- /* @__PURE__ */ jsxs70("div", { children: [
3220
- /* @__PURE__ */ jsx94("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: column.title }),
3221
- column.description ? /* @__PURE__ */ jsx94("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: column.description }) : null
3345
+ return /* @__PURE__ */ jsx96("div", { className: `grid gap-4 overflow-x-auto md:grid-flow-col md:auto-cols-[minmax(18rem,1fr)] ${className}`, children: columns.map((column) => /* @__PURE__ */ jsxs71("section", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-3", children: [
3346
+ /* @__PURE__ */ jsxs71("div", { className: "mb-3 flex items-start justify-between gap-3", children: [
3347
+ /* @__PURE__ */ jsxs71("div", { children: [
3348
+ /* @__PURE__ */ jsx96("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: column.title }),
3349
+ column.description ? /* @__PURE__ */ jsx96("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: column.description }) : null
3222
3350
  ] }),
3223
- /* @__PURE__ */ jsx94("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: column.items.length })
3351
+ /* @__PURE__ */ jsx96("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: column.items.length })
3224
3352
  ] }),
3225
- /* @__PURE__ */ jsx94("div", { className: "space-y-3", children: column.items.map((item) => /* @__PURE__ */ jsxs70("article", { className: `border-l-2 bg-[var(--tapiz-bg-surface)] p-3 shadow-[var(--tapiz-shadow-sm)] ${toneClasses3[item.tone ?? "default"]}`, children: [
3226
- /* @__PURE__ */ jsx94("h4", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: item.title }),
3227
- item.description ? /* @__PURE__ */ jsx94("p", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: item.description }) : null,
3228
- item.meta ? /* @__PURE__ */ jsx94("div", { className: "mt-3 font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3353
+ /* @__PURE__ */ jsx96("div", { className: "space-y-3", children: column.items.map((item) => /* @__PURE__ */ jsxs71("article", { className: `border-l-2 bg-[var(--tapiz-bg-surface)] p-3 shadow-[var(--tapiz-shadow-sm)] ${toneClasses3[item.tone ?? "default"]}`, children: [
3354
+ /* @__PURE__ */ jsx96("h4", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: item.title }),
3355
+ item.description ? /* @__PURE__ */ jsx96("p", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: item.description }) : null,
3356
+ item.meta ? /* @__PURE__ */ jsx96("div", { className: "mt-3 font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3229
3357
  ] }, item.id)) })
3230
3358
  ] }, column.id)) });
3231
3359
  }
3232
3360
 
3233
3361
  // src/components/framework/AccessMatrix.tsx
3234
- import { jsx as jsx95, jsxs as jsxs71 } from "react/jsx-runtime";
3362
+ import { jsx as jsx97, jsxs as jsxs72 } from "react/jsx-runtime";
3235
3363
  function AccessMatrix({ roles, permissions, className = "" }) {
3236
- return /* @__PURE__ */ jsx95("div", { className: `overflow-x-auto border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: /* @__PURE__ */ jsxs71("table", { className: "min-w-full text-sm", children: [
3237
- /* @__PURE__ */ jsx95("thead", { children: /* @__PURE__ */ jsxs71("tr", { children: [
3238
- /* @__PURE__ */ jsx95("th", { className: "px-4 py-3 text-left", children: "Permission" }),
3239
- roles.map((role) => /* @__PURE__ */ jsx95("th", { className: "px-4 py-3 text-center", children: role.label }, role.key))
3364
+ return /* @__PURE__ */ jsx97("div", { className: `overflow-x-auto border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: /* @__PURE__ */ jsxs72("table", { className: "min-w-full text-sm", children: [
3365
+ /* @__PURE__ */ jsx97("thead", { children: /* @__PURE__ */ jsxs72("tr", { children: [
3366
+ /* @__PURE__ */ jsx97("th", { className: "px-4 py-3 text-left", children: "Permission" }),
3367
+ roles.map((role) => /* @__PURE__ */ jsx97("th", { className: "px-4 py-3 text-center", children: role.label }, role.key))
3240
3368
  ] }) }),
3241
- /* @__PURE__ */ jsx95("tbody", { children: permissions.map((permission) => /* @__PURE__ */ jsxs71("tr", { children: [
3242
- /* @__PURE__ */ jsxs71("td", { className: "px-4 py-3", children: [
3243
- /* @__PURE__ */ jsx95("div", { className: "font-medium text-[var(--tapiz-text-primary)]", children: permission.label }),
3244
- permission.description ? /* @__PURE__ */ jsx95("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: permission.description }) : null
3369
+ /* @__PURE__ */ jsx97("tbody", { children: permissions.map((permission) => /* @__PURE__ */ jsxs72("tr", { children: [
3370
+ /* @__PURE__ */ jsxs72("td", { className: "px-4 py-3", children: [
3371
+ /* @__PURE__ */ jsx97("div", { className: "font-medium text-[var(--tapiz-text-primary)]", children: permission.label }),
3372
+ permission.description ? /* @__PURE__ */ jsx97("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: permission.description }) : null
3245
3373
  ] }),
3246
- roles.map((role) => /* @__PURE__ */ jsx95("td", { className: "px-4 py-3 text-center", children: /* @__PURE__ */ jsx95("span", { className: permission.roles[role.key] ? "text-[var(--tapiz-success)]" : "text-[var(--tapiz-text-disabled)]", children: permission.roles[role.key] ? "\u2713" : "\u2014" }) }, role.key))
3374
+ roles.map((role) => /* @__PURE__ */ jsx97("td", { className: "px-4 py-3 text-center", children: /* @__PURE__ */ jsx97("span", { className: permission.roles[role.key] ? "text-[var(--tapiz-success)]" : "text-[var(--tapiz-text-disabled)]", children: permission.roles[role.key] ? "\u2713" : "\u2014" }) }, role.key))
3247
3375
  ] }, permission.key)) })
3248
3376
  ] }) });
3249
3377
  }
3250
3378
 
3251
3379
  // src/components/framework/CalendarGrid.tsx
3252
- import { jsx as jsx96, jsxs as jsxs72 } from "react/jsx-runtime";
3380
+ import { jsx as jsx98, jsxs as jsxs73 } from "react/jsx-runtime";
3253
3381
  var defaultWeekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
3254
3382
  function CalendarGrid({ days, weekdays = defaultWeekdays, className = "" }) {
3255
- return /* @__PURE__ */ jsxs72("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
3256
- /* @__PURE__ */ jsx96("div", { className: "grid grid-cols-7 border-b border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: weekdays.map((day, index) => /* @__PURE__ */ jsx96("div", { className: "px-3 py-2 font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: day }, index)) }),
3257
- /* @__PURE__ */ jsx96("div", { className: "grid grid-cols-7", children: days.map((day, index) => /* @__PURE__ */ jsxs72("div", { className: `min-h-28 border-b border-r border-[var(--tapiz-border-subtle)] p-2 ${day.muted ? "opacity-45" : ""} ${day.selected ? "bg-[var(--tapiz-accent-soft)]" : ""}`, children: [
3258
- /* @__PURE__ */ jsxs72("div", { className: "flex items-center justify-between gap-2", children: [
3259
- /* @__PURE__ */ jsx96("span", { className: "font-mono text-xs text-[var(--tapiz-text-primary)]", children: day.date }),
3260
- day.label ? /* @__PURE__ */ jsx96("span", { className: "text-[10px] text-[var(--tapiz-text-muted)]", children: day.label }) : null
3383
+ return /* @__PURE__ */ jsxs73("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
3384
+ /* @__PURE__ */ jsx98("div", { className: "grid grid-cols-7 border-b border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: weekdays.map((day, index) => /* @__PURE__ */ jsx98("div", { className: "px-3 py-2 font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: day }, index)) }),
3385
+ /* @__PURE__ */ jsx98("div", { className: "grid grid-cols-7", children: days.map((day, index) => /* @__PURE__ */ jsxs73("div", { className: `min-h-28 border-b border-r border-[var(--tapiz-border-subtle)] p-2 ${day.muted ? "opacity-45" : ""} ${day.selected ? "bg-[var(--tapiz-accent-soft)]" : ""}`, children: [
3386
+ /* @__PURE__ */ jsxs73("div", { className: "flex items-center justify-between gap-2", children: [
3387
+ /* @__PURE__ */ jsx98("span", { className: "font-mono text-xs text-[var(--tapiz-text-primary)]", children: day.date }),
3388
+ day.label ? /* @__PURE__ */ jsx98("span", { className: "text-[10px] text-[var(--tapiz-text-muted)]", children: day.label }) : null
3261
3389
  ] }),
3262
- day.events?.length ? /* @__PURE__ */ jsx96("div", { className: "mt-2 space-y-1", children: day.events.map((event, eventIndex) => /* @__PURE__ */ jsx96("div", { className: "truncate border-l-2 border-[var(--tapiz-accent)] bg-[var(--tapiz-bg-surface-muted)] px-2 py-1 text-[11px] text-[var(--tapiz-text-secondary)]", children: event }, eventIndex)) }) : null
3390
+ day.events?.length ? /* @__PURE__ */ jsx98("div", { className: "mt-2 space-y-1", children: day.events.map((event, eventIndex) => /* @__PURE__ */ jsx98("div", { className: "truncate border-l-2 border-[var(--tapiz-accent)] bg-[var(--tapiz-bg-surface-muted)] px-2 py-1 text-[11px] text-[var(--tapiz-text-secondary)]", children: event }, eventIndex)) }) : null
3263
3391
  ] }, index)) })
3264
3392
  ] });
3265
3393
  }
3266
3394
 
3267
3395
  // src/components/forms/Slider.tsx
3268
- import { jsx as jsx97, jsxs as jsxs73 } from "react/jsx-runtime";
3396
+ import { jsx as jsx99, jsxs as jsxs74 } from "react/jsx-runtime";
3269
3397
  function Slider({ label, valueLabel, className = "", ...props }) {
3270
- return /* @__PURE__ */ jsxs73("label", { className: `block ${className}`, children: [
3271
- label || valueLabel ? /* @__PURE__ */ jsxs73("span", { className: "mb-2 flex items-center justify-between gap-3 text-sm", children: [
3272
- label ? /* @__PURE__ */ jsx97("span", { className: "font-medium text-[var(--tapiz-text-secondary)]", children: label }) : /* @__PURE__ */ jsx97("span", {}),
3273
- valueLabel ? /* @__PURE__ */ jsx97("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: valueLabel }) : null
3398
+ return /* @__PURE__ */ jsxs74("label", { className: `block ${className}`, children: [
3399
+ label || valueLabel ? /* @__PURE__ */ jsxs74("span", { className: "mb-2 flex items-center justify-between gap-3 text-sm", children: [
3400
+ label ? /* @__PURE__ */ jsx99("span", { className: "font-medium text-[var(--tapiz-text-secondary)]", children: label }) : /* @__PURE__ */ jsx99("span", {}),
3401
+ valueLabel ? /* @__PURE__ */ jsx99("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: valueLabel }) : null
3274
3402
  ] }) : null,
3275
- /* @__PURE__ */ jsx97(
3403
+ /* @__PURE__ */ jsx99(
3276
3404
  "input",
3277
3405
  {
3278
3406
  ...props,
@@ -3284,31 +3412,31 @@ function Slider({ label, valueLabel, className = "", ...props }) {
3284
3412
  }
3285
3413
 
3286
3414
  // src/components/forms/FileDropzone.tsx
3287
- import { jsx as jsx98, jsxs as jsxs74 } from "react/jsx-runtime";
3415
+ import { jsx as jsx100, jsxs as jsxs75 } from "react/jsx-runtime";
3288
3416
  function FileDropzone({ title = "Drop files here", description, actionLabel = "Browse", className = "", ...props }) {
3289
- return /* @__PURE__ */ jsxs74("label", { className: `block cursor-pointer border-2 border-dashed border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] p-6 text-center hover:bg-[var(--tapiz-bg-surface-muted)] ${className}`, children: [
3290
- /* @__PURE__ */ jsx98("input", { ...props, type: "file", className: "sr-only" }),
3291
- /* @__PURE__ */ jsx98("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }),
3292
- description ? /* @__PURE__ */ jsx98("span", { className: "mt-2 block text-sm text-[var(--tapiz-text-muted)]", children: description }) : null,
3293
- /* @__PURE__ */ jsx98("span", { className: "mt-4 inline-flex border border-[var(--tapiz-border-strong)] px-3 py-1.5 font-mono text-xs uppercase tracking-[0.12em] text-[var(--tapiz-accent)]", children: actionLabel })
3417
+ return /* @__PURE__ */ jsxs75("label", { className: `block cursor-pointer border-2 border-dashed border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] p-6 text-center hover:bg-[var(--tapiz-bg-surface-muted)] ${className}`, children: [
3418
+ /* @__PURE__ */ jsx100("input", { ...props, type: "file", className: "sr-only" }),
3419
+ /* @__PURE__ */ jsx100("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }),
3420
+ description ? /* @__PURE__ */ jsx100("span", { className: "mt-2 block text-sm text-[var(--tapiz-text-muted)]", children: description }) : null,
3421
+ /* @__PURE__ */ jsx100("span", { className: "mt-4 inline-flex border border-[var(--tapiz-border-strong)] px-3 py-1.5 font-mono text-xs uppercase tracking-[0.12em] text-[var(--tapiz-accent)]", children: actionLabel })
3294
3422
  ] });
3295
3423
  }
3296
3424
 
3297
3425
  // src/components/forms/PasswordInput.tsx
3298
- import { useState as useState8 } from "react";
3299
- import { jsx as jsx99, jsxs as jsxs75 } from "react/jsx-runtime";
3426
+ import { useState as useState10 } from "react";
3427
+ import { jsx as jsx101, jsxs as jsxs76 } from "react/jsx-runtime";
3300
3428
  function PasswordInput({
3301
3429
  revealLabel = "Show password",
3302
3430
  className = "",
3303
3431
  ...props
3304
3432
  }) {
3305
- const [visible, setVisible] = useState8(false);
3306
- return /* @__PURE__ */ jsxs75(
3433
+ const [visible, setVisible] = useState10(false);
3434
+ return /* @__PURE__ */ jsxs76(
3307
3435
  "div",
3308
3436
  {
3309
3437
  className: `flex border border-(--tapiz-border-strong) bg-(--tapiz-bg-surface) focus-within:border-(--tapiz-border-focus) focus-within:shadow-[inset_3px_0_0_0_var(--tapiz-signal)] ${className}`,
3310
3438
  children: [
3311
- /* @__PURE__ */ jsx99(
3439
+ /* @__PURE__ */ jsx101(
3312
3440
  "input",
3313
3441
  {
3314
3442
  ...props,
@@ -3316,7 +3444,7 @@ function PasswordInput({
3316
3444
  className: "min-w-0 flex-1 border-0 bg-transparent px-3 py-2 text-sm text-(--tapiz-text-primary) outline-none focus:shadow-none!"
3317
3445
  }
3318
3446
  ),
3319
- /* @__PURE__ */ jsx99(
3447
+ /* @__PURE__ */ jsx101(
3320
3448
  "button",
3321
3449
  {
3322
3450
  type: "button",
@@ -3325,7 +3453,7 @@ function PasswordInput({
3325
3453
  onClick: () => setVisible((v) => !v),
3326
3454
  tabIndex: -1,
3327
3455
  className: "grid place-items-center px-3 text-(--tapiz-text-muted) transition-colors hover:text-(--tapiz-text-primary)",
3328
- children: visible ? /* @__PURE__ */ jsx99(EyeOff, { size: 15 }) : /* @__PURE__ */ jsx99(Eye, { size: 15 })
3456
+ children: visible ? /* @__PURE__ */ jsx101(EyeOff, { size: 15 }) : /* @__PURE__ */ jsx101(Eye, { size: 15 })
3329
3457
  }
3330
3458
  )
3331
3459
  ]
@@ -3334,12 +3462,12 @@ function PasswordInput({
3334
3462
  }
3335
3463
 
3336
3464
  // src/components/forms/TextareaCounter.tsx
3337
- import { jsx as jsx100, jsxs as jsxs76 } from "react/jsx-runtime";
3465
+ import { jsx as jsx102, jsxs as jsxs77 } from "react/jsx-runtime";
3338
3466
  function TextareaCounter({ maxLength, value = "", className = "", ...props }) {
3339
3467
  const count = value.length;
3340
- return /* @__PURE__ */ jsxs76("div", { className, children: [
3341
- /* @__PURE__ */ jsx100("textarea", { ...props, value, maxLength, className: "input-field min-h-28" }),
3342
- /* @__PURE__ */ jsxs76("div", { className: "mt-1 text-right font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: [
3468
+ return /* @__PURE__ */ jsxs77("div", { className, children: [
3469
+ /* @__PURE__ */ jsx102("textarea", { ...props, value, maxLength, className: "input-field min-h-28" }),
3470
+ /* @__PURE__ */ jsxs77("div", { className: "mt-1 text-right font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: [
3343
3471
  count,
3344
3472
  "/",
3345
3473
  maxLength
@@ -3348,7 +3476,7 @@ function TextareaCounter({ maxLength, value = "", className = "", ...props }) {
3348
3476
  }
3349
3477
 
3350
3478
  // src/components/feedback/Callout.tsx
3351
- import { jsx as jsx101, jsxs as jsxs77 } from "react/jsx-runtime";
3479
+ import { jsx as jsx103, jsxs as jsxs78 } from "react/jsx-runtime";
3352
3480
  var toneClasses4 = {
3353
3481
  info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)]",
3354
3482
  success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
@@ -3357,73 +3485,73 @@ var toneClasses4 = {
3357
3485
  neutral: "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]"
3358
3486
  };
3359
3487
  function Callout({ title, children, tone: tone2 = "info", icon, actions, className = "" }) {
3360
- return /* @__PURE__ */ jsx101("aside", { className: `border-l-4 p-4 ${toneClasses4[tone2]} ${className}`, children: /* @__PURE__ */ jsxs77("div", { className: "flex gap-3", children: [
3361
- icon ? /* @__PURE__ */ jsx101("div", { className: "text-[var(--tapiz-text-primary)]", children: icon }) : null,
3362
- /* @__PURE__ */ jsxs77("div", { className: "min-w-0 flex-1", children: [
3363
- title ? /* @__PURE__ */ jsx101("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
3364
- children ? /* @__PURE__ */ jsx101("div", { className: "mt-1 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children }) : null,
3365
- actions ? /* @__PURE__ */ jsx101("div", { className: "mt-3 flex flex-wrap gap-2", children: actions }) : null
3488
+ return /* @__PURE__ */ jsx103("aside", { className: `border-l-4 p-4 ${toneClasses4[tone2]} ${className}`, children: /* @__PURE__ */ jsxs78("div", { className: "flex gap-3", children: [
3489
+ icon ? /* @__PURE__ */ jsx103("div", { className: "text-[var(--tapiz-text-primary)]", children: icon }) : null,
3490
+ /* @__PURE__ */ jsxs78("div", { className: "min-w-0 flex-1", children: [
3491
+ title ? /* @__PURE__ */ jsx103("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
3492
+ children ? /* @__PURE__ */ jsx103("div", { className: "mt-1 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children }) : null,
3493
+ actions ? /* @__PURE__ */ jsx103("div", { className: "mt-3 flex flex-wrap gap-2", children: actions }) : null
3366
3494
  ] })
3367
3495
  ] }) });
3368
3496
  }
3369
3497
 
3370
3498
  // src/components/feedback/LoadingOverlay.tsx
3371
- import { jsx as jsx102, jsxs as jsxs78 } from "react/jsx-runtime";
3499
+ import { jsx as jsx104, jsxs as jsxs79 } from "react/jsx-runtime";
3372
3500
  function LoadingOverlay({ visible = false, label = "Loading", children, className = "" }) {
3373
- return /* @__PURE__ */ jsxs78("div", { className: `relative ${className}`, children: [
3501
+ return /* @__PURE__ */ jsxs79("div", { className: `relative ${className}`, children: [
3374
3502
  children,
3375
- visible ? /* @__PURE__ */ jsx102("div", { className: "absolute inset-0 grid place-items-center border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-overlay)] backdrop-blur-sm", children: /* @__PURE__ */ jsxs78("div", { className: "flex items-center gap-3 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] px-4 py-3 text-sm text-[var(--tapiz-text-primary)] shadow-[var(--tapiz-shadow-brutal)]", children: [
3376
- /* @__PURE__ */ jsx102(Spinner, {}),
3377
- /* @__PURE__ */ jsx102("span", { children: label })
3503
+ visible ? /* @__PURE__ */ jsx104("div", { className: "absolute inset-0 grid place-items-center border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-overlay)] backdrop-blur-sm", children: /* @__PURE__ */ jsxs79("div", { className: "flex items-center gap-3 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] px-4 py-3 text-sm text-[var(--tapiz-text-primary)] shadow-[var(--tapiz-shadow-brutal)]", children: [
3504
+ /* @__PURE__ */ jsx104(Spinner, {}),
3505
+ /* @__PURE__ */ jsx104("span", { children: label })
3378
3506
  ] }) }) : null
3379
3507
  ] });
3380
3508
  }
3381
3509
 
3382
3510
  // src/components/feedback/NotificationList.tsx
3383
- import { jsx as jsx103, jsxs as jsxs79 } from "react/jsx-runtime";
3511
+ import { jsx as jsx105, jsxs as jsxs80 } from "react/jsx-runtime";
3384
3512
  function NotificationList({ items, className = "" }) {
3385
- return /* @__PURE__ */ jsx103("div", { className: `divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: items.map((item) => /* @__PURE__ */ jsxs79("article", { className: "flex gap-3 p-4", children: [
3386
- /* @__PURE__ */ jsx103("span", { className: `mt-1 size-2.5 ${item.unread ? "bg-[var(--tapiz-accent)]" : "bg-[var(--tapiz-border-subtle)]"}`, "aria-hidden": "true" }),
3387
- /* @__PURE__ */ jsxs79("div", { className: "min-w-0 flex-1", children: [
3388
- /* @__PURE__ */ jsxs79("div", { className: "flex items-start justify-between gap-3", children: [
3389
- /* @__PURE__ */ jsx103("h3", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: item.title }),
3390
- item.time ? /* @__PURE__ */ jsx103("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.time }) : null
3513
+ return /* @__PURE__ */ jsx105("div", { className: `divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: items.map((item) => /* @__PURE__ */ jsxs80("article", { className: "flex gap-3 p-4", children: [
3514
+ /* @__PURE__ */ jsx105("span", { className: `mt-1 size-2.5 ${item.unread ? "bg-[var(--tapiz-accent)]" : "bg-[var(--tapiz-border-subtle)]"}`, "aria-hidden": "true" }),
3515
+ /* @__PURE__ */ jsxs80("div", { className: "min-w-0 flex-1", children: [
3516
+ /* @__PURE__ */ jsxs80("div", { className: "flex items-start justify-between gap-3", children: [
3517
+ /* @__PURE__ */ jsx105("h3", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: item.title }),
3518
+ item.time ? /* @__PURE__ */ jsx105("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.time }) : null
3391
3519
  ] }),
3392
- item.description ? /* @__PURE__ */ jsx103("p", { className: "mt-1 text-sm leading-5 text-[var(--tapiz-text-muted)]", children: item.description }) : null,
3393
- item.action ? /* @__PURE__ */ jsx103("div", { className: "mt-3", children: item.action }) : null
3520
+ item.description ? /* @__PURE__ */ jsx105("p", { className: "mt-1 text-sm leading-5 text-[var(--tapiz-text-muted)]", children: item.description }) : null,
3521
+ item.action ? /* @__PURE__ */ jsx105("div", { className: "mt-3", children: item.action }) : null
3394
3522
  ] })
3395
3523
  ] }, item.id)) });
3396
3524
  }
3397
3525
 
3398
3526
  // src/components/layout/MasonryGrid.tsx
3399
- import { jsx as jsx104 } from "react/jsx-runtime";
3527
+ import { jsx as jsx106 } from "react/jsx-runtime";
3400
3528
  var columnClasses = { 2: "md:columns-2", 3: "md:columns-2 xl:columns-3", 4: "md:columns-2 lg:columns-3 xl:columns-4" };
3401
3529
  var gapClasses4 = { sm: "gap-3", md: "gap-5", lg: "gap-8" };
3402
3530
  function MasonryGrid({ children, columns = 3, gap = "md", className = "", style }) {
3403
- return /* @__PURE__ */ jsx104("div", { className: [columnClasses[columns], gapClasses4[gap], className].filter(Boolean).join(" "), style, children });
3531
+ return /* @__PURE__ */ jsx106("div", { className: [columnClasses[columns], gapClasses4[gap], className].filter(Boolean).join(" "), style, children });
3404
3532
  }
3405
3533
 
3406
3534
  // src/components/layout/PageRail.tsx
3407
- import { Fragment as Fragment6, jsx as jsx105, jsxs as jsxs80 } from "react/jsx-runtime";
3535
+ import { Fragment as Fragment6, jsx as jsx107, jsxs as jsxs81 } from "react/jsx-runtime";
3408
3536
  function PageRail({ title, items, actions, className = "", style }) {
3409
- return /* @__PURE__ */ jsxs80("aside", { className: ["sticky top-20 rounded-none border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-3 shadow-[var(--tapiz-shadow-sm)]", className].filter(Boolean).join(" "), style, children: [
3410
- title ? /* @__PURE__ */ jsx105("div", { className: "kicker mb-3 px-2", children: title }) : null,
3411
- /* @__PURE__ */ jsx105("nav", { className: "flex flex-col gap-1", children: items.map((item, index) => {
3412
- const content = /* @__PURE__ */ jsxs80(Fragment6, { children: [
3413
- /* @__PURE__ */ jsx105("span", { className: "truncate", children: item.label }),
3414
- item.meta ? /* @__PURE__ */ jsx105("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3537
+ return /* @__PURE__ */ jsxs81("aside", { className: ["sticky top-20 rounded-none border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-3 shadow-[var(--tapiz-shadow-sm)]", className].filter(Boolean).join(" "), style, children: [
3538
+ title ? /* @__PURE__ */ jsx107("div", { className: "kicker mb-3 px-2", children: title }) : null,
3539
+ /* @__PURE__ */ jsx107("nav", { className: "flex flex-col gap-1", children: items.map((item, index) => {
3540
+ const content = /* @__PURE__ */ jsxs81(Fragment6, { children: [
3541
+ /* @__PURE__ */ jsx107("span", { className: "truncate", children: item.label }),
3542
+ item.meta ? /* @__PURE__ */ jsx107("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3415
3543
  ] });
3416
3544
  const classes = ["flex items-center justify-between gap-3 border px-3 py-2 text-sm transition", item.active ? "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-text-primary)]" : "border-transparent text-[var(--tapiz-text-muted)] hover:border-[var(--tapiz-border-subtle)] hover:text-[var(--tapiz-text-primary)]"].join(" ");
3417
- return item.href ? /* @__PURE__ */ jsx105("a", { href: item.href, className: classes, children: content }, index) : /* @__PURE__ */ jsx105("div", { className: classes, children: content }, index);
3545
+ return item.href ? /* @__PURE__ */ jsx107("a", { href: item.href, className: classes, children: content }, index) : /* @__PURE__ */ jsx107("div", { className: classes, children: content }, index);
3418
3546
  }) }),
3419
- actions ? /* @__PURE__ */ jsx105("div", { className: "mt-3 border-t border-[var(--tapiz-border-subtle)] pt-3", children: actions }) : null
3547
+ actions ? /* @__PURE__ */ jsx107("div", { className: "mt-3 border-t border-[var(--tapiz-border-subtle)] pt-3", children: actions }) : null
3420
3548
  ] });
3421
3549
  }
3422
3550
 
3423
3551
  // src/components/layout/StickyBar.tsx
3424
- import { jsx as jsx106 } from "react/jsx-runtime";
3552
+ import { jsx as jsx108 } from "react/jsx-runtime";
3425
3553
  function StickyBar({ children, position = "top", className = "", style }) {
3426
- return /* @__PURE__ */ jsx106(
3554
+ return /* @__PURE__ */ jsx108(
3427
3555
  "div",
3428
3556
  {
3429
3557
  className: ["z-30 border-[var(--tapiz-border-subtle)] bg-[color-mix(in_srgb,var(--tapiz-bg-canvas)_88%,transparent)] px-4 py-3 backdrop-blur-xl", position === "top" ? "sticky top-0 border-b" : "sticky bottom-0 border-t", className].filter(Boolean).join(" "),
@@ -3434,191 +3562,191 @@ function StickyBar({ children, position = "top", className = "", style }) {
3434
3562
  }
3435
3563
 
3436
3564
  // src/components/forms/Combobox.tsx
3437
- import { jsx as jsx107, jsxs as jsxs81 } from "react/jsx-runtime";
3565
+ import { jsx as jsx109, jsxs as jsxs82 } from "react/jsx-runtime";
3438
3566
  function Combobox({ options, placeholder = "Select option", invalid = false, className = "", ...props }) {
3439
- return /* @__PURE__ */ jsxs81("select", { ...props, className: ["input-field appearance-none bg-[var(--tapiz-bg-surface)]", invalid ? "border-warn focus:border-warn" : "", className].filter(Boolean).join(" "), children: [
3440
- /* @__PURE__ */ jsx107("option", { value: "", children: placeholder }),
3441
- options.map((option) => /* @__PURE__ */ jsx107("option", { value: option.value, children: String(option.label) }, option.value))
3567
+ return /* @__PURE__ */ jsxs82("select", { ...props, className: ["input-field appearance-none bg-[var(--tapiz-bg-surface)]", invalid ? "border-warn focus:border-warn" : "", className].filter(Boolean).join(" "), children: [
3568
+ /* @__PURE__ */ jsx109("option", { value: "", children: placeholder }),
3569
+ options.map((option) => /* @__PURE__ */ jsx109("option", { value: option.value, children: String(option.label) }, option.value))
3442
3570
  ] });
3443
3571
  }
3444
3572
 
3445
3573
  // src/components/forms/DateRangePicker.tsx
3446
- import { jsx as jsx108, jsxs as jsxs82 } from "react/jsx-runtime";
3574
+ import { jsx as jsx110, jsxs as jsxs83 } from "react/jsx-runtime";
3447
3575
  function DateRangePicker({ startLabel = "From", endLabel = "To", startProps, endProps, className = "" }) {
3448
- return /* @__PURE__ */ jsxs82("div", { className: ["grid gap-3 md:grid-cols-2", className].filter(Boolean).join(" "), children: [
3449
- /* @__PURE__ */ jsxs82("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
3450
- /* @__PURE__ */ jsx108("span", { children: startLabel }),
3451
- /* @__PURE__ */ jsx108("input", { type: "date", ...startProps, className: ["input-field", startProps?.className || ""].join(" ") })
3576
+ return /* @__PURE__ */ jsxs83("div", { className: ["grid gap-3 md:grid-cols-2", className].filter(Boolean).join(" "), children: [
3577
+ /* @__PURE__ */ jsxs83("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
3578
+ /* @__PURE__ */ jsx110("span", { children: startLabel }),
3579
+ /* @__PURE__ */ jsx110("input", { type: "date", ...startProps, className: ["input-field", startProps?.className || ""].join(" ") })
3452
3580
  ] }),
3453
- /* @__PURE__ */ jsxs82("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
3454
- /* @__PURE__ */ jsx108("span", { children: endLabel }),
3455
- /* @__PURE__ */ jsx108("input", { type: "date", ...endProps, className: ["input-field", endProps?.className || ""].join(" ") })
3581
+ /* @__PURE__ */ jsxs83("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
3582
+ /* @__PURE__ */ jsx110("span", { children: endLabel }),
3583
+ /* @__PURE__ */ jsx110("input", { type: "date", ...endProps, className: ["input-field", endProps?.className || ""].join(" ") })
3456
3584
  ] })
3457
3585
  ] });
3458
3586
  }
3459
3587
 
3460
3588
  // src/components/forms/ColorSwatchPicker.tsx
3461
- import { jsx as jsx109, jsxs as jsxs83 } from "react/jsx-runtime";
3589
+ import { jsx as jsx111, jsxs as jsxs84 } from "react/jsx-runtime";
3462
3590
  function ColorSwatchPicker({ options, value, onChange, className = "" }) {
3463
- return /* @__PURE__ */ jsx109("div", { className: ["flex flex-wrap gap-2", className].filter(Boolean).join(" "), children: options.map((option) => {
3591
+ return /* @__PURE__ */ jsx111("div", { className: ["flex flex-wrap gap-2", className].filter(Boolean).join(" "), children: options.map((option) => {
3464
3592
  const selected = option.value === value;
3465
- return /* @__PURE__ */ jsxs83("button", { type: "button", "aria-pressed": selected, onClick: () => onChange?.(option.value), className: ["flex items-center gap-2 border px-3 py-2 text-sm transition", selected ? "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)]" : "border-[var(--tapiz-border-subtle)] hover:border-[var(--tapiz-border-strong)]"].join(" "), children: [
3466
- /* @__PURE__ */ jsx109("span", { className: "h-4 w-4 border border-[var(--tapiz-border-strong)]", style: { background: option.color } }),
3467
- /* @__PURE__ */ jsx109("span", { children: option.label })
3593
+ return /* @__PURE__ */ jsxs84("button", { type: "button", "aria-pressed": selected, onClick: () => onChange?.(option.value), className: ["flex items-center gap-2 border px-3 py-2 text-sm transition", selected ? "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)]" : "border-[var(--tapiz-border-subtle)] hover:border-[var(--tapiz-border-strong)]"].join(" "), children: [
3594
+ /* @__PURE__ */ jsx111("span", { className: "h-4 w-4 border border-[var(--tapiz-border-strong)]", style: { background: option.color } }),
3595
+ /* @__PURE__ */ jsx111("span", { children: option.label })
3468
3596
  ] }, option.value);
3469
3597
  }) });
3470
3598
  }
3471
3599
 
3472
3600
  // src/components/forms/RatingInput.tsx
3473
- import { jsx as jsx110 } from "react/jsx-runtime";
3601
+ import { jsx as jsx112 } from "react/jsx-runtime";
3474
3602
  function RatingInput({ value = 0, max = 5, icon = "\u2605", onChange, label = "Rating", className = "" }) {
3475
- return /* @__PURE__ */ jsx110("div", { className: ["inline-flex items-center gap-1", className].filter(Boolean).join(" "), role: "radiogroup", "aria-label": label, children: Array.from({ length: max }, (_, index) => {
3603
+ return /* @__PURE__ */ jsx112("div", { className: ["inline-flex items-center gap-1", className].filter(Boolean).join(" "), role: "radiogroup", "aria-label": label, children: Array.from({ length: max }, (_, index) => {
3476
3604
  const score = index + 1;
3477
3605
  const active = score <= value;
3478
- return /* @__PURE__ */ jsx110("button", { type: "button", role: "radio", "aria-checked": active, onClick: () => onChange?.(score), className: ["grid h-9 w-9 place-items-center border text-base transition", active ? "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-accent)]" : "border-[var(--tapiz-border-subtle)] text-[var(--tapiz-text-muted)] hover:border-[var(--tapiz-border-strong)]"].join(" "), children: icon }, score);
3606
+ return /* @__PURE__ */ jsx112("button", { type: "button", role: "radio", "aria-checked": active, onClick: () => onChange?.(score), className: ["grid h-9 w-9 place-items-center border text-base transition", active ? "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-accent)]" : "border-[var(--tapiz-border-subtle)] text-[var(--tapiz-text-muted)] hover:border-[var(--tapiz-border-strong)]"].join(" "), children: icon }, score);
3479
3607
  }) });
3480
3608
  }
3481
3609
 
3482
3610
  // src/components/data-display/ScoreRing.tsx
3483
- import { jsx as jsx111, jsxs as jsxs84 } from "react/jsx-runtime";
3611
+ import { jsx as jsx113, jsxs as jsxs85 } from "react/jsx-runtime";
3484
3612
  function ScoreRing({ value, max = 100, label, size = 112, className = "" }) {
3485
3613
  const normalized = Math.max(0, Math.min(1, value / max));
3486
3614
  const radius = 42;
3487
3615
  const circumference = 2 * Math.PI * radius;
3488
3616
  const dash = circumference * normalized;
3489
- return /* @__PURE__ */ jsxs84("div", { className: ["inline-grid place-items-center", className].filter(Boolean).join(" "), style: { width: size, height: size }, children: [
3490
- /* @__PURE__ */ jsxs84("svg", { viewBox: "0 0 100 100", className: "h-full w-full -rotate-90", children: [
3491
- /* @__PURE__ */ jsx111("circle", { cx: "50", cy: "50", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
3492
- /* @__PURE__ */ jsx111("circle", { cx: "50", cy: "50", r: radius, fill: "none", stroke: "var(--tapiz-accent)", strokeWidth: "10", strokeLinecap: "square", strokeDasharray: `${dash} ${circumference - dash}` })
3617
+ return /* @__PURE__ */ jsxs85("div", { className: ["inline-grid place-items-center", className].filter(Boolean).join(" "), style: { width: size, height: size }, children: [
3618
+ /* @__PURE__ */ jsxs85("svg", { viewBox: "0 0 100 100", className: "h-full w-full -rotate-90", children: [
3619
+ /* @__PURE__ */ jsx113("circle", { cx: "50", cy: "50", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
3620
+ /* @__PURE__ */ jsx113("circle", { cx: "50", cy: "50", r: radius, fill: "none", stroke: "var(--tapiz-accent)", strokeWidth: "10", strokeLinecap: "square", strokeDasharray: `${dash} ${circumference - dash}` })
3493
3621
  ] }),
3494
- /* @__PURE__ */ jsxs84("div", { className: "absolute text-center", children: [
3495
- /* @__PURE__ */ jsxs84("div", { className: "font-display text-2xl font-semibold text-[var(--tapiz-text-primary)]", children: [
3622
+ /* @__PURE__ */ jsxs85("div", { className: "absolute text-center", children: [
3623
+ /* @__PURE__ */ jsxs85("div", { className: "font-display text-2xl font-semibold text-[var(--tapiz-text-primary)]", children: [
3496
3624
  Math.round(normalized * 100),
3497
3625
  "%"
3498
3626
  ] }),
3499
- label ? /* @__PURE__ */ jsx111("div", { className: "font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: label }) : null
3627
+ label ? /* @__PURE__ */ jsx113("div", { className: "font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: label }) : null
3500
3628
  ] })
3501
3629
  ] });
3502
3630
  }
3503
3631
 
3504
3632
  // src/components/data-display/HeatmapGrid.tsx
3505
- import { jsx as jsx112 } from "react/jsx-runtime";
3633
+ import { jsx as jsx114 } from "react/jsx-runtime";
3506
3634
  function HeatmapGrid({ cells, columns = 7, max, className = "" }) {
3507
3635
  const peak = max ?? Math.max(1, ...cells.map((cell) => cell.value));
3508
- return /* @__PURE__ */ jsx112("div", { className: ["grid gap-1", className].filter(Boolean).join(" "), style: { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }, children: cells.map((cell, index) => {
3636
+ return /* @__PURE__ */ jsx114("div", { className: ["grid gap-1", className].filter(Boolean).join(" "), style: { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }, children: cells.map((cell, index) => {
3509
3637
  const opacity = 0.15 + Math.min(1, cell.value / peak) * 0.75;
3510
- return /* @__PURE__ */ jsx112("div", { title: cell.title, className: "aspect-square border border-[var(--tapiz-border-subtle)]", style: { background: `color-mix(in srgb, var(--tapiz-accent) ${Math.round(opacity * 100)}%, transparent)` }, children: cell.label ? /* @__PURE__ */ jsx112("span", { className: "sr-only", children: cell.label }) : null }, index);
3638
+ return /* @__PURE__ */ jsx114("div", { title: cell.title, className: "aspect-square border border-[var(--tapiz-border-subtle)]", style: { background: `color-mix(in srgb, var(--tapiz-accent) ${Math.round(opacity * 100)}%, transparent)` }, children: cell.label ? /* @__PURE__ */ jsx114("span", { className: "sr-only", children: cell.label }) : null }, index);
3511
3639
  }) });
3512
3640
  }
3513
3641
 
3514
3642
  // src/components/data-display/FunnelChart.tsx
3515
- import { jsx as jsx113, jsxs as jsxs85 } from "react/jsx-runtime";
3643
+ import { jsx as jsx115, jsxs as jsxs86 } from "react/jsx-runtime";
3516
3644
  function FunnelChart({ steps, className = "" }) {
3517
3645
  const max = Math.max(1, ...steps.map((step) => step.value));
3518
- return /* @__PURE__ */ jsx113("div", { className: ["space-y-3", className].filter(Boolean).join(" "), children: steps.map((step, index) => {
3646
+ return /* @__PURE__ */ jsx115("div", { className: ["space-y-3", className].filter(Boolean).join(" "), children: steps.map((step, index) => {
3519
3647
  const width = Math.max(8, step.value / max * 100);
3520
- return /* @__PURE__ */ jsxs85("div", { children: [
3521
- /* @__PURE__ */ jsxs85("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
3522
- /* @__PURE__ */ jsx113("span", { className: "font-medium text-[var(--tapiz-text-primary)]", children: step.label }),
3523
- /* @__PURE__ */ jsxs85("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
3648
+ return /* @__PURE__ */ jsxs86("div", { children: [
3649
+ /* @__PURE__ */ jsxs86("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
3650
+ /* @__PURE__ */ jsx115("span", { className: "font-medium text-[var(--tapiz-text-primary)]", children: step.label }),
3651
+ /* @__PURE__ */ jsxs86("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
3524
3652
  step.value,
3525
3653
  step.meta ? ` \xB7 ${String(step.meta)}` : ""
3526
3654
  ] })
3527
3655
  ] }),
3528
- /* @__PURE__ */ jsx113("div", { className: "h-9 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx113("div", { className: "h-full border-r border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)]", style: { width: `${width}%` } }) })
3656
+ /* @__PURE__ */ jsx115("div", { className: "h-9 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx115("div", { className: "h-full border-r border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)]", style: { width: `${width}%` } }) })
3529
3657
  ] }, index);
3530
3658
  }) });
3531
3659
  }
3532
3660
 
3533
3661
  // src/components/data-display/ComparisonMeter.tsx
3534
- import { jsx as jsx114, jsxs as jsxs86 } from "react/jsx-runtime";
3662
+ import { jsx as jsx116, jsxs as jsxs87 } from "react/jsx-runtime";
3535
3663
  function ComparisonMeter({ leftLabel, rightLabel, value, className = "" }) {
3536
3664
  const clamped = Math.max(0, Math.min(100, value));
3537
- return /* @__PURE__ */ jsxs86("div", { className, children: [
3538
- /* @__PURE__ */ jsxs86("div", { className: "mb-2 flex justify-between gap-3 text-sm text-[var(--tapiz-text-muted)]", children: [
3539
- /* @__PURE__ */ jsx114("span", { children: leftLabel }),
3540
- /* @__PURE__ */ jsx114("span", { children: rightLabel })
3665
+ return /* @__PURE__ */ jsxs87("div", { className, children: [
3666
+ /* @__PURE__ */ jsxs87("div", { className: "mb-2 flex justify-between gap-3 text-sm text-[var(--tapiz-text-muted)]", children: [
3667
+ /* @__PURE__ */ jsx116("span", { children: leftLabel }),
3668
+ /* @__PURE__ */ jsx116("span", { children: rightLabel })
3541
3669
  ] }),
3542
- /* @__PURE__ */ jsxs86("div", { className: "relative h-3 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]", children: [
3543
- /* @__PURE__ */ jsx114("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${clamped}%` } }),
3544
- /* @__PURE__ */ jsx114("div", { className: "absolute top-[-6px] h-6 w-px bg-[var(--tapiz-border-strong)]", style: { left: `${clamped}%` } })
3670
+ /* @__PURE__ */ jsxs87("div", { className: "relative h-3 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]", children: [
3671
+ /* @__PURE__ */ jsx116("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${clamped}%` } }),
3672
+ /* @__PURE__ */ jsx116("div", { className: "absolute top-[-6px] h-6 w-px bg-[var(--tapiz-border-strong)]", style: { left: `${clamped}%` } })
3545
3673
  ] })
3546
3674
  ] });
3547
3675
  }
3548
3676
 
3549
3677
  // src/components/framework/ActivityFeed.tsx
3550
- import { jsx as jsx115, jsxs as jsxs87 } from "react/jsx-runtime";
3678
+ import { jsx as jsx117, jsxs as jsxs88 } from "react/jsx-runtime";
3551
3679
  function ActivityFeed({ items, className = "" }) {
3552
- return /* @__PURE__ */ jsx115("div", { className: ["divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)]", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsxs87("div", { className: "flex gap-3 p-4", children: [
3553
- /* @__PURE__ */ jsx115(Avatar, { name: item.actor, src: item.avatarUrl, size: "sm" }),
3554
- /* @__PURE__ */ jsxs87("div", { className: "min-w-0 flex-1", children: [
3555
- /* @__PURE__ */ jsxs87("p", { className: "text-sm text-[var(--tapiz-text-primary)]", children: [
3556
- /* @__PURE__ */ jsx115("strong", { children: item.actor }),
3680
+ return /* @__PURE__ */ jsx117("div", { className: ["divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)]", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsxs88("div", { className: "flex gap-3 p-4", children: [
3681
+ /* @__PURE__ */ jsx117(Avatar, { name: item.actor, src: item.avatarUrl, size: "sm" }),
3682
+ /* @__PURE__ */ jsxs88("div", { className: "min-w-0 flex-1", children: [
3683
+ /* @__PURE__ */ jsxs88("p", { className: "text-sm text-[var(--tapiz-text-primary)]", children: [
3684
+ /* @__PURE__ */ jsx117("strong", { children: item.actor }),
3557
3685
  " ",
3558
3686
  item.action
3559
3687
  ] }),
3560
- item.meta ? /* @__PURE__ */ jsx115("div", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3688
+ item.meta ? /* @__PURE__ */ jsx117("div", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3561
3689
  ] }),
3562
- item.time ? /* @__PURE__ */ jsx115("div", { className: "font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: item.time }) : null
3690
+ item.time ? /* @__PURE__ */ jsx117("div", { className: "font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: item.time }) : null
3563
3691
  ] }, index)) });
3564
3692
  }
3565
3693
 
3566
3694
  // src/components/framework/InboxList.tsx
3567
- import { jsx as jsx116, jsxs as jsxs88 } from "react/jsx-runtime";
3695
+ import { jsx as jsx118, jsxs as jsxs89 } from "react/jsx-runtime";
3568
3696
  function InboxList({ items, className = "" }) {
3569
- return /* @__PURE__ */ jsx116("div", { className: ["divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)]", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsxs88("article", { className: ["p-4 transition hover:bg-[var(--tapiz-bg-surface-muted)]", item.unread ? "border-l-4 border-l-[var(--tapiz-accent)]" : ""].join(" "), children: [
3570
- /* @__PURE__ */ jsxs88("div", { className: "flex items-start justify-between gap-3", children: [
3571
- /* @__PURE__ */ jsxs88("div", { className: "min-w-0", children: [
3572
- /* @__PURE__ */ jsx116("h3", { className: "truncate text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
3573
- item.sender ? /* @__PURE__ */ jsx116("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.sender }) : null
3697
+ return /* @__PURE__ */ jsx118("div", { className: ["divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)]", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsxs89("article", { className: ["p-4 transition hover:bg-[var(--tapiz-bg-surface-muted)]", item.unread ? "border-l-4 border-l-[var(--tapiz-accent)]" : ""].join(" "), children: [
3698
+ /* @__PURE__ */ jsxs89("div", { className: "flex items-start justify-between gap-3", children: [
3699
+ /* @__PURE__ */ jsxs89("div", { className: "min-w-0", children: [
3700
+ /* @__PURE__ */ jsx118("h3", { className: "truncate text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
3701
+ item.sender ? /* @__PURE__ */ jsx118("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.sender }) : null
3574
3702
  ] }),
3575
- /* @__PURE__ */ jsxs88("div", { className: "flex shrink-0 items-center gap-2", children: [
3576
- item.tag ? /* @__PURE__ */ jsx116(Badge, { children: item.tag }) : null,
3577
- item.time ? /* @__PURE__ */ jsx116("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.time }) : null
3703
+ /* @__PURE__ */ jsxs89("div", { className: "flex shrink-0 items-center gap-2", children: [
3704
+ item.tag ? /* @__PURE__ */ jsx118(Badge, { children: item.tag }) : null,
3705
+ item.time ? /* @__PURE__ */ jsx118("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.time }) : null
3578
3706
  ] })
3579
3707
  ] }),
3580
- item.snippet ? /* @__PURE__ */ jsx116("p", { className: "mt-2 line-clamp-2 text-sm text-[var(--tapiz-text-muted)]", children: item.snippet }) : null
3708
+ item.snippet ? /* @__PURE__ */ jsx118("p", { className: "mt-2 line-clamp-2 text-sm text-[var(--tapiz-text-muted)]", children: item.snippet }) : null
3581
3709
  ] }, index)) });
3582
3710
  }
3583
3711
 
3584
3712
  // src/components/framework/ApprovalQueue.tsx
3585
- import { jsx as jsx117, jsxs as jsxs89 } from "react/jsx-runtime";
3713
+ import { jsx as jsx119, jsxs as jsxs90 } from "react/jsx-runtime";
3586
3714
  function ApprovalQueue({ items, onApprove, onReject, className = "" }) {
3587
- return /* @__PURE__ */ jsx117("div", { className: ["space-y-3", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsx117("article", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4", children: /* @__PURE__ */ jsxs89("div", { className: "flex flex-col gap-4 md:flex-row md:items-start md:justify-between", children: [
3588
- /* @__PURE__ */ jsxs89("div", { children: [
3589
- /* @__PURE__ */ jsxs89("div", { className: "flex flex-wrap items-center gap-2", children: [
3590
- /* @__PURE__ */ jsx117("h3", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
3591
- item.priority ? /* @__PURE__ */ jsx117(Badge, { variant: item.priority === "high" ? "danger" : item.priority === "medium" ? "warning" : "default", children: item.priority }) : null
3715
+ return /* @__PURE__ */ jsx119("div", { className: ["space-y-3", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsx119("article", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4", children: /* @__PURE__ */ jsxs90("div", { className: "flex flex-col gap-4 md:flex-row md:items-start md:justify-between", children: [
3716
+ /* @__PURE__ */ jsxs90("div", { children: [
3717
+ /* @__PURE__ */ jsxs90("div", { className: "flex flex-wrap items-center gap-2", children: [
3718
+ /* @__PURE__ */ jsx119("h3", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
3719
+ item.priority ? /* @__PURE__ */ jsx119(Badge, { variant: item.priority === "high" ? "danger" : item.priority === "medium" ? "warning" : "default", children: item.priority }) : null
3592
3720
  ] }),
3593
- item.requester ? /* @__PURE__ */ jsxs89("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: [
3721
+ item.requester ? /* @__PURE__ */ jsxs90("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: [
3594
3722
  "Requested by ",
3595
3723
  item.requester
3596
3724
  ] }) : null,
3597
- item.description ? /* @__PURE__ */ jsx117("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: item.description }) : null
3725
+ item.description ? /* @__PURE__ */ jsx119("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: item.description }) : null
3598
3726
  ] }),
3599
- /* @__PURE__ */ jsxs89("div", { className: "flex gap-2", children: [
3600
- /* @__PURE__ */ jsx117(Button, { size: "sm", variant: "secondary", onClick: () => onReject?.(index), children: "Reject" }),
3601
- /* @__PURE__ */ jsx117(Button, { size: "sm", onClick: () => onApprove?.(index), children: "Approve" })
3727
+ /* @__PURE__ */ jsxs90("div", { className: "flex gap-2", children: [
3728
+ /* @__PURE__ */ jsx119(Button, { size: "sm", variant: "secondary", onClick: () => onReject?.(index), children: "Reject" }),
3729
+ /* @__PURE__ */ jsx119(Button, { size: "sm", onClick: () => onApprove?.(index), children: "Approve" })
3602
3730
  ] })
3603
3731
  ] }) }, index)) });
3604
3732
  }
3605
3733
 
3606
3734
  // src/components/framework/SLAStatus.tsx
3607
- import { jsx as jsx118, jsxs as jsxs90 } from "react/jsx-runtime";
3735
+ import { jsx as jsx120, jsxs as jsxs91 } from "react/jsx-runtime";
3608
3736
  function SLAStatus({ label, value, target = 95, className = "" }) {
3609
3737
  const ok = value >= target;
3610
- return /* @__PURE__ */ jsxs90("div", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4", className].filter(Boolean).join(" "), children: [
3611
- /* @__PURE__ */ jsxs90("div", { className: "flex items-center justify-between gap-3", children: [
3612
- /* @__PURE__ */ jsx118("span", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: label }),
3613
- /* @__PURE__ */ jsx118("span", { className: ["font-mono text-xs", ok ? "text-[var(--tapiz-success)]" : "text-[var(--tapiz-warning)]"].join(" "), children: ok ? "Within SLA" : "At risk" })
3738
+ return /* @__PURE__ */ jsxs91("div", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4", className].filter(Boolean).join(" "), children: [
3739
+ /* @__PURE__ */ jsxs91("div", { className: "flex items-center justify-between gap-3", children: [
3740
+ /* @__PURE__ */ jsx120("span", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: label }),
3741
+ /* @__PURE__ */ jsx120("span", { className: ["font-mono text-xs", ok ? "text-[var(--tapiz-success)]" : "text-[var(--tapiz-warning)]"].join(" "), children: ok ? "Within SLA" : "At risk" })
3614
3742
  ] }),
3615
- /* @__PURE__ */ jsx118("div", { className: "mt-3 h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx118("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${Math.max(0, Math.min(100, value))}%` } }) }),
3616
- /* @__PURE__ */ jsxs90("div", { className: "mt-2 flex justify-between font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: [
3617
- /* @__PURE__ */ jsxs90("span", { children: [
3743
+ /* @__PURE__ */ jsx120("div", { className: "mt-3 h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx120("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${Math.max(0, Math.min(100, value))}%` } }) }),
3744
+ /* @__PURE__ */ jsxs91("div", { className: "mt-2 flex justify-between font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: [
3745
+ /* @__PURE__ */ jsxs91("span", { children: [
3618
3746
  value,
3619
3747
  "%"
3620
3748
  ] }),
3621
- /* @__PURE__ */ jsxs90("span", { children: [
3749
+ /* @__PURE__ */ jsxs91("span", { children: [
3622
3750
  "Target ",
3623
3751
  target,
3624
3752
  "%"
@@ -3628,81 +3756,81 @@ function SLAStatus({ label, value, target = 95, className = "" }) {
3628
3756
  }
3629
3757
 
3630
3758
  // src/components/framework/FeatureFlagTable.tsx
3631
- import { jsx as jsx119, jsxs as jsxs91 } from "react/jsx-runtime";
3759
+ import { jsx as jsx121, jsxs as jsxs92 } from "react/jsx-runtime";
3632
3760
  function FeatureFlagTable({ flags, onToggle, className = "" }) {
3633
- return /* @__PURE__ */ jsx119("div", { className: ["overflow-hidden border border-[var(--tapiz-border-subtle)]", className].filter(Boolean).join(" "), children: flags.map((flag) => /* @__PURE__ */ jsxs91("div", { className: "grid gap-3 border-b border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4 last:border-b-0 md:grid-cols-[1fr_auto_auto] md:items-center", children: [
3634
- /* @__PURE__ */ jsxs91("div", { children: [
3635
- /* @__PURE__ */ jsxs91("div", { className: "flex flex-wrap items-center gap-2", children: [
3636
- /* @__PURE__ */ jsx119("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: flag.name }),
3637
- /* @__PURE__ */ jsx119(Badge, { children: flag.key })
3761
+ return /* @__PURE__ */ jsx121("div", { className: ["overflow-hidden border border-[var(--tapiz-border-subtle)]", className].filter(Boolean).join(" "), children: flags.map((flag) => /* @__PURE__ */ jsxs92("div", { className: "grid gap-3 border-b border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4 last:border-b-0 md:grid-cols-[1fr_auto_auto] md:items-center", children: [
3762
+ /* @__PURE__ */ jsxs92("div", { children: [
3763
+ /* @__PURE__ */ jsxs92("div", { className: "flex flex-wrap items-center gap-2", children: [
3764
+ /* @__PURE__ */ jsx121("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: flag.name }),
3765
+ /* @__PURE__ */ jsx121(Badge, { children: flag.key })
3638
3766
  ] }),
3639
- flag.description ? /* @__PURE__ */ jsx119("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: flag.description }) : null
3767
+ flag.description ? /* @__PURE__ */ jsx121("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: flag.description }) : null
3640
3768
  ] }),
3641
- /* @__PURE__ */ jsx119("div", { className: "text-sm text-[var(--tapiz-text-muted)]", children: flag.rollout }),
3642
- /* @__PURE__ */ jsx119(Switch, { checked: flag.enabled, onChange: (checked) => onToggle?.(flag.key, checked) })
3769
+ /* @__PURE__ */ jsx121("div", { className: "text-sm text-[var(--tapiz-text-muted)]", children: flag.rollout }),
3770
+ /* @__PURE__ */ jsx121(Switch, { checked: flag.enabled, onChange: (checked) => onToggle?.(flag.key, checked) })
3643
3771
  ] }, flag.key)) });
3644
3772
  }
3645
3773
 
3646
3774
  // src/components/framework/PlanUsage.tsx
3647
- import { jsx as jsx120, jsxs as jsxs92 } from "react/jsx-runtime";
3775
+ import { jsx as jsx122, jsxs as jsxs93 } from "react/jsx-runtime";
3648
3776
  function PlanUsage({ title = "Plan usage", items, className = "" }) {
3649
- return /* @__PURE__ */ jsxs92("section", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5", className].filter(Boolean).join(" "), children: [
3650
- /* @__PURE__ */ jsx120("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }),
3651
- /* @__PURE__ */ jsx120("div", { className: "mt-4 space-y-4", children: items.map((item, index) => {
3777
+ return /* @__PURE__ */ jsxs93("section", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5", className].filter(Boolean).join(" "), children: [
3778
+ /* @__PURE__ */ jsx122("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }),
3779
+ /* @__PURE__ */ jsx122("div", { className: "mt-4 space-y-4", children: items.map((item, index) => {
3652
3780
  const pct = item.limit ? Math.min(100, item.used / item.limit * 100) : 0;
3653
- return /* @__PURE__ */ jsxs92("div", { children: [
3654
- /* @__PURE__ */ jsxs92("div", { className: "mb-1 flex justify-between text-sm", children: [
3655
- /* @__PURE__ */ jsx120("span", { className: "text-[var(--tapiz-text-primary)]", children: item.label }),
3656
- /* @__PURE__ */ jsxs92("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
3781
+ return /* @__PURE__ */ jsxs93("div", { children: [
3782
+ /* @__PURE__ */ jsxs93("div", { className: "mb-1 flex justify-between text-sm", children: [
3783
+ /* @__PURE__ */ jsx122("span", { className: "text-[var(--tapiz-text-primary)]", children: item.label }),
3784
+ /* @__PURE__ */ jsxs93("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
3657
3785
  item.used,
3658
3786
  "/",
3659
3787
  item.limit
3660
3788
  ] })
3661
3789
  ] }),
3662
- /* @__PURE__ */ jsx120("div", { className: "h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx120("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${pct}%` } }) })
3790
+ /* @__PURE__ */ jsx122("div", { className: "h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx122("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${pct}%` } }) })
3663
3791
  ] }, index);
3664
3792
  }) })
3665
3793
  ] });
3666
3794
  }
3667
3795
 
3668
3796
  // src/components/marketing/AnnouncementBar.tsx
3669
- import { jsx as jsx121, jsxs as jsxs93 } from "react/jsx-runtime";
3797
+ import { jsx as jsx123, jsxs as jsxs94 } from "react/jsx-runtime";
3670
3798
  function AnnouncementBar({ children, action, className = "" }) {
3671
- return /* @__PURE__ */ jsx121("div", { className: ["border-b border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)] px-4 py-3 text-sm text-[var(--tapiz-text-primary)]", className].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxs93("div", { className: "mx-auto flex max-w-7xl flex-wrap items-center justify-center gap-3 text-center", children: [
3799
+ return /* @__PURE__ */ jsx123("div", { className: ["border-b border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)] px-4 py-3 text-sm text-[var(--tapiz-text-primary)]", className].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxs94("div", { className: "mx-auto flex max-w-7xl flex-wrap items-center justify-center gap-3 text-center", children: [
3672
3800
  " ",
3673
- /* @__PURE__ */ jsx121("span", { children }),
3674
- action ? /* @__PURE__ */ jsx121("span", { children: action }) : null
3801
+ /* @__PURE__ */ jsx123("span", { children }),
3802
+ action ? /* @__PURE__ */ jsx123("span", { children: action }) : null
3675
3803
  ] }) });
3676
3804
  }
3677
3805
 
3678
3806
  // src/components/marketing/FAQSection.tsx
3679
- import { jsx as jsx122, jsxs as jsxs94 } from "react/jsx-runtime";
3807
+ import { jsx as jsx124, jsxs as jsxs95 } from "react/jsx-runtime";
3680
3808
  function FAQSection({ title = "Frequently asked questions", description, items, className = "" }) {
3681
- return /* @__PURE__ */ jsxs94("section", { className, children: [
3682
- /* @__PURE__ */ jsxs94("div", { className: "mb-6 max-w-2xl", children: [
3683
- /* @__PURE__ */ jsx122("div", { className: "kicker", children: "FAQ" }),
3684
- /* @__PURE__ */ jsx122("h2", { className: "mt-2 text-3xl font-semibold tracking-[-0.05em] text-[var(--tapiz-text-primary)]", children: title }),
3685
- description ? /* @__PURE__ */ jsx122("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
3809
+ return /* @__PURE__ */ jsxs95("section", { className, children: [
3810
+ /* @__PURE__ */ jsxs95("div", { className: "mb-6 max-w-2xl", children: [
3811
+ /* @__PURE__ */ jsx124("div", { className: "kicker", children: "FAQ" }),
3812
+ /* @__PURE__ */ jsx124("h2", { className: "mt-2 text-3xl font-semibold tracking-[-0.05em] text-[var(--tapiz-text-primary)]", children: title }),
3813
+ description ? /* @__PURE__ */ jsx124("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
3686
3814
  ] }),
3687
- /* @__PURE__ */ jsx122(Accordion, { items: items.map((item, index) => ({ id: `faq-${index}`, title: item.question, content: item.answer })) })
3815
+ /* @__PURE__ */ jsx124(Accordion, { items: items.map((item, index) => ({ id: `faq-${index}`, title: item.question, content: item.answer })) })
3688
3816
  ] });
3689
3817
  }
3690
3818
 
3691
3819
  // src/components/marketing/RoadmapList.tsx
3692
- import { jsx as jsx123, jsxs as jsxs95 } from "react/jsx-runtime";
3820
+ import { jsx as jsx125, jsxs as jsxs96 } from "react/jsx-runtime";
3693
3821
  function RoadmapList({ items, className = "" }) {
3694
- return /* @__PURE__ */ jsx123("div", { className: ["grid gap-3 md:grid-cols-3", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsxs95("article", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5", children: [
3695
- /* @__PURE__ */ jsxs95("div", { className: "flex items-center justify-between gap-3", children: [
3696
- /* @__PURE__ */ jsx123("span", { className: "kicker", children: item.quarter ?? `0${index + 1}` }),
3697
- item.status ? /* @__PURE__ */ jsx123(Badge, { children: item.status }) : null
3822
+ return /* @__PURE__ */ jsx125("div", { className: ["grid gap-3 md:grid-cols-3", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsxs96("article", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5", children: [
3823
+ /* @__PURE__ */ jsxs96("div", { className: "flex items-center justify-between gap-3", children: [
3824
+ /* @__PURE__ */ jsx125("span", { className: "kicker", children: item.quarter ?? `0${index + 1}` }),
3825
+ item.status ? /* @__PURE__ */ jsx125(Badge, { children: item.status }) : null
3698
3826
  ] }),
3699
- /* @__PURE__ */ jsx123("h3", { className: "mt-4 font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
3700
- item.description ? /* @__PURE__ */ jsx123("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: item.description }) : null
3827
+ /* @__PURE__ */ jsx125("h3", { className: "mt-4 font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
3828
+ item.description ? /* @__PURE__ */ jsx125("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: item.description }) : null
3701
3829
  ] }, index)) });
3702
3830
  }
3703
3831
 
3704
3832
  // src/components/feedback/InlineStatus.tsx
3705
- import { jsx as jsx124, jsxs as jsxs96 } from "react/jsx-runtime";
3833
+ import { jsx as jsx126, jsxs as jsxs97 } from "react/jsx-runtime";
3706
3834
  var toneClasses5 = {
3707
3835
  neutral: "bg-[var(--tapiz-text-muted)]",
3708
3836
  success: "bg-[var(--tapiz-success)]",
@@ -3711,8 +3839,8 @@ var toneClasses5 = {
3711
3839
  info: "bg-[var(--tapiz-info)]"
3712
3840
  };
3713
3841
  function InlineStatus({ tone: tone2 = "neutral", children, pulse = false, className = "" }) {
3714
- return /* @__PURE__ */ jsxs96("span", { className: ["inline-flex items-center gap-2 text-sm text-[var(--tapiz-text-muted)]", className].filter(Boolean).join(" "), children: [
3715
- /* @__PURE__ */ jsx124("span", { className: ["h-2 w-2 rounded-full", toneClasses5[tone2], pulse ? "animate-pulse" : ""].filter(Boolean).join(" ") }),
3842
+ return /* @__PURE__ */ jsxs97("span", { className: ["inline-flex items-center gap-2 text-sm text-[var(--tapiz-text-muted)]", className].filter(Boolean).join(" "), children: [
3843
+ /* @__PURE__ */ jsx126("span", { className: ["h-2 w-2 rounded-full", toneClasses5[tone2], pulse ? "animate-pulse" : ""].filter(Boolean).join(" ") }),
3716
3844
  children
3717
3845
  ] });
3718
3846
  }
@@ -3888,6 +4016,7 @@ export {
3888
4016
  SectionCard,
3889
4017
  SectionIcons,
3890
4018
  SectionTitle,
4019
+ SegmentedTabs,
3891
4020
  Select,
3892
4021
  Server,
3893
4022
  Shield,