@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.
@@ -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 import_jsx_runtime20 = require("react/jsx-runtime");
2049
- var Table = React3.forwardRef(({ className, containerClassName, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: cn("relative w-full overflow-auto", containerClassName), children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("table", { ref, className: cn("w-full caption-bottom text-sm", className), ...props }) }));
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, import_jsx_runtime20.jsx)("thead", { ref, className: cn("[&_tr]:border-b", className), ...props })
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, import_jsx_runtime20.jsx)("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props })
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, import_jsx_runtime20.jsx)("tfoot", { ref, className: cn("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", className), ...props })
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, import_jsx_runtime20.jsx)(
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, import_jsx_runtime20.jsx)(
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, import_jsx_runtime20.jsx)("td", { ref, className: cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className), ...props })
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, import_jsx_runtime20.jsx)("caption", { ref, className: cn("mt-4 text-sm text-muted-foreground", className), ...props })
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 import_jsx_runtime21 = require("react/jsx-runtime");
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, import_jsx_runtime21.jsx)(
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, import_jsx_runtime21.jsxs)(Table, { containerClassName: "overflow-visible", children: [
2138
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
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, import_jsx_runtime21.jsx)(TableBody, { children })
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 import_jsx_runtime22 = require("react/jsx-runtime");
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, import_jsx_runtime22.jsx)(StatusMessage, { $tone: "error", children: labels.loadError });
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, import_jsx_runtime22.jsx)(StatusMessage, { $tone: "info", children: labels.unavailable });
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, import_jsx_runtime22.jsx)(ArtifactTable, { columns, maxBodyHeight, children: renderShimmerRows(columns, shimmerCount) });
2225
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ArtifactTable, { columns, maxBodyHeight, children: renderShimmerRows(columns, shimmerCount) });
2187
2226
  }
2188
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(StatusMessage, { $tone: "info", children: labels.loading });
2227
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StatusMessage, { $tone: "info", children: labels.loading });
2189
2228
  }
