@tapizlabs/ui 0.1.6 → 0.2.3

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
@@ -690,6 +690,8 @@ var variantClasses = {
690
690
  hover:bg-[rgba(255,122,77,0.08)]`,
691
691
  "outline-success": `${TOKEN_BASE} border border-[var(--color-good)] text-[var(--color-good)]
692
692
  hover:bg-[rgba(77,214,163,0.08)]`,
693
+ brutal: `${TOKEN_BASE} border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-primary)]
694
+ shadow-[var(--tapiz-shadow-brutal)] font-bold hover:-translate-x-0.5 hover:-translate-y-0.5 hover:shadow-[var(--tapiz-shadow-brutal-lg)]`,
693
695
  link: "text-[var(--color-primary-300)] hover:text-[var(--color-primary-400)] disabled:opacity-40 disabled:cursor-not-allowed inline-flex items-center gap-1"
694
696
  };
695
697
  var sizeClasses = {
@@ -1052,17 +1054,10 @@ function FormError({ message, className = "" }) {
1052
1054
  return /* @__PURE__ */ jsxs15(
1053
1055
  "div",
1054
1056
  {
1055
- className: `flex items-start gap-2 px-3 py-2.5 text-sm ${className}`,
1056
- style: {
1057
- background: "color-mix(in srgb, var(--color-warn) 8%, transparent)",
1058
- border: "1px solid color-mix(in srgb, var(--color-warn) 25%, transparent)",
1059
- borderLeft: "3px solid var(--color-warn)",
1060
- color: "var(--color-warn)",
1061
- animation: "var(--animate-scale-in)"
1062
- },
1057
+ className: `flex items-start gap-2 px-3 py-2.5 text-sm text-warn bg-warn/8 border border-warn/25 border-l-[3px] border-l-warn animate-scale-in ${className}`,
1063
1058
  children: [
1064
1059
  /* @__PURE__ */ jsx22(Alert, { size: 14, className: "shrink-0 mt-0.5" }),
1065
- /* @__PURE__ */ jsx22("span", { style: { fontFamily: "var(--font-mono)", fontSize: 12 }, children: message })
1060
+ /* @__PURE__ */ jsx22("span", { className: "font-mono text-[12px]", children: message })
1066
1061
  ]
1067
1062
  }
1068
1063
  );
@@ -1215,49 +1210,26 @@ function BaseModal({
1215
1210
  role: "dialog",
1216
1211
  "aria-modal": "true",
1217
1212
  "aria-labelledby": titleId,
1218
- className: "fixed inset-0 z-50 flex items-center justify-center p-4",
1219
- style: { background: "rgba(5,6,8,0.75)", backdropFilter: "blur(2px)" },
1213
+ className: "fixed inset-0 z-50 flex items-center justify-center p-4 bg-[rgba(5,6,8,0.75)] backdrop-blur-[2px]",
1220
1214
  onClick: (e) => e.target === e.currentTarget && onClose(),
1221
1215
  children: /* @__PURE__ */ jsxs17(
1222
1216
  "div",
1223
1217
  {
1224
- className: `w-full ${sizeClass[size]} p-6 space-y-4`,
1225
- style: {
1226
- background: "var(--color-ink-200)",
1227
- border: "1px solid var(--color-border-hi)",
1228
- borderTop: "2px solid var(--color-primary-300)",
1229
- animation: "var(--animate-scale-in)"
1230
- },
1218
+ className: `w-full ${sizeClass[size]} p-6 space-y-4 bg-ink-200 border border-border-hi border-t-2 border-t-primary-300 animate-scale-in`,
1231
1219
  children: [
1232
1220
  /* @__PURE__ */ jsxs17("div", { className: "flex items-start justify-between", children: [
1233
1221
  /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-3", children: [
1234
- icon && /* @__PURE__ */ jsx24(
1235
- "div",
1236
- {
1237
- className: "flex items-center justify-center w-10 h-10 shrink-0",
1238
- style: { background: "var(--color-ink-300)", border: "1px solid var(--color-border-hi)", color: "var(--color-primary-300)" },
1239
- children: icon
1240
- }
1241
- ),
1222
+ icon && /* @__PURE__ */ jsx24("div", { className: "flex items-center justify-center w-10 h-10 shrink-0 bg-ink-300 border border-border-hi text-primary-300", children: icon }),
1242
1223
  /* @__PURE__ */ jsxs17("div", { children: [
1243
- /* @__PURE__ */ jsx24("h3", { id: titleId, style: { fontFamily: "var(--font-display)", fontSize: 15, fontWeight: 600, color: "var(--color-txt-1)" }, children: title }),
1244
- subtitle && /* @__PURE__ */ jsx24("p", { style: { fontFamily: "var(--font-mono)", fontSize: 10, color: "var(--color-primary-300)", marginTop: 2, letterSpacing: "0.1em" }, children: subtitle })
1224
+ /* @__PURE__ */ jsx24("h3", { id: titleId, className: "font-display text-[15px] font-semibold text-txt-1", children: title }),
1225
+ subtitle && /* @__PURE__ */ jsx24("p", { className: "font-mono text-[10px] text-primary-300 mt-0.5 tracking-widest", children: subtitle })
1245
1226
  ] })
1246
1227
  ] }),
1247
1228
  xShown && /* @__PURE__ */ jsx24(
1248
1229
  "button",
1249
1230
  {
1250
1231
  onClick: onClose,
1251
- className: "w-7 h-7 flex items-center justify-center",
1252
- style: { color: "var(--color-txt-3)", border: "1px solid transparent" },
1253
- onMouseEnter: (e) => {
1254
- e.currentTarget.style.color = "var(--color-txt-1)";
1255
- e.currentTarget.style.borderColor = "var(--color-border-hi)";
1256
- },
1257
- onMouseLeave: (e) => {
1258
- e.currentTarget.style.color = "var(--color-txt-3)";
1259
- e.currentTarget.style.borderColor = "transparent";
1260
- },
1232
+ className: "w-7 h-7 flex items-center justify-center text-txt-3 border border-transparent hover:text-txt-1 hover:border-border-hi transition-colors",
1261
1233
  "aria-label": closeLabel,
1262
1234
  title: closeLabel,
1263
1235
  children: /* @__PURE__ */ jsx24(X, { size: 14 })
@@ -1298,37 +1270,25 @@ function ConfirmDialog({
1298
1270
  /* @__PURE__ */ jsx25(
1299
1271
  "div",
1300
1272
  {
1301
- className: "fixed inset-0 z-300 flex items-center justify-center px-4",
1302
- style: { background: "rgba(5,6,8,0.4)", backdropFilter: "blur(8px)" },
1273
+ className: "fixed inset-0 z-300 flex items-center justify-center px-4 bg-[rgba(5,6,8,0.4)] backdrop-blur-sm",
1303
1274
  onClick: onCancel,
1304
1275
  children: /* @__PURE__ */ jsx25(
1305
1276
  "div",
1306
1277
  {
1307
- className: "relative w-full max-w-sm",
1308
- style: {
1309
- background: "var(--color-ink-200)",
1310
- border: "1px solid var(--color-border-hi)",
1311
- borderTop: danger ? "2px solid var(--color-danger, #f87171)" : "2px solid var(--color-primary-300)",
1312
- animation: "var(--animate-scale-in)"
1313
- },
1278
+ className: `relative w-full max-w-sm bg-ink-200 border border-border-hi border-t-2 animate-scale-in ${danger ? "border-t-(--color-danger,#f87171)" : "border-t-primary-300"}`,
1314
1279
  onClick: (e) => e.stopPropagation(),
1315
1280
  children: /* @__PURE__ */ jsxs18("div", { className: "p-6 flex flex-col gap-4", children: [
1316
1281
  /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-3", children: [
1317
1282
  icon && /* @__PURE__ */ jsx25(
1318
1283
  "div",
1319
1284
  {
1320
- className: "flex items-center justify-center w-9 h-9 shrink-0",
1321
- style: {
1322
- background: danger ? "rgba(248,113,113,0.1)" : "rgba(94,231,255,0.08)",
1323
- border: danger ? "1px solid rgba(248,113,113,0.25)" : "1px solid rgba(94,231,255,0.15)",
1324
- color: danger ? "var(--color-danger, #f87171)" : "var(--color-primary-300)"
1325
- },
1285
+ className: `flex items-center justify-center w-9 h-9 shrink-0 border ${danger ? "bg-[rgba(248,113,113,0.1)] border-[rgba(248,113,113,0.25)] text-(--color-danger,#f87171)" : "bg-primary-300/8 border-primary-300/15 text-primary-300"}`,
1326
1286
  children: icon
1327
1287
  }
1328
1288
  ),
1329
- /* @__PURE__ */ jsx25("p", { className: "text-sm font-semibold", style: { color: "var(--color-txt-1)" }, children: title })
1289
+ /* @__PURE__ */ jsx25("p", { className: "text-sm font-semibold text-txt-1", children: title })
1330
1290
  ] }),
1331
- /* @__PURE__ */ jsx25("p", { className: "text-sm", style: { color: "var(--color-txt-3)" }, children: resolvedDescription }),
1291
+ /* @__PURE__ */ jsx25("p", { className: "text-sm text-txt-3", children: resolvedDescription }),
1332
1292
  /* @__PURE__ */ jsxs18("div", { className: "flex items-center justify-end gap-2", children: [
1333
1293
  /* @__PURE__ */ jsx25(Button, { variant: "ghost", size: "sm", icon: /* @__PURE__ */ jsx25(X, { size: 13 }), onClick: onCancel, disabled: loading, children: resolvedCancel }),
1334
1294
  /* @__PURE__ */ jsx25(
@@ -1391,11 +1351,43 @@ function Tooltip({ text, children, position = "top", align = "center", width = "
1391
1351
 
1392
1352
  // src/components/shared/Card.tsx
1393
1353
  import { jsx as jsx27 } from "react/jsx-runtime";
1394
- function Card({ children, className = "", hover = false, style }) {
1395
- return /* @__PURE__ */ jsx27("div", { className: `card ${hover ? "card-hover transition-all" : ""} ${className}`, style, children });
1354
+ var variantClasses2 = {
1355
+ surface: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-sm)]",
1356
+ raised: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-raised)] shadow-[var(--tapiz-shadow-md)]",
1357
+ outlined: "border border-[var(--tapiz-border-strong)] bg-transparent",
1358
+ brutal: "border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-brutal)]",
1359
+ glass: "border border-[var(--tapiz-border-subtle)] bg-[color-mix(in_srgb,var(--tapiz-bg-surface)_78%,transparent)] shadow-[var(--tapiz-shadow-md)] backdrop-blur-xl"
1360
+ };
1361
+ var paddingClasses = {
1362
+ none: "p-0",
1363
+ sm: "p-3",
1364
+ md: "p-5",
1365
+ lg: "p-6"
1366
+ };
1367
+ function Card({
1368
+ children,
1369
+ className = "",
1370
+ hover = false,
1371
+ style,
1372
+ variant = "surface",
1373
+ padding = "md"
1374
+ }) {
1375
+ return /* @__PURE__ */ jsx27(
1376
+ "div",
1377
+ {
1378
+ className: [
1379
+ variantClasses2[variant],
1380
+ paddingClasses[padding],
1381
+ hover ? "card-hover" : "",
1382
+ className
1383
+ ].filter(Boolean).join(" "),
1384
+ style,
1385
+ children
1386
+ }
1387
+ );
1396
1388
  }
1397
1389
  function CardHeader({ children, className = "" }) {
1398
- return /* @__PURE__ */ jsx27("div", { className: `border-b border-border px-5 py-3 ${className}`, children });
1390
+ return /* @__PURE__ */ jsx27("div", { className: `border-b border-[var(--tapiz-border-subtle)] px-5 py-3 ${className}`, children });
1399
1391
  }
1400
1392
  function CardBody({ children, className = "" }) {
1401
1393
  return /* @__PURE__ */ jsx27("div", { className: `p-5 ${className}`, children });
@@ -1482,18 +1474,19 @@ function SkeletonPageHeader() {
1482
1474
 
1483
1475
  // src/components/shared/Badge.tsx
1484
1476
  import { jsx as jsx30 } from "react/jsx-runtime";
1485
- var variantClasses2 = {
1486
- default: "border-primary-300 text-primary-300",
1487
- success: "border-good text-good",
1488
- warning: "border-signal-400 text-signal-400",
1489
- danger: "border-warn text-warn",
1477
+ var variantClasses3 = {
1478
+ default: "border-[var(--tapiz-accent)] text-[var(--tapiz-accent)] bg-[var(--tapiz-accent-soft)]",
1479
+ success: "border-[var(--tapiz-success)] text-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
1480
+ warning: "border-[var(--tapiz-warning)] text-[var(--tapiz-warning)] bg-[var(--tapiz-warning-soft)]",
1481
+ danger: "border-[var(--tapiz-danger)] text-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)]",
1482
+ info: "border-[var(--tapiz-info)] text-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)]",
1490
1483
  muted: "border-txt-3 text-txt-3"
1491
1484
  };
1492
1485
  function Badge({ children, variant = "default", className = "" }) {
1493
1486
  return /* @__PURE__ */ jsx30(
1494
1487
  "span",
1495
1488
  {
1496
- className: `inline-flex items-center border px-2 py-0.5 font-mono text-[9px] font-bold uppercase tracking-widest ${variantClasses2[variant]} ${className}`,
1489
+ className: `inline-flex items-center border px-2 py-0.5 font-mono text-[9px] font-bold uppercase tracking-widest ${variantClasses3[variant]} ${className}`,
1497
1490
  children
1498
1491
  }
1499
1492
  );
@@ -1529,29 +1522,17 @@ function InfoBanner(props) {
1529
1522
  const icon = variant === "lock" ? /* @__PURE__ */ jsx32(LockIcon, { size: 14, className: "mt-1 shrink-0" }) : /* @__PURE__ */ jsx32(Info, { size: 14, className: "mt-1 shrink-0" });
1530
1523
  return /* @__PURE__ */ jsxs22("div", { className: `app-info-banner flex items-start gap-2 border px-3 py-2.5 text-[13px] ${styles} ${className2}`, children: [
1531
1524
  icon,
1532
- /* @__PURE__ */ jsx32("p", { style: { fontFamily: "var(--font-mono)" }, children: text })
1525
+ /* @__PURE__ */ jsx32("p", { className: "font-mono", children: text })
1533
1526
  ] });
1534
1527
  }
1535
1528
  const { title, description, className = "" } = props;
1536
1529
  return /* @__PURE__ */ jsxs22(
1537
1530
  "div",
1538
1531
  {
1539
- className: `app-info-banner px-4 py-3 ${className}`,
1540
- style: {
1541
- background: "rgba(94,231,255,0.04)",
1542
- border: "1px solid rgba(94,231,255,0.12)",
1543
- borderLeft: "3px solid var(--color-primary-300)"
1544
- },
1532
+ className: `app-info-banner px-4 py-3 bg-primary-300/4 border border-primary-300/12 border-l-[3px] border-l-primary-300 ${className}`,
1545
1533
  children: [
1546
- /* @__PURE__ */ jsx32(
1547
- "p",
1548
- {
1549
- className: "mb-0.5 font-mono text-[10px] font-semibold uppercase tracking-widest",
1550
- style: { color: "var(--color-primary-300)" },
1551
- children: title
1552
- }
1553
- ),
1554
- /* @__PURE__ */ jsx32("p", { className: "font-mono text-[11px] leading-relaxed", style: { color: "var(--color-txt-2)" }, children: description })
1534
+ /* @__PURE__ */ jsx32("p", { className: "mb-0.5 font-mono text-[10px] font-semibold uppercase tracking-widest text-primary-300", children: title }),
1535
+ /* @__PURE__ */ jsx32("p", { className: "font-mono text-[11px] leading-relaxed text-txt-2", children: description })
1555
1536
  ]
1556
1537
  }
1557
1538
  );
@@ -1559,30 +1540,103 @@ function InfoBanner(props) {
1559
1540
 
1560
1541
  // src/components/shared/PageHeader.tsx
1561
1542
  import { jsx as jsx33, jsxs as jsxs23 } from "react/jsx-runtime";
1562
- function PageHeader({ title, subtitle, action, icon, banner, className = "" }) {
1563
- return /* @__PURE__ */ jsxs23(
1543
+ function PageHeader({
1544
+ title,
1545
+ subtitle,
1546
+ description,
1547
+ action,
1548
+ actions,
1549
+ icon,
1550
+ banner,
1551
+ breadcrumbs,
1552
+ meta,
1553
+ className = "",
1554
+ variant = "default"
1555
+ }) {
1556
+ const resolvedActions = actions ?? action;
1557
+ const variantClass = variant === "brutal" ? "border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] p-5 shadow-[var(--tapiz-shadow-brutal)]" : variant === "enterprise" ? "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5 shadow-[var(--tapiz-shadow-sm)]" : "border-b border-[var(--tapiz-border-subtle)] pb-4";
1558
+ return /* @__PURE__ */ jsxs23("div", { className: `page-header mb-5 flex flex-col gap-3 animate-fade-in-up ${variantClass} ${className}`.trim(), children: [
1559
+ breadcrumbs ? /* @__PURE__ */ jsx33("div", { className: "font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: breadcrumbs }) : null,
1560
+ /* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [
1561
+ /* @__PURE__ */ jsxs23("div", { className: "min-w-0", children: [
1562
+ subtitle ? /* @__PURE__ */ jsx33("div", { className: "kicker mb-1.5", children: subtitle }) : null,
1563
+ /* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-2.5", children: [
1564
+ icon ? /* @__PURE__ */ jsx33("span", { className: "text-[var(--tapiz-accent)]", children: icon }) : null,
1565
+ /* @__PURE__ */ jsx33("h2", { className: "font-(--font-display) text-[22px] tracking-[-0.03em] text-[var(--tapiz-text-primary)] md:text-[26px]", children: title })
1566
+ ] }),
1567
+ description ? /* @__PURE__ */ jsx33("div", { className: "mt-2 max-w-3xl text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null,
1568
+ meta ? /* @__PURE__ */ jsx33("div", { className: "mt-3 font-mono text-[11px] text-[var(--tapiz-text-disabled)]", children: meta }) : null
1569
+ ] }),
1570
+ resolvedActions ? /* @__PURE__ */ jsx33("div", { className: "flex shrink-0 flex-wrap gap-2", children: resolvedActions }) : null
1571
+ ] }),
1572
+ banner ? banner : null
1573
+ ] });
1574
+ }
1575
+
1576
+ // src/components/shared/MetricCard.tsx
1577
+ import { jsx as jsx34, jsxs as jsxs24 } from "react/jsx-runtime";
1578
+ var trendClasses = {
1579
+ positive: "border-[var(--tapiz-success)] text-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
1580
+ negative: "border-[var(--tapiz-danger)] text-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)]",
1581
+ warning: "border-[var(--tapiz-warning)] text-[var(--tapiz-warning)] bg-[var(--tapiz-warning-soft)]",
1582
+ neutral: "border-[var(--tapiz-border-strong)] text-[var(--tapiz-text-muted)] bg-[var(--tapiz-bg-surface-muted)]"
1583
+ };
1584
+ function MetricCard({
1585
+ label,
1586
+ value,
1587
+ description,
1588
+ icon,
1589
+ trend,
1590
+ trendTone = "neutral",
1591
+ className = "",
1592
+ variant = "surface"
1593
+ }) {
1594
+ return /* @__PURE__ */ jsxs24(Card, { variant, padding: "md", hover: true, className: `relative overflow-hidden ${className}`, children: [
1595
+ /* @__PURE__ */ jsxs24("div", { className: "flex items-start justify-between gap-4", children: [
1596
+ /* @__PURE__ */ jsxs24("div", { className: "min-w-0", children: [
1597
+ /* @__PURE__ */ jsx34("p", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: label }),
1598
+ /* @__PURE__ */ jsx34("div", { className: "mt-2 font-display text-3xl font-semibold tracking-[-0.05em] text-[var(--tapiz-text-primary)]", children: value })
1599
+ ] }),
1600
+ icon ? /* @__PURE__ */ jsx34("div", { className: "grid h-10 w-10 shrink-0 place-items-center border border-[var(--tapiz-border-strong)] bg-[var(--color-icon-bg)] text-[var(--tapiz-accent)]", children: icon }) : null
1601
+ ] }),
1602
+ description || trend ? /* @__PURE__ */ jsxs24("div", { className: "mt-4 flex flex-wrap items-center gap-2", children: [
1603
+ trend ? /* @__PURE__ */ jsx34("span", { className: `inline-flex border px-2 py-0.5 font-mono text-[10px] font-bold uppercase tracking-widest ${trendClasses[trendTone]}`, children: trend }) : null,
1604
+ description ? /* @__PURE__ */ jsx34("p", { className: "text-xs text-[var(--tapiz-text-muted)]", children: description }) : null
1605
+ ] }) : null
1606
+ ] });
1607
+ }
1608
+
1609
+ // src/components/shared/StatGrid.tsx
1610
+ import { jsx as jsx35 } from "react/jsx-runtime";
1611
+ function StatGrid({ children, className = "", minColumnWidth = "14rem" }) {
1612
+ return /* @__PURE__ */ jsx35(
1564
1613
  "div",
1565
1614
  {
1566
- className: `page-header mb-5 flex flex-col gap-3 border-b border-border pb-4 animate-fade-in-up ${className}`.trim(),
1567
- children: [
1568
- /* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [
1569
- /* @__PURE__ */ jsxs23("div", { children: [
1570
- subtitle ? /* @__PURE__ */ jsx33("div", { className: "kicker mb-1.5", children: subtitle }) : null,
1571
- /* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-2.5", children: [
1572
- icon ? /* @__PURE__ */ jsx33("span", { className: "text-primary-300", children: icon }) : null,
1573
- /* @__PURE__ */ jsx33("h2", { className: "font-(--font-display) text-[22px] tracking-[-0.03em] text-txt-1", children: title })
1574
- ] })
1575
- ] }),
1576
- action ? /* @__PURE__ */ jsx33("div", { children: action }) : null
1577
- ] }),
1578
- banner ? banner : null
1579
- ]
1615
+ className: `grid gap-4 ${className}`,
1616
+ style: { gridTemplateColumns: `repeat(auto-fit, minmax(${minColumnWidth}, 1fr))` },
1617
+ children
1580
1618
  }
1581
1619
  );
1582
1620
  }
1583
1621
 
1622
+ // src/components/shared/SectionCard.tsx
1623
+ import { jsx as jsx36, jsxs as jsxs25 } from "react/jsx-runtime";
1624
+ function SectionCard({ title, eyebrow, description, action, children, className = "" }) {
1625
+ return /* @__PURE__ */ jsxs25(Card, { variant: "surface", padding: "none", className, children: [
1626
+ title || eyebrow || description || action ? /* @__PURE__ */ jsxs25("div", { className: "flex flex-col gap-3 border-b border-[var(--tapiz-border-subtle)] px-5 py-4 sm:flex-row sm:items-start sm:justify-between", children: [
1627
+ /* @__PURE__ */ jsxs25("div", { className: "min-w-0", children: [
1628
+ eyebrow ? /* @__PURE__ */ jsx36("div", { className: "kicker mb-1", children: eyebrow }) : null,
1629
+ title ? /* @__PURE__ */ jsx36("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
1630
+ description ? /* @__PURE__ */ jsx36("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null
1631
+ ] }),
1632
+ action ? /* @__PURE__ */ jsx36("div", { className: "shrink-0", children: action }) : null
1633
+ ] }) : null,
1634
+ /* @__PURE__ */ jsx36("div", { className: "p-5", children })
1635
+ ] });
1636
+ }
1637
+
1584
1638
  // src/components/shared/SearchInput.tsx
1585
- import { jsx as jsx34, jsxs as jsxs24 } from "react/jsx-runtime";
1639
+ import { jsx as jsx37, jsxs as jsxs26 } from "react/jsx-runtime";
1586
1640
  function SearchInput({
1587
1641
  value,
1588
1642
  onChange,
@@ -1595,9 +1649,9 @@ function SearchInput({
1595
1649
  clearTitle = "Clear search",
1596
1650
  ...props
1597
1651
  }) {
1598
- return /* @__PURE__ */ jsxs24("div", { className: `relative ${wrapperClassName}`.trim(), style: wrapperStyle, children: [
1599
- /* @__PURE__ */ jsx34("span", { className: `pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 ${iconClassName}`.trim(), children: /* @__PURE__ */ jsx34(Search, { size: 15 }) }),
1600
- /* @__PURE__ */ jsx34(
1652
+ return /* @__PURE__ */ jsxs26("div", { className: `relative ${wrapperClassName}`.trim(), style: wrapperStyle, children: [
1653
+ /* @__PURE__ */ jsx37("span", { className: `pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 ${iconClassName}`.trim(), children: /* @__PURE__ */ jsx37(Search, { size: 15 }) }),
1654
+ /* @__PURE__ */ jsx37(
1601
1655
  Input,
1602
1656
  {
1603
1657
  ...props,
@@ -1608,21 +1662,21 @@ function SearchInput({
1608
1662
  className: `pl-9 ${inputClassName}`.trim()
1609
1663
  }
1610
1664
  ),
1611
- clearable && value ? /* @__PURE__ */ jsx34(
1665
+ clearable && value ? /* @__PURE__ */ jsx37(
1612
1666
  "button",
1613
1667
  {
1614
1668
  type: "button",
1615
1669
  onClick: () => onChange(""),
1616
1670
  className: "absolute right-2 top-1/2 -translate-y-1/2 rounded-lg p-1 text-txt-4 transition-colors hover:bg-ink-300 hover:text-txt-2",
1617
1671
  title: clearTitle,
1618
- children: /* @__PURE__ */ jsx34(X, { size: 14 })
1672
+ children: /* @__PURE__ */ jsx37(X, { size: 14 })
1619
1673
  }
1620
1674
  ) : null
1621
1675
  ] });
1622
1676
  }
1623
1677
 
1624
1678
  // src/components/shared/Pagination.tsx
1625
- import { jsx as jsx35, jsxs as jsxs25 } from "react/jsx-runtime";
1679
+ import { jsx as jsx38, jsxs as jsxs27 } from "react/jsx-runtime";
1626
1680
  function getPageNumbers(page, totalPages) {
1627
1681
  if (totalPages <= 7) return Array.from({ length: totalPages }, (_, i) => i + 1);
1628
1682
  const pages = [1];
@@ -1646,10 +1700,10 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
1646
1700
  const pageNumbers = getPageNumbers(page, totalPages);
1647
1701
  const from = pageSize ? (page - 1) * pageSize + 1 : null;
1648
1702
  const to = pageSize && totalItems ? Math.min(page * pageSize, totalItems) : null;
1649
- return /* @__PURE__ */ jsxs25("div", { className: "flex flex-col items-center justify-between gap-3 border-t border-border pt-3 sm:flex-row", children: [
1650
- totalItems != null && from != null && to != null ? /* @__PURE__ */ jsx35("span", { className: "order-2 font-mono text-[12px] text-txt-4 sm:order-1", children: copy.showing({ from, to, total: totalItems }) }) : /* @__PURE__ */ jsx35("span", { className: "order-2 font-mono text-[11px] text-txt-4 sm:order-1", children: copy.page({ page, totalPages }) }),
1651
- /* @__PURE__ */ jsxs25("div", { className: "order-1 flex items-center gap-1 sm:order-2", children: [
1652
- /* @__PURE__ */ jsxs25(
1703
+ return /* @__PURE__ */ jsxs27("div", { className: "flex flex-col items-center justify-between gap-3 border-t border-border pt-3 sm:flex-row", children: [
1704
+ totalItems != null && from != null && to != null ? /* @__PURE__ */ jsx38("span", { className: "order-2 font-mono text-[12px] text-txt-4 sm:order-1", children: copy.showing({ from, to, total: totalItems }) }) : /* @__PURE__ */ jsx38("span", { className: "order-2 font-mono text-[11px] text-txt-4 sm:order-1", children: copy.page({ page, totalPages }) }),
1705
+ /* @__PURE__ */ jsxs27("div", { className: "order-1 flex items-center gap-1 sm:order-2", children: [
1706
+ /* @__PURE__ */ jsxs27(
1653
1707
  "button",
1654
1708
  {
1655
1709
  type: "button",
@@ -1658,13 +1712,13 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
1658
1712
  title: copy.prevTitle,
1659
1713
  className: "flex items-center gap-1 border border-border px-2.5 py-1.5 font-mono text-[11px] text-txt-3 transition-colors hover:border-border-hi hover:text-txt-1 disabled:cursor-not-allowed disabled:opacity-30",
1660
1714
  children: [
1661
- /* @__PURE__ */ jsx35(ChevronLeft, { size: 12 }),
1662
- /* @__PURE__ */ jsx35("span", { className: "hidden sm:inline", children: copy.prev })
1715
+ /* @__PURE__ */ jsx38(ChevronLeft, { size: 12 }),
1716
+ /* @__PURE__ */ jsx38("span", { className: "hidden sm:inline", children: copy.prev })
1663
1717
  ]
1664
1718
  }
1665
1719
  ),
1666
- /* @__PURE__ */ jsx35("div", { className: "flex items-center gap-1", children: pageNumbers.map(
1667
- (entry, index) => entry === "\u2026" ? /* @__PURE__ */ jsx35("span", { className: "w-7 text-center font-mono text-[11px] text-txt-4", children: "\u2026" }, `ellipsis-${index}`) : /* @__PURE__ */ jsx35(
1720
+ /* @__PURE__ */ jsx38("div", { className: "flex items-center gap-1", children: pageNumbers.map(
1721
+ (entry, index) => entry === "\u2026" ? /* @__PURE__ */ jsx38("span", { className: "w-7 text-center font-mono text-[11px] text-txt-4", children: "\u2026" }, `ellipsis-${index}`) : /* @__PURE__ */ jsx38(
1668
1722
  "button",
1669
1723
  {
1670
1724
  type: "button",
@@ -1675,7 +1729,7 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
1675
1729
  entry
1676
1730
  )
1677
1731
  ) }),
1678
- /* @__PURE__ */ jsxs25(
1732
+ /* @__PURE__ */ jsxs27(
1679
1733
  "button",
1680
1734
  {
1681
1735
  type: "button",
@@ -1684,8 +1738,8 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
1684
1738
  title: copy.nextTitle,
1685
1739
  className: "flex items-center gap-1 border border-border px-2.5 py-1.5 font-mono text-[10px] text-txt-3 transition-colors hover:border-border-hi hover:text-txt-1 disabled:cursor-not-allowed disabled:opacity-30",
1686
1740
  children: [
1687
- /* @__PURE__ */ jsx35("span", { className: "hidden sm:inline", children: copy.next }),
1688
- /* @__PURE__ */ jsx35(ChevronRight, { size: 12 })
1741
+ /* @__PURE__ */ jsx38("span", { className: "hidden sm:inline", children: copy.next }),
1742
+ /* @__PURE__ */ jsx38(ChevronRight, { size: 12 })
1689
1743
  ]
1690
1744
  }
1691
1745
  )
@@ -1694,31 +1748,32 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
1694
1748
  }
1695
1749
 
1696
1750
  // src/components/shared/SectionTitle.tsx
1697
- import { jsx as jsx36 } from "react/jsx-runtime";
1751
+ import { jsx as jsx39 } from "react/jsx-runtime";
1698
1752
  function SectionTitle({ children, className = "" }) {
1699
- return /* @__PURE__ */ jsx36("h3", { className: `mb-1 text-sm font-semibold text-txt-1 ${className}`.trim(), children });
1753
+ return /* @__PURE__ */ jsx39("h3", { className: `mb-1 text-sm font-semibold text-txt-1 ${className}`.trim(), children });
1700
1754
  }
1701
1755
 
1702
1756
  // src/components/shared/StatusBadge.tsx
1703
- import { jsx as jsx37 } from "react/jsx-runtime";
1704
- var BASE = "inline-flex items-center border px-2 py-0.5 font-mono text-[9px] font-medium uppercase tracking-[0.15em]";
1757
+ import { jsx as jsx40 } from "react/jsx-runtime";
1758
+ var BASE = "inline-flex items-center border px-2 py-0.5 font-mono text-[9px] font-bold uppercase tracking-[0.15em]";
1705
1759
  var variantStyles = {
1706
- default: "border-border-hi text-txt-2",
1707
- active: "border-primary-300 text-primary-300",
1708
- success: "border-good text-good",
1709
- inactive: "border-txt-4 text-txt-4",
1710
- warning: "border-warn text-warn",
1711
- danger: "border-warn text-warn",
1712
- pending: "border-txt-3 text-txt-3"
1760
+ default: "border-[var(--tapiz-border-strong)] text-[var(--tapiz-text-secondary)] bg-[var(--tapiz-bg-surface-muted)]",
1761
+ active: "border-[var(--tapiz-accent)] text-[var(--tapiz-accent)] bg-[var(--tapiz-accent-soft)]",
1762
+ success: "border-[var(--tapiz-success)] text-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
1763
+ inactive: "border-[var(--tapiz-text-disabled)] text-[var(--tapiz-text-disabled)] bg-transparent",
1764
+ warning: "border-[var(--tapiz-warning)] text-[var(--tapiz-warning)] bg-[var(--tapiz-warning-soft)]",
1765
+ danger: "border-[var(--tapiz-danger)] text-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)]",
1766
+ info: "border-[var(--tapiz-info)] text-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)]",
1767
+ pending: "border-[var(--tapiz-text-muted)] text-[var(--tapiz-text-muted)] bg-transparent"
1713
1768
  };
1714
1769
  function StatusBadge({ label, variant = "default", className = "" }) {
1715
- return /* @__PURE__ */ jsx37("span", { className: `${BASE} ${variantStyles[variant]} ${className}`.trim(), children: label });
1770
+ return /* @__PURE__ */ jsx40("span", { className: `${BASE} ${variantStyles[variant]} ${className}`.trim(), children: label });
1716
1771
  }
1717
1772
 
1718
1773
  // src/components/shared/ActionMenu.tsx
1719
1774
  import { useEffect as useEffect2, useLayoutEffect, useRef as useRef2, useState as useState5 } from "react";
1720
1775
  import { createPortal as createPortal4 } from "react-dom";
1721
- import { Fragment, jsx as jsx38, jsxs as jsxs26 } from "react/jsx-runtime";
1776
+ import { Fragment, jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
1722
1777
  var defaultMenuStyle = {
1723
1778
  background: "var(--color-ink-200)",
1724
1779
  border: "1px solid var(--color-border-hi)",
@@ -1802,9 +1857,9 @@ function ActionMenu({
1802
1857
  document.removeEventListener("keydown", handle);
1803
1858
  };
1804
1859
  }, [open]);
1805
- const menuNode = open && pos ? /* @__PURE__ */ jsxs26(Fragment, { children: [
1806
- /* @__PURE__ */ jsx38("div", { className: "fixed inset-0 z-9998", onClick: () => setOpen(false) }),
1807
- /* @__PURE__ */ jsx38(
1860
+ const menuNode = open && pos ? /* @__PURE__ */ jsxs28(Fragment, { children: [
1861
+ /* @__PURE__ */ jsx41("div", { className: "fixed inset-0 z-9998", onClick: () => setOpen(false) }),
1862
+ /* @__PURE__ */ jsx41(
1808
1863
  "div",
1809
1864
  {
1810
1865
  ref: menuRef,
@@ -1821,9 +1876,9 @@ function ActionMenu({
1821
1876
  maxHeight: pos.maxHeight ?? defaultMenuStyle.maxHeight,
1822
1877
  ...menuStyle
1823
1878
  },
1824
- children: items.map((item, index) => /* @__PURE__ */ jsxs26("div", { children: [
1825
- index > 0 && item.danger ? /* @__PURE__ */ jsx38("div", { style: { borderTop: "1px solid var(--color-border)" } }) : null,
1826
- /* @__PURE__ */ jsxs26(
1879
+ children: items.map((item, index) => /* @__PURE__ */ jsxs28("div", { children: [
1880
+ index > 0 && item.danger ? /* @__PURE__ */ jsx41("div", { style: { borderTop: "1px solid var(--color-border)" } }) : null,
1881
+ /* @__PURE__ */ jsxs28(
1827
1882
  "button",
1828
1883
  {
1829
1884
  type: "button",
@@ -1835,8 +1890,8 @@ function ActionMenu({
1835
1890
  item.onSelect();
1836
1891
  },
1837
1892
  children: [
1838
- item.loading ? /* @__PURE__ */ jsx38(Spinner, { color: "text-[var(--color-txt-3)]" }) : /* @__PURE__ */ jsx38("span", { className: item.danger ? "shrink-0 text-warn" : "shrink-0 text-primary-300", children: item.icon }),
1839
- /* @__PURE__ */ jsx38("span", { children: item.label })
1893
+ item.loading ? /* @__PURE__ */ jsx41(Spinner, { color: "text-[var(--color-txt-3)]" }) : /* @__PURE__ */ jsx41("span", { className: item.danger ? "shrink-0 text-warn" : "shrink-0 text-primary-300", children: item.icon }),
1894
+ /* @__PURE__ */ jsx41("span", { children: item.label })
1840
1895
  ]
1841
1896
  }
1842
1897
  )
@@ -1844,14 +1899,14 @@ function ActionMenu({
1844
1899
  }
1845
1900
  )
1846
1901
  ] }) : null;
1847
- return /* @__PURE__ */ jsxs26("div", { ref: btnRef, className: fullWidth ? "relative w-full" : "relative inline-block max-w-full", children: [
1848
- /* @__PURE__ */ jsx38(
1902
+ return /* @__PURE__ */ jsxs28("div", { ref: btnRef, className: fullWidth ? "relative w-full" : "relative inline-block max-w-full", children: [
1903
+ /* @__PURE__ */ jsx41(
1849
1904
  Button,
1850
1905
  {
1851
1906
  size: buttonSize,
1852
1907
  variant: buttonVariant,
1853
1908
  icon,
1854
- iconRight: /* @__PURE__ */ jsx38(ChevronDown, { size: 11 }),
1909
+ iconRight: /* @__PURE__ */ jsx41(ChevronDown, { size: 11 }),
1855
1910
  onClick: () => setOpen((value) => !value),
1856
1911
  className: buttonClassName,
1857
1912
  fullWidth,
@@ -1867,29 +1922,29 @@ import { useMemo as useMemo2, useState as useState6 } from "react";
1867
1922
 
1868
1923
  // src/components/table/DataTableRow.tsx
1869
1924
  import { memo } from "react";
1870
- import { jsx as jsx39, jsxs as jsxs27 } from "react/jsx-runtime";
1925
+ import { jsx as jsx42, jsxs as jsxs29 } from "react/jsx-runtime";
1871
1926
  var ALIGN_CLASS = {
1872
1927
  left: "text-left",
1873
1928
  center: "text-center",
1874
1929
  right: "text-right"
1875
1930
  };
1876
- function DataTableRowInner({ row, columns, onRowClick, rowActions }) {
1931
+ function DataTableRowInner({ row, columns, onRowClick, rowActions, densityCellClass = "px-3 py-2.5", striped = true }) {
1877
1932
  const clickable = Boolean(onRowClick);
1878
- return /* @__PURE__ */ jsxs27(
1933
+ return /* @__PURE__ */ jsxs29(
1879
1934
  "tr",
1880
1935
  {
1881
1936
  onClick: clickable ? () => onRowClick?.(row) : void 0,
1882
- className: `border-b border-border transition-colors hover:bg-ink-300/30 ${clickable ? "cursor-pointer" : ""}`,
1937
+ className: `border-b border-[var(--tapiz-border-subtle)] transition-colors hover:bg-[var(--tapiz-bg-surface-muted)] ${striped ? "even:bg-[color-mix(in_srgb,var(--tapiz-bg-surface-muted)_35%,var(--tapiz-bg-surface))]" : ""} ${clickable ? "cursor-pointer" : ""}`,
1883
1938
  children: [
1884
- columns.map((column) => /* @__PURE__ */ jsx39(
1939
+ columns.map((column) => /* @__PURE__ */ jsx42(
1885
1940
  "td",
1886
1941
  {
1887
- className: `px-3 py-2 text-xs text-txt-3 ${ALIGN_CLASS[column.align ?? "left"]} ${column.className ?? ""}`,
1942
+ className: `${densityCellClass} text-xs text-[var(--tapiz-text-secondary)] ${ALIGN_CLASS[column.align ?? "left"]} ${column.className ?? ""}`,
1888
1943
  children: column.cell(row)
1889
1944
  },
1890
1945
  column.id
1891
1946
  )),
1892
- rowActions !== void 0 && /* @__PURE__ */ jsx39("td", { className: "px-3 py-2 text-right", children: rowActions(row) })
1947
+ rowActions !== void 0 && /* @__PURE__ */ jsx42("td", { className: `${densityCellClass} text-right`, children: rowActions(row) })
1893
1948
  ]
1894
1949
  }
1895
1950
  );
@@ -1897,7 +1952,7 @@ function DataTableRowInner({ row, columns, onRowClick, rowActions }) {
1897
1952
  var DataTableRow = memo(DataTableRowInner);
1898
1953
 
1899
1954
  // src/components/table/DataTable.tsx
1900
- import { jsx as jsx40, jsxs as jsxs28 } from "react/jsx-runtime";
1955
+ import { jsx as jsx43, jsxs as jsxs30 } from "react/jsx-runtime";
1901
1956
  var ALIGN_CLASS2 = {
1902
1957
  left: "text-left",
1903
1958
  center: "text-center",
@@ -1927,7 +1982,12 @@ function DataTable({
1927
1982
  rowActions,
1928
1983
  serverSort,
1929
1984
  footer,
1930
- mobileCard
1985
+ mobileCard,
1986
+ density = "comfortable",
1987
+ variant = "default",
1988
+ stickyHeader = false,
1989
+ striped = true,
1990
+ className = ""
1931
1991
  }) {
1932
1992
  const [sort, setSort] = useState6(null);
1933
1993
  const sortedData = useMemo2(() => {
@@ -1952,24 +2012,32 @@ function DataTable({
1952
2012
  const hasActions = rowActions !== void 0;
1953
2013
  const colCount = columns.length + (hasActions ? 1 : 0);
1954
2014
  const tableClass = mobileCard !== void 0 ? "hidden md:table w-full text-sm table-collapse" : "w-full text-sm table-collapse";
1955
- return /* @__PURE__ */ jsxs28("div", { className: "border border-border overflow-x-auto", children: [
1956
- mobileCard !== void 0 && /* @__PURE__ */ jsx40("div", { className: "md:hidden", children: isLoading ? Array.from({ length: loadingRows }).map((_, i) => /* @__PURE__ */ jsx40("div", { className: "h-16 animate-pulse bg-ink-300" }, i)) : sortedData.length === 0 ? emptyState : sortedData.map((row) => /* @__PURE__ */ jsx40("div", { children: mobileCard(row) }, rowKey(row))) }),
1957
- /* @__PURE__ */ jsxs28("table", { className: tableClass, children: [
1958
- /* @__PURE__ */ jsx40("thead", { children: /* @__PURE__ */ jsxs28("tr", { className: "border-b border-border bg-ink-300", children: [
2015
+ const densityHeaderClass = density === "compact" ? "px-3 py-2" : density === "spacious" ? "px-4 py-4" : "px-3 py-2.5";
2016
+ const densityCellClass = density === "compact" ? "px-3 py-2" : density === "spacious" ? "px-4 py-4" : "px-3 py-2.5";
2017
+ const wrapperClass = [
2018
+ "overflow-x-auto",
2019
+ variant === "brutal" ? "border-2 border-[var(--tapiz-border-strong)] shadow-[var(--tapiz-shadow-brutal)]" : "border border-[var(--tapiz-border-subtle)]",
2020
+ variant === "enterprise" ? "bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-md)]" : "",
2021
+ className
2022
+ ].filter(Boolean).join(" ");
2023
+ return /* @__PURE__ */ jsxs30("div", { className: wrapperClass, children: [
2024
+ mobileCard !== void 0 && /* @__PURE__ */ jsx43("div", { className: "md:hidden", children: isLoading ? Array.from({ length: loadingRows }).map((_, i) => /* @__PURE__ */ jsx43("div", { className: "h-16 animate-pulse bg-ink-300" }, i)) : sortedData.length === 0 ? emptyState : sortedData.map((row) => /* @__PURE__ */ jsx43("div", { children: mobileCard(row) }, rowKey(row))) }),
2025
+ /* @__PURE__ */ jsxs30("table", { className: tableClass, children: [
2026
+ /* @__PURE__ */ jsx43("thead", { children: /* @__PURE__ */ jsxs30("tr", { className: "border-b border-border bg-ink-300", children: [
1959
2027
  columns.map((column) => {
1960
- const baseClass = `px-3 py-2.5 ${ALIGN_CLASS2[column.align ?? "left"]} font-mono text-[11px] tracking-[.08em] text-txt-4 font-semibold whitespace-nowrap`;
2028
+ 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`;
1961
2029
  if (!column.sortable || !column.sortAccessor) {
1962
- return /* @__PURE__ */ jsx40("th", { scope: "col", className: baseClass, children: column.header }, column.id);
2030
+ return /* @__PURE__ */ jsx43("th", { scope: "col", className: baseClass, children: column.header }, column.id);
1963
2031
  }
