@shapesos/clay 0.10.0 → 0.11.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 (72) hide show
  1. package/dist/artifacts.cjs +741 -0
  2. package/dist/artifacts.cjs.map +1 -0
  3. package/dist/artifacts.d.cts +56 -0
  4. package/dist/artifacts.d.ts +56 -0
  5. package/dist/artifacts.js +23 -0
  6. package/dist/blocks.cjs +685 -53
  7. package/dist/blocks.cjs.map +1 -1
  8. package/dist/blocks.css +2 -0
  9. package/dist/blocks.d.cts +22 -10
  10. package/dist/blocks.d.ts +22 -10
  11. package/dist/blocks.js +15 -5
  12. package/dist/button.d.cts +2 -2
  13. package/dist/button.d.ts +2 -2
  14. package/dist/chat.cjs +728 -296
  15. package/dist/chat.cjs.map +1 -1
  16. package/dist/chat.d.cts +27 -10
  17. package/dist/chat.d.ts +27 -10
  18. package/dist/chat.js +7 -3
  19. package/dist/chunk-BX5TCEPR.js +436 -0
  20. package/dist/chunk-BX5TCEPR.js.map +1 -0
  21. package/dist/chunk-JGMN6W72.js +12 -0
  22. package/dist/chunk-JGMN6W72.js.map +1 -0
  23. package/dist/{chunk-27GJUWVN.js → chunk-JJUIBBBU.js} +14 -8
  24. package/dist/chunk-JJUIBBBU.js.map +1 -0
  25. package/dist/chunk-L35M3OD5.js +99 -0
  26. package/dist/chunk-L35M3OD5.js.map +1 -0
  27. package/dist/chunk-MEJESPTZ.js +1 -0
  28. package/dist/chunk-MEJESPTZ.js.map +1 -0
  29. package/dist/{chunk-R3BGPOAM.js → chunk-MXOPG747.js} +53 -45
  30. package/dist/chunk-MXOPG747.js.map +1 -0
  31. package/dist/{chunk-MLCRDVQ2.js → chunk-OBOXCBDL.js} +13 -5
  32. package/dist/chunk-OBOXCBDL.js.map +1 -0
  33. package/dist/{chunk-WS4IPADR.js → chunk-OUW6PUEB.js} +42 -110
  34. package/dist/chunk-OUW6PUEB.js.map +1 -0
  35. package/dist/icon.cjs +12 -4
  36. package/dist/icon.cjs.map +1 -1
  37. package/dist/icon.d.cts +19 -6
  38. package/dist/icon.d.ts +19 -6
  39. package/dist/icon.js +1 -1
  40. package/dist/index.cjs +794 -332
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.cts +6 -4
  43. package/dist/index.d.ts +6 -4
  44. package/dist/index.js +50 -25
  45. package/dist/lottie.d.cts +2 -2
  46. package/dist/lottie.d.ts +2 -2
  47. package/dist/table.cjs +142 -0
  48. package/dist/table.cjs.map +1 -0
  49. package/dist/table.d.cts +44 -0
  50. package/dist/table.d.ts +44 -0
  51. package/dist/table.js +24 -0
  52. package/dist/table.js.map +1 -0
  53. package/dist/text-area.d.cts +2 -2
  54. package/dist/text-area.d.ts +2 -2
  55. package/dist/types-3Gzk7cRt.d.cts +121 -0
  56. package/dist/types-3Gzk7cRt.d.ts +121 -0
  57. package/dist/types-C9XX-Uhk.d.ts +68 -0
  58. package/dist/types-DuuRI4ll.d.cts +68 -0
  59. package/dist/utils.cjs +14 -7
  60. package/dist/utils.cjs.map +1 -1
  61. package/dist/utils.d.cts +18 -1
  62. package/dist/utils.d.ts +18 -1
  63. package/dist/utils.js +6 -4
  64. package/package.json +29 -4
  65. package/dist/chunk-27GJUWVN.js.map +0 -1
  66. package/dist/chunk-MLCRDVQ2.js.map +0 -1
  67. package/dist/chunk-OKPNST44.js +0 -1
  68. package/dist/chunk-R3BGPOAM.js.map +0 -1
  69. package/dist/chunk-WS4IPADR.js.map +0 -1
  70. package/dist/types-Q9aqd9nq.d.cts +0 -34
  71. package/dist/types-Q9aqd9nq.d.ts +0 -34
  72. /package/dist/{chunk-OKPNST44.js.map → artifacts.js.map} +0 -0
package/dist/blocks.cjs CHANGED
@@ -30,6 +30,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  // src/components/blocks/index.ts
31
31
  var blocks_exports = {};
