@tapizlabs/ui 0.2.10 → 0.2.12
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.d.ts +19 -4
- package/dist/index.js +575 -505
- package/dist/index.js.map +1 -1
- package/dist/theme.css +58 -5
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -237,6 +237,18 @@ var ExternalLink = ({ size = 14, className, style }) => /* @__PURE__ */ jsxs2("s
|
|
|
237
237
|
/* @__PURE__ */ jsx2("polyline", { points: "15 3 21 3 21 9" }),
|
|
238
238
|
/* @__PURE__ */ jsx2("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
|
|
239
239
|
] });
|
|
240
|
+
var GitHubIcon = ({ size = 14, className, style }) => /* @__PURE__ */ jsx2(
|
|
241
|
+
"svg",
|
|
242
|
+
{
|
|
243
|
+
width: size,
|
|
244
|
+
height: size,
|
|
245
|
+
viewBox: "0 0 24 24",
|
|
246
|
+
fill: "currentColor",
|
|
247
|
+
style,
|
|
248
|
+
className,
|
|
249
|
+
children: /* @__PURE__ */ jsx2("path", { d: "M12 .5C5.37.5 0 5.87 0 12.5c0 5.3 3.44 9.8 8.2 11.38.6.11.82-.26.82-.58 0-.29-.01-1.04-.02-2.05-3.34.73-4.04-1.61-4.04-1.61-.55-1.38-1.33-1.75-1.33-1.75-1.09-.74.08-.73.08-.73 1.2.09 1.84 1.24 1.84 1.24 1.08 1.84 2.81 1.31 3.49 1 .11-.78.42-1.31.76-1.61-2.67-.31-5.47-1.33-5.47-5.93 0-1.31.47-2.39 1.24-3.23-.12-.3-.54-1.54.12-3.2 0 0 1.01-.32 3.3 1.23a11.38 11.38 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.66 1.66.24 2.9.12 3.2.77.84 1.23 1.92 1.23 3.23 0 4.61-2.8 5.62-5.48 5.92.43.37.82 1.1.82 2.21 0 1.6-.01 2.88-.01 3.27 0 .32.21.7.83.58A12.01 12.01 0 0 0 24 12.5C24 5.87 18.63.5 12 .5Z" })
|
|
250
|
+
}
|
|
251
|
+
);
|
|
240
252
|
var Image = ({ size = 14, className, style }) => /* @__PURE__ */ jsxs2("svg", { ...base(null, size, style), className, children: [
|
|
241
253
|
/* @__PURE__ */ jsx2("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", ry: "2" }),
|
|
242
254
|
/* @__PURE__ */ jsx2("circle", { cx: "8.5", cy: "8.5", r: "1.5" }),
|
|
@@ -498,85 +510,122 @@ var LogoMark = ({
|
|
|
498
510
|
bgClassName,
|
|
499
511
|
bgFill = "#1496b3",
|
|
500
512
|
bgOpacity = 1,
|
|
513
|
+
tone: tone2 = "solid",
|
|
501
514
|
variant = "lms"
|
|
502
|
-
}) =>
|
|
503
|
-
"
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
] }),
|
|
516
|
-
variant === "boards" && /* @__PURE__ */ jsxs6("g", { fill: "#fff", children: [
|
|
517
|
-
/* @__PURE__ */ jsx6("rect", { x: "13", y: "15", width: "10", height: "26", rx: "5" }),
|
|
518
|
-
/* @__PURE__ */ jsx6("rect", { x: "27", y: "15", width: "10", height: "34", rx: "5" }),
|
|
519
|
-
/* @__PURE__ */ jsx6("rect", { x: "41", y: "15", width: "10", height: "20", rx: "5" })
|
|
520
|
-
] }),
|
|
521
|
-
variant === "playground" && /* @__PURE__ */ jsxs6(Fragment, { children: [
|
|
522
|
-
/* @__PURE__ */ jsxs6("g", { fill: "#fff", children: [
|
|
523
|
-
/* @__PURE__ */ jsx6("rect", { x: "13", y: "12", width: "38", height: "9", rx: "3" }),
|
|
524
|
-
/* @__PURE__ */ jsx6("rect", { x: "27", y: "12", width: "10", height: "30", rx: "3" })
|
|
525
|
-
] }),
|
|
526
|
-
/* @__PURE__ */ jsx6(
|
|
527
|
-
"path",
|
|
528
|
-
{
|
|
529
|
-
d: "M16 46 L23 51 L16 56",
|
|
530
|
-
stroke: "#d4ff3a",
|
|
531
|
-
strokeWidth: "4.5",
|
|
532
|
-
strokeLinecap: "round",
|
|
533
|
-
strokeLinejoin: "round",
|
|
534
|
-
fill: "none"
|
|
535
|
-
}
|
|
536
|
-
),
|
|
537
|
-
/* @__PURE__ */ jsx6("rect", { x: "30", y: "52.5", width: "14", height: "4.5", rx: "2.25", fill: "#fff" })
|
|
538
|
-
] }),
|
|
539
|
-
variant === "whiteboard" && /* @__PURE__ */ jsxs6(Fragment, { children: [
|
|
540
|
-
/* @__PURE__ */ jsx6("rect", { x: "12", y: "15", width: "40", height: "28", rx: "4", fill: "#fff" }),
|
|
541
|
-
/* @__PURE__ */ jsx6(
|
|
542
|
-
"path",
|
|
543
|
-
{
|
|
544
|
-
d: "M19 35 C24 24, 30 24, 33 31 C35.5 37, 41 36, 45 27",
|
|
545
|
-
stroke: "#1496b3",
|
|
546
|
-
strokeWidth: "3.4",
|
|
547
|
-
strokeLinecap: "round",
|
|
548
|
-
strokeLinejoin: "round",
|
|
549
|
-
fill: "none"
|
|
550
|
-
}
|
|
551
|
-
),
|
|
552
|
-
/* @__PURE__ */ jsx6("circle", { cx: "19", cy: "35", r: "2.6", fill: "#1496b3" }),
|
|
553
|
-
/* @__PURE__ */ jsx6("circle", { cx: "45", cy: "27", r: "2.6", fill: "#d4ff3a" }),
|
|
554
|
-
/* @__PURE__ */ jsx6(
|
|
555
|
-
"path",
|
|
556
|
-
{
|
|
557
|
-
d: "M22 43 L19 51 M42 43 L45 51",
|
|
558
|
-
stroke: "#fff",
|
|
559
|
-
strokeWidth: "4",
|
|
560
|
-
strokeLinecap: "round"
|
|
561
|
-
}
|
|
562
|
-
)
|
|
563
|
-
] }),
|
|
564
|
-
variant === "cloud" && /* @__PURE__ */ jsxs6(Fragment, { children: [
|
|
515
|
+
}) => {
|
|
516
|
+
const outline = tone2 === "outline";
|
|
517
|
+
const glyph = outline ? "currentColor" : "#fff";
|
|
518
|
+
const accentDetail = outline ? bgFill : "#1496b3";
|
|
519
|
+
return /* @__PURE__ */ jsxs6(
|
|
520
|
+
"svg",
|
|
521
|
+
{
|
|
522
|
+
width: size,
|
|
523
|
+
height: size,
|
|
524
|
+
className,
|
|
525
|
+
viewBox: "0 0 64 64",
|
|
526
|
+
fill: "none",
|
|
527
|
+
children: [
|
|
565
528
|
/* @__PURE__ */ jsx6(
|
|
566
|
-
"
|
|
529
|
+
"rect",
|
|
567
530
|
{
|
|
568
|
-
|
|
569
|
-
|
|
531
|
+
width: "64",
|
|
532
|
+
height: "64",
|
|
533
|
+
rx: "14",
|
|
534
|
+
fill: outline ? "none" : bgFill,
|
|
535
|
+
opacity: outline ? 1 : bgOpacity,
|
|
536
|
+
stroke: outline ? "currentColor" : void 0,
|
|
537
|
+
strokeWidth: outline ? 4 : void 0,
|
|
538
|
+
className: bgClassName
|
|
570
539
|
}
|
|
571
540
|
),
|
|
572
|
-
/* @__PURE__ */ jsxs6("g", { fill:
|
|
573
|
-
/* @__PURE__ */ jsx6("rect", { x: "
|
|
574
|
-
/* @__PURE__ */ jsx6("rect", { x: "
|
|
541
|
+
variant === "lms" && /* @__PURE__ */ jsxs6("g", { fill: glyph, children: [
|
|
542
|
+
/* @__PURE__ */ jsx6("rect", { x: "14", y: "14", width: "36", height: "10", rx: "3" }),
|
|
543
|
+
/* @__PURE__ */ jsx6("rect", { x: "27", y: "14", width: "10", height: "36", rx: "3" })
|
|
544
|
+
] }),
|
|
545
|
+
variant === "boards" && /* @__PURE__ */ jsxs6("g", { fill: glyph, children: [
|
|
546
|
+
/* @__PURE__ */ jsx6("rect", { x: "13", y: "15", width: "10", height: "26", rx: "5" }),
|
|
547
|
+
/* @__PURE__ */ jsx6("rect", { x: "27", y: "15", width: "10", height: "34", rx: "5" }),
|
|
548
|
+
/* @__PURE__ */ jsx6("rect", { x: "41", y: "15", width: "10", height: "20", rx: "5" })
|
|
549
|
+
] }),
|
|
550
|
+
variant === "playground" && /* @__PURE__ */ jsxs6(Fragment, { children: [
|
|
551
|
+
/* @__PURE__ */ jsxs6("g", { fill: glyph, children: [
|
|
552
|
+
/* @__PURE__ */ jsx6("rect", { x: "13", y: "12", width: "38", height: "9", rx: "3" }),
|
|
553
|
+
/* @__PURE__ */ jsx6("rect", { x: "27", y: "12", width: "10", height: "30", rx: "3" })
|
|
554
|
+
] }),
|
|
555
|
+
/* @__PURE__ */ jsx6(
|
|
556
|
+
"path",
|
|
557
|
+
{
|
|
558
|
+
d: "M16 46 L23 51 L16 56",
|
|
559
|
+
stroke: "#d4ff3a",
|
|
560
|
+
strokeWidth: "4.5",
|
|
561
|
+
strokeLinecap: "round",
|
|
562
|
+
strokeLinejoin: "round",
|
|
563
|
+
fill: "none"
|
|
564
|
+
}
|
|
565
|
+
),
|
|
566
|
+
/* @__PURE__ */ jsx6("rect", { x: "30", y: "52.5", width: "14", height: "4.5", rx: "2.25", fill: glyph })
|
|
567
|
+
] }),
|
|
568
|
+
variant === "whiteboard" && /* @__PURE__ */ jsxs6(Fragment, { children: [
|
|
569
|
+
/* @__PURE__ */ jsx6("rect", { x: "12", y: "15", width: "40", height: "28", rx: "4", fill: glyph }),
|
|
570
|
+
/* @__PURE__ */ jsx6(
|
|
571
|
+
"path",
|
|
572
|
+
{
|
|
573
|
+
d: "M19 35 C24 24, 30 24, 33 31 C35.5 37, 41 36, 45 27",
|
|
574
|
+
stroke: accentDetail,
|
|
575
|
+
strokeWidth: "3.4",
|
|
576
|
+
strokeLinecap: "round",
|
|
577
|
+
strokeLinejoin: "round",
|
|
578
|
+
fill: "none"
|
|
579
|
+
}
|
|
580
|
+
),
|
|
581
|
+
/* @__PURE__ */ jsx6("circle", { cx: "19", cy: "35", r: "2.6", fill: accentDetail }),
|
|
582
|
+
/* @__PURE__ */ jsx6("circle", { cx: "45", cy: "27", r: "2.6", fill: "#d4ff3a" }),
|
|
583
|
+
/* @__PURE__ */ jsx6(
|
|
584
|
+
"path",
|
|
585
|
+
{
|
|
586
|
+
d: "M22 43 L19 51 M42 43 L45 51",
|
|
587
|
+
stroke: glyph,
|
|
588
|
+
strokeWidth: "4",
|
|
589
|
+
strokeLinecap: "round"
|
|
590
|
+
}
|
|
591
|
+
)
|
|
592
|
+
] }),
|
|
593
|
+
variant === "cloud" && /* @__PURE__ */ jsxs6(Fragment, { children: [
|
|
594
|
+
/* @__PURE__ */ jsx6(
|
|
595
|
+
"path",
|
|
596
|
+
{
|
|
597
|
+
fill: glyph,
|
|
598
|
+
d: "M23 45 q-4.6 0-7.8-3.2Q12 38.6 12 34 q0-3.95 2.5-7 2.5-3.05 6.4-3.83 1.05-4.25 4.6-6.91Q29.05 13.6 33.7 13.6 q5.75 0 9.78 3.9 4.03 3.9 4.22 9.52 3.26.29 5.38 2.69 2.12 2.4 2.12 5.63 0 3.58-2.56 6.11T46 47 H23Z"
|
|
599
|
+
}
|
|
600
|
+
),
|
|
601
|
+
/* @__PURE__ */ jsxs6("g", { fill: accentDetail, children: [
|
|
602
|
+
/* @__PURE__ */ jsx6("rect", { x: "25", y: "30", width: "16", height: "3.6", rx: "1.6" }),
|
|
603
|
+
/* @__PURE__ */ jsx6("rect", { x: "31.2", y: "30", width: "3.6", height: "12", rx: "1.6" })
|
|
604
|
+
] })
|
|
605
|
+
] }),
|
|
606
|
+
variant === "specs" && /* @__PURE__ */ jsxs6(Fragment, { children: [
|
|
607
|
+
/* @__PURE__ */ jsx6("rect", { x: "16", y: "12", width: "32", height: "40", rx: "4", fill: glyph }),
|
|
608
|
+
/* @__PURE__ */ jsxs6("g", { fill: accentDetail, children: [
|
|
609
|
+
/* @__PURE__ */ jsx6("rect", { x: "21", y: "19", width: "22", height: "3.4", rx: "1.7" }),
|
|
610
|
+
/* @__PURE__ */ jsx6("rect", { x: "21", y: "26", width: "22", height: "3.4", rx: "1.7" }),
|
|
611
|
+
/* @__PURE__ */ jsx6("rect", { x: "21", y: "33", width: "14", height: "3.4", rx: "1.7" })
|
|
612
|
+
] }),
|
|
613
|
+
/* @__PURE__ */ jsx6(
|
|
614
|
+
"path",
|
|
615
|
+
{
|
|
616
|
+
d: "M22 43 L26 47 L34 39",
|
|
617
|
+
stroke: "#d4ff3a",
|
|
618
|
+
strokeWidth: "4",
|
|
619
|
+
strokeLinecap: "round",
|
|
620
|
+
strokeLinejoin: "round",
|
|
621
|
+
fill: "none"
|
|
622
|
+
}
|
|
623
|
+
)
|
|
575
624
|
] })
|
|
576
|
-
]
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
625
|
+
]
|
|
626
|
+
}
|
|
627
|
+
);
|
|
628
|
+
};
|
|
580
629
|
|
|
581
630
|
// src/components/icons/FormsIcons.tsx
|
|
582
631
|
import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
@@ -1599,8 +1648,27 @@ function InfoBanner(props) {
|
|
|
1599
1648
|
);
|
|
1600
1649
|
}
|
|
1601
1650
|
|
|
1651
|
+
// src/components/shared/ThemeIconButton.tsx
|
|
1652
|
+
import { jsx as jsx33 } from "react/jsx-runtime";
|
|
1653
|
+
function ThemeIconButton({
|
|
1654
|
+
icon,
|
|
1655
|
+
className = "",
|
|
1656
|
+
type = "button",
|
|
1657
|
+
...props
|
|
1658
|
+
}) {
|
|
1659
|
+
return /* @__PURE__ */ jsx33(
|
|
1660
|
+
"button",
|
|
1661
|
+
{
|
|
1662
|
+
type,
|
|
1663
|
+
className: `inline-flex h-9 w-9 cursor-pointer items-center justify-center border-0 bg-transparent p-1.5 text-txt-3 transition-colors duration-150 hover:text-primary-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--tapiz-border-focus)] focus-visible:ring-offset-2 focus-visible:ring-offset-[color:var(--tapiz-bg-surface)] ${className}`.trim(),
|
|
1664
|
+
...props,
|
|
1665
|
+
children: /* @__PURE__ */ jsx33("span", { className: "inline-flex h-4 w-4 items-center justify-center", children: icon })
|
|
1666
|
+
}
|
|
1667
|
+
);
|
|
1668
|
+
}
|
|
1669
|
+
|
|
1602
1670
|
// src/components/shared/PageHeader.tsx
|
|
1603
|
-
import { jsx as
|
|
1671
|
+
import { jsx as jsx34, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
1604
1672
|
function PageHeader({
|
|
1605
1673
|
title,
|
|
1606
1674
|
subtitle,
|
|
@@ -1617,25 +1685,25 @@ function PageHeader({
|
|
|
1617
1685
|
const resolvedActions = actions ?? action;
|
|
1618
1686
|
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";
|
|
1619
1687
|
return /* @__PURE__ */ jsxs23("div", { className: `page-header mb-5 flex flex-col gap-3 animate-fade-in-up ${variantClass} ${className}`.trim(), children: [
|
|
1620
|
-
breadcrumbs ? /* @__PURE__ */
|
|
1688
|
+
breadcrumbs ? /* @__PURE__ */ jsx34("div", { className: "font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: breadcrumbs }) : null,
|
|
1621
1689
|
/* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [
|
|
1622
1690
|
/* @__PURE__ */ jsxs23("div", { className: "min-w-0", children: [
|
|
1623
|
-
subtitle ? /* @__PURE__ */
|
|
1691
|
+
subtitle ? /* @__PURE__ */ jsx34("div", { className: "kicker mb-1.5", children: subtitle }) : null,
|
|
1624
1692
|
/* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-2.5", children: [
|
|
1625
|
-
icon ? /* @__PURE__ */
|
|
1626
|
-
/* @__PURE__ */
|
|
1693
|
+
icon ? /* @__PURE__ */ jsx34("span", { className: "text-[var(--tapiz-accent)]", children: icon }) : null,
|
|
1694
|
+
/* @__PURE__ */ jsx34("h2", { className: "font-(--font-display) text-[22px] tracking-[-0.03em] text-[var(--tapiz-text-primary)] md:text-[26px]", children: title })
|
|
1627
1695
|
] }),
|
|
1628
|
-
description ? /* @__PURE__ */
|
|
1629
|
-
meta ? /* @__PURE__ */
|
|
1696
|
+
description ? /* @__PURE__ */ jsx34("div", { className: "mt-2 max-w-3xl text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null,
|
|
1697
|
+
meta ? /* @__PURE__ */ jsx34("div", { className: "mt-3 font-mono text-[11px] text-[var(--tapiz-text-disabled)]", children: meta }) : null
|
|
1630
1698
|
] }),
|
|
1631
|
-
resolvedActions ? /* @__PURE__ */
|
|
1699
|
+
resolvedActions ? /* @__PURE__ */ jsx34("div", { className: "flex shrink-0 flex-wrap gap-2", children: resolvedActions }) : null
|
|
1632
1700
|
] }),
|
|
1633
1701
|
banner ? banner : null
|
|
1634
1702
|
] });
|
|
1635
1703
|
}
|
|
1636
1704
|
|
|
1637
1705
|
// src/components/shared/MetricCard.tsx
|
|
1638
|
-
import { jsx as
|
|
1706
|
+
import { jsx as jsx35, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
1639
1707
|
var trendClasses = {
|
|
1640
1708
|
positive: "border-[var(--tapiz-success)] text-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
|
|
1641
1709
|
negative: "border-[var(--tapiz-danger)] text-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)]",
|
|
@@ -1655,22 +1723,22 @@ function MetricCard({
|
|
|
1655
1723
|
return /* @__PURE__ */ jsxs24(Card, { variant, padding: "md", hover: true, className: `relative overflow-hidden ${className}`, children: [
|
|
1656
1724
|
/* @__PURE__ */ jsxs24("div", { className: "flex items-start justify-between gap-4", children: [
|
|
1657
1725
|
/* @__PURE__ */ jsxs24("div", { className: "min-w-0", children: [
|
|
1658
|
-
/* @__PURE__ */
|
|
1659
|
-
/* @__PURE__ */
|
|
1726
|
+
/* @__PURE__ */ jsx35("p", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: label }),
|
|
1727
|
+
/* @__PURE__ */ jsx35("div", { className: "mt-2 font-display text-3xl font-semibold tracking-[-0.05em] text-[var(--tapiz-text-primary)]", children: value })
|
|
1660
1728
|
] }),
|
|
1661
|
-
icon ? /* @__PURE__ */
|
|
1729
|
+
icon ? /* @__PURE__ */ jsx35("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
|
|
1662
1730
|
] }),
|
|
1663
1731
|
description || trend ? /* @__PURE__ */ jsxs24("div", { className: "mt-4 flex flex-wrap items-center gap-2", children: [
|
|
1664
|
-
trend ? /* @__PURE__ */
|
|
1665
|
-
description ? /* @__PURE__ */
|
|
1732
|
+
trend ? /* @__PURE__ */ jsx35("span", { className: `inline-flex border px-2 py-0.5 font-mono text-[10px] font-bold uppercase tracking-widest ${trendClasses[trendTone]}`, children: trend }) : null,
|
|
1733
|
+
description ? /* @__PURE__ */ jsx35("p", { className: "text-xs text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
1666
1734
|
] }) : null
|
|
1667
1735
|
] });
|
|
1668
1736
|
}
|
|
1669
1737
|
|
|
1670
1738
|
// src/components/shared/StatGrid.tsx
|
|
1671
|
-
import { jsx as
|
|
1739
|
+
import { jsx as jsx36 } from "react/jsx-runtime";
|
|
1672
1740
|
function StatGrid({ children, className = "", minColumnWidth = "14rem" }) {
|
|
1673
|
-
return /* @__PURE__ */
|
|
1741
|
+
return /* @__PURE__ */ jsx36(
|
|
1674
1742
|
"div",
|
|
1675
1743
|
{
|
|
1676
1744
|
className: `grid gap-4 ${className}`,
|
|
@@ -1681,23 +1749,23 @@ function StatGrid({ children, className = "", minColumnWidth = "14rem" }) {
|
|
|
1681
1749
|
}
|
|
1682
1750
|
|
|
1683
1751
|
// src/components/shared/SectionCard.tsx
|
|
1684
|
-
import { jsx as
|
|
1752
|
+
import { jsx as jsx37, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
1685
1753
|
function SectionCard({ title, eyebrow, description, action, children, className = "" }) {
|
|
1686
1754
|
return /* @__PURE__ */ jsxs25(Card, { variant: "surface", padding: "none", className, children: [
|
|
1687
1755
|
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: [
|
|
1688
1756
|
/* @__PURE__ */ jsxs25("div", { className: "min-w-0", children: [
|
|
1689
|
-
eyebrow ? /* @__PURE__ */
|
|
1690
|
-
title ? /* @__PURE__ */
|
|
1691
|
-
description ? /* @__PURE__ */
|
|
1757
|
+
eyebrow ? /* @__PURE__ */ jsx37("div", { className: "kicker mb-1", children: eyebrow }) : null,
|
|
1758
|
+
title ? /* @__PURE__ */ jsx37("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
|
|
1759
|
+
description ? /* @__PURE__ */ jsx37("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
1692
1760
|
] }),
|
|
1693
|
-
action ? /* @__PURE__ */
|
|
1761
|
+
action ? /* @__PURE__ */ jsx37("div", { className: "shrink-0", children: action }) : null
|
|
1694
1762
|
] }) : null,
|
|
1695
|
-
/* @__PURE__ */
|
|
1763
|
+
/* @__PURE__ */ jsx37("div", { className: "p-5", children })
|
|
1696
1764
|
] });
|
|
1697
1765
|
}
|
|
1698
1766
|
|
|
1699
1767
|
// src/components/shared/SearchInput.tsx
|
|
1700
|
-
import { jsx as
|
|
1768
|
+
import { jsx as jsx38, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
1701
1769
|
function SearchInput({
|
|
1702
1770
|
value,
|
|
1703
1771
|
onChange,
|
|
@@ -1711,8 +1779,8 @@ function SearchInput({
|
|
|
1711
1779
|
...props
|
|
1712
1780
|
}) {
|
|
1713
1781
|
return /* @__PURE__ */ jsxs26("div", { className: `relative ${wrapperClassName}`.trim(), style: wrapperStyle, children: [
|
|
1714
|
-
/* @__PURE__ */
|
|
1715
|
-
/* @__PURE__ */
|
|
1782
|
+
/* @__PURE__ */ jsx38("span", { className: `pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 ${iconClassName}`.trim(), children: /* @__PURE__ */ jsx38(Search, { size: 15 }) }),
|
|
1783
|
+
/* @__PURE__ */ jsx38(
|
|
1716
1784
|
Input,
|
|
1717
1785
|
{
|
|
1718
1786
|
...props,
|
|
@@ -1723,21 +1791,21 @@ function SearchInput({
|
|
|
1723
1791
|
className: `pl-9 ${inputClassName}`.trim()
|
|
1724
1792
|
}
|
|
1725
1793
|
),
|
|
1726
|
-
clearable && value ? /* @__PURE__ */
|
|
1794
|
+
clearable && value ? /* @__PURE__ */ jsx38(
|
|
1727
1795
|
"button",
|
|
1728
1796
|
{
|
|
1729
1797
|
type: "button",
|
|
1730
1798
|
onClick: () => onChange(""),
|
|
1731
1799
|
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",
|
|
1732
1800
|
title: clearTitle,
|
|
1733
|
-
children: /* @__PURE__ */
|
|
1801
|
+
children: /* @__PURE__ */ jsx38(X, { size: 14 })
|
|
1734
1802
|
}
|
|
1735
1803
|
) : null
|
|
1736
1804
|
] });
|
|
1737
1805
|
}
|
|
1738
1806
|
|
|
1739
1807
|
// src/components/shared/Pagination.tsx
|
|
1740
|
-
import { jsx as
|
|
1808
|
+
import { jsx as jsx39, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
1741
1809
|
function getPageNumbers(page, totalPages) {
|
|
1742
1810
|
if (totalPages <= 7) return Array.from({ length: totalPages }, (_, i) => i + 1);
|
|
1743
1811
|
const pages = [1];
|
|
@@ -1762,7 +1830,7 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
|
|
|
1762
1830
|
const from = pageSize ? (page - 1) * pageSize + 1 : null;
|
|
1763
1831
|
const to = pageSize && totalItems ? Math.min(page * pageSize, totalItems) : null;
|
|
1764
1832
|
return /* @__PURE__ */ jsxs27("div", { className: "flex flex-col items-center justify-between gap-3 border-t border-border pt-3 sm:flex-row", children: [
|
|
1765
|
-
totalItems != null && from != null && to != null ? /* @__PURE__ */
|
|
1833
|
+
totalItems != null && from != null && to != null ? /* @__PURE__ */ jsx39("span", { className: "order-2 font-mono text-[12px] text-txt-4 sm:order-1", children: copy.showing({ from, to, total: totalItems }) }) : /* @__PURE__ */ jsx39("span", { className: "order-2 font-mono text-[11px] text-txt-4 sm:order-1", children: copy.page({ page, totalPages }) }),
|
|
1766
1834
|
/* @__PURE__ */ jsxs27("div", { className: "order-1 flex items-center gap-1 sm:order-2", children: [
|
|
1767
1835
|
/* @__PURE__ */ jsxs27(
|
|
1768
1836
|
"button",
|
|
@@ -1773,13 +1841,13 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
|
|
|
1773
1841
|
title: copy.prevTitle,
|
|
1774
1842
|
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",
|
|
1775
1843
|
children: [
|
|
1776
|
-
/* @__PURE__ */
|
|
1777
|
-
/* @__PURE__ */
|
|
1844
|
+
/* @__PURE__ */ jsx39(ChevronLeft, { size: 12 }),
|
|
1845
|
+
/* @__PURE__ */ jsx39("span", { className: "hidden sm:inline", children: copy.prev })
|
|
1778
1846
|
]
|
|
1779
1847
|
}
|
|
1780
1848
|
),
|
|
1781
|
-
/* @__PURE__ */
|
|
1782
|
-
(entry, index) => entry === "\u2026" ? /* @__PURE__ */
|
|
1849
|
+
/* @__PURE__ */ jsx39("div", { className: "flex items-center gap-1", children: pageNumbers.map(
|
|
1850
|
+
(entry, index) => entry === "\u2026" ? /* @__PURE__ */ jsx39("span", { className: "w-7 text-center font-mono text-[11px] text-txt-4", children: "\u2026" }, `ellipsis-${index}`) : /* @__PURE__ */ jsx39(
|
|
1783
1851
|
"button",
|
|
1784
1852
|
{
|
|
1785
1853
|
type: "button",
|
|
@@ -1799,8 +1867,8 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
|
|
|
1799
1867
|
title: copy.nextTitle,
|
|
1800
1868
|
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",
|
|
1801
1869
|
children: [
|
|
1802
|
-
/* @__PURE__ */
|
|
1803
|
-
/* @__PURE__ */
|
|
1870
|
+
/* @__PURE__ */ jsx39("span", { className: "hidden sm:inline", children: copy.next }),
|
|
1871
|
+
/* @__PURE__ */ jsx39(ChevronRight, { size: 12 })
|
|
1804
1872
|
]
|
|
1805
1873
|
}
|
|
1806
1874
|
)
|
|
@@ -1809,13 +1877,13 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
|
|
|
1809
1877
|
}
|
|
1810
1878
|
|
|
1811
1879
|
// src/components/shared/SectionTitle.tsx
|
|
1812
|
-
import { jsx as
|
|
1880
|
+
import { jsx as jsx40 } from "react/jsx-runtime";
|
|
1813
1881
|
function SectionTitle({ children, className = "" }) {
|
|
1814
|
-
return /* @__PURE__ */
|
|
1882
|
+
return /* @__PURE__ */ jsx40("h3", { className: `mb-1 text-sm font-semibold text-txt-1 ${className}`.trim(), children });
|
|
1815
1883
|
}
|
|
1816
1884
|
|
|
1817
1885
|
// src/components/shared/StatusBadge.tsx
|
|
1818
|
-
import { jsx as
|
|
1886
|
+
import { jsx as jsx41 } from "react/jsx-runtime";
|
|
1819
1887
|
var BASE = "inline-flex items-center border px-2 py-0.5 font-mono text-[9px] font-bold uppercase tracking-[0.15em]";
|
|
1820
1888
|
var variantStyles = {
|
|
1821
1889
|
default: "border-[var(--tapiz-border-strong)] text-[var(--tapiz-text-secondary)] bg-[var(--tapiz-bg-surface-muted)]",
|
|
@@ -1828,13 +1896,13 @@ var variantStyles = {
|
|
|
1828
1896
|
pending: "border-[var(--tapiz-text-muted)] text-[var(--tapiz-text-muted)] bg-transparent"
|
|
1829
1897
|
};
|
|
1830
1898
|
function StatusBadge({ label, variant = "default", className = "" }) {
|
|
1831
|
-
return /* @__PURE__ */
|
|
1899
|
+
return /* @__PURE__ */ jsx41("span", { className: `${BASE} ${variantStyles[variant]} ${className}`.trim(), children: label });
|
|
1832
1900
|
}
|
|
1833
1901
|
|
|
1834
1902
|
// src/components/shared/ActionMenu.tsx
|
|
1835
1903
|
import { useEffect as useEffect2, useLayoutEffect, useRef as useRef2, useState as useState5 } from "react";
|
|
1836
1904
|
import { createPortal as createPortal4 } from "react-dom";
|
|
1837
|
-
import { Fragment as Fragment2, jsx as
|
|
1905
|
+
import { Fragment as Fragment2, jsx as jsx42, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
1838
1906
|
var defaultMenuStyle = {
|
|
1839
1907
|
background: "var(--color-ink-200)",
|
|
1840
1908
|
border: "1px solid var(--color-border-hi)",
|
|
@@ -1919,8 +1987,8 @@ function ActionMenu({
|
|
|
1919
1987
|
};
|
|
1920
1988
|
}, [open]);
|
|
1921
1989
|
const menuNode = open && pos ? /* @__PURE__ */ jsxs28(Fragment2, { children: [
|
|
1922
|
-
/* @__PURE__ */
|
|
1923
|
-
/* @__PURE__ */
|
|
1990
|
+
/* @__PURE__ */ jsx42("div", { className: "fixed inset-0 z-9998", onClick: () => setOpen(false) }),
|
|
1991
|
+
/* @__PURE__ */ jsx42(
|
|
1924
1992
|
"div",
|
|
1925
1993
|
{
|
|
1926
1994
|
ref: menuRef,
|
|
@@ -1938,7 +2006,7 @@ function ActionMenu({
|
|
|
1938
2006
|
...menuStyle
|
|
1939
2007
|
},
|
|
1940
2008
|
children: items.map((item, index) => /* @__PURE__ */ jsxs28("div", { children: [
|
|
1941
|
-
index > 0 && item.danger ? /* @__PURE__ */
|
|
2009
|
+
index > 0 && item.danger ? /* @__PURE__ */ jsx42("div", { style: { borderTop: "1px solid var(--color-border)" } }) : null,
|
|
1942
2010
|
/* @__PURE__ */ jsxs28(
|
|
1943
2011
|
"button",
|
|
1944
2012
|
{
|
|
@@ -1951,8 +2019,8 @@ function ActionMenu({
|
|
|
1951
2019
|
item.onSelect();
|
|
1952
2020
|
},
|
|
1953
2021
|
children: [
|
|
1954
|
-
item.loading ? /* @__PURE__ */
|
|
1955
|
-
/* @__PURE__ */
|
|
2022
|
+
item.loading ? /* @__PURE__ */ jsx42(Spinner, { color: "text-[var(--color-txt-3)]" }) : /* @__PURE__ */ jsx42("span", { className: item.danger ? "shrink-0 text-warn" : "shrink-0 text-primary-300", children: item.icon }),
|
|
2023
|
+
/* @__PURE__ */ jsx42("span", { children: item.label })
|
|
1956
2024
|
]
|
|
1957
2025
|
}
|
|
1958
2026
|
)
|
|
@@ -1961,13 +2029,13 @@ function ActionMenu({
|
|
|
1961
2029
|
)
|
|
1962
2030
|
] }) : null;
|
|
1963
2031
|
return /* @__PURE__ */ jsxs28("div", { ref: btnRef, className: fullWidth ? "relative w-full" : "relative inline-block max-w-full", children: [
|
|
1964
|
-
/* @__PURE__ */
|
|
2032
|
+
/* @__PURE__ */ jsx42(
|
|
1965
2033
|
Button,
|
|
1966
2034
|
{
|
|
1967
2035
|
size: buttonSize,
|
|
1968
2036
|
variant: buttonVariant,
|
|
1969
2037
|
icon,
|
|
1970
|
-
iconRight: /* @__PURE__ */
|
|
2038
|
+
iconRight: /* @__PURE__ */ jsx42(ChevronDown, { size: 11 }),
|
|
1971
2039
|
onClick: () => setOpen((value) => !value),
|
|
1972
2040
|
className: buttonClassName,
|
|
1973
2041
|
fullWidth,
|
|
@@ -1983,7 +2051,7 @@ import { useMemo as useMemo2, useState as useState6 } from "react";
|
|
|
1983
2051
|
|
|
1984
2052
|
// src/components/table/DataTableRow.tsx
|
|
1985
2053
|
import { memo } from "react";
|
|
1986
|
-
import { jsx as
|
|
2054
|
+
import { jsx as jsx43, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
1987
2055
|
var ALIGN_CLASS = {
|
|
1988
2056
|
left: "text-left",
|
|
1989
2057
|
center: "text-center",
|
|
@@ -1997,7 +2065,7 @@ function DataTableRowInner({ row, columns, onRowClick, rowActions, densityCellCl
|
|
|
1997
2065
|
onClick: clickable ? () => onRowClick?.(row) : void 0,
|
|
1998
2066
|
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" : ""}`,
|
|
1999
2067
|
children: [
|
|
2000
|
-
columns.map((column) => /* @__PURE__ */
|
|
2068
|
+
columns.map((column) => /* @__PURE__ */ jsx43(
|
|
2001
2069
|
"td",
|
|
2002
2070
|
{
|
|
2003
2071
|
className: `${densityCellClass} text-xs text-[var(--tapiz-text-secondary)] ${ALIGN_CLASS[column.align ?? "left"]} ${column.className ?? ""}`,
|
|
@@ -2005,7 +2073,7 @@ function DataTableRowInner({ row, columns, onRowClick, rowActions, densityCellCl
|
|
|
2005
2073
|
},
|
|
2006
2074
|
column.id
|
|
2007
2075
|
)),
|
|
2008
|
-
rowActions !== void 0 && /* @__PURE__ */
|
|
2076
|
+
rowActions !== void 0 && /* @__PURE__ */ jsx43("td", { className: `${densityCellClass} text-right`, children: rowActions(row) })
|
|
2009
2077
|
]
|
|
2010
2078
|
}
|
|
2011
2079
|
);
|
|
@@ -2013,7 +2081,7 @@ function DataTableRowInner({ row, columns, onRowClick, rowActions, densityCellCl
|
|
|
2013
2081
|
var DataTableRow = memo(DataTableRowInner);
|
|
2014
2082
|
|
|
2015
2083
|
// src/components/table/DataTable.tsx
|
|
2016
|
-
import { jsx as
|
|
2084
|
+
import { jsx as jsx44, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
2017
2085
|
var ALIGN_CLASS2 = {
|
|
2018
2086
|
left: "text-left",
|
|
2019
2087
|
center: "text-center",
|
|
@@ -2082,17 +2150,17 @@ function DataTable({
|
|
|
2082
2150
|
className
|
|
2083
2151
|
].filter(Boolean).join(" ");
|
|
2084
2152
|
return /* @__PURE__ */ jsxs30("div", { className: wrapperClass, children: [
|
|
2085
|
-
mobileCard !== void 0 && /* @__PURE__ */
|
|
2153
|
+
mobileCard !== void 0 && /* @__PURE__ */ jsx44("div", { className: "md:hidden", children: isLoading ? Array.from({ length: loadingRows }).map((_, i) => /* @__PURE__ */ jsx44("div", { className: "h-16 animate-pulse bg-ink-300" }, i)) : sortedData.length === 0 ? emptyState : sortedData.map((row) => /* @__PURE__ */ jsx44("div", { children: mobileCard(row) }, rowKey(row))) }),
|
|
2086
2154
|
/* @__PURE__ */ jsxs30("table", { className: tableClass, children: [
|
|
2087
|
-
/* @__PURE__ */
|
|
2155
|
+
/* @__PURE__ */ jsx44("thead", { children: /* @__PURE__ */ jsxs30("tr", { className: "border-b border-border bg-ink-300", children: [
|
|
2088
2156
|
columns.map((column) => {
|
|
2089
2157
|
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`;
|
|
2090
2158
|
if (!column.sortable || !column.sortAccessor) {
|
|
2091
|
-
return /* @__PURE__ */
|
|
2159
|
+
return /* @__PURE__ */ jsx44("th", { scope: "col", className: baseClass, children: column.header }, column.id);
|
|
2092
2160
|
}
|
|
2093
2161
|
const active = serverSort ? serverSort.field === column.id : sort?.columnId === column.id;
|
|
2094
2162
|
const direction = serverSort ? serverSort.dir : sort?.direction ?? "asc";
|
|
2095
|
-
return /* @__PURE__ */
|
|
2163
|
+
return /* @__PURE__ */ jsx44(
|
|
2096
2164
|
"th",
|
|
2097
2165
|
{
|
|
2098
2166
|
scope: "col",
|
|
@@ -2106,7 +2174,7 @@ function DataTable({
|
|
|
2106
2174
|
className: `inline-flex items-center gap-1 select-none transition-colors hover:text-txt-1 ${active ? "text-txt-1" : ""}`,
|
|
2107
2175
|
children: [
|
|
2108
2176
|
column.header,
|
|
2109
|
-
active && (direction === "asc" ? /* @__PURE__ */
|
|
2177
|
+
active && (direction === "asc" ? /* @__PURE__ */ jsx44(ChevronUp, { size: 12 }) : /* @__PURE__ */ jsx44(ChevronDown, { size: 12 }))
|
|
2110
2178
|
]
|
|
2111
2179
|
}
|
|
2112
2180
|
)
|
|
@@ -2114,9 +2182,9 @@ function DataTable({
|
|
|
2114
2182
|
column.id
|
|
2115
2183
|
);
|
|
2116
2184
|
}),
|
|
2117
|
-
hasActions && /* @__PURE__ */
|
|
2185
|
+
hasActions && /* @__PURE__ */ jsx44("th", { scope: "col", className: "px-3 py-2.5 text-right font-mono text-[11px] tracking-[.08em] text-txt-4 font-semibold whitespace-nowrap" })
|
|
2118
2186
|
] }) }),
|
|
2119
|
-
/* @__PURE__ */
|
|
2187
|
+
/* @__PURE__ */ jsx44("tbody", { children: isLoading ? Array.from({ length: loadingRows }).map((_, rowIndex) => /* @__PURE__ */ jsx44("tr", { className: "border-b border-[var(--tapiz-border-subtle)]", children: Array.from({ length: colCount }).map((__, colIndex) => /* @__PURE__ */ jsx44("td", { className: densityCellClass, children: /* @__PURE__ */ jsx44("div", { className: "h-4 w-24 animate-pulse bg-[var(--tapiz-bg-surface-muted)]" }) }, colIndex)) }, rowIndex)) : sortedData.length === 0 ? /* @__PURE__ */ jsx44("tr", { children: /* @__PURE__ */ jsx44("td", { colSpan: colCount, className: "px-4 py-10 text-center text-txt-4 text-sm font-mono", children: emptyState }) }) : sortedData.map((row) => /* @__PURE__ */ jsx44(
|
|
2120
2188
|
DataTableRow,
|
|
2121
2189
|
{
|
|
2122
2190
|
row,
|
|
@@ -2134,9 +2202,9 @@ function DataTable({
|
|
|
2134
2202
|
}
|
|
2135
2203
|
|
|
2136
2204
|
// src/components/marketing/MarketingShell.tsx
|
|
2137
|
-
import { jsx as
|
|
2205
|
+
import { jsx as jsx45 } from "react/jsx-runtime";
|
|
2138
2206
|
function MarketingShell({ children, className = "", grid = true, noise = true }) {
|
|
2139
|
-
return /* @__PURE__ */
|
|
2207
|
+
return /* @__PURE__ */ jsx45(
|
|
2140
2208
|
"main",
|
|
2141
2209
|
{
|
|
2142
2210
|
className: [
|
|
@@ -2151,93 +2219,93 @@ function MarketingShell({ children, className = "", grid = true, noise = true })
|
|
|
2151
2219
|
}
|
|
2152
2220
|
|
|
2153
2221
|
// src/components/marketing/HeroFrame.tsx
|
|
2154
|
-
import { jsx as
|
|
2222
|
+
import { jsx as jsx46, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2155
2223
|
function HeroFrame({ eyebrow, title, description, actions, visual, meta, className = "" }) {
|
|
2156
2224
|
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: [
|
|
2157
2225
|
/* @__PURE__ */ jsxs31("div", { className: "animate-fade-in-up", children: [
|
|
2158
|
-
eyebrow ? /* @__PURE__ */
|
|
2159
|
-
/* @__PURE__ */
|
|
2160
|
-
description ? /* @__PURE__ */
|
|
2161
|
-
actions ? /* @__PURE__ */
|
|
2162
|
-
meta ? /* @__PURE__ */
|
|
2226
|
+
eyebrow ? /* @__PURE__ */ jsx46("div", { className: "kicker mb-4", children: eyebrow }) : null,
|
|
2227
|
+
/* @__PURE__ */ jsx46("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 }),
|
|
2228
|
+
description ? /* @__PURE__ */ jsx46("p", { className: "mt-6 max-w-2xl text-base leading-7 text-[var(--tapiz-text-secondary)] md:text-lg", children: description }) : null,
|
|
2229
|
+
actions ? /* @__PURE__ */ jsx46("div", { className: "mt-8 flex flex-wrap gap-3", children: actions }) : null,
|
|
2230
|
+
meta ? /* @__PURE__ */ jsx46("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
|
|
2163
2231
|
] }),
|
|
2164
|
-
visual ? /* @__PURE__ */
|
|
2232
|
+
visual ? /* @__PURE__ */ jsx46("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
|
|
2165
2233
|
] });
|
|
2166
2234
|
}
|
|
2167
2235
|
|
|
2168
2236
|
// src/components/marketing/FeatureCard.tsx
|
|
2169
|
-
import { jsx as
|
|
2237
|
+
import { jsx as jsx47, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
2170
2238
|
function FeatureCard({ title, description, icon, eyebrow, children, className = "", variant = "surface" }) {
|
|
2171
2239
|
return /* @__PURE__ */ jsxs32(Card, { variant, hover: true, className: `group ${className}`, children: [
|
|
2172
2240
|
/* @__PURE__ */ jsxs32("div", { className: "flex items-start gap-4", children: [
|
|
2173
|
-
icon ? /* @__PURE__ */
|
|
2241
|
+
icon ? /* @__PURE__ */ jsx47("div", { className: "grid h-11 w-11 shrink-0 place-items-center border border-[var(--tapiz-border-strong)] bg-[var(--color-icon-bg)] text-[var(--tapiz-accent)] group-hover:translate-x-[-1px] group-hover:translate-y-[-1px]", children: icon }) : null,
|
|
2174
2242
|
/* @__PURE__ */ jsxs32("div", { className: "min-w-0", children: [
|
|
2175
|
-
eyebrow ? /* @__PURE__ */
|
|
2176
|
-
/* @__PURE__ */
|
|
2177
|
-
description ? /* @__PURE__ */
|
|
2243
|
+
eyebrow ? /* @__PURE__ */ jsx47("div", { className: "kicker mb-1", children: eyebrow }) : null,
|
|
2244
|
+
/* @__PURE__ */ jsx47("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: title }),
|
|
2245
|
+
description ? /* @__PURE__ */ jsx47("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
2178
2246
|
] })
|
|
2179
2247
|
] }),
|
|
2180
|
-
children ? /* @__PURE__ */
|
|
2248
|
+
children ? /* @__PURE__ */ jsx47("div", { className: "mt-5", children }) : null
|
|
2181
2249
|
] });
|
|
2182
2250
|
}
|
|
2183
2251
|
|
|
2184
2252
|
// src/components/marketing/FeatureGrid.tsx
|
|
2185
|
-
import { jsx as
|
|
2253
|
+
import { jsx as jsx48 } from "react/jsx-runtime";
|
|
2186
2254
|
function FeatureGrid({ children, className = "" }) {
|
|
2187
|
-
return /* @__PURE__ */
|
|
2255
|
+
return /* @__PURE__ */ jsx48("div", { className: `grid gap-4 md:grid-cols-2 xl:grid-cols-3 ${className}`, children });
|
|
2188
2256
|
}
|
|
2189
2257
|
|
|
2190
2258
|
// src/components/marketing/CTASection.tsx
|
|
2191
|
-
import { jsx as
|
|
2259
|
+
import { jsx as jsx49, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
2192
2260
|
function CTASection({ eyebrow, title, description, actions, className = "" }) {
|
|
2193
|
-
return /* @__PURE__ */
|
|
2194
|
-
eyebrow ? /* @__PURE__ */
|
|
2261
|
+
return /* @__PURE__ */ jsx49("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: [
|
|
2262
|
+
eyebrow ? /* @__PURE__ */ jsx49("div", { className: "kicker mb-3", children: eyebrow }) : null,
|
|
2195
2263
|
/* @__PURE__ */ jsxs33("div", { className: "grid gap-6 lg:grid-cols-[1fr_auto] lg:items-end", children: [
|
|
2196
2264
|
/* @__PURE__ */ jsxs33("div", { children: [
|
|
2197
|
-
/* @__PURE__ */
|
|
2198
|
-
description ? /* @__PURE__ */
|
|
2265
|
+
/* @__PURE__ */ jsx49("h2", { className: "max-w-3xl text-3xl font-semibold tracking-[-0.05em] md:text-5xl", children: title }),
|
|
2266
|
+
description ? /* @__PURE__ */ jsx49("p", { className: "mt-4 max-w-2xl text-base leading-7 text-[var(--tapiz-text-secondary)]", children: description }) : null
|
|
2199
2267
|
] }),
|
|
2200
|
-
actions ? /* @__PURE__ */
|
|
2268
|
+
actions ? /* @__PURE__ */ jsx49("div", { className: "flex flex-wrap gap-3", children: actions }) : null
|
|
2201
2269
|
] })
|
|
2202
2270
|
] }) });
|
|
2203
2271
|
}
|
|
2204
2272
|
|
|
2205
2273
|
// src/components/marketing/MockupFrame.tsx
|
|
2206
|
-
import { jsx as
|
|
2274
|
+
import { jsx as jsx50, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
2207
2275
|
function MockupFrame({ children, title, toolbar, className = "" }) {
|
|
2208
2276
|
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: [
|
|
2209
2277
|
/* @__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: [
|
|
2210
2278
|
/* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-1.5", children: [
|
|
2211
|
-
/* @__PURE__ */
|
|
2212
|
-
/* @__PURE__ */
|
|
2213
|
-
/* @__PURE__ */
|
|
2279
|
+
/* @__PURE__ */ jsx50("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-danger)]" }),
|
|
2280
|
+
/* @__PURE__ */ jsx50("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-warning)]" }),
|
|
2281
|
+
/* @__PURE__ */ jsx50("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-success)]" })
|
|
2214
2282
|
] }),
|
|
2215
|
-
title ? /* @__PURE__ */
|
|
2216
|
-
/* @__PURE__ */
|
|
2283
|
+
title ? /* @__PURE__ */ jsx50("div", { className: "font-mono text-[10px] uppercase tracking-widest text-[var(--tapiz-text-muted)]", children: title }) : null,
|
|
2284
|
+
/* @__PURE__ */ jsx50("div", { children: toolbar })
|
|
2217
2285
|
] }),
|
|
2218
|
-
/* @__PURE__ */
|
|
2286
|
+
/* @__PURE__ */ jsx50("div", { className: "p-4", children })
|
|
2219
2287
|
] });
|
|
2220
2288
|
}
|
|
2221
2289
|
|
|
2222
2290
|
// src/components/marketing/ComparisonTable.tsx
|
|
2223
|
-
import { jsx as
|
|
2291
|
+
import { jsx as jsx51, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
2224
2292
|
function ComparisonTable({ rows, featureHeader = "Feature", includedHeader = "Tapiz", alternativeHeader = "Other", className = "" }) {
|
|
2225
|
-
return /* @__PURE__ */
|
|
2226
|
-
/* @__PURE__ */
|
|
2227
|
-
/* @__PURE__ */
|
|
2228
|
-
/* @__PURE__ */
|
|
2229
|
-
/* @__PURE__ */
|
|
2293
|
+
return /* @__PURE__ */ jsx51("div", { className: `overflow-x-auto border border-[var(--tapiz-border-strong)] ${className}`, children: /* @__PURE__ */ jsxs35("table", { className: "w-full text-sm", children: [
|
|
2294
|
+
/* @__PURE__ */ jsx51("thead", { children: /* @__PURE__ */ jsxs35("tr", { children: [
|
|
2295
|
+
/* @__PURE__ */ jsx51("th", { className: "px-4 py-3 text-left", children: featureHeader }),
|
|
2296
|
+
/* @__PURE__ */ jsx51("th", { className: "px-4 py-3 text-left", children: includedHeader }),
|
|
2297
|
+
/* @__PURE__ */ jsx51("th", { className: "px-4 py-3 text-left", children: alternativeHeader })
|
|
2230
2298
|
] }) }),
|
|
2231
|
-
/* @__PURE__ */
|
|
2232
|
-
/* @__PURE__ */
|
|
2233
|
-
/* @__PURE__ */
|
|
2234
|
-
/* @__PURE__ */
|
|
2299
|
+
/* @__PURE__ */ jsx51("tbody", { children: rows.map((row, index) => /* @__PURE__ */ jsxs35("tr", { className: "border-t border-[var(--tapiz-border-subtle)]", children: [
|
|
2300
|
+
/* @__PURE__ */ jsx51("td", { className: "px-4 py-3 font-medium text-[var(--tapiz-text-primary)]", children: row.feature }),
|
|
2301
|
+
/* @__PURE__ */ jsx51("td", { className: "px-4 py-3 text-[var(--tapiz-text-secondary)]", children: row.included }),
|
|
2302
|
+
/* @__PURE__ */ jsx51("td", { className: "px-4 py-3 text-[var(--tapiz-text-muted)]", children: row.alternative })
|
|
2235
2303
|
] }, index)) })
|
|
2236
2304
|
] }) });
|
|
2237
2305
|
}
|
|
2238
2306
|
|
|
2239
2307
|
// src/components/layout/AppShell.tsx
|
|
2240
|
-
import { jsx as
|
|
2308
|
+
import { jsx as jsx52, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
2241
2309
|
var variantClasses4 = {
|
|
2242
2310
|
default: "bg-[var(--tapiz-bg-page)]",
|
|
2243
2311
|
grid: "bg-[var(--tapiz-bg-page)] tapiz-grid-bg",
|
|
@@ -2247,15 +2315,15 @@ function AppShell({ sidebar, topbar, children, aside, className = "", contentCla
|
|
|
2247
2315
|
return /* @__PURE__ */ jsxs36("div", { className: `min-h-screen text-[var(--tapiz-text-primary)] ${variantClasses4[variant]} ${className}`, children: [
|
|
2248
2316
|
topbar,
|
|
2249
2317
|
/* @__PURE__ */ jsxs36("div", { className: "mx-auto flex w-full max-w-[1600px]", children: [
|
|
2250
|
-
sidebar ? /* @__PURE__ */
|
|
2251
|
-
/* @__PURE__ */
|
|
2252
|
-
aside ? /* @__PURE__ */
|
|
2318
|
+
sidebar ? /* @__PURE__ */ jsx52("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,
|
|
2319
|
+
/* @__PURE__ */ jsx52("main", { className: `min-w-0 flex-1 px-[var(--tapiz-space-page-x)] py-6 ${contentClassName}`, children }),
|
|
2320
|
+
aside ? /* @__PURE__ */ jsx52("aside", { className: "hidden w-80 shrink-0 border-l border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] xl:block", children: aside }) : null
|
|
2253
2321
|
] })
|
|
2254
2322
|
] });
|
|
2255
2323
|
}
|
|
2256
2324
|
|
|
2257
2325
|
// src/components/layout/SplitPane.tsx
|
|
2258
|
-
import { jsx as
|
|
2326
|
+
import { jsx as jsx53, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
2259
2327
|
var ratios = {
|
|
2260
2328
|
"50/50": "lg:grid-cols-2",
|
|
2261
2329
|
"60/40": "lg:grid-cols-[minmax(0,3fr)_minmax(320px,2fr)]",
|
|
@@ -2263,48 +2331,48 @@ var ratios = {
|
|
|
2263
2331
|
};
|
|
2264
2332
|
function SplitPane({ primary, secondary, ratio = "60/40", reverseOnMobile = false, className = "" }) {
|
|
2265
2333
|
return /* @__PURE__ */ jsxs37("div", { className: `grid gap-5 ${ratios[ratio]} ${className}`, children: [
|
|
2266
|
-
/* @__PURE__ */
|
|
2267
|
-
/* @__PURE__ */
|
|
2334
|
+
/* @__PURE__ */ jsx53("div", { className: reverseOnMobile ? "order-2 lg:order-1" : "", children: primary }),
|
|
2335
|
+
/* @__PURE__ */ jsx53("div", { className: reverseOnMobile ? "order-1 lg:order-2" : "", children: secondary })
|
|
2268
2336
|
] });
|
|
2269
2337
|
}
|
|
2270
2338
|
|
|
2271
2339
|
// src/components/layout/Stack.tsx
|
|
2272
|
-
import { jsx as
|
|
2340
|
+
import { jsx as jsx54 } from "react/jsx-runtime";
|
|
2273
2341
|
var gapClasses = { xs: "gap-1", sm: "gap-2", md: "gap-4", lg: "gap-6", xl: "gap-8" };
|
|
2274
2342
|
var alignClasses = { start: "items-start", center: "items-center", end: "items-end", stretch: "items-stretch" };
|
|
2275
2343
|
var justifyClasses = { start: "justify-start", center: "justify-center", between: "justify-between", end: "justify-end" };
|
|
2276
2344
|
function Stack({ children, gap = "md", direction = "vertical", align = "stretch", justify = "start", wrap = false, className = "" }) {
|
|
2277
|
-
return /* @__PURE__ */
|
|
2345
|
+
return /* @__PURE__ */ jsx54("div", { className: `flex ${direction === "vertical" ? "flex-col" : "flex-row"} ${gapClasses[gap]} ${alignClasses[align]} ${justifyClasses[justify]} ${wrap ? "flex-wrap" : ""} ${className}`, children });
|
|
2278
2346
|
}
|
|
2279
2347
|
|
|
2280
2348
|
// src/components/layout/Cluster.tsx
|
|
2281
|
-
import { jsx as
|
|
2349
|
+
import { jsx as jsx55 } from "react/jsx-runtime";
|
|
2282
2350
|
var gapClasses2 = { xs: "gap-1", sm: "gap-2", md: "gap-3", lg: "gap-5" };
|
|
2283
2351
|
var alignClasses2 = { start: "items-start", center: "items-center", end: "items-end" };
|
|
2284
2352
|
var justifyClasses2 = { start: "justify-start", center: "justify-center", between: "justify-between", end: "justify-end" };
|
|
2285
2353
|
function Cluster({ children, gap = "sm", align = "center", justify = "start", className = "" }) {
|
|
2286
|
-
return /* @__PURE__ */
|
|
2354
|
+
return /* @__PURE__ */ jsx55("div", { className: `flex flex-wrap ${gapClasses2[gap]} ${alignClasses2[align]} ${justifyClasses2[justify]} ${className}`, children });
|
|
2287
2355
|
}
|
|
2288
2356
|
|
|
2289
2357
|
// src/components/navigation/Breadcrumbs.tsx
|
|
2290
|
-
import { jsx as
|
|
2358
|
+
import { jsx as jsx56, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
2291
2359
|
function Breadcrumbs({ items, separator = "/", className = "" }) {
|
|
2292
|
-
return /* @__PURE__ */
|
|
2293
|
-
index > 0 ? /* @__PURE__ */
|
|
2294
|
-
item.href && !item.current ? /* @__PURE__ */
|
|
2360
|
+
return /* @__PURE__ */ jsx56("nav", { "aria-label": "Breadcrumb", className: `font-mono text-[10px] uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)] ${className}`, children: /* @__PURE__ */ jsx56("ol", { className: "flex flex-wrap items-center gap-2", children: items.map((item, index) => /* @__PURE__ */ jsxs38("li", { className: "flex items-center gap-2", children: [
|
|
2361
|
+
index > 0 ? /* @__PURE__ */ jsx56("span", { "aria-hidden": "true", className: "text-[var(--tapiz-text-disabled)]", children: separator }) : null,
|
|
2362
|
+
item.href && !item.current ? /* @__PURE__ */ jsx56("a", { className: "hover:text-[var(--tapiz-accent)]", href: item.href, children: item.label }) : /* @__PURE__ */ jsx56("span", { "aria-current": item.current ? "page" : void 0, className: item.current ? "text-[var(--tapiz-text-primary)]" : "", children: item.label })
|
|
2295
2363
|
] }, index)) }) });
|
|
2296
2364
|
}
|
|
2297
2365
|
|
|
2298
2366
|
// src/components/navigation/SidebarNav.tsx
|
|
2299
|
-
import { Fragment as Fragment3, jsx as
|
|
2367
|
+
import { Fragment as Fragment3, jsx as jsx57, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
2300
2368
|
function SidebarNav({ groups, header, footer, className = "" }) {
|
|
2301
2369
|
return /* @__PURE__ */ jsxs39("div", { className: `flex h-full min-h-screen flex-col bg-[var(--tapiz-bg-surface)] ${className}`, children: [
|
|
2302
|
-
header ? /* @__PURE__ */
|
|
2303
|
-
/* @__PURE__ */
|
|
2304
|
-
group.label ? /* @__PURE__ */
|
|
2305
|
-
/* @__PURE__ */
|
|
2370
|
+
header ? /* @__PURE__ */ jsx57("div", { className: "border-b border-[var(--tapiz-border-subtle)] p-4", children: header }) : null,
|
|
2371
|
+
/* @__PURE__ */ jsx57("nav", { className: "flex-1 space-y-6 p-3", children: groups.map((group, groupIndex) => /* @__PURE__ */ jsxs39("div", { children: [
|
|
2372
|
+
group.label ? /* @__PURE__ */ jsx57("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,
|
|
2373
|
+
/* @__PURE__ */ jsx57("div", { className: "space-y-1", children: group.items.map((item, itemIndex) => /* @__PURE__ */ jsx57(SidebarNavLink, { item }, itemIndex)) })
|
|
2306
2374
|
] }, groupIndex)) }),
|
|
2307
|
-
footer ? /* @__PURE__ */
|
|
2375
|
+
footer ? /* @__PURE__ */ jsx57("div", { className: "border-t border-[var(--tapiz-border-subtle)] p-4", children: footer }) : null
|
|
2308
2376
|
] });
|
|
2309
2377
|
}
|
|
2310
2378
|
function SidebarNavLink({ item }) {
|
|
@@ -2314,28 +2382,28 @@ function SidebarNavLink({ item }) {
|
|
|
2314
2382
|
item.disabled ? "pointer-events-none opacity-40" : ""
|
|
2315
2383
|
].filter(Boolean).join(" ");
|
|
2316
2384
|
const content = /* @__PURE__ */ jsxs39(Fragment3, { children: [
|
|
2317
|
-
item.icon ? /* @__PURE__ */
|
|
2318
|
-
/* @__PURE__ */
|
|
2319
|
-
item.badge ? /* @__PURE__ */
|
|
2385
|
+
item.icon ? /* @__PURE__ */ jsx57("span", { className: "grid size-5 place-items-center text-[var(--tapiz-text-muted)]", children: item.icon }) : null,
|
|
2386
|
+
/* @__PURE__ */ jsx57("span", { className: "min-w-0 flex-1 truncate", children: item.label }),
|
|
2387
|
+
item.badge ? /* @__PURE__ */ jsx57("span", { children: item.badge }) : null
|
|
2320
2388
|
] });
|
|
2321
|
-
return item.href ? /* @__PURE__ */
|
|
2389
|
+
return item.href ? /* @__PURE__ */ jsx57("a", { className, href: item.href, children: content }) : /* @__PURE__ */ jsx57("button", { type: "button", className, onClick: item.onClick, disabled: item.disabled, children: content });
|
|
2322
2390
|
}
|
|
2323
2391
|
|
|
2324
2392
|
// src/components/navigation/TopNav.tsx
|
|
2325
|
-
import { jsx as
|
|
2393
|
+
import { jsx as jsx58, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
2326
2394
|
function TopNav({ brand, links = [], actions, className = "", sticky = true }) {
|
|
2327
|
-
return /* @__PURE__ */
|
|
2328
|
-
brand ? /* @__PURE__ */
|
|
2329
|
-
/* @__PURE__ */
|
|
2395
|
+
return /* @__PURE__ */ jsx58("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: [
|
|
2396
|
+
brand ? /* @__PURE__ */ jsx58("div", { className: "shrink-0", children: brand }) : null,
|
|
2397
|
+
/* @__PURE__ */ jsx58("nav", { className: "hidden items-center gap-1 md:flex", children: links.map((link, index) => {
|
|
2330
2398
|
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)]"}`;
|
|
2331
|
-
return link.href ? /* @__PURE__ */
|
|
2399
|
+
return link.href ? /* @__PURE__ */ jsx58("a", { href: link.href, className: cls, children: link.label }, index) : /* @__PURE__ */ jsx58("button", { type: "button", onClick: link.onClick, className: cls, children: link.label }, index);
|
|
2332
2400
|
}) }),
|
|
2333
|
-
actions ? /* @__PURE__ */
|
|
2401
|
+
actions ? /* @__PURE__ */ jsx58("div", { className: "ml-auto flex items-center gap-2", children: actions }) : null
|
|
2334
2402
|
] }) });
|
|
2335
2403
|
}
|
|
2336
2404
|
|
|
2337
2405
|
// src/components/disclosure/Tabs.tsx
|
|
2338
|
-
import { jsx as
|
|
2406
|
+
import { jsx as jsx59, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
2339
2407
|
var variants = {
|
|
2340
2408
|
line: "border-b border-[var(--tapiz-border-subtle)]",
|
|
2341
2409
|
boxed: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-1",
|
|
@@ -2344,7 +2412,7 @@ var variants = {
|
|
|
2344
2412
|
function Tabs({ items, activeId, onChange, className = "", variant = "line" }) {
|
|
2345
2413
|
const active = items.find((item) => item.id === activeId) ?? items[0];
|
|
2346
2414
|
return /* @__PURE__ */ jsxs41("div", { className, children: [
|
|
2347
|
-
/* @__PURE__ */
|
|
2415
|
+
/* @__PURE__ */ jsx59("div", { role: "tablist", className: `flex flex-wrap gap-1 ${variants[variant]}`, children: items.map((item) => {
|
|
2348
2416
|
const selected = item.id === active?.id;
|
|
2349
2417
|
return /* @__PURE__ */ jsxs41(
|
|
2350
2418
|
"button",
|
|
@@ -2363,14 +2431,14 @@ function Tabs({ items, activeId, onChange, className = "", variant = "line" }) {
|
|
|
2363
2431
|
item.id
|
|
2364
2432
|
);
|
|
2365
2433
|
}) }),
|
|
2366
|
-
/* @__PURE__ */
|
|
2434
|
+
/* @__PURE__ */ jsx59("div", { role: "tabpanel", className: "pt-4", children: active?.content })
|
|
2367
2435
|
] });
|
|
2368
2436
|
}
|
|
2369
2437
|
|
|
2370
2438
|
// src/components/disclosure/Accordion.tsx
|
|
2371
|
-
import { jsx as
|
|
2439
|
+
import { jsx as jsx60, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
2372
2440
|
function Accordion({ items, openIds = [], onToggle, className = "" }) {
|
|
2373
|
-
return /* @__PURE__ */
|
|
2441
|
+
return /* @__PURE__ */ jsx60("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) => {
|
|
2374
2442
|
const open = openIds.includes(item.id);
|
|
2375
2443
|
return /* @__PURE__ */ jsxs42("section", { children: [
|
|
2376
2444
|
/* @__PURE__ */ jsxs42(
|
|
@@ -2382,21 +2450,21 @@ function Accordion({ items, openIds = [], onToggle, className = "" }) {
|
|
|
2382
2450
|
onClick: () => onToggle?.(item.id),
|
|
2383
2451
|
className: "flex w-full items-center justify-between gap-4 px-4 py-3 text-left disabled:opacity-40",
|
|
2384
2452
|
children: [
|
|
2385
|
-
/* @__PURE__ */
|
|
2453
|
+
/* @__PURE__ */ jsx60("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
2386
2454
|
/* @__PURE__ */ jsxs42("span", { className: "flex items-center gap-3 text-[var(--tapiz-text-muted)]", children: [
|
|
2387
2455
|
item.meta,
|
|
2388
|
-
/* @__PURE__ */
|
|
2456
|
+
/* @__PURE__ */ jsx60("span", { "aria-hidden": "true", className: "font-mono text-lg", children: open ? "\u2212" : "+" })
|
|
2389
2457
|
] })
|
|
2390
2458
|
]
|
|
2391
2459
|
}
|
|
2392
2460
|
),
|
|
2393
|
-
open ? /* @__PURE__ */
|
|
2461
|
+
open ? /* @__PURE__ */ jsx60("div", { className: "border-t border-[var(--tapiz-border-subtle)] px-4 py-4 text-sm text-[var(--tapiz-text-secondary)]", children: item.content }) : null
|
|
2394
2462
|
] }, item.id);
|
|
2395
2463
|
}) });
|
|
2396
2464
|
}
|
|
2397
2465
|
|
|
2398
2466
|
// src/components/disclosure/Stepper.tsx
|
|
2399
|
-
import { jsx as
|
|
2467
|
+
import { jsx as jsx61, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
2400
2468
|
var tone = {
|
|
2401
2469
|
complete: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
|
|
2402
2470
|
current: "border-[var(--tapiz-accent)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-accent)]",
|
|
@@ -2404,65 +2472,65 @@ var tone = {
|
|
|
2404
2472
|
error: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]"
|
|
2405
2473
|
};
|
|
2406
2474
|
function Stepper({ steps, orientation = "horizontal", className = "" }) {
|
|
2407
|
-
return /* @__PURE__ */
|
|
2475
|
+
return /* @__PURE__ */ jsx61("ol", { className: `grid gap-3 ${orientation === "horizontal" ? "md:grid-cols-[repeat(auto-fit,minmax(0,1fr))]" : ""} ${className}`, children: steps.map((step, index) => {
|
|
2408
2476
|
const status = step.status ?? "upcoming";
|
|
2409
2477
|
return /* @__PURE__ */ jsxs43("li", { className: "flex gap-3", children: [
|
|
2410
|
-
/* @__PURE__ */
|
|
2478
|
+
/* @__PURE__ */ jsx61("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 }),
|
|
2411
2479
|
/* @__PURE__ */ jsxs43("span", { className: "min-w-0", children: [
|
|
2412
|
-
/* @__PURE__ */
|
|
2413
|
-
step.description ? /* @__PURE__ */
|
|
2480
|
+
/* @__PURE__ */ jsx61("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: step.label }),
|
|
2481
|
+
step.description ? /* @__PURE__ */ jsx61("span", { className: "mt-1 block text-xs text-[var(--tapiz-text-muted)]", children: step.description }) : null
|
|
2414
2482
|
] })
|
|
2415
2483
|
] }, step.id);
|
|
2416
2484
|
}) });
|
|
2417
2485
|
}
|
|
2418
2486
|
|
|
2419
2487
|
// src/components/overlays/Drawer.tsx
|
|
2420
|
-
import { jsx as
|
|
2488
|
+
import { jsx as jsx62, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
2421
2489
|
function Drawer({ open, onClose, title, description, children, footer, side = "right", className = "" }) {
|
|
2422
2490
|
if (!open) return null;
|
|
2423
2491
|
return /* @__PURE__ */ jsxs44("div", { className: "fixed inset-0 z-50", children: [
|
|
2424
|
-
/* @__PURE__ */
|
|
2492
|
+
/* @__PURE__ */ jsx62("button", { type: "button", "aria-label": "Close drawer", className: "absolute inset-0 bg-(--tapiz-bg-overlay)", onClick: onClose }),
|
|
2425
2493
|
/* @__PURE__ */ jsxs44("section", { className: `absolute top-0 h-full w-full max-w-md border-(--tapiz-border-strong) bg-(--tapiz-bg-surface) shadow-(--tapiz-shadow-lg) ${side === "right" ? "right-0 border-l" : "left-0 border-r"} ${className}`, children: [
|
|
2426
2494
|
/* @__PURE__ */ jsxs44("header", { className: "flex items-start justify-between gap-4 border-b border-(--tapiz-border-subtle) p-5", children: [
|
|
2427
2495
|
/* @__PURE__ */ jsxs44("div", { children: [
|
|
2428
|
-
title ? /* @__PURE__ */
|
|
2429
|
-
description ? /* @__PURE__ */
|
|
2496
|
+
title ? /* @__PURE__ */ jsx62("h2", { className: "text-lg font-semibold text-(--tapiz-text-primary)", children: title }) : null,
|
|
2497
|
+
description ? /* @__PURE__ */ jsx62("p", { className: "mt-1 text-sm text-(--tapiz-text-muted)", children: description }) : null
|
|
2430
2498
|
] }),
|
|
2431
|
-
/* @__PURE__ */
|
|
2499
|
+
/* @__PURE__ */ jsx62("button", { type: "button", onClick: onClose, className: "border border-(--tapiz-border-subtle) px-2 py-1 font-mono text-sm text-(--tapiz-text-muted) hover:text-(--tapiz-text-primary)", children: "\xD7" })
|
|
2432
2500
|
] }),
|
|
2433
|
-
/* @__PURE__ */
|
|
2434
|
-
footer ? /* @__PURE__ */
|
|
2501
|
+
/* @__PURE__ */ jsx62("div", { className: "max-h-[calc(100vh-9rem)] overflow-auto p-5", children }),
|
|
2502
|
+
footer ? /* @__PURE__ */ jsx62("footer", { className: "border-t border-(--tapiz-border-subtle) p-4", children: footer }) : null
|
|
2435
2503
|
] })
|
|
2436
2504
|
] });
|
|
2437
2505
|
}
|
|
2438
2506
|
|
|
2439
2507
|
// src/components/overlays/Popover.tsx
|
|
2440
|
-
import { jsx as
|
|
2508
|
+
import { jsx as jsx63, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
2441
2509
|
function Popover({ trigger, children, open = false, align = "start", className = "" }) {
|
|
2442
2510
|
return /* @__PURE__ */ jsxs45("div", { className: `relative inline-block ${className}`, children: [
|
|
2443
2511
|
trigger,
|
|
2444
|
-
open ? /* @__PURE__ */
|
|
2512
|
+
open ? /* @__PURE__ */ jsx63("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
|
|
2445
2513
|
] });
|
|
2446
2514
|
}
|
|
2447
2515
|
|
|
2448
2516
|
// src/components/overlays/CommandMenu.tsx
|
|
2449
|
-
import { jsx as
|
|
2517
|
+
import { jsx as jsx64, jsxs as jsxs46 } from "react/jsx-runtime";
|
|
2450
2518
|
function CommandMenu({ open, onClose, query = "", onQueryChange, groups, placeholder = "Search commands\u2026", empty = "No commands found." }) {
|
|
2451
2519
|
if (!open) return null;
|
|
2452
2520
|
const hasItems = groups.some((group) => group.items.length > 0);
|
|
2453
|
-
return /* @__PURE__ */
|
|
2454
|
-
/* @__PURE__ */
|
|
2521
|
+
return /* @__PURE__ */ jsx64("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: [
|
|
2522
|
+
/* @__PURE__ */ jsx64("div", { className: "border-b border-[var(--tapiz-border-subtle)] p-3", children: /* @__PURE__ */ jsx64(SearchInput, { value: query, onChange: (value) => onQueryChange?.(value), placeholder, autoFocus: true }) }),
|
|
2455
2523
|
/* @__PURE__ */ jsxs46("div", { className: "max-h-[50vh] overflow-auto p-2", children: [
|
|
2456
|
-
!hasItems ? /* @__PURE__ */
|
|
2524
|
+
!hasItems ? /* @__PURE__ */ jsx64("div", { className: "p-6 text-center text-sm text-[var(--tapiz-text-muted)]", children: empty }) : null,
|
|
2457
2525
|
groups.map((group, groupIndex) => /* @__PURE__ */ jsxs46("div", { className: "py-2", children: [
|
|
2458
|
-
group.label ? /* @__PURE__ */
|
|
2526
|
+
group.label ? /* @__PURE__ */ jsx64("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,
|
|
2459
2527
|
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: [
|
|
2460
|
-
item.icon ? /* @__PURE__ */
|
|
2528
|
+
item.icon ? /* @__PURE__ */ jsx64("span", { className: "grid size-8 place-items-center border border-[var(--tapiz-border-subtle)] text-[var(--tapiz-text-muted)]", children: item.icon }) : null,
|
|
2461
2529
|
/* @__PURE__ */ jsxs46("span", { className: "min-w-0 flex-1", children: [
|
|
2462
|
-
/* @__PURE__ */
|
|
2463
|
-
item.description ? /* @__PURE__ */
|
|
2530
|
+
/* @__PURE__ */ jsx64("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.label }),
|
|
2531
|
+
item.description ? /* @__PURE__ */ jsx64("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: item.description }) : null
|
|
2464
2532
|
] }),
|
|
2465
|
-
item.shortcut ? /* @__PURE__ */
|
|
2533
|
+
item.shortcut ? /* @__PURE__ */ jsx64("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.shortcut }) : null
|
|
2466
2534
|
] }, item.id))
|
|
2467
2535
|
] }, groupIndex))
|
|
2468
2536
|
] })
|
|
@@ -2470,7 +2538,7 @@ function CommandMenu({ open, onClose, query = "", onQueryChange, groups, placeho
|
|
|
2470
2538
|
}
|
|
2471
2539
|
|
|
2472
2540
|
// src/components/forms/FormField.tsx
|
|
2473
|
-
import { jsx as
|
|
2541
|
+
import { jsx as jsx65, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
2474
2542
|
function FormField({ label, hint, error, required, htmlFor, children, className = "" }) {
|
|
2475
2543
|
return /* @__PURE__ */ jsxs47("div", { className: `space-y-1.5 ${className}`, children: [
|
|
2476
2544
|
label ? /* @__PURE__ */ jsxs47(FieldLabel, { htmlFor, children: [
|
|
@@ -2478,15 +2546,15 @@ function FormField({ label, hint, error, required, htmlFor, children, className
|
|
|
2478
2546
|
required ? " *" : ""
|
|
2479
2547
|
] }) : null,
|
|
2480
2548
|
children,
|
|
2481
|
-
error ? /* @__PURE__ */
|
|
2549
|
+
error ? /* @__PURE__ */ jsx65(FormError, { message: String(error) }) : hint ? /* @__PURE__ */ jsx65(FieldHint, { children: hint }) : null
|
|
2482
2550
|
] });
|
|
2483
2551
|
}
|
|
2484
2552
|
|
|
2485
2553
|
// src/components/forms/Switch.tsx
|
|
2486
|
-
import { jsx as
|
|
2554
|
+
import { jsx as jsx66, jsxs as jsxs48 } from "react/jsx-runtime";
|
|
2487
2555
|
function Switch({ checked = false, onChange, disabled, label, description, className = "" }) {
|
|
2488
2556
|
return /* @__PURE__ */ jsxs48("label", { className: `flex cursor-pointer items-start gap-3 ${disabled ? "cursor-not-allowed opacity-50" : ""} ${className}`, children: [
|
|
2489
|
-
/* @__PURE__ */
|
|
2557
|
+
/* @__PURE__ */ jsx66(
|
|
2490
2558
|
"button",
|
|
2491
2559
|
{
|
|
2492
2560
|
type: "button",
|
|
@@ -2495,22 +2563,22 @@ function Switch({ checked = false, onChange, disabled, label, description, class
|
|
|
2495
2563
|
disabled,
|
|
2496
2564
|
onClick: () => onChange?.(!checked),
|
|
2497
2565
|
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)]"}`,
|
|
2498
|
-
children: /* @__PURE__ */
|
|
2566
|
+
children: /* @__PURE__ */ jsx66("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"}` })
|
|
2499
2567
|
}
|
|
2500
2568
|
),
|
|
2501
2569
|
label || description ? /* @__PURE__ */ jsxs48("span", { children: [
|
|
2502
|
-
label ? /* @__PURE__ */
|
|
2503
|
-
description ? /* @__PURE__ */
|
|
2570
|
+
label ? /* @__PURE__ */ jsx66("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: label }) : null,
|
|
2571
|
+
description ? /* @__PURE__ */ jsx66("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
2504
2572
|
] }) : null
|
|
2505
2573
|
] });
|
|
2506
2574
|
}
|
|
2507
2575
|
|
|
2508
2576
|
// src/components/forms/ToggleGroup.tsx
|
|
2509
|
-
import { jsx as
|
|
2577
|
+
import { jsx as jsx67 } from "react/jsx-runtime";
|
|
2510
2578
|
function ToggleGroup({ options, value, onChange, className = "", fullWidth = false }) {
|
|
2511
|
-
return /* @__PURE__ */
|
|
2579
|
+
return /* @__PURE__ */ jsx67("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) => {
|
|
2512
2580
|
const selected = option.value === value;
|
|
2513
|
-
return /* @__PURE__ */
|
|
2581
|
+
return /* @__PURE__ */ jsx67(
|
|
2514
2582
|
"button",
|
|
2515
2583
|
{
|
|
2516
2584
|
type: "button",
|
|
@@ -2525,17 +2593,17 @@ function ToggleGroup({ options, value, onChange, className = "", fullWidth = fal
|
|
|
2525
2593
|
}
|
|
2526
2594
|
|
|
2527
2595
|
// src/components/forms/InputGroup.tsx
|
|
2528
|
-
import { jsx as
|
|
2596
|
+
import { jsx as jsx68, jsxs as jsxs49 } from "react/jsx-runtime";
|
|
2529
2597
|
function InputGroup({ prefix, suffix, children, className = "" }) {
|
|
2530
2598
|
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: [
|
|
2531
|
-
prefix ? /* @__PURE__ */
|
|
2532
|
-
/* @__PURE__ */
|
|
2533
|
-
suffix ? /* @__PURE__ */
|
|
2599
|
+
prefix ? /* @__PURE__ */ jsx68("div", { className: "flex items-center border-r border-[var(--tapiz-border-subtle)] px-3 text-sm text-[var(--tapiz-text-muted)]", children: prefix }) : null,
|
|
2600
|
+
/* @__PURE__ */ jsx68("div", { className: "min-w-0 flex-1 [&_input]:border-0 [&_input]:shadow-none [&_input]:focus:shadow-none", children }),
|
|
2601
|
+
suffix ? /* @__PURE__ */ jsx68("div", { className: "flex items-center border-l border-[var(--tapiz-border-subtle)] px-3 text-sm text-[var(--tapiz-text-muted)]", children: suffix }) : null
|
|
2534
2602
|
] });
|
|
2535
2603
|
}
|
|
2536
2604
|
|
|
2537
2605
|
// src/components/feedback/Alert.tsx
|
|
2538
|
-
import { jsx as
|
|
2606
|
+
import { jsx as jsx69, jsxs as jsxs50 } from "react/jsx-runtime";
|
|
2539
2607
|
var toneClasses = {
|
|
2540
2608
|
info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)] text-[var(--tapiz-info)]",
|
|
2541
2609
|
success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
|
|
@@ -2545,17 +2613,17 @@ var toneClasses = {
|
|
|
2545
2613
|
};
|
|
2546
2614
|
function Alert2({ tone: tone2 = "info", title, children, icon, actions, className = "" }) {
|
|
2547
2615
|
return /* @__PURE__ */ jsxs50("div", { className: `flex gap-3 border p-4 ${toneClasses[tone2]} ${className}`, children: [
|
|
2548
|
-
icon ? /* @__PURE__ */
|
|
2616
|
+
icon ? /* @__PURE__ */ jsx69("div", { className: "mt-0.5 shrink-0", children: icon }) : null,
|
|
2549
2617
|
/* @__PURE__ */ jsxs50("div", { className: "min-w-0 flex-1", children: [
|
|
2550
|
-
title ? /* @__PURE__ */
|
|
2551
|
-
children ? /* @__PURE__ */
|
|
2618
|
+
title ? /* @__PURE__ */ jsx69("div", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
|
|
2619
|
+
children ? /* @__PURE__ */ jsx69("div", { className: "mt-1 text-sm text-[var(--tapiz-text-secondary)]", children }) : null
|
|
2552
2620
|
] }),
|
|
2553
|
-
actions ? /* @__PURE__ */
|
|
2621
|
+
actions ? /* @__PURE__ */ jsx69("div", { className: "shrink-0", children: actions }) : null
|
|
2554
2622
|
] });
|
|
2555
2623
|
}
|
|
2556
2624
|
|
|
2557
2625
|
// src/components/feedback/Progress.tsx
|
|
2558
|
-
import { jsx as
|
|
2626
|
+
import { jsx as jsx70, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
2559
2627
|
var tones = {
|
|
2560
2628
|
accent: "bg-[var(--tapiz-accent)]",
|
|
2561
2629
|
success: "bg-[var(--tapiz-success)]",
|
|
@@ -2566,32 +2634,32 @@ function Progress({ value, max = 100, label, showValue = false, tone: tone2 = "a
|
|
|
2566
2634
|
const percentage = Math.max(0, Math.min(100, value / max * 100));
|
|
2567
2635
|
return /* @__PURE__ */ jsxs51("div", { className, children: [
|
|
2568
2636
|
label || showValue ? /* @__PURE__ */ jsxs51("div", { className: "mb-1 flex items-center justify-between gap-3 text-xs text-[var(--tapiz-text-muted)]", children: [
|
|
2569
|
-
label ? /* @__PURE__ */
|
|
2637
|
+
label ? /* @__PURE__ */ jsx70("span", { children: label }) : /* @__PURE__ */ jsx70("span", {}),
|
|
2570
2638
|
showValue ? /* @__PURE__ */ jsxs51("span", { className: "font-mono", children: [
|
|
2571
2639
|
Math.round(percentage),
|
|
2572
2640
|
"%"
|
|
2573
2641
|
] }) : null
|
|
2574
2642
|
] }) : null,
|
|
2575
|
-
/* @__PURE__ */
|
|
2643
|
+
/* @__PURE__ */ jsx70("div", { className: "h-2 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx70("div", { className: `h-full ${tones[tone2]}`, style: { width: `${percentage}%` } }) })
|
|
2576
2644
|
] });
|
|
2577
2645
|
}
|
|
2578
2646
|
|
|
2579
2647
|
// src/components/shared/Avatar.tsx
|
|
2580
|
-
import { jsx as
|
|
2648
|
+
import { jsx as jsx71 } from "react/jsx-runtime";
|
|
2581
2649
|
var sizes = { xs: "size-6 text-[10px]", sm: "size-8 text-xs", md: "size-10 text-sm", lg: "size-14 text-base" };
|
|
2582
2650
|
function Avatar({ src, name = "?", size = "md", className = "" }) {
|
|
2583
2651
|
const initials = name.split(" ").filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase()).join("") || "?";
|
|
2584
|
-
return src ? /* @__PURE__ */
|
|
2652
|
+
return src ? /* @__PURE__ */ jsx71("img", { src, alt: name, className: `border border-[var(--tapiz-border-strong)] object-cover ${sizes[size]} ${className}` }) : /* @__PURE__ */ jsx71("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 });
|
|
2585
2653
|
}
|
|
2586
2654
|
|
|
2587
2655
|
// src/components/shared/Kbd.tsx
|
|
2588
|
-
import { jsx as
|
|
2656
|
+
import { jsx as jsx72 } from "react/jsx-runtime";
|
|
2589
2657
|
function Kbd({ children, className = "" }) {
|
|
2590
|
-
return /* @__PURE__ */
|
|
2658
|
+
return /* @__PURE__ */ jsx72("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 });
|
|
2591
2659
|
}
|
|
2592
2660
|
|
|
2593
2661
|
// src/components/shared/Timeline.tsx
|
|
2594
|
-
import { jsx as
|
|
2662
|
+
import { jsx as jsx73, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
2595
2663
|
var tones2 = {
|
|
2596
2664
|
neutral: "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-muted)]",
|
|
2597
2665
|
info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)] text-[var(--tapiz-info)]",
|
|
@@ -2600,53 +2668,53 @@ var tones2 = {
|
|
|
2600
2668
|
danger: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]"
|
|
2601
2669
|
};
|
|
2602
2670
|
function Timeline({ items, className = "" }) {
|
|
2603
|
-
return /* @__PURE__ */
|
|
2604
|
-
/* @__PURE__ */
|
|
2671
|
+
return /* @__PURE__ */ jsx73("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: [
|
|
2672
|
+
/* @__PURE__ */ jsx73("span", { className: `z-10 grid size-8 shrink-0 place-items-center border text-xs ${tones2[item.tone ?? "neutral"]}`, children: item.icon ?? "\u2022" }),
|
|
2605
2673
|
/* @__PURE__ */ jsxs52("span", { className: "min-w-0 flex-1 pb-2", children: [
|
|
2606
2674
|
/* @__PURE__ */ jsxs52("span", { className: "flex flex-wrap items-baseline justify-between gap-2", children: [
|
|
2607
|
-
/* @__PURE__ */
|
|
2608
|
-
item.time ? /* @__PURE__ */
|
|
2675
|
+
/* @__PURE__ */ jsx73("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
2676
|
+
item.time ? /* @__PURE__ */ jsx73("span", { className: "font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: item.time }) : null
|
|
2609
2677
|
] }),
|
|
2610
|
-
item.description ? /* @__PURE__ */
|
|
2678
|
+
item.description ? /* @__PURE__ */ jsx73("span", { className: "mt-1 block text-sm text-[var(--tapiz-text-secondary)]", children: item.description }) : null
|
|
2611
2679
|
] })
|
|
2612
2680
|
] }, item.id)) });
|
|
2613
2681
|
}
|
|
2614
2682
|
|
|
2615
2683
|
// src/components/shared/KeyValueList.tsx
|
|
2616
|
-
import { jsx as
|
|
2684
|
+
import { jsx as jsx74, jsxs as jsxs53 } from "react/jsx-runtime";
|
|
2617
2685
|
function KeyValueList({ items, className = "", density = "normal" }) {
|
|
2618
|
-
return /* @__PURE__ */
|
|
2619
|
-
/* @__PURE__ */
|
|
2686
|
+
return /* @__PURE__ */ jsx74("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: [
|
|
2687
|
+
/* @__PURE__ */ jsx74("dt", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: item.keyLabel }),
|
|
2620
2688
|
/* @__PURE__ */ jsxs53("dd", { children: [
|
|
2621
|
-
/* @__PURE__ */
|
|
2622
|
-
item.description ? /* @__PURE__ */
|
|
2689
|
+
/* @__PURE__ */ jsx74("div", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.value }),
|
|
2690
|
+
item.description ? /* @__PURE__ */ jsx74("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.description }) : null
|
|
2623
2691
|
] })
|
|
2624
2692
|
] }, index)) });
|
|
2625
2693
|
}
|
|
2626
2694
|
|
|
2627
2695
|
// src/components/shared/CodeBlock.tsx
|
|
2628
|
-
import { jsx as
|
|
2696
|
+
import { jsx as jsx75, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
2629
2697
|
function CodeBlock({ children, language, title, actions, className = "" }) {
|
|
2630
2698
|
return /* @__PURE__ */ jsxs54("figure", { className: `overflow-hidden border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
|
|
2631
2699
|
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: [
|
|
2632
|
-
/* @__PURE__ */
|
|
2700
|
+
/* @__PURE__ */ jsx75("span", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: title ?? language }),
|
|
2633
2701
|
actions
|
|
2634
2702
|
] }) : null,
|
|
2635
|
-
/* @__PURE__ */
|
|
2703
|
+
/* @__PURE__ */ jsx75("pre", { className: "overflow-auto p-4 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children: /* @__PURE__ */ jsx75("code", { children }) })
|
|
2636
2704
|
] });
|
|
2637
2705
|
}
|
|
2638
2706
|
|
|
2639
2707
|
// src/components/marketing/LogoCloud.tsx
|
|
2640
|
-
import { jsx as
|
|
2708
|
+
import { jsx as jsx76, jsxs as jsxs55 } from "react/jsx-runtime";
|
|
2641
2709
|
function LogoCloud({ title, items, className = "" }) {
|
|
2642
|
-
return /* @__PURE__ */
|
|
2643
|
-
title ? /* @__PURE__ */
|
|
2644
|
-
/* @__PURE__ */
|
|
2710
|
+
return /* @__PURE__ */ jsx76("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: [
|
|
2711
|
+
title ? /* @__PURE__ */ jsx76("p", { className: "mb-6 text-center font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: title }) : null,
|
|
2712
|
+
/* @__PURE__ */ jsx76("div", { className: "grid grid-cols-2 gap-3 md:grid-cols-4 lg:grid-cols-6", children: items.map((item) => /* @__PURE__ */ jsx76("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)) })
|
|
2645
2713
|
] }) });
|
|
2646
2714
|
}
|
|
2647
2715
|
|
|
2648
2716
|
// src/components/marketing/TestimonialCard.tsx
|
|
2649
|
-
import { jsx as
|
|
2717
|
+
import { jsx as jsx77, jsxs as jsxs56 } from "react/jsx-runtime";
|
|
2650
2718
|
function TestimonialCard({ quote, author, role, avatarSrc, className = "", variant = "surface" }) {
|
|
2651
2719
|
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: [
|
|
2652
2720
|
/* @__PURE__ */ jsxs56("blockquote", { className: "text-base leading-7 text-[var(--tapiz-text-secondary)]", children: [
|
|
@@ -2655,39 +2723,39 @@ function TestimonialCard({ quote, author, role, avatarSrc, className = "", varia
|
|
|
2655
2723
|
"\u201D"
|
|
2656
2724
|
] }),
|
|
2657
2725
|
/* @__PURE__ */ jsxs56("figcaption", { className: "mt-5 flex items-center gap-3", children: [
|
|
2658
|
-
/* @__PURE__ */
|
|
2726
|
+
/* @__PURE__ */ jsx77(Avatar, { name: author, src: avatarSrc, size: "sm" }),
|
|
2659
2727
|
/* @__PURE__ */ jsxs56("span", { children: [
|
|
2660
|
-
/* @__PURE__ */
|
|
2661
|
-
role ? /* @__PURE__ */
|
|
2728
|
+
/* @__PURE__ */ jsx77("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: author }),
|
|
2729
|
+
role ? /* @__PURE__ */ jsx77("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: role }) : null
|
|
2662
2730
|
] })
|
|
2663
2731
|
] })
|
|
2664
2732
|
] });
|
|
2665
2733
|
}
|
|
2666
2734
|
|
|
2667
2735
|
// src/components/marketing/PricingCard.tsx
|
|
2668
|
-
import { jsx as
|
|
2736
|
+
import { jsx as jsx78, jsxs as jsxs57 } from "react/jsx-runtime";
|
|
2669
2737
|
function PricingCard({ name, price, description, features = [], cta, highlighted = false, className = "" }) {
|
|
2670
2738
|
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: [
|
|
2671
2739
|
/* @__PURE__ */ jsxs57("div", { className: "flex-1", children: [
|
|
2672
|
-
/* @__PURE__ */
|
|
2673
|
-
description ? /* @__PURE__ */
|
|
2674
|
-
/* @__PURE__ */
|
|
2675
|
-
/* @__PURE__ */
|
|
2676
|
-
/* @__PURE__ */
|
|
2677
|
-
/* @__PURE__ */
|
|
2740
|
+
/* @__PURE__ */ jsx78("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: name }),
|
|
2741
|
+
description ? /* @__PURE__ */ jsx78("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null,
|
|
2742
|
+
/* @__PURE__ */ jsx78("div", { className: "mt-6 text-4xl font-semibold tracking-tight text-[var(--tapiz-text-primary)]", children: price }),
|
|
2743
|
+
/* @__PURE__ */ jsx78("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: [
|
|
2744
|
+
/* @__PURE__ */ jsx78("span", { className: "text-[var(--tapiz-success)]", children: "\u2713" }),
|
|
2745
|
+
/* @__PURE__ */ jsx78("span", { children: feature })
|
|
2678
2746
|
] }, index)) })
|
|
2679
2747
|
] }),
|
|
2680
|
-
/* @__PURE__ */
|
|
2748
|
+
/* @__PURE__ */ jsx78("div", { className: "mt-6", children: cta ?? /* @__PURE__ */ jsx78(Button, { variant: highlighted ? "primary" : "secondary", fullWidth: true, children: "Get started" }) })
|
|
2681
2749
|
] });
|
|
2682
2750
|
}
|
|
2683
2751
|
|
|
2684
2752
|
// src/components/marketing/StatsBand.tsx
|
|
2685
|
-
import { jsx as
|
|
2753
|
+
import { jsx as jsx79, jsxs as jsxs58 } from "react/jsx-runtime";
|
|
2686
2754
|
function StatsBand({ items, className = "" }) {
|
|
2687
|
-
return /* @__PURE__ */
|
|
2688
|
-
/* @__PURE__ */
|
|
2689
|
-
/* @__PURE__ */
|
|
2690
|
-
item.description ? /* @__PURE__ */
|
|
2755
|
+
return /* @__PURE__ */ jsx79("section", { className: `border-y border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-inverse)] text-[var(--tapiz-text-inverse)] ${className}`, children: /* @__PURE__ */ jsx79("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: [
|
|
2756
|
+
/* @__PURE__ */ jsx79("div", { className: "text-3xl font-semibold tracking-tight", children: item.value }),
|
|
2757
|
+
/* @__PURE__ */ jsx79("div", { className: "mt-2 font-mono text-[10px] font-bold uppercase tracking-[0.18em] opacity-70", children: item.label }),
|
|
2758
|
+
item.description ? /* @__PURE__ */ jsx79("div", { className: "mt-3 text-sm opacity-70", children: item.description }) : null
|
|
2691
2759
|
] }, index)) }) });
|
|
2692
2760
|
}
|
|
2693
2761
|
|
|
@@ -2726,7 +2794,7 @@ var tapizFrameworkPresets = {
|
|
|
2726
2794
|
};
|
|
2727
2795
|
|
|
2728
2796
|
// src/components/layout/Container.tsx
|
|
2729
|
-
import { jsx as
|
|
2797
|
+
import { jsx as jsx80 } from "react/jsx-runtime";
|
|
2730
2798
|
var sizeClasses2 = {
|
|
2731
2799
|
sm: "max-w-3xl",
|
|
2732
2800
|
md: "max-w-5xl",
|
|
@@ -2735,7 +2803,7 @@ var sizeClasses2 = {
|
|
|
2735
2803
|
full: "max-w-none"
|
|
2736
2804
|
};
|
|
2737
2805
|
function Container({ children, size = "lg", padded = true, className = "", style }) {
|
|
2738
|
-
return /* @__PURE__ */
|
|
2806
|
+
return /* @__PURE__ */ jsx80(
|
|
2739
2807
|
"div",
|
|
2740
2808
|
{
|
|
2741
2809
|
className: ["mx-auto w-full", sizeClasses2[size], padded ? "px-[var(--tapiz-space-page-x)]" : "", className].filter(Boolean).join(" "),
|
|
@@ -2746,7 +2814,7 @@ function Container({ children, size = "lg", padded = true, className = "", style
|
|
|
2746
2814
|
}
|
|
2747
2815
|
|
|
2748
2816
|
// src/components/layout/Surface.tsx
|
|
2749
|
-
import { jsx as
|
|
2817
|
+
import { jsx as jsx81 } from "react/jsx-runtime";
|
|
2750
2818
|
var variantClasses5 = {
|
|
2751
2819
|
canvas: "bg-[var(--tapiz-bg-page)] text-[var(--tapiz-text-primary)]",
|
|
2752
2820
|
surface: "bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-primary)]",
|
|
@@ -2763,7 +2831,7 @@ var paddingClasses2 = {
|
|
|
2763
2831
|
xl: "p-8"
|
|
2764
2832
|
};
|
|
2765
2833
|
function Surface({ children, variant = "surface", padding = "md", bordered = true, className = "", style }) {
|
|
2766
|
-
return /* @__PURE__ */
|
|
2834
|
+
return /* @__PURE__ */ jsx81(
|
|
2767
2835
|
"section",
|
|
2768
2836
|
{
|
|
2769
2837
|
className: [variantClasses5[variant], paddingClasses2[padding], bordered && variant !== "brutal" ? "border border-[var(--tapiz-border-subtle)]" : "", className].filter(Boolean).join(" "),
|
|
@@ -2774,23 +2842,23 @@ function Surface({ children, variant = "surface", padding = "md", bordered = tru
|
|
|
2774
2842
|
}
|
|
2775
2843
|
|
|
2776
2844
|
// src/components/layout/Divider.tsx
|
|
2777
|
-
import { jsx as
|
|
2845
|
+
import { jsx as jsx82, jsxs as jsxs59 } from "react/jsx-runtime";
|
|
2778
2846
|
function Divider({ orientation = "horizontal", label, className = "" }) {
|
|
2779
2847
|
if (orientation === "vertical") {
|
|
2780
|
-
return /* @__PURE__ */
|
|
2848
|
+
return /* @__PURE__ */ jsx82("div", { className: `mx-2 min-h-6 w-px bg-[var(--tapiz-border-subtle)] ${className}`, "aria-hidden": "true" });
|
|
2781
2849
|
}
|
|
2782
2850
|
if (label) {
|
|
2783
2851
|
return /* @__PURE__ */ jsxs59("div", { className: `flex items-center gap-3 ${className}`, children: [
|
|
2784
|
-
/* @__PURE__ */
|
|
2785
|
-
/* @__PURE__ */
|
|
2786
|
-
/* @__PURE__ */
|
|
2852
|
+
/* @__PURE__ */ jsx82("div", { className: "h-px flex-1 bg-[var(--tapiz-border-subtle)]" }),
|
|
2853
|
+
/* @__PURE__ */ jsx82("span", { className: "font-mono text-[10px] uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: label }),
|
|
2854
|
+
/* @__PURE__ */ jsx82("div", { className: "h-px flex-1 bg-[var(--tapiz-border-subtle)]" })
|
|
2787
2855
|
] });
|
|
2788
2856
|
}
|
|
2789
|
-
return /* @__PURE__ */
|
|
2857
|
+
return /* @__PURE__ */ jsx82("hr", { className: `border-[var(--tapiz-border-subtle)] ${className}` });
|
|
2790
2858
|
}
|
|
2791
2859
|
|
|
2792
2860
|
// src/components/layout/ResponsiveGrid.tsx
|
|
2793
|
-
import { jsx as
|
|
2861
|
+
import { jsx as jsx83 } from "react/jsx-runtime";
|
|
2794
2862
|
var gapClasses3 = {
|
|
2795
2863
|
sm: "gap-3",
|
|
2796
2864
|
md: "gap-4",
|
|
@@ -2798,7 +2866,7 @@ var gapClasses3 = {
|
|
|
2798
2866
|
xl: "gap-8"
|
|
2799
2867
|
};
|
|
2800
2868
|
function ResponsiveGrid({ children, min = "18rem", gap = "md", className = "", style }) {
|
|
2801
|
-
return /* @__PURE__ */
|
|
2869
|
+
return /* @__PURE__ */ jsx83(
|
|
2802
2870
|
"div",
|
|
2803
2871
|
{
|
|
2804
2872
|
className: `grid ${gapClasses3[gap]} ${className}`,
|
|
@@ -2809,7 +2877,7 @@ function ResponsiveGrid({ children, min = "18rem", gap = "md", className = "", s
|
|
|
2809
2877
|
}
|
|
2810
2878
|
|
|
2811
2879
|
// src/components/data-display/Sparkline.tsx
|
|
2812
|
-
import { jsx as
|
|
2880
|
+
import { jsx as jsx84, jsxs as jsxs60 } from "react/jsx-runtime";
|
|
2813
2881
|
function Sparkline({ values, width = 160, height = 48, label = "Trend", className = "", style }) {
|
|
2814
2882
|
const safeValues = values.length ? values : [0];
|
|
2815
2883
|
const min = Math.min(...safeValues);
|
|
@@ -2822,30 +2890,30 @@ function Sparkline({ values, width = 160, height = 48, label = "Trend", classNam
|
|
|
2822
2890
|
return `${x},${y}`;
|
|
2823
2891
|
}).join(" ");
|
|
2824
2892
|
return /* @__PURE__ */ jsxs60("svg", { className, style, width, height, viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": label, children: [
|
|
2825
|
-
/* @__PURE__ */
|
|
2826
|
-
/* @__PURE__ */
|
|
2893
|
+
/* @__PURE__ */ jsx84("polyline", { points, fill: "none", stroke: "var(--tapiz-accent)", strokeWidth: "2", strokeLinecap: "square", strokeLinejoin: "miter" }),
|
|
2894
|
+
/* @__PURE__ */ jsx84("line", { x1: "0", x2: width, y1: height - 1, y2: height - 1, stroke: "var(--tapiz-border-subtle)", strokeWidth: "1" })
|
|
2827
2895
|
] });
|
|
2828
2896
|
}
|
|
2829
2897
|
|
|
2830
2898
|
// src/components/data-display/BarList.tsx
|
|
2831
|
-
import { jsx as
|
|
2899
|
+
import { jsx as jsx85, jsxs as jsxs61 } from "react/jsx-runtime";
|
|
2832
2900
|
function BarList({ items, max, valueFormatter = (value) => value, className = "" }) {
|
|
2833
2901
|
const computedMax = max ?? Math.max(1, ...items.map((item) => item.value));
|
|
2834
|
-
return /* @__PURE__ */
|
|
2902
|
+
return /* @__PURE__ */ jsx85("div", { className: `space-y-3 ${className}`, children: items.map((item, index) => {
|
|
2835
2903
|
const percent = Math.max(0, Math.min(100, item.value / computedMax * 100));
|
|
2836
2904
|
return /* @__PURE__ */ jsxs61("div", { children: [
|
|
2837
2905
|
/* @__PURE__ */ jsxs61("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
|
|
2838
|
-
/* @__PURE__ */
|
|
2839
|
-
/* @__PURE__ */
|
|
2906
|
+
/* @__PURE__ */ jsx85("span", { className: "font-medium text-[var(--tapiz-text-secondary)]", children: item.label }),
|
|
2907
|
+
/* @__PURE__ */ jsx85("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: valueFormatter(item.value) })
|
|
2840
2908
|
] }),
|
|
2841
|
-
/* @__PURE__ */
|
|
2842
|
-
item.detail ? /* @__PURE__ */
|
|
2909
|
+
/* @__PURE__ */ jsx85("div", { className: "h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx85("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${percent}%` } }) }),
|
|
2910
|
+
item.detail ? /* @__PURE__ */ jsx85("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.detail }) : null
|
|
2843
2911
|
] }, index);
|
|
2844
2912
|
}) });
|
|
2845
2913
|
}
|
|
2846
2914
|
|
|
2847
2915
|
// src/components/data-display/DonutMetric.tsx
|
|
2848
|
-
import { jsx as
|
|
2916
|
+
import { jsx as jsx86, jsxs as jsxs62 } from "react/jsx-runtime";
|
|
2849
2917
|
function DonutMetric({ value, max = 100, label, caption, size = 112, className = "" }) {
|
|
2850
2918
|
const radius = 42;
|
|
2851
2919
|
const circumference = 2 * Math.PI * radius;
|
|
@@ -2853,8 +2921,8 @@ function DonutMetric({ value, max = 100, label, caption, size = 112, className =
|
|
|
2853
2921
|
const offset = circumference * (1 - ratio);
|
|
2854
2922
|
return /* @__PURE__ */ jsxs62("div", { className: `inline-flex items-center gap-4 ${className}`, children: [
|
|
2855
2923
|
/* @__PURE__ */ jsxs62("svg", { width: size, height: size, viewBox: "0 0 112 112", role: "img", "aria-label": `${Math.round(ratio * 100)}%`, children: [
|
|
2856
|
-
/* @__PURE__ */
|
|
2857
|
-
/* @__PURE__ */
|
|
2924
|
+
/* @__PURE__ */ jsx86("circle", { cx: "56", cy: "56", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
|
|
2925
|
+
/* @__PURE__ */ jsx86(
|
|
2858
2926
|
"circle",
|
|
2859
2927
|
{
|
|
2860
2928
|
cx: "56",
|
|
@@ -2875,14 +2943,14 @@ function DonutMetric({ value, max = 100, label, caption, size = 112, className =
|
|
|
2875
2943
|
] })
|
|
2876
2944
|
] }),
|
|
2877
2945
|
label || caption ? /* @__PURE__ */ jsxs62("div", { children: [
|
|
2878
|
-
label ? /* @__PURE__ */
|
|
2879
|
-
caption ? /* @__PURE__ */
|
|
2946
|
+
label ? /* @__PURE__ */ jsx86("div", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: label }) : null,
|
|
2947
|
+
caption ? /* @__PURE__ */ jsx86("div", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: caption }) : null
|
|
2880
2948
|
] }) : null
|
|
2881
2949
|
] });
|
|
2882
2950
|
}
|
|
2883
2951
|
|
|
2884
2952
|
// src/components/data-display/FilterChip.tsx
|
|
2885
|
-
import { jsx as
|
|
2953
|
+
import { jsx as jsx87, jsxs as jsxs63 } from "react/jsx-runtime";
|
|
2886
2954
|
function FilterChip({ children, active = false, onRemove, className = "" }) {
|
|
2887
2955
|
return /* @__PURE__ */ jsxs63(
|
|
2888
2956
|
"span",
|
|
@@ -2894,56 +2962,56 @@ function FilterChip({ children, active = false, onRemove, className = "" }) {
|
|
|
2894
2962
|
].join(" "),
|
|
2895
2963
|
children: [
|
|
2896
2964
|
children,
|
|
2897
|
-
onRemove ? /* @__PURE__ */
|
|
2965
|
+
onRemove ? /* @__PURE__ */ jsx87("button", { type: "button", onClick: onRemove, className: "text-[var(--tapiz-text-muted)] hover:text-[var(--tapiz-danger)]", "aria-label": "Remove filter", children: "\xD7" }) : null
|
|
2898
2966
|
]
|
|
2899
2967
|
}
|
|
2900
2968
|
);
|
|
2901
2969
|
}
|
|
2902
2970
|
|
|
2903
2971
|
// src/components/data-display/DataToolbar.tsx
|
|
2904
|
-
import { jsx as
|
|
2972
|
+
import { jsx as jsx88, jsxs as jsxs64 } from "react/jsx-runtime";
|
|
2905
2973
|
function DataToolbar({ title, description, search, filters, actions, className = "" }) {
|
|
2906
2974
|
return /* @__PURE__ */ jsxs64("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4 ${className}`, children: [
|
|
2907
2975
|
/* @__PURE__ */ jsxs64("div", { className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between", children: [
|
|
2908
2976
|
/* @__PURE__ */ jsxs64("div", { children: [
|
|
2909
|
-
title ? /* @__PURE__ */
|
|
2910
|
-
description ? /* @__PURE__ */
|
|
2977
|
+
title ? /* @__PURE__ */ jsx88("h3", { className: "text-base font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
|
|
2978
|
+
description ? /* @__PURE__ */ jsx88("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
2911
2979
|
] }),
|
|
2912
|
-
actions ? /* @__PURE__ */
|
|
2980
|
+
actions ? /* @__PURE__ */ jsx88("div", { className: "flex flex-wrap gap-2", children: actions }) : null
|
|
2913
2981
|
] }),
|
|
2914
2982
|
search || filters ? /* @__PURE__ */ jsxs64("div", { className: "mt-4 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between", children: [
|
|
2915
|
-
search ? /* @__PURE__ */
|
|
2916
|
-
filters ? /* @__PURE__ */
|
|
2983
|
+
search ? /* @__PURE__ */ jsx88("div", { className: "min-w-0 flex-1", children: search }) : null,
|
|
2984
|
+
filters ? /* @__PURE__ */ jsx88("div", { className: "flex flex-wrap gap-2", children: filters }) : null
|
|
2917
2985
|
] }) : null
|
|
2918
2986
|
] });
|
|
2919
2987
|
}
|
|
2920
2988
|
|
|
2921
2989
|
// src/components/framework/ResourceCard.tsx
|
|
2922
|
-
import { Fragment as Fragment4, jsx as
|
|
2990
|
+
import { Fragment as Fragment4, jsx as jsx89, jsxs as jsxs65 } from "react/jsx-runtime";
|
|
2923
2991
|
function ResourceCard({ title, description, eyebrow, icon, meta, status, actions, href, className = "" }) {
|
|
2924
2992
|
const content = /* @__PURE__ */ jsxs65(Fragment4, { children: [
|
|
2925
2993
|
/* @__PURE__ */ jsxs65("div", { className: "flex items-start justify-between gap-4", children: [
|
|
2926
2994
|
/* @__PURE__ */ jsxs65("div", { className: "flex min-w-0 items-start gap-3", children: [
|
|
2927
|
-
icon ? /* @__PURE__ */
|
|
2995
|
+
icon ? /* @__PURE__ */ jsx89("div", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-2 text-[var(--tapiz-accent)]", children: icon }) : null,
|
|
2928
2996
|
/* @__PURE__ */ jsxs65("div", { className: "min-w-0", children: [
|
|
2929
|
-
eyebrow ? /* @__PURE__ */
|
|
2930
|
-
/* @__PURE__ */
|
|
2931
|
-
description ? /* @__PURE__ */
|
|
2997
|
+
eyebrow ? /* @__PURE__ */ jsx89("div", { className: "kicker mb-2", children: eyebrow }) : null,
|
|
2998
|
+
/* @__PURE__ */ jsx89("h3", { className: "truncate text-base font-semibold text-[var(--tapiz-text-primary)]", children: title }),
|
|
2999
|
+
description ? /* @__PURE__ */ jsx89("p", { className: "mt-2 line-clamp-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
2932
3000
|
] })
|
|
2933
3001
|
] }),
|
|
2934
|
-
status ? /* @__PURE__ */
|
|
3002
|
+
status ? /* @__PURE__ */ jsx89(Badge, { children: status }) : null
|
|
2935
3003
|
] }),
|
|
2936
3004
|
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: [
|
|
2937
|
-
meta ? /* @__PURE__ */
|
|
2938
|
-
actions ? /* @__PURE__ */
|
|
3005
|
+
meta ? /* @__PURE__ */ jsx89("div", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: meta }) : /* @__PURE__ */ jsx89("span", {}),
|
|
3006
|
+
actions ? /* @__PURE__ */ jsx89("div", { className: "flex flex-wrap gap-2", children: actions }) : null
|
|
2939
3007
|
] }) : null
|
|
2940
3008
|
] });
|
|
2941
3009
|
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}`;
|
|
2942
|
-
return href ? /* @__PURE__ */
|
|
3010
|
+
return href ? /* @__PURE__ */ jsx89("a", { href, className: classes, children: content }) : /* @__PURE__ */ jsx89("article", { className: classes, children: content });
|
|
2943
3011
|
}
|
|
2944
3012
|
|
|
2945
3013
|
// src/components/framework/IntegrationCard.tsx
|
|
2946
|
-
import { jsx as
|
|
3014
|
+
import { jsx as jsx90, jsxs as jsxs66 } from "react/jsx-runtime";
|
|
2947
3015
|
var statusLabel = {
|
|
2948
3016
|
connected: "Connected",
|
|
2949
3017
|
disconnected: "Disconnected",
|
|
@@ -2960,23 +3028,23 @@ function IntegrationCard({ name, description, logo, status = "disconnected", las
|
|
|
2960
3028
|
return /* @__PURE__ */ jsxs66("article", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5 ${className}`, children: [
|
|
2961
3029
|
/* @__PURE__ */ jsxs66("div", { className: "flex items-start justify-between gap-4", children: [
|
|
2962
3030
|
/* @__PURE__ */ jsxs66("div", { className: "flex items-start gap-3", children: [
|
|
2963
|
-
/* @__PURE__ */
|
|
3031
|
+
/* @__PURE__ */ jsx90("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__ */ jsx90("span", { className: "font-mono text-xs", children: "API" }) }),
|
|
2964
3032
|
/* @__PURE__ */ jsxs66("div", { children: [
|
|
2965
|
-
/* @__PURE__ */
|
|
2966
|
-
description ? /* @__PURE__ */
|
|
3033
|
+
/* @__PURE__ */ jsx90("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: name }),
|
|
3034
|
+
description ? /* @__PURE__ */ jsx90("p", { className: "mt-1 text-sm leading-5 text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
2967
3035
|
] })
|
|
2968
3036
|
] }),
|
|
2969
|
-
/* @__PURE__ */
|
|
3037
|
+
/* @__PURE__ */ jsx90(StatusBadge, { variant: statusVariant[status], label: statusLabel[status] })
|
|
2970
3038
|
] }),
|
|
2971
3039
|
/* @__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: [
|
|
2972
|
-
/* @__PURE__ */
|
|
2973
|
-
actions ? /* @__PURE__ */
|
|
3040
|
+
/* @__PURE__ */ jsx90("div", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: lastSync ?? "No sync yet" }),
|
|
3041
|
+
actions ? /* @__PURE__ */ jsx90("div", { className: "flex gap-2", children: actions }) : null
|
|
2974
3042
|
] })
|
|
2975
3043
|
] });
|
|
2976
3044
|
}
|
|
2977
3045
|
|
|
2978
3046
|
// src/components/framework/HealthIndicator.tsx
|
|
2979
|
-
import { jsx as
|
|
3047
|
+
import { jsx as jsx91, jsxs as jsxs67 } from "react/jsx-runtime";
|
|
2980
3048
|
var toneClasses2 = {
|
|
2981
3049
|
operational: "bg-[var(--tapiz-success)]",
|
|
2982
3050
|
degraded: "bg-[var(--tapiz-warning)]",
|
|
@@ -2991,33 +3059,33 @@ var defaultLabel = {
|
|
|
2991
3059
|
};
|
|
2992
3060
|
function HealthIndicator({ tone: tone2 = "unknown", label, detail, className = "" }) {
|
|
2993
3061
|
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: [
|
|
2994
|
-
/* @__PURE__ */
|
|
2995
|
-
/* @__PURE__ */
|
|
2996
|
-
detail ? /* @__PURE__ */
|
|
3062
|
+
/* @__PURE__ */ jsx91("span", { className: `size-2.5 ${toneClasses2[tone2]}`, "aria-hidden": "true" }),
|
|
3063
|
+
/* @__PURE__ */ jsx91("span", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: label ?? defaultLabel[tone2] }),
|
|
3064
|
+
detail ? /* @__PURE__ */ jsx91("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: detail }) : null
|
|
2997
3065
|
] });
|
|
2998
3066
|
}
|
|
2999
3067
|
|
|
3000
3068
|
// src/components/framework/AuditLog.tsx
|
|
3001
|
-
import { jsx as
|
|
3069
|
+
import { jsx as jsx92, jsxs as jsxs68 } from "react/jsx-runtime";
|
|
3002
3070
|
function AuditLog({ items, className = "" }) {
|
|
3003
|
-
return /* @__PURE__ */
|
|
3004
|
-
/* @__PURE__ */
|
|
3071
|
+
return /* @__PURE__ */ jsx92("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: [
|
|
3072
|
+
/* @__PURE__ */ jsx92(Avatar, { name: item.initials ?? item.actor, size: "sm" }),
|
|
3005
3073
|
/* @__PURE__ */ jsxs68("div", { className: "min-w-0 flex-1", children: [
|
|
3006
3074
|
/* @__PURE__ */ jsxs68("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
|
|
3007
3075
|
/* @__PURE__ */ jsxs68("p", { className: "text-sm text-[var(--tapiz-text-secondary)]", children: [
|
|
3008
|
-
/* @__PURE__ */
|
|
3076
|
+
/* @__PURE__ */ jsx92("strong", { className: "text-[var(--tapiz-text-primary)]", children: item.actor }),
|
|
3009
3077
|
" ",
|
|
3010
3078
|
item.action
|
|
3011
3079
|
] }),
|
|
3012
|
-
/* @__PURE__ */
|
|
3080
|
+
/* @__PURE__ */ jsx92("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.timestamp })
|
|
3013
3081
|
] }),
|
|
3014
|
-
item.detail ? /* @__PURE__ */
|
|
3082
|
+
item.detail ? /* @__PURE__ */ jsx92("div", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: item.detail }) : null
|
|
3015
3083
|
] })
|
|
3016
3084
|
] }, index)) });
|
|
3017
3085
|
}
|
|
3018
3086
|
|
|
3019
3087
|
// src/components/framework/KanbanBoard.tsx
|
|
3020
|
-
import { jsx as
|
|
3088
|
+
import { jsx as jsx93, jsxs as jsxs69 } from "react/jsx-runtime";
|
|
3021
3089
|
var toneClasses3 = {
|
|
3022
3090
|
default: "border-[var(--tapiz-border-subtle)]",
|
|
3023
3091
|
accent: "border-[var(--tapiz-accent)]",
|
|
@@ -3026,65 +3094,65 @@ var toneClasses3 = {
|
|
|
3026
3094
|
danger: "border-[var(--tapiz-danger)]"
|
|
3027
3095
|
};
|
|
3028
3096
|
function KanbanBoard({ columns, className = "" }) {
|
|
3029
|
-
return /* @__PURE__ */
|
|
3097
|
+
return /* @__PURE__ */ jsx93("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: [
|
|
3030
3098
|
/* @__PURE__ */ jsxs69("div", { className: "mb-3 flex items-start justify-between gap-3", children: [
|
|
3031
3099
|
/* @__PURE__ */ jsxs69("div", { children: [
|
|
3032
|
-
/* @__PURE__ */
|
|
3033
|
-
column.description ? /* @__PURE__ */
|
|
3100
|
+
/* @__PURE__ */ jsx93("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: column.title }),
|
|
3101
|
+
column.description ? /* @__PURE__ */ jsx93("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: column.description }) : null
|
|
3034
3102
|
] }),
|
|
3035
|
-
/* @__PURE__ */
|
|
3103
|
+
/* @__PURE__ */ jsx93("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: column.items.length })
|
|
3036
3104
|
] }),
|
|
3037
|
-
/* @__PURE__ */
|
|
3038
|
-
/* @__PURE__ */
|
|
3039
|
-
item.description ? /* @__PURE__ */
|
|
3040
|
-
item.meta ? /* @__PURE__ */
|
|
3105
|
+
/* @__PURE__ */ jsx93("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: [
|
|
3106
|
+
/* @__PURE__ */ jsx93("h4", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
3107
|
+
item.description ? /* @__PURE__ */ jsx93("p", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: item.description }) : null,
|
|
3108
|
+
item.meta ? /* @__PURE__ */ jsx93("div", { className: "mt-3 font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
|
|
3041
3109
|
] }, item.id)) })
|
|
3042
3110
|
] }, column.id)) });
|
|
3043
3111
|
}
|
|
3044
3112
|
|
|
3045
3113
|
// src/components/framework/AccessMatrix.tsx
|
|
3046
|
-
import { jsx as
|
|
3114
|
+
import { jsx as jsx94, jsxs as jsxs70 } from "react/jsx-runtime";
|
|
3047
3115
|
function AccessMatrix({ roles, permissions, className = "" }) {
|
|
3048
|
-
return /* @__PURE__ */
|
|
3049
|
-
/* @__PURE__ */
|
|
3050
|
-
/* @__PURE__ */
|
|
3051
|
-
roles.map((role) => /* @__PURE__ */
|
|
3116
|
+
return /* @__PURE__ */ jsx94("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: [
|
|
3117
|
+
/* @__PURE__ */ jsx94("thead", { children: /* @__PURE__ */ jsxs70("tr", { children: [
|
|
3118
|
+
/* @__PURE__ */ jsx94("th", { className: "px-4 py-3 text-left", children: "Permission" }),
|
|
3119
|
+
roles.map((role) => /* @__PURE__ */ jsx94("th", { className: "px-4 py-3 text-center", children: role.label }, role.key))
|
|
3052
3120
|
] }) }),
|
|
3053
|
-
/* @__PURE__ */
|
|
3121
|
+
/* @__PURE__ */ jsx94("tbody", { children: permissions.map((permission) => /* @__PURE__ */ jsxs70("tr", { children: [
|
|
3054
3122
|
/* @__PURE__ */ jsxs70("td", { className: "px-4 py-3", children: [
|
|
3055
|
-
/* @__PURE__ */
|
|
3056
|
-
permission.description ? /* @__PURE__ */
|
|
3123
|
+
/* @__PURE__ */ jsx94("div", { className: "font-medium text-[var(--tapiz-text-primary)]", children: permission.label }),
|
|
3124
|
+
permission.description ? /* @__PURE__ */ jsx94("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: permission.description }) : null
|
|
3057
3125
|
] }),
|
|
3058
|
-
roles.map((role) => /* @__PURE__ */
|
|
3126
|
+
roles.map((role) => /* @__PURE__ */ jsx94("td", { className: "px-4 py-3 text-center", children: /* @__PURE__ */ jsx94("span", { className: permission.roles[role.key] ? "text-[var(--tapiz-success)]" : "text-[var(--tapiz-text-disabled)]", children: permission.roles[role.key] ? "\u2713" : "\u2014" }) }, role.key))
|
|
3059
3127
|
] }, permission.key)) })
|
|
3060
3128
|
] }) });
|
|
3061
3129
|
}
|
|
3062
3130
|
|
|
3063
3131
|
// src/components/framework/CalendarGrid.tsx
|
|
3064
|
-
import { jsx as
|
|
3132
|
+
import { jsx as jsx95, jsxs as jsxs71 } from "react/jsx-runtime";
|
|
3065
3133
|
var defaultWeekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
|
|
3066
3134
|
function CalendarGrid({ days, weekdays = defaultWeekdays, className = "" }) {
|
|
3067
3135
|
return /* @__PURE__ */ jsxs71("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
|
|
3068
|
-
/* @__PURE__ */
|
|
3069
|
-
/* @__PURE__ */
|
|
3136
|
+
/* @__PURE__ */ jsx95("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__ */ jsx95("div", { className: "px-3 py-2 font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: day }, index)) }),
|
|
3137
|
+
/* @__PURE__ */ jsx95("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: [
|
|
3070
3138
|
/* @__PURE__ */ jsxs71("div", { className: "flex items-center justify-between gap-2", children: [
|
|
3071
|
-
/* @__PURE__ */
|
|
3072
|
-
day.label ? /* @__PURE__ */
|
|
3139
|
+
/* @__PURE__ */ jsx95("span", { className: "font-mono text-xs text-[var(--tapiz-text-primary)]", children: day.date }),
|
|
3140
|
+
day.label ? /* @__PURE__ */ jsx95("span", { className: "text-[10px] text-[var(--tapiz-text-muted)]", children: day.label }) : null
|
|
3073
3141
|
] }),
|
|
3074
|
-
day.events?.length ? /* @__PURE__ */
|
|
3142
|
+
day.events?.length ? /* @__PURE__ */ jsx95("div", { className: "mt-2 space-y-1", children: day.events.map((event, eventIndex) => /* @__PURE__ */ jsx95("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
|
|
3075
3143
|
] }, index)) })
|
|
3076
3144
|
] });
|
|
3077
3145
|
}
|
|
3078
3146
|
|
|
3079
3147
|
// src/components/forms/Slider.tsx
|
|
3080
|
-
import { jsx as
|
|
3148
|
+
import { jsx as jsx96, jsxs as jsxs72 } from "react/jsx-runtime";
|
|
3081
3149
|
function Slider({ label, valueLabel, className = "", ...props }) {
|
|
3082
3150
|
return /* @__PURE__ */ jsxs72("label", { className: `block ${className}`, children: [
|
|
3083
3151
|
label || valueLabel ? /* @__PURE__ */ jsxs72("span", { className: "mb-2 flex items-center justify-between gap-3 text-sm", children: [
|
|
3084
|
-
label ? /* @__PURE__ */
|
|
3085
|
-
valueLabel ? /* @__PURE__ */
|
|
3152
|
+
label ? /* @__PURE__ */ jsx96("span", { className: "font-medium text-[var(--tapiz-text-secondary)]", children: label }) : /* @__PURE__ */ jsx96("span", {}),
|
|
3153
|
+
valueLabel ? /* @__PURE__ */ jsx96("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: valueLabel }) : null
|
|
3086
3154
|
] }) : null,
|
|
3087
|
-
/* @__PURE__ */
|
|
3155
|
+
/* @__PURE__ */ jsx96(
|
|
3088
3156
|
"input",
|
|
3089
3157
|
{
|
|
3090
3158
|
...props,
|
|
@@ -3096,19 +3164,19 @@ function Slider({ label, valueLabel, className = "", ...props }) {
|
|
|
3096
3164
|
}
|
|
3097
3165
|
|
|
3098
3166
|
// src/components/forms/FileDropzone.tsx
|
|
3099
|
-
import { jsx as
|
|
3167
|
+
import { jsx as jsx97, jsxs as jsxs73 } from "react/jsx-runtime";
|
|
3100
3168
|
function FileDropzone({ title = "Drop files here", description, actionLabel = "Browse", className = "", ...props }) {
|
|
3101
3169
|
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: [
|
|
3102
|
-
/* @__PURE__ */
|
|
3103
|
-
/* @__PURE__ */
|
|
3104
|
-
description ? /* @__PURE__ */
|
|
3105
|
-
/* @__PURE__ */
|
|
3170
|
+
/* @__PURE__ */ jsx97("input", { ...props, type: "file", className: "sr-only" }),
|
|
3171
|
+
/* @__PURE__ */ jsx97("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }),
|
|
3172
|
+
description ? /* @__PURE__ */ jsx97("span", { className: "mt-2 block text-sm text-[var(--tapiz-text-muted)]", children: description }) : null,
|
|
3173
|
+
/* @__PURE__ */ jsx97("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 })
|
|
3106
3174
|
] });
|
|
3107
3175
|
}
|
|
3108
3176
|
|
|
3109
3177
|
// src/components/forms/PasswordInput.tsx
|
|
3110
3178
|
import { useState as useState7 } from "react";
|
|
3111
|
-
import { jsx as
|
|
3179
|
+
import { jsx as jsx98, jsxs as jsxs74 } from "react/jsx-runtime";
|
|
3112
3180
|
function PasswordInput({
|
|
3113
3181
|
revealLabel = "Show password",
|
|
3114
3182
|
className = "",
|
|
@@ -3120,7 +3188,7 @@ function PasswordInput({
|
|
|
3120
3188
|
{
|
|
3121
3189
|
className: `flex border border-(--tapiz-border-strong) bg-(--tapiz-bg-surface) focus-within:border-(--tapiz-border-focus) focus-within:shadow-[inset_3px_0_0_0_var(--tapiz-signal)] ${className}`,
|
|
3122
3190
|
children: [
|
|
3123
|
-
/* @__PURE__ */
|
|
3191
|
+
/* @__PURE__ */ jsx98(
|
|
3124
3192
|
"input",
|
|
3125
3193
|
{
|
|
3126
3194
|
...props,
|
|
@@ -3128,7 +3196,7 @@ function PasswordInput({
|
|
|
3128
3196
|
className: "min-w-0 flex-1 border-0 bg-transparent px-3 py-2 text-sm text-(--tapiz-text-primary) outline-none focus:shadow-none!"
|
|
3129
3197
|
}
|
|
3130
3198
|
),
|
|
3131
|
-
/* @__PURE__ */
|
|
3199
|
+
/* @__PURE__ */ jsx98(
|
|
3132
3200
|
"button",
|
|
3133
3201
|
{
|
|
3134
3202
|
type: "button",
|
|
@@ -3137,7 +3205,7 @@ function PasswordInput({
|
|
|
3137
3205
|
onClick: () => setVisible((v) => !v),
|
|
3138
3206
|
tabIndex: -1,
|
|
3139
3207
|
className: "grid place-items-center px-3 text-(--tapiz-text-muted) transition-colors hover:text-(--tapiz-text-primary)",
|
|
3140
|
-
children: visible ? /* @__PURE__ */
|
|
3208
|
+
children: visible ? /* @__PURE__ */ jsx98(EyeOff, { size: 15 }) : /* @__PURE__ */ jsx98(Eye, { size: 15 })
|
|
3141
3209
|
}
|
|
3142
3210
|
)
|
|
3143
3211
|
]
|
|
@@ -3146,11 +3214,11 @@ function PasswordInput({
|
|
|
3146
3214
|
}
|
|
3147
3215
|
|
|
3148
3216
|
// src/components/forms/TextareaCounter.tsx
|
|
3149
|
-
import { jsx as
|
|
3217
|
+
import { jsx as jsx99, jsxs as jsxs75 } from "react/jsx-runtime";
|
|
3150
3218
|
function TextareaCounter({ maxLength, value = "", className = "", ...props }) {
|
|
3151
3219
|
const count = value.length;
|
|
3152
3220
|
return /* @__PURE__ */ jsxs75("div", { className, children: [
|
|
3153
|
-
/* @__PURE__ */
|
|
3221
|
+
/* @__PURE__ */ jsx99("textarea", { ...props, value, maxLength, className: "input-field min-h-28" }),
|
|
3154
3222
|
/* @__PURE__ */ jsxs75("div", { className: "mt-1 text-right font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: [
|
|
3155
3223
|
count,
|
|
3156
3224
|
"/",
|
|
@@ -3160,7 +3228,7 @@ function TextareaCounter({ maxLength, value = "", className = "", ...props }) {
|
|
|
3160
3228
|
}
|
|
3161
3229
|
|
|
3162
3230
|
// src/components/feedback/Callout.tsx
|
|
3163
|
-
import { jsx as
|
|
3231
|
+
import { jsx as jsx100, jsxs as jsxs76 } from "react/jsx-runtime";
|
|
3164
3232
|
var toneClasses4 = {
|
|
3165
3233
|
info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)]",
|
|
3166
3234
|
success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
|
|
@@ -3169,73 +3237,73 @@ var toneClasses4 = {
|
|
|
3169
3237
|
neutral: "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]"
|
|
3170
3238
|
};
|
|
3171
3239
|
function Callout({ title, children, tone: tone2 = "info", icon, actions, className = "" }) {
|
|
3172
|
-
return /* @__PURE__ */
|
|
3173
|
-
icon ? /* @__PURE__ */
|
|
3240
|
+
return /* @__PURE__ */ jsx100("aside", { className: `border-l-4 p-4 ${toneClasses4[tone2]} ${className}`, children: /* @__PURE__ */ jsxs76("div", { className: "flex gap-3", children: [
|
|
3241
|
+
icon ? /* @__PURE__ */ jsx100("div", { className: "text-[var(--tapiz-text-primary)]", children: icon }) : null,
|
|
3174
3242
|
/* @__PURE__ */ jsxs76("div", { className: "min-w-0 flex-1", children: [
|
|
3175
|
-
title ? /* @__PURE__ */
|
|
3176
|
-
children ? /* @__PURE__ */
|
|
3177
|
-
actions ? /* @__PURE__ */
|
|
3243
|
+
title ? /* @__PURE__ */ jsx100("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
|
|
3244
|
+
children ? /* @__PURE__ */ jsx100("div", { className: "mt-1 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children }) : null,
|
|
3245
|
+
actions ? /* @__PURE__ */ jsx100("div", { className: "mt-3 flex flex-wrap gap-2", children: actions }) : null
|
|
3178
3246
|
] })
|
|
3179
3247
|
] }) });
|
|
3180
3248
|
}
|
|
3181
3249
|
|
|
3182
3250
|
// src/components/feedback/LoadingOverlay.tsx
|
|
3183
|
-
import { jsx as
|
|
3251
|
+
import { jsx as jsx101, jsxs as jsxs77 } from "react/jsx-runtime";
|
|
3184
3252
|
function LoadingOverlay({ visible = false, label = "Loading", children, className = "" }) {
|
|
3185
3253
|
return /* @__PURE__ */ jsxs77("div", { className: `relative ${className}`, children: [
|
|
3186
3254
|
children,
|
|
3187
|
-
visible ? /* @__PURE__ */
|
|
3188
|
-
/* @__PURE__ */
|
|
3189
|
-
/* @__PURE__ */
|
|
3255
|
+
visible ? /* @__PURE__ */ jsx101("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: [
|
|
3256
|
+
/* @__PURE__ */ jsx101(Spinner, {}),
|
|
3257
|
+
/* @__PURE__ */ jsx101("span", { children: label })
|
|
3190
3258
|
] }) }) : null
|
|
3191
3259
|
] });
|
|
3192
3260
|
}
|
|
3193
3261
|
|
|
3194
3262
|
// src/components/feedback/NotificationList.tsx
|
|
3195
|
-
import { jsx as
|
|
3263
|
+
import { jsx as jsx102, jsxs as jsxs78 } from "react/jsx-runtime";
|
|
3196
3264
|
function NotificationList({ items, className = "" }) {
|
|
3197
|
-
return /* @__PURE__ */
|
|
3198
|
-
/* @__PURE__ */
|
|
3265
|
+
return /* @__PURE__ */ jsx102("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: [
|
|
3266
|
+
/* @__PURE__ */ jsx102("span", { className: `mt-1 size-2.5 ${item.unread ? "bg-[var(--tapiz-accent)]" : "bg-[var(--tapiz-border-subtle)]"}`, "aria-hidden": "true" }),
|
|
3199
3267
|
/* @__PURE__ */ jsxs78("div", { className: "min-w-0 flex-1", children: [
|
|
3200
3268
|
/* @__PURE__ */ jsxs78("div", { className: "flex items-start justify-between gap-3", children: [
|
|
3201
|
-
/* @__PURE__ */
|
|
3202
|
-
item.time ? /* @__PURE__ */
|
|
3269
|
+
/* @__PURE__ */ jsx102("h3", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
3270
|
+
item.time ? /* @__PURE__ */ jsx102("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.time }) : null
|
|
3203
3271
|
] }),
|
|
3204
|
-
item.description ? /* @__PURE__ */
|
|
3205
|
-
item.action ? /* @__PURE__ */
|
|
3272
|
+
item.description ? /* @__PURE__ */ jsx102("p", { className: "mt-1 text-sm leading-5 text-[var(--tapiz-text-muted)]", children: item.description }) : null,
|
|
3273
|
+
item.action ? /* @__PURE__ */ jsx102("div", { className: "mt-3", children: item.action }) : null
|
|
3206
3274
|
] })
|
|
3207
3275
|
] }, item.id)) });
|
|
3208
3276
|
}
|
|
3209
3277
|
|
|
3210
3278
|
// src/components/layout/MasonryGrid.tsx
|
|
3211
|
-
import { jsx as
|
|
3279
|
+
import { jsx as jsx103 } from "react/jsx-runtime";
|
|
3212
3280
|
var columnClasses = { 2: "md:columns-2", 3: "md:columns-2 xl:columns-3", 4: "md:columns-2 lg:columns-3 xl:columns-4" };
|
|
3213
3281
|
var gapClasses4 = { sm: "gap-3", md: "gap-5", lg: "gap-8" };
|
|
3214
3282
|
function MasonryGrid({ children, columns = 3, gap = "md", className = "", style }) {
|
|
3215
|
-
return /* @__PURE__ */
|
|
3283
|
+
return /* @__PURE__ */ jsx103("div", { className: [columnClasses[columns], gapClasses4[gap], className].filter(Boolean).join(" "), style, children });
|
|
3216
3284
|
}
|
|
3217
3285
|
|
|
3218
3286
|
// src/components/layout/PageRail.tsx
|
|
3219
|
-
import { Fragment as Fragment5, jsx as
|
|
3287
|
+
import { Fragment as Fragment5, jsx as jsx104, jsxs as jsxs79 } from "react/jsx-runtime";
|
|
3220
3288
|
function PageRail({ title, items, actions, className = "", style }) {
|
|
3221
3289
|
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: [
|
|
3222
|
-
title ? /* @__PURE__ */
|
|
3223
|
-
/* @__PURE__ */
|
|
3290
|
+
title ? /* @__PURE__ */ jsx104("div", { className: "kicker mb-3 px-2", children: title }) : null,
|
|
3291
|
+
/* @__PURE__ */ jsx104("nav", { className: "flex flex-col gap-1", children: items.map((item, index) => {
|
|
3224
3292
|
const content = /* @__PURE__ */ jsxs79(Fragment5, { children: [
|
|
3225
|
-
/* @__PURE__ */
|
|
3226
|
-
item.meta ? /* @__PURE__ */
|
|
3293
|
+
/* @__PURE__ */ jsx104("span", { className: "truncate", children: item.label }),
|
|
3294
|
+
item.meta ? /* @__PURE__ */ jsx104("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
|
|
3227
3295
|
] });
|
|
3228
3296
|
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(" ");
|
|
3229
|
-
return item.href ? /* @__PURE__ */
|
|
3297
|
+
return item.href ? /* @__PURE__ */ jsx104("a", { href: item.href, className: classes, children: content }, index) : /* @__PURE__ */ jsx104("div", { className: classes, children: content }, index);
|
|
3230
3298
|
}) }),
|
|
3231
|
-
actions ? /* @__PURE__ */
|
|
3299
|
+
actions ? /* @__PURE__ */ jsx104("div", { className: "mt-3 border-t border-[var(--tapiz-border-subtle)] pt-3", children: actions }) : null
|
|
3232
3300
|
] });
|
|
3233
3301
|
}
|
|
3234
3302
|
|
|
3235
3303
|
// src/components/layout/StickyBar.tsx
|
|
3236
|
-
import { jsx as
|
|
3304
|
+
import { jsx as jsx105 } from "react/jsx-runtime";
|
|
3237
3305
|
function StickyBar({ children, position = "top", className = "", style }) {
|
|
3238
|
-
return /* @__PURE__ */
|
|
3306
|
+
return /* @__PURE__ */ jsx105(
|
|
3239
3307
|
"div",
|
|
3240
3308
|
{
|
|
3241
3309
|
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(" "),
|
|
@@ -3246,53 +3314,53 @@ function StickyBar({ children, position = "top", className = "", style }) {
|
|
|
3246
3314
|
}
|
|
3247
3315
|
|
|
3248
3316
|
// src/components/forms/Combobox.tsx
|
|
3249
|
-
import { jsx as
|
|
3317
|
+
import { jsx as jsx106, jsxs as jsxs80 } from "react/jsx-runtime";
|
|
3250
3318
|
function Combobox({ options, placeholder = "Select option", invalid = false, className = "", ...props }) {
|
|
3251
3319
|
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: [
|
|
3252
|
-
/* @__PURE__ */
|
|
3253
|
-
options.map((option) => /* @__PURE__ */
|
|
3320
|
+
/* @__PURE__ */ jsx106("option", { value: "", children: placeholder }),
|
|
3321
|
+
options.map((option) => /* @__PURE__ */ jsx106("option", { value: option.value, children: String(option.label) }, option.value))
|
|
3254
3322
|
] });
|
|
3255
3323
|
}
|
|
3256
3324
|
|
|
3257
3325
|
// src/components/forms/DateRangePicker.tsx
|
|
3258
|
-
import { jsx as
|
|
3326
|
+
import { jsx as jsx107, jsxs as jsxs81 } from "react/jsx-runtime";
|
|
3259
3327
|
function DateRangePicker({ startLabel = "From", endLabel = "To", startProps, endProps, className = "" }) {
|
|
3260
3328
|
return /* @__PURE__ */ jsxs81("div", { className: ["grid gap-3 md:grid-cols-2", className].filter(Boolean).join(" "), children: [
|
|
3261
3329
|
/* @__PURE__ */ jsxs81("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
|
|
3262
|
-
/* @__PURE__ */
|
|
3263
|
-
/* @__PURE__ */
|
|
3330
|
+
/* @__PURE__ */ jsx107("span", { children: startLabel }),
|
|
3331
|
+
/* @__PURE__ */ jsx107("input", { type: "date", ...startProps, className: ["input-field", startProps?.className || ""].join(" ") })
|
|
3264
3332
|
] }),
|
|
3265
3333
|
/* @__PURE__ */ jsxs81("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
|
|
3266
|
-
/* @__PURE__ */
|
|
3267
|
-
/* @__PURE__ */
|
|
3334
|
+
/* @__PURE__ */ jsx107("span", { children: endLabel }),
|
|
3335
|
+
/* @__PURE__ */ jsx107("input", { type: "date", ...endProps, className: ["input-field", endProps?.className || ""].join(" ") })
|
|
3268
3336
|
] })
|
|
3269
3337
|
] });
|
|
3270
3338
|
}
|
|
3271
3339
|
|
|
3272
3340
|
// src/components/forms/ColorSwatchPicker.tsx
|
|
3273
|
-
import { jsx as
|
|
3341
|
+
import { jsx as jsx108, jsxs as jsxs82 } from "react/jsx-runtime";
|
|
3274
3342
|
function ColorSwatchPicker({ options, value, onChange, className = "" }) {
|
|
3275
|
-
return /* @__PURE__ */
|
|
3343
|
+
return /* @__PURE__ */ jsx108("div", { className: ["flex flex-wrap gap-2", className].filter(Boolean).join(" "), children: options.map((option) => {
|
|
3276
3344
|
const selected = option.value === value;
|
|
3277
3345
|
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: [
|
|
3278
|
-
/* @__PURE__ */
|
|
3279
|
-
/* @__PURE__ */
|
|
3346
|
+
/* @__PURE__ */ jsx108("span", { className: "h-4 w-4 border border-[var(--tapiz-border-strong)]", style: { background: option.color } }),
|
|
3347
|
+
/* @__PURE__ */ jsx108("span", { children: option.label })
|
|
3280
3348
|
] }, option.value);
|
|
3281
3349
|
}) });
|
|
3282
3350
|
}
|
|
3283
3351
|
|
|
3284
3352
|
// src/components/forms/RatingInput.tsx
|
|
3285
|
-
import { jsx as
|
|
3353
|
+
import { jsx as jsx109 } from "react/jsx-runtime";
|
|
3286
3354
|
function RatingInput({ value = 0, max = 5, icon = "\u2605", onChange, label = "Rating", className = "" }) {
|
|
3287
|
-
return /* @__PURE__ */
|
|
3355
|
+
return /* @__PURE__ */ jsx109("div", { className: ["inline-flex items-center gap-1", className].filter(Boolean).join(" "), role: "radiogroup", "aria-label": label, children: Array.from({ length: max }, (_, index) => {
|
|
3288
3356
|
const score = index + 1;
|
|
3289
3357
|
const active = score <= value;
|
|
3290
|
-
return /* @__PURE__ */
|
|
3358
|
+
return /* @__PURE__ */ jsx109("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);
|
|
3291
3359
|
}) });
|
|
3292
3360
|
}
|
|
3293
3361
|
|
|
3294
3362
|
// src/components/data-display/ScoreRing.tsx
|
|
3295
|
-
import { jsx as
|
|
3363
|
+
import { jsx as jsx110, jsxs as jsxs83 } from "react/jsx-runtime";
|
|
3296
3364
|
function ScoreRing({ value, max = 100, label, size = 112, className = "" }) {
|
|
3297
3365
|
const normalized = Math.max(0, Math.min(1, value / max));
|
|
3298
3366
|
const radius = 42;
|
|
@@ -3300,131 +3368,131 @@ function ScoreRing({ value, max = 100, label, size = 112, className = "" }) {
|
|
|
3300
3368
|
const dash = circumference * normalized;
|
|
3301
3369
|
return /* @__PURE__ */ jsxs83("div", { className: ["inline-grid place-items-center", className].filter(Boolean).join(" "), style: { width: size, height: size }, children: [
|
|
3302
3370
|
/* @__PURE__ */ jsxs83("svg", { viewBox: "0 0 100 100", className: "h-full w-full -rotate-90", children: [
|
|
3303
|
-
/* @__PURE__ */
|
|
3304
|
-
/* @__PURE__ */
|
|
3371
|
+
/* @__PURE__ */ jsx110("circle", { cx: "50", cy: "50", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
|
|
3372
|
+
/* @__PURE__ */ jsx110("circle", { cx: "50", cy: "50", r: radius, fill: "none", stroke: "var(--tapiz-accent)", strokeWidth: "10", strokeLinecap: "square", strokeDasharray: `${dash} ${circumference - dash}` })
|
|
3305
3373
|
] }),
|
|
3306
3374
|
/* @__PURE__ */ jsxs83("div", { className: "absolute text-center", children: [
|
|
3307
3375
|
/* @__PURE__ */ jsxs83("div", { className: "font-display text-2xl font-semibold text-[var(--tapiz-text-primary)]", children: [
|
|
3308
3376
|
Math.round(normalized * 100),
|
|
3309
3377
|
"%"
|
|
3310
3378
|
] }),
|
|
3311
|
-
label ? /* @__PURE__ */
|
|
3379
|
+
label ? /* @__PURE__ */ jsx110("div", { className: "font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: label }) : null
|
|
3312
3380
|
] })
|
|
3313
3381
|
] });
|
|
3314
3382
|
}
|
|
3315
3383
|
|
|
3316
3384
|
// src/components/data-display/HeatmapGrid.tsx
|
|
3317
|
-
import { jsx as
|
|
3385
|
+
import { jsx as jsx111 } from "react/jsx-runtime";
|
|
3318
3386
|
function HeatmapGrid({ cells, columns = 7, max, className = "" }) {
|
|
3319
3387
|
const peak = max ?? Math.max(1, ...cells.map((cell) => cell.value));
|
|
3320
|
-
return /* @__PURE__ */
|
|
3388
|
+
return /* @__PURE__ */ jsx111("div", { className: ["grid gap-1", className].filter(Boolean).join(" "), style: { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }, children: cells.map((cell, index) => {
|
|
3321
3389
|
const opacity = 0.15 + Math.min(1, cell.value / peak) * 0.75;
|
|
3322
|
-
return /* @__PURE__ */
|
|
3390
|
+
return /* @__PURE__ */ jsx111("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__ */ jsx111("span", { className: "sr-only", children: cell.label }) : null }, index);
|
|
3323
3391
|
}) });
|
|
3324
3392
|
}
|
|
3325
3393
|
|
|
3326
3394
|
// src/components/data-display/FunnelChart.tsx
|
|
3327
|
-
import { jsx as
|
|
3395
|
+
import { jsx as jsx112, jsxs as jsxs84 } from "react/jsx-runtime";
|
|
3328
3396
|
function FunnelChart({ steps, className = "" }) {
|
|
3329
3397
|
const max = Math.max(1, ...steps.map((step) => step.value));
|
|
3330
|
-
return /* @__PURE__ */
|
|
3398
|
+
return /* @__PURE__ */ jsx112("div", { className: ["space-y-3", className].filter(Boolean).join(" "), children: steps.map((step, index) => {
|
|
3331
3399
|
const width = Math.max(8, step.value / max * 100);
|
|
3332
3400
|
return /* @__PURE__ */ jsxs84("div", { children: [
|
|
3333
3401
|
/* @__PURE__ */ jsxs84("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
|
|
3334
|
-
/* @__PURE__ */
|
|
3402
|
+
/* @__PURE__ */ jsx112("span", { className: "font-medium text-[var(--tapiz-text-primary)]", children: step.label }),
|
|
3335
3403
|
/* @__PURE__ */ jsxs84("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
|
|
3336
3404
|
step.value,
|
|
3337
3405
|
step.meta ? ` \xB7 ${String(step.meta)}` : ""
|
|
3338
3406
|
] })
|
|
3339
3407
|
] }),
|
|
3340
|
-
/* @__PURE__ */
|
|
3408
|
+
/* @__PURE__ */ jsx112("div", { className: "h-9 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx112("div", { className: "h-full border-r border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)]", style: { width: `${width}%` } }) })
|
|
3341
3409
|
] }, index);
|
|
3342
3410
|
}) });
|
|
3343
3411
|
}
|
|
3344
3412
|
|
|
3345
3413
|
// src/components/data-display/ComparisonMeter.tsx
|
|
3346
|
-
import { jsx as
|
|
3414
|
+
import { jsx as jsx113, jsxs as jsxs85 } from "react/jsx-runtime";
|
|
3347
3415
|
function ComparisonMeter({ leftLabel, rightLabel, value, className = "" }) {
|
|
3348
3416
|
const clamped = Math.max(0, Math.min(100, value));
|
|
3349
3417
|
return /* @__PURE__ */ jsxs85("div", { className, children: [
|
|
3350
3418
|
/* @__PURE__ */ jsxs85("div", { className: "mb-2 flex justify-between gap-3 text-sm text-[var(--tapiz-text-muted)]", children: [
|
|
3351
|
-
/* @__PURE__ */
|
|
3352
|
-
/* @__PURE__ */
|
|
3419
|
+
/* @__PURE__ */ jsx113("span", { children: leftLabel }),
|
|
3420
|
+
/* @__PURE__ */ jsx113("span", { children: rightLabel })
|
|
3353
3421
|
] }),
|
|
3354
3422
|
/* @__PURE__ */ jsxs85("div", { className: "relative h-3 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]", children: [
|
|
3355
|
-
/* @__PURE__ */
|
|
3356
|
-
/* @__PURE__ */
|
|
3423
|
+
/* @__PURE__ */ jsx113("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${clamped}%` } }),
|
|
3424
|
+
/* @__PURE__ */ jsx113("div", { className: "absolute top-[-6px] h-6 w-px bg-[var(--tapiz-border-strong)]", style: { left: `${clamped}%` } })
|
|
3357
3425
|
] })
|
|
3358
3426
|
] });
|
|
3359
3427
|
}
|
|
3360
3428
|
|
|
3361
3429
|
// src/components/framework/ActivityFeed.tsx
|
|
3362
|
-
import { jsx as
|
|
3430
|
+
import { jsx as jsx114, jsxs as jsxs86 } from "react/jsx-runtime";
|
|
3363
3431
|
function ActivityFeed({ items, className = "" }) {
|
|
3364
|
-
return /* @__PURE__ */
|
|
3365
|
-
/* @__PURE__ */
|
|
3432
|
+
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__ */ jsxs86("div", { className: "flex gap-3 p-4", children: [
|
|
3433
|
+
/* @__PURE__ */ jsx114(Avatar, { name: item.actor, src: item.avatarUrl, size: "sm" }),
|
|
3366
3434
|
/* @__PURE__ */ jsxs86("div", { className: "min-w-0 flex-1", children: [
|
|
3367
3435
|
/* @__PURE__ */ jsxs86("p", { className: "text-sm text-[var(--tapiz-text-primary)]", children: [
|
|
3368
|
-
/* @__PURE__ */
|
|
3436
|
+
/* @__PURE__ */ jsx114("strong", { children: item.actor }),
|
|
3369
3437
|
" ",
|
|
3370
3438
|
item.action
|
|
3371
3439
|
] }),
|
|
3372
|
-
item.meta ? /* @__PURE__ */
|
|
3440
|
+
item.meta ? /* @__PURE__ */ jsx114("div", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: item.meta }) : null
|
|
3373
3441
|
] }),
|
|
3374
|
-
item.time ? /* @__PURE__ */
|
|
3442
|
+
item.time ? /* @__PURE__ */ jsx114("div", { className: "font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: item.time }) : null
|
|
3375
3443
|
] }, index)) });
|
|
3376
3444
|
}
|
|
3377
3445
|
|
|
3378
3446
|
// src/components/framework/InboxList.tsx
|
|
3379
|
-
import { jsx as
|
|
3447
|
+
import { jsx as jsx115, jsxs as jsxs87 } from "react/jsx-runtime";
|
|
3380
3448
|
function InboxList({ items, className = "" }) {
|
|
3381
|
-
return /* @__PURE__ */
|
|
3449
|
+
return /* @__PURE__ */ jsx115("div", { className: ["divide-y divide-[var(--tapiz-border-subtle)] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)]", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsxs87("article", { className: ["p-4 transition hover:bg-[var(--tapiz-bg-surface-muted)]", item.unread ? "border-l-4 border-l-[var(--tapiz-accent)]" : ""].join(" "), children: [
|
|
3382
3450
|
/* @__PURE__ */ jsxs87("div", { className: "flex items-start justify-between gap-3", children: [
|
|
3383
3451
|
/* @__PURE__ */ jsxs87("div", { className: "min-w-0", children: [
|
|
3384
|
-
/* @__PURE__ */
|
|
3385
|
-
item.sender ? /* @__PURE__ */
|
|
3452
|
+
/* @__PURE__ */ jsx115("h3", { className: "truncate text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
3453
|
+
item.sender ? /* @__PURE__ */ jsx115("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.sender }) : null
|
|
3386
3454
|
] }),
|
|
3387
3455
|
/* @__PURE__ */ jsxs87("div", { className: "flex shrink-0 items-center gap-2", children: [
|
|
3388
|
-
item.tag ? /* @__PURE__ */
|
|
3389
|
-
item.time ? /* @__PURE__ */
|
|
3456
|
+
item.tag ? /* @__PURE__ */ jsx115(Badge, { children: item.tag }) : null,
|
|
3457
|
+
item.time ? /* @__PURE__ */ jsx115("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.time }) : null
|
|
3390
3458
|
] })
|
|
3391
3459
|
] }),
|
|
3392
|
-
item.snippet ? /* @__PURE__ */
|
|
3460
|
+
item.snippet ? /* @__PURE__ */ jsx115("p", { className: "mt-2 line-clamp-2 text-sm text-[var(--tapiz-text-muted)]", children: item.snippet }) : null
|
|
3393
3461
|
] }, index)) });
|
|
3394
3462
|
}
|
|
3395
3463
|
|
|
3396
3464
|
// src/components/framework/ApprovalQueue.tsx
|
|
3397
|
-
import { jsx as
|
|
3465
|
+
import { jsx as jsx116, jsxs as jsxs88 } from "react/jsx-runtime";
|
|
3398
3466
|
function ApprovalQueue({ items, onApprove, onReject, className = "" }) {
|
|
3399
|
-
return /* @__PURE__ */
|
|
3467
|
+
return /* @__PURE__ */ jsx116("div", { className: ["space-y-3", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsx116("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: [
|
|
3400
3468
|
/* @__PURE__ */ jsxs88("div", { children: [
|
|
3401
3469
|
/* @__PURE__ */ jsxs88("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
3402
|
-
/* @__PURE__ */
|
|
3403
|
-
item.priority ? /* @__PURE__ */
|
|
3470
|
+
/* @__PURE__ */ jsx116("h3", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
3471
|
+
item.priority ? /* @__PURE__ */ jsx116(Badge, { variant: item.priority === "high" ? "danger" : item.priority === "medium" ? "warning" : "default", children: item.priority }) : null
|
|
3404
3472
|
] }),
|
|
3405
3473
|
item.requester ? /* @__PURE__ */ jsxs88("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: [
|
|
3406
3474
|
"Requested by ",
|
|
3407
3475
|
item.requester
|
|
3408
3476
|
] }) : null,
|
|
3409
|
-
item.description ? /* @__PURE__ */
|
|
3477
|
+
item.description ? /* @__PURE__ */ jsx116("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: item.description }) : null
|
|
3410
3478
|
] }),
|
|
3411
3479
|
/* @__PURE__ */ jsxs88("div", { className: "flex gap-2", children: [
|
|
3412
|
-
/* @__PURE__ */
|
|
3413
|
-
/* @__PURE__ */
|
|
3480
|
+
/* @__PURE__ */ jsx116(Button, { size: "sm", variant: "secondary", onClick: () => onReject?.(index), children: "Reject" }),
|
|
3481
|
+
/* @__PURE__ */ jsx116(Button, { size: "sm", onClick: () => onApprove?.(index), children: "Approve" })
|
|
3414
3482
|
] })
|
|
3415
3483
|
] }) }, index)) });
|
|
3416
3484
|
}
|
|
3417
3485
|
|
|
3418
3486
|
// src/components/framework/SLAStatus.tsx
|
|
3419
|
-
import { jsx as
|
|
3487
|
+
import { jsx as jsx117, jsxs as jsxs89 } from "react/jsx-runtime";
|
|
3420
3488
|
function SLAStatus({ label, value, target = 95, className = "" }) {
|
|
3421
3489
|
const ok = value >= target;
|
|
3422
3490
|
return /* @__PURE__ */ jsxs89("div", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4", className].filter(Boolean).join(" "), children: [
|
|
3423
3491
|
/* @__PURE__ */ jsxs89("div", { className: "flex items-center justify-between gap-3", children: [
|
|
3424
|
-
/* @__PURE__ */
|
|
3425
|
-
/* @__PURE__ */
|
|
3492
|
+
/* @__PURE__ */ jsx117("span", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: label }),
|
|
3493
|
+
/* @__PURE__ */ jsx117("span", { className: ["font-mono text-xs", ok ? "text-[var(--tapiz-success)]" : "text-[var(--tapiz-warning)]"].join(" "), children: ok ? "Within SLA" : "At risk" })
|
|
3426
3494
|
] }),
|
|
3427
|
-
/* @__PURE__ */
|
|
3495
|
+
/* @__PURE__ */ jsx117("div", { className: "mt-3 h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx117("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${Math.max(0, Math.min(100, value))}%` } }) }),
|
|
3428
3496
|
/* @__PURE__ */ jsxs89("div", { className: "mt-2 flex justify-between font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: [
|
|
3429
3497
|
/* @__PURE__ */ jsxs89("span", { children: [
|
|
3430
3498
|
value,
|
|
@@ -3440,81 +3508,81 @@ function SLAStatus({ label, value, target = 95, className = "" }) {
|
|
|
3440
3508
|
}
|
|
3441
3509
|
|
|
3442
3510
|
// src/components/framework/FeatureFlagTable.tsx
|
|
3443
|
-
import { jsx as
|
|
3511
|
+
import { jsx as jsx118, jsxs as jsxs90 } from "react/jsx-runtime";
|
|
3444
3512
|
function FeatureFlagTable({ flags, onToggle, className = "" }) {
|
|
3445
|
-
return /* @__PURE__ */
|
|
3513
|
+
return /* @__PURE__ */ jsx118("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: [
|
|
3446
3514
|
/* @__PURE__ */ jsxs90("div", { children: [
|
|
3447
3515
|
/* @__PURE__ */ jsxs90("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
3448
|
-
/* @__PURE__ */
|
|
3449
|
-
/* @__PURE__ */
|
|
3516
|
+
/* @__PURE__ */ jsx118("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: flag.name }),
|
|
3517
|
+
/* @__PURE__ */ jsx118(Badge, { children: flag.key })
|
|
3450
3518
|
] }),
|
|
3451
|
-
flag.description ? /* @__PURE__ */
|
|
3519
|
+
flag.description ? /* @__PURE__ */ jsx118("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: flag.description }) : null
|
|
3452
3520
|
] }),
|
|
3453
|
-
/* @__PURE__ */
|
|
3454
|
-
/* @__PURE__ */
|
|
3521
|
+
/* @__PURE__ */ jsx118("div", { className: "text-sm text-[var(--tapiz-text-muted)]", children: flag.rollout }),
|
|
3522
|
+
/* @__PURE__ */ jsx118(Switch, { checked: flag.enabled, onChange: (checked) => onToggle?.(flag.key, checked) })
|
|
3455
3523
|
] }, flag.key)) });
|
|
3456
3524
|
}
|
|
3457
3525
|
|
|
3458
3526
|
// src/components/framework/PlanUsage.tsx
|
|
3459
|
-
import { jsx as
|
|
3527
|
+
import { jsx as jsx119, jsxs as jsxs91 } from "react/jsx-runtime";
|
|
3460
3528
|
function PlanUsage({ title = "Plan usage", items, className = "" }) {
|
|
3461
3529
|
return /* @__PURE__ */ jsxs91("section", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5", className].filter(Boolean).join(" "), children: [
|
|
3462
|
-
/* @__PURE__ */
|
|
3463
|
-
/* @__PURE__ */
|
|
3530
|
+
/* @__PURE__ */ jsx119("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }),
|
|
3531
|
+
/* @__PURE__ */ jsx119("div", { className: "mt-4 space-y-4", children: items.map((item, index) => {
|
|
3464
3532
|
const pct = item.limit ? Math.min(100, item.used / item.limit * 100) : 0;
|
|
3465
3533
|
return /* @__PURE__ */ jsxs91("div", { children: [
|
|
3466
3534
|
/* @__PURE__ */ jsxs91("div", { className: "mb-1 flex justify-between text-sm", children: [
|
|
3467
|
-
/* @__PURE__ */
|
|
3535
|
+
/* @__PURE__ */ jsx119("span", { className: "text-[var(--tapiz-text-primary)]", children: item.label }),
|
|
3468
3536
|
/* @__PURE__ */ jsxs91("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
|
|
3469
3537
|
item.used,
|
|
3470
3538
|
"/",
|
|
3471
3539
|
item.limit
|
|
3472
3540
|
] })
|
|
3473
3541
|
] }),
|
|
3474
|
-
/* @__PURE__ */
|
|
3542
|
+
/* @__PURE__ */ jsx119("div", { className: "h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx119("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${pct}%` } }) })
|
|
3475
3543
|
] }, index);
|
|
3476
3544
|
}) })
|
|
3477
3545
|
] });
|
|
3478
3546
|
}
|
|
3479
3547
|
|
|
3480
3548
|
// src/components/marketing/AnnouncementBar.tsx
|
|
3481
|
-
import { jsx as
|
|
3549
|
+
import { jsx as jsx120, jsxs as jsxs92 } from "react/jsx-runtime";
|
|
3482
3550
|
function AnnouncementBar({ children, action, className = "" }) {
|
|
3483
|
-
return /* @__PURE__ */
|
|
3551
|
+
return /* @__PURE__ */ jsx120("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: [
|
|
3484
3552
|
" ",
|
|
3485
|
-
/* @__PURE__ */
|
|
3486
|
-
action ? /* @__PURE__ */
|
|
3553
|
+
/* @__PURE__ */ jsx120("span", { children }),
|
|
3554
|
+
action ? /* @__PURE__ */ jsx120("span", { children: action }) : null
|
|
3487
3555
|
] }) });
|
|
3488
3556
|
}
|
|
3489
3557
|
|
|
3490
3558
|
// src/components/marketing/FAQSection.tsx
|
|
3491
|
-
import { jsx as
|
|
3559
|
+
import { jsx as jsx121, jsxs as jsxs93 } from "react/jsx-runtime";
|
|
3492
3560
|
function FAQSection({ title = "Frequently asked questions", description, items, className = "" }) {
|
|
3493
3561
|
return /* @__PURE__ */ jsxs93("section", { className, children: [
|
|
3494
3562
|
/* @__PURE__ */ jsxs93("div", { className: "mb-6 max-w-2xl", children: [
|
|
3495
|
-
/* @__PURE__ */
|
|
3496
|
-
/* @__PURE__ */
|
|
3497
|
-
description ? /* @__PURE__ */
|
|
3563
|
+
/* @__PURE__ */ jsx121("div", { className: "kicker", children: "FAQ" }),
|
|
3564
|
+
/* @__PURE__ */ jsx121("h2", { className: "mt-2 text-3xl font-semibold tracking-[-0.05em] text-[var(--tapiz-text-primary)]", children: title }),
|
|
3565
|
+
description ? /* @__PURE__ */ jsx121("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
3498
3566
|
] }),
|
|
3499
|
-
/* @__PURE__ */
|
|
3567
|
+
/* @__PURE__ */ jsx121(Accordion, { items: items.map((item, index) => ({ id: `faq-${index}`, title: item.question, content: item.answer })) })
|
|
3500
3568
|
] });
|
|
3501
3569
|
}
|
|
3502
3570
|
|
|
3503
3571
|
// src/components/marketing/RoadmapList.tsx
|
|
3504
|
-
import { jsx as
|
|
3572
|
+
import { jsx as jsx122, jsxs as jsxs94 } from "react/jsx-runtime";
|
|
3505
3573
|
function RoadmapList({ items, className = "" }) {
|
|
3506
|
-
return /* @__PURE__ */
|
|
3574
|
+
return /* @__PURE__ */ jsx122("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: [
|
|
3507
3575
|
/* @__PURE__ */ jsxs94("div", { className: "flex items-center justify-between gap-3", children: [
|
|
3508
|
-
/* @__PURE__ */
|
|
3509
|
-
item.status ? /* @__PURE__ */
|
|
3576
|
+
/* @__PURE__ */ jsx122("span", { className: "kicker", children: item.quarter ?? `0${index + 1}` }),
|
|
3577
|
+
item.status ? /* @__PURE__ */ jsx122(Badge, { children: item.status }) : null
|
|
3510
3578
|
] }),
|
|
3511
|
-
/* @__PURE__ */
|
|
3512
|
-
item.description ? /* @__PURE__ */
|
|
3579
|
+
/* @__PURE__ */ jsx122("h3", { className: "mt-4 font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
3580
|
+
item.description ? /* @__PURE__ */ jsx122("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: item.description }) : null
|
|
3513
3581
|
] }, index)) });
|
|
3514
3582
|
}
|
|
3515
3583
|
|
|
3516
3584
|
// src/components/feedback/InlineStatus.tsx
|
|
3517
|
-
import { jsx as
|
|
3585
|
+
import { jsx as jsx123, jsxs as jsxs95 } from "react/jsx-runtime";
|
|
3518
3586
|
var toneClasses5 = {
|
|
3519
3587
|
neutral: "bg-[var(--tapiz-text-muted)]",
|
|
3520
3588
|
success: "bg-[var(--tapiz-success)]",
|
|
@@ -3524,7 +3592,7 @@ var toneClasses5 = {
|
|
|
3524
3592
|
};
|
|
3525
3593
|
function InlineStatus({ tone: tone2 = "neutral", children, pulse = false, className = "" }) {
|
|
3526
3594
|
return /* @__PURE__ */ jsxs95("span", { className: ["inline-flex items-center gap-2 text-sm text-[var(--tapiz-text-muted)]", className].filter(Boolean).join(" "), children: [
|
|
3527
|
-
/* @__PURE__ */
|
|
3595
|
+
/* @__PURE__ */ jsx123("span", { className: ["h-2 w-2 rounded-full", toneClasses5[tone2], pulse ? "animate-pulse" : ""].filter(Boolean).join(" ") }),
|
|
3528
3596
|
children
|
|
3529
3597
|
] });
|
|
3530
3598
|
}
|
|
@@ -3619,6 +3687,7 @@ export {
|
|
|
3619
3687
|
FormulaIcon,
|
|
3620
3688
|
FunnelChart,
|
|
3621
3689
|
Gear,
|
|
3690
|
+
GitHubIcon,
|
|
3622
3691
|
Globe,
|
|
3623
3692
|
GooglePlayIcon,
|
|
3624
3693
|
GraduationCap,
|
|
@@ -3731,6 +3800,7 @@ export {
|
|
|
3731
3800
|
TextIcon,
|
|
3732
3801
|
Textarea,
|
|
3733
3802
|
TextareaCounter,
|
|
3803
|
+
ThemeIconButton,
|
|
3734
3804
|
Timeline,
|
|
3735
3805
|
Toast,
|
|
3736
3806
|
ToastProvider,
|