2190
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ArtifactTable, { columns, maxBodyHeight, children: data.rows.length === 0 ? renderEmptyRow(columns.length, labels.empty) : renderDataRows(columns, data.rows) });
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, import_jsx_runtime22.jsx)(
2232
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2194
2233
  DataTable,
2195
2234
  {
2196
2235
  maxBodyHeight,
2197
- header: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(TableRow, { className: "hover:bg-transparent", children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(TableHead, { scope: "col", className: DATA_TABLE_HEAD_CLASS, children: column.label }, column.key)) }),
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, import_jsx_runtime22.jsx)(TableRow, { className: DATA_TABLE_ROW_CLASS, "aria-hidden": "true", children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(TableCell, { className: DATA_TABLE_CELL_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "block h-3 w-3/4 animate-pulse rounded bg-muted-foreground/20" }) }, column.key)) }, `shimmer-${index}`));
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, import_jsx_runtime22.jsx)(TableRow, { className: DATA_ROW_CLASSES, children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(TableCell, { className: DATA_TABLE_CELL_CLASS, children: formatCell(row, column) }, column.key)) }, index));
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, import_jsx_runtime22.jsx)(TableRow, { className: "hover:bg-transparent", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(TableCell, { colSpan, className: "py-6 text-center text-sm text-muted-foreground", children: emptyMessage }) });
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 import_jsx_runtime23 = require("react/jsx-runtime");
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, import_jsx_runtime23.jsx)("h1", { className: "text-[30px] font-semibold leading-tight text-foreground mb-3", ...props }),
2225
- h2: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h2", { className: "text-[26px] font-semibold leading-tight text-foreground mb-2", ...props }),
2226
- h3: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h3", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
2227
- h4: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h4", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
2228
- h5: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h5", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
2229
- h6: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h6", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
2230
- p: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "text-[22px] leading-relaxed text-foreground my-2", ...props }),
2231
- ul: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("ul", { className: "list-disc pl-7 text-[22px] leading-relaxed text-foreground my-2", ...props }),
2232
- ol: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("ol", { className: "list-decimal pl-7 text-[22px] leading-relaxed text-foreground my-2", ...props }),
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, import_jsx_runtime23.jsx)("li", { className: "my-1", ...props }),
2235
- strong: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("strong", { className: "font-semibold", ...props }),
2236
- em: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("em", { className: "italic", ...props }),
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
  // `![](javascript:…)` / `![](data:…)` or a tracking-pixel `![](http://…)` 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, import_jsx_runtime23.jsx)("img", { src, className: "max-w-full", ...props }) : null,
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, import_jsx_runtime23.jsx)("a", { className: "underline underline-offset-2", ...props, rel: "noopener noreferrer" })
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, import_jsx_runtime23.jsx)("code", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-[18px]", ...props }),
2249
- blockquote: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("blockquote", { className: "border-l-2 border-brown-alpha-12 pl-4 text-[22px] text-muted-foreground", ...props }),
2250
- hr: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("hr", { className: "my-4 border-brown-alpha-12", ...props }),
2251
- table: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "overflow-x-auto", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("table", { className: "w-full border-collapse text-[20px]", ...props }) }),
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, import_jsx_runtime23.jsx)("th", { className: "border-b border-brown-alpha-12 px-3 py-1.5 text-left font-medium", ...props }),
2254
- td: ({ node: _node, isHeader: _isHeader, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("td", { className: "border-b border-brown-alpha-12 px-3 py-1.5", ...props })
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, import_jsx_runtime23.jsx)(import_react_markdown.default, { remarkPlugins: [import_remark_gfm.default, import_remark_breaks.default], components: MARKDOWN_COMPONENTS, children: sanitize(markdown) });
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 import_jsx_runtime24 = require("react/jsx-runtime");
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, import_jsx_runtime24.jsx)("div", { ref: frameRef, className: `relative aspect-[16/9] w-full overflow-hidden rounded-lg ${bg}`, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
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, import_jsx_runtime24.jsxs)(
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, import_jsx_runtime24.jsx)("span", { className: eyebrowColor, style: { ...ACCENT_FONT, fontSize: 22 }, children: meta.eyebrow }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", {}),
2307
- logoSrc ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("img", { src: logoSrc, alt: "", className: "object-contain", style: { maxHeight: CANVAS_LOGO_MAX_H } }) : null
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, import_jsx_runtime24.jsx)("div", { className: "absolute inset-x-0 bottom-0 overflow-hidden", style: { top: bare ? 0 : EYEBROW_H }, children })
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, import_jsx_runtime24.jsx)(SlideFrame, { meta, bare: true, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex h-full flex-col justify-center px-24 py-16", children: [
2319
- logoSrc ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
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, import_jsx_runtime24.jsx)(
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, import_jsx_runtime24.jsx)("p", { className: "mt-7 text-brown-70", style: { ...ACCENT_FONT, fontSize: 34 }, children: slide.subtitle }) : null,
2337
- slide.description ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "mt-4 leading-relaxed text-brown-70", style: { fontSize: 24, maxWidth: 880 }, children: slide.description }) : null,
2338
- meta?.date ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "mt-10 text-brown-70", style: { ...ACCENT_FONT, fontSize: 30 }, children: meta.date }) : null
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, import_jsx_runtime24.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "h-full px-24 py-14", children: [
2344
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h2", { className: "mb-10 font-bold text-brown-90", style: { fontSize: 40 }, children: slide.title || labels.agenda }),
2345
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "flex flex-col", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex items-baseline gap-6 border-b border-brown-alpha-12 py-5", children: [
2346
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "shrink-0 text-indigo-600", style: { ...ACCENT_FONT, fontSize: 28, width: 64 }, children: String(i + 1).padStart(2, "0") }),
2347
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "text-brown-90", style: { fontSize: 28 }, children: item })
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, import_jsx_runtime24.jsx)(SlideFrame, { meta, accent: true, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex h-full flex-col justify-center gap-6 px-24", children: [
2353
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h2", { className: "font-bold text-white", style: { fontSize: 72, lineHeight: 1.05, maxWidth: 940 }, children: slide.title }),
2354
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "mt-2 bg-white/50", style: { width: 96, height: 5 } })
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, import_jsx_runtime24.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex h-full flex-col items-center justify-center gap-6 px-24 text-center", children: [
2359
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h1", { className: "font-bold text-brown-100", style: { fontSize: 72 }, children: labels.thankYou }),
2360
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-indigo-600", style: { ...ACCENT_FONT, fontSize: 36 }, children: labels.questions })
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 import_jsx_runtime25 = require("react/jsx-runtime");
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, import_jsx_runtime25.jsxs)("div", { className: "flex flex-col gap-3 p-4", children: [
2396
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SlideDispatch, { slide, labels, meta }),
2397
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
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, import_jsx_runtime25.jsx)(
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, import_jsx_runtime25.jsx)("span", { className: `text-xs font-medium ${onDark ? "text-white/70" : "text-brown-70"}`, children: position }),
2414
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
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, import_jsx_runtime25.jsx)(TitleSlide, { slide, meta });
2473
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(TitleSlide, { slide, meta });
2435
2474
  case deckSlideKinds.AGENDA:
