@shapesos/clay 0.18.0 → 0.19.0

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.
Files changed (60) hide show
  1. package/dist/artifacts.cjs +151 -130
  2. package/dist/artifacts.cjs.map +1 -1
  3. package/dist/artifacts.js +3 -2
  4. package/dist/badge.cjs +70 -0
  5. package/dist/badge.cjs.map +1 -0
  6. package/dist/badge.d.cts +28 -0
  7. package/dist/badge.d.ts +28 -0
  8. package/dist/badge.js +9 -0
  9. package/dist/badge.js.map +1 -0
  10. package/dist/blocks.cjs +434 -176
  11. package/dist/blocks.cjs.map +1 -1
  12. package/dist/blocks.css +1 -1
  13. package/dist/blocks.d.cts +14 -3
  14. package/dist/blocks.d.ts +14 -3
  15. package/dist/blocks.js +17 -5
  16. package/dist/chat.cjs +439 -231
  17. package/dist/chat.cjs.map +1 -1
  18. package/dist/chat.d.cts +1 -1
  19. package/dist/chat.d.ts +1 -1
  20. package/dist/chat.js +10 -5
  21. package/dist/{chunk-JGMN6W72.js → chunk-2X4KUXYP.js} +1 -1
  22. package/dist/chunk-CSTCTO3B.js +161 -0
  23. package/dist/chunk-CSTCTO3B.js.map +1 -0
  24. package/dist/{chunk-QR4VBGK4.js → chunk-DC5KYT2G.js} +65 -198
  25. package/dist/chunk-DC5KYT2G.js.map +1 -0
  26. package/dist/chunk-EIAWZXE4.js +69 -0
  27. package/dist/chunk-EIAWZXE4.js.map +1 -0
  28. package/dist/chunk-EXRNGIQ2.js +41 -0
  29. package/dist/chunk-EXRNGIQ2.js.map +1 -0
  30. package/dist/{chunk-CATIRDZP.js → chunk-FCSYVF4Z.js} +10 -44
  31. package/dist/chunk-FCSYVF4Z.js.map +1 -0
  32. package/dist/{chunk-4MZZH3WX.js → chunk-HU5W7CGE.js} +37 -2
  33. package/dist/chunk-HU5W7CGE.js.map +1 -0
  34. package/dist/chunk-JMHE3Q5K.js +406 -0
  35. package/dist/chunk-JMHE3Q5K.js.map +1 -0
  36. package/dist/copy-button.cjs +439 -0
  37. package/dist/copy-button.cjs.map +1 -0
  38. package/dist/copy-button.d.cts +20 -0
  39. package/dist/copy-button.d.ts +20 -0
  40. package/dist/copy-button.js +12 -0
  41. package/dist/copy-button.js.map +1 -0
  42. package/dist/index.cjs +515 -289
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.d.cts +4 -2
  45. package/dist/index.d.ts +4 -2
  46. package/dist/index.js +26 -9
  47. package/dist/table.cjs +40 -0
  48. package/dist/table.cjs.map +1 -1
  49. package/dist/table.d.cts +37 -2
  50. package/dist/table.d.ts +37 -2
  51. package/dist/table.js +11 -1
  52. package/dist/{types-BDYPVP2N.d.cts → types-Bhg0_ES8.d.cts} +74 -2
  53. package/dist/{types-BMwa4bPW.d.ts → types-orOQcI2z.d.ts} +74 -2
  54. package/package.json +11 -1
  55. package/dist/chunk-4MZZH3WX.js.map +0 -1
  56. package/dist/chunk-7MY4X4YL.js +0 -250
  57. package/dist/chunk-7MY4X4YL.js.map +0 -1
  58. package/dist/chunk-CATIRDZP.js.map +0 -1
  59. package/dist/chunk-QR4VBGK4.js.map +0 -1
  60. /package/dist/{chunk-JGMN6W72.js.map → chunk-2X4KUXYP.js.map} +0 -0
package/dist/blocks.cjs CHANGED
@@ -273,8 +273,12 @@ __export(blocks_exports, {
273
273
  Block: () => Block,
274
274
  BlockContext: () => BlockContext,
275
275
  BlockServices: () => BlockServices,
276
+ NotificationDraftBlock: () => NotificationDraftBlock,
277
+ NotificationDraftBlockService: () => NotificationDraftBlockService,
276
278
  TextBlockService: () => TextBlockService,
277
279
  blockTypes: () => blockTypes,
280
+ notificationChannels: () => notificationChannels,
281
+ notificationEmailTypes: () => notificationEmailTypes,
278
282
  useBlockContext: () => useBlockContext
279
283
  });
280
284
  module.exports = __toCommonJS(blocks_exports);
@@ -282,7 +286,8 @@ module.exports = __toCommonJS(blocks_exports);
282
286
  // src/components/blocks/types.ts
283
287
  var blockTypes = {
284
288
  TEXT: "TEXT",
285
- ARTIFACT_REF: "ARTIFACT_REF"
289
+ ARTIFACT_REF: "ARTIFACT_REF",
290
+ NOTIFICATION_DRAFT: "NOTIFICATION_DRAFT"
286
291
  };
287
292
 
288
293
  // src/components/artifacts/artifact-base.ts
@@ -446,33 +451,41 @@ var IconArrowsMinimize = createReactComponent("outline", "arrows-minimize", "Arr
446
451
  var __iconNode4 = [["path", { "d": "M5 12l5 5l10 -10", "key": "svg-0" }]];
447
452
  var IconCheck = createReactComponent("outline", "check", "Check", __iconNode4);
448
453
 
454
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconChevronDown.mjs
455
+ var __iconNode5 = [["path", { "d": "M6 9l6 6l6 -6", "key": "svg-0" }]];
456
+ var IconChevronDown = createReactComponent("outline", "chevron-down", "ChevronDown", __iconNode5);
457
+
449
458
  // node_modules/@tabler/icons-react/dist/esm/icons/IconChevronLeft.mjs
450
- var __iconNode5 = [["path", { "d": "M15 6l-6 6l6 6", "key": "svg-0" }]];
451
- var IconChevronLeft = createReactComponent("outline", "chevron-left", "ChevronLeft", __iconNode5);
459
+ var __iconNode6 = [["path", { "d": "M15 6l-6 6l6 6", "key": "svg-0" }]];
460
+ var IconChevronLeft = createReactComponent("outline", "chevron-left", "ChevronLeft", __iconNode6);
452
461
 
453
462
  // node_modules/@tabler/icons-react/dist/esm/icons/IconChevronRight.mjs
454
- var __iconNode6 = [["path", { "d": "M9 6l6 6l-6 6", "key": "svg-0" }]];
455
- var IconChevronRight = createReactComponent("outline", "chevron-right", "ChevronRight", __iconNode6);
463
+ var __iconNode7 = [["path", { "d": "M9 6l6 6l-6 6", "key": "svg-0" }]];
464
+ var IconChevronRight = createReactComponent("outline", "chevron-right", "ChevronRight", __iconNode7);
456
465
 
457
466
  // node_modules/@tabler/icons-react/dist/esm/icons/IconCopy.mjs
458
- var __iconNode7 = [["path", { "d": "M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666", "key": "svg-0" }], ["path", { "d": "M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1", "key": "svg-1" }]];
459
- var IconCopy = createReactComponent("outline", "copy", "Copy", __iconNode7);
467
+ var __iconNode8 = [["path", { "d": "M7 9.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667l0 -8.666", "key": "svg-0" }], ["path", { "d": "M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1", "key": "svg-1" }]];
468
+ var IconCopy = createReactComponent("outline", "copy", "Copy", __iconNode8);
460
469
 
461
470
  // node_modules/@tabler/icons-react/dist/esm/icons/IconDownload.mjs
462
- var __iconNode8 = [["path", { "d": "M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2", "key": "svg-0" }], ["path", { "d": "M7 11l5 5l5 -5", "key": "svg-1" }], ["path", { "d": "M12 4l0 12", "key": "svg-2" }]];
463
- var IconDownload = createReactComponent("outline", "download", "Download", __iconNode8);
471
+ var __iconNode9 = [["path", { "d": "M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2", "key": "svg-0" }], ["path", { "d": "M7 11l5 5l5 -5", "key": "svg-1" }], ["path", { "d": "M12 4l0 12", "key": "svg-2" }]];
472
+ var IconDownload = createReactComponent("outline", "download", "Download", __iconNode9);
464
473
 
465
474
  // node_modules/@tabler/icons-react/dist/esm/icons/IconFileSpreadsheet.mjs
466
- var __iconNode9 = [["path", { "d": "M14 3v4a1 1 0 0 0 1 1h4", "key": "svg-0" }], ["path", { "d": "M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2", "key": "svg-1" }], ["path", { "d": "M8 11h8v7h-8l0 -7", "key": "svg-2" }], ["path", { "d": "M8 15h8", "key": "svg-3" }], ["path", { "d": "M11 11v7", "key": "svg-4" }]];
467
- var IconFileSpreadsheet = createReactComponent("outline", "file-spreadsheet", "FileSpreadsheet", __iconNode9);
475
+ var __iconNode10 = [["path", { "d": "M14 3v4a1 1 0 0 0 1 1h4", "key": "svg-0" }], ["path", { "d": "M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2", "key": "svg-1" }], ["path", { "d": "M8 11h8v7h-8l0 -7", "key": "svg-2" }], ["path", { "d": "M8 15h8", "key": "svg-3" }], ["path", { "d": "M11 11v7", "key": "svg-4" }]];
476
+ var IconFileSpreadsheet = createReactComponent("outline", "file-spreadsheet", "FileSpreadsheet", __iconNode10);
468
477
 
469
478
  // node_modules/@tabler/icons-react/dist/esm/icons/IconLoader2.mjs
470
- var __iconNode10 = [["path", { "d": "M12 3a9 9 0 1 0 9 9", "key": "svg-0" }]];
471
- var IconLoader2 = createReactComponent("outline", "loader-2", "Loader2", __iconNode10);
479
+ var __iconNode11 = [["path", { "d": "M12 3a9 9 0 1 0 9 9", "key": "svg-0" }]];
480
+ var IconLoader2 = createReactComponent("outline", "loader-2", "Loader2", __iconNode11);
472
481
 
473
482
  // node_modules/@tabler/icons-react/dist/esm/icons/IconPhoto.mjs
474
- 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" }]];
475
- var IconPhoto = createReactComponent("outline", "photo", "Photo", __iconNode11);
483
+ var __iconNode12 = [["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" }]];
484
+ var IconPhoto = createReactComponent("outline", "photo", "Photo", __iconNode12);
485
+
486
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconFlask2Filled.mjs
487
+ var __iconNode13 = [["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" }]];
488
+ var IconFlask2Filled = createReactComponent("filled", "flask-2-filled", "Flask2Filled", __iconNode13);
476
489
 
