@tapizlabs/ui 0.1.6 → 0.2.1

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 = {
@@ -1391,11 +1393,43 @@ function Tooltip({ text, children, position = "top", align = "center", width = "
1391
1393
 
1392
1394
  // src/components/shared/Card.tsx
1393
1395
  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 });
1396
+ var variantClasses2 = {
1397
+ surface: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-sm)]",
1398
+ raised: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-raised)] shadow-[var(--tapiz-shadow-md)]",
1399
+ outlined: "border border-[var(--tapiz-border-strong)] bg-transparent",
1400
+ brutal: "border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-brutal)]",
1401
+ 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"
1402
+ };
1403
+ var paddingClasses = {
1404
+ none: "p-0",
1405
+ sm: "p-3",
1406
+ md: "p-5",
1407
+ lg: "p-6"
1408
+ };
1409
+ function Card({
1410
+ children,
1411
+ className = "",
1412
+ hover = false,
1413
+ style,
1414
+ variant = "surface",
1415
+ padding = "md"
1416
+ }) {
1417
+ return /* @__PURE__ */ jsx27(
1418
+ "div",
1419
+ {
1420
+ className: [
1421
+ variantClasses2[variant],
1422
+ paddingClasses[padding],
1423
+ hover ? "card-hover" : "",
1424
+ className
1425
+ ].filter(Boolean).join(" "),
1426
+ style,
1427
+ children
1428
+ }
1429
+ );
1396
1430
  }
1397
1431
  function CardHeader({ children, className = "" }) {
1398
- return /* @__PURE__ */ jsx27("div", { className: `border-b border-border px-5 py-3 ${className}`, children });
1432
+ return /* @__PURE__ */ jsx27("div", { className: `border-b border-[var(--tapiz-border-subtle)] px-5 py-3 ${className}`, children });
1399
1433
  }