2436
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(AgendaSlide, { slide, meta, labels });
2475
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(AgendaSlide, { slide, meta, labels });
2437
2476
  case deckSlideKinds.SECTION:
2438
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SectionSlide, { slide, meta });
2477
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SectionSlide, { slide, meta });
2439
2478
  case deckSlideKinds.CLOSING:
2440
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ClosingSlide, { meta, labels });
2479
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ClosingSlide, { meta, labels });
2441
2480
  case deckSlideKinds.CONTENT:
2442
2481
  default:
2443
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ContentSlide, { slide, meta, labels });
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, import_jsx_runtime25.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex h-full items-stretch gap-12 px-16 py-12", children: [
2457
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "flex w-[42%] shrink-0 flex-col overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(AutoFit, { children: [
2458
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h3", { className: "mb-5 font-bold leading-tight text-foreground", style: { fontSize: 34 }, children: slide.title }),
2459
- texts.map((block, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DeckMarkdown, { markdown: block.markdown }, i))
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, import_jsx_runtime25.jsx)("div", { className: "min-h-0 min-w-0 flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(FillVisual, { block: visuals[0], labels }) })
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, import_jsx_runtime25.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex h-full flex-col gap-5 px-16 py-10", children: [
2466
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h3", { className: "shrink-0 font-bold leading-tight text-foreground", style: { fontSize: 32 }, children: slide.title }),
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, import_jsx_runtime25.jsx)("div", { className: "min-h-0 min-w-0 flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(FillVisual, { block, labels }) }, i) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "shrink-0 overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DeckMarkdown, { markdown: block.markdown }) }, i)
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, import_jsx_runtime25.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "h-full px-24 py-12", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(AutoFit, { children: [
2473
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h3", { className: "mb-6 font-bold leading-tight text-foreground", style: { fontSize: 38 }, children: slide.title }),
2474
- texts.map((block, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DeckMarkdown, { markdown: block.markdown }, i))
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, import_jsx_runtime25.jsx)("div", { ref: boxRef, className: "flex h-full min-h-0 w-full flex-col justify-center overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { style: scaled ? { height: fit.height } : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
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, import_jsx_runtime25.jsx)("div", { ref, className: "h-full min-h-0 w-full overflow-hidden", children: block.type === deckBlockTypes.CHART ? (
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, import_jsx_runtime25.jsx)(StatusMessage, { $tone: "info", children: chartLabels.empty }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { style: { height }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ChartArtifactContent, { config: block.config, rows: block.rows, labels: chartLabels }) })
2528
- ) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
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 import_jsx_runtime26 = require("react/jsx-runtime");
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, import_jsx_runtime26.jsxs)(ArtifactActions, { ...{ [CAPTURE_EXCLUDE_ATTRIBUTE]: "" }, children: [
2636
- showDownload ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactDownloadButton, { href: presignedUrl ?? "", label: resolvedLabels.download, onClick: handleDownload }) : null,
2637
- validConfig ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
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, import_jsx_runtime26.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
2649
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
2650
- artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactTitle, { className: TITLE_CLASSES2, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", {}),
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, import_jsx_runtime26.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(StatusMessage, { $tone: "info", children: resolvedLabels.unavailable }) })
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, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
2657
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
2658
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
2659
- artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactTitle, { className: TITLE_CLASSES2, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", {}),
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, import_jsx_runtime26.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
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, import_jsx_runtime26.jsx)(
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, import_jsx_runtime26.jsx)(
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, import_jsx_runtime26.jsxs)("div", { className: "relative", style: { width: "min(94vw, calc(82vh * 16 / 9))" }, children: [
2707
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
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, import_jsx_runtime26.jsxs)(
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, import_jsx_runtime26.jsx)(IconArrowsMinimize, { size: 16 }),
2727
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { children: resolvedLabels.exitFullscreen })
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 import_jsx_runtime27 = require("react/jsx-runtime");
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, import_jsx_runtime27.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
2828
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
2829
- artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactTitle, { className: TITLE_CLASSES3, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", {}),
2830
- presignedUrl ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
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, import_jsx_runtime27.jsx)(ArtifactContent, { className: "p-0 overflow-auto", style: { maxHeight: TABLE_MAX_BODY_HEIGHT }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(StatusMessage, { $tone: "info", children: resolvedLabels.unavailable }) })
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, import_jsx_runtime27.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
2847
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
2848
- artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactTitle, { className: TITLE_CLASSES3, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", {}),
2849
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
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, import_jsx_runtime27.jsx)(ArtifactContent, { className: "p-0 overflow-visible", style: { maxHeight: "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
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