{"version":3,"file":"renderer.cjs","sources":["../../../../../src/lib/renderer.tsx"],"sourcesContent":["/**\r\n * Renderer Module\r\n * \r\n * Core rendering logic for the llm2ui system.\r\n * Renders UISchema to React components with data binding and event handling.\r\n * \r\n * Requirements: 7.1, 4.4\r\n */\r\n\r\nimport React, { createElement, Fragment, useMemo, useCallback } from 'react';\r\nimport type { UIComponent, UISchema, DataContext, EventBinding, EventAction, StyleProps } from '../types';\r\nimport { ComponentRegistry, defaultRegistry } from './component-registry';\r\nimport { resolveBindings, resolveBinding, parsePath, resolvePath } from './data-binding';\r\n\r\n/**\r\n * Event handler callback type\r\n */\r\nexport type EventHandler = (\r\n  action: EventAction,\r\n  event: React.SyntheticEvent,\r\n  componentId: string\r\n) => void;\r\n\r\n/**\r\n * Render options for customizing rendering behavior\r\n */\r\nexport interface RenderOptions {\r\n  /** Component registry to use (defaults to defaultRegistry) */\r\n  registry?: ComponentRegistry;\r\n  /** Event handler callback */\r\n  onEvent?: EventHandler;\r\n  /** Custom component for unknown types */\r\n  unknownComponent?: React.ComponentType<{ type: string; id: string }>;\r\n  /** Whether to show error boundaries */\r\n  showErrors?: boolean;\r\n}\r\n\r\n/**\r\n * Render context passed down through the component tree\r\n */\r\ninterface RenderContext {\r\n  registry: ComponentRegistry;\r\n  data: DataContext;\r\n  onEvent?: EventHandler;\r\n  unknownComponent?: React.ComponentType<{ type: string; id: string }>;\r\n  showErrors: boolean;\r\n  /** Loop item context for nested loops */\r\n  loopContext?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Default unknown component placeholder\r\n */\r\nconst DefaultUnknownComponent: React.FC<{ type: string; id: string }> = ({ type, id }) => (\r\n  <div\r\n    style={{\r\n      padding: '8px',\r\n      border: '1px dashed #ccc',\r\n      borderRadius: '4px',\r\n      backgroundColor: '#f9f9f9',\r\n      color: '#666',\r\n      fontSize: '12px',\r\n    }}\r\n  >\r\n    Unknown component: {type} (id: {id})\r\n  </div>\r\n);\r\n\r\n/**\r\n * Convert StyleProps to React CSSProperties\r\n */\r\nfunction stylePropsToCSS(styleProps?: StyleProps): React.CSSProperties | undefined {\r\n  if (!styleProps) return undefined;\r\n\r\n  const css: React.CSSProperties = {};\r\n\r\n  if (styleProps.style) {\r\n    Object.assign(css, styleProps.style);\r\n  }\r\n  if (styleProps.width !== undefined) css.width = styleProps.width;\r\n  if (styleProps.height !== undefined) css.height = styleProps.height;\r\n  if (styleProps.margin !== undefined) css.margin = styleProps.margin;\r\n  if (styleProps.padding !== undefined) css.padding = styleProps.padding;\r\n  if (styleProps.display) css.display = styleProps.display;\r\n  if (styleProps.flexDirection) css.flexDirection = styleProps.flexDirection;\r\n  if (styleProps.justifyContent) css.justifyContent = styleProps.justifyContent;\r\n  if (styleProps.alignItems) css.alignItems = styleProps.alignItems;\r\n  if (styleProps.gap !== undefined) css.gap = styleProps.gap;\r\n  if (styleProps.backgroundColor) css.backgroundColor = styleProps.backgroundColor;\r\n  if (styleProps.color) css.color = styleProps.color;\r\n  if (styleProps.fontSize !== undefined) css.fontSize = styleProps.fontSize;\r\n  if (styleProps.fontWeight !== undefined) css.fontWeight = styleProps.fontWeight;\r\n  if (styleProps.borderRadius !== undefined) css.borderRadius = styleProps.borderRadius;\r\n  if (styleProps.border) css.border = styleProps.border;\r\n\r\n  return Object.keys(css).length > 0 ? css : undefined;\r\n}\r\n\r\n\r\n/**\r\n * Resolve props with data bindings\r\n */\r\nfunction resolveProps(\r\n  props: Record<string, unknown> | undefined,\r\n  data: DataContext\r\n): Record<string, unknown> {\r\n  if (!props) return {};\r\n\r\n  const resolved: Record<string, unknown> = {};\r\n\r\n  for (const [key, value] of Object.entries(props)) {\r\n    if (typeof value === 'string') {\r\n      // Resolve binding expressions in string values\r\n      resolved[key] = resolveBindings(value, data);\r\n    } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n      // Recursively resolve nested objects\r\n      resolved[key] = resolveProps(value as Record<string, unknown>, data);\r\n    } else {\r\n      resolved[key] = value;\r\n    }\r\n  }\r\n\r\n  return resolved;\r\n}\r\n\r\n/**\r\n * Create event handlers for a component\r\n */\r\nfunction createEventHandlers(\r\n  events: EventBinding[] | undefined,\r\n  componentId: string,\r\n  onEvent?: EventHandler\r\n): Record<string, (e: React.SyntheticEvent) => void> {\r\n  if (!events || !onEvent) return {};\r\n\r\n  const handlers: Record<string, (e: React.SyntheticEvent) => void> = {};\r\n\r\n  for (const binding of events) {\r\n    const eventName = `on${binding.event.charAt(0).toUpperCase()}${binding.event.slice(1)}`;\r\n    handlers[eventName] = (e: React.SyntheticEvent) => {\r\n      onEvent(binding.action, e, componentId);\r\n    };\r\n  }\r\n\r\n  return handlers;\r\n}\r\n\r\n/**\r\n * Evaluate a condition expression against data context\r\n */\r\nfunction evaluateCondition(condition: string, data: DataContext): boolean {\r\n  // Simple binding resolution - if it's a binding expression, resolve it\r\n  if (condition.startsWith('{{') && condition.endsWith('}}')) {\r\n    const result = resolveBinding(condition, data);\r\n    if (result.success) {\r\n      return Boolean(result.value);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  // For simple truthy check on a path\r\n  const parseResult = parsePath(condition);\r\n  if (parseResult.success && parseResult.segments) {\r\n    const result = resolvePath(parseResult.segments, data);\r\n    if (result.success) {\r\n      return Boolean(result.value);\r\n    }\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\n/**\r\n * Get loop items from data context\r\n */\r\nfunction getLoopItems(source: string, data: DataContext): unknown[] {\r\n  const parseResult = parsePath(source);\r\n  if (!parseResult.success || !parseResult.segments) {\r\n    return [];\r\n  }\r\n\r\n  const result = resolvePath(parseResult.segments, data);\r\n  if (!result.success || !Array.isArray(result.value)) {\r\n    return [];\r\n  }\r\n\r\n  return result.value;\r\n}\r\n\r\n\r\n/**\r\n * Render a single UIComponent\r\n */\r\nfunction renderComponent(\r\n  component: UIComponent,\r\n  context: RenderContext,\r\n  key?: string | number\r\n): React.ReactNode {\r\n  const { registry, data, onEvent, unknownComponent, loopContext } = context;\r\n\r\n  // Merge loop context with data\r\n  const mergedData: DataContext = loopContext ? { ...data, ...loopContext } : data;\r\n\r\n  // Check condition\r\n  if (component.condition) {\r\n    const shouldRender = evaluateCondition(component.condition, mergedData);\r\n    if (!shouldRender) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  // Handle loop rendering\r\n  if (component.loop) {\r\n    const items = getLoopItems(component.loop.source, mergedData);\r\n    const itemName = component.loop.itemName || 'item';\r\n    const indexName = component.loop.indexName || 'index';\r\n\r\n    return createElement(\r\n      Fragment,\r\n      { key },\r\n      items.map((item, index) => {\r\n        // Create a component without the loop property to avoid infinite recursion\r\n        const { loop, ...componentWithoutLoop } = component;\r\n        const newContext: RenderContext = {\r\n          ...context,\r\n          loopContext: {\r\n            ...loopContext,\r\n            [itemName]: item,\r\n            [indexName]: index,\r\n          },\r\n        };\r\n        return renderComponent(\r\n          { ...componentWithoutLoop, id: `${component.id}-${index}` },\r\n          newContext,\r\n          `${component.id}-${index}`\r\n        );\r\n      })\r\n    );\r\n  }\r\n\r\n  // Get component definition from registry\r\n  const componentDef = registry.get(component.type);\r\n\r\n  if (!componentDef) {\r\n    // Unknown component\r\n    const UnknownComp = unknownComponent || DefaultUnknownComponent;\r\n    return createElement(UnknownComp, { key, type: component.type, id: component.id });\r\n  }\r\n\r\n  // Resolve props with data bindings\r\n  const resolvedProps = resolveProps(component.props, mergedData);\r\n\r\n  // Add style props\r\n  const style = stylePropsToCSS(component.style);\r\n  if (style) {\r\n    resolvedProps.style = { ...(resolvedProps.style as React.CSSProperties || {}), ...style };\r\n  }\r\n\r\n  // Add className if present\r\n  if (component.style?.className) {\r\n    resolvedProps.className = component.style.className;\r\n  }\r\n\r\n  // Create event handlers\r\n  const eventHandlers = createEventHandlers(component.events, component.id, onEvent);\r\n\r\n  // Merge all props\r\n  const finalProps = {\r\n    ...resolvedProps,\r\n    ...eventHandlers,\r\n    key,\r\n  };\r\n\r\n  // Resolve text content with bindings\r\n  let textContent: string | undefined;\r\n  if (component.text) {\r\n    textContent = resolveBindings(component.text, mergedData);\r\n  }\r\n\r\n  // Resolve binding value\r\n  let bindingValue: unknown;\r\n  if (component.binding) {\r\n    const bindingResult = resolveBinding(component.binding, mergedData);\r\n    if (bindingResult.success) {\r\n      bindingValue = bindingResult.value;\r\n    }\r\n  }\r\n\r\n  // Render children\r\n  let children: React.ReactNode = null;\r\n\r\n  if (component.children && component.children.length > 0) {\r\n    children = component.children.map((child, index) =>\r\n      renderComponent(child, context, `${child.id}-${index}`)\r\n    );\r\n  } else if (textContent !== undefined) {\r\n    children = textContent;\r\n  } else if (bindingValue !== undefined) {\r\n    // Convert binding value to displayable content\r\n    if (typeof bindingValue === 'string' || typeof bindingValue === 'number') {\r\n      children = String(bindingValue);\r\n    } else if (bindingValue !== null && typeof bindingValue === 'object') {\r\n      children = JSON.stringify(bindingValue);\r\n    }\r\n  }\r\n\r\n  return createElement(componentDef.component, finalProps, children);\r\n}\r\n\r\n\r\n/**\r\n * Render a UISchema to React elements\r\n * \r\n * @param schema - The UISchema to render\r\n * @param options - Render options\r\n * @returns React element tree\r\n */\r\nexport function render(\r\n  schema: UISchema,\r\n  options: RenderOptions = {}\r\n): React.ReactNode {\r\n  const {\r\n    registry = defaultRegistry,\r\n    onEvent,\r\n    unknownComponent,\r\n    showErrors = false,\r\n  } = options;\r\n\r\n  const context: RenderContext = {\r\n    registry,\r\n    data: schema.data || {},\r\n    onEvent,\r\n    unknownComponent,\r\n    showErrors,\r\n  };\r\n\r\n  return renderComponent(schema.root, context);\r\n}\r\n\r\n/**\r\n * React component wrapper for rendering UISchema\r\n */\r\nexport interface UIRendererProps {\r\n  /** The UISchema to render */\r\n  schema: UISchema;\r\n  /** Component registry to use */\r\n  registry?: ComponentRegistry;\r\n  /** Event handler callback */\r\n  onEvent?: EventHandler;\r\n  /** Custom component for unknown types */\r\n  unknownComponent?: React.ComponentType<{ type: string; id: string }>;\r\n  /** Whether to show error boundaries */\r\n  showErrors?: boolean;\r\n}\r\n\r\n/**\r\n * UIRenderer component - renders a UISchema as React components\r\n */\r\nexport const UIRenderer: React.FC<UIRendererProps> = ({\r\n  schema,\r\n  registry = defaultRegistry,\r\n  onEvent,\r\n  unknownComponent,\r\n  showErrors = false,\r\n}) => {\r\n  // Memoize the render context\r\n  const context = useMemo<RenderContext>(\r\n    () => ({\r\n      registry,\r\n      data: schema.data || {},\r\n      onEvent,\r\n      unknownComponent,\r\n      showErrors,\r\n    }),\r\n    [registry, schema.data, onEvent, unknownComponent, showErrors]\r\n  );\r\n\r\n  // Memoize the rendered output\r\n  const rendered = useMemo(\r\n    () => renderComponent(schema.root, context),\r\n    [schema.root, context]\r\n  );\r\n\r\n  return createElement(Fragment, null, rendered);\r\n};\r\n\r\n/**\r\n * Hook for using the renderer with state management\r\n */\r\nexport function useRenderer(\r\n  schema: UISchema,\r\n  options: RenderOptions = {}\r\n): {\r\n  rendered: React.ReactNode;\r\n  handleEvent: EventHandler;\r\n} {\r\n  const handleEvent = useCallback<EventHandler>(\r\n    (action, event, componentId) => {\r\n      if (options.onEvent) {\r\n        options.onEvent(action, event, componentId);\r\n      }\r\n    },\r\n    [options.onEvent]\r\n  );\r\n\r\n  const rendered = useMemo(\r\n    () => render(schema, { ...options, onEvent: handleEvent }),\r\n    [schema, options.registry, options.unknownComponent, options.showErrors, handleEvent]\r\n  );\r\n\r\n  return { rendered, handleEvent };\r\n}\r\n\r\n/**\r\n * Extract the pure schema structure without framework-specific code\r\n * This demonstrates that the schema is framework-agnostic\r\n * \r\n * @param schema - The UISchema\r\n * @returns A plain object representation of the schema\r\n */\r\nexport function extractPureSchema(schema: UISchema): object {\r\n  return JSON.parse(JSON.stringify(schema));\r\n}\r\n"],"names":["DefaultUnknownComponent","type","id","jsxs","stylePropsToCSS","styleProps","css","resolveProps","props","data","resolved","key","value","resolveBindings","createEventHandlers","events","componentId","onEvent","handlers","binding","eventName","e","evaluateCondition","condition","result","resolveBinding","parseResult","parsePath","resolvePath","getLoopItems","source","renderComponent","component","context","registry","unknownComponent","loopContext","mergedData","items","itemName","indexName","createElement","Fragment","item","index","loop","componentWithoutLoop","newContext","componentDef","UnknownComp","resolvedProps","style","eventHandlers","finalProps","textContent","bindingValue","bindingResult","children","child","render","schema","options","defaultRegistry","showErrors","UIRenderer","useMemo","rendered","useRenderer","handleEvent","useCallback","action","event"],"mappings":"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"}