32
32
  __export(blocks_exports, {
33
+ ArtifactRefBlock: () => ArtifactRefBlock,
34
+ ArtifactRefBlockService: () => ArtifactRefBlockService,
33
35
  Block: () => Block,
34
36
  BlockContext: () => BlockContext,
35
37
  BlockServices: () => BlockServices,
@@ -39,20 +41,148 @@ __export(blocks_exports, {
39
41
  });
40
42
  module.exports = __toCommonJS(blocks_exports);
41
43
 
42
- // src/components/blocks/text-block/text-block.tsx
43
- var import_react_markdown = __toESM(require("react-markdown"), 1);
44
- var import_remark_breaks = __toESM(require("remark-breaks"), 1);
45
- var import_remark_gfm = __toESM(require("remark-gfm"), 1);
44
+ // src/components/blocks/types.ts
45
+ var blockTypes = {
46
+ TEXT: "TEXT",
47
+ ARTIFACT_REF: "ARTIFACT_REF"
48
+ };
46
49
 
47
- // src/components/blocks/block-context/block-context.tsx
48
- var import_react = require("react");
49
- var BlockContext = (0, import_react.createContext)(null);
50
- function useBlockContext() {
51
- return (0, import_react.useContext)(BlockContext) ?? {};
50
+ // src/components/artifacts/types.ts
51
+ var artifactTypes = {
52
+ TABLE: "TABLE"
53
+ };
54
+
55
+ // src/components/artifacts/table-artifact/table-artifact.tsx
56
+ var import_react7 = require("react");
57
+
58
+ // src/lib/utils.ts
59
+ var import_clsx = require("clsx");
60
+ var import_tailwind_merge = require("tailwind-merge");
61
+ function cn(...inputs) {
62
+ return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
52
63
  }
53
64
 
54
- // src/components/blocks/scrollable-table/scrollable-table-styles.ts
65
+ // src/components/ai-elements/artifact.tsx
66
+ var import_jsx_runtime = require("react/jsx-runtime");
67
+ var Artifact = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
68
+ "div",
69
+ {
70
+ className: cn("flex flex-col overflow-hidden rounded-lg border bg-background shadow-sm", className),
71
+ ...props
72
+ }
73
+ );
74
+ var ArtifactHeader = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: cn("flex items-center justify-between border-b bg-muted/50 px-4 py-3", className), ...props });
75
+ var ArtifactTitle = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: cn("font-medium text-foreground text-sm", className), ...props });
76
+ var ArtifactActions = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: cn("flex items-center gap-1", className), ...props });
77
+ var ArtifactContent = ({ className, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: cn("flex-1 overflow-auto p-4", className), ...props });
78
+
79
+ // node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs
80
+ var import_react = require("react");
81
+
82
+ // node_modules/@tabler/icons-react/dist/esm/defaultAttributes.mjs
83
+ var defaultAttributes = {
84
+ outline: {
85
+ xmlns: "http://www.w3.org/2000/svg",
86
+ width: 24,
87
+ height: 24,
88
+ viewBox: "0 0 24 24",
89
+ fill: "none",
90
+ stroke: "currentColor",
91
+ strokeWidth: 2,
92
+ strokeLinecap: "round",
93
+ strokeLinejoin: "round"
94
+ },
95
+ filled: {
96
+ xmlns: "http://www.w3.org/2000/svg",
97
+ width: 24,
98
+ height: 24,
99
+ viewBox: "0 0 24 24",
100
+ fill: "currentColor",
101
+ stroke: "none"
102
+ }
103
+ };
104
+
105
+ // node_modules/@tabler/icons-react/dist/esm/createReactComponent.mjs
106
+ var createReactComponent = (type, iconName, iconNamePascal, iconNode) => {
107
+ const Component = (0, import_react.forwardRef)(
108
+ ({ color = "currentColor", size = 24, stroke = 2, title, className, children, ...rest }, ref) => (0, import_react.createElement)(
109
+ "svg",
110
+ {
111
+ ref,
112
+ ...defaultAttributes[type],
113
+ width: size,
114
+ height: size,
115
+ className: [`tabler-icon`, `tabler-icon-${iconName}`, className].join(" "),
116
+ ...type === "filled" ? {
117
+ fill: color
118
+ } : {
119
+ strokeWidth: stroke,
120
+ stroke: color
121
+ },
122
+ ...rest
123
+ },
124
+ [
125
+ title && (0, import_react.createElement)("title", { key: "svg-title" }, title),
126
+ ...iconNode.map(([tag, attrs]) => (0, import_react.createElement)(tag, attrs)),
127
+ ...Array.isArray(children) ? children : [children]
128
+ ]
129
+ )
130
+ );
131
+ Component.displayName = `${iconNamePascal}`;
132
+ return Component;
133
+ };
134
+
135
+ // node_modules/@tabler/icons-react/dist/esm/icons/IconDownload.mjs
136
+ var __iconNode = [["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" }]];
137
+ var IconDownload = createReactComponent("outline", "download", "Download", __iconNode);
138
+
139
+ // src/components/icon-button/icon-button.tsx
140
+ var import_react3 = require("react");
141
+
142
+ // src/components/icon/icon.tsx
143
+ var import_react2 = require("react");
144
+
145
+ // src/components/icon/icon-styles.ts
55
146
  var import_styled_components = __toESM(require("styled-components"), 1);
