@seed-ship/mcp-ui-solid 1.0.29 → 1.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -0
- package/dist/components/GenerativeUIErrorBoundary.js.map +1 -0
- package/dist/components/StreamingUIRenderer.cjs.map +1 -0
- package/dist/components/StreamingUIRenderer.js.map +1 -0
- package/dist/{mcp-ui-solid/src/components → components}/UIResourceRenderer.cjs +115 -104
- package/dist/components/UIResourceRenderer.cjs.map +1 -0
- package/dist/components/UIResourceRenderer.d.ts +0 -11
- package/dist/components/UIResourceRenderer.d.ts.map +1 -1
- package/dist/{mcp-ui-solid/src/components → components}/UIResourceRenderer.js +116 -105
- package/dist/components/UIResourceRenderer.js.map +1 -0
- package/dist/components.cjs +3 -3
- package/dist/components.d.ts +12 -0
- package/dist/components.js +3 -3
- package/dist/hooks/useStreamingUI.cjs.map +1 -0
- package/dist/hooks/useStreamingUI.js.map +1 -0
- package/dist/hooks.cjs +1 -1
- package/dist/hooks.d.ts +8 -0
- package/dist/hooks.js +1 -1
- package/dist/index.cjs +6 -6
- package/dist/index.js +6 -6
- package/dist/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.cjs +1006 -0
- package/dist/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.cjs.map +1 -0
- package/dist/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.js +1007 -0
- package/dist/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.js.map +1 -0
- package/dist/services/component-registry.cjs.map +1 -0
- package/dist/services/component-registry.js.map +1 -0
- package/dist/services/validation.cjs.map +1 -0
- package/dist/services/validation.js.map +1 -0
- package/dist/types.d.ts +265 -0
- package/dist/utils/logger.cjs.map +1 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/validation.cjs +1 -1
- package/dist/validation.js +1 -1
- package/package.json +20 -23
- package/src/components/ActionRenderer.tsx +33 -0
- package/src/components/ArtifactRenderer.tsx +54 -0
- package/src/components/CarouselRenderer.tsx +77 -0
- package/src/components/FooterRenderer.tsx +66 -0
- package/src/components/GenerativeUIErrorBoundary.tsx +259 -0
- package/src/components/StreamingUIRenderer.tsx +327 -0
- package/src/components/UIResourceRenderer.tsx +581 -0
- package/src/components/index.ts +14 -0
- package/src/hooks/index.ts +14 -0
- package/src/hooks/useStreamingUI.ts +447 -0
- package/src/index.test.ts +36 -0
- package/src/index.ts +70 -0
- package/src/services/component-registry.ts +378 -0
- package/src/services/index.ts +9 -0
- package/src/services/validation.ts +472 -0
- package/src/types/index.ts +320 -0
- package/src/types-export.ts +31 -0
- package/src/utils/logger.ts +74 -0
- package/src/validation.ts +38 -0
- package/src/vite-env.d.ts +11 -0
- package/tsconfig.json +20 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/vite.config.ts +52 -0
- package/vite.config.ts.timestamp-1763266929437-a71eed80b91318.mjs +45 -0
- package/vitest.config.ts +10 -0
- package/dist/mcp-ui-solid/src/components/GenerativeUIErrorBoundary.cjs.map +0 -1
- package/dist/mcp-ui-solid/src/components/GenerativeUIErrorBoundary.js.map +0 -1
- package/dist/mcp-ui-solid/src/components/StreamingUIRenderer.cjs.map +0 -1
- package/dist/mcp-ui-solid/src/components/StreamingUIRenderer.js.map +0 -1
- package/dist/mcp-ui-solid/src/components/UIResourceRenderer.cjs.map +0 -1
- package/dist/mcp-ui-solid/src/components/UIResourceRenderer.js.map +0 -1
- package/dist/mcp-ui-solid/src/hooks/useStreamingUI.cjs.map +0 -1
- package/dist/mcp-ui-solid/src/hooks/useStreamingUI.js.map +0 -1
- package/dist/mcp-ui-solid/src/services/component-registry.cjs.map +0 -1
- package/dist/mcp-ui-solid/src/services/component-registry.js.map +0 -1
- package/dist/mcp-ui-solid/src/services/validation.cjs.map +0 -1
- package/dist/mcp-ui-solid/src/services/validation.js.map +0 -1
- package/dist/mcp-ui-solid/src/utils/logger.cjs.map +0 -1
- package/dist/mcp-ui-solid/src/utils/logger.js.map +0 -1
- /package/dist/{mcp-ui-solid/src/components → components}/GenerativeUIErrorBoundary.cjs +0 -0
- /package/dist/{mcp-ui-solid/src/components → components}/GenerativeUIErrorBoundary.js +0 -0
- /package/dist/{mcp-ui-solid/src/components → components}/StreamingUIRenderer.cjs +0 -0
- /package/dist/{mcp-ui-solid/src/components → components}/StreamingUIRenderer.js +0 -0
- /package/dist/{mcp-ui-solid/src/hooks → hooks}/useStreamingUI.cjs +0 -0
- /package/dist/{mcp-ui-solid/src/hooks → hooks}/useStreamingUI.js +0 -0
- /package/dist/{mcp-ui-solid/src/services → services}/component-registry.cjs +0 -0
- /package/dist/{mcp-ui-solid/src/services → services}/component-registry.js +0 -0
- /package/dist/{mcp-ui-solid/src/services → services}/validation.cjs +0 -0
- /package/dist/{mcp-ui-solid/src/services → services}/validation.js +0 -0
- /package/dist/{mcp-ui-solid/src/utils → utils}/logger.cjs +0 -0
- /package/dist/{mcp-ui-solid/src/utils → utils}/logger.js +0 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const web = require("solid-js/web");
|
|
4
|
+
const purify_es = require("../node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.cjs");
|
|
4
5
|
const solidJs = require("solid-js");
|
|
5
6
|
const validation = require("../services/validation.cjs");
|
|
6
7
|
const GenerativeUIErrorBoundary = require("./GenerativeUIErrorBoundary.cjs");
|
|
7
|
-
const marked_esm = require("
|
|
8
|
-
var _tmpl$ = /* @__PURE__ */ web.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$2 = /* @__PURE__ */ web.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$3 = /* @__PURE__ */ web.template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$4 = /* @__PURE__ */ web.template(`<div class="w-full h-full p-4"><!$><!/><div class="w-full h-full"><img alt="Chart visualization"class="w-full h-auto max-h-[300px] object-contain">`), _tmpl$5 = /* @__PURE__ */ web.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$6 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>Showing <!$><!/> - <!$><!/> of <!$><!/>`), _tmpl$7 = /* @__PURE__ */ web.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"><div class=p-4><!$><!/><div class=overflow-x-auto><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"><tr></tr></thead><tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700"></tbody></table></div><!$><!/>`), _tmpl$8 = /* @__PURE__ */ web.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">`), _tmpl$9 = /* @__PURE__ */ web.template(`<tr>`), _tmpl$0 = /* @__PURE__ */ web.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">`), _tmpl$1 = /* @__PURE__ */ web.template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$10 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$11 = /* @__PURE__ */ web.template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$12 = /* @__PURE__ */ web.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 p-4"><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$13 = /* @__PURE__ */ web.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 p-4"><div>`), _tmpl$14 = /* @__PURE__ */ web.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$15 = /* @__PURE__ */ web.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$16 = /* @__PURE__ */ web.template(`<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">`), _tmpl$17 = /* @__PURE__ */ web.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-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity"loading=lazy></a></div><!$><!/>`, true, false, false), _tmpl$18 = /* @__PURE__ */ web.template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$19 = /* @__PURE__ */ web.template(`<a target=_blank rel="noopener noreferrer"class="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"><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"><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><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$20 = /* @__PURE__ */ web.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$21 = /* @__PURE__ */ web.template(`<span>`), _tmpl$22 = /* @__PURE__ */ web.template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$23 = /* @__PURE__ */ web.template(`<button><!$><!/><!$><!/>`), _tmpl$24 = /* @__PURE__ */ web.template(`<div><div class="grid gap-4">`), _tmpl$25 = /* @__PURE__ */ web.template(`<div>`);
|
|
8
|
+
const marked_esm = require("../node_modules/.pnpm/marked@16.4.2/node_modules/marked/lib/marked.esm.cjs");
|
|
9
|
+
var _tmpl$ = /* @__PURE__ */ web.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$2 = /* @__PURE__ */ web.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$3 = /* @__PURE__ */ web.template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$4 = /* @__PURE__ */ web.template(`<div class="w-full h-full p-4"><!$><!/><div class="w-full h-full"><img alt="Chart visualization"class="w-full h-auto max-h-[300px] object-contain">`), _tmpl$5 = /* @__PURE__ */ web.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$6 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>Showing <!$><!/> - <!$><!/> of <!$><!/>`), _tmpl$7 = /* @__PURE__ */ web.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"><div class=p-4><!$><!/><div class=overflow-x-auto><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"><tr></tr></thead><tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700"></tbody></table></div><!$><!/>`), _tmpl$8 = /* @__PURE__ */ web.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">`), _tmpl$9 = /* @__PURE__ */ web.template(`<tr>`), _tmpl$0 = /* @__PURE__ */ web.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$1 = /* @__PURE__ */ web.template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$10 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$11 = /* @__PURE__ */ web.template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$12 = /* @__PURE__ */ web.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 p-4"><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$13 = /* @__PURE__ */ web.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 p-4"><div>`), _tmpl$14 = /* @__PURE__ */ web.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$15 = /* @__PURE__ */ web.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$16 = /* @__PURE__ */ web.template(`<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">`), _tmpl$17 = /* @__PURE__ */ web.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-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity"loading=lazy></a></div><!$><!/>`, true, false, false), _tmpl$18 = /* @__PURE__ */ web.template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$19 = /* @__PURE__ */ web.template(`<a target=_blank rel="noopener noreferrer"class="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"><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"><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><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$20 = /* @__PURE__ */ web.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$21 = /* @__PURE__ */ web.template(`<span>`), _tmpl$22 = /* @__PURE__ */ web.template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$23 = /* @__PURE__ */ web.template(`<button><!$><!/><!$><!/>`), _tmpl$24 = /* @__PURE__ */ web.template(`<div><div class="grid gap-4">`), _tmpl$25 = /* @__PURE__ */ web.template(`<div>`);
|
|
9
10
|
function ChartRenderer(props) {
|
|
10
11
|
const [iframeUrl, setIframeUrl] = solidJs.createSignal();
|
|
11
12
|
const [isLoading, setIsLoading] = solidJs.createSignal(true);
|
|
@@ -116,8 +117,12 @@ function TableRenderer(props) {
|
|
|
116
117
|
return tableParams.columns;
|
|
117
118
|
},
|
|
118
119
|
children: (column) => (() => {
|
|
119
|
-
var _el$44 = web.getNextElement(_tmpl$0);
|
|
120
|
-
web.
|
|
120
|
+
var _el$44 = web.getNextElement(_tmpl$0), _el$45 = _el$44.firstChild;
|
|
121
|
+
web.effect(() => web.setProperty(_el$45, "innerHTML", typeof row[column.key] === "string" && (row[column.key].includes("[") || row[column.key].includes("**") || row[column.key].includes("`")) ? purify_es.sanitize(marked_esm.marked.parse(row[column.key], {
|
|
122
|
+
async: false
|
|
123
|
+
}), {
|
|
124
|
+
ADD_ATTR: ["target", "rel"]
|
|
125
|
+
}) : row[column.key] || "-"));
|
|
121
126
|
return _el$44;
|
|
122
127
|
})()
|
|
123
128
|
}));
|
|
@@ -143,46 +148,46 @@ function TableRenderer(props) {
|
|
|
143
148
|
function MetricRenderer(props) {
|
|
144
149
|
const metricParams = props.component.params;
|
|
145
150
|
return (() => {
|
|
146
|
-
var _el$
|
|
147
|
-
web.insert(_el$
|
|
148
|
-
web.insert(_el$
|
|
149
|
-
web.insert(_el$
|
|
151
|
+
var _el$46 = web.getNextElement(_tmpl$12), _el$47 = _el$46.firstChild, _el$48 = _el$47.firstChild, _el$49 = _el$48.firstChild, _el$50 = _el$49.nextSibling, _el$51 = _el$50.firstChild, _el$53 = _el$51.nextSibling, [_el$54, _co$0] = web.getNextMarker(_el$53.nextSibling), _el$64 = _el$48.nextSibling, [_el$65, _co$11] = web.getNextMarker(_el$64.nextSibling), _el$66 = _el$65.nextSibling, [_el$67, _co$12] = web.getNextMarker(_el$66.nextSibling);
|
|
152
|
+
web.insert(_el$49, () => metricParams.title);
|
|
153
|
+
web.insert(_el$51, () => metricParams.value);
|
|
154
|
+
web.insert(_el$50, web.createComponent(solidJs.Show, {
|
|
150
155
|
get when() {
|
|
151
156
|
return metricParams.unit;
|
|
152
157
|
},
|
|
153
158
|
get children() {
|
|
154
|
-
var _el$
|
|
155
|
-
web.insert(_el$
|
|
156
|
-
return _el$
|
|
159
|
+
var _el$52 = web.getNextElement(_tmpl$1);
|
|
160
|
+
web.insert(_el$52, () => metricParams.unit);
|
|
161
|
+
return _el$52;
|
|
157
162
|
}
|
|
158
|
-
}), _el$
|
|
159
|
-
web.insert(_el$
|
|
163
|
+
}), _el$54, _co$0);
|
|
164
|
+
web.insert(_el$47, web.createComponent(solidJs.Show, {
|
|
160
165
|
get when() {
|
|
161
166
|
return metricParams.trend;
|
|
162
167
|
},
|
|
163
168
|
get children() {
|
|
164
|
-
var _el$
|
|
165
|
-
_el$
|
|
166
|
-
web.insert(_el$
|
|
169
|
+
var _el$55 = web.getNextElement(_tmpl$10), _el$56 = _el$55.firstChild, _el$59 = _el$56.firstChild, [_el$60, _co$1] = web.getNextMarker(_el$59.nextSibling), _el$57 = _el$60.nextSibling, _el$61 = _el$57.nextSibling, [_el$62, _co$10] = web.getNextMarker(_el$61.nextSibling);
|
|
170
|
+
_el$62.nextSibling;
|
|
171
|
+
web.insert(_el$56, (() => {
|
|
167
172
|
var _c$ = web.memo(() => metricParams.trend.direction === "up");
|
|
168
173
|
return () => _c$() ? "�" : metricParams.trend.direction === "down" ? "�" : "�";
|
|
169
|
-
})(), _el$
|
|
170
|
-
web.insert(_el$
|
|
171
|
-
web.effect(() => web.className(_el$
|
|
172
|
-
return _el$
|
|
174
|
+
})(), _el$60, _co$1);
|
|
175
|
+
web.insert(_el$56, () => Math.abs(metricParams.trend.value), _el$62, _co$10);
|
|
176
|
+
web.effect(() => web.className(_el$56, `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"}`));
|
|
177
|
+
return _el$55;
|
|
173
178
|
}
|
|
174
|
-
}), _el$
|
|
175
|
-
web.insert(_el$
|
|
179
|
+
}), _el$65, _co$11);
|
|
180
|
+
web.insert(_el$47, web.createComponent(solidJs.Show, {
|
|
176
181
|
get when() {
|
|
177
182
|
return metricParams.subtitle;
|
|
178
183
|
},
|
|
179
184
|
get children() {
|
|
180
|
-
var _el$
|
|
181
|
-
web.insert(_el$
|
|
182
|
-
return _el$
|
|
185
|
+
var _el$63 = web.getNextElement(_tmpl$11);
|
|
186
|
+
web.insert(_el$63, () => metricParams.subtitle);
|
|
187
|
+
return _el$63;
|
|
183
188
|
}
|
|
184
|
-
}), _el$
|
|
185
|
-
return _el$
|
|
189
|
+
}), _el$67, _co$12);
|
|
190
|
+
return _el$46;
|
|
186
191
|
})();
|
|
187
192
|
}
|
|
188
193
|
function TextRenderer(props) {
|
|
@@ -196,94 +201,94 @@ function TextRenderer(props) {
|
|
|
196
201
|
return textParams.content;
|
|
197
202
|
});
|
|
198
203
|
return (() => {
|
|
199
|
-
var _el$
|
|
204
|
+
var _el$68 = web.getNextElement(_tmpl$13), _el$69 = _el$68.firstChild;
|
|
200
205
|
web.effect((_p$) => {
|
|
201
206
|
var _v$ = `prose prose-sm dark:prose-invert max-w-none ${textParams.className || ""}`, _v$2 = htmlContent();
|
|
202
|
-
_v$ !== _p$.e && web.className(_el$
|
|
203
|
-
_v$2 !== _p$.t && web.setProperty(_el$
|
|
207
|
+
_v$ !== _p$.e && web.className(_el$69, _p$.e = _v$);
|
|
208
|
+
_v$2 !== _p$.t && web.setProperty(_el$69, "innerHTML", _p$.t = _v$2);
|
|
204
209
|
return _p$;
|
|
205
210
|
}, {
|
|
206
211
|
e: void 0,
|
|
207
212
|
t: void 0
|
|
208
213
|
});
|
|
209
|
-
return _el$
|
|
214
|
+
return _el$68;
|
|
210
215
|
})();
|
|
211
216
|
}
|
|
212
217
|
function IframeRenderer(props) {
|
|
213
218
|
const params = props.component.params;
|
|
214
219
|
return (() => {
|
|
215
|
-
var _el$
|
|
216
|
-
web.insert(_el$
|
|
220
|
+
var _el$70 = web.getNextElement(_tmpl$15), _el$74 = _el$70.firstChild, [_el$75, _co$13] = web.getNextMarker(_el$74.nextSibling), _el$73 = _el$75.nextSibling;
|
|
221
|
+
web.insert(_el$70, web.createComponent(solidJs.Show, {
|
|
217
222
|
get when() {
|
|
218
223
|
return params.title;
|
|
219
224
|
},
|
|
220
225
|
get children() {
|
|
221
|
-
var _el$
|
|
222
|
-
web.insert(_el$
|
|
223
|
-
return _el$
|
|
226
|
+
var _el$71 = web.getNextElement(_tmpl$14), _el$72 = _el$71.firstChild;
|
|
227
|
+
web.insert(_el$72, () => params.title);
|
|
228
|
+
return _el$71;
|
|
224
229
|
}
|
|
225
|
-
}), _el$
|
|
230
|
+
}), _el$75, _co$13);
|
|
226
231
|
web.effect((_p$) => {
|
|
227
232
|
var _v$3 = params.url, _v$4 = params.title || "Embedded content", _v$5 = `height: ${params.height || "400px"}; min-height: 300px;`;
|
|
228
|
-
_v$3 !== _p$.e && web.setAttribute(_el$
|
|
229
|
-
_v$4 !== _p$.t && web.setAttribute(_el$
|
|
230
|
-
_p$.a = web.style(_el$
|
|
233
|
+
_v$3 !== _p$.e && web.setAttribute(_el$73, "src", _p$.e = _v$3);
|
|
234
|
+
_v$4 !== _p$.t && web.setAttribute(_el$73, "title", _p$.t = _v$4);
|
|
235
|
+
_p$.a = web.style(_el$73, _v$5, _p$.a);
|
|
231
236
|
return _p$;
|
|
232
237
|
}, {
|
|
233
238
|
e: void 0,
|
|
234
239
|
t: void 0,
|
|
235
240
|
a: void 0
|
|
236
241
|
});
|
|
237
|
-
return _el$
|
|
242
|
+
return _el$70;
|
|
238
243
|
})();
|
|
239
244
|
}
|
|
240
245
|
function ImageRenderer(props) {
|
|
241
246
|
const params = props.component.params;
|
|
242
247
|
return (() => {
|
|
243
|
-
var _el$
|
|
244
|
-
web.insert(_el$
|
|
248
|
+
var _el$76 = web.getNextElement(_tmpl$17), _el$77 = _el$76.firstChild, _el$78 = _el$77.firstChild, _el$79 = _el$78.firstChild, _el$82 = _el$77.nextSibling, [_el$83, _co$14] = web.getNextMarker(_el$82.nextSibling);
|
|
249
|
+
web.insert(_el$76, web.createComponent(solidJs.Show, {
|
|
245
250
|
get when() {
|
|
246
251
|
return params.caption;
|
|
247
252
|
},
|
|
248
253
|
get children() {
|
|
249
|
-
var _el$
|
|
250
|
-
web.insert(_el$
|
|
251
|
-
return _el$
|
|
254
|
+
var _el$80 = web.getNextElement(_tmpl$16), _el$81 = _el$80.firstChild;
|
|
255
|
+
web.insert(_el$81, () => params.caption);
|
|
256
|
+
return _el$80;
|
|
252
257
|
}
|
|
253
|
-
}), _el$
|
|
258
|
+
}), _el$83, _co$14);
|
|
254
259
|
web.effect((_p$) => {
|
|
255
260
|
var _v$6 = params.url, _v$7 = params.url, _v$8 = params.alt || "Image";
|
|
256
|
-
_v$6 !== _p$.e && web.setAttribute(_el$
|
|
257
|
-
_v$7 !== _p$.t && web.setAttribute(_el$
|
|
258
|
-
_v$8 !== _p$.a && web.setAttribute(_el$
|
|
261
|
+
_v$6 !== _p$.e && web.setAttribute(_el$78, "href", _p$.e = _v$6);
|
|
262
|
+
_v$7 !== _p$.t && web.setAttribute(_el$79, "src", _p$.t = _v$7);
|
|
263
|
+
_v$8 !== _p$.a && web.setAttribute(_el$79, "alt", _p$.a = _v$8);
|
|
259
264
|
return _p$;
|
|
260
265
|
}, {
|
|
261
266
|
e: void 0,
|
|
262
267
|
t: void 0,
|
|
263
268
|
a: void 0
|
|
264
269
|
});
|
|
265
|
-
return _el$
|
|
270
|
+
return _el$76;
|
|
266
271
|
})();
|
|
267
272
|
}
|
|
268
273
|
function LinkRenderer(props) {
|
|
269
274
|
const params = props.component.params;
|
|
270
275
|
return (() => {
|
|
271
|
-
var _el$
|
|
272
|
-
_el$
|
|
273
|
-
web.insert(_el$
|
|
274
|
-
web.insert(_el$
|
|
276
|
+
var _el$84 = web.getNextElement(_tmpl$19), _el$85 = _el$84.firstChild, _el$86 = _el$85.nextSibling, _el$87 = _el$86.firstChild, _el$89 = _el$87.nextSibling, [_el$90, _co$15] = web.getNextMarker(_el$89.nextSibling);
|
|
277
|
+
_el$84.$$click = (e) => e.stopPropagation();
|
|
278
|
+
web.insert(_el$87, () => params.label || params.url);
|
|
279
|
+
web.insert(_el$86, web.createComponent(solidJs.Show, {
|
|
275
280
|
get when() {
|
|
276
281
|
return params.description;
|
|
277
282
|
},
|
|
278
283
|
get children() {
|
|
279
|
-
var _el$
|
|
280
|
-
web.insert(_el$
|
|
281
|
-
return _el$
|
|
284
|
+
var _el$88 = web.getNextElement(_tmpl$18);
|
|
285
|
+
web.insert(_el$88, () => params.description);
|
|
286
|
+
return _el$88;
|
|
282
287
|
}
|
|
283
|
-
}), _el$
|
|
284
|
-
web.effect(() => web.setAttribute(_el$
|
|
288
|
+
}), _el$90, _co$15);
|
|
289
|
+
web.effect(() => web.setAttribute(_el$84, "href", params.url));
|
|
285
290
|
web.runHydrationEvents();
|
|
286
|
-
return _el$
|
|
291
|
+
return _el$84;
|
|
287
292
|
})();
|
|
288
293
|
}
|
|
289
294
|
function ComponentRenderer(props) {
|
|
@@ -297,12 +302,12 @@ function ComponentRenderer(props) {
|
|
|
297
302
|
details: validation$1.errors
|
|
298
303
|
});
|
|
299
304
|
return (() => {
|
|
300
|
-
var _el$
|
|
301
|
-
web.insert(_el$
|
|
305
|
+
var _el$91 = web.getNextElement(_tmpl$20), _el$92 = _el$91.firstChild, _el$93 = _el$92.nextSibling;
|
|
306
|
+
web.insert(_el$93, () => {
|
|
302
307
|
var _a2, _b;
|
|
303
308
|
return ((_b = (_a2 = validation$1.errors) == null ? void 0 : _a2[0]) == null ? void 0 : _b.message) || "Unknown validation error";
|
|
304
309
|
});
|
|
305
|
-
return _el$
|
|
310
|
+
return _el$91;
|
|
306
311
|
})();
|
|
307
312
|
}
|
|
308
313
|
return web.createComponent(GenerativeUIErrorBoundary.GenerativeUIErrorBoundary, {
|
|
@@ -417,42 +422,48 @@ function ComponentRenderer(props) {
|
|
|
417
422
|
}
|
|
418
423
|
function ActionRenderer(props) {
|
|
419
424
|
const params = props.component.params;
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
425
|
+
let dispatchAction = null;
|
|
426
|
+
solidJs.onMount(() => {
|
|
427
|
+
if (typeof window !== "undefined") {
|
|
428
|
+
dispatchAction = (toolName, toolParams) => {
|
|
424
429
|
const event = new CustomEvent("mcp-action", {
|
|
425
430
|
detail: {
|
|
426
|
-
toolName
|
|
427
|
-
params:
|
|
431
|
+
toolName,
|
|
432
|
+
params: toolParams
|
|
428
433
|
},
|
|
429
434
|
bubbles: true
|
|
430
435
|
});
|
|
431
436
|
window.dispatchEvent(event);
|
|
432
|
-
}
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
const handleClick = (e) => {
|
|
441
|
+
if (params.action === "tool-call" && params.toolName) {
|
|
442
|
+
e.preventDefault();
|
|
443
|
+
dispatchAction == null ? void 0 : dispatchAction(params.toolName, params.params || {});
|
|
433
444
|
}
|
|
434
445
|
};
|
|
435
446
|
if (params.type === "link" || params.action === "link") {
|
|
436
447
|
return (() => {
|
|
437
|
-
var _el$
|
|
438
|
-
_el$
|
|
439
|
-
web.insert(_el$
|
|
448
|
+
var _el$94 = web.getNextElement(_tmpl$22), _el$96 = _el$94.firstChild, [_el$97, _co$16] = web.getNextMarker(_el$96.nextSibling), _el$98 = _el$97.nextSibling, [_el$99, _co$17] = web.getNextMarker(_el$98.nextSibling);
|
|
449
|
+
_el$94.$$click = handleClick;
|
|
450
|
+
web.insert(_el$94, web.createComponent(solidJs.Show, {
|
|
440
451
|
get when() {
|
|
441
452
|
return params.icon;
|
|
442
453
|
},
|
|
443
454
|
get children() {
|
|
444
|
-
var _el$
|
|
445
|
-
web.insert(_el$
|
|
446
|
-
return _el$
|
|
455
|
+
var _el$95 = web.getNextElement(_tmpl$21);
|
|
456
|
+
web.insert(_el$95, () => params.icon);
|
|
457
|
+
return _el$95;
|
|
447
458
|
}
|
|
448
|
-
}), _el$
|
|
449
|
-
web.insert(_el$
|
|
459
|
+
}), _el$97, _co$16);
|
|
460
|
+
web.insert(_el$94, () => params.label, _el$99, _co$17);
|
|
450
461
|
web.effect((_p$) => {
|
|
451
462
|
var _v$9 = params.url || "#", _v$0 = params.url ? "_blank" : void 0, _v$1 = `inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors
|
|
452
463
|
${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"}`;
|
|
453
|
-
_v$9 !== _p$.e && web.setAttribute(_el$
|
|
454
|
-
_v$0 !== _p$.t && web.setAttribute(_el$
|
|
455
|
-
_v$1 !== _p$.a && web.className(_el$
|
|
464
|
+
_v$9 !== _p$.e && web.setAttribute(_el$94, "href", _p$.e = _v$9);
|
|
465
|
+
_v$0 !== _p$.t && web.setAttribute(_el$94, "target", _p$.t = _v$0);
|
|
466
|
+
_v$1 !== _p$.a && web.className(_el$94, _p$.a = _v$1);
|
|
456
467
|
return _p$;
|
|
457
468
|
}, {
|
|
458
469
|
e: void 0,
|
|
@@ -460,31 +471,31 @@ function ActionRenderer(props) {
|
|
|
460
471
|
a: void 0
|
|
461
472
|
});
|
|
462
473
|
web.runHydrationEvents();
|
|
463
|
-
return _el$
|
|
474
|
+
return _el$94;
|
|
464
475
|
})();
|
|
465
476
|
}
|
|
466
477
|
return (() => {
|
|
467
|
-
var _el$
|
|
468
|
-
_el$
|
|
469
|
-
web.insert(_el$
|
|
478
|
+
var _el$100 = web.getNextElement(_tmpl$23), _el$102 = _el$100.firstChild, [_el$103, _co$18] = web.getNextMarker(_el$102.nextSibling), _el$104 = _el$103.nextSibling, [_el$105, _co$19] = web.getNextMarker(_el$104.nextSibling);
|
|
479
|
+
_el$100.$$click = handleClick;
|
|
480
|
+
web.insert(_el$100, web.createComponent(solidJs.Show, {
|
|
470
481
|
get when() {
|
|
471
482
|
return params.icon;
|
|
472
483
|
},
|
|
473
484
|
get children() {
|
|
474
|
-
var _el$
|
|
475
|
-
web.insert(_el$
|
|
476
|
-
return _el$
|
|
485
|
+
var _el$101 = web.getNextElement(_tmpl$21);
|
|
486
|
+
web.insert(_el$101, () => params.icon);
|
|
487
|
+
return _el$101;
|
|
477
488
|
}
|
|
478
|
-
}), _el$
|
|
479
|
-
web.insert(_el$
|
|
489
|
+
}), _el$103, _co$18);
|
|
490
|
+
web.insert(_el$100, () => params.label, _el$105, _co$19);
|
|
480
491
|
web.effect((_p$) => {
|
|
481
492
|
var _v$10 = params.action === "submit" ? "submit" : "button", _v$11 = params.disabled, _v$12 = `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
|
|
482
493
|
${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"}
|
|
483
494
|
${params.disabled ? "opacity-50 cursor-not-allowed" : ""}
|
|
484
495
|
${params.size === "sm" ? "px-3 py-1.5 text-xs" : params.size === "lg" ? "px-6 py-3 text-base" : ""}`;
|
|
485
|
-
_v$10 !== _p$.e && web.setAttribute(_el$
|
|
486
|
-
_v$11 !== _p$.t && web.setProperty(_el$
|
|
487
|
-
_v$12 !== _p$.a && web.className(_el$
|
|
496
|
+
_v$10 !== _p$.e && web.setAttribute(_el$100, "type", _p$.e = _v$10);
|
|
497
|
+
_v$11 !== _p$.t && web.setProperty(_el$100, "disabled", _p$.t = _v$11);
|
|
498
|
+
_v$12 !== _p$.a && web.className(_el$100, _p$.a = _v$12);
|
|
488
499
|
return _p$;
|
|
489
500
|
}, {
|
|
490
501
|
e: void 0,
|
|
@@ -492,7 +503,7 @@ function ActionRenderer(props) {
|
|
|
492
503
|
a: void 0
|
|
493
504
|
});
|
|
494
505
|
web.runHydrationEvents();
|
|
495
|
-
return _el$
|
|
506
|
+
return _el$100;
|
|
496
507
|
})();
|
|
497
508
|
}
|
|
498
509
|
const UIResourceRenderer = (props) => {
|
|
@@ -524,33 +535,33 @@ const UIResourceRenderer = (props) => {
|
|
|
524
535
|
return `grid-column: ${colStart} / span ${colSpan}; grid-row: ${rowStart ? `${rowStart} / span ${rowSpan}` : "auto"}`;
|
|
525
536
|
};
|
|
526
537
|
return (() => {
|
|
527
|
-
var _el$
|
|
528
|
-
web.insert(_el$
|
|
538
|
+
var _el$106 = web.getNextElement(_tmpl$24), _el$107 = _el$106.firstChild;
|
|
539
|
+
web.insert(_el$107, web.createComponent(solidJs.For, {
|
|
529
540
|
get each() {
|
|
530
541
|
return layout().components;
|
|
531
542
|
},
|
|
532
543
|
children: (component) => (() => {
|
|
533
|
-
var _el$
|
|
534
|
-
web.insert(_el$
|
|
544
|
+
var _el$108 = web.getNextElement(_tmpl$25);
|
|
545
|
+
web.insert(_el$108, web.createComponent(ComponentRenderer, {
|
|
535
546
|
component,
|
|
536
547
|
get onError() {
|
|
537
548
|
return props.onError;
|
|
538
549
|
}
|
|
539
550
|
}));
|
|
540
|
-
web.effect((_$p) => web.style(_el$
|
|
541
|
-
return _el$
|
|
551
|
+
web.effect((_$p) => web.style(_el$108, getGridStyleString(component), _$p));
|
|
552
|
+
return _el$108;
|
|
542
553
|
})()
|
|
543
554
|
}));
|
|
544
555
|
web.effect((_p$) => {
|
|
545
556
|
var _v$13 = `w-full ${props.class || ""}`, _v$14 = gridContainerStyle();
|
|
546
|
-
_v$13 !== _p$.e && web.className(_el$
|
|
547
|
-
_p$.t = web.style(_el$
|
|
557
|
+
_v$13 !== _p$.e && web.className(_el$106, _p$.e = _v$13);
|
|
558
|
+
_p$.t = web.style(_el$107, _v$14, _p$.t);
|
|
548
559
|
return _p$;
|
|
549
560
|
}, {
|
|
550
561
|
e: void 0,
|
|
551
562
|
t: void 0
|
|
552
563
|
});
|
|
553
|
-
return _el$
|
|
564
|
+
return _el$106;
|
|
554
565
|
})();
|
|
555
566
|
};
|
|
556
567
|
web.delegateEvents(["click"]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UIResourceRenderer.cjs","sources":["../../src/components/UIResourceRenderer.tsx"],"sourcesContent":["/**\n * UI Resource Renderer Component\n * Phase 0: Foundation with iframe sandbox and composite grid support\n */\n\nimport DOMPurify from 'dompurify'\nimport { Component, createSignal, onMount, Show, For, createMemo } from 'solid-js'\nimport { isServer } from 'solid-js/web'\nimport type { UIComponent, UILayout, RendererError, ComponentType } from '../types'\nimport { validateComponent, DEFAULT_RESOURCE_LIMITS } from '../services/validation'\nimport { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary'\nimport { marked } from 'marked'\n\n/**\n * Props for UIResourceRenderer\n */\nexport interface UIResourceRendererProps {\n /**\n * Single component or full layout to render\n */\n content: UIComponent | UILayout\n\n /**\n * Lazy loading (default: true)\n */\n lazyLoad?: boolean\n\n /**\n * Error callback\n */\n onError?: (error: RendererError) => void\n\n /**\n * Custom CSS class\n */\n class?: string\n}\n\n/**\n * Render a single chart component in a sandboxed iframe\n */\nfunction ChartRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n}) {\n const [iframeUrl, setIframeUrl] = createSignal<string>()\n const [isLoading, setIsLoading] = createSignal(true)\n const [error, setError] = createSignal<string>()\n\n onMount(() => {\n const chartParams = props.component.params as any\n\n // Build Quickchart URL\n const chartConfig = {\n type: chartParams.type,\n data: chartParams.data,\n options: {\n ...chartParams.options,\n responsive: true,\n maintainAspectRatio: false,\n },\n }\n\n // Encode chart configuration for Quickchart API\n const configStr = encodeURIComponent(JSON.stringify(chartConfig))\n const url = `https://quickchart.io/chart?c=${configStr}&width=500&height=300&devicePixelRatio=2`\n\n // Validate domain (should always pass for quickchart.io)\n setIframeUrl(url)\n setIsLoading(false)\n })\n\n return (\n <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\">\n <Show when={isLoading()}>\n <div class=\"absolute inset-0 flex items-center justify-center\">\n <div class=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\" />\n </div>\n </Show>\n\n <Show when={error()}>\n <div class=\"absolute inset-0 flex items-center justify-center p-4\">\n <div class=\"text-center\">\n <p class=\"text-red-600 dark:text-red-400 text-sm font-medium\">Chart Error</p>\n <p class=\"text-gray-600 dark:text-gray-400 text-xs mt-1\">{error()}</p>\n </div>\n </div>\n </Show>\n\n <Show when={iframeUrl() && !error()}>\n <div class=\"w-full h-full p-4\">\n <Show when={(props.component.params as any).title}>\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white mb-3\">\n {(props.component.params as any).title}\n </h3>\n </Show>\n <div class=\"w-full h-full\">\n <img\n src={iframeUrl()}\n alt=\"Chart visualization\"\n class=\"w-full h-auto max-h-[300px] object-contain\"\n onError={() => {\n setError('Failed to load chart')\n props.onError?.({\n type: 'render',\n message: 'Chart rendering failed',\n componentId: props.component.id,\n })\n }}\n />\n </div>\n </div>\n </Show>\n </div>\n )\n}\n\n/**\n * Render a table component\n */\nfunction TableRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n}) {\n const tableParams = props.component.params as any\n\n return (\n <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\">\n <div class=\"p-4\">\n <Show when={tableParams.title}>\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white mb-3\">\n {tableParams.title}\n </h3>\n </Show>\n\n <div class=\"overflow-x-auto\">\n <table class=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0\">\n <thead class=\"bg-gray-50 dark:bg-gray-900/50\">\n <tr>\n <For each={tableParams.columns}>\n {(column: any) => (\n <th\n scope=\"col\"\n 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\"\n style={column.width ? { width: column.width } : {}}\n >\n {column.label}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody class=\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\">\n <For each={tableParams.rows.slice(0, DEFAULT_RESOURCE_LIMITS.maxTableRows)}>\n {(row: any, i) => (\n <tr class={`hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors ${i() % 2 === 0 ? 'bg-white dark:bg-gray-800' : 'bg-gray-50/30 dark:bg-gray-800/50'}`}>\n <For each={tableParams.columns}>\n {(column: any) => (\n <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\">\n <div\n innerHTML={\n typeof row[column.key] === 'string' && (row[column.key].includes('[') || row[column.key].includes('**') || row[column.key].includes('`'))\n ? DOMPurify.sanitize(marked.parse(row[column.key], { async: false }) as string, { ADD_ATTR: ['target', 'rel'] })\n : (row[column.key] || '-')\n }\n />\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n </div>\n\n <Show when={tableParams.pagination}>\n <div class=\"mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400\">\n <span>\n Showing {tableParams.pagination.currentPage * tableParams.pagination.pageSize + 1} -{' '}\n {Math.min(\n (tableParams.pagination.currentPage + 1) * tableParams.pagination.pageSize,\n tableParams.pagination.totalRows\n )}{' '}\n of {tableParams.pagination.totalRows}\n </span>\n </div>\n </Show>\n </div>\n </div>\n )\n}\n\n/**\n * Render a metric card component\n */\nfunction MetricRenderer(props: { component: UIComponent }) {\n const metricParams = props.component.params as any\n\n return (\n <div class=\"w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4\">\n <div class=\"flex flex-col h-full justify-between\">\n <div>\n <p class=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide\">\n {metricParams.title}\n </p>\n <div class=\"mt-2 flex items-baseline\">\n <p class=\"text-2xl font-semibold text-gray-900 dark:text-white\">{metricParams.value}</p>\n <Show when={metricParams.unit}>\n <span class=\"ml-2 text-sm font-medium text-gray-500 dark:text-gray-400\">\n {metricParams.unit}\n </span>\n </Show>\n </div>\n </div>\n\n <Show when={metricParams.trend}>\n <div class=\"mt-3 flex items-center\">\n <span\n class={`text-sm font-medium ${metricParams.trend.direction === 'up'\n ? 'text-green-600 dark:text-green-400'\n : metricParams.trend.direction === 'down'\n ? 'text-red-600 dark:text-red-400'\n : 'text-gray-600 dark:text-gray-400'\n }`}\n >\n {metricParams.trend.direction === 'up'\n ? '�'\n : metricParams.trend.direction === 'down'\n ? '�'\n : '�'}{' '}\n {Math.abs(metricParams.trend.value)}%\n </span>\n </div>\n </Show>\n\n <Show when={metricParams.subtitle}>\n <p class=\"mt-2 text-xs text-gray-500 dark:text-gray-400\">{metricParams.subtitle}</p>\n </Show>\n </div>\n </div>\n )\n}\n\n/**\n * Render a text component (with optional markdown)\n */\nfunction TextRenderer(props: { component: UIComponent }) {\n const textParams = props.component.params as any\n\n // Convert markdown to HTML if markdown flag is true\n const htmlContent = createMemo(() => {\n if (textParams.markdown) {\n return marked.parse(textParams.content, { async: false }) as string\n }\n return textParams.content\n })\n\n return (\n <div class=\"w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4\">\n <div\n class={`prose prose-sm dark:prose-invert max-w-none ${textParams.className || ''}`}\n innerHTML={htmlContent()}\n />\n </div>\n )\n}\n\n/**\n * Render an iframe component\n */\nfunction IframeRenderer(props: { component: UIComponent }) {\n const params = props.component.params as any\n return (\n <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\">\n <Show when={params.title}>\n <div class=\"px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900\">\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white\">{params.title}</h3>\n </div>\n </Show>\n <iframe\n src={params.url}\n title={params.title || 'Embedded content'}\n class=\"w-full border-0 flex-1\"\n style={`height: ${params.height || '400px'}; min-height: 300px;`}\n sandbox=\"allow-scripts allow-same-origin allow-popups allow-forms\"\n loading=\"lazy\"\n />\n </div>\n )\n}\n\n/**\n * Render an image component\n */\nfunction ImageRenderer(props: { component: UIComponent }) {\n const params = props.component.params as any\n return (\n <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\">\n <div class=\"flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]\">\n <a href={params.url} target=\"_blank\" rel=\"noopener noreferrer\" class=\"cursor-zoom-in\">\n <img\n src={params.url}\n alt={params.alt || 'Image'}\n class=\"max-w-full max-h-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity\"\n loading=\"lazy\"\n />\n </a>\n </div>\n <Show when={params.caption}>\n <div class=\"p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\">\n <p class=\"text-sm text-gray-600 dark:text-gray-400 text-center\">{params.caption}</p>\n </div>\n </Show>\n </div>\n )\n}\n\n/**\n * Render a link component\n */\n/**\n * Render a link component\n */\nfunction LinkRenderer(props: { component: UIComponent }) {\n const params = props.component.params as any\n return (\n <a\n href={params.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"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\"\n onClick={(e) => e.stopPropagation()}\n >\n <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\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-5 h-5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n </div>\n <div class=\"flex-1 min-w-0\">\n <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\">\n {params.label || params.url}\n </h4>\n <Show when={params.description}>\n <p class=\"text-xs text-gray-500 dark:text-gray-400 truncate\">{params.description}</p>\n </Show>\n </div>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-4 h-4 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-gray-300 shrink-0 transition-colors\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n </a>\n )\n}\n\n/**\n * Render a single component with error boundary\n */\nfunction ComponentRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n}) {\n // Validate component before rendering\n const validation = validateComponent(props.component)\n if (!validation.valid) {\n props.onError?.({\n type: 'validation',\n message: 'Component validation failed',\n componentId: props.component.id,\n details: validation.errors,\n })\n\n return (\n <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\">\n <p class=\"text-sm font-medium text-red-900 dark:text-red-100\">Validation Error</p>\n <p class=\"text-xs text-red-700 dark:text-red-300 mt-1\">\n {validation.errors?.[0]?.message || 'Unknown validation error'}\n </p>\n </div>\n )\n }\n\n // Render based on component type with enhanced error boundary\n return (\n <GenerativeUIErrorBoundary\n componentId={props.component.id}\n componentType={props.component.type}\n onError={props.onError}\n allowRetry={true}\n >\n <Show when={props.component.type === 'chart'}>\n <ChartRenderer component={props.component} onError={props.onError} />\n </Show>\n <Show when={props.component.type === 'table'}>\n <TableRenderer component={props.component} onError={props.onError} />\n </Show>\n <Show when={props.component.type === 'metric'}>\n <MetricRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'text'}>\n <TextRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'iframe'}>\n <IframeRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'image'}>\n <ImageRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'link'}>\n <LinkRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'action'}>\n <ActionRenderer component={props.component} />\n </Show>\n </GenerativeUIErrorBoundary>\n )\n}\n\n/**\n * Render an action component (button or link)\n */\nfunction ActionRenderer(props: { component: UIComponent }) {\n const params = props.component.params as any\n let dispatchAction: ((toolName: string, toolParams: any) => void) | null = null\n\n // Initialize CustomEvent dispatcher only on client-side\n onMount(() => {\n if (typeof window !== 'undefined') {\n dispatchAction = (toolName: string, toolParams: any) => {\n const event = new CustomEvent('mcp-action', {\n detail: {\n toolName,\n params: toolParams,\n },\n bubbles: true,\n })\n window.dispatchEvent(event)\n }\n }\n })\n\n // Handle click to execute tool via window event\n const handleClick = (e: MouseEvent) => {\n if (params.action === 'tool-call' && params.toolName) {\n e.preventDefault()\n // SSR-safe: Only call if dispatcher was initialized client-side\n dispatchAction?.(params.toolName, params.params || {})\n }\n }\n\n if (params.type === 'link' || params.action === 'link') {\n return (\n <a\n href={params.url || '#'}\n target={params.url ? '_blank' : undefined}\n rel=\"noopener noreferrer\"\n class={`inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors\n ${params.variant === 'primary' ? 'bg-blue-600 text-white hover:bg-blue-700' :\n 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' :\n 'text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300'}`}\n onClick={handleClick}\n >\n <Show when={params.icon}>\n <span>{params.icon}</span>\n </Show>\n {params.label}\n </a>\n )\n }\n\n return (\n <button\n type={params.action === 'submit' ? 'submit' : 'button'}\n disabled={params.disabled}\n class={`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\n ${params.variant === 'primary' ? 'bg-blue-600 text-white hover:bg-blue-700 shadow-sm' :\n 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' :\n 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' :\n params.variant === 'danger' ? 'bg-red-600 text-white hover:bg-red-700' :\n 'bg-transparent text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800'}\n ${params.disabled ? 'opacity-50 cursor-not-allowed' : ''}\n ${params.size === 'sm' ? 'px-3 py-1.5 text-xs' : params.size === 'lg' ? 'px-6 py-3 text-base' : ''}`}\n onClick={handleClick}\n >\n <Show when={params.icon}>\n <span>{params.icon}</span>\n </Show>\n {params.label}\n </button>\n )\n}\n\n/**\n * Main UIResourceRenderer component\n */\nexport const UIResourceRenderer: Component<UIResourceRendererProps> = (props) => {\n const layout = () => {\n // ✅ PHASE 3.3 FIX: Check if content is a UIComponent (non-composite) vs UILayout (composite)\n // UILayout has type='composite', UIComponent has type='chart'|'table'|'metric'|'text'\n if ('type' in props.content && (props.content as any).type !== 'composite') {\n return {\n id: 'single-component',\n components: [props.content as UIComponent],\n grid: {\n columns: 12,\n gap: '1rem',\n },\n } as UILayout\n }\n return props.content as UILayout\n }\n\n // Grid position to CSS Grid styles\n const getGridStyles = (component: UIComponent) => {\n // ✅ PHASE 3 FIX: Defensive check for position field\n if (!component.position) {\n console.error('[UIResourceRenderer] Component missing position field:', component)\n return {\n 'grid-column': '1 / span 12',\n 'grid-row': 'auto',\n }\n }\n\n const { colStart, colSpan, rowStart, rowSpan = 1 } = component.position\n\n return {\n 'grid-column': `${colStart} / span ${colSpan}`,\n 'grid-row': rowStart ? `${rowStart} / span ${rowSpan}` : 'auto',\n }\n }\n\n // Convert grid styles to CSS string to avoid setStyleProperty\n const gridContainerStyle = () =>\n `grid-template-columns: repeat(${layout().grid.columns}, 1fr); gap: ${layout().grid.gap}`\n\n // Convert component grid styles to CSS string\n const getGridStyleString = (component: UIComponent) => {\n // ✅ PHASE 3 FIX: Defensive check for position field\n if (!component.position) {\n console.error('[UIResourceRenderer] Component missing position field:', component)\n return 'grid-column: 1 / span 12; grid-row: auto' // Default to full width\n }\n\n const { colStart, colSpan, rowStart, rowSpan = 1 } = component.position\n return `grid-column: ${colStart} / span ${colSpan}; grid-row: ${rowStart ? `${rowStart} / span ${rowSpan}` : 'auto'}`\n }\n\n return (\n <div class={`w-full ${props.class || ''}`}>\n <div class=\"grid gap-4\" style={gridContainerStyle()}>\n <For each={layout().components}>\n {(component) => (\n <div style={getGridStyleString(component)}>\n <ComponentRenderer component={component} onError={props.onError} />\n </div>\n )}\n </For>\n </div>\n </div>\n )\n}\n"],"names":["ChartRenderer","props","iframeUrl","setIframeUrl","createSignal","isLoading","setIsLoading","error","setError","onMount","chartParams","component","params","chartConfig","type","data","options","responsive","maintainAspectRatio","configStr","encodeURIComponent","JSON","stringify","url","_el$","_$getNextElement","_tmpl$5","_el$11","firstChild","_el$12","_co$2","_$getNextMarker","nextSibling","_el$13","_el$14","_co$3","_el$15","_el$16","_co$4","_$insert","_$createComponent","Show","when","children","_tmpl$","_el$3","_tmpl$2","_el$4","_el$5","_el$6","_$memo","_el$7","_tmpl$4","_el$1","_el$10","_co$","_el$9","_el$0","title","_el$8","_tmpl$3","addEventListener","onError","message","componentId","id","_$effect","_$setAttribute","TableRenderer","tableParams","_el$17","_tmpl$7","_el$18","_el$38","_el$39","_co$8","_el$20","_el$21","_el$22","_el$23","_el$24","_el$40","_el$41","_co$9","_el$19","For","each","columns","column","_el$42","_tmpl$8","label","_$p","_$style","width","rows","slice","DEFAULT_RESOURCE_LIMITS","maxTableRows","row","i","_el$43","_tmpl$9","_el$44","_tmpl$0","_el$45","_$setProperty","key","includes","DOMPurify","sanitize","marked","parse","async","ADD_ATTR","_$className","pagination","_el$25","_tmpl$6","_el$26","_el$27","_el$32","_el$33","_co$5","_el$28","_el$34","_el$35","_co$6","_el$30","_el$36","_el$37","_co$7","currentPage","pageSize","Math","min","totalRows","MetricRenderer","metricParams","_el$46","_tmpl$12","_el$47","_el$48","_el$49","_el$50","_el$51","_el$53","_el$54","_co$0","_el$64","_el$65","_co$11","_el$66","_el$67","_co$12","value","unit","_el$52","_tmpl$1","trend","_el$55","_tmpl$10","_el$56","_el$59","_el$60","_co$1","_el$57","_el$61","_el$62","_co$10","_c$","direction","abs","subtitle","_el$63","_tmpl$11","TextRenderer","textParams","htmlContent","createMemo","markdown","content","_el$68","_tmpl$13","_el$69","_p$","_v$","className","_v$2","e","t","undefined","IframeRenderer","_el$70","_tmpl$15","_el$74","_el$75","_co$13","_el$73","_el$71","_tmpl$14","_el$72","_v$3","_v$4","_v$5","height","a","ImageRenderer","_el$76","_tmpl$17","_el$77","_el$78","_el$79","_el$82","_el$83","_co$14","caption","_el$80","_tmpl$16","_el$81","_v$6","_v$7","_v$8","alt","LinkRenderer","_el$84","_tmpl$19","_el$85","_el$86","_el$87","_el$89","_el$90","_co$15","$$click","stopPropagation","description","_el$88","_tmpl$18","_$runHydrationEvents","ComponentRenderer","validation","validateComponent","valid","details","errors","_el$91","_tmpl$20","_el$92","_el$93","GenerativeUIErrorBoundary","componentType","allowRetry","ActionRenderer","dispatchAction","window","toolName","toolParams","event","CustomEvent","detail","bubbles","dispatchEvent","handleClick","action","preventDefault","_el$94","_tmpl$22","_el$96","_el$97","_co$16","_el$98","_el$99","_co$17","icon","_el$95","_tmpl$21","_v$9","_v$0","_v$1","variant","_el$100","_tmpl$23","_el$102","_el$103","_co$18","_el$104","_el$105","_co$19","_el$101","_v$10","_v$11","disabled","_v$12","size","UIResourceRenderer","layout","components","grid","gap","gridContainerStyle","getGridStyleString","position","console","colStart","colSpan","rowStart","rowSpan","_el$106","_tmpl$24","_el$107","_el$108","_tmpl$25","_v$13","class","_v$14","_$delegateEvents"],"mappings":"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"}
|
|
@@ -1,17 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* UI Resource Renderer Component
|
|
3
3
|
* Phase 0: Foundation with iframe sandbox and composite grid support
|
|
4
|
-
*
|
|
5
|
-
* Security features:
|
|
6
|
-
* - Sandboxed iframes for untrusted content
|
|
7
|
-
* - CSP enforcement via middleware
|
|
8
|
-
* - XSS prevention with DOMPurify
|
|
9
|
-
* - Domain whitelist validation
|
|
10
|
-
*
|
|
11
|
-
* Performance:
|
|
12
|
-
* - Lazy loading with Intersection Observer
|
|
13
|
-
* - Render timeout enforcement
|
|
14
|
-
* - Error boundaries for isolation
|
|
15
4
|
*/
|
|
16
5
|
import { Component } from 'solid-js';
|
|
17
6
|
import type { UIComponent, UILayout, RendererError } from '../types';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UIResourceRenderer.d.ts","sourceRoot":"","sources":["../../src/components/UIResourceRenderer.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"UIResourceRenderer.d.ts","sourceRoot":"","sources":["../../src/components/UIResourceRenderer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAgD,MAAM,UAAU,CAAA;AAElF,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAA;AAKnF;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,OAAO,EAAE,WAAW,GAAG,QAAQ,CAAA;IAE/B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IAExC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AA4dD;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,uBAAuB,CAiEjE,CAAA"}
|