@seed-ship/mcp-ui-solid 2.2.6 → 2.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/UIResourceRenderer.cjs +2 -2
- package/dist/components/UIResourceRenderer.cjs.map +1 -1
- package/dist/components/UIResourceRenderer.js +2 -2
- package/dist/components/UIResourceRenderer.js.map +1 -1
- package/dist/services/validation.cjs +12 -1
- package/dist/services/validation.cjs.map +1 -1
- package/dist/services/validation.d.ts.map +1 -1
- package/dist/services/validation.js +12 -1
- package/dist/services/validation.js.map +1 -1
- package/package.json +1 -1
- package/src/components/UIResourceRenderer.tsx +2 -2
- package/src/components/renderCellValue.test.ts +24 -0
- package/src/services/validation.ts +12 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -236,8 +236,8 @@ function renderCellValue(value) {
|
|
|
236
236
|
const hasHtml = /<[a-z][\s\S]*>/i.test(strValue);
|
|
237
237
|
if (hasHtml) {
|
|
238
238
|
return purify_es.sanitize(strValue, {
|
|
239
|
-
ALLOWED_TAGS: ["a", "strong", "em", "b", "i", "code", "span", "br"],
|
|
240
|
-
ALLOWED_ATTR: ["href", "target", "rel", "class", "data-citation-page", "data-citation-source", "title"],
|
|
239
|
+
ALLOWED_TAGS: ["a", "strong", "em", "b", "i", "code", "span", "br", "button", "svg", "path"],
|
|
240
|
+
ALLOWED_ATTR: ["href", "target", "rel", "class", "data-citation-page", "data-citation-source", "data-citation-doc", "data-citation-verified", "title", "fill", "stroke", "viewBox", "stroke-linecap", "stroke-linejoin", "stroke-width", "d"],
|
|
241
241
|
ADD_ATTR: ["target", "rel"]
|
|
242
242
|
});
|
|
243
243
|
}
|
|
@@ -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, TableVirtualizeOptions } 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 { FormRenderer } from './FormRenderer'\nimport { ModalRenderer } from './ModalRenderer'\nimport { ActionGroupRenderer } from './ActionGroupRenderer'\nimport { ChartJSRenderer, isChartJSAvailable } from './ChartJSRenderer'\nimport { ImageGalleryRenderer } from './ImageGalleryRenderer'\nimport { VideoRenderer } from './VideoRenderer'\nimport { CodeBlockRenderer } from './CodeBlockRenderer'\nimport { MapRenderer } from './MapRenderer'\nimport { ExpandableWrapper } from './ExpandableWrapper'\nimport { RenderProvider } from './RenderContext'\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 */\n/**\n * Smart Chart Renderer - Sprint 4\n * Supports native Chart.js or Quickchart.io iframe fallback\n */\nfunction ChartRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n}) {\n const [useNative, setUseNative] = createSignal(false)\n const [iframeUrl, setIframeUrl] = createSignal<string>()\n const [isLoading, setIsLoading] = createSignal(true)\n const [error, setError] = createSignal<string>()\n\n const params = () => props.component.params as any\n const rendererPref = () => params()?.renderer || 'auto'\n\n // Check renderer preference and Chart.js availability\n createEffect(async () => {\n const pref = rendererPref()\n\n if (pref === 'iframe') {\n // Force iframe mode\n setUseNative(false)\n buildIframeUrl()\n } else if (pref === 'native') {\n // Force native mode - will show error if Chart.js not available\n const available = await isChartJSAvailable()\n if (available) {\n setUseNative(true)\n setIsLoading(false)\n } else {\n setError('Chart.js is not available. Install chart.js peer dependency.')\n setIsLoading(false)\n }\n } else {\n // Auto mode - use native if available, otherwise iframe\n const available = await isChartJSAvailable()\n if (available) {\n setUseNative(true)\n setIsLoading(false)\n } else {\n setUseNative(false)\n buildIframeUrl()\n }\n }\n })\n\n const buildIframeUrl = () => {\n const chartParams = params()\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 setIframeUrl(url)\n setIsLoading(false)\n }\n\n // Use native Chart.js renderer\n if (useNative()) {\n return (\n <ChartJSRenderer\n component={props.component}\n onError={(err) => props.onError?.({\n type: 'render',\n message: err.message,\n componentId: props.component.id,\n })}\n />\n )\n }\n\n // Iframe fallback (Quickchart.io)\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={params()?.title}>\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white mb-3\">\n {params()?.title}\n </h3>\n </Show>\n <div class=\"w-full h-full\" role=\"img\" aria-label={params()?.title ? `Chart: ${params()?.title}` : 'Chart visualization'}>\n <img\n src={iframeUrl()}\n alt={params()?.title ? `Chart: ${params()?.title}` : '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 */\nexport function 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 // Detect raw HTML in cell values (e.g. <a href=\"...\" data-citation-page=\"5\">text</a>)\n // This handles cases where cell data comes from innerHTML extraction\n const hasHtml = /<[a-z][\\s\\S]*>/i.test(strValue)\n if (hasHtml) {\n return DOMPurify.sanitize(strValue, {\n ALLOWED_TAGS: ['a', 'strong', 'em', 'b', 'i', 'code', 'span', 'br'],\n ALLOWED_ATTR: ['href', 'target', 'rel', 'class', 'data-citation-page', 'data-citation-source', 'title'],\n ADD_ATTR: ['target', 'rel'],\n })\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 — sanitize to prevent XSS via innerHTML\n return DOMPurify.sanitize(strValue)\n}\n\n/**\n * Render a table component\n * Sprint Ultimate U.3: Added virtualization support for large datasets\n */\nfunction TableRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n}) {\n const tableParams = props.component.params as any\n let scrollContainerRef: HTMLDivElement | undefined\n\n // Virtualization state\n const [virtualizer, setVirtualizer] = createSignal<any>(null)\n const [isVirtualizing, setIsVirtualizing] = createSignal(false)\n\n // Determine if virtualization should be enabled\n const shouldVirtualize = createMemo(() => {\n const opts = tableParams.virtualize\n if (opts === false) return false\n if (opts === true) return true\n if (typeof opts === 'object') {\n if (opts.enabled !== undefined) return opts.enabled\n const threshold = opts.threshold ?? 100\n return (tableParams.rows?.length ?? 0) > threshold\n }\n // Auto-enable if > 100 rows by default\n return (tableParams.rows?.length ?? 0) > 100\n })\n\n // Get virtualization options\n const virtualizeOpts = createMemo((): TableVirtualizeOptions => {\n const opts = tableParams.virtualize\n if (typeof opts === 'object') return opts\n return {}\n })\n\n // Initialize virtualizer when needed\n createEffect(async () => {\n if (isServer || !shouldVirtualize()) {\n setIsVirtualizing(false)\n return\n }\n\n try {\n const { createVirtualizer } = await import('@tanstack/solid-virtual')\n const opts = virtualizeOpts()\n const rowHeight = opts.rowHeight ?? 48\n const overscan = opts.overscan ?? 5\n\n const v = createVirtualizer({\n get count() { return tableParams.rows?.length ?? 0 },\n getScrollElement: () => scrollContainerRef ?? null,\n estimateSize: () => rowHeight,\n overscan,\n })\n\n setVirtualizer(v)\n setIsVirtualizing(true)\n } catch (e) {\n console.warn('Failed to load @tanstack/solid-virtual, falling back to regular table', e)\n setIsVirtualizing(false)\n }\n })\n\n // Cell value extraction helper\n const getCellValue = (row: any, key: string): string => {\n const value = row[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 }\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) => getCellValue(row, c.key)).join('\\t')\n ).join('\\n')\n return `${header}\\n${dataRows}`\n }\n\n // CSV generation (RFC 4180 compliant)\n const getTableCSV = () => {\n const columns = tableParams.columns || []\n const rows = tableParams.rows || []\n const escapeCSV = (val: string) => {\n if (val.includes(',') || val.includes('\"') || val.includes('\\n')) {\n return `\"${val.replace(/\"/g, '\"\"')}\"`\n }\n return val\n }\n const header = columns.map((c: any) => escapeCSV(c.label)).join(',')\n const dataRows = rows.map((row: any) =>\n columns.map((c: any) => escapeCSV(getCellValue(row, c.key))).join(',')\n ).join('\\n')\n return `${header}\\n${dataRows}`\n }\n\n // JSON generation\n const getTableJSON = () => {\n const columns = tableParams.columns || []\n const rows = tableParams.rows || []\n return JSON.stringify({ columns: columns.map((c: any) => ({ key: c.key, label: c.label })), rows }, null, 2)\n }\n\n // Download helper\n const downloadFile = (content: string, filename: string, mimeType: string) => {\n const blob = new Blob([content], { type: mimeType })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n }\n\n // Export config\n const exportable = tableParams.exportable\n const exportFormats = typeof exportable === 'object' && exportable?.formats\n ? exportable.formats\n : ['csv', 'tsv', 'json']\n const exportFilename = (typeof exportable === 'object' && exportable?.filename) || `table-${Math.random().toString(36).slice(2, 9)}`\n\n // Export dropdown state\n const [showExportMenu, setShowExportMenu] = createSignal(false)\n\n const handleExport = (format: string) => {\n setShowExportMenu(false)\n switch (format) {\n case 'tsv':\n navigator.clipboard.writeText(getTableText())\n break\n case 'csv':\n downloadFile(getTableCSV(), `${exportFilename}.csv`, 'text/csv')\n break\n case 'json':\n downloadFile(getTableJSON(), `${exportFilename}.json`, 'application/json')\n break\n }\n }\n\n const tableId = `table-${Math.random().toString(36).slice(2, 9)}`\n\n // Standard table body (non-virtualized)\n const StandardTableBody = () => (\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 )\n\n // Virtualized table body\n const VirtualizedTableBody = () => {\n const v = virtualizer()\n if (!v) return null\n\n const items = v.getVirtualItems()\n const totalSize = v.getTotalSize()\n const opts = virtualizeOpts()\n const rowHeight = opts.rowHeight ?? 48\n\n return (\n <tbody\n class=\"bg-white dark:bg-gray-800 relative\"\n style={{ height: `${totalSize}px` }}\n >\n <For each={items}>\n {(virtualRow: any) => {\n const row = tableParams.rows[virtualRow.index]\n return (\n <tr\n class={`hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors absolute left-0 right-0 ${virtualRow.index % 2 === 0 ? 'bg-white dark:bg-gray-800' : 'bg-gray-50/30 dark:bg-gray-800/50'}`}\n style={{\n height: `${rowHeight}px`,\n transform: `translateY(${virtualRow.start}px)`\n }}\n >\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 }}\n </For>\n </tbody>\n )\n }\n\n return (\n <ExpandableWrapper title={tableParams.title || 'Table'} copyData={getTableText()} copyLabel=\"Copy table (TSV)\">\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 <Show when={exportable} fallback={<CopyButton getText={getTableText} title=\"Copy table data\" position=\"top-right\" />}>\n <div class=\"absolute right-10 top-2 z-10\">\n <button\n onClick={() => setShowExportMenu(!showExportMenu())}\n class=\"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\"\n title=\"Export table\"\n aria-label=\"Export table\"\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=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n </button>\n <Show when={showExportMenu()}>\n <div class=\"absolute right-0 mt-1 w-36 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-lg shadow-lg py-1 text-sm\">\n <Show when={(exportFormats as string[]).includes('tsv')}>\n <button onClick={() => handleExport('tsv')} class=\"w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300\">Copy TSV</button>\n </Show>\n <Show when={(exportFormats as string[]).includes('csv')}>\n <button onClick={() => handleExport('csv')} class=\"w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300\">Download CSV</button>\n </Show>\n <Show when={(exportFormats as string[]).includes('json')}>\n <button onClick={() => handleExport('json')} class=\"w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300\">Download JSON</button>\n </Show>\n </div>\n </Show>\n </div>\n </Show>\n <div class=\"p-4\">\n <Show when={tableParams.title}>\n <h3 id={`${tableId}-title`} class=\"text-sm font-semibold text-gray-900 dark:text-white mb-3\">\n {tableParams.title}\n <Show when={isVirtualizing()}>\n <span class=\"ml-2 text-xs font-normal text-gray-400\">(virtualized: {tableParams.rows?.length} rows)</span>\n </Show>\n </h3>\n </Show>\n\n <div\n ref={scrollContainerRef}\n class=\"overflow-x-auto\"\n style={isVirtualizing() ? { 'max-height': '500px', 'overflow-y': 'auto' } : {}}\n role=\"region\"\n aria-label={tableParams.title || 'Data table'}\n tabindex=\"0\"\n >\n <table\n class=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0\"\n aria-labelledby={tableParams.title ? `${tableId}-title` : undefined}\n >\n <thead class=\"bg-gray-50 dark:bg-gray-900/50 sticky top-0 z-10\">\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 bg-gray-50 dark:bg-gray-900/50\"\n style={column.width ? { width: column.width } : {}}\n >\n {column.label}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <Show when={isVirtualizing()} fallback={<StandardTableBody />}>\n <VirtualizedTableBody />\n </Show>\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 </ExpandableWrapper>\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 <figure 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 ${params.className || ''}`}>\n <div class=\"flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]\">\n <a\n href={params.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"cursor-zoom-in focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded\"\n aria-label={`View full size: ${params.alt || 'image'}`}\n >\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 <figcaption 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 </figcaption>\n </Show>\n </figure>\n )\n}\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 aria-label={`${params.label || 'Link'}: ${params.description || params.url} (opens in new tab)`}\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 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 ${params.className || ''}`}\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\" aria-hidden=\"true\">\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 aria-hidden=\"true\"\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 <Show when={props.component.type === 'form'}>\n <FormRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'modal'}>\n <ModalRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'action-group'}>\n <ActionGroupRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'image-gallery'}>\n <ImageGalleryRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'video'}>\n <VideoRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'code'}>\n <CodeBlockRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'map'}>\n <MapRenderer component={props.component} />\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 aria-label={params.ariaLabel || params.label}\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' :\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 ${params.className || ''}`}\n onClick={handleClick}\n >\n <Show when={params.icon}>\n <span aria-hidden=\"true\">{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 aria-busy={isExecuting() && params.action === 'tool-call'}\n aria-label={params.ariaLabel || params.label}\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 ${params.className || ''}`}\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\" aria-hidden=\"true\" />\n </Show>\n <Show when={params.icon && !(isExecuting() && params.action === 'tool-call')}>\n <span aria-hidden=\"true\">{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 // Wrapper function for RenderContext (breaks circular dependency)\n const renderComponent = (component: UIComponent, onError?: (error: RendererError) => void) => (\n <ComponentRenderer component={component} onError={onError} />\n )\n\n return (\n <RenderProvider renderComponent={renderComponent}>\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 </RenderProvider>\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","useNative","setUseNative","iframeUrl","setIframeUrl","isLoading","setIsLoading","setError","params","component","rendererPref","renderer","createEffect","pref","buildIframeUrl","available","isChartJSAvailable","chartParams","chartConfig","type","data","options","responsive","maintainAspectRatio","configStr","encodeURIComponent","JSON","stringify","url","ChartJSRenderer","onError","message","componentId","id","_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","_v$3","_v$4","_v$5","a","renderCellValue","value","label","name","sanitizedLabel","DOMPurify","sanitize","String","sanitizedUrl","strValue","replace","trim","toLowerCase","markdownLinkRegex","test","htmlValue","ADD_ATTR","hasHtml","ALLOWED_TAGS","ALLOWED_ATTR","hasMarkdown","parsed","marked","parse","async","TableRenderer","tableParams","scrollContainerRef","virtualizer","setVirtualizer","isVirtualizing","setIsVirtualizing","shouldVirtualize","createMemo","opts","virtualize","enabled","threshold","rows","length","virtualizeOpts","isServer","createVirtualizer","rowHeight","overscan","v","count","getScrollElement","estimateSize","warn","getCellValue","row","key","getTableText","columns","header","map","c","join","dataRows","getTableCSV","escapeCSV","val","includes","getTableJSON","downloadFile","content","filename","mimeType","blob","Blob","URL","createObjectURL","document","createElement","href","download","click","revokeObjectURL","exportable","exportFormats","formats","exportFilename","Math","random","toString","slice","showExportMenu","setShowExportMenu","handleExport","format","tableId","StandardTableBody","_el$20","_tmpl$9","For","each","DEFAULT_RESOURCE_LIMITS","maxTableRows","i","_el$21","_tmpl$0","column","_el$22","_tmpl$1","_el$23","_$setProperty","VirtualizedTableBody","items","getVirtualItems","totalSize","getTotalSize","_el$24","_tmpl$10","_$setStyleProperty","virtualRow","index","_el$25","_el$26","_el$27","_v$6","_v$7","start","ExpandableWrapper","copyData","copyLabel","_el$28","_tmpl$19","_el$77","_el$78","_co$16","_el$43","_el$73","_el$74","_co$14","_el$54","_el$55","_el$56","_el$57","_el$58","_el$59","_co$10","_el$75","_el$76","_co$15","_el$29","_tmpl$15","_el$30","_el$41","_el$42","_co$8","_el$31","_tmpl$14","_el$35","_el$36","_co$5","_el$37","_el$38","_co$6","_el$39","_el$40","_co$7","_el$32","_tmpl$11","_el$33","_tmpl$12","_el$34","_tmpl$13","_el$44","_tmpl$17","_el$50","_el$51","_co$0","_el$52","_el$53","_co$1","_el$45","_tmpl$16","_el$46","_el$48","_el$49","_co$9","_ref$","_$use","_el$79","_tmpl$20","_$p","_$style","width","pagination","_el$60","_tmpl$18","_el$61","_el$62","_el$67","_el$68","_co$11","_el$63","_el$69","_el$70","_co$12","_el$65","_el$71","_el$72","_co$13","currentPage","pageSize","min","totalRows","_v$8","_v$9","_v$0","MetricRenderer","metricParams","getMetricText","unit","_el$80","_tmpl$24","_el$102","_el$103","_co$22","_el$81","_el$82","_el$83","_el$84","_el$85","_el$87","_el$88","_co$17","_el$98","_el$99","_co$20","_el$100","_el$101","_co$21","_el$86","_tmpl$21","trend","_el$89","_tmpl$22","_el$90","_el$93","_el$94","_co$18","_el$91","_el$95","_el$96","_co$19","_c$","direction","abs","subtitle","_el$97","_tmpl$23","extractImageFromMarkdown","imagePattern","match","alt","imageUrl","linkUrl","credit","TextRenderer","textParams","imageData","markdown","htmlContent","getTextContent","_el$104","_tmpl$25","_el$106","_el$107","_co$23","_el$105","_v$1","className","_v$10","_el$108","_tmpl$26","_el$109","_el$110","_el$111","_el$112","_el$113","_v$11","_v$12","_v$13","IframeRenderer","_el$114","_tmpl$28","_el$118","_el$119","_co$24","_el$117","_el$115","_tmpl$27","_el$116","_v$14","_v$15","_v$16","height","ImageRenderer","_el$120","_tmpl$30","_el$121","_el$122","_el$123","_el$126","_el$127","_co$25","caption","_el$124","_tmpl$29","_el$125","_v$17","_v$18","_v$19","_v$20","_v$21","o","LinkRenderer","_el$128","_tmpl$32","_el$129","_el$130","_el$131","_el$133","_el$134","_co$26","stopPropagation","description","_el$132","_tmpl$31","_v$22","_v$23","_v$24","ComponentRenderer","validation","validateComponent","valid","details","errors","_el$135","_tmpl$33","_el$136","_el$137","GenerativeUIErrorBoundary","componentType","allowRetry","ActionRenderer","GridRenderer","CarouselRenderer","ArtifactRenderer","FormRenderer","ModalRenderer","ActionGroupRenderer","ImageGalleryRenderer","VideoRenderer","CodeBlockRenderer","MapRenderer","execute","isExecuting","useAction","handleClick","action","toolName","preventDefault","isDisabled","disabled","_el$138","_tmpl$35","_el$140","_el$141","_co$27","_el$142","_el$143","_co$28","icon","_el$139","_tmpl$34","_v$25","_v$26","_v$27","ariaLabel","_v$28","variant","_el$144","_tmpl$37","_el$147","_el$148","_co$29","_el$149","_el$150","_co$30","_el$151","_el$152","_co$31","_tmpl$36","_el$146","_v$29","_v$30","_v$31","_v$32","_v$33","size","ErrorCardRenderer","getErrorText","tool","_el$153","_tmpl$41","_el$176","_el$177","_co$37","_el$154","_el$155","_el$156","_el$157","_el$158","_el$159","_el$160","_co$32","_el$161","_el$170","_el$171","_co$34","_el$172","_el$173","_co$35","_el$174","_el$175","_co$36","_el$162","_tmpl$38","_el$163","_el$164","_el$165","_co$33","suggestions","_el$166","_tmpl$39","_el$167","_el$168","suggestion","_el$178","_tmpl$42","timestamp","_el$169","_tmpl$40","Date","toLocaleString","isErrorResponse","isUIResource","uri","startsWith","htmlString","UIResourceHtmlRenderer","resource","resourceTitle","metadata","_el$179","_tmpl$44","_el$183","_el$184","_co$38","_el$182","_el$180","_tmpl$43","_el$181","UIResourceRenderer","layout","components","grid","gap","gridContainerStyle","layoutData","getGridStyleString","colStart","colSpan","rowStart","rowSpan","shouldShowAutoFooter","hideFooter","hasExplicitFooter","some","executionTime","sourceCount","llmModel","autoFooterParams","poweredBy","model","renderComponent","RenderProvider","_el$185","_tmpl$45","_el$186","_el$187","_el$188","_co$39","_el$189","_tmpl$46","FooterRenderer","_v$34","class","_v$35","_$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, TableVirtualizeOptions } 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 { FormRenderer } from './FormRenderer'\nimport { ModalRenderer } from './ModalRenderer'\nimport { ActionGroupRenderer } from './ActionGroupRenderer'\nimport { ChartJSRenderer, isChartJSAvailable } from './ChartJSRenderer'\nimport { ImageGalleryRenderer } from './ImageGalleryRenderer'\nimport { VideoRenderer } from './VideoRenderer'\nimport { CodeBlockRenderer } from './CodeBlockRenderer'\nimport { MapRenderer } from './MapRenderer'\nimport { ExpandableWrapper } from './ExpandableWrapper'\nimport { RenderProvider } from './RenderContext'\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 */\n/**\n * Smart Chart Renderer - Sprint 4\n * Supports native Chart.js or Quickchart.io iframe fallback\n */\nfunction ChartRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n}) {\n const [useNative, setUseNative] = createSignal(false)\n const [iframeUrl, setIframeUrl] = createSignal<string>()\n const [isLoading, setIsLoading] = createSignal(true)\n const [error, setError] = createSignal<string>()\n\n const params = () => props.component.params as any\n const rendererPref = () => params()?.renderer || 'auto'\n\n // Check renderer preference and Chart.js availability\n createEffect(async () => {\n const pref = rendererPref()\n\n if (pref === 'iframe') {\n // Force iframe mode\n setUseNative(false)\n buildIframeUrl()\n } else if (pref === 'native') {\n // Force native mode - will show error if Chart.js not available\n const available = await isChartJSAvailable()\n if (available) {\n setUseNative(true)\n setIsLoading(false)\n } else {\n setError('Chart.js is not available. Install chart.js peer dependency.')\n setIsLoading(false)\n }\n } else {\n // Auto mode - use native if available, otherwise iframe\n const available = await isChartJSAvailable()\n if (available) {\n setUseNative(true)\n setIsLoading(false)\n } else {\n setUseNative(false)\n buildIframeUrl()\n }\n }\n })\n\n const buildIframeUrl = () => {\n const chartParams = params()\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 setIframeUrl(url)\n setIsLoading(false)\n }\n\n // Use native Chart.js renderer\n if (useNative()) {\n return (\n <ChartJSRenderer\n component={props.component}\n onError={(err) => props.onError?.({\n type: 'render',\n message: err.message,\n componentId: props.component.id,\n })}\n />\n )\n }\n\n // Iframe fallback (Quickchart.io)\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={params()?.title}>\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white mb-3\">\n {params()?.title}\n </h3>\n </Show>\n <div class=\"w-full h-full\" role=\"img\" aria-label={params()?.title ? `Chart: ${params()?.title}` : 'Chart visualization'}>\n <img\n src={iframeUrl()}\n alt={params()?.title ? `Chart: ${params()?.title}` : '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 */\nexport function 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 // Detect raw HTML in cell values (e.g. <a href=\"...\" data-citation-page=\"5\">text</a>)\n // This handles cases where cell data comes from innerHTML extraction\n const hasHtml = /<[a-z][\\s\\S]*>/i.test(strValue)\n if (hasHtml) {\n return DOMPurify.sanitize(strValue, {\n ALLOWED_TAGS: ['a', 'strong', 'em', 'b', 'i', 'code', 'span', 'br', 'button', 'svg', 'path'],\n ALLOWED_ATTR: ['href', 'target', 'rel', 'class', 'data-citation-page', 'data-citation-source', 'data-citation-doc', 'data-citation-verified', 'title', 'fill', 'stroke', 'viewBox', 'stroke-linecap', 'stroke-linejoin', 'stroke-width', 'd'],\n ADD_ATTR: ['target', 'rel'],\n })\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 — sanitize to prevent XSS via innerHTML\n return DOMPurify.sanitize(strValue)\n}\n\n/**\n * Render a table component\n * Sprint Ultimate U.3: Added virtualization support for large datasets\n */\nfunction TableRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n}) {\n const tableParams = props.component.params as any\n let scrollContainerRef: HTMLDivElement | undefined\n\n // Virtualization state\n const [virtualizer, setVirtualizer] = createSignal<any>(null)\n const [isVirtualizing, setIsVirtualizing] = createSignal(false)\n\n // Determine if virtualization should be enabled\n const shouldVirtualize = createMemo(() => {\n const opts = tableParams.virtualize\n if (opts === false) return false\n if (opts === true) return true\n if (typeof opts === 'object') {\n if (opts.enabled !== undefined) return opts.enabled\n const threshold = opts.threshold ?? 100\n return (tableParams.rows?.length ?? 0) > threshold\n }\n // Auto-enable if > 100 rows by default\n return (tableParams.rows?.length ?? 0) > 100\n })\n\n // Get virtualization options\n const virtualizeOpts = createMemo((): TableVirtualizeOptions => {\n const opts = tableParams.virtualize\n if (typeof opts === 'object') return opts\n return {}\n })\n\n // Initialize virtualizer when needed\n createEffect(async () => {\n if (isServer || !shouldVirtualize()) {\n setIsVirtualizing(false)\n return\n }\n\n try {\n const { createVirtualizer } = await import('@tanstack/solid-virtual')\n const opts = virtualizeOpts()\n const rowHeight = opts.rowHeight ?? 48\n const overscan = opts.overscan ?? 5\n\n const v = createVirtualizer({\n get count() { return tableParams.rows?.length ?? 0 },\n getScrollElement: () => scrollContainerRef ?? null,\n estimateSize: () => rowHeight,\n overscan,\n })\n\n setVirtualizer(v)\n setIsVirtualizing(true)\n } catch (e) {\n console.warn('Failed to load @tanstack/solid-virtual, falling back to regular table', e)\n setIsVirtualizing(false)\n }\n })\n\n // Cell value extraction helper\n const getCellValue = (row: any, key: string): string => {\n const value = row[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 }\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) => getCellValue(row, c.key)).join('\\t')\n ).join('\\n')\n return `${header}\\n${dataRows}`\n }\n\n // CSV generation (RFC 4180 compliant)\n const getTableCSV = () => {\n const columns = tableParams.columns || []\n const rows = tableParams.rows || []\n const escapeCSV = (val: string) => {\n if (val.includes(',') || val.includes('\"') || val.includes('\\n')) {\n return `\"${val.replace(/\"/g, '\"\"')}\"`\n }\n return val\n }\n const header = columns.map((c: any) => escapeCSV(c.label)).join(',')\n const dataRows = rows.map((row: any) =>\n columns.map((c: any) => escapeCSV(getCellValue(row, c.key))).join(',')\n ).join('\\n')\n return `${header}\\n${dataRows}`\n }\n\n // JSON generation\n const getTableJSON = () => {\n const columns = tableParams.columns || []\n const rows = tableParams.rows || []\n return JSON.stringify({ columns: columns.map((c: any) => ({ key: c.key, label: c.label })), rows }, null, 2)\n }\n\n // Download helper\n const downloadFile = (content: string, filename: string, mimeType: string) => {\n const blob = new Blob([content], { type: mimeType })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n }\n\n // Export config\n const exportable = tableParams.exportable\n const exportFormats = typeof exportable === 'object' && exportable?.formats\n ? exportable.formats\n : ['csv', 'tsv', 'json']\n const exportFilename = (typeof exportable === 'object' && exportable?.filename) || `table-${Math.random().toString(36).slice(2, 9)}`\n\n // Export dropdown state\n const [showExportMenu, setShowExportMenu] = createSignal(false)\n\n const handleExport = (format: string) => {\n setShowExportMenu(false)\n switch (format) {\n case 'tsv':\n navigator.clipboard.writeText(getTableText())\n break\n case 'csv':\n downloadFile(getTableCSV(), `${exportFilename}.csv`, 'text/csv')\n break\n case 'json':\n downloadFile(getTableJSON(), `${exportFilename}.json`, 'application/json')\n break\n }\n }\n\n const tableId = `table-${Math.random().toString(36).slice(2, 9)}`\n\n // Standard table body (non-virtualized)\n const StandardTableBody = () => (\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 )\n\n // Virtualized table body\n const VirtualizedTableBody = () => {\n const v = virtualizer()\n if (!v) return null\n\n const items = v.getVirtualItems()\n const totalSize = v.getTotalSize()\n const opts = virtualizeOpts()\n const rowHeight = opts.rowHeight ?? 48\n\n return (\n <tbody\n class=\"bg-white dark:bg-gray-800 relative\"\n style={{ height: `${totalSize}px` }}\n >\n <For each={items}>\n {(virtualRow: any) => {\n const row = tableParams.rows[virtualRow.index]\n return (\n <tr\n class={`hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors absolute left-0 right-0 ${virtualRow.index % 2 === 0 ? 'bg-white dark:bg-gray-800' : 'bg-gray-50/30 dark:bg-gray-800/50'}`}\n style={{\n height: `${rowHeight}px`,\n transform: `translateY(${virtualRow.start}px)`\n }}\n >\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 }}\n </For>\n </tbody>\n )\n }\n\n return (\n <ExpandableWrapper title={tableParams.title || 'Table'} copyData={getTableText()} copyLabel=\"Copy table (TSV)\">\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 <Show when={exportable} fallback={<CopyButton getText={getTableText} title=\"Copy table data\" position=\"top-right\" />}>\n <div class=\"absolute right-10 top-2 z-10\">\n <button\n onClick={() => setShowExportMenu(!showExportMenu())}\n class=\"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\"\n title=\"Export table\"\n aria-label=\"Export table\"\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=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n </button>\n <Show when={showExportMenu()}>\n <div class=\"absolute right-0 mt-1 w-36 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-lg shadow-lg py-1 text-sm\">\n <Show when={(exportFormats as string[]).includes('tsv')}>\n <button onClick={() => handleExport('tsv')} class=\"w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300\">Copy TSV</button>\n </Show>\n <Show when={(exportFormats as string[]).includes('csv')}>\n <button onClick={() => handleExport('csv')} class=\"w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300\">Download CSV</button>\n </Show>\n <Show when={(exportFormats as string[]).includes('json')}>\n <button onClick={() => handleExport('json')} class=\"w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300\">Download JSON</button>\n </Show>\n </div>\n </Show>\n </div>\n </Show>\n <div class=\"p-4\">\n <Show when={tableParams.title}>\n <h3 id={`${tableId}-title`} class=\"text-sm font-semibold text-gray-900 dark:text-white mb-3\">\n {tableParams.title}\n <Show when={isVirtualizing()}>\n <span class=\"ml-2 text-xs font-normal text-gray-400\">(virtualized: {tableParams.rows?.length} rows)</span>\n </Show>\n </h3>\n </Show>\n\n <div\n ref={scrollContainerRef}\n class=\"overflow-x-auto\"\n style={isVirtualizing() ? { 'max-height': '500px', 'overflow-y': 'auto' } : {}}\n role=\"region\"\n aria-label={tableParams.title || 'Data table'}\n tabindex=\"0\"\n >\n <table\n class=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0\"\n aria-labelledby={tableParams.title ? `${tableId}-title` : undefined}\n >\n <thead class=\"bg-gray-50 dark:bg-gray-900/50 sticky top-0 z-10\">\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 bg-gray-50 dark:bg-gray-900/50\"\n style={column.width ? { width: column.width } : {}}\n >\n {column.label}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <Show when={isVirtualizing()} fallback={<StandardTableBody />}>\n <VirtualizedTableBody />\n </Show>\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 </ExpandableWrapper>\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 <figure 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 ${params.className || ''}`}>\n <div class=\"flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]\">\n <a\n href={params.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"cursor-zoom-in focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded\"\n aria-label={`View full size: ${params.alt || 'image'}`}\n >\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 <figcaption 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 </figcaption>\n </Show>\n </figure>\n )\n}\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 aria-label={`${params.label || 'Link'}: ${params.description || params.url} (opens in new tab)`}\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 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 ${params.className || ''}`}\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\" aria-hidden=\"true\">\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 aria-hidden=\"true\"\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 <Show when={props.component.type === 'form'}>\n <FormRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'modal'}>\n <ModalRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'action-group'}>\n <ActionGroupRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'image-gallery'}>\n <ImageGalleryRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'video'}>\n <VideoRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'code'}>\n <CodeBlockRenderer component={props.component} />\n </Show>\n <Show when={props.component.type === 'map'}>\n <MapRenderer component={props.component} />\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 aria-label={params.ariaLabel || params.label}\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' :\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 ${params.className || ''}`}\n onClick={handleClick}\n >\n <Show when={params.icon}>\n <span aria-hidden=\"true\">{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 aria-busy={isExecuting() && params.action === 'tool-call'}\n aria-label={params.ariaLabel || params.label}\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 ${params.className || ''}`}\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\" aria-hidden=\"true\" />\n </Show>\n <Show when={params.icon && !(isExecuting() && params.action === 'tool-call')}>\n <span aria-hidden=\"true\">{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 // Wrapper function for RenderContext (breaks circular dependency)\n const renderComponent = (component: UIComponent, onError?: (error: RendererError) => void) => (\n <ComponentRenderer component={component} onError={onError} />\n )\n\n return (\n <RenderProvider renderComponent={renderComponent}>\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 </RenderProvider>\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","useNative","setUseNative","iframeUrl","setIframeUrl","isLoading","setIsLoading","setError","params","component","rendererPref","renderer","createEffect","pref","buildIframeUrl","available","isChartJSAvailable","chartParams","chartConfig","type","data","options","responsive","maintainAspectRatio","configStr","encodeURIComponent","JSON","stringify","url","ChartJSRenderer","onError","message","componentId","id","_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","_v$3","_v$4","_v$5","a","renderCellValue","value","label","name","sanitizedLabel","DOMPurify","sanitize","String","sanitizedUrl","strValue","replace","trim","toLowerCase","markdownLinkRegex","test","htmlValue","ADD_ATTR","hasHtml","ALLOWED_TAGS","ALLOWED_ATTR","hasMarkdown","parsed","marked","parse","async","TableRenderer","tableParams","scrollContainerRef","virtualizer","setVirtualizer","isVirtualizing","setIsVirtualizing","shouldVirtualize","createMemo","opts","virtualize","enabled","threshold","rows","length","virtualizeOpts","isServer","createVirtualizer","rowHeight","overscan","v","count","getScrollElement","estimateSize","warn","getCellValue","row","key","getTableText","columns","header","map","c","join","dataRows","getTableCSV","escapeCSV","val","includes","getTableJSON","downloadFile","content","filename","mimeType","blob","Blob","URL","createObjectURL","document","createElement","href","download","click","revokeObjectURL","exportable","exportFormats","formats","exportFilename","Math","random","toString","slice","showExportMenu","setShowExportMenu","handleExport","format","tableId","StandardTableBody","_el$20","_tmpl$9","For","each","DEFAULT_RESOURCE_LIMITS","maxTableRows","i","_el$21","_tmpl$0","column","_el$22","_tmpl$1","_el$23","_$setProperty","VirtualizedTableBody","items","getVirtualItems","totalSize","getTotalSize","_el$24","_tmpl$10","_$setStyleProperty","virtualRow","index","_el$25","_el$26","_el$27","_v$6","_v$7","start","ExpandableWrapper","copyData","copyLabel","_el$28","_tmpl$19","_el$77","_el$78","_co$16","_el$43","_el$73","_el$74","_co$14","_el$54","_el$55","_el$56","_el$57","_el$58","_el$59","_co$10","_el$75","_el$76","_co$15","_el$29","_tmpl$15","_el$30","_el$41","_el$42","_co$8","_el$31","_tmpl$14","_el$35","_el$36","_co$5","_el$37","_el$38","_co$6","_el$39","_el$40","_co$7","_el$32","_tmpl$11","_el$33","_tmpl$12","_el$34","_tmpl$13","_el$44","_tmpl$17","_el$50","_el$51","_co$0","_el$52","_el$53","_co$1","_el$45","_tmpl$16","_el$46","_el$48","_el$49","_co$9","_ref$","_$use","_el$79","_tmpl$20","_$p","_$style","width","pagination","_el$60","_tmpl$18","_el$61","_el$62","_el$67","_el$68","_co$11","_el$63","_el$69","_el$70","_co$12","_el$65","_el$71","_el$72","_co$13","currentPage","pageSize","min","totalRows","_v$8","_v$9","_v$0","MetricRenderer","metricParams","getMetricText","unit","_el$80","_tmpl$24","_el$102","_el$103","_co$22","_el$81","_el$82","_el$83","_el$84","_el$85","_el$87","_el$88","_co$17","_el$98","_el$99","_co$20","_el$100","_el$101","_co$21","_el$86","_tmpl$21","trend","_el$89","_tmpl$22","_el$90","_el$93","_el$94","_co$18","_el$91","_el$95","_el$96","_co$19","_c$","direction","abs","subtitle","_el$97","_tmpl$23","extractImageFromMarkdown","imagePattern","match","alt","imageUrl","linkUrl","credit","TextRenderer","textParams","imageData","markdown","htmlContent","getTextContent","_el$104","_tmpl$25","_el$106","_el$107","_co$23","_el$105","_v$1","className","_v$10","_el$108","_tmpl$26","_el$109","_el$110","_el$111","_el$112","_el$113","_v$11","_v$12","_v$13","IframeRenderer","_el$114","_tmpl$28","_el$118","_el$119","_co$24","_el$117","_el$115","_tmpl$27","_el$116","_v$14","_v$15","_v$16","height","ImageRenderer","_el$120","_tmpl$30","_el$121","_el$122","_el$123","_el$126","_el$127","_co$25","caption","_el$124","_tmpl$29","_el$125","_v$17","_v$18","_v$19","_v$20","_v$21","o","LinkRenderer","_el$128","_tmpl$32","_el$129","_el$130","_el$131","_el$133","_el$134","_co$26","stopPropagation","description","_el$132","_tmpl$31","_v$22","_v$23","_v$24","ComponentRenderer","validation","validateComponent","valid","details","errors","_el$135","_tmpl$33","_el$136","_el$137","GenerativeUIErrorBoundary","componentType","allowRetry","ActionRenderer","GridRenderer","CarouselRenderer","ArtifactRenderer","FormRenderer","ModalRenderer","ActionGroupRenderer","ImageGalleryRenderer","VideoRenderer","CodeBlockRenderer","MapRenderer","execute","isExecuting","useAction","handleClick","action","toolName","preventDefault","isDisabled","disabled","_el$138","_tmpl$35","_el$140","_el$141","_co$27","_el$142","_el$143","_co$28","icon","_el$139","_tmpl$34","_v$25","_v$26","_v$27","ariaLabel","_v$28","variant","_el$144","_tmpl$37","_el$147","_el$148","_co$29","_el$149","_el$150","_co$30","_el$151","_el$152","_co$31","_tmpl$36","_el$146","_v$29","_v$30","_v$31","_v$32","_v$33","size","ErrorCardRenderer","getErrorText","tool","_el$153","_tmpl$41","_el$176","_el$177","_co$37","_el$154","_el$155","_el$156","_el$157","_el$158","_el$159","_el$160","_co$32","_el$161","_el$170","_el$171","_co$34","_el$172","_el$173","_co$35","_el$174","_el$175","_co$36","_el$162","_tmpl$38","_el$163","_el$164","_el$165","_co$33","suggestions","_el$166","_tmpl$39","_el$167","_el$168","suggestion","_el$178","_tmpl$42","timestamp","_el$169","_tmpl$40","Date","toLocaleString","isErrorResponse","isUIResource","uri","startsWith","htmlString","UIResourceHtmlRenderer","resource","resourceTitle","metadata","_el$179","_tmpl$44","_el$183","_el$184","_co$38","_el$182","_el$180","_tmpl$43","_el$181","UIResourceRenderer","layout","components","grid","gap","gridContainerStyle","layoutData","getGridStyleString","colStart","colSpan","rowStart","rowSpan","shouldShowAutoFooter","hideFooter","hasExplicitFooter","some","executionTime","sourceCount","llmModel","autoFooterParams","poweredBy","model","renderComponent","RenderProvider","_el$185","_tmpl$45","_el$186","_el$187","_el$188","_co$39","_el$189","_tmpl$46","FooterRenderer","_v$34","class","_v$35","_$delegateEvents"],"mappings":"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"}
|
|
@@ -234,8 +234,8 @@ function renderCellValue(value) {
|
|
|
234
234
|
const hasHtml = /<[a-z][\s\S]*>/i.test(strValue);
|
|
235
235
|
if (hasHtml) {
|
|
236
236
|
return purify.sanitize(strValue, {
|
|
237
|
-
ALLOWED_TAGS: ["a", "strong", "em", "b", "i", "code", "span", "br"],
|
|
238
|
-
ALLOWED_ATTR: ["href", "target", "rel", "class", "data-citation-page", "data-citation-source", "title"],
|
|
237
|
+
ALLOWED_TAGS: ["a", "strong", "em", "b", "i", "code", "span", "br", "button", "svg", "path"],
|
|
238
|
+
ALLOWED_ATTR: ["href", "target", "rel", "class", "data-citation-page", "data-citation-source", "data-citation-doc", "data-citation-verified", "title", "fill", "stroke", "viewBox", "stroke-linecap", "stroke-linejoin", "stroke-width", "d"],
|
|
239
239
|
ADD_ATTR: ["target", "rel"]
|
|
240
240
|
});
|
|
241
241
|
}
|