@seed-ship/mcp-ui-solid 1.0.29 → 1.0.31

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.
Files changed (85) hide show
  1. package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -0
  2. package/dist/components/GenerativeUIErrorBoundary.js.map +1 -0
  3. package/dist/components/StreamingUIRenderer.cjs.map +1 -0
  4. package/dist/components/StreamingUIRenderer.js.map +1 -0
  5. package/dist/{mcp-ui-solid/src/components → components}/UIResourceRenderer.cjs +102 -97
  6. package/dist/components/UIResourceRenderer.cjs.map +1 -0
  7. package/dist/components/UIResourceRenderer.d.ts +0 -11
  8. package/dist/components/UIResourceRenderer.d.ts.map +1 -1
  9. package/dist/{mcp-ui-solid/src/components → components}/UIResourceRenderer.js +102 -97
  10. package/dist/components/UIResourceRenderer.js.map +1 -0
  11. package/dist/components.cjs +3 -3
  12. package/dist/components.d.ts +12 -0
  13. package/dist/components.js +3 -3
  14. package/dist/hooks/useStreamingUI.cjs.map +1 -0
  15. package/dist/hooks/useStreamingUI.js.map +1 -0
  16. package/dist/hooks.cjs +1 -1
  17. package/dist/hooks.d.ts +8 -0
  18. package/dist/hooks.js +1 -1
  19. package/dist/index.cjs +6 -6
  20. package/dist/index.js +6 -6
  21. package/dist/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.cjs +1006 -0
  22. package/dist/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.cjs.map +1 -0
  23. package/dist/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.js +1007 -0
  24. package/dist/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.js.map +1 -0
  25. package/dist/services/component-registry.cjs.map +1 -0
  26. package/dist/services/component-registry.js.map +1 -0
  27. package/dist/services/validation.cjs.map +1 -0
  28. package/dist/services/validation.js.map +1 -0
  29. package/dist/types.d.ts +265 -0
  30. package/dist/utils/logger.cjs.map +1 -0
  31. package/dist/utils/logger.js.map +1 -0
  32. package/dist/validation.cjs +1 -1
  33. package/dist/validation.js +1 -1
  34. package/package.json +20 -23
  35. package/src/components/ActionRenderer.tsx +33 -0
  36. package/src/components/ArtifactRenderer.tsx +54 -0
  37. package/src/components/CarouselRenderer.tsx +77 -0
  38. package/src/components/FooterRenderer.tsx +66 -0
  39. package/src/components/GenerativeUIErrorBoundary.tsx +259 -0
  40. package/src/components/StreamingUIRenderer.tsx +327 -0
  41. package/src/components/UIResourceRenderer.tsx +573 -0
  42. package/src/components/index.ts +14 -0
  43. package/src/hooks/index.ts +14 -0
  44. package/src/hooks/useStreamingUI.ts +447 -0
  45. package/src/index.test.ts +36 -0
  46. package/src/index.ts +70 -0
  47. package/src/services/component-registry.ts +378 -0
  48. package/src/services/index.ts +9 -0
  49. package/src/services/validation.ts +472 -0
  50. package/src/types/index.ts +320 -0
  51. package/src/types-export.ts +31 -0
  52. package/src/utils/logger.ts +74 -0
  53. package/src/validation.ts +38 -0
  54. package/src/vite-env.d.ts +11 -0
  55. package/tsconfig.json +20 -0
  56. package/tsconfig.tsbuildinfo +1 -0
  57. package/vite.config.ts +52 -0
  58. package/vite.config.ts.timestamp-1763266929437-a71eed80b91318.mjs +45 -0
  59. package/vitest.config.ts +10 -0
  60. package/dist/mcp-ui-solid/src/components/GenerativeUIErrorBoundary.cjs.map +0 -1
  61. package/dist/mcp-ui-solid/src/components/GenerativeUIErrorBoundary.js.map +0 -1
  62. package/dist/mcp-ui-solid/src/components/StreamingUIRenderer.cjs.map +0 -1
  63. package/dist/mcp-ui-solid/src/components/StreamingUIRenderer.js.map +0 -1
  64. package/dist/mcp-ui-solid/src/components/UIResourceRenderer.cjs.map +0 -1
  65. package/dist/mcp-ui-solid/src/components/UIResourceRenderer.js.map +0 -1
  66. package/dist/mcp-ui-solid/src/hooks/useStreamingUI.cjs.map +0 -1
  67. package/dist/mcp-ui-solid/src/hooks/useStreamingUI.js.map +0 -1
  68. package/dist/mcp-ui-solid/src/services/component-registry.cjs.map +0 -1
  69. package/dist/mcp-ui-solid/src/services/component-registry.js.map +0 -1
  70. package/dist/mcp-ui-solid/src/services/validation.cjs.map +0 -1
  71. package/dist/mcp-ui-solid/src/services/validation.js.map +0 -1
  72. package/dist/mcp-ui-solid/src/utils/logger.cjs.map +0 -1
  73. package/dist/mcp-ui-solid/src/utils/logger.js.map +0 -1
  74. /package/dist/{mcp-ui-solid/src/components → components}/GenerativeUIErrorBoundary.cjs +0 -0
  75. /package/dist/{mcp-ui-solid/src/components → components}/GenerativeUIErrorBoundary.js +0 -0
  76. /package/dist/{mcp-ui-solid/src/components → components}/StreamingUIRenderer.cjs +0 -0
  77. /package/dist/{mcp-ui-solid/src/components → components}/StreamingUIRenderer.js +0 -0
  78. /package/dist/{mcp-ui-solid/src/hooks → hooks}/useStreamingUI.cjs +0 -0
  79. /package/dist/{mcp-ui-solid/src/hooks → hooks}/useStreamingUI.js +0 -0
  80. /package/dist/{mcp-ui-solid/src/services → services}/component-registry.cjs +0 -0
  81. /package/dist/{mcp-ui-solid/src/services → services}/component-registry.js +0 -0
  82. /package/dist/{mcp-ui-solid/src/services → services}/validation.cjs +0 -0
  83. /package/dist/{mcp-ui-solid/src/services → services}/validation.js +0 -0
  84. /package/dist/{mcp-ui-solid/src/utils → utils}/logger.cjs +0 -0
  85. /package/dist/{mcp-ui-solid/src/utils → utils}/logger.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerativeUIErrorBoundary.cjs","sources":["../../src/components/GenerativeUIErrorBoundary.tsx"],"sourcesContent":["/**\n * Generative UI Error Boundary with Telemetry\n * Phase 0: Error isolation + structured logging\n *\n * Features:\n * - Component-level error isolation\n * - Structured logging with context\n * - Performance timing\n * - Retry mechanism\n * - User-friendly fallback UI\n */\n\nimport { Component, ErrorBoundary, createSignal, Show } from 'solid-js'\nimport { isServer } from 'solid-js/web'\nimport { createLogger } from '../utils/logger'\nimport type { RendererError } from '../types'\n\nconst logger = createLogger('generative-ui')\n\n/**\n * Props for GenerativeUIErrorBoundary\n */\nexport interface GenerativeUIErrorBoundaryProps {\n /**\n * Component identifier for telemetry\n */\n componentId: string\n\n /**\n * Component type for context\n */\n componentType: string\n\n /**\n * Error callback\n */\n onError?: (error: RendererError) => void\n\n /**\n * Allow retry on error\n */\n allowRetry?: boolean\n\n /**\n * Child components to wrap\n */\n children: any\n\n /**\n * Custom fallback UI (optional)\n */\n fallback?: (error: Error, retry?: () => void) => any\n}\n\n/**\n * Default fallback UI for errors\n */\nfunction DefaultErrorFallback(props: {\n error: Error\n componentId: string\n componentType: string\n allowRetry?: boolean\n onRetry?: () => void\n}) {\n return (\n <div class=\"w-full h-full bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4\">\n <div class=\"flex items-start gap-3\">\n <div class=\"flex-shrink-0\">\n <svg\n class=\"w-5 h-5 text-yellow-600 dark:text-yellow-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n 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 />\n </svg>\n </div>\n <div class=\"flex-1 min-w-0\">\n <p class=\"text-sm font-medium text-yellow-900 dark:text-yellow-100\">\n Component Failed to Render\n </p>\n <p class=\"text-xs text-yellow-700 dark:text-yellow-300 mt-1\">\n Type: {props.componentType || 'unknown'} | ID: {props.componentId?.slice(0, 8) || 'unknown'}...\n </p>\n <Show when={import.meta.env.DEV}>\n <p class=\"text-xs text-yellow-600 dark:text-yellow-400 mt-2 font-mono\">\n {props.error.message}\n </p>\n </Show>\n <Show when={props.allowRetry}>\n <button\n onClick={props.onRetry}\n class=\"mt-3 text-xs font-medium text-yellow-800 dark:text-yellow-200 hover:text-yellow-900 dark:hover:text-yellow-100 underline\"\n >\n Retry Rendering\n </button>\n </Show>\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Generative UI Error Boundary Component\n */\nexport const GenerativeUIErrorBoundary: Component<GenerativeUIErrorBoundaryProps> = (props) => {\n const [retryKey, setRetryKey] = createSignal(0)\n const [renderStartTime] = createSignal(isServer ? 0 : performance.now())\n\n // Handle error with telemetry\n const handleError = (error: Error) => {\n const renderEndTime = isServer ? 0 : performance.now()\n const renderDuration = renderEndTime - renderStartTime()\n\n // Structure error context\n const errorContext = {\n componentId: props.componentId,\n componentType: props.componentType,\n errorMessage: error.message,\n errorStack: error.stack,\n renderDuration,\n retryCount: retryKey(),\n timestamp: new Date().toISOString(),\n userAgent: isServer ? 'server' : navigator.userAgent,\n viewport: isServer\n ? { width: 0, height: 0 }\n : { width: window.innerWidth, height: window.innerHeight },\n }\n\n // Log to structured logger\n logger.error(`Component render failed: ${props.componentType}`, errorContext)\n\n // Call error callback\n props.onError?.({\n type: 'render',\n message: error.message,\n componentId: props.componentId,\n details: errorContext,\n })\n\n // In production, send to monitoring service\n if (import.meta.env.PROD) {\n // Future: Send to Sentry or other APM\n // Sentry.captureException(error, { contexts: { component: errorContext } })\n }\n }\n\n // Retry mechanism\n const handleRetry = () => {\n const newRetryCount = retryKey() + 1\n logger.info(`Retrying component render: ${props.componentType}`, {\n componentId: props.componentId,\n retryCount: newRetryCount,\n })\n setRetryKey(newRetryCount)\n }\n\n return (\n <ErrorBoundary\n fallback={(error) => {\n handleError(error)\n\n // Use custom fallback if provided\n if (props.fallback) {\n return props.fallback(error, props.allowRetry ? handleRetry : undefined)\n }\n\n // Default fallback\n return (\n <DefaultErrorFallback\n error={error}\n componentId={props.componentId}\n componentType={props.componentType}\n allowRetry={props.allowRetry}\n onRetry={handleRetry}\n />\n )\n }}\n >\n {/* Key prop for forcing remount on retry */}\n {(() => {\n const _ = retryKey() // Access signal to track changes\n return <>{props.children}</>\n })()}\n </ErrorBoundary>\n )\n}\n\n/**\n * Performance monitoring wrapper\n * Logs render times for performance analysis\n */\nexport function withPerformanceMonitoring<P extends { componentId: string; componentType: string }>(\n WrappedComponent: Component<P>\n) {\n return (props: P) => {\n const renderStart = isServer ? 0 : performance.now()\n\n // Log render start\n logger.debug(`Component render start: ${props.componentType}`, {\n componentId: props.componentId,\n timestamp: new Date().toISOString(),\n })\n\n // Measure on mount completion (client-side only)\n if (!isServer && typeof window !== 'undefined') {\n requestAnimationFrame(() => {\n const renderEnd = performance.now()\n const duration = renderEnd - renderStart\n\n logger.info(`Component rendered: ${props.componentType}`, {\n componentId: props.componentId,\n renderDuration: duration,\n timestamp: new Date().toISOString(),\n })\n\n // Warn if render is slow (>50ms target)\n if (duration > 50) {\n logger.warn(`Slow component render: ${props.componentType}`, {\n componentId: props.componentId,\n renderDuration: duration,\n threshold: 50,\n })\n }\n })\n }\n\n return <WrappedComponent {...props} />\n }\n}\n\n/**\n * Hook to track component lifecycle events\n */\nexport function useComponentTelemetry(componentId: string, componentType: string) {\n const mountTime = isServer ? 0 : performance.now()\n\n // Log mount\n logger.debug(`Component mounted: ${componentType}`, {\n componentId,\n timestamp: new Date().toISOString(),\n })\n\n // Return cleanup function for unmount\n return () => {\n const lifetime = isServer ? 0 : performance.now() - mountTime\n logger.debug(`Component unmounted: ${componentType}`, {\n componentId,\n lifetime,\n timestamp: new Date().toISOString(),\n })\n }\n}\n"],"names":["logger","createLogger","DefaultErrorFallback","props","_el$","_$getNextElement","_tmpl$3","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$7","_el$0","_el$1","_co$","_$getNextMarker","_el$8","_el$10","_el$11","_co$2","_el$14","_el$15","_co$3","_el$16","_el$17","_co$4","_$insert","componentType","componentId","slice","_$createComponent","Show","when","import","children","_el$12","_tmpl$","error","message","allowRetry","_el$13","_tmpl$2","_$addEventListener","onRetry","_$runHydrationEvents","GenerativeUIErrorBoundary","retryKey","setRetryKey","createSignal","renderStartTime","isServer","performance","now","handleError","renderEndTime","renderDuration","errorContext","errorMessage","errorStack","stack","retryCount","timestamp","Date","toISOString","userAgent","navigator","viewport","width","height","window","innerWidth","innerHeight","onError","type","details","handleRetry","newRetryCount","info","ErrorBoundary","fallback","undefined","_$memo","_$delegateEvents"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerativeUIErrorBoundary.js","sources":["../../src/components/GenerativeUIErrorBoundary.tsx"],"sourcesContent":["/**\n * Generative UI Error Boundary with Telemetry\n * Phase 0: Error isolation + structured logging\n *\n * Features:\n * - Component-level error isolation\n * - Structured logging with context\n * - Performance timing\n * - Retry mechanism\n * - User-friendly fallback UI\n */\n\nimport { Component, ErrorBoundary, createSignal, Show } from 'solid-js'\nimport { isServer } from 'solid-js/web'\nimport { createLogger } from '../utils/logger'\nimport type { RendererError } from '../types'\n\nconst logger = createLogger('generative-ui')\n\n/**\n * Props for GenerativeUIErrorBoundary\n */\nexport interface GenerativeUIErrorBoundaryProps {\n /**\n * Component identifier for telemetry\n */\n componentId: string\n\n /**\n * Component type for context\n */\n componentType: string\n\n /**\n * Error callback\n */\n onError?: (error: RendererError) => void\n\n /**\n * Allow retry on error\n */\n allowRetry?: boolean\n\n /**\n * Child components to wrap\n */\n children: any\n\n /**\n * Custom fallback UI (optional)\n */\n fallback?: (error: Error, retry?: () => void) => any\n}\n\n/**\n * Default fallback UI for errors\n */\nfunction DefaultErrorFallback(props: {\n error: Error\n componentId: string\n componentType: string\n allowRetry?: boolean\n onRetry?: () => void\n}) {\n return (\n <div class=\"w-full h-full bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4\">\n <div class=\"flex items-start gap-3\">\n <div class=\"flex-shrink-0\">\n <svg\n class=\"w-5 h-5 text-yellow-600 dark:text-yellow-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n 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 />\n </svg>\n </div>\n <div class=\"flex-1 min-w-0\">\n <p class=\"text-sm font-medium text-yellow-900 dark:text-yellow-100\">\n Component Failed to Render\n </p>\n <p class=\"text-xs text-yellow-700 dark:text-yellow-300 mt-1\">\n Type: {props.componentType || 'unknown'} | ID: {props.componentId?.slice(0, 8) || 'unknown'}...\n </p>\n <Show when={import.meta.env.DEV}>\n <p class=\"text-xs text-yellow-600 dark:text-yellow-400 mt-2 font-mono\">\n {props.error.message}\n </p>\n </Show>\n <Show when={props.allowRetry}>\n <button\n onClick={props.onRetry}\n class=\"mt-3 text-xs font-medium text-yellow-800 dark:text-yellow-200 hover:text-yellow-900 dark:hover:text-yellow-100 underline\"\n >\n Retry Rendering\n </button>\n </Show>\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Generative UI Error Boundary Component\n */\nexport const GenerativeUIErrorBoundary: Component<GenerativeUIErrorBoundaryProps> = (props) => {\n const [retryKey, setRetryKey] = createSignal(0)\n const [renderStartTime] = createSignal(isServer ? 0 : performance.now())\n\n // Handle error with telemetry\n const handleError = (error: Error) => {\n const renderEndTime = isServer ? 0 : performance.now()\n const renderDuration = renderEndTime - renderStartTime()\n\n // Structure error context\n const errorContext = {\n componentId: props.componentId,\n componentType: props.componentType,\n errorMessage: error.message,\n errorStack: error.stack,\n renderDuration,\n retryCount: retryKey(),\n timestamp: new Date().toISOString(),\n userAgent: isServer ? 'server' : navigator.userAgent,\n viewport: isServer\n ? { width: 0, height: 0 }\n : { width: window.innerWidth, height: window.innerHeight },\n }\n\n // Log to structured logger\n logger.error(`Component render failed: ${props.componentType}`, errorContext)\n\n // Call error callback\n props.onError?.({\n type: 'render',\n message: error.message,\n componentId: props.componentId,\n details: errorContext,\n })\n\n // In production, send to monitoring service\n if (import.meta.env.PROD) {\n // Future: Send to Sentry or other APM\n // Sentry.captureException(error, { contexts: { component: errorContext } })\n }\n }\n\n // Retry mechanism\n const handleRetry = () => {\n const newRetryCount = retryKey() + 1\n logger.info(`Retrying component render: ${props.componentType}`, {\n componentId: props.componentId,\n retryCount: newRetryCount,\n })\n setRetryKey(newRetryCount)\n }\n\n return (\n <ErrorBoundary\n fallback={(error) => {\n handleError(error)\n\n // Use custom fallback if provided\n if (props.fallback) {\n return props.fallback(error, props.allowRetry ? handleRetry : undefined)\n }\n\n // Default fallback\n return (\n <DefaultErrorFallback\n error={error}\n componentId={props.componentId}\n componentType={props.componentType}\n allowRetry={props.allowRetry}\n onRetry={handleRetry}\n />\n )\n }}\n >\n {/* Key prop for forcing remount on retry */}\n {(() => {\n const _ = retryKey() // Access signal to track changes\n return <>{props.children}</>\n })()}\n </ErrorBoundary>\n )\n}\n\n/**\n * Performance monitoring wrapper\n * Logs render times for performance analysis\n */\nexport function withPerformanceMonitoring<P extends { componentId: string; componentType: string }>(\n WrappedComponent: Component<P>\n) {\n return (props: P) => {\n const renderStart = isServer ? 0 : performance.now()\n\n // Log render start\n logger.debug(`Component render start: ${props.componentType}`, {\n componentId: props.componentId,\n timestamp: new Date().toISOString(),\n })\n\n // Measure on mount completion (client-side only)\n if (!isServer && typeof window !== 'undefined') {\n requestAnimationFrame(() => {\n const renderEnd = performance.now()\n const duration = renderEnd - renderStart\n\n logger.info(`Component rendered: ${props.componentType}`, {\n componentId: props.componentId,\n renderDuration: duration,\n timestamp: new Date().toISOString(),\n })\n\n // Warn if render is slow (>50ms target)\n if (duration > 50) {\n logger.warn(`Slow component render: ${props.componentType}`, {\n componentId: props.componentId,\n renderDuration: duration,\n threshold: 50,\n })\n }\n })\n }\n\n return <WrappedComponent {...props} />\n }\n}\n\n/**\n * Hook to track component lifecycle events\n */\nexport function useComponentTelemetry(componentId: string, componentType: string) {\n const mountTime = isServer ? 0 : performance.now()\n\n // Log mount\n logger.debug(`Component mounted: ${componentType}`, {\n componentId,\n timestamp: new Date().toISOString(),\n })\n\n // Return cleanup function for unmount\n return () => {\n const lifetime = isServer ? 0 : performance.now() - mountTime\n logger.debug(`Component unmounted: ${componentType}`, {\n componentId,\n lifetime,\n timestamp: new Date().toISOString(),\n })\n }\n}\n"],"names":["logger","createLogger","DefaultErrorFallback","props","_el$","_$getNextElement","_tmpl$3","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$7","_el$0","_el$1","_co$","_$getNextMarker","_el$8","_el$10","_el$11","_co$2","_el$14","_el$15","_co$3","_el$16","_el$17","_co$4","_$insert","componentType","componentId","slice","_$createComponent","Show","when","import","children","_el$12","_tmpl$","error","message","allowRetry","_el$13","_tmpl$2","_$addEventListener","onRetry","_$runHydrationEvents","GenerativeUIErrorBoundary","retryKey","setRetryKey","createSignal","renderStartTime","isServer","performance","now","handleError","renderEndTime","renderDuration","errorContext","errorMessage","errorStack","stack","retryCount","timestamp","Date","toISOString","userAgent","navigator","viewport","width","height","window","innerWidth","innerHeight","onError","type","details","handleRetry","newRetryCount","info","ErrorBoundary","fallback","undefined","_$memo","_$delegateEvents"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamingUIRenderer.cjs","sources":["../../src/components/StreamingUIRenderer.tsx"],"sourcesContent":["/**\n * StreamingUIRenderer Component - Phase 2\n *\n * Renders streaming dashboard components with skeleton states and progress indicators.\n * Uses the useStreamingUI hook for SSE connection and state management.\n *\n * Features:\n * - Skeleton loading states while components stream\n * - Progress bar and status messages\n * - Smooth component animations on arrival\n * - Error handling with retry capability\n * - Responsive 12-column grid layout\n *\n * Usage:\n * ```tsx\n * <StreamingUIRenderer\n * query=\"Show me revenue trends\"\n * spaceIds={['uuid1', 'uuid2']}\n * onComplete={(metadata) => console.log('Done!', metadata)}\n * />\n * ```\n */\n\nimport { Show, For, createSignal, onMount } from 'solid-js'\nimport { useStreamingUI, type UseStreamingUIOptions } from '../hooks/useStreamingUI'\nimport type { UIComponent, RendererError } from '../types'\nimport { validateComponent } from '../services/validation'\nimport { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary'\n\nexport interface StreamingUIRendererProps extends UseStreamingUIOptions {\n class?: string\n showProgress?: boolean\n showMetadata?: boolean\n onRenderError?: (error: RendererError) => void\n}\n\n/**\n * Component Renderer - Inline lightweight version\n * (Full implementation in UIResourceRenderer)\n */\nfunction StreamingComponentRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n}) {\n // Validate component before rendering\n const validation = validateComponent(props.component)\n if (!validation.valid) {\n props.onError?.({\n type: 'validation',\n message: 'Component validation failed',\n componentId: props.component.id,\n details: validation.errors,\n })\n\n return (\n <div class=\"w-full bg-error-subtle border border-border-error rounded-lg p-4\">\n <p class=\"text-sm font-medium text-error-primary\">Validation Error</p>\n <p class=\"text-xs text-text-secondary mt-1\">\n {validation.errors?.[0]?.message || 'Unknown validation error'}\n </p>\n </div>\n )\n }\n\n // Simplified renderer - just show component type and title\n // Full rendering logic in UIResourceRenderer\n const params = props.component.params as any\n\n return (\n <GenerativeUIErrorBoundary\n componentId={props.component.id}\n componentType={props.component.type}\n onError={props.onError}\n allowRetry={false}\n >\n <div class=\"w-full bg-surface-secondary border border-border-subtle rounded-lg p-4\">\n <div class=\"flex items-center gap-2 mb-2\">\n <span class=\"text-xs font-medium text-text-tertiary uppercase\">\n {props.component.type}\n </span>\n </div>\n <Show when={params?.title}>\n <h3 class=\"text-sm font-semibold text-text-primary\">{params.title}</h3>\n </Show>\n <Show when={props.component.type === 'metric' && params?.value}>\n <div class=\"mt-2\">\n <p class=\"text-2xl font-semibold text-text-primary\">{params.value}</p>\n <Show when={params.unit}>\n <span class=\"text-sm text-text-secondary\">{params.unit}</span>\n </Show>\n </div>\n </Show>\n <div class=\"mt-3 text-xs text-text-tertiary\">\n Component ID: {props.component.id.slice(0, 8)}...\n </div>\n </div>\n </GenerativeUIErrorBoundary>\n )\n}\n\nexport function StreamingUIRenderer(props: StreamingUIRendererProps) {\n const { components, isLoading, isStreaming, error, progress, metadata, startStreaming } =\n useStreamingUI({\n query: props.query,\n spaceIds: props.spaceIds,\n sessionId: props.sessionId,\n options: props.options,\n onComplete: props.onComplete,\n onError: props.onError,\n onComponentReceived: props.onComponentReceived,\n })\n\n const [animatingComponents, setAnimatingComponents] = createSignal<Set<string>>(new Set())\n\n // Track new components for animation\n const handleComponentRender = (componentId: string) => {\n setAnimatingComponents((prev) => new Set([...prev, componentId]))\n\n // Remove from animating set after animation completes\n setTimeout(() => {\n setAnimatingComponents((prev) => {\n const next = new Set(prev)\n next.delete(componentId)\n return next\n })\n }, 500)\n }\n\n return (\n <div class={`streaming-ui-renderer ${props.class || ''}`}>\n {/* Progress Bar */}\n <Show when={props.showProgress !== false && (isLoading() || isStreaming())}>\n <div class=\"mb-4 rounded-lg border border-border-subtle bg-surface-secondary p-4\">\n {/* Status Message */}\n <div class=\"mb-2 flex items-center justify-between\">\n <span class=\"text-sm font-medium text-text-primary\">{progress().message}</span>\n <Show when={progress().totalCount !== null}>\n <span class=\"text-sm text-text-secondary\">\n {progress().receivedCount} / {progress().totalCount}\n </span>\n </Show>\n </div>\n\n {/* Progress Bar */}\n <div class=\"h-2 w-full overflow-hidden rounded-full bg-surface-tertiary\">\n <div\n class=\"h-full bg-brand-primary transition-all duration-300 ease-out\"\n style={\n progress().totalCount !== null\n ? `width: ${(progress().receivedCount / progress().totalCount!) * 100}%`\n : 'width: 0%'\n }\n />\n </div>\n\n {/* Indeterminate Progress (when totalCount unknown) */}\n <Show when={progress().totalCount === null && isStreaming()}>\n <div class=\"mt-2\">\n <div class=\"h-1 w-full overflow-hidden rounded-full bg-surface-tertiary\">\n <div class=\"animate-progress-indeterminate h-full w-1/3 bg-brand-primary\" />\n </div>\n </div>\n </Show>\n </div>\n </Show>\n\n {/* Error State */}\n <Show when={error()}>\n <div class=\"mb-4 rounded-lg border border-border-error bg-error-subtle p-4\">\n <div class=\"mb-2 flex items-center gap-2\">\n <svg\n class=\"h-5 w-5 text-error-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span class=\"font-medium text-error-primary\">{error()?.error}</span>\n </div>\n <p class=\"text-sm text-text-secondary\">{error()?.message}</p>\n\n {/* Retry Button (if recoverable) */}\n <Show when={error()?.recoverable}>\n <button\n type=\"button\"\n class=\"mt-3 rounded-md bg-error-primary px-3 py-1.5 text-sm font-medium text-white hover:bg-error-hover\"\n onClick={() => startStreaming()}\n >\n Retry\n </button>\n </Show>\n </div>\n </Show>\n\n {/* Components Grid */}\n <div class=\"grid grid-cols-12 gap-4\">\n {/* Render received components */}\n <For each={components()}>\n {(component) => {\n // Trigger animation on mount (SSR-safe, no 'use' directive needed)\n onMount(() => handleComponentRender(component.id))\n\n return (\n <div\n class={`\n col-span-${component.position.colSpan}\n ${animatingComponents().has(component.id) ? 'animate-fade-in-up' : ''}\n `}\n style={`grid-column-start: ${component.position.colStart}; grid-column-end: ${component.position.colStart + component.position.colSpan}`}\n >\n <StreamingComponentRenderer component={component} onError={props.onRenderError} />\n </div>\n )\n }}\n </For>\n\n {/* Skeleton placeholders (if streaming and expecting more) */}\n <Show when={isStreaming() && progress().totalCount !== null}>\n <For\n each={Array.from({\n length: progress().totalCount! - progress().receivedCount,\n })}\n >\n {() => <SkeletonComponent />}\n </For>\n </Show>\n </div>\n\n {/* Metadata Display */}\n <Show when={props.showMetadata !== false && metadata()}>\n <div class=\"mt-6 rounded-lg border border-border-subtle bg-surface-secondary p-4 text-sm text-text-secondary\">\n <div class=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n <div>\n <div class=\"font-medium text-text-primary\">Provider</div>\n <div>{metadata()?.provider}</div>\n </div>\n <div>\n <div class=\"font-medium text-text-primary\">Model</div>\n <div>{metadata()?.model}</div>\n </div>\n <div>\n <div class=\"font-medium text-text-primary\">Execution Time</div>\n <div>{metadata()?.executionTimeMs}ms</div>\n </div>\n <Show when={metadata()?.costUSD !== undefined}>\n <div>\n <div class=\"font-medium text-text-primary\">Cost</div>\n <div>${metadata()?.costUSD?.toFixed(4)}</div>\n </div>\n </Show>\n <div>\n <div class=\"font-medium text-text-primary\">TTFB</div>\n <div>{metadata()?.firstTokenMs}ms</div>\n </div>\n <Show when={metadata()?.cached}>\n <div>\n <div class=\"font-medium text-text-primary\">Cached</div>\n <div class=\"text-success-primary\">Yes</div>\n </div>\n </Show>\n </div>\n </div>\n </Show>\n </div>\n )\n}\n\n/**\n * Skeleton Component - Placeholder while components load\n */\nfunction SkeletonComponent() {\n return (\n <div class=\"col-span-12 md:col-span-6 lg:col-span-4\">\n <div class=\"animate-pulse rounded-lg border border-border-subtle bg-surface-secondary p-4\">\n {/* Header skeleton */}\n <div class=\"mb-4 h-6 w-1/2 rounded bg-surface-tertiary\" />\n\n {/* Content skeleton */}\n <div class=\"space-y-3\">\n <div class=\"h-4 rounded bg-surface-tertiary\" />\n <div class=\"h-4 w-5/6 rounded bg-surface-tertiary\" />\n <div class=\"h-4 w-4/6 rounded bg-surface-tertiary\" />\n </div>\n\n {/* Chart/visual skeleton */}\n <div class=\"mt-4 h-32 rounded bg-surface-tertiary\" />\n </div>\n </div>\n )\n}\n\n// CSS Animations (add to global styles or Tailwind config)\n/*\n@keyframes fade-in-up {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes progress-indeterminate {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(400%);\n }\n}\n\n.animate-fade-in-up {\n animation: fade-in-up 0.5s ease-out;\n}\n\n.animate-progress-indeterminate {\n animation: progress-indeterminate 1.5s infinite ease-in-out;\n}\n*/\n"],"names":["StreamingComponentRenderer","props","validation","validateComponent","component","valid","onError","type","message","componentId","id","details","errors","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_$insert","params","_$createComponent","GenerativeUIErrorBoundary","componentType","allowRetry","children","_el$4","_tmpl$5","_el$5","_el$6","_el$16","_el$17","_co$3","_$getNextMarker","_el$18","_el$19","_co$4","_el$11","_el$12","_el$14","_el$15","_co$2","Show","when","title","_el$7","_tmpl$2","_$memo","value","_el$8","_tmpl$4","_el$9","_el$1","_el$10","_co$","unit","_el$0","_tmpl$3","slice","StreamingUIRenderer","components","isLoading","isStreaming","error","progress","metadata","startStreaming","useStreamingUI","query","spaceIds","sessionId","options","onComplete","onComponentReceived","animatingComponents","setAnimatingComponents","createSignal","Set","handleComponentRender","prev","setTimeout","next","delete","_el$20","_tmpl$12","_el$81","_el$82","_co$15","_el$83","_el$84","_co$16","_el$45","_el$46","_el$47","_co$0","_el$48","_el$49","_co$1","_el$85","_el$86","_co$17","showProgress","_el$21","_tmpl$8","_el$22","_el$23","_el$30","_el$31","_co$7","_el$32","_el$33","_el$35","_el$36","_co$8","totalCount","_el$24","_tmpl$6","_el$26","_el$27","_co$5","_el$25","_el$28","_el$29","_co$6","receivedCount","_tmpl$7","_$effect","_$p","_$style","_el$37","_tmpl$0","_el$38","_el$39","_el$40","_el$41","_el$43","_el$44","_co$9","recoverable","_el$42","_tmpl$9","$$click","_$runHydrationEvents","For","each","onMount","_el$87","_tmpl$13","onRenderError","_p$","_v$","position","colSpan","has","_v$2","colStart","e","_$className","t","undefined","Array","from","length","SkeletonComponent","showMetadata","_el$50","_tmpl$11","_el$51","_el$52","_el$53","_el$54","_el$55","_el$56","_el$57","_el$58","_el$59","_el$60","_el$62","_el$63","_co$10","_el$77","_el$78","_co$13","_el$70","_el$71","_el$72","_el$74","_el$75","_co$12","_el$79","_el$80","_co$14","provider","model","executionTimeMs","costUSD","_el$64","_tmpl$1","_el$65","_el$66","_el$67","_el$68","_el$69","_co$11","toFixed","firstTokenMs","cached","_tmpl$10","class","_tmpl$14","_$delegateEvents"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamingUIRenderer.js","sources":["../../src/components/StreamingUIRenderer.tsx"],"sourcesContent":["/**\n * StreamingUIRenderer Component - Phase 2\n *\n * Renders streaming dashboard components with skeleton states and progress indicators.\n * Uses the useStreamingUI hook for SSE connection and state management.\n *\n * Features:\n * - Skeleton loading states while components stream\n * - Progress bar and status messages\n * - Smooth component animations on arrival\n * - Error handling with retry capability\n * - Responsive 12-column grid layout\n *\n * Usage:\n * ```tsx\n * <StreamingUIRenderer\n * query=\"Show me revenue trends\"\n * spaceIds={['uuid1', 'uuid2']}\n * onComplete={(metadata) => console.log('Done!', metadata)}\n * />\n * ```\n */\n\nimport { Show, For, createSignal, onMount } from 'solid-js'\nimport { useStreamingUI, type UseStreamingUIOptions } from '../hooks/useStreamingUI'\nimport type { UIComponent, RendererError } from '../types'\nimport { validateComponent } from '../services/validation'\nimport { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary'\n\nexport interface StreamingUIRendererProps extends UseStreamingUIOptions {\n class?: string\n showProgress?: boolean\n showMetadata?: boolean\n onRenderError?: (error: RendererError) => void\n}\n\n/**\n * Component Renderer - Inline lightweight version\n * (Full implementation in UIResourceRenderer)\n */\nfunction StreamingComponentRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n}) {\n // Validate component before rendering\n const validation = validateComponent(props.component)\n if (!validation.valid) {\n props.onError?.({\n type: 'validation',\n message: 'Component validation failed',\n componentId: props.component.id,\n details: validation.errors,\n })\n\n return (\n <div class=\"w-full bg-error-subtle border border-border-error rounded-lg p-4\">\n <p class=\"text-sm font-medium text-error-primary\">Validation Error</p>\n <p class=\"text-xs text-text-secondary mt-1\">\n {validation.errors?.[0]?.message || 'Unknown validation error'}\n </p>\n </div>\n )\n }\n\n // Simplified renderer - just show component type and title\n // Full rendering logic in UIResourceRenderer\n const params = props.component.params as any\n\n return (\n <GenerativeUIErrorBoundary\n componentId={props.component.id}\n componentType={props.component.type}\n onError={props.onError}\n allowRetry={false}\n >\n <div class=\"w-full bg-surface-secondary border border-border-subtle rounded-lg p-4\">\n <div class=\"flex items-center gap-2 mb-2\">\n <span class=\"text-xs font-medium text-text-tertiary uppercase\">\n {props.component.type}\n </span>\n </div>\n <Show when={params?.title}>\n <h3 class=\"text-sm font-semibold text-text-primary\">{params.title}</h3>\n </Show>\n <Show when={props.component.type === 'metric' && params?.value}>\n <div class=\"mt-2\">\n <p class=\"text-2xl font-semibold text-text-primary\">{params.value}</p>\n <Show when={params.unit}>\n <span class=\"text-sm text-text-secondary\">{params.unit}</span>\n </Show>\n </div>\n </Show>\n <div class=\"mt-3 text-xs text-text-tertiary\">\n Component ID: {props.component.id.slice(0, 8)}...\n </div>\n </div>\n </GenerativeUIErrorBoundary>\n )\n}\n\nexport function StreamingUIRenderer(props: StreamingUIRendererProps) {\n const { components, isLoading, isStreaming, error, progress, metadata, startStreaming } =\n useStreamingUI({\n query: props.query,\n spaceIds: props.spaceIds,\n sessionId: props.sessionId,\n options: props.options,\n onComplete: props.onComplete,\n onError: props.onError,\n onComponentReceived: props.onComponentReceived,\n })\n\n const [animatingComponents, setAnimatingComponents] = createSignal<Set<string>>(new Set())\n\n // Track new components for animation\n const handleComponentRender = (componentId: string) => {\n setAnimatingComponents((prev) => new Set([...prev, componentId]))\n\n // Remove from animating set after animation completes\n setTimeout(() => {\n setAnimatingComponents((prev) => {\n const next = new Set(prev)\n next.delete(componentId)\n return next\n })\n }, 500)\n }\n\n return (\n <div class={`streaming-ui-renderer ${props.class || ''}`}>\n {/* Progress Bar */}\n <Show when={props.showProgress !== false && (isLoading() || isStreaming())}>\n <div class=\"mb-4 rounded-lg border border-border-subtle bg-surface-secondary p-4\">\n {/* Status Message */}\n <div class=\"mb-2 flex items-center justify-between\">\n <span class=\"text-sm font-medium text-text-primary\">{progress().message}</span>\n <Show when={progress().totalCount !== null}>\n <span class=\"text-sm text-text-secondary\">\n {progress().receivedCount} / {progress().totalCount}\n </span>\n </Show>\n </div>\n\n {/* Progress Bar */}\n <div class=\"h-2 w-full overflow-hidden rounded-full bg-surface-tertiary\">\n <div\n class=\"h-full bg-brand-primary transition-all duration-300 ease-out\"\n style={\n progress().totalCount !== null\n ? `width: ${(progress().receivedCount / progress().totalCount!) * 100}%`\n : 'width: 0%'\n }\n />\n </div>\n\n {/* Indeterminate Progress (when totalCount unknown) */}\n <Show when={progress().totalCount === null && isStreaming()}>\n <div class=\"mt-2\">\n <div class=\"h-1 w-full overflow-hidden rounded-full bg-surface-tertiary\">\n <div class=\"animate-progress-indeterminate h-full w-1/3 bg-brand-primary\" />\n </div>\n </div>\n </Show>\n </div>\n </Show>\n\n {/* Error State */}\n <Show when={error()}>\n <div class=\"mb-4 rounded-lg border border-border-error bg-error-subtle p-4\">\n <div class=\"mb-2 flex items-center gap-2\">\n <svg\n class=\"h-5 w-5 text-error-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span class=\"font-medium text-error-primary\">{error()?.error}</span>\n </div>\n <p class=\"text-sm text-text-secondary\">{error()?.message}</p>\n\n {/* Retry Button (if recoverable) */}\n <Show when={error()?.recoverable}>\n <button\n type=\"button\"\n class=\"mt-3 rounded-md bg-error-primary px-3 py-1.5 text-sm font-medium text-white hover:bg-error-hover\"\n onClick={() => startStreaming()}\n >\n Retry\n </button>\n </Show>\n </div>\n </Show>\n\n {/* Components Grid */}\n <div class=\"grid grid-cols-12 gap-4\">\n {/* Render received components */}\n <For each={components()}>\n {(component) => {\n // Trigger animation on mount (SSR-safe, no 'use' directive needed)\n onMount(() => handleComponentRender(component.id))\n\n return (\n <div\n class={`\n col-span-${component.position.colSpan}\n ${animatingComponents().has(component.id) ? 'animate-fade-in-up' : ''}\n `}\n style={`grid-column-start: ${component.position.colStart}; grid-column-end: ${component.position.colStart + component.position.colSpan}`}\n >\n <StreamingComponentRenderer component={component} onError={props.onRenderError} />\n </div>\n )\n }}\n </For>\n\n {/* Skeleton placeholders (if streaming and expecting more) */}\n <Show when={isStreaming() && progress().totalCount !== null}>\n <For\n each={Array.from({\n length: progress().totalCount! - progress().receivedCount,\n })}\n >\n {() => <SkeletonComponent />}\n </For>\n </Show>\n </div>\n\n {/* Metadata Display */}\n <Show when={props.showMetadata !== false && metadata()}>\n <div class=\"mt-6 rounded-lg border border-border-subtle bg-surface-secondary p-4 text-sm text-text-secondary\">\n <div class=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n <div>\n <div class=\"font-medium text-text-primary\">Provider</div>\n <div>{metadata()?.provider}</div>\n </div>\n <div>\n <div class=\"font-medium text-text-primary\">Model</div>\n <div>{metadata()?.model}</div>\n </div>\n <div>\n <div class=\"font-medium text-text-primary\">Execution Time</div>\n <div>{metadata()?.executionTimeMs}ms</div>\n </div>\n <Show when={metadata()?.costUSD !== undefined}>\n <div>\n <div class=\"font-medium text-text-primary\">Cost</div>\n <div>${metadata()?.costUSD?.toFixed(4)}</div>\n </div>\n </Show>\n <div>\n <div class=\"font-medium text-text-primary\">TTFB</div>\n <div>{metadata()?.firstTokenMs}ms</div>\n </div>\n <Show when={metadata()?.cached}>\n <div>\n <div class=\"font-medium text-text-primary\">Cached</div>\n <div class=\"text-success-primary\">Yes</div>\n </div>\n </Show>\n </div>\n </div>\n </Show>\n </div>\n )\n}\n\n/**\n * Skeleton Component - Placeholder while components load\n */\nfunction SkeletonComponent() {\n return (\n <div class=\"col-span-12 md:col-span-6 lg:col-span-4\">\n <div class=\"animate-pulse rounded-lg border border-border-subtle bg-surface-secondary p-4\">\n {/* Header skeleton */}\n <div class=\"mb-4 h-6 w-1/2 rounded bg-surface-tertiary\" />\n\n {/* Content skeleton */}\n <div class=\"space-y-3\">\n <div class=\"h-4 rounded bg-surface-tertiary\" />\n <div class=\"h-4 w-5/6 rounded bg-surface-tertiary\" />\n <div class=\"h-4 w-4/6 rounded bg-surface-tertiary\" />\n </div>\n\n {/* Chart/visual skeleton */}\n <div class=\"mt-4 h-32 rounded bg-surface-tertiary\" />\n </div>\n </div>\n )\n}\n\n// CSS Animations (add to global styles or Tailwind config)\n/*\n@keyframes fade-in-up {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes progress-indeterminate {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(400%);\n }\n}\n\n.animate-fade-in-up {\n animation: fade-in-up 0.5s ease-out;\n}\n\n.animate-progress-indeterminate {\n animation: progress-indeterminate 1.5s infinite ease-in-out;\n}\n*/\n"],"names":["StreamingComponentRenderer","props","validation","validateComponent","component","valid","onError","type","message","componentId","id","details","errors","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_$insert","params","_$createComponent","GenerativeUIErrorBoundary","componentType","allowRetry","children","_el$4","_tmpl$5","_el$5","_el$6","_el$16","_el$17","_co$3","_$getNextMarker","_el$18","_el$19","_co$4","_el$11","_el$12","_el$14","_el$15","_co$2","Show","when","title","_el$7","_tmpl$2","_$memo","value","_el$8","_tmpl$4","_el$9","_el$1","_el$10","_co$","unit","_el$0","_tmpl$3","slice","StreamingUIRenderer","components","isLoading","isStreaming","error","progress","metadata","startStreaming","useStreamingUI","query","spaceIds","sessionId","options","onComplete","onComponentReceived","animatingComponents","setAnimatingComponents","createSignal","Set","handleComponentRender","prev","setTimeout","next","delete","_el$20","_tmpl$12","_el$81","_el$82","_co$15","_el$83","_el$84","_co$16","_el$45","_el$46","_el$47","_co$0","_el$48","_el$49","_co$1","_el$85","_el$86","_co$17","showProgress","_el$21","_tmpl$8","_el$22","_el$23","_el$30","_el$31","_co$7","_el$32","_el$33","_el$35","_el$36","_co$8","totalCount","_el$24","_tmpl$6","_el$26","_el$27","_co$5","_el$25","_el$28","_el$29","_co$6","receivedCount","_tmpl$7","_$effect","_$p","_$style","_el$37","_tmpl$0","_el$38","_el$39","_el$40","_el$41","_el$43","_el$44","_co$9","recoverable","_el$42","_tmpl$9","$$click","_$runHydrationEvents","For","each","onMount","_el$87","_tmpl$13","onRenderError","_p$","_v$","position","colSpan","has","_v$2","colStart","e","_$className","t","undefined","Array","from","length","SkeletonComponent","showMetadata","_el$50","_tmpl$11","_el$51","_el$52","_el$53","_el$54","_el$55","_el$56","_el$57","_el$58","_el$59","_el$60","_el$62","_el$63","_co$10","_el$77","_el$78","_co$13","_el$70","_el$71","_el$72","_el$74","_el$75","_co$12","_el$79","_el$80","_co$14","provider","model","executionTimeMs","costUSD","_el$64","_tmpl$1","_el$65","_el$66","_el$67","_el$68","_el$69","_co$11","toFixed","firstTokenMs","cached","_tmpl$10","class","_tmpl$14","_$delegateEvents"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const web = require("solid-js/web");
4
+ const purify_es = require("../node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.cjs");
4
5
  const solidJs = require("solid-js");
5
6
  const validation = require("../services/validation.cjs");
6
7
  const GenerativeUIErrorBoundary = require("./GenerativeUIErrorBoundary.cjs");
7
- const marked_esm = require("../../../node_modules/.pnpm/marked@16.4.2/node_modules/marked/lib/marked.esm.cjs");
8
- var _tmpl$ = /* @__PURE__ */ web.template(`<div class="absolute inset-0 flex items-center justify-center"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600">`), _tmpl$2 = /* @__PURE__ */ web.template(`<div class="absolute inset-0 flex items-center justify-center p-4"><div class=text-center><p class="text-red-600 dark:text-red-400 text-sm font-medium">Chart Error</p><p class="text-gray-600 dark:text-gray-400 text-xs mt-1">`), _tmpl$3 = /* @__PURE__ */ web.template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$4 = /* @__PURE__ */ web.template(`<div class="w-full h-full p-4"><!$><!/><div class="w-full h-full"><img alt="Chart visualization"class="w-full h-auto max-h-[300px] object-contain">`), _tmpl$5 = /* @__PURE__ */ web.template(`<div class="relative w-full h-full min-h-[300px] bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><!$><!/><!$><!/>`), _tmpl$6 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>Showing <!$><!/> - <!$><!/> of <!$><!/>`), _tmpl$7 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><div class=p-4><!$><!/><div class=overflow-x-auto><table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0"><thead class="bg-gray-50 dark:bg-gray-900/50"><tr></tr></thead><tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700"></tbody></table></div><!$><!/>`), _tmpl$8 = /* @__PURE__ */ web.template(`<th scope=col class="px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 first:pl-6 last:pr-6">`), _tmpl$9 = /* @__PURE__ */ web.template(`<tr>`), _tmpl$0 = /* @__PURE__ */ web.template(`<td class="px-6 py-4 text-sm text-gray-700 dark:text-gray-200 whitespace-normal break-words leading-relaxed first:pl-6 last:pr-6">`), _tmpl$1 = /* @__PURE__ */ web.template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$10 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$11 = /* @__PURE__ */ web.template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$12 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4"><div class="flex flex-col h-full justify-between"><div><p class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide"></p><div class="mt-2 flex items-baseline"><p class="text-2xl font-semibold text-gray-900 dark:text-white"></p><!$><!/></div></div><!$><!/><!$><!/>`), _tmpl$13 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4"><div>`), _tmpl$14 = /* @__PURE__ */ web.template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$15 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><!$><!/><iframe class="w-full border-0 flex-1"sandbox="allow-scripts allow-same-origin allow-popups allow-forms"loading=lazy>`, true, false, false), _tmpl$16 = /* @__PURE__ */ web.template(`<div class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center">`), _tmpl$17 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"><a target=_blank rel="noopener noreferrer"class=cursor-zoom-in><img class="max-w-full max-h-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity"loading=lazy></a></div><!$><!/>`, true, false, false), _tmpl$18 = /* @__PURE__ */ web.template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$19 = /* @__PURE__ */ web.template(`<a target=_blank rel="noopener noreferrer"class="flex items-center gap-3 p-4 bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors group h-full"><div class="p-2 bg-blue-50 dark:bg-blue-900/30 rounded-full text-blue-600 dark:text-blue-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/50 shrink-0 transition-colors"><svg xmlns=http://www.w3.org/2000/svg class="w-5 h-5"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-medium text-gray-900 dark:text-white truncate group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors"></h4><!$><!/></div><svg xmlns=http://www.w3.org/2000/svg class="w-4 h-4 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-gray-300 shrink-0 transition-colors"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3>`), _tmpl$20 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4"><p class="text-sm font-medium text-red-900 dark:text-red-100">Validation Error</p><p class="text-xs text-red-700 dark:text-red-300 mt-1">`), _tmpl$21 = /* @__PURE__ */ web.template(`<span>`), _tmpl$22 = /* @__PURE__ */ web.template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$23 = /* @__PURE__ */ web.template(`<button><!$><!/><!$><!/>`), _tmpl$24 = /* @__PURE__ */ web.template(`<div><div class="grid gap-4">`), _tmpl$25 = /* @__PURE__ */ web.template(`<div>`);
8
+ const marked_esm = require("../node_modules/.pnpm/marked@16.4.2/node_modules/marked/lib/marked.esm.cjs");
9
+ var _tmpl$ = /* @__PURE__ */ web.template(`<div class="absolute inset-0 flex items-center justify-center"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600">`), _tmpl$2 = /* @__PURE__ */ web.template(`<div class="absolute inset-0 flex items-center justify-center p-4"><div class=text-center><p class="text-red-600 dark:text-red-400 text-sm font-medium">Chart Error</p><p class="text-gray-600 dark:text-gray-400 text-xs mt-1">`), _tmpl$3 = /* @__PURE__ */ web.template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$4 = /* @__PURE__ */ web.template(`<div class="w-full h-full p-4"><!$><!/><div class="w-full h-full"><img alt="Chart visualization"class="w-full h-auto max-h-[300px] object-contain">`), _tmpl$5 = /* @__PURE__ */ web.template(`<div class="relative w-full h-full min-h-[300px] bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><!$><!/><!$><!/>`), _tmpl$6 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>Showing <!$><!/> - <!$><!/> of <!$><!/>`), _tmpl$7 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><div class=p-4><!$><!/><div class=overflow-x-auto><table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0"><thead class="bg-gray-50 dark:bg-gray-900/50"><tr></tr></thead><tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700"></tbody></table></div><!$><!/>`), _tmpl$8 = /* @__PURE__ */ web.template(`<th scope=col class="px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 first:pl-6 last:pr-6">`), _tmpl$9 = /* @__PURE__ */ web.template(`<tr>`), _tmpl$0 = /* @__PURE__ */ web.template(`<td class="px-6 py-4 text-sm text-gray-700 dark:text-gray-200 whitespace-normal break-words leading-relaxed first:pl-6 last:pr-6"><div>`), _tmpl$1 = /* @__PURE__ */ web.template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$10 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$11 = /* @__PURE__ */ web.template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$12 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4"><div class="flex flex-col h-full justify-between"><div><p class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide"></p><div class="mt-2 flex items-baseline"><p class="text-2xl font-semibold text-gray-900 dark:text-white"></p><!$><!/></div></div><!$><!/><!$><!/>`), _tmpl$13 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4"><div>`), _tmpl$14 = /* @__PURE__ */ web.template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$15 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><!$><!/><iframe class="w-full border-0 flex-1"sandbox="allow-scripts allow-same-origin allow-popups allow-forms"loading=lazy>`, true, false, false), _tmpl$16 = /* @__PURE__ */ web.template(`<div class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center">`), _tmpl$17 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"><a target=_blank rel="noopener noreferrer"class=cursor-zoom-in><img class="max-w-full max-h-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity"loading=lazy></a></div><!$><!/>`, true, false, false), _tmpl$18 = /* @__PURE__ */ web.template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$19 = /* @__PURE__ */ web.template(`<a target=_blank rel="noopener noreferrer"class="flex items-center gap-3 p-4 bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors group h-full"><div class="p-2 bg-blue-50 dark:bg-blue-900/30 rounded-full text-blue-600 dark:text-blue-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/50 shrink-0 transition-colors"><svg xmlns=http://www.w3.org/2000/svg class="w-5 h-5"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-medium text-gray-900 dark:text-white truncate group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors"></h4><!$><!/></div><svg xmlns=http://www.w3.org/2000/svg class="w-4 h-4 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-gray-300 shrink-0 transition-colors"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3>`), _tmpl$20 = /* @__PURE__ */ web.template(`<div class="w-full h-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4"><p class="text-sm font-medium text-red-900 dark:text-red-100">Validation Error</p><p class="text-xs text-red-700 dark:text-red-300 mt-1">`), _tmpl$21 = /* @__PURE__ */ web.template(`<span>`), _tmpl$22 = /* @__PURE__ */ web.template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$23 = /* @__PURE__ */ web.template(`<button><!$><!/><!$><!/>`), _tmpl$24 = /* @__PURE__ */ web.template(`<div><div class="grid gap-4">`), _tmpl$25 = /* @__PURE__ */ web.template(`<div>`);
9
10
  function ChartRenderer(props) {
10
11
  const [iframeUrl, setIframeUrl] = solidJs.createSignal();
11
12
  const [isLoading, setIsLoading] = solidJs.createSignal(true);
@@ -116,8 +117,12 @@ function TableRenderer(props) {
116
117
  return tableParams.columns;
117
118
  },
118
119
  children: (column) => (() => {
119
- var _el$44 = web.getNextElement(_tmpl$0);
120
- web.insert(_el$44, () => row[column.key] || "-");
120
+ var _el$44 = web.getNextElement(_tmpl$0), _el$45 = _el$44.firstChild;
121
+ web.effect(() => web.setProperty(_el$45, "innerHTML", typeof row[column.key] === "string" && (row[column.key].includes("[") || row[column.key].includes("**") || row[column.key].includes("`")) ? purify_es.sanitize(marked_esm.marked.parse(row[column.key], {
122
+ async: false
123
+ }), {
124
+ ADD_ATTR: ["target", "rel"]
125
+ }) : row[column.key] || "-"));
121
126
  return _el$44;
122
127
  })()
123
128
  }));