477
490
  // src/components/artifacts/artifact-copy-as-image-button/artifact-copy-as-image-button.tsx
478
491
  var import_react6 = require("react");
@@ -2130,6 +2143,36 @@ function useScrollShadow() {
2130
2143
  return { targetRef, isScrolled };
2131
2144
  }
2132
2145
 
2146
+ // src/components/table/data-table.tsx
2147
+ var import_jsx_runtime21 = require("react/jsx-runtime");
2148
+ var DATA_TABLE_HEAD_CLASS = "h-auto py-2 px-4 text-xs font-medium text-foreground whitespace-nowrap text-left";
2149
+ var DATA_TABLE_CELL_CLASS = "p-4 text-sm font-normal text-foreground align-top min-w-[150px] text-left";
2150
+ var DATA_TABLE_ROW_CLASS = "border-b-brown-30 bg-background/70 hover:bg-secondary";
2151
+ var DATA_TABLE_SCROLL_SHADOW = "0 1px 2px rgb(0 0 0 / 0.01), 0 6px 12px -2px rgb(0 0 0 / 0.03)";
2152
+ function DataTable({ header, children, maxBodyHeight, className }) {
2153
+ const { targetRef, isScrolled } = useScrollShadow();
2154
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2155
+ "div",
2156
+ {
2157
+ ref: targetRef,
2158
+ className: cn("overscroll-none", className),
2159
+ style: maxBodyHeight !== void 0 ? { maxHeight: maxBodyHeight, overflowY: "auto" } : void 0,
2160
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(Table, { containerClassName: "overflow-visible", children: [
2161
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2162
+ TableHeader,
2163
+ {
2164
+ "data-scrolled": isScrolled ? "true" : void 0,
2165
+ className: "sticky top-0 z-10 bg-background/70 backdrop-blur-lg transition-shadow",
2166
+ style: isScrolled ? { boxShadow: DATA_TABLE_SCROLL_SHADOW } : void 0,
2167
+ children: header
2168
+ }
2169
+ ),
2170
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(TableBody, { children })
2171
+ ] })
2172
+ }
2173
+ );
2174
+ }
2175
+
2133
2176
  // src/components/artifacts/table-artifact/table-artifact-content.constants.ts
2134
2177
  var TABLE_STATUS = {
2135
2178
  LOADING: "loading",
@@ -2142,14 +2185,10 @@ var TABLE_STATUS = {
2142
2185
  function formatCell(row, column) {
2143
2186
  return row[column.key] ?? "";
2144
2187
  }
2145
- var HEAD_CLASS = "h-auto py-2 px-4 text-xs font-medium text-foreground whitespace-nowrap text-left";
2146
- var CELL_CLASS = "p-4 text-sm font-normal text-foreground align-top min-w-[150px] text-left";
2147
- var ROW_CLASSES = "border-b-brown-30 bg-background/70 hover:bg-secondary";
2148
- var DATA_ROW_CLASSES = `${ROW_CLASSES} animate-in fade-in duration-300`;
2149
- var SCROLL_SHADOW = "0 1px 2px rgb(0 0 0 / 0.01), 0 6px 12px -2px rgb(0 0 0 / 0.03)";
2188
+ var DATA_ROW_CLASSES = `${DATA_TABLE_ROW_CLASS} animate-in fade-in duration-300`;
2150
2189
 
2151
2190
  // src/components/artifacts/table-artifact/table-artifact-content.tsx
2152
- var import_jsx_runtime21 = require("react/jsx-runtime");
2191
+ var import_jsx_runtime22 = require("react/jsx-runtime");
2153
2192
  function TableArtifactContent({
2154
2193
  columns,
2155
2194
  data,
@@ -2159,50 +2198,45 @@ function TableArtifactContent({
2159
2198
  labels
2160
2199
  }) {
2161
2200
  if (data.status === TABLE_STATUS.ERROR) {
2162
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(StatusMessage, { $tone: "error", children: labels.loadError });
2201
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(StatusMessage, { $tone: "error", children: labels.loadError });
2163
2202
  }
2164
2203
  if (data.status === TABLE_STATUS.UNAVAILABLE) {
2165
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(StatusMessage, { $tone: "info", children: labels.unavailable });
2204
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(StatusMessage, { $tone: "info", children: labels.unavailable });
2166
2205
  }
2167
2206
  if (data.status === TABLE_STATUS.LOADING) {
2168
2207
  if (typeof knownRowCount === "number" && knownRowCount > 0) {
2169
2208
  const shimmerCount = Math.min(knownRowCount, maxShimmerRows);
2170
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ArtifactTable, { columns, maxBodyHeight, children: renderShimmerRows(columns, shimmerCount) });
2209
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ArtifactTable, { columns, maxBodyHeight, children: renderShimmerRows(columns, shimmerCount) });
2171
2210
  }
2172
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(StatusMessage, { $tone: "info", children: labels.loading });
2211
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(StatusMessage, { $tone: "info", children: labels.loading });
2173
2212
  }
2174
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ArtifactTable, { columns, maxBodyHeight, children: data.rows.length === 0 ? renderEmptyRow(columns.length, labels.empty) : renderDataRows(columns, data.rows) });
2213
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ArtifactTable, { columns, maxBodyHeight, children: data.rows.length === 0 ? renderEmptyRow(columns.length, labels.empty) : renderDataRows(columns, data.rows) });
2175
2214
  }
2176
2215
  function ArtifactTable({ columns, maxBodyHeight, children }) {
2177
- const { targetRef, isScrolled } = useScrollShadow();
2178
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { ref: targetRef, className: "overscroll-none", style: { maxHeight: maxBodyHeight, overflowY: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(Table, { containerClassName: "overflow-visible", children: [
2179
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2180
- TableHeader,
2181
- {
2182
- "data-scrolled": isScrolled ? "true" : void 0,
2183
- className: "sticky top-0 z-10 bg-background/70 backdrop-blur-lg transition-shadow",
2184
- style: isScrolled ? { boxShadow: SCROLL_SHADOW } : void 0,
2185
- 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)) })
2186
- }
2187
- ),
2188
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(TableBody, { children })
2189
- ] }) });
2216
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2217
+ DataTable,
2218
+ {
2219
+ maxBodyHeight,
2220
+ 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)) }),
2221
+ children
2222
+ }
2223
+ );
2190
2224
  }