1400
1434
  function CardBody({ children, className = "" }) {
1401
1435
  return /* @__PURE__ */ jsx27("div", { className: `p-5 ${className}`, children });
@@ -1482,18 +1516,19 @@ function SkeletonPageHeader() {
1482
1516
 
1483
1517
  // src/components/shared/Badge.tsx
1484
1518
  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",
1519
+ var variantClasses3 = {
1520
+ default: "border-[var(--tapiz-accent)] text-[var(--tapiz-accent)] bg-[var(--tapiz-accent-soft)]",
1521
+ success: "border-[var(--tapiz-success)] text-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
1522
+ warning: "border-[var(--tapiz-warning)] text-[var(--tapiz-warning)] bg-[var(--tapiz-warning-soft)]",
1523
+ danger: "border-[var(--tapiz-danger)] text-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)]",
1524
+ info: "border-[var(--tapiz-info)] text-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)]",
1490
1525
  muted: "border-txt-3 text-txt-3"
1491
1526
  };
1492
1527
  function Badge({ children, variant = "default", className = "" }) {
1493
1528
  return /* @__PURE__ */ jsx30(
1494
1529
  "span",
1495
1530
  {
1496
- className: `inline-flex items-center border px-2 py-0.5 font-mono text-[9px] font-bold uppercase tracking-widest ${variantClasses2[variant]} ${className}`,
1531
+ className: `inline-flex items-center border px-2 py-0.5 font-mono text-[9px] font-bold uppercase tracking-widest ${variantClasses3[variant]} ${className}`,
1497
1532
  children
1498
1533
  }
1499
1534
  );
@@ -1559,30 +1594,103 @@ function InfoBanner(props) {
1559
1594
 
1560
1595
  // src/components/shared/PageHeader.tsx
1561
1596
  import { jsx as jsx33, jsxs as jsxs23 } from "react/jsx-runtime";
1562
- function PageHeader({ title, subtitle, action, icon, banner, className = "" }) {
1563
- return /* @__PURE__ */ jsxs23(
1597
+ function PageHeader({
1598
+ title,
1599
+ subtitle,
1600
+ description,
1601
+ action,
1602
+ actions,
1603
+ icon,
1604
+ banner,
1605
+ breadcrumbs,
1606
+ meta,
1607
+ className = "",
1608
+ variant = "default"
1609
+ }) {
1610
+ const resolvedActions = actions ?? action;
1611
+ 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";
1612
+ return /* @__PURE__ */ jsxs23("div", { className: `page-header mb-5 flex flex-col gap-3 animate-fade-in-up ${variantClass} ${className}`.trim(), children: [
1613
+ breadcrumbs ? /* @__PURE__ */ jsx33("div", { className: "font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: breadcrumbs }) : null,
1614
+ /* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [
1615
+ /* @__PURE__ */ jsxs23("div", { className: "min-w-0", children: [
1616
+ subtitle ? /* @__PURE__ */ jsx33("div", { className: "kicker mb-1.5", children: subtitle }) : null,
1617
+ /* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-2.5", children: [
1618
+ icon ? /* @__PURE__ */ jsx33("span", { className: "text-[var(--tapiz-accent)]", children: icon }) : null,
1619
+ /* @__PURE__ */ jsx33("h2", { className: "font-(--font-display) text-[22px] tracking-[-0.03em] text-[var(--tapiz-text-primary)] md:text-[26px]", children: title })
1620
+ ] }),
1621
+ description ? /* @__PURE__ */ jsx33("div", { className: "mt-2 max-w-3xl text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null,
1622
+ meta ? /* @__PURE__ */ jsx33("div", { className: "mt-3 font-mono text-[11px] text-[var(--tapiz-text-disabled)]", children: meta }) : null
1623
+ ] }),
1624
+ resolvedActions ? /* @__PURE__ */ jsx33("div", { className: "flex shrink-0 flex-wrap gap-2", children: resolvedActions }) : null
1625
+ ] }),
1626
+ banner ? banner : null
1627
+ ] });
1628
+ }
1629
+
1630
+ // src/components/shared/MetricCard.tsx
1631
+ import { jsx as jsx34, jsxs as jsxs24 } from "react/jsx-runtime";
1632
+ var trendClasses = {
1633
+ positive: "border-[var(--tapiz-success)] text-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
1634
+ negative: "border-[var(--tapiz-danger)] text-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)]",
1635
+ warning: "border-[var(--tapiz-warning)] text-[var(--tapiz-warning)] bg-[var(--tapiz-warning-soft)]",
1636
+ neutral: "border-[var(--tapiz-border-strong)] text-[var(--tapiz-text-muted)] bg-[var(--tapiz-bg-surface-muted)]"
1637
+ };
1638
+ function MetricCard({
1639
+ label,
1640
+ value,
1641
+ description,
1642
+ icon,
1643
+ trend,
1644
+ trendTone = "neutral",
1645
+ className = "",
1646
+ variant = "surface"
1647
+ }) {
1648
+ return /* @__PURE__ */ jsxs24(Card, { variant, padding: "md", hover: true, className: `relative overflow-hidden ${className}`, children: [
1649
+ /* @__PURE__ */ jsxs24("div", { className: "flex items-start justify-between gap-4", children: [
1650
+ /* @__PURE__ */ jsxs24("div", { className: "min-w-0", children: [
1651
+ /* @__PURE__ */ jsx34("p", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: label }),
1652
+ /* @__PURE__ */ jsx34("div", { className: "mt-2 font-display text-3xl font-semibold tracking-[-0.05em] text-[var(--tapiz-text-primary)]", children: value })
1653
+ ] }),
1654
+ 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
1655
+ ] }),
1656
+ description || trend ? /* @__PURE__ */ jsxs24("div", { className: "mt-4 flex flex-wrap items-center gap-2", children: [
1657
+ 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,
1658
+ description ? /* @__PURE__ */ jsx34("p", { className: "text-xs text-[var(--tapiz-text-muted)]", children: description }) : null
1659
+ ] }) : null
1660
+ ] });
1661
+ }
1662
+
1663
+ // src/components/shared/StatGrid.tsx
1664
+ import { jsx as jsx35 } from "react/jsx-runtime";
1665
+ function StatGrid({ children, className = "", minColumnWidth = "14rem" }) {
1666
+ return /* @__PURE__ */ jsx35(
1564
1667
  "div",
1565
1668
  {
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
- ]
1669
+ className: `grid gap-4 ${className}`,
1670
+ style: { gridTemplateColumns: `repeat(auto-fit, minmax(${minColumnWidth}, 1fr))` },
1671
+ children
1580
1672
  }
1581
1673
  );
1582
1674
  }
1583
1675
 
1676
+ // src/components/shared/SectionCard.tsx
1677
+ import { jsx as jsx36, jsxs as jsxs25 } from "react/jsx-runtime";
1678
+ function SectionCard({ title, eyebrow, description, action, children, className = "" }) {
1679
+ return /* @__PURE__ */ jsxs25(Card, { variant: "surface", padding: "none", className, children: [
1680
+ 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: [
1681
+ /* @__PURE__ */ jsxs25("div", { className: "min-w-0", children: [
1682
+ eyebrow ? /* @__PURE__ */ jsx36("div", { className: "kicker mb-1", children: eyebrow }) : null,
1683
+ title ? /* @__PURE__ */ jsx36("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
1684
+ description ? /* @__PURE__ */ jsx36("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null
1685
+ ] }),
1686
+ action ? /* @__PURE__ */ jsx36("div", { className: "shrink-0", children: action }) : null
1687
+ ] }) : null,
1688
+ /* @__PURE__ */ jsx36("div", { className: "p-5", children })
1689
+ ] });
1690
+ }
1691
+
1584
1692
  // src/components/shared/SearchInput.tsx
1585
- import { jsx as jsx34, jsxs as jsxs24 } from "react/jsx-runtime";
1693
+ import { jsx as jsx37, jsxs as jsxs26 } from "react/jsx-runtime";
1586
1694
  function SearchInput({
1587
1695
  value,
1588
1696
  onChange,
@@ -1595,9 +1703,9 @@ function SearchInput({
1595
1703
  clearTitle = "Clear search",
1596
1704
  ...props
1597
1705
  }) {
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(
1706
+ return /* @__PURE__ */ jsxs26("div", { className: `relative ${wrapperClassName}`.trim(), style: wrapperStyle, children: [
1707
+ /* @__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 }) }),
1708
+ /* @__PURE__ */ jsx37(
1601
1709
  Input,
1602
1710
  {
1603
1711
  ...props,
@@ -1608,21 +1716,21 @@ function SearchInput({
1608
1716
  className: `pl-9 ${inputClassName}`.trim()
1609
1717
  }
1610
1718
  ),
1611
- clearable && value ? /* @__PURE__ */ jsx34(
1719
+ clearable && value ? /* @__PURE__ */ jsx37(
1612
1720
  "button",
1613
1721
  {
1614
1722
  type: "button",
1615
1723
  onClick: () => onChange(""),
1616
1724
  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
1725
  title: clearTitle,
1618
- children: /* @__PURE__ */ jsx34(X, { size: 14 })
1726
+ children: /* @__PURE__ */ jsx37(X, { size: 14 })
1619
1727
  }
1620
1728
  ) : null
1621
1729
  ] });
1622
1730
  }
1623
1731
 
1624
1732
  // src/components/shared/Pagination.tsx
1625
- import { jsx as jsx35, jsxs as jsxs25 } from "react/jsx-runtime";
1733
+ import { jsx as jsx38, jsxs as jsxs27 } from "react/jsx-runtime";
1626
1734
  function getPageNumbers(page, totalPages) {
1627
1735
  if (totalPages <= 7) return Array.from({ length: totalPages }, (_, i) => i + 1);
1628
1736
  const pages = [1];
@@ -1646,10 +1754,10 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
1646
1754
  const pageNumbers = getPageNumbers(page, totalPages);
1647
1755
  const from = pageSize ? (page - 1) * pageSize + 1 : null;
1648
1756
  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(
1757
+ return /* @__PURE__ */ jsxs27("div", { className: "flex flex-col items-center justify-between gap-3 border-t border-border pt-3 sm:flex-row", children: [
1758
+ 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 }) }),
1759
+ /* @__PURE__ */ jsxs27("div", { className: "order-1 flex items-center gap-1 sm:order-2", children: [
1760
+ /* @__PURE__ */ jsxs27(
1653
1761
  "button",
1654
1762
  {
1655
1763
  type: "button",
@@ -1658,13 +1766,13 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
1658
1766
  title: copy.prevTitle,
1659
1767
  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
1768
  children: [
1661
- /* @__PURE__ */ jsx35(ChevronLeft, { size: 12 }),
1662
- /* @__PURE__ */ jsx35("span", { className: "hidden sm:inline", children: copy.prev })
1769
+ /* @__PURE__ */ jsx38(ChevronLeft, { size: 12 }),
1770
+ /* @__PURE__ */ jsx38("span", { className: "hidden sm:inline", children: copy.prev })
1663
1771
  ]
1664
1772
  }
1665
1773
  ),
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(
1774
+ /* @__PURE__ */ jsx38("div", { className: "flex items-center gap-1", children: pageNumbers.map(
1775
+ (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
1776
  "button",
1669
1777
  {
1670
1778
  type: "button",
@@ -1675,7 +1783,7 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
1675
1783
  entry
1676
1784
  )
1677
1785
  ) }),
1678
- /* @__PURE__ */ jsxs25(
1786
+ /* @__PURE__ */ jsxs27(
1679
1787
  "button",
1680
1788
  {
1681
1789
  type: "button",
@@ -1684,8 +1792,8 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
1684
1792
  title: copy.nextTitle,
1685
1793
  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
1794
  children: [
1687
- /* @__PURE__ */ jsx35("span", { className: "hidden sm:inline", children: copy.next }),
1688
- /* @__PURE__ */ jsx35(ChevronRight, { size: 12 })
1795
+ /* @__PURE__ */ jsx38("span", { className: "hidden sm:inline", children: copy.next }),
1796
+ /* @__PURE__ */ jsx38(ChevronRight, { size: 12 })
1689
1797
  ]
1690
1798
  }
1691
1799
  )
@@ -1694,31 +1802,32 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
1694
1802
  }
1695
1803
 
1696
1804
  // src/components/shared/SectionTitle.tsx
1697
- import { jsx as jsx36 } from "react/jsx-runtime";
1805
+ import { jsx as jsx39 } from "react/jsx-runtime";
1698
1806
  function SectionTitle({ children, className = "" }) {
1699
- return /* @__PURE__ */ jsx36("h3", { className: `mb-1 text-sm font-semibold text-txt-1 ${className}`.trim(), children });
1807
+ return /* @__PURE__ */ jsx39("h3", { className: `mb-1 text-sm font-semibold text-txt-1 ${className}`.trim(), children });
1700
1808
  }
1701
1809
 
1702
1810
  // 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]";
1811
+ import { jsx as jsx40 } from "react/jsx-runtime";
1812
+ var BASE = "inline-flex items-center border px-2 py-0.5 font-mono text-[9px] font-bold uppercase tracking-[0.15em]";
1705
1813
  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"
1814
+ default: "border-[var(--tapiz-border-strong)] text-[var(--tapiz-text-secondary)] bg-[var(--tapiz-bg-surface-muted)]",
1815
+ active: "border-[var(--tapiz-accent)] text-[var(--tapiz-accent)] bg-[var(--tapiz-accent-soft)]",
1816
+ success: "border-[var(--tapiz-success)] text-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
1817
+ inactive: "border-[var(--tapiz-text-disabled)] text-[var(--tapiz-text-disabled)] bg-transparent",
1818
+ warning: "border-[var(--tapiz-warning)] text-[var(--tapiz-warning)] bg-[var(--tapiz-warning-soft)]",
1819
+ danger: "border-[var(--tapiz-danger)] text-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)]",
1820
+ info: "border-[var(--tapiz-info)] text-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)]",
1821
+ pending: "border-[var(--tapiz-text-muted)] text-[var(--tapiz-text-muted)] bg-transparent"
1713
1822
  };
1714
1823
  function StatusBadge({ label, variant = "default", className = "" }) {
1715
- return /* @__PURE__ */ jsx37("span", { className: `${BASE} ${variantStyles[variant]} ${className}`.trim(), children: label });
1824
+ return /* @__PURE__ */ jsx40("span", { className: `${BASE} ${variantStyles[variant]} ${className}`.trim(), children: label });
1716
1825
  }
1717
1826
 
1718
1827
  // src/components/shared/ActionMenu.tsx
1719
1828
  import { useEffect as useEffect2, useLayoutEffect, useRef as useRef2, useState as useState5 } from "react";
1720
1829
  import { createPortal as createPortal4 } from "react-dom";
1721
- import { Fragment, jsx as jsx38, jsxs as jsxs26 } from "react/jsx-runtime";
1830
+ import { Fragment, jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
1722
1831
  var defaultMenuStyle = {
1723
1832
  background: "var(--color-ink-200)",
1724
1833
  border: "1px solid var(--color-border-hi)",
@@ -1802,9 +1911,9 @@ function ActionMenu({
1802
1911
  document.removeEventListener("keydown", handle);
1803
1912
  };
1804
1913
  }, [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(
1914
+ const menuNode = open && pos ? /* @__PURE__ */ jsxs28(Fragment, { children: [
1915
+ /* @__PURE__ */ jsx41("div", { className: "fixed inset-0 z-9998", onClick: () => setOpen(false) }),
1916
+ /* @__PURE__ */ jsx41(
1808
1917
  "div",
1809
1918
  {
1810
1919
  ref: menuRef,
@@ -1821,9 +1930,9 @@ function ActionMenu({
1821
1930
  maxHeight: pos.maxHeight ?? defaultMenuStyle.maxHeight,
1822
1931
  ...menuStyle
1823
1932
  },
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(
1933
+ children: items.map((item, index) => /* @__PURE__ */ jsxs28("div", { children: [
1934
+ index > 0 && item.danger ? /* @__PURE__ */ jsx41("div", { style: { borderTop: "1px solid var(--color-border)" } }) : null,
1935
+ /* @__PURE__ */ jsxs28(
1827
1936
  "button",
1828
1937
  {
1829
1938
  type: "button",
@@ -1835,8 +1944,8 @@ function ActionMenu({
1835
1944
  item.onSelect();
1836
1945
  },
1837
1946
  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 })
1947
+ 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 }),
1948
+ /* @__PURE__ */ jsx41("span", { children: item.label })
1840
1949
  ]
1841
1950
  }
1842
1951
  )
@@ -1844,14 +1953,14 @@ function ActionMenu({
1844
1953
  }
1845
1954
  )
1846
1955
  ] }) : null;
1847
- return /* @__PURE__ */ jsxs26("div", { ref: btnRef, className: fullWidth ? "relative w-full" : "relative inline-block max-w-full", children: [
1848
- /* @__PURE__ */ jsx38(
1956
+ return /* @__PURE__ */ jsxs28("div", { ref: btnRef, className: fullWidth ? "relative w-full" : "relative inline-block max-w-full", children: [
1957
+ /* @__PURE__ */ jsx41(
1849
1958
  Button,
1850
1959
  {
1851
1960
  size: buttonSize,
1852
1961
  variant: buttonVariant,
1853
1962
  icon,
1854
- iconRight: /* @__PURE__ */ jsx38(ChevronDown, { size: 11 }),
1963
+ iconRight: /* @__PURE__ */ jsx41(ChevronDown, { size: 11 }),
1855
1964
  onClick: () => setOpen((value) => !value),
1856
1965
  className: buttonClassName,
1857
1966
  fullWidth,
@@ -1867,29 +1976,29 @@ import { useMemo as useMemo2, useState as useState6 } from "react";
1867
1976
 
1868
1977
  // src/components/table/DataTableRow.tsx
1869
1978
  import { memo } from "react";
1870
- import { jsx as jsx39, jsxs as jsxs27 } from "react/jsx-runtime";
1979
+ import { jsx as jsx42, jsxs as jsxs29 } from "react/jsx-runtime";
1871
1980
  var ALIGN_CLASS = {
1872
1981
  left: "text-left",
1873
1982
  center: "text-center",
1874
1983
  right: "text-right"
1875
1984
  };
1876
- function DataTableRowInner({ row, columns, onRowClick, rowActions }) {
1985
+ function DataTableRowInner({ row, columns, onRowClick, rowActions, densityCellClass = "px-3 py-2.5", striped = true }) {
1877
1986
  const clickable = Boolean(onRowClick);
1878
- return /* @__PURE__ */ jsxs27(
1987
+ return /* @__PURE__ */ jsxs29(
1879
1988
  "tr",
1880
1989
  {
1881
1990
  onClick: clickable ? () => onRowClick?.(row) : void 0,
1882
- className: `border-b border-border transition-colors hover:bg-ink-300/30 ${clickable ? "cursor-pointer" : ""}`,
1991
+ 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
1992
  children: [
1884
- columns.map((column) => /* @__PURE__ */ jsx39(
1993
+ columns.map((column) => /* @__PURE__ */ jsx42(
1885
1994
  "td",
1886
1995
  {
1887
- className: `px-3 py-2 text-xs text-txt-3 ${ALIGN_CLASS[column.align ?? "left"]} ${column.className ?? ""}`,
1996
+ className: `${densityCellClass} text-xs text-[var(--tapiz-text-secondary)] ${ALIGN_CLASS[column.align ?? "left"]} ${column.className ?? ""}`,
1888
1997
  children: column.cell(row)
1889
1998
  },
1890
1999
  column.id
1891
2000
  )),
1892
- rowActions !== void 0 && /* @__PURE__ */ jsx39("td", { className: "px-3 py-2 text-right", children: rowActions(row) })
2001
+ rowActions !== void 0 && /* @__PURE__ */ jsx42("td", { className: `${densityCellClass} text-right`, children: rowActions(row) })
1893
2002
  ]
1894
2003
  }
1895
2004
  );
@@ -1897,7 +2006,7 @@ function DataTableRowInner({ row, columns, onRowClick, rowActions }) {
1897
2006
  var DataTableRow = memo(DataTableRowInner);
1898
2007
 
1899
2008
  // src/components/table/DataTable.tsx
1900
- import { jsx as jsx40, jsxs as jsxs28 } from "react/jsx-runtime";
2009
+ import { jsx as jsx43, jsxs as jsxs30 } from "react/jsx-runtime";
1901
2010
  var ALIGN_CLASS2 = {
1902
2011
  left: "text-left",
1903
2012
  center: "text-center",
@@ -1927,7 +2036,12 @@ function DataTable({
1927
2036
  rowActions,
1928
2037
  serverSort,
1929
2038
  footer,
1930
- mobileCard
2039
+ mobileCard,
2040
+ density = "comfortable",
2041
+ variant = "default",
2042
+ stickyHeader = false,
2043
+ striped = true,
2044
+ className = ""
1931
2045
  }) {
1932
2046
  const [sort, setSort] = useState6(null);
1933
2047
  const sortedData = useMemo2(() => {
@@ -1952,24 +2066,32 @@ function DataTable({
1952
2066
  const hasActions = rowActions !== void 0;
1953
2067
  const colCount = columns.length + (hasActions ? 1 : 0);
1954
2068
  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: [
2069
+ const densityHeaderClass = density === "compact" ? "px-3 py-2" : density === "spacious" ? "px-4 py-4" : "px-3 py-2.5";
2070
+ const densityCellClass = density === "compact" ? "px-3 py-2" : density === "spacious" ? "px-4 py-4" : "px-3 py-2.5";
2071
+ const wrapperClass = [
2072
+ "overflow-x-auto",
2073
+ variant === "brutal" ? "border-2 border-[var(--tapiz-border-strong)] shadow-[var(--tapiz-shadow-brutal)]" : "border border-[var(--tapiz-border-subtle)]",
2074
+ variant === "enterprise" ? "bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-md)]" : "",
2075
+ className
2076
+ ].filter(Boolean).join(" ");
2077
+ return /* @__PURE__ */ jsxs30("div", { className: wrapperClass, children: [
2078
+ 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))) }),
2079
+ /* @__PURE__ */ jsxs30("table", { className: tableClass, children: [
2080
+ /* @__PURE__ */ jsx43("thead", { children: /* @__PURE__ */ jsxs30("tr", { className: "border-b border-border bg-ink-300", children: [
1959
2081
  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`;
2082
+ 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
2083
  if (!column.sortable || !column.sortAccessor) {
1962
- return /* @__PURE__ */ jsx40("th", { scope: "col", className: baseClass, children: column.header }, column.id);
2084
+ return /* @__PURE__ */ jsx43("th", { scope: "col", className: baseClass, children: column.header }, column.id);
1963
2085
  }
1964
2086
  const active = serverSort ? serverSort.field === column.id : sort?.columnId === column.id;
1965
2087
  const direction = serverSort ? serverSort.dir : sort?.direction ?? "asc";
1966
- return /* @__PURE__ */ jsx40(
2088
+ return /* @__PURE__ */ jsx43(
1967
2089
  "th",
1968
2090
  {
1969
2091
  scope: "col",
1970
2092
  "aria-sort": ariaSort(active, direction),
1971
2093
  className: baseClass,
1972
- children: /* @__PURE__ */ jsxs28(
2094
+ children: /* @__PURE__ */ jsxs30(
1973
2095
  "button",
1974
2096
  {
1975
2097
  type: "button",
@@ -1977,7 +2099,7 @@ function DataTable({
1977
2099
  className: `inline-flex items-center gap-1 select-none transition-colors hover:text-txt-1 ${active ? "text-txt-1" : ""}`,
1978
2100
  children: [
1979
2101
  column.header,
1980
- active && (direction === "asc" ? /* @__PURE__ */ jsx40(ChevronUp, { size: 12 }) : /* @__PURE__ */ jsx40(ChevronDown, { size: 12 }))
2102
+ active && (direction === "asc" ? /* @__PURE__ */ jsx43(ChevronUp, { size: 12 }) : /* @__PURE__ */ jsx43(ChevronDown, { size: 12 }))
1981
2103
  ]
1982
2104
  }
1983
2105
  )
@@ -1985,15 +2107,17 @@ function DataTable({
1985
2107
  column.id
1986
2108
  );
1987
2109
  }),
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" })
2110
+ 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
2111
  ] }) }),
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(
2112
+ /* @__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
2113
  DataTableRow,
1992
2114
  {
1993
2115
  row,
1994
2116
  columns,
1995
2117
  onRowClick,
1996
- rowActions
2118
+ rowActions,
2119
+ densityCellClass,
2120
+ striped
1997
2121
  },
1998
2122
  rowKey(row)
1999
2123
  )) })
@@ -2001,24 +2125,1688 @@ function DataTable({
2001
2125
  footer !== void 0 && footer
2002
2126
  ] });
2003
2127
  }
2128
+
2129
+ // src/components/marketing/MarketingShell.tsx
2130
+ import { jsx as jsx44 } from "react/jsx-runtime";
2131
+ function MarketingShell({ children, className = "", grid = true, noise = true }) {
2132
+ return /* @__PURE__ */ jsx44(
2133
+ "main",
2134
+ {
2135
+ className: [
2136
+ "min-h-screen overflow-hidden bg-[var(--tapiz-bg-page)] text-[var(--tapiz-text-primary)]",
2137
+ grid ? "tapiz-grid-bg" : "",
2138
+ noise ? "tapiz-noise-bg" : "",
2139
+ className
2140
+ ].filter(Boolean).join(" "),
2141
+ children
2142
+ }
2143
+ );
2144
+ }
2145
+
2146
+ // src/components/marketing/HeroFrame.tsx
2147
+ import { jsx as jsx45, jsxs as jsxs31 } from "react/jsx-runtime";
2148
+ function HeroFrame({ eyebrow, title, description, actions, visual, meta, className = "" }) {
2149
+ 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: [
2150
+ /* @__PURE__ */ jsxs31("div", { className: "animate-fade-in-up", children: [
2151
+ eyebrow ? /* @__PURE__ */ jsx45("div", { className: "kicker mb-4", children: eyebrow }) : null,
2152
+ /* @__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 }),
2153
+ 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,
2154
+ actions ? /* @__PURE__ */ jsx45("div", { className: "mt-8 flex flex-wrap gap-3", children: actions }) : null,
2155
+ 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
2156
+ ] }),
2157
+ 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
2158
+ ] });
2159
+ }
2160
+
2161
+ // src/components/marketing/FeatureCard.tsx
2162
+ import { jsx as jsx46, jsxs as jsxs32 } from "react/jsx-runtime";
2163
+ function FeatureCard({ title, description, icon, eyebrow, children, className = "", variant = "surface" }) {
2164
+ return /* @__PURE__ */ jsxs32(Card, { variant, hover: true, className: `group ${className}`, children: [
2165
+ /* @__PURE__ */ jsxs32("div", { className: "flex items-start gap-4", children: [
2166
+ 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,
2167
+ /* @__PURE__ */ jsxs32("div", { className: "min-w-0", children: [
2168
+ eyebrow ? /* @__PURE__ */ jsx46("div", { className: "kicker mb-1", children: eyebrow }) : null,
2169
+ /* @__PURE__ */ jsx46("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: title }),
2170
+ description ? /* @__PURE__ */ jsx46("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
2171
+ ] })
2172
+ ] }),
2173
+ children ? /* @__PURE__ */ jsx46("div", { className: "mt-5", children }) : null
2174
+ ] });
2175
+ }
2176
+
2177
+ // src/components/marketing/FeatureGrid.tsx
2178
+ import { jsx as jsx47 } from "react/jsx-runtime";
2179
+ function FeatureGrid({ children, className = "" }) {
2180
+ return /* @__PURE__ */ jsx47("div", { className: `grid gap-4 md:grid-cols-2 xl:grid-cols-3 ${className}`, children });
2181
+ }
2182
+
2183
+ // src/components/marketing/CTASection.tsx
2184
+ import { jsx as jsx48, jsxs as jsxs33 } from "react/jsx-runtime";
2185
+ function CTASection({ eyebrow, title, description, actions, className = "" }) {
2186
+ 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: [
2187
+ eyebrow ? /* @__PURE__ */ jsx48("div", { className: "kicker mb-3", children: eyebrow }) : null,
2188
+ /* @__PURE__ */ jsxs33("div", { className: "grid gap-6 lg:grid-cols-[1fr_auto] lg:items-end", children: [
2189
+ /* @__PURE__ */ jsxs33("div", { children: [
2190
+ /* @__PURE__ */ jsx48("h2", { className: "max-w-3xl text-3xl font-semibold tracking-[-0.05em] md:text-5xl", children: title }),
2191
+ description ? /* @__PURE__ */ jsx48("p", { className: "mt-4 max-w-2xl text-base leading-7 text-[var(--tapiz-text-secondary)]", children: description }) : null
2192
+ ] }),
2193
+ actions ? /* @__PURE__ */ jsx48("div", { className: "flex flex-wrap gap-3", children: actions }) : null
2194
+ ] })
2195
+ ] }) });
2196
+ }
2197
+
2198
+ // src/components/marketing/MockupFrame.tsx
2199
+ import { jsx as jsx49, jsxs as jsxs34 } from "react/jsx-runtime";
2200
+ function MockupFrame({ children, title, toolbar, className = "" }) {
2201
+ 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: [
2202
+ /* @__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: [
2203
+ /* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-1.5", children: [
2204
+ /* @__PURE__ */ jsx49("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-danger)]" }),
2205
+ /* @__PURE__ */ jsx49("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-warning)]" }),
2206
+ /* @__PURE__ */ jsx49("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-success)]" })
2207
+ ] }),
2208
+ title ? /* @__PURE__ */ jsx49("div", { className: "font-mono text-[10px] uppercase tracking-widest text-[var(--tapiz-text-muted)]", children: title }) : null,
2209
+ /* @__PURE__ */ jsx49("div", { children: toolbar })
2210
+ ] }),
2211
+ /* @__PURE__ */ jsx49("div", { className: "p-4", children })
2212
+ ] });
2213
+ }
2214
+
2215
+ // src/components/marketing/ComparisonTable.tsx
2216
+ import { jsx as jsx50, jsxs as jsxs35 } from "react/jsx-runtime";
2217
+ function ComparisonTable({ rows, featureHeader = "Feature", includedHeader = "Tapiz", alternativeHeader = "Other", className = "" }) {
2218
+ 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: [
2219
+ /* @__PURE__ */ jsx50("thead", { children: /* @__PURE__ */ jsxs35("tr", { children: [
2220
+ /* @__PURE__ */ jsx50("th", { className: "px-4 py-3 text-left", children: featureHeader }),
2221
+ /* @__PURE__ */ jsx50("th", { className: "px-4 py-3 text-left", children: includedHeader }),
2222
+ /* @__PURE__ */ jsx50("th", { className: "px-4 py-3 text-left", children: alternativeHeader })
2223
+ ] }) }),
2224
+ /* @__PURE__ */ jsx50("tbody", { children: rows.map((row, index) => /* @__PURE__ */ jsxs35("tr", { className: "border-t border-[var(--tapiz-border-subtle)]", children: [
2225
+ /* @__PURE__ */ jsx50("td", { className: "px-4 py-3 font-medium text-[var(--tapiz-text-primary)]", children: row.feature }),
2226
+ /* @__PURE__ */ jsx50("td", { className: "px-4 py-3 text-[var(--tapiz-text-secondary)]", children: row.included }),
2227
+ /* @__PURE__ */ jsx50("td", { className: "px-4 py-3 text-[var(--tapiz-text-muted)]", children: row.alternative })
2228
+ ] }, index)) })
2229
+ ] }) });
2230
+ }
2231
+
2232
+ // src/components/layout/AppShell.tsx
2233
+ import { jsx as jsx51, jsxs as jsxs36 } from "react/jsx-runtime";
2234
+ var variantClasses4 = {
2235
+ default: "bg-[var(--tapiz-bg-page)]",
2236
+ grid: "bg-[var(--tapiz-bg-page)] tapiz-grid-bg",
2237
+ noise: "bg-[var(--tapiz-bg-page)] tapiz-noise-bg"
2238
+ };
2239
+ function AppShell({ sidebar, topbar, children, aside, className = "", contentClassName = "", variant = "default" }) {
2240
+ return /* @__PURE__ */ jsxs36("div", { className: `min-h-screen text-[var(--tapiz-text-primary)] ${variantClasses4[variant]} ${className}`, children: [
2241
+ topbar,
2242
+ /* @__PURE__ */ jsxs36("div", { className: "mx-auto flex w-full max-w-[1600px]", children: [
2243
+ 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,
2244
+ /* @__PURE__ */ jsx51("main", { className: `min-w-0 flex-1 px-[var(--tapiz-space-page-x)] py-6 ${contentClassName}`, children }),
2245
+ 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
2246
+ ] })
2247
+ ] });
2248
+ }
2249
+
2250
+ // src/components/layout/SplitPane.tsx
2251
+ import { jsx as jsx52, jsxs as jsxs37 } from "react/jsx-runtime";
2252
+ var ratios = {
2253
+ "50/50": "lg:grid-cols-2",
2254
+ "60/40": "lg:grid-cols-[minmax(0,3fr)_minmax(320px,2fr)]",
2255
+ "70/30": "lg:grid-cols-[minmax(0,7fr)_minmax(280px,3fr)]"
2256
+ };
2257
+ function SplitPane({ primary, secondary, ratio = "60/40", reverseOnMobile = false, className = "" }) {
2258
+ return /* @__PURE__ */ jsxs37("div", { className: `grid gap-5 ${ratios[ratio]} ${className}`, children: [
2259
+ /* @__PURE__ */ jsx52("div", { className: reverseOnMobile ? "order-2 lg:order-1" : "", children: primary }),
2260
+ /* @__PURE__ */ jsx52("div", { className: reverseOnMobile ? "order-1 lg:order-2" : "", children: secondary })
2261
+ ] });
2262
+ }
2263
+
2264
+ // src/components/layout/Stack.tsx
2265
+ import { jsx as jsx53 } from "react/jsx-runtime";
2266
+ var gapClasses = { xs: "gap-1", sm: "gap-2", md: "gap-4", lg: "gap-6", xl: "gap-8" };
2267
+ var alignClasses = { start: "items-start", center: "items-center", end: "items-end", stretch: "items-stretch" };
2268
+ var justifyClasses = { start: "justify-start", center: "justify-center", between: "justify-between", end: "justify-end" };
2269
+ function Stack({ children, gap = "md", direction = "vertical", align = "stretch", justify = "start", wrap = false, className = "" }) {
2270
+ return /* @__PURE__ */ jsx53("div", { className: `flex ${direction === "vertical" ? "flex-col" : "flex-row"} ${gapClasses[gap]} ${alignClasses[align]} ${justifyClasses[justify]} ${wrap ? "flex-wrap" : ""} ${className}`, children });
2271
+ }
2272
+
2273
+ // src/components/layout/Cluster.tsx
2274
+ import { jsx as jsx54 } from "react/jsx-runtime";
2275
+ var gapClasses2 = { xs: "gap-1", sm: "gap-2", md: "gap-3", lg: "gap-5" };
2276
+ var alignClasses2 = { start: "items-start", center: "items-center", end: "items-end" };
2277
+ var justifyClasses2 = { start: "justify-start", center: "justify-center", between: "justify-between", end: "justify-end" };
2278
+ function Cluster({ children, gap = "sm", align = "center", justify = "start", className = "" }) {
2279
+ return /* @__PURE__ */ jsx54("div", { className: `flex flex-wrap ${gapClasses2[gap]} ${alignClasses2[align]} ${justifyClasses2[justify]} ${className}`, children });
2280
+ }
2281
+
2282
+ // src/components/navigation/Breadcrumbs.tsx
2283
+ import { jsx as jsx55, jsxs as jsxs38 } from "react/jsx-runtime";
2284
+ function Breadcrumbs({ items, separator = "/", className = "" }) {
2285
+ 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: [
2286
+ index > 0 ? /* @__PURE__ */ jsx55("span", { "aria-hidden": "true", className: "text-[var(--tapiz-text-disabled)]", children: separator }) : null,
2287
+ 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 })
2288
+ ] }, index)) }) });
2289
+ }
2290
+
2291
+ // src/components/navigation/SidebarNav.tsx
2292
+ import { Fragment as Fragment2, jsx as jsx56, jsxs as jsxs39 } from "react/jsx-runtime";
2293
+ function SidebarNav({ groups, header, footer, className = "" }) {
2294
+ return /* @__PURE__ */ jsxs39("div", { className: `flex h-full min-h-screen flex-col bg-[var(--tapiz-bg-surface)] ${className}`, children: [
2295
+ header ? /* @__PURE__ */ jsx56("div", { className: "border-b border-[var(--tapiz-border-subtle)] p-4", children: header }) : null,
2296
+ /* @__PURE__ */ jsx56("nav", { className: "flex-1 space-y-6 p-3", children: groups.map((group, groupIndex) => /* @__PURE__ */ jsxs39("div", { children: [
2297
+ 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,
2298
+ /* @__PURE__ */ jsx56("div", { className: "space-y-1", children: group.items.map((item, itemIndex) => /* @__PURE__ */ jsx56(SidebarNavLink, { item }, itemIndex)) })
2299
+ ] }, groupIndex)) }),
2300
+ footer ? /* @__PURE__ */ jsx56("div", { className: "border-t border-[var(--tapiz-border-subtle)] p-4", children: footer }) : null
2301
+ ] });
2302
+ }
2303
+ function SidebarNavLink({ item }) {
2304
+ const className = [
2305
+ "flex w-full items-center gap-3 border px-3 py-2 text-left text-sm font-medium",
2306
+ 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)]",
2307
+ item.disabled ? "pointer-events-none opacity-40" : ""
2308
+ ].filter(Boolean).join(" ");
2309
+ const content = /* @__PURE__ */ jsxs39(Fragment2, { children: [
2310
+ item.icon ? /* @__PURE__ */ jsx56("span", { className: "grid size-5 place-items-center text-[var(--tapiz-text-muted)]", children: item.icon }) : null,
2311
+ /* @__PURE__ */ jsx56("span", { className: "min-w-0 flex-1 truncate", children: item.label }),
2312
+ item.badge ? /* @__PURE__ */ jsx56("span", { children: item.badge }) : null
2313
+ ] });
2314
+ 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 });
2315
+ }
2316
+
2317
+ // src/components/navigation/TopNav.tsx
2318
+ import { jsx as jsx57, jsxs as jsxs40 } from "react/jsx-runtime";
2319
+ function TopNav({ brand, links = [], actions, className = "", sticky = true }) {
2320
+ 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: [
2321
+ brand ? /* @__PURE__ */ jsx57("div", { className: "shrink-0", children: brand }) : null,
2322
+ /* @__PURE__ */ jsx57("nav", { className: "hidden items-center gap-1 md:flex", children: links.map((link, index) => {
2323
+ 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)]"}`;
2324
+ 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);
2325
+ }) }),
2326
+ actions ? /* @__PURE__ */ jsx57("div", { className: "ml-auto flex items-center gap-2", children: actions }) : null
2327
+ ] }) });
2328
+ }
2329
+
2330
+ // src/components/disclosure/Tabs.tsx
2331
+ import { jsx as jsx58, jsxs as jsxs41 } from "react/jsx-runtime";
2332
+ var variants = {
2333
+ line: "border-b border-[var(--tapiz-border-subtle)]",
2334
+ boxed: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-1",
2335
+ brutal: "border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] p-1 shadow-[var(--tapiz-shadow-brutal)]"
2336
+ };
2337
+ function Tabs({ items, activeId, onChange, className = "", variant = "line" }) {
2338
+ const active = items.find((item) => item.id === activeId) ?? items[0];
2339
+ return /* @__PURE__ */ jsxs41("div", { className, children: [
2340
+ /* @__PURE__ */ jsx58("div", { role: "tablist", className: `flex flex-wrap gap-1 ${variants[variant]}`, children: items.map((item) => {
2341
+ const selected = item.id === active?.id;
2342
+ return /* @__PURE__ */ jsxs41(
2343
+ "button",
2344
+ {
2345
+ type: "button",
2346
+ role: "tab",
2347
+ "aria-selected": selected,
2348
+ disabled: item.disabled,
2349
+ onClick: () => onChange?.(item.id),
2350
+ 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)]"}`,
2351
+ children: [
2352
+ item.label,
2353
+ item.badge
2354
+ ]
2355
+ },
2356
+ item.id
2357
+ );
2358
+ }) }),
2359
+ /* @__PURE__ */ jsx58("div", { role: "tabpanel", className: "pt-4", children: active?.content })
2360
+ ] });
2361
+ }
2362
+
2363
+ // src/components/disclosure/Accordion.tsx
2364
+ import { jsx as jsx59, jsxs as jsxs42 } from "react/jsx-runtime";
2365
+ function Accordion({ items, openIds = [], onToggle, className = "" }) {
2366
+ 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) => {
2367
+ const open = openIds.includes(item.id);
2368
+ return /* @__PURE__ */ jsxs42("section", { children: [
2369
+ /* @__PURE__ */ jsxs42(
2370
+ "button",
2371
+ {
2372
+ type: "button",
2373
+ disabled: item.disabled,
2374
+ "aria-expanded": open,
2375
+ onClick: () => onToggle?.(item.id),
2376
+ className: "flex w-full items-center justify-between gap-4 px-4 py-3 text-left disabled:opacity-40",
2377
+ children: [
2378
+ /* @__PURE__ */ jsx59("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
2379
+ /* @__PURE__ */ jsxs42("span", { className: "flex items-center gap-3 text-[var(--tapiz-text-muted)]", children: [
2380
+ item.meta,
2381
+ /* @__PURE__ */ jsx59("span", { "aria-hidden": "true", className: "font-mono text-lg", children: open ? "\u2212" : "+" })
2382
+ ] })
2383
+ ]
2384
+ }
2385
+ ),
2386
+ 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
2387
+ ] }, item.id);
2388
+ }) });
2389
+ }
2390
+
2391
+ // src/components/disclosure/Stepper.tsx
2392
+ import { jsx as jsx60, jsxs as jsxs43 } from "react/jsx-runtime";
2393
+ var tone = {
2394
+ complete: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
2395
+ current: "border-[var(--tapiz-accent)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-accent)]",
2396
+ upcoming: "border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-muted)]",
2397
+ error: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]"
2398
+ };
2399
+ function Stepper({ steps, orientation = "horizontal", className = "" }) {
2400
+ 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) => {
2401
+ const status = step.status ?? "upcoming";
2402
+ return /* @__PURE__ */ jsxs43("li", { className: "flex gap-3", children: [
2403
+ /* @__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 }),
2404
+ /* @__PURE__ */ jsxs43("span", { className: "min-w-0", children: [
2405
+ /* @__PURE__ */ jsx60("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: step.label }),
2406
+ step.description ? /* @__PURE__ */ jsx60("span", { className: "mt-1 block text-xs text-[var(--tapiz-text-muted)]", children: step.description }) : null
2407
+ ] })
2408
+ ] }, step.id);
2409
+ }) });
2410
+ }
2411
+
2412
+ // src/components/overlays/Drawer.tsx
2413
+ import { jsx as jsx61, jsxs as jsxs44 } from "react/jsx-runtime";
2414
+ function Drawer({ open, onClose, title, description, children, footer, side = "right", className = "" }) {
2415
+ if (!open) return null;
2416
+ return /* @__PURE__ */ jsxs44("div", { className: "fixed inset-0 z-50", children: [
2417
+ /* @__PURE__ */ jsx61("button", { type: "button", "aria-label": "Close drawer", className: "absolute inset-0 bg-[var(--tapiz-bg-overlay)]", onClick: onClose }),
2418
+ /* @__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: [
2419
+ /* @__PURE__ */ jsxs44("header", { className: "flex items-start justify-between gap-4 border-b border-[var(--tapiz-border-subtle)] p-5", children: [
2420
+ /* @__PURE__ */ jsxs44("div", { children: [
2421
+ title ? /* @__PURE__ */ jsx61("h2", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
2422
+ description ? /* @__PURE__ */ jsx61("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null
2423
+ ] }),
2424
+ /* @__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" })
2425
+ ] }),
2426
+ /* @__PURE__ */ jsx61("div", { className: "max-h-[calc(100vh-9rem)] overflow-auto p-5", children }),
2427
+ footer ? /* @__PURE__ */ jsx61("footer", { className: "border-t border-[var(--tapiz-border-subtle)] p-4", children: footer }) : null
2428
+ ] })
2429
+ ] });
2430
+ }
2431
+
2432
+ // src/components/overlays/Popover.tsx
2433
+ import { jsx as jsx62, jsxs as jsxs45 } from "react/jsx-runtime";
2434
+ function Popover({ trigger, children, open = false, align = "start", className = "" }) {
2435
+ return /* @__PURE__ */ jsxs45("div", { className: `relative inline-block ${className}`, children: [
2436
+ trigger,
2437
+ 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
2438
+ ] });
2439
+ }
2440
+
2441
+ // src/components/overlays/CommandMenu.tsx
2442
+ import { jsx as jsx63, jsxs as jsxs46 } from "react/jsx-runtime";
2443
+ function CommandMenu({ open, onClose, query = "", onQueryChange, groups, placeholder = "Search commands\u2026", empty = "No commands found." }) {
2444
+ if (!open) return null;
2445
+ const hasItems = groups.some((group) => group.items.length > 0);
2446
+ 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: [
2447
+ /* @__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 }) }),
2448
+ /* @__PURE__ */ jsxs46("div", { className: "max-h-[50vh] overflow-auto p-2", children: [
2449
+ !hasItems ? /* @__PURE__ */ jsx63("div", { className: "p-6 text-center text-sm text-[var(--tapiz-text-muted)]", children: empty }) : null,
2450
+ groups.map((group, groupIndex) => /* @__PURE__ */ jsxs46("div", { className: "py-2", children: [
2451
+ 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,
2452
+ 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: [
2453
+ 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,
2454
+ /* @__PURE__ */ jsxs46("span", { className: "min-w-0 flex-1", children: [
2455
+ /* @__PURE__ */ jsx63("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.label }),
2456
+ item.description ? /* @__PURE__ */ jsx63("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: item.description }) : null
2457
+ ] }),
2458
+ item.shortcut ? /* @__PURE__ */ jsx63("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.shortcut }) : null
2459
+ ] }, item.id))
2460
+ ] }, groupIndex))
2461
+ ] })
2462
+ ] }) });
2463
+ }
2464
+
2465
+ // src/components/forms/FormField.tsx
2466
+ import { jsx as jsx64, jsxs as jsxs47 } from "react/jsx-runtime";
2467
+ function FormField({ label, hint, error, required, htmlFor, children, className = "" }) {
2468
+ return /* @__PURE__ */ jsxs47("div", { className: `space-y-1.5 ${className}`, children: [
2469
+ label ? /* @__PURE__ */ jsxs47(FieldLabel, { htmlFor, children: [
2470
+ label,
2471
+ required ? " *" : ""
2472
+ ] }) : null,
2473
+ children,
2474
+ error ? /* @__PURE__ */ jsx64(FormError, { message: String(error) }) : hint ? /* @__PURE__ */ jsx64(FieldHint, { children: hint }) : null
2475
+ ] });
2476
+ }
2477
+
2478
+ // src/components/forms/Switch.tsx
2479
+ import { jsx as jsx65, jsxs as jsxs48 } from "react/jsx-runtime";
2480
+ function Switch({ checked = false, onChange, disabled, label, description, className = "" }) {
2481
+ return /* @__PURE__ */ jsxs48("label", { className: `flex cursor-pointer items-start gap-3 ${disabled ? "cursor-not-allowed opacity-50" : ""} ${className}`, children: [
2482
+ /* @__PURE__ */ jsx65(
2483
+ "button",
2484
+ {
2485
+ type: "button",
2486
+ role: "switch",
2487
+ "aria-checked": checked,
2488
+ disabled,
2489
+ onClick: () => onChange?.(!checked),
2490
+ 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)]"}`,
2491
+ 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"}` })
2492
+ }
2493
+ ),
2494
+ label || description ? /* @__PURE__ */ jsxs48("span", { children: [
2495
+ label ? /* @__PURE__ */ jsx65("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: label }) : null,
2496
+ description ? /* @__PURE__ */ jsx65("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: description }) : null
2497
+ ] }) : null
2498
+ ] });
2499
+ }
2500
+
2501
+ // src/components/forms/ToggleGroup.tsx
2502
+ import { jsx as jsx66 } from "react/jsx-runtime";
2503
+ function ToggleGroup({ options, value, onChange, className = "", fullWidth = false }) {
2504
+ 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) => {
2505
+ const selected = option.value === value;
2506
+ return /* @__PURE__ */ jsx66(
2507
+ "button",
2508
+ {
2509
+ type: "button",
2510
+ disabled: option.disabled,
2511
+ onClick: () => onChange?.(option.value),
2512
+ 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)]"}`,
2513
+ children: option.label
2514
+ },
2515
+ option.value
2516
+ );
2517
+ }) });
2518
+ }
2519
+
2520
+ // src/components/forms/InputGroup.tsx
2521
+ import { jsx as jsx67, jsxs as jsxs49 } from "react/jsx-runtime";
2522
+ function InputGroup({ prefix, suffix, children, className = "" }) {
2523
+ 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: [
2524
+ 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,
2525
+ /* @__PURE__ */ jsx67("div", { className: "min-w-0 flex-1 [&_input]:border-0 [&_input]:shadow-none [&_input]:focus:shadow-none", children }),
2526
+ 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
2527
+ ] });
2528
+ }
2529
+
2530
+ // src/components/feedback/Alert.tsx
2531
+ import { jsx as jsx68, jsxs as jsxs50 } from "react/jsx-runtime";
2532
+ var toneClasses = {
2533
+ info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)] text-[var(--tapiz-info)]",
2534
+ success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
2535
+ warning: "border-[var(--tapiz-warning)] bg-[var(--tapiz-warning-soft)] text-[var(--tapiz-warning)]",
2536
+ danger: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]",
2537
+ neutral: "border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-secondary)]"
2538
+ };
2539
+ function Alert2({ tone: tone2 = "info", title, children, icon, actions, className = "" }) {
2540
+ return /* @__PURE__ */ jsxs50("div", { className: `flex gap-3 border p-4 ${toneClasses[tone2]} ${className}`, children: [
2541
+ icon ? /* @__PURE__ */ jsx68("div", { className: "mt-0.5 shrink-0", children: icon }) : null,
2542
+ /* @__PURE__ */ jsxs50("div", { className: "min-w-0 flex-1", children: [
2543
+ title ? /* @__PURE__ */ jsx68("div", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
2544
+ children ? /* @__PURE__ */ jsx68("div", { className: "mt-1 text-sm text-[var(--tapiz-text-secondary)]", children }) : null
2545
+ ] }),
2546
+ actions ? /* @__PURE__ */ jsx68("div", { className: "shrink-0", children: actions }) : null
2547
+ ] });
2548
+ }
2549
+
2550
+ // src/components/feedback/Progress.tsx
2551
+ import { jsx as jsx69, jsxs as jsxs51 } from "react/jsx-runtime";
2552
+ var tones = {
2553
+ accent: "bg-[var(--tapiz-accent)]",
2554
+ success: "bg-[var(--tapiz-success)]",
2555
+ warning: "bg-[var(--tapiz-warning)]",
2556
+ danger: "bg-[var(--tapiz-danger)]"
2557
+ };
2558
+ function Progress({ value, max = 100, label, showValue = false, tone: tone2 = "accent", className = "" }) {
2559
+ const percentage = Math.max(0, Math.min(100, value / max * 100));
2560
+ return /* @__PURE__ */ jsxs51("div", { className, children: [
2561
+ label || showValue ? /* @__PURE__ */ jsxs51("div", { className: "mb-1 flex items-center justify-between gap-3 text-xs text-[var(--tapiz-text-muted)]", children: [
2562
+ label ? /* @__PURE__ */ jsx69("span", { children: label }) : /* @__PURE__ */ jsx69("span", {}),
2563
+ showValue ? /* @__PURE__ */ jsxs51("span", { className: "font-mono", children: [
2564
+ Math.round(percentage),
2565
+ "%"
2566
+ ] }) : null
2567
+ ] }) : null,
2568
+ /* @__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}%` } }) })
2569
+ ] });
2570
+ }
2571
+
2572
+ // src/components/shared/Avatar.tsx
2573
+ import { jsx as jsx70 } from "react/jsx-runtime";
2574
+ var sizes = { xs: "size-6 text-[10px]", sm: "size-8 text-xs", md: "size-10 text-sm", lg: "size-14 text-base" };
2575
+ function Avatar({ src, name = "?", size = "md", className = "" }) {
2576
+ const initials = name.split(" ").filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase()).join("") || "?";
2577
+ 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 });
2578
+ }
2579
+
2580
+ // src/components/shared/Kbd.tsx
2581
+ import { jsx as jsx71 } from "react/jsx-runtime";
2582
+ function Kbd({ children, className = "" }) {
2583
+ 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 });
2584
+ }
2585
+
2586
+ // src/components/shared/Timeline.tsx
2587
+ import { jsx as jsx72, jsxs as jsxs52 } from "react/jsx-runtime";
2588
+ var tones2 = {
2589
+ neutral: "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-muted)]",
2590
+ info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)] text-[var(--tapiz-info)]",
2591
+ success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
2592
+ warning: "border-[var(--tapiz-warning)] bg-[var(--tapiz-warning-soft)] text-[var(--tapiz-warning)]",
2593
+ danger: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]"
2594
+ };
2595
+ function Timeline({ items, className = "" }) {
2596
+ 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: [
2597
+ /* @__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" }),
2598
+ /* @__PURE__ */ jsxs52("span", { className: "min-w-0 flex-1 pb-2", children: [
2599
+ /* @__PURE__ */ jsxs52("span", { className: "flex flex-wrap items-baseline justify-between gap-2", children: [
2600
+ /* @__PURE__ */ jsx72("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
2601
+ item.time ? /* @__PURE__ */ jsx72("span", { className: "font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: item.time }) : null
2602
+ ] }),
2603
+ item.description ? /* @__PURE__ */ jsx72("span", { className: "mt-1 block text-sm text-[var(--tapiz-text-secondary)]", children: item.description }) : null
2604
+ ] })
2605
+ ] }, item.id)) });
2606
+ }
2607
+
2608
+ // src/components/shared/KeyValueList.tsx
2609
+ import { jsx as jsx73, jsxs as jsxs53 } from "react/jsx-runtime";
2610
+ function KeyValueList({ items, className = "", density = "normal" }) {
2611
+ 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: [
2612
+ /* @__PURE__ */ jsx73("dt", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: item.keyLabel }),
2613
+ /* @__PURE__ */ jsxs53("dd", { children: [
2614
+ /* @__PURE__ */ jsx73("div", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.value }),
2615
+ item.description ? /* @__PURE__ */ jsx73("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.description }) : null
2616
+ ] })
2617
+ ] }, index)) });
2618
+ }
2619
+
2620
+ // src/components/shared/CodeBlock.tsx
2621
+ import { jsx as jsx74, jsxs as jsxs54 } from "react/jsx-runtime";
2622
+ function CodeBlock({ children, language, title, actions, className = "" }) {
2623
+ return /* @__PURE__ */ jsxs54("figure", { className: `overflow-hidden border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
2624
+ 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: [
2625
+ /* @__PURE__ */ jsx74("span", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: title ?? language }),
2626
+ actions
2627
+ ] }) : null,
2628
+ /* @__PURE__ */ jsx74("pre", { className: "overflow-auto p-4 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children: /* @__PURE__ */ jsx74("code", { children }) })
2629
+ ] });
2630
+ }
2631
+
2632
+ // src/components/marketing/LogoCloud.tsx
2633
+ import { jsx as jsx75, jsxs as jsxs55 } from "react/jsx-runtime";
2634
+ function LogoCloud({ title, items, className = "" }) {
2635
+ 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: [
2636
+ 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,
2637
+ /* @__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)) })
2638
+ ] }) });
2639
+ }
2640
+
2641
+ // src/components/marketing/TestimonialCard.tsx
2642
+ import { jsx as jsx76, jsxs as jsxs56 } from "react/jsx-runtime";
2643
+ function TestimonialCard({ quote, author, role, avatarSrc, className = "", variant = "surface" }) {
2644
+ 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: [
2645
+ /* @__PURE__ */ jsxs56("blockquote", { className: "text-base leading-7 text-[var(--tapiz-text-secondary)]", children: [
2646
+ "\u201C",
2647
+ quote,
2648
+ "\u201D"
2649
+ ] }),
2650
+ /* @__PURE__ */ jsxs56("figcaption", { className: "mt-5 flex items-center gap-3", children: [
2651
+ /* @__PURE__ */ jsx76(Avatar, { name: author, src: avatarSrc, size: "sm" }),
2652
+ /* @__PURE__ */ jsxs56("span", { children: [
2653
+ /* @__PURE__ */ jsx76("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: author }),
2654
+ role ? /* @__PURE__ */ jsx76("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: role }) : null
2655
+ ] })
2656
+ ] })
2657
+ ] });
2658
+ }
2659
+
2660
+ // src/components/marketing/PricingCard.tsx
2661
+ import { jsx as jsx77, jsxs as jsxs57 } from "react/jsx-runtime";
2662
+ function PricingCard({ name, price, description, features = [], cta, highlighted = false, className = "" }) {
2663
+ 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: [
2664
+ /* @__PURE__ */ jsxs57("div", { className: "flex-1", children: [
2665
+ /* @__PURE__ */ jsx77("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: name }),
2666
+ description ? /* @__PURE__ */ jsx77("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null,
2667
+ /* @__PURE__ */ jsx77("div", { className: "mt-6 text-4xl font-semibold tracking-tight text-[var(--tapiz-text-primary)]", children: price }),
2668
+ /* @__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: [
2669
+ /* @__PURE__ */ jsx77("span", { className: "text-[var(--tapiz-success)]", children: "\u2713" }),
2670
+ /* @__PURE__ */ jsx77("span", { children: feature })
2671
+ ] }, index)) })
2672
+ ] }),
2673
+ /* @__PURE__ */ jsx77("div", { className: "mt-6", children: cta ?? /* @__PURE__ */ jsx77(Button, { variant: highlighted ? "primary" : "secondary", fullWidth: true, children: "Get started" }) })
2674
+ ] });
2675
+ }
2676
+
2677
+ // src/components/marketing/StatsBand.tsx
2678
+ import { jsx as jsx78, jsxs as jsxs58 } from "react/jsx-runtime";
2679
+ function StatsBand({ items, className = "" }) {
2680
+ 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: [
2681
+ /* @__PURE__ */ jsx78("div", { className: "text-3xl font-semibold tracking-tight", children: item.value }),
2682
+ /* @__PURE__ */ jsx78("div", { className: "mt-2 font-mono text-[10px] font-bold uppercase tracking-[0.18em] opacity-70", children: item.label }),
2683
+ item.description ? /* @__PURE__ */ jsx78("div", { className: "mt-3 text-sm opacity-70", children: item.description }) : null
2684
+ ] }, index)) }) });
2685
+ }
2686
+
2687
+ // src/presets/framework.ts
2688
+ var tapizFrameworkPresets = {
2689
+ enterprise: {
2690
+ shell: "tapiz-enterprise-shell",
2691
+ card: "tapiz-enterprise-card",
2692
+ button: "primary",
2693
+ density: "comfortable"
2694
+ },
2695
+ brutal: {
2696
+ shell: "tapiz-enterprise-shell tapiz-grid-bg",
2697
+ card: "tapiz-brutal-card",
2698
+ button: "brutal",
2699
+ density: "comfortable"
2700
+ },
2701
+ dashboard: {
2702
+ shell: "tapiz-enterprise-shell",
2703
+ card: "stat-card",
2704
+ button: "secondary",
2705
+ density: "compact"
2706
+ },
2707
+ marketing: {
2708
+ shell: "tapiz-enterprise-shell tapiz-noise-bg",
2709
+ card: "tapiz-enterprise-card",
2710
+ button: "primary",
2711
+ density: "spacious"
2712
+ },
2713
+ compact: {
2714
+ shell: "tapiz-enterprise-shell",
2715
+ card: "card",
2716
+ button: "secondary",
2717
+ density: "compact"
2718
+ }
2719
+ };
2720
+
2721
+ // src/components/layout/Container.tsx
2722
+ import { jsx as jsx79 } from "react/jsx-runtime";
2723
+ var sizeClasses2 = {
2724
+ sm: "max-w-3xl",
2725
+ md: "max-w-5xl",
2726
+ lg: "max-w-7xl",
2727
+ xl: "max-w-[90rem]",
2728
+ full: "max-w-none"
2729
+ };
2730
+ function Container({ children, size = "lg", padded = true, className = "", style }) {
2731
+ return /* @__PURE__ */ jsx79(
2732
+ "div",
2733
+ {
2734
+ className: ["mx-auto w-full", sizeClasses2[size], padded ? "px-[var(--tapiz-space-page-x)]" : "", className].filter(Boolean).join(" "),
2735
+ style,
2736
+ children
2737
+ }
2738
+ );
2739
+ }
2740
+
2741
+ // src/components/layout/Surface.tsx
2742
+ import { jsx as jsx80 } from "react/jsx-runtime";
2743
+ var variantClasses5 = {
2744
+ canvas: "bg-[var(--tapiz-bg-page)] text-[var(--tapiz-text-primary)]",
2745
+ surface: "bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-primary)]",
2746
+ raised: "bg-[var(--tapiz-bg-surface-raised)] text-[var(--tapiz-text-primary)] shadow-[var(--tapiz-shadow-md)]",
2747
+ muted: "bg-[var(--tapiz-bg-surface-muted)] text-[var(--tapiz-text-primary)]",
2748
+ brutal: "bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-primary)] border-2 border-[var(--tapiz-border-strong)] shadow-[var(--tapiz-shadow-brutal)]",
2749
+ inverse: "bg-[var(--tapiz-bg-surface-inverse)] text-[var(--tapiz-text-inverse)]"
2750
+ };
2751
+ var paddingClasses2 = {
2752
+ none: "p-0",
2753
+ sm: "p-3",
2754
+ md: "p-5",
2755
+ lg: "p-6",
2756
+ xl: "p-8"
2757
+ };
2758
+ function Surface({ children, variant = "surface", padding = "md", bordered = true, className = "", style }) {
2759
+ return /* @__PURE__ */ jsx80(
2760
+ "section",
2761
+ {
2762
+ className: [variantClasses5[variant], paddingClasses2[padding], bordered && variant !== "brutal" ? "border border-[var(--tapiz-border-subtle)]" : "", className].filter(Boolean).join(" "),
2763
+ style,
2764
+ children
2765
+ }
2766
+ );
2767
+ }
2768
+
2769
+ // src/components/layout/Divider.tsx
2770
+ import { jsx as jsx81, jsxs as jsxs59 } from "react/jsx-runtime";
2771
+ function Divider({ orientation = "horizontal", label, className = "" }) {
2772
+ if (orientation === "vertical") {
2773
+ return /* @__PURE__ */ jsx81("div", { className: `mx-2 min-h-6 w-px bg-[var(--tapiz-border-subtle)] ${className}`, "aria-hidden": "true" });
2774
+ }
2775
+ if (label) {
2776
+ return /* @__PURE__ */ jsxs59("div", { className: `flex items-center gap-3 ${className}`, children: [
2777
+ /* @__PURE__ */ jsx81("div", { className: "h-px flex-1 bg-[var(--tapiz-border-subtle)]" }),
2778
+ /* @__PURE__ */ jsx81("span", { className: "font-mono text-[10px] uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: label }),
2779
+ /* @__PURE__ */ jsx81("div", { className: "h-px flex-1 bg-[var(--tapiz-border-subtle)]" })
2780
+ ] });
2781
+ }
2782
+ return /* @__PURE__ */ jsx81("hr", { className: `border-[var(--tapiz-border-subtle)] ${className}` });
2783
+ }
2784
+
2785
+ // src/components/layout/ResponsiveGrid.tsx
2786
+ import { jsx as jsx82 } from "react/jsx-runtime";
2787
+ var gapClasses3 = {
2788
+ sm: "gap-3",
2789
+ md: "gap-4",
2790
+ lg: "gap-6",
2791
+ xl: "gap-8"
2792
+ };
2793
+ function ResponsiveGrid({ children, min = "18rem", gap = "md", className = "", style }) {
2794
+ return /* @__PURE__ */ jsx82(
2795
+ "div",
2796
+ {
2797
+ className: `grid ${gapClasses3[gap]} ${className}`,
2798
+ style: { gridTemplateColumns: `repeat(auto-fit, minmax(${min}, 1fr))`, ...style },
2799
+ children
2800
+ }
2801
+ );
2802
+ }
2803
+
2804
+ // src/components/data-display/Sparkline.tsx
2805
+ import { jsx as jsx83, jsxs as jsxs60 } from "react/jsx-runtime";
2806
+ function Sparkline({ values, width = 160, height = 48, label = "Trend", className = "", style }) {
2807
+ const safeValues = values.length ? values : [0];
2808
+ const min = Math.min(...safeValues);
2809
+ const max = Math.max(...safeValues);
2810
+ const range = max - min || 1;
2811
+ const step = safeValues.length > 1 ? width / (safeValues.length - 1) : width;
2812
+ const points = safeValues.map((value, index) => {
2813
+ const x = index * step;
2814
+ const y = height - (value - min) / range * (height - 6) - 3;
2815
+ return `${x},${y}`;
2816
+ }).join(" ");
2817
+ return /* @__PURE__ */ jsxs60("svg", { className, style, width, height, viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": label, children: [
2818
+ /* @__PURE__ */ jsx83("polyline", { points, fill: "none", stroke: "var(--tapiz-accent)", strokeWidth: "2", strokeLinecap: "square", strokeLinejoin: "miter" }),
2819
+ /* @__PURE__ */ jsx83("line", { x1: "0", x2: width, y1: height - 1, y2: height - 1, stroke: "var(--tapiz-border-subtle)", strokeWidth: "1" })
2820
+ ] });
2821
+ }
2822
+
2823
+ // src/components/data-display/BarList.tsx
2824
+ import { jsx as jsx84, jsxs as jsxs61 } from "react/jsx-runtime";
2825
+ function BarList({ items, max, valueFormatter = (value) => value, className = "" }) {
2826
+ const computedMax = max ?? Math.max(1, ...items.map((item) => item.value));
2827
+ return /* @__PURE__ */ jsx84("div", { className: `space-y-3 ${className}`, children: items.map((item, index) => {
2828
+ const percent = Math.max(0, Math.min(100, item.value / computedMax * 100));
2829
+ return /* @__PURE__ */ jsxs61("div", { children: [
2830
+ /* @__PURE__ */ jsxs61("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
2831
+ /* @__PURE__ */ jsx84("span", { className: "font-medium text-[var(--tapiz-text-secondary)]", children: item.label }),
2832
+ /* @__PURE__ */ jsx84("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: valueFormatter(item.value) })
2833
+ ] }),
2834
+ /* @__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}%` } }) }),
2835
+ item.detail ? /* @__PURE__ */ jsx84("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.detail }) : null
2836
+ ] }, index);
2837
+ }) });
2838
+ }
2839
+
2840
+ // src/components/data-display/DonutMetric.tsx
2841
+ import { jsx as jsx85, jsxs as jsxs62 } from "react/jsx-runtime";
2842
+ function DonutMetric({ value, max = 100, label, caption, size = 112, className = "" }) {
2843
+ const radius = 42;
2844
+ const circumference = 2 * Math.PI * radius;
2845
+ const ratio = Math.max(0, Math.min(1, value / max));
2846
+ const offset = circumference * (1 - ratio);
2847
+ return /* @__PURE__ */ jsxs62("div", { className: `inline-flex items-center gap-4 ${className}`, children: [
2848
+ /* @__PURE__ */ jsxs62("svg", { width: size, height: size, viewBox: "0 0 112 112", role: "img", "aria-label": `${Math.round(ratio * 100)}%`, children: [
2849
+ /* @__PURE__ */ jsx85("circle", { cx: "56", cy: "56", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
2850
+ /* @__PURE__ */ jsx85(
2851
+ "circle",
2852
+ {
2853
+ cx: "56",
2854
+ cy: "56",
2855
+ r: radius,
2856
+ fill: "none",
2857
+ stroke: "var(--tapiz-accent)",
2858
+ strokeWidth: "10",
2859
+ strokeDasharray: circumference,
2860
+ strokeDashoffset: offset,
2861
+ strokeLinecap: "square",
2862
+ transform: "rotate(-90 56 56)"
2863
+ }
2864
+ ),
2865
+ /* @__PURE__ */ jsxs62("text", { x: "56", y: "61", textAnchor: "middle", className: "fill-[var(--tapiz-text-primary)] font-mono text-lg font-bold", children: [
2866
+ Math.round(ratio * 100),
2867
+ "%"
2868
+ ] })
2869
+ ] }),
2870
+ label || caption ? /* @__PURE__ */ jsxs62("div", { children: [
2871
+ label ? /* @__PURE__ */ jsx85("div", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: label }) : null,
2872
+ caption ? /* @__PURE__ */ jsx85("div", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: caption }) : null
2873
+ ] }) : null
2874
+ ] });
2875
+ }
2876
+
2877
+ // src/components/data-display/FilterChip.tsx
2878
+ import { jsx as jsx86, jsxs as jsxs63 } from "react/jsx-runtime";
2879
+ function FilterChip({ children, active = false, onRemove, className = "" }) {
2880
+ return /* @__PURE__ */ jsxs63(
2881
+ "span",
2882
+ {
2883
+ className: [
2884
+ "inline-flex items-center gap-2 border px-2.5 py-1 font-mono text-[11px] uppercase tracking-[0.12em]",
2885
+ 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)]",
2886
+ className
2887
+ ].join(" "),
2888
+ children: [
2889
+ children,
2890
+ 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
2891
+ ]
2892
+ }
2893
+ );
2894
+ }
2895
+
2896
+ // src/components/data-display/DataToolbar.tsx
2897
+ import { jsx as jsx87, jsxs as jsxs64 } from "react/jsx-runtime";
2898
+ function DataToolbar({ title, description, search, filters, actions, className = "" }) {
2899
+ return /* @__PURE__ */ jsxs64("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4 ${className}`, children: [
2900
+ /* @__PURE__ */ jsxs64("div", { className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between", children: [
2901
+ /* @__PURE__ */ jsxs64("div", { children: [
2902
+ title ? /* @__PURE__ */ jsx87("h3", { className: "text-base font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
2903
+ description ? /* @__PURE__ */ jsx87("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null
2904
+ ] }),
2905
+ actions ? /* @__PURE__ */ jsx87("div", { className: "flex flex-wrap gap-2", children: actions }) : null
2906
+ ] }),
2907
+ search || filters ? /* @__PURE__ */ jsxs64("div", { className: "mt-4 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between", children: [
2908
+ search ? /* @__PURE__ */ jsx87("div", { className: "min-w-0 flex-1", children: search }) : null,
2909
+ filters ? /* @__PURE__ */ jsx87("div", { className: "flex flex-wrap gap-2", children: filters }) : null
2910
+ ] }) : null
2911
+ ] });
2912
+ }
2913
+
2914
+ // src/components/framework/ResourceCard.tsx
2915
+ import { Fragment as Fragment3, jsx as jsx88, jsxs as jsxs65 } from "react/jsx-runtime";
2916
+ function ResourceCard({ title, description, eyebrow, icon, meta, status, actions, href, className = "" }) {
2917
+ const content = /* @__PURE__ */ jsxs65(Fragment3, { children: [
2918
+ /* @__PURE__ */ jsxs65("div", { className: "flex items-start justify-between gap-4", children: [
2919
+ /* @__PURE__ */ jsxs65("div", { className: "flex min-w-0 items-start gap-3", children: [
2920
+ 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,
2921
+ /* @__PURE__ */ jsxs65("div", { className: "min-w-0", children: [
2922
+ eyebrow ? /* @__PURE__ */ jsx88("div", { className: "kicker mb-2", children: eyebrow }) : null,
2923
+ /* @__PURE__ */ jsx88("h3", { className: "truncate text-base font-semibold text-[var(--tapiz-text-primary)]", children: title }),
2924
+ description ? /* @__PURE__ */ jsx88("p", { className: "mt-2 line-clamp-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
2925
+ ] })
2926
+ ] }),
2927
+ status ? /* @__PURE__ */ jsx88(Badge, { children: status }) : null
2928
+ ] }),
2929
+ 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: [
2930
+ meta ? /* @__PURE__ */ jsx88("div", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: meta }) : /* @__PURE__ */ jsx88("span", {}),
2931
+ actions ? /* @__PURE__ */ jsx88("div", { className: "flex flex-wrap gap-2", children: actions }) : null
2932
+ ] }) : null
2933
+ ] });
2934
+ 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}`;
2935
+ return href ? /* @__PURE__ */ jsx88("a", { href, className: classes, children: content }) : /* @__PURE__ */ jsx88("article", { className: classes, children: content });
2936
+ }
2937
+
2938
+ // src/components/framework/IntegrationCard.tsx
2939
+ import { jsx as jsx89, jsxs as jsxs66 } from "react/jsx-runtime";
2940
+ var statusLabel = {
2941
+ connected: "Connected",
2942
+ disconnected: "Disconnected",
2943
+ syncing: "Syncing",
2944
+ error: "Error"
2945
+ };
2946
+ var statusVariant = {
2947
+ connected: "success",
2948
+ disconnected: "default",
2949
+ syncing: "info",
2950
+ error: "danger"
2951
+ };
2952
+ function IntegrationCard({ name, description, logo, status = "disconnected", lastSync, actions, className = "" }) {
2953
+ return /* @__PURE__ */ jsxs66("article", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5 ${className}`, children: [
2954
+ /* @__PURE__ */ jsxs66("div", { className: "flex items-start justify-between gap-4", children: [
2955
+ /* @__PURE__ */ jsxs66("div", { className: "flex items-start gap-3", children: [
2956
+ /* @__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" }) }),
2957
+ /* @__PURE__ */ jsxs66("div", { children: [
2958
+ /* @__PURE__ */ jsx89("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: name }),
2959
+ description ? /* @__PURE__ */ jsx89("p", { className: "mt-1 text-sm leading-5 text-[var(--tapiz-text-muted)]", children: description }) : null
2960
+ ] })
2961
+ ] }),
2962
+ /* @__PURE__ */ jsx89(StatusBadge, { variant: statusVariant[status], label: statusLabel[status] })
2963
+ ] }),
2964
+ /* @__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: [
2965
+ /* @__PURE__ */ jsx89("div", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: lastSync ?? "No sync yet" }),
2966
+ actions ? /* @__PURE__ */ jsx89("div", { className: "flex gap-2", children: actions }) : null
2967
+ ] })
2968
+ ] });
2969
+ }
2970
+
2971
+ // src/components/framework/HealthIndicator.tsx
2972
+ import { jsx as jsx90, jsxs as jsxs67 } from "react/jsx-runtime";
2973
+ var toneClasses2 = {
2974
+ operational: "bg-[var(--tapiz-success)]",
2975
+ degraded: "bg-[var(--tapiz-warning)]",
2976
+ outage: "bg-[var(--tapiz-danger)]",
2977
+ unknown: "bg-[var(--tapiz-text-disabled)]"
2978
+ };
2979
+ var defaultLabel = {
2980
+ operational: "Operational",
2981
+ degraded: "Degraded",
2982
+ outage: "Outage",
2983
+ unknown: "Unknown"
2984
+ };
2985
+ function HealthIndicator({ tone: tone2 = "unknown", label, detail, className = "" }) {
2986
+ 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: [
2987
+ /* @__PURE__ */ jsx90("span", { className: `size-2.5 ${toneClasses2[tone2]}`, "aria-hidden": "true" }),
2988
+ /* @__PURE__ */ jsx90("span", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: label ?? defaultLabel[tone2] }),
2989
+ detail ? /* @__PURE__ */ jsx90("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: detail }) : null
2990
+ ] });
2991
+ }
2992
+
2993
+ // src/components/framework/AuditLog.tsx
2994
+ import { jsx as jsx91, jsxs as jsxs68 } from "react/jsx-runtime";
2995
+ function AuditLog({ items, className = "" }) {
2996
+ 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: [
2997
+ /* @__PURE__ */ jsx91(Avatar, { name: item.initials ?? item.actor, size: "sm" }),
2998
+ /* @__PURE__ */ jsxs68("div", { className: "min-w-0 flex-1", children: [
2999
+ /* @__PURE__ */ jsxs68("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
3000
+ /* @__PURE__ */ jsxs68("p", { className: "text-sm text-[var(--tapiz-text-secondary)]", children: [
3001
+ /* @__PURE__ */ jsx91("strong", { className: "text-[var(--tapiz-text-primary)]", children: item.actor }),
3002
+ " ",
3003
+ item.action
3004
+ ] }),
3005
+ /* @__PURE__ */ jsx91("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.timestamp })
3006
+ ] }),
3007
+ item.detail ? /* @__PURE__ */ jsx91("div", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: item.detail }) : null
3008
+ ] })
3009
+ ] }, index)) });
3010
+ }
3011
+
3012
+ // src/components/framework/KanbanBoard.tsx
3013
+ import { jsx as jsx92, jsxs as jsxs69 } from "react/jsx-runtime";
3014
+ var toneClasses3 = {
3015
+ default: "border-[var(--tapiz-border-subtle)]",
3016
+ accent: "border-[var(--tapiz-accent)]",
3017
+ success: "border-[var(--tapiz-success)]",
3018
+ warning: "border-[var(--tapiz-warning)]",
3019
+ danger: "border-[var(--tapiz-danger)]"
3020
+ };
3021
+ function KanbanBoard({ columns, className = "" }) {
3022
+ 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: [
3023
+ /* @__PURE__ */ jsxs69("div", { className: "mb-3 flex items-start justify-between gap-3", children: [
3024
+ /* @__PURE__ */ jsxs69("div", { children: [
3025
+ /* @__PURE__ */ jsx92("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: column.title }),
3026
+ column.description ? /* @__PURE__ */ jsx92("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: column.description }) : null
3027
+ ] }),
3028
+ /* @__PURE__ */ jsx92("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: column.items.length })
3029
+ ] }),
3030
+ /* @__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: [
3031
+ /* @__PURE__ */ jsx92("h4", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: item.title }),
3032
+ item.description ? /* @__PURE__ */ jsx92("p", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: item.description }) : null,
3033
+ item.meta ? /* @__PURE__ */ jsx92("div", { className: "mt-3 font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3034
+ ] }, item.id)) })
3035
+ ] }, column.id)) });
3036
+ }
3037
+
3038
+ // src/components/framework/AccessMatrix.tsx
3039
+ import { jsx as jsx93, jsxs as jsxs70 } from "react/jsx-runtime";
3040
+ function AccessMatrix({ roles, permissions, className = "" }) {
3041
+ 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: [
3042
+ /* @__PURE__ */ jsx93("thead", { children: /* @__PURE__ */ jsxs70("tr", { children: [
3043
+ /* @__PURE__ */ jsx93("th", { className: "px-4 py-3 text-left", children: "Permission" }),
3044
+ roles.map((role) => /* @__PURE__ */ jsx93("th", { className: "px-4 py-3 text-center", children: role.label }, role.key))
3045
+ ] }) }),
3046
+ /* @__PURE__ */ jsx93("tbody", { children: permissions.map((permission) => /* @__PURE__ */ jsxs70("tr", { children: [
3047
+ /* @__PURE__ */ jsxs70("td", { className: "px-4 py-3", children: [
3048
+ /* @__PURE__ */ jsx93("div", { className: "font-medium text-[var(--tapiz-text-primary)]", children: permission.label }),
3049
+ permission.description ? /* @__PURE__ */ jsx93("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: permission.description }) : null
3050
+ ] }),
3051
+ 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))
3052
+ ] }, permission.key)) })
3053
+ ] }) });
3054
+ }
3055
+
3056
+ // src/components/framework/CalendarGrid.tsx
3057
+ import { jsx as jsx94, jsxs as jsxs71 } from "react/jsx-runtime";
3058
+ var defaultWeekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
3059
+ function CalendarGrid({ days, weekdays = defaultWeekdays, className = "" }) {
3060
+ return /* @__PURE__ */ jsxs71("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
3061
+ /* @__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)) }),
3062
+ /* @__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: [
3063
+ /* @__PURE__ */ jsxs71("div", { className: "flex items-center justify-between gap-2", children: [
3064
+ /* @__PURE__ */ jsx94("span", { className: "font-mono text-xs text-[var(--tapiz-text-primary)]", children: day.date }),
3065
+ day.label ? /* @__PURE__ */ jsx94("span", { className: "text-[10px] text-[var(--tapiz-text-muted)]", children: day.label }) : null
3066
+ ] }),
3067
+ 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
3068
+ ] }, index)) })
3069
+ ] });
3070
+ }
3071
+
3072
+ // src/components/forms/Slider.tsx
3073
+ import { jsx as jsx95, jsxs as jsxs72 } from "react/jsx-runtime";
3074
+ function Slider({ label, valueLabel, className = "", ...props }) {
3075
+ return /* @__PURE__ */ jsxs72("label", { className: `block ${className}`, children: [
3076
+ label || valueLabel ? /* @__PURE__ */ jsxs72("span", { className: "mb-2 flex items-center justify-between gap-3 text-sm", children: [
3077
+ label ? /* @__PURE__ */ jsx95("span", { className: "font-medium text-[var(--tapiz-text-secondary)]", children: label }) : /* @__PURE__ */ jsx95("span", {}),
3078
+ valueLabel ? /* @__PURE__ */ jsx95("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: valueLabel }) : null
3079
+ ] }) : null,
3080
+ /* @__PURE__ */ jsx95(
3081
+ "input",
3082
+ {
3083
+ ...props,
3084
+ type: "range",
3085
+ 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)]"
3086
+ }
3087
+ )
3088
+ ] });
3089
+ }
3090
+
3091
+ // src/components/forms/FileDropzone.tsx
3092
+ import { jsx as jsx96, jsxs as jsxs73 } from "react/jsx-runtime";
3093
+ function FileDropzone({ title = "Drop files here", description, actionLabel = "Browse", className = "", ...props }) {
3094
+ 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: [
3095
+ /* @__PURE__ */ jsx96("input", { ...props, type: "file", className: "sr-only" }),
3096
+ /* @__PURE__ */ jsx96("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }),
3097
+ description ? /* @__PURE__ */ jsx96("span", { className: "mt-2 block text-sm text-[var(--tapiz-text-muted)]", children: description }) : null,
3098
+ /* @__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 })
3099
+ ] });
3100
+ }
3101
+
3102
+ // src/components/forms/PasswordInput.tsx
3103
+ import { jsx as jsx97, jsxs as jsxs74 } from "react/jsx-runtime";
3104
+ function PasswordInput({ revealLabel = "Show", className = "", ...props }) {
3105
+ 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: [
3106
+ /* @__PURE__ */ jsx97(
3107
+ "input",
3108
+ {
3109
+ ...props,
3110
+ type: "password",
3111
+ className: "min-w-0 flex-1 border-0 bg-transparent px-3 py-2 text-sm text-[var(--tapiz-text-primary)] outline-none"
3112
+ }
3113
+ ),
3114
+ /* @__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 })
3115
+ ] });
3116
+ }
3117
+
3118
+ // src/components/forms/TextareaCounter.tsx
3119
+ import { jsx as jsx98, jsxs as jsxs75 } from "react/jsx-runtime";
3120
+ function TextareaCounter({ maxLength, value = "", className = "", ...props }) {
3121
+ const count = value.length;
3122
+ return /* @__PURE__ */ jsxs75("div", { className, children: [
3123
+ /* @__PURE__ */ jsx98("textarea", { ...props, value, maxLength, className: "input-field min-h-28" }),
3124
+ /* @__PURE__ */ jsxs75("div", { className: "mt-1 text-right font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: [
3125
+ count,
3126
+ "/",
3127
+ maxLength
3128
+ ] })
3129
+ ] });
3130
+ }
3131
+
3132
+ // src/components/feedback/Callout.tsx
3133
+ import { jsx as jsx99, jsxs as jsxs76 } from "react/jsx-runtime";
3134
+ var toneClasses4 = {
3135
+ info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)]",
3136
+ success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
3137
+ warning: "border-[var(--tapiz-warning)] bg-[var(--tapiz-warning-soft)]",
3138
+ danger: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)]",
3139
+ neutral: "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]"
3140
+ };
3141
+ function Callout({ title, children, tone: tone2 = "info", icon, actions, className = "" }) {
3142
+ return /* @__PURE__ */ jsx99("aside", { className: `border-l-4 p-4 ${toneClasses4[tone2]} ${className}`, children: /* @__PURE__ */ jsxs76("div", { className: "flex gap-3", children: [
3143
+ icon ? /* @__PURE__ */ jsx99("div", { className: "text-[var(--tapiz-text-primary)]", children: icon }) : null,
3144
+ /* @__PURE__ */ jsxs76("div", { className: "min-w-0 flex-1", children: [
3145
+ title ? /* @__PURE__ */ jsx99("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
3146
+ children ? /* @__PURE__ */ jsx99("div", { className: "mt-1 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children }) : null,
3147
+ actions ? /* @__PURE__ */ jsx99("div", { className: "mt-3 flex flex-wrap gap-2", children: actions }) : null
3148
+ ] })
3149
+ ] }) });
3150
+ }
3151
+
3152
+ // src/components/feedback/LoadingOverlay.tsx
3153
+ import { jsx as jsx100, jsxs as jsxs77 } from "react/jsx-runtime";
3154
+ function LoadingOverlay({ visible = false, label = "Loading", children, className = "" }) {
3155
+ return /* @__PURE__ */ jsxs77("div", { className: `relative ${className}`, children: [
3156
+ children,
3157
+ 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: [
3158
+ /* @__PURE__ */ jsx100(Spinner, {}),
3159
+ /* @__PURE__ */ jsx100("span", { children: label })
3160
+ ] }) }) : null
3161
+ ] });
3162
+ }
3163
+
3164
+ // src/components/feedback/NotificationList.tsx
3165
+ import { jsx as jsx101, jsxs as jsxs78 } from "react/jsx-runtime";
3166
+ function NotificationList({ items, className = "" }) {
3167
+ 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: [
3168
+ /* @__PURE__ */ jsx101("span", { className: `mt-1 size-2.5 ${item.unread ? "bg-[var(--tapiz-accent)]" : "bg-[var(--tapiz-border-subtle)]"}`, "aria-hidden": "true" }),
3169
+ /* @__PURE__ */ jsxs78("div", { className: "min-w-0 flex-1", children: [
3170
+ /* @__PURE__ */ jsxs78("div", { className: "flex items-start justify-between gap-3", children: [
3171
+ /* @__PURE__ */ jsx101("h3", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: item.title }),
3172
+ item.time ? /* @__PURE__ */ jsx101("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.time }) : null
3173
+ ] }),
3174
+ item.description ? /* @__PURE__ */ jsx101("p", { className: "mt-1 text-sm leading-5 text-[var(--tapiz-text-muted)]", children: item.description }) : null,
3175
+ item.action ? /* @__PURE__ */ jsx101("div", { className: "mt-3", children: item.action }) : null
3176
+ ] })
3177
+ ] }, item.id)) });
3178
+ }
3179
+
3180
+ // src/components/layout/MasonryGrid.tsx
3181
+ import { jsx as jsx102 } from "react/jsx-runtime";
3182
+ var columnClasses = { 2: "md:columns-2", 3: "md:columns-2 xl:columns-3", 4: "md:columns-2 lg:columns-3 xl:columns-4" };
3183
+ var gapClasses4 = { sm: "gap-3", md: "gap-5", lg: "gap-8" };
3184
+ function MasonryGrid({ children, columns = 3, gap = "md", className = "", style }) {
3185
+ return /* @__PURE__ */ jsx102("div", { className: [columnClasses[columns], gapClasses4[gap], className].filter(Boolean).join(" "), style, children });
3186
+ }
3187
+
3188
+ // src/components/layout/PageRail.tsx
3189
+ import { Fragment as Fragment4, jsx as jsx103, jsxs as jsxs79 } from "react/jsx-runtime";
3190
+ function PageRail({ title, items, actions, className = "", style }) {
3191
+ 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: [
3192
+ title ? /* @__PURE__ */ jsx103("div", { className: "kicker mb-3 px-2", children: title }) : null,
3193
+ /* @__PURE__ */ jsx103("nav", { className: "flex flex-col gap-1", children: items.map((item, index) => {
3194
+ const content = /* @__PURE__ */ jsxs79(Fragment4, { children: [
3195
+ /* @__PURE__ */ jsx103("span", { className: "truncate", children: item.label }),
3196
+ item.meta ? /* @__PURE__ */ jsx103("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3197
+ ] });
3198
+ 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(" ");
3199
+ return item.href ? /* @__PURE__ */ jsx103("a", { href: item.href, className: classes, children: content }, index) : /* @__PURE__ */ jsx103("div", { className: classes, children: content }, index);
3200
+ }) }),
3201
+ actions ? /* @__PURE__ */ jsx103("div", { className: "mt-3 border-t border-[var(--tapiz-border-subtle)] pt-3", children: actions }) : null
3202
+ ] });
3203
+ }
3204
+
3205
+ // src/components/layout/StickyBar.tsx
3206
+ import { jsx as jsx104 } from "react/jsx-runtime";
3207
+ function StickyBar({ children, position = "top", className = "", style }) {
3208
+ return /* @__PURE__ */ jsx104(
3209
+ "div",
3210
+ {
3211
+ 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(" "),
3212
+ style,
3213
+ children
3214
+ }
3215
+ );
3216
+ }
3217
+
3218
+ // src/components/forms/Combobox.tsx
3219
+ import { jsx as jsx105, jsxs as jsxs80 } from "react/jsx-runtime";
3220
+ function Combobox({ options, placeholder = "Select option", invalid = false, className = "", ...props }) {
3221
+ 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: [
3222
+ /* @__PURE__ */ jsx105("option", { value: "", children: placeholder }),
3223
+ options.map((option) => /* @__PURE__ */ jsx105("option", { value: option.value, children: String(option.label) }, option.value))
3224
+ ] });
3225
+ }
3226
+
3227
+ // src/components/forms/DateRangePicker.tsx
3228
+ import { jsx as jsx106, jsxs as jsxs81 } from "react/jsx-runtime";
3229
+ function DateRangePicker({ startLabel = "From", endLabel = "To", startProps, endProps, className = "" }) {
3230
+ return /* @__PURE__ */ jsxs81("div", { className: ["grid gap-3 md:grid-cols-2", className].filter(Boolean).join(" "), children: [
3231
+ /* @__PURE__ */ jsxs81("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
3232
+ /* @__PURE__ */ jsx106("span", { children: startLabel }),
3233
+ /* @__PURE__ */ jsx106("input", { type: "date", ...startProps, className: ["input-field", startProps?.className || ""].join(" ") })
3234
+ ] }),
3235
+ /* @__PURE__ */ jsxs81("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
3236
+ /* @__PURE__ */ jsx106("span", { children: endLabel }),
3237
+ /* @__PURE__ */ jsx106("input", { type: "date", ...endProps, className: ["input-field", endProps?.className || ""].join(" ") })
3238
+ ] })
3239
+ ] });
3240
+ }
3241
+
3242
+ // src/components/forms/ColorSwatchPicker.tsx
3243
+ import { jsx as jsx107, jsxs as jsxs82 } from "react/jsx-runtime";
3244
+ function ColorSwatchPicker({ options, value, onChange, className = "" }) {
3245
+ return /* @__PURE__ */ jsx107("div", { className: ["flex flex-wrap gap-2", className].filter(Boolean).join(" "), children: options.map((option) => {
3246
+ const selected = option.value === value;
3247
+ 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: [
3248
+ /* @__PURE__ */ jsx107("span", { className: "h-4 w-4 border border-[var(--tapiz-border-strong)]", style: { background: option.color } }),
3249
+ /* @__PURE__ */ jsx107("span", { children: option.label })
3250
+ ] }, option.value);
3251
+ }) });
3252
+ }
3253
+
3254
+ // src/components/forms/RatingInput.tsx
3255
+ import { jsx as jsx108 } from "react/jsx-runtime";
3256
+ function RatingInput({ value = 0, max = 5, icon = "\u2605", onChange, label = "Rating", className = "" }) {
3257
+ 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) => {
3258
+ const score = index + 1;
3259
+ const active = score <= value;
3260
+ 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);
3261
+ }) });
3262
+ }
3263
+
3264
+ // src/components/data-display/ScoreRing.tsx
3265
+ import { jsx as jsx109, jsxs as jsxs83 } from "react/jsx-runtime";
3266
+ function ScoreRing({ value, max = 100, label, size = 112, className = "" }) {
3267
+ const normalized = Math.max(0, Math.min(1, value / max));
3268
+ const radius = 42;
3269
+ const circumference = 2 * Math.PI * radius;
3270
+ const dash = circumference * normalized;
3271
+ return /* @__PURE__ */ jsxs83("div", { className: ["inline-grid place-items-center", className].filter(Boolean).join(" "), style: { width: size, height: size }, children: [
3272
+ /* @__PURE__ */ jsxs83("svg", { viewBox: "0 0 100 100", className: "h-full w-full -rotate-90", children: [
3273
+ /* @__PURE__ */ jsx109("circle", { cx: "50", cy: "50", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
3274
+ /* @__PURE__ */ jsx109("circle", { cx: "50", cy: "50", r: radius, fill: "none", stroke: "var(--tapiz-accent)", strokeWidth: "10", strokeLinecap: "square", strokeDasharray: `${dash} ${circumference - dash}` })
3275
+ ] }),
3276
+ /* @__PURE__ */ jsxs83("div", { className: "absolute text-center", children: [
3277
+ /* @__PURE__ */ jsxs83("div", { className: "font-display text-2xl font-semibold text-[var(--tapiz-text-primary)]", children: [
3278
+ Math.round(normalized * 100),
3279
+ "%"
3280
+ ] }),
3281
+ label ? /* @__PURE__ */ jsx109("div", { className: "font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: label }) : null
3282
+ ] })
3283
+ ] });
3284
+ }
3285
+
3286
+ // src/components/data-display/HeatmapGrid.tsx
3287
+ import { jsx as jsx110 } from "react/jsx-runtime";
3288
+ function HeatmapGrid({ cells, columns = 7, max, className = "" }) {
3289
+ const peak = max ?? Math.max(1, ...cells.map((cell) => cell.value));
3290
+ return /* @__PURE__ */ jsx110("div", { className: ["grid gap-1", className].filter(Boolean).join(" "), style: { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }, children: cells.map((cell, index) => {
3291
+ const opacity = 0.15 + Math.min(1, cell.value / peak) * 0.75;
3292
+ 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);
3293
+ }) });
3294
+ }
3295
+
3296
+ // src/components/data-display/FunnelChart.tsx
3297
+ import { jsx as jsx111, jsxs as jsxs84 } from "react/jsx-runtime";
3298
+ function FunnelChart({ steps, className = "" }) {
3299
+ const max = Math.max(1, ...steps.map((step) => step.value));
3300
+ return /* @__PURE__ */ jsx111("div", { className: ["space-y-3", className].filter(Boolean).join(" "), children: steps.map((step, index) => {
3301
+ const width = Math.max(8, step.value / max * 100);
3302
+ return /* @__PURE__ */ jsxs84("div", { children: [
3303
+ /* @__PURE__ */ jsxs84("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
3304
+ /* @__PURE__ */ jsx111("span", { className: "font-medium text-[var(--tapiz-text-primary)]", children: step.label }),
3305
+ /* @__PURE__ */ jsxs84("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
3306
+ step.value,
3307
+ step.meta ? ` \xB7 ${String(step.meta)}` : ""
3308
+ ] })
3309
+ ] }),
3310
+ /* @__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}%` } }) })
3311
+ ] }, index);
3312
+ }) });
3313
+ }
3314
+
3315
+ // src/components/data-display/ComparisonMeter.tsx
3316
+ import { jsx as jsx112, jsxs as jsxs85 } from "react/jsx-runtime";
3317
+ function ComparisonMeter({ leftLabel, rightLabel, value, className = "" }) {
3318
+ const clamped = Math.max(0, Math.min(100, value));
3319
+ return /* @__PURE__ */ jsxs85("div", { className, children: [
3320
+ /* @__PURE__ */ jsxs85("div", { className: "mb-2 flex justify-between gap-3 text-sm text-[var(--tapiz-text-muted)]", children: [
3321
+ /* @__PURE__ */ jsx112("span", { children: leftLabel }),
3322
+ /* @__PURE__ */ jsx112("span", { children: rightLabel })
3323
+ ] }),
3324
+ /* @__PURE__ */ jsxs85("div", { className: "relative h-3 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]", children: [
3325
+ /* @__PURE__ */ jsx112("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${clamped}%` } }),
3326
+ /* @__PURE__ */ jsx112("div", { className: "absolute top-[-6px] h-6 w-px bg-[var(--tapiz-border-strong)]", style: { left: `${clamped}%` } })
3327
+ ] })
3328
+ ] });
3329
+ }
3330
+
3331
+ // src/components/framework/ActivityFeed.tsx
3332
+ import { jsx as jsx113, jsxs as jsxs86 } from "react/jsx-runtime";
3333
+ function ActivityFeed({ items, className = "" }) {
3334
+ 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: [
3335
+ /* @__PURE__ */ jsx113(Avatar, { name: item.actor, src: item.avatarUrl, size: "sm" }),
3336
+ /* @__PURE__ */ jsxs86("div", { className: "min-w-0 flex-1", children: [
3337
+ /* @__PURE__ */ jsxs86("p", { className: "text-sm text-[var(--tapiz-text-primary)]", children: [
3338
+ /* @__PURE__ */ jsx113("strong", { children: item.actor }),
3339
+ " ",
3340
+ item.action
3341
+ ] }),
3342
+ item.meta ? /* @__PURE__ */ jsx113("div", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3343
+ ] }),
3344
+ item.time ? /* @__PURE__ */ jsx113("div", { className: "font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: item.time }) : null
3345
+ ] }, index)) });
3346
+ }
3347
+
3348
+ // src/components/framework/InboxList.tsx
3349
+ import { jsx as jsx114, jsxs as jsxs87 } from "react/jsx-runtime";
3350
+ function InboxList({ items, className = "" }) {
3351
+ 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: [
3352
+ /* @__PURE__ */ jsxs87("div", { className: "flex items-start justify-between gap-3", children: [
3353
+ /* @__PURE__ */ jsxs87("div", { className: "min-w-0", children: [
3354
+ /* @__PURE__ */ jsx114("h3", { className: "truncate text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
3355
+ item.sender ? /* @__PURE__ */ jsx114("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.sender }) : null
3356
+ ] }),
3357
+ /* @__PURE__ */ jsxs87("div", { className: "flex shrink-0 items-center gap-2", children: [
3358
+ item.tag ? /* @__PURE__ */ jsx114(Badge, { children: item.tag }) : null,
3359
+ item.time ? /* @__PURE__ */ jsx114("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.time }) : null
3360
+ ] })
3361
+ ] }),
3362
+ item.snippet ? /* @__PURE__ */ jsx114("p", { className: "mt-2 line-clamp-2 text-sm text-[var(--tapiz-text-muted)]", children: item.snippet }) : null
3363
+ ] }, index)) });
3364
+ }
3365
+
3366
+ // src/components/framework/ApprovalQueue.tsx
3367
+ import { jsx as jsx115, jsxs as jsxs88 } from "react/jsx-runtime";
3368
+ function ApprovalQueue({ items, onApprove, onReject, className = "" }) {
3369
+ 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: [
3370
+ /* @__PURE__ */ jsxs88("div", { children: [
3371
+ /* @__PURE__ */ jsxs88("div", { className: "flex flex-wrap items-center gap-2", children: [
3372
+ /* @__PURE__ */ jsx115("h3", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
3373
+ item.priority ? /* @__PURE__ */ jsx115(Badge, { variant: item.priority === "high" ? "danger" : item.priority === "medium" ? "warning" : "default", children: item.priority }) : null
3374
+ ] }),
3375
+ item.requester ? /* @__PURE__ */ jsxs88("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: [
3376
+ "Requested by ",
3377
+ item.requester
3378
+ ] }) : null,
3379
+ item.description ? /* @__PURE__ */ jsx115("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: item.description }) : null
3380
+ ] }),
3381
+ /* @__PURE__ */ jsxs88("div", { className: "flex gap-2", children: [
3382
+ /* @__PURE__ */ jsx115(Button, { size: "sm", variant: "secondary", onClick: () => onReject?.(index), children: "Reject" }),
3383
+ /* @__PURE__ */ jsx115(Button, { size: "sm", onClick: () => onApprove?.(index), children: "Approve" })
3384
+ ] })
3385
+ ] }) }, index)) });
3386
+ }
3387
+
3388
+ // src/components/framework/SLAStatus.tsx
3389
+ import { jsx as jsx116, jsxs as jsxs89 } from "react/jsx-runtime";
3390
+ function SLAStatus({ label, value, target = 95, className = "" }) {
3391
+ const ok = value >= target;
3392
+ return /* @__PURE__ */ jsxs89("div", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4", className].filter(Boolean).join(" "), children: [
3393
+ /* @__PURE__ */ jsxs89("div", { className: "flex items-center justify-between gap-3", children: [
3394
+ /* @__PURE__ */ jsx116("span", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: label }),
3395
+ /* @__PURE__ */ jsx116("span", { className: ["font-mono text-xs", ok ? "text-[var(--tapiz-success)]" : "text-[var(--tapiz-warning)]"].join(" "), children: ok ? "Within SLA" : "At risk" })
3396
+ ] }),
3397
+ /* @__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))}%` } }) }),
3398
+ /* @__PURE__ */ jsxs89("div", { className: "mt-2 flex justify-between font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: [
3399
+ /* @__PURE__ */ jsxs89("span", { children: [
3400
+ value,
3401
+ "%"
3402
+ ] }),
3403
+ /* @__PURE__ */ jsxs89("span", { children: [
3404
+ "Target ",
3405
+ target,
3406
+ "%"
3407
+ ] })
3408
+ ] })
3409
+ ] });
3410
+ }
3411
+
3412
+ // src/components/framework/FeatureFlagTable.tsx
3413
+ import { jsx as jsx117, jsxs as jsxs90 } from "react/jsx-runtime";
3414
+ function FeatureFlagTable({ flags, onToggle, className = "" }) {
3415
+ 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: [
3416
+ /* @__PURE__ */ jsxs90("div", { children: [
3417
+ /* @__PURE__ */ jsxs90("div", { className: "flex flex-wrap items-center gap-2", children: [
3418
+ /* @__PURE__ */ jsx117("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: flag.name }),
3419
+ /* @__PURE__ */ jsx117(Badge, { children: flag.key })
3420
+ ] }),
3421
+ flag.description ? /* @__PURE__ */ jsx117("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: flag.description }) : null
3422
+ ] }),
3423
+ /* @__PURE__ */ jsx117("div", { className: "text-sm text-[var(--tapiz-text-muted)]", children: flag.rollout }),
3424
+ /* @__PURE__ */ jsx117(Switch, { checked: flag.enabled, onChange: (checked) => onToggle?.(flag.key, checked) })
3425
+ ] }, flag.key)) });
3426
+ }
3427
+
3428
+ // src/components/framework/PlanUsage.tsx
3429
+ import { jsx as jsx118, jsxs as jsxs91 } from "react/jsx-runtime";
3430
+ function PlanUsage({ title = "Plan usage", items, className = "" }) {
3431
+ return /* @__PURE__ */ jsxs91("section", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5", className].filter(Boolean).join(" "), children: [
3432
+ /* @__PURE__ */ jsx118("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }),
3433
+ /* @__PURE__ */ jsx118("div", { className: "mt-4 space-y-4", children: items.map((item, index) => {
3434
+ const pct = item.limit ? Math.min(100, item.used / item.limit * 100) : 0;
3435
+ return /* @__PURE__ */ jsxs91("div", { children: [
3436
+ /* @__PURE__ */ jsxs91("div", { className: "mb-1 flex justify-between text-sm", children: [
3437
+ /* @__PURE__ */ jsx118("span", { className: "text-[var(--tapiz-text-primary)]", children: item.label }),
3438
+ /* @__PURE__ */ jsxs91("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
3439
+ item.used,
3440
+ "/",
3441
+ item.limit
3442
+ ] })
3443
+ ] }),
3444
+ /* @__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}%` } }) })
3445
+ ] }, index);
3446
+ }) })
3447
+ ] });
3448
+ }
3449
+
3450
+ // src/components/marketing/AnnouncementBar.tsx
3451
+ import { jsx as jsx119, jsxs as jsxs92 } from "react/jsx-runtime";
3452
+ function AnnouncementBar({ children, action, className = "" }) {
3453
+ 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: [
3454
+ " ",
3455
+ /* @__PURE__ */ jsx119("span", { children }),
3456
+ action ? /* @__PURE__ */ jsx119("span", { children: action }) : null
3457
+ ] }) });
3458
+ }
3459
+
3460
+ // src/components/marketing/FAQSection.tsx
3461
+ import { jsx as jsx120, jsxs as jsxs93 } from "react/jsx-runtime";
3462
+ function FAQSection({ title = "Frequently asked questions", description, items, className = "" }) {
3463
+ return /* @__PURE__ */ jsxs93("section", { className, children: [
3464
+ /* @__PURE__ */ jsxs93("div", { className: "mb-6 max-w-2xl", children: [
3465
+ /* @__PURE__ */ jsx120("div", { className: "kicker", children: "FAQ" }),
3466
+ /* @__PURE__ */ jsx120("h2", { className: "mt-2 text-3xl font-semibold tracking-[-0.05em] text-[var(--tapiz-text-primary)]", children: title }),
3467
+ description ? /* @__PURE__ */ jsx120("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
3468
+ ] }),
3469
+ /* @__PURE__ */ jsx120(Accordion, { items: items.map((item, index) => ({ id: `faq-${index}`, title: item.question, content: item.answer })) })
3470
+ ] });
3471
+ }
3472
+
3473
+ // src/components/marketing/RoadmapList.tsx
3474
+ import { jsx as jsx121, jsxs as jsxs94 } from "react/jsx-runtime";
3475
+ function RoadmapList({ items, className = "" }) {
3476
+ 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: [
3477
+ /* @__PURE__ */ jsxs94("div", { className: "flex items-center justify-between gap-3", children: [
3478
+ /* @__PURE__ */ jsx121("span", { className: "kicker", children: item.quarter ?? `0${index + 1}` }),
3479
+ item.status ? /* @__PURE__ */ jsx121(Badge, { children: item.status }) : null
3480
+ ] }),
3481
+ /* @__PURE__ */ jsx121("h3", { className: "mt-4 font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
3482
+ item.description ? /* @__PURE__ */ jsx121("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: item.description }) : null
3483
+ ] }, index)) });
3484
+ }
3485
+
3486
+ // src/components/feedback/InlineStatus.tsx
3487
+ import { jsx as jsx122, jsxs as jsxs95 } from "react/jsx-runtime";
3488
+ var toneClasses5 = {
3489
+ neutral: "bg-[var(--tapiz-text-muted)]",
3490
+ success: "bg-[var(--tapiz-success)]",
3491
+ warning: "bg-[var(--tapiz-warning)]",
3492
+ danger: "bg-[var(--tapiz-danger)]",
3493
+ info: "bg-[var(--tapiz-info)]"
3494
+ };
3495
+ function InlineStatus({ tone: tone2 = "neutral", children, pulse = false, className = "" }) {
3496
+ return /* @__PURE__ */ jsxs95("span", { className: ["inline-flex items-center gap-2 text-sm text-[var(--tapiz-text-muted)]", className].filter(Boolean).join(" "), children: [
3497
+ /* @__PURE__ */ jsx122("span", { className: ["h-2 w-2 rounded-full", toneClasses5[tone2], pulse ? "animate-pulse" : ""].filter(Boolean).join(" ") }),
3498
+ children
3499
+ ] });
3500
+ }
3501
+
3502
+ // src/showcase/TapizDocsPage.tsx
3503
+ import { Fragment as Fragment5, jsx as jsx123, jsxs as jsxs96 } from "react/jsx-runtime";
3504
+ var demoRows = [
3505
+ { id: "1", student: "Mila Petrovi\u0107", status: "Active", score: 94 },
3506
+ { id: "2", student: "Vuk Jovanovi\u0107", status: "Pending", score: 82 },
3507
+ { id: "3", student: "Sara Ili\u0107", status: "Blocked", score: 68 }
3508
+ ];
3509
+ var calendarDays = Array.from({ length: 35 }, (_, index) => ({
3510
+ date: index + 1,
3511
+ selected: index === 10,
3512
+ muted: index > 30,
3513
+ events: index === 10 ? ["Exam review", "Parent sync"] : index === 15 ? ["Quiz"] : void 0
3514
+ }));
3515
+ function DemoSection({ id, title, description, children }) {
3516
+ return /* @__PURE__ */ jsxs96("section", { id, className: "scroll-mt-20 border-t border-[var(--tapiz-border-subtle)] py-12", children: [
3517
+ /* @__PURE__ */ jsxs96("div", { className: "mb-6 flex flex-col gap-2 md:flex-row md:items-end md:justify-between", children: [
3518
+ /* @__PURE__ */ jsxs96("div", { children: [
3519
+ /* @__PURE__ */ jsx123("div", { className: "kicker", children: id }),
3520
+ /* @__PURE__ */ jsx123("h2", { className: "mt-2 text-3xl font-semibold tracking-[-0.05em] text-[var(--tapiz-text-primary)]", children: title }),
3521
+ /* @__PURE__ */ jsx123("p", { className: "mt-2 max-w-2xl text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description })
3522
+ ] }),
3523
+ /* @__PURE__ */ jsx123("a", { href: "#top", className: "font-mono text-xs uppercase tracking-[0.16em] text-[var(--tapiz-accent)]", children: "Back to top" })
3524
+ ] }),
3525
+ children
3526
+ ] });
3527
+ }
3528
+ function TapizDocsPage({ title = "Tapiz UI Framework", subtitle = "A brutal-enterprise React component system with tokens, primitives, patterns, and ready-made application blocks." }) {
3529
+ return /* @__PURE__ */ jsxs96("main", { id: "top", className: "tapiz-enterprise-shell min-h-screen tapiz-noise-bg", children: [
3530
+ /* @__PURE__ */ jsx123(
3531
+ TopNav,
3532
+ {
3533
+ brand: /* @__PURE__ */ jsx123("span", { className: "font-display text-lg font-semibold tracking-[-0.04em]", children: "Tapiz UI" }),
3534
+ links: [
3535
+ { label: "Foundations", href: "#foundations" },
3536
+ { label: "Forms", href: "#forms" },
3537
+ { label: "Data", href: "#data" },
3538
+ { label: "Framework", href: "#framework" },
3539
+ { label: "Advanced", href: "#advanced" },
3540
+ { label: "Marketing", href: "#marketing" }
3541
+ ],
3542
+ actions: /* @__PURE__ */ jsx123(Button, { size: "sm", variant: "brutal", children: "Install" })
3543
+ }
3544
+ ),
3545
+ /* @__PURE__ */ jsx123(
3546
+ HeroFrame,
3547
+ {
3548
+ eyebrow: "Design system / React framework",
3549
+ title,
3550
+ description: subtitle,
3551
+ actions: /* @__PURE__ */ jsxs96(Fragment5, { children: [
3552
+ /* @__PURE__ */ jsx123(Button, { variant: "primary", children: "Start building" }),
3553
+ /* @__PURE__ */ jsx123(Button, { variant: "secondary", children: "View tokens" })
3554
+ ] }),
3555
+ meta: "Light/dark safe \xB7 token driven \xB7 no app-specific dependencies",
3556
+ visual: /* @__PURE__ */ jsxs96(MockupFrame, { title: "Component registry", children: [
3557
+ /* @__PURE__ */ jsxs96(StatGrid, { children: [
3558
+ /* @__PURE__ */ jsx123(MetricCard, { label: "Components", value: "80+", trend: "expanded", trendTone: "positive" }),
3559
+ /* @__PURE__ */ jsx123(MetricCard, { label: "Themes", value: "2", trend: "light/dark" }),
3560
+ /* @__PURE__ */ jsx123(MetricCard, { label: "Patterns", value: "12", trend: "framework", trendTone: "warning" })
3561
+ ] }),
3562
+ /* @__PURE__ */ jsx123("div", { className: "mt-4", children: /* @__PURE__ */ jsx123(Sparkline, { values: [18, 24, 21, 32, 44, 39, 58], width: 420, height: 56 }) })
3563
+ ] })
3564
+ }
3565
+ ),
3566
+ /* @__PURE__ */ jsxs96(Container, { size: "xl", className: "pb-16", children: [
3567
+ /* @__PURE__ */ jsx123(Surface, { variant: "brutal", padding: "md", className: "mb-8", children: /* @__PURE__ */ jsxs96(Cluster, { justify: "between", align: "center", children: [
3568
+ /* @__PURE__ */ jsx123(Breadcrumbs, { items: [{ label: "Docs", href: "#top" }, { label: "Components" }] }),
3569
+ /* @__PURE__ */ jsxs96(Cluster, { gap: "sm", children: [
3570
+ /* @__PURE__ */ jsx123(Kbd, { children: "\u2318" }),
3571
+ /* @__PURE__ */ jsx123(Kbd, { children: "K" }),
3572
+ /* @__PURE__ */ jsx123("span", { className: "text-sm text-[var(--tapiz-text-muted)]", children: "Command-first framework UX" })
3573
+ ] })
3574
+ ] }) }),
3575
+ /* @__PURE__ */ jsxs96(DemoSection, { id: "foundations", title: "Foundations", description: "Core surfaces, cards, badges, layout helpers, empty states, skeletons and typography primitives.", children: [
3576
+ /* @__PURE__ */ jsxs96(ResponsiveGrid, { min: "16rem", children: [
3577
+ /* @__PURE__ */ jsxs96(Card, { variant: "surface", children: [
3578
+ /* @__PURE__ */ jsx123("div", { className: "kicker", children: "surface" }),
3579
+ /* @__PURE__ */ jsx123("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: "Default card treatment." })
3580
+ ] }),
3581
+ /* @__PURE__ */ jsxs96(Card, { variant: "raised", children: [
3582
+ /* @__PURE__ */ jsx123("div", { className: "kicker", children: "raised" }),
3583
+ /* @__PURE__ */ jsx123("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: "Elevated enterprise panel." })
3584
+ ] }),
3585
+ /* @__PURE__ */ jsxs96(Card, { variant: "brutal", children: [
3586
+ /* @__PURE__ */ jsx123("div", { className: "kicker", children: "brutal" }),
3587
+ /* @__PURE__ */ jsx123("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: "Hard border + hard shadow." })
3588
+ ] }),
3589
+ /* @__PURE__ */ jsxs96(Card, { variant: "glass", children: [
3590
+ /* @__PURE__ */ jsx123("div", { className: "kicker", children: "glass" }),
3591
+ /* @__PURE__ */ jsx123("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: "Backdrop style surface." })
3592
+ ] })
3593
+ ] }),
3594
+ /* @__PURE__ */ jsx123(Divider, { label: "status tokens", className: "my-8" }),
3595
+ /* @__PURE__ */ jsxs96(Cluster, { children: [
3596
+ /* @__PURE__ */ jsx123(Badge, { children: "Default" }),
3597
+ /* @__PURE__ */ jsx123(Badge, { variant: "success", children: "Success" }),
3598
+ /* @__PURE__ */ jsx123(Badge, { variant: "warning", children: "Warning" }),
3599
+ /* @__PURE__ */ jsx123(Badge, { variant: "danger", children: "Danger" }),
3600
+ /* @__PURE__ */ jsx123(Badge, { variant: "info", children: "Info" }),
3601
+ /* @__PURE__ */ jsx123(StatusBadge, { label: "Active", variant: "active" }),
3602
+ /* @__PURE__ */ jsx123(StatusBadge, { label: "Pending", variant: "pending" }),
3603
+ /* @__PURE__ */ jsx123(StatusBadge, { label: "Inactive", variant: "inactive" })
3604
+ ] }),
3605
+ /* @__PURE__ */ jsxs96(ResponsiveGrid, { min: "20rem", className: "mt-8", children: [
3606
+ /* @__PURE__ */ jsx123(EmptyState, { title: "No records", description: "Use empty states instead of blank panels." }),
3607
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Skeleton loading", description: "Use while data is loading.", children: /* @__PURE__ */ jsxs96(Stack, { children: [
3608
+ /* @__PURE__ */ jsx123(Skeleton, { className: "h-4 w-3/4" }),
3609
+ /* @__PURE__ */ jsx123(Skeleton, { className: "h-4 w-1/2" }),
3610
+ /* @__PURE__ */ jsx123(Skeleton, { className: "h-20 w-full" })
3611
+ ] }) }),
3612
+ /* @__PURE__ */ jsx123(KeyValueList, { density: "compact", items: [{ keyLabel: "Package", value: "@tapizlabs/ui" }, { keyLabel: "Mode", value: "Framework" }, { keyLabel: "Theme", value: "Token-first" }] })
3613
+ ] })
3614
+ ] }),
3615
+ /* @__PURE__ */ jsx123(DemoSection, { id: "forms", title: "Forms", description: "Controlled-ready field primitives for enterprise CRUD, settings, onboarding and import flows.", children: /* @__PURE__ */ jsxs96(ResponsiveGrid, { min: "20rem", children: [
3616
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Fields", children: /* @__PURE__ */ jsxs96(Stack, { children: [
3617
+ /* @__PURE__ */ jsx123(FormField, { label: "Workspace name", hint: "Shown in the app shell", children: /* @__PURE__ */ jsx123(Input, { placeholder: "Tapiz Academy" }) }),
3618
+ /* @__PURE__ */ jsx123(FormField, { label: "Role", children: /* @__PURE__ */ jsxs96(Select, { children: [
3619
+ /* @__PURE__ */ jsx123("option", { children: "Teacher" }),
3620
+ /* @__PURE__ */ jsx123("option", { children: "Admin" })
3621
+ ] }) }),
3622
+ /* @__PURE__ */ jsx123(FormField, { label: "Notes", children: /* @__PURE__ */ jsx123(Textarea, { placeholder: "Internal note" }) })
3623
+ ] }) }),
3624
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Advanced inputs", children: /* @__PURE__ */ jsxs96(Stack, { children: [
3625
+ /* @__PURE__ */ jsx123(InputGroup, { prefix: "https://", suffix: ".tapiz.app", children: /* @__PURE__ */ jsx123(Input, { placeholder: "school" }) }),
3626
+ /* @__PURE__ */ jsx123(PasswordInput, { placeholder: "Password" }),
3627
+ /* @__PURE__ */ jsx123(Slider, { label: "Automation level", valueLabel: "72%", defaultValue: 72 }),
3628
+ /* @__PURE__ */ jsx123(ToggleGroup, { value: "monthly", options: [{ label: "Monthly", value: "monthly" }, { label: "Yearly", value: "yearly" }] }),
3629
+ /* @__PURE__ */ jsx123(Switch, { label: "Enable notifications", checked: true }),
3630
+ /* @__PURE__ */ jsx123(Combobox, { placeholder: "Choose workspace", options: [{ value: "academy", label: "Academy" }, { value: "enterprise", label: "Enterprise" }] }),
3631
+ /* @__PURE__ */ jsx123(DateRangePicker, {}),
3632
+ /* @__PURE__ */ jsx123(ColorSwatchPicker, { value: "accent", options: [{ value: "accent", label: "Accent", color: "var(--tapiz-accent)" }, { value: "success", label: "Success", color: "var(--tapiz-success)" }, { value: "warning", label: "Warning", color: "var(--tapiz-warning)" }] }),
3633
+ /* @__PURE__ */ jsx123(RatingInput, { value: 4 })
3634
+ ] }) }),
3635
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Upload and text area", children: /* @__PURE__ */ jsxs96(Stack, { children: [
3636
+ /* @__PURE__ */ jsx123(FileDropzone, { title: "Import CSV", description: "Drag attendance data or click to browse." }),
3637
+ /* @__PURE__ */ jsx123(TextareaCounter, { maxLength: 120, value: "Reusable character-count textarea for messages and descriptions.", readOnly: true })
3638
+ ] }) })
3639
+ ] }) }),
3640
+ /* @__PURE__ */ jsxs96(DemoSection, { id: "data", title: "Data display", description: "Tables, charts, progress, metrics, filters and visual summaries for dense products.", children: [
3641
+ /* @__PURE__ */ jsx123(
3642
+ DataToolbar,
3643
+ {
3644
+ title: "Students",
3645
+ description: "Search, filter and operate on tabular data.",
3646
+ search: /* @__PURE__ */ jsx123(SearchInput, { placeholder: "Search students", value: "", onChange: () => void 0 }),
3647
+ filters: /* @__PURE__ */ jsxs96(Fragment5, { children: [
3648
+ /* @__PURE__ */ jsx123(FilterChip, { active: true, children: "Active" }),
3649
+ /* @__PURE__ */ jsx123(FilterChip, { children: "Grade 8" }),
3650
+ /* @__PURE__ */ jsx123(FilterChip, { children: "High score" })
3651
+ ] }),
3652
+ actions: /* @__PURE__ */ jsx123(Button, { size: "sm", children: "Export" }),
3653
+ className: "mb-4"
3654
+ }
3655
+ ),
3656
+ /* @__PURE__ */ jsx123(
3657
+ DataTable,
3658
+ {
3659
+ variant: "enterprise",
3660
+ data: demoRows,
3661
+ rowKey: (row) => row.id,
3662
+ columns: [
3663
+ { id: "student", header: "Student", cell: (row) => row.student, sortAccessor: (row) => row.student },
3664
+ { id: "status", header: "Status", cell: (row) => /* @__PURE__ */ jsx123(StatusBadge, { label: row.status, variant: row.status === "Active" ? "success" : row.status === "Pending" ? "pending" : "danger" }) },
3665
+ { id: "score", header: "Score", cell: (row) => `${row.score}%`, align: "right", sortAccessor: (row) => row.score }
3666
+ ]
3667
+ }
3668
+ ),
3669
+ /* @__PURE__ */ jsxs96(ResponsiveGrid, { min: "19rem", className: "mt-8", children: [
3670
+ /* @__PURE__ */ jsx123(MetricCard, { label: "Attendance", value: "96.4%", trend: "+4.2%", trendTone: "positive", description: "vs last month" }),
3671
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Bar list", children: /* @__PURE__ */ jsx123(BarList, { items: [{ label: "Quiz", value: 42 }, { label: "Attendance", value: 68 }, { label: "Assignments", value: 54 }] }) }),
3672
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Donut", children: /* @__PURE__ */ jsx123(DonutMetric, { value: 82, label: "Completion", caption: "Average across active classes" }) }),
3673
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Progress", children: /* @__PURE__ */ jsx123(Progress, { value: 64, label: "Migration" }) }),
3674
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Score ring", children: /* @__PURE__ */ jsx123(ScoreRing, { value: 88, label: "quality" }) }),
3675
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Heatmap", children: /* @__PURE__ */ jsx123(HeatmapGrid, { cells: Array.from({ length: 35 }, (_, index) => ({ value: index * 7 % 18, title: `Day ${index + 1}` })) }) }),
3676
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Funnel", children: /* @__PURE__ */ jsx123(FunnelChart, { steps: [{ label: "Visited", value: 1200 }, { label: "Started", value: 820 }, { label: "Completed", value: 540 }] }) }),
3677
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Comparison", children: /* @__PURE__ */ jsx123(ComparisonMeter, { leftLabel: "Manual", rightLabel: "Automated", value: 72 }) })
3678
+ ] })
3679
+ ] }),
3680
+ /* @__PURE__ */ jsx123(DemoSection, { id: "navigation", title: "Navigation and disclosure", description: "Application shell, nav bars, tabs, accordion, stepper and overlays.", children: /* @__PURE__ */ jsxs96(ResponsiveGrid, { min: "23rem", children: [
3681
+ /* @__PURE__ */ jsx123(SectionCard, { title: "App shell preview", children: /* @__PURE__ */ jsx123(
3682
+ AppShell,
3683
+ {
3684
+ sidebar: /* @__PURE__ */ jsx123(SidebarNav, { groups: [{ label: "Workspace", items: [{ label: "Dashboard", active: true }, { label: "Students" }, { label: "Reports" }] }] }),
3685
+ topbar: /* @__PURE__ */ jsx123(TopNav, { brand: "Tapiz", links: [{ label: "Docs", href: "#top" }] }),
3686
+ children: /* @__PURE__ */ jsx123("div", { className: "p-4 text-sm text-[var(--tapiz-text-muted)]", children: "Shell content slot" })
3687
+ }
3688
+ ) }),
3689
+ /* @__PURE__ */ jsxs96(SectionCard, { title: "Tabs and accordion", children: [
3690
+ /* @__PURE__ */ jsx123(Tabs, { activeId: "usage", variant: "boxed", items: [{ id: "usage", label: "Usage", content: "Use tabs for related panels." }, { id: "api", label: "API", content: "Prop-driven and typed." }] }),
3691
+ /* @__PURE__ */ jsx123(Accordion, { className: "mt-4", openIds: ["one"], items: [{ id: "one", title: "Token-first", content: "No raw hex colors in application code." }, { id: "two", title: "Accessible", content: "Keyboard-friendly primitives." }] })
3692
+ ] }),
3693
+ /* @__PURE__ */ jsxs96(SectionCard, { title: "Stepper / overlay states", children: [
3694
+ /* @__PURE__ */ jsx123(Stepper, { steps: [{ id: "create", label: "Create", status: "complete" }, { id: "configure", label: "Configure", status: "current" }, { id: "launch", label: "Launch", status: "upcoming" }] }),
3695
+ /* @__PURE__ */ jsxs96(Cluster, { className: "mt-4", children: [
3696
+ /* @__PURE__ */ jsx123(Popover, { trigger: /* @__PURE__ */ jsx123(Button, { size: "sm", children: "Popover" }), children: "Contextual content" }),
3697
+ /* @__PURE__ */ jsx123(Drawer, { open: false, title: "Drawer", children: "Drawer content" })
3698
+ ] }),
3699
+ /* @__PURE__ */ jsx123(CommandMenu, { open: false, groups: [{ label: "Actions", items: [{ id: "open-dashboard", label: "Open dashboard" }, { id: "create-class", label: "Create class" }] }] })
3700
+ ] })
3701
+ ] }) }),
3702
+ /* @__PURE__ */ jsx123(DemoSection, { id: "feedback", title: "Feedback", description: "Alerts, callouts, notifications, health states and loading overlays.", children: /* @__PURE__ */ jsxs96(ResponsiveGrid, { min: "22rem", children: [
3703
+ /* @__PURE__ */ jsx123(Alert2, { tone: "info", title: "Info alert", children: "Use for important inline messages." }),
3704
+ /* @__PURE__ */ jsx123(Callout, { tone: "warning", title: "Migration warning", children: "Review token usage before publishing." }),
3705
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Notifications", children: /* @__PURE__ */ jsx123(NotificationList, { items: [{ id: "1", title: "New import completed", description: "1,204 rows processed.", time: "2m", unread: true }, { id: "2", title: "Report ready", time: "1h" }] }) }),
3706
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Health", children: /* @__PURE__ */ jsxs96(Stack, { children: [
3707
+ /* @__PURE__ */ jsx123(HealthIndicator, { tone: "operational", detail: "99.99%" }),
3708
+ /* @__PURE__ */ jsx123(HealthIndicator, { tone: "degraded", detail: "API latency" }),
3709
+ /* @__PURE__ */ jsx123(HealthIndicator, { tone: "outage", detail: "1 service" }),
3710
+ /* @__PURE__ */ jsx123(InlineStatus, { tone: "success", pulse: true, children: "Realtime sync active" })
3711
+ ] }) }),
3712
+ /* @__PURE__ */ jsx123(LoadingOverlay, { visible: true, label: "Syncing", children: /* @__PURE__ */ jsx123("div", { className: "h-28 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]" }) })
3713
+ ] }) }),
3714
+ /* @__PURE__ */ jsxs96(DemoSection, { id: "framework", title: "Framework patterns", description: "Higher-level enterprise blocks for admin panels, permissions, integrations, calendars and workflows.", children: [
3715
+ /* @__PURE__ */ jsxs96(ResponsiveGrid, { min: "23rem", children: [
3716
+ /* @__PURE__ */ jsx123(ResourceCard, { title: "Classroom OS", eyebrow: "resource", description: "Reusable resource card for project, course, class or team entities.", status: "Live", meta: "Updated today" }),
3717
+ /* @__PURE__ */ jsx123(IntegrationCard, { name: "Google Classroom", description: "Sync rosters and assignments.", status: "connected", lastSync: "Synced 12m ago" }),
3718
+ /* @__PURE__ */ jsx123(AuditLog, { items: [{ actor: "Danijel", action: "updated permissions", timestamp: "09:42" }, { actor: "System", action: "synced attendance", timestamp: "09:30" }] })
3719
+ ] }),
3720
+ /* @__PURE__ */ jsx123(SplitPane, { className: "mt-8", primary: /* @__PURE__ */ jsx123(KanbanBoard, { columns: [{ id: "todo", title: "Todo", items: [{ id: "a", title: "Design docs page", tone: "accent" }] }, { id: "doing", title: "Doing", items: [{ id: "b", title: "Build components", tone: "warning" }] }, { id: "done", title: "Done", items: [{ id: "c", title: "Tokens", tone: "success" }] }] }), secondary: /* @__PURE__ */ jsx123(AccessMatrix, { roles: [{ key: "admin", label: "Admin" }, { key: "teacher", label: "Teacher" }], permissions: [{ key: "users", label: "Manage users", roles: { admin: true, teacher: false } }, { key: "classes", label: "Manage classes", roles: { admin: true, teacher: true } }] }) }),
3721
+ /* @__PURE__ */ jsx123(CalendarGrid, { className: "mt-8", days: calendarDays })
3722
+ ] }),
3723
+ /* @__PURE__ */ jsxs96(DemoSection, { id: "advanced", title: "Advanced framework blocks", description: "More product-grade patterns for operations, approvals, feature management, usage, rails and sticky controls.", children: [
3724
+ /* @__PURE__ */ jsx123(StickyBar, { className: "mb-6", children: /* @__PURE__ */ jsxs96(Cluster, { justify: "between", children: [
3725
+ /* @__PURE__ */ jsx123(InlineStatus, { tone: "info", children: "Previewing max component set" }),
3726
+ /* @__PURE__ */ jsx123(Button, { size: "sm", variant: "secondary", children: "Copy layout" })
3727
+ ] }) }),
3728
+ /* @__PURE__ */ jsx123(
3729
+ SplitPane,
3730
+ {
3731
+ primary: /* @__PURE__ */ jsxs96(Stack, { children: [
3732
+ /* @__PURE__ */ jsx123(ApprovalQueue, { items: [{ title: "Publish new grading rubric", requester: "Mila", priority: "high", description: "Requires admin approval before rollout." }, { title: "Invite external mentor", requester: "Vuk", priority: "medium" }] }),
3733
+ /* @__PURE__ */ jsx123(FeatureFlagTable, { flags: [{ key: "ai.quiz", name: "AI quiz generator", description: "Enable assisted quiz creation.", enabled: true, rollout: "80%" }, { key: "reports.v2", name: "Reports v2", description: "New analytics dashboard.", enabled: false, rollout: "Beta" }] })
3734
+ ] }),
3735
+ secondary: /* @__PURE__ */ jsx123(PageRail, { title: "Docs rail", items: [{ label: "Forms", href: "#forms", active: true, meta: "12" }, { label: "Data", href: "#data", meta: "9" }, { label: "Framework", href: "#framework", meta: "18" }] })
3736
+ }
3737
+ ),
3738
+ /* @__PURE__ */ jsxs96(ResponsiveGrid, { min: "22rem", className: "mt-8", children: [
3739
+ /* @__PURE__ */ jsx123(PlanUsage, { items: [{ label: "Seats", used: 128, limit: 200 }, { label: "Storage", used: 64, limit: 100 }, { label: "Automations", used: 18, limit: 25 }] }),
3740
+ /* @__PURE__ */ jsx123(SectionCard, { title: "SLA", children: /* @__PURE__ */ jsxs96(Stack, { children: [
3741
+ /* @__PURE__ */ jsx123(SLAStatus, { label: "API uptime", value: 99 }),
3742
+ /* @__PURE__ */ jsx123(SLAStatus, { label: "Queue latency", value: 91, target: 95 })
3743
+ ] }) }),
3744
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Inbox", children: /* @__PURE__ */ jsx123(InboxList, { items: [{ title: "Import completed", sender: "System", snippet: "Attendance import finished with 0 errors.", time: "2m", unread: true, tag: "Ops" }, { title: "Teacher request", sender: "Ana", snippet: "Needs access to Grade 8 workspace.", time: "1h" }] }) }),
3745
+ /* @__PURE__ */ jsx123(SectionCard, { title: "Activity", children: /* @__PURE__ */ jsx123(ActivityFeed, { items: [{ actor: "Danijel", action: "enabled Reports v2", time: "now" }, { actor: "System", action: "rotated API keys", time: "1h" }] }) })
3746
+ ] }),
3747
+ /* @__PURE__ */ jsx123(MasonryGrid, { columns: 3, className: "mt-8", children: ["Token contract", "Component variants", "Agent docs", "A11y states", "Dark mode", "Framework patterns"].map((item) => /* @__PURE__ */ jsxs96(Card, { variant: "brutal", className: "mb-5 break-inside-avoid", children: [
3748
+ /* @__PURE__ */ jsx123("div", { className: "kicker", children: "module" }),
3749
+ /* @__PURE__ */ jsx123("h3", { className: "mt-2 font-semibold", children: item })
3750
+ ] }, item)) })
3751
+ ] }),
3752
+ /* @__PURE__ */ jsxs96(DemoSection, { id: "marketing", title: "Marketing blocks", description: "Landing-page building blocks for SaaS, education and enterprise presentation pages.", children: [
3753
+ /* @__PURE__ */ jsx123(AnnouncementBar, { action: /* @__PURE__ */ jsx123(Button, { size: "sm", variant: "brutal", children: "Read changelog" }), children: "New Tapiz UI max component pack is available." }),
3754
+ /* @__PURE__ */ jsxs96(FeatureGrid, { children: [
3755
+ /* @__PURE__ */ jsx123(FeatureCard, { title: "Token architecture", description: "Centralized semantic tokens for consistent light/dark UI." }),
3756
+ /* @__PURE__ */ jsx123(FeatureCard, { title: "Framework blocks", description: "Move faster with app shell, tables, forms and overlays." }),
3757
+ /* @__PURE__ */ jsx123(FeatureCard, { title: "Brutal enterprise", description: "Strong borders, sharp rhythm and professional hierarchy." })
3758
+ ] }),
3759
+ /* @__PURE__ */ jsx123(StatsBand, { className: "mt-8", items: [{ value: "80+", label: "Components" }, { value: "2", label: "Themes" }, { value: "0", label: "App deps" }] }),
3760
+ /* @__PURE__ */ jsx123(LogoCloud, { className: "mt-8", title: "Works for product surfaces", items: [{ name: "Dashboard" }, { name: "Admin" }, { name: "Landing" }, { name: "Docs" }, { name: "Forms" }, { name: "Data" }] }),
3761
+ /* @__PURE__ */ jsxs96(ResponsiveGrid, { min: "20rem", className: "mt-8", children: [
3762
+ /* @__PURE__ */ jsx123(TestimonialCard, { quote: "Tapiz UI gives the product an instant enterprise backbone.", author: "Design Lead", role: "Tapiz Labs" }),
3763
+ /* @__PURE__ */ jsx123(PricingCard, { name: "Framework", price: "\u20AC0", highlighted: true, features: ["Token system", "Components", "Docs page"] }),
3764
+ /* @__PURE__ */ jsx123(ComparisonTable, { includedHeader: "Tapiz", alternativeHeader: "Ad-hoc UI", rows: [{ feature: "Light/dark", included: "Yes", alternative: "Manual" }, { feature: "Agent docs", included: "Included", alternative: "No" }] })
3765
+ ] }),
3766
+ /* @__PURE__ */ jsx123(RoadmapList, { className: "mt-8", items: [{ quarter: "Q1", title: "Core framework", status: "Done", description: "Shell, nav, forms and table primitives." }, { quarter: "Q2", title: "Analytics blocks", status: "Now", description: "Charts, status and operational views." }, { quarter: "Q3", title: "AI workflows", status: "Next", description: "Agent-ready docs and generated screens." }] }),
3767
+ /* @__PURE__ */ jsx123(FAQSection, { className: "mt-8", description: "Common framework usage questions.", items: [{ question: "Can this be used outside Tapiz?", answer: "Yes. Components are generic and token-driven." }, { question: "Does it require app router?", answer: "No. The package avoids app-specific dependencies." }] }),
3768
+ /* @__PURE__ */ jsx123(CTASection, { className: "mt-8", eyebrow: "Ready", title: "Build with Tapiz UI", description: "Copy this page into your docs app or export TapizDocsPage from the package.", actions: /* @__PURE__ */ jsx123(Button, { variant: "primary", children: "Use framework" }) })
3769
+ ] }),
3770
+ /* @__PURE__ */ jsx123(DemoSection, { id: "code", title: "Usage snippets", description: "Copyable examples for agents and developers.", children: /* @__PURE__ */ jsx123(CodeBlock, { language: "tsx", children: `import { TapizDocsPage } from "@tapizlabs/ui";
3771
+ import "@tapizlabs/ui/theme.css";
3772
+
3773
+ export default function Docs() {
3774
+ return <TapizDocsPage />;
3775
+ }` }) })
3776
+ ] })
3777
+ ] });
3778
+ }
2004
3779
  export {
3780
+ AccessMatrix,
3781
+ Accordion,
2005
3782
  ActionMenu,
2006
3783
  Activity,
3784
+ ActivityFeed,
2007
3785
  ActivityMenu,
2008
- Alert,
3786
+ Alert2 as Alert,
3787
+ AnnouncementBar,
3788
+ AppShell,
2009
3789
  AppleIcon,
3790
+ ApprovalQueue,
2010
3791
  ArrowLeft,
2011
3792
  ArrowRight,
3793
+ AuditLog,
3794
+ Avatar,
2012
3795
  Badge,
2013
3796
  Ban,
2014
3797
  BarChart,
3798
+ BarList,
2015
3799
  BaseModal,
2016
3800
  Bell,
2017
3801
  Book,
3802
+ Breadcrumbs,
2018
3803
  Button,
3804
+ CTASection,
2019
3805
  Calendar,
3806
+ CalendarGrid,
2020
3807
  CalendarMonth,
2021
3808
  CalendarWeek,
3809
+ Callout,
2022
3810
  Card,
2023
3811
  CardBody,
2024
3812
  CardHeader,
@@ -2032,15 +3820,28 @@ export {
2032
3820
  ChevronUp,
2033
3821
  Clipboard,
2034
3822
  Clock,
3823
+ Cluster,
3824
+ CodeBlock,
3825
+ ColorSwatchPicker,
3826
+ Combobox,
3827
+ CommandMenu,
2035
3828
  Compare,
3829
+ ComparisonMeter,
3830
+ ComparisonTable,
2036
3831
  ConfirmDialog,
3832
+ Container,
2037
3833
  Copy,
2038
3834
  Cpu,
2039
3835
  CreditCard,
2040
3836
  DataTable,
3837
+ DataToolbar,
2041
3838
  Database,
3839
+ DateRangePicker,
2042
3840
  DefaultErrorFallback,
3841
+ Divider,
3842
+ DonutMetric,
2043
3843
  Download,
3844
+ Drawer,
2044
3845
  Edit,
2045
3846
  EmptyState,
2046
3847
  ErrorBoundary,
@@ -2048,15 +3849,23 @@ export {
2048
3849
  ExternalLink,
2049
3850
  Eye,
2050
3851
  EyeOff,
3852
+ FAQSection,
2051
3853
  Faculty,
3854
+ FeatureCard,
3855
+ FeatureFlagTable,
3856
+ FeatureGrid,
2052
3857
  FieldHint,
2053
3858
  FieldLabel,
3859
+ FileDropzone,
2054
3860
  FileText,
2055
3861
  FileUpload,
3862
+ FilterChip,
2056
3863
  FingerprintIcon,
2057
3864
  FormError,
3865
+ FormField,
2058
3866
  FormIcon,
2059
3867
  FormulaIcon,
3868
+ FunnelChart,
2060
3869
  Gear,
2061
3870
  Globe,
2062
3871
  GooglePlayIcon,
@@ -2065,70 +3874,118 @@ export {
2065
3874
  GridBg,
2066
3875
  HardDrive,
2067
3876
  Hash,
3877
+ HealthIndicator,
3878
+ HeatmapGrid,
2068
3879
  HelpCircle,
3880
+ HeroFrame,
2069
3881
  History,
2070
3882
  Home,
2071
3883
  Icons,
2072
3884
  Image,
3885
+ InboxList,
2073
3886
  Info,
2074
3887
  InfoBanner,
3888
+ InlineStatus,
2075
3889
  Input,
3890
+ InputGroup,
3891
+ IntegrationCard,
2076
3892
  Intersect,
3893
+ KanbanBoard,
3894
+ Kbd,
3895
+ KeyValueList,
2077
3896
  Layers,
3897
+ LoadingOverlay,
2078
3898
  LockIcon,
2079
3899
  LogOut,
3900
+ LogoCloud,
2080
3901
  LogoMark,
2081
3902
  Mail,
3903
+ MarketingShell,
3904
+ MasonryGrid,
2082
3905
  Megaphone,
2083
3906
  Menu,
3907
+ MetricCard,
3908
+ MockupFrame,
2084
3909
  Monitor,
2085
3910
  Moon,
2086
3911
  NavAnalytics,
2087
3912
  NavQrAttendance,
2088
3913
  NavScoresheet,
2089
3914
  NavSecurity,
3915
+ NotificationList,
2090
3916
  NumberIcon,
2091
3917
  OfficeHours,
2092
3918
  PageHeader,
3919
+ PageRail,
2093
3920
  PageSpinner,
2094
3921
  Pagination,
3922
+ PasswordInput,
2095
3923
  Pdf,
3924
+ PlanUsage,
2096
3925
  Plus,
3926
+ Popover,
3927
+ PricingCard,
2097
3928
  Printer,
3929
+ Progress,
2098
3930
  QrCode,
2099
3931
  RadioButton,
3932
+ RatingInput,
2100
3933
  Refresh,
2101
3934
  RefreshCw,
2102
3935
  Repeat,
2103
3936
  Report,
3937
+ ResourceCard,
3938
+ ResponsiveGrid,
3939
+ RoadmapList,
2104
3940
  RotateCcw,
3941
+ SLAStatus,
2105
3942
  Scan,
3943
+ ScoreRing,
2106
3944
  Search,
2107
3945
  SearchInput,
3946
+ SectionCard,
2108
3947
  SectionIcons,
2109
3948
  SectionTitle,
2110
3949
  Select,
2111
3950
  Server,
2112
3951
  Shield,
3952
+ SidebarNav,
2113
3953
  Skeleton,
2114
3954
  SkeletonBanner,
2115
3955
  SkeletonCard,
2116
3956
  SkeletonKpiCard,
2117
3957
  SkeletonPageHeader,
2118
3958
  SkeletonTable,
3959
+ Slider,
2119
3960
  Smartphone,
3961
+ Sparkline,
2120
3962
  Spinner,
3963
+ SplitPane,
2121
3964
  Spotlight,
3965
+ Stack,
2122
3966
  Star,
3967
+ StatGrid,
3968
+ StatsBand,
2123
3969
  StatusBadge,
3970
+ Stepper,
3971
+ StickyBar,
2124
3972
  Sun,
3973
+ Surface,
3974
+ Switch,
2125
3975
  Table,
2126
3976
  Tablet,
3977
+ Tabs,
3978
+ TapizDocsPage,
3979
+ TestimonialCard,
2127
3980
  TextIcon,
2128
3981
  Textarea,
3982
+ TextareaCounter,
3983
+ Timeline,
2129
3984
  Toast,
2130
3985
  ToastProvider,
3986
+ ToggleGroup,
2131
3987
  Tooltip,
3988
+ TopNav,
2132
3989
  Trash,
2133
3990
  Trophy,
2134
3991
  TwoFAIcon,
@@ -2141,6 +3998,7 @@ export {
2141
3998
  Users,
2142
3999
  X,
2143
4000
  Zap,
4001
+ tapizFrameworkPresets,
2144
4002
  useToast
2145
4003
  };
2146
4004
  //# sourceMappingURL=index.js.map