@@ -143,46 +148,46 @@ function TableRenderer(props) {
143
148
  function MetricRenderer(props) {
144
149
  const metricParams = props.component.params;
145
150
  return (() => {
146
- var _el$45 = web.getNextElement(_tmpl$12), _el$46 = _el$45.firstChild, _el$47 = _el$46.firstChild, _el$48 = _el$47.firstChild, _el$49 = _el$48.nextSibling, _el$50 = _el$49.firstChild, _el$52 = _el$50.nextSibling, [_el$53, _co$0] = web.getNextMarker(_el$52.nextSibling), _el$63 = _el$47.nextSibling, [_el$64, _co$11] = web.getNextMarker(_el$63.nextSibling), _el$65 = _el$64.nextSibling, [_el$66, _co$12] = web.getNextMarker(_el$65.nextSibling);
147
- web.insert(_el$48, () => metricParams.title);
148
- web.insert(_el$50, () => metricParams.value);
149
- web.insert(_el$49, web.createComponent(solidJs.Show, {
151
+ var _el$46 = web.getNextElement(_tmpl$12), _el$47 = _el$46.firstChild, _el$48 = _el$47.firstChild, _el$49 = _el$48.firstChild, _el$50 = _el$49.nextSibling, _el$51 = _el$50.firstChild, _el$53 = _el$51.nextSibling, [_el$54, _co$0] = web.getNextMarker(_el$53.nextSibling), _el$64 = _el$48.nextSibling, [_el$65, _co$11] = web.getNextMarker(_el$64.nextSibling), _el$66 = _el$65.nextSibling, [_el$67, _co$12] = web.getNextMarker(_el$66.nextSibling);
152
+ web.insert(_el$49, () => metricParams.title);
153
+ web.insert(_el$51, () => metricParams.value);
154
+ web.insert(_el$50, web.createComponent(solidJs.Show, {
150
155
  get when() {
151
156
  return metricParams.unit;
152
157
  },
153
158
  get children() {
154
- var _el$51 = web.getNextElement(_tmpl$1);
155
- web.insert(_el$51, () => metricParams.unit);
156
- return _el$51;
159
+ var _el$52 = web.getNextElement(_tmpl$1);
160
+ web.insert(_el$52, () => metricParams.unit);
161
+ return _el$52;
157
162
  }
158
- }), _el$53, _co$0);
159
- web.insert(_el$46, web.createComponent(solidJs.Show, {
163
+ }), _el$54, _co$0);
164
+ web.insert(_el$47, web.createComponent(solidJs.Show, {
160
165
  get when() {
161
166
  return metricParams.trend;
162
167
  },
163
168
  get children() {
164
- var _el$54 = web.getNextElement(_tmpl$10), _el$55 = _el$54.firstChild, _el$58 = _el$55.firstChild, [_el$59, _co$1] = web.getNextMarker(_el$58.nextSibling), _el$56 = _el$59.nextSibling, _el$60 = _el$56.nextSibling, [_el$61, _co$10] = web.getNextMarker(_el$60.nextSibling);
165
- _el$61.nextSibling;
166
- web.insert(_el$55, (() => {
169
+ var _el$55 = web.getNextElement(_tmpl$10), _el$56 = _el$55.firstChild, _el$59 = _el$56.firstChild, [_el$60, _co$1] = web.getNextMarker(_el$59.nextSibling), _el$57 = _el$60.nextSibling, _el$61 = _el$57.nextSibling, [_el$62, _co$10] = web.getNextMarker(_el$61.nextSibling);
170
+ _el$62.nextSibling;
171
+ web.insert(_el$56, (() => {
167
172
  var _c$ = web.memo(() => metricParams.trend.direction === "up");
168
173
  return () => _c$() ? "�" : metricParams.trend.direction === "down" ? "�" : "�";
169
- })(), _el$59, _co$1);
170
- web.insert(_el$55, () => Math.abs(metricParams.trend.value), _el$61, _co$10);
171
- web.effect(() => web.className(_el$55, `text-sm font-medium ${metricParams.trend.direction === "up" ? "text-green-600 dark:text-green-400" : metricParams.trend.direction === "down" ? "text-red-600 dark:text-red-400" : "text-gray-600 dark:text-gray-400"}`));
172
- return _el$54;
174
+ })(), _el$60, _co$1);
175
+ web.insert(_el$56, () => Math.abs(metricParams.trend.value), _el$62, _co$10);
176
+ web.effect(() => web.className(_el$56, `text-sm font-medium ${metricParams.trend.direction === "up" ? "text-green-600 dark:text-green-400" : metricParams.trend.direction === "down" ? "text-red-600 dark:text-red-400" : "text-gray-600 dark:text-gray-400"}`));
177
+ return _el$55;
173
178
  }
174
- }), _el$64, _co$11);
175
- web.insert(_el$46, web.createComponent(solidJs.Show, {
179
+ }), _el$65, _co$11);
180
+ web.insert(_el$47, web.createComponent(solidJs.Show, {
176
181
  get when() {
177
182
  return metricParams.subtitle;
178
183
  },
179
184
  get children() {
180
- var _el$62 = web.getNextElement(_tmpl$11);
181
- web.insert(_el$62, () => metricParams.subtitle);
182
- return _el$62;
185
+ var _el$63 = web.getNextElement(_tmpl$11);
186
+ web.insert(_el$63, () => metricParams.subtitle);
187
+ return _el$63;
183
188
  }
184
- }), _el$66, _co$12);
185
- return _el$45;
189
+ }), _el$67, _co$12);
190
+ return _el$46;
186
191
  })();
187
192
  }
188
193
  function TextRenderer(props) {
@@ -196,94 +201,94 @@ function TextRenderer(props) {
196
201
  return textParams.content;
197
202
  });
198
203
  return (() => {
199
- var _el$67 = web.getNextElement(_tmpl$13), _el$68 = _el$67.firstChild;
204
+ var _el$68 = web.getNextElement(_tmpl$13), _el$69 = _el$68.firstChild;
200
205
  web.effect((_p$) => {
201
206
  var _v$ = `prose prose-sm dark:prose-invert max-w-none ${textParams.className || ""}`, _v$2 = htmlContent();
202
- _v$ !== _p$.e && web.className(_el$68, _p$.e = _v$);
203
- _v$2 !== _p$.t && web.setProperty(_el$68, "innerHTML", _p$.t = _v$2);
207
+ _v$ !== _p$.e && web.className(_el$69, _p$.e = _v$);
208
+ _v$2 !== _p$.t && web.setProperty(_el$69, "innerHTML", _p$.t = _v$2);
204
209
  return _p$;
205
210
  }, {
206
211
  e: void 0,
207
212
  t: void 0
208
213
  });
209
- return _el$67;
214
+ return _el$68;
210
215
  })();
211
216
  }
