@seed-ship/mcp-ui-solid 2.1.2 → 2.2.3

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 (62) hide show
  1. package/dist/components/ChartJSRenderer.cjs +79 -36
  2. package/dist/components/ChartJSRenderer.cjs.map +1 -1
  3. package/dist/components/ChartJSRenderer.d.ts.map +1 -1
  4. package/dist/components/ChartJSRenderer.js +80 -37
  5. package/dist/components/ChartJSRenderer.js.map +1 -1
  6. package/dist/components/CodeBlockRenderer.cjs +79 -56
  7. package/dist/components/CodeBlockRenderer.cjs.map +1 -1
  8. package/dist/components/CodeBlockRenderer.d.ts.map +1 -1
  9. package/dist/components/CodeBlockRenderer.js +80 -57
  10. package/dist/components/CodeBlockRenderer.js.map +1 -1
  11. package/dist/components/ExpandableWrapper.cjs +136 -0
  12. package/dist/components/ExpandableWrapper.cjs.map +1 -0
  13. package/dist/components/ExpandableWrapper.d.ts +31 -0
  14. package/dist/components/ExpandableWrapper.d.ts.map +1 -0
  15. package/dist/components/ExpandableWrapper.js +136 -0
  16. package/dist/components/ExpandableWrapper.js.map +1 -0
  17. package/dist/components/UIResourceRenderer.cjs +369 -242
  18. package/dist/components/UIResourceRenderer.cjs.map +1 -1
  19. package/dist/components/UIResourceRenderer.d.ts +4 -0
  20. package/dist/components/UIResourceRenderer.d.ts.map +1 -1
  21. package/dist/components/UIResourceRenderer.js +370 -243
  22. package/dist/components/UIResourceRenderer.js.map +1 -1
  23. package/dist/index.cjs +3 -0
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +2 -0
  26. package/dist/index.d.ts +2 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +3 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/node_modules/.pnpm/{dompurify@3.3.0 → dompurify@3.3.3}/node_modules/dompurify/dist/purify.es.cjs +19 -4
  31. package/dist/node_modules/.pnpm/dompurify@3.3.3/node_modules/dompurify/dist/purify.es.cjs.map +1 -0
  32. package/dist/node_modules/.pnpm/{dompurify@3.3.0 → dompurify@3.3.3}/node_modules/dompurify/dist/purify.es.js +19 -4
  33. package/dist/node_modules/.pnpm/dompurify@3.3.3/node_modules/dompurify/dist/purify.es.js.map +1 -0
  34. package/dist/services/component-registry.cjs.map +1 -1
  35. package/dist/services/component-registry.d.ts +1 -0
  36. package/dist/services/component-registry.d.ts.map +1 -1
  37. package/dist/services/component-registry.js.map +1 -1
  38. package/dist/services/validation.cjs +29 -5
  39. package/dist/services/validation.cjs.map +1 -1
  40. package/dist/services/validation.d.ts.map +1 -1
  41. package/dist/services/validation.js +29 -5
  42. package/dist/services/validation.js.map +1 -1
  43. package/dist/types/index.d.ts +17 -0
  44. package/dist/types/index.d.ts.map +1 -1
  45. package/dist/types.d.cts +17 -0
  46. package/dist/types.d.ts +17 -0
  47. package/package.json +4 -4
  48. package/src/components/ChartJSRenderer.tsx +71 -42
  49. package/src/components/CodeBlockRenderer.tsx +33 -14
  50. package/src/components/ExpandableWrapper.test.tsx +229 -0
  51. package/src/components/ExpandableWrapper.tsx +201 -0
  52. package/src/components/UIResourceRenderer.tsx +165 -62
  53. package/src/components/renderCellValue.test.ts +122 -0
  54. package/src/index.ts +2 -0
  55. package/src/services/component-registry.test.ts +81 -0
  56. package/src/services/component-registry.ts +3 -2
  57. package/src/services/validation.test.ts +134 -0
  58. package/src/services/validation.ts +21 -5
  59. package/src/types/index.ts +17 -0
  60. package/tsconfig.tsbuildinfo +1 -1
  61. package/dist/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.cjs.map +0 -1
  62. package/dist/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { delegateEvents, createComponent, getNextElement, template, getNextMarker, insert, effect, style, className, setProperty, setAttribute, runHydrationEvents, memo, isServer, use, setStyleProperty } from "solid-js/web";
2
- import purify from "../node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.js";
2
+ import purify from "../node_modules/.pnpm/dompurify@3.3.3/node_modules/dompurify/dist/purify.es.js";
3
3
  import { createMemo, For, Show, createSignal, createEffect } from "solid-js";
4
4
  import { validateComponent, DEFAULT_RESOURCE_LIMITS } from "../services/validation.js";
5
5
  import { GenerativeUIErrorBoundary } from "./GenerativeUIErrorBoundary.js";
@@ -15,10 +15,11 @@ import { ImageGalleryRenderer } from "./ImageGalleryRenderer.js";
15
15
  import { VideoRenderer } from "./VideoRenderer.js";
16
16
  import { CodeBlockRenderer } from "./CodeBlockRenderer.js";
17
17
  import { MapRenderer } from "./MapRenderer.js";
18
+ import { ExpandableWrapper } from "./ExpandableWrapper.js";
18
19
  import { RenderProvider } from "./RenderContext.js";
19
20
  import { useAction } from "../hooks/useAction.js";
20
21
  import { marked as k } from "../node_modules/.pnpm/marked@16.4.2/node_modules/marked/lib/marked.esm.js";
