@seed-ship/mcp-ui-solid 1.0.8 → 1.0.10
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/CHANGELOG.md +104 -0
- package/dist/components/GenerativeUIErrorBoundary.cjs +17 -30
- package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -1
- package/dist/components/GenerativeUIErrorBoundary.js +18 -31
- package/dist/components/GenerativeUIErrorBoundary.js.map +1 -1
- package/dist/components/StreamingUIRenderer.cjs +103 -188
- package/dist/components/StreamingUIRenderer.cjs.map +1 -1
- package/dist/components/StreamingUIRenderer.js +104 -189
- package/dist/components/StreamingUIRenderer.js.map +1 -1
- package/dist/components/UIResourceRenderer.cjs +95 -201
- package/dist/components/UIResourceRenderer.cjs.map +1 -1
- package/dist/components/UIResourceRenderer.js +96 -202
- package/dist/components/UIResourceRenderer.js.map +1 -1
- package/package.json +5 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ssr, ssrHydrationKey, escape, ssrStyle, createComponent, ssrAttribute } from "solid-js/web";
|
|
2
2
|
import { For, Show, createSignal, onMount } from "solid-js";
|
|
3
3
|
import { validateComponent, DEFAULT_RESOURCE_LIMITS } from "../services/validation.js";
|
|
4
4
|
import { GenerativeUIErrorBoundary } from "./GenerativeUIErrorBoundary.js";
|
|
5
|
-
var _tmpl$ =
|
|
5
|
+
var _tmpl$ = ["<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"></div></div>'], _tmpl$2 = ["<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">', "</p></div></div>"], _tmpl$3 = ["<h3", ' class="text-sm font-semibold text-gray-900 dark:text-white mb-3">', "</h3>"], _tmpl$4 = ["<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"></div></div>'], _tmpl$5 = ["<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"><!--$-->', "<!--/--><!--$-->", "<!--/--><!--$-->", "<!--/--></div>"], _tmpl$6 = ["<div", ' class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>Showing <!--$-->', "<!--/--> - <!--$-->", "<!--/--> of <!--$-->", "<!--/--></span></div>"], _tmpl$7 = ["<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"><thead class="bg-gray-50 dark:bg-gray-900"><tr>', '</tr></thead><tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700">', "</tbody></table></div><!--$-->", "<!--/--></div></div>"], _tmpl$8 = ["<th", ' scope="col" class="px-4 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider" style="', '">', "</th>"], _tmpl$9 = ["<tr", ' class="hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors">', "</tr>"], _tmpl$0 = ["<td", ' class="px-4 py-3 text-sm text-gray-900 dark:text-gray-100 whitespace-nowrap">', "</td>"], _tmpl$1 = ["<span", ' class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">', "</span>"], _tmpl$10 = ["<div", ' class="mt-3 flex items-center"><span class="', '"><!--$-->', "<!--/--> <!--$-->", "<!--/-->%</span></div>"], _tmpl$11 = ["<p", ' class="mt-2 text-xs text-gray-500 dark:text-gray-400">', "</p>"], _tmpl$12 = ["<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><!--$-->", "<!--/--><!--$-->", "<!--/--></div></div>"], _tmpl$13 = ["<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="', '">', "</div></div>"], _tmpl$14 = ["<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">', "</p></div>"], _tmpl$15 = ["<div", ' class="', '"><div class="grid gap-4" style="', '">', "</div></div>"], _tmpl$16 = ["<div", ' style="', '">', "</div>"];
|
|
6
6
|
function ChartRenderer(props) {
|
|
7
7
|
const [iframeUrl, setIframeUrl] = createSignal();
|
|
8
8
|
const [isLoading, setIsLoading] = createSignal(true);
|
|
@@ -23,183 +23,102 @@ function ChartRenderer(props) {
|
|
|
23
23
|
setIframeUrl(url);
|
|
24
24
|
setIsLoading(false);
|
|
25
25
|
});
|
|
26
|
-
return (()
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
},
|
|
56
|
-
get children() {
|
|
57
|
-
var _el$8 = _tmpl$3();
|
|
58
|
-
insert(_el$8, () => props.component.params.title);
|
|
59
|
-
return _el$8;
|
|
60
|
-
}
|
|
61
|
-
}), _el$9);
|
|
62
|
-
_el$0.addEventListener("error", () => {
|
|
63
|
-
var _a;
|
|
64
|
-
setError("Failed to load chart");
|
|
65
|
-
(_a = props.onError) == null ? void 0 : _a.call(props, {
|
|
66
|
-
type: "render",
|
|
67
|
-
message: "Chart rendering failed",
|
|
68
|
-
componentId: props.component.id
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
effect(() => setAttribute(_el$0, "src", iframeUrl()));
|
|
72
|
-
return _el$7;
|
|
73
|
-
}
|
|
74
|
-
}), null);
|
|
75
|
-
return _el$;
|
|
76
|
-
})();
|
|
26
|
+
return ssr(_tmpl$5, ssrHydrationKey(), escape(createComponent(Show, {
|
|
27
|
+
get when() {
|
|
28
|
+
return isLoading();
|
|
29
|
+
},
|
|
30
|
+
get children() {
|
|
31
|
+
return ssr(_tmpl$, ssrHydrationKey());
|
|
32
|
+
}
|
|
33
|
+
})), escape(createComponent(Show, {
|
|
34
|
+
get when() {
|
|
35
|
+
return error();
|
|
36
|
+
},
|
|
37
|
+
get children() {
|
|
38
|
+
return ssr(_tmpl$2, ssrHydrationKey(), escape(error()));
|
|
39
|
+
}
|
|
40
|
+
})), escape(createComponent(Show, {
|
|
41
|
+
get when() {
|
|
42
|
+
return iframeUrl() && !error();
|
|
43
|
+
},
|
|
44
|
+
get children() {
|
|
45
|
+
return ssr(_tmpl$4, ssrHydrationKey(), escape(createComponent(Show, {
|
|
46
|
+
get when() {
|
|
47
|
+
return props.component.params.title;
|
|
48
|
+
},
|
|
49
|
+
get children() {
|
|
50
|
+
return ssr(_tmpl$3, ssrHydrationKey(), escape(props.component.params.title));
|
|
51
|
+
}
|
|
52
|
+
})), ssrAttribute("src", escape(iframeUrl(), true), false));
|
|
53
|
+
}
|
|
54
|
+
})));
|
|
77
55
|
}
|
|
78
56
|
function TableRenderer(props) {
|
|
79
57
|
const tableParams = props.component.params;
|
|
80
|
-
return (()
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
58
|
+
return ssr(_tmpl$7, ssrHydrationKey(), escape(createComponent(Show, {
|
|
59
|
+
get when() {
|
|
60
|
+
return tableParams.title;
|
|
61
|
+
},
|
|
62
|
+
get children() {
|
|
63
|
+
return ssr(_tmpl$3, ssrHydrationKey(), escape(tableParams.title));
|
|
64
|
+
}
|
|
65
|
+
})), escape(createComponent(For, {
|
|
66
|
+
get each() {
|
|
67
|
+
return tableParams.columns;
|
|
68
|
+
},
|
|
69
|
+
children: (column) => ssr(_tmpl$8, ssrHydrationKey(), ssrStyle(column.width ? {
|
|
70
|
+
width: column.width
|
|
71
|
+
} : {}), escape(column.label))
|
|
72
|
+
})), escape(createComponent(For, {
|
|
73
|
+
get each() {
|
|
74
|
+
return tableParams.rows.slice(0, DEFAULT_RESOURCE_LIMITS.maxTableRows);
|
|
75
|
+
},
|
|
76
|
+
children: (row) => ssr(_tmpl$9, ssrHydrationKey(), escape(createComponent(For, {
|
|
93
77
|
get each() {
|
|
94
78
|
return tableParams.columns;
|
|
95
79
|
},
|
|
96
|
-
children: (column) => (()
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
get each() {
|
|
107
|
-
return tableParams.rows.slice(0, DEFAULT_RESOURCE_LIMITS.maxTableRows);
|
|
108
|
-
},
|
|
109
|
-
children: (row) => (() => {
|
|
110
|
-
var _el$27 = _tmpl$9();
|
|
111
|
-
insert(_el$27, createComponent(For, {
|
|
112
|
-
get each() {
|
|
113
|
-
return tableParams.columns;
|
|
114
|
-
},
|
|
115
|
-
children: (column) => (() => {
|
|
116
|
-
var _el$28 = _tmpl$0();
|
|
117
|
-
insert(_el$28, () => row[column.key] || "-");
|
|
118
|
-
return _el$28;
|
|
119
|
-
})()
|
|
120
|
-
}));
|
|
121
|
-
return _el$27;
|
|
122
|
-
})()
|
|
123
|
-
}));
|
|
124
|
-
insert(_el$10, createComponent(Show, {
|
|
125
|
-
get when() {
|
|
126
|
-
return tableParams.pagination;
|
|
127
|
-
},
|
|
128
|
-
get children() {
|
|
129
|
-
var _el$17 = _tmpl$6(), _el$18 = _el$17.firstChild, _el$19 = _el$18.firstChild, _el$24 = _el$19.nextSibling, _el$20 = _el$24.nextSibling, _el$25 = _el$20.nextSibling;
|
|
130
|
-
_el$25.nextSibling;
|
|
131
|
-
insert(_el$18, () => tableParams.pagination.currentPage * tableParams.pagination.pageSize + 1, _el$24);
|
|
132
|
-
insert(_el$18, () => Math.min((tableParams.pagination.currentPage + 1) * tableParams.pagination.pageSize, tableParams.pagination.totalRows), _el$25);
|
|
133
|
-
insert(_el$18, () => tableParams.pagination.totalRows, null);
|
|
134
|
-
return _el$17;
|
|
135
|
-
}
|
|
136
|
-
}), null);
|
|
137
|
-
return _el$1;
|
|
138
|
-
})();
|
|
80
|
+
children: (column) => ssr(_tmpl$0, ssrHydrationKey(), escape(row[column.key]) || "-")
|
|
81
|
+
})))
|
|
82
|
+
})), escape(createComponent(Show, {
|
|
83
|
+
get when() {
|
|
84
|
+
return tableParams.pagination;
|
|
85
|
+
},
|
|
86
|
+
get children() {
|
|
87
|
+
return ssr(_tmpl$6, ssrHydrationKey(), escape(tableParams.pagination.currentPage) * escape(tableParams.pagination.pageSize) + 1, escape(Math.min((tableParams.pagination.currentPage + 1) * tableParams.pagination.pageSize, tableParams.pagination.totalRows)), escape(tableParams.pagination.totalRows));
|
|
88
|
+
}
|
|
89
|
+
})));
|
|
139
90
|
}
|
|
140
91
|
function MetricRenderer(props) {
|
|
141
92
|
const metricParams = props.component.params;
|
|
142
|
-
return (()
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
var _c$ = memo(() => metricParams.trend.direction === "up");
|
|
165
|
-
return () => _c$() ? "�" : metricParams.trend.direction === "down" ? "�" : "�";
|
|
166
|
-
})(), _el$38);
|
|
167
|
-
insert(_el$37, () => Math.abs(metricParams.trend.value), _el$40);
|
|
168
|
-
effect(() => className(_el$37, `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"}`));
|
|
169
|
-
return _el$36;
|
|
170
|
-
}
|
|
171
|
-
}), null);
|
|
172
|
-
insert(_el$30, createComponent(Show, {
|
|
173
|
-
get when() {
|
|
174
|
-
return metricParams.subtitle;
|
|
175
|
-
},
|
|
176
|
-
get children() {
|
|
177
|
-
var _el$41 = _tmpl$11();
|
|
178
|
-
insert(_el$41, () => metricParams.subtitle);
|
|
179
|
-
return _el$41;
|
|
180
|
-
}
|
|
181
|
-
}), null);
|
|
182
|
-
return _el$29;
|
|
183
|
-
})();
|
|
93
|
+
return ssr(_tmpl$12, ssrHydrationKey(), escape(metricParams.title), escape(metricParams.value), escape(createComponent(Show, {
|
|
94
|
+
get when() {
|
|
95
|
+
return metricParams.unit;
|
|
96
|
+
},
|
|
97
|
+
get children() {
|
|
98
|
+
return ssr(_tmpl$1, ssrHydrationKey(), escape(metricParams.unit));
|
|
99
|
+
}
|
|
100
|
+
})), escape(createComponent(Show, {
|
|
101
|
+
get when() {
|
|
102
|
+
return metricParams.trend;
|
|
103
|
+
},
|
|
104
|
+
get children() {
|
|
105
|
+
return ssr(_tmpl$10, ssrHydrationKey(), `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"}`, metricParams.trend.direction === "up" ? "�" : metricParams.trend.direction === "down" ? "�" : "�", escape(Math.abs(metricParams.trend.value)));
|
|
106
|
+
}
|
|
107
|
+
})), escape(createComponent(Show, {
|
|
108
|
+
get when() {
|
|
109
|
+
return metricParams.subtitle;
|
|
110
|
+
},
|
|
111
|
+
get children() {
|
|
112
|
+
return ssr(_tmpl$11, ssrHydrationKey(), escape(metricParams.subtitle));
|
|
113
|
+
}
|
|
114
|
+
})));
|
|
184
115
|
}
|
|
185
116
|
function TextRenderer(props) {
|
|
186
117
|
const textParams = props.component.params;
|
|
187
|
-
return (()
|
|
188
|
-
var _el$42 = _tmpl$13(), _el$43 = _el$42.firstChild;
|
|
189
|
-
effect((_p$) => {
|
|
190
|
-
var _v$ = `prose prose-sm dark:prose-invert max-w-none ${textParams.className || ""}`, _v$2 = textParams.content;
|
|
191
|
-
_v$ !== _p$.e && className(_el$43, _p$.e = _v$);
|
|
192
|
-
_v$2 !== _p$.t && (_el$43.innerHTML = _p$.t = _v$2);
|
|
193
|
-
return _p$;
|
|
194
|
-
}, {
|
|
195
|
-
e: void 0,
|
|
196
|
-
t: void 0
|
|
197
|
-
});
|
|
198
|
-
return _el$42;
|
|
199
|
-
})();
|
|
118
|
+
return ssr(_tmpl$13, ssrHydrationKey(), `prose prose-sm dark:prose-invert max-w-none ${escape(textParams.className, true) || ""}`, textParams.content);
|
|
200
119
|
}
|
|
201
120
|
function ComponentRenderer(props) {
|
|
202
|
-
var _a;
|
|
121
|
+
var _a, _b, _c;
|
|
203
122
|
const validation = validateComponent(props.component);
|
|
204
123
|
if (!validation.valid) {
|
|
205
124
|
(_a = props.onError) == null ? void 0 : _a.call(props, {
|
|
@@ -208,14 +127,7 @@ function ComponentRenderer(props) {
|
|
|
208
127
|
componentId: props.component.id,
|
|
209
128
|
details: validation.errors
|
|
210
129
|
});
|
|
211
|
-
return (()
|
|
212
|
-
var _el$44 = _tmpl$14(), _el$45 = _el$44.firstChild, _el$46 = _el$45.nextSibling;
|
|
213
|
-
insert(_el$46, () => {
|
|
214
|
-
var _a2, _b;
|
|
215
|
-
return ((_b = (_a2 = validation.errors) == null ? void 0 : _a2[0]) == null ? void 0 : _b.message) || "Unknown validation error";
|
|
216
|
-
});
|
|
217
|
-
return _el$44;
|
|
218
|
-
})();
|
|
130
|
+
return ssr(_tmpl$14, ssrHydrationKey(), escape((_c = (_b = validation.errors) == null ? void 0 : _b[0]) == null ? void 0 : _c.message) || "Unknown validation error");
|
|
219
131
|
}
|
|
220
132
|
return createComponent(GenerativeUIErrorBoundary, {
|
|
221
133
|
get componentId() {
|
|
@@ -307,35 +219,17 @@ const UIResourceRenderer = (props) => {
|
|
|
307
219
|
} = component.position;
|
|
308
220
|
return `grid-column: ${colStart} / span ${colSpan}; grid-row: ${rowStart ? `${rowStart} / span ${rowSpan}` : "auto"}`;
|
|
309
221
|
};
|
|
310
|
-
return (()
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
return props.onError;
|
|
322
|
-
}
|
|
323
|
-
}));
|
|
324
|
-
effect((_$p) => style(_el$49, getGridStyleString(component), _$p));
|
|
325
|
-
return _el$49;
|
|
326
|
-
})()
|
|
327
|
-
}));
|
|
328
|
-
effect((_p$) => {
|
|
329
|
-
var _v$3 = `w-full ${props.class || ""}`, _v$4 = gridContainerStyle();
|
|
330
|
-
_v$3 !== _p$.e && className(_el$47, _p$.e = _v$3);
|
|
331
|
-
_p$.t = style(_el$48, _v$4, _p$.t);
|
|
332
|
-
return _p$;
|
|
333
|
-
}, {
|
|
334
|
-
e: void 0,
|
|
335
|
-
t: void 0
|
|
336
|
-
});
|
|
337
|
-
return _el$47;
|
|
338
|
-
})();
|
|
222
|
+
return ssr(_tmpl$15, ssrHydrationKey(), `w-full ${escape(props.class, true) || ""}`, ssrStyle(gridContainerStyle()), escape(createComponent(For, {
|
|
223
|
+
get each() {
|
|
224
|
+
return layout().components;
|
|
225
|
+
},
|
|
226
|
+
children: (component) => ssr(_tmpl$16, ssrHydrationKey(), ssrStyle(getGridStyleString(component)), escape(createComponent(ComponentRenderer, {
|
|
227
|
+
component,
|
|
228
|
+
get onError() {
|
|
229
|
+
return props.onError;
|
|
230
|
+
}
|
|
231
|
+
})))
|
|
232
|
+
})));
|
|
339
233
|
};
|
|
340
234
|
export {
|
|
341
235
|
UIResourceRenderer
|
|
@@ -1 +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 * Security features:\n * - Sandboxed iframes for untrusted content\n * - CSP enforcement via middleware\n * - XSS prevention with DOMPurify\n * - Domain whitelist validation\n *\n * Performance:\n * - Lazy loading with Intersection Observer\n * - Render timeout enforcement\n * - Error boundaries for isolation\n */\n\nimport { Component, createSignal, onMount, Show, For } from 'solid-js'\nimport type { UIComponent, UILayout, RendererError, ComponentType } from '../types'\nimport { validateComponent, DEFAULT_RESOURCE_LIMITS } from '../services/validation'\nimport { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary'\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\">\n <thead class=\"bg-gray-50 dark:bg-gray-900\">\n <tr>\n <For each={tableParams.columns}>\n {(column: any) => (\n <th\n scope=\"col\"\n class=\"px-4 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider\"\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) => (\n <tr class=\"hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\">\n <For each={tableParams.columns}>\n {(column: any) => (\n <td class=\"px-4 py-3 text-sm text-gray-900 dark:text-gray-100 whitespace-nowrap\">\n {row[column.key] || '-'}\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 ${\n 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 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={textParams.content} // Note: Should be sanitized at generation time\n />\n </div>\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 </GenerativeUIErrorBoundary>\n )\n}\n\n/**\n * Main UIResourceRenderer component\n */\nexport const UIResourceRenderer: Component<UIResourceRendererProps> = (props) => {\n const layout = () => {\n // Convert single component to layout\n if ('type' in props.content) {\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 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 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$","_tmpl$5","_$insert","_$createComponent","Show","when","children","_tmpl$","_el$3","_tmpl$2","_el$4","firstChild","_el$5","_el$6","nextSibling","_$memo","_el$7","_tmpl$4","_el$9","_el$0","title","_el$8","_tmpl$3","addEventListener","onError","message","componentId","id","_$effect","_$setAttribute","TableRenderer","tableParams","_el$1","_tmpl$7","_el$10","_el$12","_el$13","_el$14","_el$15","_el$16","_el$11","For","each","columns","column","_el$26","_tmpl$8","label","_$p","_$style","width","rows","slice","DEFAULT_RESOURCE_LIMITS","maxTableRows","row","_el$27","_tmpl$9","_el$28","_tmpl$0","key","pagination","_el$17","_tmpl$6","_el$18","_el$19","_el$24","_el$20","_el$25","currentPage","pageSize","Math","min","totalRows","MetricRenderer","metricParams","_el$29","_tmpl$12","_el$30","_el$31","_el$32","_el$33","_el$34","value","unit","_el$35","_tmpl$1","trend","_el$36","_tmpl$10","_el$37","_el$38","_el$40","_c$","direction","abs","_$className","subtitle","_el$41","_tmpl$11","TextRenderer","textParams","_el$42","_tmpl$13","_el$43","_p$","_v$","className","_v$2","content","e","t","innerHTML","undefined","ComponentRenderer","validation","validateComponent","valid","details","errors","_el$44","_tmpl$14","_el$45","_el$46","GenerativeUIErrorBoundary","componentType","allowRetry","UIResourceRenderer","layout","components","grid","gap","gridContainerStyle","getGridStyleString","colStart","colSpan","rowStart","rowSpan","position","_el$47","_tmpl$15","_el$48","_el$49","_tmpl$16","_v$3","class","_v$4"],"mappings":";;;;;AAiDA,SAASA,cAAcC,OAGpB;AACD,QAAM,CAACC,WAAWC,YAAY,IAAIC,aAAAA;AAClC,QAAM,CAACC,WAAWC,YAAY,IAAIF,aAAa,IAAI;AACnD,QAAM,CAACG,OAAOC,QAAQ,IAAIJ,aAAAA;AAE1BK,UAAQ,MAAM;AACZ,UAAMC,cAAcT,MAAMU,UAAUC;AAGpC,UAAMC,cAAc;AAAA,MAClBC,MAAMJ,YAAYI;AAAAA,MAClBC,MAAML,YAAYK;AAAAA,MAClBC,SAAS;AAAA,QACP,GAAGN,YAAYM;AAAAA,QACfC,YAAY;AAAA,QACZC,qBAAqB;AAAA,MAAA;AAAA,IACvB;AAIF,UAAMC,YAAYC,mBAAmBC,KAAKC,UAAUT,WAAW,CAAC;AAChE,UAAMU,MAAM,iCAAiCJ,SAAS;AAGtDhB,iBAAaoB,GAAG;AAChBjB,iBAAa,KAAK;AAAA,EACpB,CAAC;AAED,UAAA,MAAA;AAAA,QAAAkB,OAAAC,QAAAA;AAAAC,WAAAF,MAAAG,gBAEKC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAExB,UAAAA;AAAAA,MAAW;AAAA,MAAA,IAAAyB,WAAA;AAAA,eAAAC,OAAAA;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAL,WAAAF,MAAAG,gBAMtBC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEtB,MAAAA;AAAAA,MAAO;AAAA,MAAA,IAAAuB,WAAA;AAAA,YAAAE,QAAAC,WAAAC,QAAAF,MAAAG,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE;AAAAZ,eAAAW,OAI6C9B,KAAK;AAAA,eAAAyB;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAN,WAAAF,MAAAG,gBAKpEC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEU,aAAArC,WAAW,EAAA,KAAI,CAACK,MAAAA;AAAAA,MAAO;AAAA,MAAA,IAAAuB,WAAA;AAAA,YAAAU,QAAAC,QAAAA,GAAAC,QAAAF,MAAAL,YAAAQ,QAAAD,MAAAP;AAAAT,eAAAc,OAAAb,gBAE9BC,MAAI;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAG5B,MAAMU,UAAUC,OAAegC;AAAAA,UAAK;AAAA,UAAA,IAAAd,WAAA;AAAA,gBAAAe,QAAAC,QAAAA;AAAApB,mBAAAmB,OAAA,MAE3C5C,MAAMU,UAAUC,OAAegC,KAAK;AAAA,mBAAAC;AAAAA,UAAA;AAAA,QAAA,CAAA,GAAAH,KAAA;AAAAC,cAAAI,iBAAA,SAQ7B,MAAM;;AACbvC,mBAAS,sBAAsB;AAC/BP,sBAAM+C,YAAN/C,+BAAgB;AAAA,YACda,MAAM;AAAA,YACNmC,SAAS;AAAA,YACTC,aAAajD,MAAMU,UAAUwC;AAAAA,UAAAA;AAAAA,QAEjC,CAAC;AAAAC,qBAAAC,aAAAV,OAAA,OAVIzC,UAAAA,CAAW,CAAA;AAAA,eAAAsC;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAA,WAAAhB;AAAAA,EAAA,GAAA;AAiB9B;AAKA,SAAS8B,cAAcrD,OAGpB;AACD,QAAMsD,cAActD,MAAMU,UAAUC;AAEpC,UAAA,MAAA;AAAA,QAAA4C,QAAAC,QAAAA,GAAAC,SAAAF,MAAArB,YAAAwB,SAAAD,OAAAvB,YAAAyB,SAAAD,OAAAxB,YAAA0B,SAAAD,OAAAzB,YAAA2B,SAAAD,OAAA1B,YAAA4B,SAAAF,OAAAvB;AAAAZ,WAAAgC,QAAA/B,gBAGOC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAE0B,YAAYX;AAAAA,MAAK;AAAA,MAAA,IAAAd,WAAA;AAAA,YAAAkC,SAAAlB,QAAAA;AAAApB,eAAAsC,QAAA,MAExBT,YAAYX,KAAK;AAAA,eAAAoB;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAL,MAAA;AAAAjC,WAAAoC,QAAAnC,gBAQbsC,KAAG;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEX,YAAYY;AAAAA,MAAO;AAAA,MAAArC,UAC3BA,CAACsC,YAAW,MAAA;AAAA,YAAAC,SAAAC,QAAAA;AAAA5C,eAAA2C,QAAA,MAMRD,OAAOG,KAAK;AAAAnB,eAAAoB,CAAAA,QAAAC,MAAAJ,QAFND,OAAOM,QAAQ;AAAA,UAAEA,OAAON,OAAOM;AAAAA,QAAAA,IAAU,CAAA,GAAEF,GAAA,CAAA;AAAA,eAAAH;AAAAA,MAAA,GAAA;AAAA,IAAA,CAIrD,CAAA;AAAA3C,WAAAqC,QAAApC,gBAKJsC,KAAG;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEX,YAAYoB,KAAKC,MAAM,GAAGC,wBAAwBC,YAAY;AAAA,MAAC;AAAA,MAAAhD,UACvEA,CAACiD,SAAQ,MAAA;AAAA,YAAAC,SAAAC,QAAAA;AAAAvD,eAAAsD,QAAArD,gBAELsC,KAAG;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAEX,YAAYY;AAAAA,UAAO;AAAA,UAAArC,UAC3BA,CAACsC,YAAW,MAAA;AAAA,gBAAAc,SAAAC,QAAAA;AAAAzD,mBAAAwD,QAAA,MAERH,IAAIX,OAAOgB,GAAG,KAAK,GAAG;AAAA,mBAAAF;AAAAA,UAAA,GAAA;AAAA,QAAA,CAE1B,CAAA;AAAA,eAAAF;AAAAA,MAAA,GAAA;AAAA,IAAA,CAGN,CAAA;AAAAtD,WAAAgC,QAAA/B,gBAMRC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAE0B,YAAY8B;AAAAA,MAAU;AAAA,MAAA,IAAAvD,WAAA;AAAA,YAAAwD,SAAAC,QAAAA,GAAAC,SAAAF,OAAAnD,YAAAsD,SAAAD,OAAArD,YAAAuD,SAAAD,OAAAnD,aAAAqD,SAAAD,OAAApD,aAAAsD,SAAAD,OAAArD;AAAAsD,eAAAtD;AAAAZ,eAAA8D,QAAA,MAGnBjC,YAAY8B,WAAWQ,cAActC,YAAY8B,WAAWS,WAAW,GAACJ,MAAA;AAAAhE,eAAA8D,QAAA,MAChFO,KAAKC,KACHzC,YAAY8B,WAAWQ,cAAc,KAAKtC,YAAY8B,WAAWS,UAClEvC,YAAY8B,WAAWY,SACzB,GAACL,MAAA;AAAAlE,eAAA8D,QAAA,MACGjC,YAAY8B,WAAWY,WAAS,IAAA;AAAA,eAAAX;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAA,WAAA9B;AAAAA,EAAA,GAAA;AAOlD;AAKA,SAAS0C,eAAejG,OAAmC;AACzD,QAAMkG,eAAelG,MAAMU,UAAUC;AAErC,UAAA,MAAA;AAAA,QAAAwF,SAAAC,YAAAC,SAAAF,OAAAjE,YAAAoE,SAAAD,OAAAnE,YAAAqE,SAAAD,OAAApE,YAAAsE,SAAAD,OAAAlE,aAAAoE,SAAAD,OAAAtE;AAAAT,WAAA8E,QAAA,MAKWL,aAAavD,KAAK;AAAAlB,WAAAgF,QAAA,MAG8CP,aAAaQ,KAAK;AAAAjF,WAAA+E,QAAA9E,gBAClFC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEsE,aAAaS;AAAAA,MAAI;AAAA,MAAA,IAAA9E,WAAA;AAAA,YAAA+E,SAAAC,QAAAA;AAAApF,eAAAmF,QAAA,MAExBV,aAAaS,IAAI;AAAA,eAAAC;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAnF,WAAA4E,QAAA3E,gBAMzBC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEsE,aAAaY;AAAAA,MAAK;AAAA,MAAA,IAAAjF,WAAA;AAAA,YAAAkF,SAAAC,SAAAA,GAAAC,SAAAF,OAAA7E,YAAAgF,SAAAD,OAAA/E,YAAAiF,SAAAD,OAAA7E;AAAA8E,eAAA9E;AAAAZ,eAAAwF,SAAA,MAAA;AAAA,cAAAG,MAAA9E,KAAA,MAWvB4D,aAAaY,MAAMO,cAAc,IAAI;AAAA,iBAAA,MAArCD,QACG,MACAlB,aAAaY,MAAMO,cAAc,SAC/B,MACA;AAAA,QAAG,GAAA,GAAAH,MAAA;AAAAzF,eAAAwF,QAAA,MACRnB,KAAKwB,IAAIpB,aAAaY,MAAMJ,KAAK,GAACS,MAAA;AAAAhE,eAAA,MAAAoE,UAAAN,QAb5B,uBACLf,aAAaY,MAAMO,cAAc,OAC7B,uCACAnB,aAAaY,MAAMO,cAAc,SAC/B,mCACA,kCAAkC,EACxC,CAAA;AAAA,eAAAN;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAtF,WAAA4E,QAAA3E,gBAYPC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEsE,aAAasB;AAAAA,MAAQ;AAAA,MAAA,IAAA3F,WAAA;AAAA,YAAA4F,SAAAC,SAAAA;AAAAjG,eAAAgG,QAAA,MAC2BvB,aAAasB,QAAQ;AAAA,eAAAC;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAA,WAAAtB;AAAAA,EAAA,GAAA;AAKzF;AAKA,SAASwB,aAAa3H,OAAmC;AACvD,QAAM4H,aAAa5H,MAAMU,UAAUC;AAEnC,UAAA,MAAA;AAAA,QAAAkH,SAAAC,SAAAA,GAAAC,SAAAF,OAAA3F;AAAAiB,WAAA6E,CAAAA,QAAA;AAAA,UAAAC,MAGa,+CAA+CL,WAAWM,aAAa,EAAE,IAAEC,OACvEP,WAAWQ;AAAOH,cAAAD,IAAAK,KAAAd,UAAAQ,QAAAC,IAAAK,IAAAJ,GAAA;AAAAE,eAAAH,IAAAM,MAAAP,OAAAQ,YAAAP,IAAAM,IAAAH;AAAA,aAAAH;AAAAA,IAAA,GAAA;AAAA,MAAAK,GAAAG;AAAAA,MAAAF,GAAAE;AAAAA,IAAAA,CAAA;AAAA,WAAAX;AAAAA,EAAA,GAAA;AAIrC;AAKA,SAASY,kBAAkBzI,OAGxB;;AAED,QAAM0I,aAAaC,kBAAkB3I,MAAMU,SAAS;AACpD,MAAI,CAACgI,WAAWE,OAAO;AACrB5I,gBAAM+C,YAAN/C,+BAAgB;AAAA,MACda,MAAM;AAAA,MACNmC,SAAS;AAAA,MACTC,aAAajD,MAAMU,UAAUwC;AAAAA,MAC7B2F,SAASH,WAAWI;AAAAA,IAAAA;AAGtB,YAAA,MAAA;AAAA,UAAAC,SAAAC,SAAAA,GAAAC,SAAAF,OAAA7G,YAAAgH,SAAAD,OAAA5G;AAAAZ,aAAAyH,QAAA;;AAIOR,uBAAAA,MAAAA,WAAWI,WAAXJ,gBAAAA,IAAoB,OAApBA,mBAAwB1F,YAAW;AAAA,OAA0B;AAAA,aAAA+F;AAAAA,IAAA,GAAA;AAAA,EAItE;AAGA,SAAArH,gBACGyH,2BAAyB;AAAA,IAAA,IACxBlG,cAAW;AAAA,aAAEjD,MAAMU,UAAUwC;AAAAA,IAAE;AAAA,IAAA,IAC/BkG,gBAAa;AAAA,aAAEpJ,MAAMU,UAAUG;AAAAA,IAAI;AAAA,IAAA,IACnCkC,UAAO;AAAA,aAAE/C,MAAM+C;AAAAA,IAAO;AAAA,IACtBsG,YAAY;AAAA,IAAI,IAAAxH,WAAA;AAAA,aAAA,CAAAH,gBAEfC,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAE5B,MAAMU,UAAUG,SAAS;AAAA,QAAO;AAAA,QAAA,IAAAgB,WAAA;AAAA,iBAAAH,gBACzC3B,eAAa;AAAA,YAAA,IAACW,YAAS;AAAA,qBAAEV,MAAMU;AAAAA,YAAS;AAAA,YAAA,IAAEqC,UAAO;AAAA,qBAAE/C,MAAM+C;AAAAA,YAAO;AAAA,UAAA,CAAA;AAAA,QAAA;AAAA,MAAA,CAAA,GAAArB,gBAElEC,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAE5B,MAAMU,UAAUG,SAAS;AAAA,QAAO;AAAA,QAAA,IAAAgB,WAAA;AAAA,iBAAAH,gBACzC2B,eAAa;AAAA,YAAA,IAAC3C,YAAS;AAAA,qBAAEV,MAAMU;AAAAA,YAAS;AAAA,YAAA,IAAEqC,UAAO;AAAA,qBAAE/C,MAAM+C;AAAAA,YAAO;AAAA,UAAA,CAAA;AAAA,QAAA;AAAA,MAAA,CAAA,GAAArB,gBAElEC,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAE5B,MAAMU,UAAUG,SAAS;AAAA,QAAQ;AAAA,QAAA,IAAAgB,WAAA;AAAA,iBAAAH,gBAC1CuE,gBAAc;AAAA,YAAA,IAACvF,YAAS;AAAA,qBAAEV,MAAMU;AAAAA,YAAS;AAAA,UAAA,CAAA;AAAA,QAAA;AAAA,MAAA,CAAA,GAAAgB,gBAE3CC,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAE5B,MAAMU,UAAUG,SAAS;AAAA,QAAM;AAAA,QAAA,IAAAgB,WAAA;AAAA,iBAAAH,gBACxCiG,cAAY;AAAA,YAAA,IAACjH,YAAS;AAAA,qBAAEV,MAAMU;AAAAA,YAAS;AAAA,UAAA,CAAA;AAAA,QAAA;AAAA,MAAA,CAAA,CAAA;AAAA,IAAA;AAAA,EAAA,CAAA;AAIhD;AAKO,MAAM4I,qBAA0DtJ,CAAAA,UAAU;AAC/E,QAAMuJ,SAASA,MAAM;AAEnB,QAAI,UAAUvJ,MAAMoI,SAAS;AAC3B,aAAO;AAAA,QACLlF,IAAI;AAAA,QACJsG,YAAY,CAACxJ,MAAMoI,OAAsB;AAAA,QACzCqB,MAAM;AAAA,UACJvF,SAAS;AAAA,UACTwF,KAAK;AAAA,QAAA;AAAA,MACP;AAAA,IAEJ;AACA,WAAO1J,MAAMoI;AAAAA,EACf;AAaA,QAAMuB,qBAAqBA,MACzB,iCAAiCJ,OAAAA,EAASE,KAAKvF,OAAO,gBAAgBqF,OAAAA,EAASE,KAAKC,GAAG;AAGzF,QAAME,qBAAqBA,CAAClJ,cAA2B;AACrD,UAAM;AAAA,MAAEmJ;AAAAA,MAAUC;AAAAA,MAASC;AAAAA,MAAUC,UAAU;AAAA,IAAA,IAAMtJ,UAAUuJ;AAC/D,WAAO,gBAAgBJ,QAAQ,WAAWC,OAAO,eAAeC,WAAW,GAAGA,QAAQ,WAAWC,OAAO,KAAK,MAAM;AAAA,EACrH;AAEA,UAAA,MAAA;AAAA,QAAAE,SAAAC,SAAAA,GAAAC,SAAAF,OAAAhI;AAAAT,WAAA2I,QAAA1I,gBAGOsC,KAAG;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEsF,SAASC;AAAAA,MAAU;AAAA,MAAA3H,UAC1BnB,gBAAS,MAAA;AAAA,YAAA2J,SAAAC,SAAAA;AAAA7I,eAAA4I,QAAA3I,gBAEN+G,mBAAiB;AAAA,UAAC/H;AAAAA,UAAoB,IAAEqC,UAAO;AAAA,mBAAE/C,MAAM+C;AAAAA,UAAO;AAAA,QAAA,CAAA,CAAA;AAAAI,eAAAoB,SAAAC,MAAA6F,QADrDT,mBAAmBlJ,SAAS,GAAC6D,GAAA,CAAA;AAAA,eAAA8F;AAAAA,MAAA,GAAA;AAAA,IAAA,CAG1C,CAAA;AAAAlH,WAAA6E,CAAAA,QAAA;AAAA,UAAAuC,OAPK,UAAUvK,MAAMwK,SAAS,EAAE,IAAEC,OACRd,mBAAAA;AAAoBY,eAAAvC,IAAAK,KAAAd,UAAA2C,QAAAlC,IAAAK,IAAAkC,IAAA;AAAAvC,UAAAM,IAAA9D,MAAA4F,QAAAK,MAAAzC,IAAAM,CAAA;AAAA,aAAAN;AAAAA,IAAA,GAAA;AAAA,MAAAK,GAAAG;AAAAA,MAAAF,GAAAE;AAAAA,IAAAA,CAAA;AAAA,WAAA0B;AAAAA,EAAA,GAAA;AAWzD;"}
|
|
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 * Security features:\n * - Sandboxed iframes for untrusted content\n * - CSP enforcement via middleware\n * - XSS prevention with DOMPurify\n * - Domain whitelist validation\n *\n * Performance:\n * - Lazy loading with Intersection Observer\n * - Render timeout enforcement\n * - Error boundaries for isolation\n */\n\nimport { Component, createSignal, onMount, Show, For } from 'solid-js'\nimport type { UIComponent, UILayout, RendererError, ComponentType } from '../types'\nimport { validateComponent, DEFAULT_RESOURCE_LIMITS } from '../services/validation'\nimport { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary'\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\">\n <thead class=\"bg-gray-50 dark:bg-gray-900\">\n <tr>\n <For each={tableParams.columns}>\n {(column: any) => (\n <th\n scope=\"col\"\n class=\"px-4 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider\"\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) => (\n <tr class=\"hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\">\n <For each={tableParams.columns}>\n {(column: any) => (\n <td class=\"px-4 py-3 text-sm text-gray-900 dark:text-gray-100 whitespace-nowrap\">\n {row[column.key] || '-'}\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 ${\n 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 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={textParams.content} // Note: Should be sanitized at generation time\n />\n </div>\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 </GenerativeUIErrorBoundary>\n )\n}\n\n/**\n * Main UIResourceRenderer component\n */\nexport const UIResourceRenderer: Component<UIResourceRendererProps> = (props) => {\n const layout = () => {\n // Convert single component to layout\n if ('type' in props.content) {\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 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 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","_$ssr","_tmpl$5","_$ssrHydrationKey","_$escape","_$createComponent","Show","when","children","_tmpl$","_tmpl$2","_tmpl$4","title","_tmpl$3","_$ssrAttribute","TableRenderer","tableParams","_tmpl$7","For","each","columns","column","_tmpl$8","_$ssrStyle","width","label","rows","slice","DEFAULT_RESOURCE_LIMITS","maxTableRows","row","_tmpl$9","_tmpl$0","key","pagination","_tmpl$6","currentPage","pageSize","Math","min","totalRows","MetricRenderer","metricParams","_tmpl$12","value","unit","_tmpl$1","trend","_tmpl$10","direction","abs","subtitle","_tmpl$11","TextRenderer","textParams","_tmpl$13","className","content","ComponentRenderer","validation","validateComponent","valid","onError","message","componentId","id","details","errors","_tmpl$14","GenerativeUIErrorBoundary","componentType","allowRetry","UIResourceRenderer","layout","components","grid","gap","gridContainerStyle","getGridStyleString","colStart","colSpan","rowStart","rowSpan","position","_tmpl$15","class","_tmpl$16"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seed-ship/mcp-ui-solid",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.10",
|
|
4
4
|
"description": "SolidJS components for rendering MCP-generated UI resources",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -8,21 +8,25 @@
|
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
+
"solid": "./dist/index.js",
|
|
11
12
|
"import": "./dist/index.js",
|
|
12
13
|
"require": "./dist/index.cjs",
|
|
13
14
|
"types": "./dist/index.d.ts"
|
|
14
15
|
},
|
|
15
16
|
"./components": {
|
|
17
|
+
"solid": "./dist/components/index.js",
|
|
16
18
|
"import": "./dist/components/index.js",
|
|
17
19
|
"require": "./dist/components/index.cjs",
|
|
18
20
|
"types": "./dist/components/index.d.ts"
|
|
19
21
|
},
|
|
20
22
|
"./hooks": {
|
|
23
|
+
"solid": "./dist/hooks/index.js",
|
|
21
24
|
"import": "./dist/hooks/index.js",
|
|
22
25
|
"require": "./dist/hooks/index.cjs",
|
|
23
26
|
"types": "./dist/hooks/index.d.ts"
|
|
24
27
|
},
|
|
25
28
|
"./types": {
|
|
29
|
+
"solid": "./dist/types/index.js",
|
|
26
30
|
"import": "./dist/types/index.js",
|
|
27
31
|
"require": "./dist/types/index.cjs",
|
|
28
32
|
"types": "./dist/types/index.d.ts"
|