212
217
  function IframeRenderer(props) {
213
218
  const params = props.component.params;
214
219
  return (() => {
215
- var _el$69 = web.getNextElement(_tmpl$15), _el$73 = _el$69.firstChild, [_el$74, _co$13] = web.getNextMarker(_el$73.nextSibling), _el$72 = _el$74.nextSibling;
216
- web.insert(_el$69, web.createComponent(solidJs.Show, {
220
+ var _el$70 = web.getNextElement(_tmpl$15), _el$74 = _el$70.firstChild, [_el$75, _co$13] = web.getNextMarker(_el$74.nextSibling), _el$73 = _el$75.nextSibling;
221
+ web.insert(_el$70, web.createComponent(solidJs.Show, {
217
222
  get when() {
218
223
  return params.title;
219
224
  },
220
225
  get children() {
221
- var _el$70 = web.getNextElement(_tmpl$14), _el$71 = _el$70.firstChild;
222
- web.insert(_el$71, () => params.title);
223
- return _el$70;
226
+ var _el$71 = web.getNextElement(_tmpl$14), _el$72 = _el$71.firstChild;
227
+ web.insert(_el$72, () => params.title);
228
+ return _el$71;
224
229
  }
225
- }), _el$74, _co$13);
230
+ }), _el$75, _co$13);
226
231
  web.effect((_p$) => {
227
232
  var _v$3 = params.url, _v$4 = params.title || "Embedded content", _v$5 = `height: ${params.height || "400px"}; min-height: 300px;`;
228
- _v$3 !== _p$.e && web.setAttribute(_el$72, "src", _p$.e = _v$3);
229
- _v$4 !== _p$.t && web.setAttribute(_el$72, "title", _p$.t = _v$4);
230
- _p$.a = web.style(_el$72, _v$5, _p$.a);
233
+ _v$3 !== _p$.e && web.setAttribute(_el$73, "src", _p$.e = _v$3);
234
+ _v$4 !== _p$.t && web.setAttribute(_el$73, "title", _p$.t = _v$4);
235
+ _p$.a = web.style(_el$73, _v$5, _p$.a);
231
236
  return _p$;
232
237
  }, {
233
238
  e: void 0,
234
239
  t: void 0,
235
240
  a: void 0
236
241
  });
237
- return _el$69;
242
+ return _el$70;
238
243
  })();
239
244
  }