21
- var _tmpl$ = /* @__PURE__ */ template(`<svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z">`), _tmpl$2 = /* @__PURE__ */ template(`<button>`), _tmpl$3 = /* @__PURE__ */ template(`<svg class="w-3 h-3 text-green-500"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M5 13l4 4L19 7">`), _tmpl$4 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600">`), _tmpl$5 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center p-4"><div class=text-center><p class="text-red-600 dark:text-red-400 text-sm font-medium">Chart Error</p><p class="text-gray-600 dark:text-gray-400 text-xs mt-1">`), _tmpl$6 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$7 = /* @__PURE__ */ template(`<div class="w-full h-full p-4"><!$><!/><div class="w-full h-full"role=img><img class="w-full h-auto max-h-[300px] object-contain">`), _tmpl$8 = /* @__PURE__ */ template(`<div class="relative w-full h-full min-h-[300px] bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><!$><!/><!$><!/>`), _tmpl$9 = /* @__PURE__ */ template(`<tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700">`), _tmpl$0 = /* @__PURE__ */ template(`<tr>`), _tmpl$1 = /* @__PURE__ */ template(`<td class="px-6 py-4 text-sm text-gray-700 dark:text-gray-200 whitespace-normal break-words leading-relaxed first:pl-6 last:pr-6"><div>`), _tmpl$10 = /* @__PURE__ */ template(`<tbody class="bg-white dark:bg-gray-800 relative">`), _tmpl$11 = /* @__PURE__ */ template(`<span class="ml-2 text-xs font-normal text-gray-400">(virtualized: <!$><!/> rows)`), _tmpl$12 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3"><!$><!/><!$><!/>`), _tmpl$13 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>Showing <!$><!/> - <!$><!/> of <!$><!/>`), _tmpl$14 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden group"><!$><!/><div class=p-4><!$><!/><div class=overflow-x-auto role=region tabindex=0><table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0"><thead class="bg-gray-50 dark:bg-gray-900/50 sticky top-0 z-10"><tr></tr></thead><!$><!/></table></div><!$><!/>`), _tmpl$15 = /* @__PURE__ */ template(`<th scope=col class="px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 first:pl-6 last:pr-6 bg-gray-50 dark:bg-gray-900/50">`), _tmpl$16 = /* @__PURE__ */ template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$17 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$18 = /* @__PURE__ */ template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$19 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group"><!$><!/><div class="flex flex-col h-full justify-between"><div><p class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide"></p><div class="mt-2 flex items-baseline"><p class="text-2xl font-semibold text-gray-900 dark:text-white"></p><!$><!/></div></div><!$><!/><!$><!/>`), _tmpl$20 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group"><!$><!/><div>`), _tmpl$21 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"><a target=_blank rel="noopener noreferrer"class=cursor-zoom-in><img class="max-w-full max-h-[400px] object-contain rounded shadow-sm hover:opacity-90 transition-opacity"loading=lazy></a></div><div class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center italic">`, true, false, false), _tmpl$22 = /* @__PURE__ */ template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$23 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><!$><!/><iframe class="w-full border-0 flex-1"sandbox="allow-scripts allow-same-origin allow-popups allow-forms"loading=lazy>`, true, false, false), _tmpl$24 = /* @__PURE__ */ template(`<figcaption class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center">`), _tmpl$25 = /* @__PURE__ */ template(`<figure><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"><a target=_blank rel="noopener noreferrer"class="cursor-zoom-in focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded"><img class="max-w-full max-h-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity"loading=lazy></a></div><!$><!/>`, true, false, false), _tmpl$26 = /* @__PURE__ */ template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$27 = /* @__PURE__ */ template(`<a target=_blank rel="noopener noreferrer"><div class="p-2 bg-blue-50 dark:bg-blue-900/30 rounded-full text-blue-600 dark:text-blue-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/50 shrink-0 transition-colors"aria-hidden=true><svg xmlns=http://www.w3.org/2000/svg class="w-5 h-5"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-medium text-gray-900 dark:text-white truncate group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors"></h4><!$><!/></div><svg xmlns=http://www.w3.org/2000/svg class="w-4 h-4 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-gray-300 shrink-0 transition-colors"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3>`), _tmpl$28 = /* @__PURE__ */ template(`<div class="w-full h-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4"><p class="text-sm font-medium text-red-900 dark:text-red-100">Validation Error</p><p class="text-xs text-red-700 dark:text-red-300 mt-1">`), _tmpl$29 = /* @__PURE__ */ template(`<span aria-hidden=true>`), _tmpl$30 = /* @__PURE__ */ template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$31 = /* @__PURE__ */ template(`<span class="animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full"aria-hidden=true>`), _tmpl$32 = /* @__PURE__ */ template(`<button><!$><!/><!$><!/><!$><!/>`), _tmpl$33 = /* @__PURE__ */ template(`<p class="text-xs text-red-600 dark:text-red-400 mt-1">Type: <!$><!/>`), _tmpl$34 = /* @__PURE__ */ template(`<div class=mt-3><p class="text-xs font-medium text-red-700 dark:text-red-300">Suggestions:</p><ul class="mt-1 text-xs text-red-600 dark:text-red-400 list-disc list-inside">`), _tmpl$35 = /* @__PURE__ */ template(`<p class="text-xs text-red-500 dark:text-red-500 mt-2">`), _tmpl$36 = /* @__PURE__ */ template(`<div class="relative w-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 group"><!$><!/><div class="flex items-start gap-3"><div class="p-2 bg-red-100 dark:bg-red-900/40 rounded-full shrink-0"><svg class="w-5 h-5 text-red-600 dark:text-red-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-semibold text-red-800 dark:text-red-200">Tool Error: <!$><!/></h4><p class="text-sm text-red-700 dark:text-red-300 mt-1"></p><!$><!/><!$><!/><!$><!/>`), _tmpl$37 = /* @__PURE__ */ template(`<li>`), _tmpl$38 = /* @__PURE__ */ template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white capitalize">`), _tmpl$39 = /* @__PURE__ */ template(`<div class="w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><div class="p-4 prose prose-sm dark:prose-invert max-w-none">`), _tmpl$40 = /* @__PURE__ */ template(`<div><div class="grid gap-4"></div><!$><!/>`), _tmpl$41 = /* @__PURE__ */ template(`<div>`);
22
+ var _tmpl$ = /* @__PURE__ */ template(`<svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z">`), _tmpl$2 = /* @__PURE__ */ template(`<button>`), _tmpl$3 = /* @__PURE__ */ template(`<svg class="w-3 h-3 text-green-500"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M5 13l4 4L19 7">`), _tmpl$4 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600">`), _tmpl$5 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center p-4"><div class=text-center><p class="text-red-600 dark:text-red-400 text-sm font-medium">Chart Error</p><p class="text-gray-600 dark:text-gray-400 text-xs mt-1">`), _tmpl$6 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$7 = /* @__PURE__ */ template(`<div class="w-full h-full p-4"><!$><!/><div class="w-full h-full"role=img><img class="w-full h-auto max-h-[300px] object-contain">`), _tmpl$8 = /* @__PURE__ */ template(`<div class="relative w-full h-full min-h-[300px] bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><!$><!/><!$><!/>`), _tmpl$9 = /* @__PURE__ */ template(`<tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700">`), _tmpl$0 = /* @__PURE__ */ template(`<tr>`), _tmpl$1 = /* @__PURE__ */ template(`<td class="px-6 py-4 text-sm text-gray-700 dark:text-gray-200 whitespace-normal break-words leading-relaxed first:pl-6 last:pr-6"><div>`), _tmpl$10 = /* @__PURE__ */ template(`<tbody class="bg-white dark:bg-gray-800 relative">`), _tmpl$11 = /* @__PURE__ */ template(`<button class="w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300">Copy TSV`), _tmpl$12 = /* @__PURE__ */ template(`<button class="w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300">Download CSV`), _tmpl$13 = /* @__PURE__ */ template(`<button class="w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300">Download JSON`), _tmpl$14 = /* @__PURE__ */ template(`<div class="absolute right-0 mt-1 w-36 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-lg shadow-lg py-1 text-sm"><!$><!/><!$><!/><!$><!/>`), _tmpl$15 = /* @__PURE__ */ template(`<div class="absolute right-10 top-2 z-10"><button class="opacity-60 hover:opacity-100 px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm"title="Export table"aria-label="Export table"><svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path></svg></button><!$><!/>`), _tmpl$16 = /* @__PURE__ */ template(`<span class="ml-2 text-xs font-normal text-gray-400">(virtualized: <!$><!/> rows)`), _tmpl$17 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3"><!$><!/><!$><!/>`), _tmpl$18 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>Showing <!$><!/> - <!$><!/> of <!$><!/>`), _tmpl$19 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden group"><!$><!/><div class=p-4><!$><!/><div class=overflow-x-auto role=region tabindex=0><table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0"><thead class="bg-gray-50 dark:bg-gray-900/50 sticky top-0 z-10"><tr></tr></thead><!$><!/></table></div><!$><!/>`), _tmpl$20 = /* @__PURE__ */ template(`<th scope=col class="px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 first:pl-6 last:pr-6 bg-gray-50 dark:bg-gray-900/50">`), _tmpl$21 = /* @__PURE__ */ template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$22 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$23 = /* @__PURE__ */ template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$24 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group"><!$><!/><div class="flex flex-col h-full justify-between"><div><p class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide"></p><div class="mt-2 flex items-baseline"><p class="text-2xl font-semibold text-gray-900 dark:text-white"></p><!$><!/></div></div><!$><!/><!$><!/>`), _tmpl$25 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group"><!$><!/><div>`), _tmpl$26 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"><a target=_blank rel="noopener noreferrer"class=cursor-zoom-in><img class="max-w-full max-h-[400px] object-contain rounded shadow-sm hover:opacity-90 transition-opacity"loading=lazy></a></div><div class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center italic">`, true, false, false), _tmpl$27 = /* @__PURE__ */ template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$28 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><!$><!/><iframe class="w-full border-0 flex-1"sandbox="allow-scripts allow-same-origin allow-popups allow-forms"loading=lazy>`, true, false, false), _tmpl$29 = /* @__PURE__ */ template(`<figcaption class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center">`), _tmpl$30 = /* @__PURE__ */ template(`<figure><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"><a target=_blank rel="noopener noreferrer"class="cursor-zoom-in focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded"><img class="max-w-full max-h-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity"loading=lazy></a></div><!$><!/>`, true, false, false), _tmpl$31 = /* @__PURE__ */ template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$32 = /* @__PURE__ */ template(`<a target=_blank rel="noopener noreferrer"><div class="p-2 bg-blue-50 dark:bg-blue-900/30 rounded-full text-blue-600 dark:text-blue-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/50 shrink-0 transition-colors"aria-hidden=true><svg xmlns=http://www.w3.org/2000/svg class="w-5 h-5"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-medium text-gray-900 dark:text-white truncate group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors"></h4><!$><!/></div><svg xmlns=http://www.w3.org/2000/svg class="w-4 h-4 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-gray-300 shrink-0 transition-colors"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3>`), _tmpl$33 = /* @__PURE__ */ template(`<div class="w-full h-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4"><p class="text-sm font-medium text-red-900 dark:text-red-100">Validation Error</p><p class="text-xs text-red-700 dark:text-red-300 mt-1">`), _tmpl$34 = /* @__PURE__ */ template(`<span aria-hidden=true>`), _tmpl$35 = /* @__PURE__ */ template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$36 = /* @__PURE__ */ template(`<span class="animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full"aria-hidden=true>`), _tmpl$37 = /* @__PURE__ */ template(`<button><!$><!/><!$><!/><!$><!/>`), _tmpl$38 = /* @__PURE__ */ template(`<p class="text-xs text-red-600 dark:text-red-400 mt-1">Type: <!$><!/>`), _tmpl$39 = /* @__PURE__ */ template(`<div class=mt-3><p class="text-xs font-medium text-red-700 dark:text-red-300">Suggestions:</p><ul class="mt-1 text-xs text-red-600 dark:text-red-400 list-disc list-inside">`), _tmpl$40 = /* @__PURE__ */ template(`<p class="text-xs text-red-500 dark:text-red-500 mt-2">`), _tmpl$41 = /* @__PURE__ */ template(`<div class="relative w-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 group"><!$><!/><div class="flex items-start gap-3"><div class="p-2 bg-red-100 dark:bg-red-900/40 rounded-full shrink-0"><svg class="w-5 h-5 text-red-600 dark:text-red-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-semibold text-red-800 dark:text-red-200">Tool Error: <!$><!/></h4><p class="text-sm text-red-700 dark:text-red-300 mt-1"></p><!$><!/><!$><!/><!$><!/>`), _tmpl$42 = /* @__PURE__ */ template(`<li>`), _tmpl$43 = /* @__PURE__ */ template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white capitalize">`), _tmpl$44 = /* @__PURE__ */ template(`<div class="w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><div class="p-4 prose prose-sm dark:prose-invert max-w-none">`), _tmpl$45 = /* @__PURE__ */ template(`<div><div class="grid gap-4"></div><!$><!/>`), _tmpl$46 = /* @__PURE__ */ template(`<div>`);
22
23
  function CopyButton(props) {
23
24
  const [copied, setCopied] = createSignal(false);
24
25
  const handleCopy = async () => {
@@ -230,6 +231,14 @@ function renderCellValue(value) {
230
231
  ADD_ATTR: ["target", "rel"]
231
232
  });
232
233
  }