147
+ var STROKE_WIDTH_BY_SIZE = {
148
+ 12: 1.4,
149
+ 14: 1.4,
150
+ 16: 1.8,
151
+ 18: 1.8,
152
+ 20: 1.8,
153
+ 24: 1.8
154
+ };
155
+ var DEFAULT_STROKE_WIDTH = 1.8;
156
+ function getStrokeWidth(size) {
157
+ return STROKE_WIDTH_BY_SIZE[size] ?? DEFAULT_STROKE_WIDTH;
158
+ }
159
+ var IconWrapper = import_styled_components.default.span`
160
+ display: inline-flex;
161
+ align-items: center;
162
+ justify-content: center;
163
+ color: ${({ $color }) => $color ?? "currentColor"};
164
+ flex-shrink: 0;
165
+ `;
166
+
167
+ // src/components/icon/icon.tsx
168
+ var import_jsx_runtime2 = require("react/jsx-runtime");
169
+ var DEFAULT_SIZE = 16;
170
+ var Icon = (0, import_react2.forwardRef)(function Icon2({ icon: IconComponent, size = DEFAULT_SIZE, color, className, "aria-label": ariaLabel }, ref) {
171
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
172
+ IconWrapper,
173
+ {
174
+ ref,
175
+ className,
176
+ $color: color,
177
+ "aria-label": ariaLabel,
178
+ role: ariaLabel ? "img" : void 0,
179
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(IconComponent, { width: size, height: size, strokeWidth: getStrokeWidth(size) })
180
+ }
181
+ );
182
+ });
183
+
184
+ // src/components/icon-button/icon-button-styles.ts
185
+ var import_styled_components2 = __toESM(require("styled-components"), 1);
56
186
 
57
187
  // src/tokens/colors.ts
