@seed-ship/mcp-ui-solid 1.0.4 → 1.0.7

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 CHANGED
@@ -5,6 +5,66 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.0.7] - 2025-11-16
9
+
10
+ ### Fixed
11
+ - **CRITICAL SSR FIX**: Replaced `ref` callback with `onMount` to eliminate `use()` directive
12
+ - Previous versions (1.0.5, 1.0.6) used `ref={() => handleComponentRender(component.id)}`
13
+ - vite-plugin-solid@2.11.8 transforms ref callbacks into `use()` directive calls
14
+ - `use` is NOT exported from `solid-js/web` in Node/SSR environment (only in browser)
15
+ - This caused SSR crashes on Railway: `SyntaxError: The requested module 'solid-js/web' does not provide an export named 'use'`
16
+ - Solution: Replaced `ref` callback with `onMount()` which is SSR-safe
17
+ - Affected file: `StreamingUIRenderer.tsx` (line 207)
18
+
19
+ ### Technical Details
20
+ - `onMount` only executes client-side (after hydration), perfect for animations
21
+ - No `use()` directive needed, no SSR/browser export mismatch
22
+ - Maintains same functionality: animation triggers when component mounts
23
+ - Fully compatible with solid-js@1.9.10 in both browser and Node environments
24
+
25
+ ### Migration Notes
26
+ - No breaking changes for consumers
27
+ - Drop-in replacement for v1.0.6
28
+ - Fixes production SSR crashes on Railway and similar Node.js SSR platforms
29
+
30
+ ## [1.0.6] - 2025-11-16
31
+
32
+ ### Fixed
33
+ - Add `solid-js` to devDependencies for tests to pass in CI/CD
34
+ - CI was failing because `solid-js` (peerDependency) wasn't available for tests
35
+
36
+ ### Technical Details
37
+ - `solid-js` remains a peerDependency for consuming apps
38
+ - Added to devDependencies for package development and testing
39
+ - No functional changes to the package itself
40
+
41
+ ## [1.0.5] - 2025-11-16 (UNPUBLISHED - CI Failed)
42
+
43
+ ### Fixed
44
+ - **CRITICAL SSR FIX**: Replaced dynamic style objects with CSS strings to eliminate `setStyleProperty` usage
45
+ - `setStyleProperty` was being generated by vite-plugin-solid but doesn't exist in solid-js/web API
46
+ - This caused SSR crashes on Railway with error: `SyntaxError: The requested module 'solid-js/web' does not provide an export named 'setStyleProperty'`
47
+ - Affected files: `UIResourceRenderer.tsx`, `StreamingUIRenderer.tsx`
48
+ - Solution: Convert style objects to CSS strings (e.g., `style="width: 100%"` instead of `style={{ width: '100%' }}`)
49
+
50
+ ### Changed
51
+ - Updated `vite` from ^5.0.10 to ^6.3.6
52
+ - Updated `vite-plugin-solid` from ^2.8.2 to ^2.11.8
53
+ - Updated `vitest` from ^1.1.0 to ^4.0.8
54
+ - Updated `solid-js` peerDependency from ^1.8.0 to ^1.9.0
55
+
56
+ ### Technical Details
57
+ The issue occurred because:
58
+ 1. Old `vite-plugin-solid@2.8.2` compiled JSX style objects into calls to `setStyleProperty()`
59
+ 2. `setStyleProperty` is not exported by `solid-js/web` in any version
60
+ 3. The error only appeared in production SSR (Railway) because dev mode doesn't do full SSR
61
+ 4. Local builds may have worked due to cached node_modules or different build artifacts
62
+
63
+ ### Migration Notes
64
+ - No breaking changes for consumers
65
+ - Drop-in replacement for v1.0.4
66
+ - Fully compatible with solid-js@1.9.x
67
+
8
68
  ## [1.0.0] - 2025-01-14
9
69
 
10
70
  ### Added
@@ -133,7 +133,7 @@ function StreamingUIRenderer(props) {
133
133
  return _tmpl$7();
134
134
  }
135
135
  }), null);
136
- web.effect((_$p) => web.setStyleProperty(_el$20, "width", progress().totalCount !== null ? `${progress().receivedCount / progress().totalCount * 100}%` : "0%"));
136
+ web.effect((_$p) => web.style(_el$20, progress().totalCount !== null ? `width: ${progress().receivedCount / progress().totalCount * 100}%` : "width: 0%", _$p));
137
137
  return _el$14;
138
138
  }