234
+ const hasHtml = /<[a-z][\s\S]*>/i.test(strValue);
235
+ if (hasHtml) {
236
+ return purify.sanitize(strValue, {
237
+ ALLOWED_TAGS: ["a", "strong", "em", "b", "i", "code", "span", "br"],
238
+ ALLOWED_ATTR: ["href", "target", "rel", "class", "data-citation-page", "data-citation-source", "title"],
239
+ ADD_ATTR: ["target", "rel"]
240
+ });
241
+ }
233
242
  const hasMarkdown = /[*_`[\]#]/.test(strValue);
234
243
  if (hasMarkdown) {
235
244
  const parsed = k.parse(strValue, {
@@ -239,7 +248,7 @@ function renderCellValue(value) {
239
248
  ADD_ATTR: ["target", "rel"]
240
249
  });
241
250
  }
242
- return strValue;
251
+ return purify.sanitize(strValue);
243
252
  }
244
253
  function TableRenderer(props) {
245
254
  const tableParams = props.component.params;
@@ -291,19 +300,74 @@ function TableRenderer(props) {
291
300
  setIsVirtualizing(false);
292
301
  }
293
302
  });
303
+ const getCellValue = (row, key) => {
304
+ const value = row[key];
305
+ if (value === null || value === void 0) return "";
306
+ if (typeof value === "object") return value.name || value.label || JSON.stringify(value);
307
+ return String(value);
308
+ };
294
309
  const getTableText = () => {
295
310
  const columns = tableParams.columns || [];
296
311
  const rows = tableParams.rows || [];
297
312
  const header = columns.map((c) => c.label).join(" ");
298
- const dataRows = rows.map((row) => columns.map((c) => {
299
- const value = row[c.key];
300
- if (value === null || value === void 0) return "";
301
- if (typeof value === "object") return value.name || value.label || JSON.stringify(value);
302
- return String(value);
303
- }).join(" ")).join("\n");
313
+ const dataRows = rows.map((row) => columns.map((c) => getCellValue(row, c.key)).join(" ")).join("\n");
304
314
  return `${header}
305
315
  ${dataRows}`;
306
316
  };
317
+ const getTableCSV = () => {
318
+ const columns = tableParams.columns || [];
319
+ const rows = tableParams.rows || [];
320
+ const escapeCSV = (val) => {
321
+ if (val.includes(",") || val.includes('"') || val.includes("\n")) {
322
+ return `"${val.replace(/"/g, '""')}"`;
323
+ }
324
+ return val;
325
+ };
326
+ const header = columns.map((c) => escapeCSV(c.label)).join(",");
327
+ const dataRows = rows.map((row) => columns.map((c) => escapeCSV(getCellValue(row, c.key))).join(",")).join("\n");
328
+ return `${header}
329
+ ${dataRows}`;
330
+ };
331
+ const getTableJSON = () => {
332
+ const columns = tableParams.columns || [];
333
+ const rows = tableParams.rows || [];
334
+ return JSON.stringify({
335
+ columns: columns.map((c) => ({
336
+ key: c.key,
337
+ label: c.label
338
+ })),
339
+ rows
340
+ }, null, 2);
341
+ };
342
+ const downloadFile = (content, filename, mimeType) => {
343
+ const blob = new Blob([content], {
344
+ type: mimeType
345
+ });
346
+ const url = URL.createObjectURL(blob);
347
+ const a = document.createElement("a");
348
+ a.href = url;
349
+ a.download = filename;
350
+ a.click();
351
+ URL.revokeObjectURL(url);
352
+ };
353
+ const exportable = tableParams.exportable;
354
+ const exportFormats = typeof exportable === "object" && (exportable == null ? void 0 : exportable.formats) ? exportable.formats : ["csv", "tsv", "json"];
355
+ const exportFilename = typeof exportable === "object" && (exportable == null ? void 0 : exportable.filename) || `table-${Math.random().toString(36).slice(2, 9)}`;
356
+ const [showExportMenu, setShowExportMenu] = createSignal(false);
357
+ const handleExport = (format) => {
358
+ setShowExportMenu(false);
359
+ switch (format) {
360
+ case "tsv":
361
+ navigator.clipboard.writeText(getTableText());
362
+ break;
363
+ case "csv":
364
+ downloadFile(getTableCSV(), `${exportFilename}.csv`, "text/csv");
365
+ break;
366
+ case "json":
367
+ downloadFile(getTableJSON(), `${exportFilename}.json`, "application/json");
368
+ break;
369
+ }
370
+ };
307
371
  const tableId = `table-${Math.random().toString(36).slice(2, 9)}`;