1964
2032
  const active = serverSort ? serverSort.field === column.id : sort?.columnId === column.id;
1965
2033
  const direction = serverSort ? serverSort.dir : sort?.direction ?? "asc";
1966
- return /* @__PURE__ */ jsx40(
2034
+ return /* @__PURE__ */ jsx43(
1967
2035
  "th",
1968
2036
  {
1969
2037
  scope: "col",
1970
2038
  "aria-sort": ariaSort(active, direction),
1971
2039
  className: baseClass,
1972
- children: /* @__PURE__ */ jsxs28(
2040
+ children: /* @__PURE__ */ jsxs30(
1973
2041
  "button",
1974
2042
  {
1975
2043
  type: "button",
@@ -1977,7 +2045,7 @@ function DataTable({
1977
2045
  className: `inline-flex items-center gap-1 select-none transition-colors hover:text-txt-1 ${active ? "text-txt-1" : ""}`,
1978
2046
  children: [
1979
2047
  column.header,
1980
- active && (direction === "asc" ? /* @__PURE__ */ jsx40(ChevronUp, { size: 12 }) : /* @__PURE__ */ jsx40(ChevronDown, { size: 12 }))
2048
+ active && (direction === "asc" ? /* @__PURE__ */ jsx43(ChevronUp, { size: 12 }) : /* @__PURE__ */ jsx43(ChevronDown, { size: 12 }))
1981
2049
  ]
1982
2050
  }
1983
2051
  )
@@ -1985,15 +2053,17 @@ function DataTable({
1985
2053
  column.id
1986
2054
  );
1987
2055
  }),
1988
- hasActions && /* @__PURE__ */ jsx40("th", { scope: "col", className: "px-3 py-2.5 text-right font-mono text-[11px] tracking-[.08em] text-txt-4 font-semibold whitespace-nowrap" })
2056
+ hasActions && /* @__PURE__ */ jsx43("th", { scope: "col", className: "px-3 py-2.5 text-right font-mono text-[11px] tracking-[.08em] text-txt-4 font-semibold whitespace-nowrap" })
1989
2057
  ] }) }),