139
139
  }), _el$28);
@@ -169,31 +169,31 @@ function StreamingUIRenderer(props) {
169
169
  get each() {
170
170
  return components();
171
171
  },
172
- children: (component) => (() => {
173
- var _el$50 = _tmpl$13();
174
- web.use(() => handleComponentRender(component.id), _el$50);
175
- web.insert(_el$50, web.createComponent(StreamingComponentRenderer, {
176
- component,
177
- get onError() {
178
- return props.onRenderError;
179
- }
180
- }));
181
- web.effect((_p$) => {
182
- var _v$ = `
183
- col-span-${component.position.colSpan}
184
- ${animatingComponents().has(component.id) ? "animate-fade-in-up" : ""}
185
- `, _v$2 = component.position.colStart, _v$3 = component.position.colStart + component.position.colSpan;
186
- _v$ !== _p$.e && web.className(_el$50, _p$.e = _v$);
187
- _v$2 !== _p$.t && web.setStyleProperty(_el$50, "grid-column-start", _p$.t = _v$2);
188
- _v$3 !== _p$.a && web.setStyleProperty(_el$50, "grid-column-end", _p$.a = _v$3);
189
- return _p$;
190
- }, {
191
- e: void 0,
192
- t: void 0,
193
- a: void 0
194
- });
195
- return _el$50;
196
- })()
172
+ children: (component) => {
173
+ solidJs.onMount(() => handleComponentRender(component.id));
174
+ return (() => {
175
+ var _el$50 = _tmpl$13();
176
+ web.insert(_el$50, web.createComponent(StreamingComponentRenderer, {
177
+ component,
178
+ get onError() {
179
+ return props.onRenderError;
180
+ }
181
+ }));
182
+ web.effect((_p$) => {
183
+ var _v$ = `
184
+ col-span-${component.position.colSpan}
185
+ ${animatingComponents().has(component.id) ? "animate-fade-in-up" : ""}
186
+ `, _v$2 = `grid-column-start: ${component.position.colStart}; grid-column-end: ${component.position.colStart + component.position.colSpan}`;
187
+ _v$ !== _p$.e && web.className(_el$50, _p$.e = _v$);
188
+ _p$.t = web.style(_el$50, _v$2, _p$.t);
189
+ return _p$;
190
+ }, {
191
+ e: void 0,
192
+ t: void 0
193
+ });
194
+ return _el$50;
195
+ })();
196
+ }
197
197
  }), null);
198
198
  web.insert(_el$28, web.createComponent(solidJs.Show, {
199
199
  get when() {
@@ -1 +1 @@
1
- {"version":3,"file":"StreamingUIRenderer.cjs","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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"}
1
+ {"version":3,"file":"StreamingUIRenderer.cjs","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, onMount } 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 progress().totalCount !== null\n ? `width: ${(progress().receivedCount / progress().totalCount!) * 100}%`\n : 'width: 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 // Trigger animation on mount (SSR-safe, no 'use' directive needed)\n onMount(() => handleComponentRender(component.id))\n\n return (\n <div\n class={`\n col-span-${component.position.colSpan}\n ${animatingComponents().has(component.id) ? 'animate-fade-in-up' : ''}\n `}\n style={`grid-column-start: ${component.position.colStart}; grid-column-end: ${component.position.colStart + component.position.colSpan}`}\n >\n <StreamingComponentRenderer component={component} onError={props.onRenderError} />\n </div>\n )\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","_$style","_el$22","_tmpl$0","_el$23","_el$24","_el$25","_el$26","recoverable","_el$27","_tmpl$9","$$click","For","each","onMount","_el$50","_tmpl$13","onRenderError","_p$","_v$","position","colSpan","has","_v$2","colStart","e","_$className","t","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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"}
@@ -1,5 +1,5 @@
1
- import { delegateEvents, template, insert, createComponent, memo, effect, setStyleProperty, use, className } from "solid-js/web";
2
- import { createSignal, Show, For } from "solid-js";
1
+ import { delegateEvents, template, insert, createComponent, memo, effect, style, className } from "solid-js/web";
2
+ import { createSignal, Show, For, onMount } from "solid-js";
3
3
  import { useStreamingUI } from "../hooks/useStreamingUI.js";
4
4
  import { validateComponent } from "../services/validation.js";
5
5
  import { GenerativeUIErrorBoundary } from "./GenerativeUIErrorBoundary.js";
@@ -131,7 +131,7 @@ function StreamingUIRenderer(props) {
131
131
  return _tmpl$7();
132
132
  }
133
133
  }), null);
134
- effect((_$p) => setStyleProperty(_el$20, "width", progress().totalCount !== null ? `${progress().receivedCount / progress().totalCount * 100}%` : "0%"));
134
+ effect((_$p) => style(_el$20, progress().totalCount !== null ? `width: ${progress().receivedCount / progress().totalCount * 100}%` : "width: 0%", _$p));
135
135
  return _el$14;
136
136
  }