308
372
  const StandardTableBody = () => (() => {
309
373
  var _el$20 = getNextElement(_tmpl$9);
@@ -372,92 +436,154 @@ ${dataRows}`;
372
436
  return _el$24;
373
437
  })();
374
438
  };
375
- return (() => {
376
- var _el$28 = getNextElement(_tmpl$14), _el$63 = _el$28.firstChild, [_el$64, _co$12] = getNextMarker(_el$63.nextSibling), _el$29 = _el$64.nextSibling, _el$59 = _el$29.firstChild, [_el$60, _co$10] = getNextMarker(_el$59.nextSibling), _el$40 = _el$60.nextSibling, _el$41 = _el$40.firstChild, _el$42 = _el$41.firstChild, _el$43 = _el$42.firstChild, _el$44 = _el$42.nextSibling, [_el$45, _co$8] = getNextMarker(_el$44.nextSibling), _el$61 = _el$40.nextSibling, [_el$62, _co$11] = getNextMarker(_el$61.nextSibling);
377
- insert(_el$28, createComponent(CopyButton, {
378
- getText: getTableText,
379
- title: "Copy table data",
380
- position: "top-right"
381
- }), _el$64, _co$12);
382
- insert(_el$29, createComponent(Show, {
383
- get when() {
384
- return tableParams.title;
385
- },
386
- get children() {
387
- var _el$30 = getNextElement(_tmpl$12), _el$36 = _el$30.firstChild, [_el$37, _co$6] = getNextMarker(_el$36.nextSibling), _el$38 = _el$37.nextSibling, [_el$39, _co$7] = getNextMarker(_el$38.nextSibling);
388
- setAttribute(_el$30, "id", `${tableId}-title`);
389
- insert(_el$30, () => tableParams.title, _el$37, _co$6);
390
- insert(_el$30, createComponent(Show, {
391
- get when() {
392
- return isVirtualizing();
393
- },
394
- get children() {
395
- var _el$31 = getNextElement(_tmpl$11), _el$32 = _el$31.firstChild, _el$34 = _el$32.nextSibling, [_el$35, _co$5] = getNextMarker(_el$34.nextSibling);
396
- _el$35.nextSibling;
397
- insert(_el$31, () => {
398
- var _a;
399
- return (_a = tableParams.rows) == null ? void 0 : _a.length;
400
- }, _el$35, _co$5);
401
- return _el$31;
402
- }
403
- }), _el$39, _co$7);
404
- return _el$30;
405
- }
406
- }), _el$60, _co$10);
407
- var _ref$ = scrollContainerRef;
408
- typeof _ref$ === "function" ? use(_ref$, _el$40) : scrollContainerRef = _el$40;
409
- insert(_el$43, createComponent(For, {
410
- get each() {
411
- return tableParams.columns;
412
- },
413
- children: (column) => (() => {
414
- var _el$65 = getNextElement(_tmpl$15);
415
- insert(_el$65, () => column.label);
416
- effect((_$p) => style(_el$65, column.width ? {
417
- width: column.width
418
- } : {}, _$p));
419
- return _el$65;
420
- })()
421
- }));
422
- insert(_el$41, createComponent(Show, {
423
- get when() {
424
- return isVirtualizing();
425
- },
426
- get fallback() {
427
- return createComponent(StandardTableBody, {});
428
- },
429
- get children() {
430
- return createComponent(VirtualizedTableBody, {});
431
- }
432
- }), _el$45, _co$8);
433
- insert(_el$29, createComponent(Show, {
434
- get when() {
435
- return tableParams.pagination;
436
- },
437
- get children() {
438
- var _el$46 = getNextElement(_tmpl$13), _el$47 = _el$46.firstChild, _el$48 = _el$47.firstChild, _el$53 = _el$48.nextSibling, [_el$54, _co$9] = getNextMarker(_el$53.nextSibling), _el$49 = _el$54.nextSibling, _el$55 = _el$49.nextSibling, [_el$56, _co$0] = getNextMarker(_el$55.nextSibling), _el$51 = _el$56.nextSibling, _el$57 = _el$51.nextSibling, [_el$58, _co$1] = getNextMarker(_el$57.nextSibling);
439
- insert(_el$47, () => tableParams.pagination.currentPage * tableParams.pagination.pageSize + 1, _el$54, _co$9);
440
- insert(_el$47, () => Math.min((tableParams.pagination.currentPage + 1) * tableParams.pagination.pageSize, tableParams.pagination.totalRows), _el$56, _co$0);
441
- insert(_el$47, () => tableParams.pagination.totalRows, _el$58, _co$1);
442
- return _el$46;
443
- }
444
- }), _el$62, _co$11);
445
- effect((_p$) => {
446
- var _v$8 = isVirtualizing() ? {
447
- "max-height": "500px",
448
- "overflow-y": "auto"
449
- } : {}, _v$9 = tableParams.title || "Data table", _v$0 = tableParams.title ? `${tableId}-title` : void 0;
450
- _p$.e = style(_el$40, _v$8, _p$.e);
451
- _v$9 !== _p$.t && setAttribute(_el$40, "aria-label", _p$.t = _v$9);
452
- _v$0 !== _p$.a && setAttribute(_el$41, "aria-labelledby", _p$.a = _v$0);
453
- return _p$;
454
- }, {
455
- e: void 0,
456
- t: void 0,
457
- a: void 0
458
- });
459
- return _el$28;
460
- })();
439
+ return createComponent(ExpandableWrapper, {
440
+ get title() {
441
+ return tableParams.title || "Table";
442
+ },
443
+ get copyData() {
444
+ return getTableText();
445
+ },
446
+ copyLabel: "Copy table (TSV)",
447
+ get children() {
448
+ var _el$28 = getNextElement(_tmpl$19), _el$77 = _el$28.firstChild, [_el$78, _co$16] = getNextMarker(_el$77.nextSibling), _el$43 = _el$78.nextSibling, _el$73 = _el$43.firstChild, [_el$74, _co$14] = getNextMarker(_el$73.nextSibling), _el$54 = _el$74.nextSibling, _el$55 = _el$54.firstChild, _el$56 = _el$55.firstChild, _el$57 = _el$56.firstChild, _el$58 = _el$56.nextSibling, [_el$59, _co$10] = getNextMarker(_el$58.nextSibling), _el$75 = _el$54.nextSibling, [_el$76, _co$15] = getNextMarker(_el$75.nextSibling);
449
+ insert(_el$28, createComponent(Show, {
450
+ when: exportable,
451
+ get fallback() {
452
+ return createComponent(CopyButton, {
453
+ getText: getTableText,
454
+ title: "Copy table data",
455
+ position: "top-right"
456
+ });
457
+ },
458
+ get children() {
459
+ var _el$29 = getNextElement(_tmpl$15), _el$30 = _el$29.firstChild, _el$41 = _el$30.nextSibling, [_el$42, _co$8] = getNextMarker(_el$41.nextSibling);
460
+ _el$30.$$click = () => setShowExportMenu(!showExportMenu());
461
+ insert(_el$29, createComponent(Show, {
462
+ get when() {
463
+ return showExportMenu();
464
+ },
465
+ get children() {
466
+ var _el$31 = getNextElement(_tmpl$14), _el$35 = _el$31.firstChild, [_el$36, _co$5] = getNextMarker(_el$35.nextSibling), _el$37 = _el$36.nextSibling, [_el$38, _co$6] = getNextMarker(_el$37.nextSibling), _el$39 = _el$38.nextSibling, [_el$40, _co$7] = getNextMarker(_el$39.nextSibling);
467
+ insert(_el$31, createComponent(Show, {
468
+ get when() {
469
+ return exportFormats.includes("tsv");
470
+ },
471
+ get children() {
472
+ var _el$32 = getNextElement(_tmpl$11);
473
+ _el$32.$$click = () => handleExport("tsv");
474
+ runHydrationEvents();
475
+ return _el$32;
476
+ }
477
+ }), _el$36, _co$5);
478
+ insert(_el$31, createComponent(Show, {
479
+ get when() {
480
+ return exportFormats.includes("csv");
481
+ },
482
+ get children() {
483
+ var _el$33 = getNextElement(_tmpl$12);
484
+ _el$33.$$click = () => handleExport("csv");
485
+ runHydrationEvents();
486
+ return _el$33;
487
+ }
488
+ }), _el$38, _co$6);
489
+ insert(_el$31, createComponent(Show, {
490
+ get when() {
491
+ return exportFormats.includes("json");
492
+ },
493
+ get children() {
494
+ var _el$34 = getNextElement(_tmpl$13);
495
+ _el$34.$$click = () => handleExport("json");
496
+ runHydrationEvents();
497
+ return _el$34;
498
+ }
499
+ }), _el$40, _co$7);
500
+ return _el$31;
501
+ }
502
+ }), _el$42, _co$8);
503
+ runHydrationEvents();
504
+ return _el$29;
505
+ }
506
+ }), _el$78, _co$16);
507
+ insert(_el$43, createComponent(Show, {
508
+ get when() {
509
+ return tableParams.title;
510
+ },
511
+ get children() {
512
+ var _el$44 = getNextElement(_tmpl$17), _el$50 = _el$44.firstChild, [_el$51, _co$0] = getNextMarker(_el$50.nextSibling), _el$52 = _el$51.nextSibling, [_el$53, _co$1] = getNextMarker(_el$52.nextSibling);
513
+ setAttribute(_el$44, "id", `${tableId}-title`);
514
+ insert(_el$44, () => tableParams.title, _el$51, _co$0);
515
+ insert(_el$44, createComponent(Show, {
516
+ get when() {
517
+ return isVirtualizing();
518
+ },
519
+ get children() {
520
+ var _el$45 = getNextElement(_tmpl$16), _el$46 = _el$45.firstChild, _el$48 = _el$46.nextSibling, [_el$49, _co$9] = getNextMarker(_el$48.nextSibling);
521
+ _el$49.nextSibling;
522
+ insert(_el$45, () => {
523
+ var _a;
524
+ return (_a = tableParams.rows) == null ? void 0 : _a.length;
525
+ }, _el$49, _co$9);
526
+ return _el$45;
527
+ }
528
+ }), _el$53, _co$1);
529
+ return _el$44;
530
+ }
531
+ }), _el$74, _co$14);
532
+ var _ref$ = scrollContainerRef;
533
+ typeof _ref$ === "function" ? use(_ref$, _el$54) : scrollContainerRef = _el$54;
534
+ insert(_el$57, createComponent(For, {
535
+ get each() {
536
+ return tableParams.columns;
537
+ },
538
+ children: (column) => (() => {
539
+ var _el$79 = getNextElement(_tmpl$20);
540
+ insert(_el$79, () => column.label);
541
+ effect((_$p) => style(_el$79, column.width ? {
542
+ width: column.width
543
+ } : {}, _$p));
544
+ return _el$79;
545
+ })()
546
+ }));
547
+ insert(_el$55, createComponent(Show, {
548
+ get when() {
549
+ return isVirtualizing();
550
+ },
551
+ get fallback() {
552
+ return createComponent(StandardTableBody, {});
553
+ },
554
+ get children() {
555
+ return createComponent(VirtualizedTableBody, {});
556
+ }
557
+ }), _el$59, _co$10);
558
+ insert(_el$43, createComponent(Show, {
559
+ get when() {
560
+ return tableParams.pagination;
561
+ },
562
+ get children() {
563
+ var _el$60 = getNextElement(_tmpl$18), _el$61 = _el$60.firstChild, _el$62 = _el$61.firstChild, _el$67 = _el$62.nextSibling, [_el$68, _co$11] = getNextMarker(_el$67.nextSibling), _el$63 = _el$68.nextSibling, _el$69 = _el$63.nextSibling, [_el$70, _co$12] = getNextMarker(_el$69.nextSibling), _el$65 = _el$70.nextSibling, _el$71 = _el$65.nextSibling, [_el$72, _co$13] = getNextMarker(_el$71.nextSibling);
564
+ insert(_el$61, () => tableParams.pagination.currentPage * tableParams.pagination.pageSize + 1, _el$68, _co$11);
565
+ insert(_el$61, () => Math.min((tableParams.pagination.currentPage + 1) * tableParams.pagination.pageSize, tableParams.pagination.totalRows), _el$70, _co$12);
566
+ insert(_el$61, () => tableParams.pagination.totalRows, _el$72, _co$13);
567
+ return _el$60;
568
+ }
569
+ }), _el$76, _co$15);
570
+ effect((_p$) => {
571
+ var _v$8 = isVirtualizing() ? {
572
+ "max-height": "500px",
573
+ "overflow-y": "auto"
574
+ } : {}, _v$9 = tableParams.title || "Data table", _v$0 = tableParams.title ? `${tableId}-title` : void 0;
575
+ _p$.e = style(_el$54, _v$8, _p$.e);
576
+ _v$9 !== _p$.t && setAttribute(_el$54, "aria-label", _p$.t = _v$9);
577
+ _v$0 !== _p$.a && setAttribute(_el$55, "aria-labelledby", _p$.a = _v$0);
578
+ return _p$;
579
+ }, {
580
+ e: void 0,
581
+ t: void 0,
582
+ a: void 0
583
+ });
584
+ return _el$28;
585
+ }
586
+ });
461
587
  }
462
588
  function MetricRenderer(props) {
463
589
  const metricParams = props.component.params;
@@ -468,51 +594,51 @@ function MetricRenderer(props) {
468
594
  return `${title}: ${value}${unit ? " " + unit : ""}`;
469
595
  };
470
596
  return (() => {
471
- var _el$66 = getNextElement(_tmpl$19), _el$88 = _el$66.firstChild, [_el$89, _co$18] = getNextMarker(_el$88.nextSibling), _el$67 = _el$89.nextSibling, _el$68 = _el$67.firstChild, _el$69 = _el$68.firstChild, _el$70 = _el$69.nextSibling, _el$71 = _el$70.firstChild, _el$73 = _el$71.nextSibling, [_el$74, _co$13] = getNextMarker(_el$73.nextSibling), _el$84 = _el$68.nextSibling, [_el$85, _co$16] = getNextMarker(_el$84.nextSibling), _el$86 = _el$85.nextSibling, [_el$87, _co$17] = getNextMarker(_el$86.nextSibling);
472
- insert(_el$66, createComponent(CopyButton, {
597
+ var _el$80 = getNextElement(_tmpl$24), _el$102 = _el$80.firstChild, [_el$103, _co$22] = getNextMarker(_el$102.nextSibling), _el$81 = _el$103.nextSibling, _el$82 = _el$81.firstChild, _el$83 = _el$82.firstChild, _el$84 = _el$83.nextSibling, _el$85 = _el$84.firstChild, _el$87 = _el$85.nextSibling, [_el$88, _co$17] = getNextMarker(_el$87.nextSibling), _el$98 = _el$82.nextSibling, [_el$99, _co$20] = getNextMarker(_el$98.nextSibling), _el$100 = _el$99.nextSibling, [_el$101, _co$21] = getNextMarker(_el$100.nextSibling);
598
+ insert(_el$80, createComponent(CopyButton, {
473
599
  getText: getMetricText,
474
600
  title: "Copy metric",
475
601
  position: "top-right"
476
- }), _el$89, _co$18);
477
- insert(_el$69, () => metricParams.title);
478
- insert(_el$71, () => metricParams.value);
479
- insert(_el$70, createComponent(Show, {
602
+ }), _el$103, _co$22);
603
+ insert(_el$83, () => metricParams.title);
604
+ insert(_el$85, () => metricParams.value);
605
+ insert(_el$84, createComponent(Show, {
480
606
  get when() {
481
607
  return metricParams.unit;
482
608
  },
483
609
  get children() {
484
- var _el$72 = getNextElement(_tmpl$16);
485
- insert(_el$72, () => metricParams.unit);
486
- return _el$72;
610
+ var _el$86 = getNextElement(_tmpl$21);
611
+ insert(_el$86, () => metricParams.unit);
612
+ return _el$86;
487
613
  }
488
- }), _el$74, _co$13);
489
- insert(_el$67, createComponent(Show, {
614
+ }), _el$88, _co$17);
615
+ insert(_el$81, createComponent(Show, {
490
616
  get when() {
491
617
  return metricParams.trend;
492
618
  },
493
619
  get children() {
494
- var _el$75 = getNextElement(_tmpl$17), _el$76 = _el$75.firstChild, _el$79 = _el$76.firstChild, [_el$80, _co$14] = getNextMarker(_el$79.nextSibling), _el$77 = _el$80.nextSibling, _el$81 = _el$77.nextSibling, [_el$82, _co$15] = getNextMarker(_el$81.nextSibling);
495
- _el$82.nextSibling;
496
- insert(_el$76, (() => {
620
+ var _el$89 = getNextElement(_tmpl$22), _el$90 = _el$89.firstChild, _el$93 = _el$90.firstChild, [_el$94, _co$18] = getNextMarker(_el$93.nextSibling), _el$91 = _el$94.nextSibling, _el$95 = _el$91.nextSibling, [_el$96, _co$19] = getNextMarker(_el$95.nextSibling);
621
+ _el$96.nextSibling;
622
+ insert(_el$90, (() => {
497
623
  var _c$ = memo(() => metricParams.trend.direction === "up");
498
624
  return () => _c$() ? "�" : metricParams.trend.direction === "down" ? "�" : "�";
499
- })(), _el$80, _co$14);
500
- insert(_el$76, () => Math.abs(metricParams.trend.value), _el$82, _co$15);
501
- effect(() => className(_el$76, `text-sm font-medium ${metricParams.trend.direction === "up" ? "text-green-600 dark:text-green-400" : metricParams.trend.direction === "down" ? "text-red-600 dark:text-red-400" : "text-gray-600 dark:text-gray-400"}`));
502
- return _el$75;
625
+ })(), _el$94, _co$18);
626
+ insert(_el$90, () => Math.abs(metricParams.trend.value), _el$96, _co$19);
627
+ effect(() => className(_el$90, `text-sm font-medium ${metricParams.trend.direction === "up" ? "text-green-600 dark:text-green-400" : metricParams.trend.direction === "down" ? "text-red-600 dark:text-red-400" : "text-gray-600 dark:text-gray-400"}`));
628
+ return _el$89;
503
629
  }
504
- }), _el$85, _co$16);
505
- insert(_el$67, createComponent(Show, {
630
+ }), _el$99, _co$20);
631
+ insert(_el$81, createComponent(Show, {
506
632
  get when() {
507
633
  return metricParams.subtitle;
508
634
  },
509
635
  get children() {
510
- var _el$83 = getNextElement(_tmpl$18);
511
- insert(_el$83, () => metricParams.subtitle);
512
- return _el$83;
636
+ var _el$97 = getNextElement(_tmpl$23);
637
+ insert(_el$97, () => metricParams.subtitle);
638
+ return _el$97;
513
639
  }
514
- }), _el$87, _co$17);
515
- return _el$66;
640
+ }), _el$101, _co$21);
641
+ return _el$80;
516
642
  })();
517
643
  }
518
644
  function extractImageFromMarkdown(content) {
@@ -553,91 +679,91 @@ function TextRenderer(props) {
553
679
  },
554
680
  get fallback() {
555
681
  return (() => {
556
- var _el$90 = getNextElement(_tmpl$20), _el$92 = _el$90.firstChild, [_el$93, _co$19] = getNextMarker(_el$92.nextSibling), _el$91 = _el$93.nextSibling;
557
- insert(_el$90, createComponent(CopyButton, {
682
+ var _el$104 = getNextElement(_tmpl$25), _el$106 = _el$104.firstChild, [_el$107, _co$23] = getNextMarker(_el$106.nextSibling), _el$105 = _el$107.nextSibling;
683
+ insert(_el$104, createComponent(CopyButton, {
558
684
  getText: getTextContent,
559
685
  title: "Copy text",
560
686
  position: "top-right"
561
- }), _el$93, _co$19);
687
+ }), _el$107, _co$23);
562
688
  effect((_p$) => {
563
689
  var _v$1 = `prose prose-sm dark:prose-invert max-w-none ${textParams.className || ""}`, _v$10 = htmlContent();
564
- _v$1 !== _p$.e && className(_el$91, _p$.e = _v$1);
565
- _v$10 !== _p$.t && setProperty(_el$91, "innerHTML", _p$.t = _v$10);
690
+ _v$1 !== _p$.e && className(_el$105, _p$.e = _v$1);
691
+ _v$10 !== _p$.t && setProperty(_el$105, "innerHTML", _p$.t = _v$10);
566
692
  return _p$;
567
693
  }, {
568
694
  e: void 0,
569
695
  t: void 0
570
696
  });
571
- return _el$90;
697
+ return _el$104;
572
698
  })();
573
699
  },
574
700
  children: (data) => (() => {
575
- var _el$94 = getNextElement(_tmpl$21), _el$95 = _el$94.firstChild, _el$96 = _el$95.firstChild, _el$97 = _el$96.firstChild, _el$98 = _el$95.nextSibling, _el$99 = _el$98.firstChild;
576
- insert(_el$99, () => data().credit);
701
+ var _el$108 = getNextElement(_tmpl$26), _el$109 = _el$108.firstChild, _el$110 = _el$109.firstChild, _el$111 = _el$110.firstChild, _el$112 = _el$109.nextSibling, _el$113 = _el$112.firstChild;
702
+ insert(_el$113, () => data().credit);
577
703
  effect((_p$) => {
578
704
  var _v$11 = data().linkUrl, _v$12 = data().imageUrl, _v$13 = data().alt;
579
- _v$11 !== _p$.e && setAttribute(_el$96, "href", _p$.e = _v$11);
580
- _v$12 !== _p$.t && setAttribute(_el$97, "src", _p$.t = _v$12);
581
- _v$13 !== _p$.a && setAttribute(_el$97, "alt", _p$.a = _v$13);
705
+ _v$11 !== _p$.e && setAttribute(_el$110, "href", _p$.e = _v$11);
706
+ _v$12 !== _p$.t && setAttribute(_el$111, "src", _p$.t = _v$12);
707
+ _v$13 !== _p$.a && setAttribute(_el$111, "alt", _p$.a = _v$13);
582
708
  return _p$;
583
709
  }, {
584
710
  e: void 0,
585
711
  t: void 0,
586
712
  a: void 0
587
713
  });
588
- return _el$94;
714
+ return _el$108;
589
715
  })()
590
716
  });
591
717
  }
592
718
  function IframeRenderer(props) {
593
719
  const params = props.component.params;
594
720
  return (() => {
595
- var _el$100 = getNextElement(_tmpl$23), _el$104 = _el$100.firstChild, [_el$105, _co$20] = getNextMarker(_el$104.nextSibling), _el$103 = _el$105.nextSibling;
596
- insert(_el$100, createComponent(Show, {
721
+ var _el$114 = getNextElement(_tmpl$28), _el$118 = _el$114.firstChild, [_el$119, _co$24] = getNextMarker(_el$118.nextSibling), _el$117 = _el$119.nextSibling;
722
+ insert(_el$114, createComponent(Show, {
597
723
  get when() {
598
724
  return params.title;
599
725
  },
600
726
  get children() {
601
- var _el$101 = getNextElement(_tmpl$22), _el$102 = _el$101.firstChild;
602
- insert(_el$102, () => params.title);
603
- return _el$101;
727
+ var _el$115 = getNextElement(_tmpl$27), _el$116 = _el$115.firstChild;
728
+ insert(_el$116, () => params.title);
729
+ return _el$115;
604
730
  }
605
- }), _el$105, _co$20);
731
+ }), _el$119, _co$24);
606
732
  effect((_p$) => {
607
733
  var _v$14 = params.url, _v$15 = params.title || "Embedded content", _v$16 = `height: ${params.height || "400px"}; min-height: 300px;`;
608
- _v$14 !== _p$.e && setAttribute(_el$103, "src", _p$.e = _v$14);
609
- _v$15 !== _p$.t && setAttribute(_el$103, "title", _p$.t = _v$15);
610
- _p$.a = style(_el$103, _v$16, _p$.a);
734
+ _v$14 !== _p$.e && setAttribute(_el$117, "src", _p$.e = _v$14);
735
+ _v$15 !== _p$.t && setAttribute(_el$117, "title", _p$.t = _v$15);
736
+ _p$.a = style(_el$117, _v$16, _p$.a);
611
737
  return _p$;
612
738
  }, {
613
739
  e: void 0,
614
740
  t: void 0,
615
741
  a: void 0
616
742
  });
617
- return _el$100;
743
+ return _el$114;
618
744
  })();
619
745
  }
620
746
  function ImageRenderer(props) {
621
747
  const params = props.component.params;
622
748
  return (() => {
623
- var _el$106 = getNextElement(_tmpl$25), _el$107 = _el$106.firstChild, _el$108 = _el$107.firstChild, _el$109 = _el$108.firstChild, _el$112 = _el$107.nextSibling, [_el$113, _co$21] = getNextMarker(_el$112.nextSibling);
624
- insert(_el$106, createComponent(Show, {
749
+ var _el$120 = getNextElement(_tmpl$30), _el$121 = _el$120.firstChild, _el$122 = _el$121.firstChild, _el$123 = _el$122.firstChild, _el$126 = _el$121.nextSibling, [_el$127, _co$25] = getNextMarker(_el$126.nextSibling);
750
+ insert(_el$120, createComponent(Show, {
625
751
  get when() {
626
752
  return params.caption;
627
753
  },
628
754
  get children() {
629
- var _el$110 = getNextElement(_tmpl$24), _el$111 = _el$110.firstChild;
630
- insert(_el$111, () => params.caption);
631
- return _el$110;
755
+ var _el$124 = getNextElement(_tmpl$29), _el$125 = _el$124.firstChild;
756
+ insert(_el$125, () => params.caption);
757
+ return _el$124;
632
758
  }
633
- }), _el$113, _co$21);
759
+ }), _el$127, _co$25);
634
760
  effect((_p$) => {
635
761
  var _v$17 = `w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col ${params.className || ""}`, _v$18 = params.url, _v$19 = `View full size: ${params.alt || "image"}`, _v$20 = params.url, _v$21 = params.alt || "Image";
636
- _v$17 !== _p$.e && className(_el$106, _p$.e = _v$17);
637
- _v$18 !== _p$.t && setAttribute(_el$108, "href", _p$.t = _v$18);
638
- _v$19 !== _p$.a && setAttribute(_el$108, "aria-label", _p$.a = _v$19);
639
- _v$20 !== _p$.o && setAttribute(_el$109, "src", _p$.o = _v$20);
640
- _v$21 !== _p$.i && setAttribute(_el$109, "alt", _p$.i = _v$21);
762
+ _v$17 !== _p$.e && className(_el$120, _p$.e = _v$17);
763
+ _v$18 !== _p$.t && setAttribute(_el$122, "href", _p$.t = _v$18);
764
+ _v$19 !== _p$.a && setAttribute(_el$122, "aria-label", _p$.a = _v$19);
765
+ _v$20 !== _p$.o && setAttribute(_el$123, "src", _p$.o = _v$20);
766
+ _v$21 !== _p$.i && setAttribute(_el$123, "alt", _p$.i = _v$21);
641
767
  return _p$;
642
768
  }, {
643
769
  e: void 0,
@@ -646,30 +772,30 @@ function ImageRenderer(props) {
646
772
  o: void 0,
647
773
  i: void 0
648
774
  });
649
- return _el$106;
775
+ return _el$120;
650
776
  })();
651
777
  }
652
778
  function LinkRenderer(props) {
653
779
  const params = props.component.params;
654
780
  return (() => {
655
- var _el$114 = getNextElement(_tmpl$27), _el$115 = _el$114.firstChild, _el$116 = _el$115.nextSibling, _el$117 = _el$116.firstChild, _el$119 = _el$117.nextSibling, [_el$120, _co$22] = getNextMarker(_el$119.nextSibling);
656
- _el$114.$$click = (e) => e.stopPropagation();
657
- insert(_el$117, () => params.label || params.url);
658
- insert(_el$116, createComponent(Show, {
781
+ var _el$128 = getNextElement(_tmpl$32), _el$129 = _el$128.firstChild, _el$130 = _el$129.nextSibling, _el$131 = _el$130.firstChild, _el$133 = _el$131.nextSibling, [_el$134, _co$26] = getNextMarker(_el$133.nextSibling);
782
+ _el$128.$$click = (e) => e.stopPropagation();
783
+ insert(_el$131, () => params.label || params.url);
784
+ insert(_el$130, createComponent(Show, {
659
785
  get when() {
660
786
  return params.description;
661
787
  },
662
788
  get children() {
663
- var _el$118 = getNextElement(_tmpl$26);
664
- insert(_el$118, () => params.description);
665
- return _el$118;
789
+ var _el$132 = getNextElement(_tmpl$31);
790
+ insert(_el$132, () => params.description);
791
+ return _el$132;
666
792
  }
667
- }), _el$120, _co$22);
793
+ }), _el$134, _co$26);
668
794
  effect((_p$) => {
669
795
  var _v$22 = params.url, _v$23 = `${params.label || "Link"}: ${params.description || params.url} (opens in new tab)`, _v$24 = `flex items-center gap-3 p-4 bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors group h-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 ${params.className || ""}`;
670
- _v$22 !== _p$.e && setAttribute(_el$114, "href", _p$.e = _v$22);
671
- _v$23 !== _p$.t && setAttribute(_el$114, "aria-label", _p$.t = _v$23);
672
- _v$24 !== _p$.a && className(_el$114, _p$.a = _v$24);
796
+ _v$22 !== _p$.e && setAttribute(_el$128, "href", _p$.e = _v$22);
797
+ _v$23 !== _p$.t && setAttribute(_el$128, "aria-label", _p$.t = _v$23);
798
+ _v$24 !== _p$.a && className(_el$128, _p$.a = _v$24);
673
799
  return _p$;
674
800
  }, {
675
801
  e: void 0,
@@ -677,7 +803,7 @@ function LinkRenderer(props) {
677
803
  a: void 0
678
804
  });
679
805
  runHydrationEvents();
680
- return _el$114;
806
+ return _el$128;
681
807
  })();
682
808
  }
683
809
  function ComponentRenderer(props) {
@@ -691,12 +817,12 @@ function ComponentRenderer(props) {
691
817
  details: validation.errors
692
818
  });
693
819
  return (() => {
694
- var _el$121 = getNextElement(_tmpl$28), _el$122 = _el$121.firstChild, _el$123 = _el$122.nextSibling;
695
- insert(_el$123, () => {
820
+ var _el$135 = getNextElement(_tmpl$33), _el$136 = _el$135.firstChild, _el$137 = _el$136.nextSibling;
821
+ insert(_el$137, () => {
696
822
  var _a2, _b;
697
823
  return ((_b = (_a2 = validation.errors) == null ? void 0 : _a2[0]) == null ? void 0 : _b.message) || "Unknown validation error";
698
824
  });
699
- return _el$121;
825
+ return _el$135;
700
826
  })();
701
827
  }
702
828
  return createComponent(GenerativeUIErrorBoundary, {
@@ -942,27 +1068,27 @@ function ActionRenderer(props) {
942
1068
  const isDisabled = () => params.disabled || params.action === "tool-call" && isExecuting();
943
1069
  if (params.type === "link" || params.action === "link") {
944
1070
  return (() => {
945
- var _el$124 = getNextElement(_tmpl$30), _el$126 = _el$124.firstChild, [_el$127, _co$23] = getNextMarker(_el$126.nextSibling), _el$128 = _el$127.nextSibling, [_el$129, _co$24] = getNextMarker(_el$128.nextSibling);
946
- _el$124.$$click = handleClick;
947
- insert(_el$124, createComponent(Show, {
1071
+ var _el$138 = getNextElement(_tmpl$35), _el$140 = _el$138.firstChild, [_el$141, _co$27] = getNextMarker(_el$140.nextSibling), _el$142 = _el$141.nextSibling, [_el$143, _co$28] = getNextMarker(_el$142.nextSibling);
1072
+ _el$138.$$click = handleClick;
1073
+ insert(_el$138, createComponent(Show, {
948
1074
  get when() {
949
1075
  return params.icon;
950
1076
  },
951
1077
  get children() {
952
- var _el$125 = getNextElement(_tmpl$29);
953
- insert(_el$125, () => params.icon);
954
- return _el$125;
1078
+ var _el$139 = getNextElement(_tmpl$34);
1079
+ insert(_el$139, () => params.icon);
1080
+ return _el$139;
955
1081
  }
956
- }), _el$127, _co$23);
957
- insert(_el$124, () => params.label, _el$129, _co$24);
1082
+ }), _el$141, _co$27);
1083
+ insert(_el$138, () => params.label, _el$143, _co$28);
958
1084
  effect((_p$) => {
959
1085
  var _v$25 = params.url || "#", _v$26 = params.url ? "_blank" : void 0, _v$27 = params.ariaLabel || params.label, _v$28 = `inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500
960
1086
  ${params.variant === "primary" ? "bg-blue-600 text-white hover:bg-blue-700" : params.variant === "outline" ? "border border-gray-300 text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800" : "text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300"}
961
1087
  ${params.className || ""}`;
962
- _v$25 !== _p$.e && setAttribute(_el$124, "href", _p$.e = _v$25);
963
- _v$26 !== _p$.t && setAttribute(_el$124, "target", _p$.t = _v$26);
964
- _v$27 !== _p$.a && setAttribute(_el$124, "aria-label", _p$.a = _v$27);
965
- _v$28 !== _p$.o && className(_el$124, _p$.o = _v$28);
1088
+ _v$25 !== _p$.e && setAttribute(_el$138, "href", _p$.e = _v$25);
1089
+ _v$26 !== _p$.t && setAttribute(_el$138, "target", _p$.t = _v$26);
1090
+ _v$27 !== _p$.a && setAttribute(_el$138, "aria-label", _p$.a = _v$27);
1091
+ _v$28 !== _p$.o && className(_el$138, _p$.o = _v$28);
966
1092
  return _p$;
967
1093
  }, {
968
1094
  e: void 0,
@@ -971,42 +1097,42 @@ function ActionRenderer(props) {
971
1097
  o: void 0
972
1098
  });
973
1099
  runHydrationEvents();
974
- return _el$124;
1100
+ return _el$138;
975
1101
  })();
976
1102
  }
977
1103
  return (() => {
978
- var _el$130 = getNextElement(_tmpl$32), _el$133 = _el$130.firstChild, [_el$134, _co$25] = getNextMarker(_el$133.nextSibling), _el$135 = _el$134.nextSibling, [_el$136, _co$26] = getNextMarker(_el$135.nextSibling), _el$137 = _el$136.nextSibling, [_el$138, _co$27] = getNextMarker(_el$137.nextSibling);
979
- _el$130.$$click = handleClick;
980
- insert(_el$130, createComponent(Show, {
1104
+ var _el$144 = getNextElement(_tmpl$37), _el$147 = _el$144.firstChild, [_el$148, _co$29] = getNextMarker(_el$147.nextSibling), _el$149 = _el$148.nextSibling, [_el$150, _co$30] = getNextMarker(_el$149.nextSibling), _el$151 = _el$150.nextSibling, [_el$152, _co$31] = getNextMarker(_el$151.nextSibling);
1105
+ _el$144.$$click = handleClick;
1106
+ insert(_el$144, createComponent(Show, {
981
1107
  get when() {
982
1108
  return memo(() => !!isExecuting())() && params.action === "tool-call";
983
1109
  },
984
1110
  get children() {
985
- return getNextElement(_tmpl$31);
1111
+ return getNextElement(_tmpl$36);
986
1112
  }
987
- }), _el$134, _co$25);
988
- insert(_el$130, createComponent(Show, {
1113
+ }), _el$148, _co$29);
1114
+ insert(_el$144, createComponent(Show, {
989
1115
  get when() {
990
1116
  return memo(() => !!params.icon)() && !(isExecuting() && params.action === "tool-call");
991
1117
  },
992
1118
  get children() {
993
- var _el$132 = getNextElement(_tmpl$29);
994
- insert(_el$132, () => params.icon);
995
- return _el$132;
1119
+ var _el$146 = getNextElement(_tmpl$34);
1120
+ insert(_el$146, () => params.icon);
1121
+ return _el$146;
996
1122
  }
997
- }), _el$136, _co$26);
998
- insert(_el$130, () => params.label, _el$138, _co$27);
1123
+ }), _el$150, _co$30);
1124
+ insert(_el$144, () => params.label, _el$152, _co$31);
999
1125
  effect((_p$) => {
1000
1126
  var _v$29 = params.action === "submit" ? "submit" : "button", _v$30 = isDisabled(), _v$31 = isExecuting() && params.action === "tool-call", _v$32 = params.ariaLabel || params.label, _v$33 = `inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500
1001
1127
  ${params.variant === "primary" ? "bg-blue-600 text-white hover:bg-blue-700 shadow-sm" : params.variant === "secondary" ? "bg-gray-100 text-gray-900 hover:bg-gray-200 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600" : params.variant === "outline" ? "border border-gray-300 text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800" : params.variant === "danger" ? "bg-red-600 text-white hover:bg-red-700" : "bg-transparent text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800"}
1002
1128
  ${isDisabled() ? "opacity-50 cursor-not-allowed" : ""}
1003
1129
  ${params.size === "sm" ? "px-3 py-1.5 text-xs" : params.size === "lg" ? "px-6 py-3 text-base" : ""}
1004
1130
  ${params.className || ""}`;
1005
- _v$29 !== _p$.e && setAttribute(_el$130, "type", _p$.e = _v$29);
1006
- _v$30 !== _p$.t && setProperty(_el$130, "disabled", _p$.t = _v$30);
1007
- _v$31 !== _p$.a && setAttribute(_el$130, "aria-busy", _p$.a = _v$31);
1008
- _v$32 !== _p$.o && setAttribute(_el$130, "aria-label", _p$.o = _v$32);
1009
- _v$33 !== _p$.i && className(_el$130, _p$.i = _v$33);
1131
+ _v$29 !== _p$.e && setAttribute(_el$144, "type", _p$.e = _v$29);
1132
+ _v$30 !== _p$.t && setProperty(_el$144, "disabled", _p$.t = _v$30);
1133
+ _v$31 !== _p$.a && setAttribute(_el$144, "aria-busy", _p$.a = _v$31);
1134
+ _v$32 !== _p$.o && setAttribute(_el$144, "aria-label", _p$.o = _v$32);
1135
+ _v$33 !== _p$.i && className(_el$144, _p$.i = _v$33);
1010
1136
  return _p$;
1011
1137
  }, {
1012
1138
  e: void 0,
@@ -1016,7 +1142,7 @@ function ActionRenderer(props) {
1016
1142
  i: void 0
1017
1143
  });
1018
1144
  runHydrationEvents();
1019
- return _el$130;
1145
+ return _el$144;
1020
1146
  })();
1021
1147
  }
1022
1148
  function ErrorCardRenderer(props) {
@@ -1024,55 +1150,55 @@ function ErrorCardRenderer(props) {
1024
1150
  return `Error in ${props.error.tool || "unknown tool"}: ${props.error.message || "Unknown error"}`;
1025
1151
  };
1026
1152
  return (() => {
1027
- var _el$139 = getNextElement(_tmpl$36), _el$162 = _el$139.firstChild, [_el$163, _co$33] = getNextMarker(_el$162.nextSibling), _el$140 = _el$163.nextSibling, _el$141 = _el$140.firstChild, _el$142 = _el$141.nextSibling, _el$143 = _el$142.firstChild, _el$144 = _el$143.firstChild, _el$145 = _el$144.nextSibling, [_el$146, _co$28] = getNextMarker(_el$145.nextSibling), _el$147 = _el$143.nextSibling, _el$156 = _el$147.nextSibling, [_el$157, _co$30] = getNextMarker(_el$156.nextSibling), _el$158 = _el$157.nextSibling, [_el$159, _co$31] = getNextMarker(_el$158.nextSibling), _el$160 = _el$159.nextSibling, [_el$161, _co$32] = getNextMarker(_el$160.nextSibling);
1028
- insert(_el$139, createComponent(CopyButton, {
1153
+ var _el$153 = getNextElement(_tmpl$41), _el$176 = _el$153.firstChild, [_el$177, _co$37] = getNextMarker(_el$176.nextSibling), _el$154 = _el$177.nextSibling, _el$155 = _el$154.firstChild, _el$156 = _el$155.nextSibling, _el$157 = _el$156.firstChild, _el$158 = _el$157.firstChild, _el$159 = _el$158.nextSibling, [_el$160, _co$32] = getNextMarker(_el$159.nextSibling), _el$161 = _el$157.nextSibling, _el$170 = _el$161.nextSibling, [_el$171, _co$34] = getNextMarker(_el$170.nextSibling), _el$172 = _el$171.nextSibling, [_el$173, _co$35] = getNextMarker(_el$172.nextSibling), _el$174 = _el$173.nextSibling, [_el$175, _co$36] = getNextMarker(_el$174.nextSibling);
1154
+ insert(_el$153, createComponent(CopyButton, {
1029
1155
  getText: getErrorText,
1030
1156
  title: "Copy error details",
1031
1157
  position: "top-right"
1032
- }), _el$163, _co$33);
1033
- insert(_el$143, () => props.error.tool || "Unknown", _el$146, _co$28);
1034
- insert(_el$147, () => props.error.message || "An error occurred during tool execution");
1035
- insert(_el$142, createComponent(Show, {
1158
+ }), _el$177, _co$37);
1159
+ insert(_el$157, () => props.error.tool || "Unknown", _el$160, _co$32);
1160
+ insert(_el$161, () => props.error.message || "An error occurred during tool execution");
1161
+ insert(_el$156, createComponent(Show, {
1036
1162
  get when() {
1037
1163
  return props.error.type;
1038
1164
  },
1039
1165
  get children() {
1040
- var _el$148 = getNextElement(_tmpl$33), _el$149 = _el$148.firstChild, _el$150 = _el$149.nextSibling, [_el$151, _co$29] = getNextMarker(_el$150.nextSibling);
1041
- insert(_el$148, () => props.error.type, _el$151, _co$29);
1042
- return _el$148;
1166
+ var _el$162 = getNextElement(_tmpl$38), _el$163 = _el$162.firstChild, _el$164 = _el$163.nextSibling, [_el$165, _co$33] = getNextMarker(_el$164.nextSibling);
1167
+ insert(_el$162, () => props.error.type, _el$165, _co$33);
1168
+ return _el$162;
1043
1169
  }
1044
- }), _el$157, _co$30);
1045
- insert(_el$142, createComponent(Show, {
1170
+ }), _el$171, _co$34);
1171
+ insert(_el$156, createComponent(Show, {
1046
1172
  get when() {
1047
1173
  var _a;
1048
1174
  return (_a = props.error.suggestions) == null ? void 0 : _a.length;
1049
1175
  },
1050
1176
  get children() {
1051
- var _el$152 = getNextElement(_tmpl$34), _el$153 = _el$152.firstChild, _el$154 = _el$153.nextSibling;
1052
- insert(_el$154, createComponent(For, {
1177
+ var _el$166 = getNextElement(_tmpl$39), _el$167 = _el$166.firstChild, _el$168 = _el$167.nextSibling;
1178
+ insert(_el$168, createComponent(For, {
1053
1179
  get each() {
1054
1180
  return props.error.suggestions;
1055
1181
  },
1056
1182
  children: (suggestion) => (() => {
1057
- var _el$164 = getNextElement(_tmpl$37);
1058
- insert(_el$164, suggestion);
1059
- return _el$164;
1183
+ var _el$178 = getNextElement(_tmpl$42);
1184
+ insert(_el$178, suggestion);
1185
+ return _el$178;
1060
1186
  })()
1061
1187
  }));
1062
- return _el$152;
1188
+ return _el$166;
1063
1189
  }
1064
- }), _el$159, _co$31);
1065
- insert(_el$142, createComponent(Show, {
1190
+ }), _el$173, _co$35);
1191
+ insert(_el$156, createComponent(Show, {
1066
1192
  get when() {
1067
1193
  return props.error.timestamp;
1068
1194
  },
1069
1195
  get children() {
1070
- var _el$155 = getNextElement(_tmpl$35);
1071
- insert(_el$155, () => new Date(props.error.timestamp).toLocaleString());
1072
- return _el$155;
1196
+ var _el$169 = getNextElement(_tmpl$40);
1197
+ insert(_el$169, () => new Date(props.error.timestamp).toLocaleString());
1198
+ return _el$169;
1073
1199
  }
1074
- }), _el$161, _co$32);
1075
- return _el$139;
1200
+ }), _el$175, _co$36);
1201
+ return _el$153;
1076
1202
  })();
1077
1203
  }
1078
1204
  function isErrorResponse(content) {
@@ -1095,20 +1221,20 @@ function UIResourceHtmlRenderer(props) {
1095
1221
  return ((_a = props.resource.metadata) == null ? void 0 : _a.title) || ((_b = props.resource.uri) == null ? void 0 : _b.replace("ui://deposium/", "")) || "Resource";
1096
1222
  };
1097
1223
  return (() => {
1098
- var _el$165 = getNextElement(_tmpl$39), _el$169 = _el$165.firstChild, [_el$170, _co$34] = getNextMarker(_el$169.nextSibling), _el$168 = _el$170.nextSibling;
1099
- insert(_el$165, createComponent(Show, {
1224
+ var _el$179 = getNextElement(_tmpl$44), _el$183 = _el$179.firstChild, [_el$184, _co$38] = getNextMarker(_el$183.nextSibling), _el$182 = _el$184.nextSibling;
1225
+ insert(_el$179, createComponent(Show, {
1100
1226
  get when() {
1101
1227
  var _a;
1102
1228
  return ((_a = props.resource.metadata) == null ? void 0 : _a.title) || props.resource.uri;
1103
1229
  },
1104
1230
  get children() {
1105
- var _el$166 = getNextElement(_tmpl$38), _el$167 = _el$166.firstChild;
1106
- insert(_el$167, resourceTitle);
1107
- return _el$166;
1231
+ var _el$180 = getNextElement(_tmpl$43), _el$181 = _el$180.firstChild;
1232
+ insert(_el$181, resourceTitle);
1233
+ return _el$180;
1108
1234
  }
1109
- }), _el$170, _co$34);
1110
- effect(() => setProperty(_el$168, "innerHTML", htmlContent()));
1111
- return _el$165;
1235
+ }), _el$184, _co$38);
1236
+ effect(() => setProperty(_el$182, "innerHTML", htmlContent()));
1237
+ return _el$179;
1112
1238
  })();
1113
1239
  }
1114
1240
  const UIResourceRenderer = (props) => {
@@ -1188,24 +1314,24 @@ const UIResourceRenderer = (props) => {
1188
1314
  return createComponent(RenderProvider, {
1189
1315
  renderComponent,
1190
1316
  get children() {
1191
- var _el$171 = getNextElement(_tmpl$40), _el$172 = _el$171.firstChild, _el$173 = _el$172.nextSibling, [_el$174, _co$35] = getNextMarker(_el$173.nextSibling);
1192
- insert(_el$172, createComponent(For, {
1317
+ var _el$185 = getNextElement(_tmpl$45), _el$186 = _el$185.firstChild, _el$187 = _el$186.nextSibling, [_el$188, _co$39] = getNextMarker(_el$187.nextSibling);
1318
+ insert(_el$186, createComponent(For, {
1193
1319
  get each() {
1194
1320
  return layoutData.components;
1195
1321
  },
1196
1322
  children: (component) => (() => {
1197
- var _el$175 = getNextElement(_tmpl$41);
1198
- insert(_el$175, createComponent(ComponentRenderer, {
1323
+ var _el$189 = getNextElement(_tmpl$46);
1324
+ insert(_el$189, createComponent(ComponentRenderer, {
1199
1325
  component,
1200
1326
  get onError() {
1201
1327
  return props.onError;
1202
1328
  }
1203
1329
  }));
1204
- effect((_$p) => style(_el$175, getGridStyleString(component), _$p));
1205
- return _el$175;
1330
+ effect((_$p) => style(_el$189, getGridStyleString(component), _$p));
1331
+ return _el$189;
1206
1332
  })()
1207
1333
  }));
1208
- insert(_el$171, createComponent(Show, {
1334
+ insert(_el$185, createComponent(Show, {
1209
1335
  get when() {
1210
1336
  return shouldShowAutoFooter();
1211
1337
  },
@@ -1216,22 +1342,23 @@ const UIResourceRenderer = (props) => {
1216
1342
  }
1217
1343
  });
1218
1344
  }
1219
- }), _el$174, _co$35);
1345
+ }), _el$188, _co$39);
1220
1346
  effect((_p$) => {
1221
1347
  var _v$34 = `w-full ${props.class || ""}`, _v$35 = gridContainerStyle();
1222
- _v$34 !== _p$.e && className(_el$171, _p$.e = _v$34);
1223
- _p$.t = style(_el$172, _v$35, _p$.t);
1348
+ _v$34 !== _p$.e && className(_el$185, _p$.e = _v$34);
1349
+ _p$.t = style(_el$186, _v$35, _p$.t);
1224
1350
  return _p$;
1225
1351
  }, {
1226
1352
  e: void 0,
1227
1353
  t: void 0
1228
1354
  });
1229
- return _el$171;
1355
+ return _el$185;
1230
1356
  }
1231
1357
  });
1232
1358
  };
1233
1359
  delegateEvents(["click"]);
1234
1360
  export {
1235
- UIResourceRenderer
1361
+ UIResourceRenderer,
1362
+ renderCellValue
1236
1363
  };
1237
1364
  //# sourceMappingURL=UIResourceRenderer.js.map