1990
- /* @__PURE__ */ jsx40("tbody", { children: isLoading ? Array.from({ length: loadingRows }).map((_, rowIndex) => /* @__PURE__ */ jsx40("tr", { className: "border-b border-border", children: Array.from({ length: colCount }).map((__, colIndex) => /* @__PURE__ */ jsx40("td", { className: "px-3 py-2", children: /* @__PURE__ */ jsx40("div", { className: "h-4 bg-ink-300 rounded animate-pulse w-24" }) }, colIndex)) }, rowIndex)) : sortedData.length === 0 ? /* @__PURE__ */ jsx40("tr", { children: /* @__PURE__ */ jsx40("td", { colSpan: colCount, className: "px-4 py-10 text-center text-txt-4 text-sm font-mono", children: emptyState }) }) : sortedData.map((row) => /* @__PURE__ */ jsx40(
2058
+ /* @__PURE__ */ jsx43("tbody", { children: isLoading ? Array.from({ length: loadingRows }).map((_, rowIndex) => /* @__PURE__ */ jsx43("tr", { className: "border-b border-[var(--tapiz-border-subtle)]", children: Array.from({ length: colCount }).map((__, colIndex) => /* @__PURE__ */ jsx43("td", { className: densityCellClass, children: /* @__PURE__ */ jsx43("div", { className: "h-4 w-24 animate-pulse bg-[var(--tapiz-bg-surface-muted)]" }) }, colIndex)) }, rowIndex)) : sortedData.length === 0 ? /* @__PURE__ */ jsx43("tr", { children: /* @__PURE__ */ jsx43("td", { colSpan: colCount, className: "px-4 py-10 text-center text-txt-4 text-sm font-mono", children: emptyState }) }) : sortedData.map((row) => /* @__PURE__ */ jsx43(
1991
2059
  DataTableRow,
1992
2060
  {
1993
2061
  row,
1994
2062
  columns,
1995
2063
  onRowClick,
1996
- rowActions
2064
+ rowActions,
2065
+ densityCellClass,
2066
+ striped
1997
2067
  },
1998
2068
  rowKey(row)
1999
2069
  )) })
@@ -2001,24 +2071,1410 @@ function DataTable({
2001
2071
  footer !== void 0 && footer
2002
2072
  ] });
2003
2073
  }
2074
+
2075
+ // src/components/marketing/MarketingShell.tsx
2076
+ import { jsx as jsx44 } from "react/jsx-runtime";
2077
+ function MarketingShell({ children, className = "", grid = true, noise = true }) {
2078
+ return /* @__PURE__ */ jsx44(
2079
+ "main",
2080
+ {
2081
+ className: [
2082
+ "min-h-screen overflow-hidden bg-[var(--tapiz-bg-page)] text-[var(--tapiz-text-primary)]",
2083
+ grid ? "tapiz-grid-bg" : "",
2084
+ noise ? "tapiz-noise-bg" : "",
2085
+ className
2086
+ ].filter(Boolean).join(" "),
2087
+ children
2088
+ }
2089
+ );
2090
+ }
2091
+
2092
+ // src/components/marketing/HeroFrame.tsx
2093
+ import { jsx as jsx45, jsxs as jsxs31 } from "react/jsx-runtime";
2094
+ function HeroFrame({ eyebrow, title, description, actions, visual, meta, className = "" }) {
2095
+ return /* @__PURE__ */ jsxs31("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: [
2096
+ /* @__PURE__ */ jsxs31("div", { className: "animate-fade-in-up", children: [
2097
+ eyebrow ? /* @__PURE__ */ jsx45("div", { className: "kicker mb-4", children: eyebrow }) : null,
2098
+ /* @__PURE__ */ jsx45("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 }),
2099
+ description ? /* @__PURE__ */ jsx45("p", { className: "mt-6 max-w-2xl text-base leading-7 text-[var(--tapiz-text-secondary)] md:text-lg", children: description }) : null,
2100
+ actions ? /* @__PURE__ */ jsx45("div", { className: "mt-8 flex flex-wrap gap-3", children: actions }) : null,
2101
+ meta ? /* @__PURE__ */ jsx45("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
2102
+ ] }),
2103
+ visual ? /* @__PURE__ */ jsx45("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
2104
+ ] });
2105
+ }
2106
+
2107
+ // src/components/marketing/FeatureCard.tsx
2108
+ import { jsx as jsx46, jsxs as jsxs32 } from "react/jsx-runtime";
2109
+ function FeatureCard({ title, description, icon, eyebrow, children, className = "", variant = "surface" }) {
2110
+ return /* @__PURE__ */ jsxs32(Card, { variant, hover: true, className: `group ${className}`, children: [
2111
+ /* @__PURE__ */ jsxs32("div", { className: "flex items-start gap-4", children: [
2112
+ icon ? /* @__PURE__ */ jsx46("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,
2113
+ /* @__PURE__ */ jsxs32("div", { className: "min-w-0", children: [
2114
+ eyebrow ? /* @__PURE__ */ jsx46("div", { className: "kicker mb-1", children: eyebrow }) : null,
2115
+ /* @__PURE__ */ jsx46("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: title }),
2116
+ description ? /* @__PURE__ */ jsx46("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
2117
+ ] })
2118
+ ] }),
2119
+ children ? /* @__PURE__ */ jsx46("div", { className: "mt-5", children }) : null
2120
+ ] });
2121
+ }
2122
+
2123
+ // src/components/marketing/FeatureGrid.tsx
2124
+ import { jsx as jsx47 } from "react/jsx-runtime";
2125
+ function FeatureGrid({ children, className = "" }) {
2126
+ return /* @__PURE__ */ jsx47("div", { className: `grid gap-4 md:grid-cols-2 xl:grid-cols-3 ${className}`, children });
2127
+ }
2128
+
2129
+ // src/components/marketing/CTASection.tsx
2130
+ import { jsx as jsx48, jsxs as jsxs33 } from "react/jsx-runtime";
2131
+ function CTASection({ eyebrow, title, description, actions, className = "" }) {
2132
+ return /* @__PURE__ */ jsx48("section", { className: `mx-auto max-w-7xl px-[var(--tapiz-space-page-x)] py-[var(--tapiz-space-section-y)] ${className}`, children: /* @__PURE__ */ jsxs33("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: [
2133
+ eyebrow ? /* @__PURE__ */ jsx48("div", { className: "kicker mb-3", children: eyebrow }) : null,
2134
+ /* @__PURE__ */ jsxs33("div", { className: "grid gap-6 lg:grid-cols-[1fr_auto] lg:items-end", children: [
2135
+ /* @__PURE__ */ jsxs33("div", { children: [
2136
+ /* @__PURE__ */ jsx48("h2", { className: "max-w-3xl text-3xl font-semibold tracking-[-0.05em] md:text-5xl", children: title }),
2137
+ description ? /* @__PURE__ */ jsx48("p", { className: "mt-4 max-w-2xl text-base leading-7 text-[var(--tapiz-text-secondary)]", children: description }) : null
2138
+ ] }),
2139
+ actions ? /* @__PURE__ */ jsx48("div", { className: "flex flex-wrap gap-3", children: actions }) : null
2140
+ ] })
2141
+ ] }) });
2142
+ }
2143
+
2144
+ // src/components/marketing/MockupFrame.tsx
2145
+ import { jsx as jsx49, jsxs as jsxs34 } from "react/jsx-runtime";
2146
+ function MockupFrame({ children, title, toolbar, className = "" }) {
2147
+ return /* @__PURE__ */ jsxs34("div", { className: `overflow-hidden border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-brutal)] ${className}`, children: [
2148
+ /* @__PURE__ */ jsxs34("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: [
2149
+ /* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-1.5", children: [
2150
+ /* @__PURE__ */ jsx49("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-danger)]" }),
2151
+ /* @__PURE__ */ jsx49("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-warning)]" }),
2152
+ /* @__PURE__ */ jsx49("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-success)]" })
2153
+ ] }),
2154
+ title ? /* @__PURE__ */ jsx49("div", { className: "font-mono text-[10px] uppercase tracking-widest text-[var(--tapiz-text-muted)]", children: title }) : null,
2155
+ /* @__PURE__ */ jsx49("div", { children: toolbar })
2156
+ ] }),
2157
+ /* @__PURE__ */ jsx49("div", { className: "p-4", children })
2158
+ ] });
2159
+ }
2160
+
2161
+ // src/components/marketing/ComparisonTable.tsx
2162
+ import { jsx as jsx50, jsxs as jsxs35 } from "react/jsx-runtime";
2163
+ function ComparisonTable({ rows, featureHeader = "Feature", includedHeader = "Tapiz", alternativeHeader = "Other", className = "" }) {
2164
+ return /* @__PURE__ */ jsx50("div", { className: `overflow-x-auto border border-[var(--tapiz-border-strong)] ${className}`, children: /* @__PURE__ */ jsxs35("table", { className: "w-full text-sm", children: [
2165
+ /* @__PURE__ */ jsx50("thead", { children: /* @__PURE__ */ jsxs35("tr", { children: [
2166
+ /* @__PURE__ */ jsx50("th", { className: "px-4 py-3 text-left", children: featureHeader }),
2167
+ /* @__PURE__ */ jsx50("th", { className: "px-4 py-3 text-left", children: includedHeader }),
2168
+ /* @__PURE__ */ jsx50("th", { className: "px-4 py-3 text-left", children: alternativeHeader })
2169
+ ] }) }),
2170
+ /* @__PURE__ */ jsx50("tbody", { children: rows.map((row, index) => /* @__PURE__ */ jsxs35("tr", { className: "border-t border-[var(--tapiz-border-subtle)]", children: [
2171
+ /* @__PURE__ */ jsx50("td", { className: "px-4 py-3 font-medium text-[var(--tapiz-text-primary)]", children: row.feature }),
2172
+ /* @__PURE__ */ jsx50("td", { className: "px-4 py-3 text-[var(--tapiz-text-secondary)]", children: row.included }),
2173
+ /* @__PURE__ */ jsx50("td", { className: "px-4 py-3 text-[var(--tapiz-text-muted)]", children: row.alternative })
2174
+ ] }, index)) })
2175
+ ] }) });
2176
+ }
2177
+
2178
+ // src/components/layout/AppShell.tsx
2179
+ import { jsx as jsx51, jsxs as jsxs36 } from "react/jsx-runtime";
2180
+ var variantClasses4 = {
2181
+ default: "bg-[var(--tapiz-bg-page)]",
2182
+ grid: "bg-[var(--tapiz-bg-page)] tapiz-grid-bg",
2183
+ noise: "bg-[var(--tapiz-bg-page)] tapiz-noise-bg"
2184
+ };
2185
+ function AppShell({ sidebar, topbar, children, aside, className = "", contentClassName = "", variant = "default" }) {
2186
+ return /* @__PURE__ */ jsxs36("div", { className: `min-h-screen text-[var(--tapiz-text-primary)] ${variantClasses4[variant]} ${className}`, children: [
2187
+ topbar,
2188
+ /* @__PURE__ */ jsxs36("div", { className: "mx-auto flex w-full max-w-[1600px]", children: [
2189
+ sidebar ? /* @__PURE__ */ jsx51("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,
2190
+ /* @__PURE__ */ jsx51("main", { className: `min-w-0 flex-1 px-[var(--tapiz-space-page-x)] py-6 ${contentClassName}`, children }),
2191
+ aside ? /* @__PURE__ */ jsx51("aside", { className: "hidden w-80 shrink-0 border-l border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] xl:block", children: aside }) : null
2192
+ ] })
2193
+ ] });
2194
+ }
2195
+
2196
+ // src/components/layout/SplitPane.tsx
2197
+ import { jsx as jsx52, jsxs as jsxs37 } from "react/jsx-runtime";
2198
+ var ratios = {
2199
+ "50/50": "lg:grid-cols-2",
2200
+ "60/40": "lg:grid-cols-[minmax(0,3fr)_minmax(320px,2fr)]",
2201
+ "70/30": "lg:grid-cols-[minmax(0,7fr)_minmax(280px,3fr)]"
2202
+ };
2203
+ function SplitPane({ primary, secondary, ratio = "60/40", reverseOnMobile = false, className = "" }) {
2204
+ return /* @__PURE__ */ jsxs37("div", { className: `grid gap-5 ${ratios[ratio]} ${className}`, children: [
2205
+ /* @__PURE__ */ jsx52("div", { className: reverseOnMobile ? "order-2 lg:order-1" : "", children: primary }),
2206
+ /* @__PURE__ */ jsx52("div", { className: reverseOnMobile ? "order-1 lg:order-2" : "", children: secondary })
2207
+ ] });
2208
+ }
2209
+
2210
+ // src/components/layout/Stack.tsx
2211
+ import { jsx as jsx53 } from "react/jsx-runtime";
2212
+ var gapClasses = { xs: "gap-1", sm: "gap-2", md: "gap-4", lg: "gap-6", xl: "gap-8" };
2213
+ var alignClasses = { start: "items-start", center: "items-center", end: "items-end", stretch: "items-stretch" };
2214
+ var justifyClasses = { start: "justify-start", center: "justify-center", between: "justify-between", end: "justify-end" };
2215
+ function Stack({ children, gap = "md", direction = "vertical", align = "stretch", justify = "start", wrap = false, className = "" }) {
2216
+ return /* @__PURE__ */ jsx53("div", { className: `flex ${direction === "vertical" ? "flex-col" : "flex-row"} ${gapClasses[gap]} ${alignClasses[align]} ${justifyClasses[justify]} ${wrap ? "flex-wrap" : ""} ${className}`, children });
2217
+ }
2218
+
2219
+ // src/components/layout/Cluster.tsx
2220
+ import { jsx as jsx54 } from "react/jsx-runtime";
2221
+ var gapClasses2 = { xs: "gap-1", sm: "gap-2", md: "gap-3", lg: "gap-5" };
2222
+ var alignClasses2 = { start: "items-start", center: "items-center", end: "items-end" };
2223
+ var justifyClasses2 = { start: "justify-start", center: "justify-center", between: "justify-between", end: "justify-end" };
2224
+ function Cluster({ children, gap = "sm", align = "center", justify = "start", className = "" }) {
2225
+ return /* @__PURE__ */ jsx54("div", { className: `flex flex-wrap ${gapClasses2[gap]} ${alignClasses2[align]} ${justifyClasses2[justify]} ${className}`, children });
2226
+ }
2227
+
2228
+ // src/components/navigation/Breadcrumbs.tsx
2229
+ import { jsx as jsx55, jsxs as jsxs38 } from "react/jsx-runtime";
2230
+ function Breadcrumbs({ items, separator = "/", className = "" }) {
2231
+ return /* @__PURE__ */ jsx55("nav", { "aria-label": "Breadcrumb", className: `font-mono text-[10px] uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)] ${className}`, children: /* @__PURE__ */ jsx55("ol", { className: "flex flex-wrap items-center gap-2", children: items.map((item, index) => /* @__PURE__ */ jsxs38("li", { className: "flex items-center gap-2", children: [
2232
+ index > 0 ? /* @__PURE__ */ jsx55("span", { "aria-hidden": "true", className: "text-[var(--tapiz-text-disabled)]", children: separator }) : null,
2233
+ item.href && !item.current ? /* @__PURE__ */ jsx55("a", { className: "hover:text-[var(--tapiz-accent)]", href: item.href, children: item.label }) : /* @__PURE__ */ jsx55("span", { "aria-current": item.current ? "page" : void 0, className: item.current ? "text-[var(--tapiz-text-primary)]" : "", children: item.label })
2234
+ ] }, index)) }) });
2235
+ }
2236
+
2237
+ // src/components/navigation/SidebarNav.tsx
2238
+ import { Fragment as Fragment2, jsx as jsx56, jsxs as jsxs39 } from "react/jsx-runtime";
2239
+ function SidebarNav({ groups, header, footer, className = "" }) {
2240
+ return /* @__PURE__ */ jsxs39("div", { className: `flex h-full min-h-screen flex-col bg-[var(--tapiz-bg-surface)] ${className}`, children: [
2241
+ header ? /* @__PURE__ */ jsx56("div", { className: "border-b border-[var(--tapiz-border-subtle)] p-4", children: header }) : null,
2242
+ /* @__PURE__ */ jsx56("nav", { className: "flex-1 space-y-6 p-3", children: groups.map((group, groupIndex) => /* @__PURE__ */ jsxs39("div", { children: [
2243
+ group.label ? /* @__PURE__ */ jsx56("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,
2244
+ /* @__PURE__ */ jsx56("div", { className: "space-y-1", children: group.items.map((item, itemIndex) => /* @__PURE__ */ jsx56(SidebarNavLink, { item }, itemIndex)) })
2245
+ ] }, groupIndex)) }),
2246
+ footer ? /* @__PURE__ */ jsx56("div", { className: "border-t border-[var(--tapiz-border-subtle)] p-4", children: footer }) : null
2247
+ ] });
2248
+ }
2249
+ function SidebarNavLink({ item }) {
2250
+ const className = [
2251
+ "flex w-full items-center gap-3 border px-3 py-2 text-left text-sm font-medium",
2252
+ 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)]",
2253
+ item.disabled ? "pointer-events-none opacity-40" : ""
2254
+ ].filter(Boolean).join(" ");
2255
+ const content = /* @__PURE__ */ jsxs39(Fragment2, { children: [
2256
+ item.icon ? /* @__PURE__ */ jsx56("span", { className: "grid size-5 place-items-center text-[var(--tapiz-text-muted)]", children: item.icon }) : null,
2257
+ /* @__PURE__ */ jsx56("span", { className: "min-w-0 flex-1 truncate", children: item.label }),
2258
+ item.badge ? /* @__PURE__ */ jsx56("span", { children: item.badge }) : null
2259
+ ] });
2260
+ return item.href ? /* @__PURE__ */ jsx56("a", { className, href: item.href, children: content }) : /* @__PURE__ */ jsx56("button", { type: "button", className, onClick: item.onClick, disabled: item.disabled, children: content });
2261
+ }
2262
+
2263
+ // src/components/navigation/TopNav.tsx
2264
+ import { jsx as jsx57, jsxs as jsxs40 } from "react/jsx-runtime";
2265
+ function TopNav({ brand, links = [], actions, className = "", sticky = true }) {
2266
+ return /* @__PURE__ */ jsx57("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__ */ jsxs40("div", { className: "mx-auto flex h-16 max-w-[1600px] items-center gap-6 px-[var(--tapiz-space-page-x)]", children: [
2267
+ brand ? /* @__PURE__ */ jsx57("div", { className: "shrink-0", children: brand }) : null,
2268
+ /* @__PURE__ */ jsx57("nav", { className: "hidden items-center gap-1 md:flex", children: links.map((link, index) => {
2269
+ 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)]"}`;
2270
+ return link.href ? /* @__PURE__ */ jsx57("a", { href: link.href, className: cls, children: link.label }, index) : /* @__PURE__ */ jsx57("button", { type: "button", onClick: link.onClick, className: cls, children: link.label }, index);
2271
+ }) }),
2272
+ actions ? /* @__PURE__ */ jsx57("div", { className: "ml-auto flex items-center gap-2", children: actions }) : null
2273
+ ] }) });
2274
+ }
2275
+
2276
+ // src/components/disclosure/Tabs.tsx
2277
+ import { jsx as jsx58, jsxs as jsxs41 } from "react/jsx-runtime";
2278
+ var variants = {
2279
+ line: "border-b border-[var(--tapiz-border-subtle)]",
2280
+ boxed: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-1",
2281
+ brutal: "border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] p-1 shadow-[var(--tapiz-shadow-brutal)]"
2282
+ };
2283
+ function Tabs({ items, activeId, onChange, className = "", variant = "line" }) {
2284
+ const active = items.find((item) => item.id === activeId) ?? items[0];
2285
+ return /* @__PURE__ */ jsxs41("div", { className, children: [
2286
+ /* @__PURE__ */ jsx58("div", { role: "tablist", className: `flex flex-wrap gap-1 ${variants[variant]}`, children: items.map((item) => {
2287
+ const selected = item.id === active?.id;
2288
+ return /* @__PURE__ */ jsxs41(
2289
+ "button",
2290
+ {
2291
+ type: "button",
2292
+ role: "tab",
2293
+ "aria-selected": selected,
2294
+ disabled: item.disabled,
2295
+ onClick: () => onChange?.(item.id),
2296
+ className: `inline-flex items-center gap-2 px-3 py-2 text-sm font-semibold disabled:cursor-not-allowed disabled:opacity-40 ${selected ? "bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-primary)] shadow-[inset_0_-2px_0_var(--tapiz-accent)]" : "text-[var(--tapiz-text-muted)] hover:bg-[var(--tapiz-bg-surface)] hover:text-[var(--tapiz-text-primary)]"}`,
2297
+ children: [
2298
+ item.label,
2299
+ item.badge
2300
+ ]
2301
+ },
2302
+ item.id
2303
+ );
2304
+ }) }),
2305
+ /* @__PURE__ */ jsx58("div", { role: "tabpanel", className: "pt-4", children: active?.content })
2306
+ ] });
2307
+ }
2308
+
2309
+ // src/components/disclosure/Accordion.tsx
2310
+ import { jsx as jsx59, jsxs as jsxs42 } from "react/jsx-runtime";
2311
+ function Accordion({ items, openIds = [], onToggle, className = "" }) {
2312
+ return /* @__PURE__ */ jsx59("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) => {
2313
+ const open = openIds.includes(item.id);
2314
+ return /* @__PURE__ */ jsxs42("section", { children: [
2315
+ /* @__PURE__ */ jsxs42(
2316
+ "button",
2317
+ {
2318
+ type: "button",
2319
+ disabled: item.disabled,
2320
+ "aria-expanded": open,
2321
+ onClick: () => onToggle?.(item.id),
2322
+ className: "flex w-full items-center justify-between gap-4 px-4 py-3 text-left disabled:opacity-40",
2323
+ children: [
2324
+ /* @__PURE__ */ jsx59("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
2325
+ /* @__PURE__ */ jsxs42("span", { className: "flex items-center gap-3 text-[var(--tapiz-text-muted)]", children: [
2326
+ item.meta,
2327
+ /* @__PURE__ */ jsx59("span", { "aria-hidden": "true", className: "font-mono text-lg", children: open ? "\u2212" : "+" })
2328
+ ] })
2329
+ ]
2330
+ }
2331
+ ),
2332
+ open ? /* @__PURE__ */ jsx59("div", { className: "border-t border-[var(--tapiz-border-subtle)] px-4 py-4 text-sm text-[var(--tapiz-text-secondary)]", children: item.content }) : null
2333
+ ] }, item.id);
2334
+ }) });
2335
+ }
2336
+
2337
+ // src/components/disclosure/Stepper.tsx
2338
+ import { jsx as jsx60, jsxs as jsxs43 } from "react/jsx-runtime";
2339
+ var tone = {
2340
+ complete: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
2341
+ current: "border-[var(--tapiz-accent)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-accent)]",
2342
+ upcoming: "border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-muted)]",
2343
+ error: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]"
2344
+ };
2345
+ function Stepper({ steps, orientation = "horizontal", className = "" }) {
2346
+ return /* @__PURE__ */ jsx60("ol", { className: `grid gap-3 ${orientation === "horizontal" ? "md:grid-cols-[repeat(auto-fit,minmax(0,1fr))]" : ""} ${className}`, children: steps.map((step, index) => {
2347
+ const status = step.status ?? "upcoming";
2348
+ return /* @__PURE__ */ jsxs43("li", { className: "flex gap-3", children: [
2349
+ /* @__PURE__ */ jsx60("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 }),
2350
+ /* @__PURE__ */ jsxs43("span", { className: "min-w-0", children: [
2351
+ /* @__PURE__ */ jsx60("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: step.label }),
2352
+ step.description ? /* @__PURE__ */ jsx60("span", { className: "mt-1 block text-xs text-[var(--tapiz-text-muted)]", children: step.description }) : null
2353
+ ] })
2354
+ ] }, step.id);
2355
+ }) });
2356
+ }
2357
+
2358
+ // src/components/overlays/Drawer.tsx
2359
+ import { jsx as jsx61, jsxs as jsxs44 } from "react/jsx-runtime";
2360
+ function Drawer({ open, onClose, title, description, children, footer, side = "right", className = "" }) {
2361
+ if (!open) return null;
2362
+ return /* @__PURE__ */ jsxs44("div", { className: "fixed inset-0 z-50", children: [
2363
+ /* @__PURE__ */ jsx61("button", { type: "button", "aria-label": "Close drawer", className: "absolute inset-0 bg-[var(--tapiz-bg-overlay)]", onClick: onClose }),
2364
+ /* @__PURE__ */ jsxs44("section", { className: `absolute top-0 h-full w-full max-w-md border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-lg)] ${side === "right" ? "right-0 border-l" : "left-0 border-r"} ${className}`, children: [
2365
+ /* @__PURE__ */ jsxs44("header", { className: "flex items-start justify-between gap-4 border-b border-[var(--tapiz-border-subtle)] p-5", children: [
2366
+ /* @__PURE__ */ jsxs44("div", { children: [
2367
+ title ? /* @__PURE__ */ jsx61("h2", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
2368
+ description ? /* @__PURE__ */ jsx61("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null
2369
+ ] }),
2370
+ /* @__PURE__ */ jsx61("button", { type: "button", onClick: onClose, className: "border border-[var(--tapiz-border-subtle)] px-2 py-1 font-mono text-sm text-[var(--tapiz-text-muted)] hover:text-[var(--tapiz-text-primary)]", children: "\xD7" })
2371
+ ] }),
2372
+ /* @__PURE__ */ jsx61("div", { className: "max-h-[calc(100vh-9rem)] overflow-auto p-5", children }),
2373
+ footer ? /* @__PURE__ */ jsx61("footer", { className: "border-t border-[var(--tapiz-border-subtle)] p-4", children: footer }) : null
2374
+ ] })
2375
+ ] });
2376
+ }
2377
+
2378
+ // src/components/overlays/Popover.tsx
2379
+ import { jsx as jsx62, jsxs as jsxs45 } from "react/jsx-runtime";
2380
+ function Popover({ trigger, children, open = false, align = "start", className = "" }) {
2381
+ return /* @__PURE__ */ jsxs45("div", { className: `relative inline-block ${className}`, children: [
2382
+ trigger,
2383
+ open ? /* @__PURE__ */ jsx62("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
2384
+ ] });
2385
+ }
2386
+
2387
+ // src/components/overlays/CommandMenu.tsx
2388
+ import { jsx as jsx63, jsxs as jsxs46 } from "react/jsx-runtime";
2389
+ function CommandMenu({ open, onClose, query = "", onQueryChange, groups, placeholder = "Search commands\u2026", empty = "No commands found." }) {
2390
+ if (!open) return null;
2391
+ const hasItems = groups.some((group) => group.items.length > 0);
2392
+ return /* @__PURE__ */ jsx63("div", { className: "fixed inset-0 z-50 grid place-items-start bg-[var(--tapiz-bg-overlay)] px-4 pt-[12vh]", onClick: onClose, children: /* @__PURE__ */ jsxs46("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: [
2393
+ /* @__PURE__ */ jsx63("div", { className: "border-b border-[var(--tapiz-border-subtle)] p-3", children: /* @__PURE__ */ jsx63(SearchInput, { value: query, onChange: (value) => onQueryChange?.(value), placeholder, autoFocus: true }) }),
2394
+ /* @__PURE__ */ jsxs46("div", { className: "max-h-[50vh] overflow-auto p-2", children: [
2395
+ !hasItems ? /* @__PURE__ */ jsx63("div", { className: "p-6 text-center text-sm text-[var(--tapiz-text-muted)]", children: empty }) : null,
2396
+ groups.map((group, groupIndex) => /* @__PURE__ */ jsxs46("div", { className: "py-2", children: [
2397
+ group.label ? /* @__PURE__ */ jsx63("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,
2398
+ group.items.map((item) => /* @__PURE__ */ jsxs46("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: [
2399
+ item.icon ? /* @__PURE__ */ jsx63("span", { className: "grid size-8 place-items-center border border-[var(--tapiz-border-subtle)] text-[var(--tapiz-text-muted)]", children: item.icon }) : null,
2400
+ /* @__PURE__ */ jsxs46("span", { className: "min-w-0 flex-1", children: [
2401
+ /* @__PURE__ */ jsx63("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.label }),
2402
+ item.description ? /* @__PURE__ */ jsx63("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: item.description }) : null
2403
+ ] }),
2404
+ item.shortcut ? /* @__PURE__ */ jsx63("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.shortcut }) : null
2405
+ ] }, item.id))
2406
+ ] }, groupIndex))
2407
+ ] })
2408
+ ] }) });
2409
+ }
2410
+
2411
+ // src/components/forms/FormField.tsx
2412
+ import { jsx as jsx64, jsxs as jsxs47 } from "react/jsx-runtime";
2413
+ function FormField({ label, hint, error, required, htmlFor, children, className = "" }) {
2414
+ return /* @__PURE__ */ jsxs47("div", { className: `space-y-1.5 ${className}`, children: [
2415
+ label ? /* @__PURE__ */ jsxs47(FieldLabel, { htmlFor, children: [
2416
+ label,
2417
+ required ? " *" : ""
2418
+ ] }) : null,
2419
+ children,
2420
+ error ? /* @__PURE__ */ jsx64(FormError, { message: String(error) }) : hint ? /* @__PURE__ */ jsx64(FieldHint, { children: hint }) : null
2421
+ ] });
2422
+ }
2423
+
2424
+ // src/components/forms/Switch.tsx
2425
+ import { jsx as jsx65, jsxs as jsxs48 } from "react/jsx-runtime";
2426
+ function Switch({ checked = false, onChange, disabled, label, description, className = "" }) {
2427
+ return /* @__PURE__ */ jsxs48("label", { className: `flex cursor-pointer items-start gap-3 ${disabled ? "cursor-not-allowed opacity-50" : ""} ${className}`, children: [
2428
+ /* @__PURE__ */ jsx65(
2429
+ "button",
2430
+ {
2431
+ type: "button",
2432
+ role: "switch",
2433
+ "aria-checked": checked,
2434
+ disabled,
2435
+ onClick: () => onChange?.(!checked),
2436
+ 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)]"}`,
2437
+ children: /* @__PURE__ */ jsx65("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"}` })
2438
+ }
2439
+ ),
2440
+ label || description ? /* @__PURE__ */ jsxs48("span", { children: [
2441
+ label ? /* @__PURE__ */ jsx65("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: label }) : null,
2442
+ description ? /* @__PURE__ */ jsx65("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: description }) : null
2443
+ ] }) : null
2444
+ ] });
2445
+ }
2446
+
2447
+ // src/components/forms/ToggleGroup.tsx
2448
+ import { jsx as jsx66 } from "react/jsx-runtime";
2449
+ function ToggleGroup({ options, value, onChange, className = "", fullWidth = false }) {
2450
+ return /* @__PURE__ */ jsx66("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) => {
2451
+ const selected = option.value === value;
2452
+ return /* @__PURE__ */ jsx66(
2453
+ "button",
2454
+ {
2455
+ type: "button",
2456
+ disabled: option.disabled,
2457
+ onClick: () => onChange?.(option.value),
2458
+ className: `px-3 py-1.5 text-sm font-semibold disabled:opacity-40 ${fullWidth ? "flex-1" : ""} ${selected ? "bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-primary)] shadow-[inset_0_-2px_0_var(--tapiz-accent)]" : "text-[var(--tapiz-text-muted)] hover:text-[var(--tapiz-text-primary)]"}`,
2459
+ children: option.label
2460
+ },
2461
+ option.value
2462
+ );
2463
+ }) });
2464
+ }
2465
+
2466
+ // src/components/forms/InputGroup.tsx
2467
+ import { jsx as jsx67, jsxs as jsxs49 } from "react/jsx-runtime";
2468
+ function InputGroup({ prefix, suffix, children, className = "" }) {
2469
+ return /* @__PURE__ */ jsxs49("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: [
2470
+ prefix ? /* @__PURE__ */ jsx67("div", { className: "flex items-center border-r border-[var(--tapiz-border-subtle)] px-3 text-sm text-[var(--tapiz-text-muted)]", children: prefix }) : null,
2471
+ /* @__PURE__ */ jsx67("div", { className: "min-w-0 flex-1 [&_input]:border-0 [&_input]:shadow-none [&_input]:focus:shadow-none", children }),
2472
+ suffix ? /* @__PURE__ */ jsx67("div", { className: "flex items-center border-l border-[var(--tapiz-border-subtle)] px-3 text-sm text-[var(--tapiz-text-muted)]", children: suffix }) : null
2473
+ ] });
2474
+ }
2475
+
2476
+ // src/components/feedback/Alert.tsx
2477
+ import { jsx as jsx68, jsxs as jsxs50 } from "react/jsx-runtime";
2478
+ var toneClasses = {
2479
+ info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)] text-[var(--tapiz-info)]",
2480
+ success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
2481
+ warning: "border-[var(--tapiz-warning)] bg-[var(--tapiz-warning-soft)] text-[var(--tapiz-warning)]",
2482
+ danger: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]",
2483
+ neutral: "border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-secondary)]"
2484
+ };
2485
+ function Alert2({ tone: tone2 = "info", title, children, icon, actions, className = "" }) {
2486
+ return /* @__PURE__ */ jsxs50("div", { className: `flex gap-3 border p-4 ${toneClasses[tone2]} ${className}`, children: [
2487
+ icon ? /* @__PURE__ */ jsx68("div", { className: "mt-0.5 shrink-0", children: icon }) : null,
2488
+ /* @__PURE__ */ jsxs50("div", { className: "min-w-0 flex-1", children: [
2489
+ title ? /* @__PURE__ */ jsx68("div", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
2490
+ children ? /* @__PURE__ */ jsx68("div", { className: "mt-1 text-sm text-[var(--tapiz-text-secondary)]", children }) : null
2491
+ ] }),
2492
+ actions ? /* @__PURE__ */ jsx68("div", { className: "shrink-0", children: actions }) : null
2493
+ ] });
2494
+ }
2495
+
2496
+ // src/components/feedback/Progress.tsx
2497
+ import { jsx as jsx69, jsxs as jsxs51 } from "react/jsx-runtime";
2498
+ var tones = {
2499
+ accent: "bg-[var(--tapiz-accent)]",
2500
+ success: "bg-[var(--tapiz-success)]",
2501
+ warning: "bg-[var(--tapiz-warning)]",
2502
+ danger: "bg-[var(--tapiz-danger)]"
2503
+ };
2504
+ function Progress({ value, max = 100, label, showValue = false, tone: tone2 = "accent", className = "" }) {
2505
+ const percentage = Math.max(0, Math.min(100, value / max * 100));
2506
+ return /* @__PURE__ */ jsxs51("div", { className, children: [
2507
+ label || showValue ? /* @__PURE__ */ jsxs51("div", { className: "mb-1 flex items-center justify-between gap-3 text-xs text-[var(--tapiz-text-muted)]", children: [
2508
+ label ? /* @__PURE__ */ jsx69("span", { children: label }) : /* @__PURE__ */ jsx69("span", {}),
2509
+ showValue ? /* @__PURE__ */ jsxs51("span", { className: "font-mono", children: [
2510
+ Math.round(percentage),
2511
+ "%"
2512
+ ] }) : null
2513
+ ] }) : null,
2514
+ /* @__PURE__ */ jsx69("div", { className: "h-2 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx69("div", { className: `h-full ${tones[tone2]}`, style: { width: `${percentage}%` } }) })
2515
+ ] });
2516
+ }
2517
+
2518
+ // src/components/shared/Avatar.tsx
2519
+ import { jsx as jsx70 } from "react/jsx-runtime";
2520
+ var sizes = { xs: "size-6 text-[10px]", sm: "size-8 text-xs", md: "size-10 text-sm", lg: "size-14 text-base" };
2521
+ function Avatar({ src, name = "?", size = "md", className = "" }) {
2522
+ const initials = name.split(" ").filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase()).join("") || "?";
2523
+ return src ? /* @__PURE__ */ jsx70("img", { src, alt: name, className: `border border-[var(--tapiz-border-strong)] object-cover ${sizes[size]} ${className}` }) : /* @__PURE__ */ jsx70("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 });
2524
+ }
2525
+
2526
+ // src/components/shared/Kbd.tsx
2527
+ import { jsx as jsx71 } from "react/jsx-runtime";
2528
+ function Kbd({ children, className = "" }) {
2529
+ return /* @__PURE__ */ jsx71("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 });
2530
+ }
2531
+
2532
+ // src/components/shared/Timeline.tsx
2533
+ import { jsx as jsx72, jsxs as jsxs52 } from "react/jsx-runtime";
2534
+ var tones2 = {
2535
+ neutral: "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-muted)]",
2536
+ info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)] text-[var(--tapiz-info)]",
2537
+ success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
2538
+ warning: "border-[var(--tapiz-warning)] bg-[var(--tapiz-warning-soft)] text-[var(--tapiz-warning)]",
2539
+ danger: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]"
2540
+ };
2541
+ function Timeline({ items, className = "" }) {
2542
+ return /* @__PURE__ */ jsx72("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__ */ jsxs52("li", { className: "relative flex gap-3", children: [
2543
+ /* @__PURE__ */ jsx72("span", { className: `z-10 grid size-8 shrink-0 place-items-center border text-xs ${tones2[item.tone ?? "neutral"]}`, children: item.icon ?? "\u2022" }),
2544
+ /* @__PURE__ */ jsxs52("span", { className: "min-w-0 flex-1 pb-2", children: [
2545
+ /* @__PURE__ */ jsxs52("span", { className: "flex flex-wrap items-baseline justify-between gap-2", children: [
2546
+ /* @__PURE__ */ jsx72("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
2547
+ item.time ? /* @__PURE__ */ jsx72("span", { className: "font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: item.time }) : null
2548
+ ] }),
2549
+ item.description ? /* @__PURE__ */ jsx72("span", { className: "mt-1 block text-sm text-[var(--tapiz-text-secondary)]", children: item.description }) : null
2550
+ ] })
2551
+ ] }, item.id)) });
2552
+ }
2553
+
2554
+ // src/components/shared/KeyValueList.tsx
2555
+ import { jsx as jsx73, jsxs as jsxs53 } from "react/jsx-runtime";
2556
+ function KeyValueList({ items, className = "", density = "normal" }) {
2557
+ return /* @__PURE__ */ jsx73("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__ */ jsxs53("div", { className: `grid gap-2 ${density === "compact" ? "p-3 md:grid-cols-[160px_1fr]" : "p-4 md:grid-cols-[220px_1fr]"}`, children: [
2558
+ /* @__PURE__ */ jsx73("dt", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: item.keyLabel }),
2559
+ /* @__PURE__ */ jsxs53("dd", { children: [
2560
+ /* @__PURE__ */ jsx73("div", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.value }),
2561
+ item.description ? /* @__PURE__ */ jsx73("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.description }) : null
2562
+ ] })
2563
+ ] }, index)) });
2564
+ }
2565
+
2566
+ // src/components/shared/CodeBlock.tsx
2567
+ import { jsx as jsx74, jsxs as jsxs54 } from "react/jsx-runtime";
2568
+ function CodeBlock({ children, language, title, actions, className = "" }) {
2569
+ return /* @__PURE__ */ jsxs54("figure", { className: `overflow-hidden border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
2570
+ title || language || actions ? /* @__PURE__ */ jsxs54("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: [
2571
+ /* @__PURE__ */ jsx74("span", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: title ?? language }),
2572
+ actions
2573
+ ] }) : null,
2574
+ /* @__PURE__ */ jsx74("pre", { className: "overflow-auto p-4 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children: /* @__PURE__ */ jsx74("code", { children }) })
2575
+ ] });
2576
+ }
2577
+
2578
+ // src/components/marketing/LogoCloud.tsx
2579
+ import { jsx as jsx75, jsxs as jsxs55 } from "react/jsx-runtime";
2580
+ function LogoCloud({ title, items, className = "" }) {
2581
+ return /* @__PURE__ */ jsx75("section", { className: `border-y border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] py-8 ${className}`, children: /* @__PURE__ */ jsxs55("div", { className: "mx-auto max-w-7xl px-[var(--tapiz-space-page-x)]", children: [
2582
+ title ? /* @__PURE__ */ jsx75("p", { className: "mb-6 text-center font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: title }) : null,
2583
+ /* @__PURE__ */ jsx75("div", { className: "grid grid-cols-2 gap-3 md:grid-cols-4 lg:grid-cols-6", children: items.map((item) => /* @__PURE__ */ jsx75("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)) })
2584
+ ] }) });
2585
+ }
2586
+
2587
+ // src/components/marketing/TestimonialCard.tsx
2588
+ import { jsx as jsx76, jsxs as jsxs56 } from "react/jsx-runtime";
2589
+ function TestimonialCard({ quote, author, role, avatarSrc, className = "", variant = "surface" }) {
2590
+ return /* @__PURE__ */ jsxs56("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: [
2591
+ /* @__PURE__ */ jsxs56("blockquote", { className: "text-base leading-7 text-[var(--tapiz-text-secondary)]", children: [
2592
+ "\u201C",
2593
+ quote,
2594
+ "\u201D"
2595
+ ] }),
2596
+ /* @__PURE__ */ jsxs56("figcaption", { className: "mt-5 flex items-center gap-3", children: [
2597
+ /* @__PURE__ */ jsx76(Avatar, { name: author, src: avatarSrc, size: "sm" }),
2598
+ /* @__PURE__ */ jsxs56("span", { children: [
2599
+ /* @__PURE__ */ jsx76("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: author }),
2600
+ role ? /* @__PURE__ */ jsx76("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: role }) : null
2601
+ ] })
2602
+ ] })
2603
+ ] });
2604
+ }
2605
+
2606
+ // src/components/marketing/PricingCard.tsx
2607
+ import { jsx as jsx77, jsxs as jsxs57 } from "react/jsx-runtime";
2608
+ function PricingCard({ name, price, description, features = [], cta, highlighted = false, className = "" }) {
2609
+ return /* @__PURE__ */ jsxs57("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: [
2610
+ /* @__PURE__ */ jsxs57("div", { className: "flex-1", children: [
2611
+ /* @__PURE__ */ jsx77("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: name }),
2612
+ description ? /* @__PURE__ */ jsx77("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null,
2613
+ /* @__PURE__ */ jsx77("div", { className: "mt-6 text-4xl font-semibold tracking-tight text-[var(--tapiz-text-primary)]", children: price }),
2614
+ /* @__PURE__ */ jsx77("ul", { className: "mt-6 space-y-3 text-sm text-[var(--tapiz-text-secondary)]", children: features.map((feature, index) => /* @__PURE__ */ jsxs57("li", { className: "flex gap-2", children: [
2615
+ /* @__PURE__ */ jsx77("span", { className: "text-[var(--tapiz-success)]", children: "\u2713" }),
2616
+ /* @__PURE__ */ jsx77("span", { children: feature })
2617
+ ] }, index)) })
2618
+ ] }),
2619
+ /* @__PURE__ */ jsx77("div", { className: "mt-6", children: cta ?? /* @__PURE__ */ jsx77(Button, { variant: highlighted ? "primary" : "secondary", fullWidth: true, children: "Get started" }) })
2620
+ ] });
2621
+ }
2622
+
2623
+ // src/components/marketing/StatsBand.tsx
2624
+ import { jsx as jsx78, jsxs as jsxs58 } from "react/jsx-runtime";
2625
+ function StatsBand({ items, className = "" }) {
2626
+ return /* @__PURE__ */ jsx78("section", { className: `border-y border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-inverse)] text-[var(--tapiz-text-inverse)] ${className}`, children: /* @__PURE__ */ jsx78("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__ */ jsxs58("div", { className: "p-6 md:p-8", children: [
2627
+ /* @__PURE__ */ jsx78("div", { className: "text-3xl font-semibold tracking-tight", children: item.value }),
2628
+ /* @__PURE__ */ jsx78("div", { className: "mt-2 font-mono text-[10px] font-bold uppercase tracking-[0.18em] opacity-70", children: item.label }),
2629
+ item.description ? /* @__PURE__ */ jsx78("div", { className: "mt-3 text-sm opacity-70", children: item.description }) : null
2630
+ ] }, index)) }) });
2631
+ }
2632
+
2633
+ // src/presets/framework.ts
2634
+ var tapizFrameworkPresets = {
2635
+ enterprise: {
2636
+ shell: "tapiz-enterprise-shell",
2637
+ card: "tapiz-enterprise-card",
2638
+ button: "primary",
2639
+ density: "comfortable"
2640
+ },
2641
+ brutal: {
2642
+ shell: "tapiz-enterprise-shell tapiz-grid-bg",
2643
+ card: "tapiz-brutal-card",
2644
+ button: "brutal",
2645
+ density: "comfortable"
2646
+ },
2647
+ dashboard: {
2648
+ shell: "tapiz-enterprise-shell",
2649
+ card: "stat-card",
2650
+ button: "secondary",
2651
+ density: "compact"
2652
+ },
2653
+ marketing: {
2654
+ shell: "tapiz-enterprise-shell tapiz-noise-bg",
2655
+ card: "tapiz-enterprise-card",
2656
+ button: "primary",
2657
+ density: "spacious"
2658
+ },
2659
+ compact: {
2660
+ shell: "tapiz-enterprise-shell",
2661
+ card: "card",
2662
+ button: "secondary",
2663
+ density: "compact"
2664
+ }
2665
+ };
2666
+
2667
+ // src/components/layout/Container.tsx
2668
+ import { jsx as jsx79 } from "react/jsx-runtime";
2669
+ var sizeClasses2 = {
2670
+ sm: "max-w-3xl",
2671
+ md: "max-w-5xl",
2672
+ lg: "max-w-7xl",
2673
+ xl: "max-w-[90rem]",
2674
+ full: "max-w-none"
2675
+ };
2676
+ function Container({ children, size = "lg", padded = true, className = "", style }) {
2677
+ return /* @__PURE__ */ jsx79(
2678
+ "div",
2679
+ {
2680
+ className: ["mx-auto w-full", sizeClasses2[size], padded ? "px-[var(--tapiz-space-page-x)]" : "", className].filter(Boolean).join(" "),
2681
+ style,
2682
+ children
2683
+ }
2684
+ );
2685
+ }
2686
+
2687
+ // src/components/layout/Surface.tsx
2688
+ import { jsx as jsx80 } from "react/jsx-runtime";
2689
+ var variantClasses5 = {
2690
+ canvas: "bg-[var(--tapiz-bg-page)] text-[var(--tapiz-text-primary)]",
2691
+ surface: "bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-primary)]",
2692
+ raised: "bg-[var(--tapiz-bg-surface-raised)] text-[var(--tapiz-text-primary)] shadow-[var(--tapiz-shadow-md)]",
2693
+ muted: "bg-[var(--tapiz-bg-surface-muted)] text-[var(--tapiz-text-primary)]",
2694
+ brutal: "bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-primary)] border-2 border-[var(--tapiz-border-strong)] shadow-[var(--tapiz-shadow-brutal)]",
2695
+ inverse: "bg-[var(--tapiz-bg-surface-inverse)] text-[var(--tapiz-text-inverse)]"
2696
+ };
2697
+ var paddingClasses2 = {
2698
+ none: "p-0",
2699
+ sm: "p-3",
2700
+ md: "p-5",
2701
+ lg: "p-6",
2702
+ xl: "p-8"
2703
+ };
2704
+ function Surface({ children, variant = "surface", padding = "md", bordered = true, className = "", style }) {
2705
+ return /* @__PURE__ */ jsx80(
2706
+ "section",
2707
+ {
2708
+ className: [variantClasses5[variant], paddingClasses2[padding], bordered && variant !== "brutal" ? "border border-[var(--tapiz-border-subtle)]" : "", className].filter(Boolean).join(" "),
2709
+ style,
2710
+ children
2711
+ }
2712
+ );
2713
+ }
2714
+
2715
+ // src/components/layout/Divider.tsx
2716
+ import { jsx as jsx81, jsxs as jsxs59 } from "react/jsx-runtime";
2717
+ function Divider({ orientation = "horizontal", label, className = "" }) {
2718
+ if (orientation === "vertical") {
2719
+ return /* @__PURE__ */ jsx81("div", { className: `mx-2 min-h-6 w-px bg-[var(--tapiz-border-subtle)] ${className}`, "aria-hidden": "true" });
2720
+ }
2721
+ if (label) {
2722
+ return /* @__PURE__ */ jsxs59("div", { className: `flex items-center gap-3 ${className}`, children: [
2723
+ /* @__PURE__ */ jsx81("div", { className: "h-px flex-1 bg-[var(--tapiz-border-subtle)]" }),
2724
+ /* @__PURE__ */ jsx81("span", { className: "font-mono text-[10px] uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: label }),
2725
+ /* @__PURE__ */ jsx81("div", { className: "h-px flex-1 bg-[var(--tapiz-border-subtle)]" })
2726
+ ] });
2727
+ }
2728
+ return /* @__PURE__ */ jsx81("hr", { className: `border-[var(--tapiz-border-subtle)] ${className}` });
2729
+ }
2730
+
2731
+ // src/components/layout/ResponsiveGrid.tsx
2732
+ import { jsx as jsx82 } from "react/jsx-runtime";
2733
+ var gapClasses3 = {
2734
+ sm: "gap-3",
2735
+ md: "gap-4",
2736
+ lg: "gap-6",
2737
+ xl: "gap-8"
2738
+ };
2739
+ function ResponsiveGrid({ children, min = "18rem", gap = "md", className = "", style }) {
2740
+ return /* @__PURE__ */ jsx82(
2741
+ "div",
2742
+ {
2743
+ className: `grid ${gapClasses3[gap]} ${className}`,
2744
+ style: { gridTemplateColumns: `repeat(auto-fit, minmax(${min}, 1fr))`, ...style },
2745
+ children
2746
+ }
2747
+ );
2748
+ }
2749
+
2750
+ // src/components/data-display/Sparkline.tsx
2751
+ import { jsx as jsx83, jsxs as jsxs60 } from "react/jsx-runtime";
2752
+ function Sparkline({ values, width = 160, height = 48, label = "Trend", className = "", style }) {
2753
+ const safeValues = values.length ? values : [0];
2754
+ const min = Math.min(...safeValues);
2755
+ const max = Math.max(...safeValues);
2756
+ const range = max - min || 1;
2757
+ const step = safeValues.length > 1 ? width / (safeValues.length - 1) : width;
2758
+ const points = safeValues.map((value, index) => {
2759
+ const x = index * step;
2760
+ const y = height - (value - min) / range * (height - 6) - 3;
2761
+ return `${x},${y}`;
2762
+ }).join(" ");
2763
+ return /* @__PURE__ */ jsxs60("svg", { className, style, width, height, viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": label, children: [
2764
+ /* @__PURE__ */ jsx83("polyline", { points, fill: "none", stroke: "var(--tapiz-accent)", strokeWidth: "2", strokeLinecap: "square", strokeLinejoin: "miter" }),
2765
+ /* @__PURE__ */ jsx83("line", { x1: "0", x2: width, y1: height - 1, y2: height - 1, stroke: "var(--tapiz-border-subtle)", strokeWidth: "1" })
2766
+ ] });
2767
+ }
2768
+
2769
+ // src/components/data-display/BarList.tsx
2770
+ import { jsx as jsx84, jsxs as jsxs61 } from "react/jsx-runtime";
2771
+ function BarList({ items, max, valueFormatter = (value) => value, className = "" }) {
2772
+ const computedMax = max ?? Math.max(1, ...items.map((item) => item.value));
2773
+ return /* @__PURE__ */ jsx84("div", { className: `space-y-3 ${className}`, children: items.map((item, index) => {
2774
+ const percent = Math.max(0, Math.min(100, item.value / computedMax * 100));
2775
+ return /* @__PURE__ */ jsxs61("div", { children: [
2776
+ /* @__PURE__ */ jsxs61("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
2777
+ /* @__PURE__ */ jsx84("span", { className: "font-medium text-[var(--tapiz-text-secondary)]", children: item.label }),
2778
+ /* @__PURE__ */ jsx84("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: valueFormatter(item.value) })
2779
+ ] }),
2780
+ /* @__PURE__ */ jsx84("div", { className: "h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx84("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${percent}%` } }) }),
2781
+ item.detail ? /* @__PURE__ */ jsx84("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.detail }) : null
2782
+ ] }, index);
2783
+ }) });
2784
+ }
2785
+
2786
+ // src/components/data-display/DonutMetric.tsx
2787
+ import { jsx as jsx85, jsxs as jsxs62 } from "react/jsx-runtime";
2788
+ function DonutMetric({ value, max = 100, label, caption, size = 112, className = "" }) {
2789
+ const radius = 42;
2790
+ const circumference = 2 * Math.PI * radius;
2791
+ const ratio = Math.max(0, Math.min(1, value / max));
2792
+ const offset = circumference * (1 - ratio);
2793
+ return /* @__PURE__ */ jsxs62("div", { className: `inline-flex items-center gap-4 ${className}`, children: [
2794
+ /* @__PURE__ */ jsxs62("svg", { width: size, height: size, viewBox: "0 0 112 112", role: "img", "aria-label": `${Math.round(ratio * 100)}%`, children: [
2795
+ /* @__PURE__ */ jsx85("circle", { cx: "56", cy: "56", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
2796
+ /* @__PURE__ */ jsx85(
2797
+ "circle",
2798
+ {
2799
+ cx: "56",
2800
+ cy: "56",
2801
+ r: radius,
2802
+ fill: "none",
2803
+ stroke: "var(--tapiz-accent)",
2804
+ strokeWidth: "10",
2805
+ strokeDasharray: circumference,
2806
+ strokeDashoffset: offset,
2807
+ strokeLinecap: "square",
2808
+ transform: "rotate(-90 56 56)"
2809
+ }
2810
+ ),
2811
+ /* @__PURE__ */ jsxs62("text", { x: "56", y: "61", textAnchor: "middle", className: "fill-[var(--tapiz-text-primary)] font-mono text-lg font-bold", children: [
2812
+ Math.round(ratio * 100),
2813
+ "%"
2814
+ ] })
2815
+ ] }),
2816
+ label || caption ? /* @__PURE__ */ jsxs62("div", { children: [
2817
+ label ? /* @__PURE__ */ jsx85("div", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: label }) : null,
2818
+ caption ? /* @__PURE__ */ jsx85("div", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: caption }) : null
2819
+ ] }) : null
2820
+ ] });
2821
+ }
2822
+
2823
+ // src/components/data-display/FilterChip.tsx
2824
+ import { jsx as jsx86, jsxs as jsxs63 } from "react/jsx-runtime";
2825
+ function FilterChip({ children, active = false, onRemove, className = "" }) {
2826
+ return /* @__PURE__ */ jsxs63(
2827
+ "span",
2828
+ {
2829
+ className: [
2830
+ "inline-flex items-center gap-2 border px-2.5 py-1 font-mono text-[11px] uppercase tracking-[0.12em]",
2831
+ active ? "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-text-primary)]" : "border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-muted)]",
2832
+ className
2833
+ ].join(" "),
2834
+ children: [
2835
+ children,
2836
+ onRemove ? /* @__PURE__ */ jsx86("button", { type: "button", onClick: onRemove, className: "text-[var(--tapiz-text-muted)] hover:text-[var(--tapiz-danger)]", "aria-label": "Remove filter", children: "\xD7" }) : null
2837
+ ]
2838
+ }
2839
+ );
2840
+ }
2841
+
2842
+ // src/components/data-display/DataToolbar.tsx
2843
+ import { jsx as jsx87, jsxs as jsxs64 } from "react/jsx-runtime";
2844
+ function DataToolbar({ title, description, search, filters, actions, className = "" }) {
2845
+ return /* @__PURE__ */ jsxs64("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4 ${className}`, children: [
2846
+ /* @__PURE__ */ jsxs64("div", { className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between", children: [
2847
+ /* @__PURE__ */ jsxs64("div", { children: [
2848
+ title ? /* @__PURE__ */ jsx87("h3", { className: "text-base font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
2849
+ description ? /* @__PURE__ */ jsx87("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null
2850
+ ] }),
2851
+ actions ? /* @__PURE__ */ jsx87("div", { className: "flex flex-wrap gap-2", children: actions }) : null
2852
+ ] }),
2853
+ search || filters ? /* @__PURE__ */ jsxs64("div", { className: "mt-4 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between", children: [
2854
+ search ? /* @__PURE__ */ jsx87("div", { className: "min-w-0 flex-1", children: search }) : null,
2855
+ filters ? /* @__PURE__ */ jsx87("div", { className: "flex flex-wrap gap-2", children: filters }) : null
2856
+ ] }) : null
2857
+ ] });
2858
+ }
2859
+
2860
+ // src/components/framework/ResourceCard.tsx
2861
+ import { Fragment as Fragment3, jsx as jsx88, jsxs as jsxs65 } from "react/jsx-runtime";
2862
+ function ResourceCard({ title, description, eyebrow, icon, meta, status, actions, href, className = "" }) {
2863
+ const content = /* @__PURE__ */ jsxs65(Fragment3, { children: [
2864
+ /* @__PURE__ */ jsxs65("div", { className: "flex items-start justify-between gap-4", children: [
2865
+ /* @__PURE__ */ jsxs65("div", { className: "flex min-w-0 items-start gap-3", children: [
2866
+ icon ? /* @__PURE__ */ jsx88("div", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-2 text-[var(--tapiz-accent)]", children: icon }) : null,
2867
+ /* @__PURE__ */ jsxs65("div", { className: "min-w-0", children: [
2868
+ eyebrow ? /* @__PURE__ */ jsx88("div", { className: "kicker mb-2", children: eyebrow }) : null,
2869
+ /* @__PURE__ */ jsx88("h3", { className: "truncate text-base font-semibold text-[var(--tapiz-text-primary)]", children: title }),
2870
+ description ? /* @__PURE__ */ jsx88("p", { className: "mt-2 line-clamp-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
2871
+ ] })
2872
+ ] }),
2873
+ status ? /* @__PURE__ */ jsx88(Badge, { children: status }) : null
2874
+ ] }),
2875
+ meta || actions ? /* @__PURE__ */ jsxs65("div", { className: "mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-[var(--tapiz-border-subtle)] pt-4", children: [
2876
+ meta ? /* @__PURE__ */ jsx88("div", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: meta }) : /* @__PURE__ */ jsx88("span", {}),
2877
+ actions ? /* @__PURE__ */ jsx88("div", { className: "flex flex-wrap gap-2", children: actions }) : null
2878
+ ] }) : null
2879
+ ] });
2880
+ 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}`;
2881
+ return href ? /* @__PURE__ */ jsx88("a", { href, className: classes, children: content }) : /* @__PURE__ */ jsx88("article", { className: classes, children: content });
2882
+ }
2883
+
2884
+ // src/components/framework/IntegrationCard.tsx
2885
+ import { jsx as jsx89, jsxs as jsxs66 } from "react/jsx-runtime";
2886
+ var statusLabel = {
2887
+ connected: "Connected",
2888
+ disconnected: "Disconnected",
2889
+ syncing: "Syncing",
2890
+ error: "Error"
2891
+ };
2892
+ var statusVariant = {
2893
+ connected: "success",
2894
+ disconnected: "default",
2895
+ syncing: "info",
2896
+ error: "danger"
2897
+ };
2898
+ function IntegrationCard({ name, description, logo, status = "disconnected", lastSync, actions, className = "" }) {
2899
+ return /* @__PURE__ */ jsxs66("article", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5 ${className}`, children: [
2900
+ /* @__PURE__ */ jsxs66("div", { className: "flex items-start justify-between gap-4", children: [
2901
+ /* @__PURE__ */ jsxs66("div", { className: "flex items-start gap-3", children: [
2902
+ /* @__PURE__ */ jsx89("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__ */ jsx89("span", { className: "font-mono text-xs", children: "API" }) }),
2903
+ /* @__PURE__ */ jsxs66("div", { children: [
2904
+ /* @__PURE__ */ jsx89("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: name }),
2905
+ description ? /* @__PURE__ */ jsx89("p", { className: "mt-1 text-sm leading-5 text-[var(--tapiz-text-muted)]", children: description }) : null
2906
+ ] })
2907
+ ] }),
2908
+ /* @__PURE__ */ jsx89(StatusBadge, { variant: statusVariant[status], label: statusLabel[status] })
2909
+ ] }),
2910
+ /* @__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: [
2911
+ /* @__PURE__ */ jsx89("div", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: lastSync ?? "No sync yet" }),
2912
+ actions ? /* @__PURE__ */ jsx89("div", { className: "flex gap-2", children: actions }) : null
2913
+ ] })
2914
+ ] });
2915
+ }
2916
+
2917
+ // src/components/framework/HealthIndicator.tsx
2918
+ import { jsx as jsx90, jsxs as jsxs67 } from "react/jsx-runtime";
2919
+ var toneClasses2 = {
2920
+ operational: "bg-[var(--tapiz-success)]",
2921
+ degraded: "bg-[var(--tapiz-warning)]",
2922
+ outage: "bg-[var(--tapiz-danger)]",
2923
+ unknown: "bg-[var(--tapiz-text-disabled)]"
2924
+ };
2925
+ var defaultLabel = {
2926
+ operational: "Operational",
2927
+ degraded: "Degraded",
2928
+ outage: "Outage",
2929
+ unknown: "Unknown"
2930
+ };
2931
+ function HealthIndicator({ tone: tone2 = "unknown", label, detail, className = "" }) {
2932
+ return /* @__PURE__ */ jsxs67("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: [
2933
+ /* @__PURE__ */ jsx90("span", { className: `size-2.5 ${toneClasses2[tone2]}`, "aria-hidden": "true" }),
2934
+ /* @__PURE__ */ jsx90("span", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: label ?? defaultLabel[tone2] }),
2935
+ detail ? /* @__PURE__ */ jsx90("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: detail }) : null
2936
+ ] });
2937
+ }
2938
+
2939
+ // src/components/framework/AuditLog.tsx
2940
+ import { jsx as jsx91, jsxs as jsxs68 } from "react/jsx-runtime";
2941
+ function AuditLog({ items, className = "" }) {
2942
+ return /* @__PURE__ */ jsx91("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__ */ jsxs68("div", { className: "flex gap-3 p-4", children: [
2943
+ /* @__PURE__ */ jsx91(Avatar, { name: item.initials ?? item.actor, size: "sm" }),
2944
+ /* @__PURE__ */ jsxs68("div", { className: "min-w-0 flex-1", children: [
2945
+ /* @__PURE__ */ jsxs68("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
2946
+ /* @__PURE__ */ jsxs68("p", { className: "text-sm text-[var(--tapiz-text-secondary)]", children: [
2947
+ /* @__PURE__ */ jsx91("strong", { className: "text-[var(--tapiz-text-primary)]", children: item.actor }),
2948
+ " ",
2949
+ item.action
2950
+ ] }),
2951
+ /* @__PURE__ */ jsx91("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.timestamp })
2952
+ ] }),
2953
+ item.detail ? /* @__PURE__ */ jsx91("div", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: item.detail }) : null
2954
+ ] })
2955
+ ] }, index)) });
2956
+ }
2957
+
2958
+ // src/components/framework/KanbanBoard.tsx
2959
+ import { jsx as jsx92, jsxs as jsxs69 } from "react/jsx-runtime";
2960
+ var toneClasses3 = {
2961
+ default: "border-[var(--tapiz-border-subtle)]",
2962
+ accent: "border-[var(--tapiz-accent)]",
2963
+ success: "border-[var(--tapiz-success)]",
2964
+ warning: "border-[var(--tapiz-warning)]",
2965
+ danger: "border-[var(--tapiz-danger)]"
2966
+ };
2967
+ function KanbanBoard({ columns, className = "" }) {
2968
+ return /* @__PURE__ */ jsx92("div", { className: `grid gap-4 overflow-x-auto md:grid-flow-col md:auto-cols-[minmax(18rem,1fr)] ${className}`, children: columns.map((column) => /* @__PURE__ */ jsxs69("section", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-3", children: [
2969
+ /* @__PURE__ */ jsxs69("div", { className: "mb-3 flex items-start justify-between gap-3", children: [
2970
+ /* @__PURE__ */ jsxs69("div", { children: [
2971
+ /* @__PURE__ */ jsx92("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: column.title }),
2972
+ column.description ? /* @__PURE__ */ jsx92("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: column.description }) : null
2973
+ ] }),
2974
+ /* @__PURE__ */ jsx92("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: column.items.length })
2975
+ ] }),
2976
+ /* @__PURE__ */ jsx92("div", { className: "space-y-3", children: column.items.map((item) => /* @__PURE__ */ jsxs69("article", { className: `border-l-2 bg-[var(--tapiz-bg-surface)] p-3 shadow-[var(--tapiz-shadow-sm)] ${toneClasses3[item.tone ?? "default"]}`, children: [
2977
+ /* @__PURE__ */ jsx92("h4", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: item.title }),
2978
+ item.description ? /* @__PURE__ */ jsx92("p", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: item.description }) : null,
2979
+ item.meta ? /* @__PURE__ */ jsx92("div", { className: "mt-3 font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
2980
+ ] }, item.id)) })
2981
+ ] }, column.id)) });
2982
+ }
2983
+
2984
+ // src/components/framework/AccessMatrix.tsx
2985
+ import { jsx as jsx93, jsxs as jsxs70 } from "react/jsx-runtime";
2986
+ function AccessMatrix({ roles, permissions, className = "" }) {
2987
+ return /* @__PURE__ */ jsx93("div", { className: `overflow-x-auto border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: /* @__PURE__ */ jsxs70("table", { className: "min-w-full text-sm", children: [
2988
+ /* @__PURE__ */ jsx93("thead", { children: /* @__PURE__ */ jsxs70("tr", { children: [
2989
+ /* @__PURE__ */ jsx93("th", { className: "px-4 py-3 text-left", children: "Permission" }),
2990
+ roles.map((role) => /* @__PURE__ */ jsx93("th", { className: "px-4 py-3 text-center", children: role.label }, role.key))
2991
+ ] }) }),
2992
+ /* @__PURE__ */ jsx93("tbody", { children: permissions.map((permission) => /* @__PURE__ */ jsxs70("tr", { children: [
2993
+ /* @__PURE__ */ jsxs70("td", { className: "px-4 py-3", children: [
2994
+ /* @__PURE__ */ jsx93("div", { className: "font-medium text-[var(--tapiz-text-primary)]", children: permission.label }),
2995
+ permission.description ? /* @__PURE__ */ jsx93("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: permission.description }) : null
2996
+ ] }),
2997
+ roles.map((role) => /* @__PURE__ */ jsx93("td", { className: "px-4 py-3 text-center", children: /* @__PURE__ */ jsx93("span", { className: permission.roles[role.key] ? "text-[var(--tapiz-success)]" : "text-[var(--tapiz-text-disabled)]", children: permission.roles[role.key] ? "\u2713" : "\u2014" }) }, role.key))
2998
+ ] }, permission.key)) })
2999
+ ] }) });
3000
+ }
3001
+
3002
+ // src/components/framework/CalendarGrid.tsx
3003
+ import { jsx as jsx94, jsxs as jsxs71 } from "react/jsx-runtime";
3004
+ var defaultWeekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
3005
+ function CalendarGrid({ days, weekdays = defaultWeekdays, className = "" }) {
3006
+ return /* @__PURE__ */ jsxs71("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
3007
+ /* @__PURE__ */ jsx94("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__ */ jsx94("div", { className: "px-3 py-2 font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: day }, index)) }),
3008
+ /* @__PURE__ */ jsx94("div", { className: "grid grid-cols-7", children: days.map((day, index) => /* @__PURE__ */ jsxs71("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: [
3009
+ /* @__PURE__ */ jsxs71("div", { className: "flex items-center justify-between gap-2", children: [
3010
+ /* @__PURE__ */ jsx94("span", { className: "font-mono text-xs text-[var(--tapiz-text-primary)]", children: day.date }),
3011
+ day.label ? /* @__PURE__ */ jsx94("span", { className: "text-[10px] text-[var(--tapiz-text-muted)]", children: day.label }) : null
3012
+ ] }),
3013
+ day.events?.length ? /* @__PURE__ */ jsx94("div", { className: "mt-2 space-y-1", children: day.events.map((event, eventIndex) => /* @__PURE__ */ jsx94("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
3014
+ ] }, index)) })
3015
+ ] });
3016
+ }
3017
+
3018
+ // src/components/forms/Slider.tsx
3019
+ import { jsx as jsx95, jsxs as jsxs72 } from "react/jsx-runtime";
3020
+ function Slider({ label, valueLabel, className = "", ...props }) {
3021
+ return /* @__PURE__ */ jsxs72("label", { className: `block ${className}`, children: [
3022
+ label || valueLabel ? /* @__PURE__ */ jsxs72("span", { className: "mb-2 flex items-center justify-between gap-3 text-sm", children: [
3023
+ label ? /* @__PURE__ */ jsx95("span", { className: "font-medium text-[var(--tapiz-text-secondary)]", children: label }) : /* @__PURE__ */ jsx95("span", {}),
3024
+ valueLabel ? /* @__PURE__ */ jsx95("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: valueLabel }) : null
3025
+ ] }) : null,
3026
+ /* @__PURE__ */ jsx95(
3027
+ "input",
3028
+ {
3029
+ ...props,
3030
+ type: "range",
3031
+ className: "h-2 w-full cursor-pointer appearance-none border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)] accent-[var(--tapiz-accent)]"
3032
+ }
3033
+ )
3034
+ ] });
3035
+ }
3036
+
3037
+ // src/components/forms/FileDropzone.tsx
3038
+ import { jsx as jsx96, jsxs as jsxs73 } from "react/jsx-runtime";
3039
+ function FileDropzone({ title = "Drop files here", description, actionLabel = "Browse", className = "", ...props }) {
3040
+ return /* @__PURE__ */ jsxs73("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: [
3041
+ /* @__PURE__ */ jsx96("input", { ...props, type: "file", className: "sr-only" }),
3042
+ /* @__PURE__ */ jsx96("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }),
3043
+ description ? /* @__PURE__ */ jsx96("span", { className: "mt-2 block text-sm text-[var(--tapiz-text-muted)]", children: description }) : null,
3044
+ /* @__PURE__ */ jsx96("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 })
3045
+ ] });
3046
+ }
3047
+
3048
+ // src/components/forms/PasswordInput.tsx
3049
+ import { jsx as jsx97, jsxs as jsxs74 } from "react/jsx-runtime";
3050
+ function PasswordInput({ revealLabel = "Show", className = "", ...props }) {
3051
+ return /* @__PURE__ */ jsxs74("div", { className: `flex 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_0_var(--tapiz-signal)] ${className}`, children: [
3052
+ /* @__PURE__ */ jsx97(
3053
+ "input",
3054
+ {
3055
+ ...props,
3056
+ type: "password",
3057
+ className: "min-w-0 flex-1 border-0 bg-transparent px-3 py-2 text-sm text-[var(--tapiz-text-primary)] outline-none"
3058
+ }
3059
+ ),
3060
+ /* @__PURE__ */ jsx97("button", { type: "button", className: "border-l border-[var(--tapiz-border-subtle)] px-3 font-mono text-xs text-[var(--tapiz-text-muted)]", tabIndex: -1, children: revealLabel })
3061
+ ] });
3062
+ }
3063
+
3064
+ // src/components/forms/TextareaCounter.tsx
3065
+ import { jsx as jsx98, jsxs as jsxs75 } from "react/jsx-runtime";
3066
+ function TextareaCounter({ maxLength, value = "", className = "", ...props }) {
3067
+ const count = value.length;
3068
+ return /* @__PURE__ */ jsxs75("div", { className, children: [
3069
+ /* @__PURE__ */ jsx98("textarea", { ...props, value, maxLength, className: "input-field min-h-28" }),
3070
+ /* @__PURE__ */ jsxs75("div", { className: "mt-1 text-right font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: [
3071
+ count,
3072
+ "/",
3073
+ maxLength
3074
+ ] })
3075
+ ] });
3076
+ }
3077
+
3078
+ // src/components/feedback/Callout.tsx
3079
+ import { jsx as jsx99, jsxs as jsxs76 } from "react/jsx-runtime";
3080
+ var toneClasses4 = {
3081
+ info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)]",
3082
+ success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
3083
+ warning: "border-[var(--tapiz-warning)] bg-[var(--tapiz-warning-soft)]",
3084
+ danger: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)]",
3085
+ neutral: "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]"
3086
+ };
3087
+ function Callout({ title, children, tone: tone2 = "info", icon, actions, className = "" }) {
3088
+ return /* @__PURE__ */ jsx99("aside", { className: `border-l-4 p-4 ${toneClasses4[tone2]} ${className}`, children: /* @__PURE__ */ jsxs76("div", { className: "flex gap-3", children: [
3089
+ icon ? /* @__PURE__ */ jsx99("div", { className: "text-[var(--tapiz-text-primary)]", children: icon }) : null,
3090
+ /* @__PURE__ */ jsxs76("div", { className: "min-w-0 flex-1", children: [
3091
+ title ? /* @__PURE__ */ jsx99("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
3092
+ children ? /* @__PURE__ */ jsx99("div", { className: "mt-1 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children }) : null,
3093
+ actions ? /* @__PURE__ */ jsx99("div", { className: "mt-3 flex flex-wrap gap-2", children: actions }) : null
3094
+ ] })
3095
+ ] }) });
3096
+ }
3097
+
3098
+ // src/components/feedback/LoadingOverlay.tsx
3099
+ import { jsx as jsx100, jsxs as jsxs77 } from "react/jsx-runtime";
3100
+ function LoadingOverlay({ visible = false, label = "Loading", children, className = "" }) {
3101
+ return /* @__PURE__ */ jsxs77("div", { className: `relative ${className}`, children: [
3102
+ children,
3103
+ visible ? /* @__PURE__ */ jsx100("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__ */ jsxs77("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: [
3104
+ /* @__PURE__ */ jsx100(Spinner, {}),
3105
+ /* @__PURE__ */ jsx100("span", { children: label })
3106
+ ] }) }) : null
3107
+ ] });
3108
+ }
3109
+
3110
+ // src/components/feedback/NotificationList.tsx
3111
+ import { jsx as jsx101, jsxs as jsxs78 } from "react/jsx-runtime";
3112
+ function NotificationList({ items, className = "" }) {
3113
+ return /* @__PURE__ */ jsx101("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__ */ jsxs78("article", { className: "flex gap-3 p-4", children: [
3114
+ /* @__PURE__ */ jsx101("span", { className: `mt-1 size-2.5 ${item.unread ? "bg-[var(--tapiz-accent)]" : "bg-[var(--tapiz-border-subtle)]"}`, "aria-hidden": "true" }),
3115
+ /* @__PURE__ */ jsxs78("div", { className: "min-w-0 flex-1", children: [
3116
+ /* @__PURE__ */ jsxs78("div", { className: "flex items-start justify-between gap-3", children: [
3117
+ /* @__PURE__ */ jsx101("h3", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: item.title }),
3118
+ item.time ? /* @__PURE__ */ jsx101("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.time }) : null
3119
+ ] }),
3120
+ item.description ? /* @__PURE__ */ jsx101("p", { className: "mt-1 text-sm leading-5 text-[var(--tapiz-text-muted)]", children: item.description }) : null,
3121
+ item.action ? /* @__PURE__ */ jsx101("div", { className: "mt-3", children: item.action }) : null
3122
+ ] })
3123
+ ] }, item.id)) });
3124
+ }
3125
+
3126
+ // src/components/layout/MasonryGrid.tsx
3127
+ import { jsx as jsx102 } from "react/jsx-runtime";
3128
+ var columnClasses = { 2: "md:columns-2", 3: "md:columns-2 xl:columns-3", 4: "md:columns-2 lg:columns-3 xl:columns-4" };
3129
+ var gapClasses4 = { sm: "gap-3", md: "gap-5", lg: "gap-8" };
3130
+ function MasonryGrid({ children, columns = 3, gap = "md", className = "", style }) {
3131
+ return /* @__PURE__ */ jsx102("div", { className: [columnClasses[columns], gapClasses4[gap], className].filter(Boolean).join(" "), style, children });
3132
+ }
3133
+
3134
+ // src/components/layout/PageRail.tsx
3135
+ import { Fragment as Fragment4, jsx as jsx103, jsxs as jsxs79 } from "react/jsx-runtime";
3136
+ function PageRail({ title, items, actions, className = "", style }) {
3137
+ return /* @__PURE__ */ jsxs79("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: [
3138
+ title ? /* @__PURE__ */ jsx103("div", { className: "kicker mb-3 px-2", children: title }) : null,
3139
+ /* @__PURE__ */ jsx103("nav", { className: "flex flex-col gap-1", children: items.map((item, index) => {
3140
+ const content = /* @__PURE__ */ jsxs79(Fragment4, { children: [
3141
+ /* @__PURE__ */ jsx103("span", { className: "truncate", children: item.label }),
3142
+ item.meta ? /* @__PURE__ */ jsx103("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3143
+ ] });
3144
+ 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(" ");
3145
+ return item.href ? /* @__PURE__ */ jsx103("a", { href: item.href, className: classes, children: content }, index) : /* @__PURE__ */ jsx103("div", { className: classes, children: content }, index);
3146
+ }) }),
3147
+ actions ? /* @__PURE__ */ jsx103("div", { className: "mt-3 border-t border-[var(--tapiz-border-subtle)] pt-3", children: actions }) : null
3148
+ ] });
3149
+ }
3150
+
3151
+ // src/components/layout/StickyBar.tsx
3152
+ import { jsx as jsx104 } from "react/jsx-runtime";
3153
+ function StickyBar({ children, position = "top", className = "", style }) {
3154
+ return /* @__PURE__ */ jsx104(
3155
+ "div",
3156
+ {
3157
+ 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(" "),
3158
+ style,
3159
+ children
3160
+ }
3161
+ );
3162
+ }
3163
+
3164
+ // src/components/forms/Combobox.tsx
3165
+ import { jsx as jsx105, jsxs as jsxs80 } from "react/jsx-runtime";
3166
+ function Combobox({ options, placeholder = "Select option", invalid = false, className = "", ...props }) {
3167
+ return /* @__PURE__ */ jsxs80("select", { ...props, className: ["input-field appearance-none bg-[var(--tapiz-bg-surface)]", invalid ? "border-warn focus:border-warn" : "", className].filter(Boolean).join(" "), children: [
3168
+ /* @__PURE__ */ jsx105("option", { value: "", children: placeholder }),
3169
+ options.map((option) => /* @__PURE__ */ jsx105("option", { value: option.value, children: String(option.label) }, option.value))
3170
+ ] });
3171
+ }
3172
+
3173
+ // src/components/forms/DateRangePicker.tsx
3174
+ import { jsx as jsx106, jsxs as jsxs81 } from "react/jsx-runtime";
3175
+ function DateRangePicker({ startLabel = "From", endLabel = "To", startProps, endProps, className = "" }) {
3176
+ return /* @__PURE__ */ jsxs81("div", { className: ["grid gap-3 md:grid-cols-2", className].filter(Boolean).join(" "), children: [
3177
+ /* @__PURE__ */ jsxs81("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
3178
+ /* @__PURE__ */ jsx106("span", { children: startLabel }),
3179
+ /* @__PURE__ */ jsx106("input", { type: "date", ...startProps, className: ["input-field", startProps?.className || ""].join(" ") })
3180
+ ] }),
3181
+ /* @__PURE__ */ jsxs81("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
3182
+ /* @__PURE__ */ jsx106("span", { children: endLabel }),
3183
+ /* @__PURE__ */ jsx106("input", { type: "date", ...endProps, className: ["input-field", endProps?.className || ""].join(" ") })
3184
+ ] })
3185
+ ] });
3186
+ }
3187
+
3188
+ // src/components/forms/ColorSwatchPicker.tsx
3189
+ import { jsx as jsx107, jsxs as jsxs82 } from "react/jsx-runtime";
3190
+ function ColorSwatchPicker({ options, value, onChange, className = "" }) {
3191
+ return /* @__PURE__ */ jsx107("div", { className: ["flex flex-wrap gap-2", className].filter(Boolean).join(" "), children: options.map((option) => {
3192
+ const selected = option.value === value;
3193
+ return /* @__PURE__ */ jsxs82("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: [
3194
+ /* @__PURE__ */ jsx107("span", { className: "h-4 w-4 border border-[var(--tapiz-border-strong)]", style: { background: option.color } }),
3195
+ /* @__PURE__ */ jsx107("span", { children: option.label })
3196
+ ] }, option.value);
3197
+ }) });
3198
+ }
3199
+
3200
+ // src/components/forms/RatingInput.tsx
3201
+ import { jsx as jsx108 } from "react/jsx-runtime";
3202
+ function RatingInput({ value = 0, max = 5, icon = "\u2605", onChange, label = "Rating", className = "" }) {
3203
+ return /* @__PURE__ */ jsx108("div", { className: ["inline-flex items-center gap-1", className].filter(Boolean).join(" "), role: "radiogroup", "aria-label": label, children: Array.from({ length: max }, (_, index) => {
3204
+ const score = index + 1;
3205
+ const active = score <= value;
3206
+ return /* @__PURE__ */ jsx108("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);
3207
+ }) });
3208
+ }
3209
+
3210
+ // src/components/data-display/ScoreRing.tsx
3211
+ import { jsx as jsx109, jsxs as jsxs83 } from "react/jsx-runtime";
3212
+ function ScoreRing({ value, max = 100, label, size = 112, className = "" }) {
3213
+ const normalized = Math.max(0, Math.min(1, value / max));
3214
+ const radius = 42;
3215
+ const circumference = 2 * Math.PI * radius;
3216
+ const dash = circumference * normalized;
3217
+ return /* @__PURE__ */ jsxs83("div", { className: ["inline-grid place-items-center", className].filter(Boolean).join(" "), style: { width: size, height: size }, children: [
3218
+ /* @__PURE__ */ jsxs83("svg", { viewBox: "0 0 100 100", className: "h-full w-full -rotate-90", children: [
3219
+ /* @__PURE__ */ jsx109("circle", { cx: "50", cy: "50", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
3220
+ /* @__PURE__ */ jsx109("circle", { cx: "50", cy: "50", r: radius, fill: "none", stroke: "var(--tapiz-accent)", strokeWidth: "10", strokeLinecap: "square", strokeDasharray: `${dash} ${circumference - dash}` })
3221
+ ] }),
3222
+ /* @__PURE__ */ jsxs83("div", { className: "absolute text-center", children: [
3223
+ /* @__PURE__ */ jsxs83("div", { className: "font-display text-2xl font-semibold text-[var(--tapiz-text-primary)]", children: [
3224
+ Math.round(normalized * 100),
3225
+ "%"
3226
+ ] }),
3227
+ label ? /* @__PURE__ */ jsx109("div", { className: "font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: label }) : null
3228
+ ] })
3229
+ ] });
3230
+ }
3231
+
3232
+ // src/components/data-display/HeatmapGrid.tsx
3233
+ import { jsx as jsx110 } from "react/jsx-runtime";
3234
+ function HeatmapGrid({ cells, columns = 7, max, className = "" }) {
3235
+ const peak = max ?? Math.max(1, ...cells.map((cell) => cell.value));
3236
+ return /* @__PURE__ */ jsx110("div", { className: ["grid gap-1", className].filter(Boolean).join(" "), style: { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }, children: cells.map((cell, index) => {
3237
+ const opacity = 0.15 + Math.min(1, cell.value / peak) * 0.75;
3238
+ return /* @__PURE__ */ jsx110("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__ */ jsx110("span", { className: "sr-only", children: cell.label }) : null }, index);
3239
+ }) });
3240
+ }
3241
+
3242
+ // src/components/data-display/FunnelChart.tsx
3243
+ import { jsx as jsx111, jsxs as jsxs84 } from "react/jsx-runtime";
3244
+ function FunnelChart({ steps, className = "" }) {
3245
+ const max = Math.max(1, ...steps.map((step) => step.value));
3246
+ return /* @__PURE__ */ jsx111("div", { className: ["space-y-3", className].filter(Boolean).join(" "), children: steps.map((step, index) => {
3247
+ const width = Math.max(8, step.value / max * 100);
3248
+ return /* @__PURE__ */ jsxs84("div", { children: [
3249
+ /* @__PURE__ */ jsxs84("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
3250
+ /* @__PURE__ */ jsx111("span", { className: "font-medium text-[var(--tapiz-text-primary)]", children: step.label }),
3251
+ /* @__PURE__ */ jsxs84("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
3252
+ step.value,
3253
+ step.meta ? ` \xB7 ${String(step.meta)}` : ""
3254
+ ] })
3255
+ ] }),
3256
+ /* @__PURE__ */ jsx111("div", { className: "h-9 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx111("div", { className: "h-full border-r border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)]", style: { width: `${width}%` } }) })
3257
+ ] }, index);
3258
+ }) });
3259
+ }
3260
+
3261
+ // src/components/data-display/ComparisonMeter.tsx
3262
+ import { jsx as jsx112, jsxs as jsxs85 } from "react/jsx-runtime";
3263
+ function ComparisonMeter({ leftLabel, rightLabel, value, className = "" }) {
3264
+ const clamped = Math.max(0, Math.min(100, value));
3265
+ return /* @__PURE__ */ jsxs85("div", { className, children: [
3266
+ /* @__PURE__ */ jsxs85("div", { className: "mb-2 flex justify-between gap-3 text-sm text-[var(--tapiz-text-muted)]", children: [
3267
+ /* @__PURE__ */ jsx112("span", { children: leftLabel }),
3268
+ /* @__PURE__ */ jsx112("span", { children: rightLabel })
3269
+ ] }),
3270
+ /* @__PURE__ */ jsxs85("div", { className: "relative h-3 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]", children: [
3271
+ /* @__PURE__ */ jsx112("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${clamped}%` } }),
3272
+ /* @__PURE__ */ jsx112("div", { className: "absolute top-[-6px] h-6 w-px bg-[var(--tapiz-border-strong)]", style: { left: `${clamped}%` } })
3273
+ ] })
3274
+ ] });
3275
+ }
3276
+
3277
+ // src/components/framework/ActivityFeed.tsx
3278
+ import { jsx as jsx113, jsxs as jsxs86 } from "react/jsx-runtime";
3279
+ function ActivityFeed({ items, className = "" }) {
3280
+ return /* @__PURE__ */ jsx113("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__ */ jsxs86("div", { className: "flex gap-3 p-4", children: [
3281
+ /* @__PURE__ */ jsx113(Avatar, { name: item.actor, src: item.avatarUrl, size: "sm" }),
3282
+ /* @__PURE__ */ jsxs86("div", { className: "min-w-0 flex-1", children: [
3283
+ /* @__PURE__ */ jsxs86("p", { className: "text-sm text-[var(--tapiz-text-primary)]", children: [
3284
+ /* @__PURE__ */ jsx113("strong", { children: item.actor }),
3285
+ " ",
3286
+ item.action
3287
+ ] }),
3288
+ item.meta ? /* @__PURE__ */ jsx113("div", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3289
+ ] }),
3290
+ item.time ? /* @__PURE__ */ jsx113("div", { className: "font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: item.time }) : null
3291
+ ] }, index)) });
3292
+ }
3293
+
3294
+ // src/components/framework/InboxList.tsx
3295
+ import { jsx as jsx114, jsxs as jsxs87 } from "react/jsx-runtime";
3296
+ function InboxList({ items, className = "" }) {
3297
+ return /* @__PURE__ */ jsx114("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("article", { className: ["p-4 transition hover:bg-[var(--tapiz-bg-surface-muted)]", item.unread ? "border-l-4 border-l-[var(--tapiz-accent)]" : ""].join(" "), children: [
3298
+ /* @__PURE__ */ jsxs87("div", { className: "flex items-start justify-between gap-3", children: [
3299
+ /* @__PURE__ */ jsxs87("div", { className: "min-w-0", children: [
3300
+ /* @__PURE__ */ jsx114("h3", { className: "truncate text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
3301
+ item.sender ? /* @__PURE__ */ jsx114("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.sender }) : null
3302
+ ] }),
3303
+ /* @__PURE__ */ jsxs87("div", { className: "flex shrink-0 items-center gap-2", children: [
3304
+ item.tag ? /* @__PURE__ */ jsx114(Badge, { children: item.tag }) : null,
3305
+ item.time ? /* @__PURE__ */ jsx114("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.time }) : null
3306
+ ] })
3307
+ ] }),
3308
+ item.snippet ? /* @__PURE__ */ jsx114("p", { className: "mt-2 line-clamp-2 text-sm text-[var(--tapiz-text-muted)]", children: item.snippet }) : null
3309
+ ] }, index)) });
3310
+ }
3311
+
3312
+ // src/components/framework/ApprovalQueue.tsx
3313
+ import { jsx as jsx115, jsxs as jsxs88 } from "react/jsx-runtime";
3314
+ function ApprovalQueue({ items, onApprove, onReject, className = "" }) {
3315
+ return /* @__PURE__ */ jsx115("div", { className: ["space-y-3", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsx115("article", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4", children: /* @__PURE__ */ jsxs88("div", { className: "flex flex-col gap-4 md:flex-row md:items-start md:justify-between", children: [
3316
+ /* @__PURE__ */ jsxs88("div", { children: [
3317
+ /* @__PURE__ */ jsxs88("div", { className: "flex flex-wrap items-center gap-2", children: [
3318
+ /* @__PURE__ */ jsx115("h3", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
3319
+ item.priority ? /* @__PURE__ */ jsx115(Badge, { variant: item.priority === "high" ? "danger" : item.priority === "medium" ? "warning" : "default", children: item.priority }) : null
3320
+ ] }),
3321
+ item.requester ? /* @__PURE__ */ jsxs88("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: [
3322
+ "Requested by ",
3323
+ item.requester
3324
+ ] }) : null,
3325
+ item.description ? /* @__PURE__ */ jsx115("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: item.description }) : null
3326
+ ] }),
3327
+ /* @__PURE__ */ jsxs88("div", { className: "flex gap-2", children: [
3328
+ /* @__PURE__ */ jsx115(Button, { size: "sm", variant: "secondary", onClick: () => onReject?.(index), children: "Reject" }),
3329
+ /* @__PURE__ */ jsx115(Button, { size: "sm", onClick: () => onApprove?.(index), children: "Approve" })
3330
+ ] })
3331
+ ] }) }, index)) });
3332
+ }
3333
+
3334
+ // src/components/framework/SLAStatus.tsx
3335
+ import { jsx as jsx116, jsxs as jsxs89 } from "react/jsx-runtime";
3336
+ function SLAStatus({ label, value, target = 95, className = "" }) {
3337
+ const ok = value >= target;
3338
+ return /* @__PURE__ */ jsxs89("div", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4", className].filter(Boolean).join(" "), children: [
3339
+ /* @__PURE__ */ jsxs89("div", { className: "flex items-center justify-between gap-3", children: [
3340
+ /* @__PURE__ */ jsx116("span", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: label }),
3341
+ /* @__PURE__ */ jsx116("span", { className: ["font-mono text-xs", ok ? "text-[var(--tapiz-success)]" : "text-[var(--tapiz-warning)]"].join(" "), children: ok ? "Within SLA" : "At risk" })
3342
+ ] }),
3343
+ /* @__PURE__ */ jsx116("div", { className: "mt-3 h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx116("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${Math.max(0, Math.min(100, value))}%` } }) }),
3344
+ /* @__PURE__ */ jsxs89("div", { className: "mt-2 flex justify-between font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: [
3345
+ /* @__PURE__ */ jsxs89("span", { children: [
3346
+ value,
3347
+ "%"
3348
+ ] }),
3349
+ /* @__PURE__ */ jsxs89("span", { children: [
3350
+ "Target ",
3351
+ target,
3352
+ "%"
3353
+ ] })
3354
+ ] })
3355
+ ] });
3356
+ }
3357
+
3358
+ // src/components/framework/FeatureFlagTable.tsx
3359
+ import { jsx as jsx117, jsxs as jsxs90 } from "react/jsx-runtime";
3360
+ function FeatureFlagTable({ flags, onToggle, className = "" }) {
3361
+ return /* @__PURE__ */ jsx117("div", { className: ["overflow-hidden border border-[var(--tapiz-border-subtle)]", className].filter(Boolean).join(" "), children: flags.map((flag) => /* @__PURE__ */ jsxs90("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: [
3362
+ /* @__PURE__ */ jsxs90("div", { children: [
3363
+ /* @__PURE__ */ jsxs90("div", { className: "flex flex-wrap items-center gap-2", children: [
3364
+ /* @__PURE__ */ jsx117("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: flag.name }),
3365
+ /* @__PURE__ */ jsx117(Badge, { children: flag.key })
3366
+ ] }),
3367
+ flag.description ? /* @__PURE__ */ jsx117("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: flag.description }) : null
3368
+ ] }),
3369
+ /* @__PURE__ */ jsx117("div", { className: "text-sm text-[var(--tapiz-text-muted)]", children: flag.rollout }),
3370
+ /* @__PURE__ */ jsx117(Switch, { checked: flag.enabled, onChange: (checked) => onToggle?.(flag.key, checked) })
3371
+ ] }, flag.key)) });
3372
+ }
3373
+
3374
+ // src/components/framework/PlanUsage.tsx
3375
+ import { jsx as jsx118, jsxs as jsxs91 } from "react/jsx-runtime";
3376
+ function PlanUsage({ title = "Plan usage", items, className = "" }) {
3377
+ return /* @__PURE__ */ jsxs91("section", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5", className].filter(Boolean).join(" "), children: [
3378
+ /* @__PURE__ */ jsx118("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }),
3379
+ /* @__PURE__ */ jsx118("div", { className: "mt-4 space-y-4", children: items.map((item, index) => {
3380
+ const pct = item.limit ? Math.min(100, item.used / item.limit * 100) : 0;
3381
+ return /* @__PURE__ */ jsxs91("div", { children: [
3382
+ /* @__PURE__ */ jsxs91("div", { className: "mb-1 flex justify-between text-sm", children: [
3383
+ /* @__PURE__ */ jsx118("span", { className: "text-[var(--tapiz-text-primary)]", children: item.label }),
3384
+ /* @__PURE__ */ jsxs91("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
3385
+ item.used,
3386
+ "/",
3387
+ item.limit
3388
+ ] })
3389
+ ] }),
3390
+ /* @__PURE__ */ jsx118("div", { className: "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: `${pct}%` } }) })
3391
+ ] }, index);
3392
+ }) })
3393
+ ] });
3394
+ }
3395
+
3396
+ // src/components/marketing/AnnouncementBar.tsx
3397
+ import { jsx as jsx119, jsxs as jsxs92 } from "react/jsx-runtime";
3398
+ function AnnouncementBar({ children, action, className = "" }) {
3399
+ return /* @__PURE__ */ jsx119("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__ */ jsxs92("div", { className: "mx-auto flex max-w-7xl flex-wrap items-center justify-center gap-3 text-center", children: [
3400
+ " ",
3401
+ /* @__PURE__ */ jsx119("span", { children }),
3402
+ action ? /* @__PURE__ */ jsx119("span", { children: action }) : null
3403
+ ] }) });
3404
+ }
3405
+
3406
+ // src/components/marketing/FAQSection.tsx
3407
+ import { jsx as jsx120, jsxs as jsxs93 } from "react/jsx-runtime";
3408
+ function FAQSection({ title = "Frequently asked questions", description, items, className = "" }) {
3409
+ return /* @__PURE__ */ jsxs93("section", { className, children: [
3410
+ /* @__PURE__ */ jsxs93("div", { className: "mb-6 max-w-2xl", children: [
3411
+ /* @__PURE__ */ jsx120("div", { className: "kicker", children: "FAQ" }),
3412
+ /* @__PURE__ */ jsx120("h2", { className: "mt-2 text-3xl font-semibold tracking-[-0.05em] text-[var(--tapiz-text-primary)]", children: title }),
3413
+ description ? /* @__PURE__ */ jsx120("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
3414
+ ] }),
3415
+ /* @__PURE__ */ jsx120(Accordion, { items: items.map((item, index) => ({ id: `faq-${index}`, title: item.question, content: item.answer })) })
3416
+ ] });
3417
+ }
3418
+
3419
+ // src/components/marketing/RoadmapList.tsx
3420
+ import { jsx as jsx121, jsxs as jsxs94 } from "react/jsx-runtime";
3421
+ function RoadmapList({ items, className = "" }) {
3422
+ return /* @__PURE__ */ jsx121("div", { className: ["grid gap-3 md:grid-cols-3", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsxs94("article", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5", children: [
3423
+ /* @__PURE__ */ jsxs94("div", { className: "flex items-center justify-between gap-3", children: [
3424
+ /* @__PURE__ */ jsx121("span", { className: "kicker", children: item.quarter ?? `0${index + 1}` }),
3425
+ item.status ? /* @__PURE__ */ jsx121(Badge, { children: item.status }) : null
3426
+ ] }),
3427
+ /* @__PURE__ */ jsx121("h3", { className: "mt-4 font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
3428
+ item.description ? /* @__PURE__ */ jsx121("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: item.description }) : null
3429
+ ] }, index)) });
3430
+ }
3431
+
3432
+ // src/components/feedback/InlineStatus.tsx
3433
+ import { jsx as jsx122, jsxs as jsxs95 } from "react/jsx-runtime";
3434
+ var toneClasses5 = {
3435
+ neutral: "bg-[var(--tapiz-text-muted)]",
3436
+ success: "bg-[var(--tapiz-success)]",
3437
+ warning: "bg-[var(--tapiz-warning)]",
3438
+ danger: "bg-[var(--tapiz-danger)]",
3439
+ info: "bg-[var(--tapiz-info)]"
3440
+ };
3441
+ function InlineStatus({ tone: tone2 = "neutral", children, pulse = false, className = "" }) {
3442
+ return /* @__PURE__ */ jsxs95("span", { className: ["inline-flex items-center gap-2 text-sm text-[var(--tapiz-text-muted)]", className].filter(Boolean).join(" "), children: [
3443
+ /* @__PURE__ */ jsx122("span", { className: ["h-2 w-2 rounded-full", toneClasses5[tone2], pulse ? "animate-pulse" : ""].filter(Boolean).join(" ") }),
3444
+ children
3445
+ ] });
3446
+ }
2004
3447
  export {
3448
+ AccessMatrix,
3449
+ Accordion,
2005
3450
  ActionMenu,
2006
3451
  Activity,
3452
+ ActivityFeed,
2007
3453
  ActivityMenu,
2008
- Alert,
3454
+ Alert2 as Alert,
3455
+ AnnouncementBar,
3456
+ AppShell,
2009
3457
  AppleIcon,
3458
+ ApprovalQueue,
2010
3459
  ArrowLeft,
2011
3460
  ArrowRight,
3461
+ AuditLog,
3462
+ Avatar,
2012
3463
  Badge,
2013
3464
  Ban,
2014
3465
  BarChart,
3466
+ BarList,
2015
3467
  BaseModal,
2016
3468
  Bell,
2017
3469
  Book,
3470
+ Breadcrumbs,
2018
3471
  Button,
3472
+ CTASection,
2019
3473
  Calendar,
3474
+ CalendarGrid,
2020
3475
  CalendarMonth,
2021
3476
  CalendarWeek,
3477
+ Callout,
2022
3478
  Card,
2023
3479
  CardBody,
2024
3480
  CardHeader,
@@ -2032,15 +3488,28 @@ export {
2032
3488
  ChevronUp,
2033
3489
  Clipboard,
2034
3490
  Clock,
3491
+ Cluster,
3492
+ CodeBlock,
3493
+ ColorSwatchPicker,
3494
+ Combobox,
3495
+ CommandMenu,
2035
3496
  Compare,
3497
+ ComparisonMeter,
3498
+ ComparisonTable,
2036
3499
  ConfirmDialog,
3500
+ Container,
2037
3501
  Copy,
2038
3502
  Cpu,
2039
3503
  CreditCard,
2040
3504
  DataTable,
3505
+ DataToolbar,
2041
3506
  Database,
3507
+ DateRangePicker,
2042
3508
  DefaultErrorFallback,
3509
+ Divider,
3510
+ DonutMetric,
2043
3511
  Download,
3512
+ Drawer,
2044
3513
  Edit,
2045
3514
  EmptyState,
2046
3515
  ErrorBoundary,
@@ -2048,15 +3517,23 @@ export {
2048
3517
  ExternalLink,
2049
3518
  Eye,
2050
3519
  EyeOff,
3520
+ FAQSection,
2051
3521
  Faculty,
3522
+ FeatureCard,
3523
+ FeatureFlagTable,
3524
+ FeatureGrid,
2052
3525
  FieldHint,
2053
3526
  FieldLabel,
3527
+ FileDropzone,
2054
3528
  FileText,
2055
3529
  FileUpload,
3530
+ FilterChip,
2056
3531
  FingerprintIcon,
2057
3532
  FormError,
3533
+ FormField,
2058
3534
  FormIcon,
2059
3535
  FormulaIcon,
3536
+ FunnelChart,
2060
3537
  Gear,
2061
3538
  Globe,
2062
3539
  GooglePlayIcon,
@@ -2065,70 +3542,117 @@ export {
2065
3542
  GridBg,
2066
3543
  HardDrive,
2067
3544
  Hash,
3545
+ HealthIndicator,
3546
+ HeatmapGrid,
2068
3547
  HelpCircle,
3548
+ HeroFrame,
2069
3549
  History,
2070
3550
  Home,
2071
3551
  Icons,
2072
3552
  Image,
3553
+ InboxList,
2073
3554
  Info,
2074
3555
  InfoBanner,
3556
+ InlineStatus,
2075
3557
  Input,
3558
+ InputGroup,
3559
+ IntegrationCard,
2076
3560
  Intersect,
3561
+ KanbanBoard,
3562
+ Kbd,
3563
+ KeyValueList,
2077
3564
  Layers,
3565
+ LoadingOverlay,
2078
3566
  LockIcon,
2079
3567
  LogOut,
3568
+ LogoCloud,
2080
3569
  LogoMark,
2081
3570
  Mail,
3571
+ MarketingShell,
3572
+ MasonryGrid,
2082
3573
  Megaphone,
2083
3574
  Menu,
3575
+ MetricCard,
3576
+ MockupFrame,
2084
3577
  Monitor,
2085
3578
  Moon,
2086
3579
  NavAnalytics,
2087
3580
  NavQrAttendance,
2088
3581
  NavScoresheet,
2089
3582
  NavSecurity,
3583
+ NotificationList,
2090
3584
  NumberIcon,
2091
3585
  OfficeHours,
2092
3586
  PageHeader,
3587
+ PageRail,
2093
3588
  PageSpinner,
2094
3589
  Pagination,
3590
+ PasswordInput,
2095
3591
  Pdf,
3592
+ PlanUsage,
2096
3593
  Plus,
3594
+ Popover,
3595
+ PricingCard,
2097
3596
  Printer,
3597
+ Progress,
2098
3598
  QrCode,
2099
3599
  RadioButton,
3600
+ RatingInput,
2100
3601
  Refresh,
2101
3602
  RefreshCw,
2102
3603
  Repeat,
2103
3604
  Report,
3605
+ ResourceCard,
3606
+ ResponsiveGrid,
3607
+ RoadmapList,
2104
3608
  RotateCcw,
3609
+ SLAStatus,
2105
3610
  Scan,
3611
+ ScoreRing,
2106
3612
  Search,
2107
3613
  SearchInput,
3614
+ SectionCard,
2108
3615
  SectionIcons,
2109
3616
  SectionTitle,
2110
3617
  Select,
2111
3618
  Server,
2112
3619
  Shield,
3620
+ SidebarNav,
2113
3621
  Skeleton,
2114
3622
  SkeletonBanner,
2115
3623
  SkeletonCard,
2116
3624
  SkeletonKpiCard,
2117
3625
  SkeletonPageHeader,
2118
3626
  SkeletonTable,
3627
+ Slider,
2119
3628
  Smartphone,
3629
+ Sparkline,
2120
3630
  Spinner,
3631
+ SplitPane,
2121
3632
  Spotlight,
3633
+ Stack,
2122
3634
  Star,
3635
+ StatGrid,
3636
+ StatsBand,
2123
3637
  StatusBadge,
3638
+ Stepper,
3639
+ StickyBar,
2124
3640
  Sun,
3641
+ Surface,
3642
+ Switch,
2125
3643
  Table,
2126
3644
  Tablet,
3645
+ Tabs,
3646
+ TestimonialCard,
2127
3647
  TextIcon,
2128
3648
  Textarea,
3649
+ TextareaCounter,
3650
+ Timeline,
2129
3651
  Toast,
2130
3652
  ToastProvider,
3653
+ ToggleGroup,
2131
3654
  Tooltip,
3655
+ TopNav,
2132
3656
  Trash,
2133
3657
  Trophy,
2134
3658
  TwoFAIcon,
@@ -2141,6 +3665,7 @@ export {
2141
3665
  Users,
2142
3666
  X,
2143
3667
  Zap,
3668
+ tapizFrameworkPresets,
2144
3669
  useToast
2145
3670
  };
2146
3671
  //# sourceMappingURL=index.js.map