137
137
  }), _el$28);
@@ -167,31 +167,31 @@ function StreamingUIRenderer(props) {
167
167
  get each() {
168
168
  return components();
169
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
- })()
170
+ children: (component) => {
171
+ onMount(() => handleComponentRender(component.id));
172
+ return (() => {
173
+ var _el$50 = _tmpl$13();
174
+ insert(_el$50, createComponent(StreamingComponentRenderer, {
175
+ component,
176
+ get onError() {
177
+ return props.onRenderError;
178
+ }
179
+ }));
180
+ effect((_p$) => {
181
+ var _v$ = `
182
+ col-span-${component.position.colSpan}
183
+ ${animatingComponents().has(component.id) ? "animate-fade-in-up" : ""}
184
+ `, _v$2 = `grid-column-start: ${component.position.colStart}; grid-column-end: ${component.position.colStart + component.position.colSpan}`;
185
+ _v$ !== _p$.e && className(_el$50, _p$.e = _v$);
186
+ _p$.t = style(_el$50, _v$2, _p$.t);
187
+ return _p$;
188
+ }, {
189
+ e: void 0,
190
+ t: void 0
191
+ });
192
+ return _el$50;
193
+ })();
194
+ }
195
195
  }), null);
196
196
  insert(_el$28, createComponent(Show, {
197
197
  get when() {
@@ -1 +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":";;;;;;AAwCA,SAASA,2BAA2BC,OAGjC;;AAED,QAAMC,aAAaC,kBAAkBF,MAAMG,SAAS;AACpD,MAAI,CAACF,WAAWG,OAAO;AACrBJ,gBAAMK,YAANL,+BAAgB;AAAA,MACdM,MAAM;AAAA,MACNC,SAAS;AAAA,MACTC,aAAaR,MAAMG,UAAUM;AAAAA,MAC7BC,SAAST,WAAWU;AAAAA,IAAAA;AAGtB,YAAA,MAAA;AAAA,UAAAC,OAAAC,OAAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAG;AAAAC,aAAAF,OAAA;;AAIOf,uBAAAA,MAAAA,WAAWU,WAAXV,gBAAAA,IAAoB,OAApBA,mBAAwBM,YAAW;AAAA,OAA0B;AAAA,aAAAK;AAAAA,IAAA,GAAA;AAAA,EAItE;AAIA,QAAMO,SAASnB,MAAMG,UAAUgB;AAE/B,SAAAC,gBACGC,2BAAyB;AAAA,IAAA,IACxBb,cAAW;AAAA,aAAER,MAAMG,UAAUM;AAAAA,IAAE;AAAA,IAAA,IAC/Ba,gBAAa;AAAA,aAAEtB,MAAMG,UAAUG;AAAAA,IAAI;AAAA,IAAA,IACnCD,UAAO;AAAA,aAAEL,MAAMK;AAAAA,IAAO;AAAA,IACtBkB,YAAY;AAAA,IAAK,IAAAC,WAAA;AAAA,UAAAC,QAAAC,QAAAA,GAAAC,QAAAF,MAAAV,YAAAa,QAAAD,MAAAZ,YAAAc,QAAAF,MAAAV,aAAAa,SAAAD,MAAAd,YAAAgB,SAAAD,OAAAb;AAAAc,aAAAd;AAAAC,aAAAU,OAAA,MAKV5B,MAAMG,UAAUG,IAAI;AAAAY,aAAAO,OAAAL,gBAGxBY,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAEd,iCAAQe;AAAAA,QAAK;AAAA,QAAA,IAAAV,WAAA;AAAA,cAAAW,QAAAC,QAAAA;AAAAlB,iBAAAiB,OAAA,MAC8BhB,OAAOe,KAAK;AAAA,iBAAAC;AAAAA,QAAA;AAAA,MAAA,CAAA,GAAAN,KAAA;AAAAX,aAAAO,OAAAL,gBAElEY,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAEI,KAAA,MAAArC,MAAMG,UAAUG,SAAS,QAAQ,EAAA,MAAIa,iCAAQmB;AAAAA,QAAK;AAAA,QAAA,IAAAd,WAAA;AAAA,cAAAe,QAAAC,QAAAA,GAAAC,QAAAF,MAAAxB;AAAAG,iBAAAuB,OAAA,MAELtB,OAAOmB,KAAK;AAAApB,iBAAAqB,OAAAnB,gBAChEY,MAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAEd,OAAOuB;AAAAA,YAAI;AAAA,YAAA,IAAAlB,WAAA;AAAA,kBAAAmB,QAAAC,QAAAA;AAAA1B,qBAAAyB,OAAA,MACsBxB,OAAOuB,IAAI;AAAA,qBAAAC;AAAAA,YAAA;AAAA,UAAA,CAAA,GAAA,IAAA;AAAA,iBAAAJ;AAAAA,QAAA;AAAA,MAAA,CAAA,GAAAV,KAAA;AAAAX,aAAAW,OAAA,MAK3C7B,MAAMG,UAAUM,GAAGoC,MAAM,GAAG,CAAC,GAACd,MAAA;AAAA,aAAAN;AAAAA,IAAA;AAAA,EAAA,CAAA;AAKvD;AAEO,SAASqB,oBAAoB9C,OAAiC;AACnE,QAAM;AAAA,IAAE+C;AAAAA,IAAYC;AAAAA,IAAWC;AAAAA,IAAaC;AAAAA,IAAOC;AAAAA,IAAUC;AAAAA,IAAUC;AAAAA,EAAAA,IACrEC,eAAe;AAAA,IACbC,OAAOvD,MAAMuD;AAAAA,IACbC,UAAUxD,MAAMwD;AAAAA,IAChBC,WAAWzD,MAAMyD;AAAAA,IACjBC,SAAS1D,MAAM0D;AAAAA,IACfC,YAAY3D,MAAM2D;AAAAA,IAClBtD,SAASL,MAAMK;AAAAA,IACfuD,qBAAqB5D,MAAM4D;AAAAA,EAAAA,CAC5B;AAEH,QAAM,CAACC,qBAAqBC,sBAAsB,IAAIC,aAA0B,oBAAIC,KAAK;AAGzF,QAAMC,wBAAwBA,CAACzD,gBAAwB;AACrDsD,2BAAwBI,CAAAA,6BAAaF,IAAI,CAAC,GAAGE,MAAM1D,WAAW,CAAC,CAAC;AAGhE2D,eAAW,MAAM;AACfL,6BAAwBI,CAAAA,SAAS;AAC/B,cAAME,OAAO,IAAIJ,IAAIE,IAAI;AACzBE,aAAKC,OAAO7D,WAAW;AACvB,eAAO4D;AAAAA,MACT,CAAC;AAAA,IACH,GAAG,GAAG;AAAA,EACR;AAEA,UAAA,MAAA;AAAA,QAAAE,SAAAC,SAAAA,GAAAC,SAAAF,OAAAvD;AAAAG,WAAAoD,QAAAlD,gBAGKY,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEI,KAAA,MAAArC,MAAMyE,iBAAiB,KAAK,QAAKzB,eAAeC;MAAc;AAAA,MAAA,IAAAzB,WAAA;AAAA,YAAAkD,SAAAC,QAAAA,GAAAC,SAAAF,OAAA3D,YAAA8D,SAAAD,OAAA7D,YAAA+D,SAAAF,OAAA3D,aAAA8D,SAAAD,OAAA/D;AAAAG,eAAA2D,QAAA,MAIf1B,SAAAA,EAAW5C,OAAO;AAAAW,eAAA0D,QAAAxD,gBACtEY,MAAI;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAEkB,SAAAA,EAAW6B,eAAe;AAAA,UAAI;AAAA,UAAA,IAAAxD,WAAA;AAAA,gBAAAyD,SAAAC,QAAAA,GAAAC,SAAAF,OAAAlE;AAAAG,mBAAA+D,QAAA,MAErC9B,SAAAA,EAAWiC,eAAaD,MAAA;AAAAjE,mBAAA+D,QAAA,MAAK9B,SAAAA,EAAW6B,YAAU,IAAA;AAAA,mBAAAC;AAAAA,UAAA;AAAA,QAAA,CAAA,GAAA,IAAA;AAAA/D,eAAAwD,QAAAtD,gBAmBxDY,MAAI;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAEI,KAAA,MAAAc,SAAAA,EAAW6B,eAAe,IAAI,EAAA,KAAI/B,YAAAA;AAAAA,UAAa;AAAA,UAAA,IAAAzB,WAAA;AAAA,mBAAA6D,QAAAA;AAAAA,UAAA;AAAA,QAAA,CAAA,GAAA,IAAA;AAAAC,eAAAC,SAAAC,iBAAAT,QAAA,SARnD5B,SAAAA,EAAW6B,eAAe,OACtB,GAAI7B,SAAAA,EAAWiC,gBAAgBjC,SAAAA,EAAW6B,aAAe,GAAG,MAC5D,IAAI,CAAA;AAAA,eAAAN;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAF,MAAA;AAAAtD,WAAAoD,QAAAlD,gBAiBnBY,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEiB,MAAAA;AAAAA,MAAO;AAAA,MAAA,IAAA1B,WAAA;AAAA,YAAAiE,SAAAC,QAAAA,GAAAC,SAAAF,OAAA1E,YAAA6E,SAAAD,OAAA5E,YAAA8E,SAAAD,OAAA3E,aAAA6E,SAAAH,OAAA1E;AAAAC,eAAA2E,QAAA;;AAgBiC3C,6BAAAA,MAAAA,mBAASA;AAAAA,SAAK;AAAAhC,eAAA4E,QAAA;;AAEtB5C,6BAAAA,MAAAA,mBAAS3C;AAAAA,SAAO;AAAAW,eAAAuE,QAAArE,gBAGvDY,MAAI;AAAA,UAAA,IAACC,OAAI;;AAAA,oBAAEiB,iBAAAA,mBAAS6C;AAAAA,UAAW;AAAA,UAAA,IAAAvE,WAAA;AAAA,gBAAAwE,SAAAC,QAAAA;AAAAD,mBAAAE,UAInB,MAAM7C,eAAAA;AAAgB,mBAAA2C;AAAAA,UAAA;AAAA,QAAA,CAAA,GAAA,IAAA;AAAA,eAAAP;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAjB,MAAA;AAAAtD,WAAAsD,QAAApD,gBAWpC+E,KAAG;AAAA,MAAA,IAACC,OAAI;AAAA,eAAErD,WAAAA;AAAAA,MAAY;AAAA,MAAAvB,UACnBrB,gBAAS,MAAA;AAAA,YAAAkG,SAAAC,SAAAA;AAAAC,YAEF,MAAMtC,sBAAsB9D,UAAUM,EAAE,GAAC4F,MAAA;AAAAnF,eAAAmF,QAAAjF,gBAU7CrB,4BAA0B;AAAA,UAACI;AAAAA,UAAoB,IAAEE,UAAO;AAAA,mBAAEL,MAAMwG;AAAAA,UAAa;AAAA,QAAA,CAAA,CAAA;AAAAlB,eAAAmB,CAAAA,QAAA;AAAA,cAAAC,MATvE;AAAA,2BACMvG,UAAUwG,SAASC,OAAO;AAAA,kBACnC/C,sBAAsBgD,IAAI1G,UAAUM,EAAE,IAAI,uBAAuB,EAAE;AAAA,iBACtEqG,OAEsB3G,UAAUwG,SAASI,UAAQC,OAC7B7G,UAAUwG,SAASI,WAAW5G,UAAUwG,SAASC;AAAOF,kBAAAD,IAAAQ,KAAAC,UAAAb,QAAAI,IAAAQ,IAAAP,GAAA;AAAAI,mBAAAL,IAAAU,KAAA3B,iBAAAa,QAAA,qBAAAI,IAAAU,IAAAL,IAAA;AAAAE,mBAAAP,IAAAW,KAAA5B,iBAAAa,QAAA,mBAAAI,IAAAW,IAAAJ,IAAA;AAAA,iBAAAP;AAAAA,QAAA,GAAA;AAAA,UAAAQ,GAAAI;AAAAA,UAAAF,GAAAE;AAAAA,UAAAD,GAAAC;AAAAA,QAAAA,CAAA;AAAA,eAAAhB;AAAAA,MAAA,GAAA;AAAA,IAAA,CAKhF,GAAA,IAAA;AAAAnF,WAAAsD,QAAApD,gBAIFY,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEI,KAAA,MAAA,CAAA,CAAAY,YAAAA,CAAa,EAAA,KAAIE,SAAAA,EAAW6B,eAAe;AAAA,MAAI;AAAA,MAAA,IAAAxD,WAAA;AAAA,eAAAJ,gBACxD+E,KAAG;AAAA,UAAA,IACFC,OAAI;AAAA,mBAAEkB,MAAMC,KAAK;AAAA,cACfC,QAAQrE,SAAAA,EAAW6B,aAAc7B,WAAWiC;AAAAA,YAAAA,CAC7C;AAAA,UAAC;AAAA,UAAA5D,UAEDA,MAAAJ,gBAAOqG,mBAAiB,CAAA,CAAA;AAAA,QAAA,CAAG;AAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAAvG,WAAAoD,QAAAlD,gBAMjCY,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEI,KAAA,MAAArC,MAAM0H,iBAAiB,KAAK,EAAA,KAAItE,SAAAA;AAAAA,MAAU;AAAA,MAAA,IAAA5B,WAAA;AAAA,YAAAmG,SAAAC,YAAAC,SAAAF,OAAA5G,YAAA+G,SAAAD,OAAA9G,YAAAgH,SAAAD,OAAA/G,YAAAiH,SAAAD,OAAA9G,aAAAgH,SAAAH,OAAA7G,aAAAiH,SAAAD,OAAAlH,YAAAoH,SAAAD,OAAAjH,aAAAmH,SAAAH,OAAAhH,aAAAoH,SAAAD,OAAArH,YAAAuH,SAAAD,OAAApH,aAAAsH,SAAAD,OAAAvH,YAAAyH,SAAAJ,OAAAnH,aAAAwH,SAAAD,OAAAzH,YAAA2H,SAAAD,OAAAxH,aAAA0H,SAAAD,OAAA3H;AAAAG,eAAA8G,QAAA;;AAKxC5E,gCAAAA,MAAAA,mBAAYwF;AAAAA,SAAQ;AAAA1H,eAAAiH,QAAA;;AAIpB/E,gCAAAA,MAAAA,mBAAYyF;AAAAA,SAAK;AAAA3H,eAAAoH,QAAA,MAAA;;AAIjBlF,gCAAAA,MAAAA,mBAAY0F;AAAAA,WAAeP,MAAA;AAAArH,eAAA2G,QAAAzG,gBAElCY,MAAI;AAAA,UAAA,IAACC,OAAI;;AAAA,qBAAEmB,cAAAA,MAAAA,mBAAY2F,aAAY1B;AAAAA,UAAS;AAAA,UAAA,IAAA7F,WAAA;AAAA,gBAAAwH,SAAAC,WAAAC,SAAAF,OAAAjI,YAAAoI,SAAAD,OAAAjI;AAAAkI,mBAAApI;AAAAG,mBAAAiI,QAAA,MAAA;;AAGlC/F,0CAAAA,MAAAA,mBAAY2F,YAAZ3F,mBAAqBgG,QAAQ;AAAA,eAAE,IAAA;AAAA,mBAAAJ;AAAAA,UAAA;AAAA,QAAA,CAAA,GAAAR,MAAA;AAAAtH,eAAAwH,QAAA,MAAA;;AAKlCtF,gCAAAA,MAAAA,mBAAYiG;AAAAA,WAAYV,MAAA;AAAAzH,eAAA2G,QAAAzG,gBAE/BY,MAAI;AAAA,UAAA,IAACC,OAAI;;AAAA,oBAAEmB,oBAAAA,mBAAYkG;AAAAA,UAAM;AAAA,UAAA,IAAA9H,WAAA;AAAA,mBAAA+H,SAAAA;AAAAA,UAAA;AAAA,QAAA,CAAA,GAAA,IAAA;AAAA,eAAA5B;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAA,IAAA;AAAArC,WAAA,MAAA4B,UAAA5C,QAnI1B,yBAAyBtE,MAAMwJ,SAAS,EAAE,EAAE,CAAA;AAAA,WAAAlF;AAAAA,EAAA,GAAA;AA8I5D;AAKA,SAASmD,oBAAoB;AAC3B,SAAAgC,SAAAA;AAkBF;AAGAC,eAAA,CAAA,OAAA,CAAA;"}
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, onMount } 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 progress().totalCount !== null\n ? `width: ${(progress().receivedCount / progress().totalCount!) * 100}%`\n : 'width: 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 // Trigger animation on mount (SSR-safe, no 'use' directive needed)\n onMount(() => handleComponentRender(component.id))\n\n return (\n <div\n class={`\n col-span-${component.position.colSpan}\n ${animatingComponents().has(component.id) ? 'animate-fade-in-up' : ''}\n `}\n style={`grid-column-start: ${component.position.colStart}; grid-column-end: ${component.position.colStart + component.position.colSpan}`}\n >\n <StreamingComponentRenderer component={component} onError={props.onRenderError} />\n </div>\n )\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","_$style","_el$22","_tmpl$0","_el$23","_el$24","_el$25","_el$26","recoverable","_el$27","_tmpl$9","$$click","For","each","onMount","_el$50","_tmpl$13","onRenderError","_p$","_v$","position","colSpan","has","_v$2","colStart","e","_$className","t","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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"}
@@ -299,17 +299,15 @@ const UIResourceRenderer = (props) => {
299
299
  }
300
300
  return props.content;
301
301
  };
302
- const getGridStyles = (component) => {
302
+ const gridContainerStyle = () => `grid-template-columns: repeat(${layout().grid.columns}, 1fr); gap: ${layout().grid.gap}`;
303
+ const getGridStyleString = (component) => {
303
304
  const {
304
305
  colStart,
305
306
  colSpan,
306
307
  rowStart,
307
308
  rowSpan = 1
308
309
  } = component.position;
309
- return {
310
- "grid-column": `${colStart} / span ${colSpan}`,
311
- "grid-row": rowStart ? `${rowStart} / span ${rowSpan}` : "auto"
312
- };
310
+ return `grid-column: ${colStart} / span ${colSpan}; grid-row: ${rowStart ? `${rowStart} / span ${rowSpan}` : "auto"}`;
313
311
  };
314
312
  return (() => {
315
313
  var _el$47 = _tmpl$15(), _el$48 = _el$47.firstChild;
@@ -325,20 +323,18 @@ const UIResourceRenderer = (props) => {
325
323
  return props.onError;
326
324
  }
327
325
  }));
328
- web.effect((_$p) => web.style(_el$49, getGridStyles(component), _$p));
326
+ web.effect((_$p) => web.style(_el$49, getGridStyleString(component), _$p));
329
327
  return _el$49;
330
328
  })()
