@seed-ship/mcp-ui-solid 1.0.3 → 1.0.4
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 +104 -0
- package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -0
- package/dist/components/GenerativeUIErrorBoundary.js +104 -0
- package/dist/components/GenerativeUIErrorBoundary.js.map +1 -0
- package/dist/components/StreamingUIRenderer.cjs +271 -0
- package/dist/components/StreamingUIRenderer.cjs.map +1 -0
- package/dist/components/StreamingUIRenderer.js +271 -0
- package/dist/components/StreamingUIRenderer.js.map +1 -0
- package/dist/components/UIResourceRenderer.cjs +347 -0
- package/dist/components/UIResourceRenderer.cjs.map +1 -0
- package/dist/components/UIResourceRenderer.js +347 -0
- package/dist/components/UIResourceRenderer.js.map +1 -0
- package/dist/components.cjs +8 -1
- package/dist/components.cjs.map +1 -1
- package/dist/components.js +6 -4
- package/dist/components.js.map +1 -1
- package/dist/hooks/useStreamingUI.cjs +230 -0
- package/dist/hooks/useStreamingUI.cjs.map +1 -0
- package/dist/hooks/useStreamingUI.js +230 -0
- package/dist/hooks/useStreamingUI.js.map +1 -0
- package/dist/hooks.cjs +4 -1
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.js +2 -2
- package/dist/index.cjs +16 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +14 -293
- package/dist/index.js.map +1 -1
- package/dist/services/component-registry.cjs +295 -0
- package/dist/services/component-registry.cjs.map +1 -0
- package/dist/services/component-registry.js +295 -0
- package/dist/services/component-registry.js.map +1 -0
- package/dist/services/validation.cjs +253 -0
- package/dist/services/validation.cjs.map +1 -0
- package/dist/services/validation.js +253 -0
- package/dist/services/validation.js.map +1 -0
- package/dist/utils/logger.cjs +31 -0
- package/dist/utils/logger.cjs.map +1 -0
- package/dist/utils/logger.js +31 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +1 -1
- package/dist/StreamingUIRenderer-DQ1WoVV6.cjs +0 -5
- package/dist/StreamingUIRenderer-DQ1WoVV6.cjs.map +0 -1
- package/dist/StreamingUIRenderer-oyg_cKKl.js +0 -757
- package/dist/StreamingUIRenderer-oyg_cKKl.js.map +0 -1
- package/dist/useStreamingUI-BL0nh13E.js +0 -187
- package/dist/useStreamingUI-BL0nh13E.js.map +0 -1
- package/dist/useStreamingUI-CXmvpRhz.cjs +0 -3
- package/dist/useStreamingUI-CXmvpRhz.cjs.map +0 -1
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { delegateEvents, template, insert, createComponent, memo, effect, setStyleProperty, use, className } from "solid-js/web";
|
|
2
|
+
import { createSignal, Show, For } from "solid-js";
|
|
3
|
+
import { useStreamingUI } from "../hooks/useStreamingUI.js";
|
|
4
|
+
import { validateComponent } from "../services/validation.js";
|
|
5
|
+
import { GenerativeUIErrorBoundary } from "./GenerativeUIErrorBoundary.js";
|
|
6
|
+
var _tmpl$ = /* @__PURE__ */ template(`<div class="w-full bg-error-subtle border border-border-error rounded-lg p-4"><p class="text-sm font-medium text-error-primary">Validation Error</p><p class="text-xs text-text-secondary mt-1">`), _tmpl$2 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-text-primary">`), _tmpl$3 = /* @__PURE__ */ template(`<span class="text-sm text-text-secondary">`), _tmpl$4 = /* @__PURE__ */ template(`<div class=mt-2><p class="text-2xl font-semibold text-text-primary">`), _tmpl$5 = /* @__PURE__ */ template(`<div class="w-full bg-surface-secondary border border-border-subtle rounded-lg p-4"><div class="flex items-center gap-2 mb-2"><span class="text-xs font-medium text-text-tertiary uppercase"></span></div><div class="mt-3 text-xs text-text-tertiary">Component ID: <!>...`), _tmpl$6 = /* @__PURE__ */ template(`<span class="text-sm text-text-secondary"> / `), _tmpl$7 = /* @__PURE__ */ template(`<div class=mt-2><div class="h-1 w-full overflow-hidden rounded-full bg-surface-tertiary"><div class="animate-progress-indeterminate h-full w-1/3 bg-brand-primary">`), _tmpl$8 = /* @__PURE__ */ template(`<div class="mb-4 rounded-lg border border-border-subtle bg-surface-secondary p-4"><div class="mb-2 flex items-center justify-between"><span class="text-sm font-medium text-text-primary"></span></div><div class="h-2 w-full overflow-hidden rounded-full bg-surface-tertiary"><div class="h-full bg-brand-primary transition-all duration-300 ease-out">`), _tmpl$9 = /* @__PURE__ */ template(`<button type=button class="mt-3 rounded-md bg-error-primary px-3 py-1.5 text-sm font-medium text-white hover:bg-error-hover">Retry`), _tmpl$0 = /* @__PURE__ */ template(`<div class="mb-4 rounded-lg border border-border-error bg-error-subtle p-4"><div class="mb-2 flex items-center gap-2"><svg class="h-5 w-5 text-error-primary"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><span class="font-medium text-error-primary"></span></div><p class="text-sm text-text-secondary">`), _tmpl$1 = /* @__PURE__ */ template(`<div><div class="font-medium text-text-primary">Cost</div><div>$`), _tmpl$10 = /* @__PURE__ */ template(`<div><div class="font-medium text-text-primary">Cached</div><div class=text-success-primary>Yes`), _tmpl$11 = /* @__PURE__ */ template(`<div class="mt-6 rounded-lg border border-border-subtle bg-surface-secondary p-4 text-sm text-text-secondary"><div class="grid grid-cols-2 gap-4 md:grid-cols-4"><div><div class="font-medium text-text-primary">Provider</div><div></div></div><div><div class="font-medium text-text-primary">Model</div><div></div></div><div><div class="font-medium text-text-primary">Execution Time</div><div>ms</div></div><div><div class="font-medium text-text-primary">TTFB</div><div>ms`), _tmpl$12 = /* @__PURE__ */ template(`<div><div class="grid grid-cols-12 gap-4">`), _tmpl$13 = /* @__PURE__ */ template(`<div>`), _tmpl$14 = /* @__PURE__ */ template(`<div class="col-span-12 md:col-span-6 lg:col-span-4"><div class="animate-pulse rounded-lg border border-border-subtle bg-surface-secondary p-4"><div class="mb-4 h-6 w-1/2 rounded bg-surface-tertiary"></div><div class=space-y-3><div class="h-4 rounded bg-surface-tertiary"></div><div class="h-4 w-5/6 rounded bg-surface-tertiary"></div><div class="h-4 w-4/6 rounded bg-surface-tertiary"></div></div><div class="mt-4 h-32 rounded bg-surface-tertiary">`);
|
|
7
|
+
function StreamingComponentRenderer(props) {
|
|
8
|
+
var _a;
|
|
9
|
+
const validation = validateComponent(props.component);
|
|
10
|
+
if (!validation.valid) {
|
|
11
|
+
(_a = props.onError) == null ? void 0 : _a.call(props, {
|
|
12
|
+
type: "validation",
|
|
13
|
+
message: "Component validation failed",
|
|
14
|
+
componentId: props.component.id,
|
|
15
|
+
details: validation.errors
|
|
16
|
+
});
|
|
17
|
+
return (() => {
|
|
18
|
+
var _el$ = _tmpl$(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling;
|
|
19
|
+
insert(_el$3, () => {
|
|
20
|
+
var _a2, _b;
|
|
21
|
+
return ((_b = (_a2 = validation.errors) == null ? void 0 : _a2[0]) == null ? void 0 : _b.message) || "Unknown validation error";
|
|
22
|
+
});
|
|
23
|
+
return _el$;
|
|
24
|
+
})();
|
|
25
|
+
}
|
|
26
|
+
const params = props.component.params;
|
|
27
|
+
return createComponent(GenerativeUIErrorBoundary, {
|
|
28
|
+
get componentId() {
|
|
29
|
+
return props.component.id;
|
|
30
|
+
},
|
|
31
|
+
get componentType() {
|
|
32
|
+
return props.component.type;
|
|
33
|
+
},
|
|
34
|
+
get onError() {
|
|
35
|
+
return props.onError;
|
|
36
|
+
},
|
|
37
|
+
allowRetry: false,
|
|
38
|
+
get children() {
|
|
39
|
+
var _el$4 = _tmpl$5(), _el$5 = _el$4.firstChild, _el$6 = _el$5.firstChild, _el$1 = _el$5.nextSibling, _el$10 = _el$1.firstChild, _el$12 = _el$10.nextSibling;
|
|
40
|
+
_el$12.nextSibling;
|
|
41
|
+
insert(_el$6, () => props.component.type);
|
|
42
|
+
insert(_el$4, createComponent(Show, {
|
|
43
|
+
get when() {
|
|
44
|
+
return params == null ? void 0 : params.title;
|
|
45
|
+
},
|
|
46
|
+
get children() {
|
|
47
|
+
var _el$7 = _tmpl$2();
|
|
48
|
+
insert(_el$7, () => params.title);
|
|
49
|
+
return _el$7;
|
|
50
|
+
}
|
|
51
|
+
}), _el$1);
|
|
52
|
+
insert(_el$4, createComponent(Show, {
|
|
53
|
+
get when() {
|
|
54
|
+
return memo(() => props.component.type === "metric")() && (params == null ? void 0 : params.value);
|
|
55
|
+
},
|
|
56
|
+
get children() {
|
|
57
|
+
var _el$8 = _tmpl$4(), _el$9 = _el$8.firstChild;
|
|
58
|
+
insert(_el$9, () => params.value);
|
|
59
|
+
insert(_el$8, createComponent(Show, {
|
|
60
|
+
get when() {
|
|
61
|
+
return params.unit;
|
|
62
|
+
},
|
|
63
|
+
get children() {
|
|
64
|
+
var _el$0 = _tmpl$3();
|
|
65
|
+
insert(_el$0, () => params.unit);
|
|
66
|
+
return _el$0;
|
|
67
|
+
}
|
|
68
|
+
}), null);
|
|
69
|
+
return _el$8;
|
|
70
|
+
}
|
|
71
|
+
}), _el$1);
|
|
72
|
+
insert(_el$1, () => props.component.id.slice(0, 8), _el$12);
|
|
73
|
+
return _el$4;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function StreamingUIRenderer(props) {
|
|
78
|
+
const {
|
|
79
|
+
components,
|
|
80
|
+
isLoading,
|
|
81
|
+
isStreaming,
|
|
82
|
+
error,
|
|
83
|
+
progress,
|
|
84
|
+
metadata,
|
|
85
|
+
startStreaming
|
|
86
|
+
} = useStreamingUI({
|
|
87
|
+
query: props.query,
|
|
88
|
+
spaceIds: props.spaceIds,
|
|
89
|
+
sessionId: props.sessionId,
|
|
90
|
+
options: props.options,
|
|
91
|
+
onComplete: props.onComplete,
|
|
92
|
+
onError: props.onError,
|
|
93
|
+
onComponentReceived: props.onComponentReceived
|
|
94
|
+
});
|
|
95
|
+
const [animatingComponents, setAnimatingComponents] = createSignal(/* @__PURE__ */ new Set());
|
|
96
|
+
const handleComponentRender = (componentId) => {
|
|
97
|
+
setAnimatingComponents((prev) => /* @__PURE__ */ new Set([...prev, componentId]));
|
|
98
|
+
setTimeout(() => {
|
|
99
|
+
setAnimatingComponents((prev) => {
|
|
100
|
+
const next = new Set(prev);
|
|
101
|
+
next.delete(componentId);
|
|
102
|
+
return next;
|
|
103
|
+
});
|
|
104
|
+
}, 500);
|
|
105
|
+
};
|
|
106
|
+
return (() => {
|
|
107
|
+
var _el$13 = _tmpl$12(), _el$28 = _el$13.firstChild;
|
|
108
|
+
insert(_el$13, createComponent(Show, {
|
|
109
|
+
get when() {
|
|
110
|
+
return memo(() => props.showProgress !== false)() && (isLoading() || isStreaming());
|
|
111
|
+
},
|
|
112
|
+
get children() {
|
|
113
|
+
var _el$14 = _tmpl$8(), _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild, _el$19 = _el$15.nextSibling, _el$20 = _el$19.firstChild;
|
|
114
|
+
insert(_el$16, () => progress().message);
|
|
115
|
+
insert(_el$15, createComponent(Show, {
|
|
116
|
+
get when() {
|
|
117
|
+
return progress().totalCount !== null;
|
|
118
|
+
},
|
|
119
|
+
get children() {
|
|
120
|
+
var _el$17 = _tmpl$6(), _el$18 = _el$17.firstChild;
|
|
121
|
+
insert(_el$17, () => progress().receivedCount, _el$18);
|
|
122
|
+
insert(_el$17, () => progress().totalCount, null);
|
|
123
|
+
return _el$17;
|
|
124
|
+
}
|
|
125
|
+
}), null);
|
|
126
|
+
insert(_el$14, createComponent(Show, {
|
|
127
|
+
get when() {
|
|
128
|
+
return memo(() => progress().totalCount === null)() && isStreaming();
|
|
129
|
+
},
|
|
130
|
+
get children() {
|
|
131
|
+
return _tmpl$7();
|
|
132
|
+
}
|
|
133
|
+
}), null);
|
|
134
|
+
effect((_$p) => setStyleProperty(_el$20, "width", progress().totalCount !== null ? `${progress().receivedCount / progress().totalCount * 100}%` : "0%"));
|
|
135
|
+
return _el$14;
|
|
136
|
+
}
|
|
137
|
+
}), _el$28);
|
|
138
|
+
insert(_el$13, createComponent(Show, {
|
|
139
|
+
get when() {
|
|
140
|
+
return error();
|
|
141
|
+
},
|
|
142
|
+
get children() {
|
|
143
|
+
var _el$22 = _tmpl$0(), _el$23 = _el$22.firstChild, _el$24 = _el$23.firstChild, _el$25 = _el$24.nextSibling, _el$26 = _el$23.nextSibling;
|
|
144
|
+
insert(_el$25, () => {
|
|
145
|
+
var _a;
|
|
146
|
+
return (_a = error()) == null ? void 0 : _a.error;
|
|
147
|
+
});
|
|
148
|
+
insert(_el$26, () => {
|
|
149
|
+
var _a;
|
|
150
|
+
return (_a = error()) == null ? void 0 : _a.message;
|
|
151
|
+
});
|
|
152
|
+
insert(_el$22, createComponent(Show, {
|
|
153
|
+
get when() {
|
|
154
|
+
var _a;
|
|
155
|
+
return (_a = error()) == null ? void 0 : _a.recoverable;
|
|
156
|
+
},
|
|
157
|
+
get children() {
|
|
158
|
+
var _el$27 = _tmpl$9();
|
|
159
|
+
_el$27.$$click = () => startStreaming();
|
|
160
|
+
return _el$27;
|
|
161
|
+
}
|
|
162
|
+
}), null);
|
|
163
|
+
return _el$22;
|
|
164
|
+
}
|
|
165
|
+
}), _el$28);
|
|
166
|
+
insert(_el$28, createComponent(For, {
|
|
167
|
+
get each() {
|
|
168
|
+
return components();
|
|
169
|
+
},
|
|
170
|
+
children: (component) => (() => {
|
|
171
|
+
var _el$50 = _tmpl$13();
|
|
172
|
+
use(() => handleComponentRender(component.id), _el$50);
|
|
173
|
+
insert(_el$50, createComponent(StreamingComponentRenderer, {
|
|
174
|
+
component,
|
|
175
|
+
get onError() {
|
|
176
|
+
return props.onRenderError;
|
|
177
|
+
}
|
|
178
|
+
}));
|
|
179
|
+
effect((_p$) => {
|
|
180
|
+
var _v$ = `
|
|
181
|
+
col-span-${component.position.colSpan}
|
|
182
|
+
${animatingComponents().has(component.id) ? "animate-fade-in-up" : ""}
|
|
183
|
+
`, _v$2 = component.position.colStart, _v$3 = component.position.colStart + component.position.colSpan;
|
|
184
|
+
_v$ !== _p$.e && className(_el$50, _p$.e = _v$);
|
|
185
|
+
_v$2 !== _p$.t && setStyleProperty(_el$50, "grid-column-start", _p$.t = _v$2);
|
|
186
|
+
_v$3 !== _p$.a && setStyleProperty(_el$50, "grid-column-end", _p$.a = _v$3);
|
|
187
|
+
return _p$;
|
|
188
|
+
}, {
|
|
189
|
+
e: void 0,
|
|
190
|
+
t: void 0,
|
|
191
|
+
a: void 0
|
|
192
|
+
});
|
|
193
|
+
return _el$50;
|
|
194
|
+
})()
|
|
195
|
+
}), null);
|
|
196
|
+
insert(_el$28, createComponent(Show, {
|
|
197
|
+
get when() {
|
|
198
|
+
return memo(() => !!isStreaming())() && progress().totalCount !== null;
|
|
199
|
+
},
|
|
200
|
+
get children() {
|
|
201
|
+
return createComponent(For, {
|
|
202
|
+
get each() {
|
|
203
|
+
return Array.from({
|
|
204
|
+
length: progress().totalCount - progress().receivedCount
|
|
205
|
+
});
|
|
206
|
+
},
|
|
207
|
+
children: () => createComponent(SkeletonComponent, {})
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}), null);
|
|
211
|
+
insert(_el$13, createComponent(Show, {
|
|
212
|
+
get when() {
|
|
213
|
+
return memo(() => props.showMetadata !== false)() && metadata();
|
|
214
|
+
},
|
|
215
|
+
get children() {
|
|
216
|
+
var _el$29 = _tmpl$11(), _el$30 = _el$29.firstChild, _el$31 = _el$30.firstChild, _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling, _el$34 = _el$31.nextSibling, _el$35 = _el$34.firstChild, _el$36 = _el$35.nextSibling, _el$37 = _el$34.nextSibling, _el$38 = _el$37.firstChild, _el$39 = _el$38.nextSibling, _el$40 = _el$39.firstChild, _el$45 = _el$37.nextSibling, _el$46 = _el$45.firstChild, _el$47 = _el$46.nextSibling, _el$48 = _el$47.firstChild;
|
|
217
|
+
insert(_el$33, () => {
|
|
218
|
+
var _a;
|
|
219
|
+
return (_a = metadata()) == null ? void 0 : _a.provider;
|
|
220
|
+
});
|
|
221
|
+
insert(_el$36, () => {
|
|
222
|
+
var _a;
|
|
223
|
+
return (_a = metadata()) == null ? void 0 : _a.model;
|
|
224
|
+
});
|
|
225
|
+
insert(_el$39, () => {
|
|
226
|
+
var _a;
|
|
227
|
+
return (_a = metadata()) == null ? void 0 : _a.executionTimeMs;
|
|
228
|
+
}, _el$40);
|
|
229
|
+
insert(_el$30, createComponent(Show, {
|
|
230
|
+
get when() {
|
|
231
|
+
var _a;
|
|
232
|
+
return ((_a = metadata()) == null ? void 0 : _a.costUSD) !== void 0;
|
|
233
|
+
},
|
|
234
|
+
get children() {
|
|
235
|
+
var _el$41 = _tmpl$1(), _el$42 = _el$41.firstChild, _el$43 = _el$42.nextSibling;
|
|
236
|
+
_el$43.firstChild;
|
|
237
|
+
insert(_el$43, () => {
|
|
238
|
+
var _a, _b;
|
|
239
|
+
return (_b = (_a = metadata()) == null ? void 0 : _a.costUSD) == null ? void 0 : _b.toFixed(4);
|
|
240
|
+
}, null);
|
|
241
|
+
return _el$41;
|
|
242
|
+
}
|
|
243
|
+
}), _el$45);
|
|
244
|
+
insert(_el$47, () => {
|
|
245
|
+
var _a;
|
|
246
|
+
return (_a = metadata()) == null ? void 0 : _a.firstTokenMs;
|
|
247
|
+
}, _el$48);
|
|
248
|
+
insert(_el$30, createComponent(Show, {
|
|
249
|
+
get when() {
|
|
250
|
+
var _a;
|
|
251
|
+
return (_a = metadata()) == null ? void 0 : _a.cached;
|
|
252
|
+
},
|
|
253
|
+
get children() {
|
|
254
|
+
return _tmpl$10();
|
|
255
|
+
}
|
|
256
|
+
}), null);
|
|
257
|
+
return _el$29;
|
|
258
|
+
}
|
|
259
|
+
}), null);
|
|
260
|
+
effect(() => className(_el$13, `streaming-ui-renderer ${props.class || ""}`));
|
|
261
|
+
return _el$13;
|
|
262
|
+
})();
|
|
263
|
+
}
|
|
264
|
+
function SkeletonComponent() {
|
|
265
|
+
return _tmpl$14();
|
|
266
|
+
}
|
|
267
|
+
delegateEvents(["click"]);
|
|
268
|
+
export {
|
|
269
|
+
StreamingUIRenderer
|
|
270
|
+
};
|
|
271
|
+
//# sourceMappingURL=StreamingUIRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamingUIRenderer.js","sources":["../../src/components/StreamingUIRenderer.tsx"],"sourcesContent":["/**\n * StreamingUIRenderer Component - Phase 2\n *\n * Renders streaming dashboard components with skeleton states and progress indicators.\n * Uses the useStreamingUI hook for SSE connection and state management.\n *\n * Features:\n * - Skeleton loading states while components stream\n * - Progress bar and status messages\n * - Smooth component animations on arrival\n * - Error handling with retry capability\n * - Responsive 12-column grid layout\n *\n * Usage:\n * ```tsx\n * <StreamingUIRenderer\n * query=\"Show me revenue trends\"\n * spaceIds={['uuid1', 'uuid2']}\n * onComplete={(metadata) => console.log('Done!', metadata)}\n * />\n * ```\n */\n\nimport { Show, For, createSignal } from 'solid-js'\nimport { useStreamingUI, type UseStreamingUIOptions } from '../hooks/useStreamingUI'\nimport type { UIComponent, RendererError } from '../types'\nimport { validateComponent } from '../services/validation'\nimport { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary'\n\nexport interface StreamingUIRendererProps extends UseStreamingUIOptions {\n class?: string\n showProgress?: boolean\n showMetadata?: boolean\n onRenderError?: (error: RendererError) => void\n}\n\n/**\n * Component Renderer - Inline lightweight version\n * (Full implementation in UIResourceRenderer)\n */\nfunction StreamingComponentRenderer(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 bg-error-subtle border border-border-error rounded-lg p-4\">\n <p class=\"text-sm font-medium text-error-primary\">Validation Error</p>\n <p class=\"text-xs text-text-secondary mt-1\">\n {validation.errors?.[0]?.message || 'Unknown validation error'}\n </p>\n </div>\n )\n }\n\n // Simplified renderer - just show component type and title\n // Full rendering logic in UIResourceRenderer\n const params = props.component.params as any\n\n return (\n <GenerativeUIErrorBoundary\n componentId={props.component.id}\n componentType={props.component.type}\n onError={props.onError}\n allowRetry={false}\n >\n <div class=\"w-full bg-surface-secondary border border-border-subtle rounded-lg p-4\">\n <div class=\"flex items-center gap-2 mb-2\">\n <span class=\"text-xs font-medium text-text-tertiary uppercase\">\n {props.component.type}\n </span>\n </div>\n <Show when={params?.title}>\n <h3 class=\"text-sm font-semibold text-text-primary\">{params.title}</h3>\n </Show>\n <Show when={props.component.type === 'metric' && params?.value}>\n <div class=\"mt-2\">\n <p class=\"text-2xl font-semibold text-text-primary\">{params.value}</p>\n <Show when={params.unit}>\n <span class=\"text-sm text-text-secondary\">{params.unit}</span>\n </Show>\n </div>\n </Show>\n <div class=\"mt-3 text-xs text-text-tertiary\">\n Component ID: {props.component.id.slice(0, 8)}...\n </div>\n </div>\n </GenerativeUIErrorBoundary>\n )\n}\n\nexport function StreamingUIRenderer(props: StreamingUIRendererProps) {\n const { components, isLoading, isStreaming, error, progress, metadata, startStreaming } =\n useStreamingUI({\n query: props.query,\n spaceIds: props.spaceIds,\n sessionId: props.sessionId,\n options: props.options,\n onComplete: props.onComplete,\n onError: props.onError,\n onComponentReceived: props.onComponentReceived,\n })\n\n const [animatingComponents, setAnimatingComponents] = createSignal<Set<string>>(new Set())\n\n // Track new components for animation\n const handleComponentRender = (componentId: string) => {\n setAnimatingComponents((prev) => new Set([...prev, componentId]))\n\n // Remove from animating set after animation completes\n setTimeout(() => {\n setAnimatingComponents((prev) => {\n const next = new Set(prev)\n next.delete(componentId)\n return next\n })\n }, 500)\n }\n\n return (\n <div class={`streaming-ui-renderer ${props.class || ''}`}>\n {/* Progress Bar */}\n <Show when={props.showProgress !== false && (isLoading() || isStreaming())}>\n <div class=\"mb-4 rounded-lg border border-border-subtle bg-surface-secondary p-4\">\n {/* Status Message */}\n <div class=\"mb-2 flex items-center justify-between\">\n <span class=\"text-sm font-medium text-text-primary\">{progress().message}</span>\n <Show when={progress().totalCount !== null}>\n <span class=\"text-sm text-text-secondary\">\n {progress().receivedCount} / {progress().totalCount}\n </span>\n </Show>\n </div>\n\n {/* Progress Bar */}\n <div class=\"h-2 w-full overflow-hidden rounded-full bg-surface-tertiary\">\n <div\n class=\"h-full bg-brand-primary transition-all duration-300 ease-out\"\n style={{\n width:\n progress().totalCount !== null\n ? `${(progress().receivedCount / progress().totalCount!) * 100}%`\n : '0%',\n }}\n />\n </div>\n\n {/* Indeterminate Progress (when totalCount unknown) */}\n <Show when={progress().totalCount === null && isStreaming()}>\n <div class=\"mt-2\">\n <div class=\"h-1 w-full overflow-hidden rounded-full bg-surface-tertiary\">\n <div class=\"animate-progress-indeterminate h-full w-1/3 bg-brand-primary\" />\n </div>\n </div>\n </Show>\n </div>\n </Show>\n\n {/* Error State */}\n <Show when={error()}>\n <div class=\"mb-4 rounded-lg border border-border-error bg-error-subtle p-4\">\n <div class=\"mb-2 flex items-center gap-2\">\n <svg\n class=\"h-5 w-5 text-error-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span class=\"font-medium text-error-primary\">{error()?.error}</span>\n </div>\n <p class=\"text-sm text-text-secondary\">{error()?.message}</p>\n\n {/* Retry Button (if recoverable) */}\n <Show when={error()?.recoverable}>\n <button\n type=\"button\"\n class=\"mt-3 rounded-md bg-error-primary px-3 py-1.5 text-sm font-medium text-white hover:bg-error-hover\"\n onClick={() => startStreaming()}\n >\n Retry\n </button>\n </Show>\n </div>\n </Show>\n\n {/* Components Grid */}\n <div class=\"grid grid-cols-12 gap-4\">\n {/* Render received components */}\n <For each={components()}>\n {(component) => (\n <div\n ref={() => handleComponentRender(component.id)}\n class={`\n col-span-${component.position.colSpan}\n ${animatingComponents().has(component.id) ? 'animate-fade-in-up' : ''}\n `}\n style={{\n 'grid-column-start': component.position.colStart,\n 'grid-column-end': component.position.colStart + component.position.colSpan,\n }}\n >\n <StreamingComponentRenderer component={component} onError={props.onRenderError} />\n </div>\n )}\n </For>\n\n {/* Skeleton placeholders (if streaming and expecting more) */}\n <Show when={isStreaming() && progress().totalCount !== null}>\n <For\n each={Array.from({\n length: progress().totalCount! - progress().receivedCount,\n })}\n >\n {() => <SkeletonComponent />}\n </For>\n </Show>\n </div>\n\n {/* Metadata Display */}\n <Show when={props.showMetadata !== false && metadata()}>\n <div class=\"mt-6 rounded-lg border border-border-subtle bg-surface-secondary p-4 text-sm text-text-secondary\">\n <div class=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n <div>\n <div class=\"font-medium text-text-primary\">Provider</div>\n <div>{metadata()?.provider}</div>\n </div>\n <div>\n <div class=\"font-medium text-text-primary\">Model</div>\n <div>{metadata()?.model}</div>\n </div>\n <div>\n <div class=\"font-medium text-text-primary\">Execution Time</div>\n <div>{metadata()?.executionTimeMs}ms</div>\n </div>\n <Show when={metadata()?.costUSD !== undefined}>\n <div>\n <div class=\"font-medium text-text-primary\">Cost</div>\n <div>${metadata()?.costUSD?.toFixed(4)}</div>\n </div>\n </Show>\n <div>\n <div class=\"font-medium text-text-primary\">TTFB</div>\n <div>{metadata()?.firstTokenMs}ms</div>\n </div>\n <Show when={metadata()?.cached}>\n <div>\n <div class=\"font-medium text-text-primary\">Cached</div>\n <div class=\"text-success-primary\">Yes</div>\n </div>\n </Show>\n </div>\n </div>\n </Show>\n </div>\n )\n}\n\n/**\n * Skeleton Component - Placeholder while components load\n */\nfunction SkeletonComponent() {\n return (\n <div class=\"col-span-12 md:col-span-6 lg:col-span-4\">\n <div class=\"animate-pulse rounded-lg border border-border-subtle bg-surface-secondary p-4\">\n {/* Header skeleton */}\n <div class=\"mb-4 h-6 w-1/2 rounded bg-surface-tertiary\" />\n\n {/* Content skeleton */}\n <div class=\"space-y-3\">\n <div class=\"h-4 rounded bg-surface-tertiary\" />\n <div class=\"h-4 w-5/6 rounded bg-surface-tertiary\" />\n <div class=\"h-4 w-4/6 rounded bg-surface-tertiary\" />\n </div>\n\n {/* Chart/visual skeleton */}\n <div class=\"mt-4 h-32 rounded bg-surface-tertiary\" />\n </div>\n </div>\n )\n}\n\n// CSS Animations (add to global styles or Tailwind config)\n/*\n@keyframes fade-in-up {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes progress-indeterminate {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(400%);\n }\n}\n\n.animate-fade-in-up {\n animation: fade-in-up 0.5s ease-out;\n}\n\n.animate-progress-indeterminate {\n animation: progress-indeterminate 1.5s infinite ease-in-out;\n}\n*/\n"],"names":["StreamingComponentRenderer","props","validation","validateComponent","component","valid","onError","type","message","componentId","id","details","errors","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_$insert","params","_$createComponent","GenerativeUIErrorBoundary","componentType","allowRetry","children","_el$4","_tmpl$5","_el$5","_el$6","_el$1","_el$10","_el$12","Show","when","title","_el$7","_tmpl$2","_$memo","value","_el$8","_tmpl$4","_el$9","unit","_el$0","_tmpl$3","slice","StreamingUIRenderer","components","isLoading","isStreaming","error","progress","metadata","startStreaming","useStreamingUI","query","spaceIds","sessionId","options","onComplete","onComponentReceived","animatingComponents","setAnimatingComponents","createSignal","Set","handleComponentRender","prev","setTimeout","next","delete","_el$13","_tmpl$12","_el$28","showProgress","_el$14","_tmpl$8","_el$15","_el$16","_el$19","_el$20","totalCount","_el$17","_tmpl$6","_el$18","receivedCount","_tmpl$7","_$effect","_$p","_$setStyleProperty","_el$22","_tmpl$0","_el$23","_el$24","_el$25","_el$26","recoverable","_el$27","_tmpl$9","$$click","For","each","_el$50","_tmpl$13","_$use","onRenderError","_p$","_v$","position","colSpan","has","_v$2","colStart","_v$3","e","_$className","t","a","undefined","Array","from","length","SkeletonComponent","showMetadata","_el$29","_tmpl$11","_el$30","_el$31","_el$32","_el$33","_el$34","_el$35","_el$36","_el$37","_el$38","_el$39","_el$40","_el$45","_el$46","_el$47","_el$48","provider","model","executionTimeMs","costUSD","_el$41","_tmpl$1","_el$42","_el$43","toFixed","firstTokenMs","cached","_tmpl$10","class","_tmpl$14","_$delegateEvents"],"mappings":"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"}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const web = require("solid-js/web");
|
|
4
|
+
const solidJs = require("solid-js");
|
|
5
|
+
const validation = require("../services/validation.cjs");
|
|
6
|
+
const GenerativeUIErrorBoundary = require("./GenerativeUIErrorBoundary.cjs");
|
|
7
|
+
var _tmpl$ = /* @__PURE__ */ web.template(`<div class="absolute inset-0 flex items-center justify-center"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600">`), _tmpl$2 = /* @__PURE__ */ web.template(`<div class="absolute inset-0 flex items-center justify-center p-4"><div class=text-center><p class="text-red-600 dark:text-red-400 text-sm font-medium">Chart Error</p><p class="text-gray-600 dark:text-gray-400 text-xs mt-1">`), _tmpl$3 = /* @__PURE__ */ web.template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$4 = /* @__PURE__ */ web.template(`<div class="w-full h-full p-4"><div class="w-full h-full"><img alt="Chart visualization"class="w-full h-auto max-h-[300px] object-contain">`), _tmpl$5 = /* @__PURE__ */ web.template(`<div class="relative w-full h-full min-h-[300px] bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden">`), _tmpl$6 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>Showing <!> - <!> of `), _tmpl$7 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><div class=p-4><div class=overflow-x-auto><table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700"><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">`), _tmpl$8 = /* @__PURE__ */ web.template(`<th scope=col class="px-4 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">`), _tmpl$9 = /* @__PURE__ */ web.template(`<tr class="hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors">`), _tmpl$0 = /* @__PURE__ */ web.template(`<td class="px-4 py-3 text-sm text-gray-900 dark:text-gray-100 whitespace-nowrap">`), _tmpl$1 = /* @__PURE__ */ web.template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$10 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center"><span> <!>%`), _tmpl$11 = /* @__PURE__ */ web.template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$12 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4"><div class="flex flex-col h-full justify-between"><div><p class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide"></p><div class="mt-2 flex items-baseline"><p class="text-2xl font-semibold text-gray-900 dark:text-white">`), _tmpl$13 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4"><div>`), _tmpl$14 = /* @__PURE__ */ web.template(`<div class="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$15 = /* @__PURE__ */ web.template(`<div><div class="grid gap-4">`), _tmpl$16 = /* @__PURE__ */ web.template(`<div>`);
|
|
8
|
+
function ChartRenderer(props) {
|
|
9
|
+
const [iframeUrl, setIframeUrl] = solidJs.createSignal();
|
|
10
|
+
const [isLoading, setIsLoading] = solidJs.createSignal(true);
|
|
11
|
+
const [error, setError] = solidJs.createSignal();
|
|
12
|
+
solidJs.onMount(() => {
|
|
13
|
+
const chartParams = props.component.params;
|
|
14
|
+
const chartConfig = {
|
|
15
|
+
type: chartParams.type,
|
|
16
|
+
data: chartParams.data,
|
|
17
|
+
options: {
|
|
18
|
+
...chartParams.options,
|
|
19
|
+
responsive: true,
|
|
20
|
+
maintainAspectRatio: false
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const configStr = encodeURIComponent(JSON.stringify(chartConfig));
|
|
24
|
+
const url = `https://quickchart.io/chart?c=${configStr}&width=500&height=300&devicePixelRatio=2`;
|
|
25
|
+
setIframeUrl(url);
|
|
26
|
+
setIsLoading(false);
|
|
27
|
+
});
|
|
28
|
+
return (() => {
|
|
29
|
+
var _el$ = _tmpl$5();
|
|
30
|
+
web.insert(_el$, web.createComponent(solidJs.Show, {
|
|
31
|
+
get when() {
|
|
32
|
+
return isLoading();
|
|
33
|
+
},
|
|
34
|
+
get children() {
|
|
35
|
+
return _tmpl$();
|
|
36
|
+
}
|
|
37
|
+
}), null);
|
|
38
|
+
web.insert(_el$, web.createComponent(solidJs.Show, {
|
|
39
|
+
get when() {
|
|
40
|
+
return error();
|
|
41
|
+
},
|
|
42
|
+
get children() {
|
|
43
|
+
var _el$3 = _tmpl$2(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling;
|
|
44
|
+
web.insert(_el$6, error);
|
|
45
|
+
return _el$3;
|
|
46
|
+
}
|
|
47
|
+
}), null);
|
|
48
|
+
web.insert(_el$, web.createComponent(solidJs.Show, {
|
|
49
|
+
get when() {
|
|
50
|
+
return web.memo(() => !!iframeUrl())() && !error();
|
|
51
|
+
},
|
|
52
|
+
get children() {
|
|
53
|
+
var _el$7 = _tmpl$4(), _el$9 = _el$7.firstChild, _el$0 = _el$9.firstChild;
|
|
54
|
+
web.insert(_el$7, web.createComponent(solidJs.Show, {
|
|
55
|
+
get when() {
|
|
56
|
+
return props.component.params.title;
|
|
57
|
+
},
|
|
58
|
+
get children() {
|
|
59
|
+
var _el$8 = _tmpl$3();
|
|
60
|
+
web.insert(_el$8, () => props.component.params.title);
|
|
61
|
+
return _el$8;
|
|
62
|
+
}
|
|
63
|
+
}), _el$9);
|
|
64
|
+
_el$0.addEventListener("error", () => {
|
|
65
|
+
var _a;
|
|
66
|
+
setError("Failed to load chart");
|
|
67
|
+
(_a = props.onError) == null ? void 0 : _a.call(props, {
|
|
68
|
+
type: "render",
|
|
69
|
+
message: "Chart rendering failed",
|
|
70
|
+
componentId: props.component.id
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
web.effect(() => web.setAttribute(_el$0, "src", iframeUrl()));
|
|
74
|
+
return _el$7;
|
|
75
|
+
}
|
|
76
|
+
}), null);
|
|
77
|
+
return _el$;
|
|
78
|
+
})();
|
|
79
|
+
}
|
|
80
|
+
function TableRenderer(props) {
|
|
81
|
+
const tableParams = props.component.params;
|
|
82
|
+
return (() => {
|
|
83
|
+
var _el$1 = _tmpl$7(), _el$10 = _el$1.firstChild, _el$12 = _el$10.firstChild, _el$13 = _el$12.firstChild, _el$14 = _el$13.firstChild, _el$15 = _el$14.firstChild, _el$16 = _el$14.nextSibling;
|
|
84
|
+
web.insert(_el$10, web.createComponent(solidJs.Show, {
|
|
85
|
+
get when() {
|
|
86
|
+
return tableParams.title;
|
|
87
|
+
},
|
|
88
|
+
get children() {
|
|
89
|
+
var _el$11 = _tmpl$3();
|
|
90
|
+
web.insert(_el$11, () => tableParams.title);
|
|
91
|
+
return _el$11;
|
|
92
|
+
}
|
|
93
|
+
}), _el$12);
|
|
94
|
+
web.insert(_el$15, web.createComponent(solidJs.For, {
|
|
95
|
+
get each() {
|
|
96
|
+
return tableParams.columns;
|
|
97
|
+
},
|
|
98
|
+
children: (column) => (() => {
|
|
99
|
+
var _el$26 = _tmpl$8();
|
|
100
|
+
web.insert(_el$26, () => column.label);
|
|
101
|
+
web.effect((_$p) => web.style(_el$26, column.width ? {
|
|
102
|
+
width: column.width
|
|
103
|
+
} : {}, _$p));
|
|
104
|
+
return _el$26;
|
|
105
|
+
})()
|
|
106
|
+
}));
|
|
107
|
+
web.insert(_el$16, web.createComponent(solidJs.For, {
|
|
108
|
+
get each() {
|
|
109
|
+
return tableParams.rows.slice(0, validation.DEFAULT_RESOURCE_LIMITS.maxTableRows);
|
|
110
|
+
},
|
|
111
|
+
children: (row) => (() => {
|
|
112
|
+
var _el$27 = _tmpl$9();
|
|
113
|
+
web.insert(_el$27, web.createComponent(solidJs.For, {
|
|
114
|
+
get each() {
|
|
115
|
+
return tableParams.columns;
|
|
116
|
+
},
|
|
117
|
+
children: (column) => (() => {
|
|
118
|
+
var _el$28 = _tmpl$0();
|
|
119
|
+
web.insert(_el$28, () => row[column.key] || "-");
|
|
120
|
+
return _el$28;
|
|
121
|
+
})()
|
|
122
|
+
}));
|
|
123
|
+
return _el$27;
|
|
124
|
+
})()
|
|
125
|
+
}));
|
|
126
|
+
web.insert(_el$10, web.createComponent(solidJs.Show, {
|
|
127
|
+
get when() {
|
|
128
|
+
return tableParams.pagination;
|
|
129
|
+
},
|
|
130
|
+
get children() {
|
|
131
|
+
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;
|
|
132
|
+
_el$25.nextSibling;
|
|
133
|
+
web.insert(_el$18, () => tableParams.pagination.currentPage * tableParams.pagination.pageSize + 1, _el$24);
|
|
134
|
+
web.insert(_el$18, () => Math.min((tableParams.pagination.currentPage + 1) * tableParams.pagination.pageSize, tableParams.pagination.totalRows), _el$25);
|
|
135
|
+
web.insert(_el$18, () => tableParams.pagination.totalRows, null);
|
|
136
|
+
return _el$17;
|
|
137
|
+
}
|
|
138
|
+
}), null);
|
|
139
|
+
return _el$1;
|
|
140
|
+
})();
|
|
141
|
+
}
|
|
142
|
+
function MetricRenderer(props) {
|
|
143
|
+
const metricParams = props.component.params;
|
|
144
|
+
return (() => {
|
|
145
|
+
var _el$29 = _tmpl$12(), _el$30 = _el$29.firstChild, _el$31 = _el$30.firstChild, _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling, _el$34 = _el$33.firstChild;
|
|
146
|
+
web.insert(_el$32, () => metricParams.title);
|
|
147
|
+
web.insert(_el$34, () => metricParams.value);
|
|
148
|
+
web.insert(_el$33, web.createComponent(solidJs.Show, {
|
|
149
|
+
get when() {
|
|
150
|
+
return metricParams.unit;
|
|
151
|
+
},
|
|
152
|
+
get children() {
|
|
153
|
+
var _el$35 = _tmpl$1();
|
|
154
|
+
web.insert(_el$35, () => metricParams.unit);
|
|
155
|
+
return _el$35;
|
|
156
|
+
}
|
|
157
|
+
}), null);
|
|
158
|
+
web.insert(_el$30, web.createComponent(solidJs.Show, {
|
|
159
|
+
get when() {
|
|
160
|
+
return metricParams.trend;
|
|
161
|
+
},
|
|
162
|
+
get children() {
|
|
163
|
+
var _el$36 = _tmpl$10(), _el$37 = _el$36.firstChild, _el$38 = _el$37.firstChild, _el$40 = _el$38.nextSibling;
|
|
164
|
+
_el$40.nextSibling;
|
|
165
|
+
web.insert(_el$37, (() => {
|
|
166
|
+
var _c$ = web.memo(() => metricParams.trend.direction === "up");
|
|
167
|
+
return () => _c$() ? "�" : metricParams.trend.direction === "down" ? "�" : "�";
|
|
168
|
+
})(), _el$38);
|
|
169
|
+
web.insert(_el$37, () => Math.abs(metricParams.trend.value), _el$40);
|
|
170
|
+
web.effect(() => web.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"}`));
|
|
171
|
+
return _el$36;
|
|
172
|
+
}
|
|
173
|
+
}), null);
|
|
174
|
+
web.insert(_el$30, web.createComponent(solidJs.Show, {
|
|
175
|
+
get when() {
|
|
176
|
+
return metricParams.subtitle;
|
|
177
|
+
},
|
|
178
|
+
get children() {
|
|
179
|
+
var _el$41 = _tmpl$11();
|
|
180
|
+
web.insert(_el$41, () => metricParams.subtitle);
|
|
181
|
+
return _el$41;
|
|
182
|
+
}
|
|
183
|
+
}), null);
|
|
184
|
+
return _el$29;
|
|
185
|
+
})();
|
|
186
|
+
}
|
|
187
|
+
function TextRenderer(props) {
|
|
188
|
+
const textParams = props.component.params;
|
|
189
|
+
return (() => {
|
|
190
|
+
var _el$42 = _tmpl$13(), _el$43 = _el$42.firstChild;
|
|
191
|
+
web.effect((_p$) => {
|
|
192
|
+
var _v$ = `prose prose-sm dark:prose-invert max-w-none ${textParams.className || ""}`, _v$2 = textParams.content;
|
|
193
|
+
_v$ !== _p$.e && web.className(_el$43, _p$.e = _v$);
|
|
194
|
+
_v$2 !== _p$.t && (_el$43.innerHTML = _p$.t = _v$2);
|
|
195
|
+
return _p$;
|
|
196
|
+
}, {
|
|
197
|
+
e: void 0,
|
|
198
|
+
t: void 0
|
|
199
|
+
});
|
|
200
|
+
return _el$42;
|
|
201
|
+
})();
|
|
202
|
+
}
|
|
203
|
+
function ComponentRenderer(props) {
|
|
204
|
+
var _a;
|
|
205
|
+
const validation$1 = validation.validateComponent(props.component);
|
|
206
|
+
if (!validation$1.valid) {
|
|
207
|
+
(_a = props.onError) == null ? void 0 : _a.call(props, {
|
|
208
|
+
type: "validation",
|
|
209
|
+
message: "Component validation failed",
|
|
210
|
+
componentId: props.component.id,
|
|
211
|
+
details: validation$1.errors
|
|
212
|
+
});
|
|
213
|
+
return (() => {
|
|
214
|
+
var _el$44 = _tmpl$14(), _el$45 = _el$44.firstChild, _el$46 = _el$45.nextSibling;
|
|
215
|
+
web.insert(_el$46, () => {
|
|
216
|
+
var _a2, _b;
|
|
217
|
+
return ((_b = (_a2 = validation$1.errors) == null ? void 0 : _a2[0]) == null ? void 0 : _b.message) || "Unknown validation error";
|
|
218
|
+
});
|
|
219
|
+
return _el$44;
|
|
220
|
+
})();
|
|
221
|
+
}
|
|
222
|
+
return web.createComponent(GenerativeUIErrorBoundary.GenerativeUIErrorBoundary, {
|
|
223
|
+
get componentId() {
|
|
224
|
+
return props.component.id;
|
|
225
|
+
},
|
|
226
|
+
get componentType() {
|
|
227
|
+
return props.component.type;
|
|
228
|
+
},
|
|
229
|
+
get onError() {
|
|
230
|
+
return props.onError;
|
|
231
|
+
},
|
|
232
|
+
allowRetry: true,
|
|
233
|
+
get children() {
|
|
234
|
+
return [web.createComponent(solidJs.Show, {
|
|
235
|
+
get when() {
|
|
236
|
+
return props.component.type === "chart";
|
|
237
|
+
},
|
|
238
|
+
get children() {
|
|
239
|
+
return web.createComponent(ChartRenderer, {
|
|
240
|
+
get component() {
|
|
241
|
+
return props.component;
|
|
242
|
+
},
|
|
243
|
+
get onError() {
|
|
244
|
+
return props.onError;
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}), web.createComponent(solidJs.Show, {
|
|
249
|
+
get when() {
|
|
250
|
+
return props.component.type === "table";
|
|
251
|
+
},
|
|
252
|
+
get children() {
|
|
253
|
+
return web.createComponent(TableRenderer, {
|
|
254
|
+
get component() {
|
|
255
|
+
return props.component;
|
|
256
|
+
},
|
|
257
|
+
get onError() {
|
|
258
|
+
return props.onError;
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}), web.createComponent(solidJs.Show, {
|
|
263
|
+
get when() {
|
|
264
|
+
return props.component.type === "metric";
|
|
265
|
+
},
|
|
266
|
+
get children() {
|
|
267
|
+
return web.createComponent(MetricRenderer, {
|
|
268
|
+
get component() {
|
|
269
|
+
return props.component;
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}), web.createComponent(solidJs.Show, {
|
|
274
|
+
get when() {
|
|
275
|
+
return props.component.type === "text";
|
|
276
|
+
},
|
|
277
|
+
get children() {
|
|
278
|
+
return web.createComponent(TextRenderer, {
|
|
279
|
+
get component() {
|
|
280
|
+
return props.component;
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
})];
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
const UIResourceRenderer = (props) => {
|
|
289
|
+
const layout = () => {
|
|
290
|
+
if ("type" in props.content) {
|
|
291
|
+
return {
|
|
292
|
+
id: "single-component",
|
|
293
|
+
components: [props.content],
|
|
294
|
+
grid: {
|
|
295
|
+
columns: 12,
|
|
296
|
+
gap: "1rem"
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
return props.content;
|
|
301
|
+
};
|
|
302
|
+
const getGridStyles = (component) => {
|
|
303
|
+
const {
|
|
304
|
+
colStart,
|
|
305
|
+
colSpan,
|
|
306
|
+
rowStart,
|
|
307
|
+
rowSpan = 1
|
|
308
|
+
} = component.position;
|
|
309
|
+
return {
|
|
310
|
+
"grid-column": `${colStart} / span ${colSpan}`,
|
|
311
|
+
"grid-row": rowStart ? `${rowStart} / span ${rowSpan}` : "auto"
|
|
312
|
+
};
|
|
313
|
+
};
|
|
314
|
+
return (() => {
|
|
315
|
+
var _el$47 = _tmpl$15(), _el$48 = _el$47.firstChild;
|
|
316
|
+
web.insert(_el$48, web.createComponent(solidJs.For, {
|
|
317
|
+
get each() {
|
|
318
|
+
return layout().components;
|
|
319
|
+
},
|
|
320
|
+
children: (component) => (() => {
|
|
321
|
+
var _el$49 = _tmpl$16();
|
|
322
|
+
web.insert(_el$49, web.createComponent(ComponentRenderer, {
|
|
323
|
+
component,
|
|
324
|
+
get onError() {
|
|
325
|
+
return props.onError;
|
|
326
|
+
}
|
|
327
|
+
}));
|
|
328
|
+
web.effect((_$p) => web.style(_el$49, getGridStyles(component), _$p));
|
|
329
|
+
return _el$49;
|
|
330
|
+
})()
|
|
331
|
+
}));
|
|
332
|
+
web.effect((_p$) => {
|
|
333
|
+
var _v$3 = `w-full ${props.class || ""}`, _v$4 = `repeat(${layout().grid.columns}, 1fr)`, _v$5 = layout().grid.gap;
|
|
334
|
+
_v$3 !== _p$.e && web.className(_el$47, _p$.e = _v$3);
|
|
335
|
+
_v$4 !== _p$.t && web.setStyleProperty(_el$48, "grid-template-columns", _p$.t = _v$4);
|
|
336
|
+
_v$5 !== _p$.a && web.setStyleProperty(_el$48, "gap", _p$.a = _v$5);
|
|
337
|
+
return _p$;
|
|
338
|
+
}, {
|
|
339
|
+
e: void 0,
|
|
340
|
+
t: void 0,
|
|
341
|
+
a: void 0
|
|
342
|
+
});
|
|
343
|
+
return _el$47;
|
|
344
|
+
})();
|
|
345
|
+
};
|
|
346
|
+
exports.UIResourceRenderer = UIResourceRenderer;
|
|
347
|
+
//# sourceMappingURL=UIResourceRenderer.cjs.map
|