2191
2225
  function renderShimmerRows(columns, count) {
2192
- return Array.from({ length: count }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(TableRow, { className: ROW_CLASSES, "aria-hidden": "true", children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(TableCell, { className: CELL_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "block h-3 w-3/4 animate-pulse rounded bg-muted-foreground/20" }) }, column.key)) }, `shimmer-${index}`));
2226
+ 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}`));
2193
2227
  }
2194
2228
  function renderDataRows(columns, rows) {
2195
- return rows.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(TableRow, { className: DATA_ROW_CLASSES, children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(TableCell, { className: CELL_CLASS, children: formatCell(row, column) }, column.key)) }, index));
2229
+ 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));
2196
2230
  }
2197
2231
  function renderEmptyRow(colSpan, emptyMessage) {
2198
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(TableRow, { className: "hover:bg-transparent", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(TableCell, { colSpan, className: "py-6 text-center text-sm text-muted-foreground", children: emptyMessage }) });
2232
+ 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 }) });
2199
2233
  }
2200
2234
 
2201
2235
  // src/components/artifacts/deck-artifact/deck-markdown.tsx
2202
2236
  var import_react_markdown = __toESM(require("react-markdown"), 1);
2203
2237
  var import_remark_breaks = __toESM(require("remark-breaks"), 1);
2204
2238
  var import_remark_gfm = __toESM(require("remark-gfm"), 1);
2205
- var import_jsx_runtime22 = require("react/jsx-runtime");
2239
+ var import_jsx_runtime23 = require("react/jsx-runtime");
2206
2240
  function sanitize(text) {
2207
2241
  return text.split("\n").filter((line) => {
2208
2242
  const t = line.trim();
@@ -2210,45 +2244,45 @@ function sanitize(text) {
2210
2244
  }).join("\n");
2211
2245
  }
2212
2246
  var MARKDOWN_COMPONENTS = {
2213
- h1: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h1", { className: "text-[30px] font-semibold leading-tight text-foreground mb-3", ...props }),
2214
- h2: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h2", { className: "text-[26px] font-semibold leading-tight text-foreground mb-2", ...props }),
2215
- h3: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h3", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
2216
- h4: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h4", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
2217
- h5: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h5", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
2218
- h6: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h6", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
2219
- p: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "text-[22px] leading-relaxed text-foreground my-2", ...props }),
2220
- ul: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("ul", { className: "list-disc pl-7 text-[22px] leading-relaxed text-foreground my-2", ...props }),
2221
- ol: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("ol", { className: "list-decimal pl-7 text-[22px] leading-relaxed text-foreground my-2", ...props }),
2247
+ h1: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h1", { className: "text-[30px] font-semibold leading-tight text-foreground mb-3", ...props }),
2248
+ h2: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h2", { className: "text-[26px] font-semibold leading-tight text-foreground mb-2", ...props }),
2249
+ h3: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h3", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
2250
+ h4: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h4", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
2251
+ h5: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h5", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
2252
+ h6: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h6", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
2253
+ p: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "text-[22px] leading-relaxed text-foreground my-2", ...props }),
2254
+ 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 }),
2255
+ 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 }),
2222
2256
  // react-markdown injects list metadata (`ordered` / `index` / `checked`) that must not leak to the DOM.
2223
- li: ({ node: _node, ordered: _ordered, index: _index, checked: _checked, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("li", { className: "my-1", ...props }),
2224
- strong: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("strong", { className: "font-semibold", ...props }),
2225
- em: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("em", { className: "italic", ...props }),
2257
+ li: ({ node: _node, ordered: _ordered, index: _index, checked: _checked, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("li", { className: "my-1", ...props }),
2258
+ strong: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("strong", { className: "font-semibold", ...props }),
2259
+ em: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("em", { className: "italic", ...props }),
2226
2260
  // Gate `<img src>` against an http(s) allowlist. react-markdown v8 percent-encodes the URL but
2227
2261
  // does NOT protocol-filter image src (unlike link href), so an LLM-authored
2228
2262
  // `![](javascript:…)` / `![](data:…)` or a tracking-pixel `![](http://…)` would otherwise render
2229
2263
  // with the raw URL. Unsafe src → render nothing.
2230
- img: ({ node: _node, src, ...props }) => typeof src === "string" && isSafeDownloadUrl(src) ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("img", { src, className: "max-w-full", ...props }) : null,
2264
+ img: ({ node: _node, src, ...props }) => typeof src === "string" && isSafeDownloadUrl(src) ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("img", { src, className: "max-w-full", ...props }) : null,
2231
2265
  a: ({ node: _node, ...props }) => (
2232
2266
  // `rel` is forced AFTER `{...props}` so it can't be overridden — if a consumer ever adds
2233
2267
  // `linkTarget="_blank"`, LLM-authored links still can't reach `window.opener`.
2234
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("a", { className: "underline underline-offset-2", ...props, rel: "noopener noreferrer" })
2268
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("a", { className: "underline underline-offset-2", ...props, rel: "noopener noreferrer" })
2235
2269
  ),
2236
2270
  // react-markdown passes `inline` to distinguish inline code from fenced blocks — strip it from the DOM.
2237
- code: ({ node: _node, inline: _inline, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("code", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-[18px]", ...props }),
2238
- blockquote: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("blockquote", { className: "border-l-2 border-brown-alpha-12 pl-4 text-[22px] text-muted-foreground", ...props }),
2239
- hr: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("hr", { className: "my-4 border-brown-alpha-12", ...props }),
2240
- table: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "overflow-x-auto", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("table", { className: "w-full border-collapse text-[20px]", ...props }) }),
2271
+ 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 }),
2272
+ 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 }),
2273
+ hr: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("hr", { className: "my-4 border-brown-alpha-12", ...props }),
2274
+ 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 }) }),
2241
2275
  // react-markdown passes `isHeader` to cell renderers — strip it so it never reaches the DOM.
2242
- th: ({ node: _node, isHeader: _isHeader, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("th", { className: "border-b border-brown-alpha-12 px-3 py-1.5 text-left font-medium", ...props }),
2243
- td: ({ node: _node, isHeader: _isHeader, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("td", { className: "border-b border-brown-alpha-12 px-3 py-1.5", ...props })
2276
+ 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 }),
2277
+ 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 })
2244
2278
  };
2245
2279
  function DeckMarkdown({ markdown }) {
2246
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_markdown.default, { remarkPlugins: [import_remark_gfm.default, import_remark_breaks.default], components: MARKDOWN_COMPONENTS, children: sanitize(markdown) });
2280
+ 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) });
2247
2281
  }
2248
2282
 
2249
2283
  // src/components/artifacts/deck-artifact/slide-renderers.tsx
2250
2284
  var import_react15 = require("react");
2251
- var import_jsx_runtime23 = require("react/jsx-runtime");
2285
+ var import_jsx_runtime24 = require("react/jsx-runtime");
2252
2286
  function safeLogoUrl(meta) {
2253
2287
  return meta?.logoUrl && isSafeDownloadUrl(meta.logoUrl) ? meta.logoUrl : null;
2254
2288
  }
@@ -2275,7 +2309,7 @@ function SlideFrame({ meta, children, accent = false, bare = false }) {
2275
2309
  const eyebrowColor = accent ? "text-white/70" : "text-brown-60";
2276
2310
  const borderColor = accent ? "border-white/20" : "border-brown-alpha-12";
2277
2311
  const logoSrc = safeLogoUrl(meta);
2278
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { ref: frameRef, className: `relative aspect-[16/9] w-full overflow-hidden rounded-lg ${bg}`, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
2312
+ 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)(
2279
2313
  "div",
2280
2314
  {
2281
2315
  className: "absolute left-0 top-0 origin-top-left",
@@ -2286,26 +2320,26 @@ function SlideFrame({ meta, children, accent = false, bare = false }) {
2286
2320
  visibility: scale === null ? "hidden" : "visible"
2287
2321
  },
2288
2322
  children: [
2289
- !bare ? /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
2323
+ !bare ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
2290
2324
  "div",
2291
2325
  {
2292
2326
  className: `absolute inset-x-0 top-0 flex items-center justify-between border-b px-16 ${borderColor}`,
2293
2327
  style: { height: EYEBROW_H },
2294
2328
  children: [
2295
- meta?.eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: eyebrowColor, style: { ...ACCENT_FONT, fontSize: 22 }, children: meta.eyebrow }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", {}),
2296
- logoSrc ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("img", { src: logoSrc, alt: "", className: "object-contain", style: { maxHeight: CANVAS_LOGO_MAX_H } }) : null
2329
+ 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", {}),
2330
+ logoSrc ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("img", { src: logoSrc, alt: "", className: "object-contain", style: { maxHeight: CANVAS_LOGO_MAX_H } }) : null
2297
2331
  ]
2298
2332
  }
2299
2333
  ) : null,
2300
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "absolute inset-x-0 bottom-0 overflow-hidden", style: { top: bare ? 0 : EYEBROW_H }, children })
2334
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "absolute inset-x-0 bottom-0 overflow-hidden", style: { top: bare ? 0 : EYEBROW_H }, children })
2301
2335
  ]