240
245
  function ImageRenderer(props) {
241
246
  const params = props.component.params;
242
247
  return (() => {
243
- var _el$75 = web.getNextElement(_tmpl$17), _el$76 = _el$75.firstChild, _el$77 = _el$76.firstChild, _el$78 = _el$77.firstChild, _el$81 = _el$76.nextSibling, [_el$82, _co$14] = web.getNextMarker(_el$81.nextSibling);
244
- web.insert(_el$75, web.createComponent(solidJs.Show, {
248
+ var _el$76 = web.getNextElement(_tmpl$17), _el$77 = _el$76.firstChild, _el$78 = _el$77.firstChild, _el$79 = _el$78.firstChild, _el$82 = _el$77.nextSibling, [_el$83, _co$14] = web.getNextMarker(_el$82.nextSibling);
249
+ web.insert(_el$76, web.createComponent(solidJs.Show, {
245
250
  get when() {
246
251
  return params.caption;
247
252
  },
248
253
  get children() {
249
- var _el$79 = web.getNextElement(_tmpl$16), _el$80 = _el$79.firstChild;
250
- web.insert(_el$80, () => params.caption);
251
- return _el$79;
254
+ var _el$80 = web.getNextElement(_tmpl$16), _el$81 = _el$80.firstChild;
255
+ web.insert(_el$81, () => params.caption);
256
+ return _el$80;
252
257
  }
253
- }), _el$82, _co$14);
258
+ }), _el$83, _co$14);
254
259
  web.effect((_p$) => {
255
260
  var _v$6 = params.url, _v$7 = params.url, _v$8 = params.alt || "Image";
256
- _v$6 !== _p$.e && web.setAttribute(_el$77, "href", _p$.e = _v$6);
257
- _v$7 !== _p$.t && web.setAttribute(_el$78, "src", _p$.t = _v$7);
258
- _v$8 !== _p$.a && web.setAttribute(_el$78, "alt", _p$.a = _v$8);
261
+ _v$6 !== _p$.e && web.setAttribute(_el$78, "href", _p$.e = _v$6);
262
+ _v$7 !== _p$.t && web.setAttribute(_el$79, "src", _p$.t = _v$7);
263
+ _v$8 !== _p$.a && web.setAttribute(_el$79, "alt", _p$.a = _v$8);
259
264
  return _p$;
260
265
  }, {
261
266
  e: void 0,
262
267
  t: void 0,
263
268
  a: void 0
264
269
  });
265
- return _el$75;
270
+ return _el$76;
266
271
  })();
267
272
  }