58
188
  var colors = {
@@ -142,42 +272,521 @@ var colors = {
142
272
  "red-600": "#DC2626"
143
273
  };
144
274
 
275
+ // src/components/icon-button/icon-button-styles.ts
276
+ var PADDING = {
277
+ short: {
278
+ small: "4px",
279
+ medium: "6px"
280
+ },
281
+ long: {
282
+ small: "4px 6px",
283
+ medium: "6px 10px"
284
+ }
285
+ };
286
+ var BORDER_RADIUS = {
287
+ small: 6,
288
+ medium: 10
289
+ };
290
+ var Button = import_styled_components2.default.button`
291
+ display: inline-flex;
292
+ align-items: center;
293
+ justify-content: center;
294
+ padding: ${({ $size, $variant }) => PADDING[$variant][$size]};
295
+ border: none;
296
+ border-radius: ${({ $size }) => BORDER_RADIUS[$size]}px;
297
+ background: ${({ $isSelected }) => $isSelected ? colors["brown-40"] : "transparent"};
298
+ color: ${colors["brown-100"]};
299
+ cursor: pointer;
300
+ transition: background-color 100ms ease;
301
+
302
+ &:hover {
303
+ background: ${({ $isSelected }) => $isSelected ? colors["brown-40"] : colors["brown-20"]};
304
+ }
305
+
306
+ &:active {
307
+ background: ${colors["brown-40"]};
308
+ }
309
+
310
+ &:disabled {
311
+ color: ${colors["brown-50"]};
312
+ background: transparent;
313
+ cursor: not-allowed;
314
+ }
315
+ `;
316
+
317
+ // src/components/icon-button/icon-button.tsx
318
+ var import_jsx_runtime3 = require("react/jsx-runtime");
319
+ var ICON_SIZE_BY_BUTTON_SIZE = {
320
+ small: 16,
321
+ medium: 20
322
+ };
323
+ var IconButton = (0, import_react3.forwardRef)(function IconButton2({
324
+ icon,
325
+ size = "small",
326
+ variant = "short",
327
+ isSelected = false,
328
+ disabled = false,
329
+ onClick,
330
+ className,
331
+ id,
332
+ as,
333
+ "aria-label": ariaLabel,
334
+ ...rest
335
+ }, ref) {
336
+ const isNativeButton = as === void 0 || as === "button";
337
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
338
+ Button,
339
+ {
340
+ ref,
341
+ className,
342
+ id,
343
+ as,
344
+ $size: size,
345
+ $variant: variant,
346
+ $isSelected: isSelected,
347
+ disabled,
348
+ onClick: disabled ? void 0 : onClick,
349
+ "aria-label": ariaLabel,
350
+ ...isNativeButton ? { type: "button" } : {},
351
+ ...rest,
352
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon, size: ICON_SIZE_BY_BUTTON_SIZE[size] })
353
+ }
354
+ );
355
+ });
356
+
357
+ // src/components/ui/tooltip.tsx
358
+ var React = __toESM(require("react"), 1);
359
+ var TooltipPrimitive = __toESM(require("@radix-ui/react-tooltip"), 1);
360
+ var import_jsx_runtime4 = require("react/jsx-runtime");
361
+ var TooltipProvider = TooltipPrimitive.Provider;
362
+ var Tooltip = TooltipPrimitive.Root;
363
+ var TooltipTrigger = TooltipPrimitive.Trigger;
364
+ var TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
365
+ TooltipPrimitive.Content,
366
+ {
367
+ ref,
368
+ sideOffset,
369
+ className: cn(
370
+ "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",
371
+ className
372
+ ),
373
+ ...props
374
+ }
375
+ ));
376
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
377
+
378
+ // src/components/artifacts/artifact-download-button/artifact-download-button.tsx
379
+ var import_jsx_runtime5 = require("react/jsx-runtime");
380
+ function ArtifactDownloadButton({ href }) {
381
+ if (!isSafeDownloadUrl(href)) return null;
382
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(TooltipProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Tooltip, { children: [
383
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
384
+ IconButton,
385
+ {
386
+ as: "a",
387
+ href,
388
+ download: true,
389
+ rel: "noopener noreferrer",
390
+ icon: IconDownload,
391
+ size: "small",
392
+ "aria-label": "Download artifact"
393
+ }
394
+ ) }),
395
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(TooltipContent, { children: "Download" })
396
+ ] }) });
397
+ }
398
+ function isSafeDownloadUrl(url) {
399
+ try {
400
+ const parsed = new URL(url);
401
+ return parsed.protocol === "https:" || parsed.protocol === "http:";
402
+ } catch {
403
+ return false;
404
+ }
405
+ }
406
+
407
+ // src/components/ui/table.tsx
408
+ var React2 = __toESM(require("react"), 1);
409
+ var import_jsx_runtime6 = require("react/jsx-runtime");
410
+ var Table = React2.forwardRef(({ className, containerClassName, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: cn("relative w-full overflow-auto", containerClassName), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("table", { ref, className: cn("w-full caption-bottom text-sm", className), ...props }) }));
411
+ Table.displayName = "Table";
412
+ var TableHeader = React2.forwardRef(
413
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("thead", { ref, className: cn("[&_tr]:border-b", className), ...props })
414
+ );
415
+ TableHeader.displayName = "TableHeader";
416
+ var TableBody = React2.forwardRef(
417
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props })
418
+ );
419
+ TableBody.displayName = "TableBody";
420
+ var TableFooter = React2.forwardRef(
421
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("tfoot", { ref, className: cn("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", className), ...props })
422
+ );
423
+ TableFooter.displayName = "TableFooter";
424
+ var TableRow = React2.forwardRef(
425
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
426
+ "tr",
427
+ {
428
+ ref,
429
+ className: cn("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted", className),
430
+ ...props
431
+ }
432
+ )
433
+ );
434
+ TableRow.displayName = "TableRow";
435
+ var TableHead = React2.forwardRef(
436
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
437
+ "th",
438
+ {
439
+ ref,
440
+ className: cn(
441
+ "h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",
442
+ className
443
+ ),
444
+ ...props
445
+ }
446
+ )
447
+ );
448
+ TableHead.displayName = "TableHead";
449
+ var TableCell = React2.forwardRef(
450
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("td", { ref, className: cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className), ...props })
451
+ );
452
+ TableCell.displayName = "TableCell";
453
+ var TableCaption = React2.forwardRef(
454
+ ({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("caption", { ref, className: cn("mt-4 text-sm text-muted-foreground", className), ...props })
455
+ );
456
+ TableCaption.displayName = "TableCaption";
457
+
458
+ // src/components/table/use-scroll-shadow.ts
459
+ var import_react4 = require("react");
460
+ function useScrollShadow() {
461
+ const targetRef = (0, import_react4.useRef)(null);
462
+ const [isScrolled, setIsScrolled] = (0, import_react4.useState)(false);
463
+ (0, import_react4.useEffect)(() => {
464
+ const target = targetRef.current;
465
+ if (!target) return;
466
+ let scrollContainer = target;
467
+ while (scrollContainer) {
468
+ const overflowY = getComputedStyle(scrollContainer).overflowY;
469
+ if (overflowY === "auto" || overflowY === "scroll") break;
470
+ scrollContainer = scrollContainer.parentElement;
471
+ }
472
+ if (!scrollContainer) return;
473
+ setIsScrolled(scrollContainer.scrollTop > 0);
474
+ const handleScroll = () => {
475
+ if (!scrollContainer) return;
476
+ setIsScrolled(scrollContainer.scrollTop > 0);
477
+ };
478
+ scrollContainer.addEventListener("scroll", handleScroll, { passive: true });
479
+ return () => scrollContainer.removeEventListener("scroll", handleScroll);
480
+ }, []);
481
+ return { targetRef, isScrolled };
482
+ }
483
+
484
+ // src/components/artifacts/table-artifact/table-artifact-styles.ts
485
+ var import_react5 = require("react");
486
+ function StatusMessage({ $tone, children }) {
487
+ return (0, import_react5.createElement)(
488
+ "div",
489
+ {
490
+ className: `py-6 px-2 text-center text-sm font-medium leading-5 ${$tone === "error" ? "text-red-600" : "text-brown-70"}`
491
+ },
492
+ children
493
+ );
494
+ }
495
+
496
+ // src/components/artifacts/table-artifact/table-artifact-content.constants.ts
497
+ var TABLE_STATUS = {
498
+ LOADING: "loading",
499
+ READY: "ready",
500
+ ERROR: "error",
501
+ UNAVAILABLE: "unavailable"
502
+ };
503
+
504
+ // src/components/artifacts/table-artifact/table-artifact-content.utils.ts
505
+ function formatCell(row, column) {
506
+ return row[column.key] ?? "";
507
+ }
508
+ var HEAD_CLASS = "h-auto py-2 px-4 text-xs font-medium text-foreground whitespace-nowrap text-left";
509
+ var CELL_CLASS = "p-4 text-sm font-normal text-foreground align-top min-w-[150px] text-left";
510
+ var ROW_CLASSES = "border-b-brown-30 bg-background/70 hover:bg-secondary";
511
+ var DATA_ROW_CLASSES = `${ROW_CLASSES} animate-in fade-in duration-300`;
512
+ var SCROLL_SHADOW = "0 1px 2px rgb(0 0 0 / 0.01), 0 6px 12px -2px rgb(0 0 0 / 0.03)";
513
+
514
+ // src/components/artifacts/table-artifact/table-artifact-content.tsx
515
+ var import_jsx_runtime7 = require("react/jsx-runtime");
516
+ function TableArtifactContent({
517
+ columns,
518
+ data,
519
+ knownRowCount,
520
+ maxShimmerRows,
521
+ maxBodyHeight,
522
+ unavailableMessage
523
+ }) {
524
+ if (data.status === TABLE_STATUS.ERROR) {
525
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(StatusMessage, { $tone: "error", children: "Couldn't load table data." });
526
+ }
527
+ if (data.status === TABLE_STATUS.UNAVAILABLE) {
528
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(StatusMessage, { $tone: "info", children: unavailableMessage });
529
+ }
530
+ if (data.status === TABLE_STATUS.LOADING) {
531
+ if (typeof knownRowCount === "number" && knownRowCount > 0) {
532
+ const shimmerCount = Math.min(knownRowCount, maxShimmerRows);
533
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ArtifactTable, { columns, maxBodyHeight, children: renderShimmerRows(columns, shimmerCount) });
534
+ }
535
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(StatusMessage, { $tone: "info", children: "Loading table\u2026" });
536
+ }
537
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ArtifactTable, { columns, maxBodyHeight, children: data.rows.length === 0 ? renderEmptyRow(columns.length) : renderDataRows(columns, data.rows) });
538
+ }
539
+ function ArtifactTable({ columns, maxBodyHeight, children }) {
540
+ const { targetRef, isScrolled } = useScrollShadow();
541
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { ref: targetRef, className: "overscroll-none", style: { maxHeight: maxBodyHeight, overflowY: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Table, { containerClassName: "overflow-visible", children: [
542
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
543
+ TableHeader,
544
+ {
545
+ "data-scrolled": isScrolled ? "true" : void 0,
546
+ className: "sticky top-0 z-10 bg-background/70 backdrop-blur-lg transition-shadow",
547
+ style: isScrolled ? { boxShadow: SCROLL_SHADOW } : void 0,
548
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TableRow, { className: "hover:bg-transparent", children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TableHead, { scope: "col", className: HEAD_CLASS, children: column.label }, column.key)) })
549
+ }
550
+ ),
551
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TableBody, { children })
552
+ ] }) });
553
+ }
554
+ function renderShimmerRows(columns, count) {
555
+ return Array.from({ length: count }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TableRow, { className: ROW_CLASSES, "aria-hidden": "true", children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TableCell, { className: CELL_CLASS, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "block h-3 w-3/4 animate-pulse rounded bg-muted-foreground/20" }) }, column.key)) }, `shimmer-${index}`));
556
+ }
557
+ function renderDataRows(columns, rows) {
558
+ return rows.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TableRow, { className: DATA_ROW_CLASSES, children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TableCell, { className: CELL_CLASS, children: formatCell(row, column) }, column.key)) }, index));
559
+ }
560
+ function renderEmptyRow(colSpan) {
561
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TableRow, { className: "hover:bg-transparent", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TableCell, { colSpan, className: "py-6 text-center text-sm text-muted-foreground", children: "No rows to display." }) });
562
+ }
563
+
564
+ // src/components/artifacts/table-artifact/use-table-artifact-data.ts
565
+ var import_react6 = require("react");
566
+
567
+ // src/components/artifacts/table-artifact/parse-csv.ts
568
+ var import_papaparse = __toESM(require("papaparse"), 1);
569
+ function parseCsv(text, columns) {
570
+ const result = import_papaparse.default.parse(text, {
571
+ header: true,
572
+ skipEmptyLines: true,
573
+ dynamicTyping: false
574
+ });
575
+ const csvHeaders = new Set(result.meta?.fields ?? []);
576
+ const presentColumns = columns.filter((col) => csvHeaders.has(col.key));
577
+ return result.data.map((rawRow) => {
578
+ const row = {};
579
+ for (const column of presentColumns) {
580
+ const value = rawRow[column.key];
581
+ row[column.key] = value === void 0 || value === "" ? null : value;
582
+ }
583
+ return row;
584
+ });
585
+ }
586
+
587
+ // src/components/artifacts/table-artifact/use-table-artifact-data.ts
588
+ var LOADING = { status: "loading", rows: null, error: null };
589
+ var UNAVAILABLE = { status: "unavailable", rows: null, error: null };
590
+ var INITIAL_INTERNAL = { cacheKey: null, data: LOADING };
591
+ function columnsFingerprint(columns) {
592
+ return columns.map((c) => `${c.key}:${c.type ?? "string"}`).join("|");
593
+ }
594
+ function useTableArtifactData(presignedUrl, columns) {
595
+ const colsKey = (0, import_react6.useMemo)(() => columnsFingerprint(columns), [columns]);
596
+ const cacheKey = presignedUrl ? `${presignedUrl}::${colsKey}` : null;
597
+ const [state, setState] = (0, import_react6.useState)(INITIAL_INTERNAL);
598
+ (0, import_react6.useEffect)(() => {
599
+ if (!presignedUrl) return;
600
+ const controller = new AbortController();
601
+ fetch(presignedUrl, {
602
+ signal: controller.signal,
603
+ headers: { Accept: "text/csv" },
604
+ // Presigned URLs are cross-origin S3 in production and don't need credentials. Explicit
605
+ // omit so a same-origin URL (compromised payload, local dev) can't accidentally receive
606
+ // session cookies or auth headers.
607
+ credentials: "omit"
608
+ }).then(async (response) => {
609
+ if (!response.ok) throw new Error(`Failed to load table data (${response.status})`);
610
+ return response.text();
611
+ }).then((text) => {
612
+ if (controller.signal.aborted) return;
613
+ try {
614
+ const rows = parseCsv(text, columns);
615
+ setState({ cacheKey: `${presignedUrl}::${colsKey}`, data: { status: "ready", rows, error: null } });
616
+ } catch (parseError) {
617
+ console.error("[TableArtifact] CSV parse failed", parseError);
618
+ const err = parseError instanceof Error ? parseError : new Error(String(parseError));
619
+ setState({ cacheKey: `${presignedUrl}::${colsKey}`, data: { status: "error", rows: null, error: err } });
620
+ }
621
+ }).catch((error) => {
622
+ if (controller.signal.aborted) return;
623
+ console.error("[TableArtifact] Fetch failed", error);
624
+ const err = error instanceof Error ? error : new Error(String(error));
625
+ setState({ cacheKey: `${presignedUrl}::${colsKey}`, data: { status: "error", rows: null, error: err } });
626
+ });
627
+ return () => {
628
+ controller.abort();
629
+ };
630
+ }, [presignedUrl, colsKey]);
631
+ if (!presignedUrl) return UNAVAILABLE;
632
+ if (state.cacheKey !== cacheKey) return LOADING;
633
+ return state.data;
634
+ }
635
+
636
+ // src/components/artifacts/table-artifact/validate.ts
637
+ function isValidTableConfig(config) {
638
+ if (!config || typeof config !== "object") return false;
639
+ const candidate = config;
640
+ if (!Array.isArray(candidate.columns)) return false;
641
+ if (candidate.columns.length === 0) return false;
642
+ return candidate.columns.every(isValidTableColumn);
643
+ }
644
+ function isValidTableColumn(column) {
645
+ if (!column || typeof column !== "object") return false;
646
+ const candidate = column;
647
+ if (typeof candidate.key !== "string" || candidate.key.length === 0) return false;
648
+ if (typeof candidate.label !== "string") return false;
649
+ return true;
650
+ }
651
+
652
+ // src/components/artifacts/table-artifact/table-artifact.tsx
653
+ var import_jsx_runtime8 = require("react/jsx-runtime");
654
+ var TITLE_CLASSES = "text-sm font-semibold text-foreground";
655
+ var TABLE_MAX_BODY_HEIGHT = 480;
656
+ var MAX_SHIMMER_ROWS = 10;
657
+ var MSG_UNAVAILABLE = "Table data is unavailable.";
658
+ function TableArtifact({ artifact }) {
659
+ const validConfig = isValidTableConfig(artifact.config);
660
+ const validColumns = validConfig ? artifact.config.columns : null;
661
+ (0, import_react7.useEffect)(() => {
662
+ if (validConfig) return;
663
+ console.warn("[clay] TableArtifact: malformed `config` \u2014 skipping render.");
664
+ }, [validConfig]);
665
+ const data = useTableArtifactData(
666
+ validConfig ? artifact.protectedAsset?.presignedUrl ?? null : null,
667
+ validColumns ?? []
668
+ );
669
+ const presignedUrl = artifact.protectedAsset?.presignedUrl ?? null;
670
+ if (!validConfig || !validColumns) {
671
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
672
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
673
+ artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ArtifactTitle, { className: TITLE_CLASSES, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", {}),
674
+ presignedUrl ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ArtifactDownloadButton, { href: presignedUrl }) }) : null
675
+ ] }),
676
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ArtifactContent, { className: "p-0 overflow-auto", style: { maxHeight: TABLE_MAX_BODY_HEIGHT }, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StatusMessage, { $tone: "info", children: MSG_UNAVAILABLE }) })
677
+ ] });
678
+ }
679
+ return (
680
+ // The table body owns its own scroll container (`ArtifactTable` inside `TableArtifactContent`).
681
+ // Disable the outer overflow container so only one scroll context exists — this prevents
682
+ // double-scroll nesting and lets `useScrollShadow` find the correct scroll ancestor.
683
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Artifact, { className: "shadow-none w-full rounded-2xl bg-background/70", children: [
684
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(ArtifactHeader, { className: "bg-background/70", children: [
685
+ artifact.title ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ArtifactTitle, { className: TITLE_CLASSES, children: artifact.title }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", {}),
686
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ArtifactActions, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ArtifactDownloadButton, { href: presignedUrl ?? "" }) })
687
+ ] }),
688
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ArtifactContent, { className: "p-0 overflow-visible", style: { maxHeight: "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
689
+ TableArtifactContent,
690
+ {
691
+ columns: validColumns,
692
+ data,
693
+ knownRowCount: artifact.config.stats?.rowCount,
694
+ maxShimmerRows: MAX_SHIMMER_ROWS,
695
+ maxBodyHeight: TABLE_MAX_BODY_HEIGHT,
696
+ unavailableMessage: MSG_UNAVAILABLE
697
+ }
698
+ ) })
699
+ ] })
700
+ );
701
+ }
702
+
703
+ // src/components/artifacts/table-artifact/to-clipboard-text.ts
704
+ function tableArtifactToClipboardText(artifact) {
705
+ const trimmedTitle = artifact.title?.trim();
706
+ return trimmedTitle || "Table";
707
+ }
708
+
709
+ // src/components/artifacts/artifact-services/table-artifact-service.ts
710
+ var TableArtifactService = {
711
+ type: artifactTypes.TABLE,
712
+ Component: TableArtifact,
713
+ toClipboardText: tableArtifactToClipboardText
714
+ };
715
+
716
+ // src/components/artifacts/artifact-services/index.ts
717
+ var ArtifactServices = {
718
+ [artifactTypes.TABLE]: TableArtifactService
719
+ };
720
+ function artifactToClipboardText(artifact) {
721
+ const entry = ArtifactServices[artifact.type];
722
+ if (!entry) {
723
+ return `[Artifact: ${artifact.title ?? artifact.type}]`;
724
+ }
725
+ return entry.toClipboardText(artifact);
726
+ }
727
+
728
+ // src/components/blocks/artifact-ref-block/artifact-ref-block.tsx
729
+ var import_jsx_runtime9 = require("react/jsx-runtime");
730
+ function ArtifactRefBlock({ block }) {
731
+ const { artifact } = block.payload;
732
+ const entry = ArtifactServices[artifact.type];
733
+ if (!entry) return null;
734
+ const { Component } = entry;
735
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Component, { artifact });
736
+ }
737
+
738
+ // src/components/blocks/block-services/artifact-ref-block-service.ts
739
+ var ArtifactRefBlockService = {
740
+ type: blockTypes.ARTIFACT_REF,
741
+ Component: ArtifactRefBlock,
742
+ /**
743
+ * Delegates to the registered artifact component's `toClipboardText`. Falls back to
744
+ * `[Artifact: <title>]` via `artifactToClipboardText`'s own fallback when the artifact type
745
+ * has no registered component, so copy never silently produces an empty string.
746
+ */
747
+ toClipboardText: (block) => artifactToClipboardText(block.payload.artifact)
748
+ };
749
+
750
+ // src/utils/markdown-to-plain-text.ts
751
+ var PLACEHOLDER_PREFIX = "\u200B\u200BIC";
752
+ var PLACEHOLDER_SUFFIX = "\u200B\u200B";
753
+ var PLACEHOLDER_REGEX = new RegExp(`${PLACEHOLDER_PREFIX}(\\d+)${PLACEHOLDER_SUFFIX}`, "g");
754
+ function stripInlineMarks(text) {
755
+ 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");
756
+ }
757
+ function markdownToPlainText(markdown) {
758
+ if (!markdown) return "";
759
+ const inlineCodeSnippets = [];
760
+ let result = markdown.replace(/^<!--[\s\S]*?--!?>\n?/gm, "").replace(/```[\s\S]*?```/g, "").replace(/`([^`]+)`/g, (_match, code) => {
761
+ inlineCodeSnippets.push(code);
762
+ return `${PLACEHOLDER_PREFIX}${inlineCodeSnippets.length - 1}${PLACEHOLDER_SUFFIX}`;
763
+ }).replace(/^#{1,6}\s+/gm, "").replace(/^(?:---|\*\*\*|___)\s*$/gm, "");
764
+ 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();
765
+ result = result.replace(PLACEHOLDER_REGEX, (_match, index) => inlineCodeSnippets[Number(index)]);
766
+ return result;
767
+ }
768
+
769
+ // src/components/blocks/text-block/text-block.tsx
770
+ var import_react_markdown = __toESM(require("react-markdown"), 1);
771
+ var import_remark_breaks = __toESM(require("remark-breaks"), 1);
772
+ var import_remark_gfm = __toESM(require("remark-gfm"), 1);
773
+
145
774
  // src/components/blocks/scrollable-table/scrollable-table-styles.ts
146
- var TableContainer = import_styled_components.default.div`
775
+ var import_styled_components3 = __toESM(require("styled-components"), 1);
776
+ var TableContainer = import_styled_components3.default.div`
147
777
  position: relative;
148
778
  margin-block: 8px 16px;
149
779
  `;
