@shapesos/clay 0.19.0 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artifacts.cjs +175 -128
- package/dist/artifacts.cjs.map +1 -1
- package/dist/artifacts.js +3 -1
- package/dist/blocks.cjs +172 -163
- package/dist/blocks.cjs.map +1 -1
- package/dist/blocks.js +4 -4
- package/dist/chat.cjs +172 -163
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +5 -5
- package/dist/{chunk-DC5KYT2G.js → chunk-63AGNGKG.js} +17 -3
- package/dist/chunk-63AGNGKG.js.map +1 -0
- package/dist/{chunk-JMHE3Q5K.js → chunk-PISZYS2H.js} +5 -5
- package/dist/{chunk-FCSYVF4Z.js → chunk-PWSEEUVL.js} +2 -2
- package/dist/index.cjs +172 -163
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +7 -7
- package/package.json +1 -1
- package/dist/chunk-DC5KYT2G.js.map +0 -1
- /package/dist/{chunk-JMHE3Q5K.js.map → chunk-PISZYS2H.js.map} +0 -0
- /package/dist/{chunk-FCSYVF4Z.js.map → chunk-PWSEEUVL.js.map} +0 -0
package/dist/artifacts.cjs
CHANGED
|
@@ -475,6 +475,10 @@ var IconLoader2 = createReactComponent("outline", "loader-2", "Loader2", __iconN
|
|
|
475
475
|
var __iconNode11 = [["path", { "d": "M15 8h.01", "key": "svg-0" }], ["path", { "d": "M3 6a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3v-12", "key": "svg-1" }], ["path", { "d": "M3 16l5 -5c.928 -.893 2.072 -.893 3 0l5 5", "key": "svg-2" }], ["path", { "d": "M14 14l1 -1c.928 -.893 2.072 -.893 3 0l3 3", "key": "svg-3" }]];
|
|
476
476
|
var IconPhoto = createReactComponent("outline", "photo", "Photo", __iconNode11);
|
|
477
477
|
|
|
478
|
+
// node_modules/@tabler/icons-react/dist/esm/icons/IconFlask2Filled.mjs
|
|
479
|
+
var __iconNode12 = [["path", { "d": "M15 2a1 1 0 0 1 0 2v5.674l.062 .03a7 7 0 0 1 3.85 5.174l.037 .262a7 7 0 0 1 -3.078 6.693a1 1 0 0 1 -.553 .167h-6.635a1 1 0 0 1 -.552 -.166a7 7 0 0 1 .807 -12.134l.062 -.028v-5.672a1 1 0 1 1 0 -2h6zm-2 2h-2v6.34a1 1 0 0 1 -.551 .894l-.116 .049a5 5 0 0 0 -2.92 2.717h9.172a5 5 0 0 0 -2.918 -2.715a1 1 0 0 1 -.667 -.943v-6.342z", "key": "svg-0" }]];
|
|
480
|
+
var IconFlask2Filled = createReactComponent("filled", "flask-2-filled", "Flask2Filled", __iconNode12);
|
|
481
|
+
|
|
478
482
|
// src/components/artifacts/artifact-copy-as-image-button/artifact-copy-as-image-button.tsx
|
|
479
483
|
var import_react6 = require("react");
|
|
480
484
|
|
|
@@ -2038,6 +2042,41 @@ var ChartArtifactService = {
|
|
|
2038
2042
|
// src/components/artifacts/deck-artifact/deck-artifact.tsx
|
|
2039
2043
|
var import_react17 = require("react");
|
|
2040
2044
|
var import_react_dom = require("react-dom");
|
|
2045
|
+
|
|
2046
|
+
// src/components/badge/badge.tsx
|
|
2047
|
+
var import_jsx_runtime20 = require("react/jsx-runtime");
|
|
2048
|
+
var BASE = "inline-flex items-center whitespace-nowrap rounded-full";
|
|
2049
|
+
var SIZES = {
|
|
2050
|
+
// `sm` is a uniform scale-down of `md` (text 10/12 of caption): padding and line-height keep
|
|
2051
|
+
// md's proportions (caption is 12px text on a 16px line = 1.333 ratio) so the pill shape matches.
|
|
2052
|
+
md: "px-2.5 py-0.5 text-geist-label-caption-medium",
|
|
2053
|
+
sm: "px-2 py-0.5 text-[11px]/[1.333] font-medium"
|
|
2054
|
+
};
|
|
2055
|
+
var SUBTLE = {
|
|
2056
|
+
neutral: "bg-brown-20 text-brown-70",
|
|
2057
|
+
warning: "bg-orange-50 text-orange-600",
|
|
2058
|
+
violet: "bg-violet-50 text-violet-600"
|
|
2059
|
+
};
|
|
2060
|
+
var OUTLINE = {
|
|
2061
|
+
neutral: "border border-brown-30 bg-white text-brown-100",
|
|
2062
|
+
warning: "border border-orange-200 bg-white text-orange-600",
|
|
2063
|
+
violet: "border border-violet-400 bg-white text-violet-600"
|
|
2064
|
+
};
|
|
2065
|
+
var VARIANTS = {
|
|
2066
|
+
subtle: SUBTLE,
|
|
2067
|
+
outline: OUTLINE
|
|
2068
|
+
};
|
|
2069
|
+
function Badge({
|
|
2070
|
+
variant = "subtle",
|
|
2071
|
+
tone = "neutral",
|
|
2072
|
+
size = "md",
|
|
2073
|
+
className,
|
|
2074
|
+
children
|
|
2075
|
+
}) {
|
|
2076
|
+
return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: cn(BASE, SIZES[size], VARIANTS[variant][tone], className), children });
|
|
2077
|
+
}
|
|
2078
|
+
|
|
2079
|
+
// src/components/artifacts/deck-artifact/deck-artifact.tsx
|
|
2041
2080
|
init_capture_exclude_attribute();
|
|
2042
2081
|
|
|
2043
2082
|
// src/components/artifacts/deck-artifact/deck-artifact-content.tsx
|
|
@@ -2045,23 +2084,23 @@ var import_react16 = require("react");
|
|
|
2045
2084
|
|
|
2046
2085
|
// src/components/ui/table.tsx
|
|
2047
2086
|
var React3 = __toESM(require("react"), 1);
|
|
2048
|
-
var
|
|
2049
|
-
var Table = React3.forwardRef(({ className, containerClassName, ...props }, ref) => /* @__PURE__ */ (0,
|
|
2087
|
+
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
2088
|
+
var Table = React3.forwardRef(({ className, containerClassName, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: cn("relative w-full overflow-auto", containerClassName), children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("table", { ref, className: cn("w-full caption-bottom text-sm", className), ...props }) }));
|
|
2050
2089
|
Table.displayName = "Table";
|
|
2051
2090
|
var TableHeader = React3.forwardRef(
|
|
2052
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
2091
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("thead", { ref, className: cn("[&_tr]:border-b", className), ...props })
|
|
2053
2092
|
);
|
|
2054
2093
|
TableHeader.displayName = "TableHeader";
|
|
2055
2094
|
var TableBody = React3.forwardRef(
|
|
2056
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
2095
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props })
|
|
2057
2096
|
);
|
|
2058
2097
|
TableBody.displayName = "TableBody";
|
|
2059
2098
|
var TableFooter = React3.forwardRef(
|
|
2060
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
2099
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("tfoot", { ref, className: cn("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", className), ...props })
|
|
2061
2100
|
);
|
|
2062
2101
|
TableFooter.displayName = "TableFooter";
|
|
2063
2102
|
var TableRow = React3.forwardRef(
|
|
2064
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
2103
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
2065
2104
|
"tr",
|
|
2066
2105
|
{
|
|
2067
2106
|
ref,
|
|
@@ -2072,7 +2111,7 @@ var TableRow = React3.forwardRef(
|
|
|
2072
2111
|
);
|
|
2073
2112
|
TableRow.displayName = "TableRow";
|
|
2074
2113
|
var TableHead = React3.forwardRef(
|
|
2075
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
2114
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
|
|
2076
2115
|
"th",
|
|
2077
2116
|
{
|
|
2078
2117
|
ref,
|
|
@@ -2086,11 +2125,11 @@ var TableHead = React3.forwardRef(
|
|
|
2086
2125
|
);
|
|
2087
2126
|
TableHead.displayName = "TableHead";
|
|
2088
2127
|
var TableCell = React3.forwardRef(
|
|
2089
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
2128
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("td", { ref, className: cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className), ...props })
|
|
2090
2129
|
);
|
|
2091
2130
|
TableCell.displayName = "TableCell";
|
|
2092
2131
|
var TableCaption = React3.forwardRef(
|
|
2093
|
-
({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
2132
|
+
({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("caption", { ref, className: cn("mt-4 text-sm text-muted-foreground", className), ...props })
|
|
2094
2133
|
);
|
|
2095
2134
|
TableCaption.displayName = "TableCaption";
|
|
2096
2135
|
|
|
@@ -2121,21 +2160,21 @@ function useScrollShadow() {
|
|
|
2121
2160
|
}
|
|
2122
2161
|
|
|
2123
2162
|
// src/components/table/data-table.tsx
|
|
2124
|
-
var
|
|
2163
|
+
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
2125
2164
|
var DATA_TABLE_HEAD_CLASS = "h-auto py-2 px-4 text-xs font-medium text-foreground whitespace-nowrap text-left";
|
|
2126
2165
|
var DATA_TABLE_CELL_CLASS = "p-4 text-sm font-normal text-foreground align-top min-w-[150px] text-left";
|
|
2127
2166
|
var DATA_TABLE_ROW_CLASS = "border-b-brown-30 bg-background/70 hover:bg-secondary";
|
|
2128
2167
|
var DATA_TABLE_SCROLL_SHADOW = "0 1px 2px rgb(0 0 0 / 0.01), 0 6px 12px -2px rgb(0 0 0 / 0.03)";
|
|
2129
2168
|
function DataTable({ header, children, maxBodyHeight, className }) {
|
|
2130
2169
|
const { targetRef, isScrolled } = useScrollShadow();
|
|
2131
|
-
return /* @__PURE__ */ (0,
|
|
2170
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
2132
2171
|
"div",
|
|
2133
2172
|
{
|
|
2134
2173
|
ref: targetRef,
|
|
2135
2174
|
className: cn("overscroll-none", className),
|
|
2136
2175
|
style: maxBodyHeight !== void 0 ? { maxHeight: maxBodyHeight, overflowY: "auto" } : void 0,
|
|
2137
|
-
children: /* @__PURE__ */ (0,
|
|
2138
|
-
/* @__PURE__ */ (0,
|
|
2176
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(Table, { containerClassName: "overflow-visible", children: [
|
|
2177
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
2139
2178
|
TableHeader,
|
|
2140
2179
|
{
|
|
2141
2180
|
"data-scrolled": isScrolled ? "true" : void 0,
|
|
@@ -2144,7 +2183,7 @@ function DataTable({ header, children, maxBodyHeight, className }) {
|
|
|
2144
2183
|
children: header
|
|
2145
2184
|
}
|
|
2146
2185
|
),
|
|
2147
|
-
/* @__PURE__ */ (0,
|
|
2186
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(TableBody, { children })
|
|
2148
2187
|
] })
|
|
2149
2188
|
}
|
|
2150
2189
|
);
|
|
@@ -2165,7 +2204,7 @@ function formatCell(row, column) {
|
|
|
2165
2204
|
var DATA_ROW_CLASSES = `${DATA_TABLE_ROW_CLASS} animate-in fade-in duration-300`;
|
|
2166
2205
|
|
|
2167
2206
|
// src/components/artifacts/table-artifact/table-artifact-content.tsx
|
|
2168
|
-
var
|
|
2207
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
2169
2208
|
function TableArtifactContent({
|
|
2170
2209
|
columns,
|
|
2171
2210
|
data,
|
|
@@ -2175,45 +2214,45 @@ function TableArtifactContent({
|
|
|
2175
2214
|
labels
|
|
2176
2215
|
}) {
|
|
2177
2216
|
if (data.status === TABLE_STATUS.ERROR) {
|
|
2178
|
-
return /* @__PURE__ */ (0,
|
|
2217
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StatusMessage, { $tone: "error", children: labels.loadError });
|
|
2179
2218
|
}
|
|
2180
2219
|
if (data.status === TABLE_STATUS.UNAVAILABLE) {
|
|
2181
|
-
return /* @__PURE__ */ (0,
|
|
2220
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StatusMessage, { $tone: "info", children: labels.unavailable });
|
|
2182
2221
|
}
|
|
2183
2222
|
if (data.status === TABLE_STATUS.LOADING) {
|
|
2184
2223
|
if (typeof knownRowCount === "number" && knownRowCount > 0) {
|
|
2185
2224
|
const shimmerCount = Math.min(knownRowCount, maxShimmerRows);
|
|
2186
|
-
return /* @__PURE__ */ (0,
|
|
2225
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ArtifactTable, { columns, maxBodyHeight, children: renderShimmerRows(columns, shimmerCount) });
|
|
2187
2226
|
}
|
|
2188
|
-
return /* @__PURE__ */ (0,
|
|
2227
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StatusMessage, { $tone: "info", children: labels.loading });
|
|
2189
2228
|
}
|
|
2190
|
-
return /* @__PURE__ */ (0,
|
|
2229
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ArtifactTable, { columns, maxBodyHeight, children: data.rows.length === 0 ? renderEmptyRow(columns.length, labels.empty) : renderDataRows(columns, data.rows) });
|
|
2191
2230
|
}
|
|
2192
2231
|
function ArtifactTable({ columns, maxBodyHeight, children }) {
|
|
2193
|
-
return /* @__PURE__ */ (0,
|
|
2232
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
2194
2233
|
DataTable,
|
|
2195
2234
|
{
|
|
2196
2235
|
maxBodyHeight,
|
|
2197
|
-
header: /* @__PURE__ */ (0,
|
|
2236
|
+
header: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(TableRow, { className: "hover:bg-transparent", children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(TableHead, { scope: "col", className: DATA_TABLE_HEAD_CLASS, children: column.label }, column.key)) }),
|
|
2198
2237
|
children
|
|
2199
2238
|
}
|
|
2200
2239
|
);
|
|
2201
2240
|
}
|
|
2202
2241
|
function renderShimmerRows(columns, count) {
|
|
2203
|
-
return Array.from({ length: count }).map((_, index) => /* @__PURE__ */ (0,
|
|
2242
|
+
return Array.from({ length: count }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(TableRow, { className: DATA_TABLE_ROW_CLASS, "aria-hidden": "true", children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(TableCell, { className: DATA_TABLE_CELL_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "block h-3 w-3/4 animate-pulse rounded bg-muted-foreground/20" }) }, column.key)) }, `shimmer-${index}`));
|
|
2204
2243
|
}
|
|
2205
2244
|
function renderDataRows(columns, rows) {
|
|
2206
|
-
return rows.map((row, index) => /* @__PURE__ */ (0,
|
|
2245
|
+
return rows.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(TableRow, { className: DATA_ROW_CLASSES, children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(TableCell, { className: DATA_TABLE_CELL_CLASS, children: formatCell(row, column) }, column.key)) }, index));
|
|
2207
2246
|
}
|
|
2208
2247
|
function renderEmptyRow(colSpan, emptyMessage) {
|
|
2209
|
-
return /* @__PURE__ */ (0,
|
|
2248
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(TableRow, { className: "hover:bg-transparent", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(TableCell, { colSpan, className: "py-6 text-center text-sm text-muted-foreground", children: emptyMessage }) });
|
|
2210
2249
|
}
|
|
2211
2250
|
|
|
2212
2251
|
// src/components/artifacts/deck-artifact/deck-markdown.tsx
|
|
2213
2252
|
var import_react_markdown = __toESM(require("react-markdown"), 1);
|
|
2214
2253
|
var import_remark_breaks = __toESM(require("remark-breaks"), 1);
|
|
2215
2254
|
var import_remark_gfm = __toESM(require("remark-gfm"), 1);
|
|
2216
|
-
var
|
|
2255
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
2217
2256
|
function sanitize(text) {
|
|
2218
2257
|
return text.split("\n").filter((line) => {
|
|
2219
2258
|
const t = line.trim();
|
|
@@ -2221,45 +2260,45 @@ function sanitize(text) {
|
|
|
2221
2260
|
}).join("\n");
|
|
2222
2261
|
}
|
|
2223
2262
|
var MARKDOWN_COMPONENTS = {
|
|
2224
|
-
h1: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2225
|
-
h2: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2226
|
-
h3: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2227
|
-
h4: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2228
|
-
h5: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2229
|
-
h6: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2230
|
-
p: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2231
|
-
ul: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2232
|
-
ol: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2263
|
+
h1: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h1", { className: "text-[30px] font-semibold leading-tight text-foreground mb-3", ...props }),
|
|
2264
|
+
h2: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h2", { className: "text-[26px] font-semibold leading-tight text-foreground mb-2", ...props }),
|
|
2265
|
+
h3: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h3", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
|
|
2266
|
+
h4: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h4", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
|
|
2267
|
+
h5: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h5", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
|
|
2268
|
+
h6: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h6", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
|
|
2269
|
+
p: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-[22px] leading-relaxed text-foreground my-2", ...props }),
|
|
2270
|
+
ul: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("ul", { className: "list-disc pl-7 text-[22px] leading-relaxed text-foreground my-2", ...props }),
|
|
2271
|
+
ol: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("ol", { className: "list-decimal pl-7 text-[22px] leading-relaxed text-foreground my-2", ...props }),
|
|
2233
2272
|
// react-markdown injects list metadata (`ordered` / `index` / `checked`) that must not leak to the DOM.
|
|
2234
|
-
li: ({ node: _node, ordered: _ordered, index: _index, checked: _checked, ...props }) => /* @__PURE__ */ (0,
|
|
2235
|
-
strong: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2236
|
-
em: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2273
|
+
li: ({ node: _node, ordered: _ordered, index: _index, checked: _checked, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("li", { className: "my-1", ...props }),
|
|
2274
|
+
strong: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("strong", { className: "font-semibold", ...props }),
|
|
2275
|
+
em: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("em", { className: "italic", ...props }),
|
|
2237
2276
|
// Gate `<img src>` against an http(s) allowlist. react-markdown v8 percent-encodes the URL but
|
|
2238
2277
|
// does NOT protocol-filter image src (unlike link href), so an LLM-authored
|
|
2239
2278
|
// `` / `` or a tracking-pixel `` would otherwise render
|
|
2240
2279
|
// with the raw URL. Unsafe src → render nothing.
|
|
2241
|
-
img: ({ node: _node, src, ...props }) => typeof src === "string" && isSafeDownloadUrl(src) ? /* @__PURE__ */ (0,
|
|
2280
|
+
img: ({ node: _node, src, ...props }) => typeof src === "string" && isSafeDownloadUrl(src) ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("img", { src, className: "max-w-full", ...props }) : null,
|
|
2242
2281
|
a: ({ node: _node, ...props }) => (
|
|
2243
2282
|
// `rel` is forced AFTER `{...props}` so it can't be overridden — if a consumer ever adds
|
|
2244
2283
|
// `linkTarget="_blank"`, LLM-authored links still can't reach `window.opener`.
|
|
2245
|
-
/* @__PURE__ */ (0,
|
|
2284
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("a", { className: "underline underline-offset-2", ...props, rel: "noopener noreferrer" })
|
|
2246
2285
|
),
|
|
2247
2286
|
// react-markdown passes `inline` to distinguish inline code from fenced blocks — strip it from the DOM.
|
|
2248
|
-
code: ({ node: _node, inline: _inline, ...props }) => /* @__PURE__ */ (0,
|
|
2249
|
-
blockquote: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2250
|
-
hr: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2251
|
-
table: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2287
|
+
code: ({ node: _node, inline: _inline, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("code", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-[18px]", ...props }),
|
|
2288
|
+
blockquote: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("blockquote", { className: "border-l-2 border-brown-alpha-12 pl-4 text-[22px] text-muted-foreground", ...props }),
|
|
2289
|
+
hr: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("hr", { className: "my-4 border-brown-alpha-12", ...props }),
|
|
2290
|
+
table: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "overflow-x-auto", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("table", { className: "w-full border-collapse text-[20px]", ...props }) }),
|
|
2252
2291
|
// react-markdown passes `isHeader` to cell renderers — strip it so it never reaches the DOM.
|
|
2253
|
-
th: ({ node: _node, isHeader: _isHeader, ...props }) => /* @__PURE__ */ (0,
|
|
2254
|
-
td: ({ node: _node, isHeader: _isHeader, ...props }) => /* @__PURE__ */ (0,
|
|
2292
|
+
th: ({ node: _node, isHeader: _isHeader, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("th", { className: "border-b border-brown-alpha-12 px-3 py-1.5 text-left font-medium", ...props }),
|
|
2293
|
+
td: ({ node: _node, isHeader: _isHeader, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("td", { className: "border-b border-brown-alpha-12 px-3 py-1.5", ...props })
|
|
2255
2294
|
};
|
|
2256
2295
|
function DeckMarkdown({ markdown }) {
|
|
2257
|
-
return /* @__PURE__ */ (0,
|
|
2296
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_react_markdown.default, { remarkPlugins: [import_remark_gfm.default, import_remark_breaks.default], components: MARKDOWN_COMPONENTS, children: sanitize(markdown) });
|
|
2258
2297
|
}
|
|
2259
2298
|
|
|
2260
2299
|
// src/components/artifacts/deck-artifact/slide-renderers.tsx
|
|
2261
2300
|
var import_react15 = require("react");
|
|
2262
|
-
var
|
|
2301
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
2263
2302
|
function safeLogoUrl(meta) {
|
|
2264
2303
|
return meta?.logoUrl && isSafeDownloadUrl(meta.logoUrl) ? meta.logoUrl : null;
|
|
2265
2304
|
}
|
|
@@ -2286,7 +2325,7 @@ function SlideFrame({ meta, children, accent = false, bare = false }) {
|
|
|
2286
2325
|
const eyebrowColor = accent ? "text-white/70" : "text-brown-60";
|
|
2287
2326
|
const borderColor = accent ? "border-white/20" : "border-brown-alpha-12";
|
|
2288
2327
|
const logoSrc = safeLogoUrl(meta);
|
|
2289
|
-
return /* @__PURE__ */ (0,
|
|
2328
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { ref: frameRef, className: `relative aspect-[16/9] w-full overflow-hidden rounded-lg ${bg}`, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
|
|
2290
2329
|
"div",
|
|
2291
2330
|
{
|
|
2292
2331
|
className: "absolute left-0 top-0 origin-top-left",
|
|
@@ -2297,26 +2336,26 @@ function SlideFrame({ meta, children, accent = false, bare = false }) {
|
|
|
2297
2336
|
visibility: scale === null ? "hidden" : "visible"
|
|
2298
2337
|
},
|
|
2299
2338
|
children: [
|
|
2300
|
-
!bare ? /* @__PURE__ */ (0,
|
|
2339
|
+
!bare ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
|
|
2301
2340
|
"div",
|
|
2302
2341
|
{
|
|
2303
2342
|
className: `absolute inset-x-0 top-0 flex items-center justify-between border-b px-16 ${borderColor}`,
|
|
2304
2343
|
style: { height: EYEBROW_H },
|
|
2305
2344
|
children: [
|
|
2306
|
-
meta?.eyebrow ? /* @__PURE__ */ (0,
|
|
2307
|
-
logoSrc ? /* @__PURE__ */ (0,
|
|
2345
|
+
meta?.eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: eyebrowColor, style: { ...ACCENT_FONT, fontSize: 22 }, children: meta.eyebrow }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", {}),
|
|
2346
|
+
logoSrc ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("img", { src: logoSrc, alt: "", className: "object-contain", style: { maxHeight: CANVAS_LOGO_MAX_H } }) : null
|
|
2308
2347
|
]
|
|
2309
2348
|
}
|
|
2310
2349
|
) : null,
|
|
2311
|
-
/* @__PURE__ */ (0,
|
|
2350
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "absolute inset-x-0 bottom-0 overflow-hidden", style: { top: bare ? 0 : EYEBROW_H }, children })
|
|
2312
2351
|
]
|
|
2313
2352
|
}
|
|
2314
2353
|
) });
|
|
2315
2354
|
}
|
|
2316
2355
|
function TitleSlide({ slide, meta }) {
|
|
2317
2356
|
const logoSrc = safeLogoUrl(meta);
|
|
2318
|
-
return /* @__PURE__ */ (0,
|
|
2319
|
-
logoSrc ? /* @__PURE__ */ (0,
|
|
2357
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SlideFrame, { meta, bare: true, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex h-full flex-col justify-center px-24 py-16", children: [
|
|
2358
|
+
logoSrc ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
2320
2359
|
"img",
|
|
2321
2360
|
{
|
|
2322
2361
|
src: logoSrc,
|
|
@@ -2325,7 +2364,7 @@ function TitleSlide({ slide, meta }) {
|
|
|
2325
2364
|
style: { maxHeight: 56, maxWidth: 380 }
|
|
2326
2365
|
}
|
|
2327
2366
|
) : null,
|
|
2328
|
-
/* @__PURE__ */ (0,
|
|
2367
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
2329
2368
|
"h1",
|
|
2330
2369
|
{
|
|
2331
2370
|
className: "font-bold tracking-tight text-brown-100",
|
|
@@ -2333,36 +2372,36 @@ function TitleSlide({ slide, meta }) {
|
|
|
2333
2372
|
children: slide.title
|
|
2334
2373
|
}
|
|
2335
2374
|
),
|
|
2336
|
-
slide.subtitle ? /* @__PURE__ */ (0,
|
|
2337
|
-
slide.description ? /* @__PURE__ */ (0,
|
|
2338
|
-
meta?.date ? /* @__PURE__ */ (0,
|
|
2375
|
+
slide.subtitle ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "mt-7 text-brown-70", style: { ...ACCENT_FONT, fontSize: 34 }, children: slide.subtitle }) : null,
|
|
2376
|
+
slide.description ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "mt-4 leading-relaxed text-brown-70", style: { fontSize: 24, maxWidth: 880 }, children: slide.description }) : null,
|
|
2377
|
+
meta?.date ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "mt-10 text-brown-70", style: { ...ACCENT_FONT, fontSize: 30 }, children: meta.date }) : null
|
|
2339
2378
|
] }) });
|
|
2340
2379
|
}
|
|
2341
2380
|
function AgendaSlide({ slide, meta, labels }) {
|
|
2342
2381
|
const items = slide.items ?? [];
|
|
2343
|
-
return /* @__PURE__ */ (0,
|
|
2344
|
-
/* @__PURE__ */ (0,
|
|
2345
|
-
/* @__PURE__ */ (0,
|
|
2346
|
-
/* @__PURE__ */ (0,
|
|
2347
|
-
/* @__PURE__ */ (0,
|
|
2382
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "h-full px-24 py-14", children: [
|
|
2383
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h2", { className: "mb-10 font-bold text-brown-90", style: { fontSize: 40 }, children: slide.title || labels.agenda }),
|
|
2384
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "flex flex-col", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-baseline gap-6 border-b border-brown-alpha-12 py-5", children: [
|
|
2385
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "shrink-0 text-indigo-600", style: { ...ACCENT_FONT, fontSize: 28, width: 64 }, children: String(i + 1).padStart(2, "0") }),
|
|
2386
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "text-brown-90", style: { fontSize: 28 }, children: item })
|
|
2348
2387
|
] }, i)) })
|
|
2349
2388
|
] }) });
|
|
2350
2389
|
}
|
|
2351
2390
|
function SectionSlide({ slide, meta }) {
|
|
2352
|
-
return /* @__PURE__ */ (0,
|
|
2353
|
-
/* @__PURE__ */ (0,
|
|
2354
|
-
/* @__PURE__ */ (0,
|
|
2391
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SlideFrame, { meta, accent: true, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex h-full flex-col justify-center gap-6 px-24", children: [
|
|
2392
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h2", { className: "font-bold text-white", style: { fontSize: 72, lineHeight: 1.05, maxWidth: 940 }, children: slide.title }),
|
|
2393
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "mt-2 bg-white/50", style: { width: 96, height: 5 } })
|
|
2355
2394
|
] }) });
|
|
2356
2395
|
}
|
|
2357
2396
|
function ClosingSlide({ meta, labels }) {
|
|
2358
|
-
return /* @__PURE__ */ (0,
|
|
2359
|
-
/* @__PURE__ */ (0,
|
|
2360
|
-
/* @__PURE__ */ (0,
|
|
2397
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex h-full flex-col items-center justify-center gap-6 px-24 text-center", children: [
|
|
2398
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h1", { className: "font-bold text-brown-100", style: { fontSize: 72 }, children: labels.thankYou }),
|
|
2399
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "text-indigo-600", style: { ...ACCENT_FONT, fontSize: 36 }, children: labels.questions })
|
|
2361
2400
|
] }) });
|
|
2362
2401
|
}
|
|
2363
2402
|
|
|
2364
2403
|
// src/components/artifacts/deck-artifact/deck-artifact-content.tsx
|
|
2365
|
-
var
|
|
2404
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
2366
2405
|
var TABLE_BLOCK_MAX_SHIMMER_ROWS = 10;
|
|
2367
2406
|
var TABLE_CHROME_RESERVE = 56;
|
|
2368
2407
|
var VISUAL_FALLBACK_HEIGHT = 360;
|
|
@@ -2392,14 +2431,14 @@ function DeckArtifactContent({
|
|
|
2392
2431
|
[slides.length, onNavigate, isControlled, onSlideChange]
|
|
2393
2432
|
);
|
|
2394
2433
|
const position = labels.position.replace("{current}", String(current + 1)).replace("{total}", String(slides.length));
|
|
2395
|
-
return /* @__PURE__ */ (0,
|
|
2396
|
-
/* @__PURE__ */ (0,
|
|
2397
|
-
/* @__PURE__ */ (0,
|
|
2434
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex flex-col gap-3 p-4", children: [
|
|
2435
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SlideDispatch, { slide, labels, meta }),
|
|
2436
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
|
|
2398
2437
|
"div",
|
|
2399
2438
|
{
|
|
2400
2439
|
className: `flex items-center justify-between border-t pt-2 ${onDark ? "border-white/20" : "border-brown-alpha-12"}`,
|
|
2401
2440
|
children: [
|
|
2402
|
-
/* @__PURE__ */ (0,
|
|
2441
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
2403
2442
|
IconButton,
|
|
2404
2443
|
{
|
|
2405
2444
|
icon: IconChevronLeft,
|
|
@@ -2410,8 +2449,8 @@ function DeckArtifactContent({
|
|
|
2410
2449
|
onClick: () => goTo(current - 1)
|
|
2411
2450
|
}
|
|
2412
2451
|
),
|
|
2413
|
-
/* @__PURE__ */ (0,
|
|
2414
|
-
/* @__PURE__ */ (0,
|
|
2452
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: `text-xs font-medium ${onDark ? "text-white/70" : "text-brown-70"}`, children: position }),
|
|
2453
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
2415
2454
|
IconButton,
|
|
2416
2455
|
{
|
|
2417
2456
|
icon: IconChevronRight,
|
|
@@ -2431,16 +2470,16 @@ function SlideDispatch({ slide, labels, meta }) {
|
|
|
2431
2470
|
const kind = slide.kind ?? deckSlideKinds.CONTENT;
|
|
2432
2471
|
switch (kind) {
|
|
2433
2472
|
case deckSlideKinds.TITLE:
|
|
2434
|
-
return /* @__PURE__ */ (0,
|
|
2473
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(TitleSlide, { slide, meta });
|
|
2435
2474
|
case deckSlideKinds.AGENDA:
|
|
2436
|
-
return /* @__PURE__ */ (0,
|
|
2475
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(AgendaSlide, { slide, meta, labels });
|
|
2437
2476
|
case deckSlideKinds.SECTION:
|
|
2438
|
-
return /* @__PURE__ */ (0,
|
|
2477
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SectionSlide, { slide, meta });
|
|
2439
2478
|
case deckSlideKinds.CLOSING:
|
|
2440
|
-
return /* @__PURE__ */ (0,
|
|
2479
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ClosingSlide, { meta, labels });
|
|
2441
2480
|
case deckSlideKinds.CONTENT:
|
|
2442
2481
|
default:
|
|
2443
|
-
return /* @__PURE__ */ (0,
|
|
2482
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ContentSlide, { slide, meta, labels });
|
|
2444
2483
|
}
|
|
2445
2484
|
}
|
|
2446
2485
|
function isVisualBlock(block) {
|
|
@@ -2453,25 +2492,25 @@ function ContentSlide({ slide, meta, labels }) {
|
|
|
2453
2492
|
(b) => b.type === deckBlockTypes.TEXT
|
|
2454
2493
|
);
|
|
2455
2494
|
if (visuals.length === 1 && texts.length > 0) {
|
|
2456
|
-
return /* @__PURE__ */ (0,
|
|
2457
|
-
/* @__PURE__ */ (0,
|
|
2458
|
-
/* @__PURE__ */ (0,
|
|
2459
|
-
texts.map((block, i) => /* @__PURE__ */ (0,
|
|
2495
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex h-full items-stretch gap-12 px-16 py-12", children: [
|
|
2496
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "flex w-[42%] shrink-0 flex-col overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(AutoFit, { children: [
|
|
2497
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("h3", { className: "mb-5 font-bold leading-tight text-foreground", style: { fontSize: 34 }, children: slide.title }),
|
|
2498
|
+
texts.map((block, i) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(DeckMarkdown, { markdown: block.markdown }, i))
|
|
2460
2499
|
] }) }),
|
|
2461
|
-
/* @__PURE__ */ (0,
|
|
2500
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "min-h-0 min-w-0 flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(FillVisual, { block: visuals[0], labels }) })
|
|
2462
2501
|
] }) });
|
|
2463
2502
|
}
|
|
2464
2503
|
if (visuals.length > 0) {
|
|
2465
|
-
return /* @__PURE__ */ (0,
|
|
2466
|
-
/* @__PURE__ */ (0,
|
|
2504
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex h-full flex-col gap-5 px-16 py-10", children: [
|
|
2505
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("h3", { className: "shrink-0 font-bold leading-tight text-foreground", style: { fontSize: 32 }, children: slide.title }),
|
|
2467
2506
|
content.map(
|
|
2468
|
-
(block, i) => isVisualBlock(block) ? /* @__PURE__ */ (0,
|
|
2507
|
+
(block, i) => isVisualBlock(block) ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "min-h-0 min-w-0 flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(FillVisual, { block, labels }) }, i) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "shrink-0 overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(DeckMarkdown, { markdown: block.markdown }) }, i)
|
|
2469
2508
|
)
|
|
2470
2509
|
] }) });
|
|
2471
2510
|
}
|
|
2472
|
-
return /* @__PURE__ */ (0,
|
|
2473
|
-
/* @__PURE__ */ (0,
|
|
2474
|
-
texts.map((block, i) => /* @__PURE__ */ (0,
|
|
2511
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "h-full px-24 py-12", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(AutoFit, { children: [
|
|
2512
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)("h3", { className: "mb-6 font-bold leading-tight text-foreground", style: { fontSize: 38 }, children: slide.title }),
|
|
2513
|
+
texts.map((block, i) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(DeckMarkdown, { markdown: block.markdown }, i))
|
|
2475
2514
|
] }) }) });
|
|
2476
2515
|
}
|
|
2477
2516
|
function AutoFit({ children }) {
|
|
@@ -2495,7 +2534,7 @@ function AutoFit({ children }) {
|
|
|
2495
2534
|
return () => ro.disconnect();
|
|
2496
2535
|
}, []);
|
|
2497
2536
|
const scaled = fit.scale < 1;
|
|
2498
|
-
return /* @__PURE__ */ (0,
|
|
2537
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { ref: boxRef, className: "flex h-full min-h-0 w-full flex-col justify-center overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { style: scaled ? { height: fit.height } : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
2499
2538
|
"div",
|
|
2500
2539
|
{
|
|
2501
2540
|
ref: contentRef,
|
|
@@ -2520,12 +2559,12 @@ function FillVisual({ block, labels }) {
|
|
|
2520
2559
|
return () => ro.disconnect();
|
|
2521
2560
|
}, []);
|
|
2522
2561
|
const chartLabels = labels.chart ?? DEFAULT_CHART_ARTIFACT_LABELS;
|
|
2523
|
-
return /* @__PURE__ */ (0,
|
|
2562
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { ref, className: "h-full min-h-0 w-full overflow-hidden", children: block.type === deckBlockTypes.CHART ? (
|
|
2524
2563
|
// ChartArtifactContent assumes a non-empty rowset (the standalone ChartArtifact guards
|
|
2525
2564
|
// `rows.length > 0` upstream); mirror that guard here so an empty inline chart shows the
|
|
2526
2565
|
// localized empty status instead of a blank chart area.
|
|
2527
|
-
block.rows.length === 0 ? /* @__PURE__ */ (0,
|
|
2528
|
-
) : /* @__PURE__ */ (0,
|
|
2566
|
+
block.rows.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(StatusMessage, { $tone: "info", children: chartLabels.empty }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { style: { height }, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ChartArtifactContent, { config: block.config, rows: block.rows, labels: chartLabels }) })
|
|
2567
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
2529
2568
|
TableArtifactContent,
|
|
2530
2569
|
{
|
|
2531
2570
|
columns: block.config.columns,
|
|
@@ -2591,7 +2630,7 @@ function isValidDeckBlock(block) {
|
|
|
2591
2630
|
}
|
|
2592
2631
|
|
|
2593
2632
|
// src/components/artifacts/deck-artifact/deck-artifact.tsx
|
|
2594
|
-
var
|
|
2633
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
2595
2634
|
var TITLE_CLASSES2 = "text-sm font-semibold text-foreground";
|
|
2596
2635
|
function DeckArtifact({ artifact, labels, callbacks }) {
|
|
2597
2636
|
const validConfig = isValidDeckConfig(artifact.config);
|
|
@@ -2632,9 +2671,9 @@ function DeckArtifact({ artifact, labels, callbacks }) {
|
|
|
2632
2671
|
const meta = artifact.config?.meta;
|
|
2633
2672
|
const handleOpenFullscreen = () => setIsFullscreen(true);
|
|
2634
2673
|
const handleCloseFullscreen = () => setIsFullscreen(false);
|
|
2635
|
-
const actions = /* @__PURE__ */ (0,
|
|
2636
|
-
showDownload ? /* @__PURE__ */ (0,
|
|
2637
|
-
validConfig ? /* @__PURE__ */ (0,
|
|
2674
|
+
const actions = /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ArtifactActions, { ...{ [CAPTURE_EXCLUDE_ATTRIBUTE]: "" }, children: [
|
|
2675
|
+
showDownload ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactDownloadButton, { href: presignedUrl ?? "", label: resolvedLabels.download, onClick: handleDownload }) : null,
|
|
2676
|
+
validConfig ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2638
2677
|
IconButton,
|
|
2639
2678
|
{
|
|
2640
2679
|
icon: IconArrowsMaximize,
|
|
@@ -2644,22 +2683,29 @@ function DeckArtifact({ artifact, labels, callbacks }) {
|
|
|
2644
2683
|
}
|
|
2645
2684
|
) : null
|
|
2646
2685
|
] });
|
|
2686
|
+
const heading = /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
2687
|
+
artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactTitle, { className: TITLE_CLASSES2, children: artifact.title }) : null,
|
|
2688
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Badge, { tone: "violet", variant: "subtle", size: "sm", className: "gap-1 py-1", children: [
|
|
2689
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Icon, { icon: IconFlask2Filled, size: 12 }),
|
|
2690
|
+
"Labs"
|
|
2691
|
+
] })
|
|
2692
|
+
] });
|
|
2647
2693
|
if (!validConfig) {
|
|
2648
|
-
return /* @__PURE__ */ (0,
|
|
2649
|
-
/* @__PURE__ */ (0,
|
|
2650
|
-
|
|
2694
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
|
|
2695
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
|
|
2696
|
+
heading,
|
|
2651
2697
|
actions
|
|
2652
2698
|
] }),
|
|
2653
|
-
/* @__PURE__ */ (0,
|
|
2699
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(StatusMessage, { $tone: "info", children: resolvedLabels.unavailable }) })
|
|
2654
2700
|
] });
|
|
2655
2701
|
}
|
|
2656
|
-
return /* @__PURE__ */ (0,
|
|
2657
|
-
/* @__PURE__ */ (0,
|
|
2658
|
-
/* @__PURE__ */ (0,
|
|
2659
|
-
|
|
2702
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
|
|
2703
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
|
|
2704
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
|
|
2705
|
+
heading,
|
|
2660
2706
|
actions
|
|
2661
2707
|
] }),
|
|
2662
|
-
/* @__PURE__ */ (0,
|
|
2708
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2663
2709
|
DeckArtifactContent,
|
|
2664
2710
|
{
|
|
2665
2711
|
slides: artifact.config.slides,
|
|
@@ -2672,7 +2718,7 @@ function DeckArtifact({ artifact, labels, callbacks }) {
|
|
|
2672
2718
|
) })
|
|
2673
2719
|
] }),
|
|
2674
2720
|
isFullscreen && (0, import_react_dom.createPortal)(
|
|
2675
|
-
/* @__PURE__ */ (0,
|
|
2721
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2676
2722
|
FullscreenOverlay,
|
|
2677
2723
|
{
|
|
2678
2724
|
artifact,
|
|
@@ -2696,15 +2742,15 @@ function FullscreenOverlay({
|
|
|
2696
2742
|
onClose
|
|
2697
2743
|
}) {
|
|
2698
2744
|
const meta = artifact.config?.meta;
|
|
2699
|
-
return /* @__PURE__ */ (0,
|
|
2745
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2700
2746
|
"div",
|
|
2701
2747
|
{
|
|
2702
2748
|
className: "fixed inset-0 z-[2147483647] flex items-center justify-center bg-black/80",
|
|
2703
2749
|
role: "dialog",
|
|
2704
2750
|
"aria-modal": "true",
|
|
2705
2751
|
"aria-label": resolvedLabels.exitFullscreen,
|
|
2706
|
-
children: /* @__PURE__ */ (0,
|
|
2707
|
-
/* @__PURE__ */ (0,
|
|
2752
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "relative", style: { width: "min(94vw, calc(82vh * 16 / 9))" }, children: [
|
|
2753
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2708
2754
|
DeckArtifactContent,
|
|
2709
2755
|
{
|
|
2710
2756
|
slides: artifact.config.slides,
|
|
@@ -2716,15 +2762,15 @@ function FullscreenOverlay({
|
|
|
2716
2762
|
onDark: true
|
|
2717
2763
|
}
|
|
2718
2764
|
),
|
|
2719
|
-
/* @__PURE__ */ (0,
|
|
2765
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
2720
2766
|
"button",
|
|
2721
2767
|
{
|
|
2722
2768
|
className: "absolute -top-10 right-6 flex items-center gap-1.5 text-sm text-white/80 hover:text-white",
|
|
2723
2769
|
"aria-label": resolvedLabels.exitFullscreen,
|
|
2724
2770
|
onClick: onClose,
|
|
2725
2771
|
children: [
|
|
2726
|
-
/* @__PURE__ */ (0,
|
|
2727
|
-
/* @__PURE__ */ (0,
|
|
2772
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(IconArrowsMinimize, { size: 16 }),
|
|
2773
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: resolvedLabels.exitFullscreen })
|
|
2728
2774
|
]
|
|
2729
2775
|
}
|
|
2730
2776
|
)
|
|
@@ -2801,7 +2847,7 @@ function useTableArtifactData(presignedUrl, columns) {
|
|
|
2801
2847
|
}
|
|
2802
2848
|
|
|
2803
2849
|
// src/components/artifacts/table-artifact/table-artifact.tsx
|
|
2804
|
-
var
|
|
2850
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
2805
2851
|
var TITLE_CLASSES3 = "text-sm font-semibold text-foreground";
|
|
2806
2852
|
var TABLE_MAX_BODY_HEIGHT = 480;
|
|
2807
2853
|
var MAX_SHIMMER_ROWS = 10;
|
|
@@ -2824,10 +2870,10 @@ function TableArtifact({ artifact, labels, callbacks }) {
|
|
|
2824
2870
|
const onDownload = callbacks?.onDownload;
|
|
2825
2871
|
const handleDownloadClick = onDownload ? () => onDownload(artifact) : void 0;
|
|
2826
2872
|
if (!validConfig || !validColumns) {
|
|
2827
|
-
return /* @__PURE__ */ (0,
|
|
2828
|
-
/* @__PURE__ */ (0,
|
|
2829
|
-
artifact.title ? /* @__PURE__ */ (0,
|
|
2830
|
-
presignedUrl ? /* @__PURE__ */ (0,
|
|
2873
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
|
|
2874
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
|
|
2875
|
+
artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ArtifactTitle, { className: TITLE_CLASSES3, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", {}),
|
|
2876
|
+
presignedUrl ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
2831
2877
|
ArtifactDownloadButton,
|
|
2832
2878
|
{
|
|
2833
2879
|
href: presignedUrl,
|
|
@@ -2836,17 +2882,17 @@ function TableArtifact({ artifact, labels, callbacks }) {
|
|
|
2836
2882
|
}
|
|
2837
2883
|
) }) : null
|
|
2838
2884
|
] }),
|
|
2839
|
-
/* @__PURE__ */ (0,
|
|
2885
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ArtifactContent, { className: "p-0 overflow-auto", style: { maxHeight: TABLE_MAX_BODY_HEIGHT }, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(StatusMessage, { $tone: "info", children: resolvedLabels.unavailable }) })
|
|
2840
2886
|
] });
|
|
2841
2887
|
}
|
|
2842
2888
|
return (
|
|
2843
2889
|
// The table body owns its own scroll container (`ArtifactTable` inside `TableArtifactContent`).
|
|
2844
2890
|
// Disable the outer overflow container so only one scroll context exists — this prevents
|
|
2845
2891
|
// double-scroll nesting and lets `useScrollShadow` find the correct scroll ancestor.
|
|
2846
|
-
/* @__PURE__ */ (0,
|
|
2847
|
-
/* @__PURE__ */ (0,
|
|
2848
|
-
artifact.title ? /* @__PURE__ */ (0,
|
|
2849
|
-
/* @__PURE__ */ (0,
|
|
2892
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
|
|
2893
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
|
|
2894
|
+
artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ArtifactTitle, { className: TITLE_CLASSES3, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", {}),
|
|
2895
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
2850
2896
|
ArtifactDownloadButton,
|
|
2851
2897
|
{
|
|
2852
2898
|
href: presignedUrl ?? "",
|
|
@@ -2855,7 +2901,7 @@ function TableArtifact({ artifact, labels, callbacks }) {
|
|
|
2855
2901
|
}
|
|
2856
2902
|
) })
|
|
2857
2903
|
] }),
|
|
2858
|
-
/* @__PURE__ */ (0,
|
|
2904
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ArtifactContent, { className: "p-0 overflow-visible", style: { maxHeight: "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
2859
2905
|
TableArtifactContent,
|
|
2860
2906
|
{
|
|
2861
2907
|
columns: validColumns,
|
|
@@ -2929,6 +2975,7 @@ function artifactToClipboardText(artifact) {
|
|
|
2929
2975
|
@tabler/icons-react/dist/esm/icons/IconFileSpreadsheet.mjs:
|
|
2930
2976
|
@tabler/icons-react/dist/esm/icons/IconLoader2.mjs:
|
|
2931
2977
|
@tabler/icons-react/dist/esm/icons/IconPhoto.mjs:
|
|
2978
|
+
@tabler/icons-react/dist/esm/icons/IconFlask2Filled.mjs:
|
|
2932
2979
|
@tabler/icons-react/dist/esm/tabler-icons-react.mjs:
|
|
2933
2980
|
(**
|
|
2934
2981
|
* @license @tabler/icons-react v3.37.1 - MIT
|