@shapesos/clay 0.18.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 +207 -139
- package/dist/artifacts.cjs.map +1 -1
- package/dist/artifacts.js +5 -2
- package/dist/badge.cjs +70 -0
- package/dist/badge.cjs.map +1 -0
- package/dist/badge.d.cts +28 -0
- package/dist/badge.d.ts +28 -0
- package/dist/badge.js +9 -0
- package/dist/badge.js.map +1 -0
- package/dist/blocks.cjs +452 -185
- package/dist/blocks.cjs.map +1 -1
- package/dist/blocks.css +1 -1
- package/dist/blocks.d.cts +14 -3
- package/dist/blocks.d.ts +14 -3
- package/dist/blocks.js +17 -5
- package/dist/chat.cjs +457 -240
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.d.cts +1 -1
- package/dist/chat.d.ts +1 -1
- package/dist/chat.js +10 -5
- package/dist/{chunk-JGMN6W72.js → chunk-2X4KUXYP.js} +1 -1
- package/dist/{chunk-QR4VBGK4.js → chunk-63AGNGKG.js} +81 -200
- package/dist/chunk-63AGNGKG.js.map +1 -0
- package/dist/chunk-CSTCTO3B.js +161 -0
- package/dist/chunk-CSTCTO3B.js.map +1 -0
- package/dist/chunk-EIAWZXE4.js +69 -0
- package/dist/chunk-EIAWZXE4.js.map +1 -0
- package/dist/chunk-EXRNGIQ2.js +41 -0
- package/dist/chunk-EXRNGIQ2.js.map +1 -0
- package/dist/{chunk-4MZZH3WX.js → chunk-HU5W7CGE.js} +37 -2
- package/dist/chunk-HU5W7CGE.js.map +1 -0
- package/dist/chunk-PISZYS2H.js +406 -0
- package/dist/chunk-PISZYS2H.js.map +1 -0
- package/dist/{chunk-CATIRDZP.js → chunk-PWSEEUVL.js} +10 -44
- package/dist/chunk-PWSEEUVL.js.map +1 -0
- package/dist/copy-button.cjs +439 -0
- package/dist/copy-button.cjs.map +1 -0
- package/dist/copy-button.d.cts +20 -0
- package/dist/copy-button.d.ts +20 -0
- package/dist/copy-button.js +12 -0
- package/dist/copy-button.js.map +1 -0
- package/dist/index.cjs +533 -298
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +26 -9
- package/dist/table.cjs +40 -0
- package/dist/table.cjs.map +1 -1
- package/dist/table.d.cts +37 -2
- package/dist/table.d.ts +37 -2
- package/dist/table.js +11 -1
- package/dist/{types-BDYPVP2N.d.cts → types-Bhg0_ES8.d.cts} +74 -2
- package/dist/{types-BMwa4bPW.d.ts → types-orOQcI2z.d.ts} +74 -2
- package/package.json +11 -1
- package/dist/chunk-4MZZH3WX.js.map +0 -1
- package/dist/chunk-7MY4X4YL.js +0 -250
- package/dist/chunk-7MY4X4YL.js.map +0 -1
- package/dist/chunk-CATIRDZP.js.map +0 -1
- package/dist/chunk-QR4VBGK4.js.map +0 -1
- /package/dist/{chunk-JGMN6W72.js.map → chunk-2X4KUXYP.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
|
|
|
@@ -2120,6 +2159,36 @@ function useScrollShadow() {
|
|
|
2120
2159
|
return { targetRef, isScrolled };
|
|
2121
2160
|
}
|
|
2122
2161
|
|
|
2162
|
+
// src/components/table/data-table.tsx
|
|
2163
|
+
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
2164
|
+
var DATA_TABLE_HEAD_CLASS = "h-auto py-2 px-4 text-xs font-medium text-foreground whitespace-nowrap text-left";
|
|
2165
|
+
var DATA_TABLE_CELL_CLASS = "p-4 text-sm font-normal text-foreground align-top min-w-[150px] text-left";
|
|
2166
|
+
var DATA_TABLE_ROW_CLASS = "border-b-brown-30 bg-background/70 hover:bg-secondary";
|
|
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)";
|
|
2168
|
+
function DataTable({ header, children, maxBodyHeight, className }) {
|
|
2169
|
+
const { targetRef, isScrolled } = useScrollShadow();
|
|
2170
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
2171
|
+
"div",
|
|
2172
|
+
{
|
|
2173
|
+
ref: targetRef,
|
|
2174
|
+
className: cn("overscroll-none", className),
|
|
2175
|
+
style: maxBodyHeight !== void 0 ? { maxHeight: maxBodyHeight, overflowY: "auto" } : void 0,
|
|
2176
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(Table, { containerClassName: "overflow-visible", children: [
|
|
2177
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
2178
|
+
TableHeader,
|
|
2179
|
+
{
|
|
2180
|
+
"data-scrolled": isScrolled ? "true" : void 0,
|
|
2181
|
+
className: "sticky top-0 z-10 bg-background/70 backdrop-blur-lg transition-shadow",
|
|
2182
|
+
style: isScrolled ? { boxShadow: DATA_TABLE_SCROLL_SHADOW } : void 0,
|
|
2183
|
+
children: header
|
|
2184
|
+
}
|
|
2185
|
+
),
|
|
2186
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(TableBody, { children })
|
|
2187
|
+
] })
|
|
2188
|
+
}
|
|
2189
|
+
);
|
|
2190
|
+
}
|
|
2191
|
+
|
|
2123
2192
|
// src/components/artifacts/table-artifact/table-artifact-content.constants.ts
|
|
2124
2193
|
var TABLE_STATUS = {
|
|
2125
2194
|
LOADING: "loading",
|
|
@@ -2132,14 +2201,10 @@ var TABLE_STATUS = {
|
|
|
2132
2201
|
function formatCell(row, column) {
|
|
2133
2202
|
return row[column.key] ?? "";
|
|
2134
2203
|
}
|
|
2135
|
-
var
|
|
2136
|
-
var CELL_CLASS = "p-4 text-sm font-normal text-foreground align-top min-w-[150px] text-left";
|
|
2137
|
-
var ROW_CLASSES = "border-b-brown-30 bg-background/70 hover:bg-secondary";
|
|
2138
|
-
var DATA_ROW_CLASSES = `${ROW_CLASSES} animate-in fade-in duration-300`;
|
|
2139
|
-
var SCROLL_SHADOW = "0 1px 2px rgb(0 0 0 / 0.01), 0 6px 12px -2px rgb(0 0 0 / 0.03)";
|
|
2204
|
+
var DATA_ROW_CLASSES = `${DATA_TABLE_ROW_CLASS} animate-in fade-in duration-300`;
|
|
2140
2205
|
|
|
2141
2206
|
// src/components/artifacts/table-artifact/table-artifact-content.tsx
|
|
2142
|
-
var
|
|
2207
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
2143
2208
|
function TableArtifactContent({
|
|
2144
2209
|
columns,
|
|
2145
2210
|
data,
|
|
@@ -2149,50 +2214,45 @@ function TableArtifactContent({
|
|
|
2149
2214
|
labels
|
|
2150
2215
|
}) {
|
|
2151
2216
|
if (data.status === TABLE_STATUS.ERROR) {
|
|
2152
|
-
return /* @__PURE__ */ (0,
|
|
2217
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StatusMessage, { $tone: "error", children: labels.loadError });
|
|
2153
2218
|
}
|
|
2154
2219
|
if (data.status === TABLE_STATUS.UNAVAILABLE) {
|
|
2155
|
-
return /* @__PURE__ */ (0,
|
|
2220
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StatusMessage, { $tone: "info", children: labels.unavailable });
|
|
2156
2221
|
}
|
|
2157
2222
|
if (data.status === TABLE_STATUS.LOADING) {
|
|
2158
2223
|
if (typeof knownRowCount === "number" && knownRowCount > 0) {
|
|
2159
2224
|
const shimmerCount = Math.min(knownRowCount, maxShimmerRows);
|
|
2160
|
-
return /* @__PURE__ */ (0,
|
|
2225
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ArtifactTable, { columns, maxBodyHeight, children: renderShimmerRows(columns, shimmerCount) });
|
|
2161
2226
|
}
|
|
2162
|
-
return /* @__PURE__ */ (0,
|
|
2227
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StatusMessage, { $tone: "info", children: labels.loading });
|
|
2163
2228
|
}
|
|
2164
|
-
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) });
|
|
2165
2230
|
}
|
|
2166
2231
|
function ArtifactTable({ columns, maxBodyHeight, children }) {
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
{
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(TableRow, { className: "hover:bg-transparent", children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(TableHead, { scope: "col", className: HEAD_CLASS, children: column.label }, column.key)) })
|
|
2176
|
-
}
|
|
2177
|
-
),
|
|
2178
|
-
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(TableBody, { children })
|
|
2179
|
-
] }) });
|
|
2232
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
2233
|
+
DataTable,
|
|
2234
|
+
{
|
|
2235
|
+
maxBodyHeight,
|
|
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)) }),
|
|
2237
|
+
children
|
|
2238
|
+
}
|
|
2239
|
+
);
|
|
2180
2240
|
}
|
|
2181
2241
|
function renderShimmerRows(columns, count) {
|
|
2182
|
-
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}`));
|
|
2183
2243
|
}
|
|
2184
2244
|
function renderDataRows(columns, rows) {
|
|
2185
|
-
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));
|
|
2186
2246
|
}
|
|
2187
2247
|
function renderEmptyRow(colSpan, emptyMessage) {
|
|
2188
|
-
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 }) });
|
|
2189
2249
|
}
|
|
2190
2250
|
|
|
2191
2251
|
// src/components/artifacts/deck-artifact/deck-markdown.tsx
|
|
2192
2252
|
var import_react_markdown = __toESM(require("react-markdown"), 1);
|
|
2193
2253
|
var import_remark_breaks = __toESM(require("remark-breaks"), 1);
|
|
2194
2254
|
var import_remark_gfm = __toESM(require("remark-gfm"), 1);
|
|
2195
|
-
var
|
|
2255
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
2196
2256
|
function sanitize(text) {
|
|
2197
2257
|
return text.split("\n").filter((line) => {
|
|
2198
2258
|
const t = line.trim();
|
|
@@ -2200,45 +2260,45 @@ function sanitize(text) {
|
|
|
2200
2260
|
}).join("\n");
|
|
2201
2261
|
}
|
|
2202
2262
|
var MARKDOWN_COMPONENTS = {
|
|
2203
|
-
h1: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2204
|
-
h2: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2205
|
-
h3: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2206
|
-
h4: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2207
|
-
h5: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2208
|
-
h6: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2209
|
-
p: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2210
|
-
ul: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2211
|
-
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 }),
|
|
2212
2272
|
// react-markdown injects list metadata (`ordered` / `index` / `checked`) that must not leak to the DOM.
|
|
2213
|
-
li: ({ node: _node, ordered: _ordered, index: _index, checked: _checked, ...props }) => /* @__PURE__ */ (0,
|
|
2214
|
-
strong: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2215
|
-
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 }),
|
|
2216
2276
|
// Gate `<img src>` against an http(s) allowlist. react-markdown v8 percent-encodes the URL but
|
|
2217
2277
|
// does NOT protocol-filter image src (unlike link href), so an LLM-authored
|
|
2218
2278
|
// `` / `` or a tracking-pixel `` would otherwise render
|
|
2219
2279
|
// with the raw URL. Unsafe src → render nothing.
|
|
2220
|
-
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,
|
|
2221
2281
|
a: ({ node: _node, ...props }) => (
|
|
2222
2282
|
// `rel` is forced AFTER `{...props}` so it can't be overridden — if a consumer ever adds
|
|
2223
2283
|
// `linkTarget="_blank"`, LLM-authored links still can't reach `window.opener`.
|
|
2224
|
-
/* @__PURE__ */ (0,
|
|
2284
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("a", { className: "underline underline-offset-2", ...props, rel: "noopener noreferrer" })
|
|
2225
2285
|
),
|
|
2226
2286
|
// react-markdown passes `inline` to distinguish inline code from fenced blocks — strip it from the DOM.
|
|
2227
|
-
code: ({ node: _node, inline: _inline, ...props }) => /* @__PURE__ */ (0,
|
|
2228
|
-
blockquote: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2229
|
-
hr: ({ node: _node, ...props }) => /* @__PURE__ */ (0,
|
|
2230
|
-
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 }) }),
|
|
2231
2291
|
// react-markdown passes `isHeader` to cell renderers — strip it so it never reaches the DOM.
|
|
2232
|
-
th: ({ node: _node, isHeader: _isHeader, ...props }) => /* @__PURE__ */ (0,
|
|
2233
|
-
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 })
|
|
2234
2294
|
};
|
|
2235
2295
|
function DeckMarkdown({ markdown }) {
|
|
2236
|
-
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) });
|
|
2237
2297
|
}
|
|
2238
2298
|
|
|
2239
2299
|
// src/components/artifacts/deck-artifact/slide-renderers.tsx
|
|
2240
2300
|
var import_react15 = require("react");
|
|
2241
|
-
var
|
|
2301
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
2242
2302
|
function safeLogoUrl(meta) {
|
|
2243
2303
|
return meta?.logoUrl && isSafeDownloadUrl(meta.logoUrl) ? meta.logoUrl : null;
|
|
2244
2304
|
}
|
|
@@ -2265,7 +2325,7 @@ function SlideFrame({ meta, children, accent = false, bare = false }) {
|
|
|
2265
2325
|
const eyebrowColor = accent ? "text-white/70" : "text-brown-60";
|
|
2266
2326
|
const borderColor = accent ? "border-white/20" : "border-brown-alpha-12";
|
|
2267
2327
|
const logoSrc = safeLogoUrl(meta);
|
|
2268
|
-
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)(
|
|
2269
2329
|
"div",
|
|
2270
2330
|
{
|
|
2271
2331
|
className: "absolute left-0 top-0 origin-top-left",
|
|
@@ -2276,26 +2336,26 @@ function SlideFrame({ meta, children, accent = false, bare = false }) {
|
|
|
2276
2336
|
visibility: scale === null ? "hidden" : "visible"
|
|
2277
2337
|
},
|
|
2278
2338
|
children: [
|
|
2279
|
-
!bare ? /* @__PURE__ */ (0,
|
|
2339
|
+
!bare ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
|
|
2280
2340
|
"div",
|
|
2281
2341
|
{
|
|
2282
2342
|
className: `absolute inset-x-0 top-0 flex items-center justify-between border-b px-16 ${borderColor}`,
|
|
2283
2343
|
style: { height: EYEBROW_H },
|
|
2284
2344
|
children: [
|
|
2285
|
-
meta?.eyebrow ? /* @__PURE__ */ (0,
|
|
2286
|
-
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
|
|
2287
2347
|
]
|
|
2288
2348
|
}
|
|
2289
2349
|
) : null,
|
|
2290
|
-
/* @__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 })
|
|
2291
2351
|
]
|
|
2292
2352
|
}
|
|
2293
2353
|
) });
|
|
2294
2354
|
}
|
|
2295
2355
|
function TitleSlide({ slide, meta }) {
|
|
2296
2356
|
const logoSrc = safeLogoUrl(meta);
|
|
2297
|
-
return /* @__PURE__ */ (0,
|
|
2298
|
-
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)(
|
|
2299
2359
|
"img",
|
|
2300
2360
|
{
|
|
2301
2361
|
src: logoSrc,
|
|
@@ -2304,7 +2364,7 @@ function TitleSlide({ slide, meta }) {
|
|
|
2304
2364
|
style: { maxHeight: 56, maxWidth: 380 }
|
|
2305
2365
|
}
|
|
2306
2366
|
) : null,
|
|
2307
|
-
/* @__PURE__ */ (0,
|
|
2367
|
+
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
2308
2368
|
"h1",
|
|
2309
2369
|
{
|
|
2310
2370
|
className: "font-bold tracking-tight text-brown-100",
|
|
@@ -2312,36 +2372,36 @@ function TitleSlide({ slide, meta }) {
|
|
|
2312
2372
|
children: slide.title
|
|
2313
2373
|
}
|
|
2314
2374
|
),
|
|
2315
|
-
slide.subtitle ? /* @__PURE__ */ (0,
|
|
2316
|
-
slide.description ? /* @__PURE__ */ (0,
|
|
2317
|
-
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
|
|
2318
2378
|
] }) });
|
|
2319
2379
|
}
|
|
2320
2380
|
function AgendaSlide({ slide, meta, labels }) {
|
|
2321
2381
|
const items = slide.items ?? [];
|
|
2322
|
-
return /* @__PURE__ */ (0,
|
|
2323
|
-
/* @__PURE__ */ (0,
|
|
2324
|
-
/* @__PURE__ */ (0,
|
|
2325
|
-
/* @__PURE__ */ (0,
|
|
2326
|
-
/* @__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 })
|
|
2327
2387
|
] }, i)) })
|
|
2328
2388
|
] }) });
|
|
2329
2389
|
}
|
|
2330
2390
|
function SectionSlide({ slide, meta }) {
|
|
2331
|
-
return /* @__PURE__ */ (0,
|
|
2332
|
-
/* @__PURE__ */ (0,
|
|
2333
|
-
/* @__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 } })
|
|
2334
2394
|
] }) });
|
|
2335
2395
|
}
|
|
2336
2396
|
function ClosingSlide({ meta, labels }) {
|
|
2337
|
-
return /* @__PURE__ */ (0,
|
|
2338
|
-
/* @__PURE__ */ (0,
|
|
2339
|
-
/* @__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 })
|
|
2340
2400
|
] }) });
|
|
2341
2401
|
}
|
|
2342
2402
|
|
|
2343
2403
|
// src/components/artifacts/deck-artifact/deck-artifact-content.tsx
|
|
2344
|
-
var
|
|
2404
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
2345
2405
|
var TABLE_BLOCK_MAX_SHIMMER_ROWS = 10;
|
|
2346
2406
|
var TABLE_CHROME_RESERVE = 56;
|
|
2347
2407
|
var VISUAL_FALLBACK_HEIGHT = 360;
|
|
@@ -2371,14 +2431,14 @@ function DeckArtifactContent({
|
|
|
2371
2431
|
[slides.length, onNavigate, isControlled, onSlideChange]
|
|
2372
2432
|
);
|
|
2373
2433
|
const position = labels.position.replace("{current}", String(current + 1)).replace("{total}", String(slides.length));
|
|
2374
|
-
return /* @__PURE__ */ (0,
|
|
2375
|
-
/* @__PURE__ */ (0,
|
|
2376
|
-
/* @__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)(
|
|
2377
2437
|
"div",
|
|
2378
2438
|
{
|
|
2379
2439
|
className: `flex items-center justify-between border-t pt-2 ${onDark ? "border-white/20" : "border-brown-alpha-12"}`,
|
|
2380
2440
|
children: [
|
|
2381
|
-
/* @__PURE__ */ (0,
|
|
2441
|
+
/* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
2382
2442
|
IconButton,
|
|
2383
2443
|
{
|
|
2384
2444
|
icon: IconChevronLeft,
|
|
@@ -2389,8 +2449,8 @@ function DeckArtifactContent({
|
|
|
2389
2449
|
onClick: () => goTo(current - 1)
|
|
2390
2450
|
}
|
|
2391
2451
|
),
|
|
2392
|
-
/* @__PURE__ */ (0,
|
|
2393
|
-
/* @__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)(
|
|
2394
2454
|
IconButton,
|
|
2395
2455
|
{
|
|
2396
2456
|
icon: IconChevronRight,
|
|
@@ -2410,16 +2470,16 @@ function SlideDispatch({ slide, labels, meta }) {
|
|
|
2410
2470
|
const kind = slide.kind ?? deckSlideKinds.CONTENT;
|
|
2411
2471
|
switch (kind) {
|
|
2412
2472
|
case deckSlideKinds.TITLE:
|
|
2413
|
-
return /* @__PURE__ */ (0,
|
|
2473
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(TitleSlide, { slide, meta });
|
|
2414
2474
|
case deckSlideKinds.AGENDA:
|
|
2415
|
-
return /* @__PURE__ */ (0,
|
|
2475
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(AgendaSlide, { slide, meta, labels });
|
|
2416
2476
|
case deckSlideKinds.SECTION:
|
|
2417
|
-
return /* @__PURE__ */ (0,
|
|
2477
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SectionSlide, { slide, meta });
|
|
2418
2478
|
case deckSlideKinds.CLOSING:
|
|
2419
|
-
return /* @__PURE__ */ (0,
|
|
2479
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ClosingSlide, { meta, labels });
|
|
2420
2480
|
case deckSlideKinds.CONTENT:
|
|
2421
2481
|
default:
|
|
2422
|
-
return /* @__PURE__ */ (0,
|
|
2482
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ContentSlide, { slide, meta, labels });
|
|
2423
2483
|
}
|
|
2424
2484
|
}
|
|
2425
2485
|
function isVisualBlock(block) {
|
|
@@ -2432,25 +2492,25 @@ function ContentSlide({ slide, meta, labels }) {
|
|
|
2432
2492
|
(b) => b.type === deckBlockTypes.TEXT
|
|
2433
2493
|
);
|
|
2434
2494
|
if (visuals.length === 1 && texts.length > 0) {
|
|
2435
|
-
return /* @__PURE__ */ (0,
|
|
2436
|
-
/* @__PURE__ */ (0,
|
|
2437
|
-
/* @__PURE__ */ (0,
|
|
2438
|
-
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))
|
|
2439
2499
|
] }) }),
|
|
2440
|
-
/* @__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 }) })
|
|
2441
2501
|
] }) });
|
|
2442
2502
|
}
|
|
2443
2503
|
if (visuals.length > 0) {
|
|
2444
|
-
return /* @__PURE__ */ (0,
|
|
2445
|
-
/* @__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 }),
|
|
2446
2506
|
content.map(
|
|
2447
|
-
(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)
|
|
2448
2508
|
)
|
|
2449
2509
|
] }) });
|
|
2450
2510
|
}
|
|
2451
|
-
return /* @__PURE__ */ (0,
|
|
2452
|
-
/* @__PURE__ */ (0,
|
|
2453
|
-
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))
|
|
2454
2514
|
] }) }) });
|
|
2455
2515
|
}
|
|
2456
2516
|
function AutoFit({ children }) {
|
|
@@ -2474,7 +2534,7 @@ function AutoFit({ children }) {
|
|
|
2474
2534
|
return () => ro.disconnect();
|
|
2475
2535
|
}, []);
|
|
2476
2536
|
const scaled = fit.scale < 1;
|
|
2477
|
-
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)(
|
|
2478
2538
|
"div",
|
|
2479
2539
|
{
|
|
2480
2540
|
ref: contentRef,
|
|
@@ -2499,12 +2559,12 @@ function FillVisual({ block, labels }) {
|
|
|
2499
2559
|
return () => ro.disconnect();
|
|
2500
2560
|
}, []);
|
|
2501
2561
|
const chartLabels = labels.chart ?? DEFAULT_CHART_ARTIFACT_LABELS;
|
|
2502
|
-
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 ? (
|
|
2503
2563
|
// ChartArtifactContent assumes a non-empty rowset (the standalone ChartArtifact guards
|
|
2504
2564
|
// `rows.length > 0` upstream); mirror that guard here so an empty inline chart shows the
|
|
2505
2565
|
// localized empty status instead of a blank chart area.
|
|
2506
|
-
block.rows.length === 0 ? /* @__PURE__ */ (0,
|
|
2507
|
-
) : /* @__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)(
|
|
2508
2568
|
TableArtifactContent,
|
|
2509
2569
|
{
|
|
2510
2570
|
columns: block.config.columns,
|
|
@@ -2570,7 +2630,7 @@ function isValidDeckBlock(block) {
|
|
|
2570
2630
|
}
|
|
2571
2631
|
|
|
2572
2632
|
// src/components/artifacts/deck-artifact/deck-artifact.tsx
|
|
2573
|
-
var
|
|
2633
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
2574
2634
|
var TITLE_CLASSES2 = "text-sm font-semibold text-foreground";
|
|
2575
2635
|
function DeckArtifact({ artifact, labels, callbacks }) {
|
|
2576
2636
|
const validConfig = isValidDeckConfig(artifact.config);
|
|
@@ -2611,9 +2671,9 @@ function DeckArtifact({ artifact, labels, callbacks }) {
|
|
|
2611
2671
|
const meta = artifact.config?.meta;
|
|
2612
2672
|
const handleOpenFullscreen = () => setIsFullscreen(true);
|
|
2613
2673
|
const handleCloseFullscreen = () => setIsFullscreen(false);
|
|
2614
|
-
const actions = /* @__PURE__ */ (0,
|
|
2615
|
-
showDownload ? /* @__PURE__ */ (0,
|
|
2616
|
-
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)(
|
|
2617
2677
|
IconButton,
|
|
2618
2678
|
{
|
|
2619
2679
|
icon: IconArrowsMaximize,
|
|
@@ -2623,22 +2683,29 @@ function DeckArtifact({ artifact, labels, callbacks }) {
|
|
|
2623
2683
|
}
|
|
2624
2684
|
) : null
|
|
2625
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
|
+
] });
|
|
2626
2693
|
if (!validConfig) {
|
|
2627
|
-
return /* @__PURE__ */ (0,
|
|
2628
|
-
/* @__PURE__ */ (0,
|
|
2629
|
-
|
|
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,
|
|
2630
2697
|
actions
|
|
2631
2698
|
] }),
|
|
2632
|
-
/* @__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 }) })
|
|
2633
2700
|
] });
|
|
2634
2701
|
}
|
|
2635
|
-
return /* @__PURE__ */ (0,
|
|
2636
|
-
/* @__PURE__ */ (0,
|
|
2637
|
-
/* @__PURE__ */ (0,
|
|
2638
|
-
|
|
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,
|
|
2639
2706
|
actions
|
|
2640
2707
|
] }),
|
|
2641
|
-
/* @__PURE__ */ (0,
|
|
2708
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2642
2709
|
DeckArtifactContent,
|
|
2643
2710
|
{
|
|
2644
2711
|
slides: artifact.config.slides,
|
|
@@ -2651,7 +2718,7 @@ function DeckArtifact({ artifact, labels, callbacks }) {
|
|
|
2651
2718
|
) })
|
|
2652
2719
|
] }),
|
|
2653
2720
|
isFullscreen && (0, import_react_dom.createPortal)(
|
|
2654
|
-
/* @__PURE__ */ (0,
|
|
2721
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2655
2722
|
FullscreenOverlay,
|
|
2656
2723
|
{
|
|
2657
2724
|
artifact,
|
|
@@ -2675,15 +2742,15 @@ function FullscreenOverlay({
|
|
|
2675
2742
|
onClose
|
|
2676
2743
|
}) {
|
|
2677
2744
|
const meta = artifact.config?.meta;
|
|
2678
|
-
return /* @__PURE__ */ (0,
|
|
2745
|
+
return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
|
|
2679
2746
|
"div",
|
|
2680
2747
|
{
|
|
2681
2748
|
className: "fixed inset-0 z-[2147483647] flex items-center justify-center bg-black/80",
|
|
2682
2749
|
role: "dialog",
|
|
2683
2750
|
"aria-modal": "true",
|
|
2684
2751
|
"aria-label": resolvedLabels.exitFullscreen,
|
|
2685
|
-
children: /* @__PURE__ */ (0,
|
|
2686
|
-
/* @__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)(
|
|
2687
2754
|
DeckArtifactContent,
|
|
2688
2755
|
{
|
|
2689
2756
|
slides: artifact.config.slides,
|
|
@@ -2695,15 +2762,15 @@ function FullscreenOverlay({
|
|
|
2695
2762
|
onDark: true
|
|
2696
2763
|
}
|
|
2697
2764
|
),
|
|
2698
|
-
/* @__PURE__ */ (0,
|
|
2765
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
|
|
2699
2766
|
"button",
|
|
2700
2767
|
{
|
|
2701
2768
|
className: "absolute -top-10 right-6 flex items-center gap-1.5 text-sm text-white/80 hover:text-white",
|
|
2702
2769
|
"aria-label": resolvedLabels.exitFullscreen,
|
|
2703
2770
|
onClick: onClose,
|
|
2704
2771
|
children: [
|
|
2705
|
-
/* @__PURE__ */ (0,
|
|
2706
|
-
/* @__PURE__ */ (0,
|
|
2772
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(IconArrowsMinimize, { size: 16 }),
|
|
2773
|
+
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: resolvedLabels.exitFullscreen })
|
|
2707
2774
|
]
|
|
2708
2775
|
}
|
|
2709
2776
|
)
|
|
@@ -2780,7 +2847,7 @@ function useTableArtifactData(presignedUrl, columns) {
|
|
|
2780
2847
|
}
|
|
2781
2848
|
|
|
2782
2849
|
// src/components/artifacts/table-artifact/table-artifact.tsx
|
|
2783
|
-
var
|
|
2850
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
2784
2851
|
var TITLE_CLASSES3 = "text-sm font-semibold text-foreground";
|
|
2785
2852
|
var TABLE_MAX_BODY_HEIGHT = 480;
|
|
2786
2853
|
var MAX_SHIMMER_ROWS = 10;
|
|
@@ -2803,10 +2870,10 @@ function TableArtifact({ artifact, labels, callbacks }) {
|
|
|
2803
2870
|
const onDownload = callbacks?.onDownload;
|
|
2804
2871
|
const handleDownloadClick = onDownload ? () => onDownload(artifact) : void 0;
|
|
2805
2872
|
if (!validConfig || !validColumns) {
|
|
2806
|
-
return /* @__PURE__ */ (0,
|
|
2807
|
-
/* @__PURE__ */ (0,
|
|
2808
|
-
artifact.title ? /* @__PURE__ */ (0,
|
|
2809
|
-
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)(
|
|
2810
2877
|
ArtifactDownloadButton,
|
|
2811
2878
|
{
|
|
2812
2879
|
href: presignedUrl,
|
|
@@ -2815,17 +2882,17 @@ function TableArtifact({ artifact, labels, callbacks }) {
|
|
|
2815
2882
|
}
|
|
2816
2883
|
) }) : null
|
|
2817
2884
|
] }),
|
|
2818
|
-
/* @__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 }) })
|
|
2819
2886
|
] });
|
|
2820
2887
|
}
|
|
2821
2888
|
return (
|
|
2822
2889
|
// The table body owns its own scroll container (`ArtifactTable` inside `TableArtifactContent`).
|
|
2823
2890
|
// Disable the outer overflow container so only one scroll context exists — this prevents
|
|
2824
2891
|
// double-scroll nesting and lets `useScrollShadow` find the correct scroll ancestor.
|
|
2825
|
-
/* @__PURE__ */ (0,
|
|
2826
|
-
/* @__PURE__ */ (0,
|
|
2827
|
-
artifact.title ? /* @__PURE__ */ (0,
|
|
2828
|
-
/* @__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)(
|
|
2829
2896
|
ArtifactDownloadButton,
|
|
2830
2897
|
{
|
|
2831
2898
|
href: presignedUrl ?? "",
|
|
@@ -2834,7 +2901,7 @@ function TableArtifact({ artifact, labels, callbacks }) {
|
|
|
2834
2901
|
}
|
|
2835
2902
|
) })
|
|
2836
2903
|
] }),
|
|
2837
|
-
/* @__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)(
|
|
2838
2905
|
TableArtifactContent,
|
|
2839
2906
|
{
|
|
2840
2907
|
columns: validColumns,
|
|
@@ -2908,6 +2975,7 @@ function artifactToClipboardText(artifact) {
|
|
|
2908
2975
|
@tabler/icons-react/dist/esm/icons/IconFileSpreadsheet.mjs:
|
|
2909
2976
|
@tabler/icons-react/dist/esm/icons/IconLoader2.mjs:
|
|
2910
2977
|
@tabler/icons-react/dist/esm/icons/IconPhoto.mjs:
|
|
2978
|
+
@tabler/icons-react/dist/esm/icons/IconFlask2Filled.mjs:
|
|
2911
2979
|
@tabler/icons-react/dist/esm/tabler-icons-react.mjs:
|
|
2912
2980
|
(**
|
|
2913
2981
|
* @license @tabler/icons-react v3.37.1 - MIT
|