2302
2336
  }
2303
2337
  ) });
2304
2338
  }
2305
2339
  function TitleSlide({ slide, meta }) {
2306
2340
  const logoSrc = safeLogoUrl(meta);
2307
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SlideFrame, { meta, bare: true, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex h-full flex-col justify-center px-24 py-16", children: [
2308
- logoSrc ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2341
+ 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: [
2342
+ logoSrc ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2309
2343
  "img",
2310
2344
  {
2311
2345
  src: logoSrc,
@@ -2314,7 +2348,7 @@ function TitleSlide({ slide, meta }) {
2314
2348
  style: { maxHeight: 56, maxWidth: 380 }
2315
2349
  }
2316
2350
  ) : null,
2317
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2351
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2318
2352
  "h1",
2319
2353
  {
2320
2354
  className: "font-bold tracking-tight text-brown-100",
@@ -2322,36 +2356,36 @@ function TitleSlide({ slide, meta }) {
2322
2356
  children: slide.title
2323
2357
  }
2324
2358
  ),
2325
- slide.subtitle ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "mt-7 text-brown-70", style: { ...ACCENT_FONT, fontSize: 34 }, children: slide.subtitle }) : null,
2326
- slide.description ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "mt-4 leading-relaxed text-brown-70", style: { fontSize: 24, maxWidth: 880 }, children: slide.description }) : null,
2327
- meta?.date ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "mt-10 text-brown-70", style: { ...ACCENT_FONT, fontSize: 30 }, children: meta.date }) : null
2359
+ slide.subtitle ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "mt-7 text-brown-70", style: { ...ACCENT_FONT, fontSize: 34 }, children: slide.subtitle }) : null,
2360
+ 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,
2361
+ meta?.date ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "mt-10 text-brown-70", style: { ...ACCENT_FONT, fontSize: 30 }, children: meta.date }) : null
2328
2362
  ] }) });
2329
2363
  }
