@shapesos/clay 0.19.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -18435,6 +18435,41 @@ var ChartArtifactService = {
18435
18435
  // src/components/artifacts/deck-artifact/deck-artifact.tsx
18436
18436
  var import_react17 = require("react");
18437
18437
  var import_react_dom = require("react-dom");
18438
+
18439
+ // src/components/badge/badge.tsx
18440
+ var import_jsx_runtime20 = require("react/jsx-runtime");
18441
+ var BASE = "inline-flex items-center whitespace-nowrap rounded-full";
18442
+ var SIZES = {
18443
+ // `sm` is a uniform scale-down of `md` (text 10/12 of caption): padding and line-height keep
18444
+ // md's proportions (caption is 12px text on a 16px line = 1.333 ratio) so the pill shape matches.
18445
+ md: "px-2.5 py-0.5 text-geist-label-caption-medium",
18446
+ sm: "px-2 py-0.5 text-[11px]/[1.333] font-medium"
18447
+ };
18448
+ var SUBTLE = {
18449
+ neutral: "bg-brown-20 text-brown-70",
18450
+ warning: "bg-orange-50 text-orange-600",
18451
+ violet: "bg-violet-50 text-violet-600"
18452
+ };
18453
+ var OUTLINE = {
18454
+ neutral: "border border-brown-30 bg-white text-brown-100",
18455
+ warning: "border border-orange-200 bg-white text-orange-600",
18456
+ violet: "border border-violet-400 bg-white text-violet-600"
18457
+ };
18458
+ var VARIANTS = {
18459
+ subtle: SUBTLE,
18460
+ outline: OUTLINE
18461
+ };
18462
+ function Badge({
18463
+ variant = "subtle",
18464
+ tone = "neutral",
18465
+ size = "md",
18466
+ className,
18467
+ children
18468
+ }) {
18469
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: cn(BASE, SIZES[size], VARIANTS[variant][tone], className), children });
18470
+ }
18471
+
18472
+ // src/components/artifacts/deck-artifact/deck-artifact.tsx
18438
18473
  init_capture_exclude_attribute();
18439
18474
 
18440
18475
  // src/components/artifacts/deck-artifact/deck-artifact-content.tsx
@@ -18442,23 +18477,23 @@ var import_react16 = require("react");
18442
18477
 
18443
18478
  // src/components/ui/table.tsx
18444
18479
  var React3 = __toESM(require("react"), 1);
18445
- var import_jsx_runtime20 = require("react/jsx-runtime");
18446
- 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 }) }));
18480
+ var import_jsx_runtime21 = require("react/jsx-runtime");
18481
+ 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 }) }));
18447
18482
  Table.displayName = "Table";
18448
18483
  var TableHeader = React3.forwardRef(
18449
- ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("thead", { ref, className: cn("[&_tr]:border-b", className), ...props })
18484
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("thead", { ref, className: cn("[&_tr]:border-b", className), ...props })
18450
18485
  );
18451
18486
  TableHeader.displayName = "TableHeader";
18452
18487
  var TableBody = React3.forwardRef(
18453
- ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props })
18488
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props })
18454
18489
  );
18455
18490
  TableBody.displayName = "TableBody";
18456
18491
  var TableFooter = React3.forwardRef(
18457
- ({ 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 })
18492
+ ({ 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 })
18458
18493
  );
18459
18494
  TableFooter.displayName = "TableFooter";