268
273
  function LinkRenderer(props) {
269
274
  const params = props.component.params;
270
275
  return (() => {
271
- var _el$83 = web.getNextElement(_tmpl$19), _el$84 = _el$83.firstChild, _el$85 = _el$84.nextSibling, _el$86 = _el$85.firstChild, _el$88 = _el$86.nextSibling, [_el$89, _co$15] = web.getNextMarker(_el$88.nextSibling);
272
- _el$83.$$click = (e) => e.stopPropagation();
273
- web.insert(_el$86, () => params.label || params.url);
274
- web.insert(_el$85, web.createComponent(solidJs.Show, {
276
+ var _el$84 = web.getNextElement(_tmpl$19), _el$85 = _el$84.firstChild, _el$86 = _el$85.nextSibling, _el$87 = _el$86.firstChild, _el$89 = _el$87.nextSibling, [_el$90, _co$15] = web.getNextMarker(_el$89.nextSibling);
277
+ _el$84.$$click = (e) => e.stopPropagation();
278
+ web.insert(_el$87, () => params.label || params.url);
279
+ web.insert(_el$86, web.createComponent(solidJs.Show, {
275
280
  get when() {
276
281
  return params.description;
277
282
  },
278
283
  get children() {
279
- var _el$87 = web.getNextElement(_tmpl$18);
280
- web.insert(_el$87, () => params.description);
281
- return _el$87;
284
+ var _el$88 = web.getNextElement(_tmpl$18);
285
+ web.insert(_el$88, () => params.description);
286
+ return _el$88;
282
287
  }
283
- }), _el$89, _co$15);
284
- web.effect(() => web.setAttribute(_el$83, "href", params.url));
288
+ }), _el$90, _co$15);
289
+ web.effect(() => web.setAttribute(_el$84, "href", params.url));
285
290
  web.runHydrationEvents();
286
- return _el$83;
291
+ return _el$84;
287
292
  })();
288
293
  }