2330
2364
  function AgendaSlide({ slide, meta, labels }) {
2331
2365
  const items = slide.items ?? [];
2332
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "h-full px-24 py-14", children: [
2333
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h2", { className: "mb-10 font-bold text-brown-90", style: { fontSize: 40 }, children: slide.title || labels.agenda }),
2334
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "flex flex-col", children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex items-baseline gap-6 border-b border-brown-alpha-12 py-5", children: [
2335
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "shrink-0 text-indigo-600", style: { ...ACCENT_FONT, fontSize: 28, width: 64 }, children: String(i + 1).padStart(2, "0") }),
2336
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "text-brown-90", style: { fontSize: 28 }, children: item })
2366
+ 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: [
2367
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h2", { className: "mb-10 font-bold text-brown-90", style: { fontSize: 40 }, children: slide.title || labels.agenda }),
2368
+ /* @__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: [
2369
+ /* @__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") }),
2370
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "text-brown-90", style: { fontSize: 28 }, children: item })
2337
2371
  ] }, i)) })
2338
2372
  ] }) });
2339
2373
  }
2340
2374
  function SectionSlide({ slide, meta }) {
2341
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SlideFrame, { meta, accent: true, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex h-full flex-col justify-center gap-6 px-24", children: [
2342
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h2", { className: "font-bold text-white", style: { fontSize: 72, lineHeight: 1.05, maxWidth: 940 }, children: slide.title }),
2343
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "mt-2 bg-white/50", style: { width: 96, height: 5 } })
2375
+ 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: [
2376
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h2", { className: "font-bold text-white", style: { fontSize: 72, lineHeight: 1.05, maxWidth: 940 }, children: slide.title }),
2377
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "mt-2 bg-white/50", style: { width: 96, height: 5 } })
2344
2378
  ] }) });
2345
2379
  }
2346
2380
  function ClosingSlide({ meta, labels }) {
2347
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex h-full flex-col items-center justify-center gap-6 px-24 text-center", children: [
2348
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h1", { className: "font-bold text-brown-100", style: { fontSize: 72 }, children: labels.thankYou }),
2349
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "text-indigo-600", style: { ...ACCENT_FONT, fontSize: 36 }, children: labels.questions })
2381
+ 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: [
2382
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h1", { className: "font-bold text-brown-100", style: { fontSize: 72 }, children: labels.thankYou }),
2383
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-indigo-600", style: { ...ACCENT_FONT, fontSize: 36 }, children: labels.questions })
2350
2384
  ] }) });
2351
2385
  }
2352
2386
 
2353
2387
  // src/components/artifacts/deck-artifact/deck-artifact-content.tsx
2354
- var import_jsx_runtime24 = require("react/jsx-runtime");
2388
+ var import_jsx_runtime25 = require("react/jsx-runtime");
2355
2389
  var TABLE_BLOCK_MAX_SHIMMER_ROWS = 10;
2356
2390
  var TABLE_CHROME_RESERVE = 56;
2357
2391
  var VISUAL_FALLBACK_HEIGHT = 360;
@@ -2381,14 +2415,14 @@ function DeckArtifactContent({
2381
2415
  [slides.length, onNavigate, isControlled, onSlideChange]
2382
2416
  );
2383
2417
  const position = labels.position.replace("{current}", String(current + 1)).replace("{total}", String(slides.length));
2384
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex flex-col gap-3 p-4", children: [
2385
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SlideDispatch, { slide, labels, meta }),
2386
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
2418
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex flex-col gap-3 p-4", children: [
2419
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SlideDispatch, { slide, labels, meta }),
2420
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
2387
2421
  "div",
2388
2422
  {
2389
2423
  className: `flex items-center justify-between border-t pt-2 ${onDark ? "border-white/20" : "border-brown-alpha-12"}`,
2390
2424
  children: [
2391
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2425
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2392
2426
  IconButton,
2393
2427
  {
2394
2428
  icon: IconChevronLeft,
@@ -2399,8 +2433,8 @@ function DeckArtifactContent({
2399
2433
  onClick: () => goTo(current - 1)
2400
2434
  }
2401
2435
  ),
2402
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: `text-xs font-medium ${onDark ? "text-white/70" : "text-brown-70"}`, children: position }),
2403
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2436
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `text-xs font-medium ${onDark ? "text-white/70" : "text-brown-70"}`, children: position }),
2437
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2404
2438
  IconButton,
2405
2439
  {
2406
2440
  icon: IconChevronRight,
@@ -2420,16 +2454,16 @@ function SlideDispatch({ slide, labels, meta }) {
2420
2454
  const kind = slide.kind ?? deckSlideKinds.CONTENT;
2421
2455
  switch (kind) {
2422
2456
  case deckSlideKinds.TITLE:
2423
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(TitleSlide, { slide, meta });
2457
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(TitleSlide, { slide, meta });
2424
2458
  case deckSlideKinds.AGENDA:
2425
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(AgendaSlide, { slide, meta, labels });
2459
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(AgendaSlide, { slide, meta, labels });
2426
2460
  case deckSlideKinds.SECTION:
2427
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SectionSlide, { slide, meta });
2461
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SectionSlide, { slide, meta });
2428
2462
  case deckSlideKinds.CLOSING:
2429
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ClosingSlide, { meta, labels });
2463
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ClosingSlide, { meta, labels });
2430
2464
  case deckSlideKinds.CONTENT:
2431
2465
  default:
2432
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ContentSlide, { slide, meta, labels });
2466
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ContentSlide, { slide, meta, labels });
2433
2467
  }
2434
2468
  }
2435
2469
  function isVisualBlock(block) {
@@ -2442,25 +2476,25 @@ function ContentSlide({ slide, meta, labels }) {
2442
2476
  (b) => b.type === deckBlockTypes.TEXT
2443
2477
  );
2444
2478
  if (visuals.length === 1 && texts.length > 0) {
2445
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex h-full items-stretch gap-12 px-16 py-12", children: [
2446
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "flex w-[42%] shrink-0 flex-col overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(AutoFit, { children: [
2447
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h3", { className: "mb-5 font-bold leading-tight text-foreground", style: { fontSize: 34 }, children: slide.title }),
2448
- texts.map((block, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(DeckMarkdown, { markdown: block.markdown }, i))
2479
+ 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: [
2480
+ /* @__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: [
2481
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h3", { className: "mb-5 font-bold leading-tight text-foreground", style: { fontSize: 34 }, children: slide.title }),
2482
+ texts.map((block, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DeckMarkdown, { markdown: block.markdown }, i))
2449
2483
  ] }) }),
2450
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "min-h-0 min-w-0 flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(FillVisual, { block: visuals[0], labels }) })
2484
+ /* @__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 }) })
2451
2485
  ] }) });
2452
2486
  }
2453
2487
  if (visuals.length > 0) {
2454
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex h-full flex-col gap-5 px-16 py-10", children: [
2455
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h3", { className: "shrink-0 font-bold leading-tight text-foreground", style: { fontSize: 32 }, children: slide.title }),
2488
+ 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: [
2489
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h3", { className: "shrink-0 font-bold leading-tight text-foreground", style: { fontSize: 32 }, children: slide.title }),
2456
2490
  content.map(
2457
- (block, i) => isVisualBlock(block) ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "min-h-0 min-w-0 flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(FillVisual, { block, labels }) }, i) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "shrink-0 overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(DeckMarkdown, { markdown: block.markdown }) }, i)
2491
+ (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)
2458
2492
  )
2459
2493
  ] }) });
2460
2494
  }
2461
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SlideFrame, { meta, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "h-full px-24 py-12", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(AutoFit, { children: [
2462
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h3", { className: "mb-6 font-bold leading-tight text-foreground", style: { fontSize: 38 }, children: slide.title }),
2463
- texts.map((block, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(DeckMarkdown, { markdown: block.markdown }, i))
2495
+ 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: [
2496
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h3", { className: "mb-6 font-bold leading-tight text-foreground", style: { fontSize: 38 }, children: slide.title }),
2497
+ texts.map((block, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DeckMarkdown, { markdown: block.markdown }, i))
2464
2498
  ] }) }) });
2465
2499
  }
2466
2500
  function AutoFit({ children }) {
@@ -2484,7 +2518,7 @@ function AutoFit({ children }) {
2484
2518
  return () => ro.disconnect();
2485
2519
  }, []);
2486
2520
  const scaled = fit.scale < 1;
2487
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { ref: boxRef, className: "flex h-full min-h-0 w-full flex-col justify-center overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { style: scaled ? { height: fit.height } : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2521
+ 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)(
2488
2522
  "div",
2489
2523
  {
2490
2524
  ref: contentRef,
@@ -2509,12 +2543,12 @@ function FillVisual({ block, labels }) {
2509
2543
  return () => ro.disconnect();
2510
2544
  }, []);
2511
2545
  const chartLabels = labels.chart ?? DEFAULT_CHART_ARTIFACT_LABELS;
2512
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { ref, className: "h-full min-h-0 w-full overflow-hidden", children: block.type === deckBlockTypes.CHART ? (
2546
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { ref, className: "h-full min-h-0 w-full overflow-hidden", children: block.type === deckBlockTypes.CHART ? (
2513
2547
  // ChartArtifactContent assumes a non-empty rowset (the standalone ChartArtifact guards
2514
2548
  // `rows.length > 0` upstream); mirror that guard here so an empty inline chart shows the
2515
2549
  // localized empty status instead of a blank chart area.
2516
- block.rows.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(StatusMessage, { $tone: "info", children: chartLabels.empty }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { style: { height }, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ChartArtifactContent, { config: block.config, rows: block.rows, labels: chartLabels }) })
2517
- ) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
2550
+ 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 }) })
2551
+ ) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2518
2552
  TableArtifactContent,
2519
2553
  {
2520
2554
  columns: block.config.columns,
@@ -2580,7 +2614,7 @@ function isValidDeckBlock(block) {
2580
2614
  }
2581
2615
 
2582
2616
  // src/components/artifacts/deck-artifact/deck-artifact.tsx
2583
- var import_jsx_runtime25 = require("react/jsx-runtime");
2617
+ var import_jsx_runtime26 = require("react/jsx-runtime");
2584
2618
  var TITLE_CLASSES2 = "text-sm font-semibold text-foreground";
2585
2619
  function DeckArtifact({ artifact, labels, callbacks }) {
2586
2620
  const validConfig = isValidDeckConfig(artifact.config);
@@ -2621,9 +2655,9 @@ function DeckArtifact({ artifact, labels, callbacks }) {
2621
2655
  const meta = artifact.config?.meta;
2622
2656
  const handleOpenFullscreen = () => setIsFullscreen(true);
2623
2657
  const handleCloseFullscreen = () => setIsFullscreen(false);
2624
- const actions = /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(ArtifactActions, { ...{ [CAPTURE_EXCLUDE_ATTRIBUTE]: "" }, children: [
2625
- showDownload ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ArtifactDownloadButton, { href: presignedUrl ?? "", label: resolvedLabels.download, onClick: handleDownload }) : null,
2626
- validConfig ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2658
+ const actions = /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(ArtifactActions, { ...{ [CAPTURE_EXCLUDE_ATTRIBUTE]: "" }, children: [
2659
+ showDownload ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactDownloadButton, { href: presignedUrl ?? "", label: resolvedLabels.download, onClick: handleDownload }) : null,
2660
+ validConfig ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2627
2661
  IconButton,
2628
2662
  {
2629
2663
  icon: IconArrowsMaximize,
@@ -2634,21 +2668,21 @@ function DeckArtifact({ artifact, labels, callbacks }) {
2634
2668
  ) : null
2635
2669
  ] });
2636
2670
  if (!validConfig) {
2637
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
2638
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
2639
- artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ArtifactTitle, { className: TITLE_CLASSES2, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", {}),
2671
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
2672
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
2673
+ artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactTitle, { className: TITLE_CLASSES2, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", {}),
2640
2674
  actions
2641
2675
  ] }),
2642
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(StatusMessage, { $tone: "info", children: resolvedLabels.unavailable }) })
2676
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(StatusMessage, { $tone: "info", children: resolvedLabels.unavailable }) })
2643
2677
  ] });
2644
2678
  }
2645
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
2646
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
2647
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
2648
- artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ArtifactTitle, { className: TITLE_CLASSES2, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", {}),
2679
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
2680
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
2681
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
2682
+ artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactTitle, { className: TITLE_CLASSES2, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", {}),
2649
2683
  actions
2650
2684
  ] }),
2651
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2685
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2652
2686
  DeckArtifactContent,
2653
2687
  {
2654
2688
  slides: artifact.config.slides,
@@ -2661,7 +2695,7 @@ function DeckArtifact({ artifact, labels, callbacks }) {
2661
2695
  ) })
2662
2696
  ] }),
2663
2697
  isFullscreen && (0, import_react_dom.createPortal)(
2664
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2698
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2665
2699
  FullscreenOverlay,
2666
2700
  {
2667
2701
  artifact,
@@ -2685,15 +2719,15 @@ function FullscreenOverlay({
2685
2719
  onClose
2686
2720
  }) {
2687
2721
  const meta = artifact.config?.meta;
2688
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2722
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2689
2723
  "div",
2690
2724
  {
2691
2725
  className: "fixed inset-0 z-[2147483647] flex items-center justify-center bg-black/80",
2692
2726
  role: "dialog",
2693
2727
  "aria-modal": "true",
2694
2728
  "aria-label": resolvedLabels.exitFullscreen,
2695
- children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "relative", style: { width: "min(94vw, calc(82vh * 16 / 9))" }, children: [
2696
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2729
+ children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "relative", style: { width: "min(94vw, calc(82vh * 16 / 9))" }, children: [
2730
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2697
2731
  DeckArtifactContent,
2698
2732
  {
2699
2733
  slides: artifact.config.slides,
@@ -2705,15 +2739,15 @@ function FullscreenOverlay({
2705
2739
  onDark: true
2706
2740
  }
2707
2741
  ),
2708
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
2742
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
2709
2743
  "button",
2710
2744
  {
2711
2745
  className: "absolute -top-10 right-6 flex items-center gap-1.5 text-sm text-white/80 hover:text-white",
2712
2746
  "aria-label": resolvedLabels.exitFullscreen,
2713
2747
  onClick: onClose,
2714
2748
  children: [
2715
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(IconArrowsMinimize, { size: 16 }),
2716
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { children: resolvedLabels.exitFullscreen })
2749
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(IconArrowsMinimize, { size: 16 }),
2750
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { children: resolvedLabels.exitFullscreen })
2717
2751
  ]
2718
2752
  }
2719
2753
  )
@@ -2790,7 +2824,7 @@ function useTableArtifactData(presignedUrl, columns) {
2790
2824
  }
2791
2825
 
2792
2826
  // src/components/artifacts/table-artifact/table-artifact.tsx
2793
- var import_jsx_runtime26 = require("react/jsx-runtime");
2827
+ var import_jsx_runtime27 = require("react/jsx-runtime");
2794
2828
  var TITLE_CLASSES3 = "text-sm font-semibold text-foreground";
2795
2829
  var TABLE_MAX_BODY_HEIGHT = 480;
2796
2830
  var MAX_SHIMMER_ROWS = 10;
@@ -2813,10 +2847,10 @@ function TableArtifact({ artifact, labels, callbacks }) {
2813
2847
  const onDownload = callbacks?.onDownload;
2814
2848
  const handleDownloadClick = onDownload ? () => onDownload(artifact) : void 0;
2815
2849
  if (!validConfig || !validColumns) {
2816
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
2817
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
2818
- artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactTitle, { className: TITLE_CLASSES3, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", {}),
2819
- presignedUrl ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2850
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
2851
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
2852
+ artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactTitle, { className: TITLE_CLASSES3, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", {}),
2853
+ presignedUrl ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2820
2854
  ArtifactDownloadButton,
2821
2855
  {
2822
2856
  href: presignedUrl,
@@ -2825,17 +2859,17 @@ function TableArtifact({ artifact, labels, callbacks }) {
2825
2859
  }
2826
2860
  ) }) : null
2827
2861
  ] }),
2828
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactContent, { className: "p-0 overflow-auto", style: { maxHeight: TABLE_MAX_BODY_HEIGHT }, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(StatusMessage, { $tone: "info", children: resolvedLabels.unavailable }) })
2862
+ /* @__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 }) })
2829
2863
  ] });
2830
2864
  }
2831
2865
  return (
2832
2866
  // The table body owns its own scroll container (`ArtifactTable` inside `TableArtifactContent`).
2833
2867
  // Disable the outer overflow container so only one scroll context exists — this prevents
2834
2868
  // double-scroll nesting and lets `useScrollShadow` find the correct scroll ancestor.
2835
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
2836
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
2837
- artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactTitle, { className: TITLE_CLASSES3, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", {}),
2838
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2869
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
2870
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
2871
+ artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactTitle, { className: TITLE_CLASSES3, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", {}),
2872
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2839
2873
  ArtifactDownloadButton,
2840
2874
  {
2841
2875
  href: presignedUrl ?? "",
@@ -2844,7 +2878,7 @@ function TableArtifact({ artifact, labels, callbacks }) {
2844
2878
  }
2845
2879
  ) })
2846
2880
  ] }),
2847
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactContent, { className: "p-0 overflow-visible", style: { maxHeight: "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2881
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactContent, { className: "p-0 overflow-visible", style: { maxHeight: "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2848
2882
  TableArtifactContent,
2849
2883
  {
2850
2884
  columns: validColumns,
@@ -2887,13 +2921,13 @@ function artifactToClipboardText(artifact) {
2887
2921
  }
2888
2922
 
2889
2923
  // src/components/blocks/artifact-ref-block/artifact-ref-block.tsx
2890
- var import_jsx_runtime27 = require("react/jsx-runtime");
2924
+ var import_jsx_runtime28 = require("react/jsx-runtime");
2891
2925
  function ArtifactRefBlock({ block }) {
2892
2926
  const { artifact, labels, callbacks } = block.payload;
2893
2927
  const entry = ArtifactServices[artifact.type];
2894
2928
  if (!entry) return null;
2895
2929
  const Component = entry.Component;
2896
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Component, { artifact, labels, callbacks });
2930
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Component, { artifact, labels, callbacks });
2897
2931
  }
2898
2932
 
2899
2933
  // src/components/blocks/block-services/artifact-ref-block-service.ts
@@ -2908,26 +2942,99 @@ var ArtifactRefBlockService = {
2908
2942
  toClipboardText: (block) => artifactToClipboardText(block.payload.artifact)
2909
2943
  };
2910
2944
 
2911
- // src/utils/markdown-to-plain-text.ts
2912
- var PLACEHOLDER_PREFIX = "\u200B\u200BIC";
2913
- var PLACEHOLDER_SUFFIX = "\u200B\u200B";
2914
- var PLACEHOLDER_REGEX = new RegExp(`${PLACEHOLDER_PREFIX}(\\d+)${PLACEHOLDER_SUFFIX}`, "g");
2915
- function stripInlineMarks(text) {
2916
- return text.replace(/\*{3}(.+?)\*{3}/g, "$1").replace(/\*{2}(.+?)\*{2}/g, "$1").replace(/_{2}(.+?)_{2}/g, "$1").replace(/\*(.+?)\*/g, "$1").replace(/_(.+?)_/g, "$1").replace(/~~(.+?)~~/g, "$1");
2945
+ // src/components/blocks/notification-draft-block/notification-draft-block.tsx
2946
+ var import_react20 = require("react");
2947
+
2948
+ // src/components/badge/badge.tsx
2949
+ var import_jsx_runtime29 = require("react/jsx-runtime");
2950
+ var BASE = "inline-flex items-center whitespace-nowrap rounded-full";
2951
+ var SIZES = {
2952
+ // `sm` is a uniform scale-down of `md` (text 10/12 of caption): padding and line-height keep
2953
+ // md's proportions (caption is 12px text on a 16px line = 1.333 ratio) so the pill shape matches.
2954
+ md: "px-2.5 py-0.5 text-geist-label-caption-medium",
2955
+ sm: "px-2 py-0.5 text-[11px]/[1.333] font-medium"
2956
+ };
2957
+ var SUBTLE = {
2958
+ neutral: "bg-brown-20 text-brown-70",
2959
+ warning: "bg-orange-50 text-orange-600",
2960
+ violet: "bg-violet-50 text-violet-600"
2961
+ };
2962
+ var OUTLINE = {
2963
+ neutral: "border border-brown-30 bg-white text-brown-100",
2964
+ warning: "border border-orange-200 bg-white text-orange-600",
2965
+ violet: "border border-violet-400 bg-white text-violet-600"
2966
+ };
2967
+ var VARIANTS = {
2968
+ subtle: SUBTLE,
2969
+ outline: OUTLINE
2970
+ };
2971
+ function Badge({
2972
+ variant = "subtle",
2973
+ tone = "neutral",
2974
+ size = "md",
2975
+ className,
2976
+ children
2977
+ }) {
2978
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: cn(BASE, SIZES[size], VARIANTS[variant][tone], className), children });
2917
2979
  }
