@seed-ship/mcp-ui-solid 1.2.2 → 1.2.6
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 +28 -0
- package/dist/components/UIResourceRenderer.cjs +147 -12
- package/dist/components/UIResourceRenderer.cjs.map +1 -1
- package/dist/components/UIResourceRenderer.d.ts.map +1 -1
- package/dist/components/UIResourceRenderer.js +148 -13
- package/dist/components/UIResourceRenderer.js.map +1 -1
- package/package.json +1 -1
- package/src/components/UIResourceRenderer.tsx +121 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -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\nimport DOMPurify from 'dompurify'\nimport { Component, createSignal, Show, For, createMemo, createEffect } from 'solid-js'\nimport { isServer } from 'solid-js/web'\nimport type { UIComponent, UILayout, RendererError, ComponentType } from '../types'\nimport { validateComponent, DEFAULT_RESOURCE_LIMITS } from '../services/validation'\nimport { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary'\nimport { GridRenderer } from './GridRenderer'\nimport { FooterRenderer } from './FooterRenderer'\nimport { useAction } from '../hooks/useAction'\nimport { marked } from 'marked'\n\n/**\n * Copy button component with visual feedback\n */\nfunction CopyButton(props: { getText: () => string; title?: string; position?: 'top-right' | 'bottom-right' }) {\n const [copied, setCopied] = createSignal(false)\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(props.getText())\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n const positionClasses = () => {\n return props.position === 'bottom-right'\n ? 'absolute -right-2 -bottom-3'\n : 'absolute right-2 top-2'\n }\n\n return (\n <button\n onClick={handleCopy}\n class={`${positionClasses()} opacity-60 hover:opacity-100 px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm z-10`}\n title={props.title || 'Copy'}\n >\n <Show\n when={!copied()}\n fallback={\n <svg class=\"w-3 h-3 text-green-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n }\n >\n <svg class=\"w-3 h-3 text-gray-500 dark:text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n </Show>\n </button>\n )\n}\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 // Use createEffect instead of onMount for SSR compatibility\n // createEffect runs after hydration on client-side\n createEffect(() => {\n const chartParams = props.component.params as any\n if (!chartParams) return\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 * Smart cell value renderer that handles markdown links and other formats\n */\nfunction renderCellValue(value: any): string {\n // Handle null/undefined\n if (value === null || value === undefined) {\n return '-'\n }\n\n // Handle object with url/name properties (common source/link format from LLM)\n if (typeof value === 'object' && value !== null) {\n // Check for link-like objects: { url: \"...\", name/label/title: \"...\" }\n if (value.url) {\n const label = value.name || value.label || value.title || value.url\n const sanitizedLabel = DOMPurify.sanitize(String(label))\n const sanitizedUrl = DOMPurify.sanitize(String(value.url))\n return `<a href=\"${sanitizedUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 dark:text-blue-400 hover:underline\">${sanitizedLabel}</a>`\n }\n // Fallback: extract meaningful text from object properties\n if (value.name || value.label || value.title) {\n return DOMPurify.sanitize(String(value.name || value.label || value.title))\n }\n // Last resort: JSON stringify for debugging (better than [object Object])\n try {\n return JSON.stringify(value)\n } catch {\n return '-'\n }\n }\n\n // Convert to string\n let strValue = String(value)\n\n // Clean up \"undefined\" patterns from backend data\n // Pattern 1: \"Text – undefined\" or \"Text - undefined\" → \"Text\"\n strValue = strValue.replace(/\\s*[–-]\\s*undefined\\s*$/gi, '')\n // Pattern 2: \"undefined – Text\" or \"undefined - Text\" → \"Text\"\n strValue = strValue.replace(/^undefined\\s*[–-]\\s*/gi, '')\n // Pattern 3: standalone \"undefined\" → \"-\"\n if (strValue.trim().toLowerCase() === 'undefined') {\n return '-'\n }\n // Pattern 4: empty string after cleanup → \"-\"\n if (strValue.trim() === '') {\n return '-'\n }\n\n // Detect and convert markdown links: [text](url)\n const markdownLinkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g\n if (markdownLinkRegex.test(strValue)) {\n // Replace all markdown links with HTML links\n const htmlValue = strValue.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 dark:text-blue-400 hover:underline\">$1</a>'\n )\n return DOMPurify.sanitize(htmlValue, { ADD_ATTR: ['target', 'rel'] })\n }\n\n // Check if value contains markdown formatting (bold, italic, code, etc.)\n const hasMarkdown = /[*_`\\[\\]#]/.test(strValue)\n if (hasMarkdown) {\n // Parse with marked and sanitize\n const parsed = marked.parse(strValue, { async: false }) as string\n return DOMPurify.sanitize(parsed, { ADD_ATTR: ['target', 'rel'] })\n }\n\n // Plain text\n return strValue\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 // Generate copyable text from table data (TSV format for spreadsheet compatibility)\n const getTableText = () => {\n const columns = tableParams.columns || []\n const rows = tableParams.rows || []\n const header = columns.map((c: any) => c.label).join('\\t')\n const dataRows = rows.map((row: any) =>\n columns.map((c: any) => {\n const value = row[c.key]\n if (value === null || value === undefined) return ''\n if (typeof value === 'object') return value.name || value.label || JSON.stringify(value)\n return String(value)\n }).join('\\t')\n ).join('\\n')\n return `${header}\\n${dataRows}`\n }\n\n return (\n <div class=\"relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden group\">\n <CopyButton getText={getTableText} title=\"Copy table data\" position=\"top-right\" />\n <div class=\"p-4\">\n <Show when={tableParams.title}>\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white mb-3\">\n {tableParams.title}\n </h3>\n </Show>\n\n <div class=\"overflow-x-auto\">\n <table class=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0\">\n <thead class=\"bg-gray-50 dark:bg-gray-900/50\">\n <tr>\n <For each={tableParams.columns}>\n {(column: any) => (\n <th\n scope=\"col\"\n class=\"px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 first:pl-6 last:pr-6\"\n style={column.width ? { width: column.width } : {}}\n >\n {column.label}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody class=\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\">\n <For each={tableParams.rows.slice(0, DEFAULT_RESOURCE_LIMITS.maxTableRows)}>\n {(row: any, i) => (\n <tr class={`hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors ${i() % 2 === 0 ? 'bg-white dark:bg-gray-800' : 'bg-gray-50/30 dark:bg-gray-800/50'}`}>\n <For each={tableParams.columns}>\n {(column: any) => (\n <td class=\"px-6 py-4 text-sm text-gray-700 dark:text-gray-200 whitespace-normal break-words leading-relaxed first:pl-6 last:pr-6\">\n <div innerHTML={renderCellValue(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 // Generate copyable text for metric\n const getMetricText = () => {\n const title = metricParams.title || metricParams.label || ''\n const value = metricParams.value\n const unit = metricParams.unit || ''\n return `${title}: ${value}${unit ? ' ' + unit : ''}`\n }\n\n return (\n <div class=\"relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group\">\n <CopyButton getText={getMetricText} title=\"Copy metric\" position=\"top-right\" />\n <div class=\"flex flex-col h-full justify-between\">\n <div>\n <p class=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide\">\n {metricParams.title}\n </p>\n <div class=\"mt-2 flex items-baseline\">\n <p class=\"text-2xl font-semibold text-gray-900 dark:text-white\">{metricParams.value}</p>\n <Show when={metricParams.unit}>\n <span class=\"ml-2 text-sm font-medium text-gray-500 dark:text-gray-400\">\n {metricParams.unit}\n </span>\n </Show>\n </div>\n </div>\n\n <Show when={metricParams.trend}>\n <div class=\"mt-3 flex items-center\">\n <span\n class={`text-sm font-medium ${metricParams.trend.direction === 'up'\n ? 'text-green-600 dark:text-green-400'\n : metricParams.trend.direction === 'down'\n ? 'text-red-600 dark:text-red-400'\n : 'text-gray-600 dark:text-gray-400'\n }`}\n >\n {metricParams.trend.direction === 'up'\n ? '�'\n : metricParams.trend.direction === 'down'\n ? '�'\n : '�'}{' '}\n {Math.abs(metricParams.trend.value)}%\n </span>\n </div>\n </Show>\n\n <Show when={metricParams.subtitle}>\n <p class=\"mt-2 text-xs text-gray-500 dark:text-gray-400\">{metricParams.subtitle}</p>\n </Show>\n </div>\n </div>\n )\n}\n\n/**\n * Extract image data from markdown image link format\n * Pattern: [](link-url)\\n*Photo by Author*\n */\nfunction extractImageFromMarkdown(content: string): { alt: string; imageUrl: string; linkUrl: string; credit: string } | null {\n // Pattern: [](link-url) followed by optional credit line\n const imagePattern = /\\[!\\[([^\\]]*)\\]\\(([^)]+)\\)\\]\\(([^)]+)\\)\\s*\\*([^*]+)\\*/\n const match = content.match(imagePattern)\n\n if (match) {\n return {\n alt: match[1] || 'Image',\n imageUrl: match[2],\n linkUrl: match[3],\n credit: match[4].trim()\n }\n }\n\n return null\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 // Check if this is an image markdown that should be rendered as image component\n const imageData = createMemo(() => {\n if (textParams.markdown && textParams.content) {\n return extractImageFromMarkdown(textParams.content)\n }\n return null\n })\n\n // Convert markdown to HTML if markdown flag is true (and not an image component)\n const htmlContent = createMemo(() => {\n if (textParams.markdown && !imageData()) {\n return marked.parse(textParams.content, { async: false }) as string\n }\n return textParams.content\n })\n\n // Get plain text content for copying (strip markdown/HTML)\n const getTextContent = () => {\n return textParams.content || ''\n }\n\n // Render as image component if we extracted image data\n return (\n <Show\n when={imageData()}\n fallback={\n <div class=\"relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group\">\n <CopyButton getText={getTextContent} title=\"Copy text\" position=\"top-right\" />\n <div\n class={`prose prose-sm dark:prose-invert max-w-none ${textParams.className || ''}`}\n innerHTML={htmlContent()}\n />\n </div>\n }\n >\n {(data) => (\n <div class=\"w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col\">\n <div class=\"flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]\">\n <a href={data().linkUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"cursor-zoom-in\">\n <img\n src={data().imageUrl}\n alt={data().alt}\n class=\"max-w-full max-h-[400px] object-contain rounded shadow-sm hover:opacity-90 transition-opacity\"\n loading=\"lazy\"\n />\n </a>\n </div>\n <div class=\"p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\">\n <p class=\"text-sm text-gray-600 dark:text-gray-400 text-center italic\">{data().credit}</p>\n </div>\n </div>\n )}\n </Show>\n )\n}\n\n/**\n * Render an iframe component\n */\nfunction IframeRenderer(props: { component: UIComponent }) {\n const params = props.component.params as any\n return (\n <div class=\"w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col\">\n <Show when={params.title}>\n <div class=\"px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900\">\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white\">{params.title}</h3>\n </div>\n </Show>\n <iframe\n src={params.url}\n title={params.title || 'Embedded content'}\n class=\"w-full border-0 flex-1\"\n style={`height: ${params.height || '400px'}; min-height: 300px;`}\n sandbox=\"allow-scripts allow-same-origin allow-popups allow-forms\"\n loading=\"lazy\"\n />\n </div>\n )\n}\n\n/**\n * Render an image component\n */\nfunction ImageRenderer(props: { component: UIComponent }) {\n const params = props.component.params as any\n\n return (\n <div class=\"w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col\">\n <div class=\"flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]\">\n <a href={params.url} target=\"_blank\" rel=\"noopener noreferrer\" class=\"cursor-zoom-in\">\n <img\n src={params.url}\n alt={params.alt || 'Image'}\n class=\"max-w-full max-h-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity\"\n loading=\"lazy\"\n />\n </a>\n </div>\n <Show when={params.caption}>\n <div class=\"p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\">\n <p class=\"text-sm text-gray-600 dark:text-gray-400 text-center\">{params.caption}</p>\n </div>\n </Show>\n </div>\n )\n}\n\n/**\n * Render a link component\n */\n/**\n * Render a link component\n */\nfunction LinkRenderer(props: { component: UIComponent }) {\n const params = props.component.params as any\n\n return (\n <a\n href={params.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"flex items-center gap-3 p-4 bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors group h-full\"\n onClick={(e) => e.stopPropagation()}\n >\n <div class=\"p-2 bg-blue-50 dark:bg-blue-900/30 rounded-full text-blue-600 dark:text-blue-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/50 shrink-0 transition-colors\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-5 h-5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n </div>\n <div class=\"flex-1 min-w-0\">\n <h4 class=\"text-sm font-medium text-gray-900 dark:text-white truncate group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors\">\n {params.label || params.url}\n </h4>\n <Show when={params.description}>\n <p class=\"text-xs text-gray-500 dark:text-gray-400 truncate\">{params.description}</p>\n </Show>\n </div>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-4 h-4 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-gray-300 shrink-0 transition-colors\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n </a>\n )\n}\n\n/**\n * Render a single component with error boundary\n */\nfunction ComponentRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n}) {\n // Validate component before rendering\n const validation = validateComponent(props.component)\n if (!validation.valid) {\n props.onError?.({\n type: 'validation',\n message: 'Component validation failed',\n componentId: props.component.id,\n details: validation.errors,\n })\n\n return (\n <div class=\"w-full h-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4\">\n <p class=\"text-sm font-medium text-red-900 dark:text-red-100\">Validation Error</p>\n <p class=\"text-xs text-red-700 dark:text-red-300 mt-1\">\n {validation.errors?.[0]?.message || 'Unknown validation error'}\n </p>\n </div>\n )\n }\n\n // Render based on component type with enhanced error boundary\n return (\n <GenerativeUIErrorBoundary\n componentId={props.component.id}\n componentType={props.component.type}\n onError={props.onError}\n allowRetry={true}\n >\n <Show when={props.component.type === 'chart'}>\n <ChartRenderer component={props.component} onError={props.onError} />\n </Show>\n <Show when={props.component.type === 'table'}>\n <TableRenderer component={props.component} onError={props.onError} />\n </Show>\n <Show when={props.component.type === 'metric'}>\n <MetricRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'text'}>\n <TextRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'iframe'}>\n <IframeRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'image'}>\n <ImageRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'link'}>\n <LinkRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'action'}>\n <ActionRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'grid'}>\n <GridRenderer component={props.component} onError={props.onError} />\n </Show>\n </GenerativeUIErrorBoundary>\n )\n}\n\n/**\n * Render an action component (button or link)\n * Refactored in Phase 5.0 to use useAction hook for Context-based execution\n */\nfunction ActionRenderer(props: { component: UIComponent }) {\n const params = props.component.params as any\n const { execute, isExecuting } = useAction()\n\n // Handle click to execute tool via Context (falls back to CustomEvent if no provider)\n const handleClick = async (e: MouseEvent) => {\n if (params.action === 'tool-call' && params.toolName) {\n e.preventDefault()\n await execute(params.toolName, params.params || {})\n }\n }\n\n // Determine if button should be disabled (explicit disable or currently executing)\n const isDisabled = () => params.disabled || (params.action === 'tool-call' && isExecuting())\n\n if (params.type === 'link' || params.action === 'link') {\n return (\n <a\n href={params.url || '#'}\n target={params.url ? '_blank' : undefined}\n rel=\"noopener noreferrer\"\n class={`inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors\n ${params.variant === 'primary' ? 'bg-blue-600 text-white hover:bg-blue-700' :\n params.variant === 'outline' ? 'border border-gray-300 text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800' :\n 'text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300'}`}\n onClick={handleClick}\n >\n <Show when={params.icon}>\n <span>{params.icon}</span>\n </Show>\n {params.label}\n </a>\n )\n }\n\n return (\n <button\n type={params.action === 'submit' ? 'submit' : 'button'}\n disabled={isDisabled()}\n class={`inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\n ${params.variant === 'primary' ? 'bg-blue-600 text-white hover:bg-blue-700 shadow-sm' :\n params.variant === 'secondary' ? 'bg-gray-100 text-gray-900 hover:bg-gray-200 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600' :\n params.variant === 'outline' ? 'border border-gray-300 text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800' :\n params.variant === 'danger' ? 'bg-red-600 text-white hover:bg-red-700' :\n 'bg-transparent text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800'}\n ${isDisabled() ? 'opacity-50 cursor-not-allowed' : ''}\n ${params.size === 'sm' ? 'px-3 py-1.5 text-xs' : params.size === 'lg' ? 'px-6 py-3 text-base' : ''}`}\n onClick={handleClick}\n >\n <Show when={isExecuting() && params.action === 'tool-call'}>\n <span class=\"animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full\" />\n </Show>\n <Show when={params.icon && !(isExecuting() && params.action === 'tool-call')}>\n <span>{params.icon}</span>\n </Show>\n {params.label}\n </button>\n )\n}\n\n/**\n * Main UIResourceRenderer component\n */\nexport const UIResourceRenderer: Component<UIResourceRendererProps> = (props) => {\n const layout = () => {\n // Check if content is a UIComponent (non-composite) vs UILayout (composite)\n if ('type' in props.content && (props.content as any).type !== 'composite') {\n return {\n id: 'single-component',\n components: [props.content as UIComponent],\n grid: {\n columns: 12,\n gap: '1rem',\n },\n } as UILayout\n }\n return props.content as UILayout\n }\n\n // Convert grid styles to CSS string\n const gridContainerStyle = () => {\n const layoutData = layout()\n return `grid-template-columns: repeat(${layoutData.grid.columns}, 1fr); gap: ${layoutData.grid.gap}`\n }\n\n // Convert component grid styles to CSS string\n const getGridStyleString = (component: UIComponent) => {\n // Defensive check for position field - default to full width\n if (!component.position) {\n return 'grid-column: 1 / span 12; grid-row: auto'\n }\n const { colStart, colSpan, rowStart, rowSpan = 1 } = component.position\n return `grid-column: ${colStart} / span ${colSpan}; grid-row: ${rowStart ? `${rowStart} / span ${rowSpan}` : 'auto'}`\n }\n\n // Auto-footer logic (Phase 5.0)\n // Automatically inject footer when metadata is present and no explicit footer exists\n const shouldShowAutoFooter = createMemo(() => {\n const layoutData = layout()\n\n // Don't show if explicitly hidden\n if (layoutData.metadata?.hideFooter) {\n return false\n }\n\n // Don't show if no metadata (nothing to display)\n if (!layoutData.metadata) {\n return false\n }\n\n // Don't show if explicit footer component exists\n const hasExplicitFooter = layoutData.components.some((c) => c.type === 'footer')\n if (hasExplicitFooter) {\n return false\n }\n\n // Show auto-footer if metadata has relevant info\n return !!(\n layoutData.metadata.executionTime ||\n layoutData.metadata.sourceCount ||\n layoutData.metadata.llmModel\n )\n })\n\n // Build auto-footer params from metadata\n const autoFooterParams = createMemo(() => {\n const layoutData = layout()\n return {\n poweredBy: 'Deposium',\n executionTime: layoutData.metadata?.executionTime,\n model: layoutData.metadata?.llmModel,\n sourceCount: layoutData.metadata?.sourceCount,\n }\n })\n\n const layoutData = layout()\n\n return (\n <div class={`w-full ${props.class || ''}`}>\n <div class=\"grid gap-4\" style={gridContainerStyle()}>\n <For each={layoutData.components}>\n {(component) => (\n <div style={getGridStyleString(component)}>\n <ComponentRenderer component={component} onError={props.onError} />\n </div>\n )}\n </For>\n </div>\n\n {/* Auto-injected footer (Phase 5.0) */}\n <Show when={shouldShowAutoFooter()}>\n <FooterRenderer params={autoFooterParams()} />\n </Show>\n </div>\n )\n}\n"],"names":["CopyButton","props","copied","setCopied","createSignal","handleCopy","navigator","clipboard","writeText","getText","setTimeout","err","console","error","positionClasses","position","_el$","_$getNextElement","_tmpl$2","$$click","_$insert","_$createComponent","Show","when","fallback","_tmpl$3","children","_tmpl$","_$effect","_p$","_v$","_v$2","title","e","_$className","t","_$setAttribute","undefined","_$runHydrationEvents","ChartRenderer","iframeUrl","setIframeUrl","isLoading","setIsLoading","setError","createEffect","chartParams","component","params","chartConfig","type","data","options","responsive","maintainAspectRatio","configStr","encodeURIComponent","JSON","stringify","url","_el$4","_tmpl$8","_el$14","firstChild","_el$15","_co$2","_$getNextMarker","nextSibling","_el$16","_el$17","_co$3","_el$18","_el$19","_co$4","_tmpl$4","_el$6","_tmpl$5","_el$7","_el$8","_el$9","_$memo","_el$0","_tmpl$7","_el$12","_el$13","_co$","_el$10","_el$11","_el$1","_tmpl$6","addEventListener","onError","message","componentId","id","renderCellValue","value","label","name","sanitizedLabel","DOMPurify","sanitize","String","sanitizedUrl","strValue","replace","trim","toLowerCase","markdownLinkRegex","test","htmlValue","ADD_ATTR","hasMarkdown","parsed","marked","parse","async","TableRenderer","tableParams","getTableText","columns","rows","header","map","c","join","dataRows","row","key","_el$20","_tmpl$0","_el$45","_el$46","_co$0","_el$21","_el$41","_el$42","_co$8","_el$23","_el$24","_el$25","_el$26","_el$27","_el$43","_el$44","_co$9","_el$22","For","each","column","_el$47","_tmpl$1","_$p","_$style","width","slice","DEFAULT_RESOURCE_LIMITS","maxTableRows","i","_el$48","_tmpl$10","_el$49","_tmpl$11","_el$50","_$setProperty","pagination","_el$28","_tmpl$9","_el$29","_el$30","_el$35","_el$36","_co$5","_el$31","_el$37","_el$38","_co$6","_el$33","_el$39","_el$40","_co$7","currentPage","pageSize","Math","min","totalRows","MetricRenderer","metricParams","getMetricText","unit","_el$51","_tmpl$15","_el$73","_el$74","_co$14","_el$52","_el$53","_el$54","_el$55","_el$56","_el$58","_el$59","_co$1","_el$69","_el$70","_co$12","_el$71","_el$72","_co$13","_el$57","_tmpl$12","trend","_el$60","_tmpl$13","_el$61","_el$64","_el$65","_co$10","_el$62","_el$66","_el$67","_co$11","_c$","direction","abs","subtitle","_el$68","_tmpl$14","extractImageFromMarkdown","content","imagePattern","match","alt","imageUrl","linkUrl","credit","TextRenderer","textParams","imageData","createMemo","markdown","htmlContent","getTextContent","_el$75","_tmpl$16","_el$77","_el$78","_co$15","_el$76","_v$3","className","_v$4","_el$79","_tmpl$17","_el$80","_el$81","_el$82","_el$83","_el$84","_v$5","_v$6","_v$7","a","IframeRenderer","_el$85","_tmpl$19","_el$89","_el$90","_co$16","_el$88","_el$86","_tmpl$18","_el$87","_v$8","_v$9","_v$0","height","ImageRenderer","_el$91","_tmpl$21","_el$92","_el$93","_el$94","_el$97","_el$98","_co$17","caption","_el$95","_tmpl$20","_el$96","_v$1","_v$10","_v$11","LinkRenderer","_el$99","_tmpl$23","_el$100","_el$101","_el$102","_el$104","_el$105","_co$18","stopPropagation","description","_el$103","_tmpl$22","ComponentRenderer","validation","validateComponent","valid","details","errors","_el$106","_tmpl$24","_el$107","_el$108","GenerativeUIErrorBoundary","componentType","allowRetry","ActionRenderer","GridRenderer","execute","isExecuting","useAction","handleClick","action","toolName","preventDefault","isDisabled","disabled","_el$109","_tmpl$26","_el$111","_el$112","_co$19","_el$113","_el$114","_co$20","icon","_el$110","_tmpl$25","_v$12","_v$13","_v$14","variant","_el$115","_tmpl$28","_el$118","_el$119","_co$21","_el$120","_el$121","_co$22","_el$122","_el$123","_co$23","_tmpl$27","_el$117","_v$15","_v$16","_v$17","size","UIResourceRenderer","layout","components","grid","gap","gridContainerStyle","layoutData","getGridStyleString","colStart","colSpan","rowStart","rowSpan","shouldShowAutoFooter","metadata","hideFooter","hasExplicitFooter","some","executionTime","sourceCount","llmModel","autoFooterParams","poweredBy","model","_el$124","_tmpl$29","_el$125","_el$126","_el$127","_co$24","_el$128","_tmpl$30","FooterRenderer","_v$18","class","_v$19","_$delegateEvents"],"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\nimport DOMPurify from 'dompurify'\nimport { Component, createSignal, Show, For, createMemo, createEffect } from 'solid-js'\nimport { isServer } from 'solid-js/web'\nimport type { UIComponent, UILayout, RendererError, ComponentType } from '../types'\nimport { validateComponent, DEFAULT_RESOURCE_LIMITS } from '../services/validation'\nimport { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary'\nimport { GridRenderer } from './GridRenderer'\nimport { FooterRenderer } from './FooterRenderer'\nimport { CarouselRenderer } from './CarouselRenderer'\nimport { ArtifactRenderer } from './ArtifactRenderer'\nimport { useAction } from '../hooks/useAction'\nimport { marked } from 'marked'\n\n/**\n * Copy button component with visual feedback\n */\nfunction CopyButton(props: { getText: () => string; title?: string; position?: 'top-right' | 'bottom-right' }) {\n const [copied, setCopied] = createSignal(false)\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(props.getText())\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error('Failed to copy:', err)\n }\n }\n\n const positionClasses = () => {\n return props.position === 'bottom-right'\n ? 'absolute -right-2 -bottom-3'\n : 'absolute right-2 top-2'\n }\n\n return (\n <button\n onClick={handleCopy}\n class={`${positionClasses()} opacity-60 hover:opacity-100 px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm z-10`}\n title={props.title || 'Copy'}\n >\n <Show\n when={!copied()}\n fallback={\n <svg class=\"w-3 h-3 text-green-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n }\n >\n <svg class=\"w-3 h-3 text-gray-500 dark:text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n </Show>\n </button>\n )\n}\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 // Use createEffect instead of onMount for SSR compatibility\n // createEffect runs after hydration on client-side\n createEffect(() => {\n const chartParams = props.component.params as any\n if (!chartParams) return\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 * Smart cell value renderer that handles markdown links and other formats\n */\nfunction renderCellValue(value: any): string {\n // Handle null/undefined\n if (value === null || value === undefined) {\n return '-'\n }\n\n // Handle object with url/name properties (common source/link format from LLM)\n if (typeof value === 'object' && value !== null) {\n // Check for link-like objects: { url: \"...\", name/label/title: \"...\" }\n if (value.url) {\n const label = value.name || value.label || value.title || value.url\n const sanitizedLabel = DOMPurify.sanitize(String(label))\n const sanitizedUrl = DOMPurify.sanitize(String(value.url))\n return `<a href=\"${sanitizedUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 dark:text-blue-400 hover:underline\">${sanitizedLabel}</a>`\n }\n // Fallback: extract meaningful text from object properties\n if (value.name || value.label || value.title) {\n return DOMPurify.sanitize(String(value.name || value.label || value.title))\n }\n // Last resort: JSON stringify for debugging (better than [object Object])\n try {\n return JSON.stringify(value)\n } catch {\n return '-'\n }\n }\n\n // Convert to string\n let strValue = String(value)\n\n // Clean up \"undefined\" patterns from backend data\n // Pattern 1: \"Text – undefined\" or \"Text - undefined\" → \"Text\"\n strValue = strValue.replace(/\\s*[–-]\\s*undefined\\s*$/gi, '')\n // Pattern 2: \"undefined – Text\" or \"undefined - Text\" → \"Text\"\n strValue = strValue.replace(/^undefined\\s*[–-]\\s*/gi, '')\n // Pattern 3: standalone \"undefined\" → \"-\"\n if (strValue.trim().toLowerCase() === 'undefined') {\n return '-'\n }\n // Pattern 4: empty string after cleanup → \"-\"\n if (strValue.trim() === '') {\n return '-'\n }\n\n // Detect and convert markdown links: [text](url)\n const markdownLinkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g\n if (markdownLinkRegex.test(strValue)) {\n // Replace all markdown links with HTML links\n const htmlValue = strValue.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-blue-600 dark:text-blue-400 hover:underline\">$1</a>'\n )\n return DOMPurify.sanitize(htmlValue, { ADD_ATTR: ['target', 'rel'] })\n }\n\n // Check if value contains markdown formatting (bold, italic, code, etc.)\n const hasMarkdown = /[*_`\\[\\]#]/.test(strValue)\n if (hasMarkdown) {\n // Parse with marked and sanitize\n const parsed = marked.parse(strValue, { async: false }) as string\n return DOMPurify.sanitize(parsed, { ADD_ATTR: ['target', 'rel'] })\n }\n\n // Plain text\n return strValue\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 // Generate copyable text from table data (TSV format for spreadsheet compatibility)\n const getTableText = () => {\n const columns = tableParams.columns || []\n const rows = tableParams.rows || []\n const header = columns.map((c: any) => c.label).join('\\t')\n const dataRows = rows.map((row: any) =>\n columns.map((c: any) => {\n const value = row[c.key]\n if (value === null || value === undefined) return ''\n if (typeof value === 'object') return value.name || value.label || JSON.stringify(value)\n return String(value)\n }).join('\\t')\n ).join('\\n')\n return `${header}\\n${dataRows}`\n }\n\n return (\n <div class=\"relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden group\">\n <CopyButton getText={getTableText} title=\"Copy table data\" position=\"top-right\" />\n <div class=\"p-4\">\n <Show when={tableParams.title}>\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white mb-3\">\n {tableParams.title}\n </h3>\n </Show>\n\n <div class=\"overflow-x-auto\">\n <table class=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0\">\n <thead class=\"bg-gray-50 dark:bg-gray-900/50\">\n <tr>\n <For each={tableParams.columns}>\n {(column: any) => (\n <th\n scope=\"col\"\n class=\"px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 first:pl-6 last:pr-6\"\n style={column.width ? { width: column.width } : {}}\n >\n {column.label}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody class=\"bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700\">\n <For each={tableParams.rows.slice(0, DEFAULT_RESOURCE_LIMITS.maxTableRows)}>\n {(row: any, i) => (\n <tr class={`hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors ${i() % 2 === 0 ? 'bg-white dark:bg-gray-800' : 'bg-gray-50/30 dark:bg-gray-800/50'}`}>\n <For each={tableParams.columns}>\n {(column: any) => (\n <td class=\"px-6 py-4 text-sm text-gray-700 dark:text-gray-200 whitespace-normal break-words leading-relaxed first:pl-6 last:pr-6\">\n <div innerHTML={renderCellValue(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 // Generate copyable text for metric\n const getMetricText = () => {\n const title = metricParams.title || metricParams.label || ''\n const value = metricParams.value\n const unit = metricParams.unit || ''\n return `${title}: ${value}${unit ? ' ' + unit : ''}`\n }\n\n return (\n <div class=\"relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group\">\n <CopyButton getText={getMetricText} title=\"Copy metric\" position=\"top-right\" />\n <div class=\"flex flex-col h-full justify-between\">\n <div>\n <p class=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide\">\n {metricParams.title}\n </p>\n <div class=\"mt-2 flex items-baseline\">\n <p class=\"text-2xl font-semibold text-gray-900 dark:text-white\">{metricParams.value}</p>\n <Show when={metricParams.unit}>\n <span class=\"ml-2 text-sm font-medium text-gray-500 dark:text-gray-400\">\n {metricParams.unit}\n </span>\n </Show>\n </div>\n </div>\n\n <Show when={metricParams.trend}>\n <div class=\"mt-3 flex items-center\">\n <span\n class={`text-sm font-medium ${metricParams.trend.direction === 'up'\n ? 'text-green-600 dark:text-green-400'\n : metricParams.trend.direction === 'down'\n ? 'text-red-600 dark:text-red-400'\n : 'text-gray-600 dark:text-gray-400'\n }`}\n >\n {metricParams.trend.direction === 'up'\n ? '�'\n : metricParams.trend.direction === 'down'\n ? '�'\n : '�'}{' '}\n {Math.abs(metricParams.trend.value)}%\n </span>\n </div>\n </Show>\n\n <Show when={metricParams.subtitle}>\n <p class=\"mt-2 text-xs text-gray-500 dark:text-gray-400\">{metricParams.subtitle}</p>\n </Show>\n </div>\n </div>\n )\n}\n\n/**\n * Extract image data from markdown image link format\n * Pattern: [](link-url)\\n*Photo by Author*\n */\nfunction extractImageFromMarkdown(content: string): { alt: string; imageUrl: string; linkUrl: string; credit: string } | null {\n // Pattern: [](link-url) followed by optional credit line\n const imagePattern = /\\[!\\[([^\\]]*)\\]\\(([^)]+)\\)\\]\\(([^)]+)\\)\\s*\\*([^*]+)\\*/\n const match = content.match(imagePattern)\n\n if (match) {\n return {\n alt: match[1] || 'Image',\n imageUrl: match[2],\n linkUrl: match[3],\n credit: match[4].trim()\n }\n }\n\n return null\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 // Check if this is an image markdown that should be rendered as image component\n const imageData = createMemo(() => {\n if (textParams.markdown && textParams.content) {\n return extractImageFromMarkdown(textParams.content)\n }\n return null\n })\n\n // Convert markdown to HTML if markdown flag is true (and not an image component)\n const htmlContent = createMemo(() => {\n if (textParams.markdown && !imageData()) {\n return marked.parse(textParams.content, { async: false }) as string\n }\n return textParams.content\n })\n\n // Get plain text content for copying (strip markdown/HTML)\n const getTextContent = () => {\n return textParams.content || ''\n }\n\n // Render as image component if we extracted image data\n return (\n <Show\n when={imageData()}\n fallback={\n <div class=\"relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group\">\n <CopyButton getText={getTextContent} title=\"Copy text\" position=\"top-right\" />\n <div\n class={`prose prose-sm dark:prose-invert max-w-none ${textParams.className || ''}`}\n innerHTML={htmlContent()}\n />\n </div>\n }\n >\n {(data) => (\n <div class=\"w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col\">\n <div class=\"flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]\">\n <a href={data().linkUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"cursor-zoom-in\">\n <img\n src={data().imageUrl}\n alt={data().alt}\n class=\"max-w-full max-h-[400px] object-contain rounded shadow-sm hover:opacity-90 transition-opacity\"\n loading=\"lazy\"\n />\n </a>\n </div>\n <div class=\"p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\">\n <p class=\"text-sm text-gray-600 dark:text-gray-400 text-center italic\">{data().credit}</p>\n </div>\n </div>\n )}\n </Show>\n )\n}\n\n/**\n * Render an iframe component\n */\nfunction IframeRenderer(props: { component: UIComponent }) {\n const params = props.component.params as any\n return (\n <div class=\"w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col\">\n <Show when={params.title}>\n <div class=\"px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900\">\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white\">{params.title}</h3>\n </div>\n </Show>\n <iframe\n src={params.url}\n title={params.title || 'Embedded content'}\n class=\"w-full border-0 flex-1\"\n style={`height: ${params.height || '400px'}; min-height: 300px;`}\n sandbox=\"allow-scripts allow-same-origin allow-popups allow-forms\"\n loading=\"lazy\"\n />\n </div>\n )\n}\n\n/**\n * Render an image component\n */\nfunction ImageRenderer(props: { component: UIComponent }) {\n const params = props.component.params as any\n\n return (\n <div class=\"w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col\">\n <div class=\"flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]\">\n <a href={params.url} target=\"_blank\" rel=\"noopener noreferrer\" class=\"cursor-zoom-in\">\n <img\n src={params.url}\n alt={params.alt || 'Image'}\n class=\"max-w-full max-h-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity\"\n loading=\"lazy\"\n />\n </a>\n </div>\n <Show when={params.caption}>\n <div class=\"p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800\">\n <p class=\"text-sm text-gray-600 dark:text-gray-400 text-center\">{params.caption}</p>\n </div>\n </Show>\n </div>\n )\n}\n\n/**\n * Render a link component\n */\n/**\n * Render a link component\n */\nfunction LinkRenderer(props: { component: UIComponent }) {\n const params = props.component.params as any\n\n return (\n <a\n href={params.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"flex items-center gap-3 p-4 bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors group h-full\"\n onClick={(e) => e.stopPropagation()}\n >\n <div class=\"p-2 bg-blue-50 dark:bg-blue-900/30 rounded-full text-blue-600 dark:text-blue-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/50 shrink-0 transition-colors\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-5 h-5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n </div>\n <div class=\"flex-1 min-w-0\">\n <h4 class=\"text-sm font-medium text-gray-900 dark:text-white truncate group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors\">\n {params.label || params.url}\n </h4>\n <Show when={params.description}>\n <p class=\"text-xs text-gray-500 dark:text-gray-400 truncate\">{params.description}</p>\n </Show>\n </div>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-4 h-4 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-gray-300 shrink-0 transition-colors\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n </a>\n )\n}\n\n/**\n * Render a single component with error boundary\n */\nfunction ComponentRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n}) {\n // Validate component before rendering\n const validation = validateComponent(props.component)\n if (!validation.valid) {\n props.onError?.({\n type: 'validation',\n message: 'Component validation failed',\n componentId: props.component.id,\n details: validation.errors,\n })\n\n return (\n <div class=\"w-full h-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4\">\n <p class=\"text-sm font-medium text-red-900 dark:text-red-100\">Validation Error</p>\n <p class=\"text-xs text-red-700 dark:text-red-300 mt-1\">\n {validation.errors?.[0]?.message || 'Unknown validation error'}\n </p>\n </div>\n )\n }\n\n // Render based on component type with enhanced error boundary\n return (\n <GenerativeUIErrorBoundary\n componentId={props.component.id}\n componentType={props.component.type}\n onError={props.onError}\n allowRetry={true}\n >\n <Show when={props.component.type === 'chart'}>\n <ChartRenderer component={props.component} onError={props.onError} />\n </Show>\n <Show when={props.component.type === 'table'}>\n <TableRenderer component={props.component} onError={props.onError} />\n </Show>\n <Show when={props.component.type === 'metric'}>\n <MetricRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'text'}>\n <TextRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'iframe'}>\n <IframeRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'image'}>\n <ImageRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'link'}>\n <LinkRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'action'}>\n <ActionRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'grid'}>\n <GridRenderer component={props.component} onError={props.onError} />\n </Show>\n <Show when={props.component.type === 'carousel'}>\n <CarouselRenderer items={(props.component.params as any)?.items || []} height={(props.component.params as any)?.height} />\n </Show>\n <Show when={props.component.type === 'artifact'}>\n <ArtifactRenderer params={props.component.params as any} />\n </Show>\n </GenerativeUIErrorBoundary>\n )\n}\n\n/**\n * Render an action component (button or link)\n * Refactored in Phase 5.0 to use useAction hook for Context-based execution\n */\nfunction ActionRenderer(props: { component: UIComponent }) {\n const params = props.component.params as any\n const { execute, isExecuting } = useAction()\n\n // Handle click to execute tool via Context (falls back to CustomEvent if no provider)\n const handleClick = async (e: MouseEvent) => {\n if (params.action === 'tool-call' && params.toolName) {\n e.preventDefault()\n await execute(params.toolName, params.params || {})\n }\n }\n\n // Determine if button should be disabled (explicit disable or currently executing)\n const isDisabled = () => params.disabled || (params.action === 'tool-call' && isExecuting())\n\n if (params.type === 'link' || params.action === 'link') {\n return (\n <a\n href={params.url || '#'}\n target={params.url ? '_blank' : undefined}\n rel=\"noopener noreferrer\"\n class={`inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors\n ${params.variant === 'primary' ? 'bg-blue-600 text-white hover:bg-blue-700' :\n params.variant === 'outline' ? 'border border-gray-300 text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800' :\n 'text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300'}`}\n onClick={handleClick}\n >\n <Show when={params.icon}>\n <span>{params.icon}</span>\n </Show>\n {params.label}\n </a>\n )\n }\n\n return (\n <button\n type={params.action === 'submit' ? 'submit' : 'button'}\n disabled={isDisabled()}\n class={`inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\n ${params.variant === 'primary' ? 'bg-blue-600 text-white hover:bg-blue-700 shadow-sm' :\n params.variant === 'secondary' ? 'bg-gray-100 text-gray-900 hover:bg-gray-200 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600' :\n params.variant === 'outline' ? 'border border-gray-300 text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800' :\n params.variant === 'danger' ? 'bg-red-600 text-white hover:bg-red-700' :\n 'bg-transparent text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800'}\n ${isDisabled() ? 'opacity-50 cursor-not-allowed' : ''}\n ${params.size === 'sm' ? 'px-3 py-1.5 text-xs' : params.size === 'lg' ? 'px-6 py-3 text-base' : ''}`}\n onClick={handleClick}\n >\n <Show when={isExecuting() && params.action === 'tool-call'}>\n <span class=\"animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full\" />\n </Show>\n <Show when={params.icon && !(isExecuting() && params.action === 'tool-call')}>\n <span>{params.icon}</span>\n </Show>\n {params.label}\n </button>\n )\n}\n\n/**\n * Error card renderer for tool execution errors\n * Handles {error: true, message: \"...\", tool: \"...\", suggestions: [...]} format\n */\nfunction ErrorCardRenderer(props: { error: any }) {\n const getErrorText = () => {\n return `Error in ${props.error.tool || 'unknown tool'}: ${props.error.message || 'Unknown error'}`\n }\n\n return (\n <div class=\"relative w-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 group\">\n <CopyButton getText={getErrorText} title=\"Copy error details\" position=\"top-right\" />\n <div class=\"flex items-start gap-3\">\n <div class=\"p-2 bg-red-100 dark:bg-red-900/40 rounded-full shrink-0\">\n <svg class=\"w-5 h-5 text-red-600 dark:text-red-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n </div>\n <div class=\"flex-1 min-w-0\">\n <h4 class=\"text-sm font-semibold text-red-800 dark:text-red-200\">\n Tool Error: {props.error.tool || 'Unknown'}\n </h4>\n <p class=\"text-sm text-red-700 dark:text-red-300 mt-1\">\n {props.error.message || 'An error occurred during tool execution'}\n </p>\n <Show when={props.error.type}>\n <p class=\"text-xs text-red-600 dark:text-red-400 mt-1\">\n Type: {props.error.type}\n </p>\n </Show>\n <Show when={props.error.suggestions?.length}>\n <div class=\"mt-3\">\n <p class=\"text-xs font-medium text-red-700 dark:text-red-300\">Suggestions:</p>\n <ul class=\"mt-1 text-xs text-red-600 dark:text-red-400 list-disc list-inside\">\n <For each={props.error.suggestions}>\n {(suggestion: string) => <li>{suggestion}</li>}\n </For>\n </ul>\n </div>\n </Show>\n <Show when={props.error.timestamp}>\n <p class=\"text-xs text-red-500 dark:text-red-500 mt-2\">\n {new Date(props.error.timestamp).toLocaleString()}\n </p>\n </Show>\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Check if content is an error response from MCP tool\n */\nfunction isErrorResponse(content: any): boolean {\n return content && typeof content === 'object' && content.error === true\n}\n\n/**\n * Check if content is a UIResource (raw HTML or URI-based resource)\n * UIResource has: { uri, content: { type: 'rawHtml', htmlString }, encoding, metadata }\n */\nfunction isUIResource(content: any): boolean {\n return content && typeof content === 'object' && (\n content.uri?.startsWith('ui://') ||\n content.content?.type === 'rawHtml' ||\n content.content?.htmlString\n )\n}\n\n/**\n * Render UIResource (raw HTML) content\n * Handles HTML resources returned by tools like ui_show_dashboard, ui_show_health\n */\nfunction UIResourceHtmlRenderer(props: { resource: any }) {\n const htmlContent = () => {\n if (props.resource.content?.htmlString) {\n return DOMPurify.sanitize(props.resource.content.htmlString)\n }\n return ''\n }\n\n const resourceTitle = () => {\n return props.resource.metadata?.title || props.resource.uri?.replace('ui://deposium/', '') || 'Resource'\n }\n\n return (\n <div class=\"w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden\">\n <Show when={props.resource.metadata?.title || props.resource.uri}>\n <div class=\"px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900\">\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white capitalize\">\n {resourceTitle()}\n </h3>\n </div>\n </Show>\n <div\n class=\"p-4 prose prose-sm dark:prose-invert max-w-none\"\n innerHTML={htmlContent()}\n />\n </div>\n )\n}\n\n/**\n * Main UIResourceRenderer component\n */\nexport const UIResourceRenderer: Component<UIResourceRendererProps> = (props) => {\n // Handle error responses early (Sprint 9b fix)\n if (isErrorResponse(props.content)) {\n return <ErrorCardRenderer error={props.content} />\n }\n\n // Handle UIResource (raw HTML) - skip grid validation (Sprint 9c fix)\n if (isUIResource(props.content)) {\n return <UIResourceHtmlRenderer resource={props.content} />\n }\n\n const layout = () => {\n // Check if content is a UIComponent (non-composite) vs UILayout (composite)\n if ('type' in props.content && (props.content as any).type !== 'composite') {\n return {\n id: 'single-component',\n components: [props.content as UIComponent],\n grid: {\n columns: 12,\n gap: '1rem',\n },\n } as UILayout\n }\n return props.content as UILayout\n }\n\n // Convert grid styles to CSS string\n const gridContainerStyle = () => {\n const layoutData = layout()\n return `grid-template-columns: repeat(${layoutData.grid.columns}, 1fr); gap: ${layoutData.grid.gap}`\n }\n\n // Convert component grid styles to CSS string\n const getGridStyleString = (component: UIComponent) => {\n // Defensive check for position field - default to full width\n if (!component.position) {\n return 'grid-column: 1 / span 12; grid-row: auto'\n }\n const { colStart, colSpan, rowStart, rowSpan = 1 } = component.position\n return `grid-column: ${colStart} / span ${colSpan}; grid-row: ${rowStart ? `${rowStart} / span ${rowSpan}` : 'auto'}`\n }\n\n // Auto-footer logic (Phase 5.0)\n // Automatically inject footer when metadata is present and no explicit footer exists\n const shouldShowAutoFooter = createMemo(() => {\n const layoutData = layout()\n\n // Don't show if explicitly hidden\n if (layoutData.metadata?.hideFooter) {\n return false\n }\n\n // Don't show if no metadata (nothing to display)\n if (!layoutData.metadata) {\n return false\n }\n\n // Don't show if explicit footer component exists\n const hasExplicitFooter = layoutData.components.some((c) => c.type === 'footer')\n if (hasExplicitFooter) {\n return false\n }\n\n // Show auto-footer if metadata has relevant info\n return !!(\n layoutData.metadata.executionTime ||\n layoutData.metadata.sourceCount ||\n layoutData.metadata.llmModel\n )\n })\n\n // Build auto-footer params from metadata\n const autoFooterParams = createMemo(() => {\n const layoutData = layout()\n return {\n poweredBy: 'Deposium',\n executionTime: layoutData.metadata?.executionTime,\n model: layoutData.metadata?.llmModel,\n sourceCount: layoutData.metadata?.sourceCount,\n }\n })\n\n const layoutData = layout()\n\n return (\n <div class={`w-full ${props.class || ''}`}>\n <div class=\"grid gap-4\" style={gridContainerStyle()}>\n <For each={layoutData.components}>\n {(component) => (\n <div style={getGridStyleString(component)}>\n <ComponentRenderer component={component} onError={props.onError} />\n </div>\n )}\n </For>\n </div>\n\n {/* Auto-injected footer (Phase 5.0) */}\n <Show when={shouldShowAutoFooter()}>\n <FooterRenderer params={autoFooterParams()} />\n </Show>\n </div>\n )\n}\n"],"names":["CopyButton","props","copied","setCopied","createSignal","handleCopy","navigator","clipboard","writeText","getText","setTimeout","err","console","error","positionClasses","position","_el$","_$getNextElement","_tmpl$2","$$click","_$insert","_$createComponent","Show","when","fallback","_tmpl$3","children","_tmpl$","_$effect","_p$","_v$","_v$2","title","e","_$className","t","_$setAttribute","undefined","_$runHydrationEvents","ChartRenderer","iframeUrl","setIframeUrl","isLoading","setIsLoading","setError","createEffect","chartParams","component","params","chartConfig","type","data","options","responsive","maintainAspectRatio","configStr","encodeURIComponent","JSON","stringify","url","_el$4","_tmpl$8","_el$14","firstChild","_el$15","_co$2","_$getNextMarker","nextSibling","_el$16","_el$17","_co$3","_el$18","_el$19","_co$4","_tmpl$4","_el$6","_tmpl$5","_el$7","_el$8","_el$9","_$memo","_el$0","_tmpl$7","_el$12","_el$13","_co$","_el$10","_el$11","_el$1","_tmpl$6","addEventListener","onError","message","componentId","id","renderCellValue","value","label","name","sanitizedLabel","DOMPurify","sanitize","String","sanitizedUrl","strValue","replace","trim","toLowerCase","markdownLinkRegex","test","htmlValue","ADD_ATTR","hasMarkdown","parsed","marked","parse","async","TableRenderer","tableParams","getTableText","columns","rows","header","map","c","join","dataRows","row","key","_el$20","_tmpl$0","_el$45","_el$46","_co$0","_el$21","_el$41","_el$42","_co$8","_el$23","_el$24","_el$25","_el$26","_el$27","_el$43","_el$44","_co$9","_el$22","For","each","column","_el$47","_tmpl$1","_$p","_$style","width","slice","DEFAULT_RESOURCE_LIMITS","maxTableRows","i","_el$48","_tmpl$10","_el$49","_tmpl$11","_el$50","_$setProperty","pagination","_el$28","_tmpl$9","_el$29","_el$30","_el$35","_el$36","_co$5","_el$31","_el$37","_el$38","_co$6","_el$33","_el$39","_el$40","_co$7","currentPage","pageSize","Math","min","totalRows","MetricRenderer","metricParams","getMetricText","unit","_el$51","_tmpl$15","_el$73","_el$74","_co$14","_el$52","_el$53","_el$54","_el$55","_el$56","_el$58","_el$59","_co$1","_el$69","_el$70","_co$12","_el$71","_el$72","_co$13","_el$57","_tmpl$12","trend","_el$60","_tmpl$13","_el$61","_el$64","_el$65","_co$10","_el$62","_el$66","_el$67","_co$11","_c$","direction","abs","subtitle","_el$68","_tmpl$14","extractImageFromMarkdown","content","imagePattern","match","alt","imageUrl","linkUrl","credit","TextRenderer","textParams","imageData","createMemo","markdown","htmlContent","getTextContent","_el$75","_tmpl$16","_el$77","_el$78","_co$15","_el$76","_v$3","className","_v$4","_el$79","_tmpl$17","_el$80","_el$81","_el$82","_el$83","_el$84","_v$5","_v$6","_v$7","a","IframeRenderer","_el$85","_tmpl$19","_el$89","_el$90","_co$16","_el$88","_el$86","_tmpl$18","_el$87","_v$8","_v$9","_v$0","height","ImageRenderer","_el$91","_tmpl$21","_el$92","_el$93","_el$94","_el$97","_el$98","_co$17","caption","_el$95","_tmpl$20","_el$96","_v$1","_v$10","_v$11","LinkRenderer","_el$99","_tmpl$23","_el$100","_el$101","_el$102","_el$104","_el$105","_co$18","stopPropagation","description","_el$103","_tmpl$22","ComponentRenderer","validation","validateComponent","valid","details","errors","_el$106","_tmpl$24","_el$107","_el$108","GenerativeUIErrorBoundary","componentType","allowRetry","ActionRenderer","GridRenderer","CarouselRenderer","items","ArtifactRenderer","execute","isExecuting","useAction","handleClick","action","toolName","preventDefault","isDisabled","disabled","_el$109","_tmpl$26","_el$111","_el$112","_co$19","_el$113","_el$114","_co$20","icon","_el$110","_tmpl$25","_v$12","_v$13","_v$14","variant","_el$115","_tmpl$28","_el$118","_el$119","_co$21","_el$120","_el$121","_co$22","_el$122","_el$123","_co$23","_tmpl$27","_el$117","_v$15","_v$16","_v$17","size","ErrorCardRenderer","getErrorText","tool","_el$124","_tmpl$32","_el$147","_el$148","_co$29","_el$125","_el$126","_el$127","_el$128","_el$129","_el$130","_el$131","_co$24","_el$132","_el$141","_el$142","_co$26","_el$143","_el$144","_co$27","_el$145","_el$146","_co$28","_el$133","_tmpl$29","_el$134","_el$135","_el$136","_co$25","suggestions","length","_el$137","_tmpl$30","_el$138","_el$139","suggestion","_el$149","_tmpl$33","timestamp","_el$140","_tmpl$31","Date","toLocaleString","isErrorResponse","isUIResource","uri","startsWith","htmlString","UIResourceHtmlRenderer","resource","resourceTitle","metadata","_el$150","_tmpl$35","_el$154","_el$155","_co$30","_el$153","_el$151","_tmpl$34","_el$152","UIResourceRenderer","layout","components","grid","gap","gridContainerStyle","layoutData","getGridStyleString","colStart","colSpan","rowStart","rowSpan","shouldShowAutoFooter","hideFooter","hasExplicitFooter","some","executionTime","sourceCount","llmModel","autoFooterParams","poweredBy","model","_el$156","_tmpl$36","_el$157","_el$158","_el$159","_co$31","_el$160","_tmpl$37","FooterRenderer","_v$18","class","_v$19","_$delegateEvents"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UIResourceRenderer.d.ts","sourceRoot":"","sources":["../../src/components/UIResourceRenderer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAqD,MAAM,UAAU,CAAA;AAEvF,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"UIResourceRenderer.d.ts","sourceRoot":"","sources":["../../src/components/UIResourceRenderer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAqD,MAAM,UAAU,CAAA;AAEvF,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAA;AAsDnF;;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;AA4tBD;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,uBAAuB,CAsGjE,CAAA"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import { delegateEvents, getNextElement, template, getNextMarker, insert,
|
|
1
|
+
import { delegateEvents, createComponent, getNextElement, template, getNextMarker, insert, effect, style, className, setProperty, setAttribute, runHydrationEvents, memo } from "solid-js/web";
|
|
2
2
|
import purify from "../node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.js";
|
|
3
3
|
import { createMemo, For, Show, createSignal, createEffect } from "solid-js";
|
|
4
4
|
import { validateComponent, DEFAULT_RESOURCE_LIMITS } from "../services/validation.js";
|
|
5
5
|
import { GenerativeUIErrorBoundary } from "./GenerativeUIErrorBoundary.js";
|
|
6
6
|
import { GridRenderer } from "./GridRenderer.js";
|
|
7
7
|
import { FooterRenderer } from "./FooterRenderer.js";
|
|
8
|
+
import { CarouselRenderer } from "./CarouselRenderer.js";
|
|
9
|
+
import { ArtifactRenderer } from "./ArtifactRenderer.js";
|
|
8
10
|
import { useAction } from "../hooks/useAction.js";
|
|
9
11
|
import { marked as k } from "../node_modules/.pnpm/marked@16.4.2/node_modules/marked/lib/marked.esm.js";
|
|
10
|
-
var _tmpl$ = /* @__PURE__ */ template(`<svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z">`), _tmpl$2 = /* @__PURE__ */ template(`<button>`), _tmpl$3 = /* @__PURE__ */ template(`<svg class="w-3 h-3 text-green-500"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M5 13l4 4L19 7">`), _tmpl$4 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600">`), _tmpl$5 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center p-4"><div class=text-center><p class="text-red-600 dark:text-red-400 text-sm font-medium">Chart Error</p><p class="text-gray-600 dark:text-gray-400 text-xs mt-1">`), _tmpl$6 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$7 = /* @__PURE__ */ template(`<div class="w-full h-full p-4"><!$><!/><div class="w-full h-full"><img alt="Chart visualization"class="w-full h-auto max-h-[300px] object-contain">`), _tmpl$8 = /* @__PURE__ */ template(`<div class="relative w-full h-full min-h-[300px] bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><!$><!/><!$><!/>`), _tmpl$9 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>Showing <!$><!/> - <!$><!/> of <!$><!/>`), _tmpl$0 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden group"><!$><!/><div class=p-4><!$><!/><div class=overflow-x-auto><table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0"><thead class="bg-gray-50 dark:bg-gray-900/50"><tr></tr></thead><tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700"></tbody></table></div><!$><!/>`), _tmpl$1 = /* @__PURE__ */ template(`<th scope=col class="px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 first:pl-6 last:pr-6">`), _tmpl$10 = /* @__PURE__ */ template(`<tr>`), _tmpl$11 = /* @__PURE__ */ template(`<td class="px-6 py-4 text-sm text-gray-700 dark:text-gray-200 whitespace-normal break-words leading-relaxed first:pl-6 last:pr-6"><div>`), _tmpl$12 = /* @__PURE__ */ template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$13 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$14 = /* @__PURE__ */ template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$15 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group"><!$><!/><div class="flex flex-col h-full justify-between"><div><p class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide"></p><div class="mt-2 flex items-baseline"><p class="text-2xl font-semibold text-gray-900 dark:text-white"></p><!$><!/></div></div><!$><!/><!$><!/>`), _tmpl$16 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group"><!$><!/><div>`), _tmpl$17 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"><a target=_blank rel="noopener noreferrer"class=cursor-zoom-in><img class="max-w-full max-h-[400px] object-contain rounded shadow-sm hover:opacity-90 transition-opacity"loading=lazy></a></div><div class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center italic">`, true, false, false), _tmpl$18 = /* @__PURE__ */ template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$19 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><!$><!/><iframe class="w-full border-0 flex-1"sandbox="allow-scripts allow-same-origin allow-popups allow-forms"loading=lazy>`, true, false, false), _tmpl$20 = /* @__PURE__ */ template(`<div class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center">`), _tmpl$21 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"><a target=_blank rel="noopener noreferrer"class=cursor-zoom-in><img class="max-w-full max-h-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity"loading=lazy></a></div><!$><!/>`, true, false, false), _tmpl$22 = /* @__PURE__ */ template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$23 = /* @__PURE__ */ template(`<a target=_blank rel="noopener noreferrer"class="flex items-center gap-3 p-4 bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors group h-full"><div class="p-2 bg-blue-50 dark:bg-blue-900/30 rounded-full text-blue-600 dark:text-blue-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/50 shrink-0 transition-colors"><svg xmlns=http://www.w3.org/2000/svg class="w-5 h-5"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-medium text-gray-900 dark:text-white truncate group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors"></h4><!$><!/></div><svg xmlns=http://www.w3.org/2000/svg class="w-4 h-4 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-gray-300 shrink-0 transition-colors"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3>`), _tmpl$24 = /* @__PURE__ */ template(`<div class="w-full h-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4"><p class="text-sm font-medium text-red-900 dark:text-red-100">Validation Error</p><p class="text-xs text-red-700 dark:text-red-300 mt-1">`), _tmpl$25 = /* @__PURE__ */ template(`<span>`), _tmpl$26 = /* @__PURE__ */ template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$27 = /* @__PURE__ */ template(`<span class="animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full">`), _tmpl$28 = /* @__PURE__ */ template(`<button><!$><!/><!$><!/><!$><!/>`), _tmpl$29 = /* @__PURE__ */ template(`<div><div class="grid gap-4"></div><!$><!/>`), _tmpl$
|
|
12
|
+
var _tmpl$ = /* @__PURE__ */ template(`<svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z">`), _tmpl$2 = /* @__PURE__ */ template(`<button>`), _tmpl$3 = /* @__PURE__ */ template(`<svg class="w-3 h-3 text-green-500"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M5 13l4 4L19 7">`), _tmpl$4 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600">`), _tmpl$5 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center p-4"><div class=text-center><p class="text-red-600 dark:text-red-400 text-sm font-medium">Chart Error</p><p class="text-gray-600 dark:text-gray-400 text-xs mt-1">`), _tmpl$6 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$7 = /* @__PURE__ */ template(`<div class="w-full h-full p-4"><!$><!/><div class="w-full h-full"><img alt="Chart visualization"class="w-full h-auto max-h-[300px] object-contain">`), _tmpl$8 = /* @__PURE__ */ template(`<div class="relative w-full h-full min-h-[300px] bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><!$><!/><!$><!/>`), _tmpl$9 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>Showing <!$><!/> - <!$><!/> of <!$><!/>`), _tmpl$0 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden group"><!$><!/><div class=p-4><!$><!/><div class=overflow-x-auto><table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0"><thead class="bg-gray-50 dark:bg-gray-900/50"><tr></tr></thead><tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700"></tbody></table></div><!$><!/>`), _tmpl$1 = /* @__PURE__ */ template(`<th scope=col class="px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 first:pl-6 last:pr-6">`), _tmpl$10 = /* @__PURE__ */ template(`<tr>`), _tmpl$11 = /* @__PURE__ */ template(`<td class="px-6 py-4 text-sm text-gray-700 dark:text-gray-200 whitespace-normal break-words leading-relaxed first:pl-6 last:pr-6"><div>`), _tmpl$12 = /* @__PURE__ */ template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$13 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$14 = /* @__PURE__ */ template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$15 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group"><!$><!/><div class="flex flex-col h-full justify-between"><div><p class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide"></p><div class="mt-2 flex items-baseline"><p class="text-2xl font-semibold text-gray-900 dark:text-white"></p><!$><!/></div></div><!$><!/><!$><!/>`), _tmpl$16 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group"><!$><!/><div>`), _tmpl$17 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"><a target=_blank rel="noopener noreferrer"class=cursor-zoom-in><img class="max-w-full max-h-[400px] object-contain rounded shadow-sm hover:opacity-90 transition-opacity"loading=lazy></a></div><div class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center italic">`, true, false, false), _tmpl$18 = /* @__PURE__ */ template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$19 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><!$><!/><iframe class="w-full border-0 flex-1"sandbox="allow-scripts allow-same-origin allow-popups allow-forms"loading=lazy>`, true, false, false), _tmpl$20 = /* @__PURE__ */ template(`<div class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center">`), _tmpl$21 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"><a target=_blank rel="noopener noreferrer"class=cursor-zoom-in><img class="max-w-full max-h-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity"loading=lazy></a></div><!$><!/>`, true, false, false), _tmpl$22 = /* @__PURE__ */ template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$23 = /* @__PURE__ */ template(`<a target=_blank rel="noopener noreferrer"class="flex items-center gap-3 p-4 bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors group h-full"><div class="p-2 bg-blue-50 dark:bg-blue-900/30 rounded-full text-blue-600 dark:text-blue-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/50 shrink-0 transition-colors"><svg xmlns=http://www.w3.org/2000/svg class="w-5 h-5"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-medium text-gray-900 dark:text-white truncate group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors"></h4><!$><!/></div><svg xmlns=http://www.w3.org/2000/svg class="w-4 h-4 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-gray-300 shrink-0 transition-colors"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3>`), _tmpl$24 = /* @__PURE__ */ template(`<div class="w-full h-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4"><p class="text-sm font-medium text-red-900 dark:text-red-100">Validation Error</p><p class="text-xs text-red-700 dark:text-red-300 mt-1">`), _tmpl$25 = /* @__PURE__ */ template(`<span>`), _tmpl$26 = /* @__PURE__ */ template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$27 = /* @__PURE__ */ template(`<span class="animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full">`), _tmpl$28 = /* @__PURE__ */ template(`<button><!$><!/><!$><!/><!$><!/>`), _tmpl$29 = /* @__PURE__ */ template(`<p class="text-xs text-red-600 dark:text-red-400 mt-1">Type: <!$><!/>`), _tmpl$30 = /* @__PURE__ */ template(`<div class=mt-3><p class="text-xs font-medium text-red-700 dark:text-red-300">Suggestions:</p><ul class="mt-1 text-xs text-red-600 dark:text-red-400 list-disc list-inside">`), _tmpl$31 = /* @__PURE__ */ template(`<p class="text-xs text-red-500 dark:text-red-500 mt-2">`), _tmpl$32 = /* @__PURE__ */ template(`<div class="relative w-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 group"><!$><!/><div class="flex items-start gap-3"><div class="p-2 bg-red-100 dark:bg-red-900/40 rounded-full shrink-0"><svg class="w-5 h-5 text-red-600 dark:text-red-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-semibold text-red-800 dark:text-red-200">Tool Error: <!$><!/></h4><p class="text-sm text-red-700 dark:text-red-300 mt-1"></p><!$><!/><!$><!/><!$><!/>`), _tmpl$33 = /* @__PURE__ */ template(`<li>`), _tmpl$34 = /* @__PURE__ */ template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white capitalize">`), _tmpl$35 = /* @__PURE__ */ template(`<div class="w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><div class="p-4 prose prose-sm dark:prose-invert max-w-none">`), _tmpl$36 = /* @__PURE__ */ template(`<div><div class="grid gap-4"></div><!$><!/>`), _tmpl$37 = /* @__PURE__ */ template(`<div>`);
|
|
11
13
|
function CopyButton(props) {
|
|
12
14
|
const [copied, setCopied] = createSignal(false);
|
|
13
15
|
const handleCopy = async () => {
|
|
@@ -595,6 +597,33 @@ function ComponentRenderer(props) {
|
|
|
595
597
|
}
|
|
596
598
|
});
|
|
597
599
|
}
|
|
600
|
+
}), createComponent(Show, {
|
|
601
|
+
get when() {
|
|
602
|
+
return props.component.type === "carousel";
|
|
603
|
+
},
|
|
604
|
+
get children() {
|
|
605
|
+
return createComponent(CarouselRenderer, {
|
|
606
|
+
get items() {
|
|
607
|
+
var _a2;
|
|
608
|
+
return ((_a2 = props.component.params) == null ? void 0 : _a2.items) || [];
|
|
609
|
+
},
|
|
610
|
+
get height() {
|
|
611
|
+
var _a2;
|
|
612
|
+
return (_a2 = props.component.params) == null ? void 0 : _a2.height;
|
|
613
|
+
}
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
}), createComponent(Show, {
|
|
617
|
+
get when() {
|
|
618
|
+
return props.component.type === "artifact";
|
|
619
|
+
},
|
|
620
|
+
get children() {
|
|
621
|
+
return createComponent(ArtifactRenderer, {
|
|
622
|
+
get params() {
|
|
623
|
+
return props.component.params;
|
|
624
|
+
}
|
|
625
|
+
});
|
|
626
|
+
}
|
|
598
627
|
})];
|
|
599
628
|
}
|
|
600
629
|
});
|
|
@@ -683,7 +712,113 @@ function ActionRenderer(props) {
|
|
|
683
712
|
return _el$115;
|
|
684
713
|
})();
|
|
685
714
|
}
|
|
715
|
+
function ErrorCardRenderer(props) {
|
|
716
|
+
const getErrorText = () => {
|
|
717
|
+
return `Error in ${props.error.tool || "unknown tool"}: ${props.error.message || "Unknown error"}`;
|
|
718
|
+
};
|
|
719
|
+
return (() => {
|
|
720
|
+
var _el$124 = getNextElement(_tmpl$32), _el$147 = _el$124.firstChild, [_el$148, _co$29] = getNextMarker(_el$147.nextSibling), _el$125 = _el$148.nextSibling, _el$126 = _el$125.firstChild, _el$127 = _el$126.nextSibling, _el$128 = _el$127.firstChild, _el$129 = _el$128.firstChild, _el$130 = _el$129.nextSibling, [_el$131, _co$24] = getNextMarker(_el$130.nextSibling), _el$132 = _el$128.nextSibling, _el$141 = _el$132.nextSibling, [_el$142, _co$26] = getNextMarker(_el$141.nextSibling), _el$143 = _el$142.nextSibling, [_el$144, _co$27] = getNextMarker(_el$143.nextSibling), _el$145 = _el$144.nextSibling, [_el$146, _co$28] = getNextMarker(_el$145.nextSibling);
|
|
721
|
+
insert(_el$124, createComponent(CopyButton, {
|
|
722
|
+
getText: getErrorText,
|
|
723
|
+
title: "Copy error details",
|
|
724
|
+
position: "top-right"
|
|
725
|
+
}), _el$148, _co$29);
|
|
726
|
+
insert(_el$128, () => props.error.tool || "Unknown", _el$131, _co$24);
|
|
727
|
+
insert(_el$132, () => props.error.message || "An error occurred during tool execution");
|
|
728
|
+
insert(_el$127, createComponent(Show, {
|
|
729
|
+
get when() {
|
|
730
|
+
return props.error.type;
|
|
731
|
+
},
|
|
732
|
+
get children() {
|
|
733
|
+
var _el$133 = getNextElement(_tmpl$29), _el$134 = _el$133.firstChild, _el$135 = _el$134.nextSibling, [_el$136, _co$25] = getNextMarker(_el$135.nextSibling);
|
|
734
|
+
insert(_el$133, () => props.error.type, _el$136, _co$25);
|
|
735
|
+
return _el$133;
|
|
736
|
+
}
|
|
737
|
+
}), _el$142, _co$26);
|
|
738
|
+
insert(_el$127, createComponent(Show, {
|
|
739
|
+
get when() {
|
|
740
|
+
var _a;
|
|
741
|
+
return (_a = props.error.suggestions) == null ? void 0 : _a.length;
|
|
742
|
+
},
|
|
743
|
+
get children() {
|
|
744
|
+
var _el$137 = getNextElement(_tmpl$30), _el$138 = _el$137.firstChild, _el$139 = _el$138.nextSibling;
|
|
745
|
+
insert(_el$139, createComponent(For, {
|
|
746
|
+
get each() {
|
|
747
|
+
return props.error.suggestions;
|
|
748
|
+
},
|
|
749
|
+
children: (suggestion) => (() => {
|
|
750
|
+
var _el$149 = getNextElement(_tmpl$33);
|
|
751
|
+
insert(_el$149, suggestion);
|
|
752
|
+
return _el$149;
|
|
753
|
+
})()
|
|
754
|
+
}));
|
|
755
|
+
return _el$137;
|
|
756
|
+
}
|
|
757
|
+
}), _el$144, _co$27);
|
|
758
|
+
insert(_el$127, createComponent(Show, {
|
|
759
|
+
get when() {
|
|
760
|
+
return props.error.timestamp;
|
|
761
|
+
},
|
|
762
|
+
get children() {
|
|
763
|
+
var _el$140 = getNextElement(_tmpl$31);
|
|
764
|
+
insert(_el$140, () => new Date(props.error.timestamp).toLocaleString());
|
|
765
|
+
return _el$140;
|
|
766
|
+
}
|
|
767
|
+
}), _el$146, _co$28);
|
|
768
|
+
return _el$124;
|
|
769
|
+
})();
|
|
770
|
+
}
|
|
771
|
+
function isErrorResponse(content) {
|
|
772
|
+
return content && typeof content === "object" && content.error === true;
|
|
773
|
+
}
|
|
774
|
+
function isUIResource(content) {
|
|
775
|
+
var _a, _b, _c;
|
|
776
|
+
return content && typeof content === "object" && (((_a = content.uri) == null ? void 0 : _a.startsWith("ui://")) || ((_b = content.content) == null ? void 0 : _b.type) === "rawHtml" || ((_c = content.content) == null ? void 0 : _c.htmlString));
|
|
777
|
+
}
|
|
778
|
+
function UIResourceHtmlRenderer(props) {
|
|
779
|
+
const htmlContent = () => {
|
|
780
|
+
var _a;
|
|
781
|
+
if ((_a = props.resource.content) == null ? void 0 : _a.htmlString) {
|
|
782
|
+
return purify.sanitize(props.resource.content.htmlString);
|
|
783
|
+
}
|
|
784
|
+
return "";
|
|
785
|
+
};
|
|
786
|
+
const resourceTitle = () => {
|
|
787
|
+
var _a, _b;
|
|
788
|
+
return ((_a = props.resource.metadata) == null ? void 0 : _a.title) || ((_b = props.resource.uri) == null ? void 0 : _b.replace("ui://deposium/", "")) || "Resource";
|
|
789
|
+
};
|
|
790
|
+
return (() => {
|
|
791
|
+
var _el$150 = getNextElement(_tmpl$35), _el$154 = _el$150.firstChild, [_el$155, _co$30] = getNextMarker(_el$154.nextSibling), _el$153 = _el$155.nextSibling;
|
|
792
|
+
insert(_el$150, createComponent(Show, {
|
|
793
|
+
get when() {
|
|
794
|
+
var _a;
|
|
795
|
+
return ((_a = props.resource.metadata) == null ? void 0 : _a.title) || props.resource.uri;
|
|
796
|
+
},
|
|
797
|
+
get children() {
|
|
798
|
+
var _el$151 = getNextElement(_tmpl$34), _el$152 = _el$151.firstChild;
|
|
799
|
+
insert(_el$152, resourceTitle);
|
|
800
|
+
return _el$151;
|
|
801
|
+
}
|
|
802
|
+
}), _el$155, _co$30);
|
|
803
|
+
effect(() => setProperty(_el$153, "innerHTML", htmlContent()));
|
|
804
|
+
return _el$150;
|
|
805
|
+
})();
|
|
806
|
+
}
|
|
686
807
|
const UIResourceRenderer = (props) => {
|
|
808
|
+
if (isErrorResponse(props.content)) {
|
|
809
|
+
return createComponent(ErrorCardRenderer, {
|
|
810
|
+
get error() {
|
|
811
|
+
return props.content;
|
|
812
|
+
}
|
|
813
|
+
});
|
|
814
|
+
}
|
|
815
|
+
if (isUIResource(props.content)) {
|
|
816
|
+
return createComponent(UIResourceHtmlRenderer, {
|
|
817
|
+
get resource() {
|
|
818
|
+
return props.content;
|
|
819
|
+
}
|
|
820
|
+
});
|
|
821
|
+
}
|
|
687
822
|
const layout = () => {
|
|
688
823
|
if ("type" in props.content && props.content.type !== "composite") {
|
|
689
824
|
return {
|
|
@@ -740,24 +875,24 @@ const UIResourceRenderer = (props) => {
|
|
|
740
875
|
});
|
|
741
876
|
const layoutData = layout();
|
|
742
877
|
return (() => {
|
|
743
|
-
var _el$
|
|
744
|
-
insert(_el$
|
|
878
|
+
var _el$156 = getNextElement(_tmpl$36), _el$157 = _el$156.firstChild, _el$158 = _el$157.nextSibling, [_el$159, _co$31] = getNextMarker(_el$158.nextSibling);
|
|
879
|
+
insert(_el$157, createComponent(For, {
|
|
745
880
|
get each() {
|
|
746
881
|
return layoutData.components;
|
|
747
882
|
},
|
|
748
883
|
children: (component) => (() => {
|
|
749
|
-
var _el$
|
|
750
|
-
insert(_el$
|
|
884
|
+
var _el$160 = getNextElement(_tmpl$37);
|
|
885
|
+
insert(_el$160, createComponent(ComponentRenderer, {
|
|
751
886
|
component,
|
|
752
887
|
get onError() {
|
|
753
888
|
return props.onError;
|
|
754
889
|
}
|
|
755
890
|
}));
|
|
756
|
-
effect((_$p) => style(_el$
|
|
757
|
-
return _el$
|
|
891
|
+
effect((_$p) => style(_el$160, getGridStyleString(component), _$p));
|
|
892
|
+
return _el$160;
|
|
758
893
|
})()
|
|
759
894
|
}));
|
|
760
|
-
insert(_el$
|
|
895
|
+
insert(_el$156, createComponent(Show, {
|
|
761
896
|
get when() {
|
|
762
897
|
return shouldShowAutoFooter();
|
|
763
898
|
},
|
|
@@ -768,17 +903,17 @@ const UIResourceRenderer = (props) => {
|
|
|
768
903
|
}
|
|
769
904
|
});
|
|
770
905
|
}
|
|
771
|
-
}), _el$
|
|
906
|
+
}), _el$159, _co$31);
|
|
772
907
|
effect((_p$) => {
|
|
773
908
|
var _v$18 = `w-full ${props.class || ""}`, _v$19 = gridContainerStyle();
|
|
774
|
-
_v$18 !== _p$.e && className(_el$
|
|
775
|
-
_p$.t = style(_el$
|
|
909
|
+
_v$18 !== _p$.e && className(_el$156, _p$.e = _v$18);
|
|
910
|
+
_p$.t = style(_el$157, _v$19, _p$.t);
|
|
776
911
|
return _p$;
|
|
777
912
|
}, {
|
|
778
913
|
e: void 0,
|
|
779
914
|
t: void 0
|
|
780
915
|
});
|
|
781
|
-
return _el$
|
|
916
|
+
return _el$156;
|
|
782
917
|
})();
|
|
783
918
|
};
|
|
784
919
|
delegateEvents(["click"]);
|