289
294
  function ComponentRenderer(props) {
@@ -297,12 +302,12 @@ function ComponentRenderer(props) {
297
302
  details: validation$1.errors
298
303
  });
299
304
  return (() => {
300
- var _el$90 = web.getNextElement(_tmpl$20), _el$91 = _el$90.firstChild, _el$92 = _el$91.nextSibling;
301
- web.insert(_el$92, () => {
305
+ var _el$91 = web.getNextElement(_tmpl$20), _el$92 = _el$91.firstChild, _el$93 = _el$92.nextSibling;
306
+ web.insert(_el$93, () => {
302
307
  var _a2, _b;
303
308
  return ((_b = (_a2 = validation$1.errors) == null ? void 0 : _a2[0]) == null ? void 0 : _b.message) || "Unknown validation error";
304
309
  });
305
- return _el$90;
310
+ return _el$91;
306
311
  })();
307
312
  }
308
313
  return web.createComponent(GenerativeUIErrorBoundary.GenerativeUIErrorBoundary, {
@@ -434,25 +439,25 @@ function ActionRenderer(props) {
434
439
  };
435
440
  if (params.type === "link" || params.action === "link") {
436
441
  return (() => {
437
- var _el$93 = web.getNextElement(_tmpl$22), _el$95 = _el$93.firstChild, [_el$96, _co$16] = web.getNextMarker(_el$95.nextSibling), _el$97 = _el$96.nextSibling, [_el$98, _co$17] = web.getNextMarker(_el$97.nextSibling);
438
- _el$93.$$click = handleClick;
439
- web.insert(_el$93, web.createComponent(solidJs.Show, {
442
+ var _el$94 = web.getNextElement(_tmpl$22), _el$96 = _el$94.firstChild, [_el$97, _co$16] = web.getNextMarker(_el$96.nextSibling), _el$98 = _el$97.nextSibling, [_el$99, _co$17] = web.getNextMarker(_el$98.nextSibling);
443
+ _el$94.$$click = handleClick;
444
+ web.insert(_el$94, web.createComponent(solidJs.Show, {
440
445
  get when() {
441
446
  return params.icon;
442
447
  },
443
448
  get children() {
444
- var _el$94 = web.getNextElement(_tmpl$21);
445
- web.insert(_el$94, () => params.icon);
446
- return _el$94;
449
+ var _el$95 = web.getNextElement(_tmpl$21);
450
+ web.insert(_el$95, () => params.icon);
451
+ return _el$95;
447
452
  }
448
- }), _el$96, _co$16);
449
- web.insert(_el$93, () => params.label, _el$98, _co$17);
453
+ }), _el$97, _co$16);
454
+ web.insert(_el$94, () => params.label, _el$99, _co$17);
450
455
  web.effect((_p$) => {
451
456
  var _v$9 = params.url || "#", _v$0 = params.url ? "_blank" : void 0, _v$1 = `inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors
452
457
  ${params.variant === "primary" ? "bg-blue-600 text-white hover:bg-blue-700" : 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" : "text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300"}`;
453
- _v$9 !== _p$.e && web.setAttribute(_el$93, "href", _p$.e = _v$9);
454
- _v$0 !== _p$.t && web.setAttribute(_el$93, "target", _p$.t = _v$0);
455
- _v$1 !== _p$.a && web.className(_el$93, _p$.a = _v$1);
458
+ _v$9 !== _p$.e && web.setAttribute(_el$94, "href", _p$.e = _v$9);
459
+ _v$0 !== _p$.t && web.setAttribute(_el$94, "target", _p$.t = _v$0);
460
+ _v$1 !== _p$.a && web.className(_el$94, _p$.a = _v$1);
456
461
  return _p$;
457
462
  }, {
458
463
  e: void 0,
@@ -460,31 +465,31 @@ function ActionRenderer(props) {
460
465
  a: void 0
461
466
  });
462
467
  web.runHydrationEvents();
463
- return _el$93;
468
+ return _el$94;
464
469
  })();
465
470
  }
466
471
  return (() => {
467
- var _el$99 = web.getNextElement(_tmpl$23), _el$101 = _el$99.firstChild, [_el$102, _co$18] = web.getNextMarker(_el$101.nextSibling), _el$103 = _el$102.nextSibling, [_el$104, _co$19] = web.getNextMarker(_el$103.nextSibling);
468
- _el$99.$$click = handleClick;
469
- web.insert(_el$99, web.createComponent(solidJs.Show, {
472
+ var _el$100 = web.getNextElement(_tmpl$23), _el$102 = _el$100.firstChild, [_el$103, _co$18] = web.getNextMarker(_el$102.nextSibling), _el$104 = _el$103.nextSibling, [_el$105, _co$19] = web.getNextMarker(_el$104.nextSibling);
473
+ _el$100.$$click = handleClick;
474
+ web.insert(_el$100, web.createComponent(solidJs.Show, {
470
475
  get when() {
471
476
  return params.icon;
472
477
  },
473
478
  get children() {
474
- var _el$100 = web.getNextElement(_tmpl$21);
475
- web.insert(_el$100, () => params.icon);
476
- return _el$100;
479
+ var _el$101 = web.getNextElement(_tmpl$21);
480
+ web.insert(_el$101, () => params.icon);
481
+ return _el$101;
477
482
  }
478
- }), _el$102, _co$18);
479
- web.insert(_el$99, () => params.label, _el$104, _co$19);
483
+ }), _el$103, _co$18);
484
+ web.insert(_el$100, () => params.label, _el$105, _co$19);
480
485
  web.effect((_p$) => {
481
486
  var _v$10 = params.action === "submit" ? "submit" : "button", _v$11 = params.disabled, _v$12 = `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
482
487
  ${params.variant === "primary" ? "bg-blue-600 text-white hover:bg-blue-700 shadow-sm" : 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" : 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" : params.variant === "danger" ? "bg-red-600 text-white hover:bg-red-700" : "bg-transparent text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800"}
483
488
  ${params.disabled ? "opacity-50 cursor-not-allowed" : ""}
484
489
  ${params.size === "sm" ? "px-3 py-1.5 text-xs" : params.size === "lg" ? "px-6 py-3 text-base" : ""}`;
485
- _v$10 !== _p$.e && web.setAttribute(_el$99, "type", _p$.e = _v$10);
486
- _v$11 !== _p$.t && web.setProperty(_el$99, "disabled", _p$.t = _v$11);
487
- _v$12 !== _p$.a && web.className(_el$99, _p$.a = _v$12);
490
+ _v$10 !== _p$.e && web.setAttribute(_el$100, "type", _p$.e = _v$10);
491
+ _v$11 !== _p$.t && web.setProperty(_el$100, "disabled", _p$.t = _v$11);
492
+ _v$12 !== _p$.a && web.className(_el$100, _p$.a = _v$12);
488
493
  return _p$;
489
494
  }, {
490
495
  e: void 0,
@@ -492,7 +497,7 @@ function ActionRenderer(props) {
492
497
  a: void 0
493
498
  });
494
499
  web.runHydrationEvents();
495
- return _el$99;
500
+ return _el$100;
496
501
  })();
497
502
  }
498
503
  const UIResourceRenderer = (props) => {
@@ -524,33 +529,33 @@ const UIResourceRenderer = (props) => {
524
529
  return `grid-column: ${colStart} / span ${colSpan}; grid-row: ${rowStart ? `${rowStart} / span ${rowSpan}` : "auto"}`;
525
530
  };
526
531
  return (() => {
527
- var _el$105 = web.getNextElement(_tmpl$24), _el$106 = _el$105.firstChild;
528
- web.insert(_el$106, web.createComponent(solidJs.For, {
532
+ var _el$106 = web.getNextElement(_tmpl$24), _el$107 = _el$106.firstChild;
533
+ web.insert(_el$107, web.createComponent(solidJs.For, {
529
534
  get each() {
530
535
  return layout().components;
531
536
  },
532
537
  children: (component) => (() => {
533
- var _el$107 = web.getNextElement(_tmpl$25);
534
- web.insert(_el$107, web.createComponent(ComponentRenderer, {
538
+ var _el$108 = web.getNextElement(_tmpl$25);
539
+ web.insert(_el$108, web.createComponent(ComponentRenderer, {
535
540
  component,
536
541
  get onError() {
537
542
  return props.onError;
538
543
  }
539
544
  }));
540
- web.effect((_$p) => web.style(_el$107, getGridStyleString(component), _$p));
541
- return _el$107;
545
+ web.effect((_$p) => web.style(_el$108, getGridStyleString(component), _$p));
546
+ return _el$108;
542
547
  })()
543
548
  }));
544
549
  web.effect((_p$) => {
545
550
  var _v$13 = `w-full ${props.class || ""}`, _v$14 = gridContainerStyle();
546
- _v$13 !== _p$.e && web.className(_el$105, _p$.e = _v$13);
547
- _p$.t = web.style(_el$106, _v$14, _p$.t);
551
+ _v$13 !== _p$.e && web.className(_el$106, _p$.e = _v$13);
552
+ _p$.t = web.style(_el$107, _v$14, _p$.t);
548
553
  return _p$;
549
554
  }, {
550
555
  e: void 0,
551
556
  t: void 0
552
557
  });
553
- return _el$105;
558
+ return _el$106;
554
559
  })();
555
560
  };
556
561
  web.delegateEvents(["click"]);