@tapizlabs/ui 0.2.18 → 0.2.21

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