331
329
  }));
332
330
  web.effect((_p$) => {
333
- var _v$3 = `w-full ${props.class || ""}`, _v$4 = `repeat(${layout().grid.columns}, 1fr)`, _v$5 = layout().grid.gap;
331
+ var _v$3 = `w-full ${props.class || ""}`, _v$4 = gridContainerStyle();
334
332
  _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);
333
+ _p$.t = web.style(_el$48, _v$4, _p$.t);
337
334
  return _p$;
338
335
  }, {
339
336
  e: void 0,
340
- t: void 0,
341
- a: void 0
337
+ t: void 0
342
338
  });
343
339
  return _el$47;
344
340
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"UIResourceRenderer.cjs","sources":["../../src/components/UIResourceRenderer.tsx"],"sourcesContent":["/**\n * UI Resource Renderer Component\n * Phase 0: Foundation with iframe sandbox and composite grid support\n *\n * 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 return (\n <div class={`w-full ${props.class || ''}`}>\n <div\n class=\"grid gap-4\"\n style={{\n 'grid-template-columns': `repeat(${layout().grid.columns}, 1fr)`,\n gap: layout().grid.gap,\n }}\n >\n <For each={layout().components}>\n {(component) => (\n <div style={getGridStyles(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","getGridStyles","colStart","colSpan","rowStart","rowSpan","position","_el$47","_tmpl$15","_el$48","_el$49","_tmpl$16","_v$3","class","_v$4","_v$5","_$setStyleProperty","a"],"mappings":"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"}
1
+ {"version":3,"file":"UIResourceRenderer.cjs","sources":["../../src/components/UIResourceRenderer.tsx"],"sourcesContent":["/**\n * UI Resource Renderer Component\n * Phase 0: Foundation with iframe sandbox and composite grid support\n *\n * 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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"UIResourceRenderer.d.ts","sourceRoot":"","sources":["../../src/components/UIResourceRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAoC,MAAM,UAAU,CAAA;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAA;AAInF;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,OAAO,EAAE,WAAW,GAAG,QAAQ,CAAA;IAE/B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IAExC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AA8QD;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,uBAAuB,CA6CjE,CAAA"}
1
+ {"version":3,"file":"UIResourceRenderer.d.ts","sourceRoot":"","sources":["../../src/components/UIResourceRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAoC,MAAM,UAAU,CAAA;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAA;AAInF;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,OAAO,EAAE,WAAW,GAAG,QAAQ,CAAA;IAE/B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IAExC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AA8QD;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,uBAAuB,CAiDjE,CAAA"}
@@ -1,4 +1,4 @@
1
- import { template, insert, createComponent, effect, style, className, setStyleProperty, setAttribute, memo } from "solid-js/web";
1
+ import { template, insert, createComponent, effect, style, className, setAttribute, memo } 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";
@@ -297,17 +297,15 @@ const UIResourceRenderer = (props) => {
297
297
  }
298
298
  return props.content;
299
299
  };
300
- const getGridStyles = (component) => {
300
+ const gridContainerStyle = () => `grid-template-columns: repeat(${layout().grid.columns}, 1fr); gap: ${layout().grid.gap}`;
301
+ const getGridStyleString = (component) => {
301
302
  const {
302
303
  colStart,
303
304
  colSpan,
304
305
  rowStart,
305
306
  rowSpan = 1
306
307
  } = component.position;
307
- return {
308
- "grid-column": `${colStart} / span ${colSpan}`,
309
- "grid-row": rowStart ? `${rowStart} / span ${rowSpan}` : "auto"
310
- };
308
+ return `grid-column: ${colStart} / span ${colSpan}; grid-row: ${rowStart ? `${rowStart} / span ${rowSpan}` : "auto"}`;
311
309
  };
312
310
  return (() => {
313
311
  var _el$47 = _tmpl$15(), _el$48 = _el$47.firstChild;
@@ -323,20 +321,18 @@ const UIResourceRenderer = (props) => {
323
321
  return props.onError;
324
322
  }
325
323
  }));
326
- effect((_$p) => style(_el$49, getGridStyles(component), _$p));
324
+ effect((_$p) => style(_el$49, getGridStyleString(component), _$p));
327
325
  return _el$49;
328
326
  })()