2918
- function markdownToPlainText(markdown) {
2919
- if (!markdown) return "";
2920
- const inlineCodeSnippets = [];
2921
- let result = markdown.replace(/^<!--[\s\S]*?--!?>\n?/gm, "").replace(/```[\s\S]*?```/g, "").replace(/`([^`]+)`/g, (_match, code) => {
2922
- inlineCodeSnippets.push(code);
2923
- return `${PLACEHOLDER_PREFIX}${inlineCodeSnippets.length - 1}${PLACEHOLDER_SUFFIX}`;
2924
- }).replace(/^#{1,6}\s+/gm, "").replace(/^(?:---|\*\*\*|___)\s*$/gm, "");
2925
- result = stripInlineMarks(result).replace(/!\[([^\]]*)\]\([^)]+\)/g, "$1").replace(/\[([^\]]+)\]\([^)]+\)/g, "$1").replace(/^>\s?/gm, "").replace(/^\|[-:\s|]+\|\s*$/gm, "").replace(/^\|\s?/gm, "").replace(/\s?\|$/gm, "").replace(/\n{3,}/g, "\n\n").trim();
2926
- result = result.replace(PLACEHOLDER_REGEX, (_match, index) => inlineCodeSnippets[Number(index)]);
2927
- return result;
2980
+
2981
+ // src/components/chat/hooks/use-copy-to-clipboard.ts
2982
+ var import_react19 = require("react");
2983
+
2984
+ // src/utils/clipboard.ts
2985
+ function copyToClipboard(text, options) {
2986
+ navigator.clipboard.writeText(text).then(
2987
+ () => options?.onSuccess?.(),
2988
+ (error) => options?.onFailure?.(error)
2989
+ );
2928
2990
  }
2929
2991
 
2930
- // src/components/blocks/text-block/text-block.tsx
2992
+ // src/components/chat/hooks/use-copy-to-clipboard.ts
2993
+ var RESET_DELAY_MS = 2e3;
2994
+ function useCopyToClipboard() {
2995
+ const [isCopied, setIsCopied] = (0, import_react19.useState)(false);
2996
+ const timeoutRef = (0, import_react19.useRef)(null);
2997
+ (0, import_react19.useEffect)(() => {
2998
+ return () => {
2999
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
3000
+ };
3001
+ }, []);
3002
+ const copy = (0, import_react19.useCallback)((text) => {
3003
+ copyToClipboard(text, {
3004
+ onSuccess: () => {
3005
+ setIsCopied(true);
3006
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
3007
+ timeoutRef.current = setTimeout(() => {
3008
+ setIsCopied(false);
3009
+ timeoutRef.current = null;
3010
+ }, RESET_DELAY_MS);
3011
+ }
3012
+ });
3013
+ }, []);
3014
+ return { isCopied, copy };
3015
+ }
3016
+
3017
+ // src/components/copy-button/copy-button.tsx
3018
+ var import_jsx_runtime30 = require("react/jsx-runtime");
3019
+ function CopyButton({
3020
+ text,
3021
+ copyLabel = "Copy",
3022
+ copiedLabel = "Copied",
3023
+ className
3024
+ }) {
3025
+ const { isCopied, copy } = useCopyToClipboard();
3026
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3027
+ IconButton,
3028
+ {
3029
+ icon: isCopied ? IconCheck : IconCopy,
3030
+ onClick: () => copy(text),
3031
+ "aria-label": isCopied ? copiedLabel : copyLabel,
3032
+ className
3033
+ }
3034
+ );
3035
+ }
3036
+
3037
+ // src/components/blocks/markdown/markdown.tsx
2931
3038
  var import_react_markdown2 = __toESM(require("react-markdown"), 1);
2932
3039
  var import_remark_breaks2 = __toESM(require("remark-breaks"), 1);
2933
3040
  var import_remark_gfm2 = __toESM(require("remark-gfm"), 1);
@@ -2945,9 +3052,9 @@ var TableScroll = import_styled_components3.default.div`
2945
3052
  `;
2946
3053
 
2947
3054
  // src/components/blocks/scrollable-table/scrollable-table.tsx
2948
- var import_jsx_runtime28 = require("react/jsx-runtime");
3055
+ var import_jsx_runtime31 = require("react/jsx-runtime");
2949
3056
  function ScrollableTable({ node: _node, ...props }) {
2950
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(TableContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(TableScroll, { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("table", { ...props }) }) });
3057
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(TableContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(TableScroll, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("table", { ...props }) }) });
2951
3058
  }
2952
3059
 
2953
3060
  // src/components/blocks/text-block/sanitize.ts
@@ -3090,13 +3197,157 @@ var TextBlockWrapper = import_styled_components4.default.div`
3090
3197
  }