18460
18495
  var TableRow = React3.forwardRef(
18461
- ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
18496
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
18462
18497
  "tr",
18463
18498
  {
18464
18499
  ref,
@@ -18469,7 +18504,7 @@ var TableRow = React3.forwardRef(
18469
18504
  );
18470
18505
  TableRow.displayName = "TableRow";
18471
18506
  var TableHead = React3.forwardRef(
18472
- ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
18507
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
18473
18508
  "th",
18474
18509
  {
18475
18510
  ref,
@@ -18483,11 +18518,11 @@ var TableHead = React3.forwardRef(
18483
18518
  );
18484
18519
  TableHead.displayName = "TableHead";
18485
18520
  var TableCell = React3.forwardRef(
18486
- ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("td", { ref, className: cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className), ...props })
18521
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("td", { ref, className: cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className), ...props })
18487
18522
  );
18488
18523
  TableCell.displayName = "TableCell";
18489
18524
  var TableCaption = React3.forwardRef(
18490
- ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("caption", { ref, className: cn("mt-4 text-sm text-muted-foreground", className), ...props })
18525
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("caption", { ref, className: cn("mt-4 text-sm text-muted-foreground", className), ...props })
18491
18526
  );
18492
18527
  TableCaption.displayName = "TableCaption";
18493
18528
 
@@ -18518,21 +18553,21 @@ function useScrollShadow() {
18518
18553
  }
18519
18554
 
18520
18555
  // src/components/table/data-table.tsx
18521
- var import_jsx_runtime21 = require("react/jsx-runtime");
18556
+ var import_jsx_runtime22 = require("react/jsx-runtime");
18522
18557
  var DATA_TABLE_HEAD_CLASS = "h-auto py-2 px-4 text-xs font-medium text-foreground whitespace-nowrap text-left";
18523
18558
  var DATA_TABLE_CELL_CLASS = "p-4 text-sm font-normal text-foreground align-top min-w-[150px] text-left";
18524
18559
  var DATA_TABLE_ROW_CLASS = "border-b-brown-30 bg-background/70 hover:bg-secondary";
18525
18560
  var DATA_TABLE_SCROLL_SHADOW = "0 1px 2px rgb(0 0 0 / 0.01), 0 6px 12px -2px rgb(0 0 0 / 0.03)";
18526
18561
  function DataTable({ header, children, maxBodyHeight, className }) {
18527
18562
  const { targetRef, isScrolled } = useScrollShadow();
18528
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
18563
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
18529
18564
  "div",
18530
18565
  {
18531
18566
  ref: targetRef,
18532
18567
  className: cn("overscroll-none", className),
18533
18568
  style: maxBodyHeight !== void 0 ? { maxHeight: maxBodyHeight, overflowY: "auto" } : void 0,
18534
- children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(Table, { containerClassName: "overflow-visible", children: [
18535
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
18569
+ children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(Table, { containerClassName: "overflow-visible", children: [
18570
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
18536
18571
  TableHeader,
18537
18572
  {
18538
18573
  "data-scrolled": isScrolled ? "true" : void 0,
@@ -18541,7 +18576,7 @@ function DataTable({ header, children, maxBodyHeight, className }) {
18541
18576
  children: header
18542
18577
  }
18543
18578
  ),
18544
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(TableBody, { children })
18579
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(TableBody, { children })
18545
18580
  ] })
18546
18581
  }
18547
18582
  );
@@ -18562,7 +18597,7 @@ function formatCell(row, column) {
18562
18597
  var DATA_ROW_CLASSES = `${DATA_TABLE_ROW_CLASS} animate-in fade-in duration-300`;
18563
18598
 
18564
18599
  // src/components/artifacts/table-artifact/table-artifact-content.tsx
18565
- var import_jsx_runtime22 = require("react/jsx-runtime");
18600
+ var import_jsx_runtime23 = require("react/jsx-runtime");
18566
18601
  function TableArtifactContent({
18567
18602
  columns,
18568
18603
  data: data2,
@@ -18572,45 +18607,45 @@ function TableArtifactContent({
18572
18607
  labels
18573
18608
  }) {
18574
18609
  if (data2.status === TABLE_STATUS.ERROR) {
18575
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(StatusMessage, { $tone: "error", children: labels.loadError });
18610
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StatusMessage, { $tone: "error", children: labels.loadError });
18576
18611
  }
18577
18612
  if (data2.status === TABLE_STATUS.UNAVAILABLE) {
18578
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(StatusMessage, { $tone: "info", children: labels.unavailable });
18613
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StatusMessage, { $tone: "info", children: labels.unavailable });
18579
18614
  }
18580
18615
  if (data2.status === TABLE_STATUS.LOADING) {
18581
18616
  if (typeof knownRowCount === "number" && knownRowCount > 0) {
18582
18617
  const shimmerCount = Math.min(knownRowCount, maxShimmerRows);
18583
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ArtifactTable, { columns, maxBodyHeight, children: renderShimmerRows(columns, shimmerCount) });
18618
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ArtifactTable, { columns, maxBodyHeight, children: renderShimmerRows(columns, shimmerCount) });
18584
18619
  }
18585
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(StatusMessage, { $tone: "info", children: labels.loading });
18620
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StatusMessage, { $tone: "info", children: labels.loading });
18586
18621
  }
18587
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ArtifactTable, { columns, maxBodyHeight, children: data2.rows.length === 0 ? renderEmptyRow(columns.length, labels.empty) : renderDataRows(columns, data2.rows) });
18622
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ArtifactTable, { columns, maxBodyHeight, children: data2.rows.length === 0 ? renderEmptyRow(columns.length, labels.empty) : renderDataRows(columns, data2.rows) });
18588
18623
  }
18589
18624
  function ArtifactTable({ columns, maxBodyHeight, children }) {
18590
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
18625
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
18591
18626
  DataTable,
18592
18627
  {
18593
18628
  maxBodyHeight,
18594
- 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)) }),
18629
+ 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)) }),
18595
18630
  children
18596
18631
  }
18597
18632
  );
18598
18633
  }
