@tapizlabs/ui 0.2.11 → 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 +17 -3
- package/dist/index.js +575 -524
- 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,104 +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: "
|
|
575
|
-
] })
|
|
576
|
-
] }),
|
|
577
|
-
variant === "specs" && /* @__PURE__ */ jsxs6(Fragment, { children: [
|
|
578
|
-
/* @__PURE__ */ jsx6("rect", { x: "16", y: "12", width: "32", height: "40", rx: "4", fill: "#fff" }),
|
|
579
|
-
/* @__PURE__ */ jsxs6("g", { fill: "#1496b3", children: [
|
|
580
|
-
/* @__PURE__ */ jsx6("rect", { x: "21", y: "19", width: "22", height: "3.4", rx: "1.7" }),
|
|
581
|
-
/* @__PURE__ */ jsx6("rect", { x: "21", y: "26", width: "22", height: "3.4", rx: "1.7" }),
|
|
582
|
-
/* @__PURE__ */ jsx6("rect", { x: "21", y: "33", width: "14", height: "3.4", rx: "1.7" })
|
|
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" })
|
|
583
544
|
] }),
|
|
584
|
-
/* @__PURE__ */
|
|
585
|
-
"
|
|
586
|
-
{
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
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
|
+
)
|
|
624
|
+
] })
|
|
625
|
+
]
|
|
626
|
+
}
|
|
627
|
+
);
|
|
628
|
+
};
|
|
599
629
|
|
|
600
630
|
// src/components/icons/FormsIcons.tsx
|
|
601
631
|
import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
@@ -1618,8 +1648,27 @@ function InfoBanner(props) {
|
|
|
1618
1648
|
);
|
|
1619
1649
|
}
|
|
1620
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
|
+
|
|
1621
1670
|
// src/components/shared/PageHeader.tsx
|
|
1622
|
-
import { jsx as
|
|
1671
|
+
import { jsx as jsx34, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
1623
1672
|
function PageHeader({
|
|
1624
1673
|
title,
|
|
1625
1674
|
subtitle,
|
|
@@ -1636,25 +1685,25 @@ function PageHeader({
|
|
|
1636
1685
|
const resolvedActions = actions ?? action;
|
|
1637
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";
|
|
1638
1687
|
return /* @__PURE__ */ jsxs23("div", { className: `page-header mb-5 flex flex-col gap-3 animate-fade-in-up ${variantClass} ${className}`.trim(), children: [
|
|
1639
|
-
breadcrumbs ? /* @__PURE__ */
|
|
1688
|
+
breadcrumbs ? /* @__PURE__ */ jsx34("div", { className: "font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: breadcrumbs }) : null,
|
|
1640
1689
|
/* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [
|
|
1641
1690
|
/* @__PURE__ */ jsxs23("div", { className: "min-w-0", children: [
|
|
1642
|
-
subtitle ? /* @__PURE__ */
|
|
1691
|
+
subtitle ? /* @__PURE__ */ jsx34("div", { className: "kicker mb-1.5", children: subtitle }) : null,
|
|
1643
1692
|
/* @__PURE__ */ jsxs23("div", { className: "flex items-center gap-2.5", children: [
|
|
1644
|
-
icon ? /* @__PURE__ */
|
|
1645
|
-
/* @__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 })
|
|
1646
1695
|
] }),
|
|
1647
|
-
description ? /* @__PURE__ */
|
|
1648
|
-
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
|
|
1649
1698
|
] }),
|
|
1650
|
-
resolvedActions ? /* @__PURE__ */
|
|
1699
|
+
resolvedActions ? /* @__PURE__ */ jsx34("div", { className: "flex shrink-0 flex-wrap gap-2", children: resolvedActions }) : null
|
|
1651
1700
|
] }),
|
|
1652
1701
|
banner ? banner : null
|
|
1653
1702
|
] });
|
|
1654
1703
|
}
|
|
1655
1704
|
|
|
1656
1705
|
// src/components/shared/MetricCard.tsx
|
|
1657
|
-
import { jsx as
|
|
1706
|
+
import { jsx as jsx35, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
1658
1707
|
var trendClasses = {
|
|
1659
1708
|
positive: "border-[var(--tapiz-success)] text-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
|
|
1660
1709
|
negative: "border-[var(--tapiz-danger)] text-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)]",
|
|
@@ -1674,22 +1723,22 @@ function MetricCard({
|
|
|
1674
1723
|
return /* @__PURE__ */ jsxs24(Card, { variant, padding: "md", hover: true, className: `relative overflow-hidden ${className}`, children: [
|
|
1675
1724
|
/* @__PURE__ */ jsxs24("div", { className: "flex items-start justify-between gap-4", children: [
|
|
1676
1725
|
/* @__PURE__ */ jsxs24("div", { className: "min-w-0", children: [
|
|
1677
|
-
/* @__PURE__ */
|
|
1678
|
-
/* @__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 })
|
|
1679
1728
|
] }),
|
|
1680
|
-
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
|
|
1681
1730
|
] }),
|
|
1682
1731
|
description || trend ? /* @__PURE__ */ jsxs24("div", { className: "mt-4 flex flex-wrap items-center gap-2", children: [
|
|
1683
|
-
trend ? /* @__PURE__ */
|
|
1684
|
-
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
|
|
1685
1734
|
] }) : null
|
|
1686
1735
|
] });
|
|
1687
1736
|
}
|
|
1688
1737
|
|
|
1689
1738
|
// src/components/shared/StatGrid.tsx
|
|
1690
|
-
import { jsx as
|
|
1739
|
+
import { jsx as jsx36 } from "react/jsx-runtime";
|
|
1691
1740
|
function StatGrid({ children, className = "", minColumnWidth = "14rem" }) {
|
|
1692
|
-
return /* @__PURE__ */
|
|
1741
|
+
return /* @__PURE__ */ jsx36(
|
|
1693
1742
|
"div",
|
|
1694
1743
|
{
|
|
1695
1744
|
className: `grid gap-4 ${className}`,
|
|
@@ -1700,23 +1749,23 @@ function StatGrid({ children, className = "", minColumnWidth = "14rem" }) {
|
|
|
1700
1749
|
}
|
|
1701
1750
|
|
|
1702
1751
|
// src/components/shared/SectionCard.tsx
|
|
1703
|
-
import { jsx as
|
|
1752
|
+
import { jsx as jsx37, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
1704
1753
|
function SectionCard({ title, eyebrow, description, action, children, className = "" }) {
|
|
1705
1754
|
return /* @__PURE__ */ jsxs25(Card, { variant: "surface", padding: "none", className, children: [
|
|
1706
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: [
|
|
1707
1756
|
/* @__PURE__ */ jsxs25("div", { className: "min-w-0", children: [
|
|
1708
|
-
eyebrow ? /* @__PURE__ */
|
|
1709
|
-
title ? /* @__PURE__ */
|
|
1710
|
-
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
|
|
1711
1760
|
] }),
|
|
1712
|
-
action ? /* @__PURE__ */
|
|
1761
|
+
action ? /* @__PURE__ */ jsx37("div", { className: "shrink-0", children: action }) : null
|
|
1713
1762
|
] }) : null,
|
|
1714
|
-
/* @__PURE__ */
|
|
1763
|
+
/* @__PURE__ */ jsx37("div", { className: "p-5", children })
|
|
1715
1764
|
] });
|
|
1716
1765
|
}
|
|
1717
1766
|
|
|
1718
1767
|
// src/components/shared/SearchInput.tsx
|
|
1719
|
-
import { jsx as
|
|
1768
|
+
import { jsx as jsx38, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
1720
1769
|
function SearchInput({
|
|
1721
1770
|
value,
|
|
1722
1771
|
onChange,
|
|
@@ -1730,8 +1779,8 @@ function SearchInput({
|
|
|
1730
1779
|
...props
|
|
1731
1780
|
}) {
|
|
1732
1781
|
return /* @__PURE__ */ jsxs26("div", { className: `relative ${wrapperClassName}`.trim(), style: wrapperStyle, children: [
|
|
1733
|
-
/* @__PURE__ */
|
|
1734
|
-
/* @__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(
|
|
1735
1784
|
Input,
|
|
1736
1785
|
{
|
|
1737
1786
|
...props,
|
|
@@ -1742,21 +1791,21 @@ function SearchInput({
|
|
|
1742
1791
|
className: `pl-9 ${inputClassName}`.trim()
|
|
1743
1792
|
}
|
|
1744
1793
|
),
|
|
1745
|
-
clearable && value ? /* @__PURE__ */
|
|
1794
|
+
clearable && value ? /* @__PURE__ */ jsx38(
|
|
1746
1795
|
"button",
|
|
1747
1796
|
{
|
|
1748
1797
|
type: "button",
|
|
1749
1798
|
onClick: () => onChange(""),
|
|
1750
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",
|
|
1751
1800
|
title: clearTitle,
|
|
1752
|
-
children: /* @__PURE__ */
|
|
1801
|
+
children: /* @__PURE__ */ jsx38(X, { size: 14 })
|
|
1753
1802
|
}
|
|
1754
1803
|
) : null
|
|
1755
1804
|
] });
|
|
1756
1805
|
}
|
|
1757
1806
|
|
|
1758
1807
|
// src/components/shared/Pagination.tsx
|
|
1759
|
-
import { jsx as
|
|
1808
|
+
import { jsx as jsx39, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
1760
1809
|
function getPageNumbers(page, totalPages) {
|
|
1761
1810
|
if (totalPages <= 7) return Array.from({ length: totalPages }, (_, i) => i + 1);
|
|
1762
1811
|
const pages = [1];
|
|
@@ -1781,7 +1830,7 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
|
|
|
1781
1830
|
const from = pageSize ? (page - 1) * pageSize + 1 : null;
|
|
1782
1831
|
const to = pageSize && totalItems ? Math.min(page * pageSize, totalItems) : null;
|
|
1783
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: [
|
|
1784
|
-
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 }) }),
|
|
1785
1834
|
/* @__PURE__ */ jsxs27("div", { className: "order-1 flex items-center gap-1 sm:order-2", children: [
|
|
1786
1835
|
/* @__PURE__ */ jsxs27(
|
|
1787
1836
|
"button",
|
|
@@ -1792,13 +1841,13 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
|
|
|
1792
1841
|
title: copy.prevTitle,
|
|
1793
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",
|
|
1794
1843
|
children: [
|
|
1795
|
-
/* @__PURE__ */
|
|
1796
|
-
/* @__PURE__ */
|
|
1844
|
+
/* @__PURE__ */ jsx39(ChevronLeft, { size: 12 }),
|
|
1845
|
+
/* @__PURE__ */ jsx39("span", { className: "hidden sm:inline", children: copy.prev })
|
|
1797
1846
|
]
|
|
1798
1847
|
}
|
|
1799
1848
|
),
|
|
1800
|
-
/* @__PURE__ */
|
|
1801
|
-
(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(
|
|
1802
1851
|
"button",
|
|
1803
1852
|
{
|
|
1804
1853
|
type: "button",
|
|
@@ -1818,8 +1867,8 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
|
|
|
1818
1867
|
title: copy.nextTitle,
|
|
1819
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",
|
|
1820
1869
|
children: [
|
|
1821
|
-
/* @__PURE__ */
|
|
1822
|
-
/* @__PURE__ */
|
|
1870
|
+
/* @__PURE__ */ jsx39("span", { className: "hidden sm:inline", children: copy.next }),
|
|
1871
|
+
/* @__PURE__ */ jsx39(ChevronRight, { size: 12 })
|
|
1823
1872
|
]
|
|
1824
1873
|
}
|
|
1825
1874
|
)
|
|
@@ -1828,13 +1877,13 @@ function Pagination({ page, totalPages, onChange, totalItems, pageSize, labels }
|
|
|
1828
1877
|
}
|
|
1829
1878
|
|
|
1830
1879
|
// src/components/shared/SectionTitle.tsx
|
|
1831
|
-
import { jsx as
|
|
1880
|
+
import { jsx as jsx40 } from "react/jsx-runtime";
|
|
1832
1881
|
function SectionTitle({ children, className = "" }) {
|
|
1833
|
-
return /* @__PURE__ */
|
|
1882
|
+
return /* @__PURE__ */ jsx40("h3", { className: `mb-1 text-sm font-semibold text-txt-1 ${className}`.trim(), children });
|
|
1834
1883
|
}
|
|
1835
1884
|
|
|
1836
1885
|
// src/components/shared/StatusBadge.tsx
|
|
1837
|
-
import { jsx as
|
|
1886
|
+
import { jsx as jsx41 } from "react/jsx-runtime";
|
|
1838
1887
|
var BASE = "inline-flex items-center border px-2 py-0.5 font-mono text-[9px] font-bold uppercase tracking-[0.15em]";
|
|
1839
1888
|
var variantStyles = {
|
|
1840
1889
|
default: "border-[var(--tapiz-border-strong)] text-[var(--tapiz-text-secondary)] bg-[var(--tapiz-bg-surface-muted)]",
|
|
@@ -1847,13 +1896,13 @@ var variantStyles = {
|
|
|
1847
1896
|
pending: "border-[var(--tapiz-text-muted)] text-[var(--tapiz-text-muted)] bg-transparent"
|
|
1848
1897
|
};
|
|
1849
1898
|
function StatusBadge({ label, variant = "default", className = "" }) {
|
|
1850
|
-
return /* @__PURE__ */
|
|
1899
|
+
return /* @__PURE__ */ jsx41("span", { className: `${BASE} ${variantStyles[variant]} ${className}`.trim(), children: label });
|
|
1851
1900
|
}
|
|
1852
1901
|
|
|
1853
1902
|
// src/components/shared/ActionMenu.tsx
|
|
1854
1903
|
import { useEffect as useEffect2, useLayoutEffect, useRef as useRef2, useState as useState5 } from "react";
|
|
1855
1904
|
import { createPortal as createPortal4 } from "react-dom";
|
|
1856
|
-
import { Fragment as Fragment2, jsx as
|
|
1905
|
+
import { Fragment as Fragment2, jsx as jsx42, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
1857
1906
|
var defaultMenuStyle = {
|
|
1858
1907
|
background: "var(--color-ink-200)",
|
|
1859
1908
|
border: "1px solid var(--color-border-hi)",
|
|
@@ -1938,8 +1987,8 @@ function ActionMenu({
|
|
|
1938
1987
|
};
|
|
1939
1988
|
}, [open]);
|
|
1940
1989
|
const menuNode = open && pos ? /* @__PURE__ */ jsxs28(Fragment2, { children: [
|
|
1941
|
-
/* @__PURE__ */
|
|
1942
|
-
/* @__PURE__ */
|
|
1990
|
+
/* @__PURE__ */ jsx42("div", { className: "fixed inset-0 z-9998", onClick: () => setOpen(false) }),
|
|
1991
|
+
/* @__PURE__ */ jsx42(
|
|
1943
1992
|
"div",
|
|
1944
1993
|
{
|
|
1945
1994
|
ref: menuRef,
|
|
@@ -1957,7 +2006,7 @@ function ActionMenu({
|
|
|
1957
2006
|
...menuStyle
|
|
1958
2007
|
},
|
|
1959
2008
|
children: items.map((item, index) => /* @__PURE__ */ jsxs28("div", { children: [
|
|
1960
|
-
index > 0 && item.danger ? /* @__PURE__ */
|
|
2009
|
+
index > 0 && item.danger ? /* @__PURE__ */ jsx42("div", { style: { borderTop: "1px solid var(--color-border)" } }) : null,
|
|
1961
2010
|
/* @__PURE__ */ jsxs28(
|
|
1962
2011
|
"button",
|
|
1963
2012
|
{
|
|
@@ -1970,8 +2019,8 @@ function ActionMenu({
|
|
|
1970
2019
|
item.onSelect();
|
|
1971
2020
|
},
|
|
1972
2021
|
children: [
|
|
1973
|
-
item.loading ? /* @__PURE__ */
|
|
1974
|
-
/* @__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 })
|
|
1975
2024
|
]
|
|
1976
2025
|
}
|
|
1977
2026
|
)
|
|
@@ -1980,13 +2029,13 @@ function ActionMenu({
|
|
|
1980
2029
|
)
|
|
1981
2030
|
] }) : null;
|
|
1982
2031
|
return /* @__PURE__ */ jsxs28("div", { ref: btnRef, className: fullWidth ? "relative w-full" : "relative inline-block max-w-full", children: [
|
|
1983
|
-
/* @__PURE__ */
|
|
2032
|
+
/* @__PURE__ */ jsx42(
|
|
1984
2033
|
Button,
|
|
1985
2034
|
{
|
|
1986
2035
|
size: buttonSize,
|
|
1987
2036
|
variant: buttonVariant,
|
|
1988
2037
|
icon,
|
|
1989
|
-
iconRight: /* @__PURE__ */
|
|
2038
|
+
iconRight: /* @__PURE__ */ jsx42(ChevronDown, { size: 11 }),
|
|
1990
2039
|
onClick: () => setOpen((value) => !value),
|
|
1991
2040
|
className: buttonClassName,
|
|
1992
2041
|
fullWidth,
|
|
@@ -2002,7 +2051,7 @@ import { useMemo as useMemo2, useState as useState6 } from "react";
|
|
|
2002
2051
|
|
|
2003
2052
|
// src/components/table/DataTableRow.tsx
|
|
2004
2053
|
import { memo } from "react";
|
|
2005
|
-
import { jsx as
|
|
2054
|
+
import { jsx as jsx43, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
2006
2055
|
var ALIGN_CLASS = {
|
|
2007
2056
|
left: "text-left",
|
|
2008
2057
|
center: "text-center",
|
|
@@ -2016,7 +2065,7 @@ function DataTableRowInner({ row, columns, onRowClick, rowActions, densityCellCl
|
|
|
2016
2065
|
onClick: clickable ? () => onRowClick?.(row) : void 0,
|
|
2017
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" : ""}`,
|
|
2018
2067
|
children: [
|
|
2019
|
-
columns.map((column) => /* @__PURE__ */
|
|
2068
|
+
columns.map((column) => /* @__PURE__ */ jsx43(
|
|
2020
2069
|
"td",
|
|
2021
2070
|
{
|
|
2022
2071
|
className: `${densityCellClass} text-xs text-[var(--tapiz-text-secondary)] ${ALIGN_CLASS[column.align ?? "left"]} ${column.className ?? ""}`,
|
|
@@ -2024,7 +2073,7 @@ function DataTableRowInner({ row, columns, onRowClick, rowActions, densityCellCl
|
|
|
2024
2073
|
},
|
|
2025
2074
|
column.id
|
|
2026
2075
|
)),
|
|
2027
|
-
rowActions !== void 0 && /* @__PURE__ */
|
|
2076
|
+
rowActions !== void 0 && /* @__PURE__ */ jsx43("td", { className: `${densityCellClass} text-right`, children: rowActions(row) })
|
|
2028
2077
|
]
|
|
2029
2078
|
}
|
|
2030
2079
|
);
|
|
@@ -2032,7 +2081,7 @@ function DataTableRowInner({ row, columns, onRowClick, rowActions, densityCellCl
|
|
|
2032
2081
|
var DataTableRow = memo(DataTableRowInner);
|
|
2033
2082
|
|
|
2034
2083
|
// src/components/table/DataTable.tsx
|
|
2035
|
-
import { jsx as
|
|
2084
|
+
import { jsx as jsx44, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
2036
2085
|
var ALIGN_CLASS2 = {
|
|
2037
2086
|
left: "text-left",
|
|
2038
2087
|
center: "text-center",
|
|
@@ -2101,17 +2150,17 @@ function DataTable({
|
|
|
2101
2150
|
className
|
|
2102
2151
|
].filter(Boolean).join(" ");
|
|
2103
2152
|
return /* @__PURE__ */ jsxs30("div", { className: wrapperClass, children: [
|
|
2104
|
-
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))) }),
|
|
2105
2154
|
/* @__PURE__ */ jsxs30("table", { className: tableClass, children: [
|
|
2106
|
-
/* @__PURE__ */
|
|
2155
|
+
/* @__PURE__ */ jsx44("thead", { children: /* @__PURE__ */ jsxs30("tr", { className: "border-b border-border bg-ink-300", children: [
|
|
2107
2156
|
columns.map((column) => {
|
|
2108
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`;
|
|
2109
2158
|
if (!column.sortable || !column.sortAccessor) {
|
|
2110
|
-
return /* @__PURE__ */
|
|
2159
|
+
return /* @__PURE__ */ jsx44("th", { scope: "col", className: baseClass, children: column.header }, column.id);
|
|
2111
2160
|
}
|
|
2112
2161
|
const active = serverSort ? serverSort.field === column.id : sort?.columnId === column.id;
|
|
2113
2162
|
const direction = serverSort ? serverSort.dir : sort?.direction ?? "asc";
|
|
2114
|
-
return /* @__PURE__ */
|
|
2163
|
+
return /* @__PURE__ */ jsx44(
|
|
2115
2164
|
"th",
|
|
2116
2165
|
{
|
|
2117
2166
|
scope: "col",
|
|
@@ -2125,7 +2174,7 @@ function DataTable({
|
|
|
2125
2174
|
className: `inline-flex items-center gap-1 select-none transition-colors hover:text-txt-1 ${active ? "text-txt-1" : ""}`,
|
|
2126
2175
|
children: [
|
|
2127
2176
|
column.header,
|
|
2128
|
-
active && (direction === "asc" ? /* @__PURE__ */
|
|
2177
|
+
active && (direction === "asc" ? /* @__PURE__ */ jsx44(ChevronUp, { size: 12 }) : /* @__PURE__ */ jsx44(ChevronDown, { size: 12 }))
|
|
2129
2178
|
]
|
|
2130
2179
|
}
|
|
2131
2180
|
)
|
|
@@ -2133,9 +2182,9 @@ function DataTable({
|
|
|
2133
2182
|
column.id
|
|
2134
2183
|
);
|
|
2135
2184
|
}),
|
|
2136
|
-
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" })
|
|
2137
2186
|
] }) }),
|
|
2138
|
-
/* @__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(
|
|
2139
2188
|
DataTableRow,
|
|
2140
2189
|
{
|
|
2141
2190
|
row,
|
|
@@ -2153,9 +2202,9 @@ function DataTable({
|
|
|
2153
2202
|
}
|
|
2154
2203
|
|
|
2155
2204
|
// src/components/marketing/MarketingShell.tsx
|
|
2156
|
-
import { jsx as
|
|
2205
|
+
import { jsx as jsx45 } from "react/jsx-runtime";
|
|
2157
2206
|
function MarketingShell({ children, className = "", grid = true, noise = true }) {
|
|
2158
|
-
return /* @__PURE__ */
|
|
2207
|
+
return /* @__PURE__ */ jsx45(
|
|
2159
2208
|
"main",
|
|
2160
2209
|
{
|
|
2161
2210
|
className: [
|
|
@@ -2170,93 +2219,93 @@ function MarketingShell({ children, className = "", grid = true, noise = true })
|
|
|
2170
2219
|
}
|
|
2171
2220
|
|
|
2172
2221
|
// src/components/marketing/HeroFrame.tsx
|
|
2173
|
-
import { jsx as
|
|
2222
|
+
import { jsx as jsx46, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2174
2223
|
function HeroFrame({ eyebrow, title, description, actions, visual, meta, className = "" }) {
|
|
2175
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: [
|
|
2176
2225
|
/* @__PURE__ */ jsxs31("div", { className: "animate-fade-in-up", children: [
|
|
2177
|
-
eyebrow ? /* @__PURE__ */
|
|
2178
|
-
/* @__PURE__ */
|
|
2179
|
-
description ? /* @__PURE__ */
|
|
2180
|
-
actions ? /* @__PURE__ */
|
|
2181
|
-
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
|
|
2182
2231
|
] }),
|
|
2183
|
-
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
|
|
2184
2233
|
] });
|
|
2185
2234
|
}
|
|
2186
2235
|
|
|
2187
2236
|
// src/components/marketing/FeatureCard.tsx
|
|
2188
|
-
import { jsx as
|
|
2237
|
+
import { jsx as jsx47, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
2189
2238
|
function FeatureCard({ title, description, icon, eyebrow, children, className = "", variant = "surface" }) {
|
|
2190
2239
|
return /* @__PURE__ */ jsxs32(Card, { variant, hover: true, className: `group ${className}`, children: [
|
|
2191
2240
|
/* @__PURE__ */ jsxs32("div", { className: "flex items-start gap-4", children: [
|
|
2192
|
-
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,
|
|
2193
2242
|
/* @__PURE__ */ jsxs32("div", { className: "min-w-0", children: [
|
|
2194
|
-
eyebrow ? /* @__PURE__ */
|
|
2195
|
-
/* @__PURE__ */
|
|
2196
|
-
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
|
|
2197
2246
|
] })
|
|
2198
2247
|
] }),
|
|
2199
|
-
children ? /* @__PURE__ */
|
|
2248
|
+
children ? /* @__PURE__ */ jsx47("div", { className: "mt-5", children }) : null
|
|
2200
2249
|
] });
|
|
2201
2250
|
}
|
|
2202
2251
|
|
|
2203
2252
|
// src/components/marketing/FeatureGrid.tsx
|
|
2204
|
-
import { jsx as
|
|
2253
|
+
import { jsx as jsx48 } from "react/jsx-runtime";
|
|
2205
2254
|
function FeatureGrid({ children, className = "" }) {
|
|
2206
|
-
return /* @__PURE__ */
|
|
2255
|
+
return /* @__PURE__ */ jsx48("div", { className: `grid gap-4 md:grid-cols-2 xl:grid-cols-3 ${className}`, children });
|
|
2207
2256
|
}
|
|
2208
2257
|
|
|
2209
2258
|
// src/components/marketing/CTASection.tsx
|
|
2210
|
-
import { jsx as
|
|
2259
|
+
import { jsx as jsx49, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
2211
2260
|
function CTASection({ eyebrow, title, description, actions, className = "" }) {
|
|
2212
|
-
return /* @__PURE__ */
|
|
2213
|
-
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,
|
|
2214
2263
|
/* @__PURE__ */ jsxs33("div", { className: "grid gap-6 lg:grid-cols-[1fr_auto] lg:items-end", children: [
|
|
2215
2264
|
/* @__PURE__ */ jsxs33("div", { children: [
|
|
2216
|
-
/* @__PURE__ */
|
|
2217
|
-
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
|
|
2218
2267
|
] }),
|
|
2219
|
-
actions ? /* @__PURE__ */
|
|
2268
|
+
actions ? /* @__PURE__ */ jsx49("div", { className: "flex flex-wrap gap-3", children: actions }) : null
|
|
2220
2269
|
] })
|
|
2221
2270
|
] }) });
|
|
2222
2271
|
}
|
|
2223
2272
|
|
|
2224
2273
|
// src/components/marketing/MockupFrame.tsx
|
|
2225
|
-
import { jsx as
|
|
2274
|
+
import { jsx as jsx50, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
2226
2275
|
function MockupFrame({ children, title, toolbar, className = "" }) {
|
|
2227
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: [
|
|
2228
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: [
|
|
2229
2278
|
/* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-1.5", children: [
|
|
2230
|
-
/* @__PURE__ */
|
|
2231
|
-
/* @__PURE__ */
|
|
2232
|
-
/* @__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)]" })
|
|
2233
2282
|
] }),
|
|
2234
|
-
title ? /* @__PURE__ */
|
|
2235
|
-
/* @__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 })
|
|
2236
2285
|
] }),
|
|
2237
|
-
/* @__PURE__ */
|
|
2286
|
+
/* @__PURE__ */ jsx50("div", { className: "p-4", children })
|
|
2238
2287
|
] });
|
|
2239
2288
|
}
|
|
2240
2289
|
|
|
2241
2290
|
// src/components/marketing/ComparisonTable.tsx
|
|
2242
|
-
import { jsx as
|
|
2291
|
+
import { jsx as jsx51, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
2243
2292
|
function ComparisonTable({ rows, featureHeader = "Feature", includedHeader = "Tapiz", alternativeHeader = "Other", className = "" }) {
|
|
2244
|
-
return /* @__PURE__ */
|
|
2245
|
-
/* @__PURE__ */
|
|
2246
|
-
/* @__PURE__ */
|
|
2247
|
-
/* @__PURE__ */
|
|
2248
|
-
/* @__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 })
|
|
2249
2298
|
] }) }),
|
|
2250
|
-
/* @__PURE__ */
|
|
2251
|
-
/* @__PURE__ */
|
|
2252
|
-
/* @__PURE__ */
|
|
2253
|
-
/* @__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 })
|
|
2254
2303
|
] }, index)) })
|
|
2255
2304
|
] }) });
|
|
2256
2305
|
}
|
|
2257
2306
|
|
|
2258
2307
|
// src/components/layout/AppShell.tsx
|
|
2259
|
-
import { jsx as
|
|
2308
|
+
import { jsx as jsx52, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
2260
2309
|
var variantClasses4 = {
|
|
2261
2310
|
default: "bg-[var(--tapiz-bg-page)]",
|
|
2262
2311
|
grid: "bg-[var(--tapiz-bg-page)] tapiz-grid-bg",
|
|
@@ -2266,15 +2315,15 @@ function AppShell({ sidebar, topbar, children, aside, className = "", contentCla
|
|
|
2266
2315
|
return /* @__PURE__ */ jsxs36("div", { className: `min-h-screen text-[var(--tapiz-text-primary)] ${variantClasses4[variant]} ${className}`, children: [
|
|
2267
2316
|
topbar,
|
|
2268
2317
|
/* @__PURE__ */ jsxs36("div", { className: "mx-auto flex w-full max-w-[1600px]", children: [
|
|
2269
|
-
sidebar ? /* @__PURE__ */
|
|
2270
|
-
/* @__PURE__ */
|
|
2271
|
-
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
|
|
2272
2321
|
] })
|
|
2273
2322
|
] });
|
|
2274
2323
|
}
|
|
2275
2324
|
|
|
2276
2325
|
// src/components/layout/SplitPane.tsx
|
|
2277
|
-
import { jsx as
|
|
2326
|
+
import { jsx as jsx53, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
2278
2327
|
var ratios = {
|
|
2279
2328
|
"50/50": "lg:grid-cols-2",
|
|
2280
2329
|
"60/40": "lg:grid-cols-[minmax(0,3fr)_minmax(320px,2fr)]",
|
|
@@ -2282,48 +2331,48 @@ var ratios = {
|
|
|
2282
2331
|
};
|
|
2283
2332
|
function SplitPane({ primary, secondary, ratio = "60/40", reverseOnMobile = false, className = "" }) {
|
|
2284
2333
|
return /* @__PURE__ */ jsxs37("div", { className: `grid gap-5 ${ratios[ratio]} ${className}`, children: [
|
|
2285
|
-
/* @__PURE__ */
|
|
2286
|
-
/* @__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 })
|
|
2287
2336
|
] });
|
|
2288
2337
|
}
|
|
2289
2338
|
|
|
2290
2339
|
// src/components/layout/Stack.tsx
|
|
2291
|
-
import { jsx as
|
|
2340
|
+
import { jsx as jsx54 } from "react/jsx-runtime";
|
|
2292
2341
|
var gapClasses = { xs: "gap-1", sm: "gap-2", md: "gap-4", lg: "gap-6", xl: "gap-8" };
|
|
2293
2342
|
var alignClasses = { start: "items-start", center: "items-center", end: "items-end", stretch: "items-stretch" };
|
|
2294
2343
|
var justifyClasses = { start: "justify-start", center: "justify-center", between: "justify-between", end: "justify-end" };
|
|
2295
2344
|
function Stack({ children, gap = "md", direction = "vertical", align = "stretch", justify = "start", wrap = false, className = "" }) {
|
|
2296
|
-
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 });
|
|
2297
2346
|
}
|
|
2298
2347
|
|
|
2299
2348
|
// src/components/layout/Cluster.tsx
|
|
2300
|
-
import { jsx as
|
|
2349
|
+
import { jsx as jsx55 } from "react/jsx-runtime";
|
|
2301
2350
|
var gapClasses2 = { xs: "gap-1", sm: "gap-2", md: "gap-3", lg: "gap-5" };
|
|
2302
2351
|
var alignClasses2 = { start: "items-start", center: "items-center", end: "items-end" };
|
|
2303
2352
|
var justifyClasses2 = { start: "justify-start", center: "justify-center", between: "justify-between", end: "justify-end" };
|
|
2304
2353
|
function Cluster({ children, gap = "sm", align = "center", justify = "start", className = "" }) {
|
|
2305
|
-
return /* @__PURE__ */
|
|
2354
|
+
return /* @__PURE__ */ jsx55("div", { className: `flex flex-wrap ${gapClasses2[gap]} ${alignClasses2[align]} ${justifyClasses2[justify]} ${className}`, children });
|
|
2306
2355
|
}
|
|
2307
2356
|
|
|
2308
2357
|
// src/components/navigation/Breadcrumbs.tsx
|
|
2309
|
-
import { jsx as
|
|
2358
|
+
import { jsx as jsx56, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
2310
2359
|
function Breadcrumbs({ items, separator = "/", className = "" }) {
|
|
2311
|
-
return /* @__PURE__ */
|
|
2312
|
-
index > 0 ? /* @__PURE__ */
|
|
2313
|
-
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 })
|
|
2314
2363
|
] }, index)) }) });
|
|
2315
2364
|
}
|
|
2316
2365
|
|
|
2317
2366
|
// src/components/navigation/SidebarNav.tsx
|
|
2318
|
-
import { Fragment as Fragment3, jsx as
|
|
2367
|
+
import { Fragment as Fragment3, jsx as jsx57, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
2319
2368
|
function SidebarNav({ groups, header, footer, className = "" }) {
|
|
2320
2369
|
return /* @__PURE__ */ jsxs39("div", { className: `flex h-full min-h-screen flex-col bg-[var(--tapiz-bg-surface)] ${className}`, children: [
|
|
2321
|
-
header ? /* @__PURE__ */
|
|
2322
|
-
/* @__PURE__ */
|
|
2323
|
-
group.label ? /* @__PURE__ */
|
|
2324
|
-
/* @__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)) })
|
|
2325
2374
|
] }, groupIndex)) }),
|
|
2326
|
-
footer ? /* @__PURE__ */
|
|
2375
|
+
footer ? /* @__PURE__ */ jsx57("div", { className: "border-t border-[var(--tapiz-border-subtle)] p-4", children: footer }) : null
|
|
2327
2376
|
] });
|
|
2328
2377
|
}
|
|
2329
2378
|
function SidebarNavLink({ item }) {
|
|
@@ -2333,28 +2382,28 @@ function SidebarNavLink({ item }) {
|
|
|
2333
2382
|
item.disabled ? "pointer-events-none opacity-40" : ""
|
|
2334
2383
|
].filter(Boolean).join(" ");
|
|
2335
2384
|
const content = /* @__PURE__ */ jsxs39(Fragment3, { children: [
|
|
2336
|
-
item.icon ? /* @__PURE__ */
|
|
2337
|
-
/* @__PURE__ */
|
|
2338
|
-
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
|
|
2339
2388
|
] });
|
|
2340
|
-
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 });
|
|
2341
2390
|
}
|
|
2342
2391
|
|
|
2343
2392
|
// src/components/navigation/TopNav.tsx
|
|
2344
|
-
import { jsx as
|
|
2393
|
+
import { jsx as jsx58, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
2345
2394
|
function TopNav({ brand, links = [], actions, className = "", sticky = true }) {
|
|
2346
|
-
return /* @__PURE__ */
|
|
2347
|
-
brand ? /* @__PURE__ */
|
|
2348
|
-
/* @__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) => {
|
|
2349
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)]"}`;
|
|
2350
|
-
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);
|
|
2351
2400
|
}) }),
|
|
2352
|
-
actions ? /* @__PURE__ */
|
|
2401
|
+
actions ? /* @__PURE__ */ jsx58("div", { className: "ml-auto flex items-center gap-2", children: actions }) : null
|
|
2353
2402
|
] }) });
|
|
2354
2403
|
}
|
|
2355
2404
|
|
|
2356
2405
|
// src/components/disclosure/Tabs.tsx
|
|
2357
|
-
import { jsx as
|
|
2406
|
+
import { jsx as jsx59, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
2358
2407
|
var variants = {
|
|
2359
2408
|
line: "border-b border-[var(--tapiz-border-subtle)]",
|
|
2360
2409
|
boxed: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-1",
|
|
@@ -2363,7 +2412,7 @@ var variants = {
|
|
|
2363
2412
|
function Tabs({ items, activeId, onChange, className = "", variant = "line" }) {
|
|
2364
2413
|
const active = items.find((item) => item.id === activeId) ?? items[0];
|
|
2365
2414
|
return /* @__PURE__ */ jsxs41("div", { className, children: [
|
|
2366
|
-
/* @__PURE__ */
|
|
2415
|
+
/* @__PURE__ */ jsx59("div", { role: "tablist", className: `flex flex-wrap gap-1 ${variants[variant]}`, children: items.map((item) => {
|
|
2367
2416
|
const selected = item.id === active?.id;
|
|
2368
2417
|
return /* @__PURE__ */ jsxs41(
|
|
2369
2418
|
"button",
|
|
@@ -2382,14 +2431,14 @@ function Tabs({ items, activeId, onChange, className = "", variant = "line" }) {
|
|
|
2382
2431
|
item.id
|
|
2383
2432
|
);
|
|
2384
2433
|
}) }),
|
|
2385
|
-
/* @__PURE__ */
|
|
2434
|
+
/* @__PURE__ */ jsx59("div", { role: "tabpanel", className: "pt-4", children: active?.content })
|
|
2386
2435
|
] });
|
|
2387
2436
|
}
|
|
2388
2437
|
|
|
2389
2438
|
// src/components/disclosure/Accordion.tsx
|
|
2390
|
-
import { jsx as
|
|
2439
|
+
import { jsx as jsx60, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
2391
2440
|
function Accordion({ items, openIds = [], onToggle, className = "" }) {
|
|
2392
|
-
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) => {
|
|
2393
2442
|
const open = openIds.includes(item.id);
|
|
2394
2443
|
return /* @__PURE__ */ jsxs42("section", { children: [
|
|
2395
2444
|
/* @__PURE__ */ jsxs42(
|
|
@@ -2401,21 +2450,21 @@ function Accordion({ items, openIds = [], onToggle, className = "" }) {
|
|
|
2401
2450
|
onClick: () => onToggle?.(item.id),
|
|
2402
2451
|
className: "flex w-full items-center justify-between gap-4 px-4 py-3 text-left disabled:opacity-40",
|
|
2403
2452
|
children: [
|
|
2404
|
-
/* @__PURE__ */
|
|
2453
|
+
/* @__PURE__ */ jsx60("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
2405
2454
|
/* @__PURE__ */ jsxs42("span", { className: "flex items-center gap-3 text-[var(--tapiz-text-muted)]", children: [
|
|
2406
2455
|
item.meta,
|
|
2407
|
-
/* @__PURE__ */
|
|
2456
|
+
/* @__PURE__ */ jsx60("span", { "aria-hidden": "true", className: "font-mono text-lg", children: open ? "\u2212" : "+" })
|
|
2408
2457
|
] })
|
|
2409
2458
|
]
|
|
2410
2459
|
}
|
|
2411
2460
|
),
|
|
2412
|
-
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
|
|
2413
2462
|
] }, item.id);
|
|
2414
2463
|
}) });
|
|
2415
2464
|
}
|
|
2416
2465
|
|
|
2417
2466
|
// src/components/disclosure/Stepper.tsx
|
|
2418
|
-
import { jsx as
|
|
2467
|
+
import { jsx as jsx61, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
2419
2468
|
var tone = {
|
|
2420
2469
|
complete: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
|
|
2421
2470
|
current: "border-[var(--tapiz-accent)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-accent)]",
|
|
@@ -2423,65 +2472,65 @@ var tone = {
|
|
|
2423
2472
|
error: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]"
|
|
2424
2473
|
};
|
|
2425
2474
|
function Stepper({ steps, orientation = "horizontal", className = "" }) {
|
|
2426
|
-
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) => {
|
|
2427
2476
|
const status = step.status ?? "upcoming";
|
|
2428
2477
|
return /* @__PURE__ */ jsxs43("li", { className: "flex gap-3", children: [
|
|
2429
|
-
/* @__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 }),
|
|
2430
2479
|
/* @__PURE__ */ jsxs43("span", { className: "min-w-0", children: [
|
|
2431
|
-
/* @__PURE__ */
|
|
2432
|
-
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
|
|
2433
2482
|
] })
|
|
2434
2483
|
] }, step.id);
|
|
2435
2484
|
}) });
|
|
2436
2485
|
}
|
|
2437
2486
|
|
|
2438
2487
|
// src/components/overlays/Drawer.tsx
|
|
2439
|
-
import { jsx as
|
|
2488
|
+
import { jsx as jsx62, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
2440
2489
|
function Drawer({ open, onClose, title, description, children, footer, side = "right", className = "" }) {
|
|
2441
2490
|
if (!open) return null;
|
|
2442
2491
|
return /* @__PURE__ */ jsxs44("div", { className: "fixed inset-0 z-50", children: [
|
|
2443
|
-
/* @__PURE__ */
|
|
2492
|
+
/* @__PURE__ */ jsx62("button", { type: "button", "aria-label": "Close drawer", className: "absolute inset-0 bg-(--tapiz-bg-overlay)", onClick: onClose }),
|
|
2444
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: [
|
|
2445
2494
|
/* @__PURE__ */ jsxs44("header", { className: "flex items-start justify-between gap-4 border-b border-(--tapiz-border-subtle) p-5", children: [
|
|
2446
2495
|
/* @__PURE__ */ jsxs44("div", { children: [
|
|
2447
|
-
title ? /* @__PURE__ */
|
|
2448
|
-
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
|
|
2449
2498
|
] }),
|
|
2450
|
-
/* @__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" })
|
|
2451
2500
|
] }),
|
|
2452
|
-
/* @__PURE__ */
|
|
2453
|
-
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
|
|
2454
2503
|
] })
|
|
2455
2504
|
] });
|
|
2456
2505
|
}
|
|
2457
2506
|
|
|
2458
2507
|
// src/components/overlays/Popover.tsx
|
|
2459
|
-
import { jsx as
|
|
2508
|
+
import { jsx as jsx63, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
2460
2509
|
function Popover({ trigger, children, open = false, align = "start", className = "" }) {
|
|
2461
2510
|
return /* @__PURE__ */ jsxs45("div", { className: `relative inline-block ${className}`, children: [
|
|
2462
2511
|
trigger,
|
|
2463
|
-
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
|
|
2464
2513
|
] });
|
|
2465
2514
|
}
|
|
2466
2515
|
|
|
2467
2516
|
// src/components/overlays/CommandMenu.tsx
|
|
2468
|
-
import { jsx as
|
|
2517
|
+
import { jsx as jsx64, jsxs as jsxs46 } from "react/jsx-runtime";
|
|
2469
2518
|
function CommandMenu({ open, onClose, query = "", onQueryChange, groups, placeholder = "Search commands\u2026", empty = "No commands found." }) {
|
|
2470
2519
|
if (!open) return null;
|
|
2471
2520
|
const hasItems = groups.some((group) => group.items.length > 0);
|
|
2472
|
-
return /* @__PURE__ */
|
|
2473
|
-
/* @__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 }) }),
|
|
2474
2523
|
/* @__PURE__ */ jsxs46("div", { className: "max-h-[50vh] overflow-auto p-2", children: [
|
|
2475
|
-
!hasItems ? /* @__PURE__ */
|
|
2524
|
+
!hasItems ? /* @__PURE__ */ jsx64("div", { className: "p-6 text-center text-sm text-[var(--tapiz-text-muted)]", children: empty }) : null,
|
|
2476
2525
|
groups.map((group, groupIndex) => /* @__PURE__ */ jsxs46("div", { className: "py-2", children: [
|
|
2477
|
-
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,
|
|
2478
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: [
|
|
2479
|
-
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,
|
|
2480
2529
|
/* @__PURE__ */ jsxs46("span", { className: "min-w-0 flex-1", children: [
|
|
2481
|
-
/* @__PURE__ */
|
|
2482
|
-
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
|
|
2483
2532
|
] }),
|
|
2484
|
-
item.shortcut ? /* @__PURE__ */
|
|
2533
|
+
item.shortcut ? /* @__PURE__ */ jsx64("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.shortcut }) : null
|
|
2485
2534
|
] }, item.id))
|
|
2486
2535
|
] }, groupIndex))
|
|
2487
2536
|
] })
|
|
@@ -2489,7 +2538,7 @@ function CommandMenu({ open, onClose, query = "", onQueryChange, groups, placeho
|
|
|
2489
2538
|
}
|
|
2490
2539
|
|
|
2491
2540
|
// src/components/forms/FormField.tsx
|
|
2492
|
-
import { jsx as
|
|
2541
|
+
import { jsx as jsx65, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
2493
2542
|
function FormField({ label, hint, error, required, htmlFor, children, className = "" }) {
|
|
2494
2543
|
return /* @__PURE__ */ jsxs47("div", { className: `space-y-1.5 ${className}`, children: [
|
|
2495
2544
|
label ? /* @__PURE__ */ jsxs47(FieldLabel, { htmlFor, children: [
|
|
@@ -2497,15 +2546,15 @@ function FormField({ label, hint, error, required, htmlFor, children, className
|
|
|
2497
2546
|
required ? " *" : ""
|
|
2498
2547
|
] }) : null,
|
|
2499
2548
|
children,
|
|
2500
|
-
error ? /* @__PURE__ */
|
|
2549
|
+
error ? /* @__PURE__ */ jsx65(FormError, { message: String(error) }) : hint ? /* @__PURE__ */ jsx65(FieldHint, { children: hint }) : null
|
|
2501
2550
|
] });
|
|
2502
2551
|
}
|
|
2503
2552
|
|
|
2504
2553
|
// src/components/forms/Switch.tsx
|
|
2505
|
-
import { jsx as
|
|
2554
|
+
import { jsx as jsx66, jsxs as jsxs48 } from "react/jsx-runtime";
|
|
2506
2555
|
function Switch({ checked = false, onChange, disabled, label, description, className = "" }) {
|
|
2507
2556
|
return /* @__PURE__ */ jsxs48("label", { className: `flex cursor-pointer items-start gap-3 ${disabled ? "cursor-not-allowed opacity-50" : ""} ${className}`, children: [
|
|
2508
|
-
/* @__PURE__ */
|
|
2557
|
+
/* @__PURE__ */ jsx66(
|
|
2509
2558
|
"button",
|
|
2510
2559
|
{
|
|
2511
2560
|
type: "button",
|
|
@@ -2514,22 +2563,22 @@ function Switch({ checked = false, onChange, disabled, label, description, class
|
|
|
2514
2563
|
disabled,
|
|
2515
2564
|
onClick: () => onChange?.(!checked),
|
|
2516
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)]"}`,
|
|
2517
|
-
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"}` })
|
|
2518
2567
|
}
|
|
2519
2568
|
),
|
|
2520
2569
|
label || description ? /* @__PURE__ */ jsxs48("span", { children: [
|
|
2521
|
-
label ? /* @__PURE__ */
|
|
2522
|
-
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
|
|
2523
2572
|
] }) : null
|
|
2524
2573
|
] });
|
|
2525
2574
|
}
|
|
2526
2575
|
|
|
2527
2576
|
// src/components/forms/ToggleGroup.tsx
|
|
2528
|
-
import { jsx as
|
|
2577
|
+
import { jsx as jsx67 } from "react/jsx-runtime";
|
|
2529
2578
|
function ToggleGroup({ options, value, onChange, className = "", fullWidth = false }) {
|
|
2530
|
-
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) => {
|
|
2531
2580
|
const selected = option.value === value;
|
|
2532
|
-
return /* @__PURE__ */
|
|
2581
|
+
return /* @__PURE__ */ jsx67(
|
|
2533
2582
|
"button",
|
|
2534
2583
|
{
|
|
2535
2584
|
type: "button",
|
|
@@ -2544,17 +2593,17 @@ function ToggleGroup({ options, value, onChange, className = "", fullWidth = fal
|
|
|
2544
2593
|
}
|
|
2545
2594
|
|
|
2546
2595
|
// src/components/forms/InputGroup.tsx
|
|
2547
|
-
import { jsx as
|
|
2596
|
+
import { jsx as jsx68, jsxs as jsxs49 } from "react/jsx-runtime";
|
|
2548
2597
|
function InputGroup({ prefix, suffix, children, className = "" }) {
|
|
2549
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: [
|
|
2550
|
-
prefix ? /* @__PURE__ */
|
|
2551
|
-
/* @__PURE__ */
|
|
2552
|
-
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
|
|
2553
2602
|
] });
|
|
2554
2603
|
}
|
|
2555
2604
|
|
|
2556
2605
|
// src/components/feedback/Alert.tsx
|
|
2557
|
-
import { jsx as
|
|
2606
|
+
import { jsx as jsx69, jsxs as jsxs50 } from "react/jsx-runtime";
|
|
2558
2607
|
var toneClasses = {
|
|
2559
2608
|
info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)] text-[var(--tapiz-info)]",
|
|
2560
2609
|
success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
|
|
@@ -2564,17 +2613,17 @@ var toneClasses = {
|
|
|
2564
2613
|
};
|
|
2565
2614
|
function Alert2({ tone: tone2 = "info", title, children, icon, actions, className = "" }) {
|
|
2566
2615
|
return /* @__PURE__ */ jsxs50("div", { className: `flex gap-3 border p-4 ${toneClasses[tone2]} ${className}`, children: [
|
|
2567
|
-
icon ? /* @__PURE__ */
|
|
2616
|
+
icon ? /* @__PURE__ */ jsx69("div", { className: "mt-0.5 shrink-0", children: icon }) : null,
|
|
2568
2617
|
/* @__PURE__ */ jsxs50("div", { className: "min-w-0 flex-1", children: [
|
|
2569
|
-
title ? /* @__PURE__ */
|
|
2570
|
-
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
|
|
2571
2620
|
] }),
|
|
2572
|
-
actions ? /* @__PURE__ */
|
|
2621
|
+
actions ? /* @__PURE__ */ jsx69("div", { className: "shrink-0", children: actions }) : null
|
|
2573
2622
|
] });
|
|
2574
2623
|
}
|
|
2575
2624
|
|
|
2576
2625
|
// src/components/feedback/Progress.tsx
|
|
2577
|
-
import { jsx as
|
|
2626
|
+
import { jsx as jsx70, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
2578
2627
|
var tones = {
|
|
2579
2628
|
accent: "bg-[var(--tapiz-accent)]",
|
|
2580
2629
|
success: "bg-[var(--tapiz-success)]",
|
|
@@ -2585,32 +2634,32 @@ function Progress({ value, max = 100, label, showValue = false, tone: tone2 = "a
|
|
|
2585
2634
|
const percentage = Math.max(0, Math.min(100, value / max * 100));
|
|
2586
2635
|
return /* @__PURE__ */ jsxs51("div", { className, children: [
|
|
2587
2636
|
label || showValue ? /* @__PURE__ */ jsxs51("div", { className: "mb-1 flex items-center justify-between gap-3 text-xs text-[var(--tapiz-text-muted)]", children: [
|
|
2588
|
-
label ? /* @__PURE__ */
|
|
2637
|
+
label ? /* @__PURE__ */ jsx70("span", { children: label }) : /* @__PURE__ */ jsx70("span", {}),
|
|
2589
2638
|
showValue ? /* @__PURE__ */ jsxs51("span", { className: "font-mono", children: [
|
|
2590
2639
|
Math.round(percentage),
|
|
2591
2640
|
"%"
|
|
2592
2641
|
] }) : null
|
|
2593
2642
|
] }) : null,
|
|
2594
|
-
/* @__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}%` } }) })
|
|
2595
2644
|
] });
|
|
2596
2645
|
}
|
|
2597
2646
|
|
|
2598
2647
|
// src/components/shared/Avatar.tsx
|
|
2599
|
-
import { jsx as
|
|
2648
|
+
import { jsx as jsx71 } from "react/jsx-runtime";
|
|
2600
2649
|
var sizes = { xs: "size-6 text-[10px]", sm: "size-8 text-xs", md: "size-10 text-sm", lg: "size-14 text-base" };
|
|
2601
2650
|
function Avatar({ src, name = "?", size = "md", className = "" }) {
|
|
2602
2651
|
const initials = name.split(" ").filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase()).join("") || "?";
|
|
2603
|
-
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 });
|
|
2604
2653
|
}
|
|
2605
2654
|
|
|
2606
2655
|
// src/components/shared/Kbd.tsx
|
|
2607
|
-
import { jsx as
|
|
2656
|
+
import { jsx as jsx72 } from "react/jsx-runtime";
|
|
2608
2657
|
function Kbd({ children, className = "" }) {
|
|
2609
|
-
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 });
|
|
2610
2659
|
}
|
|
2611
2660
|
|
|
2612
2661
|
// src/components/shared/Timeline.tsx
|
|
2613
|
-
import { jsx as
|
|
2662
|
+
import { jsx as jsx73, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
2614
2663
|
var tones2 = {
|
|
2615
2664
|
neutral: "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-muted)]",
|
|
2616
2665
|
info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)] text-[var(--tapiz-info)]",
|
|
@@ -2619,53 +2668,53 @@ var tones2 = {
|
|
|
2619
2668
|
danger: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]"
|
|
2620
2669
|
};
|
|
2621
2670
|
function Timeline({ items, className = "" }) {
|
|
2622
|
-
return /* @__PURE__ */
|
|
2623
|
-
/* @__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" }),
|
|
2624
2673
|
/* @__PURE__ */ jsxs52("span", { className: "min-w-0 flex-1 pb-2", children: [
|
|
2625
2674
|
/* @__PURE__ */ jsxs52("span", { className: "flex flex-wrap items-baseline justify-between gap-2", children: [
|
|
2626
|
-
/* @__PURE__ */
|
|
2627
|
-
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
|
|
2628
2677
|
] }),
|
|
2629
|
-
item.description ? /* @__PURE__ */
|
|
2678
|
+
item.description ? /* @__PURE__ */ jsx73("span", { className: "mt-1 block text-sm text-[var(--tapiz-text-secondary)]", children: item.description }) : null
|
|
2630
2679
|
] })
|
|
2631
2680
|
] }, item.id)) });
|
|
2632
2681
|
}
|
|
2633
2682
|
|
|
2634
2683
|
// src/components/shared/KeyValueList.tsx
|
|
2635
|
-
import { jsx as
|
|
2684
|
+
import { jsx as jsx74, jsxs as jsxs53 } from "react/jsx-runtime";
|
|
2636
2685
|
function KeyValueList({ items, className = "", density = "normal" }) {
|
|
2637
|
-
return /* @__PURE__ */
|
|
2638
|
-
/* @__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 }),
|
|
2639
2688
|
/* @__PURE__ */ jsxs53("dd", { children: [
|
|
2640
|
-
/* @__PURE__ */
|
|
2641
|
-
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
|
|
2642
2691
|
] })
|
|
2643
2692
|
] }, index)) });
|
|
2644
2693
|
}
|
|
2645
2694
|
|
|
2646
2695
|
// src/components/shared/CodeBlock.tsx
|
|
2647
|
-
import { jsx as
|
|
2696
|
+
import { jsx as jsx75, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
2648
2697
|
function CodeBlock({ children, language, title, actions, className = "" }) {
|
|
2649
2698
|
return /* @__PURE__ */ jsxs54("figure", { className: `overflow-hidden border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
|
|
2650
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: [
|
|
2651
|
-
/* @__PURE__ */
|
|
2700
|
+
/* @__PURE__ */ jsx75("span", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: title ?? language }),
|
|
2652
2701
|
actions
|
|
2653
2702
|
] }) : null,
|
|
2654
|
-
/* @__PURE__ */
|
|
2703
|
+
/* @__PURE__ */ jsx75("pre", { className: "overflow-auto p-4 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children: /* @__PURE__ */ jsx75("code", { children }) })
|
|
2655
2704
|
] });
|
|
2656
2705
|
}
|
|
2657
2706
|
|
|
2658
2707
|
// src/components/marketing/LogoCloud.tsx
|
|
2659
|
-
import { jsx as
|
|
2708
|
+
import { jsx as jsx76, jsxs as jsxs55 } from "react/jsx-runtime";
|
|
2660
2709
|
function LogoCloud({ title, items, className = "" }) {
|
|
2661
|
-
return /* @__PURE__ */
|
|
2662
|
-
title ? /* @__PURE__ */
|
|
2663
|
-
/* @__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)) })
|
|
2664
2713
|
] }) });
|
|
2665
2714
|
}
|
|
2666
2715
|
|
|
2667
2716
|
// src/components/marketing/TestimonialCard.tsx
|
|
2668
|
-
import { jsx as
|
|
2717
|
+
import { jsx as jsx77, jsxs as jsxs56 } from "react/jsx-runtime";
|
|
2669
2718
|
function TestimonialCard({ quote, author, role, avatarSrc, className = "", variant = "surface" }) {
|
|
2670
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: [
|
|
2671
2720
|
/* @__PURE__ */ jsxs56("blockquote", { className: "text-base leading-7 text-[var(--tapiz-text-secondary)]", children: [
|
|
@@ -2674,39 +2723,39 @@ function TestimonialCard({ quote, author, role, avatarSrc, className = "", varia
|
|
|
2674
2723
|
"\u201D"
|
|
2675
2724
|
] }),
|
|
2676
2725
|
/* @__PURE__ */ jsxs56("figcaption", { className: "mt-5 flex items-center gap-3", children: [
|
|
2677
|
-
/* @__PURE__ */
|
|
2726
|
+
/* @__PURE__ */ jsx77(Avatar, { name: author, src: avatarSrc, size: "sm" }),
|
|
2678
2727
|
/* @__PURE__ */ jsxs56("span", { children: [
|
|
2679
|
-
/* @__PURE__ */
|
|
2680
|
-
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
|
|
2681
2730
|
] })
|
|
2682
2731
|
] })
|
|
2683
2732
|
] });
|
|
2684
2733
|
}
|
|
2685
2734
|
|
|
2686
2735
|
// src/components/marketing/PricingCard.tsx
|
|
2687
|
-
import { jsx as
|
|
2736
|
+
import { jsx as jsx78, jsxs as jsxs57 } from "react/jsx-runtime";
|
|
2688
2737
|
function PricingCard({ name, price, description, features = [], cta, highlighted = false, className = "" }) {
|
|
2689
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: [
|
|
2690
2739
|
/* @__PURE__ */ jsxs57("div", { className: "flex-1", children: [
|
|
2691
|
-
/* @__PURE__ */
|
|
2692
|
-
description ? /* @__PURE__ */
|
|
2693
|
-
/* @__PURE__ */
|
|
2694
|
-
/* @__PURE__ */
|
|
2695
|
-
/* @__PURE__ */
|
|
2696
|
-
/* @__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 })
|
|
2697
2746
|
] }, index)) })
|
|
2698
2747
|
] }),
|
|
2699
|
-
/* @__PURE__ */
|
|
2748
|
+
/* @__PURE__ */ jsx78("div", { className: "mt-6", children: cta ?? /* @__PURE__ */ jsx78(Button, { variant: highlighted ? "primary" : "secondary", fullWidth: true, children: "Get started" }) })
|
|
2700
2749
|
] });
|
|
2701
2750
|
}
|
|
2702
2751
|
|
|
2703
2752
|
// src/components/marketing/StatsBand.tsx
|
|
2704
|
-
import { jsx as
|
|
2753
|
+
import { jsx as jsx79, jsxs as jsxs58 } from "react/jsx-runtime";
|
|
2705
2754
|
function StatsBand({ items, className = "" }) {
|
|
2706
|
-
return /* @__PURE__ */
|
|
2707
|
-
/* @__PURE__ */
|
|
2708
|
-
/* @__PURE__ */
|
|
2709
|
-
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
|
|
2710
2759
|
] }, index)) }) });
|
|
2711
2760
|
}
|
|
2712
2761
|
|
|
@@ -2745,7 +2794,7 @@ var tapizFrameworkPresets = {
|
|
|
2745
2794
|
};
|
|
2746
2795
|
|
|
2747
2796
|
// src/components/layout/Container.tsx
|
|
2748
|
-
import { jsx as
|
|
2797
|
+
import { jsx as jsx80 } from "react/jsx-runtime";
|
|
2749
2798
|
var sizeClasses2 = {
|
|
2750
2799
|
sm: "max-w-3xl",
|
|
2751
2800
|
md: "max-w-5xl",
|
|
@@ -2754,7 +2803,7 @@ var sizeClasses2 = {
|
|
|
2754
2803
|
full: "max-w-none"
|
|
2755
2804
|
};
|
|
2756
2805
|
function Container({ children, size = "lg", padded = true, className = "", style }) {
|
|
2757
|
-
return /* @__PURE__ */
|
|
2806
|
+
return /* @__PURE__ */ jsx80(
|
|
2758
2807
|
"div",
|
|
2759
2808
|
{
|
|
2760
2809
|
className: ["mx-auto w-full", sizeClasses2[size], padded ? "px-[var(--tapiz-space-page-x)]" : "", className].filter(Boolean).join(" "),
|
|
@@ -2765,7 +2814,7 @@ function Container({ children, size = "lg", padded = true, className = "", style
|
|
|
2765
2814
|
}
|
|
2766
2815
|
|
|
2767
2816
|
// src/components/layout/Surface.tsx
|
|
2768
|
-
import { jsx as
|
|
2817
|
+
import { jsx as jsx81 } from "react/jsx-runtime";
|
|
2769
2818
|
var variantClasses5 = {
|
|
2770
2819
|
canvas: "bg-[var(--tapiz-bg-page)] text-[var(--tapiz-text-primary)]",
|
|
2771
2820
|
surface: "bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-primary)]",
|
|
@@ -2782,7 +2831,7 @@ var paddingClasses2 = {
|
|
|
2782
2831
|
xl: "p-8"
|
|
2783
2832
|
};
|
|
2784
2833
|
function Surface({ children, variant = "surface", padding = "md", bordered = true, className = "", style }) {
|
|
2785
|
-
return /* @__PURE__ */
|
|
2834
|
+
return /* @__PURE__ */ jsx81(
|
|
2786
2835
|
"section",
|
|
2787
2836
|
{
|
|
2788
2837
|
className: [variantClasses5[variant], paddingClasses2[padding], bordered && variant !== "brutal" ? "border border-[var(--tapiz-border-subtle)]" : "", className].filter(Boolean).join(" "),
|
|
@@ -2793,23 +2842,23 @@ function Surface({ children, variant = "surface", padding = "md", bordered = tru
|
|
|
2793
2842
|
}
|
|
2794
2843
|
|
|
2795
2844
|
// src/components/layout/Divider.tsx
|
|
2796
|
-
import { jsx as
|
|
2845
|
+
import { jsx as jsx82, jsxs as jsxs59 } from "react/jsx-runtime";
|
|
2797
2846
|
function Divider({ orientation = "horizontal", label, className = "" }) {
|
|
2798
2847
|
if (orientation === "vertical") {
|
|
2799
|
-
return /* @__PURE__ */
|
|
2848
|
+
return /* @__PURE__ */ jsx82("div", { className: `mx-2 min-h-6 w-px bg-[var(--tapiz-border-subtle)] ${className}`, "aria-hidden": "true" });
|
|
2800
2849
|
}
|
|
2801
2850
|
if (label) {
|
|
2802
2851
|
return /* @__PURE__ */ jsxs59("div", { className: `flex items-center gap-3 ${className}`, children: [
|
|
2803
|
-
/* @__PURE__ */
|
|
2804
|
-
/* @__PURE__ */
|
|
2805
|
-
/* @__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)]" })
|
|
2806
2855
|
] });
|
|
2807
2856
|
}
|
|
2808
|
-
return /* @__PURE__ */
|
|
2857
|
+
return /* @__PURE__ */ jsx82("hr", { className: `border-[var(--tapiz-border-subtle)] ${className}` });
|
|
2809
2858
|
}
|
|
2810
2859
|
|
|
2811
2860
|
// src/components/layout/ResponsiveGrid.tsx
|
|
2812
|
-
import { jsx as
|
|
2861
|
+
import { jsx as jsx83 } from "react/jsx-runtime";
|
|
2813
2862
|
var gapClasses3 = {
|
|
2814
2863
|
sm: "gap-3",
|
|
2815
2864
|
md: "gap-4",
|
|
@@ -2817,7 +2866,7 @@ var gapClasses3 = {
|
|
|
2817
2866
|
xl: "gap-8"
|
|
2818
2867
|
};
|
|
2819
2868
|
function ResponsiveGrid({ children, min = "18rem", gap = "md", className = "", style }) {
|
|
2820
|
-
return /* @__PURE__ */
|
|
2869
|
+
return /* @__PURE__ */ jsx83(
|
|
2821
2870
|
"div",
|
|
2822
2871
|
{
|
|
2823
2872
|
className: `grid ${gapClasses3[gap]} ${className}`,
|
|
@@ -2828,7 +2877,7 @@ function ResponsiveGrid({ children, min = "18rem", gap = "md", className = "", s
|
|
|
2828
2877
|
}
|
|
2829
2878
|
|
|
2830
2879
|
// src/components/data-display/Sparkline.tsx
|
|
2831
|
-
import { jsx as
|
|
2880
|
+
import { jsx as jsx84, jsxs as jsxs60 } from "react/jsx-runtime";
|
|
2832
2881
|
function Sparkline({ values, width = 160, height = 48, label = "Trend", className = "", style }) {
|
|
2833
2882
|
const safeValues = values.length ? values : [0];
|
|
2834
2883
|
const min = Math.min(...safeValues);
|
|
@@ -2841,30 +2890,30 @@ function Sparkline({ values, width = 160, height = 48, label = "Trend", classNam
|
|
|
2841
2890
|
return `${x},${y}`;
|
|
2842
2891
|
}).join(" ");
|
|
2843
2892
|
return /* @__PURE__ */ jsxs60("svg", { className, style, width, height, viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": label, children: [
|
|
2844
|
-
/* @__PURE__ */
|
|
2845
|
-
/* @__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" })
|
|
2846
2895
|
] });
|
|
2847
2896
|
}
|
|
2848
2897
|
|
|
2849
2898
|
// src/components/data-display/BarList.tsx
|
|
2850
|
-
import { jsx as
|
|
2899
|
+
import { jsx as jsx85, jsxs as jsxs61 } from "react/jsx-runtime";
|
|
2851
2900
|
function BarList({ items, max, valueFormatter = (value) => value, className = "" }) {
|
|
2852
2901
|
const computedMax = max ?? Math.max(1, ...items.map((item) => item.value));
|
|
2853
|
-
return /* @__PURE__ */
|
|
2902
|
+
return /* @__PURE__ */ jsx85("div", { className: `space-y-3 ${className}`, children: items.map((item, index) => {
|
|
2854
2903
|
const percent = Math.max(0, Math.min(100, item.value / computedMax * 100));
|
|
2855
2904
|
return /* @__PURE__ */ jsxs61("div", { children: [
|
|
2856
2905
|
/* @__PURE__ */ jsxs61("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
|
|
2857
|
-
/* @__PURE__ */
|
|
2858
|
-
/* @__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) })
|
|
2859
2908
|
] }),
|
|
2860
|
-
/* @__PURE__ */
|
|
2861
|
-
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
|
|
2862
2911
|
] }, index);
|
|
2863
2912
|
}) });
|
|
2864
2913
|
}
|
|
2865
2914
|
|
|
2866
2915
|
// src/components/data-display/DonutMetric.tsx
|
|
2867
|
-
import { jsx as
|
|
2916
|
+
import { jsx as jsx86, jsxs as jsxs62 } from "react/jsx-runtime";
|
|
2868
2917
|
function DonutMetric({ value, max = 100, label, caption, size = 112, className = "" }) {
|
|
2869
2918
|
const radius = 42;
|
|
2870
2919
|
const circumference = 2 * Math.PI * radius;
|
|
@@ -2872,8 +2921,8 @@ function DonutMetric({ value, max = 100, label, caption, size = 112, className =
|
|
|
2872
2921
|
const offset = circumference * (1 - ratio);
|
|
2873
2922
|
return /* @__PURE__ */ jsxs62("div", { className: `inline-flex items-center gap-4 ${className}`, children: [
|
|
2874
2923
|
/* @__PURE__ */ jsxs62("svg", { width: size, height: size, viewBox: "0 0 112 112", role: "img", "aria-label": `${Math.round(ratio * 100)}%`, children: [
|
|
2875
|
-
/* @__PURE__ */
|
|
2876
|
-
/* @__PURE__ */
|
|
2924
|
+
/* @__PURE__ */ jsx86("circle", { cx: "56", cy: "56", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
|
|
2925
|
+
/* @__PURE__ */ jsx86(
|
|
2877
2926
|
"circle",
|
|
2878
2927
|
{
|
|
2879
2928
|
cx: "56",
|
|
@@ -2894,14 +2943,14 @@ function DonutMetric({ value, max = 100, label, caption, size = 112, className =
|
|
|
2894
2943
|
] })
|
|
2895
2944
|
] }),
|
|
2896
2945
|
label || caption ? /* @__PURE__ */ jsxs62("div", { children: [
|
|
2897
|
-
label ? /* @__PURE__ */
|
|
2898
|
-
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
|
|
2899
2948
|
] }) : null
|
|
2900
2949
|
] });
|
|
2901
2950
|
}
|
|
2902
2951
|
|
|
2903
2952
|
// src/components/data-display/FilterChip.tsx
|
|
2904
|
-
import { jsx as
|
|
2953
|
+
import { jsx as jsx87, jsxs as jsxs63 } from "react/jsx-runtime";
|
|
2905
2954
|
function FilterChip({ children, active = false, onRemove, className = "" }) {
|
|
2906
2955
|
return /* @__PURE__ */ jsxs63(
|
|
2907
2956
|
"span",
|
|
@@ -2913,56 +2962,56 @@ function FilterChip({ children, active = false, onRemove, className = "" }) {
|
|
|
2913
2962
|
].join(" "),
|
|
2914
2963
|
children: [
|
|
2915
2964
|
children,
|
|
2916
|
-
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
|
|
2917
2966
|
]
|
|
2918
2967
|
}
|
|
2919
2968
|
);
|
|
2920
2969
|
}
|
|
2921
2970
|
|
|
2922
2971
|
// src/components/data-display/DataToolbar.tsx
|
|
2923
|
-
import { jsx as
|
|
2972
|
+
import { jsx as jsx88, jsxs as jsxs64 } from "react/jsx-runtime";
|
|
2924
2973
|
function DataToolbar({ title, description, search, filters, actions, className = "" }) {
|
|
2925
2974
|
return /* @__PURE__ */ jsxs64("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4 ${className}`, children: [
|
|
2926
2975
|
/* @__PURE__ */ jsxs64("div", { className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between", children: [
|
|
2927
2976
|
/* @__PURE__ */ jsxs64("div", { children: [
|
|
2928
|
-
title ? /* @__PURE__ */
|
|
2929
|
-
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
|
|
2930
2979
|
] }),
|
|
2931
|
-
actions ? /* @__PURE__ */
|
|
2980
|
+
actions ? /* @__PURE__ */ jsx88("div", { className: "flex flex-wrap gap-2", children: actions }) : null
|
|
2932
2981
|
] }),
|
|
2933
2982
|
search || filters ? /* @__PURE__ */ jsxs64("div", { className: "mt-4 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between", children: [
|
|
2934
|
-
search ? /* @__PURE__ */
|
|
2935
|
-
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
|
|
2936
2985
|
] }) : null
|
|
2937
2986
|
] });
|
|
2938
2987
|
}
|
|
2939
2988
|
|
|
2940
2989
|
// src/components/framework/ResourceCard.tsx
|
|
2941
|
-
import { Fragment as Fragment4, jsx as
|
|
2990
|
+
import { Fragment as Fragment4, jsx as jsx89, jsxs as jsxs65 } from "react/jsx-runtime";
|
|
2942
2991
|
function ResourceCard({ title, description, eyebrow, icon, meta, status, actions, href, className = "" }) {
|
|
2943
2992
|
const content = /* @__PURE__ */ jsxs65(Fragment4, { children: [
|
|
2944
2993
|
/* @__PURE__ */ jsxs65("div", { className: "flex items-start justify-between gap-4", children: [
|
|
2945
2994
|
/* @__PURE__ */ jsxs65("div", { className: "flex min-w-0 items-start gap-3", children: [
|
|
2946
|
-
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,
|
|
2947
2996
|
/* @__PURE__ */ jsxs65("div", { className: "min-w-0", children: [
|
|
2948
|
-
eyebrow ? /* @__PURE__ */
|
|
2949
|
-
/* @__PURE__ */
|
|
2950
|
-
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
|
|
2951
3000
|
] })
|
|
2952
3001
|
] }),
|
|
2953
|
-
status ? /* @__PURE__ */
|
|
3002
|
+
status ? /* @__PURE__ */ jsx89(Badge, { children: status }) : null
|
|
2954
3003
|
] }),
|
|
2955
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: [
|
|
2956
|
-
meta ? /* @__PURE__ */
|
|
2957
|
-
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
|
|
2958
3007
|
] }) : null
|
|
2959
3008
|
] });
|
|
2960
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}`;
|
|
2961
|
-
return href ? /* @__PURE__ */
|
|
3010
|
+
return href ? /* @__PURE__ */ jsx89("a", { href, className: classes, children: content }) : /* @__PURE__ */ jsx89("article", { className: classes, children: content });
|
|
2962
3011
|
}
|
|
2963
3012
|
|
|
2964
3013
|
// src/components/framework/IntegrationCard.tsx
|
|
2965
|
-
import { jsx as
|
|
3014
|
+
import { jsx as jsx90, jsxs as jsxs66 } from "react/jsx-runtime";
|
|
2966
3015
|
var statusLabel = {
|
|
2967
3016
|
connected: "Connected",
|
|
2968
3017
|
disconnected: "Disconnected",
|
|
@@ -2979,23 +3028,23 @@ function IntegrationCard({ name, description, logo, status = "disconnected", las
|
|
|
2979
3028
|
return /* @__PURE__ */ jsxs66("article", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5 ${className}`, children: [
|
|
2980
3029
|
/* @__PURE__ */ jsxs66("div", { className: "flex items-start justify-between gap-4", children: [
|
|
2981
3030
|
/* @__PURE__ */ jsxs66("div", { className: "flex items-start gap-3", children: [
|
|
2982
|
-
/* @__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" }) }),
|
|
2983
3032
|
/* @__PURE__ */ jsxs66("div", { children: [
|
|
2984
|
-
/* @__PURE__ */
|
|
2985
|
-
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
|
|
2986
3035
|
] })
|
|
2987
3036
|
] }),
|
|
2988
|
-
/* @__PURE__ */
|
|
3037
|
+
/* @__PURE__ */ jsx90(StatusBadge, { variant: statusVariant[status], label: statusLabel[status] })
|
|
2989
3038
|
] }),
|
|
2990
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: [
|
|
2991
|
-
/* @__PURE__ */
|
|
2992
|
-
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
|
|
2993
3042
|
] })
|
|
2994
3043
|
] });
|
|
2995
3044
|
}
|
|
2996
3045
|
|
|
2997
3046
|
// src/components/framework/HealthIndicator.tsx
|
|
2998
|
-
import { jsx as
|
|
3047
|
+
import { jsx as jsx91, jsxs as jsxs67 } from "react/jsx-runtime";
|
|
2999
3048
|
var toneClasses2 = {
|
|
3000
3049
|
operational: "bg-[var(--tapiz-success)]",
|
|
3001
3050
|
degraded: "bg-[var(--tapiz-warning)]",
|
|
@@ -3010,33 +3059,33 @@ var defaultLabel = {
|
|
|
3010
3059
|
};
|
|
3011
3060
|
function HealthIndicator({ tone: tone2 = "unknown", label, detail, className = "" }) {
|
|
3012
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: [
|
|
3013
|
-
/* @__PURE__ */
|
|
3014
|
-
/* @__PURE__ */
|
|
3015
|
-
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
|
|
3016
3065
|
] });
|
|
3017
3066
|
}
|
|
3018
3067
|
|
|
3019
3068
|
// src/components/framework/AuditLog.tsx
|
|
3020
|
-
import { jsx as
|
|
3069
|
+
import { jsx as jsx92, jsxs as jsxs68 } from "react/jsx-runtime";
|
|
3021
3070
|
function AuditLog({ items, className = "" }) {
|
|
3022
|
-
return /* @__PURE__ */
|
|
3023
|
-
/* @__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" }),
|
|
3024
3073
|
/* @__PURE__ */ jsxs68("div", { className: "min-w-0 flex-1", children: [
|
|
3025
3074
|
/* @__PURE__ */ jsxs68("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
|
|
3026
3075
|
/* @__PURE__ */ jsxs68("p", { className: "text-sm text-[var(--tapiz-text-secondary)]", children: [
|
|
3027
|
-
/* @__PURE__ */
|
|
3076
|
+
/* @__PURE__ */ jsx92("strong", { className: "text-[var(--tapiz-text-primary)]", children: item.actor }),
|
|
3028
3077
|
" ",
|
|
3029
3078
|
item.action
|
|
3030
3079
|
] }),
|
|
3031
|
-
/* @__PURE__ */
|
|
3080
|
+
/* @__PURE__ */ jsx92("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.timestamp })
|
|
3032
3081
|
] }),
|
|
3033
|
-
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
|
|
3034
3083
|
] })
|
|
3035
3084
|
] }, index)) });
|
|
3036
3085
|
}
|
|
3037
3086
|
|
|
3038
3087
|
// src/components/framework/KanbanBoard.tsx
|
|
3039
|
-
import { jsx as
|
|
3088
|
+
import { jsx as jsx93, jsxs as jsxs69 } from "react/jsx-runtime";
|
|
3040
3089
|
var toneClasses3 = {
|
|
3041
3090
|
default: "border-[var(--tapiz-border-subtle)]",
|
|
3042
3091
|
accent: "border-[var(--tapiz-accent)]",
|
|
@@ -3045,65 +3094,65 @@ var toneClasses3 = {
|
|
|
3045
3094
|
danger: "border-[var(--tapiz-danger)]"
|
|
3046
3095
|
};
|
|
3047
3096
|
function KanbanBoard({ columns, className = "" }) {
|
|
3048
|
-
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: [
|
|
3049
3098
|
/* @__PURE__ */ jsxs69("div", { className: "mb-3 flex items-start justify-between gap-3", children: [
|
|
3050
3099
|
/* @__PURE__ */ jsxs69("div", { children: [
|
|
3051
|
-
/* @__PURE__ */
|
|
3052
|
-
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
|
|
3053
3102
|
] }),
|
|
3054
|
-
/* @__PURE__ */
|
|
3103
|
+
/* @__PURE__ */ jsx93("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: column.items.length })
|
|
3055
3104
|
] }),
|
|
3056
|
-
/* @__PURE__ */
|
|
3057
|
-
/* @__PURE__ */
|
|
3058
|
-
item.description ? /* @__PURE__ */
|
|
3059
|
-
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
|
|
3060
3109
|
] }, item.id)) })
|
|
3061
3110
|
] }, column.id)) });
|
|
3062
3111
|
}
|
|
3063
3112
|
|
|
3064
3113
|
// src/components/framework/AccessMatrix.tsx
|
|
3065
|
-
import { jsx as
|
|
3114
|
+
import { jsx as jsx94, jsxs as jsxs70 } from "react/jsx-runtime";
|
|
3066
3115
|
function AccessMatrix({ roles, permissions, className = "" }) {
|
|
3067
|
-
return /* @__PURE__ */
|
|
3068
|
-
/* @__PURE__ */
|
|
3069
|
-
/* @__PURE__ */
|
|
3070
|
-
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))
|
|
3071
3120
|
] }) }),
|
|
3072
|
-
/* @__PURE__ */
|
|
3121
|
+
/* @__PURE__ */ jsx94("tbody", { children: permissions.map((permission) => /* @__PURE__ */ jsxs70("tr", { children: [
|
|
3073
3122
|
/* @__PURE__ */ jsxs70("td", { className: "px-4 py-3", children: [
|
|
3074
|
-
/* @__PURE__ */
|
|
3075
|
-
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
|
|
3076
3125
|
] }),
|
|
3077
|
-
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))
|
|
3078
3127
|
] }, permission.key)) })
|
|
3079
3128
|
] }) });
|
|
3080
3129
|
}
|
|
3081
3130
|
|
|
3082
3131
|
// src/components/framework/CalendarGrid.tsx
|
|
3083
|
-
import { jsx as
|
|
3132
|
+
import { jsx as jsx95, jsxs as jsxs71 } from "react/jsx-runtime";
|
|
3084
3133
|
var defaultWeekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
|
|
3085
3134
|
function CalendarGrid({ days, weekdays = defaultWeekdays, className = "" }) {
|
|
3086
3135
|
return /* @__PURE__ */ jsxs71("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
|
|
3087
|
-
/* @__PURE__ */
|
|
3088
|
-
/* @__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: [
|
|
3089
3138
|
/* @__PURE__ */ jsxs71("div", { className: "flex items-center justify-between gap-2", children: [
|
|
3090
|
-
/* @__PURE__ */
|
|
3091
|
-
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
|
|
3092
3141
|
] }),
|
|
3093
|
-
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
|
|
3094
3143
|
] }, index)) })
|
|
3095
3144
|
] });
|
|
3096
3145
|
}
|
|
3097
3146
|
|
|
3098
3147
|
// src/components/forms/Slider.tsx
|
|
3099
|
-
import { jsx as
|
|
3148
|
+
import { jsx as jsx96, jsxs as jsxs72 } from "react/jsx-runtime";
|
|
3100
3149
|
function Slider({ label, valueLabel, className = "", ...props }) {
|
|
3101
3150
|
return /* @__PURE__ */ jsxs72("label", { className: `block ${className}`, children: [
|
|
3102
3151
|
label || valueLabel ? /* @__PURE__ */ jsxs72("span", { className: "mb-2 flex items-center justify-between gap-3 text-sm", children: [
|
|
3103
|
-
label ? /* @__PURE__ */
|
|
3104
|
-
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
|
|
3105
3154
|
] }) : null,
|
|
3106
|
-
/* @__PURE__ */
|
|
3155
|
+
/* @__PURE__ */ jsx96(
|
|
3107
3156
|
"input",
|
|
3108
3157
|
{
|
|
3109
3158
|
...props,
|
|
@@ -3115,19 +3164,19 @@ function Slider({ label, valueLabel, className = "", ...props }) {
|
|
|
3115
3164
|
}
|
|
3116
3165
|
|
|
3117
3166
|
// src/components/forms/FileDropzone.tsx
|
|
3118
|
-
import { jsx as
|
|
3167
|
+
import { jsx as jsx97, jsxs as jsxs73 } from "react/jsx-runtime";
|
|
3119
3168
|
function FileDropzone({ title = "Drop files here", description, actionLabel = "Browse", className = "", ...props }) {
|
|
3120
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: [
|
|
3121
|
-
/* @__PURE__ */
|
|
3122
|
-
/* @__PURE__ */
|
|
3123
|
-
description ? /* @__PURE__ */
|
|
3124
|
-
/* @__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 })
|
|
3125
3174
|
] });
|
|
3126
3175
|
}
|
|
3127
3176
|
|
|
3128
3177
|
// src/components/forms/PasswordInput.tsx
|
|
3129
3178
|
import { useState as useState7 } from "react";
|
|
3130
|
-
import { jsx as
|
|
3179
|
+
import { jsx as jsx98, jsxs as jsxs74 } from "react/jsx-runtime";
|
|
3131
3180
|
function PasswordInput({
|
|
3132
3181
|
revealLabel = "Show password",
|
|
3133
3182
|
className = "",
|
|
@@ -3139,7 +3188,7 @@ function PasswordInput({
|
|
|
3139
3188
|
{
|
|
3140
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}`,
|
|
3141
3190
|
children: [
|
|
3142
|
-
/* @__PURE__ */
|
|
3191
|
+
/* @__PURE__ */ jsx98(
|
|
3143
3192
|
"input",
|
|
3144
3193
|
{
|
|
3145
3194
|
...props,
|
|
@@ -3147,7 +3196,7 @@ function PasswordInput({
|
|
|
3147
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!"
|
|
3148
3197
|
}
|
|
3149
3198
|
),
|
|
3150
|
-
/* @__PURE__ */
|
|
3199
|
+
/* @__PURE__ */ jsx98(
|
|
3151
3200
|
"button",
|
|
3152
3201
|
{
|
|
3153
3202
|
type: "button",
|
|
@@ -3156,7 +3205,7 @@ function PasswordInput({
|
|
|
3156
3205
|
onClick: () => setVisible((v) => !v),
|
|
3157
3206
|
tabIndex: -1,
|
|
3158
3207
|
className: "grid place-items-center px-3 text-(--tapiz-text-muted) transition-colors hover:text-(--tapiz-text-primary)",
|
|
3159
|
-
children: visible ? /* @__PURE__ */
|
|
3208
|
+
children: visible ? /* @__PURE__ */ jsx98(EyeOff, { size: 15 }) : /* @__PURE__ */ jsx98(Eye, { size: 15 })
|
|
3160
3209
|
}
|
|
3161
3210
|
)
|
|
3162
3211
|
]
|
|
@@ -3165,11 +3214,11 @@ function PasswordInput({
|
|
|
3165
3214
|
}
|
|
3166
3215
|
|
|
3167
3216
|
// src/components/forms/TextareaCounter.tsx
|
|
3168
|
-
import { jsx as
|
|
3217
|
+
import { jsx as jsx99, jsxs as jsxs75 } from "react/jsx-runtime";
|
|
3169
3218
|
function TextareaCounter({ maxLength, value = "", className = "", ...props }) {
|
|
3170
3219
|
const count = value.length;
|
|
3171
3220
|
return /* @__PURE__ */ jsxs75("div", { className, children: [
|
|
3172
|
-
/* @__PURE__ */
|
|
3221
|
+
/* @__PURE__ */ jsx99("textarea", { ...props, value, maxLength, className: "input-field min-h-28" }),
|
|
3173
3222
|
/* @__PURE__ */ jsxs75("div", { className: "mt-1 text-right font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: [
|
|
3174
3223
|
count,
|
|
3175
3224
|
"/",
|
|
@@ -3179,7 +3228,7 @@ function TextareaCounter({ maxLength, value = "", className = "", ...props }) {
|
|
|
3179
3228
|
}
|
|
3180
3229
|
|
|
3181
3230
|
// src/components/feedback/Callout.tsx
|
|
3182
|
-
import { jsx as
|
|
3231
|
+
import { jsx as jsx100, jsxs as jsxs76 } from "react/jsx-runtime";
|
|
3183
3232
|
var toneClasses4 = {
|
|
3184
3233
|
info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)]",
|
|
3185
3234
|
success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
|
|
@@ -3188,73 +3237,73 @@ var toneClasses4 = {
|
|
|
3188
3237
|
neutral: "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]"
|
|
3189
3238
|
};
|
|
3190
3239
|
function Callout({ title, children, tone: tone2 = "info", icon, actions, className = "" }) {
|
|
3191
|
-
return /* @__PURE__ */
|
|
3192
|
-
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,
|
|
3193
3242
|
/* @__PURE__ */ jsxs76("div", { className: "min-w-0 flex-1", children: [
|
|
3194
|
-
title ? /* @__PURE__ */
|
|
3195
|
-
children ? /* @__PURE__ */
|
|
3196
|
-
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
|
|
3197
3246
|
] })
|
|
3198
3247
|
] }) });
|
|
3199
3248
|
}
|
|
3200
3249
|
|
|
3201
3250
|
// src/components/feedback/LoadingOverlay.tsx
|
|
3202
|
-
import { jsx as
|
|
3251
|
+
import { jsx as jsx101, jsxs as jsxs77 } from "react/jsx-runtime";
|
|
3203
3252
|
function LoadingOverlay({ visible = false, label = "Loading", children, className = "" }) {
|
|
3204
3253
|
return /* @__PURE__ */ jsxs77("div", { className: `relative ${className}`, children: [
|
|
3205
3254
|
children,
|
|
3206
|
-
visible ? /* @__PURE__ */
|
|
3207
|
-
/* @__PURE__ */
|
|
3208
|
-
/* @__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 })
|
|
3209
3258
|
] }) }) : null
|
|
3210
3259
|
] });
|
|
3211
3260
|
}
|
|
3212
3261
|
|
|
3213
3262
|
// src/components/feedback/NotificationList.tsx
|
|
3214
|
-
import { jsx as
|
|
3263
|
+
import { jsx as jsx102, jsxs as jsxs78 } from "react/jsx-runtime";
|
|
3215
3264
|
function NotificationList({ items, className = "" }) {
|
|
3216
|
-
return /* @__PURE__ */
|
|
3217
|
-
/* @__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" }),
|
|
3218
3267
|
/* @__PURE__ */ jsxs78("div", { className: "min-w-0 flex-1", children: [
|
|
3219
3268
|
/* @__PURE__ */ jsxs78("div", { className: "flex items-start justify-between gap-3", children: [
|
|
3220
|
-
/* @__PURE__ */
|
|
3221
|
-
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
|
|
3222
3271
|
] }),
|
|
3223
|
-
item.description ? /* @__PURE__ */
|
|
3224
|
-
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
|
|
3225
3274
|
] })
|
|
3226
3275
|
] }, item.id)) });
|
|
3227
3276
|
}
|
|
3228
3277
|
|
|
3229
3278
|
// src/components/layout/MasonryGrid.tsx
|
|
3230
|
-
import { jsx as
|
|
3279
|
+
import { jsx as jsx103 } from "react/jsx-runtime";
|
|
3231
3280
|
var columnClasses = { 2: "md:columns-2", 3: "md:columns-2 xl:columns-3", 4: "md:columns-2 lg:columns-3 xl:columns-4" };
|
|
3232
3281
|
var gapClasses4 = { sm: "gap-3", md: "gap-5", lg: "gap-8" };
|
|
3233
3282
|
function MasonryGrid({ children, columns = 3, gap = "md", className = "", style }) {
|
|
3234
|
-
return /* @__PURE__ */
|
|
3283
|
+
return /* @__PURE__ */ jsx103("div", { className: [columnClasses[columns], gapClasses4[gap], className].filter(Boolean).join(" "), style, children });
|
|
3235
3284
|
}
|
|
3236
3285
|
|
|
3237
3286
|
// src/components/layout/PageRail.tsx
|
|
3238
|
-
import { Fragment as Fragment5, jsx as
|
|
3287
|
+
import { Fragment as Fragment5, jsx as jsx104, jsxs as jsxs79 } from "react/jsx-runtime";
|
|
3239
3288
|
function PageRail({ title, items, actions, className = "", style }) {
|
|
3240
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: [
|
|
3241
|
-
title ? /* @__PURE__ */
|
|
3242
|
-
/* @__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) => {
|
|
3243
3292
|
const content = /* @__PURE__ */ jsxs79(Fragment5, { children: [
|
|
3244
|
-
/* @__PURE__ */
|
|
3245
|
-
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
|
|
3246
3295
|
] });
|
|
3247
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(" ");
|
|
3248
|
-
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);
|
|
3249
3298
|
}) }),
|
|
3250
|
-
actions ? /* @__PURE__ */
|
|
3299
|
+
actions ? /* @__PURE__ */ jsx104("div", { className: "mt-3 border-t border-[var(--tapiz-border-subtle)] pt-3", children: actions }) : null
|
|
3251
3300
|
] });
|
|
3252
3301
|
}
|
|
3253
3302
|
|
|
3254
3303
|
// src/components/layout/StickyBar.tsx
|
|
3255
|
-
import { jsx as
|
|
3304
|
+
import { jsx as jsx105 } from "react/jsx-runtime";
|
|
3256
3305
|
function StickyBar({ children, position = "top", className = "", style }) {
|
|
3257
|
-
return /* @__PURE__ */
|
|
3306
|
+
return /* @__PURE__ */ jsx105(
|
|
3258
3307
|
"div",
|
|
3259
3308
|
{
|
|
3260
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(" "),
|
|
@@ -3265,53 +3314,53 @@ function StickyBar({ children, position = "top", className = "", style }) {
|
|
|
3265
3314
|
}
|
|
3266
3315
|
|
|
3267
3316
|
// src/components/forms/Combobox.tsx
|
|
3268
|
-
import { jsx as
|
|
3317
|
+
import { jsx as jsx106, jsxs as jsxs80 } from "react/jsx-runtime";
|
|
3269
3318
|
function Combobox({ options, placeholder = "Select option", invalid = false, className = "", ...props }) {
|
|
3270
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: [
|
|
3271
|
-
/* @__PURE__ */
|
|
3272
|
-
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))
|
|
3273
3322
|
] });
|
|
3274
3323
|
}
|
|
3275
3324
|
|
|
3276
3325
|
// src/components/forms/DateRangePicker.tsx
|
|
3277
|
-
import { jsx as
|
|
3326
|
+
import { jsx as jsx107, jsxs as jsxs81 } from "react/jsx-runtime";
|
|
3278
3327
|
function DateRangePicker({ startLabel = "From", endLabel = "To", startProps, endProps, className = "" }) {
|
|
3279
3328
|
return /* @__PURE__ */ jsxs81("div", { className: ["grid gap-3 md:grid-cols-2", className].filter(Boolean).join(" "), children: [
|
|
3280
3329
|
/* @__PURE__ */ jsxs81("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
|
|
3281
|
-
/* @__PURE__ */
|
|
3282
|
-
/* @__PURE__ */
|
|
3330
|
+
/* @__PURE__ */ jsx107("span", { children: startLabel }),
|
|
3331
|
+
/* @__PURE__ */ jsx107("input", { type: "date", ...startProps, className: ["input-field", startProps?.className || ""].join(" ") })
|
|
3283
3332
|
] }),
|
|
3284
3333
|
/* @__PURE__ */ jsxs81("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
|
|
3285
|
-
/* @__PURE__ */
|
|
3286
|
-
/* @__PURE__ */
|
|
3334
|
+
/* @__PURE__ */ jsx107("span", { children: endLabel }),
|
|
3335
|
+
/* @__PURE__ */ jsx107("input", { type: "date", ...endProps, className: ["input-field", endProps?.className || ""].join(" ") })
|
|
3287
3336
|
] })
|
|
3288
3337
|
] });
|
|
3289
3338
|
}
|
|
3290
3339
|
|
|
3291
3340
|
// src/components/forms/ColorSwatchPicker.tsx
|
|
3292
|
-
import { jsx as
|
|
3341
|
+
import { jsx as jsx108, jsxs as jsxs82 } from "react/jsx-runtime";
|
|
3293
3342
|
function ColorSwatchPicker({ options, value, onChange, className = "" }) {
|
|
3294
|
-
return /* @__PURE__ */
|
|
3343
|
+
return /* @__PURE__ */ jsx108("div", { className: ["flex flex-wrap gap-2", className].filter(Boolean).join(" "), children: options.map((option) => {
|
|
3295
3344
|
const selected = option.value === value;
|
|
3296
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: [
|
|
3297
|
-
/* @__PURE__ */
|
|
3298
|
-
/* @__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 })
|
|
3299
3348
|
] }, option.value);
|
|
3300
3349
|
}) });
|
|
3301
3350
|
}
|
|
3302
3351
|
|
|
3303
3352
|
// src/components/forms/RatingInput.tsx
|
|
3304
|
-
import { jsx as
|
|
3353
|
+
import { jsx as jsx109 } from "react/jsx-runtime";
|
|
3305
3354
|
function RatingInput({ value = 0, max = 5, icon = "\u2605", onChange, label = "Rating", className = "" }) {
|
|
3306
|
-
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) => {
|
|
3307
3356
|
const score = index + 1;
|
|
3308
3357
|
const active = score <= value;
|
|
3309
|
-
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);
|
|
3310
3359
|
}) });
|
|
3311
3360
|
}
|
|
3312
3361
|
|
|
3313
3362
|
// src/components/data-display/ScoreRing.tsx
|
|
3314
|
-
import { jsx as
|
|
3363
|
+
import { jsx as jsx110, jsxs as jsxs83 } from "react/jsx-runtime";
|
|
3315
3364
|
function ScoreRing({ value, max = 100, label, size = 112, className = "" }) {
|
|
3316
3365
|
const normalized = Math.max(0, Math.min(1, value / max));
|
|
3317
3366
|
const radius = 42;
|
|
@@ -3319,131 +3368,131 @@ function ScoreRing({ value, max = 100, label, size = 112, className = "" }) {
|
|
|
3319
3368
|
const dash = circumference * normalized;
|
|
3320
3369
|
return /* @__PURE__ */ jsxs83("div", { className: ["inline-grid place-items-center", className].filter(Boolean).join(" "), style: { width: size, height: size }, children: [
|
|
3321
3370
|
/* @__PURE__ */ jsxs83("svg", { viewBox: "0 0 100 100", className: "h-full w-full -rotate-90", children: [
|
|
3322
|
-
/* @__PURE__ */
|
|
3323
|
-
/* @__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}` })
|
|
3324
3373
|
] }),
|
|
3325
3374
|
/* @__PURE__ */ jsxs83("div", { className: "absolute text-center", children: [
|
|
3326
3375
|
/* @__PURE__ */ jsxs83("div", { className: "font-display text-2xl font-semibold text-[var(--tapiz-text-primary)]", children: [
|
|
3327
3376
|
Math.round(normalized * 100),
|
|
3328
3377
|
"%"
|
|
3329
3378
|
] }),
|
|
3330
|
-
label ? /* @__PURE__ */
|
|
3379
|
+
label ? /* @__PURE__ */ jsx110("div", { className: "font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: label }) : null
|
|
3331
3380
|
] })
|
|
3332
3381
|
] });
|
|
3333
3382
|
}
|
|
3334
3383
|
|
|
3335
3384
|
// src/components/data-display/HeatmapGrid.tsx
|
|
3336
|
-
import { jsx as
|
|
3385
|
+
import { jsx as jsx111 } from "react/jsx-runtime";
|
|
3337
3386
|
function HeatmapGrid({ cells, columns = 7, max, className = "" }) {
|
|
3338
3387
|
const peak = max ?? Math.max(1, ...cells.map((cell) => cell.value));
|
|
3339
|
-
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) => {
|
|
3340
3389
|
const opacity = 0.15 + Math.min(1, cell.value / peak) * 0.75;
|
|
3341
|
-
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);
|
|
3342
3391
|
}) });
|
|
3343
3392
|
}
|
|
3344
3393
|
|
|
3345
3394
|
// src/components/data-display/FunnelChart.tsx
|
|
3346
|
-
import { jsx as
|
|
3395
|
+
import { jsx as jsx112, jsxs as jsxs84 } from "react/jsx-runtime";
|
|
3347
3396
|
function FunnelChart({ steps, className = "" }) {
|
|
3348
3397
|
const max = Math.max(1, ...steps.map((step) => step.value));
|
|
3349
|
-
return /* @__PURE__ */
|
|
3398
|
+
return /* @__PURE__ */ jsx112("div", { className: ["space-y-3", className].filter(Boolean).join(" "), children: steps.map((step, index) => {
|
|
3350
3399
|
const width = Math.max(8, step.value / max * 100);
|
|
3351
3400
|
return /* @__PURE__ */ jsxs84("div", { children: [
|
|
3352
3401
|
/* @__PURE__ */ jsxs84("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
|
|
3353
|
-
/* @__PURE__ */
|
|
3402
|
+
/* @__PURE__ */ jsx112("span", { className: "font-medium text-[var(--tapiz-text-primary)]", children: step.label }),
|
|
3354
3403
|
/* @__PURE__ */ jsxs84("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
|
|
3355
3404
|
step.value,
|
|
3356
3405
|
step.meta ? ` \xB7 ${String(step.meta)}` : ""
|
|
3357
3406
|
] })
|
|
3358
3407
|
] }),
|
|
3359
|
-
/* @__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}%` } }) })
|
|
3360
3409
|
] }, index);
|
|
3361
3410
|
}) });
|
|
3362
3411
|
}
|
|
3363
3412
|
|
|
3364
3413
|
// src/components/data-display/ComparisonMeter.tsx
|
|
3365
|
-
import { jsx as
|
|
3414
|
+
import { jsx as jsx113, jsxs as jsxs85 } from "react/jsx-runtime";
|
|
3366
3415
|
function ComparisonMeter({ leftLabel, rightLabel, value, className = "" }) {
|
|
3367
3416
|
const clamped = Math.max(0, Math.min(100, value));
|
|
3368
3417
|
return /* @__PURE__ */ jsxs85("div", { className, children: [
|
|
3369
3418
|
/* @__PURE__ */ jsxs85("div", { className: "mb-2 flex justify-between gap-3 text-sm text-[var(--tapiz-text-muted)]", children: [
|
|
3370
|
-
/* @__PURE__ */
|
|
3371
|
-
/* @__PURE__ */
|
|
3419
|
+
/* @__PURE__ */ jsx113("span", { children: leftLabel }),
|
|
3420
|
+
/* @__PURE__ */ jsx113("span", { children: rightLabel })
|
|
3372
3421
|
] }),
|
|
3373
3422
|
/* @__PURE__ */ jsxs85("div", { className: "relative h-3 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]", children: [
|
|
3374
|
-
/* @__PURE__ */
|
|
3375
|
-
/* @__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}%` } })
|
|
3376
3425
|
] })
|
|
3377
3426
|
] });
|
|
3378
3427
|
}
|
|
3379
3428
|
|
|
3380
3429
|
// src/components/framework/ActivityFeed.tsx
|
|
3381
|
-
import { jsx as
|
|
3430
|
+
import { jsx as jsx114, jsxs as jsxs86 } from "react/jsx-runtime";
|
|
3382
3431
|
function ActivityFeed({ items, className = "" }) {
|
|
3383
|
-
return /* @__PURE__ */
|
|
3384
|
-
/* @__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" }),
|
|
3385
3434
|
/* @__PURE__ */ jsxs86("div", { className: "min-w-0 flex-1", children: [
|
|
3386
3435
|
/* @__PURE__ */ jsxs86("p", { className: "text-sm text-[var(--tapiz-text-primary)]", children: [
|
|
3387
|
-
/* @__PURE__ */
|
|
3436
|
+
/* @__PURE__ */ jsx114("strong", { children: item.actor }),
|
|
3388
3437
|
" ",
|
|
3389
3438
|
item.action
|
|
3390
3439
|
] }),
|
|
3391
|
-
item.meta ? /* @__PURE__ */
|
|
3440
|
+
item.meta ? /* @__PURE__ */ jsx114("div", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: item.meta }) : null
|
|
3392
3441
|
] }),
|
|
3393
|
-
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
|
|
3394
3443
|
] }, index)) });
|
|
3395
3444
|
}
|
|
3396
3445
|
|
|
3397
3446
|
// src/components/framework/InboxList.tsx
|
|
3398
|
-
import { jsx as
|
|
3447
|
+
import { jsx as jsx115, jsxs as jsxs87 } from "react/jsx-runtime";
|
|
3399
3448
|
function InboxList({ items, className = "" }) {
|
|
3400
|
-
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: [
|
|
3401
3450
|
/* @__PURE__ */ jsxs87("div", { className: "flex items-start justify-between gap-3", children: [
|
|
3402
3451
|
/* @__PURE__ */ jsxs87("div", { className: "min-w-0", children: [
|
|
3403
|
-
/* @__PURE__ */
|
|
3404
|
-
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
|
|
3405
3454
|
] }),
|
|
3406
3455
|
/* @__PURE__ */ jsxs87("div", { className: "flex shrink-0 items-center gap-2", children: [
|
|
3407
|
-
item.tag ? /* @__PURE__ */
|
|
3408
|
-
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
|
|
3409
3458
|
] })
|
|
3410
3459
|
] }),
|
|
3411
|
-
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
|
|
3412
3461
|
] }, index)) });
|
|
3413
3462
|
}
|
|
3414
3463
|
|
|
3415
3464
|
// src/components/framework/ApprovalQueue.tsx
|
|
3416
|
-
import { jsx as
|
|
3465
|
+
import { jsx as jsx116, jsxs as jsxs88 } from "react/jsx-runtime";
|
|
3417
3466
|
function ApprovalQueue({ items, onApprove, onReject, className = "" }) {
|
|
3418
|
-
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: [
|
|
3419
3468
|
/* @__PURE__ */ jsxs88("div", { children: [
|
|
3420
3469
|
/* @__PURE__ */ jsxs88("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
3421
|
-
/* @__PURE__ */
|
|
3422
|
-
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
|
|
3423
3472
|
] }),
|
|
3424
3473
|
item.requester ? /* @__PURE__ */ jsxs88("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: [
|
|
3425
3474
|
"Requested by ",
|
|
3426
3475
|
item.requester
|
|
3427
3476
|
] }) : null,
|
|
3428
|
-
item.description ? /* @__PURE__ */
|
|
3477
|
+
item.description ? /* @__PURE__ */ jsx116("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: item.description }) : null
|
|
3429
3478
|
] }),
|
|
3430
3479
|
/* @__PURE__ */ jsxs88("div", { className: "flex gap-2", children: [
|
|
3431
|
-
/* @__PURE__ */
|
|
3432
|
-
/* @__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" })
|
|
3433
3482
|
] })
|
|
3434
3483
|
] }) }, index)) });
|
|
3435
3484
|
}
|
|
3436
3485
|
|
|
3437
3486
|
// src/components/framework/SLAStatus.tsx
|
|
3438
|
-
import { jsx as
|
|
3487
|
+
import { jsx as jsx117, jsxs as jsxs89 } from "react/jsx-runtime";
|
|
3439
3488
|
function SLAStatus({ label, value, target = 95, className = "" }) {
|
|
3440
3489
|
const ok = value >= target;
|
|
3441
3490
|
return /* @__PURE__ */ jsxs89("div", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4", className].filter(Boolean).join(" "), children: [
|
|
3442
3491
|
/* @__PURE__ */ jsxs89("div", { className: "flex items-center justify-between gap-3", children: [
|
|
3443
|
-
/* @__PURE__ */
|
|
3444
|
-
/* @__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" })
|
|
3445
3494
|
] }),
|
|
3446
|
-
/* @__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))}%` } }) }),
|
|
3447
3496
|
/* @__PURE__ */ jsxs89("div", { className: "mt-2 flex justify-between font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: [
|
|
3448
3497
|
/* @__PURE__ */ jsxs89("span", { children: [
|
|
3449
3498
|
value,
|
|
@@ -3459,81 +3508,81 @@ function SLAStatus({ label, value, target = 95, className = "" }) {
|
|
|
3459
3508
|
}
|
|
3460
3509
|
|
|
3461
3510
|
// src/components/framework/FeatureFlagTable.tsx
|
|
3462
|
-
import { jsx as
|
|
3511
|
+
import { jsx as jsx118, jsxs as jsxs90 } from "react/jsx-runtime";
|
|
3463
3512
|
function FeatureFlagTable({ flags, onToggle, className = "" }) {
|
|
3464
|
-
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: [
|
|
3465
3514
|
/* @__PURE__ */ jsxs90("div", { children: [
|
|
3466
3515
|
/* @__PURE__ */ jsxs90("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
3467
|
-
/* @__PURE__ */
|
|
3468
|
-
/* @__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 })
|
|
3469
3518
|
] }),
|
|
3470
|
-
flag.description ? /* @__PURE__ */
|
|
3519
|
+
flag.description ? /* @__PURE__ */ jsx118("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: flag.description }) : null
|
|
3471
3520
|
] }),
|
|
3472
|
-
/* @__PURE__ */
|
|
3473
|
-
/* @__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) })
|
|
3474
3523
|
] }, flag.key)) });
|
|
3475
3524
|
}
|
|
3476
3525
|
|
|
3477
3526
|
// src/components/framework/PlanUsage.tsx
|
|
3478
|
-
import { jsx as
|
|
3527
|
+
import { jsx as jsx119, jsxs as jsxs91 } from "react/jsx-runtime";
|
|
3479
3528
|
function PlanUsage({ title = "Plan usage", items, className = "" }) {
|
|
3480
3529
|
return /* @__PURE__ */ jsxs91("section", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5", className].filter(Boolean).join(" "), children: [
|
|
3481
|
-
/* @__PURE__ */
|
|
3482
|
-
/* @__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) => {
|
|
3483
3532
|
const pct = item.limit ? Math.min(100, item.used / item.limit * 100) : 0;
|
|
3484
3533
|
return /* @__PURE__ */ jsxs91("div", { children: [
|
|
3485
3534
|
/* @__PURE__ */ jsxs91("div", { className: "mb-1 flex justify-between text-sm", children: [
|
|
3486
|
-
/* @__PURE__ */
|
|
3535
|
+
/* @__PURE__ */ jsx119("span", { className: "text-[var(--tapiz-text-primary)]", children: item.label }),
|
|
3487
3536
|
/* @__PURE__ */ jsxs91("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
|
|
3488
3537
|
item.used,
|
|
3489
3538
|
"/",
|
|
3490
3539
|
item.limit
|
|
3491
3540
|
] })
|
|
3492
3541
|
] }),
|
|
3493
|
-
/* @__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}%` } }) })
|
|
3494
3543
|
] }, index);
|
|
3495
3544
|
}) })
|
|
3496
3545
|
] });
|
|
3497
3546
|
}
|
|
3498
3547
|
|
|
3499
3548
|
// src/components/marketing/AnnouncementBar.tsx
|
|
3500
|
-
import { jsx as
|
|
3549
|
+
import { jsx as jsx120, jsxs as jsxs92 } from "react/jsx-runtime";
|
|
3501
3550
|
function AnnouncementBar({ children, action, className = "" }) {
|
|
3502
|
-
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: [
|
|
3503
3552
|
" ",
|
|
3504
|
-
/* @__PURE__ */
|
|
3505
|
-
action ? /* @__PURE__ */
|
|
3553
|
+
/* @__PURE__ */ jsx120("span", { children }),
|
|
3554
|
+
action ? /* @__PURE__ */ jsx120("span", { children: action }) : null
|
|
3506
3555
|
] }) });
|
|
3507
3556
|
}
|
|
3508
3557
|
|
|
3509
3558
|
// src/components/marketing/FAQSection.tsx
|
|
3510
|
-
import { jsx as
|
|
3559
|
+
import { jsx as jsx121, jsxs as jsxs93 } from "react/jsx-runtime";
|
|
3511
3560
|
function FAQSection({ title = "Frequently asked questions", description, items, className = "" }) {
|
|
3512
3561
|
return /* @__PURE__ */ jsxs93("section", { className, children: [
|
|
3513
3562
|
/* @__PURE__ */ jsxs93("div", { className: "mb-6 max-w-2xl", children: [
|
|
3514
|
-
/* @__PURE__ */
|
|
3515
|
-
/* @__PURE__ */
|
|
3516
|
-
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
|
|
3517
3566
|
] }),
|
|
3518
|
-
/* @__PURE__ */
|
|
3567
|
+
/* @__PURE__ */ jsx121(Accordion, { items: items.map((item, index) => ({ id: `faq-${index}`, title: item.question, content: item.answer })) })
|
|
3519
3568
|
] });
|
|
3520
3569
|
}
|
|
3521
3570
|
|
|
3522
3571
|
// src/components/marketing/RoadmapList.tsx
|
|
3523
|
-
import { jsx as
|
|
3572
|
+
import { jsx as jsx122, jsxs as jsxs94 } from "react/jsx-runtime";
|
|
3524
3573
|
function RoadmapList({ items, className = "" }) {
|
|
3525
|
-
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: [
|
|
3526
3575
|
/* @__PURE__ */ jsxs94("div", { className: "flex items-center justify-between gap-3", children: [
|
|
3527
|
-
/* @__PURE__ */
|
|
3528
|
-
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
|
|
3529
3578
|
] }),
|
|
3530
|
-
/* @__PURE__ */
|
|
3531
|
-
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
|
|
3532
3581
|
] }, index)) });
|
|
3533
3582
|
}
|
|
3534
3583
|
|
|
3535
3584
|
// src/components/feedback/InlineStatus.tsx
|
|
3536
|
-
import { jsx as
|
|
3585
|
+
import { jsx as jsx123, jsxs as jsxs95 } from "react/jsx-runtime";
|
|
3537
3586
|
var toneClasses5 = {
|
|
3538
3587
|
neutral: "bg-[var(--tapiz-text-muted)]",
|
|
3539
3588
|
success: "bg-[var(--tapiz-success)]",
|
|
@@ -3543,7 +3592,7 @@ var toneClasses5 = {
|
|
|
3543
3592
|
};
|
|
3544
3593
|
function InlineStatus({ tone: tone2 = "neutral", children, pulse = false, className = "" }) {
|
|
3545
3594
|
return /* @__PURE__ */ jsxs95("span", { className: ["inline-flex items-center gap-2 text-sm text-[var(--tapiz-text-muted)]", className].filter(Boolean).join(" "), children: [
|
|
3546
|
-
/* @__PURE__ */
|
|
3595
|
+
/* @__PURE__ */ jsx123("span", { className: ["h-2 w-2 rounded-full", toneClasses5[tone2], pulse ? "animate-pulse" : ""].filter(Boolean).join(" ") }),
|
|
3547
3596
|
children
|
|
3548
3597
|
] });
|
|
3549
3598
|
}
|
|
@@ -3638,6 +3687,7 @@ export {
|
|
|
3638
3687
|
FormulaIcon,
|
|
3639
3688
|
FunnelChart,
|
|
3640
3689
|
Gear,
|
|
3690
|
+
GitHubIcon,
|
|
3641
3691
|
Globe,
|
|
3642
3692
|
GooglePlayIcon,
|
|
3643
3693
|
GraduationCap,
|
|
@@ -3750,6 +3800,7 @@ export {
|
|
|
3750
3800
|
TextIcon,
|
|
3751
3801
|
Textarea,
|
|
3752
3802
|
TextareaCounter,
|
|
3803
|
+
ThemeIconButton,
|
|
3753
3804
|
Timeline,
|
|
3754
3805
|
Toast,
|
|
3755
3806
|
ToastProvider,
|