329
327
  }));
330
328
  effect((_p$) => {
331
- var _v$3 = `w-full ${props.class || ""}`, _v$4 = `repeat(${layout().grid.columns}, 1fr)`, _v$5 = layout().grid.gap;
329
+ var _v$3 = `w-full ${props.class || ""}`, _v$4 = gridContainerStyle();
332
330
  _v$3 !== _p$.e && className(_el$47, _p$.e = _v$3);
333
- _v$4 !== _p$.t && setStyleProperty(_el$48, "grid-template-columns", _p$.t = _v$4);
334
- _v$5 !== _p$.a && setStyleProperty(_el$48, "gap", _p$.a = _v$5);
331
+ _p$.t = style(_el$48, _v$4, _p$.t);
335
332
  return _p$;
336
333
  }, {
337
334
  e: void 0,
338
- t: void 0,
339
- a: void 0
335
+ t: void 0
340
336
  });
341
337
  return _el$47;
342
338
  })();
@@ -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 return (\n <div class={`w-full ${props.class || ''}`}>\n <div\n class=\"grid gap-4\"\n style={{\n 'grid-template-columns': `repeat(${layout().grid.columns}, 1fr)`,\n gap: layout().grid.gap,\n }}\n >\n <For each={layout().components}>\n {(component) => (\n <div style={getGridStyles(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","getGridStyles","colStart","colSpan","rowStart","rowSpan","position","_el$47","_tmpl$15","_el$48","_el$49","_tmpl$16","_v$3","class","_v$4","_v$5","_$setStyleProperty","a"],"mappings":"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"}
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":"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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.4",
3
+ "version": "1.0.7",
4
4
  "description": "SolidJS components for rendering MCP-generated UI resources",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -34,7 +34,7 @@
34
34
  "CHANGELOG.md"
35
35
  ],
36
36
  "peerDependencies": {
37
- "solid-js": "^1.8.0"
37
+ "solid-js": "^1.9.0"
38
38
  },
39
39
  "dependencies": {
40
40
  "zod": "^3.22.4"
@@ -47,10 +47,11 @@
47
47
  "@vitest/ui": "^4.0.9",
48
48
  "eslint": "^8.56.0",
49
49
  "jsdom": "^27.2.0",
50
+ "solid-js": "^1.9.10",
50
51
  "typescript": "^5.3.3",
51
- "vite": "^5.0.10",
52
- "vite-plugin-solid": "^2.8.2",
53
- "vitest": "^1.1.0"
52
+ "vite": "^6.3.6",
53
+ "vite-plugin-solid": "^2.11.8",
54
+ "vitest": "^4.0.8"
54
55
  },
55
56
  "keywords": [
56
57
  "mcp",