18599
18634
  function renderShimmerRows(columns, count) {
18600
- return Array.from({ length: count }).map((_, index2) => /* @__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-${index2}`));
18635
+ return Array.from({ length: count }).map((_, index2) => /* @__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-${index2}`));
18601
18636
  }
18602
18637
  function renderDataRows(columns, rows) {
18603
- return rows.map((row, index2) => /* @__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)) }, index2));
18638
+ return rows.map((row, index2) => /* @__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)) }, index2));
18604
18639
  }
18605
18640
  function renderEmptyRow(colSpan, emptyMessage) {
18606
- 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 }) });
18641
+ 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 }) });
18607
18642
  }
18608
18643
 
18609
18644
  // src/components/artifacts/deck-artifact/deck-markdown.tsx
18610
18645
  var import_react_markdown = __toESM(require("react-markdown"), 1);
18611
18646
  var import_remark_breaks = __toESM(require("remark-breaks"), 1);
18612
18647
  var import_remark_gfm = __toESM(require("remark-gfm"), 1);
18613
- var import_jsx_runtime23 = require("react/jsx-runtime");
18648
+ var import_jsx_runtime24 = require("react/jsx-runtime");
18614
18649
  function sanitize(text2) {
18615
18650
  return text2.split("\n").filter((line) => {
18616
18651
  const t = line.trim();
@@ -18618,45 +18653,45 @@ function sanitize(text2) {
18618
18653
  }).join("\n");
18619
18654
  }
18620
18655
  var MARKDOWN_COMPONENTS = {
18621
- h1: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h1", { className: "text-[30px] font-semibold leading-tight text-foreground mb-3", ...props }),
18622
- h2: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h2", { className: "text-[26px] font-semibold leading-tight text-foreground mb-2", ...props }),
18623
- h3: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h3", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
18624
- h4: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h4", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
18625
- h5: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h5", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
18626
- h6: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h6", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
18627
- p: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "text-[22px] leading-relaxed text-foreground my-2", ...props }),
18628
- 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 }),
18629
- 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 }),
18656
+ h1: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h1", { className: "text-[30px] font-semibold leading-tight text-foreground mb-3", ...props }),
18657
+ h2: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h2", { className: "text-[26px] font-semibold leading-tight text-foreground mb-2", ...props }),
18658
+ h3: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h3", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
18659
+ h4: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h4", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
18660
+ h5: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h5", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
18661
+ h6: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h6", { className: "text-[24px] font-semibold leading-tight text-foreground mb-2", ...props }),
18662
+ p: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-[22px] leading-relaxed text-foreground my-2", ...props }),
18663
+ 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 }),
18664
+ 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 }),
18630
18665
  // react-markdown injects list metadata (`ordered` / `index` / `checked`) that must not leak to the DOM.
18631
- li: ({ node: _node, ordered: _ordered, index: _index, checked: _checked, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("li", { className: "my-1", ...props }),
18632
- strong: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("strong", { className: "font-semibold", ...props }),
18633
- em: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("em", { className: "italic", ...props }),
18666
+ li: ({ node: _node, ordered: _ordered, index: _index, checked: _checked, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("li", { className: "my-1", ...props }),
18667
+ strong: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("strong", { className: "font-semibold", ...props }),
18668
+ em: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("em", { className: "italic", ...props }),
18634
18669
  // Gate `<img src>` against an http(s) allowlist. react-markdown v8 percent-encodes the URL but
18635
18670
  // does NOT protocol-filter image src (unlike link href), so an LLM-authored
18636
18671
  // `![](javascript:…)` / `![](data:…)` or a tracking-pixel `![](http://…)` would otherwise render
18637
18672
  // with the raw URL. Unsafe src → render nothing.
18638
- img: ({ node: _node, src, ...props }) => typeof src === "string" && isSafeDownloadUrl(src) ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("img", { src, className: "max-w-full", ...props }) : null,
18673
+ img: ({ node: _node, src, ...props }) => typeof src === "string" && isSafeDownloadUrl(src) ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("img", { src, className: "max-w-full", ...props }) : null,
18639
18674
  a: ({ node: _node, ...props }) => (
18640
18675
  // `rel` is forced AFTER `{...props}` so it can't be overridden — if a consumer ever adds
18641
18676
  // `linkTarget="_blank"`, LLM-authored links still can't reach `window.opener`.
18642
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("a", { className: "underline underline-offset-2", ...props, rel: "noopener noreferrer" })
18677
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("a", { className: "underline underline-offset-2", ...props, rel: "noopener noreferrer" })
18643
18678
  ),
18644
18679
  // react-markdown passes `inline` to distinguish inline code from fenced blocks — strip it from the DOM.
18645
- 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 }),
18646
- 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 }),
18647
- hr: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("hr", { className: "my-4 border-brown-alpha-12", ...props }),
18648
- 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 }) }),
18680
+ 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 }),
18681
+ 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 }),
18682
+ hr: ({ node: _node, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("hr", { className: "my-4 border-brown-alpha-12", ...props }),
18683
+ 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 }) }),
18649
18684
  // react-markdown passes `isHeader` to cell renderers — strip it so it never reaches the DOM.
18650
- 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 }),
18651
- 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 })
18685
+ 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 }),
18686
+ 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 })
18652
18687
  };
18653
18688
  function DeckMarkdown({ markdown }) {
18654
- 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) });
18689
+ 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) });
18655
18690
  }
18656
18691
 
18657
18692
  // src/components/artifacts/deck-artifact/slide-renderers.tsx
18658
18693
  var import_react15 = require("react");
18659
- var import_jsx_runtime24 = require("react/jsx-runtime");
18694
+ var import_jsx_runtime25 = require("react/jsx-runtime");
18660
18695
  function safeLogoUrl(meta) {
18661
18696
  return meta?.logoUrl && isSafeDownloadUrl(meta.logoUrl) ? meta.logoUrl : null;
18662
18697
  }
@@ -18683,7 +18718,7 @@ function SlideFrame({ meta, children, accent = false, bare = false }) {
18683
18718
  const eyebrowColor = accent ? "text-white/70" : "text-brown-60";
18684
18719
  const borderColor = accent ? "border-white/20" : "border-brown-alpha-12";
18685
18720
  const logoSrc = safeLogoUrl(meta);
18686
- 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)(
18721
+ 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)(
18687
18722
  "div",
18688
18723
  {
18689
18724
  className: "absolute left-0 top-0 origin-top-left",
@@ -18694,26 +18729,26 @@ function SlideFrame({ meta, children, accent = false, bare = false }) {
18694
18729
  visibility: scale2 === null ? "hidden" : "visible"
18695
18730
  },
18696
18731
  children: [
18697
- !bare ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
18732
+ !bare ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
18698
18733
  "div",
18699
18734
  {
18700
18735
  className: `absolute inset-x-0 top-0 flex items-center justify-between border-b px-16 ${borderColor}`,
18701
18736
  style: { height: EYEBROW_H },
18702
18737
  children: [
18703
- 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", {}),
18704
- logoSrc ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("img", { src: logoSrc, alt: "", className: "object-contain", style: { maxHeight: CANVAS_LOGO_MAX_H } }) : null
18738
+ 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", {}),
18739
+ logoSrc ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("img", { src: logoSrc, alt: "", className: "object-contain", style: { maxHeight: CANVAS_LOGO_MAX_H } }) : null
18705
18740
  ]
18706
18741
  }
18707
18742
  ) : null,
18708
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "absolute inset-x-0 bottom-0 overflow-hidden", style: { top: bare ? 0 : EYEBROW_H }, children })
18743
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "absolute inset-x-0 bottom-0 overflow-hidden", style: { top: bare ? 0 : EYEBROW_H }, children })
18709
18744
  ]
18710
18745
  }
18711
18746
  ) });
18712
18747
  }
18713
18748
  function TitleSlide({ slide, meta }) {
18714
18749
  const logoSrc = safeLogoUrl(meta);
18715
- 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: [
18716
- logoSrc ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
18750
+ 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: [
18751
+ logoSrc ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
18717
18752
  "img",
18718
18753
  {
18719
18754
  src: logoSrc,
@@ -18722,7 +18757,7 @@ function TitleSlide({ slide, meta }) {
18722
18757
  style: { maxHeight: 56, maxWidth: 380 }
18723
18758
  }
18724
18759
  ) : null,
18725
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
18760
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
18726
18761
  "h1",
18727
18762
  {
18728
18763
  className: "font-bold tracking-tight text-brown-100",
@@ -18730,36 +18765,36 @@ function TitleSlide({ slide, meta }) {
18730
18765
  children: slide.title
18731
18766
  }
18732
18767
  ),
18733
- slide.subtitle ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "mt-7 text-brown-70", style: { ...ACCENT_FONT, fontSize: 34 }, children: slide.subtitle }) : null,
18734
- 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,
18735
- meta?.date ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "mt-10 text-brown-70", style: { ...ACCENT_FONT, fontSize: 30 }, children: meta.date }) : null
18768
+ slide.subtitle ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "mt-7 text-brown-70", style: { ...ACCENT_FONT, fontSize: 34 }, children: slide.subtitle }) : null,
18769
+ 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,
18770
+ meta?.date ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "mt-10 text-brown-70", style: { ...ACCENT_FONT, fontSize: 30 }, children: meta.date }) : null
18736
18771
  ] }) });
18737
18772
  }
18738
18773
  function AgendaSlide({ slide, meta, labels }) {
18739
18774
  const items = slide.items ?? [];
18740
- 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: [
18741
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h2", { className: "mb-10 font-bold text-brown-90", style: { fontSize: 40 }, children: slide.title || labels.agenda }),
18742
- /* @__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: [
18743
- /* @__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") }),
18744
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "text-brown-90", style: { fontSize: 28 }, children: item })
18775
+ 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: [
18776
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h2", { className: "mb-10 font-bold text-brown-90", style: { fontSize: 40 }, children: slide.title || labels.agenda }),
18777
+ /* @__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: [
18778
+ /* @__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") }),
18779
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "text-brown-90", style: { fontSize: 28 }, children: item })
18745
18780
  ] }, i)) })
18746
18781
  ] }) });
18747
18782
  }
18748
18783
  function SectionSlide({ slide, meta }) {
18749
- 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: [
18750
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h2", { className: "font-bold text-white", style: { fontSize: 72, lineHeight: 1.05, maxWidth: 940 }, children: slide.title }),
18751
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "mt-2 bg-white/50", style: { width: 96, height: 5 } })
18784
+ 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: [
18785
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h2", { className: "font-bold text-white", style: { fontSize: 72, lineHeight: 1.05, maxWidth: 940 }, children: slide.title }),
18786
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "mt-2 bg-white/50", style: { width: 96, height: 5 } })
18752
18787
  ] }) });
18753
18788
  }
18754
18789
  function ClosingSlide({ meta, labels }) {
18755
- 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: [
18756
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h1", { className: "font-bold text-brown-100", style: { fontSize: 72 }, children: labels.thankYou }),
18757
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-indigo-600", style: { ...ACCENT_FONT, fontSize: 36 }, children: labels.questions })
18790
+ 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: [
18791
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h1", { className: "font-bold text-brown-100", style: { fontSize: 72 }, children: labels.thankYou }),
18792
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "text-indigo-600", style: { ...ACCENT_FONT, fontSize: 36 }, children: labels.questions })
18758
18793
  ] }) });
18759
18794
  }
18760
18795
 
18761
18796
  // src/components/artifacts/deck-artifact/deck-artifact-content.tsx
18762
- var import_jsx_runtime25 = require("react/jsx-runtime");
18797
+ var import_jsx_runtime26 = require("react/jsx-runtime");
18763
18798
  var TABLE_BLOCK_MAX_SHIMMER_ROWS = 10;
18764
18799
  var TABLE_CHROME_RESERVE = 56;
18765
18800
  var VISUAL_FALLBACK_HEIGHT = 360;
@@ -18789,14 +18824,14 @@ function DeckArtifactContent({
18789
18824
  [slides.length, onNavigate, isControlled, onSlideChange]
18790
18825
  );
18791
18826
  const position2 = labels.position.replace("{current}", String(current + 1)).replace("{total}", String(slides.length));
18792
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex flex-col gap-3 p-4", children: [
18793
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SlideDispatch, { slide, labels, meta }),
18794
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
18827
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex flex-col gap-3 p-4", children: [
18828
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SlideDispatch, { slide, labels, meta }),
18829
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
18795
18830
  "div",
18796
18831
  {
18797
18832
  className: `flex items-center justify-between border-t pt-2 ${onDark ? "border-white/20" : "border-brown-alpha-12"}`,
18798
18833
  children: [
18799
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
18834
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
18800
18835
  IconButton,
18801
18836
  {
18802
18837
  icon: IconChevronLeft,
@@ -18807,8 +18842,8 @@ function DeckArtifactContent({
18807
18842
  onClick: () => goTo(current - 1)
18808
18843
  }
18809
18844
  ),
18810
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: `text-xs font-medium ${onDark ? "text-white/70" : "text-brown-70"}`, children: position2 }),
18811
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
18845
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: `text-xs font-medium ${onDark ? "text-white/70" : "text-brown-70"}`, children: position2 }),
18846
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
18812
18847
  IconButton,
18813
18848
  {
18814
18849
  icon: IconChevronRight,
@@ -18828,16 +18863,16 @@ function SlideDispatch({ slide, labels, meta }) {
18828
18863
  const kind = slide.kind ?? deckSlideKinds.CONTENT;
18829
18864
  switch (kind) {
18830
18865
  case deckSlideKinds.TITLE:
18831
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(TitleSlide, { slide, meta });
18866
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(TitleSlide, { slide, meta });
18832
18867
  case deckSlideKinds.AGENDA:
18833
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(AgendaSlide, { slide, meta, labels });
18868
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(AgendaSlide, { slide, meta, labels });
18834
18869
  case deckSlideKinds.SECTION:
18835
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(SectionSlide, { slide, meta });
18870
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(SectionSlide, { slide, meta });
18836
18871
  case deckSlideKinds.CLOSING:
18837
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ClosingSlide, { meta, labels });
18872
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ClosingSlide, { meta, labels });
18838
18873
  case deckSlideKinds.CONTENT:
18839
18874
  default:
18840
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ContentSlide, { slide, meta, labels });
18875
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ContentSlide, { slide, meta, labels });
18841
18876
  }
18842
18877
  }
18843
18878
  function isVisualBlock(block) {
@@ -18850,25 +18885,25 @@ function ContentSlide({ slide, meta, labels }) {
18850
18885
  (b) => b.type === deckBlockTypes.TEXT
18851
18886
  );
18852
18887
  if (visuals.length === 1 && texts.length > 0) {
18853
- 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: [
18854
- /* @__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: [
18855
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h3", { className: "mb-5 font-bold leading-tight text-foreground", style: { fontSize: 34 }, children: slide.title }),
18856
- texts.map((block, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DeckMarkdown, { markdown: block.markdown }, i))
18888
+ 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: [
18889
+ /* @__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: [
18890
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("h3", { className: "mb-5 font-bold leading-tight text-foreground", style: { fontSize: 34 }, children: slide.title }),
18891
+ texts.map((block, i) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(DeckMarkdown, { markdown: block.markdown }, i))
18857
18892
  ] }) }),
18858
- /* @__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 }) })
18893
+ /* @__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 }) })
18859
18894
  ] }) });
18860
18895
  }
18861
18896
  if (visuals.length > 0) {
18862
- 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: [
18863
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h3", { className: "shrink-0 font-bold leading-tight text-foreground", style: { fontSize: 32 }, children: slide.title }),
18897
+ 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: [
18898
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("h3", { className: "shrink-0 font-bold leading-tight text-foreground", style: { fontSize: 32 }, children: slide.title }),
18864
18899
  content2.map(
18865
- (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)
18900
+ (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)
18866
18901
  )
18867
18902
  ] }) });
18868
18903
  }
18869
- 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: [
18870
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h3", { className: "mb-6 font-bold leading-tight text-foreground", style: { fontSize: 38 }, children: slide.title }),
18871
- texts.map((block, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(DeckMarkdown, { markdown: block.markdown }, i))
18904
+ 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: [
18905
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("h3", { className: "mb-6 font-bold leading-tight text-foreground", style: { fontSize: 38 }, children: slide.title }),
18906
+ texts.map((block, i) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(DeckMarkdown, { markdown: block.markdown }, i))
18872
18907
  ] }) }) });
18873
18908
  }
18874
18909
  function AutoFit({ children }) {
@@ -18892,7 +18927,7 @@ function AutoFit({ children }) {
18892
18927
  return () => ro.disconnect();
18893
18928
  }, []);
18894
18929
  const scaled = fit.scale < 1;
18895
- 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)(
18930
+ 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)(
18896
18931
  "div",
18897
18932
  {
18898
18933
  ref: contentRef,
@@ -18917,12 +18952,12 @@ function FillVisual({ block, labels }) {
18917
18952
  return () => ro.disconnect();
18918
18953
  }, []);
18919
18954
  const chartLabels = labels.chart ?? DEFAULT_CHART_ARTIFACT_LABELS;
18920
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { ref, className: "h-full min-h-0 w-full overflow-hidden", children: block.type === deckBlockTypes.CHART ? (
18955
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { ref, className: "h-full min-h-0 w-full overflow-hidden", children: block.type === deckBlockTypes.CHART ? (
18921
18956
  // ChartArtifactContent assumes a non-empty rowset (the standalone ChartArtifact guards
18922
18957
  // `rows.length > 0` upstream); mirror that guard here so an empty inline chart shows the
18923
18958
  // localized empty status instead of a blank chart area.
18924
- 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: height2 }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ChartArtifactContent, { config: block.config, rows: block.rows, labels: chartLabels }) })
18925
- ) : /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
18959
+ 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: height2 }, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ChartArtifactContent, { config: block.config, rows: block.rows, labels: chartLabels }) })
18960
+ ) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
18926
18961
  TableArtifactContent,
18927
18962
  {
18928
18963
  columns: block.config.columns,
@@ -18988,7 +19023,7 @@ function isValidDeckBlock(block) {
18988
19023
  }
18989
19024
 
18990
19025
  // src/components/artifacts/deck-artifact/deck-artifact.tsx
18991
- var import_jsx_runtime26 = require("react/jsx-runtime");
19026
+ var import_jsx_runtime27 = require("react/jsx-runtime");
18992
19027
  var TITLE_CLASSES2 = "text-sm font-semibold text-foreground";
18993
19028
  function DeckArtifact({ artifact, labels, callbacks }) {
18994
19029
  const validConfig = isValidDeckConfig(artifact.config);
@@ -19029,9 +19064,9 @@ function DeckArtifact({ artifact, labels, callbacks }) {
19029
19064
  const meta = artifact.config?.meta;
19030
19065
  const handleOpenFullscreen = () => setIsFullscreen(true);
19031
19066
  const handleCloseFullscreen = () => setIsFullscreen(false);
19032
- const actions = /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(ArtifactActions, { ...{ [CAPTURE_EXCLUDE_ATTRIBUTE]: "" }, children: [
19033
- showDownload ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactDownloadButton, { href: presignedUrl ?? "", label: resolvedLabels.download, onClick: handleDownload }) : null,
19034
- validConfig ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
19067
+ const actions = /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ArtifactActions, { ...{ [CAPTURE_EXCLUDE_ATTRIBUTE]: "" }, children: [
19068
+ showDownload ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactDownloadButton, { href: presignedUrl ?? "", label: resolvedLabels.download, onClick: handleDownload }) : null,
19069
+ validConfig ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
19035
19070
  IconButton,
19036
19071
  {
19037
19072
  icon: IconArrowsMaximize,
@@ -19041,22 +19076,29 @@ function DeckArtifact({ artifact, labels, callbacks }) {
19041
19076
  }
19042
19077
  ) : null
19043
19078
  ] });
19079
+ const heading = /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "flex items-center gap-2", children: [
19080
+ artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactTitle, { className: TITLE_CLASSES2, children: artifact.title }) : null,
19081
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Badge, { tone: "violet", variant: "subtle", size: "sm", className: "gap-1 py-1", children: [
19082
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Icon, { icon: IconFlask2Filled, size: 12 }),
19083
+ "Labs"
19084
+ ] })
19085
+ ] });
19044
19086
  if (!validConfig) {
19045
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
19046
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
19047
- artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactTitle, { className: TITLE_CLASSES2, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", {}),
19087
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
19088
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
19089
+ heading,
19048
19090
  actions
19049
19091
  ] }),
19050
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(StatusMessage, { $tone: "info", children: resolvedLabels.unavailable }) })
19092
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(StatusMessage, { $tone: "info", children: resolvedLabels.unavailable }) })
19051
19093
  ] });
19052
19094
  }
19053
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
19054
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
19055
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
19056
- artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactTitle, { className: TITLE_CLASSES2, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", {}),
19095
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
19096
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
19097
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
19098
+ heading,
19057
19099
  actions
19058
19100
  ] }),
19059
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
19101
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactContent, { className: "p-0", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
19060
19102
  DeckArtifactContent,
19061
19103
  {
19062
19104
  slides: artifact.config.slides,
@@ -19069,7 +19111,7 @@ function DeckArtifact({ artifact, labels, callbacks }) {
19069
19111
  ) })
19070
19112
  ] }),
19071
19113
  isFullscreen && (0, import_react_dom.createPortal)(
19072
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
19114
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
19073
19115
  FullscreenOverlay,
19074
19116
  {
19075
19117
  artifact,
@@ -19093,15 +19135,15 @@ function FullscreenOverlay({
19093
19135
  onClose
19094
19136
  }) {
19095
19137
  const meta = artifact.config?.meta;
19096
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
19138
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
19097
19139
  "div",
19098
19140
  {
19099
19141
  className: "fixed inset-0 z-[2147483647] flex items-center justify-center bg-black/80",
19100
19142
  role: "dialog",
19101
19143
  "aria-modal": "true",
19102
19144
  "aria-label": resolvedLabels.exitFullscreen,
19103
- children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "relative", style: { width: "min(94vw, calc(82vh * 16 / 9))" }, children: [
19104
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
19145
+ children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "relative", style: { width: "min(94vw, calc(82vh * 16 / 9))" }, children: [
19146
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
19105
19147
  DeckArtifactContent,
19106
19148
  {
19107
19149
  slides: artifact.config.slides,
@@ -19113,15 +19155,15 @@ function FullscreenOverlay({
19113
19155
  onDark: true
19114
19156
  }
19115
19157
  ),
19116
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
19158
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
19117
19159
  "button",
19118
19160
  {
19119
19161
  className: "absolute -top-10 right-6 flex items-center gap-1.5 text-sm text-white/80 hover:text-white",
19120
19162
  "aria-label": resolvedLabels.exitFullscreen,
19121
19163
  onClick: onClose,
19122
19164
  children: [
19123
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(IconArrowsMinimize, { size: 16 }),
19124
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { children: resolvedLabels.exitFullscreen })
19165
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(IconArrowsMinimize, { size: 16 }),
19166
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: resolvedLabels.exitFullscreen })
19125
19167
  ]
19126
19168
  }
19127
19169
  )
@@ -19198,7 +19240,7 @@ function useTableArtifactData(presignedUrl, columns) {
19198
19240
  }
19199
19241
 
19200
19242
  // src/components/artifacts/table-artifact/table-artifact.tsx
19201
- var import_jsx_runtime27 = require("react/jsx-runtime");
19243
+ var import_jsx_runtime28 = require("react/jsx-runtime");
19202
19244
  var TITLE_CLASSES3 = "text-sm font-semibold text-foreground";
19203
19245
  var TABLE_MAX_BODY_HEIGHT = 480;
19204
19246
  var MAX_SHIMMER_ROWS = 10;
@@ -19221,10 +19263,10 @@ function TableArtifact({ artifact, labels, callbacks }) {
19221
19263
  const onDownload = callbacks?.onDownload;
19222
19264
  const handleDownloadClick = onDownload ? () => onDownload(artifact) : void 0;
19223
19265
  if (!validConfig || !validColumns) {
19224
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
19225
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
19226
- artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactTitle, { className: TITLE_CLASSES3, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", {}),
19227
- presignedUrl ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
19266
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
19267
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
19268
+ artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ArtifactTitle, { className: TITLE_CLASSES3, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", {}),
19269
+ presignedUrl ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
19228
19270
  ArtifactDownloadButton,
19229
19271
  {
19230
19272
  href: presignedUrl,
@@ -19233,17 +19275,17 @@ function TableArtifact({ artifact, labels, callbacks }) {
19233
19275
  }
19234
19276
  ) }) : null
19235
19277
  ] }),
19236
- /* @__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 }) })
19278
+ /* @__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 }) })
19237
19279
  ] });
19238
19280
  }
19239
19281
  return (
19240
19282
  // The table body owns its own scroll container (`ArtifactTable` inside `TableArtifactContent`).
19241
19283
  // Disable the outer overflow container so only one scroll context exists — this prevents
19242
19284
  // double-scroll nesting and lets `useScrollShadow` find the correct scroll ancestor.
19243
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
19244
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
19245
- artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactTitle, { className: TITLE_CLASSES3, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", {}),
19246
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
19285
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
19286
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
19287
+ artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ArtifactTitle, { className: TITLE_CLASSES3, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", {}),
19288
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
19247
19289
  ArtifactDownloadButton,
19248
19290
  {
19249
19291
  href: presignedUrl ?? "",
@@ -19252,7 +19294,7 @@ function TableArtifact({ artifact, labels, callbacks }) {
19252
19294
  }
19253
19295
  ) })
19254
19296
  ] }),
19255
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ArtifactContent, { className: "p-0 overflow-visible", style: { maxHeight: "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
19297
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ArtifactContent, { className: "p-0 overflow-visible", style: { maxHeight: "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
19256
19298
  TableArtifactContent,
19257
19299
  {
19258
19300
  columns: validColumns,
@@ -19295,13 +19337,13 @@ function artifactToClipboardText(artifact) {
19295
19337
  }
19296
19338
 
19297
19339
  // src/components/blocks/artifact-ref-block/artifact-ref-block.tsx
19298
- var import_jsx_runtime28 = require("react/jsx-runtime");
19340
+ var import_jsx_runtime29 = require("react/jsx-runtime");
19299
19341
  function ArtifactRefBlock({ block }) {
19300
19342
  const { artifact, labels, callbacks } = block.payload;
19301
19343
  const entry = ArtifactServices[artifact.type];
19302
19344
  if (!entry) return null;
19303
19345
  const Component = entry.Component;
19304
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Component, { artifact, labels, callbacks });
19346
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Component, { artifact, labels, callbacks });
19305
19347
  }
19306
19348
 
19307
19349
  // src/components/blocks/block-services/artifact-ref-block-service.ts
@@ -19319,39 +19361,6 @@ var ArtifactRefBlockService = {
19319
19361
  // src/components/blocks/notification-draft-block/notification-draft-block.tsx
19320
19362
  var import_react20 = require("react");
19321
19363
 
19322
- // src/components/badge/badge.tsx
19323
- var import_jsx_runtime29 = require("react/jsx-runtime");
19324
- var BASE = "inline-flex items-center whitespace-nowrap rounded-full";
19325
- var SIZES = {
19326
- // `sm` is a uniform scale-down of `md` (text 10/12 of caption): padding and line-height keep
19327
- // md's proportions (caption is 12px text on a 16px line = 1.333 ratio) so the pill shape matches.
19328
- md: "px-2.5 py-0.5 text-geist-label-caption-medium",
19329
- sm: "px-2 py-0.5 text-[11px]/[1.333] font-medium"
19330
- };
19331
- var SUBTLE = {
19332
- neutral: "bg-brown-20 text-brown-70",
19333
- warning: "bg-orange-50 text-orange-600",
19334
- violet: "bg-violet-50 text-violet-600"
19335
- };
19336
- var OUTLINE = {
19337
- neutral: "border border-brown-30 bg-white text-brown-100",
19338
- warning: "border border-orange-200 bg-white text-orange-600",
19339
- violet: "border border-violet-400 bg-white text-violet-600"
19340
- };
19341
- var VARIANTS = {
19342
- subtle: SUBTLE,
19343
- outline: OUTLINE
19344
- };
19345
- function Badge({
19346
- variant = "subtle",
19347
- tone = "neutral",
19348
- size = "md",
19349
- className,
19350
- children
19351
- }) {
19352
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: cn(BASE, SIZES[size], VARIANTS[variant][tone], className), children });
19353
- }
19354
-
19355
19364
  // src/components/chat/hooks/use-copy-to-clipboard.ts
19356
19365
  var import_react19 = require("react");
19357
19366