3091
3198
  `;
3092
3199
 
3093
- // src/components/blocks/text-block/text-block.tsx
3094
- var import_jsx_runtime29 = require("react/jsx-runtime");
3200
+ // src/components/blocks/markdown/markdown.tsx
3201
+ var import_jsx_runtime32 = require("react/jsx-runtime");
3095
3202
  var markdownComponents = {
3096
- table: ((tableProps) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(ScrollableTable, { ...tableProps }))
3203
+ table: ((tableProps) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(ScrollableTable, { ...tableProps }))
3097
3204
  };
3205
+ function Markdown({ children }) {
3206
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(TextBlockWrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_react_markdown2.default, { remarkPlugins: [import_remark_gfm2.default, import_remark_breaks2.default], components: markdownComponents, children: sanitize2(children) }) });
3207
+ }
3208
+
3209
+ // src/utils/markdown-to-plain-text.ts
3210
+ var PLACEHOLDER_PREFIX = "\u200B\u200BIC";
3211
+ var PLACEHOLDER_SUFFIX = "\u200B\u200B";
3212
+ var PLACEHOLDER_REGEX = new RegExp(`${PLACEHOLDER_PREFIX}(\\d+)${PLACEHOLDER_SUFFIX}`, "g");
3213
+ function stripInlineMarks(text) {
3214
+ return text.replace(/\*{3}(.+?)\*{3}/g, "$1").replace(/\*{2}(.+?)\*{2}/g, "$1").replace(/_{2}(.+?)_{2}/g, "$1").replace(/\*(.+?)\*/g, "$1").replace(/_(.+?)_/g, "$1").replace(/~~(.+?)~~/g, "$1");
3215
+ }
3216
+ function markdownToPlainText(markdown) {
3217
+ if (!markdown) return "";
3218
+ const inlineCodeSnippets = [];
3219
+ let result = markdown.replace(/^<!--[\s\S]*?--!?>\n?/gm, "").replace(/```[\s\S]*?```/g, "").replace(/`([^`]+)`/g, (_match, code) => {
3220
+ inlineCodeSnippets.push(code);
3221
+ return `${PLACEHOLDER_PREFIX}${inlineCodeSnippets.length - 1}${PLACEHOLDER_SUFFIX}`;
3222
+ }).replace(/^#{1,6}\s+/gm, "").replace(/^(?:---|\*\*\*|___)\s*$/gm, "");
3223
+ result = stripInlineMarks(result).replace(/!\[([^\]]*)\]\([^)]+\)/g, "$1").replace(/\[([^\]]+)\]\([^)]+\)/g, "$1").replace(/^>\s?/gm, "").replace(/^\|[-:\s|]+\|\s*$/gm, "").replace(/^\|\s?/gm, "").replace(/\s?\|$/gm, "").replace(/\n{3,}/g, "\n\n").trim();
3224
+ result = result.replace(PLACEHOLDER_REGEX, (_match, index) => inlineCodeSnippets[Number(index)]);
3225
+ return result;
3226
+ }
3227
+
3228
+ // src/components/blocks/notification-draft-block/types.ts
3229
+ var notificationChannels = {
3230
+ /** Branded email — renders a From/subject header. */
3231
+ EMAIL: "email",
3232
+ /** Slack DM — renders as a chat bubble, no subject. */
3233
+ SLACK: "slack",
3234
+ /** Microsoft Teams DM — renders as a chat bubble, no subject. */
3235
+ TEAMS: "teams"
3236
+ };
3237
+ var notificationEmailTypes = {
3238
+ /** Recipient's work email. */
3239
+ WORK: "work",
3240
+ /** Recipient's personal email. */
3241
+ PERSONAL: "personal"
3242
+ };
3243
+
3244
+ // src/components/blocks/notification-draft-block/to-text.ts
3245
+ function notificationDraftToText(payload) {
3246
+ const { channel, subject, body } = payload;
3247
+ const text = markdownToPlainText(body);
3248
+ return channel === notificationChannels.EMAIL && subject ? `${subject}
3249
+
3250
+ ${text}` : text;
3251
+ }
3252
+
3253
+ // src/components/blocks/notification-draft-block/notification-draft-block.tsx
3254
+ var import_jsx_runtime33 = require("react/jsx-runtime");
3255
+ var CHIP_LIMIT = 3;
3256
+ var RECIPIENTS_MAX_HEIGHT = 320;
3257
+ function chipLabel(recipient) {
3258
+ return recipient.name ?? recipient.email ?? recipient.employeeId;
3259
+ }
3260
+ function channelCellText(recipient) {
3261
+ return recipient.fallback ? `${recipient.channelLabel} (fallback)` : recipient.channelLabel;
3262
+ }
3263
+ function FieldLabel({ children }) {
3264
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-geist-label-caption-medium tracking-wide text-brown-60", children });
3265
+ }
3266
+ function RecipientChips({ recipients }) {
3267
+ const shown = recipients.slice(0, CHIP_LIMIT);
3268
+ const overflow = recipients.length - shown.length;
3269
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex flex-wrap items-center gap-1.5", children: [
3270
+ shown.map((recipient) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Badge, { variant: "outline", children: chipLabel(recipient) }, recipient.employeeId)),
3271
+ overflow > 0 && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Badge, { variant: "subtle", children: `+${overflow}` })
3272
+ ] });
3273
+ }
3274
+ function RecipientsTable({ recipients }) {
3275
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
3276
+ DataTable,
3277
+ {
3278
+ maxBodyHeight: RECIPIENTS_MAX_HEIGHT,
3279
+ header: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TableRow, { className: "hover:bg-transparent", children: [
3280
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableHead, { scope: "col", className: DATA_TABLE_HEAD_CLASS, children: "Name" }),
3281
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableHead, { scope: "col", className: DATA_TABLE_HEAD_CLASS, children: "Email" }),
3282
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableHead, { scope: "col", className: DATA_TABLE_HEAD_CLASS, children: "Channel" })
3283
+ ] }),
3284
+ children: recipients.map((recipient) => /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TableRow, { className: DATA_TABLE_ROW_CLASS, children: [
3285
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableCell, { className: DATA_TABLE_CELL_CLASS, children: recipient.name ?? "\u2014" }),
3286
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableCell, { className: DATA_TABLE_CELL_CLASS, children: recipient.email ?? "\u2014" }),
3287
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableCell, { className: DATA_TABLE_CELL_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Badge, { tone: recipient.fallback ? "warning" : "neutral", variant: "subtle", children: channelCellText(recipient) }) })
3288
+ ] }, recipient.employeeId))
3289
+ }
3290
+ );
3291
+ }
3292
+ function NotificationDraftBlock({ block }) {
3293
+ const { channel, subject, body, recipients } = block.payload;
3294
+ const [detailsOpen, setDetailsOpen] = (0, import_react20.useState)(false);
3295
+ const showSubject = channel === notificationChannels.EMAIL && subject;
3296
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "overflow-hidden rounded-2xl border border-brown-30 bg-white", children: [
3297
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex flex-col gap-3 border-b border-brown-30 px-4 py-3", children: [
3298
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
3299
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center gap-2", children: [
3300
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "text-geist-body-s-semi-bold text-brown-100", children: "Notification draft" }),
3301
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(Badge, { tone: "violet", variant: "subtle", size: "sm", className: "gap-1 py-1", children: [
3302
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Icon, { icon: IconFlask2Filled, size: 12 }),
3303
+ "Labs"
3304
+ ] })
3305
+ ] }),
3306
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(CopyButton, { text: notificationDraftToText(block.payload), copyLabel: "Copy draft", copiedLabel: "Copied" })
3307
+ ] }),
3308
+ showSubject && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex flex-col gap-0.5", children: [
3309
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FieldLabel, { children: "Title" }),
3310
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("p", { className: "text-geist-body-s-medium text-brown-100", children: subject })
3311
+ ] }),
3312
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex flex-col gap-1", children: [
3313
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
3314
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FieldLabel, { children: `Recipients (${recipients.length})` }),
3315
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
3316
+ "button",
3317
+ {
3318
+ type: "button",
3319
+ "aria-expanded": detailsOpen,
3320
+ onClick: () => setDetailsOpen((open) => !open),
3321
+ className: "inline-flex items-center gap-1 text-geist-label-caption-medium text-brown-70 transition-colors hover:text-brown-100",
3322
+ children: [
3323
+ "Details",
3324
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Icon, { icon: IconChevronDown, size: 14, className: detailsOpen ? "rotate-180" : void 0 })
3325
+ ]
3326
+ }
3327
+ )
3328
+ ] }),
3329
+ detailsOpen ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(RecipientsTable, { recipients }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(RecipientChips, { recipients })
3330
+ ] })
3331
+ ] }),
3332
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "px-4 py-3", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Markdown, { children: body }) })
3333
+ ] });
3334
+ }
3335
+
3336
+ // src/components/blocks/block-services/notification-draft-block-service.ts
3337
+ var NotificationDraftBlockService = {
3338
+ type: blockTypes.NOTIFICATION_DRAFT,
3339
+ Component: NotificationDraftBlock,
3340
+ /**
3341
+ * Plain-text clipboard form of the drafted notification — shared with the in-block copy button
3342
+ * via {@link notificationDraftToText} so both copy the same text.
3343
+ */
3344
+ toClipboardText: (block) => notificationDraftToText(block.payload)
3345
+ };
3346
+
3347
+ // src/components/blocks/text-block/text-block.tsx
3348
+ var import_jsx_runtime34 = require("react/jsx-runtime");
3098
3349
  function TextBlock({ block }) {
3099
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(TextBlockWrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_react_markdown2.default, { remarkPlugins: [import_remark_gfm2.default, import_remark_breaks2.default], components: markdownComponents, children: sanitize2(block.payload.text) }) });
3350
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(Markdown, { children: block.payload.text });
3100
3351
  }
