@kubuild/renderer 0.0.1 → 0.1.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/renderer.tsx","../src/render-context.tsx","../src/styles.ts","../src/error-boundary.tsx","../src/prop-resolution.ts","../src/preview-adapter.tsx"],"sourcesContent":["export * from './renderer';\nexport * from './styles';\nexport * from './render-context';\nexport * from './error-boundary';\nexport * from './preview-adapter';\n","import React, { useRef, useLayoutEffect, useState, useEffect, useMemo } from 'react';\nimport { PageDocument, Node, isAssetReference, isActionBinding, isVariableBinding } from '@kubuild/schema';\nimport { ComponentRegistry, createDefaultComponentRegistry } from '@kubuild/components';\nimport {\n RenderContext,\n DEFAULT_RENDER_CONTEXT,\n RenderContextProvider,\n resolveAssetSync,\n resolveActionPayload,\n isActionRegistered,\n dispatchAction,\n Diagnostic,\n} from './render-context';\nimport { resolveBinding, sanitizeUrl, sanitizeHtml } from '@kubuild/core';\nimport { icons as lucideIcons } from 'lucide-react';\nimport { resolveNodeStyles, collectStateStylesCss } from './styles';\nimport { ComponentErrorBoundary } from './error-boundary';\nimport { resolvePropsForNode } from './prop-resolution';\n\nfunction toPascalCase(str: string): string {\n if (!str) return '';\n return str\n .replace(/[-_](\\w)/g, (_, c) => c.toUpperCase())\n .replace(/^\\w/, (c) => c.toUpperCase());\n}\n\nfunction getYouTubeId(url: string): string | null {\n if (!url || typeof url !== 'string') return null;\n const match = url.match(\n /(?:youtube\\.com\\/(?:[^\\/]+\\/.+\\/|(?:v|e(?:mbed)?)\\/|.*[?&]v=)|youtu\\.be\\/)([^\"&?\\/\\s]{11})/i,\n );\n return match ? match[1] : null;\n}\n\nfunction getVimeoId(url: string): string | null {\n if (!url || typeof url !== 'string') return null;\n const match = url.match(\n /(?:vimeo\\.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^\\/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|video\\/|))(\\d+)/i,\n );\n return match ? match[3] : null;\n}\n\nfunction aspectRatioToCss(ratio: unknown): string | undefined {\n if (ratio === '16:9') return '16 / 9';\n if (ratio === '4:3') return '4 / 3';\n if (ratio === '1:1') return '1 / 1';\n if (ratio === '9:16') return '9 / 16';\n if (typeof ratio === 'string' && ratio !== 'auto') return ratio.replace(':', ' / ');\n return undefined;\n}\n\nexport interface EditableTextProps {\n as?: string;\n id?: string;\n className?: string;\n style?: React.CSSProperties;\n value: string;\n isEditable: boolean;\n nodeId: string;\n onClick?: (e: React.MouseEvent) => void;\n onChange?: (val: string, isBlur: boolean) => void;\n [key: string]: unknown;\n}\n\nexport const EditableText: React.FC<EditableTextProps> = ({\n as = 'p',\n id,\n className,\n style,\n value,\n isEditable,\n nodeId,\n onClick,\n onChange,\n ...rest\n}) => {\n const isEditingRef = useRef(false);\n\n const Tag = as as any;\n\n if (!isEditable) {\n return (\n <Tag\n id={id}\n className={className}\n style={style}\n onClick={onClick}\n data-kubuild-node={nodeId}\n {...rest}\n >\n {value}\n </Tag>\n );\n }\n\n return (\n <Tag\n id={id}\n className={className}\n style={{\n ...style,\n outline: 'none',\n cursor: 'text',\n }}\n contentEditable={true}\n suppressContentEditableWarning={true}\n data-kubuild-node={nodeId}\n onClick={(e: React.MouseEvent) => {\n onClick?.(e);\n }}\n onFocus={() => {\n isEditingRef.current = true;\n }}\n onInput={(e: React.FormEvent<HTMLElement>) => {\n const text = e.currentTarget.textContent ?? '';\n onChange?.(text, false);\n }}\n onBlur={(e: React.FocusEvent<HTMLElement>) => {\n isEditingRef.current = false;\n const text = e.currentTarget.textContent ?? '';\n onChange?.(text, true);\n }}\n onKeyDown={(e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n (e.currentTarget as HTMLElement).blur();\n }\n }}\n {...rest}\n >\n {value}\n </Tag>\n );\n};\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport function transformEmbedHtml(rawHtml: string): string {\n if (!rawHtml) return '';\n\n return rawHtml.replace(/<style\\b([^>]*)>([\\s\\S]*?)<\\/style>/gi, (_match, attrs, cssContent) => {\n let transformedCss = cssContent;\n // Replace \"body {\" or \"body,\" with \":host, body {\"\n transformedCss = transformedCss.replace(/(^|[\\s,{}])body(?=[\\s,{])/g, '$1:host, body');\n // Replace \"html {\" or \"html,\" with \":host, html {\"\n transformedCss = transformedCss.replace(/(^|[\\s,{}])html(?=[\\s,{])/g, '$1:host, html');\n\n return `<style${attrs}>\\n:host { display: block; }\\n${transformedCss}</style>`;\n });\n}\n\nexport interface HtmlEmbedViewProps {\n id?: string;\n style?: React.CSSProperties;\n onClick?: (e: React.MouseEvent) => void;\n dataKubuildNode?: string;\n html: string;\n role?: string;\n}\n\nexport const HtmlEmbedView: React.FC<HtmlEmbedViewProps> = ({\n id,\n style,\n onClick,\n dataKubuildNode,\n html,\n role,\n}) => {\n const hostRef = useRef<HTMLDivElement>(null);\n const shadowRootRef = useRef<ShadowRoot | null>(null);\n\n const scopedHtml = useMemo(() => transformEmbedHtml(html), [html]);\n\n useIsomorphicLayoutEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n if (typeof host.attachShadow === 'function') {\n if (!shadowRootRef.current) {\n if (host.shadowRoot) {\n shadowRootRef.current = host.shadowRoot;\n } else {\n try {\n shadowRootRef.current = host.attachShadow({ mode: 'open' });\n } catch {\n shadowRootRef.current = host.shadowRoot;\n }\n }\n }\n\n if (shadowRootRef.current) {\n shadowRootRef.current.innerHTML = scopedHtml;\n return;\n }\n }\n\n host.innerHTML = scopedHtml;\n }, [scopedHtml]);\n\n return (\n <div\n ref={hostRef}\n id={id}\n style={style}\n onClick={onClick}\n data-kubuild-node={dataKubuildNode}\n role={role}\n >\n <template\n // @ts-expect-error Declarative shadow root for SSR\n shadowrootmode=\"open\"\n dangerouslySetInnerHTML={{ __html: scopedHtml }}\n />\n </div>\n );\n};\n\nexport interface KubuildRendererProps {\n document: PageDocument;\n registry?: ComponentRegistry;\n context?: RenderContext;\n viewport?: 'desktop' | 'tablet' | 'mobile';\n mode?: 'editor' | 'runtime';\n className?: string;\n onNodeClick?: (nodeId: string, event: React.MouseEvent) => void;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n onActionDispatch?: (actionType: string, payload: Record<string, unknown> | undefined, nodeId: string) => void;\n onNodePropChange?: (nodeId: string, propName: string, value: unknown, isBlur?: boolean) => void;\n}\n\nexport interface NodeRendererProps {\n node: Node;\n document: PageDocument;\n registry: ComponentRegistry;\n context?: RenderContext;\n viewport?: 'desktop' | 'tablet' | 'mobile';\n mode?: 'editor' | 'runtime';\n onNodeClick?: (nodeId: string, event: React.MouseEvent) => void;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n onActionDispatch?: (actionType: string, payload: Record<string, unknown> | undefined, nodeId: string) => void;\n onNodePropChange?: (nodeId: string, propName: string, value: unknown, isBlur?: boolean) => void;\n /**\n * Suffix appended to the HTML `id` attribute (never to `data-kubuild-node`, the\n * canonical template-node reference) so a `collection` node's repeated child\n * template produces unique DOM ids per iteration instead of duplicates.\n */\n instanceSuffix?: string;\n}\n\nexport function NodeRenderer({\n node,\n document,\n registry,\n context: propContext,\n viewport = 'desktop',\n mode = 'runtime',\n onNodeClick,\n onDiagnostic,\n onActionDispatch,\n onNodePropChange,\n instanceSuffix = '',\n}: NodeRendererProps): React.ReactElement {\n const context = propContext || DEFAULT_RENDER_CONTEXT;\n const styles = resolveNodeStyles(node.styles, viewport);\n const props = node.props || {};\n const definition = registry.get(node.type);\n const domId = instanceSuffix ? `${node.id}${instanceSuffix}` : node.id;\n const { props: resolvedProps, diagnostics } = resolvePropsForNode(node, definition, context);\n diagnostics.forEach((diagnostic) => {\n onDiagnostic?.(diagnostic);\n context?.onDiagnostic?.(diagnostic);\n });\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (onNodeClick) {\n onNodeClick(node.id, e);\n }\n if (props.action && !props.disabled) {\n dispatchAction({\n action: props.action,\n nodeId: node.id,\n document,\n context,\n onDiagnostic,\n });\n if (onActionDispatch && isActionBinding(props.action)) {\n onActionDispatch(props.action.type, resolveActionPayload(context, props.action.payload), node.id);\n }\n }\n };\n\n const childrenElements = node.children?.map((child: Node) => (\n <NodeRenderer\n key={`${child.id}${instanceSuffix}`}\n node={child}\n document={document}\n registry={registry}\n context={context}\n viewport={viewport}\n mode={mode}\n onNodeClick={onNodeClick}\n onDiagnostic={onDiagnostic}\n onActionDispatch={onActionDispatch}\n onNodePropChange={onNodePropChange}\n instanceSuffix={instanceSuffix}\n />\n ));\n\n const renderNodeContent = (): React.ReactElement => {\n // Check if custom component renderer is registered in ComponentRegistry\n if (definition?.renderer && typeof definition.renderer === 'function') {\n const CustomRenderer = definition.renderer as React.ComponentType<{\n node: Node;\n document: PageDocument;\n props: Record<string, unknown>;\n styles: React.CSSProperties;\n context?: RenderContext;\n children?: React.ReactNode;\n onClick?: (e: React.MouseEvent) => void;\n }>;\n\n try {\n if (typeof CustomRenderer === 'function' && !CustomRenderer.prototype?.isReactComponent) {\n return (CustomRenderer as (p: unknown) => React.ReactElement)({\n node,\n document,\n props: resolvedProps,\n styles,\n context,\n children: childrenElements,\n onClick: handleClick,\n });\n }\n } catch (err) {\n throw err;\n }\n\n return (\n <CustomRenderer\n node={node}\n document={document}\n props={resolvedProps}\n styles={styles}\n context={context}\n onClick={handleClick}\n >\n {childrenElements}\n </CustomRenderer>\n );\n }\n\n switch (node.type) {\n case 'page':\n return (\n <div id={domId} style={styles} onClick={handleClick} data-kubuild-node={node.id}>\n {childrenElements}\n </div>\n );\n case 'section':\n return (\n <section\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n aria-label={typeof resolvedProps.ariaLabel === 'string' ? resolvedProps.ariaLabel : undefined}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {childrenElements}\n </section>\n );\n case 'container':\n return (\n <div\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {childrenElements}\n </div>\n );\n case 'columns':\n return (\n <div\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {childrenElements}\n </div>\n );\n case 'heading': {\n const rawLevel = typeof resolvedProps.level === 'number' ? resolvedProps.level : typeof props.level === 'number' ? props.level : 2;\n const clampedLevel = Math.min(Math.max(rawLevel, 1), 6);\n const text = String(resolvedProps.text ?? '');\n const Tag = `h${clampedLevel}`;\n const isEditable = mode === 'editor' && !isVariableBinding(props.text);\n return (\n <EditableText\n as={Tag}\n id={domId}\n style={styles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n aria-label={typeof resolvedProps.ariaLabel === 'string' ? resolvedProps.ariaLabel : undefined}\n />\n );\n }\n case 'text': {\n const content = String(resolvedProps.content ?? '');\n const isEditable = mode === 'editor' && !isVariableBinding(props.content);\n return (\n <EditableText\n as=\"p\"\n id={domId}\n style={styles}\n value={content}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'content', val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'paragraph': {\n const text = String(resolvedProps.text ?? resolvedProps.content ?? props.text ?? props.content ?? '');\n const isEditable = mode === 'editor' && !isVariableBinding(props.text) && !isVariableBinding(props.content);\n const propName = props.content !== undefined ? 'content' : 'text';\n return (\n <EditableText\n as=\"p\"\n id={domId}\n style={styles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, propName, val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'link': {\n const text = String(resolvedProps.text ?? props.text ?? '');\n const rawHref = typeof resolvedProps.href === 'string' ? resolvedProps.href : typeof props.href === 'string' ? props.href : undefined;\n const href = rawHref ? sanitizeUrl(rawHref, '#') : '#';\n const rawTarget = typeof resolvedProps.target === 'string' ? resolvedProps.target : undefined;\n const rawRel = typeof resolvedProps.rel === 'string' ? resolvedProps.rel : undefined;\n const rel = rawTarget === '_blank' && !rawRel ? 'noopener noreferrer' : rawRel;\n const isEditable = mode === 'editor' && !isVariableBinding(props.text);\n\n if (isEditable) {\n return (\n <EditableText\n as=\"a\"\n id={domId}\n href={undefined}\n target={rawTarget}\n rel={rel}\n style={styles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n\n return (\n <a\n id={domId}\n href={href}\n target={rawTarget}\n rel={rel}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {text}\n </a>\n );\n }\n case 'blockquote': {\n const text = resolvedProps.text !== undefined ? String(resolvedProps.text) : props.text !== undefined ? String(props.text) : '';\n const rawCite = typeof resolvedProps.cite === 'string' ? resolvedProps.cite : typeof props.cite === 'string' ? props.cite : undefined;\n const safeCite = rawCite ? sanitizeUrl(rawCite) : undefined;\n const hasChildren = Boolean(childrenElements && childrenElements.length > 0);\n const isEditable = mode === 'editor' && !isVariableBinding(props.text);\n\n if (hasChildren) {\n return (\n <blockquote\n id={domId}\n cite={safeCite}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {text ? (\n isEditable ? (\n <EditableText\n as=\"p\"\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n />\n ) : (\n <p>{text}</p>\n )\n ) : null}\n {childrenElements}\n </blockquote>\n );\n }\n\n return (\n <EditableText\n as=\"blockquote\"\n id={domId}\n cite={safeCite}\n style={styles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'badge': {\n const text = String(resolvedProps.text ?? props.text ?? 'Badge');\n const variant = typeof resolvedProps.variant === 'string' ? resolvedProps.variant : 'default';\n const isEditable = mode === 'editor' && !isVariableBinding(props.text);\n\n return (\n <EditableText\n as=\"span\"\n id={domId}\n style={styles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n data-variant={variant}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'code-block': {\n const code = String(resolvedProps.code ?? props.code ?? '');\n const language = typeof resolvedProps.language === 'string' ? resolvedProps.language : typeof props.language === 'string' ? props.language : undefined;\n const isEditable = mode === 'editor' && !isVariableBinding(props.code);\n\n return (\n <pre\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-language={language}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n <EditableText\n as=\"code\"\n className={language ? `language-${language}` : undefined}\n style={{ fontFamily: 'inherit', color: 'inherit', display: 'block', whiteSpace: 'pre' }}\n value={code}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'code', val, isBlur)}\n />\n </pre>\n );\n }\n case 'list': {\n const rawTag = resolvedProps.tag;\n const Tag = rawTag === 'ol' ? 'ol' : 'ul';\n const rawListStyle = resolvedProps.listStyleType as string | undefined;\n const listStyleType = rawListStyle === 'custom-icon' ? 'none' : rawListStyle;\n const listStyles: React.CSSProperties = {\n ...styles,\n ...(listStyleType ? { listStyleType } : {}),\n };\n return (\n <Tag\n id={domId}\n style={listStyles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-list-style={rawListStyle}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {childrenElements}\n </Tag>\n );\n }\n case 'list-item': {\n const text = resolvedProps.text !== undefined ? String(resolvedProps.text) : '';\n const hasChildren = Boolean(childrenElements && childrenElements.length > 0);\n const isEditable = mode === 'editor' && !isVariableBinding(props.text);\n\n if (hasChildren) {\n return (\n <li\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {text ? (\n isEditable ? (\n <EditableText\n as=\"span\"\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n />\n ) : (\n <span>{text}</span>\n )\n ) : null}\n {childrenElements}\n </li>\n );\n }\n\n return (\n <EditableText\n as=\"li\"\n id={domId}\n style={styles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'table': {\n const isStriped = resolvedProps.striped === true;\n const isBordered = resolvedProps.bordered !== false;\n const isCompact = resolvedProps.compact === true;\n\n const tableStyles: React.CSSProperties = {\n width: '100%',\n borderCollapse: 'collapse',\n ...styles,\n ...(isBordered ? { border: styles.border || '1px solid #e2e8f0' } : {}),\n };\n\n return (\n <table\n id={domId}\n style={tableStyles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-striped={isStriped ? 'true' : undefined}\n data-bordered={isBordered ? 'true' : undefined}\n data-compact={isCompact ? 'true' : undefined}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n <tbody>{childrenElements}</tbody>\n </table>\n );\n }\n case 'table-row': {\n return (\n <tr\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {childrenElements}\n </tr>\n );\n }\n case 'table-cell': {\n const rawTag = resolvedProps.tag;\n const Tag = rawTag === 'th' ? 'th' : 'td';\n const colSpan =\n typeof resolvedProps.colSpan === 'number' && resolvedProps.colSpan > 1\n ? resolvedProps.colSpan\n : undefined;\n const rowSpan =\n typeof resolvedProps.rowSpan === 'number' && resolvedProps.rowSpan > 1\n ? resolvedProps.rowSpan\n : undefined;\n const text = resolvedProps.text !== undefined ? String(resolvedProps.text) : '';\n const hasChildren = Boolean(childrenElements && childrenElements.length > 0);\n const isEditable = mode === 'editor' && !isVariableBinding(props.text);\n\n const cellStyles: React.CSSProperties = {\n padding: '8px 12px',\n border: '1px solid #e2e8f0',\n textAlign: 'left',\n ...styles,\n ...(Tag === 'th'\n ? {\n fontWeight: styles.fontWeight || '600',\n backgroundColor: styles.backgroundColor || '#f8fafc',\n }\n : {}),\n };\n\n if (hasChildren) {\n return (\n <Tag\n id={domId}\n colSpan={colSpan}\n rowSpan={rowSpan}\n style={cellStyles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {text ? (\n isEditable ? (\n <EditableText\n as=\"span\"\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n />\n ) : (\n <span>{text}</span>\n )\n ) : null}\n {childrenElements}\n </Tag>\n );\n }\n\n return (\n <EditableText\n as={Tag}\n id={domId}\n colSpan={colSpan}\n rowSpan={rowSpan}\n style={cellStyles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'image': {\n const rawSrc = typeof resolvedProps.src === 'string' && resolvedProps.src.length > 0 ? resolvedProps.src : undefined;\n const directSrc = rawSrc ?? undefined;\n const asset = isAssetReference(props.asset) ? props.asset : undefined;\n const resolvedSrc =\n !directSrc && asset && context?.assetProvider\n ? resolveAssetSync(context.assetProvider, asset.assetId)\n : undefined;\n const fallbackSrc = asset?.fallbackUrl;\n const rawUrl = directSrc || resolvedSrc || fallbackSrc;\n // blob: allowed for media — runtime-only in-memory uploads (STORA-250).\n const safeSrc = rawUrl ? sanitizeUrl(rawUrl, '', { allowBlobMedia: true }) : undefined;\n const alt = typeof resolvedProps.alt === 'string' ? resolvedProps.alt : '';\n const loading = resolvedProps.loading === 'eager' ? 'eager' : 'lazy';\n\n return (\n <img\n id={domId}\n src={safeSrc || undefined}\n alt={alt}\n role={alt.length === 0 ? 'presentation' : undefined}\n loading={loading}\n width={resolvedProps.width as number}\n height={resolvedProps.height as number}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n />\n );\n }\n case 'video': {\n const rawSrc = typeof resolvedProps.src === 'string' ? resolvedProps.src : typeof props.src === 'string' ? props.src : '';\n const provider = typeof resolvedProps.provider === 'string' ? resolvedProps.provider : typeof props.provider === 'string' ? props.provider : 'auto';\n const rawPoster = typeof resolvedProps.poster === 'string' ? resolvedProps.poster : typeof props.poster === 'string' ? props.poster : undefined;\n const poster = rawPoster ? sanitizeUrl(rawPoster) : undefined;\n const controls = resolvedProps.controls !== false && props.controls !== false;\n const autoplay = resolvedProps.autoplay === true || props.autoplay === true;\n const loop = resolvedProps.loop === true || props.loop === true;\n const muted = resolvedProps.muted === true || props.muted === true;\n const aspectRatio = aspectRatioToCss(resolvedProps.aspectRatio ?? props.aspectRatio ?? '16:9');\n\n const ytId = provider === 'youtube' ? (getYouTubeId(rawSrc) || rawSrc) : (provider === 'auto' ? getYouTubeId(rawSrc) : null);\n const vimeoId = provider === 'vimeo' ? (getVimeoId(rawSrc) || rawSrc) : (provider === 'auto' ? getVimeoId(rawSrc) : null);\n\n const videoStyles: React.CSSProperties = {\n width: '100%',\n maxWidth: '100%',\n display: 'block',\n ...(aspectRatio ? { aspectRatio } : {}),\n ...styles,\n };\n\n if (ytId) {\n const autoplayParam = autoplay ? '1' : '0';\n const loopParam = loop ? `1&playlist=${ytId}` : '0';\n const muteParam = muted ? '1' : '0';\n const controlsParam = controls ? '1' : '0';\n const embedUrl = `https://www.youtube.com/embed/${ytId}?autoplay=${autoplayParam}&loop=${loopParam}&mute=${muteParam}&controls=${controlsParam}`;\n\n return (\n <div\n id={domId}\n style={{ ...videoStyles, position: 'relative', overflow: 'hidden' }}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-video-provider=\"youtube\"\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n <iframe\n src={embedUrl}\n title=\"YouTube video\"\n style={{ width: '100%', height: '100%', border: 'none', minHeight: '240px' }}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowFullScreen\n />\n </div>\n );\n }\n\n if (vimeoId) {\n const autoplayParam = autoplay ? '1' : '0';\n const loopParam = loop ? '1' : '0';\n const muteParam = muted ? '1' : '0';\n const embedUrl = `https://player.vimeo.com/video/${vimeoId}?autoplay=${autoplayParam}&loop=${loopParam}&muted=${muteParam}`;\n\n return (\n <div\n id={domId}\n style={{ ...videoStyles, position: 'relative', overflow: 'hidden' }}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-video-provider=\"vimeo\"\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n <iframe\n src={embedUrl}\n title=\"Vimeo video\"\n style={{ width: '100%', height: '100%', border: 'none', minHeight: '240px' }}\n allow=\"autoplay; fullscreen; picture-in-picture\"\n allowFullScreen\n />\n </div>\n );\n }\n\n const safeSrc = sanitizeUrl(rawSrc, '', { allowBlobMedia: true });\n\n return (\n <video\n id={domId}\n src={safeSrc || undefined}\n poster={poster || undefined}\n controls={controls}\n autoPlay={autoplay}\n loop={loop}\n muted={muted}\n style={videoStyles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-video-provider=\"html5\"\n playsInline\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'icon': {\n const name = typeof resolvedProps.name === 'string' && resolvedProps.name.trim().length > 0\n ? resolvedProps.name.trim()\n : typeof props.name === 'string' && props.name.trim().length > 0\n ? props.name.trim()\n : 'star';\n const size = typeof resolvedProps.size === 'number' ? resolvedProps.size : typeof props.size === 'number' ? props.size : 24;\n const color = typeof resolvedProps.color === 'string' ? resolvedProps.color : typeof props.color === 'string' ? props.color : 'currentColor';\n const strokeWidth = typeof resolvedProps.strokeWidth === 'number' ? resolvedProps.strokeWidth : typeof props.strokeWidth === 'number' ? props.strokeWidth : 2;\n const pascalName = toPascalCase(name);\n const IconComponent = (lucideIcons as Record<string, React.ComponentType<{ size?: number; color?: string; strokeWidth?: number; className?: string; style?: React.CSSProperties }>>)[pascalName];\n\n return (\n <span\n id={domId}\n style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', color, ...styles }}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-icon-name={name}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : 'img'}\n aria-label={typeof resolvedProps.ariaLabel === 'string' ? resolvedProps.ariaLabel : name}\n >\n {IconComponent ? (\n <IconComponent size={size} color={color} strokeWidth={strokeWidth} />\n ) : (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color} strokeWidth={strokeWidth} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n )}\n </span>\n );\n }\n case 'html-embed': {\n const rawHtml = typeof resolvedProps.html === 'string' ? resolvedProps.html : typeof props.html === 'string' ? props.html : '';\n const sanitized = sanitizeHtml(rawHtml);\n\n if (mode === 'editor' && !rawHtml.trim()) {\n return (\n <div\n id={domId}\n style={{\n padding: '16px',\n border: '2px dashed #94a3b8',\n borderRadius: '8px',\n backgroundColor: '#f8fafc',\n color: '#64748b',\n textAlign: 'center',\n fontSize: '13px',\n fontFamily: 'sans-serif',\n ...styles,\n }}\n onClick={handleClick}\n data-kubuild-node={node.id}\n >\n <span style={{ fontWeight: 600 }}>&lt;/&gt; HTML Embed</span>\n <div style={{ fontSize: '11px', marginTop: '4px' }}>Click to configure HTML code in Inspector Panel</div>\n </div>\n );\n }\n\n return (\n <HtmlEmbedView\n id={domId}\n style={styles}\n onClick={handleClick}\n dataKubuildNode={node.id}\n html={sanitized}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'button': {\n const label = String(resolvedProps.label ?? 'Button');\n const disabled = resolvedProps.disabled === true;\n const rawHref = typeof resolvedProps.href === 'string' ? resolvedProps.href : undefined;\n const href = rawHref ? sanitizeUrl(rawHref, '#') : undefined;\n const rawTarget = typeof resolvedProps.target === 'string' ? resolvedProps.target : undefined;\n const rawRel = typeof resolvedProps.rel === 'string' ? resolvedProps.rel : undefined;\n const rel = rawTarget === '_blank' && !rawRel ? 'noopener noreferrer' : rawRel;\n const action = isActionBinding(props.action) ? props.action : undefined;\n const actionResolved = action ? isActionRegistered(context?.actionRegistry, action.type) : undefined;\n const actionAttrs = action\n ? { 'data-kubuild-action': action.type, 'data-kubuild-action-resolved': actionResolved }\n : {};\n const ariaLabel = typeof resolvedProps.ariaLabel === 'string' ? resolvedProps.ariaLabel : undefined;\n const isEditable = mode === 'editor' && !isVariableBinding(props.label);\n\n const rawButtonType = typeof resolvedProps.buttonType === 'string' ? resolvedProps.buttonType : 'button';\n const buttonType: 'button' | 'submit' | 'reset' =\n rawButtonType === 'submit' || rawButtonType === 'reset' ? rawButtonType : 'button';\n\n if (href && !disabled) {\n if (isEditable) {\n return (\n <EditableText\n as=\"a\"\n id={domId}\n href={mode === 'editor' ? undefined : href}\n target={rawTarget}\n rel={rel}\n style={styles}\n value={label}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'label', val, isBlur)}\n aria-label={ariaLabel}\n tabIndex={0}\n {...actionAttrs}\n />\n );\n }\n return (\n <a\n id={domId}\n href={href}\n target={rawTarget}\n rel={rel}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n aria-label={ariaLabel}\n tabIndex={0}\n {...actionAttrs}\n >\n {label}\n </a>\n );\n }\n\n if (isEditable) {\n return (\n <EditableText\n as=\"button\"\n id={domId}\n type={mode === 'editor' ? 'button' : buttonType}\n disabled={disabled}\n aria-disabled={disabled ? true : undefined}\n aria-label={ariaLabel}\n tabIndex={disabled ? -1 : 0}\n style={styles}\n value={label}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={disabled ? undefined : handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'label', val, isBlur)}\n {...actionAttrs}\n />\n );\n }\n\n return (\n <button\n id={domId}\n type={mode === 'editor' ? 'button' : buttonType}\n disabled={disabled}\n aria-disabled={disabled ? true : undefined}\n aria-label={ariaLabel}\n tabIndex={disabled ? -1 : 0}\n style={styles}\n onClick={disabled ? undefined : handleClick}\n data-kubuild-node={node.id}\n {...actionAttrs}\n >\n {label}\n </button>\n );\n }\n case 'form': {\n const action = typeof resolvedProps.action === 'string' ? resolvedProps.action : undefined;\n const method = typeof resolvedProps.method === 'string' ? resolvedProps.method : 'POST';\n const target = typeof resolvedProps.target === 'string' ? resolvedProps.target : undefined;\n const autoComplete = typeof resolvedProps.autoComplete === 'string' ? resolvedProps.autoComplete : undefined;\n const name = typeof resolvedProps.name === 'string' ? resolvedProps.name : undefined;\n\n const handleSubmit = (e: React.FormEvent) => {\n if (mode === 'editor') {\n e.preventDefault();\n }\n };\n\n return (\n <form\n id={domId}\n name={name}\n action={action && mode !== 'editor' ? sanitizeUrl(action, '') : undefined}\n method={method}\n target={target}\n autoComplete={autoComplete}\n style={styles}\n onClick={handleClick}\n onSubmit={handleSubmit}\n data-kubuild-node={node.id}\n role=\"form\"\n aria-label={name}\n >\n {childrenElements}\n </form>\n );\n }\n case 'input': {\n const name = typeof resolvedProps.name === 'string' ? resolvedProps.name : undefined;\n const inputType = typeof resolvedProps.type === 'string' ? resolvedProps.type : 'text';\n const placeholder = typeof resolvedProps.placeholder === 'string' ? resolvedProps.placeholder : undefined;\n const defaultValue = resolvedProps.defaultValue !== undefined ? String(resolvedProps.defaultValue) : undefined;\n const required = resolvedProps.required === true;\n const disabled = resolvedProps.disabled === true;\n const readOnly = resolvedProps.readOnly === true;\n\n return (\n <input\n id={domId}\n type={inputType}\n name={name}\n placeholder={placeholder}\n defaultValue={defaultValue}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n />\n );\n }\n case 'textarea': {\n const name = typeof resolvedProps.name === 'string' ? resolvedProps.name : undefined;\n const placeholder = typeof resolvedProps.placeholder === 'string' ? resolvedProps.placeholder : undefined;\n const defaultValue = resolvedProps.defaultValue !== undefined ? String(resolvedProps.defaultValue) : undefined;\n const rows = typeof resolvedProps.rows === 'number' ? resolvedProps.rows : 4;\n const required = resolvedProps.required === true;\n const disabled = resolvedProps.disabled === true;\n const readOnly = resolvedProps.readOnly === true;\n\n return (\n <textarea\n id={domId}\n name={name}\n placeholder={placeholder}\n defaultValue={defaultValue}\n rows={rows}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n />\n );\n }\n case 'select': {\n const name = typeof resolvedProps.name === 'string' ? resolvedProps.name : undefined;\n const placeholder = typeof resolvedProps.placeholder === 'string' ? resolvedProps.placeholder : undefined;\n const defaultValue = resolvedProps.defaultValue !== undefined ? String(resolvedProps.defaultValue) : undefined;\n const required = resolvedProps.required === true;\n const disabled = resolvedProps.disabled === true;\n\n let optionsList: Array<{ label: string; value: string }> = [];\n const rawOptions = resolvedProps.options ?? props.options;\n if (Array.isArray(rawOptions)) {\n optionsList = rawOptions.map((opt) => {\n if (typeof opt === 'object' && opt !== null) {\n const record = opt as Record<string, unknown>;\n return {\n label: String(record.label ?? record.value ?? ''),\n value: String(record.value ?? record.label ?? ''),\n };\n }\n return { label: String(opt), value: String(opt) };\n });\n } else if (typeof rawOptions === 'string') {\n try {\n const parsed = JSON.parse(rawOptions);\n if (Array.isArray(parsed)) {\n optionsList = parsed.map((opt) => {\n if (typeof opt === 'object' && opt !== null) {\n const record = opt as Record<string, unknown>;\n return {\n label: String(record.label ?? record.value ?? ''),\n value: String(record.value ?? record.label ?? ''),\n };\n }\n return { label: String(opt), value: String(opt) };\n });\n }\n } catch {\n // Not valid JSON\n }\n }\n\n return (\n <select\n id={domId}\n name={name}\n defaultValue={defaultValue}\n required={required}\n disabled={disabled}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n >\n {placeholder && (\n <option value=\"\" disabled={required}>\n {placeholder}\n </option>\n )}\n {optionsList.map((opt, idx) => (\n <option key={`${opt.value}-${idx}`} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n }\n case 'checkbox': {\n const name = typeof resolvedProps.name === 'string' ? resolvedProps.name : undefined;\n const label = String(resolvedProps.label ?? 'Checkbox');\n const value = resolvedProps.value !== undefined ? String(resolvedProps.value) : 'yes';\n const defaultChecked = resolvedProps.defaultChecked === true;\n const required = resolvedProps.required === true;\n const disabled = resolvedProps.disabled === true;\n const isEditable = mode === 'editor' && !isVariableBinding(props.label);\n\n return (\n <label\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n >\n <input\n type=\"checkbox\"\n name={name}\n value={value}\n defaultChecked={defaultChecked}\n required={required}\n disabled={disabled}\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n />\n {isEditable ? (\n <EditableText\n as=\"span\"\n value={label}\n isEditable={isEditable}\n nodeId={node.id}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'label', val, isBlur)}\n />\n ) : (\n <span>{label}</span>\n )}\n </label>\n );\n }\n case 'radio': {\n const name = typeof resolvedProps.name === 'string' ? resolvedProps.name : undefined;\n const label = String(resolvedProps.label ?? 'Radio');\n const value = resolvedProps.value !== undefined ? String(resolvedProps.value) : 'option';\n const defaultChecked = resolvedProps.defaultChecked === true;\n const required = resolvedProps.required === true;\n const disabled = resolvedProps.disabled === true;\n const isEditable = mode === 'editor' && !isVariableBinding(props.label);\n\n return (\n <label\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n >\n <input\n type=\"radio\"\n name={name}\n value={value}\n defaultChecked={defaultChecked}\n required={required}\n disabled={disabled}\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n />\n {isEditable ? (\n <EditableText\n as=\"span\"\n value={label}\n isEditable={isEditable}\n nodeId={node.id}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'label', val, isBlur)}\n />\n ) : (\n <span>{label}</span>\n )}\n </label>\n );\n }\n case 'collection': {\n const sourceKey = typeof props.sourceKey === 'string' ? props.sourceKey : undefined;\n const itemAlias =\n typeof props.itemAlias === 'string' && props.itemAlias.length > 0 ? props.itemAlias : 'item';\n const indexKey = `${itemAlias}Index`;\n const sourceValue = sourceKey ? resolveBinding({ key: sourceKey }, context).value : undefined;\n\n if (!Array.isArray(sourceValue)) {\n const collectionDiagnostic: Diagnostic = {\n code: 'INVALID_COLLECTION_SOURCE',\n nodeId: node.id,\n propName: 'sourceKey',\n message: `Collection node \"${node.id}\" expected an array at variable path \"${\n sourceKey ?? '(missing sourceKey)'\n }\" but found ${sourceValue === undefined ? 'nothing' : typeof sourceValue}.`,\n };\n onDiagnostic?.(collectionDiagnostic);\n context?.onDiagnostic?.(collectionDiagnostic);\n\n if (mode === 'editor') {\n return (\n <div\n id={domId}\n data-kubuild-node={node.id}\n data-kubuild-collection-invalid={node.type}\n style={{\n ...styles,\n border: '2px dashed #f59e0b',\n backgroundColor: '#fffbeb',\n color: '#92400e',\n padding: '12px',\n borderRadius: '6px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n }}\n onClick={handleClick}\n >\n <div style={{ fontWeight: 600, fontSize: '13px' }}>\n 📦 Collection: expected an array at <code>{sourceKey ?? '(missing sourceKey)'}</code>\n </div>\n </div>\n );\n }\n\n return (\n <div id={domId} data-kubuild-node={node.id} style={styles} onClick={handleClick} aria-hidden=\"true\" />\n );\n }\n\n return (\n <div id={domId} data-kubuild-node={node.id} style={styles} onClick={handleClick}>\n {sourceValue.map((item, index) => {\n const childContext: RenderContext = {\n ...context,\n variables: { ...(context?.variables ?? {}), [itemAlias]: item, [indexKey]: index },\n };\n const itemSuffix = `${instanceSuffix}--${index}`;\n return node.children?.map((child: Node) => (\n <NodeRenderer\n key={`${child.id}${itemSuffix}`}\n node={child}\n document={document}\n registry={registry}\n context={childContext}\n viewport={viewport}\n mode={mode}\n onNodeClick={onNodeClick}\n onDiagnostic={onDiagnostic}\n onActionDispatch={onActionDispatch}\n onNodePropChange={onNodePropChange}\n instanceSuffix={itemSuffix}\n />\n ));\n })}\n </div>\n );\n }\n default:\n // Unknown component handling\n if (mode === 'editor') {\n return (\n <div\n id={domId}\n data-kubuild-node={node.id}\n data-kubuild-unknown={node.type}\n style={{\n ...styles,\n border: '2px dashed #f59e0b',\n backgroundColor: '#fffbeb',\n color: '#92400e',\n padding: '12px',\n borderRadius: '6px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n }}\n onClick={handleClick}\n >\n <div style={{ fontWeight: 600, fontSize: '13px', marginBottom: '4px' }}>\n 🧩 Unknown Component: <code>{node.type}</code>\n </div>\n <div style={{ fontSize: '11px', color: '#b45309', marginBottom: childrenElements ? '8px' : 0 }}>\n Node ID: <code>{node.id}</code>\n </div>\n {childrenElements}\n </div>\n );\n }\n\n // Safe fallback in runtime mode\n return (\n <div\n id={domId}\n data-kubuild-node={node.id}\n data-kubuild-unknown={node.type}\n style={styles}\n onClick={handleClick}\n >\n {childrenElements}\n </div>\n );\n }\n };\n\n let content: React.ReactElement;\n try {\n content = renderNodeContent();\n } catch (error) {\n if (mode === 'editor') {\n content = (\n <div\n data-kubuild-node={node.id}\n data-kubuild-error={node.type}\n style={{\n padding: '12px 16px',\n margin: '4px 0',\n backgroundColor: '#fef2f2',\n border: '1px solid #ef4444',\n borderRadius: '6px',\n color: '#b91c1c',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '13px',\n lineHeight: '1.4',\n }}\n >\n <div style={{ fontWeight: 600, marginBottom: '4px' }}>\n ⚠️ Component Render Error: &lt;{node.type}&gt;\n </div>\n <div style={{ fontSize: '11px', color: '#7f1d1d', wordBreak: 'break-all' }}>\n Node ID: <code>{node.id}</code> — {error instanceof Error ? error.message : String(error)}\n </div>\n </div>\n );\n } else {\n content = (\n <div\n data-kubuild-node={node.id}\n data-kubuild-error={node.type}\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n />\n );\n }\n }\n\n return (\n <ComponentErrorBoundary nodeId={node.id} componentType={node.type} mode={mode}>\n {content}\n </ComponentErrorBoundary>\n );\n}\n\nexport const KubuildRenderer: React.FC<KubuildRendererProps> = ({\n document,\n registry = createDefaultComponentRegistry(),\n context,\n viewport = 'desktop',\n mode = 'runtime',\n className,\n onNodeClick,\n onDiagnostic,\n onActionDispatch,\n onNodePropChange,\n}) => {\n if (!document || !document.document) {\n return <div className={className}>Empty Document</div>;\n }\n\n return (\n <RenderContextProvider value={context}>\n <div className={`kubuild-canvas-root ${className || ''}`}>\n {/* Compiled pseudo-state CSS (:hover/:active/:focus) — STORA-222 */}\n {(() => {\n const css = collectStateStylesCss(document);\n return css ? <style data-kubuild-state-styles>{css}</style> : null;\n })()}\n <NodeRenderer\n node={document.document}\n document={document}\n registry={registry}\n context={context}\n viewport={viewport}\n mode={mode}\n onNodeClick={onNodeClick}\n onDiagnostic={onDiagnostic}\n onActionDispatch={onActionDispatch}\n onNodePropChange={onNodePropChange}\n />\n </div>\n </RenderContextProvider>\n );\n};\n","import React, { createContext, useContext, useMemo } from 'react';\nimport { resolveBinding, type ResolveOutcome } from '@kubuild/core';\nimport type {\n AssetProvider,\n ActionRegistry,\n ActionHandler,\n ActionExecutionContext,\n ActionDiagnostic,\n Diagnostic,\n RenderContext,\n RuntimeContext,\n} from '@kubuild/core';\nimport { isVariableBinding, isActionBinding, ActionBinding, PageDocument } from '@kubuild/schema';\n\nexport type { RenderContext, RuntimeContext, ActionDiagnostic, Diagnostic };\n\n/**\n * Empty default frozen context\n */\nexport const DEFAULT_RENDER_CONTEXT: RenderContext = Object.freeze({});\n\n/**\n * React Context for RenderContext flow\n */\nconst RenderContextReact = createContext<RenderContext>(DEFAULT_RENDER_CONTEXT);\n\n/**\n * Creates an immutable (frozen) RenderContext.\n * Guarantees that components cannot mutate the runtime context during rendering.\n */\nexport function createRenderContext(options?: {\n variables?: Record<string, unknown>;\n assetProvider?: AssetProvider;\n actionRegistry?: ActionRegistry;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n}): RenderContext {\n if (!options) {\n return DEFAULT_RENDER_CONTEXT;\n }\n\n const frozenVariables = options.variables ? Object.freeze({ ...options.variables }) : undefined;\n\n return Object.freeze({\n variables: frozenVariables,\n ...(options.assetProvider ? { assetProvider: options.assetProvider } : {}),\n ...(options.actionRegistry ? { actionRegistry: options.actionRegistry } : {}),\n ...(options.onDiagnostic ? { onDiagnostic: options.onDiagnostic } : {}),\n });\n}\n\n/**\n * Minimal offline in-memory context factory.\n * Can be safely injected into unit tests, local mock playgrounds, or SSR without any network calls.\n */\nexport function createMinimalRenderContext(options?: {\n variables?: Record<string, unknown>;\n assets?: Record<string, string>;\n actions?: Record<string, ActionHandler>;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n}): RenderContext {\n const assetsMap = new Map<string, string>(Object.entries(options?.assets ?? {}));\n const actionsMap = new Map<string, ActionHandler>(Object.entries(options?.actions ?? {}));\n\n const assetProvider: AssetProvider = {\n resolve: (assetIdOrUri: string) => {\n return assetsMap.get(assetIdOrUri) || assetIdOrUri;\n },\n };\n\n const actionRegistry: ActionRegistry = {\n get: (type: string) => actionsMap.get(type),\n register: (type: string, handler: ActionHandler) => {\n actionsMap.set(type, handler);\n },\n unregister: (type: string) => {\n actionsMap.delete(type);\n },\n };\n\n return createRenderContext({\n variables: options?.variables,\n assetProvider,\n actionRegistry,\n onDiagnostic: options?.onDiagnostic,\n });\n}\n\n/**\n * Provider component to make RenderContext available anywhere in the component tree\n */\nexport interface RenderContextProviderProps {\n value?: RenderContext;\n children: React.ReactNode;\n}\n\nexport const RenderContextProvider: React.FC<RenderContextProviderProps> = ({ value, children }) => {\n const contextValue = useMemo(() => value || DEFAULT_RENDER_CONTEXT, [value]);\n\n return <RenderContextReact.Provider value={contextValue}>{children}</RenderContextReact.Provider>;\n};\n\n/**\n * Hook to access the current RenderContext\n */\nexport function useRenderContext(): RenderContext {\n return useContext(RenderContextReact);\n}\n\n/**\n * Asset resolution helper.\n * Computes asset URLs synchronously for React render cycles.\n */\nexport function resolveAssetSync(assetProvider?: AssetProvider, assetIdOrUri?: string): string | undefined {\n if (!assetProvider || !assetIdOrUri) {\n return undefined;\n }\n try {\n const result = assetProvider.resolve(assetIdOrUri);\n return typeof result === 'string' ? result : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Variable resolution helper.\n * Resolves VariableBinding objects and template strings like \"{{ title }}\" using context variables.\n */\nexport function resolveVariable(context?: RenderContext, value?: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n\n // Handle VariableBinding object: { type: 'variable', key: '...', fallback: '...' }\n if (isVariableBinding(value)) {\n return resolveBinding(value, context).value;\n }\n\n // Handle string interpolation: \"Hello {{ site.name }}\" — resolves nested paths\n // the same way VariableBinding does, so both binding styles stay consistent.\n if (typeof value === 'string' && value.includes('{{')) {\n return value.replace(/\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g, (match, key) => {\n const outcome = resolveBinding({ key }, context);\n if (outcome.status === 'resolved') {\n return String(outcome.value);\n }\n return match;\n });\n }\n\n return value;\n}\n\n/**\n * Result of resolving an action payload: the resolved (serializable) value, plus any\n * binding paths that failed to resolve (missing key, no author-declared fallback).\n * `invalidPaths` is what lets dispatchAction refuse to run a handler with an\n * unexpected/garbage value instead of silently passing through an empty string.\n */\nexport interface ActionPayloadResolution {\n value: Record<string, unknown> | undefined;\n invalidPaths: string[];\n}\n\n/**\n * Recursively resolves variables within an action payload without mutating the input object.\n * Tracks dotted field paths (e.g. \"item.id\") whose binding resolved to the \"empty\" outcome —\n * i.e. an invalid/missing path with no fallback declared — as opposed to `fallback`, which is\n * an author-declared safe default and never treated as invalid.\n */\nexport function resolveActionPayloadDetailed(\n context: RenderContext | undefined,\n payload: Record<string, unknown> | undefined,\n): ActionPayloadResolution {\n if (!payload || typeof payload !== 'object') {\n return { value: payload, invalidPaths: [] };\n }\n\n const invalidPaths: string[] = [];\n\n const resolveValueRecursively = (val: unknown, path: string): unknown => {\n if (val === null || val === undefined) {\n return val;\n }\n if (isVariableBinding(val)) {\n const outcome: ResolveOutcome = resolveBinding(val, context);\n if (outcome.status === 'empty') {\n invalidPaths.push(path);\n }\n return outcome.value;\n }\n if (typeof val === 'string') {\n if (val.includes('{{')) {\n return val.replace(/\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g, (match, key) => {\n const outcome = resolveBinding({ key }, context);\n if (outcome.status !== 'resolved') {\n invalidPaths.push(path);\n return match;\n }\n return String(outcome.value);\n });\n }\n return val;\n }\n if (Array.isArray(val)) {\n return val.map((item, index) => resolveValueRecursively(item, `${path}[${index}]`));\n }\n if (typeof val === 'object') {\n const copy: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(val as Record<string, unknown>)) {\n copy[k] = resolveValueRecursively(v, path ? `${path}.${k}` : k);\n }\n return copy;\n }\n return val;\n };\n\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(payload)) {\n resolved[key] = resolveValueRecursively(value, key);\n }\n\n return { value: resolved, invalidPaths };\n}\n\n/**\n * Recursively resolves variables within an action payload without mutating the input object.\n * Back-compat convenience wrapper over resolveActionPayloadDetailed for callers that only\n * need the resolved value (e.g. previewing a payload) and not invalid-path enforcement.\n */\nexport function resolveActionPayload(\n context?: RenderContext,\n payload?: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n return resolveActionPayloadDetailed(context, payload).value;\n}\n\n/**\n * Action resolution helper.\n * Checks whether an action type is registered with the current action registry.\n */\nexport function isActionRegistered(actionRegistry?: ActionRegistry, actionType?: string): boolean {\n if (!actionRegistry || !actionType) {\n return false;\n }\n return Boolean(actionRegistry.get(actionType));\n}\n\n/**\n * Safe action dispatch options\n */\nexport interface DispatchActionOptions {\n action: ActionBinding | unknown;\n nodeId?: string;\n document: PageDocument;\n context?: RenderContext;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n [key: string]: unknown;\n}\n\n/**\n * Dispatches an action safely from the renderer to registered host handlers.\n * Guarantees that:\n * 1. Payload variables are resolved safely.\n * 2. Unregistered / unknown actions are not executed and trigger diagnostics.\n * 3. No arbitrary JS code (eval, Function, script injection) from document/props is ever executed.\n */\nexport function dispatchAction(options: DispatchActionOptions): boolean {\n const { action, nodeId, document, context, onDiagnostic } = options;\n\n if (!isActionBinding(action)) {\n const diagnostic: ActionDiagnostic = {\n code: 'INVALID_ACTION_PAYLOAD',\n actionType:\n typeof (action as { type?: unknown })?.type === 'string'\n ? (action as { type: string }).type\n : 'unknown',\n nodeId,\n message: `Invalid action binding on node ${nodeId || 'unknown'}.`,\n };\n onDiagnostic?.(diagnostic);\n context?.onDiagnostic?.(diagnostic);\n return false;\n }\n\n const handler = context?.actionRegistry?.get(action.type);\n\n if (!handler) {\n const diagnostic: ActionDiagnostic = {\n code: 'UNKNOWN_ACTION',\n actionType: action.type,\n nodeId,\n message: `No action handler registered for action type \"${action.type}\".`,\n };\n onDiagnostic?.(diagnostic);\n context?.onDiagnostic?.(diagnostic);\n return false;\n }\n\n const { value: resolvedPayload, invalidPaths } = resolveActionPayloadDetailed(context, action.payload);\n\n if (invalidPaths.length > 0) {\n const diagnostic: ActionDiagnostic = {\n code: 'INVALID_ACTION_BINDING',\n actionType: action.type,\n nodeId,\n message: `Action \"${action.type}\" payload has unresolved binding path(s) [${invalidPaths.join(\n ', ',\n )}] on node ${nodeId || 'unknown'}; handler was not invoked.`,\n invalidPaths,\n };\n onDiagnostic?.(diagnostic);\n context?.onDiagnostic?.(diagnostic);\n return false;\n }\n\n const executionContext: ActionExecutionContext = {\n nodeId,\n document,\n variables: context?.variables,\n };\n\n try {\n const result = handler(resolvedPayload, executionContext);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n (result as Promise<void>).catch((error) => {\n const diagnostic: ActionDiagnostic = {\n code: 'ACTION_EXECUTION_ERROR',\n actionType: action.type,\n nodeId,\n message: `Action \"${action.type}\" handler threw an asynchronous error: ${\n error instanceof Error ? error.message : String(error)\n }`,\n error,\n };\n onDiagnostic?.(diagnostic);\n context?.onDiagnostic?.(diagnostic);\n });\n }\n return true;\n } catch (error) {\n const diagnostic: ActionDiagnostic = {\n code: 'ACTION_EXECUTION_ERROR',\n actionType: action.type,\n nodeId,\n message: `Action \"${action.type}\" handler threw a synchronous error: ${\n error instanceof Error ? error.message : String(error)\n }`,\n error,\n };\n onDiagnostic?.(diagnostic);\n context?.onDiagnostic?.(diagnostic);\n return false;\n }\n}\n","import { PageDocument, Node, ResponsiveStyles } from '@kubuild/schema';\nimport React from 'react';\n\nexport function resolveNodeStyles(\n styles?: ResponsiveStyles,\n viewport: 'desktop' | 'tablet' | 'mobile' = 'desktop',\n): React.CSSProperties {\n if (!styles) return {};\n const base = (styles.base as React.CSSProperties) || {};\n const override = (styles[viewport] as React.CSSProperties) || {};\n return { ...base, ...override };\n}\n\n/**\n * Escape a string for safe interpolation into a CSS declaration value.\n * Strips characters that could break out of the declaration context.\n */\nfunction escapeCssValue(value: unknown): string {\n return String(value).replace(/[{};]+/g, '');\n}\n\n/**\n * Escape a node id for safe interpolation into an attribute selector.\n */\nfunction escapeCssIdent(value: string): string {\n return value.replace(/[\"\\\\\\]]/g, '\\\\$&');\n}\n\n/**\n * Serialize a style definition object into CSS declarations.\n * camelCase keys are converted to kebab-case CSS properties.\n */\nexport function styleDefinitionToCssDeclarations(\n styleDefinition: Record<string, unknown> | undefined,\n): string {\n if (!styleDefinition || typeof styleDefinition !== 'object') return '';\n const declarations: string[] = [];\n for (const [key, value] of Object.entries(styleDefinition)) {\n if (value === null || value === undefined || value === '') continue;\n const property = key.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n declarations.push(`${property}: ${escapeCssValue(value)};`);\n }\n return declarations.join(' ');\n}\n\n/**\n * Walk the document tree and produce scoped CSS rules for pseudo-state\n * style layers (STORA-222). Each node with `styles.states` gets rules like:\n *\n * [data-kubuild-node=\"node-1\"]:hover { background-color: #1d4ed8; }\n *\n * Scoped via the canonical `data-kubuild-node` attribute so styles never leak\n * between nodes and work identically in editor canvas and runtime preview.\n */\nexport function collectStateStylesCss(document: PageDocument | undefined | null): string {\n if (!document?.document) return '';\n const rules: string[] = [];\n\n const walk = (node: Node): void => {\n const states = node.styles?.states;\n if (states && typeof states === 'object') {\n for (const [state, styleDefinition] of Object.entries(states)) {\n const declarations = styleDefinitionToCssDeclarations(\n styleDefinition as Record<string, unknown>,\n );\n if (!declarations) continue;\n // Only accept pseudo-class-looking selectors to avoid selector injection.\n const safeState = /^::?[a-zA-Z-]+$/.test(state) ? state : null;\n if (!safeState) continue;\n rules.push(`[data-kubuild-node=\"${escapeCssIdent(node.id)}\"]${safeState} { ${declarations} }`);\n }\n }\n node.children?.forEach(walk);\n };\n\n walk(document.document);\n return rules.join('\\n');\n}\n\n/**\n * Modern baseline CSS Reset for consistent rendering across viewports and browsers.\n */\nexport const DEFAULT_CSS_RESET = `\n*, *::before, *::after {\n box-sizing: border-box;\n}\n\n* {\n margin: 0;\n}\n\nbody {\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n}\n\nimg, picture, video, canvas, svg {\n display: block;\n max-width: 100%;\n}\n\ninput, button, textarea, select {\n font: inherit;\n}\n\np, h1, h2, h3, h4, h5, h6 {\n overflow-wrap: break-word;\n}\n`.trim();\n","import React, { Component, ErrorInfo, ReactNode } from 'react';\n\nexport interface ComponentErrorBoundaryProps {\n nodeId: string;\n componentType: string;\n mode?: 'editor' | 'runtime';\n children: ReactNode;\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface ComponentErrorBoundaryState {\n hasError: boolean;\n error?: Error;\n}\n\nexport class ComponentErrorBoundary extends Component<\n ComponentErrorBoundaryProps,\n ComponentErrorBoundaryState\n> {\n constructor(props: ComponentErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): ComponentErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n if (this.props.onError) {\n this.props.onError(error, errorInfo);\n }\n }\n\n render(): ReactNode {\n if (this.state.hasError) {\n const { nodeId, componentType, mode = 'runtime' } = this.props;\n const errorMessage = this.state.error?.message || 'Unknown render error';\n\n if (mode === 'editor') {\n return (\n <div\n data-kubuild-node={nodeId}\n data-kubuild-error={componentType}\n style={{\n padding: '12px 16px',\n margin: '4px 0',\n backgroundColor: '#fef2f2',\n border: '1px solid #ef4444',\n borderRadius: '6px',\n color: '#b91c1c',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '13px',\n lineHeight: '1.4',\n }}\n >\n <div style={{ fontWeight: 600, marginBottom: '4px' }}>\n ⚠️ Component Render Error: &lt;{componentType}&gt;\n </div>\n <div style={{ fontSize: '11px', color: '#7f1d1d', wordBreak: 'break-all' }}>\n Node ID: <code>{nodeId}</code> — {errorMessage}\n </div>\n </div>\n );\n }\n\n // In runtime mode: render a safe invisible or minimal placeholder to avoid page crash\n return (\n <div\n data-kubuild-node={nodeId}\n data-kubuild-error={componentType}\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n />\n );\n }\n\n return this.props.children;\n }\n}\n","import { Node, isVariableBinding } from '@kubuild/schema';\nimport { ComponentDefinition, ComponentFieldDefinition, primitiveTypeForField } from '@kubuild/components';\nimport { resolveBinding, Diagnostic, RenderContext } from '@kubuild/core';\nimport { resolveVariable } from './render-context';\n\nexport interface ResolvedNodeProps {\n props: Record<string, unknown>;\n diagnostics: Diagnostic[];\n}\n\nfunction emptyValueFor(primitiveType: 'string' | 'number' | 'boolean'): unknown {\n switch (primitiveType) {\n case 'string':\n return '';\n case 'number':\n return 0;\n case 'boolean':\n return false;\n }\n}\n\nfunction resolveBindableField(\n node: Node,\n field: ComponentFieldDefinition,\n definition: ComponentDefinition,\n context: RenderContext | undefined,\n diagnostics: Diagnostic[],\n): unknown {\n const rawValue = node.props?.[field.name];\n const expectedType = primitiveTypeForField(field);\n if (expectedType === undefined || rawValue === undefined) {\n return rawValue;\n }\n\n const fallbackValue = definition.defaultProps?.[field.name] ?? field.defaultValue ?? emptyValueFor(expectedType);\n\n if (isVariableBinding(rawValue)) {\n const outcome = resolveBinding(rawValue, context);\n if (typeof outcome.value === expectedType) {\n return outcome.value;\n }\n diagnostics.push({\n code: 'INCOMPATIBLE_BINDING_TYPE',\n nodeId: node.id,\n propName: field.name,\n expectedType,\n actualType: typeof outcome.value,\n message: `Prop \"${field.name}\" on node \"${node.id}\" expected a ${expectedType} but resolved binding \"${rawValue.key}\" produced a ${typeof outcome.value}.`,\n });\n return fallbackValue;\n }\n\n if (expectedType === 'string' && typeof rawValue === 'string' && rawValue.includes('{{')) {\n return resolveVariable(context, rawValue);\n }\n\n return rawValue;\n}\n\n/**\n * Resolves every binding-compatible prop on a node up front, before the component\n * receives its render props — centralizes what was previously ad hoc per-field\n * `resolveVariable` calls scattered across the renderer switch. Non-bindable\n * fields (select/image/action/json) and fields absent from `propFields` pass\n * through unchanged; validating their static shape remains `validateProps`' job.\n */\nexport function resolvePropsForNode(\n node: Node,\n definition: ComponentDefinition | undefined,\n context: RenderContext | undefined,\n): ResolvedNodeProps {\n const rawProps = node.props || {};\n if (!definition || !definition.propFields || definition.propFields.length === 0) {\n return { props: rawProps, diagnostics: [] };\n }\n\n const diagnostics: Diagnostic[] = [];\n const resolved: Record<string, unknown> = { ...rawProps };\n\n for (const field of definition.propFields) {\n if (primitiveTypeForField(field) === undefined) {\n continue;\n }\n resolved[field.name] = resolveBindableField(node, field, definition, context, diagnostics);\n }\n\n return { props: resolved, diagnostics };\n}\n","import React, { useMemo } from 'react';\nimport { PageDocument } from '@kubuild/schema';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { RenderContext, Diagnostic } from './render-context';\nimport { KubuildRenderer } from './renderer';\n\n/**\n * Standard supported viewport devices\n */\nexport type ViewportDevice = 'desktop' | 'tablet' | 'mobile';\n\n/**\n * Configuration options for a specific viewport device\n */\nexport interface ViewportConfig {\n /** Width in pixels or CSS dimension (e.g. 768, '768px', '100%') */\n width: number | string;\n /** Optional fixed or min height (e.g. 1024, '1024px', '100%') */\n height?: number | string;\n /** Optional minimum width */\n minWidth?: number | string;\n /** Optional maximum width */\n maxWidth?: number | string;\n /** Optional minimum height */\n minHeight?: number | string;\n /** Optional maximum height */\n maxHeight?: number | string;\n /** User-facing label for the viewport */\n label?: string;\n /** Custom CSS aspect ratio (e.g. '16/9', '9/16') */\n aspectRatio?: string;\n /** Scale factor applied to the preview canvas (e.g. 0.8, 1) */\n scale?: number;\n /** Whether the viewport width stretches fluidly up to maxWidth */\n isFluid?: boolean;\n}\n\n/**\n * Configurable host breakpoints for responsive viewport resolution\n */\nexport interface ViewportBreakpoints {\n /** Maximum screen width considered mobile (default: 480) */\n mobile: number;\n /** Maximum screen width considered tablet (default: 768) */\n tablet: number;\n /** Screen width threshold considered desktop (default: 1024) */\n desktop: number;\n}\n\n/**\n * Default viewport device configurations\n */\nexport const DEFAULT_VIEWPORT_CONFIGS: Record<ViewportDevice, ViewportConfig> = Object.freeze({\n desktop: {\n width: '100%',\n maxWidth: '1280px',\n minHeight: '600px',\n label: 'Desktop (1280px)',\n isFluid: true,\n },\n tablet: {\n width: '768px',\n height: '1024px',\n minHeight: '600px',\n label: 'Tablet (768 × 1024)',\n isFluid: false,\n },\n mobile: {\n width: '375px',\n height: '667px',\n minHeight: '500px',\n label: 'Mobile (375 × 667)',\n isFluid: false,\n },\n});\n\n/**\n * Default breakpoint thresholds\n */\nexport const DEFAULT_BREAKPOINTS: ViewportBreakpoints = Object.freeze({\n mobile: 480,\n tablet: 768,\n desktop: 1024,\n});\n\n/**\n * Resolves active viewport device category from a numeric pixel width using host-configurable breakpoints\n */\nexport function resolveViewportFromWidth(\n width: number,\n breakpoints?: Partial<ViewportBreakpoints>,\n): ViewportDevice {\n const resolved = { ...DEFAULT_BREAKPOINTS, ...breakpoints };\n if (width <= resolved.mobile) {\n return 'mobile';\n }\n if (width <= resolved.tablet) {\n return 'tablet';\n }\n return 'desktop';\n}\n\n/**\n * Resolves combined viewport configuration merging defaults with host customizations\n */\nexport function resolveViewportDimensions(\n viewport: ViewportDevice,\n customConfigs?: Partial<Record<ViewportDevice, ViewportConfig>>,\n): ViewportConfig {\n const baseConfig = DEFAULT_VIEWPORT_CONFIGS[viewport] || DEFAULT_VIEWPORT_CONFIGS.desktop;\n const custom = customConfigs?.[viewport];\n return { ...baseConfig, ...custom };\n}\n\n/**\n * Resolves CSS properties for the preview canvas wrapper\n */\nexport function resolveViewportContainerStyle(\n viewport: ViewportDevice,\n customConfigs?: Partial<Record<ViewportDevice, ViewportConfig>>,\n customScale?: number,\n): React.CSSProperties {\n const config = resolveViewportDimensions(viewport, customConfigs);\n const scale = customScale ?? config.scale ?? 1;\n\n const toCssVal = (v?: number | string) => (typeof v === 'number' ? `${v}px` : v);\n\n const style: React.CSSProperties = {\n width: toCssVal(config.width),\n maxWidth: toCssVal(config.maxWidth),\n minWidth: toCssVal(config.minWidth),\n height: toCssVal(config.height),\n minHeight: toCssVal(config.minHeight),\n maxHeight: toCssVal(config.maxHeight),\n aspectRatio: config.aspectRatio,\n transition: 'width 0.2s ease, max-width 0.2s ease, height 0.2s ease',\n };\n\n if (scale !== 1) {\n style.transform = `scale(${scale})`;\n style.transformOrigin = 'top center';\n }\n\n return style;\n}\n\n/**\n * Props for PreviewViewportAdapter\n */\nexport interface PreviewViewportAdapterProps {\n /** The portable Page Document to render (remains immutable) */\n document: PageDocument;\n /** Active viewport device mode */\n viewport?: ViewportDevice;\n /** Callback fired when viewport is changed via built-in chrome controls */\n onViewportChange?: (viewport: ViewportDevice) => void;\n /** Host-configurable dimensions & overrides per viewport device */\n viewportConfigs?: Partial<Record<ViewportDevice, ViewportConfig>>;\n /** Host-configurable breakpoint boundaries */\n breakpoints?: Partial<ViewportBreakpoints>;\n /** Component registry providing renderers & schemas */\n registry?: ComponentRegistry;\n /** Immutable runtime context for variable, asset, & action resolution */\n context?: RenderContext;\n /** Rendering mode: 'runtime' or 'editor' */\n mode?: 'editor' | 'runtime';\n /** Whether to render device frame / chrome toolbar */\n showChrome?: boolean;\n /** Optional custom title displayed on device chrome */\n chromeTitle?: string;\n /** Non-destructive editor overlay slot (selection, bounds, grid, etc.) */\n editorOverlay?: React.ReactNode;\n /** Custom zoom/scale factor */\n scale?: number;\n /** Outer container CSS class */\n className?: string;\n /** Outer container inline styles */\n style?: React.CSSProperties;\n /** Inner canvas container CSS class */\n canvasClassName?: string;\n /** Inner canvas container inline styles */\n canvasStyle?: React.CSSProperties;\n /** Optional click handler for canvas nodes */\n onNodeClick?: (nodeId: string, event: React.MouseEvent) => void;\n /** Optional diagnostic handler for action or render issues */\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n /** Optional action dispatch handler */\n onActionDispatch?: (actionType: string, payload: Record<string, unknown> | undefined, nodeId: string) => void;\n}\n\n/**\n * Preview Viewport Adapter Component\n * \n * Provides an isolated, host-configurable desktop/tablet/mobile preview container that uses\n * the exact same KubuildRenderer and RenderContext as production runtime, differing only in\n * viewport dimensions and optional device chrome/editor overlays.\n */\nexport const PreviewViewportAdapter: React.FC<PreviewViewportAdapterProps> = ({\n document,\n viewport = 'desktop',\n onViewportChange,\n viewportConfigs,\n breakpoints,\n registry,\n context,\n mode = 'runtime',\n showChrome = false,\n chromeTitle,\n editorOverlay,\n scale,\n className,\n style,\n canvasClassName,\n canvasStyle,\n onNodeClick,\n onDiagnostic,\n onActionDispatch,\n}) => {\n const currentConfig = useMemo(\n () => resolveViewportDimensions(viewport, viewportConfigs),\n [viewport, viewportConfigs],\n );\n\n const containerStyle = useMemo(\n () => resolveViewportContainerStyle(viewport, viewportConfigs, scale),\n [viewport, viewportConfigs, scale],\n );\n\n const mergedCanvasStyle: React.CSSProperties = useMemo(\n () => ({\n ...containerStyle,\n ...canvasStyle,\n position: 'relative',\n boxSizing: 'border-box',\n }),\n [containerStyle, canvasStyle],\n );\n\n return (\n <div\n data-kubuild-preview-container\n data-viewport={viewport}\n className={`kubuild-preview-viewport-adapter ${className || ''}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'flex-start',\n width: '100%',\n height: '100%',\n boxSizing: 'border-box',\n ...style,\n }}\n >\n {/* Optional Device Chrome Header */}\n {showChrome && (\n <div\n data-kubuild-preview-chrome\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n maxWidth: containerStyle.maxWidth || containerStyle.width,\n padding: '8px 12px',\n marginBottom: '8px',\n backgroundColor: '#1e293b',\n color: '#f8fafc',\n borderRadius: '8px',\n fontSize: '12px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n boxSizing: 'border-box',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span style={{ fontWeight: 600 }}>\n {chromeTitle || document.metadata?.title || 'Preview'}\n </span>\n <span\n data-testid=\"viewport-badge\"\n style={{\n fontSize: '10px',\n padding: '2px 6px',\n borderRadius: '4px',\n backgroundColor: '#334155',\n color: '#94a3b8',\n textTransform: 'uppercase',\n fontWeight: 700,\n }}\n >\n {viewport}\n </span>\n <span style={{ fontSize: '11px', color: '#64748b' }}>\n {currentConfig.label || `${currentConfig.width} × ${currentConfig.height || 'auto'}`}\n </span>\n </div>\n\n {onViewportChange && (\n <div\n data-testid=\"viewport-switcher\"\n style={{ display: 'flex', gap: '4px', backgroundColor: '#0f172a', padding: '2px', borderRadius: '6px' }}\n >\n {(['desktop', 'tablet', 'mobile'] as ViewportDevice[]).map((device) => {\n const isActive = viewport === device;\n return (\n <button\n key={device}\n type=\"button\"\n data-testid={`viewport-btn-${device}`}\n onClick={() => onViewportChange(device)}\n style={{\n padding: '4px 10px',\n fontSize: '11px',\n fontWeight: 500,\n borderRadius: '4px',\n border: 'none',\n cursor: 'pointer',\n textTransform: 'capitalize',\n backgroundColor: isActive ? '#3b82f6' : 'transparent',\n color: isActive ? '#ffffff' : '#94a3b8',\n transition: 'all 0.15s ease',\n }}\n >\n {device}\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n\n {/* Responsive Canvas Frame */}\n <div\n data-kubuild-preview-canvas\n data-viewport={viewport}\n className={`kubuild-preview-canvas ${canvasClassName || ''}`}\n style={mergedCanvasStyle}\n >\n {/* Core Document Renderer */}\n <KubuildRenderer\n document={document}\n registry={registry}\n context={context}\n viewport={viewport}\n mode={mode}\n onNodeClick={onNodeClick}\n onDiagnostic={onDiagnostic}\n onActionDispatch={onActionDispatch}\n />\n\n {/* Non-destructive Editor Overlay Slot */}\n {editorOverlay && (\n <div\n data-kubuild-preview-overlay\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n zIndex: 10,\n }}\n >\n {editorOverlay}\n </div>\n )}\n </div>\n </div>\n );\n};\n\n/**\n * Alias for PreviewViewportAdapter\n */\nexport const KubuildPreviewViewport = PreviewViewportAdapter;\n"],"mappings":"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","names":["import_react","import_schema","import_components","import_core","import_react","import_jsx_runtime","import_schema","import_core","import_jsx_runtime","content","lucideIcons","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/renderer.tsx","../src/render-context.tsx","../src/styles.ts","../src/animation.ts","../src/error-boundary.tsx","../src/prop-resolution.ts","../src/preview-adapter.tsx","../src/code-generator.ts"],"sourcesContent":["export * from './renderer';\nexport * from './styles';\nexport * from './render-context';\nexport * from './error-boundary';\nexport * from './preview-adapter';\nexport * from './code-generator';\nexport * from './animation';\n\n\n","import React, { useRef, useLayoutEffect, useState, useEffect, useMemo } from 'react';\nimport { PageDocument, Node, isAssetReference, isActionBinding, isVariableBinding } from '@kubuild/schema';\nimport { ComponentRegistry, createDefaultComponentRegistry } from '@kubuild/components';\nimport {\n RenderContext,\n DEFAULT_RENDER_CONTEXT,\n RenderContextProvider,\n resolveAssetSync,\n resolveActionPayload,\n isActionRegistered,\n dispatchAction,\n Diagnostic,\n} from './render-context';\nimport { resolveBinding, sanitizeUrl, sanitizeHtml } from '@kubuild/core';\nimport { icons as lucideIcons, Package, Puzzle, AlertTriangle } from 'lucide-react';\nimport { resolveNodeStyles, collectStateStylesCss } from './styles';\nimport { collectAnimationStylesCss } from './animation';\nimport { ComponentErrorBoundary } from './error-boundary';\nimport { resolvePropsForNode } from './prop-resolution';\n\nfunction toPascalCase(str: string): string {\n if (!str) return '';\n return str\n .replace(/[-_](\\w)/g, (_, c) => c.toUpperCase())\n .replace(/^\\w/, (c) => c.toUpperCase());\n}\n\nfunction getYouTubeId(url: string): string | null {\n if (!url || typeof url !== 'string') return null;\n const match = url.match(\n /(?:youtube\\.com\\/(?:[^\\/]+\\/.+\\/|(?:v|e(?:mbed)?)\\/|.*[?&]v=)|youtu\\.be\\/)([^\"&?\\/\\s]{11})/i,\n );\n return match ? match[1] : null;\n}\n\nfunction getVimeoId(url: string): string | null {\n if (!url || typeof url !== 'string') return null;\n const match = url.match(\n /(?:vimeo\\.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^\\/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|video\\/|))(\\d+)/i,\n );\n return match ? match[3] : null;\n}\n\nfunction aspectRatioToCss(ratio: unknown): string | undefined {\n if (ratio === '16:9') return '16 / 9';\n if (ratio === '4:3') return '4 / 3';\n if (ratio === '1:1') return '1 / 1';\n if (ratio === '9:16') return '9 / 16';\n if (typeof ratio === 'string' && ratio !== 'auto') return ratio.replace(':', ' / ');\n return undefined;\n}\n\nexport interface EditableTextProps {\n as?: string;\n id?: string;\n className?: string;\n style?: React.CSSProperties;\n value: string;\n isEditable: boolean;\n nodeId: string;\n onClick?: (e: React.MouseEvent) => void;\n onChange?: (val: string, isBlur: boolean) => void;\n [key: string]: unknown;\n}\n\nexport const EditableText: React.FC<EditableTextProps> = ({\n as = 'p',\n id,\n className,\n style,\n value,\n isEditable,\n nodeId,\n onClick,\n onChange,\n ...rest\n}) => {\n const isEditingRef = useRef(false);\n\n const Tag = as as any;\n\n if (!isEditable) {\n return (\n <Tag\n id={id}\n className={className}\n style={style}\n onClick={onClick}\n data-kubuild-node={nodeId}\n {...rest}\n >\n {value}\n </Tag>\n );\n }\n\n return (\n <Tag\n id={id}\n className={className}\n style={{\n ...style,\n outline: 'none',\n cursor: 'text',\n }}\n contentEditable={true}\n suppressContentEditableWarning={true}\n data-kubuild-node={nodeId}\n onClick={(e: React.MouseEvent) => {\n onClick?.(e);\n }}\n onFocus={() => {\n isEditingRef.current = true;\n }}\n onInput={(e: React.FormEvent<HTMLElement>) => {\n const text = e.currentTarget.textContent ?? '';\n onChange?.(text, false);\n }}\n onBlur={(e: React.FocusEvent<HTMLElement>) => {\n isEditingRef.current = false;\n const text = e.currentTarget.textContent ?? '';\n onChange?.(text, true);\n }}\n onKeyDown={(e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n (e.currentTarget as HTMLElement).blur();\n }\n }}\n {...rest}\n >\n {value}\n </Tag>\n );\n};\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport function transformEmbedHtml(rawHtml: string): string {\n if (!rawHtml) return '';\n\n return rawHtml.replace(/<style\\b([^>]*)>([\\s\\S]*?)<\\/style>/gi, (_match, attrs, cssContent) => {\n let transformedCss = cssContent;\n // Replace \"body {\" or \"body,\" with \":host, body {\"\n transformedCss = transformedCss.replace(/(^|[\\s,{}])body(?=[\\s,{])/g, '$1:host, body');\n // Replace \"html {\" or \"html,\" with \":host, html {\"\n transformedCss = transformedCss.replace(/(^|[\\s,{}])html(?=[\\s,{])/g, '$1:host, html');\n\n return `<style${attrs}>\\n:host { display: block; }\\n${transformedCss}</style>`;\n });\n}\n\nexport interface HtmlEmbedViewProps {\n id?: string;\n style?: React.CSSProperties;\n onClick?: (e: React.MouseEvent) => void;\n dataKubuildNode?: string;\n html: string;\n role?: string;\n}\n\nexport const HtmlEmbedView: React.FC<HtmlEmbedViewProps> = ({\n id,\n style,\n onClick,\n dataKubuildNode,\n html,\n role,\n}) => {\n const hostRef = useRef<HTMLDivElement>(null);\n const shadowRootRef = useRef<ShadowRoot | null>(null);\n\n const scopedHtml = useMemo(() => transformEmbedHtml(html), [html]);\n\n useIsomorphicLayoutEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n if (typeof host.attachShadow === 'function') {\n if (!shadowRootRef.current) {\n if (host.shadowRoot) {\n shadowRootRef.current = host.shadowRoot;\n } else {\n try {\n shadowRootRef.current = host.attachShadow({ mode: 'open' });\n } catch {\n shadowRootRef.current = host.shadowRoot;\n }\n }\n }\n\n if (shadowRootRef.current) {\n shadowRootRef.current.innerHTML = scopedHtml;\n return;\n }\n }\n\n host.innerHTML = scopedHtml;\n }, [scopedHtml]);\n\n return (\n <div\n ref={hostRef}\n id={id}\n style={style}\n onClick={onClick}\n data-kubuild-node={dataKubuildNode}\n role={role}\n >\n <template\n // @ts-expect-error Declarative shadow root for SSR\n shadowrootmode=\"open\"\n dangerouslySetInnerHTML={{ __html: scopedHtml }}\n />\n </div>\n );\n};\n\nexport interface KubuildRendererProps {\n document: PageDocument;\n registry?: ComponentRegistry;\n context?: RenderContext;\n viewport?: 'desktop' | 'tablet' | 'mobile';\n mode?: 'editor' | 'runtime';\n className?: string;\n onNodeClick?: (nodeId: string, event: React.MouseEvent) => void;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n onActionDispatch?: (actionType: string, payload: Record<string, unknown> | undefined, nodeId: string) => void;\n onNodePropChange?: (nodeId: string, propName: string, value: unknown, isBlur?: boolean) => void;\n}\n\nexport interface NodeRendererProps {\n node: Node;\n document: PageDocument;\n registry: ComponentRegistry;\n context?: RenderContext;\n viewport?: 'desktop' | 'tablet' | 'mobile';\n mode?: 'editor' | 'runtime';\n onNodeClick?: (nodeId: string, event: React.MouseEvent) => void;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n onActionDispatch?: (actionType: string, payload: Record<string, unknown> | undefined, nodeId: string) => void;\n onNodePropChange?: (nodeId: string, propName: string, value: unknown, isBlur?: boolean) => void;\n /**\n * Suffix appended to the HTML `id` attribute (never to `data-kubuild-node`, the\n * canonical template-node reference) so a `collection` node's repeated child\n * template produces unique DOM ids per iteration instead of duplicates.\n */\n instanceSuffix?: string;\n}\n\nexport function NodeRenderer({\n node,\n document,\n registry,\n context: propContext,\n viewport = 'desktop',\n mode = 'runtime',\n onNodeClick,\n onDiagnostic,\n onActionDispatch,\n onNodePropChange,\n instanceSuffix = '',\n}: NodeRendererProps): React.ReactElement {\n const context = propContext || DEFAULT_RENDER_CONTEXT;\n const styles = resolveNodeStyles(node.styles, viewport);\n const props = node.props || {};\n const definition = registry.get(node.type);\n const domId = instanceSuffix ? `${node.id}${instanceSuffix}` : node.id;\n const { props: resolvedProps, diagnostics } = resolvePropsForNode(node, definition, context);\n diagnostics.forEach((diagnostic) => {\n onDiagnostic?.(diagnostic);\n context?.onDiagnostic?.(diagnostic);\n });\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (onNodeClick) {\n onNodeClick(node.id, e);\n }\n if (props.action && !props.disabled) {\n dispatchAction({\n action: props.action,\n nodeId: node.id,\n document,\n context,\n onDiagnostic,\n });\n if (onActionDispatch && isActionBinding(props.action)) {\n onActionDispatch(props.action.type, resolveActionPayload(context, props.action.payload), node.id);\n }\n }\n };\n\n const childrenElements = node.children?.map((child: Node) => (\n <NodeRenderer\n key={`${child.id}${instanceSuffix}`}\n node={child}\n document={document}\n registry={registry}\n context={context}\n viewport={viewport}\n mode={mode}\n onNodeClick={onNodeClick}\n onDiagnostic={onDiagnostic}\n onActionDispatch={onActionDispatch}\n onNodePropChange={onNodePropChange}\n instanceSuffix={instanceSuffix}\n />\n ));\n\n const renderNodeContent = (): React.ReactElement => {\n // Check if custom component renderer is registered in ComponentRegistry\n if (definition?.renderer && typeof definition.renderer === 'function') {\n const CustomRenderer = definition.renderer as React.ComponentType<{\n node: Node;\n document: PageDocument;\n props: Record<string, unknown>;\n styles: React.CSSProperties;\n context?: RenderContext;\n children?: React.ReactNode;\n onClick?: (e: React.MouseEvent) => void;\n }>;\n\n try {\n if (typeof CustomRenderer === 'function' && !CustomRenderer.prototype?.isReactComponent) {\n return (CustomRenderer as (p: unknown) => React.ReactElement)({\n node,\n document,\n props: resolvedProps,\n styles,\n context,\n children: childrenElements,\n onClick: handleClick,\n });\n }\n } catch (err) {\n throw err;\n }\n\n return (\n <CustomRenderer\n node={node}\n document={document}\n props={resolvedProps}\n styles={styles}\n context={context}\n onClick={handleClick}\n >\n {childrenElements}\n </CustomRenderer>\n );\n }\n\n switch (node.type) {\n case 'page':\n return (\n <div id={domId} style={styles} onClick={handleClick} data-kubuild-node={node.id}>\n {childrenElements}\n </div>\n );\n case 'section':\n return (\n <section\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n aria-label={typeof resolvedProps.ariaLabel === 'string' ? resolvedProps.ariaLabel : undefined}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {childrenElements}\n </section>\n );\n case 'container':\n return (\n <div\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {childrenElements}\n </div>\n );\n case 'columns':\n return (\n <div\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {childrenElements}\n </div>\n );\n case 'heading': {\n const rawLevel = typeof resolvedProps.level === 'number' ? resolvedProps.level : typeof props.level === 'number' ? props.level : 2;\n const clampedLevel = Math.min(Math.max(rawLevel, 1), 6);\n const text = String(resolvedProps.text ?? '');\n const Tag = `h${clampedLevel}`;\n const isEditable = mode === 'editor' && !isVariableBinding(props.text);\n return (\n <EditableText\n as={Tag}\n id={domId}\n style={styles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n aria-label={typeof resolvedProps.ariaLabel === 'string' ? resolvedProps.ariaLabel : undefined}\n />\n );\n }\n case 'text': {\n const content = String(resolvedProps.content ?? '');\n const isEditable = mode === 'editor' && !isVariableBinding(props.content);\n return (\n <EditableText\n as=\"p\"\n id={domId}\n style={styles}\n value={content}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'content', val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'paragraph': {\n const text = String(resolvedProps.text ?? resolvedProps.content ?? props.text ?? props.content ?? '');\n const isEditable = mode === 'editor' && !isVariableBinding(props.text) && !isVariableBinding(props.content);\n const propName = props.content !== undefined ? 'content' : 'text';\n return (\n <EditableText\n as=\"p\"\n id={domId}\n style={styles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, propName, val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'link': {\n const text = String(resolvedProps.text ?? props.text ?? '');\n const rawHref = typeof resolvedProps.href === 'string' ? resolvedProps.href : typeof props.href === 'string' ? props.href : undefined;\n const href = rawHref ? sanitizeUrl(rawHref, '#') : '#';\n const rawTarget = typeof resolvedProps.target === 'string' ? resolvedProps.target : undefined;\n const rawRel = typeof resolvedProps.rel === 'string' ? resolvedProps.rel : undefined;\n const rel = rawTarget === '_blank' && !rawRel ? 'noopener noreferrer' : rawRel;\n const isEditable = mode === 'editor' && !isVariableBinding(props.text);\n\n if (isEditable) {\n return (\n <EditableText\n as=\"a\"\n id={domId}\n href={undefined}\n target={rawTarget}\n rel={rel}\n style={styles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n\n return (\n <a\n id={domId}\n href={href}\n target={rawTarget}\n rel={rel}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {text}\n </a>\n );\n }\n case 'blockquote': {\n const text = resolvedProps.text !== undefined ? String(resolvedProps.text) : props.text !== undefined ? String(props.text) : '';\n const rawCite = typeof resolvedProps.cite === 'string' ? resolvedProps.cite : typeof props.cite === 'string' ? props.cite : undefined;\n const safeCite = rawCite ? sanitizeUrl(rawCite) : undefined;\n const hasChildren = Boolean(childrenElements && childrenElements.length > 0);\n const isEditable = mode === 'editor' && !isVariableBinding(props.text);\n\n if (hasChildren) {\n return (\n <blockquote\n id={domId}\n cite={safeCite}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {text ? (\n isEditable ? (\n <EditableText\n as=\"p\"\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n />\n ) : (\n <p>{text}</p>\n )\n ) : null}\n {childrenElements}\n </blockquote>\n );\n }\n\n return (\n <EditableText\n as=\"blockquote\"\n id={domId}\n cite={safeCite}\n style={styles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'badge': {\n const text = String(resolvedProps.text ?? props.text ?? 'Badge');\n const variant = typeof resolvedProps.variant === 'string' ? resolvedProps.variant : 'default';\n const isEditable = mode === 'editor' && !isVariableBinding(props.text);\n\n return (\n <EditableText\n as=\"span\"\n id={domId}\n style={styles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n data-variant={variant}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'code-block': {\n const code = String(resolvedProps.code ?? props.code ?? '');\n const language = typeof resolvedProps.language === 'string' ? resolvedProps.language : typeof props.language === 'string' ? props.language : undefined;\n const isEditable = mode === 'editor' && !isVariableBinding(props.code);\n\n return (\n <pre\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-language={language}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n <EditableText\n as=\"code\"\n className={language ? `language-${language}` : undefined}\n style={{ fontFamily: 'inherit', color: 'inherit', display: 'block', whiteSpace: 'pre' }}\n value={code}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'code', val, isBlur)}\n />\n </pre>\n );\n }\n case 'list': {\n const rawTag = resolvedProps.tag;\n const Tag = rawTag === 'ol' ? 'ol' : 'ul';\n const rawListStyle = resolvedProps.listStyleType as string | undefined;\n const listStyleType = rawListStyle === 'custom-icon' ? 'none' : rawListStyle;\n const listStyles: React.CSSProperties = {\n ...styles,\n ...(listStyleType ? { listStyleType } : {}),\n };\n return (\n <Tag\n id={domId}\n style={listStyles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-list-style={rawListStyle}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {childrenElements}\n </Tag>\n );\n }\n case 'list-item': {\n const text = resolvedProps.text !== undefined ? String(resolvedProps.text) : '';\n const hasChildren = Boolean(childrenElements && childrenElements.length > 0);\n const isEditable = mode === 'editor' && !isVariableBinding(props.text);\n\n if (hasChildren) {\n return (\n <li\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {text ? (\n isEditable ? (\n <EditableText\n as=\"span\"\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n />\n ) : (\n <span>{text}</span>\n )\n ) : null}\n {childrenElements}\n </li>\n );\n }\n\n return (\n <EditableText\n as=\"li\"\n id={domId}\n style={styles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'table': {\n const isStriped = resolvedProps.striped === true;\n const isBordered = resolvedProps.bordered !== false;\n const isCompact = resolvedProps.compact === true;\n\n const tableStyles: React.CSSProperties = {\n width: '100%',\n borderCollapse: 'collapse',\n ...styles,\n ...(isBordered ? { border: styles.border || '1px solid #e2e8f0' } : {}),\n };\n\n return (\n <table\n id={domId}\n style={tableStyles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-striped={isStriped ? 'true' : undefined}\n data-bordered={isBordered ? 'true' : undefined}\n data-compact={isCompact ? 'true' : undefined}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n <tbody>{childrenElements}</tbody>\n </table>\n );\n }\n case 'table-row': {\n return (\n <tr\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {childrenElements}\n </tr>\n );\n }\n case 'table-cell': {\n const rawTag = resolvedProps.tag;\n const Tag = rawTag === 'th' ? 'th' : 'td';\n const colSpan =\n typeof resolvedProps.colSpan === 'number' && resolvedProps.colSpan > 1\n ? resolvedProps.colSpan\n : undefined;\n const rowSpan =\n typeof resolvedProps.rowSpan === 'number' && resolvedProps.rowSpan > 1\n ? resolvedProps.rowSpan\n : undefined;\n const text = resolvedProps.text !== undefined ? String(resolvedProps.text) : '';\n const hasChildren = Boolean(childrenElements && childrenElements.length > 0);\n const isEditable = mode === 'editor' && !isVariableBinding(props.text);\n\n const cellStyles: React.CSSProperties = {\n padding: '8px 12px',\n border: '1px solid #e2e8f0',\n textAlign: 'left',\n ...styles,\n ...(Tag === 'th'\n ? {\n fontWeight: styles.fontWeight || '600',\n backgroundColor: styles.backgroundColor || '#f8fafc',\n }\n : {}),\n };\n\n if (hasChildren) {\n return (\n <Tag\n id={domId}\n colSpan={colSpan}\n rowSpan={rowSpan}\n style={cellStyles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n {text ? (\n isEditable ? (\n <EditableText\n as=\"span\"\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n />\n ) : (\n <span>{text}</span>\n )\n ) : null}\n {childrenElements}\n </Tag>\n );\n }\n\n return (\n <EditableText\n as={Tag}\n id={domId}\n colSpan={colSpan}\n rowSpan={rowSpan}\n style={cellStyles}\n value={text}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'text', val, isBlur)}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'image': {\n const rawSrc = typeof resolvedProps.src === 'string' && resolvedProps.src.length > 0 ? resolvedProps.src : undefined;\n const directSrc = rawSrc ?? undefined;\n const asset = isAssetReference(props.asset) ? props.asset : undefined;\n const resolvedSrc =\n !directSrc && asset && context?.assetProvider\n ? resolveAssetSync(context.assetProvider, asset.assetId)\n : undefined;\n const fallbackSrc = asset?.fallbackUrl;\n const rawUrl = directSrc || resolvedSrc || fallbackSrc;\n // blob: allowed for media — runtime-only in-memory uploads (STORA-250).\n const safeSrc = rawUrl ? sanitizeUrl(rawUrl, '', { allowBlobMedia: true }) : undefined;\n const alt = typeof resolvedProps.alt === 'string' ? resolvedProps.alt : '';\n const loading = resolvedProps.loading === 'eager' ? 'eager' : 'lazy';\n\n return (\n <img\n id={domId}\n src={safeSrc || undefined}\n alt={alt}\n role={alt.length === 0 ? 'presentation' : undefined}\n loading={loading}\n width={resolvedProps.width as number}\n height={resolvedProps.height as number}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n />\n );\n }\n case 'video': {\n const rawSrc = typeof resolvedProps.src === 'string' ? resolvedProps.src : typeof props.src === 'string' ? props.src : '';\n const provider = typeof resolvedProps.provider === 'string' ? resolvedProps.provider : typeof props.provider === 'string' ? props.provider : 'auto';\n const rawPoster = typeof resolvedProps.poster === 'string' ? resolvedProps.poster : typeof props.poster === 'string' ? props.poster : undefined;\n const poster = rawPoster ? sanitizeUrl(rawPoster) : undefined;\n const controls = resolvedProps.controls !== false && props.controls !== false;\n const autoplay = resolvedProps.autoplay === true || props.autoplay === true;\n const loop = resolvedProps.loop === true || props.loop === true;\n const muted = resolvedProps.muted === true || props.muted === true;\n const aspectRatio = aspectRatioToCss(resolvedProps.aspectRatio ?? props.aspectRatio ?? '16:9');\n\n const ytId = provider === 'youtube' ? (getYouTubeId(rawSrc) || rawSrc) : (provider === 'auto' ? getYouTubeId(rawSrc) : null);\n const vimeoId = provider === 'vimeo' ? (getVimeoId(rawSrc) || rawSrc) : (provider === 'auto' ? getVimeoId(rawSrc) : null);\n\n const videoStyles: React.CSSProperties = {\n width: '100%',\n maxWidth: '100%',\n display: 'block',\n ...(aspectRatio ? { aspectRatio } : {}),\n ...styles,\n };\n\n if (ytId) {\n const autoplayParam = autoplay ? '1' : '0';\n const loopParam = loop ? `1&playlist=${ytId}` : '0';\n const muteParam = muted ? '1' : '0';\n const controlsParam = controls ? '1' : '0';\n const embedUrl = `https://www.youtube.com/embed/${ytId}?autoplay=${autoplayParam}&loop=${loopParam}&mute=${muteParam}&controls=${controlsParam}`;\n\n return (\n <div\n id={domId}\n style={{ ...videoStyles, position: 'relative', overflow: 'hidden' }}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-video-provider=\"youtube\"\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n <iframe\n src={embedUrl}\n title=\"YouTube video\"\n style={{ width: '100%', height: '100%', border: 'none', minHeight: '240px' }}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowFullScreen\n />\n </div>\n );\n }\n\n if (vimeoId) {\n const autoplayParam = autoplay ? '1' : '0';\n const loopParam = loop ? '1' : '0';\n const muteParam = muted ? '1' : '0';\n const embedUrl = `https://player.vimeo.com/video/${vimeoId}?autoplay=${autoplayParam}&loop=${loopParam}&muted=${muteParam}`;\n\n return (\n <div\n id={domId}\n style={{ ...videoStyles, position: 'relative', overflow: 'hidden' }}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-video-provider=\"vimeo\"\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n >\n <iframe\n src={embedUrl}\n title=\"Vimeo video\"\n style={{ width: '100%', height: '100%', border: 'none', minHeight: '240px' }}\n allow=\"autoplay; fullscreen; picture-in-picture\"\n allowFullScreen\n />\n </div>\n );\n }\n\n const safeSrc = sanitizeUrl(rawSrc, '', { allowBlobMedia: true });\n\n return (\n <video\n id={domId}\n src={safeSrc || undefined}\n poster={poster || undefined}\n controls={controls}\n autoPlay={autoplay}\n loop={loop}\n muted={muted}\n style={videoStyles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-video-provider=\"html5\"\n playsInline\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'icon': {\n const name = typeof resolvedProps.name === 'string' && resolvedProps.name.trim().length > 0\n ? resolvedProps.name.trim()\n : typeof props.name === 'string' && props.name.trim().length > 0\n ? props.name.trim()\n : 'star';\n const size = typeof resolvedProps.size === 'number' ? resolvedProps.size : typeof props.size === 'number' ? props.size : 24;\n const color = typeof resolvedProps.color === 'string' ? resolvedProps.color : typeof props.color === 'string' ? props.color : 'currentColor';\n const strokeWidth = typeof resolvedProps.strokeWidth === 'number' ? resolvedProps.strokeWidth : typeof props.strokeWidth === 'number' ? props.strokeWidth : 2;\n const pascalName = toPascalCase(name);\n const IconComponent = (lucideIcons as Record<string, React.ComponentType<{ size?: number; color?: string; strokeWidth?: number; className?: string; style?: React.CSSProperties }>>)[pascalName];\n\n return (\n <span\n id={domId}\n style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', color, ...styles }}\n onClick={handleClick}\n data-kubuild-node={node.id}\n data-icon-name={name}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : 'img'}\n aria-label={typeof resolvedProps.ariaLabel === 'string' ? resolvedProps.ariaLabel : name}\n >\n {IconComponent ? (\n <IconComponent size={size} color={color} strokeWidth={strokeWidth} />\n ) : (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color} strokeWidth={strokeWidth} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n )}\n </span>\n );\n }\n case 'html-embed': {\n const rawHtml = typeof resolvedProps.html === 'string' ? resolvedProps.html : typeof props.html === 'string' ? props.html : '';\n const sanitized = sanitizeHtml(rawHtml);\n\n if (mode === 'editor' && !rawHtml.trim()) {\n return (\n <div\n id={domId}\n style={{\n padding: '16px',\n border: '2px dashed #94a3b8',\n borderRadius: '8px',\n backgroundColor: '#f8fafc',\n color: '#64748b',\n textAlign: 'center',\n fontSize: '13px',\n fontFamily: 'sans-serif',\n ...styles,\n }}\n onClick={handleClick}\n data-kubuild-node={node.id}\n >\n <span style={{ fontWeight: 600 }}>&lt;/&gt; HTML Embed</span>\n <div style={{ fontSize: '11px', marginTop: '4px' }}>Click to configure HTML code in Inspector Panel</div>\n </div>\n );\n }\n\n return (\n <HtmlEmbedView\n id={domId}\n style={styles}\n onClick={handleClick}\n dataKubuildNode={node.id}\n html={sanitized}\n role={typeof resolvedProps.role === 'string' ? resolvedProps.role : undefined}\n />\n );\n }\n case 'button': {\n const label = String(resolvedProps.label ?? 'Button');\n const disabled = resolvedProps.disabled === true;\n const rawHref = typeof resolvedProps.href === 'string' ? resolvedProps.href : undefined;\n const href = rawHref ? sanitizeUrl(rawHref, '#') : undefined;\n const rawTarget = typeof resolvedProps.target === 'string' ? resolvedProps.target : undefined;\n const rawRel = typeof resolvedProps.rel === 'string' ? resolvedProps.rel : undefined;\n const rel = rawTarget === '_blank' && !rawRel ? 'noopener noreferrer' : rawRel;\n const action = isActionBinding(props.action) ? props.action : undefined;\n const actionResolved = action ? isActionRegistered(context?.actionRegistry, action.type) : undefined;\n const actionAttrs = action\n ? { 'data-kubuild-action': action.type, 'data-kubuild-action-resolved': actionResolved }\n : {};\n const ariaLabel = typeof resolvedProps.ariaLabel === 'string' ? resolvedProps.ariaLabel : undefined;\n const isEditable = mode === 'editor' && !isVariableBinding(props.label);\n\n const rawButtonType = typeof resolvedProps.buttonType === 'string' ? resolvedProps.buttonType : 'button';\n const buttonType: 'button' | 'submit' | 'reset' =\n rawButtonType === 'submit' || rawButtonType === 'reset' ? rawButtonType : 'button';\n\n if (href && !disabled) {\n if (isEditable) {\n return (\n <EditableText\n as=\"a\"\n id={domId}\n href={mode === 'editor' ? undefined : href}\n target={rawTarget}\n rel={rel}\n style={styles}\n value={label}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'label', val, isBlur)}\n aria-label={ariaLabel}\n tabIndex={0}\n {...actionAttrs}\n />\n );\n }\n return (\n <a\n id={domId}\n href={href}\n target={rawTarget}\n rel={rel}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n aria-label={ariaLabel}\n tabIndex={0}\n {...actionAttrs}\n >\n {label}\n </a>\n );\n }\n\n if (isEditable) {\n return (\n <EditableText\n as=\"button\"\n id={domId}\n type={mode === 'editor' ? 'button' : buttonType}\n disabled={disabled}\n aria-disabled={disabled ? true : undefined}\n aria-label={ariaLabel}\n tabIndex={disabled ? -1 : 0}\n style={styles}\n value={label}\n isEditable={isEditable}\n nodeId={node.id}\n onClick={disabled ? undefined : handleClick}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'label', val, isBlur)}\n {...actionAttrs}\n />\n );\n }\n\n return (\n <button\n id={domId}\n type={mode === 'editor' ? 'button' : buttonType}\n disabled={disabled}\n aria-disabled={disabled ? true : undefined}\n aria-label={ariaLabel}\n tabIndex={disabled ? -1 : 0}\n style={styles}\n onClick={disabled ? undefined : handleClick}\n data-kubuild-node={node.id}\n {...actionAttrs}\n >\n {label}\n </button>\n );\n }\n case 'form': {\n const action = typeof resolvedProps.action === 'string' ? resolvedProps.action : undefined;\n const method = typeof resolvedProps.method === 'string' ? resolvedProps.method : 'POST';\n const target = typeof resolvedProps.target === 'string' ? resolvedProps.target : undefined;\n const autoComplete = typeof resolvedProps.autoComplete === 'string' ? resolvedProps.autoComplete : undefined;\n const name = typeof resolvedProps.name === 'string' ? resolvedProps.name : undefined;\n\n const handleSubmit = (e: React.FormEvent) => {\n if (mode === 'editor') {\n e.preventDefault();\n }\n };\n\n return (\n <form\n id={domId}\n name={name}\n action={action && mode !== 'editor' ? sanitizeUrl(action, '') : undefined}\n method={method}\n target={target}\n autoComplete={autoComplete}\n style={styles}\n onClick={handleClick}\n onSubmit={handleSubmit}\n data-kubuild-node={node.id}\n role=\"form\"\n aria-label={name}\n >\n {childrenElements}\n </form>\n );\n }\n case 'input': {\n const name = typeof resolvedProps.name === 'string' ? resolvedProps.name : undefined;\n const inputType = typeof resolvedProps.type === 'string' ? resolvedProps.type : 'text';\n const placeholder = typeof resolvedProps.placeholder === 'string' ? resolvedProps.placeholder : undefined;\n const defaultValue = resolvedProps.defaultValue !== undefined ? String(resolvedProps.defaultValue) : undefined;\n const required = resolvedProps.required === true;\n const disabled = resolvedProps.disabled === true;\n const readOnly = resolvedProps.readOnly === true;\n\n return (\n <input\n id={domId}\n type={inputType}\n name={name}\n placeholder={placeholder}\n defaultValue={defaultValue}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n />\n );\n }\n case 'textarea': {\n const name = typeof resolvedProps.name === 'string' ? resolvedProps.name : undefined;\n const placeholder = typeof resolvedProps.placeholder === 'string' ? resolvedProps.placeholder : undefined;\n const defaultValue = resolvedProps.defaultValue !== undefined ? String(resolvedProps.defaultValue) : undefined;\n const rows = typeof resolvedProps.rows === 'number' ? resolvedProps.rows : 4;\n const required = resolvedProps.required === true;\n const disabled = resolvedProps.disabled === true;\n const readOnly = resolvedProps.readOnly === true;\n\n return (\n <textarea\n id={domId}\n name={name}\n placeholder={placeholder}\n defaultValue={defaultValue}\n rows={rows}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n />\n );\n }\n case 'select': {\n const name = typeof resolvedProps.name === 'string' ? resolvedProps.name : undefined;\n const placeholder = typeof resolvedProps.placeholder === 'string' ? resolvedProps.placeholder : undefined;\n const defaultValue = resolvedProps.defaultValue !== undefined ? String(resolvedProps.defaultValue) : undefined;\n const required = resolvedProps.required === true;\n const disabled = resolvedProps.disabled === true;\n\n let optionsList: Array<{ label: string; value: string }> = [];\n const rawOptions = resolvedProps.options ?? props.options;\n if (Array.isArray(rawOptions)) {\n optionsList = rawOptions.map((opt) => {\n if (typeof opt === 'object' && opt !== null) {\n const record = opt as Record<string, unknown>;\n return {\n label: String(record.label ?? record.value ?? ''),\n value: String(record.value ?? record.label ?? ''),\n };\n }\n return { label: String(opt), value: String(opt) };\n });\n } else if (typeof rawOptions === 'string') {\n try {\n const parsed = JSON.parse(rawOptions);\n if (Array.isArray(parsed)) {\n optionsList = parsed.map((opt) => {\n if (typeof opt === 'object' && opt !== null) {\n const record = opt as Record<string, unknown>;\n return {\n label: String(record.label ?? record.value ?? ''),\n value: String(record.value ?? record.label ?? ''),\n };\n }\n return { label: String(opt), value: String(opt) };\n });\n }\n } catch {\n // Not valid JSON\n }\n }\n\n return (\n <select\n id={domId}\n name={name}\n defaultValue={defaultValue}\n required={required}\n disabled={disabled}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n >\n {placeholder && (\n <option value=\"\" disabled={required}>\n {placeholder}\n </option>\n )}\n {optionsList.map((opt, idx) => (\n <option key={`${opt.value}-${idx}`} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n }\n case 'checkbox': {\n const name = typeof resolvedProps.name === 'string' ? resolvedProps.name : undefined;\n const label = String(resolvedProps.label ?? 'Checkbox');\n const value = resolvedProps.value !== undefined ? String(resolvedProps.value) : 'yes';\n const defaultChecked = resolvedProps.defaultChecked === true;\n const required = resolvedProps.required === true;\n const disabled = resolvedProps.disabled === true;\n const isEditable = mode === 'editor' && !isVariableBinding(props.label);\n\n return (\n <label\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n >\n <input\n type=\"checkbox\"\n name={name}\n value={value}\n defaultChecked={defaultChecked}\n required={required}\n disabled={disabled}\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n />\n {isEditable ? (\n <EditableText\n as=\"span\"\n value={label}\n isEditable={isEditable}\n nodeId={node.id}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'label', val, isBlur)}\n />\n ) : (\n <span>{label}</span>\n )}\n </label>\n );\n }\n case 'radio': {\n const name = typeof resolvedProps.name === 'string' ? resolvedProps.name : undefined;\n const label = String(resolvedProps.label ?? 'Radio');\n const value = resolvedProps.value !== undefined ? String(resolvedProps.value) : 'option';\n const defaultChecked = resolvedProps.defaultChecked === true;\n const required = resolvedProps.required === true;\n const disabled = resolvedProps.disabled === true;\n const isEditable = mode === 'editor' && !isVariableBinding(props.label);\n\n return (\n <label\n id={domId}\n style={styles}\n onClick={handleClick}\n data-kubuild-node={node.id}\n >\n <input\n type=\"radio\"\n name={name}\n value={value}\n defaultChecked={defaultChecked}\n required={required}\n disabled={disabled}\n style={{ cursor: disabled ? 'not-allowed' : 'pointer' }}\n />\n {isEditable ? (\n <EditableText\n as=\"span\"\n value={label}\n isEditable={isEditable}\n nodeId={node.id}\n onChange={(val, isBlur) => onNodePropChange?.(node.id, 'label', val, isBlur)}\n />\n ) : (\n <span>{label}</span>\n )}\n </label>\n );\n }\n case 'collection': {\n const sourceKey = typeof props.sourceKey === 'string' ? props.sourceKey : undefined;\n const itemAlias =\n typeof props.itemAlias === 'string' && props.itemAlias.length > 0 ? props.itemAlias : 'item';\n const indexKey = `${itemAlias}Index`;\n const sourceValue = sourceKey ? resolveBinding({ key: sourceKey }, context).value : undefined;\n\n if (!Array.isArray(sourceValue)) {\n const collectionDiagnostic: Diagnostic = {\n code: 'INVALID_COLLECTION_SOURCE',\n nodeId: node.id,\n propName: 'sourceKey',\n message: `Collection node \"${node.id}\" expected an array at variable path \"${\n sourceKey ?? '(missing sourceKey)'\n }\" but found ${sourceValue === undefined ? 'nothing' : typeof sourceValue}.`,\n };\n onDiagnostic?.(collectionDiagnostic);\n context?.onDiagnostic?.(collectionDiagnostic);\n\n if (mode === 'editor') {\n return (\n <div\n id={domId}\n data-kubuild-node={node.id}\n data-kubuild-collection-invalid={node.type}\n style={{\n ...styles,\n border: '2px dashed #f59e0b',\n backgroundColor: '#fffbeb',\n color: '#92400e',\n padding: '12px',\n borderRadius: '6px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n }}\n onClick={handleClick}\n >\n <div style={{ fontWeight: 600, fontSize: '13px', display: 'flex', alignItems: 'center', gap: '6px' }}>\n <Package size={14} aria-hidden=\"true\" />\n <span>Collection: expected an array at <code>{sourceKey ?? '(missing sourceKey)'}</code></span>\n </div>\n </div>\n );\n }\n\n return (\n <div id={domId} data-kubuild-node={node.id} style={styles} onClick={handleClick} aria-hidden=\"true\" />\n );\n }\n\n return (\n <div id={domId} data-kubuild-node={node.id} style={styles} onClick={handleClick}>\n {sourceValue.map((item, index) => {\n const childContext: RenderContext = {\n ...context,\n variables: { ...(context?.variables ?? {}), [itemAlias]: item, [indexKey]: index },\n };\n const itemSuffix = `${instanceSuffix}--${index}`;\n return node.children?.map((child: Node) => (\n <NodeRenderer\n key={`${child.id}${itemSuffix}`}\n node={child}\n document={document}\n registry={registry}\n context={childContext}\n viewport={viewport}\n mode={mode}\n onNodeClick={onNodeClick}\n onDiagnostic={onDiagnostic}\n onActionDispatch={onActionDispatch}\n onNodePropChange={onNodePropChange}\n instanceSuffix={itemSuffix}\n />\n ));\n })}\n </div>\n );\n }\n default:\n // Unknown component handling\n if (mode === 'editor') {\n return (\n <div\n id={domId}\n data-kubuild-node={node.id}\n data-kubuild-unknown={node.type}\n style={{\n ...styles,\n border: '2px dashed #f59e0b',\n backgroundColor: '#fffbeb',\n color: '#92400e',\n padding: '12px',\n borderRadius: '6px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n }}\n onClick={handleClick}\n >\n <div style={{ fontWeight: 600, fontSize: '13px', marginBottom: '4px', display: 'flex', alignItems: 'center', gap: '6px' }}>\n <Puzzle size={14} aria-hidden=\"true\" />\n <span>Unknown Component: <code>{node.type}</code></span>\n </div>\n <div style={{ fontSize: '11px', color: '#b45309', marginBottom: childrenElements ? '8px' : 0 }}>\n Node ID: <code>{node.id}</code>\n </div>\n {childrenElements}\n </div>\n );\n }\n\n // Safe fallback in runtime mode\n return (\n <div\n id={domId}\n data-kubuild-node={node.id}\n data-kubuild-unknown={node.type}\n style={styles}\n onClick={handleClick}\n >\n {childrenElements}\n </div>\n );\n }\n };\n\n let content: React.ReactElement;\n try {\n content = renderNodeContent();\n } catch (error) {\n if (mode === 'editor') {\n content = (\n <div\n data-kubuild-node={node.id}\n data-kubuild-error={node.type}\n style={{\n padding: '12px 16px',\n margin: '4px 0',\n backgroundColor: '#fef2f2',\n border: '1px solid #ef4444',\n borderRadius: '6px',\n color: '#b91c1c',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '13px',\n lineHeight: '1.4',\n }}\n >\n <div style={{ fontWeight: 600, marginBottom: '4px', display: 'flex', alignItems: 'center', gap: '6px' }}>\n <AlertTriangle size={14} aria-hidden=\"true\" />\n <span>Component Render Error: &lt;{node.type}&gt;</span>\n </div>\n <div style={{ fontSize: '11px', color: '#7f1d1d', wordBreak: 'break-all' }}>\n Node ID: <code>{node.id}</code> — {error instanceof Error ? error.message : String(error)}\n </div>\n </div>\n );\n } else {\n content = (\n <div\n data-kubuild-node={node.id}\n data-kubuild-error={node.type}\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n />\n );\n }\n }\n\n return (\n <ComponentErrorBoundary nodeId={node.id} componentType={node.type} mode={mode}>\n {content}\n </ComponentErrorBoundary>\n );\n}\n\nexport const KubuildRenderer: React.FC<KubuildRendererProps> = ({\n document,\n registry = createDefaultComponentRegistry(),\n context,\n viewport = 'desktop',\n mode = 'runtime',\n className,\n onNodeClick,\n onDiagnostic,\n onActionDispatch,\n onNodePropChange,\n}) => {\n if (!document || !document.document) {\n return <div className={className}>Empty Document</div>;\n }\n\n return (\n <RenderContextProvider value={context}>\n <div className={`kubuild-canvas-root ${className || ''}`}>\n {/* Compiled pseudo-state CSS (:hover/:active/:focus) — STORA-222 */}\n {(() => {\n const css = collectStateStylesCss(document);\n return css ? <style data-kubuild-state-styles>{css}</style> : null;\n })()}\n {/* Compiled animation & hover micro-interactions CSS — STORA-264 */}\n {(() => {\n const animCss = collectAnimationStylesCss(document);\n return animCss ? <style data-kubuild-animation-styles>{animCss}</style> : null;\n })()}\n <NodeRenderer\n node={document.document}\n document={document}\n registry={registry}\n context={context}\n viewport={viewport}\n mode={mode}\n onNodeClick={onNodeClick}\n onDiagnostic={onDiagnostic}\n onActionDispatch={onActionDispatch}\n onNodePropChange={onNodePropChange}\n />\n </div>\n </RenderContextProvider>\n );\n};\n","import React, { createContext, useContext, useMemo } from 'react';\nimport { resolveBinding, type ResolveOutcome } from '@kubuild/core';\nimport type {\n AssetProvider,\n ActionRegistry,\n ActionHandler,\n ActionExecutionContext,\n ActionDiagnostic,\n Diagnostic,\n RenderContext,\n RuntimeContext,\n} from '@kubuild/core';\nimport { isVariableBinding, isActionBinding, ActionBinding, PageDocument } from '@kubuild/schema';\n\nexport type { RenderContext, RuntimeContext, ActionDiagnostic, Diagnostic };\n\n/**\n * Empty default frozen context\n */\nexport const DEFAULT_RENDER_CONTEXT: RenderContext = Object.freeze({});\n\n/**\n * React Context for RenderContext flow\n */\nconst RenderContextReact = createContext<RenderContext>(DEFAULT_RENDER_CONTEXT);\n\n/**\n * Creates an immutable (frozen) RenderContext.\n * Guarantees that components cannot mutate the runtime context during rendering.\n */\nexport function createRenderContext(options?: {\n variables?: Record<string, unknown>;\n assetProvider?: AssetProvider;\n actionRegistry?: ActionRegistry;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n}): RenderContext {\n if (!options) {\n return DEFAULT_RENDER_CONTEXT;\n }\n\n const frozenVariables = options.variables ? Object.freeze({ ...options.variables }) : undefined;\n\n return Object.freeze({\n variables: frozenVariables,\n ...(options.assetProvider ? { assetProvider: options.assetProvider } : {}),\n ...(options.actionRegistry ? { actionRegistry: options.actionRegistry } : {}),\n ...(options.onDiagnostic ? { onDiagnostic: options.onDiagnostic } : {}),\n });\n}\n\n/**\n * Minimal offline in-memory context factory.\n * Can be safely injected into unit tests, local mock playgrounds, or SSR without any network calls.\n */\nexport function createMinimalRenderContext(options?: {\n variables?: Record<string, unknown>;\n assets?: Record<string, string>;\n actions?: Record<string, ActionHandler>;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n}): RenderContext {\n const assetsMap = new Map<string, string>(Object.entries(options?.assets ?? {}));\n const actionsMap = new Map<string, ActionHandler>(Object.entries(options?.actions ?? {}));\n\n const assetProvider: AssetProvider = {\n resolve: (assetIdOrUri: string) => {\n return assetsMap.get(assetIdOrUri) || assetIdOrUri;\n },\n };\n\n const actionRegistry: ActionRegistry = {\n get: (type: string) => actionsMap.get(type),\n register: (type: string, handler: ActionHandler) => {\n actionsMap.set(type, handler);\n },\n unregister: (type: string) => {\n actionsMap.delete(type);\n },\n };\n\n return createRenderContext({\n variables: options?.variables,\n assetProvider,\n actionRegistry,\n onDiagnostic: options?.onDiagnostic,\n });\n}\n\n/**\n * Provider component to make RenderContext available anywhere in the component tree\n */\nexport interface RenderContextProviderProps {\n value?: RenderContext;\n children: React.ReactNode;\n}\n\nexport const RenderContextProvider: React.FC<RenderContextProviderProps> = ({ value, children }) => {\n const contextValue = useMemo(() => value || DEFAULT_RENDER_CONTEXT, [value]);\n\n return <RenderContextReact.Provider value={contextValue}>{children}</RenderContextReact.Provider>;\n};\n\n/**\n * Hook to access the current RenderContext\n */\nexport function useRenderContext(): RenderContext {\n return useContext(RenderContextReact);\n}\n\n/**\n * Asset resolution helper.\n * Computes asset URLs synchronously for React render cycles.\n */\nexport function resolveAssetSync(assetProvider?: AssetProvider, assetIdOrUri?: string): string | undefined {\n if (!assetProvider || !assetIdOrUri) {\n return undefined;\n }\n try {\n const result = assetProvider.resolve(assetIdOrUri);\n return typeof result === 'string' ? result : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Variable resolution helper.\n * Resolves VariableBinding objects and template strings like \"{{ title }}\" using context variables.\n */\nexport function resolveVariable(context?: RenderContext, value?: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n\n // Handle VariableBinding object: { type: 'variable', key: '...', fallback: '...' }\n if (isVariableBinding(value)) {\n return resolveBinding(value, context).value;\n }\n\n // Handle string interpolation: \"Hello {{ site.name }}\" — resolves nested paths\n // the same way VariableBinding does, so both binding styles stay consistent.\n if (typeof value === 'string' && value.includes('{{')) {\n return value.replace(/\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g, (match, key) => {\n const outcome = resolveBinding({ key }, context);\n if (outcome.status === 'resolved') {\n return String(outcome.value);\n }\n return match;\n });\n }\n\n return value;\n}\n\n/**\n * Result of resolving an action payload: the resolved (serializable) value, plus any\n * binding paths that failed to resolve (missing key, no author-declared fallback).\n * `invalidPaths` is what lets dispatchAction refuse to run a handler with an\n * unexpected/garbage value instead of silently passing through an empty string.\n */\nexport interface ActionPayloadResolution {\n value: Record<string, unknown> | undefined;\n invalidPaths: string[];\n}\n\n/**\n * Recursively resolves variables within an action payload without mutating the input object.\n * Tracks dotted field paths (e.g. \"item.id\") whose binding resolved to the \"empty\" outcome —\n * i.e. an invalid/missing path with no fallback declared — as opposed to `fallback`, which is\n * an author-declared safe default and never treated as invalid.\n */\nexport function resolveActionPayloadDetailed(\n context: RenderContext | undefined,\n payload: Record<string, unknown> | undefined,\n): ActionPayloadResolution {\n if (!payload || typeof payload !== 'object') {\n return { value: payload, invalidPaths: [] };\n }\n\n const invalidPaths: string[] = [];\n\n const resolveValueRecursively = (val: unknown, path: string): unknown => {\n if (val === null || val === undefined) {\n return val;\n }\n if (isVariableBinding(val)) {\n const outcome: ResolveOutcome = resolveBinding(val, context);\n if (outcome.status === 'empty') {\n invalidPaths.push(path);\n }\n return outcome.value;\n }\n if (typeof val === 'string') {\n if (val.includes('{{')) {\n return val.replace(/\\{\\{\\s*([\\w.-]+)\\s*\\}\\}/g, (match, key) => {\n const outcome = resolveBinding({ key }, context);\n if (outcome.status !== 'resolved') {\n invalidPaths.push(path);\n return match;\n }\n return String(outcome.value);\n });\n }\n return val;\n }\n if (Array.isArray(val)) {\n return val.map((item, index) => resolveValueRecursively(item, `${path}[${index}]`));\n }\n if (typeof val === 'object') {\n const copy: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(val as Record<string, unknown>)) {\n copy[k] = resolveValueRecursively(v, path ? `${path}.${k}` : k);\n }\n return copy;\n }\n return val;\n };\n\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(payload)) {\n resolved[key] = resolveValueRecursively(value, key);\n }\n\n return { value: resolved, invalidPaths };\n}\n\n/**\n * Recursively resolves variables within an action payload without mutating the input object.\n * Back-compat convenience wrapper over resolveActionPayloadDetailed for callers that only\n * need the resolved value (e.g. previewing a payload) and not invalid-path enforcement.\n */\nexport function resolveActionPayload(\n context?: RenderContext,\n payload?: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n return resolveActionPayloadDetailed(context, payload).value;\n}\n\n/**\n * Action resolution helper.\n * Checks whether an action type is registered with the current action registry.\n */\nexport function isActionRegistered(actionRegistry?: ActionRegistry, actionType?: string): boolean {\n if (!actionRegistry || !actionType) {\n return false;\n }\n return Boolean(actionRegistry.get(actionType));\n}\n\n/**\n * Safe action dispatch options\n */\nexport interface DispatchActionOptions {\n action: ActionBinding | unknown;\n nodeId?: string;\n document: PageDocument;\n context?: RenderContext;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n [key: string]: unknown;\n}\n\n/**\n * Dispatches an action safely from the renderer to registered host handlers.\n * Guarantees that:\n * 1. Payload variables are resolved safely.\n * 2. Unregistered / unknown actions are not executed and trigger diagnostics.\n * 3. No arbitrary JS code (eval, Function, script injection) from document/props is ever executed.\n */\nexport function dispatchAction(options: DispatchActionOptions): boolean {\n const { action, nodeId, document, context, onDiagnostic } = options;\n\n if (!isActionBinding(action)) {\n const diagnostic: ActionDiagnostic = {\n code: 'INVALID_ACTION_PAYLOAD',\n actionType:\n typeof (action as { type?: unknown })?.type === 'string'\n ? (action as { type: string }).type\n : 'unknown',\n nodeId,\n message: `Invalid action binding on node ${nodeId || 'unknown'}.`,\n };\n onDiagnostic?.(diagnostic);\n context?.onDiagnostic?.(diagnostic);\n return false;\n }\n\n const handler = context?.actionRegistry?.get(action.type);\n\n if (!handler) {\n const diagnostic: ActionDiagnostic = {\n code: 'UNKNOWN_ACTION',\n actionType: action.type,\n nodeId,\n message: `No action handler registered for action type \"${action.type}\".`,\n };\n onDiagnostic?.(diagnostic);\n context?.onDiagnostic?.(diagnostic);\n return false;\n }\n\n const { value: resolvedPayload, invalidPaths } = resolveActionPayloadDetailed(context, action.payload);\n\n if (invalidPaths.length > 0) {\n const diagnostic: ActionDiagnostic = {\n code: 'INVALID_ACTION_BINDING',\n actionType: action.type,\n nodeId,\n message: `Action \"${action.type}\" payload has unresolved binding path(s) [${invalidPaths.join(\n ', ',\n )}] on node ${nodeId || 'unknown'}; handler was not invoked.`,\n invalidPaths,\n };\n onDiagnostic?.(diagnostic);\n context?.onDiagnostic?.(diagnostic);\n return false;\n }\n\n const executionContext: ActionExecutionContext = {\n nodeId,\n document,\n variables: context?.variables,\n };\n\n try {\n const result = handler(resolvedPayload, executionContext);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n (result as Promise<void>).catch((error) => {\n const diagnostic: ActionDiagnostic = {\n code: 'ACTION_EXECUTION_ERROR',\n actionType: action.type,\n nodeId,\n message: `Action \"${action.type}\" handler threw an asynchronous error: ${\n error instanceof Error ? error.message : String(error)\n }`,\n error,\n };\n onDiagnostic?.(diagnostic);\n context?.onDiagnostic?.(diagnostic);\n });\n }\n return true;\n } catch (error) {\n const diagnostic: ActionDiagnostic = {\n code: 'ACTION_EXECUTION_ERROR',\n actionType: action.type,\n nodeId,\n message: `Action \"${action.type}\" handler threw a synchronous error: ${\n error instanceof Error ? error.message : String(error)\n }`,\n error,\n };\n onDiagnostic?.(diagnostic);\n context?.onDiagnostic?.(diagnostic);\n return false;\n }\n}\n","import { PageDocument, Node, ResponsiveStyles } from '@kubuild/schema';\nimport React from 'react';\n\nexport function resolveNodeStyles(\n styles?: ResponsiveStyles,\n viewport: 'desktop' | 'tablet' | 'mobile' = 'desktop',\n): React.CSSProperties {\n if (!styles) return {};\n const base = (styles.base as React.CSSProperties) || {};\n const override = (styles[viewport] as React.CSSProperties) || {};\n return { ...base, ...override };\n}\n\n/**\n * Escape a string for safe interpolation into a CSS declaration value.\n * Strips characters that could break out of the declaration context.\n */\nfunction escapeCssValue(value: unknown): string {\n return String(value).replace(/[{};]+/g, '');\n}\n\n/**\n * Escape a node id for safe interpolation into an attribute selector.\n */\nfunction escapeCssIdent(value: string): string {\n return value.replace(/[\"\\\\\\]]/g, '\\\\$&');\n}\n\n/**\n * Serialize a style definition object into CSS declarations.\n * camelCase keys are converted to kebab-case CSS properties.\n */\nexport function styleDefinitionToCssDeclarations(\n styleDefinition: Record<string, unknown> | undefined,\n options?: { important?: boolean },\n): string {\n if (!styleDefinition || typeof styleDefinition !== 'object') return '';\n const declarations: string[] = [];\n const suffix = options?.important ? ' !important' : '';\n for (const [key, value] of Object.entries(styleDefinition)) {\n if (value === null || value === undefined || value === '') continue;\n const property = key.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n declarations.push(`${property}: ${escapeCssValue(value)}${suffix};`);\n }\n return declarations.join(' ');\n}\n\n/**\n * Walk the document tree and produce scoped CSS rules for pseudo-state\n * style layers (STORA-222). Each node with `styles.states` gets rules like:\n *\n * [data-kubuild-node=\"node-1\"]:hover { background-color: #1d4ed8 !important; }\n *\n * Scoped via the canonical `data-kubuild-node` attribute so styles never leak\n * between nodes and work identically in editor canvas and runtime preview.\n * Uses `!important` to reliably override the component's inline base style attributes.\n */\nexport function collectStateStylesCss(\n document: PageDocument | undefined | null,\n options: { important?: boolean } = { important: true },\n): string {\n if (!document?.document) return '';\n const rules: string[] = [];\n\n const walk = (node: Node): void => {\n const states = node.styles?.states;\n if (states && typeof states === 'object') {\n for (const [state, styleDefinition] of Object.entries(states)) {\n const declarations = styleDefinitionToCssDeclarations(\n styleDefinition as Record<string, unknown>,\n { important: options.important !== false },\n );\n if (!declarations) continue;\n // Only accept pseudo-class-looking selectors to avoid selector injection.\n const safeState = /^::?[a-zA-Z-]+$/.test(state) ? state : null;\n if (!safeState) continue;\n rules.push(`[data-kubuild-node=\"${escapeCssIdent(node.id)}\"]${safeState} { ${declarations} }`);\n }\n }\n node.children?.forEach(walk);\n };\n\n walk(document.document);\n return rules.join('\\n');\n}\n\n/**\n * Modern baseline CSS Reset for consistent rendering across viewports and browsers.\n */\nexport const DEFAULT_CSS_RESET = `\n*, *::before, *::after {\n box-sizing: border-box;\n}\n\n* {\n margin: 0;\n}\n\nbody {\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n}\n\nimg, picture, video, canvas, svg {\n display: block;\n max-width: 100%;\n}\n\ninput, button, textarea, select {\n font: inherit;\n}\n\np, h1, h2, h3, h4, h5, h6 {\n overflow-wrap: break-word;\n}\n`.trim();\n","import { PageDocument, Node, AnimationConfig } from '@kubuild/schema';\n\n/**\n * Standard Keyframes for Entrance, Scroll, and Continuous Loop Animations (STORA-263, STORA-264)\n */\nexport const ANIMATION_KEYFRAMES_CSS = `\n/* Entrance / AOS Keyframes */\n@keyframes kb-anim-fade {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n@keyframes kb-anim-fade-up {\n from { opacity: 0; transform: translateY(24px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes kb-anim-fade-down {\n from { opacity: 0; transform: translateY(-24px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes kb-anim-fade-left {\n from { opacity: 0; transform: translateX(24px); }\n to { opacity: 1; transform: translateX(0); }\n}\n@keyframes kb-anim-fade-right {\n from { opacity: 0; transform: translateX(-24px); }\n to { opacity: 1; transform: translateX(0); }\n}\n@keyframes kb-anim-zoom-in {\n from { opacity: 0; transform: scale(0.92); }\n to { opacity: 1; transform: scale(1); }\n}\n@keyframes kb-anim-zoom-out {\n from { opacity: 0; transform: scale(1.08); }\n to { opacity: 1; transform: scale(1); }\n}\n@keyframes kb-anim-slide-up {\n from { transform: translateY(100%); }\n to { transform: translateY(0); }\n}\n@keyframes kb-anim-slide-down {\n from { transform: translateY(-100%); }\n to { transform: translateY(0); }\n}\n@keyframes kb-anim-slide-left {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n@keyframes kb-anim-slide-right {\n from { transform: translateX(-100%); }\n to { transform: translateX(0); }\n}\n@keyframes kb-anim-flip-up {\n from { opacity: 0; transform: perspective(600px) rotateX(45deg); }\n to { opacity: 1; transform: perspective(600px) rotateX(0deg); }\n}\n@keyframes kb-anim-flip-down {\n from { opacity: 0; transform: perspective(600px) rotateX(-45deg); }\n to { opacity: 1; transform: perspective(600px) rotateX(0deg); }\n}\n\n/* Continuous Loop Keyframes */\n@keyframes kb-loop-pulse {\n 0%, 100% { transform: scale(1); opacity: 1; }\n 50% { transform: scale(1.05); opacity: 0.9; }\n}\n@keyframes kb-loop-bounce {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-8px); }\n}\n@keyframes kb-loop-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n@keyframes kb-loop-float {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-6px); }\n}\n@keyframes kb-loop-shimmer {\n 0%, 100% { opacity: 0.75; }\n 50% { opacity: 1; }\n}\n`.trim();\n\n/**\n * Escape a node id for safe interpolation into an attribute selector.\n */\nfunction escapeCssIdent(value: string): string {\n return value.replace(/[\"\\\\\\]]/g, '\\\\$&');\n}\n\n/**\n * Generate CSS rules for Hover Micro-Interactions (STORA-264)\n */\nexport function getHoverEffectCss(nodeId: string, hoverEffect: string): string[] {\n const safeId = escapeCssIdent(nodeId);\n const rules: string[] = [];\n\n switch (hoverEffect) {\n case 'lift':\n rules.push(\n `[data-kubuild-node=\"${safeId}\"] { transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.25s ease !important; will-change: transform; }`,\n `[data-kubuild-node=\"${safeId}\"]:hover { transform: translateY(-4px) !important; box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1) !important; }`,\n );\n break;\n case 'scale':\n rules.push(\n `[data-kubuild-node=\"${safeId}\"] { transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1) !important; will-change: transform; }`,\n `[data-kubuild-node=\"${safeId}\"]:hover { transform: scale(1.04) !important; }`,\n );\n break;\n case 'glow':\n rules.push(\n `[data-kubuild-node=\"${safeId}\"] { transition: box-shadow 0.25s ease !important; }`,\n `[data-kubuild-node=\"${safeId}\"]:hover { box-shadow: 0 0 20px 2px rgba(59, 130, 246, 0.5) !important; }`,\n );\n break;\n case 'tilt':\n rules.push(\n `[data-kubuild-node=\"${safeId}\"] { transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1) !important; will-change: transform; }`,\n `[data-kubuild-node=\"${safeId}\"]:hover { transform: rotate(2deg) scale(1.02) !important; }`,\n );\n break;\n default:\n break;\n }\n\n return rules;\n}\n\n/**\n * Generate CSS rules for Continuous Loop Effects (STORA-264)\n */\nexport function getLoopEffectCss(nodeId: string, loopEffect: string): string[] {\n const safeId = escapeCssIdent(nodeId);\n const rules: string[] = [];\n\n switch (loopEffect) {\n case 'pulse':\n rules.push(\n `[data-kubuild-node=\"${safeId}\"] { animation: kb-loop-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite !important; }`,\n );\n break;\n case 'bounce':\n rules.push(\n `[data-kubuild-node=\"${safeId}\"] { animation: kb-loop-bounce 1.5s ease-in-out infinite !important; }`,\n );\n break;\n case 'spin':\n rules.push(\n `[data-kubuild-node=\"${safeId}\"] { animation: kb-loop-spin 3s linear infinite !important; }`,\n );\n break;\n case 'float':\n rules.push(\n `[data-kubuild-node=\"${safeId}\"] { animation: kb-loop-float 3s ease-in-out infinite !important; }`,\n );\n break;\n case 'shimmer':\n rules.push(\n `[data-kubuild-node=\"${safeId}\"] { animation: kb-loop-shimmer 2s ease-in-out infinite !important; }`,\n );\n break;\n default:\n break;\n }\n\n return rules;\n}\n\n/**\n * Generate CSS rules for Entrance / Scroll Animations (STORA-263)\n */\nexport function getEntranceAnimationCss(nodeId: string, anim: AnimationConfig): string[] {\n if (!anim.type || anim.type === 'none') return [];\n const safeId = escapeCssIdent(nodeId);\n const duration = typeof anim.duration === 'number' ? anim.duration : 600;\n const delay = typeof anim.delay === 'number' ? anim.delay : 0;\n const easing = anim.easing || 'ease-out';\n\n return [\n `[data-kubuild-node=\"${safeId}\"] { animation-name: kb-anim-${anim.type} !important; animation-duration: ${duration}ms !important; animation-delay: ${delay}ms !important; animation-timing-function: ${easing} !important; animation-fill-mode: both !important; }`,\n ];\n}\n\n/**\n * Walk the document and collect all compiled CSS rules for animations, hover micro-interactions, and loop effects.\n */\nexport function collectAnimationStylesCss(document: PageDocument | undefined | null): string {\n if (!document?.document) return '';\n const rules: string[] = [];\n let hasAnyAnimation = false;\n\n const walk = (node: Node): void => {\n const anim = node.animation;\n if (anim) {\n if (anim.hoverEffect && anim.hoverEffect !== 'none') {\n rules.push(...getHoverEffectCss(node.id, anim.hoverEffect));\n hasAnyAnimation = true;\n }\n if (anim.loopEffect && anim.loopEffect !== 'none') {\n rules.push(...getLoopEffectCss(node.id, anim.loopEffect));\n hasAnyAnimation = true;\n }\n if (anim.type && anim.type !== 'none') {\n rules.push(...getEntranceAnimationCss(node.id, anim));\n hasAnyAnimation = true;\n }\n }\n node.children?.forEach(walk);\n };\n\n walk(document.document);\n\n if (!hasAnyAnimation) return '';\n\n return `${ANIMATION_KEYFRAMES_CSS}\\n\\n${rules.join('\\n')}`;\n}\n\n/**\n * Replay CSS animation on a specific DOM element by node ID (STORA-262)\n */\nexport function replayNodeAnimation(nodeId: string, rootElement?: HTMLElement | Document | null): boolean {\n const root = rootElement || (typeof window !== 'undefined' ? window.document : null);\n if (!root) return false;\n\n const el = root.querySelector(`[data-kubuild-node=\"${escapeCssIdent(nodeId)}\"]`) as HTMLElement | null;\n if (!el) return false;\n\n const currentAnimation = el.style.animation;\n el.style.animation = 'none';\n // Force browser layout reflow to restart CSS keyframe animations\n void el.offsetWidth;\n el.style.animation = currentAnimation;\n\n // Dispatch custom event for observers\n el.dispatchEvent(new CustomEvent('kubuild:replay-animation', { bubbles: true, detail: { nodeId } }));\n return true;\n}\n","import React, { Component, ErrorInfo, ReactNode } from 'react';\nimport { AlertTriangle } from 'lucide-react';\n\nexport interface ComponentErrorBoundaryProps {\n nodeId: string;\n componentType: string;\n mode?: 'editor' | 'runtime';\n children: ReactNode;\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface ComponentErrorBoundaryState {\n hasError: boolean;\n error?: Error;\n}\n\nexport class ComponentErrorBoundary extends Component<\n ComponentErrorBoundaryProps,\n ComponentErrorBoundaryState\n> {\n constructor(props: ComponentErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): ComponentErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n if (this.props.onError) {\n this.props.onError(error, errorInfo);\n }\n }\n\n render(): ReactNode {\n if (this.state.hasError) {\n const { nodeId, componentType, mode = 'runtime' } = this.props;\n const errorMessage = this.state.error?.message || 'Unknown render error';\n\n if (mode === 'editor') {\n return (\n <div\n data-kubuild-node={nodeId}\n data-kubuild-error={componentType}\n style={{\n padding: '12px 16px',\n margin: '4px 0',\n backgroundColor: '#fef2f2',\n border: '1px solid #ef4444',\n borderRadius: '6px',\n color: '#b91c1c',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '13px',\n lineHeight: '1.4',\n }}\n >\n <div style={{ fontWeight: 600, marginBottom: '4px', display: 'flex', alignItems: 'center', gap: '6px' }}>\n <AlertTriangle size={14} aria-hidden=\"true\" />\n <span>Component Render Error: &lt;{componentType}&gt;</span>\n </div>\n <div style={{ fontSize: '11px', color: '#7f1d1d', wordBreak: 'break-all' }}>\n Node ID: <code>{nodeId}</code> — {errorMessage}\n </div>\n </div>\n );\n }\n\n // In runtime mode: render a safe invisible or minimal placeholder to avoid page crash\n return (\n <div\n data-kubuild-node={nodeId}\n data-kubuild-error={componentType}\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n />\n );\n }\n\n return this.props.children;\n }\n}\n","import { Node, isVariableBinding } from '@kubuild/schema';\nimport { ComponentDefinition, ComponentFieldDefinition, primitiveTypeForField } from '@kubuild/components';\nimport { resolveBinding, Diagnostic, RenderContext } from '@kubuild/core';\nimport { resolveVariable } from './render-context';\n\nexport interface ResolvedNodeProps {\n props: Record<string, unknown>;\n diagnostics: Diagnostic[];\n}\n\nfunction emptyValueFor(primitiveType: 'string' | 'number' | 'boolean'): unknown {\n switch (primitiveType) {\n case 'string':\n return '';\n case 'number':\n return 0;\n case 'boolean':\n return false;\n }\n}\n\nfunction resolveBindableField(\n node: Node,\n field: ComponentFieldDefinition,\n definition: ComponentDefinition,\n context: RenderContext | undefined,\n diagnostics: Diagnostic[],\n): unknown {\n const rawValue = node.props?.[field.name];\n const expectedType = primitiveTypeForField(field);\n if (expectedType === undefined || rawValue === undefined) {\n return rawValue;\n }\n\n const fallbackValue = definition.defaultProps?.[field.name] ?? field.defaultValue ?? emptyValueFor(expectedType);\n\n if (isVariableBinding(rawValue)) {\n const outcome = resolveBinding(rawValue, context);\n if (typeof outcome.value === expectedType) {\n return outcome.value;\n }\n diagnostics.push({\n code: 'INCOMPATIBLE_BINDING_TYPE',\n nodeId: node.id,\n propName: field.name,\n expectedType,\n actualType: typeof outcome.value,\n message: `Prop \"${field.name}\" on node \"${node.id}\" expected a ${expectedType} but resolved binding \"${rawValue.key}\" produced a ${typeof outcome.value}.`,\n });\n return fallbackValue;\n }\n\n if (expectedType === 'string' && typeof rawValue === 'string' && rawValue.includes('{{')) {\n return resolveVariable(context, rawValue);\n }\n\n return rawValue;\n}\n\n/**\n * Resolves every binding-compatible prop on a node up front, before the component\n * receives its render props — centralizes what was previously ad hoc per-field\n * `resolveVariable` calls scattered across the renderer switch. Non-bindable\n * fields (select/image/action/json) and fields absent from `propFields` pass\n * through unchanged; validating their static shape remains `validateProps`' job.\n */\nexport function resolvePropsForNode(\n node: Node,\n definition: ComponentDefinition | undefined,\n context: RenderContext | undefined,\n): ResolvedNodeProps {\n const rawProps = node.props || {};\n if (!definition || !definition.propFields || definition.propFields.length === 0) {\n return { props: rawProps, diagnostics: [] };\n }\n\n const diagnostics: Diagnostic[] = [];\n const resolved: Record<string, unknown> = { ...rawProps };\n\n for (const field of definition.propFields) {\n if (primitiveTypeForField(field) === undefined) {\n continue;\n }\n resolved[field.name] = resolveBindableField(node, field, definition, context, diagnostics);\n }\n\n return { props: resolved, diagnostics };\n}\n","import React, { useMemo } from 'react';\nimport { PageDocument } from '@kubuild/schema';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { RenderContext, Diagnostic } from './render-context';\nimport { KubuildRenderer } from './renderer';\n\n/**\n * Standard supported viewport devices\n */\nexport type ViewportDevice = 'desktop' | 'tablet' | 'mobile';\n\n/**\n * Configuration options for a specific viewport device\n */\nexport interface ViewportConfig {\n /** Width in pixels or CSS dimension (e.g. 768, '768px', '100%') */\n width: number | string;\n /** Optional fixed or min height (e.g. 1024, '1024px', '100%') */\n height?: number | string;\n /** Optional minimum width */\n minWidth?: number | string;\n /** Optional maximum width */\n maxWidth?: number | string;\n /** Optional minimum height */\n minHeight?: number | string;\n /** Optional maximum height */\n maxHeight?: number | string;\n /** User-facing label for the viewport */\n label?: string;\n /** Custom CSS aspect ratio (e.g. '16/9', '9/16') */\n aspectRatio?: string;\n /** Scale factor applied to the preview canvas (e.g. 0.8, 1) */\n scale?: number;\n /** Whether the viewport width stretches fluidly up to maxWidth */\n isFluid?: boolean;\n}\n\n/**\n * Configurable host breakpoints for responsive viewport resolution\n */\nexport interface ViewportBreakpoints {\n /** Maximum screen width considered mobile (default: 480) */\n mobile: number;\n /** Maximum screen width considered tablet (default: 768) */\n tablet: number;\n /** Screen width threshold considered desktop (default: 1024) */\n desktop: number;\n}\n\n/**\n * Default viewport device configurations\n */\nexport const DEFAULT_VIEWPORT_CONFIGS: Record<ViewportDevice, ViewportConfig> = Object.freeze({\n desktop: {\n width: '100%',\n maxWidth: '1280px',\n minHeight: '600px',\n label: 'Desktop (1280px)',\n isFluid: true,\n },\n tablet: {\n width: '768px',\n height: '1024px',\n minHeight: '600px',\n label: 'Tablet (768 × 1024)',\n isFluid: false,\n },\n mobile: {\n width: '375px',\n height: '667px',\n minHeight: '500px',\n label: 'Mobile (375 × 667)',\n isFluid: false,\n },\n});\n\n/**\n * Default breakpoint thresholds\n */\nexport const DEFAULT_BREAKPOINTS: ViewportBreakpoints = Object.freeze({\n mobile: 480,\n tablet: 768,\n desktop: 1024,\n});\n\n/**\n * Resolves active viewport device category from a numeric pixel width using host-configurable breakpoints\n */\nexport function resolveViewportFromWidth(\n width: number,\n breakpoints?: Partial<ViewportBreakpoints>,\n): ViewportDevice {\n const resolved = { ...DEFAULT_BREAKPOINTS, ...breakpoints };\n if (width <= resolved.mobile) {\n return 'mobile';\n }\n if (width <= resolved.tablet) {\n return 'tablet';\n }\n return 'desktop';\n}\n\n/**\n * Resolves combined viewport configuration merging defaults with host customizations\n */\nexport function resolveViewportDimensions(\n viewport: ViewportDevice,\n customConfigs?: Partial<Record<ViewportDevice, ViewportConfig>>,\n): ViewportConfig {\n const baseConfig = DEFAULT_VIEWPORT_CONFIGS[viewport] || DEFAULT_VIEWPORT_CONFIGS.desktop;\n const custom = customConfigs?.[viewport];\n return { ...baseConfig, ...custom };\n}\n\n/**\n * Resolves CSS properties for the preview canvas wrapper\n */\nexport function resolveViewportContainerStyle(\n viewport: ViewportDevice,\n customConfigs?: Partial<Record<ViewportDevice, ViewportConfig>>,\n customScale?: number,\n): React.CSSProperties {\n const config = resolveViewportDimensions(viewport, customConfigs);\n const scale = customScale ?? config.scale ?? 1;\n\n const toCssVal = (v?: number | string) => (typeof v === 'number' ? `${v}px` : v);\n\n const style: React.CSSProperties = {\n width: toCssVal(config.width),\n maxWidth: toCssVal(config.maxWidth),\n minWidth: toCssVal(config.minWidth),\n height: toCssVal(config.height),\n minHeight: toCssVal(config.minHeight),\n maxHeight: toCssVal(config.maxHeight),\n aspectRatio: config.aspectRatio,\n transition: 'width 0.2s ease, max-width 0.2s ease, height 0.2s ease',\n };\n\n if (scale !== 1) {\n style.transform = `scale(${scale})`;\n style.transformOrigin = 'top center';\n }\n\n return style;\n}\n\n/**\n * Props for PreviewViewportAdapter\n */\nexport interface PreviewViewportAdapterProps {\n /** The portable Page Document to render (remains immutable) */\n document: PageDocument;\n /** Active viewport device mode */\n viewport?: ViewportDevice;\n /** Callback fired when viewport is changed via built-in chrome controls */\n onViewportChange?: (viewport: ViewportDevice) => void;\n /** Host-configurable dimensions & overrides per viewport device */\n viewportConfigs?: Partial<Record<ViewportDevice, ViewportConfig>>;\n /** Host-configurable breakpoint boundaries */\n breakpoints?: Partial<ViewportBreakpoints>;\n /** Component registry providing renderers & schemas */\n registry?: ComponentRegistry;\n /** Immutable runtime context for variable, asset, & action resolution */\n context?: RenderContext;\n /** Rendering mode: 'runtime' or 'editor' */\n mode?: 'editor' | 'runtime';\n /** Whether to render device frame / chrome toolbar */\n showChrome?: boolean;\n /** Optional custom title displayed on device chrome */\n chromeTitle?: string;\n /** Non-destructive editor overlay slot (selection, bounds, grid, etc.) */\n editorOverlay?: React.ReactNode;\n /** Custom zoom/scale factor */\n scale?: number;\n /** Outer container CSS class */\n className?: string;\n /** Outer container inline styles */\n style?: React.CSSProperties;\n /** Inner canvas container CSS class */\n canvasClassName?: string;\n /** Inner canvas container inline styles */\n canvasStyle?: React.CSSProperties;\n /** Optional click handler for canvas nodes */\n onNodeClick?: (nodeId: string, event: React.MouseEvent) => void;\n /** Optional diagnostic handler for action or render issues */\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n /** Optional action dispatch handler */\n onActionDispatch?: (actionType: string, payload: Record<string, unknown> | undefined, nodeId: string) => void;\n}\n\n/**\n * Preview Viewport Adapter Component\n * \n * Provides an isolated, host-configurable desktop/tablet/mobile preview container that uses\n * the exact same KubuildRenderer and RenderContext as production runtime, differing only in\n * viewport dimensions and optional device chrome/editor overlays.\n */\nexport const PreviewViewportAdapter: React.FC<PreviewViewportAdapterProps> = ({\n document,\n viewport = 'desktop',\n onViewportChange,\n viewportConfigs,\n breakpoints,\n registry,\n context,\n mode = 'runtime',\n showChrome = false,\n chromeTitle,\n editorOverlay,\n scale,\n className,\n style,\n canvasClassName,\n canvasStyle,\n onNodeClick,\n onDiagnostic,\n onActionDispatch,\n}) => {\n const currentConfig = useMemo(\n () => resolveViewportDimensions(viewport, viewportConfigs),\n [viewport, viewportConfigs],\n );\n\n const containerStyle = useMemo(\n () => resolveViewportContainerStyle(viewport, viewportConfigs, scale),\n [viewport, viewportConfigs, scale],\n );\n\n const mergedCanvasStyle: React.CSSProperties = useMemo(\n () => ({\n ...containerStyle,\n ...canvasStyle,\n position: 'relative',\n boxSizing: 'border-box',\n }),\n [containerStyle, canvasStyle],\n );\n\n return (\n <div\n data-kubuild-preview-container\n data-viewport={viewport}\n className={`kubuild-preview-viewport-adapter ${className || ''}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'flex-start',\n width: '100%',\n height: '100%',\n boxSizing: 'border-box',\n ...style,\n }}\n >\n {/* Optional Device Chrome Header */}\n {showChrome && (\n <div\n data-kubuild-preview-chrome\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n maxWidth: containerStyle.maxWidth || containerStyle.width,\n padding: '8px 12px',\n marginBottom: '8px',\n backgroundColor: '#1e293b',\n color: '#f8fafc',\n borderRadius: '8px',\n fontSize: '12px',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n boxSizing: 'border-box',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span style={{ fontWeight: 600 }}>\n {chromeTitle || document.metadata?.title || 'Preview'}\n </span>\n <span\n data-testid=\"viewport-badge\"\n style={{\n fontSize: '10px',\n padding: '2px 6px',\n borderRadius: '4px',\n backgroundColor: '#334155',\n color: '#94a3b8',\n textTransform: 'uppercase',\n fontWeight: 700,\n }}\n >\n {viewport}\n </span>\n <span style={{ fontSize: '11px', color: '#64748b' }}>\n {currentConfig.label || `${currentConfig.width} × ${currentConfig.height || 'auto'}`}\n </span>\n </div>\n\n {onViewportChange && (\n <div\n data-testid=\"viewport-switcher\"\n style={{ display: 'flex', gap: '4px', backgroundColor: '#0f172a', padding: '2px', borderRadius: '6px' }}\n >\n {(['desktop', 'tablet', 'mobile'] as ViewportDevice[]).map((device) => {\n const isActive = viewport === device;\n return (\n <button\n key={device}\n type=\"button\"\n data-testid={`viewport-btn-${device}`}\n onClick={() => onViewportChange(device)}\n style={{\n padding: '4px 10px',\n fontSize: '11px',\n fontWeight: 500,\n borderRadius: '4px',\n border: 'none',\n cursor: 'pointer',\n textTransform: 'capitalize',\n backgroundColor: isActive ? '#3b82f6' : 'transparent',\n color: isActive ? '#ffffff' : '#94a3b8',\n transition: 'all 0.15s ease',\n }}\n >\n {device}\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n\n {/* Responsive Canvas Frame */}\n <div\n data-kubuild-preview-canvas\n data-viewport={viewport}\n className={`kubuild-preview-canvas ${canvasClassName || ''}`}\n style={mergedCanvasStyle}\n >\n {/* Core Document Renderer */}\n <KubuildRenderer\n document={document}\n registry={registry}\n context={context}\n viewport={viewport}\n mode={mode}\n onNodeClick={onNodeClick}\n onDiagnostic={onDiagnostic}\n onActionDispatch={onActionDispatch}\n />\n\n {/* Non-destructive Editor Overlay Slot */}\n {editorOverlay && (\n <div\n data-kubuild-preview-overlay\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n zIndex: 10,\n }}\n >\n {editorOverlay}\n </div>\n )}\n </div>\n </div>\n );\n};\n\n/**\n * Alias for PreviewViewportAdapter\n */\nexport const KubuildPreviewViewport = PreviewViewportAdapter;\n","import { PageDocument, Node } from '@kubuild/schema';\nimport { DEFAULT_CSS_RESET, styleDefinitionToCssDeclarations } from './styles';\nimport { collectAnimationStylesCss } from './animation';\n\nexport interface GenerateHtmlOptions {\n /**\n * Whether to include internal node ID classes (`kb-node-{id}`).\n * Defaults to true so generated CSS matches HTML elements.\n */\n includeNodeClasses?: boolean;\n /**\n * Indentation width in spaces. Defaults to 2.\n */\n indentSize?: number;\n /**\n * Root tag for the page container ('main' | 'div'). Defaults to 'main'.\n */\n rootTag?: 'main' | 'div';\n}\n\nexport interface GenerateCssOptions {\n /**\n * Whether to include the baseline CSS reset. Defaults to true.\n */\n includeReset?: boolean;\n /**\n * Custom CSS class prefix for node selectors. Defaults to 'kb-node-'.\n */\n classPrefix?: string;\n}\n\nexport interface StandaloneHtmlOptions {\n htmlOptions?: GenerateHtmlOptions;\n cssOptions?: GenerateCssOptions;\n /** Custom language attribute for <html>. Defaults to 'en'. */\n lang?: string;\n}\n\nfunction escapeHtml(str: unknown): string {\n if (str === null || str === undefined) return '';\n return String(str)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\nfunction escapeAttr(str: unknown): string {\n return escapeHtml(str);\n}\n\nfunction getYouTubeId(url: string): string | null {\n if (!url || typeof url !== 'string') return null;\n const match = url.match(\n /(?:youtube\\.com\\/(?:[^\\/]+\\/.+\\/|(?:v|e(?:mbed)?)\\/|.*[?&]v=)|youtu\\.be\\/)([^\"&?\\/\\s]{11})/i,\n );\n return match ? match[1] : null;\n}\n\nfunction getVimeoId(url: string): string | null {\n if (!url || typeof url !== 'string') return null;\n const match = url.match(\n /(?:vimeo\\.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^\\/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|video\\/|))(\\d+)/i,\n );\n return match ? match[3] : null;\n}\n\n/**\n * Recursively generates clean, indented semantic HTML markup for a node tree.\n */\nfunction renderNodeToHtml(node: Node, indentLevel: number, options: GenerateHtmlOptions): string {\n const indent = ' '.repeat(indentLevel * (options.indentSize ?? 2));\n const innerIndent = ' '.repeat((indentLevel + 1) * (options.indentSize ?? 2));\n const props = node.props || {};\n const children = node.children || [];\n const includeNodeClass = options.includeNodeClasses !== false;\n const nodeClass = includeNodeClass ? `kb-node-${node.id}` : '';\n\n const buildClass = (...classes: (string | undefined | false)[]) => {\n return classes.filter(Boolean).join(' ');\n };\n\n const idAttr = props.id ? ` id=\"${escapeAttr(props.id)}\"` : '';\n\n switch (node.type) {\n case 'page': {\n const tag = options.rootTag || 'main';\n const cls = buildClass('kb-page', nodeClass);\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n if (!childHtml) {\n return `${indent}<${tag} class=\"${cls}\"${idAttr}></${tag}>`;\n }\n return `${indent}<${tag} class=\"${cls}\"${idAttr}>\\n${childHtml}\\n${indent}</${tag}>`;\n }\n\n case 'section': {\n const ariaLabel = props.ariaLabel ? ` aria-label=\"${escapeAttr(props.ariaLabel)}\"` : '';\n const cls = buildClass('kb-section', nodeClass);\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n if (!childHtml) {\n return `${indent}<section class=\"${cls}\"${idAttr}${ariaLabel}></section>`;\n }\n return `${indent}<section class=\"${cls}\"${idAttr}${ariaLabel}>\\n${childHtml}\\n${indent}</section>`;\n }\n\n case 'container': {\n const cls = buildClass('kb-container', nodeClass);\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n if (!childHtml) {\n return `${indent}<div class=\"${cls}\"${idAttr}></div>`;\n }\n return `${indent}<div class=\"${cls}\"${idAttr}>\\n${childHtml}\\n${indent}</div>`;\n }\n\n case 'columns': {\n const cls = buildClass('kb-columns', nodeClass);\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n if (!childHtml) {\n return `${indent}<div class=\"${cls}\"${idAttr}></div>`;\n }\n return `${indent}<div class=\"${cls}\"${idAttr}>\\n${childHtml}\\n${indent}</div>`;\n }\n\n case 'heading': {\n let level = 'h2';\n if (typeof props.level === 'string' && /^h[1-6]$/i.test(props.level)) {\n level = props.level.toLowerCase();\n } else if (typeof props.level === 'number' && props.level >= 1 && props.level <= 6) {\n level = `h${props.level}`;\n } else if (typeof props.tag === 'string' && /^h[1-6]$/i.test(props.tag)) {\n level = props.tag.toLowerCase();\n }\n const text = props.text ?? props.value ?? props.content ?? 'Heading';\n const cls = buildClass('kb-heading', nodeClass);\n return `${indent}<${level} class=\"${cls}\"${idAttr}>${escapeHtml(text)}</${level}>`;\n }\n\n case 'paragraph': {\n const text = props.text ?? props.value ?? props.content ?? '';\n const cls = buildClass('kb-paragraph', nodeClass);\n return `${indent}<p class=\"${cls}\"${idAttr}>${escapeHtml(text)}</p>`;\n }\n\n case 'text': {\n const tag = (props.as as string) || 'p';\n const text = props.text ?? props.value ?? props.content ?? '';\n const cls = buildClass('kb-text', nodeClass);\n return `${indent}<${tag} class=\"${cls}\"${idAttr}>${escapeHtml(text)}</${tag}>`;\n }\n\n case 'link': {\n const href = props.href ? ` href=\"${escapeAttr(props.href)}\"` : ' href=\"#\"';\n const target = props.target ? ` target=\"${escapeAttr(props.target)}\"` : '';\n const rel = props.rel ? ` rel=\"${escapeAttr(props.rel)}\"` : target.includes('_blank') ? ' rel=\"noopener noreferrer\"' : '';\n const text = props.text ?? props.label ?? props.value;\n const cls = buildClass('kb-link', nodeClass);\n\n if (children.length > 0) {\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n return `${indent}<a class=\"${cls}\"${idAttr}${href}${target}${rel}>\\n${childHtml}\\n${indent}</a>`;\n }\n return `${indent}<a class=\"${cls}\"${idAttr}${href}${target}${rel}>${escapeHtml(text ?? 'Link')}</a>`;\n }\n\n case 'blockquote': {\n const cite = props.cite ? ` cite=\"${escapeAttr(props.cite)}\"` : '';\n const quote = props.quote ?? props.text ?? props.value;\n const author = props.author ?? props.citeAuthor;\n const cls = buildClass('kb-blockquote', nodeClass);\n\n if (quote || author) {\n const quoteHtml = quote ? `${innerIndent}<p>${escapeHtml(quote)}</p>` : '';\n const authorHtml = author ? `${innerIndent}<cite>${escapeHtml(author)}</cite>` : '';\n const parts = [quoteHtml, authorHtml].filter(Boolean).join('\\n');\n return `${indent}<blockquote class=\"${cls}\"${idAttr}${cite}>\\n${parts}\\n${indent}</blockquote>`;\n }\n\n if (children.length > 0) {\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n return `${indent}<blockquote class=\"${cls}\"${idAttr}${cite}>\\n${childHtml}\\n${indent}</blockquote>`;\n }\n return `${indent}<blockquote class=\"${cls}\"${idAttr}${cite}></blockquote>`;\n }\n\n case 'badge': {\n const text = props.text ?? props.label ?? props.value ?? 'Badge';\n const cls = buildClass('kb-badge', nodeClass);\n return `${indent}<span class=\"${cls}\"${idAttr}>${escapeHtml(text)}</span>`;\n }\n\n case 'code-block': {\n const code = props.code ?? props.text ?? props.value ?? '';\n const lang = props.language || props.lang;\n const langClass = lang ? ` class=\"language-${escapeAttr(lang)}\"` : '';\n const cls = buildClass('kb-code-block', nodeClass);\n return `${indent}<pre class=\"${cls}\"${idAttr}><code${langClass}>${escapeHtml(code)}</code></pre>`;\n }\n\n case 'divider': {\n const cls = buildClass('kb-divider', nodeClass);\n const text = props.text ?? props.label;\n if (text) {\n return `${indent}<div class=\"${cls}\"${idAttr} role=\"separator\"><span>${escapeHtml(text)}</span></div>`;\n }\n return `${indent}<hr class=\"${cls}\"${idAttr} />`;\n }\n\n case 'spacer': {\n const cls = buildClass('kb-spacer', nodeClass);\n return `${indent}<div class=\"${cls}\"${idAttr} aria-hidden=\"true\"></div>`;\n }\n\n case 'image': {\n const src = props.src ? ` src=\"${escapeAttr(props.src)}\"` : ' src=\"\"';\n const alt = props.alt ? ` alt=\"${escapeAttr(props.alt)}\"` : ' alt=\"\"';\n const loading = props.loading ? ` loading=\"${escapeAttr(props.loading)}\"` : ' loading=\"lazy\"';\n const cls = buildClass('kb-image', nodeClass);\n return `${indent}<img class=\"${cls}\"${idAttr}${src}${alt}${loading} />`;\n }\n\n case 'video': {\n const src = (props.src as string) || '';\n const ytId = getYouTubeId(src);\n const vmId = getVimeoId(src);\n const cls = buildClass('kb-video', nodeClass);\n\n if (ytId) {\n return `${indent}<div class=\"kb-video-wrapper ${nodeClass}\"${idAttr}>\\n${innerIndent}<iframe src=\"https://www.youtube-nocookie.com/embed/${escapeAttr(ytId)}\" title=\"${escapeAttr(props.title || 'Video player')}\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>\\n${indent}</div>`;\n }\n if (vmId) {\n return `${indent}<div class=\"kb-video-wrapper ${nodeClass}\"${idAttr}>\\n${innerIndent}<iframe src=\"https://player.vimeo.com/video/${escapeAttr(vmId)}\" title=\"${escapeAttr(props.title || 'Video player')}\" frameborder=\"0\" allow=\"autoplay; fullscreen; picture-in-picture\" allowfullscreen></iframe>\\n${indent}</div>`;\n }\n\n const poster = props.poster ? ` poster=\"${escapeAttr(props.poster)}\"` : '';\n const controls = props.controls !== false ? ' controls' : '';\n const autoplay = props.autoplay ? ' autoplay' : '';\n const loop = props.loop ? ' loop' : '';\n const muted = props.muted ? ' muted' : '';\n const videoSrc = src ? ` src=\"${escapeAttr(src)}\"` : '';\n return `${indent}<video class=\"${cls}\"${idAttr}${videoSrc}${poster}${controls}${autoplay}${loop}${muted}></video>`;\n }\n\n case 'icon': {\n const name = props.name || props.icon || 'star';\n const ariaLabel = props.ariaLabel ? ` aria-label=\"${escapeAttr(props.ariaLabel)}\"` : ' aria-hidden=\"true\"';\n const cls = buildClass('kb-icon', nodeClass);\n return `${indent}<span class=\"${cls}\"${idAttr}${ariaLabel} data-icon=\"${escapeAttr(name)}\"></span>`;\n }\n\n case 'html-embed': {\n const rawHtml = (props.html ?? props.content ?? '') as string;\n const cls = buildClass('kb-html-embed', nodeClass);\n if (!rawHtml) {\n return `${indent}<div class=\"${cls}\"${idAttr}></div>`;\n }\n return `${indent}<div class=\"${cls}\"${idAttr}>\\n${innerIndent}${rawHtml}\\n${indent}</div>`;\n }\n\n case 'button': {\n const label = props.label ?? props.text ?? props.value ?? 'Button';\n const type = props.type ? ` type=\"${escapeAttr(props.type)}\"` : ' type=\"button\"';\n const disabled = props.disabled ? ' disabled' : '';\n const cls = buildClass('kb-button', nodeClass);\n\n if (props.href) {\n const href = ` href=\"${escapeAttr(props.href)}\"`;\n const target = props.target ? ` target=\"${escapeAttr(props.target)}\"` : '';\n return `${indent}<a class=\"${cls}\"${idAttr}${href}${target}>${escapeHtml(label)}</a>`;\n }\n\n return `${indent}<button class=\"${cls}\"${idAttr}${type}${disabled}>${escapeHtml(label)}</button>`;\n }\n\n case 'form': {\n const action = props.action ? ` action=\"${escapeAttr(props.action)}\"` : '';\n const method = props.method ? ` method=\"${escapeAttr(props.method)}\"` : ' method=\"POST\"';\n const cls = buildClass('kb-form', nodeClass);\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n if (!childHtml) {\n return `${indent}<form class=\"${cls}\"${idAttr}${action}${method}></form>`;\n }\n return `${indent}<form class=\"${cls}\"${idAttr}${action}${method}>\\n${childHtml}\\n${indent}</form>`;\n }\n\n case 'input': {\n const type = props.type ? ` type=\"${escapeAttr(props.type)}\"` : ' type=\"text\"';\n const name = props.name ? ` name=\"${escapeAttr(props.name)}\"` : '';\n const placeholder = props.placeholder ? ` placeholder=\"${escapeAttr(props.placeholder)}\"` : '';\n const value = props.value !== undefined ? ` value=\"${escapeAttr(props.value)}\"` : '';\n const required = props.required ? ' required' : '';\n const disabled = props.disabled ? ' disabled' : '';\n const cls = buildClass('kb-input', nodeClass);\n return `${indent}<input class=\"${cls}\"${idAttr}${type}${name}${placeholder}${value}${required}${disabled} />`;\n }\n\n case 'textarea': {\n const name = props.name ? ` name=\"${escapeAttr(props.name)}\"` : '';\n const placeholder = props.placeholder ? ` placeholder=\"${escapeAttr(props.placeholder)}\"` : '';\n const rows = props.rows ? ` rows=\"${escapeAttr(props.rows)}\"` : ' rows=\"4\"';\n const value = props.value ?? props.defaultValue ?? '';\n const required = props.required ? ' required' : '';\n const disabled = props.disabled ? ' disabled' : '';\n const cls = buildClass('kb-textarea', nodeClass);\n return `${indent}<textarea class=\"${cls}\"${idAttr}${name}${placeholder}${rows}${required}${disabled}>${escapeHtml(value)}</textarea>`;\n }\n\n case 'select': {\n const name = props.name ? ` name=\"${escapeAttr(props.name)}\"` : '';\n const required = props.required ? ' required' : '';\n const disabled = props.disabled ? ' disabled' : '';\n const cls = buildClass('kb-select', nodeClass);\n const optionsList = Array.isArray(props.options) ? props.options : [];\n const optionIndent = ' '.repeat((indentLevel + 1) * (options.indentSize ?? 2));\n\n const optionsHtml = optionsList\n .map((opt: any) => {\n const optVal = typeof opt === 'object' ? opt.value : opt;\n const optLabel = typeof opt === 'object' ? opt.label : opt;\n const selected = props.value === optVal || props.defaultValue === optVal ? ' selected' : '';\n return `${optionIndent}<option value=\"${escapeAttr(optVal)}\"${selected}>${escapeHtml(optLabel)}</option>`;\n })\n .join('\\n');\n\n if (!optionsHtml) {\n return `${indent}<select class=\"${cls}\"${idAttr}${name}${required}${disabled}></select>`;\n }\n return `${indent}<select class=\"${cls}\"${idAttr}${name}${required}${disabled}>\\n${optionsHtml}\\n${indent}</select>`;\n }\n\n case 'checkbox': {\n const name = props.name ? ` name=\"${escapeAttr(props.name)}\"` : '';\n const checked = props.checked || props.defaultChecked ? ' checked' : '';\n const label = props.label ?? props.text ?? '';\n const cls = buildClass('kb-checkbox-label', nodeClass);\n return `${indent}<label class=\"${cls}\"${idAttr}><input type=\"checkbox\"${name}${checked} /><span>${escapeHtml(label)}</span></label>`;\n }\n\n case 'radio': {\n const name = props.name ? ` name=\"${escapeAttr(props.name)}\"` : '';\n const value = props.value ? ` value=\"${escapeAttr(props.value)}\"` : '';\n const checked = props.checked || props.defaultChecked ? ' checked' : '';\n const label = props.label ?? props.text ?? '';\n const cls = buildClass('kb-radio-label', nodeClass);\n return `${indent}<label class=\"${cls}\"${idAttr}><input type=\"radio\"${name}${value}${checked} /><span>${escapeHtml(label)}</span></label>`;\n }\n\n case 'list': {\n const tag = props.tag === 'ol' || props.type === 'ol' || props.ordered ? 'ol' : 'ul';\n const cls = buildClass('kb-list', nodeClass);\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n if (!childHtml) {\n return `${indent}<${tag} class=\"${cls}\"${idAttr}></${tag}>`;\n }\n return `${indent}<${tag} class=\"${cls}\"${idAttr}>\\n${childHtml}\\n${indent}</${tag}>`;\n }\n\n case 'list-item': {\n const text = props.text ?? props.value;\n const cls = buildClass('kb-list-item', nodeClass);\n if (children.length > 0) {\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n return `${indent}<li class=\"${cls}\"${idAttr}>\\n${childHtml}\\n${indent}</li>`;\n }\n return `${indent}<li class=\"${cls}\"${idAttr}>${escapeHtml(text ?? 'List item')}</li>`;\n }\n\n case 'table': {\n const cls = buildClass('kb-table', nodeClass);\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n if (!childHtml) {\n return `${indent}<table class=\"${cls}\"${idAttr}></table>`;\n }\n return `${indent}<table class=\"${cls}\"${idAttr}>\\n${childHtml}\\n${indent}</table>`;\n }\n\n case 'table-row': {\n const cls = buildClass('kb-table-row', nodeClass);\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n if (!childHtml) {\n return `${indent}<tr class=\"${cls}\"${idAttr}></tr>`;\n }\n return `${indent}<tr class=\"${cls}\"${idAttr}>\\n${childHtml}\\n${indent}</tr>`;\n }\n\n case 'table-cell': {\n const isHeader = props.isHeader || props.type === 'header' || props.tag === 'th';\n const tag = isHeader ? 'th' : 'td';\n const colSpan = props.colSpan && Number(props.colSpan) > 1 ? ` colspan=\"${escapeAttr(props.colSpan)}\"` : '';\n const rowSpan = props.rowSpan && Number(props.rowSpan) > 1 ? ` rowspan=\"${escapeAttr(props.rowSpan)}\"` : '';\n const text = props.text ?? props.value ?? '';\n const cls = buildClass('kb-table-cell', nodeClass);\n\n if (children.length > 0) {\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n return `${indent}<${tag} class=\"${cls}\"${idAttr}${colSpan}${rowSpan}>\\n${childHtml}\\n${indent}</${tag}>`;\n }\n return `${indent}<${tag} class=\"${cls}\"${idAttr}${colSpan}${rowSpan}>${escapeHtml(text)}</${tag}>`;\n }\n\n case 'collection': {\n const cls = buildClass('kb-collection', nodeClass);\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n if (!childHtml) {\n return `${indent}<div class=\"${cls}\"${idAttr}></div>`;\n }\n return `${indent}<div class=\"${cls}\"${idAttr}>\\n${childHtml}\\n${indent}</div>`;\n }\n\n default: {\n const cls = buildClass(`kb-${node.type}`, nodeClass);\n const childHtml = children\n .map((child) => renderNodeToHtml(child, indentLevel + 1, options))\n .join('\\n');\n if (!childHtml) {\n return `${indent}<div class=\"${cls}\"${idAttr}></div>`;\n }\n return `${indent}<div class=\"${cls}\"${idAttr}>\\n${childHtml}\\n${indent}</div>`;\n }\n }\n}\n\n/**\n * Generates a clean, formatted semantic HTML string for a PageDocument or Node.\n */\nexport function generateSemanticHtml(\n docOrNode: PageDocument | Node,\n options: GenerateHtmlOptions = {},\n): string {\n const rootNode = 'document' in docOrNode ? docOrNode.document : docOrNode;\n if (!rootNode) return '';\n return renderNodeToHtml(rootNode, 0, options);\n}\n\n/**\n * Format a set of CSS property-value declarations into indented multi-line CSS block.\n */\nfunction formatCssRule(selector: string, declarationsStr: string, indent = ''): string {\n if (!declarationsStr.trim()) return '';\n const rules = declarationsStr\n .split(';')\n .map((r) => r.trim())\n .filter(Boolean);\n if (rules.length === 0) return '';\n\n const indentedRules = rules.map((r) => `${indent} ${r};`).join('\\n');\n return `${indent}${selector} {\\n${indentedRules}\\n${indent}}`;\n}\n\n/**\n * Generates structured, readable CSS for the given document, compiling\n * base styles, responsive breakpoints (tablet/mobile), and pseudo-classes.\n */\nexport function generateDocumentCss(\n docOrNode: PageDocument | Node,\n options: GenerateCssOptions = {},\n): string {\n const rootNode = 'document' in docOrNode ? docOrNode.document : docOrNode;\n if (!rootNode) return '';\n\n const classPrefix = options.classPrefix || 'kb-node-';\n const baseRules: string[] = [];\n const tabletRules: string[] = [];\n const mobileRules: string[] = [];\n const stateRules: string[] = [];\n\n const walk = (node: Node) => {\n const selector = `.${classPrefix}${node.id}`;\n\n // Base & Desktop styles\n if (node.styles) {\n const baseStyles = {\n ...(node.styles.base || {}),\n ...(node.styles.desktop || {}),\n };\n const baseDecls = styleDefinitionToCssDeclarations(baseStyles);\n if (baseDecls) {\n baseRules.push(formatCssRule(selector, baseDecls));\n }\n\n // Tablet styles\n if (node.styles.tablet) {\n const tabletDecls = styleDefinitionToCssDeclarations(node.styles.tablet);\n if (tabletDecls) {\n tabletRules.push(formatCssRule(selector, tabletDecls, ' '));\n }\n }\n\n // Mobile styles\n if (node.styles.mobile) {\n const mobileDecls = styleDefinitionToCssDeclarations(node.styles.mobile);\n if (mobileDecls) {\n mobileRules.push(formatCssRule(selector, mobileDecls, ' '));\n }\n }\n\n // Pseudo-state styles (e.g. :hover, :focus, :active)\n if (node.styles.states && typeof node.styles.states === 'object') {\n for (const [state, styleDef] of Object.entries(node.styles.states)) {\n if (!styleDef) continue;\n const safeState = /^::?[a-zA-Z-]+$/.test(state) ? state : null;\n if (!safeState) continue;\n const stateDecls = styleDefinitionToCssDeclarations(styleDef as Record<string, unknown>);\n if (stateDecls) {\n stateRules.push(formatCssRule(`${selector}${safeState}`, stateDecls));\n }\n }\n }\n }\n\n node.children?.forEach(walk);\n };\n\n walk(rootNode);\n\n const sections: string[] = [];\n\n // Reset\n if (options.includeReset !== false) {\n sections.push(`/* ==========================================================================\\n Baseline Reset & Typography Standards\\n ========================================================================== */\\n${DEFAULT_CSS_RESET}`);\n }\n\n // Base Styles\n if (baseRules.length > 0) {\n sections.push(`/* ==========================================================================\\n Component Styles\\n ========================================================================== */\\n${baseRules.join('\\n\\n')}`);\n }\n\n // Interactive / Pseudo-States\n if (stateRules.length > 0) {\n sections.push(`/* ==========================================================================\\n Interactive & Hover States\\n ========================================================================== */\\n${stateRules.join('\\n\\n')}`);\n }\n\n // Tablet Media Query\n if (tabletRules.length > 0) {\n sections.push(`/* ==========================================================================\\n Tablet Breakpoint (max-width: 1024px)\\n ========================================================================== */\\n@media (max-width: 1024px) {\\n${tabletRules.join('\\n\\n')}\\n}`);\n }\n\n // Mobile Media Query\n if (mobileRules.length > 0) {\n sections.push(`/* ==========================================================================\\n Mobile Breakpoint (max-width: 640px)\\n ========================================================================== */\\n@media (max-width: 640px) {\\n${mobileRules.join('\\n\\n')}\\n}`);\n }\n\n // Animation & Motion Styles (STORA-264)\n const pageDoc: PageDocument = 'document' in docOrNode\n ? docOrNode\n : { schema: 'stora.page', version: '1.0.0', document: rootNode as any };\n const animStyles = collectAnimationStylesCss(pageDoc);\n if (animStyles) {\n sections.push(`/* ==========================================================================\\n Animations & Motion Keyframes\\n ========================================================================== */\\n${animStyles}`);\n }\n\n return sections.join('\\n\\n');\n}\n\n/**\n * Generates a complete, standalone, production-ready HTML document string\n * with metadata, responsive viewport tags, embedded stylesheet, and semantic body markup.\n */\nexport function generateStandaloneHtml(\n doc: PageDocument,\n options: StandaloneHtmlOptions = {},\n): string {\n const title = escapeHtml(doc.metadata?.title || 'KUBUILD Page');\n const description = doc.metadata?.description ? escapeAttr(doc.metadata.description) : '';\n const author = doc.metadata?.author ? escapeAttr(doc.metadata.author) : '';\n const lang = options.lang || 'en';\n\n const css = generateDocumentCss(doc, options.cssOptions);\n const html = generateSemanticHtml(doc, options.htmlOptions);\n\n const metaDescription = description ? ` <meta name=\"description\" content=\"${description}\">\\n` : '';\n const metaAuthor = author ? ` <meta name=\"author\" content=\"${author}\">\\n` : '';\n\n return `<!DOCTYPE html>\n<html lang=\"${lang}\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${title}</title>\n${metaDescription}${metaAuthor} <style>\n${css}\n </style>\n</head>\n<body>\n${html}\n</body>\n</html>`;\n}\n"],"mappings":"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","names":["import_react","import_schema","import_components","import_core","import_lucide_react","escapeCssIdent","import_react","import_jsx_runtime","import_schema","import_core","import_jsx_runtime","content","lucideIcons","import_react","import_jsx_runtime","getYouTubeId","getVimeoId"]}