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