150
- var TableScroll = import_styled_components.default.div`
780
+ var TableScroll = import_styled_components3.default.div`
151
781
  width: 100%;
152
782
  overflow-x: auto;
153
783
  overflow-y: hidden;
154
784
  `;
155
- var TableActionsWrapper = import_styled_components.default.div`
156
- display: flex;
157
- justify-content: flex-start;
158
- margin-block: 8px 0;
159
- `;
160
- var TableActionsDivider = import_styled_components.default.div`
161
- height: 1px;
162
- background: ${colors["brown-40"]};
163
- margin-block: 8px 0;
164
- `;
165
785
 
166
786
  // src/components/blocks/scrollable-table/scrollable-table.tsx
167
- var import_jsx_runtime = require("react/jsx-runtime");
168
- function ScrollableTable({ node: _node, counter, ...props }) {
169
- const currentIndex = counter ? counter.value : 0;
170
- if (counter) {
171
- counter.value += 1;
172
- }
173
- const { TableActions } = useBlockContext();
174
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableContainer, { children: [
175
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableScroll, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("table", { ...props }) }),
176
- TableActions && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
177
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableActionsWrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableActions, { tableIndex: currentIndex }) }),
178
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableActionsDivider, {})
179
- ] })
180
- ] });
787
+ var import_jsx_runtime10 = require("react/jsx-runtime");
788
+ function ScrollableTable({ node: _node, ...props }) {
789
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TableContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TableScroll, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("table", { ...props }) }) });
181
790
  }
182
791
 
183
792
  // src/components/blocks/text-block/sanitize.ts
@@ -189,7 +798,7 @@ function sanitize(text) {
189
798
  }
190
799
 
191
800
  // src/components/blocks/text-block/text-block-styles.ts
192
- var import_styled_components2 = __toESM(require("styled-components"), 1);
801
+ var import_styled_components4 = __toESM(require("styled-components"), 1);
193
802
 
194
803
  // src/tokens/typography.ts
195
804
  var fontFamilies = {
@@ -487,7 +1096,7 @@ function typographyMixin(type) {
487
1096
  }
488
1097
 
489
1098
  // src/components/blocks/text-block/text-block-styles.ts
490
- var TextBlockWrapper = import_styled_components2.default.div`
1099
+ var TextBlockWrapper = import_styled_components4.default.div`
491
1100
  ${typographyMixin(typographyTypes.GEIST_BODY_S_REGULAR)};
492
1101
  color: ${colors["brown-100"]};
493
1102
  word-break: break-word;
@@ -605,41 +1214,51 @@ var TextBlockWrapper = import_styled_components2.default.div`
605
1214
  `;
606
1215
 
607
1216
  // src/components/blocks/text-block/text-block.tsx
608
- var import_jsx_runtime2 = require("react/jsx-runtime");
1217
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1218
+ var markdownComponents = {
1219
+ table: ((tableProps) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(ScrollableTable, { ...tableProps }))
1220
+ };
609
1221
  function TextBlock({ block }) {
610
- const counter = { value: 0 };
611
- const markdownComponents = {
612
- table: ((tableProps) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ScrollableTable, { ...tableProps, counter }))
613
- };
614
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TextBlockWrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_markdown.default, { remarkPlugins: [import_remark_gfm.default, import_remark_breaks.default], components: markdownComponents, children: sanitize(block.payload.text) }) });
1222
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(TextBlockWrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_markdown.default, { remarkPlugins: [import_remark_gfm.default, import_remark_breaks.default], components: markdownComponents, children: sanitize(block.payload.text) }) });
615
1223
  }
616
1224
 
617
- // src/components/blocks/types.ts
618
- var blockTypes = {
619
- TEXT: "TEXT"
620
- };
621
-
622
1225
  // src/components/blocks/block-services/text-block-service.ts
623
1226
  var TextBlockService = {
624
1227
  type: blockTypes.TEXT,
625
- Component: TextBlock
1228
+ Component: TextBlock,
1229
+ /**
1230
+ * Converts the block's markdown source to plain text so the final clipboard value is clean
1231
+ * when pasted into tools that don't render markdown. Each block type owns its own clipboard
1232
+ * conversion so `useCopyToClipboard` can write text verbatim without a second pass.
1233
+ */
1234
+ toClipboardText: (block) => markdownToPlainText(block.payload.text)
626
1235
  };
627
1236
 
628
1237
  // src/components/blocks/block-services/index.ts
629
1238
  var BlockServices = {
630
- [TextBlockService.type]: TextBlockService
1239
+ [blockTypes.TEXT]: TextBlockService,
1240
+ [blockTypes.ARTIFACT_REF]: ArtifactRefBlockService
631
1241
  };
632
1242
 
633
1243
  // src/components/blocks/block/block.tsx
634
- var import_jsx_runtime3 = require("react/jsx-runtime");
1244
+ var import_jsx_runtime12 = require("react/jsx-runtime");
635
1245
  function Block({ block }) {
636
1246
  const service = BlockServices[block.type];
637
1247
  if (!service) return null;
638
1248
  const { Component } = service;
639
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Component, { block });
1249
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Component, { block });
1250
+ }
1251
+
1252
+ // src/components/blocks/block-context/block-context.tsx
1253
+ var import_react8 = require("react");
1254
+ var BlockContext = (0, import_react8.createContext)(null);
1255
+ function useBlockContext() {
1256
+ return (0, import_react8.useContext)(BlockContext) ?? {};
640
1257
  }
641
1258
  // Annotate the CommonJS export names for ESM import in node:
642
1259
  0 && (module.exports = {
1260
+ ArtifactRefBlock,
1261
+ ArtifactRefBlockService,
643
1262
  Block,
644
1263
  BlockContext,
645
1264
  BlockServices,
@@ -647,4 +1266,17 @@ function Block({ block }) {
647
1266
  blockTypes,
648
1267
  useBlockContext
649
1268
  });
1269
+ /*! Bundled license information:
1270
+
1271
+ @tabler/icons-react/dist/esm/defaultAttributes.mjs:
1272
+ @tabler/icons-react/dist/esm/createReactComponent.mjs:
1273
+ @tabler/icons-react/dist/esm/icons/IconDownload.mjs:
1274
+ @tabler/icons-react/dist/esm/tabler-icons-react.mjs:
1275
+ (**
1276
+ * @license @tabler/icons-react v3.37.1 - MIT
1277
+ *
1278
+ * This source code is licensed under the MIT license.
1279
+ * See the LICENSE file in the root directory of this source tree.
1280
+ *)
1281
+ */
650
1282
  //# sourceMappingURL=blocks.cjs.map