3101
3352
 
3102
3353
  // src/components/blocks/block-services/text-block-service.ts
@@ -3114,23 +3365,24 @@ var TextBlockService = {
3114
3365
  // src/components/blocks/block-services/index.ts
3115
3366
  var BlockServices = {
3116
3367
  [blockTypes.TEXT]: TextBlockService,
3117
- [blockTypes.ARTIFACT_REF]: ArtifactRefBlockService
3368
+ [blockTypes.ARTIFACT_REF]: ArtifactRefBlockService,
3369
+ [blockTypes.NOTIFICATION_DRAFT]: NotificationDraftBlockService
3118
3370
  };
3119
3371
 
3120
3372
  // src/components/blocks/block/block.tsx
3121
- var import_jsx_runtime30 = require("react/jsx-runtime");
3373
+ var import_jsx_runtime35 = require("react/jsx-runtime");
3122
3374
  function Block({ block }) {
3123
3375
  const service = BlockServices[block.type];
3124
3376
  if (!service) return null;
3125
3377
  const { Component } = service;
3126
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Component, { block });
3378
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Component, { block });
3127
3379
  }
3128
3380
 
3129
3381
  // src/components/blocks/block-context/block-context.tsx
3130
- var import_react19 = require("react");
3131
- var BlockContext = (0, import_react19.createContext)(null);
3382
+ var import_react21 = require("react");
3383
+ var BlockContext = (0, import_react21.createContext)(null);
3132
3384
  function useBlockContext() {
3133
- return (0, import_react19.useContext)(BlockContext) ?? {};
3385
+ return (0, import_react21.useContext)(BlockContext) ?? {};
3134
3386
  }
3135
3387
  // Annotate the CommonJS export names for ESM import in node:
3136
3388
  0 && (module.exports = {
@@ -3139,8 +3391,12 @@ function useBlockContext() {
3139
3391
  Block,
3140
3392
  BlockContext,
3141
3393
  BlockServices,
3394
+ NotificationDraftBlock,
3395
+ NotificationDraftBlockService,
3142
3396
  TextBlockService,
3143
3397
  blockTypes,
3398
+ notificationChannels,
3399
+ notificationEmailTypes,
3144
3400
  useBlockContext
3145
3401
  });
3146
3402
  /*! Bundled license information:
@@ -3151,6 +3407,7 @@ function useBlockContext() {
3151
3407
  @tabler/icons-react/dist/esm/icons/IconArrowsMaximize.mjs:
3152
3408
  @tabler/icons-react/dist/esm/icons/IconArrowsMinimize.mjs:
3153
3409
  @tabler/icons-react/dist/esm/icons/IconCheck.mjs:
3410
+ @tabler/icons-react/dist/esm/icons/IconChevronDown.mjs:
3154
3411
  @tabler/icons-react/dist/esm/icons/IconChevronLeft.mjs:
3155
3412
  @tabler/icons-react/dist/esm/icons/IconChevronRight.mjs:
3156
3413
  @tabler/icons-react/dist/esm/icons/IconCopy.mjs:
@@ -3158,6 +3415,7 @@ function useBlockContext() {
3158
3415
  @tabler/icons-react/dist/esm/icons/IconFileSpreadsheet.mjs:
3159
3416
  @tabler/icons-react/dist/esm/icons/IconLoader2.mjs:
3160
3417
  @tabler/icons-react/dist/esm/icons/IconPhoto.mjs:
3418
+ @tabler/icons-react/dist/esm/icons/IconFlask2Filled.mjs:
3161
3419
  @tabler/icons-react/dist/esm/tabler-icons-react.mjs:
3162
3420
  (**
3163
3421
  * @license @tabler/icons-react v3.37.1 - MIT