@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,9 +1,10 @@
|
|
|
1
|
-
import { delegateEvents, getNextElement, template, insert, createComponent, effect, style, className, getNextMarker, setAttribute, memo, setProperty, runHydrationEvents
|
|
1
|
+
import { delegateEvents, getNextElement, template, insert, createComponent, effect, style, className, getNextMarker, setAttribute, memo, setProperty, runHydrationEvents } from "solid-js/web";
|
|
2
|
+
import purify from "../node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.js";
|
|
2
3
|
import { For, Show, createSignal, onMount, createMemo } from "solid-js";
|
|
3
4
|
import { validateComponent, DEFAULT_RESOURCE_LIMITS } from "../services/validation.js";
|
|
4
5
|
import { GenerativeUIErrorBoundary } from "./GenerativeUIErrorBoundary.js";
|
|
5
|
-
import { marked as k } from "
|
|
6
|
-
var _tmpl$ = /* @__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$2 = /* @__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$3 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$4 = /* @__PURE__ */ 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__ */ 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__ */ 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__ */ 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__ */ 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__ */ template(`<tr>`), _tmpl$0 = /* @__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">`), _tmpl$1 = /* @__PURE__ */ template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$10 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$11 = /* @__PURE__ */ template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$12 = /* @__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 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__ */ 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__ */ 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__ */ 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__ */ 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__ */ 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__ */ template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$19 = /* @__PURE__ */ 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__ */ 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__ */ template(`<span>`), _tmpl$22 = /* @__PURE__ */ template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$23 = /* @__PURE__ */ template(`<button><!$><!/><!$><!/>`), _tmpl$24 = /* @__PURE__ */ template(`<div><div class="grid gap-4">`), _tmpl$25 = /* @__PURE__ */ template(`<div>`);
|
|
6
|
+
import { marked as k } from "../node_modules/.pnpm/marked@16.4.2/node_modules/marked/lib/marked.esm.js";
|
|
7
|
+
var _tmpl$ = /* @__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$2 = /* @__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$3 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$4 = /* @__PURE__ */ 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__ */ 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__ */ 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__ */ 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__ */ 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__ */ template(`<tr>`), _tmpl$0 = /* @__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$1 = /* @__PURE__ */ template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$10 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$11 = /* @__PURE__ */ template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$12 = /* @__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 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__ */ 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__ */ 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__ */ 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__ */ 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__ */ 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__ */ template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$19 = /* @__PURE__ */ 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__ */ 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__ */ template(`<span>`), _tmpl$22 = /* @__PURE__ */ template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$23 = /* @__PURE__ */ template(`<button><!$><!/><!$><!/>`), _tmpl$24 = /* @__PURE__ */ template(`<div><div class="grid gap-4">`), _tmpl$25 = /* @__PURE__ */ template(`<div>`);
|
|
7
8
|
function ChartRenderer(props) {
|
|
8
9
|
const [iframeUrl, setIframeUrl] = createSignal();
|
|
9
10
|
const [isLoading, setIsLoading] = createSignal(true);
|
|
@@ -114,8 +115,12 @@ function TableRenderer(props) {
|
|
|
114
115
|
return tableParams.columns;
|
|
115
116
|
},
|
|
116
117
|
children: (column) => (() => {
|
|
117
|
-
var _el$44 = getNextElement(_tmpl$0);
|
|
118
|
-
|
|
118
|
+
var _el$44 = getNextElement(_tmpl$0), _el$45 = _el$44.firstChild;
|
|
119
|
+
effect(() => setProperty(_el$45, "innerHTML", typeof row[column.key] === "string" && (row[column.key].includes("[") || row[column.key].includes("**") || row[column.key].includes("`")) ? purify.sanitize(k.parse(row[column.key], {
|
|
120
|
+
async: false
|
|
121
|
+
}), {
|
|
122
|
+
ADD_ATTR: ["target", "rel"]
|
|
123
|
+
}) : row[column.key] || "-"));
|
|
119
124
|
return _el$44;
|
|
120
125
|
})()
|
|
121
126
|
}));
|
|
@@ -141,46 +146,46 @@ function TableRenderer(props) {
|
|
|
141
146
|
function MetricRenderer(props) {
|
|
142
147
|
const metricParams = props.component.params;
|
|
143
148
|
return (() => {
|
|
144
|
-
var _el$
|
|
145
|
-
insert(_el$
|
|
146
|
-
insert(_el$
|
|
147
|
-
insert(_el$
|
|
149
|
+
var _el$46 = 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] = getNextMarker(_el$53.nextSibling), _el$64 = _el$48.nextSibling, [_el$65, _co$11] = getNextMarker(_el$64.nextSibling), _el$66 = _el$65.nextSibling, [_el$67, _co$12] = getNextMarker(_el$66.nextSibling);
|
|
150
|
+
insert(_el$49, () => metricParams.title);
|
|
151
|
+
insert(_el$51, () => metricParams.value);
|
|
152
|
+
insert(_el$50, createComponent(Show, {
|
|
148
153
|
get when() {
|
|
149
154
|
return metricParams.unit;
|
|
150
155
|
},
|
|
151
156
|
get children() {
|
|
152
|
-
var _el$
|
|
153
|
-
insert(_el$
|
|
154
|
-
return _el$
|
|
157
|
+
var _el$52 = getNextElement(_tmpl$1);
|
|
158
|
+
insert(_el$52, () => metricParams.unit);
|
|
159
|
+
return _el$52;
|
|
155
160
|
}
|
|
156
|
-
}), _el$
|
|
157
|
-
insert(_el$
|
|
161
|
+
}), _el$54, _co$0);
|
|
162
|
+
insert(_el$47, createComponent(Show, {
|
|
158
163
|
get when() {
|
|
159
164
|
return metricParams.trend;
|
|
160
165
|
},
|
|
161
166
|
get children() {
|
|
162
|
-
var _el$
|
|
163
|
-
_el$
|
|
164
|
-
insert(_el$
|
|
167
|
+
var _el$55 = getNextElement(_tmpl$10), _el$56 = _el$55.firstChild, _el$59 = _el$56.firstChild, [_el$60, _co$1] = getNextMarker(_el$59.nextSibling), _el$57 = _el$60.nextSibling, _el$61 = _el$57.nextSibling, [_el$62, _co$10] = getNextMarker(_el$61.nextSibling);
|
|
168
|
+
_el$62.nextSibling;
|
|
169
|
+
insert(_el$56, (() => {
|
|
165
170
|
var _c$ = memo(() => metricParams.trend.direction === "up");
|
|
166
171
|
return () => _c$() ? "�" : metricParams.trend.direction === "down" ? "�" : "�";
|
|
167
|
-
})(), _el$
|
|
168
|
-
insert(_el$
|
|
169
|
-
effect(() => className(_el$
|
|
170
|
-
return _el$
|
|
172
|
+
})(), _el$60, _co$1);
|
|
173
|
+
insert(_el$56, () => Math.abs(metricParams.trend.value), _el$62, _co$10);
|
|
174
|
+
effect(() => 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"}`));
|
|
175
|
+
return _el$55;
|
|
171
176
|
}
|
|
172
|
-
}), _el$
|
|
173
|
-
insert(_el$
|
|
177
|
+
}), _el$65, _co$11);
|
|
178
|
+
insert(_el$47, createComponent(Show, {
|
|
174
179
|
get when() {
|
|
175
180
|
return metricParams.subtitle;
|
|
176
181
|
},
|
|
177
182
|
get children() {
|
|
178
|
-
var _el$
|
|
179
|
-
insert(_el$
|
|
180
|
-
return _el$
|
|
183
|
+
var _el$63 = getNextElement(_tmpl$11);
|
|
184
|
+
insert(_el$63, () => metricParams.subtitle);
|
|
185
|
+
return _el$63;
|
|
181
186
|
}
|
|
182
|
-
}), _el$
|
|
183
|
-
return _el$
|
|
187
|
+
}), _el$67, _co$12);
|
|
188
|
+
return _el$46;
|
|
184
189
|
})();
|
|
185
190
|
}
|
|
186
191
|
function TextRenderer(props) {
|
|
@@ -194,94 +199,94 @@ function TextRenderer(props) {
|
|
|
194
199
|
return textParams.content;
|
|
195
200
|
});
|
|
196
201
|
return (() => {
|
|
197
|
-
var _el$
|
|
202
|
+
var _el$68 = getNextElement(_tmpl$13), _el$69 = _el$68.firstChild;
|
|
198
203
|
effect((_p$) => {
|
|
199
204
|
var _v$ = `prose prose-sm dark:prose-invert max-w-none ${textParams.className || ""}`, _v$2 = htmlContent();
|
|
200
|
-
_v$ !== _p$.e && className(_el$
|
|
201
|
-
_v$2 !== _p$.t && setProperty(_el$
|
|
205
|
+
_v$ !== _p$.e && className(_el$69, _p$.e = _v$);
|
|
206
|
+
_v$2 !== _p$.t && setProperty(_el$69, "innerHTML", _p$.t = _v$2);
|
|
202
207
|
return _p$;
|
|
203
208
|
}, {
|
|
204
209
|
e: void 0,
|
|
205
210
|
t: void 0
|
|
206
211
|
});
|
|
207
|
-
return _el$
|
|
212
|
+
return _el$68;
|
|
208
213
|
})();
|
|
209
214
|
}
|
|
210
215
|
function IframeRenderer(props) {
|
|
211
216
|
const params = props.component.params;
|
|
212
217
|
return (() => {
|
|
213
|
-
var _el$
|
|
214
|
-
insert(_el$
|
|
218
|
+
var _el$70 = getNextElement(_tmpl$15), _el$74 = _el$70.firstChild, [_el$75, _co$13] = getNextMarker(_el$74.nextSibling), _el$73 = _el$75.nextSibling;
|
|
219
|
+
insert(_el$70, createComponent(Show, {
|
|
215
220
|
get when() {
|
|
216
221
|
return params.title;
|
|
217
222
|
},
|
|
218
223
|
get children() {
|
|
219
|
-
var _el$
|
|
220
|
-
insert(_el$
|
|
221
|
-
return _el$
|
|
224
|
+
var _el$71 = getNextElement(_tmpl$14), _el$72 = _el$71.firstChild;
|
|
225
|
+
insert(_el$72, () => params.title);
|
|
226
|
+
return _el$71;
|
|
222
227
|
}
|
|
223
|
-
}), _el$
|
|
228
|
+
}), _el$75, _co$13);
|
|
224
229
|
effect((_p$) => {
|
|
225
230
|
var _v$3 = params.url, _v$4 = params.title || "Embedded content", _v$5 = `height: ${params.height || "400px"}; min-height: 300px;`;
|
|
226
|
-
_v$3 !== _p$.e && setAttribute(_el$
|
|
227
|
-
_v$4 !== _p$.t && setAttribute(_el$
|
|
228
|
-
_p$.a = style(_el$
|
|
231
|
+
_v$3 !== _p$.e && setAttribute(_el$73, "src", _p$.e = _v$3);
|
|
232
|
+
_v$4 !== _p$.t && setAttribute(_el$73, "title", _p$.t = _v$4);
|
|
233
|
+
_p$.a = style(_el$73, _v$5, _p$.a);
|
|
229
234
|
return _p$;
|
|
230
235
|
}, {
|
|
231
236
|
e: void 0,
|
|
232
237
|
t: void 0,
|
|
233
238
|
a: void 0
|
|
234
239
|
});
|
|
235
|
-
return _el$
|
|
240
|
+
return _el$70;
|
|
236
241
|
})();
|
|
237
242
|
}
|
|
238
243
|
function ImageRenderer(props) {
|
|
239
244
|
const params = props.component.params;
|
|
240
245
|
return (() => {
|
|
241
|
-
var _el$
|
|
242
|
-
insert(_el$
|
|
246
|
+
var _el$76 = 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] = getNextMarker(_el$82.nextSibling);
|
|
247
|
+
insert(_el$76, createComponent(Show, {
|
|
243
248
|
get when() {
|
|
244
249
|
return params.caption;
|
|
245
250
|
},
|
|
246
251
|
get children() {
|
|
247
|
-
var _el$
|
|
248
|
-
insert(_el$
|
|
249
|
-
return _el$
|
|
252
|
+
var _el$80 = getNextElement(_tmpl$16), _el$81 = _el$80.firstChild;
|
|
253
|
+
insert(_el$81, () => params.caption);
|
|
254
|
+
return _el$80;
|
|
250
255
|
}
|
|
251
|
-
}), _el$
|
|
256
|
+
}), _el$83, _co$14);
|
|
252
257
|
effect((_p$) => {
|
|
253
258
|
var _v$6 = params.url, _v$7 = params.url, _v$8 = params.alt || "Image";
|
|
254
|
-
_v$6 !== _p$.e && setAttribute(_el$
|
|
255
|
-
_v$7 !== _p$.t && setAttribute(_el$
|
|
256
|
-
_v$8 !== _p$.a && setAttribute(_el$
|
|
259
|
+
_v$6 !== _p$.e && setAttribute(_el$78, "href", _p$.e = _v$6);
|
|
260
|
+
_v$7 !== _p$.t && setAttribute(_el$79, "src", _p$.t = _v$7);
|
|
261
|
+
_v$8 !== _p$.a && setAttribute(_el$79, "alt", _p$.a = _v$8);
|
|
257
262
|
return _p$;
|
|
258
263
|
}, {
|
|
259
264
|
e: void 0,
|
|
260
265
|
t: void 0,
|
|
261
266
|
a: void 0
|
|
262
267
|
});
|
|
263
|
-
return _el$
|
|
268
|
+
return _el$76;
|
|
264
269
|
})();
|
|
265
270
|
}
|
|
266
271
|
function LinkRenderer(props) {
|
|
267
272
|
const params = props.component.params;
|
|
268
273
|
return (() => {
|
|
269
|
-
var _el$
|
|
270
|
-
_el$
|
|
271
|
-
insert(_el$
|
|
272
|
-
insert(_el$
|
|
274
|
+
var _el$84 = 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] = getNextMarker(_el$89.nextSibling);
|
|
275
|
+
_el$84.$$click = (e) => e.stopPropagation();
|
|
276
|
+
insert(_el$87, () => params.label || params.url);
|
|
277
|
+
insert(_el$86, createComponent(Show, {
|
|
273
278
|
get when() {
|
|
274
279
|
return params.description;
|
|
275
280
|
},
|
|
276
281
|
get children() {
|
|
277
|
-
var _el$
|
|
278
|
-
insert(_el$
|
|
279
|
-
return _el$
|
|
282
|
+
var _el$88 = getNextElement(_tmpl$18);
|
|
283
|
+
insert(_el$88, () => params.description);
|
|
284
|
+
return _el$88;
|
|
280
285
|
}
|
|
281
|
-
}), _el$
|
|
282
|
-
effect(() => setAttribute(_el$
|
|
286
|
+
}), _el$90, _co$15);
|
|
287
|
+
effect(() => setAttribute(_el$84, "href", params.url));
|
|
283
288
|
runHydrationEvents();
|
|
284
|
-
return _el$
|
|
289
|
+
return _el$84;
|
|
285
290
|
})();
|
|
286
291
|
}
|
|
287
292
|
function ComponentRenderer(props) {
|
|
@@ -295,12 +300,12 @@ function ComponentRenderer(props) {
|
|
|
295
300
|
details: validation.errors
|
|
296
301
|
});
|
|
297
302
|
return (() => {
|
|
298
|
-
var _el$
|
|
299
|
-
insert(_el$
|
|
303
|
+
var _el$91 = getNextElement(_tmpl$20), _el$92 = _el$91.firstChild, _el$93 = _el$92.nextSibling;
|
|
304
|
+
insert(_el$93, () => {
|
|
300
305
|
var _a2, _b;
|
|
301
306
|
return ((_b = (_a2 = validation.errors) == null ? void 0 : _a2[0]) == null ? void 0 : _b.message) || "Unknown validation error";
|
|
302
307
|
});
|
|
303
|
-
return _el$
|
|
308
|
+
return _el$91;
|
|
304
309
|
})();
|
|
305
310
|
}
|
|
306
311
|
return createComponent(GenerativeUIErrorBoundary, {
|
|
@@ -415,42 +420,48 @@ function ComponentRenderer(props) {
|
|
|
415
420
|
}
|
|
416
421
|
function ActionRenderer(props) {
|
|
417
422
|
const params = props.component.params;
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
423
|
+
let dispatchAction = null;
|
|
424
|
+
onMount(() => {
|
|
425
|
+
if (typeof window !== "undefined") {
|
|
426
|
+
dispatchAction = (toolName, toolParams) => {
|
|
422
427
|
const event = new CustomEvent("mcp-action", {
|
|
423
428
|
detail: {
|
|
424
|
-
toolName
|
|
425
|
-
params:
|
|
429
|
+
toolName,
|
|
430
|
+
params: toolParams
|
|
426
431
|
},
|
|
427
432
|
bubbles: true
|
|
428
433
|
});
|
|
429
434
|
window.dispatchEvent(event);
|
|
430
|
-
}
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
const handleClick = (e) => {
|
|
439
|
+
if (params.action === "tool-call" && params.toolName) {
|
|
440
|
+
e.preventDefault();
|
|
441
|
+
dispatchAction == null ? void 0 : dispatchAction(params.toolName, params.params || {});
|
|
431
442
|
}
|
|
432
443
|
};
|
|
433
444
|
if (params.type === "link" || params.action === "link") {
|
|
434
445
|
return (() => {
|
|
435
|
-
var _el$
|
|
436
|
-
_el$
|
|
437
|
-
insert(_el$
|
|
446
|
+
var _el$94 = getNextElement(_tmpl$22), _el$96 = _el$94.firstChild, [_el$97, _co$16] = getNextMarker(_el$96.nextSibling), _el$98 = _el$97.nextSibling, [_el$99, _co$17] = getNextMarker(_el$98.nextSibling);
|
|
447
|
+
_el$94.$$click = handleClick;
|
|
448
|
+
insert(_el$94, createComponent(Show, {
|
|
438
449
|
get when() {
|
|
439
450
|
return params.icon;
|
|
440
451
|
},
|
|
441
452
|
get children() {
|
|
442
|
-
var _el$
|
|
443
|
-
insert(_el$
|
|
444
|
-
return _el$
|
|
453
|
+
var _el$95 = getNextElement(_tmpl$21);
|
|
454
|
+
insert(_el$95, () => params.icon);
|
|
455
|
+
return _el$95;
|
|
445
456
|
}
|
|
446
|
-
}), _el$
|
|
447
|
-
insert(_el$
|
|
457
|
+
}), _el$97, _co$16);
|
|
458
|
+
insert(_el$94, () => params.label, _el$99, _co$17);
|
|
448
459
|
effect((_p$) => {
|
|
449
460
|
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
|
|
450
461
|
${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"}`;
|
|
451
|
-
_v$9 !== _p$.e && setAttribute(_el$
|
|
452
|
-
_v$0 !== _p$.t && setAttribute(_el$
|
|
453
|
-
_v$1 !== _p$.a && className(_el$
|
|
462
|
+
_v$9 !== _p$.e && setAttribute(_el$94, "href", _p$.e = _v$9);
|
|
463
|
+
_v$0 !== _p$.t && setAttribute(_el$94, "target", _p$.t = _v$0);
|
|
464
|
+
_v$1 !== _p$.a && className(_el$94, _p$.a = _v$1);
|
|
454
465
|
return _p$;
|
|
455
466
|
}, {
|
|
456
467
|
e: void 0,
|
|
@@ -458,31 +469,31 @@ function ActionRenderer(props) {
|
|
|
458
469
|
a: void 0
|
|
459
470
|
});
|
|
460
471
|
runHydrationEvents();
|
|
461
|
-
return _el$
|
|
472
|
+
return _el$94;
|
|
462
473
|
})();
|
|
463
474
|
}
|
|
464
475
|
return (() => {
|
|
465
|
-
var _el$
|
|
466
|
-
_el$
|
|
467
|
-
insert(_el$
|
|
476
|
+
var _el$100 = getNextElement(_tmpl$23), _el$102 = _el$100.firstChild, [_el$103, _co$18] = getNextMarker(_el$102.nextSibling), _el$104 = _el$103.nextSibling, [_el$105, _co$19] = getNextMarker(_el$104.nextSibling);
|
|
477
|
+
_el$100.$$click = handleClick;
|
|
478
|
+
insert(_el$100, createComponent(Show, {
|
|
468
479
|
get when() {
|
|
469
480
|
return params.icon;
|
|
470
481
|
},
|
|
471
482
|
get children() {
|
|
472
|
-
var _el$
|
|
473
|
-
insert(_el$
|
|
474
|
-
return _el$
|
|
483
|
+
var _el$101 = getNextElement(_tmpl$21);
|
|
484
|
+
insert(_el$101, () => params.icon);
|
|
485
|
+
return _el$101;
|
|
475
486
|
}
|
|
476
|
-
}), _el$
|
|
477
|
-
insert(_el$
|
|
487
|
+
}), _el$103, _co$18);
|
|
488
|
+
insert(_el$100, () => params.label, _el$105, _co$19);
|
|
478
489
|
effect((_p$) => {
|
|
479
490
|
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
|
|
480
491
|
${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"}
|
|
481
492
|
${params.disabled ? "opacity-50 cursor-not-allowed" : ""}
|
|
482
493
|
${params.size === "sm" ? "px-3 py-1.5 text-xs" : params.size === "lg" ? "px-6 py-3 text-base" : ""}`;
|
|
483
|
-
_v$10 !== _p$.e && setAttribute(_el$
|
|
484
|
-
_v$11 !== _p$.t && setProperty(_el$
|
|
485
|
-
_v$12 !== _p$.a && className(_el$
|
|
494
|
+
_v$10 !== _p$.e && setAttribute(_el$100, "type", _p$.e = _v$10);
|
|
495
|
+
_v$11 !== _p$.t && setProperty(_el$100, "disabled", _p$.t = _v$11);
|
|
496
|
+
_v$12 !== _p$.a && className(_el$100, _p$.a = _v$12);
|
|
486
497
|
return _p$;
|
|
487
498
|
}, {
|
|
488
499
|
e: void 0,
|
|
@@ -490,7 +501,7 @@ function ActionRenderer(props) {
|
|
|
490
501
|
a: void 0
|
|
491
502
|
});
|
|
492
503
|
runHydrationEvents();
|
|
493
|
-
return _el$
|
|
504
|
+
return _el$100;
|
|
494
505
|
})();
|
|
495
506
|
}
|
|
496
507
|
const UIResourceRenderer = (props) => {
|
|
@@ -522,33 +533,33 @@ const UIResourceRenderer = (props) => {
|
|
|
522
533
|
return `grid-column: ${colStart} / span ${colSpan}; grid-row: ${rowStart ? `${rowStart} / span ${rowSpan}` : "auto"}`;
|
|
523
534
|
};
|
|
524
535
|
return (() => {
|
|
525
|
-
var _el$
|
|
526
|
-
insert(_el$
|
|
536
|
+
var _el$106 = getNextElement(_tmpl$24), _el$107 = _el$106.firstChild;
|
|
537
|
+
insert(_el$107, createComponent(For, {
|
|
527
538
|
get each() {
|
|
528
539
|
return layout().components;
|
|
529
540
|
},
|
|
530
541
|
children: (component) => (() => {
|
|
531
|
-
var _el$
|
|
532
|
-
insert(_el$
|
|
542
|
+
var _el$108 = getNextElement(_tmpl$25);
|
|
543
|
+
insert(_el$108, createComponent(ComponentRenderer, {
|
|
533
544
|
component,
|
|
534
545
|
get onError() {
|
|
535
546
|
return props.onError;
|
|
536
547
|
}
|
|
537
548
|
}));
|
|
538
|
-
effect((_$p) => style(_el$
|
|
539
|
-
return _el$
|
|
549
|
+
effect((_$p) => style(_el$108, getGridStyleString(component), _$p));
|
|
550
|
+
return _el$108;
|
|
540
551
|
})()
|
|
541
552
|
}));
|
|
542
553
|
effect((_p$) => {
|
|
543
554
|
var _v$13 = `w-full ${props.class || ""}`, _v$14 = gridContainerStyle();
|
|
544
|
-
_v$13 !== _p$.e && className(_el$
|
|
545
|
-
_p$.t = style(_el$
|
|
555
|
+
_v$13 !== _p$.e && className(_el$106, _p$.e = _v$13);
|
|
556
|
+
_p$.t = style(_el$107, _v$14, _p$.t);
|
|
546
557
|
return _p$;
|
|
547
558
|
}, {
|
|
548
559
|
e: void 0,
|
|
549
560
|
t: void 0
|
|
550
561
|
});
|
|
551
|
-
return _el$
|
|
562
|
+
return _el$106;
|
|
552
563
|
})();
|
|
553
564
|
};
|
|
554
565
|
delegateEvents(["click"]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UIResourceRenderer.js","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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"}
|
package/dist/components.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const UIResourceRenderer = require("./
|
|
4
|
-
const StreamingUIRenderer = require("./
|
|
5
|
-
const GenerativeUIErrorBoundary = require("./
|
|
3
|
+
const UIResourceRenderer = require("./components/UIResourceRenderer.cjs");
|
|
4
|
+
const StreamingUIRenderer = require("./components/StreamingUIRenderer.cjs");
|
|
5
|
+
const GenerativeUIErrorBoundary = require("./components/GenerativeUIErrorBoundary.cjs");
|
|
6
6
|
exports.UIResourceRenderer = UIResourceRenderer.UIResourceRenderer;
|
|
7
7
|
exports.StreamingUIRenderer = StreamingUIRenderer.StreamingUIRenderer;
|
|
8
8
|
exports.GenerativeUIErrorBoundary = GenerativeUIErrorBoundary.GenerativeUIErrorBoundary;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP UI Solid - Components
|
|
3
|
+
*
|
|
4
|
+
* SolidJS components for rendering MCP-generated UI resources
|
|
5
|
+
*/
|
|
6
|
+
export { UIResourceRenderer } from './UIResourceRenderer';
|
|
7
|
+
export type { UIResourceRendererProps } from './UIResourceRenderer';
|
|
8
|
+
export { StreamingUIRenderer } from './StreamingUIRenderer';
|
|
9
|
+
export type { StreamingUIRendererProps } from './StreamingUIRenderer';
|
|
10
|
+
export { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary';
|
|
11
|
+
export type { GenerativeUIErrorBoundaryProps } from './GenerativeUIErrorBoundary';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
package/dist/components.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { UIResourceRenderer } from "./
|
|
2
|
-
import { StreamingUIRenderer } from "./
|
|
3
|
-
import { GenerativeUIErrorBoundary } from "./
|
|
1
|
+
import { UIResourceRenderer } from "./components/UIResourceRenderer.js";
|
|
2
|
+
import { StreamingUIRenderer } from "./components/StreamingUIRenderer.js";
|
|
3
|
+
import { GenerativeUIErrorBoundary } from "./components/GenerativeUIErrorBoundary.js";
|
|
4
4
|
export {
|
|
5
5
|
GenerativeUIErrorBoundary,
|
|
6
6
|
StreamingUIRenderer,
|