@tapizlabs/ui 0.2.18 → 0.2.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +15 -1
- package/dist/index.js +716 -601
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1914,33 +1914,13 @@ function StatusBadge({ label, variant = "default", className = "" }) {
|
|
|
1914
1914
|
}
|
|
1915
1915
|
|
|
1916
1916
|
// src/components/shared/ActionMenu.tsx
|
|
1917
|
-
import { useEffect as useEffect2,
|
|
1917
|
+
import { useEffect as useEffect2, useRef as useRef2, useState as useState6 } from "react";
|
|
1918
1918
|
import { createPortal as createPortal4 } from "react-dom";
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
borderTop: "2px solid var(--color-primary-300)",
|
|
1924
|
-
boxShadow: "0 16px 48px -8px rgba(0,0,0,0.45)",
|
|
1925
|
-
maxHeight: "min(320px, calc(100vh - 180px))"
|
|
1926
|
-
};
|
|
1927
|
-
var itemBaseClass = "flex w-full items-center gap-2.5 border-l-2 border-transparent px-4 py-2.5 text-left text-sm transition-colors duration-100 hover:border-[var(--color-primary-300)] disabled:cursor-not-allowed disabled:opacity-40";
|
|
1928
|
-
function ActionMenu({
|
|
1929
|
-
label,
|
|
1930
|
-
items,
|
|
1931
|
-
icon,
|
|
1932
|
-
buttonSize = "sm",
|
|
1933
|
-
buttonVariant = "secondary",
|
|
1934
|
-
buttonClassName = "",
|
|
1935
|
-
menuClassName,
|
|
1936
|
-
menuStyle,
|
|
1937
|
-
fullWidth = false,
|
|
1938
|
-
closeLabel
|
|
1939
|
-
}) {
|
|
1940
|
-
const [open, setOpen] = useState5(false);
|
|
1919
|
+
|
|
1920
|
+
// src/components/shared/useMenuPosition.ts
|
|
1921
|
+
import { useLayoutEffect, useState as useState5 } from "react";
|
|
1922
|
+
function useMenuPosition(open, btnRef, itemCount) {
|
|
1941
1923
|
const [pos, setPos] = useState5(null);
|
|
1942
|
-
const btnRef = useRef2(null);
|
|
1943
|
-
const menuRef = useRef2(null);
|
|
1944
1924
|
useLayoutEffect(() => {
|
|
1945
1925
|
if (!open || !btnRef.current) return;
|
|
1946
1926
|
const updatePosition = () => {
|
|
@@ -1954,7 +1934,7 @@ function ActionMenu({
|
|
|
1954
1934
|
viewportPadding,
|
|
1955
1935
|
Math.min(rect.right - menuW, window.innerWidth - menuW - viewportPadding)
|
|
1956
1936
|
);
|
|
1957
|
-
const estimatedMenuHeight = Math.min(320,
|
|
1937
|
+
const estimatedMenuHeight = Math.min(320, itemCount * 44 + 16);
|
|
1958
1938
|
const spaceAbove = Math.max(0, rect.top - viewportPadding - menuOffset);
|
|
1959
1939
|
const spaceBelow = Math.max(0, window.innerHeight - rect.bottom - viewportPadding - menuOffset);
|
|
1960
1940
|
const preferBelow = spaceBelow >= estimatedMenuHeight || spaceBelow >= spaceAbove;
|
|
@@ -1981,7 +1961,36 @@ function ActionMenu({
|
|
|
1981
1961
|
window.removeEventListener("resize", updatePosition);
|
|
1982
1962
|
document.removeEventListener("scroll", updatePosition, true);
|
|
1983
1963
|
};
|
|
1984
|
-
}, [
|
|
1964
|
+
}, [itemCount, open, btnRef]);
|
|
1965
|
+
return pos;
|
|
1966
|
+
}
|
|
1967
|
+
|
|
1968
|
+
// src/components/shared/ActionMenu.tsx
|
|
1969
|
+
import { Fragment as Fragment2, jsx as jsx42, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
1970
|
+
var defaultMenuStyle = {
|
|
1971
|
+
background: "var(--color-ink-200)",
|
|
1972
|
+
border: "1px solid var(--color-border-hi)",
|
|
1973
|
+
borderTop: "2px solid var(--color-primary-300)",
|
|
1974
|
+
boxShadow: "0 16px 48px -8px rgba(0,0,0,0.45)",
|
|
1975
|
+
maxHeight: "min(320px, calc(100vh - 180px))"
|
|
1976
|
+
};
|
|
1977
|
+
var itemBaseClass = "flex w-full items-center gap-2.5 border-l-2 border-transparent px-4 py-2.5 text-left text-sm transition-colors duration-100 hover:border-[var(--color-primary-300)] disabled:cursor-not-allowed disabled:opacity-40";
|
|
1978
|
+
function ActionMenu({
|
|
1979
|
+
label,
|
|
1980
|
+
items,
|
|
1981
|
+
icon,
|
|
1982
|
+
buttonSize = "sm",
|
|
1983
|
+
buttonVariant = "secondary",
|
|
1984
|
+
buttonClassName = "",
|
|
1985
|
+
menuClassName,
|
|
1986
|
+
menuStyle,
|
|
1987
|
+
fullWidth = false,
|
|
1988
|
+
closeLabel
|
|
1989
|
+
}) {
|
|
1990
|
+
const [open, setOpen] = useState6(false);
|
|
1991
|
+
const btnRef = useRef2(null);
|
|
1992
|
+
const menuRef = useRef2(null);
|
|
1993
|
+
const pos = useMenuPosition(open, btnRef, items.length);
|
|
1985
1994
|
useEffect2(() => {
|
|
1986
1995
|
if (!open) return;
|
|
1987
1996
|
function handle(e) {
|
|
@@ -2000,6 +2009,7 @@ function ActionMenu({
|
|
|
2000
2009
|
document.removeEventListener("keydown", handle);
|
|
2001
2010
|
};
|
|
2002
2011
|
}, [open]);
|
|
2012
|
+
void closeLabel;
|
|
2003
2013
|
const menuNode = open && pos ? /* @__PURE__ */ jsxs28(Fragment2, { children: [
|
|
2004
2014
|
/* @__PURE__ */ jsx42("div", { className: "fixed inset-0 z-9998", onClick: () => setOpen(false) }),
|
|
2005
2015
|
/* @__PURE__ */ jsx42(
|
|
@@ -2060,9 +2070,6 @@ function ActionMenu({
|
|
|
2060
2070
|
] });
|
|
2061
2071
|
}
|
|
2062
2072
|
|
|
2063
|
-
// src/components/table/DataTable.tsx
|
|
2064
|
-
import { useMemo as useMemo2, useState as useState6 } from "react";
|
|
2065
|
-
|
|
2066
2073
|
// src/components/table/DataTableRow.tsx
|
|
2067
2074
|
import { memo } from "react";
|
|
2068
2075
|
import { jsx as jsx43, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
@@ -2094,13 +2101,21 @@ function DataTableRowInner({ row, columns, onRowClick, rowActions, densityCellCl
|
|
|
2094
2101
|
}
|
|
2095
2102
|
var DataTableRow = memo(DataTableRowInner);
|
|
2096
2103
|
|
|
2097
|
-
// src/components/table/
|
|
2098
|
-
import { jsx as jsx44
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
+
// src/components/table/DataTableMobileCard.tsx
|
|
2105
|
+
import { jsx as jsx44 } from "react/jsx-runtime";
|
|
2106
|
+
function DataTableMobileCard({
|
|
2107
|
+
data,
|
|
2108
|
+
isLoading,
|
|
2109
|
+
loadingRows,
|
|
2110
|
+
emptyState,
|
|
2111
|
+
rowKey,
|
|
2112
|
+
mobileCard
|
|
2113
|
+
}) {
|
|
2114
|
+
return /* @__PURE__ */ jsx44("div", { className: "md:hidden", children: isLoading ? Array.from({ length: loadingRows }).map((_, i) => /* @__PURE__ */ jsx44("div", { className: "h-16 animate-pulse bg-ink-300" }, i)) : data.length === 0 ? emptyState : data.map((row) => /* @__PURE__ */ jsx44("div", { children: mobileCard(row) }, rowKey(row))) });
|
|
2115
|
+
}
|
|
2116
|
+
|
|
2117
|
+
// src/components/table/useSortedData.ts
|
|
2118
|
+
import { useMemo as useMemo2, useState as useState7 } from "react";
|
|
2104
2119
|
function compareValues(a, b) {
|
|
2105
2120
|
if (a == null && b == null) return 0;
|
|
2106
2121
|
if (a == null) return -1;
|
|
@@ -2110,6 +2125,37 @@ function compareValues(a, b) {
|
|
|
2110
2125
|
if (typeof a === "boolean" && typeof b === "boolean") return Number(a) - Number(b);
|
|
2111
2126
|
return String(a).localeCompare(String(b));
|
|
2112
2127
|
}
|
|
2128
|
+
function useSortedData(data, columns, serverSort) {
|
|
2129
|
+
const [sort, setSort] = useState7(null);
|
|
2130
|
+
const sortedData = useMemo2(() => {
|
|
2131
|
+
if (serverSort) return data;
|
|
2132
|
+
if (!sort) return data;
|
|
2133
|
+
const column = columns.find((c) => c.id === sort.columnId);
|
|
2134
|
+
if (!column?.sortAccessor) return data;
|
|
2135
|
+
const accessor = column.sortAccessor;
|
|
2136
|
+
const factor = sort.direction === "asc" ? 1 : -1;
|
|
2137
|
+
return [...data].sort((a, b) => compareValues(accessor(a), accessor(b)) * factor);
|
|
2138
|
+
}, [data, columns, sort, serverSort]);
|
|
2139
|
+
const toggleSort = (columnId) => {
|
|
2140
|
+
if (serverSort) {
|
|
2141
|
+
serverSort.onSort(columnId);
|
|
2142
|
+
return;
|
|
2143
|
+
}
|
|
2144
|
+
setSort((prev) => {
|
|
2145
|
+
if (prev?.columnId !== columnId) return { columnId, direction: "asc" };
|
|
2146
|
+
return { columnId, direction: prev.direction === "asc" ? "desc" : "asc" };
|
|
2147
|
+
});
|
|
2148
|
+
};
|
|
2149
|
+
return { sortedData, sort, toggleSort };
|
|
2150
|
+
}
|
|
2151
|
+
|
|
2152
|
+
// src/components/table/DataTable.tsx
|
|
2153
|
+
import { jsx as jsx45, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
2154
|
+
var ALIGN_CLASS2 = {
|
|
2155
|
+
left: "text-left",
|
|
2156
|
+
center: "text-center",
|
|
2157
|
+
right: "text-right"
|
|
2158
|
+
};
|
|
2113
2159
|
function ariaSort(active, direction) {
|
|
2114
2160
|
if (!active) return "none";
|
|
2115
2161
|
return direction === "asc" ? "ascending" : "descending";
|
|
@@ -2132,26 +2178,7 @@ function DataTable({
|
|
|
2132
2178
|
striped = true,
|
|
2133
2179
|
className = ""
|
|
2134
2180
|
}) {
|
|
2135
|
-
const
|
|
2136
|
-
const sortedData = useMemo2(() => {
|
|
2137
|
-
if (serverSort) return data;
|
|
2138
|
-
if (!sort) return data;
|
|
2139
|
-
const column = columns.find((c) => c.id === sort.columnId);
|
|
2140
|
-
if (!column?.sortAccessor) return data;
|
|
2141
|
-
const accessor = column.sortAccessor;
|
|
2142
|
-
const factor = sort.direction === "asc" ? 1 : -1;
|
|
2143
|
-
return [...data].sort((a, b) => compareValues(accessor(a), accessor(b)) * factor);
|
|
2144
|
-
}, [data, columns, sort, serverSort]);
|
|
2145
|
-
const toggleSort = (columnId) => {
|
|
2146
|
-
if (serverSort) {
|
|
2147
|
-
serverSort.onSort(columnId);
|
|
2148
|
-
return;
|
|
2149
|
-
}
|
|
2150
|
-
setSort((prev) => {
|
|
2151
|
-
if (prev?.columnId !== columnId) return { columnId, direction: "asc" };
|
|
2152
|
-
return { columnId, direction: prev.direction === "asc" ? "desc" : "asc" };
|
|
2153
|
-
});
|
|
2154
|
-
};
|
|
2181
|
+
const { sortedData, sort, toggleSort } = useSortedData(data, columns, serverSort);
|
|
2155
2182
|
const hasActions = rowActions !== void 0;
|
|
2156
2183
|
const colCount = columns.length + (hasActions ? 1 : 0);
|
|
2157
2184
|
const tableClass = mobileCard !== void 0 ? "hidden md:table w-full text-sm table-collapse" : "w-full text-sm table-collapse";
|
|
@@ -2159,22 +2186,32 @@ function DataTable({
|
|
|
2159
2186
|
const densityCellClass = density === "compact" ? "px-3 py-2" : density === "spacious" ? "px-4 py-4" : "px-3 py-2.5";
|
|
2160
2187
|
const wrapperClass = [
|
|
2161
2188
|
"overflow-x-auto",
|
|
2162
|
-
variant === "brutal" ? "border-2 border-[var(--tapiz-border-strong)] shadow-[var(--tapiz-shadow-brutal)]" : "border border-
|
|
2189
|
+
variant === "brutal" ? "border-2 border-[var(--tapiz-border-strong)] shadow-[var(--tapiz-shadow-brutal)]" : "border border-(--tapiz-border-subtle)",
|
|
2163
2190
|
variant === "enterprise" ? "bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-md)]" : "",
|
|
2164
2191
|
className
|
|
2165
2192
|
].filter(Boolean).join(" ");
|
|
2166
2193
|
return /* @__PURE__ */ jsxs30("div", { className: wrapperClass, children: [
|
|
2167
|
-
mobileCard !== void 0 && /* @__PURE__ */
|
|
2194
|
+
mobileCard !== void 0 && /* @__PURE__ */ jsx45(
|
|
2195
|
+
DataTableMobileCard,
|
|
2196
|
+
{
|
|
2197
|
+
data: sortedData,
|
|
2198
|
+
isLoading,
|
|
2199
|
+
loadingRows,
|
|
2200
|
+
emptyState,
|
|
2201
|
+
rowKey,
|
|
2202
|
+
mobileCard
|
|
2203
|
+
}
|
|
2204
|
+
),
|
|
2168
2205
|
/* @__PURE__ */ jsxs30("table", { className: tableClass, children: [
|
|
2169
|
-
/* @__PURE__ */
|
|
2206
|
+
/* @__PURE__ */ jsx45("thead", { children: /* @__PURE__ */ jsxs30("tr", { className: "border-b border-border bg-ink-300", children: [
|
|
2170
2207
|
columns.map((column) => {
|
|
2171
2208
|
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`;
|
|
2172
2209
|
if (!column.sortable || !column.sortAccessor) {
|
|
2173
|
-
return /* @__PURE__ */
|
|
2210
|
+
return /* @__PURE__ */ jsx45("th", { scope: "col", className: baseClass, children: column.header }, column.id);
|
|
2174
2211
|
}
|
|
2175
2212
|
const active = serverSort ? serverSort.field === column.id : sort?.columnId === column.id;
|
|
2176
2213
|
const direction = serverSort ? serverSort.dir : sort?.direction ?? "asc";
|
|
2177
|
-
return /* @__PURE__ */
|
|
2214
|
+
return /* @__PURE__ */ jsx45(
|
|
2178
2215
|
"th",
|
|
2179
2216
|
{
|
|
2180
2217
|
scope: "col",
|
|
@@ -2188,7 +2225,7 @@ function DataTable({
|
|
|
2188
2225
|
className: `inline-flex items-center gap-1 select-none transition-colors hover:text-txt-1 ${active ? "text-txt-1" : ""}`,
|
|
2189
2226
|
children: [
|
|
2190
2227
|
column.header,
|
|
2191
|
-
active && (direction === "asc" ? /* @__PURE__ */
|
|
2228
|
+
active && (direction === "asc" ? /* @__PURE__ */ jsx45(ChevronUp, { size: 12 }) : /* @__PURE__ */ jsx45(ChevronDown, { size: 12 }))
|
|
2192
2229
|
]
|
|
2193
2230
|
}
|
|
2194
2231
|
)
|
|
@@ -2196,9 +2233,9 @@ function DataTable({
|
|
|
2196
2233
|
column.id
|
|
2197
2234
|
);
|
|
2198
2235
|
}),
|
|
2199
|
-
hasActions && /* @__PURE__ */
|
|
2236
|
+
hasActions && /* @__PURE__ */ jsx45("th", { scope: "col", className: "px-3 py-2.5 text-right font-mono text-[11px] tracking-[.08em] text-txt-4 font-semibold whitespace-nowrap" })
|
|
2200
2237
|
] }) }),
|
|
2201
|
-
/* @__PURE__ */
|
|
2238
|
+
/* @__PURE__ */ jsx45("tbody", { children: isLoading ? Array.from({ length: loadingRows }).map((_, rowIndex) => /* @__PURE__ */ jsx45("tr", { className: "border-b border-(--tapiz-border-subtle)", children: Array.from({ length: colCount }).map((__, colIndex) => /* @__PURE__ */ jsx45("td", { className: densityCellClass, children: /* @__PURE__ */ jsx45("div", { className: "h-4 w-24 animate-pulse bg-(--tapiz-bg-surface-muted)" }) }, colIndex)) }, rowIndex)) : sortedData.length === 0 ? /* @__PURE__ */ jsx45("tr", { children: /* @__PURE__ */ jsx45("td", { colSpan: colCount, className: "px-4 py-10 text-center text-txt-4 text-sm font-mono", children: emptyState }) }) : sortedData.map((row) => /* @__PURE__ */ jsx45(
|
|
2202
2239
|
DataTableRow,
|
|
2203
2240
|
{
|
|
2204
2241
|
row,
|
|
@@ -2216,77 +2253,101 @@ function DataTable({
|
|
|
2216
2253
|
}
|
|
2217
2254
|
|
|
2218
2255
|
// src/components/marketing/CTASection.tsx
|
|
2219
|
-
import { jsx as
|
|
2256
|
+
import { jsx as jsx46, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2220
2257
|
function CTASection({ eyebrow, title, description, actions, className = "" }) {
|
|
2221
|
-
return /* @__PURE__ */
|
|
2222
|
-
eyebrow ? /* @__PURE__ */
|
|
2258
|
+
return /* @__PURE__ */ jsx46("section", { className: `mx-auto max-w-7xl px-[var(--tapiz-space-page-x)] py-[var(--tapiz-space-section-y)] ${className}`, children: /* @__PURE__ */ jsxs31("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: [
|
|
2259
|
+
eyebrow ? /* @__PURE__ */ jsx46("div", { className: "kicker mb-3", children: eyebrow }) : null,
|
|
2223
2260
|
/* @__PURE__ */ jsxs31("div", { className: "grid gap-6 lg:grid-cols-[1fr_auto] lg:items-end", children: [
|
|
2224
2261
|
/* @__PURE__ */ jsxs31("div", { children: [
|
|
2225
|
-
/* @__PURE__ */
|
|
2226
|
-
description ? /* @__PURE__ */
|
|
2262
|
+
/* @__PURE__ */ jsx46("h2", { className: "max-w-3xl text-3xl font-semibold tracking-[-0.05em] md:text-5xl", children: title }),
|
|
2263
|
+
description ? /* @__PURE__ */ jsx46("p", { className: "mt-4 max-w-2xl text-base leading-7 text-[var(--tapiz-text-secondary)]", children: description }) : null
|
|
2227
2264
|
] }),
|
|
2228
|
-
actions ? /* @__PURE__ */
|
|
2265
|
+
actions ? /* @__PURE__ */ jsx46("div", { className: "flex flex-wrap gap-3", children: actions }) : null
|
|
2229
2266
|
] })
|
|
2230
2267
|
] }) });
|
|
2231
2268
|
}
|
|
2232
2269
|
|
|
2233
2270
|
// src/components/marketing/ComparisonTable.tsx
|
|
2234
|
-
import { jsx as
|
|
2271
|
+
import { jsx as jsx47, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
2235
2272
|
function ComparisonTable({ rows, featureHeader = "Feature", includedHeader = "Tapiz", alternativeHeader = "Other", className = "" }) {
|
|
2236
|
-
return /* @__PURE__ */
|
|
2237
|
-
/* @__PURE__ */
|
|
2238
|
-
/* @__PURE__ */
|
|
2239
|
-
/* @__PURE__ */
|
|
2240
|
-
/* @__PURE__ */
|
|
2273
|
+
return /* @__PURE__ */ jsx47("div", { className: `overflow-x-auto border border-[var(--tapiz-border-strong)] ${className}`, children: /* @__PURE__ */ jsxs32("table", { className: "w-full text-sm", children: [
|
|
2274
|
+
/* @__PURE__ */ jsx47("thead", { children: /* @__PURE__ */ jsxs32("tr", { children: [
|
|
2275
|
+
/* @__PURE__ */ jsx47("th", { className: "px-4 py-3 text-left", children: featureHeader }),
|
|
2276
|
+
/* @__PURE__ */ jsx47("th", { className: "px-4 py-3 text-left", children: includedHeader }),
|
|
2277
|
+
/* @__PURE__ */ jsx47("th", { className: "px-4 py-3 text-left", children: alternativeHeader })
|
|
2241
2278
|
] }) }),
|
|
2242
|
-
/* @__PURE__ */
|
|
2243
|
-
/* @__PURE__ */
|
|
2244
|
-
/* @__PURE__ */
|
|
2245
|
-
/* @__PURE__ */
|
|
2279
|
+
/* @__PURE__ */ jsx47("tbody", { children: rows.map((row, index) => /* @__PURE__ */ jsxs32("tr", { className: "border-t border-[var(--tapiz-border-subtle)]", children: [
|
|
2280
|
+
/* @__PURE__ */ jsx47("td", { className: "px-4 py-3 font-medium text-[var(--tapiz-text-primary)]", children: row.feature }),
|
|
2281
|
+
/* @__PURE__ */ jsx47("td", { className: "px-4 py-3 text-[var(--tapiz-text-secondary)]", children: row.included }),
|
|
2282
|
+
/* @__PURE__ */ jsx47("td", { className: "px-4 py-3 text-[var(--tapiz-text-muted)]", children: row.alternative })
|
|
2246
2283
|
] }, index)) })
|
|
2247
2284
|
] }) });
|
|
2248
2285
|
}
|
|
2249
2286
|
|
|
2250
2287
|
// src/components/marketing/FeatureCard.tsx
|
|
2251
|
-
import { jsx as
|
|
2288
|
+
import { jsx as jsx48, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
2252
2289
|
function FeatureCard({ title, description, icon, eyebrow, children, className = "", variant = "surface" }) {
|
|
2253
2290
|
return /* @__PURE__ */ jsxs33(Card, { variant, hover: true, className: `group ${className}`, children: [
|
|
2254
2291
|
/* @__PURE__ */ jsxs33("div", { className: "flex items-start gap-4", children: [
|
|
2255
|
-
icon ? /* @__PURE__ */
|
|
2292
|
+
icon ? /* @__PURE__ */ jsx48("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,
|
|
2256
2293
|
/* @__PURE__ */ jsxs33("div", { className: "min-w-0", children: [
|
|
2257
|
-
eyebrow ? /* @__PURE__ */
|
|
2258
|
-
/* @__PURE__ */
|
|
2259
|
-
description ? /* @__PURE__ */
|
|
2294
|
+
eyebrow ? /* @__PURE__ */ jsx48("div", { className: "kicker mb-1", children: eyebrow }) : null,
|
|
2295
|
+
/* @__PURE__ */ jsx48("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: title }),
|
|
2296
|
+
description ? /* @__PURE__ */ jsx48("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
2260
2297
|
] })
|
|
2261
2298
|
] }),
|
|
2262
|
-
children ? /* @__PURE__ */
|
|
2299
|
+
children ? /* @__PURE__ */ jsx48("div", { className: "mt-5", children }) : null
|
|
2263
2300
|
] });
|
|
2264
2301
|
}
|
|
2265
2302
|
|
|
2266
2303
|
// src/components/marketing/FeatureGrid.tsx
|
|
2267
|
-
import { jsx as
|
|
2304
|
+
import { jsx as jsx49 } from "react/jsx-runtime";
|
|
2268
2305
|
function FeatureGrid({ children, className = "" }) {
|
|
2269
|
-
return /* @__PURE__ */
|
|
2306
|
+
return /* @__PURE__ */ jsx49("div", { className: `grid gap-4 md:grid-cols-2 xl:grid-cols-3 ${className}`, children });
|
|
2270
2307
|
}
|
|
2271
2308
|
|
|
2272
2309
|
// src/components/marketing/HeroFrame.tsx
|
|
2273
|
-
import { jsx as
|
|
2310
|
+
import { jsx as jsx50, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
2274
2311
|
function HeroFrame({ eyebrow, title, description, actions, visual, meta, className = "" }) {
|
|
2275
2312
|
return /* @__PURE__ */ jsxs34("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: [
|
|
2276
2313
|
/* @__PURE__ */ jsxs34("div", { className: "animate-fade-in-up", children: [
|
|
2277
|
-
eyebrow ? /* @__PURE__ */
|
|
2278
|
-
/* @__PURE__ */
|
|
2279
|
-
description ? /* @__PURE__ */
|
|
2280
|
-
actions ? /* @__PURE__ */
|
|
2281
|
-
meta ? /* @__PURE__ */
|
|
2314
|
+
eyebrow ? /* @__PURE__ */ jsx50("div", { className: "kicker mb-4", children: eyebrow }) : null,
|
|
2315
|
+
/* @__PURE__ */ jsx50("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 }),
|
|
2316
|
+
description ? /* @__PURE__ */ jsx50("p", { className: "mt-6 max-w-2xl text-base leading-7 text-[var(--tapiz-text-secondary)] md:text-lg", children: description }) : null,
|
|
2317
|
+
actions ? /* @__PURE__ */ jsx50("div", { className: "mt-8 flex flex-wrap gap-3", children: actions }) : null,
|
|
2318
|
+
meta ? /* @__PURE__ */ jsx50("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
|
|
2282
2319
|
] }),
|
|
2283
|
-
visual ? /* @__PURE__ */
|
|
2320
|
+
visual ? /* @__PURE__ */ jsx50("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
|
|
2284
2321
|
] });
|
|
2285
2322
|
}
|
|
2286
2323
|
|
|
2324
|
+
// src/components/marketing/useDrawerState.ts
|
|
2325
|
+
import { useEffect as useEffect3, useState as useState8 } from "react";
|
|
2326
|
+
function useDrawerState() {
|
|
2327
|
+
const [open, setOpen] = useState8(false);
|
|
2328
|
+
const [renderDrawer, setRenderDrawer] = useState8(false);
|
|
2329
|
+
useEffect3(() => {
|
|
2330
|
+
if (open) {
|
|
2331
|
+
setRenderDrawer(true);
|
|
2332
|
+
document.body.style.overflow = "hidden";
|
|
2333
|
+
document.body.classList.add("tapiz-landing-navbar-open");
|
|
2334
|
+
return () => {
|
|
2335
|
+
document.body.style.overflow = "";
|
|
2336
|
+
document.body.classList.remove("tapiz-landing-navbar-open");
|
|
2337
|
+
};
|
|
2338
|
+
}
|
|
2339
|
+
const timeoutId = window.setTimeout(() => {
|
|
2340
|
+
setRenderDrawer(false);
|
|
2341
|
+
document.body.style.overflow = "";
|
|
2342
|
+
document.body.classList.remove("tapiz-landing-navbar-open");
|
|
2343
|
+
}, 220);
|
|
2344
|
+
return () => window.clearTimeout(timeoutId);
|
|
2345
|
+
}, [open]);
|
|
2346
|
+
return { open, setOpen, renderDrawer };
|
|
2347
|
+
}
|
|
2348
|
+
|
|
2287
2349
|
// src/components/marketing/LandingNavbarShell.tsx
|
|
2288
|
-
import {
|
|
2289
|
-
import { Fragment as Fragment3, jsx as jsx50, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
2350
|
+
import { Fragment as Fragment3, jsx as jsx51, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
2290
2351
|
function LandingNavbarShell({
|
|
2291
2352
|
ariaNavLabel,
|
|
2292
2353
|
brand,
|
|
@@ -2305,53 +2366,35 @@ function LandingNavbarShell({
|
|
|
2305
2366
|
theme,
|
|
2306
2367
|
themeLabels
|
|
2307
2368
|
}) {
|
|
2308
|
-
const
|
|
2309
|
-
const [renderDrawer, setRenderDrawer] = useState7(false);
|
|
2310
|
-
useEffect3(() => {
|
|
2311
|
-
if (open) {
|
|
2312
|
-
setRenderDrawer(true);
|
|
2313
|
-
document.body.style.overflow = "hidden";
|
|
2314
|
-
document.body.classList.add("tapiz-landing-navbar-open");
|
|
2315
|
-
return () => {
|
|
2316
|
-
document.body.style.overflow = "";
|
|
2317
|
-
document.body.classList.remove("tapiz-landing-navbar-open");
|
|
2318
|
-
};
|
|
2319
|
-
}
|
|
2320
|
-
const timeoutId = window.setTimeout(() => {
|
|
2321
|
-
setRenderDrawer(false);
|
|
2322
|
-
document.body.style.overflow = "";
|
|
2323
|
-
document.body.classList.remove("tapiz-landing-navbar-open");
|
|
2324
|
-
}, 220);
|
|
2325
|
-
return () => window.clearTimeout(timeoutId);
|
|
2326
|
-
}, [open]);
|
|
2369
|
+
const { open, setOpen, renderDrawer } = useDrawerState();
|
|
2327
2370
|
const drawerLabel = mobileDialogLabel ?? menuLabel;
|
|
2328
2371
|
const resolvedCloseMenuLabel = closeMenuLabel ?? menuLabel;
|
|
2329
2372
|
const resolvedMobileNavLabel = mobileNavLabel ?? ariaNavLabel;
|
|
2330
2373
|
const themeLabel = theme === "dark" ? themeLabels.light : themeLabels.dark;
|
|
2331
2374
|
return /* @__PURE__ */ jsxs35(Fragment3, { children: [
|
|
2332
|
-
/* @__PURE__ */
|
|
2333
|
-
/* @__PURE__ */
|
|
2334
|
-
/* @__PURE__ */
|
|
2335
|
-
item.icon ? /* @__PURE__ */
|
|
2336
|
-
/* @__PURE__ */
|
|
2375
|
+
/* @__PURE__ */ jsx51("header", { className: ["tapiz-landing-navbar", className].filter(Boolean).join(" "), children: /* @__PURE__ */ jsxs35("div", { className: ["tapiz-landing-navbar__container", containerClassName].filter(Boolean).join(" "), children: [
|
|
2376
|
+
/* @__PURE__ */ jsx51("div", { className: "tapiz-landing-navbar__brand", children: brand }),
|
|
2377
|
+
/* @__PURE__ */ jsx51("nav", { className: "tapiz-landing-navbar__links", "aria-label": ariaNavLabel, children: items.map((item) => /* @__PURE__ */ jsxs35("a", { href: item.href, className: "tapiz-landing-navbar__link", children: [
|
|
2378
|
+
item.icon ? /* @__PURE__ */ jsx51("span", { "aria-hidden": "true", className: "tapiz-landing-navbar__link-icon", children: item.icon }) : null,
|
|
2379
|
+
/* @__PURE__ */ jsx51("span", { children: item.label })
|
|
2337
2380
|
] }, item.href)) }),
|
|
2338
2381
|
/* @__PURE__ */ jsxs35("div", { className: "tapiz-landing-navbar__actions", children: [
|
|
2339
|
-
desktopLanguageSwitcher ? /* @__PURE__ */
|
|
2340
|
-
/* @__PURE__ */
|
|
2382
|
+
desktopLanguageSwitcher ? /* @__PURE__ */ jsx51("div", { className: "tapiz-landing-navbar__language tapiz-landing-navbar__language--desktop", children: desktopLanguageSwitcher }) : null,
|
|
2383
|
+
/* @__PURE__ */ jsx51(
|
|
2341
2384
|
"button",
|
|
2342
2385
|
{
|
|
2343
2386
|
type: "button",
|
|
2344
2387
|
className: `tapiz-landing-navbar__theme is-${theme}`,
|
|
2345
2388
|
"aria-label": themeLabel,
|
|
2346
2389
|
onClick: onThemeToggle,
|
|
2347
|
-
children: /* @__PURE__ */
|
|
2348
|
-
/* @__PURE__ */
|
|
2349
|
-
/* @__PURE__ */
|
|
2390
|
+
children: /* @__PURE__ */ jsx51("span", { className: "tapiz-landing-navbar__theme-track", "aria-hidden": "true", children: /* @__PURE__ */ jsxs35("span", { className: "tapiz-landing-navbar__theme-thumb", children: [
|
|
2391
|
+
/* @__PURE__ */ jsx51(Sun, { size: 13, className: "tapiz-landing-navbar__theme-sun" }),
|
|
2392
|
+
/* @__PURE__ */ jsx51(Moon, { size: 13, className: "tapiz-landing-navbar__theme-moon" })
|
|
2350
2393
|
] }) })
|
|
2351
2394
|
}
|
|
2352
2395
|
),
|
|
2353
|
-
desktopActions ? /* @__PURE__ */
|
|
2354
|
-
/* @__PURE__ */
|
|
2396
|
+
desktopActions ? /* @__PURE__ */ jsx51("div", { className: "tapiz-landing-navbar__desktop-actions", children: desktopActions }) : null,
|
|
2397
|
+
/* @__PURE__ */ jsx51(
|
|
2355
2398
|
"button",
|
|
2356
2399
|
{
|
|
2357
2400
|
type: "button",
|
|
@@ -2359,12 +2402,12 @@ function LandingNavbarShell({
|
|
|
2359
2402
|
"aria-label": menuLabel,
|
|
2360
2403
|
"aria-expanded": open,
|
|
2361
2404
|
onClick: () => setOpen((value) => !value),
|
|
2362
|
-
children: open ? /* @__PURE__ */
|
|
2405
|
+
children: open ? /* @__PURE__ */ jsx51(X, { size: 18 }) : /* @__PURE__ */ jsx51(Menu, { size: 18 })
|
|
2363
2406
|
}
|
|
2364
2407
|
)
|
|
2365
2408
|
] })
|
|
2366
2409
|
] }) }),
|
|
2367
|
-
renderDrawer ? /* @__PURE__ */
|
|
2410
|
+
renderDrawer ? /* @__PURE__ */ jsx51(
|
|
2368
2411
|
"button",
|
|
2369
2412
|
{
|
|
2370
2413
|
type: "button",
|
|
@@ -2383,21 +2426,21 @@ function LandingNavbarShell({
|
|
|
2383
2426
|
"aria-modal": "true",
|
|
2384
2427
|
"aria-label": drawerLabel,
|
|
2385
2428
|
children: [
|
|
2386
|
-
/* @__PURE__ */
|
|
2429
|
+
/* @__PURE__ */ jsx51("nav", { className: "tapiz-landing-navbar__drawer-nav", "aria-label": resolvedMobileNavLabel, children: items.map((item) => /* @__PURE__ */ jsxs35(
|
|
2387
2430
|
"a",
|
|
2388
2431
|
{
|
|
2389
2432
|
href: item.href,
|
|
2390
2433
|
className: "tapiz-landing-navbar__drawer-link",
|
|
2391
2434
|
onClick: () => setOpen(false),
|
|
2392
2435
|
children: [
|
|
2393
|
-
item.icon ? /* @__PURE__ */
|
|
2394
|
-
/* @__PURE__ */
|
|
2436
|
+
item.icon ? /* @__PURE__ */ jsx51("span", { "aria-hidden": "true", className: "tapiz-landing-navbar__link-icon", children: item.icon }) : null,
|
|
2437
|
+
/* @__PURE__ */ jsx51("span", { children: item.label })
|
|
2395
2438
|
]
|
|
2396
2439
|
},
|
|
2397
2440
|
item.href
|
|
2398
2441
|
)) }),
|
|
2399
|
-
mobileLanguageSwitcher ? /* @__PURE__ */
|
|
2400
|
-
mobileActions ? /* @__PURE__ */
|
|
2442
|
+
mobileLanguageSwitcher ? /* @__PURE__ */ jsx51("div", { className: "tapiz-landing-navbar__language tapiz-landing-navbar__language--mobile", children: mobileLanguageSwitcher }) : null,
|
|
2443
|
+
mobileActions ? /* @__PURE__ */ jsx51("div", { className: "tapiz-landing-navbar__drawer-actions", children: mobileActions }) : null
|
|
2401
2444
|
]
|
|
2402
2445
|
}
|
|
2403
2446
|
) : null
|
|
@@ -2405,9 +2448,9 @@ function LandingNavbarShell({
|
|
|
2405
2448
|
}
|
|
2406
2449
|
|
|
2407
2450
|
// src/components/marketing/MarketingShell.tsx
|
|
2408
|
-
import { jsx as
|
|
2451
|
+
import { jsx as jsx52 } from "react/jsx-runtime";
|
|
2409
2452
|
function MarketingShell({ children, className = "", grid = true, noise = true }) {
|
|
2410
|
-
return /* @__PURE__ */
|
|
2453
|
+
return /* @__PURE__ */ jsx52(
|
|
2411
2454
|
"main",
|
|
2412
2455
|
{
|
|
2413
2456
|
className: [
|
|
@@ -2422,24 +2465,24 @@ function MarketingShell({ children, className = "", grid = true, noise = true })
|
|
|
2422
2465
|
}
|
|
2423
2466
|
|
|
2424
2467
|
// src/components/marketing/MockupFrame.tsx
|
|
2425
|
-
import { jsx as
|
|
2468
|
+
import { jsx as jsx53, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
2426
2469
|
function MockupFrame({ children, title, toolbar, className = "" }) {
|
|
2427
2470
|
return /* @__PURE__ */ jsxs36("div", { className: `overflow-hidden border-2 border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] shadow-[var(--tapiz-shadow-brutal)] ${className}`, children: [
|
|
2428
2471
|
/* @__PURE__ */ jsxs36("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: [
|
|
2429
2472
|
/* @__PURE__ */ jsxs36("div", { className: "flex items-center gap-1.5", children: [
|
|
2430
|
-
/* @__PURE__ */
|
|
2431
|
-
/* @__PURE__ */
|
|
2432
|
-
/* @__PURE__ */
|
|
2473
|
+
/* @__PURE__ */ jsx53("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-danger)]" }),
|
|
2474
|
+
/* @__PURE__ */ jsx53("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-warning)]" }),
|
|
2475
|
+
/* @__PURE__ */ jsx53("span", { className: "h-2.5 w-2.5 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-success)]" })
|
|
2433
2476
|
] }),
|
|
2434
|
-
title ? /* @__PURE__ */
|
|
2435
|
-
/* @__PURE__ */
|
|
2477
|
+
title ? /* @__PURE__ */ jsx53("div", { className: "font-mono text-[10px] uppercase tracking-widest text-[var(--tapiz-text-muted)]", children: title }) : null,
|
|
2478
|
+
/* @__PURE__ */ jsx53("div", { children: toolbar })
|
|
2436
2479
|
] }),
|
|
2437
|
-
/* @__PURE__ */
|
|
2480
|
+
/* @__PURE__ */ jsx53("div", { className: "p-4", children })
|
|
2438
2481
|
] });
|
|
2439
2482
|
}
|
|
2440
2483
|
|
|
2441
2484
|
// src/components/layout/AppShell.tsx
|
|
2442
|
-
import { jsx as
|
|
2485
|
+
import { jsx as jsx54, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
2443
2486
|
var variantClasses4 = {
|
|
2444
2487
|
default: "bg-[var(--tapiz-bg-page)]",
|
|
2445
2488
|
grid: "bg-[var(--tapiz-bg-page)] tapiz-grid-bg",
|
|
@@ -2449,15 +2492,15 @@ function AppShell({ sidebar, topbar, children, aside, className = "", contentCla
|
|
|
2449
2492
|
return /* @__PURE__ */ jsxs37("div", { className: `min-h-screen text-[var(--tapiz-text-primary)] ${variantClasses4[variant]} ${className}`, children: [
|
|
2450
2493
|
topbar,
|
|
2451
2494
|
/* @__PURE__ */ jsxs37("div", { className: "mx-auto flex w-full max-w-[1600px]", children: [
|
|
2452
|
-
sidebar ? /* @__PURE__ */
|
|
2453
|
-
/* @__PURE__ */
|
|
2454
|
-
aside ? /* @__PURE__ */
|
|
2495
|
+
sidebar ? /* @__PURE__ */ jsx54("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,
|
|
2496
|
+
/* @__PURE__ */ jsx54("main", { className: `min-w-0 flex-1 px-[var(--tapiz-space-page-x)] py-6 ${contentClassName}`, children }),
|
|
2497
|
+
aside ? /* @__PURE__ */ jsx54("aside", { className: "hidden w-80 shrink-0 border-l border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] xl:block", children: aside }) : null
|
|
2455
2498
|
] })
|
|
2456
2499
|
] });
|
|
2457
2500
|
}
|
|
2458
2501
|
|
|
2459
2502
|
// src/components/layout/SplitPane.tsx
|
|
2460
|
-
import { jsx as
|
|
2503
|
+
import { jsx as jsx55, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
2461
2504
|
var ratios = {
|
|
2462
2505
|
"50/50": "lg:grid-cols-2",
|
|
2463
2506
|
"60/40": "lg:grid-cols-[minmax(0,3fr)_minmax(320px,2fr)]",
|
|
@@ -2465,79 +2508,79 @@ var ratios = {
|
|
|
2465
2508
|
};
|
|
2466
2509
|
function SplitPane({ primary, secondary, ratio = "60/40", reverseOnMobile = false, className = "" }) {
|
|
2467
2510
|
return /* @__PURE__ */ jsxs38("div", { className: `grid gap-5 ${ratios[ratio]} ${className}`, children: [
|
|
2468
|
-
/* @__PURE__ */
|
|
2469
|
-
/* @__PURE__ */
|
|
2511
|
+
/* @__PURE__ */ jsx55("div", { className: reverseOnMobile ? "order-2 lg:order-1" : "", children: primary }),
|
|
2512
|
+
/* @__PURE__ */ jsx55("div", { className: reverseOnMobile ? "order-1 lg:order-2" : "", children: secondary })
|
|
2470
2513
|
] });
|
|
2471
2514
|
}
|
|
2472
2515
|
|
|
2473
2516
|
// src/components/layout/Stack.tsx
|
|
2474
|
-
import { jsx as
|
|
2517
|
+
import { jsx as jsx56 } from "react/jsx-runtime";
|
|
2475
2518
|
var gapClasses = { xs: "gap-1", sm: "gap-2", md: "gap-4", lg: "gap-6", xl: "gap-8" };
|
|
2476
2519
|
var alignClasses = { start: "items-start", center: "items-center", end: "items-end", stretch: "items-stretch" };
|
|
2477
2520
|
var justifyClasses = { start: "justify-start", center: "justify-center", between: "justify-between", end: "justify-end" };
|
|
2478
2521
|
function Stack({ children, gap = "md", direction = "vertical", align = "stretch", justify = "start", wrap = false, className = "" }) {
|
|
2479
|
-
return /* @__PURE__ */
|
|
2522
|
+
return /* @__PURE__ */ jsx56("div", { className: `flex ${direction === "vertical" ? "flex-col" : "flex-row"} ${gapClasses[gap]} ${alignClasses[align]} ${justifyClasses[justify]} ${wrap ? "flex-wrap" : ""} ${className}`, children });
|
|
2480
2523
|
}
|
|
2481
2524
|
|
|
2482
2525
|
// src/components/layout/Cluster.tsx
|
|
2483
|
-
import { jsx as
|
|
2526
|
+
import { jsx as jsx57 } from "react/jsx-runtime";
|
|
2484
2527
|
var gapClasses2 = { xs: "gap-1", sm: "gap-2", md: "gap-3", lg: "gap-5" };
|
|
2485
2528
|
var alignClasses2 = { start: "items-start", center: "items-center", end: "items-end" };
|
|
2486
2529
|
var justifyClasses2 = { start: "justify-start", center: "justify-center", between: "justify-between", end: "justify-end" };
|
|
2487
2530
|
function Cluster({ children, gap = "sm", align = "center", justify = "start", className = "" }) {
|
|
2488
|
-
return /* @__PURE__ */
|
|
2531
|
+
return /* @__PURE__ */ jsx57("div", { className: `flex flex-wrap ${gapClasses2[gap]} ${alignClasses2[align]} ${justifyClasses2[justify]} ${className}`, children });
|
|
2489
2532
|
}
|
|
2490
2533
|
|
|
2491
2534
|
// src/components/navigation/Breadcrumbs.tsx
|
|
2492
|
-
import { jsx as
|
|
2535
|
+
import { jsx as jsx58, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
2493
2536
|
function Breadcrumbs({ items, separator = "/", className = "" }) {
|
|
2494
|
-
return /* @__PURE__ */
|
|
2495
|
-
index > 0 ? /* @__PURE__ */
|
|
2496
|
-
item.href && !item.current ? /* @__PURE__ */
|
|
2537
|
+
return /* @__PURE__ */ jsx58("nav", { "aria-label": "Breadcrumb", className: `font-mono text-[10px] uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)] ${className}`, children: /* @__PURE__ */ jsx58("ol", { className: "flex flex-wrap items-center gap-2", children: items.map((item, index) => /* @__PURE__ */ jsxs39("li", { className: "flex items-center gap-2", children: [
|
|
2538
|
+
index > 0 ? /* @__PURE__ */ jsx58("span", { "aria-hidden": "true", className: "text-[var(--tapiz-text-disabled)]", children: separator }) : null,
|
|
2539
|
+
item.href && !item.current ? /* @__PURE__ */ jsx58("a", { className: "hover:text-[var(--tapiz-accent)]", href: item.href, children: item.label }) : /* @__PURE__ */ jsx58("span", { "aria-current": item.current ? "page" : void 0, className: item.current ? "text-[var(--tapiz-text-primary)]" : "", children: item.label })
|
|
2497
2540
|
] }, index)) }) });
|
|
2498
2541
|
}
|
|
2499
2542
|
|
|
2500
2543
|
// src/components/navigation/SidebarNav.tsx
|
|
2501
|
-
import { Fragment as Fragment4, jsx as
|
|
2544
|
+
import { Fragment as Fragment4, jsx as jsx59, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
2502
2545
|
function SidebarNav({ groups, header, footer, className = "" }) {
|
|
2503
|
-
return /* @__PURE__ */ jsxs40("div", { className: `flex h-full min-h-screen flex-col bg-
|
|
2504
|
-
header ? /* @__PURE__ */
|
|
2505
|
-
/* @__PURE__ */
|
|
2506
|
-
group.label ? /* @__PURE__ */
|
|
2507
|
-
/* @__PURE__ */
|
|
2546
|
+
return /* @__PURE__ */ jsxs40("div", { className: `flex h-full min-h-screen flex-col bg-(--tapiz-bg-surface) ${className}`, children: [
|
|
2547
|
+
header ? /* @__PURE__ */ jsx59("div", { className: "border-b border-(--tapiz-border-subtle) p-4", children: header }) : null,
|
|
2548
|
+
/* @__PURE__ */ jsx59("nav", { className: "flex-1 space-y-6 p-3", children: groups.map((group, groupIndex) => /* @__PURE__ */ jsxs40("div", { children: [
|
|
2549
|
+
group.label ? /* @__PURE__ */ jsx59("div", { className: "mb-2 px-2 font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-(--tapiz-text-muted)", children: group.label }) : null,
|
|
2550
|
+
/* @__PURE__ */ jsx59("div", { className: "space-y-1", children: group.items.map((item, itemIndex) => /* @__PURE__ */ jsx59(SidebarNavLink, { item }, itemIndex)) })
|
|
2508
2551
|
] }, groupIndex)) }),
|
|
2509
|
-
footer ? /* @__PURE__ */
|
|
2552
|
+
footer ? /* @__PURE__ */ jsx59("div", { className: "border-t border-(--tapiz-border-subtle) p-4", children: footer }) : null
|
|
2510
2553
|
] });
|
|
2511
2554
|
}
|
|
2512
2555
|
function SidebarNavLink({ item }) {
|
|
2513
2556
|
const className = [
|
|
2514
2557
|
"flex w-full items-center gap-3 border px-3 py-2 text-left text-sm font-medium",
|
|
2515
|
-
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-
|
|
2558
|
+
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-(--tapiz-border-subtle) hover:bg-[var(--tapiz-bg-surface-muted)] hover:text-[var(--tapiz-text-primary)]",
|
|
2516
2559
|
item.disabled ? "pointer-events-none opacity-40" : ""
|
|
2517
2560
|
].filter(Boolean).join(" ");
|
|
2518
2561
|
const content = /* @__PURE__ */ jsxs40(Fragment4, { children: [
|
|
2519
|
-
item.icon ? /* @__PURE__ */
|
|
2520
|
-
/* @__PURE__ */
|
|
2521
|
-
item.badge ? /* @__PURE__ */
|
|
2562
|
+
item.icon ? /* @__PURE__ */ jsx59("span", { className: "grid size-5 place-items-center text-(--tapiz-text-muted)", children: item.icon }) : null,
|
|
2563
|
+
/* @__PURE__ */ jsx59("span", { className: "min-w-0 flex-1 truncate", children: item.label }),
|
|
2564
|
+
item.badge ? /* @__PURE__ */ jsx59("span", { children: item.badge }) : null
|
|
2522
2565
|
] });
|
|
2523
|
-
return item.href ? /* @__PURE__ */
|
|
2566
|
+
return item.href ? /* @__PURE__ */ jsx59("a", { className, href: item.href, children: content }) : /* @__PURE__ */ jsx59("button", { type: "button", className, onClick: item.onClick, disabled: item.disabled, children: content });
|
|
2524
2567
|
}
|
|
2525
2568
|
|
|
2526
2569
|
// src/components/navigation/TopNav.tsx
|
|
2527
|
-
import { jsx as
|
|
2570
|
+
import { jsx as jsx60, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
2528
2571
|
function TopNav({ brand, links = [], actions, className = "", sticky = true }) {
|
|
2529
|
-
return /* @__PURE__ */
|
|
2530
|
-
brand ? /* @__PURE__ */
|
|
2531
|
-
/* @__PURE__ */
|
|
2572
|
+
return /* @__PURE__ */ jsx60("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__ */ jsxs41("div", { className: "mx-auto flex h-16 max-w-[1600px] items-center gap-6 px-[var(--tapiz-space-page-x)]", children: [
|
|
2573
|
+
brand ? /* @__PURE__ */ jsx60("div", { className: "shrink-0", children: brand }) : null,
|
|
2574
|
+
/* @__PURE__ */ jsx60("nav", { className: "hidden items-center gap-1 md:flex", children: links.map((link, index) => {
|
|
2532
2575
|
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)]"}`;
|
|
2533
|
-
return link.href ? /* @__PURE__ */
|
|
2576
|
+
return link.href ? /* @__PURE__ */ jsx60("a", { href: link.href, className: cls, children: link.label }, index) : /* @__PURE__ */ jsx60("button", { type: "button", onClick: link.onClick, className: cls, children: link.label }, index);
|
|
2534
2577
|
}) }),
|
|
2535
|
-
actions ? /* @__PURE__ */
|
|
2578
|
+
actions ? /* @__PURE__ */ jsx60("div", { className: "ml-auto flex items-center gap-2", children: actions }) : null
|
|
2536
2579
|
] }) });
|
|
2537
2580
|
}
|
|
2538
2581
|
|
|
2539
2582
|
// src/components/disclosure/Tabs.tsx
|
|
2540
|
-
import { jsx as
|
|
2583
|
+
import { jsx as jsx61, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
2541
2584
|
var variants = {
|
|
2542
2585
|
line: "border-b border-[var(--tapiz-border-subtle)]",
|
|
2543
2586
|
boxed: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-1",
|
|
@@ -2546,7 +2589,7 @@ var variants = {
|
|
|
2546
2589
|
function Tabs({ items, activeId, onChange, className = "", variant = "line" }) {
|
|
2547
2590
|
const active = items.find((item) => item.id === activeId) ?? items[0];
|
|
2548
2591
|
return /* @__PURE__ */ jsxs42("div", { className, children: [
|
|
2549
|
-
/* @__PURE__ */
|
|
2592
|
+
/* @__PURE__ */ jsx61("div", { role: "tablist", className: `flex flex-wrap gap-1 ${variants[variant]}`, children: items.map((item) => {
|
|
2550
2593
|
const selected = item.id === active?.id;
|
|
2551
2594
|
return /* @__PURE__ */ jsxs42(
|
|
2552
2595
|
"button",
|
|
@@ -2565,17 +2608,88 @@ function Tabs({ items, activeId, onChange, className = "", variant = "line" }) {
|
|
|
2565
2608
|
item.id
|
|
2566
2609
|
);
|
|
2567
2610
|
}) }),
|
|
2568
|
-
/* @__PURE__ */
|
|
2611
|
+
/* @__PURE__ */ jsx61("div", { role: "tabpanel", className: "pt-4", children: active?.content })
|
|
2569
2612
|
] });
|
|
2570
2613
|
}
|
|
2571
2614
|
|
|
2615
|
+
// src/components/disclosure/SegmentedTabs.tsx
|
|
2616
|
+
import { useLayoutEffect as useLayoutEffect2, useRef as useRef3, useState as useState9 } from "react";
|
|
2617
|
+
import { jsx as jsx62, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
2618
|
+
function SegmentedTabs({
|
|
2619
|
+
items,
|
|
2620
|
+
activeId,
|
|
2621
|
+
onChange,
|
|
2622
|
+
className = "",
|
|
2623
|
+
buttonClassName = ""
|
|
2624
|
+
}) {
|
|
2625
|
+
const refs = useRef3([]);
|
|
2626
|
+
const [indicator, setIndicator] = useState9({ left: 0, width: 0 });
|
|
2627
|
+
useLayoutEffect2(() => {
|
|
2628
|
+
const activeIndex = items.findIndex((item) => item.id === activeId);
|
|
2629
|
+
const activeNode = refs.current[activeIndex];
|
|
2630
|
+
if (!activeNode) return;
|
|
2631
|
+
setIndicator({
|
|
2632
|
+
left: activeNode.offsetLeft,
|
|
2633
|
+
width: activeNode.offsetWidth
|
|
2634
|
+
});
|
|
2635
|
+
}, [activeId, items]);
|
|
2636
|
+
return /* @__PURE__ */ jsxs43(
|
|
2637
|
+
"div",
|
|
2638
|
+
{
|
|
2639
|
+
className: `relative inline-flex w-fit max-w-full flex-wrap items-center gap-1 rounded-[11px] border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] px-1.5 py-1 ${className}`,
|
|
2640
|
+
children: [
|
|
2641
|
+
/* @__PURE__ */ jsx62(
|
|
2642
|
+
"span",
|
|
2643
|
+
{
|
|
2644
|
+
"aria-hidden": "true",
|
|
2645
|
+
className: "pointer-events-none absolute bottom-1 top-1 rounded-[8px] border border-[color:color-mix(in_srgb,var(--tapiz-accent)_50%,transparent)] bg-[color:color-mix(in_srgb,var(--tapiz-accent)_12%,transparent)] shadow-[0_0_0_1px_color-mix(in_srgb,var(--tapiz-accent)_8%,transparent)] transition-[left,width] duration-300 ease-out",
|
|
2646
|
+
style: { left: indicator.left, width: indicator.width }
|
|
2647
|
+
}
|
|
2648
|
+
),
|
|
2649
|
+
items.map((item, index) => {
|
|
2650
|
+
const active = item.id === activeId;
|
|
2651
|
+
return /* @__PURE__ */ jsxs43(
|
|
2652
|
+
"button",
|
|
2653
|
+
{
|
|
2654
|
+
ref: (node) => {
|
|
2655
|
+
refs.current[index] = node;
|
|
2656
|
+
},
|
|
2657
|
+
type: "button",
|
|
2658
|
+
onClick: () => onChange(item.id),
|
|
2659
|
+
className: `group relative z-10 inline-flex items-center gap-2 rounded-[8px] border px-4 py-1 text-sm font-medium transition-[color,border-color,background-color,box-shadow] duration-200 ease-out ${active ? "border-transparent bg-transparent text-[var(--tapiz-accent)]" : "border-transparent text-[var(--tapiz-text-muted)] hover:border-[var(--tapiz-border-subtle)] hover:bg-[var(--tapiz-bg-surface)] hover:text-[var(--tapiz-text-primary)]"} ${buttonClassName}`,
|
|
2660
|
+
children: [
|
|
2661
|
+
item.icon ? /* @__PURE__ */ jsx62(
|
|
2662
|
+
"span",
|
|
2663
|
+
{
|
|
2664
|
+
className: active ? "text-[var(--tapiz-accent)]" : "text-[var(--tapiz-text-subtle)] transition-colors duration-200 group-hover:text-[var(--tapiz-text-primary)]",
|
|
2665
|
+
children: item.icon
|
|
2666
|
+
}
|
|
2667
|
+
) : null,
|
|
2668
|
+
/* @__PURE__ */ jsx62("span", { className: "flex items-center gap-2.5", children: item.label }),
|
|
2669
|
+
item.badge ? /* @__PURE__ */ jsx62(
|
|
2670
|
+
"span",
|
|
2671
|
+
{
|
|
2672
|
+
className: `inline-flex min-w-7 items-center justify-center rounded-[6px] border px-1.5 py-[2px] text-xs font-semibold tabular-nums ${active ? "border-[color:color-mix(in_srgb,var(--tapiz-accent)_30%,transparent)] bg-[color:color-mix(in_srgb,var(--tapiz-accent)_14%,transparent)] text-[var(--tapiz-accent)]" : "border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-muted)]"}`,
|
|
2673
|
+
children: item.badge
|
|
2674
|
+
}
|
|
2675
|
+
) : null
|
|
2676
|
+
]
|
|
2677
|
+
},
|
|
2678
|
+
item.id
|
|
2679
|
+
);
|
|
2680
|
+
})
|
|
2681
|
+
]
|
|
2682
|
+
}
|
|
2683
|
+
);
|
|
2684
|
+
}
|
|
2685
|
+
|
|
2572
2686
|
// src/components/disclosure/Accordion.tsx
|
|
2573
|
-
import { jsx as
|
|
2687
|
+
import { jsx as jsx63, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
2574
2688
|
function Accordion({ items, openIds = [], onToggle, className = "" }) {
|
|
2575
|
-
return /* @__PURE__ */
|
|
2689
|
+
return /* @__PURE__ */ jsx63("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) => {
|
|
2576
2690
|
const open = openIds.includes(item.id);
|
|
2577
|
-
return /* @__PURE__ */
|
|
2578
|
-
/* @__PURE__ */
|
|
2691
|
+
return /* @__PURE__ */ jsxs44("section", { children: [
|
|
2692
|
+
/* @__PURE__ */ jsxs44(
|
|
2579
2693
|
"button",
|
|
2580
2694
|
{
|
|
2581
2695
|
type: "button",
|
|
@@ -2584,21 +2698,21 @@ function Accordion({ items, openIds = [], onToggle, className = "" }) {
|
|
|
2584
2698
|
onClick: () => onToggle?.(item.id),
|
|
2585
2699
|
className: "flex w-full items-center justify-between gap-4 px-4 py-3 text-left disabled:opacity-40",
|
|
2586
2700
|
children: [
|
|
2587
|
-
/* @__PURE__ */
|
|
2588
|
-
/* @__PURE__ */
|
|
2701
|
+
/* @__PURE__ */ jsx63("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
2702
|
+
/* @__PURE__ */ jsxs44("span", { className: "flex items-center gap-3 text-[var(--tapiz-text-muted)]", children: [
|
|
2589
2703
|
item.meta,
|
|
2590
|
-
/* @__PURE__ */
|
|
2704
|
+
/* @__PURE__ */ jsx63("span", { "aria-hidden": "true", className: "font-mono text-lg", children: open ? "\u2212" : "+" })
|
|
2591
2705
|
] })
|
|
2592
2706
|
]
|
|
2593
2707
|
}
|
|
2594
2708
|
),
|
|
2595
|
-
open ? /* @__PURE__ */
|
|
2709
|
+
open ? /* @__PURE__ */ jsx63("div", { className: "border-t border-[var(--tapiz-border-subtle)] px-4 py-4 text-sm text-[var(--tapiz-text-secondary)]", children: item.content }) : null
|
|
2596
2710
|
] }, item.id);
|
|
2597
2711
|
}) });
|
|
2598
2712
|
}
|
|
2599
2713
|
|
|
2600
2714
|
// src/components/disclosure/Stepper.tsx
|
|
2601
|
-
import { jsx as
|
|
2715
|
+
import { jsx as jsx64, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
2602
2716
|
var tone = {
|
|
2603
2717
|
complete: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
|
|
2604
2718
|
current: "border-[var(--tapiz-accent)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-accent)]",
|
|
@@ -2606,65 +2720,65 @@ var tone = {
|
|
|
2606
2720
|
error: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]"
|
|
2607
2721
|
};
|
|
2608
2722
|
function Stepper({ steps, orientation = "horizontal", className = "" }) {
|
|
2609
|
-
return /* @__PURE__ */
|
|
2723
|
+
return /* @__PURE__ */ jsx64("ol", { className: `grid gap-3 ${orientation === "horizontal" ? "md:grid-cols-[repeat(auto-fit,minmax(0,1fr))]" : ""} ${className}`, children: steps.map((step, index) => {
|
|
2610
2724
|
const status = step.status ?? "upcoming";
|
|
2611
|
-
return /* @__PURE__ */
|
|
2612
|
-
/* @__PURE__ */
|
|
2613
|
-
/* @__PURE__ */
|
|
2614
|
-
/* @__PURE__ */
|
|
2615
|
-
step.description ? /* @__PURE__ */
|
|
2725
|
+
return /* @__PURE__ */ jsxs45("li", { className: "flex gap-3", children: [
|
|
2726
|
+
/* @__PURE__ */ jsx64("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 }),
|
|
2727
|
+
/* @__PURE__ */ jsxs45("span", { className: "min-w-0", children: [
|
|
2728
|
+
/* @__PURE__ */ jsx64("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: step.label }),
|
|
2729
|
+
step.description ? /* @__PURE__ */ jsx64("span", { className: "mt-1 block text-xs text-[var(--tapiz-text-muted)]", children: step.description }) : null
|
|
2616
2730
|
] })
|
|
2617
2731
|
] }, step.id);
|
|
2618
2732
|
}) });
|
|
2619
2733
|
}
|
|
2620
2734
|
|
|
2621
2735
|
// src/components/overlays/Drawer.tsx
|
|
2622
|
-
import { jsx as
|
|
2736
|
+
import { jsx as jsx65, jsxs as jsxs46 } from "react/jsx-runtime";
|
|
2623
2737
|
function Drawer({ open, onClose, title, description, children, footer, side = "right", className = "" }) {
|
|
2624
2738
|
if (!open) return null;
|
|
2625
|
-
return /* @__PURE__ */
|
|
2626
|
-
/* @__PURE__ */
|
|
2627
|
-
/* @__PURE__ */
|
|
2628
|
-
/* @__PURE__ */
|
|
2629
|
-
/* @__PURE__ */
|
|
2630
|
-
title ? /* @__PURE__ */
|
|
2631
|
-
description ? /* @__PURE__ */
|
|
2739
|
+
return /* @__PURE__ */ jsxs46("div", { className: "fixed inset-0 z-50", children: [
|
|
2740
|
+
/* @__PURE__ */ jsx65("button", { type: "button", "aria-label": "Close drawer", className: "absolute inset-0 bg-(--tapiz-bg-overlay)", onClick: onClose }),
|
|
2741
|
+
/* @__PURE__ */ jsxs46("section", { className: `absolute top-0 h-full w-full max-w-md border-(--tapiz-border-strong) bg-(--tapiz-bg-surface) shadow-(--tapiz-shadow-lg) ${side === "right" ? "right-0 border-l" : "left-0 border-r"} ${className}`, children: [
|
|
2742
|
+
/* @__PURE__ */ jsxs46("header", { className: "flex items-start justify-between gap-4 border-b border-(--tapiz-border-subtle) p-5", children: [
|
|
2743
|
+
/* @__PURE__ */ jsxs46("div", { children: [
|
|
2744
|
+
title ? /* @__PURE__ */ jsx65("h2", { className: "text-lg font-semibold text-(--tapiz-text-primary)", children: title }) : null,
|
|
2745
|
+
description ? /* @__PURE__ */ jsx65("p", { className: "mt-1 text-sm text-(--tapiz-text-muted)", children: description }) : null
|
|
2632
2746
|
] }),
|
|
2633
|
-
/* @__PURE__ */
|
|
2747
|
+
/* @__PURE__ */ jsx65("button", { type: "button", onClick: onClose, className: "border border-(--tapiz-border-subtle) px-2 py-1 font-mono text-sm text-(--tapiz-text-muted) hover:text-(--tapiz-text-primary)", children: "\xD7" })
|
|
2634
2748
|
] }),
|
|
2635
|
-
/* @__PURE__ */
|
|
2636
|
-
footer ? /* @__PURE__ */
|
|
2749
|
+
/* @__PURE__ */ jsx65("div", { className: "max-h-[calc(100vh-9rem)] overflow-auto p-5", children }),
|
|
2750
|
+
footer ? /* @__PURE__ */ jsx65("footer", { className: "border-t border-(--tapiz-border-subtle) p-4", children: footer }) : null
|
|
2637
2751
|
] })
|
|
2638
2752
|
] });
|
|
2639
2753
|
}
|
|
2640
2754
|
|
|
2641
2755
|
// src/components/overlays/Popover.tsx
|
|
2642
|
-
import { jsx as
|
|
2756
|
+
import { jsx as jsx66, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
2643
2757
|
function Popover({ trigger, children, open = false, align = "start", className = "" }) {
|
|
2644
|
-
return /* @__PURE__ */
|
|
2758
|
+
return /* @__PURE__ */ jsxs47("div", { className: `relative inline-block ${className}`, children: [
|
|
2645
2759
|
trigger,
|
|
2646
|
-
open ? /* @__PURE__ */
|
|
2760
|
+
open ? /* @__PURE__ */ jsx66("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
|
|
2647
2761
|
] });
|
|
2648
2762
|
}
|
|
2649
2763
|
|
|
2650
2764
|
// src/components/overlays/CommandMenu.tsx
|
|
2651
|
-
import { jsx as
|
|
2765
|
+
import { jsx as jsx67, jsxs as jsxs48 } from "react/jsx-runtime";
|
|
2652
2766
|
function CommandMenu({ open, onClose, query = "", onQueryChange, groups, placeholder = "Search commands\u2026", empty = "No commands found." }) {
|
|
2653
2767
|
if (!open) return null;
|
|
2654
2768
|
const hasItems = groups.some((group) => group.items.length > 0);
|
|
2655
|
-
return /* @__PURE__ */
|
|
2656
|
-
/* @__PURE__ */
|
|
2657
|
-
/* @__PURE__ */
|
|
2658
|
-
!hasItems ? /* @__PURE__ */
|
|
2659
|
-
groups.map((group, groupIndex) => /* @__PURE__ */
|
|
2660
|
-
group.label ? /* @__PURE__ */
|
|
2661
|
-
group.items.map((item) => /* @__PURE__ */
|
|
2662
|
-
item.icon ? /* @__PURE__ */
|
|
2663
|
-
/* @__PURE__ */
|
|
2664
|
-
/* @__PURE__ */
|
|
2665
|
-
item.description ? /* @__PURE__ */
|
|
2769
|
+
return /* @__PURE__ */ jsx67("div", { className: "fixed inset-0 z-50 grid place-items-start bg-[var(--tapiz-bg-overlay)] px-4 pt-[12vh]", onClick: onClose, children: /* @__PURE__ */ jsxs48("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: [
|
|
2770
|
+
/* @__PURE__ */ jsx67("div", { className: "border-b border-[var(--tapiz-border-subtle)] p-3", children: /* @__PURE__ */ jsx67(SearchInput, { value: query, onChange: (value) => onQueryChange?.(value), placeholder, autoFocus: true }) }),
|
|
2771
|
+
/* @__PURE__ */ jsxs48("div", { className: "max-h-[50vh] overflow-auto p-2", children: [
|
|
2772
|
+
!hasItems ? /* @__PURE__ */ jsx67("div", { className: "p-6 text-center text-sm text-[var(--tapiz-text-muted)]", children: empty }) : null,
|
|
2773
|
+
groups.map((group, groupIndex) => /* @__PURE__ */ jsxs48("div", { className: "py-2", children: [
|
|
2774
|
+
group.label ? /* @__PURE__ */ jsx67("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,
|
|
2775
|
+
group.items.map((item) => /* @__PURE__ */ jsxs48("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: [
|
|
2776
|
+
item.icon ? /* @__PURE__ */ jsx67("span", { className: "grid size-8 place-items-center border border-[var(--tapiz-border-subtle)] text-[var(--tapiz-text-muted)]", children: item.icon }) : null,
|
|
2777
|
+
/* @__PURE__ */ jsxs48("span", { className: "min-w-0 flex-1", children: [
|
|
2778
|
+
/* @__PURE__ */ jsx67("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.label }),
|
|
2779
|
+
item.description ? /* @__PURE__ */ jsx67("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: item.description }) : null
|
|
2666
2780
|
] }),
|
|
2667
|
-
item.shortcut ? /* @__PURE__ */
|
|
2781
|
+
item.shortcut ? /* @__PURE__ */ jsx67("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.shortcut }) : null
|
|
2668
2782
|
] }, item.id))
|
|
2669
2783
|
] }, groupIndex))
|
|
2670
2784
|
] })
|
|
@@ -2672,23 +2786,23 @@ function CommandMenu({ open, onClose, query = "", onQueryChange, groups, placeho
|
|
|
2672
2786
|
}
|
|
2673
2787
|
|
|
2674
2788
|
// src/components/forms/FormField.tsx
|
|
2675
|
-
import { jsx as
|
|
2789
|
+
import { jsx as jsx68, jsxs as jsxs49 } from "react/jsx-runtime";
|
|
2676
2790
|
function FormField({ label, hint, error, required, htmlFor, children, className = "" }) {
|
|
2677
|
-
return /* @__PURE__ */
|
|
2678
|
-
label ? /* @__PURE__ */
|
|
2791
|
+
return /* @__PURE__ */ jsxs49("div", { className: `space-y-1.5 ${className}`, children: [
|
|
2792
|
+
label ? /* @__PURE__ */ jsxs49(FieldLabel, { htmlFor, children: [
|
|
2679
2793
|
label,
|
|
2680
2794
|
required ? " *" : ""
|
|
2681
2795
|
] }) : null,
|
|
2682
2796
|
children,
|
|
2683
|
-
error ? /* @__PURE__ */
|
|
2797
|
+
error ? /* @__PURE__ */ jsx68(FormError, { message: String(error) }) : hint ? /* @__PURE__ */ jsx68(FieldHint, { children: hint }) : null
|
|
2684
2798
|
] });
|
|
2685
2799
|
}
|
|
2686
2800
|
|
|
2687
2801
|
// src/components/forms/Switch.tsx
|
|
2688
|
-
import { jsx as
|
|
2802
|
+
import { jsx as jsx69, jsxs as jsxs50 } from "react/jsx-runtime";
|
|
2689
2803
|
function Switch({ checked = false, onChange, disabled, label, description, className = "" }) {
|
|
2690
|
-
return /* @__PURE__ */
|
|
2691
|
-
/* @__PURE__ */
|
|
2804
|
+
return /* @__PURE__ */ jsxs50("label", { className: `flex cursor-pointer items-start gap-3 ${disabled ? "cursor-not-allowed opacity-50" : ""} ${className}`, children: [
|
|
2805
|
+
/* @__PURE__ */ jsx69(
|
|
2692
2806
|
"button",
|
|
2693
2807
|
{
|
|
2694
2808
|
type: "button",
|
|
@@ -2697,22 +2811,22 @@ function Switch({ checked = false, onChange, disabled, label, description, class
|
|
|
2697
2811
|
disabled,
|
|
2698
2812
|
onClick: () => onChange?.(!checked),
|
|
2699
2813
|
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)]"}`,
|
|
2700
|
-
children: /* @__PURE__ */
|
|
2814
|
+
children: /* @__PURE__ */ jsx69("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"}` })
|
|
2701
2815
|
}
|
|
2702
2816
|
),
|
|
2703
|
-
label || description ? /* @__PURE__ */
|
|
2704
|
-
label ? /* @__PURE__ */
|
|
2705
|
-
description ? /* @__PURE__ */
|
|
2817
|
+
label || description ? /* @__PURE__ */ jsxs50("span", { children: [
|
|
2818
|
+
label ? /* @__PURE__ */ jsx69("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: label }) : null,
|
|
2819
|
+
description ? /* @__PURE__ */ jsx69("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
2706
2820
|
] }) : null
|
|
2707
2821
|
] });
|
|
2708
2822
|
}
|
|
2709
2823
|
|
|
2710
2824
|
// src/components/forms/ToggleGroup.tsx
|
|
2711
|
-
import { jsx as
|
|
2825
|
+
import { jsx as jsx70 } from "react/jsx-runtime";
|
|
2712
2826
|
function ToggleGroup({ options, value, onChange, className = "", fullWidth = false }) {
|
|
2713
|
-
return /* @__PURE__ */
|
|
2827
|
+
return /* @__PURE__ */ jsx70("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) => {
|
|
2714
2828
|
const selected = option.value === value;
|
|
2715
|
-
return /* @__PURE__ */
|
|
2829
|
+
return /* @__PURE__ */ jsx70(
|
|
2716
2830
|
"button",
|
|
2717
2831
|
{
|
|
2718
2832
|
type: "button",
|
|
@@ -2727,17 +2841,17 @@ function ToggleGroup({ options, value, onChange, className = "", fullWidth = fal
|
|
|
2727
2841
|
}
|
|
2728
2842
|
|
|
2729
2843
|
// src/components/forms/InputGroup.tsx
|
|
2730
|
-
import { jsx as
|
|
2844
|
+
import { jsx as jsx71, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
2731
2845
|
function InputGroup({ prefix, suffix, children, className = "" }) {
|
|
2732
|
-
return /* @__PURE__ */
|
|
2733
|
-
prefix ? /* @__PURE__ */
|
|
2734
|
-
/* @__PURE__ */
|
|
2735
|
-
suffix ? /* @__PURE__ */
|
|
2846
|
+
return /* @__PURE__ */ jsxs51("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: [
|
|
2847
|
+
prefix ? /* @__PURE__ */ jsx71("div", { className: "flex items-center border-r border-[var(--tapiz-border-subtle)] px-3 text-sm text-[var(--tapiz-text-muted)]", children: prefix }) : null,
|
|
2848
|
+
/* @__PURE__ */ jsx71("div", { className: "min-w-0 flex-1 [&_input]:border-0 [&_input]:shadow-none [&_input]:focus:shadow-none", children }),
|
|
2849
|
+
suffix ? /* @__PURE__ */ jsx71("div", { className: "flex items-center border-l border-[var(--tapiz-border-subtle)] px-3 text-sm text-[var(--tapiz-text-muted)]", children: suffix }) : null
|
|
2736
2850
|
] });
|
|
2737
2851
|
}
|
|
2738
2852
|
|
|
2739
2853
|
// src/components/feedback/Alert.tsx
|
|
2740
|
-
import { jsx as
|
|
2854
|
+
import { jsx as jsx72, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
2741
2855
|
var toneClasses = {
|
|
2742
2856
|
info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)] text-[var(--tapiz-info)]",
|
|
2743
2857
|
success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)] text-[var(--tapiz-success)]",
|
|
@@ -2746,18 +2860,18 @@ var toneClasses = {
|
|
|
2746
2860
|
neutral: "border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-secondary)]"
|
|
2747
2861
|
};
|
|
2748
2862
|
function Alert2({ tone: tone2 = "info", title, children, icon, actions, className = "" }) {
|
|
2749
|
-
return /* @__PURE__ */
|
|
2750
|
-
icon ? /* @__PURE__ */
|
|
2751
|
-
/* @__PURE__ */
|
|
2752
|
-
title ? /* @__PURE__ */
|
|
2753
|
-
children ? /* @__PURE__ */
|
|
2863
|
+
return /* @__PURE__ */ jsxs52("div", { className: `flex gap-3 border p-4 ${toneClasses[tone2]} ${className}`, children: [
|
|
2864
|
+
icon ? /* @__PURE__ */ jsx72("div", { className: "mt-0.5 shrink-0", children: icon }) : null,
|
|
2865
|
+
/* @__PURE__ */ jsxs52("div", { className: "min-w-0 flex-1", children: [
|
|
2866
|
+
title ? /* @__PURE__ */ jsx72("div", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
|
|
2867
|
+
children ? /* @__PURE__ */ jsx72("div", { className: "mt-1 text-sm text-[var(--tapiz-text-secondary)]", children }) : null
|
|
2754
2868
|
] }),
|
|
2755
|
-
actions ? /* @__PURE__ */
|
|
2869
|
+
actions ? /* @__PURE__ */ jsx72("div", { className: "shrink-0", children: actions }) : null
|
|
2756
2870
|
] });
|
|
2757
2871
|
}
|
|
2758
2872
|
|
|
2759
2873
|
// src/components/feedback/Progress.tsx
|
|
2760
|
-
import { jsx as
|
|
2874
|
+
import { jsx as jsx73, jsxs as jsxs53 } from "react/jsx-runtime";
|
|
2761
2875
|
var tones = {
|
|
2762
2876
|
accent: "bg-[var(--tapiz-accent)]",
|
|
2763
2877
|
success: "bg-[var(--tapiz-success)]",
|
|
@@ -2766,34 +2880,34 @@ var tones = {
|
|
|
2766
2880
|
};
|
|
2767
2881
|
function Progress({ value, max = 100, label, showValue = false, tone: tone2 = "accent", className = "" }) {
|
|
2768
2882
|
const percentage = Math.max(0, Math.min(100, value / max * 100));
|
|
2769
|
-
return /* @__PURE__ */
|
|
2770
|
-
label || showValue ? /* @__PURE__ */
|
|
2771
|
-
label ? /* @__PURE__ */
|
|
2772
|
-
showValue ? /* @__PURE__ */
|
|
2883
|
+
return /* @__PURE__ */ jsxs53("div", { className, children: [
|
|
2884
|
+
label || showValue ? /* @__PURE__ */ jsxs53("div", { className: "mb-1 flex items-center justify-between gap-3 text-xs text-[var(--tapiz-text-muted)]", children: [
|
|
2885
|
+
label ? /* @__PURE__ */ jsx73("span", { children: label }) : /* @__PURE__ */ jsx73("span", {}),
|
|
2886
|
+
showValue ? /* @__PURE__ */ jsxs53("span", { className: "font-mono", children: [
|
|
2773
2887
|
Math.round(percentage),
|
|
2774
2888
|
"%"
|
|
2775
2889
|
] }) : null
|
|
2776
2890
|
] }) : null,
|
|
2777
|
-
/* @__PURE__ */
|
|
2891
|
+
/* @__PURE__ */ jsx73("div", { className: "h-2 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx73("div", { className: `h-full ${tones[tone2]}`, style: { width: `${percentage}%` } }) })
|
|
2778
2892
|
] });
|
|
2779
2893
|
}
|
|
2780
2894
|
|
|
2781
2895
|
// src/components/shared/Avatar.tsx
|
|
2782
|
-
import { jsx as
|
|
2896
|
+
import { jsx as jsx74 } from "react/jsx-runtime";
|
|
2783
2897
|
var sizes = { xs: "size-6 text-[10px]", sm: "size-8 text-xs", md: "size-10 text-sm", lg: "size-14 text-base" };
|
|
2784
2898
|
function Avatar({ src, name = "?", size = "md", className = "" }) {
|
|
2785
2899
|
const initials = name.split(" ").filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase()).join("") || "?";
|
|
2786
|
-
return src ? /* @__PURE__ */
|
|
2900
|
+
return src ? /* @__PURE__ */ jsx74("img", { src, alt: name, className: `border border-[var(--tapiz-border-strong)] object-cover ${sizes[size]} ${className}` }) : /* @__PURE__ */ jsx74("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 });
|
|
2787
2901
|
}
|
|
2788
2902
|
|
|
2789
2903
|
// src/components/shared/Kbd.tsx
|
|
2790
|
-
import { jsx as
|
|
2904
|
+
import { jsx as jsx75 } from "react/jsx-runtime";
|
|
2791
2905
|
function Kbd({ children, className = "" }) {
|
|
2792
|
-
return /* @__PURE__ */
|
|
2906
|
+
return /* @__PURE__ */ jsx75("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 });
|
|
2793
2907
|
}
|
|
2794
2908
|
|
|
2795
2909
|
// src/components/shared/Timeline.tsx
|
|
2796
|
-
import { jsx as
|
|
2910
|
+
import { jsx as jsx76, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
2797
2911
|
var tones2 = {
|
|
2798
2912
|
neutral: "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-muted)]",
|
|
2799
2913
|
info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)] text-[var(--tapiz-info)]",
|
|
@@ -2802,94 +2916,94 @@ var tones2 = {
|
|
|
2802
2916
|
danger: "border-[var(--tapiz-danger)] bg-[var(--tapiz-danger-soft)] text-[var(--tapiz-danger)]"
|
|
2803
2917
|
};
|
|
2804
2918
|
function Timeline({ items, className = "" }) {
|
|
2805
|
-
return /* @__PURE__ */
|
|
2806
|
-
/* @__PURE__ */
|
|
2807
|
-
/* @__PURE__ */
|
|
2808
|
-
/* @__PURE__ */
|
|
2809
|
-
/* @__PURE__ */
|
|
2810
|
-
item.time ? /* @__PURE__ */
|
|
2919
|
+
return /* @__PURE__ */ jsx76("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__ */ jsxs54("li", { className: "relative flex gap-3", children: [
|
|
2920
|
+
/* @__PURE__ */ jsx76("span", { className: `z-10 grid size-8 shrink-0 place-items-center border text-xs ${tones2[item.tone ?? "neutral"]}`, children: item.icon ?? "\u2022" }),
|
|
2921
|
+
/* @__PURE__ */ jsxs54("span", { className: "min-w-0 flex-1 pb-2", children: [
|
|
2922
|
+
/* @__PURE__ */ jsxs54("span", { className: "flex flex-wrap items-baseline justify-between gap-2", children: [
|
|
2923
|
+
/* @__PURE__ */ jsx76("span", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
2924
|
+
item.time ? /* @__PURE__ */ jsx76("span", { className: "font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: item.time }) : null
|
|
2811
2925
|
] }),
|
|
2812
|
-
item.description ? /* @__PURE__ */
|
|
2926
|
+
item.description ? /* @__PURE__ */ jsx76("span", { className: "mt-1 block text-sm text-[var(--tapiz-text-secondary)]", children: item.description }) : null
|
|
2813
2927
|
] })
|
|
2814
2928
|
] }, item.id)) });
|
|
2815
2929
|
}
|
|
2816
2930
|
|
|
2817
2931
|
// src/components/shared/KeyValueList.tsx
|
|
2818
|
-
import { jsx as
|
|
2932
|
+
import { jsx as jsx77, jsxs as jsxs55 } from "react/jsx-runtime";
|
|
2819
2933
|
function KeyValueList({ items, className = "", density = "normal" }) {
|
|
2820
|
-
return /* @__PURE__ */
|
|
2821
|
-
/* @__PURE__ */
|
|
2822
|
-
/* @__PURE__ */
|
|
2823
|
-
/* @__PURE__ */
|
|
2824
|
-
item.description ? /* @__PURE__ */
|
|
2934
|
+
return /* @__PURE__ */ jsx77("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__ */ jsxs55("div", { className: `grid gap-2 ${density === "compact" ? "p-3 md:grid-cols-[160px_1fr]" : "p-4 md:grid-cols-[220px_1fr]"}`, children: [
|
|
2935
|
+
/* @__PURE__ */ jsx77("dt", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: item.keyLabel }),
|
|
2936
|
+
/* @__PURE__ */ jsxs55("dd", { children: [
|
|
2937
|
+
/* @__PURE__ */ jsx77("div", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.value }),
|
|
2938
|
+
item.description ? /* @__PURE__ */ jsx77("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.description }) : null
|
|
2825
2939
|
] })
|
|
2826
2940
|
] }, index)) });
|
|
2827
2941
|
}
|
|
2828
2942
|
|
|
2829
2943
|
// src/components/shared/CodeBlock.tsx
|
|
2830
|
-
import { jsx as
|
|
2944
|
+
import { jsx as jsx78, jsxs as jsxs56 } from "react/jsx-runtime";
|
|
2831
2945
|
function CodeBlock({ children, language, title, actions, className = "" }) {
|
|
2832
|
-
return /* @__PURE__ */
|
|
2833
|
-
title || language || actions ? /* @__PURE__ */
|
|
2834
|
-
/* @__PURE__ */
|
|
2946
|
+
return /* @__PURE__ */ jsxs56("figure", { className: `overflow-hidden border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
|
|
2947
|
+
title || language || actions ? /* @__PURE__ */ jsxs56("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: [
|
|
2948
|
+
/* @__PURE__ */ jsx78("span", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: title ?? language }),
|
|
2835
2949
|
actions
|
|
2836
2950
|
] }) : null,
|
|
2837
|
-
/* @__PURE__ */
|
|
2951
|
+
/* @__PURE__ */ jsx78("pre", { className: "overflow-auto p-4 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children: /* @__PURE__ */ jsx78("code", { children }) })
|
|
2838
2952
|
] });
|
|
2839
2953
|
}
|
|
2840
2954
|
|
|
2841
2955
|
// src/components/marketing/LogoCloud.tsx
|
|
2842
|
-
import { jsx as
|
|
2956
|
+
import { jsx as jsx79, jsxs as jsxs57 } from "react/jsx-runtime";
|
|
2843
2957
|
function LogoCloud({ title, items, className = "" }) {
|
|
2844
|
-
return /* @__PURE__ */
|
|
2845
|
-
title ? /* @__PURE__ */
|
|
2846
|
-
/* @__PURE__ */
|
|
2958
|
+
return /* @__PURE__ */ jsx79("section", { className: `border-y border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] py-8 ${className}`, children: /* @__PURE__ */ jsxs57("div", { className: "mx-auto max-w-7xl px-[var(--tapiz-space-page-x)]", children: [
|
|
2959
|
+
title ? /* @__PURE__ */ jsx79("p", { className: "mb-6 text-center font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: title }) : null,
|
|
2960
|
+
/* @__PURE__ */ jsx79("div", { className: "grid grid-cols-2 gap-3 md:grid-cols-4 lg:grid-cols-6", children: items.map((item) => /* @__PURE__ */ jsx79("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)) })
|
|
2847
2961
|
] }) });
|
|
2848
2962
|
}
|
|
2849
2963
|
|
|
2850
2964
|
// src/components/marketing/TestimonialCard.tsx
|
|
2851
|
-
import { jsx as
|
|
2965
|
+
import { jsx as jsx80, jsxs as jsxs58 } from "react/jsx-runtime";
|
|
2852
2966
|
function TestimonialCard({ quote, author, role, avatarSrc, className = "", variant = "surface" }) {
|
|
2853
|
-
return /* @__PURE__ */
|
|
2854
|
-
/* @__PURE__ */
|
|
2967
|
+
return /* @__PURE__ */ jsxs58("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: [
|
|
2968
|
+
/* @__PURE__ */ jsxs58("blockquote", { className: "text-base leading-7 text-[var(--tapiz-text-secondary)]", children: [
|
|
2855
2969
|
"\u201C",
|
|
2856
2970
|
quote,
|
|
2857
2971
|
"\u201D"
|
|
2858
2972
|
] }),
|
|
2859
|
-
/* @__PURE__ */
|
|
2860
|
-
/* @__PURE__ */
|
|
2861
|
-
/* @__PURE__ */
|
|
2862
|
-
/* @__PURE__ */
|
|
2863
|
-
role ? /* @__PURE__ */
|
|
2973
|
+
/* @__PURE__ */ jsxs58("figcaption", { className: "mt-5 flex items-center gap-3", children: [
|
|
2974
|
+
/* @__PURE__ */ jsx80(Avatar, { name: author, src: avatarSrc, size: "sm" }),
|
|
2975
|
+
/* @__PURE__ */ jsxs58("span", { children: [
|
|
2976
|
+
/* @__PURE__ */ jsx80("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: author }),
|
|
2977
|
+
role ? /* @__PURE__ */ jsx80("span", { className: "block text-xs text-[var(--tapiz-text-muted)]", children: role }) : null
|
|
2864
2978
|
] })
|
|
2865
2979
|
] })
|
|
2866
2980
|
] });
|
|
2867
2981
|
}
|
|
2868
2982
|
|
|
2869
2983
|
// src/components/marketing/PricingCard.tsx
|
|
2870
|
-
import { jsx as
|
|
2984
|
+
import { jsx as jsx81, jsxs as jsxs59 } from "react/jsx-runtime";
|
|
2871
2985
|
function PricingCard({ name, price, description, features = [], cta, highlighted = false, className = "" }) {
|
|
2872
|
-
return /* @__PURE__ */
|
|
2873
|
-
/* @__PURE__ */
|
|
2874
|
-
/* @__PURE__ */
|
|
2875
|
-
description ? /* @__PURE__ */
|
|
2876
|
-
/* @__PURE__ */
|
|
2877
|
-
/* @__PURE__ */
|
|
2878
|
-
/* @__PURE__ */
|
|
2879
|
-
/* @__PURE__ */
|
|
2986
|
+
return /* @__PURE__ */ jsxs59("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: [
|
|
2987
|
+
/* @__PURE__ */ jsxs59("div", { className: "flex-1", children: [
|
|
2988
|
+
/* @__PURE__ */ jsx81("h3", { className: "text-lg font-semibold text-[var(--tapiz-text-primary)]", children: name }),
|
|
2989
|
+
description ? /* @__PURE__ */ jsx81("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null,
|
|
2990
|
+
/* @__PURE__ */ jsx81("div", { className: "mt-6 text-4xl font-semibold tracking-tight text-[var(--tapiz-text-primary)]", children: price }),
|
|
2991
|
+
/* @__PURE__ */ jsx81("ul", { className: "mt-6 space-y-3 text-sm text-[var(--tapiz-text-secondary)]", children: features.map((feature, index) => /* @__PURE__ */ jsxs59("li", { className: "flex gap-2", children: [
|
|
2992
|
+
/* @__PURE__ */ jsx81("span", { className: "text-[var(--tapiz-success)]", children: "\u2713" }),
|
|
2993
|
+
/* @__PURE__ */ jsx81("span", { children: feature })
|
|
2880
2994
|
] }, index)) })
|
|
2881
2995
|
] }),
|
|
2882
|
-
/* @__PURE__ */
|
|
2996
|
+
/* @__PURE__ */ jsx81("div", { className: "mt-6", children: cta ?? /* @__PURE__ */ jsx81(Button, { variant: highlighted ? "primary" : "secondary", fullWidth: true, children: "Get started" }) })
|
|
2883
2997
|
] });
|
|
2884
2998
|
}
|
|
2885
2999
|
|
|
2886
3000
|
// src/components/marketing/StatsBand.tsx
|
|
2887
|
-
import { jsx as
|
|
3001
|
+
import { jsx as jsx82, jsxs as jsxs60 } from "react/jsx-runtime";
|
|
2888
3002
|
function StatsBand({ items, className = "" }) {
|
|
2889
|
-
return /* @__PURE__ */
|
|
2890
|
-
/* @__PURE__ */
|
|
2891
|
-
/* @__PURE__ */
|
|
2892
|
-
item.description ? /* @__PURE__ */
|
|
3003
|
+
return /* @__PURE__ */ jsx82("section", { className: `border-y border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-inverse)] text-[var(--tapiz-text-inverse)] ${className}`, children: /* @__PURE__ */ jsx82("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__ */ jsxs60("div", { className: "p-6 md:p-8", children: [
|
|
3004
|
+
/* @__PURE__ */ jsx82("div", { className: "text-3xl font-semibold tracking-tight", children: item.value }),
|
|
3005
|
+
/* @__PURE__ */ jsx82("div", { className: "mt-2 font-mono text-[10px] font-bold uppercase tracking-[0.18em] opacity-70", children: item.label }),
|
|
3006
|
+
item.description ? /* @__PURE__ */ jsx82("div", { className: "mt-3 text-sm opacity-70", children: item.description }) : null
|
|
2893
3007
|
] }, index)) }) });
|
|
2894
3008
|
}
|
|
2895
3009
|
|
|
@@ -2928,7 +3042,7 @@ var tapizFrameworkPresets = {
|
|
|
2928
3042
|
};
|
|
2929
3043
|
|
|
2930
3044
|
// src/components/layout/Container.tsx
|
|
2931
|
-
import { jsx as
|
|
3045
|
+
import { jsx as jsx83 } from "react/jsx-runtime";
|
|
2932
3046
|
var sizeClasses2 = {
|
|
2933
3047
|
sm: "max-w-3xl",
|
|
2934
3048
|
md: "max-w-5xl",
|
|
@@ -2937,7 +3051,7 @@ var sizeClasses2 = {
|
|
|
2937
3051
|
full: "max-w-none"
|
|
2938
3052
|
};
|
|
2939
3053
|
function Container({ children, size = "lg", padded = true, className = "", style }) {
|
|
2940
|
-
return /* @__PURE__ */
|
|
3054
|
+
return /* @__PURE__ */ jsx83(
|
|
2941
3055
|
"div",
|
|
2942
3056
|
{
|
|
2943
3057
|
className: ["mx-auto w-full", sizeClasses2[size], padded ? "px-[var(--tapiz-space-page-x)]" : "", className].filter(Boolean).join(" "),
|
|
@@ -2948,7 +3062,7 @@ function Container({ children, size = "lg", padded = true, className = "", style
|
|
|
2948
3062
|
}
|
|
2949
3063
|
|
|
2950
3064
|
// src/components/layout/Surface.tsx
|
|
2951
|
-
import { jsx as
|
|
3065
|
+
import { jsx as jsx84 } from "react/jsx-runtime";
|
|
2952
3066
|
var variantClasses5 = {
|
|
2953
3067
|
canvas: "bg-[var(--tapiz-bg-page)] text-[var(--tapiz-text-primary)]",
|
|
2954
3068
|
surface: "bg-[var(--tapiz-bg-surface)] text-[var(--tapiz-text-primary)]",
|
|
@@ -2965,7 +3079,7 @@ var paddingClasses2 = {
|
|
|
2965
3079
|
xl: "p-8"
|
|
2966
3080
|
};
|
|
2967
3081
|
function Surface({ children, variant = "surface", padding = "md", bordered = true, className = "", style }) {
|
|
2968
|
-
return /* @__PURE__ */
|
|
3082
|
+
return /* @__PURE__ */ jsx84(
|
|
2969
3083
|
"section",
|
|
2970
3084
|
{
|
|
2971
3085
|
className: [variantClasses5[variant], paddingClasses2[padding], bordered && variant !== "brutal" ? "border border-[var(--tapiz-border-subtle)]" : "", className].filter(Boolean).join(" "),
|
|
@@ -2976,23 +3090,23 @@ function Surface({ children, variant = "surface", padding = "md", bordered = tru
|
|
|
2976
3090
|
}
|
|
2977
3091
|
|
|
2978
3092
|
// src/components/layout/Divider.tsx
|
|
2979
|
-
import { jsx as
|
|
3093
|
+
import { jsx as jsx85, jsxs as jsxs61 } from "react/jsx-runtime";
|
|
2980
3094
|
function Divider({ orientation = "horizontal", label, className = "" }) {
|
|
2981
3095
|
if (orientation === "vertical") {
|
|
2982
|
-
return /* @__PURE__ */
|
|
3096
|
+
return /* @__PURE__ */ jsx85("div", { className: `mx-2 min-h-6 w-px bg-[var(--tapiz-border-subtle)] ${className}`, "aria-hidden": "true" });
|
|
2983
3097
|
}
|
|
2984
3098
|
if (label) {
|
|
2985
|
-
return /* @__PURE__ */
|
|
2986
|
-
/* @__PURE__ */
|
|
2987
|
-
/* @__PURE__ */
|
|
2988
|
-
/* @__PURE__ */
|
|
3099
|
+
return /* @__PURE__ */ jsxs61("div", { className: `flex items-center gap-3 ${className}`, children: [
|
|
3100
|
+
/* @__PURE__ */ jsx85("div", { className: "h-px flex-1 bg-[var(--tapiz-border-subtle)]" }),
|
|
3101
|
+
/* @__PURE__ */ jsx85("span", { className: "font-mono text-[10px] uppercase tracking-[0.18em] text-[var(--tapiz-text-muted)]", children: label }),
|
|
3102
|
+
/* @__PURE__ */ jsx85("div", { className: "h-px flex-1 bg-[var(--tapiz-border-subtle)]" })
|
|
2989
3103
|
] });
|
|
2990
3104
|
}
|
|
2991
|
-
return /* @__PURE__ */
|
|
3105
|
+
return /* @__PURE__ */ jsx85("hr", { className: `border-[var(--tapiz-border-subtle)] ${className}` });
|
|
2992
3106
|
}
|
|
2993
3107
|
|
|
2994
3108
|
// src/components/layout/ResponsiveGrid.tsx
|
|
2995
|
-
import { jsx as
|
|
3109
|
+
import { jsx as jsx86 } from "react/jsx-runtime";
|
|
2996
3110
|
var gapClasses3 = {
|
|
2997
3111
|
sm: "gap-3",
|
|
2998
3112
|
md: "gap-4",
|
|
@@ -3000,7 +3114,7 @@ var gapClasses3 = {
|
|
|
3000
3114
|
xl: "gap-8"
|
|
3001
3115
|
};
|
|
3002
3116
|
function ResponsiveGrid({ children, min = "18rem", gap = "md", className = "", style }) {
|
|
3003
|
-
return /* @__PURE__ */
|
|
3117
|
+
return /* @__PURE__ */ jsx86(
|
|
3004
3118
|
"div",
|
|
3005
3119
|
{
|
|
3006
3120
|
className: `grid ${gapClasses3[gap]} ${className}`,
|
|
@@ -3011,7 +3125,7 @@ function ResponsiveGrid({ children, min = "18rem", gap = "md", className = "", s
|
|
|
3011
3125
|
}
|
|
3012
3126
|
|
|
3013
3127
|
// src/components/data-display/Sparkline.tsx
|
|
3014
|
-
import { jsx as
|
|
3128
|
+
import { jsx as jsx87, jsxs as jsxs62 } from "react/jsx-runtime";
|
|
3015
3129
|
function Sparkline({ values, width = 160, height = 48, label = "Trend", className = "", style }) {
|
|
3016
3130
|
const safeValues = values.length ? values : [0];
|
|
3017
3131
|
const min = Math.min(...safeValues);
|
|
@@ -3023,40 +3137,40 @@ function Sparkline({ values, width = 160, height = 48, label = "Trend", classNam
|
|
|
3023
3137
|
const y = height - (value - min) / range * (height - 6) - 3;
|
|
3024
3138
|
return `${x},${y}`;
|
|
3025
3139
|
}).join(" ");
|
|
3026
|
-
return /* @__PURE__ */
|
|
3027
|
-
/* @__PURE__ */
|
|
3028
|
-
/* @__PURE__ */
|
|
3140
|
+
return /* @__PURE__ */ jsxs62("svg", { className, style, width, height, viewBox: `0 0 ${width} ${height}`, role: "img", "aria-label": label, children: [
|
|
3141
|
+
/* @__PURE__ */ jsx87("polyline", { points, fill: "none", stroke: "var(--tapiz-accent)", strokeWidth: "2", strokeLinecap: "square", strokeLinejoin: "miter" }),
|
|
3142
|
+
/* @__PURE__ */ jsx87("line", { x1: "0", x2: width, y1: height - 1, y2: height - 1, stroke: "var(--tapiz-border-subtle)", strokeWidth: "1" })
|
|
3029
3143
|
] });
|
|
3030
3144
|
}
|
|
3031
3145
|
|
|
3032
3146
|
// src/components/data-display/BarList.tsx
|
|
3033
|
-
import { jsx as
|
|
3147
|
+
import { jsx as jsx88, jsxs as jsxs63 } from "react/jsx-runtime";
|
|
3034
3148
|
function BarList({ items, max, valueFormatter = (value) => value, className = "" }) {
|
|
3035
3149
|
const computedMax = max ?? Math.max(1, ...items.map((item) => item.value));
|
|
3036
|
-
return /* @__PURE__ */
|
|
3150
|
+
return /* @__PURE__ */ jsx88("div", { className: `space-y-3 ${className}`, children: items.map((item, index) => {
|
|
3037
3151
|
const percent = Math.max(0, Math.min(100, item.value / computedMax * 100));
|
|
3038
|
-
return /* @__PURE__ */
|
|
3039
|
-
/* @__PURE__ */
|
|
3040
|
-
/* @__PURE__ */
|
|
3041
|
-
/* @__PURE__ */
|
|
3152
|
+
return /* @__PURE__ */ jsxs63("div", { children: [
|
|
3153
|
+
/* @__PURE__ */ jsxs63("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
|
|
3154
|
+
/* @__PURE__ */ jsx88("span", { className: "font-medium text-[var(--tapiz-text-secondary)]", children: item.label }),
|
|
3155
|
+
/* @__PURE__ */ jsx88("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: valueFormatter(item.value) })
|
|
3042
3156
|
] }),
|
|
3043
|
-
/* @__PURE__ */
|
|
3044
|
-
item.detail ? /* @__PURE__ */
|
|
3157
|
+
/* @__PURE__ */ jsx88("div", { className: "h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx88("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${percent}%` } }) }),
|
|
3158
|
+
item.detail ? /* @__PURE__ */ jsx88("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.detail }) : null
|
|
3045
3159
|
] }, index);
|
|
3046
3160
|
}) });
|
|
3047
3161
|
}
|
|
3048
3162
|
|
|
3049
3163
|
// src/components/data-display/DonutMetric.tsx
|
|
3050
|
-
import { jsx as
|
|
3164
|
+
import { jsx as jsx89, jsxs as jsxs64 } from "react/jsx-runtime";
|
|
3051
3165
|
function DonutMetric({ value, max = 100, label, caption, size = 112, className = "" }) {
|
|
3052
3166
|
const radius = 42;
|
|
3053
3167
|
const circumference = 2 * Math.PI * radius;
|
|
3054
3168
|
const ratio = Math.max(0, Math.min(1, value / max));
|
|
3055
3169
|
const offset = circumference * (1 - ratio);
|
|
3056
|
-
return /* @__PURE__ */
|
|
3057
|
-
/* @__PURE__ */
|
|
3058
|
-
/* @__PURE__ */
|
|
3059
|
-
/* @__PURE__ */
|
|
3170
|
+
return /* @__PURE__ */ jsxs64("div", { className: `inline-flex items-center gap-4 ${className}`, children: [
|
|
3171
|
+
/* @__PURE__ */ jsxs64("svg", { width: size, height: size, viewBox: "0 0 112 112", role: "img", "aria-label": `${Math.round(ratio * 100)}%`, children: [
|
|
3172
|
+
/* @__PURE__ */ jsx89("circle", { cx: "56", cy: "56", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
|
|
3173
|
+
/* @__PURE__ */ jsx89(
|
|
3060
3174
|
"circle",
|
|
3061
3175
|
{
|
|
3062
3176
|
cx: "56",
|
|
@@ -3071,22 +3185,22 @@ function DonutMetric({ value, max = 100, label, caption, size = 112, className =
|
|
|
3071
3185
|
transform: "rotate(-90 56 56)"
|
|
3072
3186
|
}
|
|
3073
3187
|
),
|
|
3074
|
-
/* @__PURE__ */
|
|
3188
|
+
/* @__PURE__ */ jsxs64("text", { x: "56", y: "61", textAnchor: "middle", className: "fill-[var(--tapiz-text-primary)] font-mono text-lg font-bold", children: [
|
|
3075
3189
|
Math.round(ratio * 100),
|
|
3076
3190
|
"%"
|
|
3077
3191
|
] })
|
|
3078
3192
|
] }),
|
|
3079
|
-
label || caption ? /* @__PURE__ */
|
|
3080
|
-
label ? /* @__PURE__ */
|
|
3081
|
-
caption ? /* @__PURE__ */
|
|
3193
|
+
label || caption ? /* @__PURE__ */ jsxs64("div", { children: [
|
|
3194
|
+
label ? /* @__PURE__ */ jsx89("div", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: label }) : null,
|
|
3195
|
+
caption ? /* @__PURE__ */ jsx89("div", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: caption }) : null
|
|
3082
3196
|
] }) : null
|
|
3083
3197
|
] });
|
|
3084
3198
|
}
|
|
3085
3199
|
|
|
3086
3200
|
// src/components/data-display/FilterChip.tsx
|
|
3087
|
-
import { jsx as
|
|
3201
|
+
import { jsx as jsx90, jsxs as jsxs65 } from "react/jsx-runtime";
|
|
3088
3202
|
function FilterChip({ children, active = false, onRemove, className = "" }) {
|
|
3089
|
-
return /* @__PURE__ */
|
|
3203
|
+
return /* @__PURE__ */ jsxs65(
|
|
3090
3204
|
"span",
|
|
3091
3205
|
{
|
|
3092
3206
|
className: [
|
|
@@ -3096,56 +3210,56 @@ function FilterChip({ children, active = false, onRemove, className = "" }) {
|
|
|
3096
3210
|
].join(" "),
|
|
3097
3211
|
children: [
|
|
3098
3212
|
children,
|
|
3099
|
-
onRemove ? /* @__PURE__ */
|
|
3213
|
+
onRemove ? /* @__PURE__ */ jsx90("button", { type: "button", onClick: onRemove, className: "text-[var(--tapiz-text-muted)] hover:text-[var(--tapiz-danger)]", "aria-label": "Remove filter", children: "\xD7" }) : null
|
|
3100
3214
|
]
|
|
3101
3215
|
}
|
|
3102
3216
|
);
|
|
3103
3217
|
}
|
|
3104
3218
|
|
|
3105
3219
|
// src/components/data-display/DataToolbar.tsx
|
|
3106
|
-
import { jsx as
|
|
3220
|
+
import { jsx as jsx91, jsxs as jsxs66 } from "react/jsx-runtime";
|
|
3107
3221
|
function DataToolbar({ title, description, search, filters, actions, className = "" }) {
|
|
3108
|
-
return /* @__PURE__ */
|
|
3109
|
-
/* @__PURE__ */
|
|
3110
|
-
/* @__PURE__ */
|
|
3111
|
-
title ? /* @__PURE__ */
|
|
3112
|
-
description ? /* @__PURE__ */
|
|
3222
|
+
return /* @__PURE__ */ jsxs66("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4 ${className}`, children: [
|
|
3223
|
+
/* @__PURE__ */ jsxs66("div", { className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between", children: [
|
|
3224
|
+
/* @__PURE__ */ jsxs66("div", { children: [
|
|
3225
|
+
title ? /* @__PURE__ */ jsx91("h3", { className: "text-base font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
|
|
3226
|
+
description ? /* @__PURE__ */ jsx91("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
3113
3227
|
] }),
|
|
3114
|
-
actions ? /* @__PURE__ */
|
|
3228
|
+
actions ? /* @__PURE__ */ jsx91("div", { className: "flex flex-wrap gap-2", children: actions }) : null
|
|
3115
3229
|
] }),
|
|
3116
|
-
search || filters ? /* @__PURE__ */
|
|
3117
|
-
search ? /* @__PURE__ */
|
|
3118
|
-
filters ? /* @__PURE__ */
|
|
3230
|
+
search || filters ? /* @__PURE__ */ jsxs66("div", { className: "mt-4 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between", children: [
|
|
3231
|
+
search ? /* @__PURE__ */ jsx91("div", { className: "min-w-0 flex-1", children: search }) : null,
|
|
3232
|
+
filters ? /* @__PURE__ */ jsx91("div", { className: "flex flex-wrap gap-2", children: filters }) : null
|
|
3119
3233
|
] }) : null
|
|
3120
3234
|
] });
|
|
3121
3235
|
}
|
|
3122
3236
|
|
|
3123
3237
|
// src/components/framework/ResourceCard.tsx
|
|
3124
|
-
import { Fragment as Fragment5, jsx as
|
|
3238
|
+
import { Fragment as Fragment5, jsx as jsx92, jsxs as jsxs67 } from "react/jsx-runtime";
|
|
3125
3239
|
function ResourceCard({ title, description, eyebrow, icon, meta, status, actions, href, className = "" }) {
|
|
3126
|
-
const content = /* @__PURE__ */
|
|
3127
|
-
/* @__PURE__ */
|
|
3128
|
-
/* @__PURE__ */
|
|
3129
|
-
icon ? /* @__PURE__ */
|
|
3130
|
-
/* @__PURE__ */
|
|
3131
|
-
eyebrow ? /* @__PURE__ */
|
|
3132
|
-
/* @__PURE__ */
|
|
3133
|
-
description ? /* @__PURE__ */
|
|
3240
|
+
const content = /* @__PURE__ */ jsxs67(Fragment5, { children: [
|
|
3241
|
+
/* @__PURE__ */ jsxs67("div", { className: "flex items-start justify-between gap-4", children: [
|
|
3242
|
+
/* @__PURE__ */ jsxs67("div", { className: "flex min-w-0 items-start gap-3", children: [
|
|
3243
|
+
icon ? /* @__PURE__ */ jsx92("div", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-2 text-[var(--tapiz-accent)]", children: icon }) : null,
|
|
3244
|
+
/* @__PURE__ */ jsxs67("div", { className: "min-w-0", children: [
|
|
3245
|
+
eyebrow ? /* @__PURE__ */ jsx92("div", { className: "kicker mb-2", children: eyebrow }) : null,
|
|
3246
|
+
/* @__PURE__ */ jsx92("h3", { className: "truncate text-base font-semibold text-[var(--tapiz-text-primary)]", children: title }),
|
|
3247
|
+
description ? /* @__PURE__ */ jsx92("p", { className: "mt-2 line-clamp-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
3134
3248
|
] })
|
|
3135
3249
|
] }),
|
|
3136
|
-
status ? /* @__PURE__ */
|
|
3250
|
+
status ? /* @__PURE__ */ jsx92(Badge, { children: status }) : null
|
|
3137
3251
|
] }),
|
|
3138
|
-
meta || actions ? /* @__PURE__ */
|
|
3139
|
-
meta ? /* @__PURE__ */
|
|
3140
|
-
actions ? /* @__PURE__ */
|
|
3252
|
+
meta || actions ? /* @__PURE__ */ jsxs67("div", { className: "mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-[var(--tapiz-border-subtle)] pt-4", children: [
|
|
3253
|
+
meta ? /* @__PURE__ */ jsx92("div", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: meta }) : /* @__PURE__ */ jsx92("span", {}),
|
|
3254
|
+
actions ? /* @__PURE__ */ jsx92("div", { className: "flex flex-wrap gap-2", children: actions }) : null
|
|
3141
3255
|
] }) : null
|
|
3142
3256
|
] });
|
|
3143
3257
|
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}`;
|
|
3144
|
-
return href ? /* @__PURE__ */
|
|
3258
|
+
return href ? /* @__PURE__ */ jsx92("a", { href, className: classes, children: content }) : /* @__PURE__ */ jsx92("article", { className: classes, children: content });
|
|
3145
3259
|
}
|
|
3146
3260
|
|
|
3147
3261
|
// src/components/framework/IntegrationCard.tsx
|
|
3148
|
-
import { jsx as
|
|
3262
|
+
import { jsx as jsx93, jsxs as jsxs68 } from "react/jsx-runtime";
|
|
3149
3263
|
var statusLabel = {
|
|
3150
3264
|
connected: "Connected",
|
|
3151
3265
|
disconnected: "Disconnected",
|
|
@@ -3159,26 +3273,26 @@ var statusVariant = {
|
|
|
3159
3273
|
error: "danger"
|
|
3160
3274
|
};
|
|
3161
3275
|
function IntegrationCard({ name, description, logo, status = "disconnected", lastSync, actions, className = "" }) {
|
|
3162
|
-
return /* @__PURE__ */
|
|
3163
|
-
/* @__PURE__ */
|
|
3164
|
-
/* @__PURE__ */
|
|
3165
|
-
/* @__PURE__ */
|
|
3166
|
-
/* @__PURE__ */
|
|
3167
|
-
/* @__PURE__ */
|
|
3168
|
-
description ? /* @__PURE__ */
|
|
3276
|
+
return /* @__PURE__ */ jsxs68("article", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5 ${className}`, children: [
|
|
3277
|
+
/* @__PURE__ */ jsxs68("div", { className: "flex items-start justify-between gap-4", children: [
|
|
3278
|
+
/* @__PURE__ */ jsxs68("div", { className: "flex items-start gap-3", children: [
|
|
3279
|
+
/* @__PURE__ */ jsx93("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__ */ jsx93("span", { className: "font-mono text-xs", children: "API" }) }),
|
|
3280
|
+
/* @__PURE__ */ jsxs68("div", { children: [
|
|
3281
|
+
/* @__PURE__ */ jsx93("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: name }),
|
|
3282
|
+
description ? /* @__PURE__ */ jsx93("p", { className: "mt-1 text-sm leading-5 text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
3169
3283
|
] })
|
|
3170
3284
|
] }),
|
|
3171
|
-
/* @__PURE__ */
|
|
3285
|
+
/* @__PURE__ */ jsx93(StatusBadge, { variant: statusVariant[status], label: statusLabel[status] })
|
|
3172
3286
|
] }),
|
|
3173
|
-
/* @__PURE__ */
|
|
3174
|
-
/* @__PURE__ */
|
|
3175
|
-
actions ? /* @__PURE__ */
|
|
3287
|
+
/* @__PURE__ */ jsxs68("div", { className: "mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-[var(--tapiz-border-subtle)] pt-4", children: [
|
|
3288
|
+
/* @__PURE__ */ jsx93("div", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: lastSync ?? "No sync yet" }),
|
|
3289
|
+
actions ? /* @__PURE__ */ jsx93("div", { className: "flex gap-2", children: actions }) : null
|
|
3176
3290
|
] })
|
|
3177
3291
|
] });
|
|
3178
3292
|
}
|
|
3179
3293
|
|
|
3180
3294
|
// src/components/framework/HealthIndicator.tsx
|
|
3181
|
-
import { jsx as
|
|
3295
|
+
import { jsx as jsx94, jsxs as jsxs69 } from "react/jsx-runtime";
|
|
3182
3296
|
var toneClasses2 = {
|
|
3183
3297
|
operational: "bg-[var(--tapiz-success)]",
|
|
3184
3298
|
degraded: "bg-[var(--tapiz-warning)]",
|
|
@@ -3192,34 +3306,34 @@ var defaultLabel = {
|
|
|
3192
3306
|
unknown: "Unknown"
|
|
3193
3307
|
};
|
|
3194
3308
|
function HealthIndicator({ tone: tone2 = "unknown", label, detail, className = "" }) {
|
|
3195
|
-
return /* @__PURE__ */
|
|
3196
|
-
/* @__PURE__ */
|
|
3197
|
-
/* @__PURE__ */
|
|
3198
|
-
detail ? /* @__PURE__ */
|
|
3309
|
+
return /* @__PURE__ */ jsxs69("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: [
|
|
3310
|
+
/* @__PURE__ */ jsx94("span", { className: `size-2.5 ${toneClasses2[tone2]}`, "aria-hidden": "true" }),
|
|
3311
|
+
/* @__PURE__ */ jsx94("span", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: label ?? defaultLabel[tone2] }),
|
|
3312
|
+
detail ? /* @__PURE__ */ jsx94("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: detail }) : null
|
|
3199
3313
|
] });
|
|
3200
3314
|
}
|
|
3201
3315
|
|
|
3202
3316
|
// src/components/framework/AuditLog.tsx
|
|
3203
|
-
import { jsx as
|
|
3317
|
+
import { jsx as jsx95, jsxs as jsxs70 } from "react/jsx-runtime";
|
|
3204
3318
|
function AuditLog({ items, className = "" }) {
|
|
3205
|
-
return /* @__PURE__ */
|
|
3206
|
-
/* @__PURE__ */
|
|
3207
|
-
/* @__PURE__ */
|
|
3208
|
-
/* @__PURE__ */
|
|
3209
|
-
/* @__PURE__ */
|
|
3210
|
-
/* @__PURE__ */
|
|
3319
|
+
return /* @__PURE__ */ jsx95("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__ */ jsxs70("div", { className: "flex gap-3 p-4", children: [
|
|
3320
|
+
/* @__PURE__ */ jsx95(Avatar, { name: item.initials ?? item.actor, size: "sm" }),
|
|
3321
|
+
/* @__PURE__ */ jsxs70("div", { className: "min-w-0 flex-1", children: [
|
|
3322
|
+
/* @__PURE__ */ jsxs70("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
|
|
3323
|
+
/* @__PURE__ */ jsxs70("p", { className: "text-sm text-[var(--tapiz-text-secondary)]", children: [
|
|
3324
|
+
/* @__PURE__ */ jsx95("strong", { className: "text-[var(--tapiz-text-primary)]", children: item.actor }),
|
|
3211
3325
|
" ",
|
|
3212
3326
|
item.action
|
|
3213
3327
|
] }),
|
|
3214
|
-
/* @__PURE__ */
|
|
3328
|
+
/* @__PURE__ */ jsx95("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.timestamp })
|
|
3215
3329
|
] }),
|
|
3216
|
-
item.detail ? /* @__PURE__ */
|
|
3330
|
+
item.detail ? /* @__PURE__ */ jsx95("div", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: item.detail }) : null
|
|
3217
3331
|
] })
|
|
3218
3332
|
] }, index)) });
|
|
3219
3333
|
}
|
|
3220
3334
|
|
|
3221
3335
|
// src/components/framework/KanbanBoard.tsx
|
|
3222
|
-
import { jsx as
|
|
3336
|
+
import { jsx as jsx96, jsxs as jsxs71 } from "react/jsx-runtime";
|
|
3223
3337
|
var toneClasses3 = {
|
|
3224
3338
|
default: "border-[var(--tapiz-border-subtle)]",
|
|
3225
3339
|
accent: "border-[var(--tapiz-accent)]",
|
|
@@ -3228,65 +3342,65 @@ var toneClasses3 = {
|
|
|
3228
3342
|
danger: "border-[var(--tapiz-danger)]"
|
|
3229
3343
|
};
|
|
3230
3344
|
function KanbanBoard({ columns, className = "" }) {
|
|
3231
|
-
return /* @__PURE__ */
|
|
3232
|
-
/* @__PURE__ */
|
|
3233
|
-
/* @__PURE__ */
|
|
3234
|
-
/* @__PURE__ */
|
|
3235
|
-
column.description ? /* @__PURE__ */
|
|
3345
|
+
return /* @__PURE__ */ jsx96("div", { className: `grid gap-4 overflow-x-auto md:grid-flow-col md:auto-cols-[minmax(18rem,1fr)] ${className}`, children: columns.map((column) => /* @__PURE__ */ jsxs71("section", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-3", children: [
|
|
3346
|
+
/* @__PURE__ */ jsxs71("div", { className: "mb-3 flex items-start justify-between gap-3", children: [
|
|
3347
|
+
/* @__PURE__ */ jsxs71("div", { children: [
|
|
3348
|
+
/* @__PURE__ */ jsx96("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: column.title }),
|
|
3349
|
+
column.description ? /* @__PURE__ */ jsx96("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: column.description }) : null
|
|
3236
3350
|
] }),
|
|
3237
|
-
/* @__PURE__ */
|
|
3351
|
+
/* @__PURE__ */ jsx96("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: column.items.length })
|
|
3238
3352
|
] }),
|
|
3239
|
-
/* @__PURE__ */
|
|
3240
|
-
/* @__PURE__ */
|
|
3241
|
-
item.description ? /* @__PURE__ */
|
|
3242
|
-
item.meta ? /* @__PURE__ */
|
|
3353
|
+
/* @__PURE__ */ jsx96("div", { className: "space-y-3", children: column.items.map((item) => /* @__PURE__ */ jsxs71("article", { className: `border-l-2 bg-[var(--tapiz-bg-surface)] p-3 shadow-[var(--tapiz-shadow-sm)] ${toneClasses3[item.tone ?? "default"]}`, children: [
|
|
3354
|
+
/* @__PURE__ */ jsx96("h4", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
3355
|
+
item.description ? /* @__PURE__ */ jsx96("p", { className: "mt-1 text-xs leading-5 text-[var(--tapiz-text-muted)]", children: item.description }) : null,
|
|
3356
|
+
item.meta ? /* @__PURE__ */ jsx96("div", { className: "mt-3 font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
|
|
3243
3357
|
] }, item.id)) })
|
|
3244
3358
|
] }, column.id)) });
|
|
3245
3359
|
}
|
|
3246
3360
|
|
|
3247
3361
|
// src/components/framework/AccessMatrix.tsx
|
|
3248
|
-
import { jsx as
|
|
3362
|
+
import { jsx as jsx97, jsxs as jsxs72 } from "react/jsx-runtime";
|
|
3249
3363
|
function AccessMatrix({ roles, permissions, className = "" }) {
|
|
3250
|
-
return /* @__PURE__ */
|
|
3251
|
-
/* @__PURE__ */
|
|
3252
|
-
/* @__PURE__ */
|
|
3253
|
-
roles.map((role) => /* @__PURE__ */
|
|
3364
|
+
return /* @__PURE__ */ jsx97("div", { className: `overflow-x-auto border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: /* @__PURE__ */ jsxs72("table", { className: "min-w-full text-sm", children: [
|
|
3365
|
+
/* @__PURE__ */ jsx97("thead", { children: /* @__PURE__ */ jsxs72("tr", { children: [
|
|
3366
|
+
/* @__PURE__ */ jsx97("th", { className: "px-4 py-3 text-left", children: "Permission" }),
|
|
3367
|
+
roles.map((role) => /* @__PURE__ */ jsx97("th", { className: "px-4 py-3 text-center", children: role.label }, role.key))
|
|
3254
3368
|
] }) }),
|
|
3255
|
-
/* @__PURE__ */
|
|
3256
|
-
/* @__PURE__ */
|
|
3257
|
-
/* @__PURE__ */
|
|
3258
|
-
permission.description ? /* @__PURE__ */
|
|
3369
|
+
/* @__PURE__ */ jsx97("tbody", { children: permissions.map((permission) => /* @__PURE__ */ jsxs72("tr", { children: [
|
|
3370
|
+
/* @__PURE__ */ jsxs72("td", { className: "px-4 py-3", children: [
|
|
3371
|
+
/* @__PURE__ */ jsx97("div", { className: "font-medium text-[var(--tapiz-text-primary)]", children: permission.label }),
|
|
3372
|
+
permission.description ? /* @__PURE__ */ jsx97("div", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: permission.description }) : null
|
|
3259
3373
|
] }),
|
|
3260
|
-
roles.map((role) => /* @__PURE__ */
|
|
3374
|
+
roles.map((role) => /* @__PURE__ */ jsx97("td", { className: "px-4 py-3 text-center", children: /* @__PURE__ */ jsx97("span", { className: permission.roles[role.key] ? "text-[var(--tapiz-success)]" : "text-[var(--tapiz-text-disabled)]", children: permission.roles[role.key] ? "\u2713" : "\u2014" }) }, role.key))
|
|
3261
3375
|
] }, permission.key)) })
|
|
3262
3376
|
] }) });
|
|
3263
3377
|
}
|
|
3264
3378
|
|
|
3265
3379
|
// src/components/framework/CalendarGrid.tsx
|
|
3266
|
-
import { jsx as
|
|
3380
|
+
import { jsx as jsx98, jsxs as jsxs73 } from "react/jsx-runtime";
|
|
3267
3381
|
var defaultWeekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
|
|
3268
3382
|
function CalendarGrid({ days, weekdays = defaultWeekdays, className = "" }) {
|
|
3269
|
-
return /* @__PURE__ */
|
|
3270
|
-
/* @__PURE__ */
|
|
3271
|
-
/* @__PURE__ */
|
|
3272
|
-
/* @__PURE__ */
|
|
3273
|
-
/* @__PURE__ */
|
|
3274
|
-
day.label ? /* @__PURE__ */
|
|
3383
|
+
return /* @__PURE__ */ jsxs73("div", { className: `border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] ${className}`, children: [
|
|
3384
|
+
/* @__PURE__ */ jsx98("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__ */ jsx98("div", { className: "px-3 py-2 font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: day }, index)) }),
|
|
3385
|
+
/* @__PURE__ */ jsx98("div", { className: "grid grid-cols-7", children: days.map((day, index) => /* @__PURE__ */ jsxs73("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: [
|
|
3386
|
+
/* @__PURE__ */ jsxs73("div", { className: "flex items-center justify-between gap-2", children: [
|
|
3387
|
+
/* @__PURE__ */ jsx98("span", { className: "font-mono text-xs text-[var(--tapiz-text-primary)]", children: day.date }),
|
|
3388
|
+
day.label ? /* @__PURE__ */ jsx98("span", { className: "text-[10px] text-[var(--tapiz-text-muted)]", children: day.label }) : null
|
|
3275
3389
|
] }),
|
|
3276
|
-
day.events?.length ? /* @__PURE__ */
|
|
3390
|
+
day.events?.length ? /* @__PURE__ */ jsx98("div", { className: "mt-2 space-y-1", children: day.events.map((event, eventIndex) => /* @__PURE__ */ jsx98("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
|
|
3277
3391
|
] }, index)) })
|
|
3278
3392
|
] });
|
|
3279
3393
|
}
|
|
3280
3394
|
|
|
3281
3395
|
// src/components/forms/Slider.tsx
|
|
3282
|
-
import { jsx as
|
|
3396
|
+
import { jsx as jsx99, jsxs as jsxs74 } from "react/jsx-runtime";
|
|
3283
3397
|
function Slider({ label, valueLabel, className = "", ...props }) {
|
|
3284
|
-
return /* @__PURE__ */
|
|
3285
|
-
label || valueLabel ? /* @__PURE__ */
|
|
3286
|
-
label ? /* @__PURE__ */
|
|
3287
|
-
valueLabel ? /* @__PURE__ */
|
|
3398
|
+
return /* @__PURE__ */ jsxs74("label", { className: `block ${className}`, children: [
|
|
3399
|
+
label || valueLabel ? /* @__PURE__ */ jsxs74("span", { className: "mb-2 flex items-center justify-between gap-3 text-sm", children: [
|
|
3400
|
+
label ? /* @__PURE__ */ jsx99("span", { className: "font-medium text-[var(--tapiz-text-secondary)]", children: label }) : /* @__PURE__ */ jsx99("span", {}),
|
|
3401
|
+
valueLabel ? /* @__PURE__ */ jsx99("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: valueLabel }) : null
|
|
3288
3402
|
] }) : null,
|
|
3289
|
-
/* @__PURE__ */
|
|
3403
|
+
/* @__PURE__ */ jsx99(
|
|
3290
3404
|
"input",
|
|
3291
3405
|
{
|
|
3292
3406
|
...props,
|
|
@@ -3298,31 +3412,31 @@ function Slider({ label, valueLabel, className = "", ...props }) {
|
|
|
3298
3412
|
}
|
|
3299
3413
|
|
|
3300
3414
|
// src/components/forms/FileDropzone.tsx
|
|
3301
|
-
import { jsx as
|
|
3415
|
+
import { jsx as jsx100, jsxs as jsxs75 } from "react/jsx-runtime";
|
|
3302
3416
|
function FileDropzone({ title = "Drop files here", description, actionLabel = "Browse", className = "", ...props }) {
|
|
3303
|
-
return /* @__PURE__ */
|
|
3304
|
-
/* @__PURE__ */
|
|
3305
|
-
/* @__PURE__ */
|
|
3306
|
-
description ? /* @__PURE__ */
|
|
3307
|
-
/* @__PURE__ */
|
|
3417
|
+
return /* @__PURE__ */ jsxs75("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: [
|
|
3418
|
+
/* @__PURE__ */ jsx100("input", { ...props, type: "file", className: "sr-only" }),
|
|
3419
|
+
/* @__PURE__ */ jsx100("span", { className: "block text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }),
|
|
3420
|
+
description ? /* @__PURE__ */ jsx100("span", { className: "mt-2 block text-sm text-[var(--tapiz-text-muted)]", children: description }) : null,
|
|
3421
|
+
/* @__PURE__ */ jsx100("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 })
|
|
3308
3422
|
] });
|
|
3309
3423
|
}
|
|
3310
3424
|
|
|
3311
3425
|
// src/components/forms/PasswordInput.tsx
|
|
3312
|
-
import { useState as
|
|
3313
|
-
import { jsx as
|
|
3426
|
+
import { useState as useState10 } from "react";
|
|
3427
|
+
import { jsx as jsx101, jsxs as jsxs76 } from "react/jsx-runtime";
|
|
3314
3428
|
function PasswordInput({
|
|
3315
3429
|
revealLabel = "Show password",
|
|
3316
3430
|
className = "",
|
|
3317
3431
|
...props
|
|
3318
3432
|
}) {
|
|
3319
|
-
const [visible, setVisible] =
|
|
3320
|
-
return /* @__PURE__ */
|
|
3433
|
+
const [visible, setVisible] = useState10(false);
|
|
3434
|
+
return /* @__PURE__ */ jsxs76(
|
|
3321
3435
|
"div",
|
|
3322
3436
|
{
|
|
3323
3437
|
className: `flex border border-(--tapiz-border-strong) bg-(--tapiz-bg-surface) focus-within:border-(--tapiz-border-focus) focus-within:shadow-[inset_3px_0_0_0_var(--tapiz-signal)] ${className}`,
|
|
3324
3438
|
children: [
|
|
3325
|
-
/* @__PURE__ */
|
|
3439
|
+
/* @__PURE__ */ jsx101(
|
|
3326
3440
|
"input",
|
|
3327
3441
|
{
|
|
3328
3442
|
...props,
|
|
@@ -3330,7 +3444,7 @@ function PasswordInput({
|
|
|
3330
3444
|
className: "min-w-0 flex-1 border-0 bg-transparent px-3 py-2 text-sm text-(--tapiz-text-primary) outline-none focus:shadow-none!"
|
|
3331
3445
|
}
|
|
3332
3446
|
),
|
|
3333
|
-
/* @__PURE__ */
|
|
3447
|
+
/* @__PURE__ */ jsx101(
|
|
3334
3448
|
"button",
|
|
3335
3449
|
{
|
|
3336
3450
|
type: "button",
|
|
@@ -3339,7 +3453,7 @@ function PasswordInput({
|
|
|
3339
3453
|
onClick: () => setVisible((v) => !v),
|
|
3340
3454
|
tabIndex: -1,
|
|
3341
3455
|
className: "grid place-items-center px-3 text-(--tapiz-text-muted) transition-colors hover:text-(--tapiz-text-primary)",
|
|
3342
|
-
children: visible ? /* @__PURE__ */
|
|
3456
|
+
children: visible ? /* @__PURE__ */ jsx101(EyeOff, { size: 15 }) : /* @__PURE__ */ jsx101(Eye, { size: 15 })
|
|
3343
3457
|
}
|
|
3344
3458
|
)
|
|
3345
3459
|
]
|
|
@@ -3348,12 +3462,12 @@ function PasswordInput({
|
|
|
3348
3462
|
}
|
|
3349
3463
|
|
|
3350
3464
|
// src/components/forms/TextareaCounter.tsx
|
|
3351
|
-
import { jsx as
|
|
3465
|
+
import { jsx as jsx102, jsxs as jsxs77 } from "react/jsx-runtime";
|
|
3352
3466
|
function TextareaCounter({ maxLength, value = "", className = "", ...props }) {
|
|
3353
3467
|
const count = value.length;
|
|
3354
|
-
return /* @__PURE__ */
|
|
3355
|
-
/* @__PURE__ */
|
|
3356
|
-
/* @__PURE__ */
|
|
3468
|
+
return /* @__PURE__ */ jsxs77("div", { className, children: [
|
|
3469
|
+
/* @__PURE__ */ jsx102("textarea", { ...props, value, maxLength, className: "input-field min-h-28" }),
|
|
3470
|
+
/* @__PURE__ */ jsxs77("div", { className: "mt-1 text-right font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: [
|
|
3357
3471
|
count,
|
|
3358
3472
|
"/",
|
|
3359
3473
|
maxLength
|
|
@@ -3362,7 +3476,7 @@ function TextareaCounter({ maxLength, value = "", className = "", ...props }) {
|
|
|
3362
3476
|
}
|
|
3363
3477
|
|
|
3364
3478
|
// src/components/feedback/Callout.tsx
|
|
3365
|
-
import { jsx as
|
|
3479
|
+
import { jsx as jsx103, jsxs as jsxs78 } from "react/jsx-runtime";
|
|
3366
3480
|
var toneClasses4 = {
|
|
3367
3481
|
info: "border-[var(--tapiz-info)] bg-[var(--tapiz-info-soft)]",
|
|
3368
3482
|
success: "border-[var(--tapiz-success)] bg-[var(--tapiz-success-soft)]",
|
|
@@ -3371,73 +3485,73 @@ var toneClasses4 = {
|
|
|
3371
3485
|
neutral: "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]"
|
|
3372
3486
|
};
|
|
3373
3487
|
function Callout({ title, children, tone: tone2 = "info", icon, actions, className = "" }) {
|
|
3374
|
-
return /* @__PURE__ */
|
|
3375
|
-
icon ? /* @__PURE__ */
|
|
3376
|
-
/* @__PURE__ */
|
|
3377
|
-
title ? /* @__PURE__ */
|
|
3378
|
-
children ? /* @__PURE__ */
|
|
3379
|
-
actions ? /* @__PURE__ */
|
|
3488
|
+
return /* @__PURE__ */ jsx103("aside", { className: `border-l-4 p-4 ${toneClasses4[tone2]} ${className}`, children: /* @__PURE__ */ jsxs78("div", { className: "flex gap-3", children: [
|
|
3489
|
+
icon ? /* @__PURE__ */ jsx103("div", { className: "text-[var(--tapiz-text-primary)]", children: icon }) : null,
|
|
3490
|
+
/* @__PURE__ */ jsxs78("div", { className: "min-w-0 flex-1", children: [
|
|
3491
|
+
title ? /* @__PURE__ */ jsx103("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }) : null,
|
|
3492
|
+
children ? /* @__PURE__ */ jsx103("div", { className: "mt-1 text-sm leading-6 text-[var(--tapiz-text-secondary)]", children }) : null,
|
|
3493
|
+
actions ? /* @__PURE__ */ jsx103("div", { className: "mt-3 flex flex-wrap gap-2", children: actions }) : null
|
|
3380
3494
|
] })
|
|
3381
3495
|
] }) });
|
|
3382
3496
|
}
|
|
3383
3497
|
|
|
3384
3498
|
// src/components/feedback/LoadingOverlay.tsx
|
|
3385
|
-
import { jsx as
|
|
3499
|
+
import { jsx as jsx104, jsxs as jsxs79 } from "react/jsx-runtime";
|
|
3386
3500
|
function LoadingOverlay({ visible = false, label = "Loading", children, className = "" }) {
|
|
3387
|
-
return /* @__PURE__ */
|
|
3501
|
+
return /* @__PURE__ */ jsxs79("div", { className: `relative ${className}`, children: [
|
|
3388
3502
|
children,
|
|
3389
|
-
visible ? /* @__PURE__ */
|
|
3390
|
-
/* @__PURE__ */
|
|
3391
|
-
/* @__PURE__ */
|
|
3503
|
+
visible ? /* @__PURE__ */ jsx104("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__ */ jsxs79("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: [
|
|
3504
|
+
/* @__PURE__ */ jsx104(Spinner, {}),
|
|
3505
|
+
/* @__PURE__ */ jsx104("span", { children: label })
|
|
3392
3506
|
] }) }) : null
|
|
3393
3507
|
] });
|
|
3394
3508
|
}
|
|
3395
3509
|
|
|
3396
3510
|
// src/components/feedback/NotificationList.tsx
|
|
3397
|
-
import { jsx as
|
|
3511
|
+
import { jsx as jsx105, jsxs as jsxs80 } from "react/jsx-runtime";
|
|
3398
3512
|
function NotificationList({ items, className = "" }) {
|
|
3399
|
-
return /* @__PURE__ */
|
|
3400
|
-
/* @__PURE__ */
|
|
3401
|
-
/* @__PURE__ */
|
|
3402
|
-
/* @__PURE__ */
|
|
3403
|
-
/* @__PURE__ */
|
|
3404
|
-
item.time ? /* @__PURE__ */
|
|
3513
|
+
return /* @__PURE__ */ jsx105("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__ */ jsxs80("article", { className: "flex gap-3 p-4", children: [
|
|
3514
|
+
/* @__PURE__ */ jsx105("span", { className: `mt-1 size-2.5 ${item.unread ? "bg-[var(--tapiz-accent)]" : "bg-[var(--tapiz-border-subtle)]"}`, "aria-hidden": "true" }),
|
|
3515
|
+
/* @__PURE__ */ jsxs80("div", { className: "min-w-0 flex-1", children: [
|
|
3516
|
+
/* @__PURE__ */ jsxs80("div", { className: "flex items-start justify-between gap-3", children: [
|
|
3517
|
+
/* @__PURE__ */ jsx105("h3", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
3518
|
+
item.time ? /* @__PURE__ */ jsx105("span", { className: "font-mono text-[11px] text-[var(--tapiz-text-muted)]", children: item.time }) : null
|
|
3405
3519
|
] }),
|
|
3406
|
-
item.description ? /* @__PURE__ */
|
|
3407
|
-
item.action ? /* @__PURE__ */
|
|
3520
|
+
item.description ? /* @__PURE__ */ jsx105("p", { className: "mt-1 text-sm leading-5 text-[var(--tapiz-text-muted)]", children: item.description }) : null,
|
|
3521
|
+
item.action ? /* @__PURE__ */ jsx105("div", { className: "mt-3", children: item.action }) : null
|
|
3408
3522
|
] })
|
|
3409
3523
|
] }, item.id)) });
|
|
3410
3524
|
}
|
|
3411
3525
|
|
|
3412
3526
|
// src/components/layout/MasonryGrid.tsx
|
|
3413
|
-
import { jsx as
|
|
3527
|
+
import { jsx as jsx106 } from "react/jsx-runtime";
|
|
3414
3528
|
var columnClasses = { 2: "md:columns-2", 3: "md:columns-2 xl:columns-3", 4: "md:columns-2 lg:columns-3 xl:columns-4" };
|
|
3415
3529
|
var gapClasses4 = { sm: "gap-3", md: "gap-5", lg: "gap-8" };
|
|
3416
3530
|
function MasonryGrid({ children, columns = 3, gap = "md", className = "", style }) {
|
|
3417
|
-
return /* @__PURE__ */
|
|
3531
|
+
return /* @__PURE__ */ jsx106("div", { className: [columnClasses[columns], gapClasses4[gap], className].filter(Boolean).join(" "), style, children });
|
|
3418
3532
|
}
|
|
3419
3533
|
|
|
3420
3534
|
// src/components/layout/PageRail.tsx
|
|
3421
|
-
import { Fragment as Fragment6, jsx as
|
|
3535
|
+
import { Fragment as Fragment6, jsx as jsx107, jsxs as jsxs81 } from "react/jsx-runtime";
|
|
3422
3536
|
function PageRail({ title, items, actions, className = "", style }) {
|
|
3423
|
-
return /* @__PURE__ */
|
|
3424
|
-
title ? /* @__PURE__ */
|
|
3425
|
-
/* @__PURE__ */
|
|
3426
|
-
const content = /* @__PURE__ */
|
|
3427
|
-
/* @__PURE__ */
|
|
3428
|
-
item.meta ? /* @__PURE__ */
|
|
3537
|
+
return /* @__PURE__ */ jsxs81("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: [
|
|
3538
|
+
title ? /* @__PURE__ */ jsx107("div", { className: "kicker mb-3 px-2", children: title }) : null,
|
|
3539
|
+
/* @__PURE__ */ jsx107("nav", { className: "flex flex-col gap-1", children: items.map((item, index) => {
|
|
3540
|
+
const content = /* @__PURE__ */ jsxs81(Fragment6, { children: [
|
|
3541
|
+
/* @__PURE__ */ jsx107("span", { className: "truncate", children: item.label }),
|
|
3542
|
+
item.meta ? /* @__PURE__ */ jsx107("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
|
|
3429
3543
|
] });
|
|
3430
3544
|
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(" ");
|
|
3431
|
-
return item.href ? /* @__PURE__ */
|
|
3545
|
+
return item.href ? /* @__PURE__ */ jsx107("a", { href: item.href, className: classes, children: content }, index) : /* @__PURE__ */ jsx107("div", { className: classes, children: content }, index);
|
|
3432
3546
|
}) }),
|
|
3433
|
-
actions ? /* @__PURE__ */
|
|
3547
|
+
actions ? /* @__PURE__ */ jsx107("div", { className: "mt-3 border-t border-[var(--tapiz-border-subtle)] pt-3", children: actions }) : null
|
|
3434
3548
|
] });
|
|
3435
3549
|
}
|
|
3436
3550
|
|
|
3437
3551
|
// src/components/layout/StickyBar.tsx
|
|
3438
|
-
import { jsx as
|
|
3552
|
+
import { jsx as jsx108 } from "react/jsx-runtime";
|
|
3439
3553
|
function StickyBar({ children, position = "top", className = "", style }) {
|
|
3440
|
-
return /* @__PURE__ */
|
|
3554
|
+
return /* @__PURE__ */ jsx108(
|
|
3441
3555
|
"div",
|
|
3442
3556
|
{
|
|
3443
3557
|
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(" "),
|
|
@@ -3448,191 +3562,191 @@ function StickyBar({ children, position = "top", className = "", style }) {
|
|
|
3448
3562
|
}
|
|
3449
3563
|
|
|
3450
3564
|
// src/components/forms/Combobox.tsx
|
|
3451
|
-
import { jsx as
|
|
3565
|
+
import { jsx as jsx109, jsxs as jsxs82 } from "react/jsx-runtime";
|
|
3452
3566
|
function Combobox({ options, placeholder = "Select option", invalid = false, className = "", ...props }) {
|
|
3453
|
-
return /* @__PURE__ */
|
|
3454
|
-
/* @__PURE__ */
|
|
3455
|
-
options.map((option) => /* @__PURE__ */
|
|
3567
|
+
return /* @__PURE__ */ jsxs82("select", { ...props, className: ["input-field appearance-none bg-[var(--tapiz-bg-surface)]", invalid ? "border-warn focus:border-warn" : "", className].filter(Boolean).join(" "), children: [
|
|
3568
|
+
/* @__PURE__ */ jsx109("option", { value: "", children: placeholder }),
|
|
3569
|
+
options.map((option) => /* @__PURE__ */ jsx109("option", { value: option.value, children: String(option.label) }, option.value))
|
|
3456
3570
|
] });
|
|
3457
3571
|
}
|
|
3458
3572
|
|
|
3459
3573
|
// src/components/forms/DateRangePicker.tsx
|
|
3460
|
-
import { jsx as
|
|
3574
|
+
import { jsx as jsx110, jsxs as jsxs83 } from "react/jsx-runtime";
|
|
3461
3575
|
function DateRangePicker({ startLabel = "From", endLabel = "To", startProps, endProps, className = "" }) {
|
|
3462
|
-
return /* @__PURE__ */
|
|
3463
|
-
/* @__PURE__ */
|
|
3464
|
-
/* @__PURE__ */
|
|
3465
|
-
/* @__PURE__ */
|
|
3576
|
+
return /* @__PURE__ */ jsxs83("div", { className: ["grid gap-3 md:grid-cols-2", className].filter(Boolean).join(" "), children: [
|
|
3577
|
+
/* @__PURE__ */ jsxs83("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
|
|
3578
|
+
/* @__PURE__ */ jsx110("span", { children: startLabel }),
|
|
3579
|
+
/* @__PURE__ */ jsx110("input", { type: "date", ...startProps, className: ["input-field", startProps?.className || ""].join(" ") })
|
|
3466
3580
|
] }),
|
|
3467
|
-
/* @__PURE__ */
|
|
3468
|
-
/* @__PURE__ */
|
|
3469
|
-
/* @__PURE__ */
|
|
3581
|
+
/* @__PURE__ */ jsxs83("label", { className: "flex flex-col gap-1.5 text-sm text-[var(--tapiz-text-muted)]", children: [
|
|
3582
|
+
/* @__PURE__ */ jsx110("span", { children: endLabel }),
|
|
3583
|
+
/* @__PURE__ */ jsx110("input", { type: "date", ...endProps, className: ["input-field", endProps?.className || ""].join(" ") })
|
|
3470
3584
|
] })
|
|
3471
3585
|
] });
|
|
3472
3586
|
}
|
|
3473
3587
|
|
|
3474
3588
|
// src/components/forms/ColorSwatchPicker.tsx
|
|
3475
|
-
import { jsx as
|
|
3589
|
+
import { jsx as jsx111, jsxs as jsxs84 } from "react/jsx-runtime";
|
|
3476
3590
|
function ColorSwatchPicker({ options, value, onChange, className = "" }) {
|
|
3477
|
-
return /* @__PURE__ */
|
|
3591
|
+
return /* @__PURE__ */ jsx111("div", { className: ["flex flex-wrap gap-2", className].filter(Boolean).join(" "), children: options.map((option) => {
|
|
3478
3592
|
const selected = option.value === value;
|
|
3479
|
-
return /* @__PURE__ */
|
|
3480
|
-
/* @__PURE__ */
|
|
3481
|
-
/* @__PURE__ */
|
|
3593
|
+
return /* @__PURE__ */ jsxs84("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: [
|
|
3594
|
+
/* @__PURE__ */ jsx111("span", { className: "h-4 w-4 border border-[var(--tapiz-border-strong)]", style: { background: option.color } }),
|
|
3595
|
+
/* @__PURE__ */ jsx111("span", { children: option.label })
|
|
3482
3596
|
] }, option.value);
|
|
3483
3597
|
}) });
|
|
3484
3598
|
}
|
|
3485
3599
|
|
|
3486
3600
|
// src/components/forms/RatingInput.tsx
|
|
3487
|
-
import { jsx as
|
|
3601
|
+
import { jsx as jsx112 } from "react/jsx-runtime";
|
|
3488
3602
|
function RatingInput({ value = 0, max = 5, icon = "\u2605", onChange, label = "Rating", className = "" }) {
|
|
3489
|
-
return /* @__PURE__ */
|
|
3603
|
+
return /* @__PURE__ */ jsx112("div", { className: ["inline-flex items-center gap-1", className].filter(Boolean).join(" "), role: "radiogroup", "aria-label": label, children: Array.from({ length: max }, (_, index) => {
|
|
3490
3604
|
const score = index + 1;
|
|
3491
3605
|
const active = score <= value;
|
|
3492
|
-
return /* @__PURE__ */
|
|
3606
|
+
return /* @__PURE__ */ jsx112("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);
|
|
3493
3607
|
}) });
|
|
3494
3608
|
}
|
|
3495
3609
|
|
|
3496
3610
|
// src/components/data-display/ScoreRing.tsx
|
|
3497
|
-
import { jsx as
|
|
3611
|
+
import { jsx as jsx113, jsxs as jsxs85 } from "react/jsx-runtime";
|
|
3498
3612
|
function ScoreRing({ value, max = 100, label, size = 112, className = "" }) {
|
|
3499
3613
|
const normalized = Math.max(0, Math.min(1, value / max));
|
|
3500
3614
|
const radius = 42;
|
|
3501
3615
|
const circumference = 2 * Math.PI * radius;
|
|
3502
3616
|
const dash = circumference * normalized;
|
|
3503
|
-
return /* @__PURE__ */
|
|
3504
|
-
/* @__PURE__ */
|
|
3505
|
-
/* @__PURE__ */
|
|
3506
|
-
/* @__PURE__ */
|
|
3617
|
+
return /* @__PURE__ */ jsxs85("div", { className: ["inline-grid place-items-center", className].filter(Boolean).join(" "), style: { width: size, height: size }, children: [
|
|
3618
|
+
/* @__PURE__ */ jsxs85("svg", { viewBox: "0 0 100 100", className: "h-full w-full -rotate-90", children: [
|
|
3619
|
+
/* @__PURE__ */ jsx113("circle", { cx: "50", cy: "50", r: radius, fill: "none", stroke: "var(--tapiz-border-subtle)", strokeWidth: "10" }),
|
|
3620
|
+
/* @__PURE__ */ jsx113("circle", { cx: "50", cy: "50", r: radius, fill: "none", stroke: "var(--tapiz-accent)", strokeWidth: "10", strokeLinecap: "square", strokeDasharray: `${dash} ${circumference - dash}` })
|
|
3507
3621
|
] }),
|
|
3508
|
-
/* @__PURE__ */
|
|
3509
|
-
/* @__PURE__ */
|
|
3622
|
+
/* @__PURE__ */ jsxs85("div", { className: "absolute text-center", children: [
|
|
3623
|
+
/* @__PURE__ */ jsxs85("div", { className: "font-display text-2xl font-semibold text-[var(--tapiz-text-primary)]", children: [
|
|
3510
3624
|
Math.round(normalized * 100),
|
|
3511
3625
|
"%"
|
|
3512
3626
|
] }),
|
|
3513
|
-
label ? /* @__PURE__ */
|
|
3627
|
+
label ? /* @__PURE__ */ jsx113("div", { className: "font-mono text-[10px] uppercase tracking-[0.16em] text-[var(--tapiz-text-muted)]", children: label }) : null
|
|
3514
3628
|
] })
|
|
3515
3629
|
] });
|
|
3516
3630
|
}
|
|
3517
3631
|
|
|
3518
3632
|
// src/components/data-display/HeatmapGrid.tsx
|
|
3519
|
-
import { jsx as
|
|
3633
|
+
import { jsx as jsx114 } from "react/jsx-runtime";
|
|
3520
3634
|
function HeatmapGrid({ cells, columns = 7, max, className = "" }) {
|
|
3521
3635
|
const peak = max ?? Math.max(1, ...cells.map((cell) => cell.value));
|
|
3522
|
-
return /* @__PURE__ */
|
|
3636
|
+
return /* @__PURE__ */ jsx114("div", { className: ["grid gap-1", className].filter(Boolean).join(" "), style: { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }, children: cells.map((cell, index) => {
|
|
3523
3637
|
const opacity = 0.15 + Math.min(1, cell.value / peak) * 0.75;
|
|
3524
|
-
return /* @__PURE__ */
|
|
3638
|
+
return /* @__PURE__ */ jsx114("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__ */ jsx114("span", { className: "sr-only", children: cell.label }) : null }, index);
|
|
3525
3639
|
}) });
|
|
3526
3640
|
}
|
|
3527
3641
|
|
|
3528
3642
|
// src/components/data-display/FunnelChart.tsx
|
|
3529
|
-
import { jsx as
|
|
3643
|
+
import { jsx as jsx115, jsxs as jsxs86 } from "react/jsx-runtime";
|
|
3530
3644
|
function FunnelChart({ steps, className = "" }) {
|
|
3531
3645
|
const max = Math.max(1, ...steps.map((step) => step.value));
|
|
3532
|
-
return /* @__PURE__ */
|
|
3646
|
+
return /* @__PURE__ */ jsx115("div", { className: ["space-y-3", className].filter(Boolean).join(" "), children: steps.map((step, index) => {
|
|
3533
3647
|
const width = Math.max(8, step.value / max * 100);
|
|
3534
|
-
return /* @__PURE__ */
|
|
3535
|
-
/* @__PURE__ */
|
|
3536
|
-
/* @__PURE__ */
|
|
3537
|
-
/* @__PURE__ */
|
|
3648
|
+
return /* @__PURE__ */ jsxs86("div", { children: [
|
|
3649
|
+
/* @__PURE__ */ jsxs86("div", { className: "mb-1 flex items-center justify-between gap-3 text-sm", children: [
|
|
3650
|
+
/* @__PURE__ */ jsx115("span", { className: "font-medium text-[var(--tapiz-text-primary)]", children: step.label }),
|
|
3651
|
+
/* @__PURE__ */ jsxs86("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
|
|
3538
3652
|
step.value,
|
|
3539
3653
|
step.meta ? ` \xB7 ${String(step.meta)}` : ""
|
|
3540
3654
|
] })
|
|
3541
3655
|
] }),
|
|
3542
|
-
/* @__PURE__ */
|
|
3656
|
+
/* @__PURE__ */ jsx115("div", { className: "h-9 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx115("div", { className: "h-full border-r border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)]", style: { width: `${width}%` } }) })
|
|
3543
3657
|
] }, index);
|
|
3544
3658
|
}) });
|
|
3545
3659
|
}
|
|
3546
3660
|
|
|
3547
3661
|
// src/components/data-display/ComparisonMeter.tsx
|
|
3548
|
-
import { jsx as
|
|
3662
|
+
import { jsx as jsx116, jsxs as jsxs87 } from "react/jsx-runtime";
|
|
3549
3663
|
function ComparisonMeter({ leftLabel, rightLabel, value, className = "" }) {
|
|
3550
3664
|
const clamped = Math.max(0, Math.min(100, value));
|
|
3551
|
-
return /* @__PURE__ */
|
|
3552
|
-
/* @__PURE__ */
|
|
3553
|
-
/* @__PURE__ */
|
|
3554
|
-
/* @__PURE__ */
|
|
3665
|
+
return /* @__PURE__ */ jsxs87("div", { className, children: [
|
|
3666
|
+
/* @__PURE__ */ jsxs87("div", { className: "mb-2 flex justify-between gap-3 text-sm text-[var(--tapiz-text-muted)]", children: [
|
|
3667
|
+
/* @__PURE__ */ jsx116("span", { children: leftLabel }),
|
|
3668
|
+
/* @__PURE__ */ jsx116("span", { children: rightLabel })
|
|
3555
3669
|
] }),
|
|
3556
|
-
/* @__PURE__ */
|
|
3557
|
-
/* @__PURE__ */
|
|
3558
|
-
/* @__PURE__ */
|
|
3670
|
+
/* @__PURE__ */ jsxs87("div", { className: "relative h-3 border border-[var(--tapiz-border-strong)] bg-[var(--tapiz-bg-surface-muted)]", children: [
|
|
3671
|
+
/* @__PURE__ */ jsx116("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${clamped}%` } }),
|
|
3672
|
+
/* @__PURE__ */ jsx116("div", { className: "absolute top-[-6px] h-6 w-px bg-[var(--tapiz-border-strong)]", style: { left: `${clamped}%` } })
|
|
3559
3673
|
] })
|
|
3560
3674
|
] });
|
|
3561
3675
|
}
|
|
3562
3676
|
|
|
3563
3677
|
// src/components/framework/ActivityFeed.tsx
|
|
3564
|
-
import { jsx as
|
|
3678
|
+
import { jsx as jsx117, jsxs as jsxs88 } from "react/jsx-runtime";
|
|
3565
3679
|
function ActivityFeed({ items, className = "" }) {
|
|
3566
|
-
return /* @__PURE__ */
|
|
3567
|
-
/* @__PURE__ */
|
|
3568
|
-
/* @__PURE__ */
|
|
3569
|
-
/* @__PURE__ */
|
|
3570
|
-
/* @__PURE__ */
|
|
3680
|
+
return /* @__PURE__ */ jsx117("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__ */ jsxs88("div", { className: "flex gap-3 p-4", children: [
|
|
3681
|
+
/* @__PURE__ */ jsx117(Avatar, { name: item.actor, src: item.avatarUrl, size: "sm" }),
|
|
3682
|
+
/* @__PURE__ */ jsxs88("div", { className: "min-w-0 flex-1", children: [
|
|
3683
|
+
/* @__PURE__ */ jsxs88("p", { className: "text-sm text-[var(--tapiz-text-primary)]", children: [
|
|
3684
|
+
/* @__PURE__ */ jsx117("strong", { children: item.actor }),
|
|
3571
3685
|
" ",
|
|
3572
3686
|
item.action
|
|
3573
3687
|
] }),
|
|
3574
|
-
item.meta ? /* @__PURE__ */
|
|
3688
|
+
item.meta ? /* @__PURE__ */ jsx117("div", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: item.meta }) : null
|
|
3575
3689
|
] }),
|
|
3576
|
-
item.time ? /* @__PURE__ */
|
|
3690
|
+
item.time ? /* @__PURE__ */ jsx117("div", { className: "font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: item.time }) : null
|
|
3577
3691
|
] }, index)) });
|
|
3578
3692
|
}
|
|
3579
3693
|
|
|
3580
3694
|
// src/components/framework/InboxList.tsx
|
|
3581
|
-
import { jsx as
|
|
3695
|
+
import { jsx as jsx118, jsxs as jsxs89 } from "react/jsx-runtime";
|
|
3582
3696
|
function InboxList({ items, className = "" }) {
|
|
3583
|
-
return /* @__PURE__ */
|
|
3584
|
-
/* @__PURE__ */
|
|
3585
|
-
/* @__PURE__ */
|
|
3586
|
-
/* @__PURE__ */
|
|
3587
|
-
item.sender ? /* @__PURE__ */
|
|
3697
|
+
return /* @__PURE__ */ jsx118("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__ */ jsxs89("article", { className: ["p-4 transition hover:bg-[var(--tapiz-bg-surface-muted)]", item.unread ? "border-l-4 border-l-[var(--tapiz-accent)]" : ""].join(" "), children: [
|
|
3698
|
+
/* @__PURE__ */ jsxs89("div", { className: "flex items-start justify-between gap-3", children: [
|
|
3699
|
+
/* @__PURE__ */ jsxs89("div", { className: "min-w-0", children: [
|
|
3700
|
+
/* @__PURE__ */ jsx118("h3", { className: "truncate text-sm font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
3701
|
+
item.sender ? /* @__PURE__ */ jsx118("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: item.sender }) : null
|
|
3588
3702
|
] }),
|
|
3589
|
-
/* @__PURE__ */
|
|
3590
|
-
item.tag ? /* @__PURE__ */
|
|
3591
|
-
item.time ? /* @__PURE__ */
|
|
3703
|
+
/* @__PURE__ */ jsxs89("div", { className: "flex shrink-0 items-center gap-2", children: [
|
|
3704
|
+
item.tag ? /* @__PURE__ */ jsx118(Badge, { children: item.tag }) : null,
|
|
3705
|
+
item.time ? /* @__PURE__ */ jsx118("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.time }) : null
|
|
3592
3706
|
] })
|
|
3593
3707
|
] }),
|
|
3594
|
-
item.snippet ? /* @__PURE__ */
|
|
3708
|
+
item.snippet ? /* @__PURE__ */ jsx118("p", { className: "mt-2 line-clamp-2 text-sm text-[var(--tapiz-text-muted)]", children: item.snippet }) : null
|
|
3595
3709
|
] }, index)) });
|
|
3596
3710
|
}
|
|
3597
3711
|
|
|
3598
3712
|
// src/components/framework/ApprovalQueue.tsx
|
|
3599
|
-
import { jsx as
|
|
3713
|
+
import { jsx as jsx119, jsxs as jsxs90 } from "react/jsx-runtime";
|
|
3600
3714
|
function ApprovalQueue({ items, onApprove, onReject, className = "" }) {
|
|
3601
|
-
return /* @__PURE__ */
|
|
3602
|
-
/* @__PURE__ */
|
|
3603
|
-
/* @__PURE__ */
|
|
3604
|
-
/* @__PURE__ */
|
|
3605
|
-
item.priority ? /* @__PURE__ */
|
|
3715
|
+
return /* @__PURE__ */ jsx119("div", { className: ["space-y-3", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsx119("article", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4", children: /* @__PURE__ */ jsxs90("div", { className: "flex flex-col gap-4 md:flex-row md:items-start md:justify-between", children: [
|
|
3716
|
+
/* @__PURE__ */ jsxs90("div", { children: [
|
|
3717
|
+
/* @__PURE__ */ jsxs90("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
3718
|
+
/* @__PURE__ */ jsx119("h3", { className: "font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
3719
|
+
item.priority ? /* @__PURE__ */ jsx119(Badge, { variant: item.priority === "high" ? "danger" : item.priority === "medium" ? "warning" : "default", children: item.priority }) : null
|
|
3606
3720
|
] }),
|
|
3607
|
-
item.requester ? /* @__PURE__ */
|
|
3721
|
+
item.requester ? /* @__PURE__ */ jsxs90("p", { className: "mt-1 text-xs text-[var(--tapiz-text-muted)]", children: [
|
|
3608
3722
|
"Requested by ",
|
|
3609
3723
|
item.requester
|
|
3610
3724
|
] }) : null,
|
|
3611
|
-
item.description ? /* @__PURE__ */
|
|
3725
|
+
item.description ? /* @__PURE__ */ jsx119("p", { className: "mt-2 text-sm text-[var(--tapiz-text-muted)]", children: item.description }) : null
|
|
3612
3726
|
] }),
|
|
3613
|
-
/* @__PURE__ */
|
|
3614
|
-
/* @__PURE__ */
|
|
3615
|
-
/* @__PURE__ */
|
|
3727
|
+
/* @__PURE__ */ jsxs90("div", { className: "flex gap-2", children: [
|
|
3728
|
+
/* @__PURE__ */ jsx119(Button, { size: "sm", variant: "secondary", onClick: () => onReject?.(index), children: "Reject" }),
|
|
3729
|
+
/* @__PURE__ */ jsx119(Button, { size: "sm", onClick: () => onApprove?.(index), children: "Approve" })
|
|
3616
3730
|
] })
|
|
3617
3731
|
] }) }, index)) });
|
|
3618
3732
|
}
|
|
3619
3733
|
|
|
3620
3734
|
// src/components/framework/SLAStatus.tsx
|
|
3621
|
-
import { jsx as
|
|
3735
|
+
import { jsx as jsx120, jsxs as jsxs91 } from "react/jsx-runtime";
|
|
3622
3736
|
function SLAStatus({ label, value, target = 95, className = "" }) {
|
|
3623
3737
|
const ok = value >= target;
|
|
3624
|
-
return /* @__PURE__ */
|
|
3625
|
-
/* @__PURE__ */
|
|
3626
|
-
/* @__PURE__ */
|
|
3627
|
-
/* @__PURE__ */
|
|
3738
|
+
return /* @__PURE__ */ jsxs91("div", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-4", className].filter(Boolean).join(" "), children: [
|
|
3739
|
+
/* @__PURE__ */ jsxs91("div", { className: "flex items-center justify-between gap-3", children: [
|
|
3740
|
+
/* @__PURE__ */ jsx120("span", { className: "text-sm font-medium text-[var(--tapiz-text-primary)]", children: label }),
|
|
3741
|
+
/* @__PURE__ */ jsx120("span", { className: ["font-mono text-xs", ok ? "text-[var(--tapiz-success)]" : "text-[var(--tapiz-warning)]"].join(" "), children: ok ? "Within SLA" : "At risk" })
|
|
3628
3742
|
] }),
|
|
3629
|
-
/* @__PURE__ */
|
|
3630
|
-
/* @__PURE__ */
|
|
3631
|
-
/* @__PURE__ */
|
|
3743
|
+
/* @__PURE__ */ jsx120("div", { className: "mt-3 h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx120("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${Math.max(0, Math.min(100, value))}%` } }) }),
|
|
3744
|
+
/* @__PURE__ */ jsxs91("div", { className: "mt-2 flex justify-between font-mono text-[10px] uppercase tracking-[0.14em] text-[var(--tapiz-text-muted)]", children: [
|
|
3745
|
+
/* @__PURE__ */ jsxs91("span", { children: [
|
|
3632
3746
|
value,
|
|
3633
3747
|
"%"
|
|
3634
3748
|
] }),
|
|
3635
|
-
/* @__PURE__ */
|
|
3749
|
+
/* @__PURE__ */ jsxs91("span", { children: [
|
|
3636
3750
|
"Target ",
|
|
3637
3751
|
target,
|
|
3638
3752
|
"%"
|
|
@@ -3642,81 +3756,81 @@ function SLAStatus({ label, value, target = 95, className = "" }) {
|
|
|
3642
3756
|
}
|
|
3643
3757
|
|
|
3644
3758
|
// src/components/framework/FeatureFlagTable.tsx
|
|
3645
|
-
import { jsx as
|
|
3759
|
+
import { jsx as jsx121, jsxs as jsxs92 } from "react/jsx-runtime";
|
|
3646
3760
|
function FeatureFlagTable({ flags, onToggle, className = "" }) {
|
|
3647
|
-
return /* @__PURE__ */
|
|
3648
|
-
/* @__PURE__ */
|
|
3649
|
-
/* @__PURE__ */
|
|
3650
|
-
/* @__PURE__ */
|
|
3651
|
-
/* @__PURE__ */
|
|
3761
|
+
return /* @__PURE__ */ jsx121("div", { className: ["overflow-hidden border border-[var(--tapiz-border-subtle)]", className].filter(Boolean).join(" "), children: flags.map((flag) => /* @__PURE__ */ jsxs92("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: [
|
|
3762
|
+
/* @__PURE__ */ jsxs92("div", { children: [
|
|
3763
|
+
/* @__PURE__ */ jsxs92("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
3764
|
+
/* @__PURE__ */ jsx121("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: flag.name }),
|
|
3765
|
+
/* @__PURE__ */ jsx121(Badge, { children: flag.key })
|
|
3652
3766
|
] }),
|
|
3653
|
-
flag.description ? /* @__PURE__ */
|
|
3767
|
+
flag.description ? /* @__PURE__ */ jsx121("p", { className: "mt-1 text-sm text-[var(--tapiz-text-muted)]", children: flag.description }) : null
|
|
3654
3768
|
] }),
|
|
3655
|
-
/* @__PURE__ */
|
|
3656
|
-
/* @__PURE__ */
|
|
3769
|
+
/* @__PURE__ */ jsx121("div", { className: "text-sm text-[var(--tapiz-text-muted)]", children: flag.rollout }),
|
|
3770
|
+
/* @__PURE__ */ jsx121(Switch, { checked: flag.enabled, onChange: (checked) => onToggle?.(flag.key, checked) })
|
|
3657
3771
|
] }, flag.key)) });
|
|
3658
3772
|
}
|
|
3659
3773
|
|
|
3660
3774
|
// src/components/framework/PlanUsage.tsx
|
|
3661
|
-
import { jsx as
|
|
3775
|
+
import { jsx as jsx122, jsxs as jsxs93 } from "react/jsx-runtime";
|
|
3662
3776
|
function PlanUsage({ title = "Plan usage", items, className = "" }) {
|
|
3663
|
-
return /* @__PURE__ */
|
|
3664
|
-
/* @__PURE__ */
|
|
3665
|
-
/* @__PURE__ */
|
|
3777
|
+
return /* @__PURE__ */ jsxs93("section", { className: ["border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5", className].filter(Boolean).join(" "), children: [
|
|
3778
|
+
/* @__PURE__ */ jsx122("h3", { className: "text-sm font-semibold text-[var(--tapiz-text-primary)]", children: title }),
|
|
3779
|
+
/* @__PURE__ */ jsx122("div", { className: "mt-4 space-y-4", children: items.map((item, index) => {
|
|
3666
3780
|
const pct = item.limit ? Math.min(100, item.used / item.limit * 100) : 0;
|
|
3667
|
-
return /* @__PURE__ */
|
|
3668
|
-
/* @__PURE__ */
|
|
3669
|
-
/* @__PURE__ */
|
|
3670
|
-
/* @__PURE__ */
|
|
3781
|
+
return /* @__PURE__ */ jsxs93("div", { children: [
|
|
3782
|
+
/* @__PURE__ */ jsxs93("div", { className: "mb-1 flex justify-between text-sm", children: [
|
|
3783
|
+
/* @__PURE__ */ jsx122("span", { className: "text-[var(--tapiz-text-primary)]", children: item.label }),
|
|
3784
|
+
/* @__PURE__ */ jsxs93("span", { className: "font-mono text-xs text-[var(--tapiz-text-muted)]", children: [
|
|
3671
3785
|
item.used,
|
|
3672
3786
|
"/",
|
|
3673
3787
|
item.limit
|
|
3674
3788
|
] })
|
|
3675
3789
|
] }),
|
|
3676
|
-
/* @__PURE__ */
|
|
3790
|
+
/* @__PURE__ */ jsx122("div", { className: "h-2 border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)]", children: /* @__PURE__ */ jsx122("div", { className: "h-full bg-[var(--tapiz-accent)]", style: { width: `${pct}%` } }) })
|
|
3677
3791
|
] }, index);
|
|
3678
3792
|
}) })
|
|
3679
3793
|
] });
|
|
3680
3794
|
}
|
|
3681
3795
|
|
|
3682
3796
|
// src/components/marketing/AnnouncementBar.tsx
|
|
3683
|
-
import { jsx as
|
|
3797
|
+
import { jsx as jsx123, jsxs as jsxs94 } from "react/jsx-runtime";
|
|
3684
3798
|
function AnnouncementBar({ children, action, className = "" }) {
|
|
3685
|
-
return /* @__PURE__ */
|
|
3799
|
+
return /* @__PURE__ */ jsx123("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__ */ jsxs94("div", { className: "mx-auto flex max-w-7xl flex-wrap items-center justify-center gap-3 text-center", children: [
|
|
3686
3800
|
" ",
|
|
3687
|
-
/* @__PURE__ */
|
|
3688
|
-
action ? /* @__PURE__ */
|
|
3801
|
+
/* @__PURE__ */ jsx123("span", { children }),
|
|
3802
|
+
action ? /* @__PURE__ */ jsx123("span", { children: action }) : null
|
|
3689
3803
|
] }) });
|
|
3690
3804
|
}
|
|
3691
3805
|
|
|
3692
3806
|
// src/components/marketing/FAQSection.tsx
|
|
3693
|
-
import { jsx as
|
|
3807
|
+
import { jsx as jsx124, jsxs as jsxs95 } from "react/jsx-runtime";
|
|
3694
3808
|
function FAQSection({ title = "Frequently asked questions", description, items, className = "" }) {
|
|
3695
|
-
return /* @__PURE__ */
|
|
3696
|
-
/* @__PURE__ */
|
|
3697
|
-
/* @__PURE__ */
|
|
3698
|
-
/* @__PURE__ */
|
|
3699
|
-
description ? /* @__PURE__ */
|
|
3809
|
+
return /* @__PURE__ */ jsxs95("section", { className, children: [
|
|
3810
|
+
/* @__PURE__ */ jsxs95("div", { className: "mb-6 max-w-2xl", children: [
|
|
3811
|
+
/* @__PURE__ */ jsx124("div", { className: "kicker", children: "FAQ" }),
|
|
3812
|
+
/* @__PURE__ */ jsx124("h2", { className: "mt-2 text-3xl font-semibold tracking-[-0.05em] text-[var(--tapiz-text-primary)]", children: title }),
|
|
3813
|
+
description ? /* @__PURE__ */ jsx124("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: description }) : null
|
|
3700
3814
|
] }),
|
|
3701
|
-
/* @__PURE__ */
|
|
3815
|
+
/* @__PURE__ */ jsx124(Accordion, { items: items.map((item, index) => ({ id: `faq-${index}`, title: item.question, content: item.answer })) })
|
|
3702
3816
|
] });
|
|
3703
3817
|
}
|
|
3704
3818
|
|
|
3705
3819
|
// src/components/marketing/RoadmapList.tsx
|
|
3706
|
-
import { jsx as
|
|
3820
|
+
import { jsx as jsx125, jsxs as jsxs96 } from "react/jsx-runtime";
|
|
3707
3821
|
function RoadmapList({ items, className = "" }) {
|
|
3708
|
-
return /* @__PURE__ */
|
|
3709
|
-
/* @__PURE__ */
|
|
3710
|
-
/* @__PURE__ */
|
|
3711
|
-
item.status ? /* @__PURE__ */
|
|
3822
|
+
return /* @__PURE__ */ jsx125("div", { className: ["grid gap-3 md:grid-cols-3", className].filter(Boolean).join(" "), children: items.map((item, index) => /* @__PURE__ */ jsxs96("article", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-5", children: [
|
|
3823
|
+
/* @__PURE__ */ jsxs96("div", { className: "flex items-center justify-between gap-3", children: [
|
|
3824
|
+
/* @__PURE__ */ jsx125("span", { className: "kicker", children: item.quarter ?? `0${index + 1}` }),
|
|
3825
|
+
item.status ? /* @__PURE__ */ jsx125(Badge, { children: item.status }) : null
|
|
3712
3826
|
] }),
|
|
3713
|
-
/* @__PURE__ */
|
|
3714
|
-
item.description ? /* @__PURE__ */
|
|
3827
|
+
/* @__PURE__ */ jsx125("h3", { className: "mt-4 font-semibold text-[var(--tapiz-text-primary)]", children: item.title }),
|
|
3828
|
+
item.description ? /* @__PURE__ */ jsx125("p", { className: "mt-2 text-sm leading-6 text-[var(--tapiz-text-muted)]", children: item.description }) : null
|
|
3715
3829
|
] }, index)) });
|
|
3716
3830
|
}
|
|
3717
3831
|
|
|
3718
3832
|
// src/components/feedback/InlineStatus.tsx
|
|
3719
|
-
import { jsx as
|
|
3833
|
+
import { jsx as jsx126, jsxs as jsxs97 } from "react/jsx-runtime";
|
|
3720
3834
|
var toneClasses5 = {
|
|
3721
3835
|
neutral: "bg-[var(--tapiz-text-muted)]",
|
|
3722
3836
|
success: "bg-[var(--tapiz-success)]",
|
|
@@ -3725,8 +3839,8 @@ var toneClasses5 = {
|
|
|
3725
3839
|
info: "bg-[var(--tapiz-info)]"
|
|
3726
3840
|
};
|
|
3727
3841
|
function InlineStatus({ tone: tone2 = "neutral", children, pulse = false, className = "" }) {
|
|
3728
|
-
return /* @__PURE__ */
|
|
3729
|
-
/* @__PURE__ */
|
|
3842
|
+
return /* @__PURE__ */ jsxs97("span", { className: ["inline-flex items-center gap-2 text-sm text-[var(--tapiz-text-muted)]", className].filter(Boolean).join(" "), children: [
|
|
3843
|
+
/* @__PURE__ */ jsx126("span", { className: ["h-2 w-2 rounded-full", toneClasses5[tone2], pulse ? "animate-pulse" : ""].filter(Boolean).join(" ") }),
|
|
3730
3844
|
children
|
|
3731
3845
|
] });
|
|
3732
3846
|
}
|
|
@@ -3902,6 +4016,7 @@ export {
|
|
|
3902
4016
|
SectionCard,
|
|
3903
4017
|
SectionIcons,
|
|
3904
4018
|
SectionTitle,
|
|
4019
|
+
SegmentedTabs,
|
|
3905
4020
|
Select,
|
|
3906
4021
|
Server,
|
|
3907
4022
|
Shield,
|