meno-core 1.0.38 → 1.0.39

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,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../lib/client/core/ComponentBuilder.ts", "../../../lib/client/ErrorBoundary.tsx", "../../../lib/client/InteractiveStylesRegistry.ts", "../../../lib/client/responsiveStyleResolver.ts", "../../../lib/client/styles/UtilityClassCollector.ts", "../../../lib/client/i18nConfigService.ts", "../../../lib/client/core/cmsTemplateProcessor.ts", "../../../lib/client/core/builders/embedBuilder.ts", "../../../lib/client/core/builders/linkNodeBuilder.ts", "../../../lib/client/core/builders/localeListBuilder.ts", "../../../lib/client/core/builders/listBuilder.ts", "../../../lib/client/core/builders/linkBuilder.ts", "../../../lib/client/navigation.ts", "../../../lib/client/core/ComponentRenderer.tsx", "../../../lib/client/routing/Router.tsx", "../../../lib/client/routing/RouteLoader.ts", "../../../lib/client/hydration/HydrationUtils.ts", "../../../lib/client/hmr/HMRManager.tsx", "../../../lib/client/hmrWebSocket.ts", "../../../lib/client/elementRegistry.ts", "../../../lib/client/componentRegistry.ts", "../../../lib/client/styles/StyleInjector.ts", "../../../lib/client/scripts/ScriptExecutor.ts", "../../../lib/client/services/PrefetchService.ts", "../../../lib/client/ClientInitializer.ts", "../../../lib/client/theme.ts", "../../../lib/client/contexts/ThemeContext.tsx", "../../../lib/client/hooks/useColorVariables.ts", "../../../lib/client/styleProcessor.ts", "../../../lib/client/hooks/usePropertyAutocomplete.ts", "../../../lib/client/hooks/useVariables.ts"],
4
- "sourcesContent": ["/**\n * Component Builder\n * Builds React elements from component tree nodes with support for custom components,\n * responsive styles, event handlers, and element registration.\n */\n\nimport { createElement as h, Fragment } from \"react\";\nimport type { ReactElement } from \"react\";\n\n// Component registry and utilities\nimport { ComponentRegistry } from \"../componentRegistry\";\nimport { processStructure } from \"../templateEngine\";\nimport { NODE_TYPE } from \"../../shared/constants\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport type { ComponentNode, StyleValue } from \"../../shared/types\";\nimport { isComponentNode, extractNodeProperties, isSlotMarker, isEmbedNode, isLinkNode, isLocaleListNode, isListNode, markAsSlotContent, evaluateNodeIf, isBooleanMapping } from \"../../shared/nodeUtils\";\nimport { mergeNodeStyles } from \"../../shared/styleNodeUtils\";\nimport { isCurrentLink } from \"../../shared/linkUtils\";\nimport { extractAttributesFromNode, skipEmptyTemplateAttributes } from \"../../shared/attributeNodeUtils\";\nimport { resolvePropsFromDefinition } from \"../../shared/propResolver\";\nimport { ElementRegistry } from \"../elementRegistry\";\nimport { InteractiveStylesRegistry } from \"../InteractiveStylesRegistry\";\nimport type { Path } from \"../../shared/pathArrayUtils\";\nimport type { I18nConfig } from \"../../shared/types/components\";\nimport type { ItemContext, TemplateContext } from \"../../shared/types/cms\";\nimport { processItemTemplate, processItemPropsTemplate, hasItemTemplates, type ValueResolver } from \"../../shared/itemTemplateUtils\";\nimport { DEFAULT_I18N_CONFIG, resolveI18nValue } from \"../../shared/i18n\";\nimport { getChildPath, pathToString } from \"../../shared/pathArrayUtils\";\nimport { responsiveStylesToClasses } from \"../../shared/utilityClassMapper\";\nimport { UtilityClassCollector } from \"../styles/UtilityClassCollector\";\nimport { processCMSTemplate, processCMSPropsTemplate, RAW_HTML_PREFIX } from \"./cmsTemplateProcessor\";\nimport type { PrefetchService } from \"../services/PrefetchService\";\nimport { generateElementClassName, type ElementClassContext } from \"../../shared/elementClassName\";\nimport type { InteractiveStyles } from \"../../shared/types/styles\";\nimport { extractInteractiveStyleMappings, resolveExtractedMappings, hasInteractiveStyleMappings } from \"../../shared/interactiveStyleMappings\";\n\n// Extracted builders\nimport {\n type BuildChildrenContext,\n type BuildComponentOptions,\n type BuildResult,\n type BuilderContext,\n buildEmbed,\n buildLinkNode,\n buildLocaleList,\n buildList,\n buildLink,\n} from \"./builders\";\n\ntype ComponentProps = Record<string, unknown>;\n\nexport interface ComponentBuilderConfig {\n componentRegistry: ComponentRegistry;\n elementRegistry: ElementRegistry;\n /** Optional prefetch service for link prefetching (production only) */\n prefetchService?: PrefetchService;\n /** Optional getter for current page name (for interactive styles class generation) */\n getCurrentPageName?: () => string;\n /** Optional getter for current file type (for interactive styles class generation) */\n getCurrentFileType?: () => 'page' | 'component';\n /** Optional getter for current page URL path (for is-current class on link nodes) */\n getCurrentPagePath?: () => string;\n}\n\n// Re-export types for backward compatibility\nexport type { BuildChildrenContext, BuildComponentOptions };\n\n/**\n * ComponentBuilder class for building React elements from component tree nodes\n */\nexport class ComponentBuilder {\n private componentRegistry: ComponentRegistry;\n private elementRegistry: ElementRegistry;\n private prefetchService?: PrefetchService;\n private getCurrentPageName?: () => string;\n private getCurrentFileType?: () => 'page' | 'component';\n private getCurrentPagePath?: () => string;\n // Cache for utility classes computed from style objects (avoids recomputation for same styles)\n private styleClassCache: WeakMap<object, string[]> = new WeakMap();\n\n constructor(config: ComponentBuilderConfig) {\n this.componentRegistry = config.componentRegistry;\n this.elementRegistry = config.elementRegistry;\n this.prefetchService = config.prefetchService;\n this.getCurrentPageName = config.getCurrentPageName;\n this.getCurrentFileType = config.getCurrentFileType;\n this.getCurrentPagePath = config.getCurrentPagePath;\n }\n\n /**\n * Get cached utility classes for a style object\n */\n private getCachedStyleClasses(style: object): string[] {\n let cached = this.styleClassCache.get(style);\n if (!cached) {\n cached = responsiveStylesToClasses(style as any);\n this.styleClassCache.set(style, cached);\n }\n UtilityClassCollector.collect(cached);\n return cached;\n }\n\n /**\n * Helper function to create onClick handlers from JSON-defined onClick values\n */\n private createOnClickHandler(onClickValue: unknown): () => void {\n return () => {\n alert(String(onClickValue));\n };\n }\n\n /**\n * Determines the parent component name for nested component instances.\n */\n private getParentComponentNameForNestedComponent(\n componentContext: string | null,\n parentComponentName: string | null,\n componentName: string | null\n ): string | null {\n return componentContext || parentComponentName || componentName || null;\n }\n\n /**\n * Determines the effective parent component name when building children.\n */\n private getEffectiveParentComponentName(\n componentContext: string | null,\n parentComponentName: string | null\n ): string | null {\n return componentContext || parentComponentName;\n }\n\n /**\n * Evaluate the if condition on a node with full context.\n * Handles boolean, mapping, and string template values.\n * Returns true if node should be rendered, false if it should be skipped.\n */\n private evaluateIfCondition(node: ComponentNode, ctx: BuilderContext): boolean {\n const ifValue = (node as any).if;\n\n // No if property = render (default true)\n if (ifValue === undefined) {\n return true;\n }\n\n // Boolean value\n if (typeof ifValue === 'boolean') {\n return ifValue;\n }\n\n // Mapping value - resolve using component props\n if (isBooleanMapping(ifValue)) {\n const props = ctx.componentResolvedProps || {};\n const propValue = props[ifValue.prop];\n const mappedValue = ifValue.values[String(propValue)];\n // If no mapping found for this prop value, default to true\n return mappedValue !== undefined ? Boolean(mappedValue) : true;\n }\n\n // String template - resolve using CMS or item context\n if (typeof ifValue === 'string') {\n let resolved: string = ifValue;\n\n // Process CMS templates\n if (ctx.cmsContext && resolved.includes('{{cms.')) {\n resolved = processCMSTemplate(resolved, ctx.cmsContext, ctx.cmsLocale || ctx.locale);\n }\n\n // Process item templates\n const effectiveTemplateContext = ctx.templateContext || ctx.itemContext;\n if (effectiveTemplateContext && resolved.includes('{{')) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n resolved = processItemTemplate(resolved, effectiveTemplateContext, i18nResolver);\n }\n\n // Evaluate truthiness - false, 0, empty string are falsy\n return Boolean(resolved) && resolved !== 'false' && resolved !== '0' && resolved !== '';\n }\n\n // Unknown type, default to true\n return true;\n }\n\n /**\n * Find the path to the slot marker in a component structure\n */\n private findSlotMarkerPath(structure: ComponentNode | undefined, currentPath: Path = [0]): Path | null {\n if (!structure) return null;\n if (isSlotMarker(structure)) return null;\n\n const nodeChildren = (structure as any).children;\n if (!nodeChildren || !Array.isArray(nodeChildren)) return null;\n\n for (let i = 0; i < nodeChildren.length; i++) {\n const child = nodeChildren[i];\n if (isSlotMarker(child)) {\n return getChildPath(currentPath, i);\n }\n if (typeof child === 'object' && child !== null && !Array.isArray(child) && 'type' in child) {\n const nestedPath = this.findSlotMarkerPath(child as ComponentNode, getChildPath(currentPath, i));\n if (nestedPath) return nestedPath;\n }\n }\n\n return null;\n }\n\n /**\n * Builds children elements recursively with proper component context tracking.\n */\n buildChildren(\n children: (string | ComponentNode)[] | string | ComponentNode | undefined,\n ctx: BuildChildrenContext\n ): ReactElement | ReactElement[] | string | number | null {\n const {\n elementPath, parentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap,\n itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n } = ctx;\n\n if (Array.isArray(children)) {\n return children\n .map((child, index) =>\n this.buildComponent({\n node: child,\n key: index,\n customProps: {},\n elementPath: getChildPath(elementPath, index),\n parentComponentName,\n viewportWidth,\n componentContext,\n componentRootPath,\n locale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n itemContext,\n cmsItemIndexPath,\n cmsListPaths,\n templateContext,\n componentResolvedProps\n })\n )\n .filter((item): item is ReactElement | string | number => item !== null) as ReactElement[];\n }\n return this.buildComponent({\n node: children,\n key: 0,\n customProps: {},\n elementPath: getChildPath(elementPath, 0),\n parentComponentName,\n viewportWidth,\n componentContext,\n componentRootPath,\n locale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n itemContext,\n cmsItemIndexPath,\n cmsListPaths,\n templateContext,\n componentResolvedProps\n });\n }\n\n /**\n * Component builder from JSON tree with support for custom components\n */\n buildComponent(options: BuildComponentOptions): BuildResult {\n const {\n node,\n key = 0,\n customProps = {},\n elementPath = [0],\n parentComponentName = null,\n viewportWidth = typeof window !== 'undefined' ? window.innerWidth : 1920,\n componentContext = null,\n componentRootPath,\n locale,\n i18nConfig,\n cmsContext = null,\n cmsLocale = null,\n collectionItemsMap = {},\n itemContext = null,\n templateContext = null,\n cmsItemIndexPath = null,\n cmsListPaths = null,\n componentResolvedProps = null\n } = options;\n\n if (!node) return null;\n\n // Build context for specialized builders (needed for if condition evaluation)\n const ctx: BuilderContext = {\n key, elementPath, parentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap,\n itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n };\n\n // Dependencies for specialized builders\n const builderDeps = {\n elementRegistry: this.elementRegistry,\n prefetchService: this.prefetchService,\n getCachedStyleClasses: this.getCachedStyleClasses.bind(this),\n buildChildren: this.buildChildren.bind(this) as (children: unknown, ctx: BuildChildrenContext) => BuildResult,\n getEffectiveParentComponentName: this.getEffectiveParentComponentName.bind(this),\n getCurrentPageName: this.getCurrentPageName,\n getCurrentFileType: this.getCurrentFileType,\n getCurrentPagePath: this.getCurrentPagePath,\n };\n\n // Handle text nodes - process CMS templates and item templates\n if (typeof node === 'string') {\n return this.processTextNode(node, ctx);\n }\n\n if (typeof node === 'number') {\n return node;\n }\n\n if (Array.isArray(node)) {\n return this.buildNodeArray(node, options);\n }\n\n // Check if condition - skip rendering if false\n if (typeof node === 'object' && node !== null && !this.evaluateIfCondition(node as ComponentNode, ctx)) {\n return null;\n }\n\n // Check if this node is slot content (for context attribute handling)\n const isSlotContent = typeof node === 'object' && node !== null && (node as any)._isSlotContent === true;\n\n // Get node type\n const nodeType = typeof node === 'object' && node !== null && 'type' in node ? node.type : undefined;\n const children = typeof node === 'object' && node !== null && 'children' in node ? (node.children || []) : [];\n\n // Handle specialized node types using extracted builders\n if (nodeType === NODE_TYPE.EMBED && isEmbedNode(node)) {\n return buildEmbed(node, ctx, builderDeps);\n }\n\n if (nodeType === NODE_TYPE.LINK && isLinkNode(node)) {\n return buildLinkNode(node, children, ctx, builderDeps);\n }\n\n if (nodeType === NODE_TYPE.LOCALE_LIST && isLocaleListNode(node)) {\n return buildLocaleList(node, ctx, builderDeps);\n }\n\n // Handle List nodes (unified - handles both prop and collection source types)\n // isListNode() also matches legacy 'cms-list' type for migration\n if (isListNode(node)) {\n return buildList(node, children, ctx, builderDeps);\n }\n\n // Extract node properties\n const { tag, componentName, props: nodeProps } = extractNodeProperties(node);\n\n // Filter internal props\n const props = this.filterInternalProps(nodeProps, tag);\n\n // Process templates in props\n const processedProps = this.processPropsTemplates(props, ctx);\n\n // Convert styles to utility classes\n const propsWithClasses = this.applyStyleClasses(processedProps, node, ctx);\n\n // Apply interactive styles\n const propsWithInteractive = this.applyInteractiveStyles(propsWithClasses, node, ctx);\n\n // Extract and merge attributes\n const finalProps = this.mergeAttributes(propsWithInteractive, node, ctx);\n\n // Handle custom component\n if (nodeType === NODE_TYPE.COMPONENT && componentName && this.componentRegistry.has(componentName)) {\n return this.buildCustomComponent(componentName, nodeProps, children, finalProps, options);\n }\n\n // Component not found in registry - warn and show placeholder\n if (nodeType === NODE_TYPE.COMPONENT && componentName) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[Meno] Component \"${componentName}\" not found in registry. ` +\n `Registered: [${this.componentRegistry.getNames().join(', ')}]`\n );\n }\n return h('div', {\n key,\n style: {\n border: '1px dashed #e5a00d',\n padding: '8px 12px',\n margin: '4px 0',\n borderRadius: '4px',\n color: '#b8860b',\n fontSize: '13px',\n fontFamily: 'monospace',\n background: '#fffbe6',\n },\n 'data-missing-component': componentName,\n }, `Component not found: ${componentName}`);\n }\n\n // Handle Link component\n if (tag === 'Link') {\n return buildLink(finalProps, children, ctx, builderDeps);\n }\n\n // Build regular HTML element - pass isSlotContent for context attribute handling\n const htmlElementOptions = isSlotContent ? { ...options, isSlotContent } : options;\n return this.buildHtmlElement(tag, finalProps, children, customProps, htmlElementOptions);\n }\n\n /**\n * Expand Meno component markers in rich-text HTML into rendered React components.\n * Mirrors the SSR expandRichTextComponents() function but produces React elements\n * instead of HTML strings.\n */\n private expandRichTextComponents(html: string, ctx: BuilderContext): ReactElement {\n // Quick bail-out if no component markers\n if (!html.includes('data-meno-component')) {\n return h('span', { dangerouslySetInnerHTML: { __html: html } });\n }\n\n const markerRegex = /<div\\s+data-meno-component=\"([^\"]+)\"\\s+data-meno-props=\"([^\"]*)\"[^>]*><\\/div>/g;\n const segments: ReactElement[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let segmentIndex = 0;\n\n while ((match = markerRegex.exec(html)) !== null) {\n // Add HTML before this match\n if (match.index > lastIndex) {\n const chunk = html.slice(lastIndex, match.index);\n segments.push(h('span', { key: `rt-${segmentIndex++}`, dangerouslySetInnerHTML: { __html: chunk } }));\n }\n\n const componentName = match[1];\n let props: Record<string, unknown> = {};\n try {\n const propsStr = match[2]\n .replace(/&quot;/g, '\"')\n .replace(/&#039;/g, \"'\")\n .replace(/&amp;/g, '&');\n props = JSON.parse(propsStr);\n } catch {\n // ignore parse errors\n }\n\n if (this.componentRegistry.has(componentName)) {\n const componentNode: ComponentNode = {\n type: NODE_TYPE.COMPONENT as 'component',\n component: componentName,\n props,\n };\n\n const rendered = this.buildComponent({\n node: componentNode,\n key: segmentIndex,\n customProps: {},\n elementPath: ctx.elementPath,\n parentComponentName: ctx.parentComponentName,\n viewportWidth: ctx.viewportWidth,\n componentContext: ctx.componentContext,\n componentRootPath: ctx.componentRootPath,\n locale: ctx.locale,\n i18nConfig: ctx.i18nConfig,\n cmsContext: ctx.cmsContext,\n cmsLocale: ctx.cmsLocale,\n collectionItemsMap: ctx.collectionItemsMap || {},\n itemContext: ctx.itemContext,\n cmsItemIndexPath: ctx.cmsItemIndexPath,\n cmsListPaths: ctx.cmsListPaths,\n templateContext: ctx.templateContext,\n componentResolvedProps: ctx.componentResolvedProps,\n });\n\n if (rendered !== null) {\n segments.push(rendered as ReactElement);\n }\n } else {\n // Keep marker as-is for unregistered components\n segments.push(h('span', { key: `rt-${segmentIndex}`, dangerouslySetInnerHTML: { __html: match[0] } }));\n }\n\n segmentIndex++;\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining HTML\n if (lastIndex < html.length) {\n segments.push(h('span', { key: `rt-${segmentIndex}`, dangerouslySetInnerHTML: { __html: html.slice(lastIndex) } }));\n }\n\n return h(Fragment, null, ...segments);\n }\n\n /**\n * Process text node with CMS and item templates\n * Returns a ReactElement with dangerouslySetInnerHTML for raw HTML content (rich-text),\n * or a plain string for regular text content.\n */\n private processTextNode(text: string, ctx: BuilderContext): string | ReactElement {\n let result = text;\n\n // Process CMS templates\n if (ctx.cmsContext && result.includes('{{cms.')) {\n result = processCMSTemplate(result, ctx.cmsContext, ctx.cmsLocale || ctx.locale);\n }\n\n // Process item templates\n const effectiveTemplateContext = ctx.templateContext || ctx.itemContext;\n if (effectiveTemplateContext && hasItemTemplates(result)) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n result = processItemTemplate(result, effectiveTemplateContext, i18nResolver);\n }\n\n // Check for raw HTML marker (from rich-text fields) - render with dangerouslySetInnerHTML\n if (result.startsWith(RAW_HTML_PREFIX)) {\n const rawHtml = result.slice(RAW_HTML_PREFIX.length);\n return this.expandRichTextComponents(rawHtml, ctx);\n }\n\n return result;\n }\n\n /**\n * Build array of nodes\n */\n private buildNodeArray(nodes: ComponentNode[], options: BuildComponentOptions): ReactElement[] {\n const {\n customProps, elementPath = [0], parentComponentName = null, viewportWidth = 1920,\n componentContext = null, locale, i18nConfig, cmsContext = null, cmsLocale = null,\n collectionItemsMap = {}, itemContext = null, cmsItemIndexPath = null,\n cmsListPaths = null, templateContext = null, componentResolvedProps = null\n } = options;\n\n return nodes.map((child, index) => {\n const childPath = getChildPath(elementPath, index);\n return this.buildComponent({\n node: child,\n key: index,\n customProps,\n elementPath: childPath,\n parentComponentName,\n viewportWidth,\n componentContext,\n locale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n itemContext,\n cmsItemIndexPath,\n cmsListPaths,\n templateContext,\n componentResolvedProps\n });\n }).filter((item): item is ReactElement => item !== null && typeof item === 'object');\n }\n\n /**\n * Filter internal props from node props\n */\n private filterInternalProps(nodeProps: Record<string, unknown>, tag: string | undefined): Record<string, unknown> {\n const imageOnlyProps = ['src', 'alt', 'loading', 'width', 'height', 'sizes', 'srcset', 'fetchpriority'];\n const internalProps = ['type', 'tag', 'component', 'props', 'children', 'html', 'style', ...imageOnlyProps];\n const props: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(nodeProps)) {\n if (internalProps.includes(key)) {\n if (tag === 'img' && imageOnlyProps.includes(key)) {\n props[key] = value;\n }\n } else {\n props[key] = value;\n }\n }\n\n return props;\n }\n\n /**\n * Process CMS and item templates in props\n */\n private processPropsTemplates(props: Record<string, unknown>, ctx: BuilderContext): Record<string, unknown> {\n let result = props;\n\n // Process CMS templates\n if (ctx.cmsContext && Object.keys(result).length > 0) {\n result = processCMSPropsTemplate(result, ctx.cmsContext, ctx.cmsLocale || ctx.locale);\n }\n\n // Process item templates\n const effectiveItemContext = ctx.templateContext || ctx.itemContext;\n if (effectiveItemContext && Object.keys(result).length > 0) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n result = processItemPropsTemplate(result, effectiveItemContext, i18nResolver);\n }\n\n return result;\n }\n\n /**\n * Apply style classes to props\n */\n private applyStyleClasses(props: Record<string, unknown>, node: ComponentNode, ctx: BuilderContext): Record<string, unknown> {\n const nodeStyle = node.style || (isComponentNode(node) ? node.props?.style : undefined);\n\n if (nodeStyle && typeof nodeStyle === 'object') {\n // Process item templates in style values (for List context)\n let processedStyle = nodeStyle as Record<string, unknown>;\n const templateCtx = ctx.templateContext || ctx.itemContext;\n if (templateCtx) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n processedStyle = processItemPropsTemplate(processedStyle, templateCtx, i18nResolver);\n }\n const utilityClasses = this.getCachedStyleClasses(processedStyle);\n if (utilityClasses.length > 0) {\n const existingClassName = (props.className || '') as string;\n const classArray = existingClassName ? existingClassName.split(/\\s+/) : [];\n return { ...props, className: [...classArray, ...utilityClasses].filter(Boolean).join(' ') };\n }\n }\n\n return props;\n }\n\n /**\n * Apply interactive styles and generate element class\n */\n private applyInteractiveStyles(props: Record<string, unknown>, node: ComponentNode, ctx: BuilderContext): Record<string, unknown> {\n const nodeInteractiveStyles = (node as any).interactiveStyles as InteractiveStyles | undefined;\n const nodeGenerateElementClass = (node as any).generateElementClass as boolean | undefined;\n const nodeLabel = (node as any).label as string | undefined;\n\n if (!((nodeInteractiveStyles && nodeInteractiveStyles.length > 0) || nodeGenerateElementClass)) {\n return props;\n }\n\n // Check if slot content\n const isSlotContent = (node as any)._isSlotContent === true;\n const useComponentContext = ctx.componentContext && !isSlotContent;\n const fileType = useComponentContext ? 'component' : (this.getCurrentFileType?.() || 'page');\n const fileName = useComponentContext ? ctx.componentContext! : (this.getCurrentPageName ? this.getCurrentPageName() : 'page');\n const pathForClass = useComponentContext && ctx.componentRootPath\n ? ctx.elementPath.slice(ctx.componentRootPath.length)\n : ctx.elementPath;\n\n const elementClassCtx: ElementClassContext = {\n fileType,\n fileName,\n label: nodeLabel,\n path: pathForClass,\n };\n const elementClass = generateElementClassName(elementClassCtx);\n\n // Prepend element class\n const existingClassName = (props.className || '') as string;\n const result = { ...props, className: [elementClass, existingClassName].filter(Boolean).join(' ') };\n\n // Register interactive styles\n if (nodeInteractiveStyles && nodeInteractiveStyles.length > 0) {\n if (ctx.componentResolvedProps && hasInteractiveStyleMappings(nodeInteractiveStyles)) {\n const { resolvedStyles, mappings } = extractInteractiveStyleMappings(nodeInteractiveStyles);\n const cssVariables = resolveExtractedMappings(mappings, ctx.componentResolvedProps);\n InteractiveStylesRegistry.set(elementClass, resolvedStyles);\n if (Object.keys(cssVariables).length > 0) {\n InteractiveStylesRegistry.setVariables(ctx.elementPath, cssVariables);\n }\n } else {\n InteractiveStylesRegistry.set(elementClass, nodeInteractiveStyles);\n }\n\n // Apply preview classes when previewProp is set and truthy\n if (ctx.componentResolvedProps) {\n const previewClasses: string[] = [];\n for (const rule of nodeInteractiveStyles) {\n if (rule.previewProp && ctx.componentResolvedProps[rule.previewProp] === true) {\n // Convert rule's style to utility classes\n const styleClasses = this.getCachedStyleClasses(rule.style);\n previewClasses.push(...styleClasses);\n }\n }\n if (previewClasses.length > 0) {\n result.className = [result.className, ...previewClasses].filter(Boolean).join(' ');\n }\n }\n }\n\n return result;\n }\n\n /**\n * Extract and merge attributes from node\n */\n private mergeAttributes(props: Record<string, unknown>, node: ComponentNode, ctx: BuilderContext): Record<string, unknown> {\n let extractedAttributes = extractAttributesFromNode(node);\n const originalAttributes = { ...extractedAttributes };\n\n // Process item templates in attributes\n const effectiveItemContext = ctx.templateContext || ctx.itemContext;\n if (effectiveItemContext && Object.keys(extractedAttributes).length > 0) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n extractedAttributes = processItemPropsTemplate(extractedAttributes, effectiveItemContext, i18nResolver) as Record<string, string | number | boolean>;\n }\n\n // Auto-skip attributes that were entirely template expressions and resolved to \"\"\n if (Object.keys(extractedAttributes).length > 0) {\n extractedAttributes = skipEmptyTemplateAttributes(originalAttributes, extractedAttributes) as Record<string, string | number | boolean>;\n }\n\n if (Object.keys(extractedAttributes).length === 0) {\n return props;\n }\n\n let result = { ...props };\n\n // Handle class/className specially - check key existence, not truthiness (empty string is valid)\n if ('class' in extractedAttributes || 'className' in extractedAttributes) {\n const attrClass = (extractedAttributes.class ?? extractedAttributes.className ?? '') as string;\n const existingClassName = (result.className || '') as string;\n result.className = [existingClassName, attrClass].filter(Boolean).join(' ');\n delete extractedAttributes.class;\n delete extractedAttributes.className;\n }\n\n // Convert boolean true to empty string for React compatibility\n // React strips boolean true for non-standard attributes, but SSR outputs them as presence-only\n // Using empty string makes React render the attribute (e.g., cmsrt=\"\" matches [cmsrt] selector)\n const normalizedAttributes: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(extractedAttributes)) {\n normalizedAttributes[key] = value === true ? '' : value;\n }\n\n return { ...result, ...normalizedAttributes };\n }\n\n /**\n * Build a custom component\n */\n private buildCustomComponent(\n componentName: string,\n nodeProps: Record<string, unknown>,\n children: unknown,\n finalProps: Record<string, unknown>,\n options: BuildComponentOptions\n ): ReactElement | null {\n const {\n key = 0, elementPath = [0], parentComponentName = null, viewportWidth = 1920,\n componentContext = null, locale, i18nConfig, cmsContext = null, cmsLocale = null,\n collectionItemsMap = {}, itemContext = null, cmsItemIndexPath = null,\n cmsListPaths = null, templateContext = null\n } = options;\n\n const componentDef = this.componentRegistry.get(componentName);\n if (!componentDef) return null;\n\n try {\n const structuredComponentDef = componentDef.component;\n if (!structuredComponentDef) {\n return h(ErrorBoundary, { key, componentName, level: 'component' }, null);\n }\n\n // Process templates on raw nodeProps BEFORE coercion/defaults\n // This matches the SSR path where templates are resolved before resolvePropsFromDefinition\n let propsToResolve = nodeProps;\n\n // CMS templates first (matching SSR: ssrRenderer.ts processes CMS before coercion)\n if (cmsContext) {\n propsToResolve = processCMSPropsTemplate(propsToResolve, cmsContext, cmsLocale || locale);\n }\n\n // Item templates second\n const effectiveItemContext = templateContext || itemContext;\n if (effectiveItemContext) {\n const effectiveLocale = cmsLocale || locale;\n const config = i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n propsToResolve = processItemPropsTemplate(propsToResolve, effectiveItemContext, i18nResolver);\n }\n\n // Resolve props (validate, coerce types, apply defaults) AFTER templates are resolved\n let resolvedProps = resolvePropsFromDefinition(\n structuredComponentDef,\n propsToResolve,\n children as ComponentNode | string | (ComponentNode | string)[] | null | undefined,\n locale,\n i18nConfig\n );\n\n // Process structure\n const typedChildren = children as ComponentNode | ComponentNode[] | string | number | null | undefined;\n const markedChildren = typedChildren ? markAsSlotContent(typedChildren) : undefined;\n const processedStructure = processStructure(\n structuredComponentDef.structure,\n { props: resolvedProps, componentDef: structuredComponentDef },\n viewportWidth,\n markedChildren\n );\n\n if (!processedStructure || typeof processedStructure === 'string' || typeof processedStructure === 'number' || Array.isArray(processedStructure)) {\n return null;\n }\n\n // Merge styles\n if (finalProps.style && typeof finalProps.style === 'object') {\n mergeNodeStyles(processedStructure, finalProps.style as StyleValue, viewportWidth);\n }\n\n // Add onClick\n if (finalProps.onClick && isComponentNode(processedStructure)) {\n if (!processedStructure.props) processedStructure.props = {};\n processedStructure.props.onClick = this.createOnClickHandler(finalProps.onClick);\n }\n\n const nestedParentComponentName = this.getParentComponentNameForNestedComponent(\n componentContext,\n parentComponentName,\n componentName\n );\n\n const componentElement = this.buildComponent({\n node: processedStructure,\n key,\n customProps: { '__componentProps': resolvedProps },\n elementPath,\n parentComponentName: nestedParentComponentName,\n viewportWidth,\n componentContext: componentName,\n componentRootPath: elementPath,\n locale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n itemContext,\n cmsItemIndexPath,\n cmsListPaths,\n templateContext,\n componentResolvedProps: resolvedProps\n });\n\n return h(ErrorBoundary, { key, componentName, level: 'component' }, componentElement);\n\n } catch (error) {\n return h(ErrorBoundary, { key, componentName, level: 'component' }, null);\n }\n }\n\n /**\n * Build a regular HTML element\n */\n private buildHtmlElement(\n tag: string | undefined,\n props: Record<string, unknown>,\n children: unknown,\n customProps: ComponentProps,\n options: BuildComponentOptions\n ): ReactElement | null {\n const {\n key = 0, elementPath = [0], parentComponentName = null, viewportWidth = 1920,\n componentContext = null, componentRootPath, locale, i18nConfig,\n cmsContext = null, cmsLocale = null, collectionItemsMap = {},\n itemContext = null, cmsItemIndexPath = null, cmsListPaths = null,\n templateContext = null, componentResolvedProps = null,\n isSlotContent = false\n } = options;\n\n const finalTag = tag || 'div';\n const effectiveParentComponentName = this.getEffectiveParentComponentName(componentContext, parentComponentName);\n\n // Remove __componentProps from customProps before spreading\n const { __componentProps, ...customPropsForDOM } = customProps || {};\n const isComponentRoot = !!(customProps && '__componentProps' in customProps);\n\n const processedProps: Record<string, unknown> = {\n ...props,\n ...customPropsForDOM,\n key\n };\n\n // Add is-current class for <a> tags when href matches current page path\n if (finalTag === 'a' && this.getCurrentPagePath) {\n const href = processedProps.href as string | undefined;\n if (href && typeof href === 'string' && isCurrentLink(href, this.getCurrentPagePath())) {\n const existing = (processedProps.className || '') as string;\n processedProps.className = existing ? `${existing} is-current` : 'is-current';\n }\n }\n\n // Register element via ref callback\n processedProps.ref = (el: HTMLElement | null) => {\n if (el) {\n el.setAttribute('data-element-path', pathToString(elementPath));\n if (cmsItemIndexPath && cmsItemIndexPath.length > 0) {\n el.setAttribute('data-cms-item-index', cmsItemIndexPath.join('.'));\n // Set full CMS context as JSON for nested CMS list support\n if (cmsListPaths && cmsListPaths.length === cmsItemIndexPath.length) {\n el.setAttribute('data-cms-context', JSON.stringify({\n itemIndexPath: cmsItemIndexPath,\n listPaths: cmsListPaths\n }));\n }\n }\n if (isComponentRoot) el.setAttribute('data-component-root', 'true');\n if (parentComponentName) el.setAttribute('data-parent-component', parentComponentName);\n // Only set componentContext for component structure elements, not slot content\n // Slot content belongs to the parent scope, not the component's internal structure\n if (componentContext && !isSlotContent) el.setAttribute('data-component-context', componentContext);\n\n // Add defineVars data attributes\n if (isComponentRoot && componentContext) {\n const componentDef = this.componentRegistry.get(componentContext);\n const defineVars = componentDef?.component?.defineVars;\n if (defineVars && customProps.__componentProps) {\n const varsToExpose = defineVars === true\n ? Object.keys(componentDef.component.interface || {})\n : defineVars;\n\n const propsForJS: Record<string, unknown> = {};\n const resolvedProps = customProps.__componentProps as Record<string, unknown>;\n for (const varName of varsToExpose) {\n if (resolvedProps[varName] !== undefined) {\n propsForJS[varName] = resolvedProps[varName];\n }\n }\n\n el.setAttribute('data-component', componentContext);\n el.setAttribute('data-props', JSON.stringify(propsForJS));\n }\n }\n\n // Apply CSS variables\n const cssVariables = InteractiveStylesRegistry.getVariables(elementPath);\n if (cssVariables && Object.keys(cssVariables).length > 0) {\n for (const [varName, value] of Object.entries(cssVariables)) {\n el.style.setProperty(varName, value);\n }\n }\n }\n\n const componentProps = isComponentRoot && customProps.__componentProps\n ? customProps.__componentProps as Record<string, unknown>\n : undefined;\n const componentNameForRegistry = isComponentRoot ? componentContext : parentComponentName;\n\n const metadata = {\n parentComponentName: parentComponentName ?? null,\n componentContext: componentContext ?? null\n };\n\n this.elementRegistry.register(elementPath, el, componentNameForRegistry, isComponentRoot, componentProps, metadata);\n };\n\n // Add onClick handler\n if (props.onClick) {\n processedProps.onClick = this.createOnClickHandler(props.onClick);\n }\n\n // HTML void elements\n const VOID_ELEMENTS = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];\n if (VOID_ELEMENTS.includes(finalTag.toLowerCase())) {\n const { children: _ignored, ...voidElementProps } = processedProps;\n return h(finalTag, voidElementProps);\n }\n\n // Build children\n const childElements = this.buildChildren(children as any, {\n elementPath, parentComponentName: effectiveParentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap, itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n });\n\n return h(finalTag, processedProps, childElements);\n }\n}\n", "/**\n * Error Boundary Component\n * Catches and handles React rendering errors gracefully\n */\n\nimport { Component, createElement as h, ReactNode } from 'react';\n\ninterface ErrorBoundaryProps {\n children?: ReactNode;\n fallback?: (error: Error, errorInfo: any) => ReactNode;\n onError?: (error: Error, errorInfo: any) => void;\n componentName?: string;\n level?: 'component' | 'page';\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: any;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return {\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: any) {\n const { onError, componentName, level = 'component' } = this.props;\n\n // Log error to console\n console.error(\n `\u274C [${level.toUpperCase()} ERROR]${componentName ? ` in ${componentName}` : ''}:`,\n error,\n errorInfo\n );\n\n // Call custom error handler if provided\n if (onError) {\n onError(error, errorInfo);\n }\n\n // Update state with error info\n this.setState({\n errorInfo,\n });\n }\n\n render() {\n const { hasError, error, errorInfo } = this.state;\n const { children, fallback, componentName, level = 'component' } = this.props;\n\n if (hasError && error) {\n // Use custom fallback if provided\n if (fallback) {\n return fallback(error, errorInfo);\n }\n\n // Default fallback UI\n if (level === 'page') {\n return h('div', {\n style: {\n padding: '40px',\n maxWidth: '800px',\n margin: '0 auto',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n }\n },\n h('div', {\n style: {\n background: '#fee',\n border: '2px solid #fcc',\n borderRadius: '8px',\n padding: '24px',\n }\n },\n h('h2', {\n style: {\n margin: '0 0 16px 0',\n color: '#c00',\n fontSize: '24px',\n fontWeight: '600',\n }\n }, '\u26A0\uFE0F Page Rendering Error'),\n h('p', {\n style: {\n margin: '0 0 16px 0',\n color: '#666',\n fontSize: '16px',\n lineHeight: '1.5',\n }\n }, 'An error occurred while rendering this page. Please check your JSON configuration.'),\n h('div', {\n style: {\n background: '#fff',\n border: '1px solid #ddd',\n borderRadius: '4px',\n padding: '16px',\n marginBottom: '16px',\n fontFamily: 'monospace',\n fontSize: '14px',\n color: '#c00',\n overflowX: 'auto',\n }\n }, error.message),\n process.env.NODE_ENV === 'development' && errorInfo?.componentStack && h('details', {\n style: {\n marginTop: '16px',\n fontSize: '14px',\n }\n },\n h('summary', {\n style: {\n cursor: 'pointer',\n color: '#666',\n fontWeight: '600',\n marginBottom: '8px',\n }\n }, 'Stack Trace'),\n h('pre', {\n style: {\n background: '#f5f5f5',\n border: '1px solid #ddd',\n borderRadius: '4px',\n padding: '12px',\n fontSize: '12px',\n overflowX: 'auto',\n color: '#333',\n }\n }, errorInfo.componentStack)\n ),\n h('button', {\n onClick: () => window.location.reload(),\n style: {\n marginTop: '16px',\n padding: '10px 20px',\n background: '#007acc',\n color: '#fff',\n border: 'none',\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: '600',\n cursor: 'pointer',\n }\n }, '\uD83D\uDD04 Reload Page')\n )\n );\n }\n\n // Component-level error\n return h('div', {\n style: {\n border: '2px dashed #fcc',\n borderRadius: '4px',\n padding: '12px',\n margin: '8px 0',\n background: '#fef5f5',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n }\n },\n h('div', {\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '8px',\n }\n },\n h('span', {\n style: {\n fontSize: '18px',\n }\n }, '\u26A0\uFE0F'),\n h('strong', {\n style: {\n color: '#c00',\n fontSize: '14px',\n }\n }, `Component Error${componentName ? `: ${componentName}` : ''}`)\n ),\n h('div', {\n style: {\n fontSize: '12px',\n color: '#666',\n fontFamily: 'monospace',\n background: '#fff',\n padding: '8px',\n borderRadius: '4px',\n border: '1px solid #fcc',\n }\n }, error.message)\n );\n }\n\n return children;\n }\n}\n\n/**\n * Higher-order function to wrap component building with error boundary\n */\nexport function withErrorBoundary<T>(\n renderFn: () => T,\n options: {\n componentName?: string;\n level?: 'component' | 'page';\n onError?: (error: Error, errorInfo: any) => void;\n } = {}\n): T | ReturnType<typeof h> {\n try {\n return renderFn();\n } catch (error) {\n return h(ErrorBoundary, {\n ...options,\n children: null,\n });\n }\n}\n\n", "/**\n * Interactive Styles Registry\n *\n * Global registry for interactive styles collected during component rendering.\n * ComponentBuilder registers styles here when rendering elements with interactiveStyles.\n * StyleInjector reads from here to generate CSS.\n *\n * This eliminates the need for complex JSON tree-walking to collect interactive styles,\n * as the registry is populated during render when component resolution already happens.\n */\n\nimport type { InteractiveStyles } from '../shared/types/styles';\nimport type { Path } from '../shared/paths';\nimport { pathToString } from '../shared/paths';\n\nclass InteractiveStylesRegistryImpl {\n private styles: Map<string, InteractiveStyles> = new Map();\n /** CSS variables per element path (for interactive style mappings) */\n private variables: Map<string, Record<string, string>> = new Map();\n\n /**\n * Register interactive styles for an element class.\n * Called by ComponentBuilder when rendering elements with interactiveStyles.\n * @param elementClass - The generated element class name (e.g., \"page_index_0_1\")\n * @param styles - The interactive styles array for this element\n */\n set(elementClass: string, styles: InteractiveStyles): void {\n this.styles.set(elementClass, styles);\n }\n\n /**\n * Get all registered interactive styles.\n * Called by StyleInjector to generate CSS.\n * @returns A copy of the styles map (to prevent external mutation)\n */\n getAll(): Map<string, InteractiveStyles> {\n return new Map(this.styles);\n }\n\n /**\n * Clear all registered styles and variables.\n * Called before re-rendering to avoid stale styles from previous render.\n */\n clear(): void {\n this.styles.clear();\n this.variables.clear();\n }\n\n /**\n * Check how many styles are registered.\n */\n get size(): number {\n return this.styles.size;\n }\n\n /**\n * Store CSS variables for an element path.\n * Called by ComponentBuilder when rendering elements with interactive style mappings.\n * @param elementPath - The element's path in the tree\n * @param variables - CSS variable name to value map (e.g., { '--is-0': '#0070f3' })\n */\n setVariables(elementPath: Path, variables: Record<string, string>): void {\n const pathKey = pathToString(elementPath);\n this.variables.set(pathKey, variables);\n }\n\n /**\n * Get CSS variables for an element path.\n * @param elementPath - The element's path in the tree\n * @returns CSS variable map or undefined if not found\n */\n getVariables(elementPath: Path): Record<string, string> | undefined {\n const pathKey = pathToString(elementPath);\n return this.variables.get(pathKey);\n }\n\n /**\n * Get CSS variables by path string key.\n * Used when the path is already stringified.\n * @param pathKey - The stringified path key\n * @returns CSS variable map or undefined if not found\n */\n getVariablesByKey(pathKey: string): Record<string, string> | undefined {\n return this.variables.get(pathKey);\n }\n\n /**\n * Check how many variable sets are registered.\n */\n get variablesSize(): number {\n return this.variables.size;\n }\n}\n\n// Singleton instance\nexport const InteractiveStylesRegistry = new InteractiveStylesRegistryImpl();\n", "/**\n * Responsive Style Resolver for Editor\n * Merges responsive styles into inline styles based on current viewport width\n */\n\nimport type { ResponsiveStyleObject, StyleObject } from '../shared/types';\nimport type { BreakpointConfig, BreakpointConfigInput, BreakpointEntry } from '../shared/breakpoints';\nimport { DEFAULT_BREAKPOINTS, normalizeBreakpointConfig } from '../shared/breakpoints';\nimport type { ResponsiveScales } from '../shared/responsiveScaling';\nimport { DEFAULT_RESPONSIVE_SCALES } from '../shared/responsiveScaling';\nimport { isResponsiveStyle } from '../shared/styleUtils';\nimport { mergeResponsiveStyles } from '../shared/responsiveStyleUtils';\n\n/**\n * Get breakpoint configuration (with caching)\n */\nlet breakpointConfig: BreakpointConfig | null = null;\nlet breakpointPromise: Promise<BreakpointConfig> | null = null;\n\n/**\n * Get responsive scales configuration (with caching)\n */\nlet responsiveScalesConfig: ResponsiveScales | null = null;\nlet responsiveScalesPromise: Promise<ResponsiveScales> | null = null;\n\n/**\n * Shared config fetching promise\n */\nlet configPromise: Promise<void> | null = null;\n\n/**\n * Clear the breakpoint config cache (useful when config file changes)\n */\nexport function clearBreakpointConfigCache(): void {\n breakpointConfig = null;\n breakpointPromise = null;\n}\n\n/**\n * Clear the responsive scales config cache (useful when config file changes)\n */\nexport function clearResponsiveScalesConfigCache(): void {\n responsiveScalesConfig = null;\n responsiveScalesPromise = null;\n}\n\n/**\n * Clear all config caches\n */\nexport function clearAllConfigCache(): void {\n clearBreakpointConfigCache();\n clearResponsiveScalesConfigCache();\n configPromise = null;\n}\n\n/**\n * Get cached breakpoint config synchronously (returns null if not loaded yet)\n */\nexport function getCachedBreakpointConfig(): BreakpointConfig | null {\n return breakpointConfig;\n}\n\n/**\n * Get cached responsive scales config synchronously (returns null if not loaded yet)\n */\nexport function getCachedResponsiveScalesConfig(): ResponsiveScales | null {\n return responsiveScalesConfig;\n}\n\n/**\n * Shared config fetching - loads both breakpoints and responsive scales from single API call\n */\nasync function loadConfig(): Promise<void> {\n if (breakpointConfig && responsiveScalesConfig) {\n return;\n }\n\n if (!configPromise) {\n configPromise = (async () => {\n try {\n const response = await fetch('/api/config');\n const config = await response.json();\n\n // Parse breakpoints - supports both legacy and new format\n if (config.breakpoints && typeof config.breakpoints === 'object') {\n const validInput: BreakpointConfigInput = {};\n for (const [key, value] of Object.entries(config.breakpoints)) {\n if (typeof value === 'number' && value > 0) {\n // Legacy format: number\n validInput[key] = value;\n } else if (typeof value === 'object' && value !== null) {\n // New format: object with breakpoint and optional previewPoint\n const entry = value as BreakpointEntry;\n if (typeof entry.breakpoint === 'number' && entry.breakpoint > 0) {\n validInput[key] = {\n breakpoint: entry.breakpoint,\n previewPoint: typeof entry.previewPoint === 'number' && entry.previewPoint > 0\n ? entry.previewPoint\n : entry.breakpoint,\n };\n }\n }\n }\n breakpointConfig = Object.keys(validInput).length > 0\n ? normalizeBreakpointConfig(validInput)\n : { ...DEFAULT_BREAKPOINTS };\n } else {\n breakpointConfig = { ...DEFAULT_BREAKPOINTS };\n }\n\n // Parse responsive scales\n if (config.responsiveScales && typeof config.responsiveScales === 'object') {\n responsiveScalesConfig = {\n ...DEFAULT_RESPONSIVE_SCALES,\n ...config.responsiveScales,\n };\n } else {\n responsiveScalesConfig = { ...DEFAULT_RESPONSIVE_SCALES };\n }\n } catch {\n breakpointConfig = { ...DEFAULT_BREAKPOINTS };\n responsiveScalesConfig = { ...DEFAULT_RESPONSIVE_SCALES };\n }\n })();\n }\n\n await configPromise;\n}\n\nasync function getBreakpointConfig(): Promise<BreakpointConfig> {\n await loadConfig();\n return breakpointConfig!;\n}\n\n/**\n * Get responsive scales configuration asynchronously\n */\nexport async function getResponsiveScalesConfig(): Promise<ResponsiveScales> {\n await loadConfig();\n return responsiveScalesConfig!;\n}\n\n/**\n * Merge responsive styles into a single style object based on current viewport\n * Styles cascade: base \u2192 tablet \u2192 mobile\n */\nexport async function resolveResponsiveStyle(\n style: ResponsiveStyleObject | StyleObject\n): Promise<StyleObject> {\n if (!isResponsiveStyle(style)) {\n return style as StyleObject;\n }\n \n const responsiveStyle = style as ResponsiveStyleObject;\n const viewportWidth = typeof window !== 'undefined' ? window.innerWidth : 1920;\n const breakpoints = await getBreakpointConfig();\n \n return mergeResponsiveStyles(responsiveStyle, 'viewport', viewportWidth, breakpoints);\n}\n\n/**\n * Synchronous version that uses cached breakpoints or defaults\n * For immediate rendering, then async update when breakpoints load\n */\nexport function resolveResponsiveStyleSync(\n style: ResponsiveStyleObject | StyleObject,\n viewportWidth: number = typeof window !== 'undefined' ? window.innerWidth : 1920\n): StyleObject {\n if (!isResponsiveStyle(style)) {\n return style as StyleObject;\n }\n \n const responsiveStyle = style as ResponsiveStyleObject;\n \n // Use cached breakpoints or defaults\n const breakpoints = breakpointConfig || { ...DEFAULT_BREAKPOINTS };\n \n return mergeResponsiveStyles(responsiveStyle, 'viewport', viewportWidth, breakpoints);\n}\n\n/**\n * Initialize breakpoint and responsive scales config (call this early)\n * If forceRefresh is true, clears cache and fetches fresh config\n */\nexport async function initializeBreakpoints(forceRefresh: boolean = false): Promise<void> {\n if (forceRefresh) {\n clearAllConfigCache();\n }\n await loadConfig();\n}\n\n/**\n * Alias for initializeBreakpoints - initializes all config including responsive scales\n */\nexport const initializeConfig = initializeBreakpoints;\n\n", "/**\n * Utility Class Collector \u2014 Eager CSS Injector\n *\n * Global registry for utility CSS classes collected during component rendering.\n * ComponentBuilder and builder modules register classes here during render.\n *\n * CSS is injected eagerly during React's render phase (inside collect()),\n * eliminating the micro-gap between DOM commit and CSS injection (FOUC).\n * This is the same pattern CSS-in-JS libraries (Emotion, styled-components) use.\n *\n * All injected CSS is kept sorted by CSS property precedence so that shorthand\n * properties (border) always appear before longhands (border-color), regardless\n * of which render batch introduced each class.\n */\n\nimport { generateSingleClassCSS, sortClassesByPropertyOrder, generateRuleForClass } from '../../shared/cssGeneration';\nimport { getCachedBreakpointConfig, getCachedResponsiveScalesConfig } from '../responsiveStyleResolver';\nimport { DEFAULT_BREAKPOINTS, getBreakpointValues } from '../../shared/breakpoints';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport { DEFAULT_RESPONSIVE_SCALES } from '../../shared/responsiveScaling';\n\n/**\n * Build a map from responsive prefix (e.g. 't', 'mob') to breakpoint value.\n * Same logic as generateSingleClassCSS / generateUtilityCSS.\n */\nfunction buildResponsivePrefixMap(breakpoints: BreakpointConfig): Record<string, number> {\n const breakpointValues = getBreakpointValues(breakpoints);\n const map: Record<string, number> = {};\n for (const [breakpointName, breakpointValue] of Object.entries(breakpointValues)) {\n let prefix = breakpointName.charAt(0).toLowerCase();\n if (breakpointName.toLowerCase() === 'mobile') {\n prefix = 'mob';\n }\n map[prefix] = breakpointValue;\n }\n return map;\n}\n\n/**\n * Get the responsive breakpoint value for a class, or 0 if it's not responsive.\n * A class is responsive if it starts with a known breakpoint prefix and the\n * remainder generates a valid CSS rule (same heuristic as generateSingleClassCSS).\n */\nfunction getClassBreakpointValue(\n className: string,\n prefixMap: Record<string, number>\n): number {\n for (const prefix of Object.keys(prefixMap)) {\n if (className.startsWith(`${prefix}-`) && className.length > prefix.length + 1) {\n const potentialClass = className.substring(prefix.length + 1);\n const rule = generateRuleForClass(potentialClass);\n if (rule && !potentialClass.match(/^(auto|0|[\\d.]+px|[\\d.]+p)$/)) {\n return prefixMap[prefix];\n }\n }\n }\n return 0;\n}\n\n/**\n * Sort utility classes with breakpoint-aware ordering:\n * 1. Non-responsive classes first, sorted by CSS property order (shorthand before longhand)\n * 2. Responsive classes after, sorted by breakpoint value descending (largest first),\n * then by property order within each breakpoint group.\n *\n * This matches the SSR output from generateUtilityCSS which sorts responsive\n * @media blocks by breakpoint value descending so that smaller breakpoints\n * (mobile 540px) can correctly override larger ones (tablet 1024px) in the cascade.\n */\nfunction sortClassesWithBreakpointOrder(\n classes: Iterable<string>,\n breakpoints: BreakpointConfig\n): string[] {\n const prefixMap = buildResponsivePrefixMap(breakpoints);\n const arr = Array.from(classes);\n\n // Pre-compute sort keys for each class\n const keys = arr.map(cls => {\n const bpValue = getClassBreakpointValue(cls, prefixMap);\n return { cls, isResponsive: bpValue > 0 ? 1 : 0, bpValue };\n });\n\n // Get property-order sorted array to derive per-class indices\n const propertySorted = sortClassesByPropertyOrder(arr);\n const propertyOrderIndex = new Map<string, number>();\n for (let i = 0; i < propertySorted.length; i++) {\n propertyOrderIndex.set(propertySorted[i], i);\n }\n\n keys.sort((a, b) => {\n // Non-responsive (0) before responsive (1)\n if (a.isResponsive !== b.isResponsive) return a.isResponsive - b.isResponsive;\n // Within responsive: larger breakpoint first (descending)\n if (a.bpValue !== b.bpValue) return b.bpValue - a.bpValue;\n // Within same group: property order\n return (propertyOrderIndex.get(a.cls) ?? Infinity) - (propertyOrderIndex.get(b.cls) ?? Infinity);\n });\n\n return keys.map(k => k.cls);\n}\n\nclass UtilityClassCollectorImpl {\n private classes: Set<string> = new Set();\n\n /** Map of injected class names \u2192 their generated CSS text */\n private injectedRules: Map<string, string> = new Map();\n\n /** Cached reference to <style id=\"utility-css\"> */\n private styleEl: HTMLStyleElement | null = null;\n\n /**\n * Ensure we have a valid reference to the utility-css style element.\n * Returns null during SSR (no document).\n */\n private ensureStyleElement(): HTMLStyleElement | null {\n if (typeof document === 'undefined') return null;\n\n // Check if cached ref is still in the DOM\n if (this.styleEl && this.styleEl.isConnected) {\n return this.styleEl;\n }\n\n // Try to find existing element\n this.styleEl = document.getElementById('utility-css') as HTMLStyleElement | null;\n if (this.styleEl) return this.styleEl;\n\n // Create new one\n if (document.head) {\n this.styleEl = document.createElement('style');\n this.styleEl.id = 'utility-css';\n document.head.appendChild(this.styleEl);\n }\n\n return this.styleEl;\n }\n\n /**\n * Collect utility class names from a render pass and eagerly inject CSS.\n * Called by ComponentBuilder and builder modules after computing style classes.\n * CSS is injected synchronously during render \u2014 before React commits the DOM.\n *\n * When new classes are added, the full style content is rebuilt in sorted order\n * so that shorthand properties (border) always precede longhands (border-color),\n * even when they arrive in different render batches.\n */\n collect(classNames: string[]): void {\n const breakpointConfig = getCachedBreakpointConfig() || DEFAULT_BREAKPOINTS;\n const responsiveScalesConfig = getCachedResponsiveScalesConfig() || DEFAULT_RESPONSIVE_SCALES;\n\n let hasNew = false;\n for (const name of classNames) {\n this.classes.add(name);\n\n if (this.injectedRules.has(name)) continue;\n\n const css = generateSingleClassCSS(name, breakpointConfig, responsiveScalesConfig);\n if (css) {\n this.injectedRules.set(name, css);\n hasNew = true;\n }\n }\n\n if (hasNew) {\n // Rebuild style element with all rules sorted by property order.\n // This ensures shorthands always precede longhands regardless of\n // which collect() batch introduced each class.\n const sorted = sortClassesWithBreakpointOrder(this.injectedRules.keys(), breakpointConfig);\n const styleEl = this.ensureStyleElement();\n if (styleEl) {\n styleEl.textContent = sorted\n .map(name => this.injectedRules.get(name)!)\n .join('\\n');\n }\n }\n }\n\n /**\n * Clear collected classes for route change.\n * Preserves injectedRules and style tag \u2014 old page CSS stays\n * (needed during transition via previousComponentTree).\n */\n clear(): void {\n this.classes.clear();\n }\n\n /**\n * Full teardown \u2014 clears everything and removes style tag from DOM.\n * Called by StyleInjector.clear() for complete reset.\n */\n destroy(): void {\n this.classes.clear();\n this.injectedRules.clear();\n if (this.styleEl && this.styleEl.isConnected) {\n this.styleEl.remove();\n }\n this.styleEl = null;\n }\n\n /**\n * Check how many classes are collected.\n */\n get size(): number {\n return this.classes.size;\n }\n}\n\n// Singleton instance\nexport const UtilityClassCollector = new UtilityClassCollectorImpl();\n", "/**\n * Client-side i18n Config Service\n * Provides cached, deduplicated access to i18n configuration\n */\n\nimport type { I18nConfig } from '../shared/types';\nimport { DEFAULT_I18N_CONFIG, migrateI18nConfig } from '../shared/i18n';\n\nlet cachedConfig: I18nConfig | null = null;\nlet configPromise: Promise<I18nConfig> | null = null;\n\n/**\n * Fetch i18n config from API with request deduplication and caching\n * Multiple simultaneous calls will share the same request\n */\nexport async function fetchI18nConfig(): Promise<I18nConfig> {\n // Return cached config if available\n if (cachedConfig) {\n return cachedConfig;\n }\n\n // Return existing promise if request is in flight\n if (configPromise) {\n return configPromise;\n }\n\n // Create new request\n configPromise = fetch('/api/config')\n .then(response => {\n if (!response.ok) {\n throw new Error('Failed to fetch config');\n }\n return response.json();\n })\n .then(config => {\n cachedConfig = migrateI18nConfig(config.i18n);\n return cachedConfig;\n })\n .catch(() => {\n cachedConfig = DEFAULT_I18N_CONFIG;\n return cachedConfig;\n })\n .finally(() => {\n configPromise = null;\n });\n\n return configPromise;\n}\n\n/**\n * Get cached i18n config synchronously\n * Returns default config if not yet loaded\n */\nexport function getI18nConfig(): I18nConfig {\n return cachedConfig || DEFAULT_I18N_CONFIG;\n}\n\n/**\n * Check if i18n config has been loaded\n */\nexport function isI18nConfigLoaded(): boolean {\n return cachedConfig !== null;\n}\n\n/**\n * Invalidate cached config (useful for HMR or config changes)\n */\nexport function invalidateI18nConfig(): void {\n cachedConfig = null;\n configPromise = null;\n}\n\n/**\n * Set config directly (useful for SSR hydration)\n */\nexport function setI18nConfig(config: I18nConfig): void {\n cachedConfig = config;\n}\n", "/**\n * CMS Template Processor (Client-side)\n *\n * Processes CMS template strings like {{cms.title}} in the preview iframe.\n * This enables live preview of CMS content when editing items.\n */\n\nimport type { I18nValue, I18nConfig } from '../../shared/types';\nimport { getI18nConfig } from '../i18nConfigService';\nimport { isRichTextMarker, richTextMarkerToHtml } from '../../shared/propResolver';\nimport { tiptapToHtml } from '../../shared/richtext/tiptapToHtml';\nimport { isTiptapDocument } from '../../shared/richtext/types';\nimport { RAW_HTML_PREFIX } from '../../shared/constants';\n\n// Re-export for backward compatibility\nexport { RAW_HTML_PREFIX };\n\n/**\n * Check if a value is an I18nValue object\n */\nfunction isI18nValue(value: unknown): value is I18nValue {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n return '_i18n' in value && (value as Record<string, unknown>)._i18n === true;\n}\n\n/**\n * Resolve an I18nValue to a string for the given locale\n * Falls back to default locale, then first available translation\n */\nfunction resolveI18nValue(value: I18nValue, locale: string, config: I18nConfig): unknown {\n // Try exact locale match\n if (value[locale] !== undefined) {\n return value[locale];\n }\n\n // Try default locale\n if (value[config.defaultLocale] !== undefined) {\n return value[config.defaultLocale];\n }\n\n // Get first available translation (skip _i18n marker)\n for (const key of Object.keys(value)) {\n if (key !== '_i18n' && value[key] !== undefined) {\n return value[key];\n }\n }\n\n return '';\n}\n\n/**\n * Process CMS template strings like {{cms.title}} or {{cms.author}}\n * Replaces template expressions with values from CMS item\n * Supports i18n values by resolving them to the current locale\n *\n * @param template - String containing {{cms.field}} patterns\n * @param cmsItem - CMS item data to interpolate\n * @param locale - Optional locale for i18n resolution (defaults to config's defaultLocale)\n * @returns Processed string with values filled in\n */\nexport function processCMSTemplate(\n template: string,\n cmsItem: Record<string, unknown>,\n locale?: string\n): string {\n const config = getI18nConfig();\n const effectiveLocale = locale || config.defaultLocale;\n\n return template.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (match, fieldPath) => {\n // Support nested paths like cms.author.name\n const parts = fieldPath.trim().split('.');\n let value: unknown = cmsItem;\n\n for (const part of parts) {\n if (value && typeof value === 'object' && part in value) {\n value = (value as Record<string, unknown>)[part];\n } else {\n // Field not found, return empty string\n return '';\n }\n }\n\n // Handle i18n values - resolve to locale-specific value, then continue\n // through rich-text detection (don't early-return, as resolved value may be Tiptap JSON)\n if (isI18nValue(value)) {\n value = resolveI18nValue(value, effectiveLocale, config);\n }\n\n // Return string representation\n if (value === null || value === undefined) {\n return '';\n }\n // Handle rich-text markers - extract HTML content for interpolation\n // Mark with RAW_HTML_PREFIX so renderer knows not to escape\n if (typeof value === 'object' && '__richtext__' in value && typeof (value as unknown as { html: string }).html === 'string') {\n return RAW_HTML_PREFIX + (value as unknown as { html: string }).html;\n }\n // Handle raw TipTap documents (fallback if not preprocessed)\n // Mark with RAW_HTML_PREFIX so renderer knows not to escape\n if (isTiptapDocument(value)) {\n return RAW_HTML_PREFIX + tiptapToHtml(value);\n }\n return String(value);\n });\n}\n\n/**\n * Process CMS templates in props object\n * Recursively processes all string values in props\n *\n * @param props - Props object with potential {{cms.field}} values\n * @param cmsItem - CMS item data to interpolate\n * @param locale - Optional locale for i18n resolution\n * @returns New props object with values filled in\n */\nexport function processCMSPropsTemplate(\n props: Record<string, unknown>,\n cmsItem: Record<string, unknown>,\n locale?: string\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === 'string' && value.includes('{{cms.')) {\n result[key] = processCMSTemplate(value, cmsItem, locale);\n } else if (value && typeof value === 'object' && !Array.isArray(value)) {\n // Recursively process nested objects (but not arrays or null)\n result[key] = processCMSPropsTemplate(value as Record<string, unknown>, cmsItem, locale);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Check if a string contains CMS template patterns\n *\n * @param text - String to check\n * @returns True if string contains {{cms.field}} patterns\n */\nexport function hasCMSTemplate(text: string): boolean {\n return text.includes('{{cms.');\n}\n", "/**\n * Embed Node Builder\n * Handles rendering of embed nodes (HTML content like SVGs, rich text, etc.)\n */\n\nimport { createElement as h } from \"react\";\nimport type { ReactElement } from \"react\";\nimport type { EmbedNode, StyleObject, ResponsiveStyleObject, InteractiveStyles } from \"../../../shared/types\";\nimport { extractAttributesFromNode } from \"../../../shared/attributeNodeUtils\";\nimport { responsiveStylesToClasses } from \"../../../shared/utilityClassMapper\";\nimport { pathToString } from \"../../../shared/pathArrayUtils\";\nimport { generateElementClassName, type ElementClassContext } from \"../../../shared/elementClassName\";\nimport { InteractiveStylesRegistry } from \"../../InteractiveStylesRegistry\";\nimport { hasInteractiveStyleMappings, extractInteractiveStyleMappings, resolveExtractedMappings } from \"../../../shared/interactiveStyleMappings\";\nimport { UtilityClassCollector } from \"../../styles/UtilityClassCollector\";\nimport DOMPurify from \"isomorphic-dompurify\";\nimport type { ElementRegistry } from \"../../elementRegistry\";\nimport type { BuilderContext } from \"./types\";\nimport { hasItemTemplates, processItemTemplate, processItemPropsTemplate, type ValueResolver } from \"../../../shared/itemTemplateUtils\";\nimport { resolveI18nValue, DEFAULT_I18N_CONFIG } from \"../../../shared/i18n\";\nimport { processCMSTemplate } from \"../cmsTemplateProcessor\";\n\nexport interface EmbedBuilderDeps {\n elementRegistry: ElementRegistry;\n getEffectiveParentComponentName: (\n componentContext: string | null,\n parentComponentName: string | null\n ) => string | null;\n /** Optional getter for current page name (for interactive styles class generation) */\n getCurrentPageName?: () => string;\n /** Optional getter for current file type (for interactive styles class generation) */\n getCurrentFileType?: () => 'page' | 'component';\n}\n\n/**\n * DOMPurify configuration for embed nodes\n * Allows safe SVG, rich-text formatting, and common elements\n * Script tags and event handlers are still removed for security\n */\nconst SANITIZE_CONFIG = {\n ALLOWED_TAGS: ['svg', 'path', 'circle', 'rect', 'line', 'polyline', 'polygon', 'g', 'text', 'tspan', 'image', 'defs', 'use', 'linearGradient', 'radialGradient', 'stop', 'clipPath', 'mask', 'pattern', 'marker', 'symbol', 'a', 'div', 'span', 'p', 'br', 'button', 'img', 'iframe', 'video', 'audio', 'source', 'canvas', 'b', 'i', 'u', 'strong', 'em', 'sub', 'sup', 'mark', 's', 'small', 'del', 'ins', 'q', 'abbr', 'code', 'pre', 'blockquote', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n ALLOWED_ATTR: ['class', 'id', 'style', 'width', 'height', 'viewBox', 'xmlns', 'fill', 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin', 'stroke-dasharray', 'stroke-dashoffset', 'd', 'cx', 'cy', 'r', 'x', 'y', 'x1', 'y1', 'x2', 'y2', 'points', 'href', 'src', 'alt', 'target', 'rel', 'data-*', 'aria-*', 'transform', 'opacity', 'fill-opacity', 'stroke-opacity', 'font-size', 'font-family', 'text-anchor', 'dominant-baseline', 'offset', 'stop-color', 'stop-opacity', 'frameborder', 'allowfullscreen', 'allow', 'title'],\n KEEP_CONTENT: true\n};\n\n/**\n * Build an embed node\n */\nexport function buildEmbed(\n node: EmbedNode,\n ctx: BuilderContext,\n deps: EmbedBuilderDeps\n): ReactElement {\n const { key, elementPath, parentComponentName, componentContext, componentRootPath, cmsItemIndexPath } = ctx;\n\n // Process templates in html property before sanitization (matching SSR behavior)\n // Mappings should already be resolved by processStructure, this is just a type safety guard\n let htmlContent = typeof node.html === 'string' ? node.html : '';\n\n // Process item template strings (for List context) - e.g., {{item.icon}}, {{feature.title}}\n if (ctx.templateContext && hasItemTemplates(htmlContent)) {\n // Create i18n resolver for template processing (matching SSR behavior)\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const i18nConfig = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, i18nConfig)\n : undefined;\n htmlContent = processItemTemplate(htmlContent, ctx.templateContext, i18nResolver);\n }\n\n // Process CMS template strings (for CMS page context) - e.g., {{cms.title}}, {{cms.description}}\n if (ctx.cmsContext && htmlContent.includes('{{cms.')) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n htmlContent = processCMSTemplate(htmlContent, ctx.cmsContext, effectiveLocale);\n }\n\n // Sanitize HTML with allowlist\n const sanitizedHtml = DOMPurify.sanitize(htmlContent, SANITIZE_CONFIG);\n const effectiveParentComponentName = deps.getEffectiveParentComponentName(componentContext, parentComponentName);\n\n // Extract attributes from node\n const extractedAttributes = extractAttributesFromNode(node as any);\n\n // Build embed node props with all features\n const embedProps: Record<string, any> = {\n key,\n 'data-element-path': pathToString(elementPath),\n 'data-embed-node': 'true',\n ref: (el: HTMLElement | null) => {\n deps.elementRegistry.register(elementPath, el, effectiveParentComponentName, false);\n // Apply CSS variables for interactive styles\n if (el) {\n const cssVariables = InteractiveStylesRegistry.getVariables(elementPath);\n if (cssVariables && Object.keys(cssVariables).length > 0) {\n for (const [varName, value] of Object.entries(cssVariables)) {\n el.style.setProperty(varName, value);\n }\n }\n }\n },\n dangerouslySetInnerHTML: { __html: sanitizedHtml }\n };\n\n // Add CMS item index path for elements inside CMS lists\n if (cmsItemIndexPath && cmsItemIndexPath.length > 0) {\n embedProps['data-cms-item-index'] = cmsItemIndexPath.join('.');\n }\n\n // Start building className\n let classNames: string[] = ['oem'];\n\n // Convert embed styles to utility classes\n if (node.style) {\n // Process item templates in style values (for List context)\n let processedStyle = node.style;\n if (ctx.templateContext) {\n // Create i18n resolver for style template processing (matching SSR behavior)\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const i18nConfig = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, i18nConfig)\n : undefined;\n processedStyle = processItemPropsTemplate(\n node.style as Record<string, unknown>,\n ctx.templateContext,\n i18nResolver\n ) as StyleObject | ResponsiveStyleObject;\n }\n const utilityClasses = responsiveStylesToClasses(processedStyle as StyleObject | ResponsiveStyleObject);\n UtilityClassCollector.collect(utilityClasses);\n classNames.push(...utilityClasses);\n }\n\n // Handle interactive styles (cast to InteractiveStyles since Zod-inferred type is slightly different)\n const nodeInteractiveStyles = node.interactiveStyles as InteractiveStyles | undefined;\n const nodeGenerateElementClass = node.generateElementClass;\n const nodeLabel = node.label;\n\n if ((nodeInteractiveStyles && nodeInteractiveStyles.length > 0) || nodeGenerateElementClass) {\n // Determine file type and name for element class generation\n const useComponentContext = Boolean(componentContext);\n const fileType = useComponentContext ? 'component' : (deps.getCurrentFileType?.() || 'page');\n const fileName = useComponentContext ? componentContext! : (deps.getCurrentPageName?.() || 'page');\n const pathForClass = useComponentContext && componentRootPath\n ? elementPath.slice(componentRootPath.length)\n : elementPath;\n\n const elementClassCtx: ElementClassContext = {\n fileType,\n fileName,\n label: nodeLabel,\n path: pathForClass,\n };\n const elementClass = generateElementClassName(elementClassCtx);\n\n // Prepend element class\n classNames.unshift(elementClass);\n\n // Register interactive styles with mapping support\n if (nodeInteractiveStyles && nodeInteractiveStyles.length > 0) {\n if (ctx.componentResolvedProps && hasInteractiveStyleMappings(nodeInteractiveStyles)) {\n const { resolvedStyles, mappings } = extractInteractiveStyleMappings(nodeInteractiveStyles);\n const cssVariables = resolveExtractedMappings(mappings, ctx.componentResolvedProps);\n InteractiveStylesRegistry.set(elementClass, resolvedStyles);\n if (Object.keys(cssVariables).length > 0) {\n InteractiveStylesRegistry.setVariables(elementPath, cssVariables);\n }\n } else {\n InteractiveStylesRegistry.set(elementClass, nodeInteractiveStyles);\n }\n\n // Apply preview classes when previewProp is set and truthy\n if (ctx.componentResolvedProps) {\n const previewClasses: string[] = [];\n for (const rule of nodeInteractiveStyles) {\n if (rule.previewProp && ctx.componentResolvedProps[rule.previewProp] === true) {\n const styleClasses = responsiveStylesToClasses(rule.style as StyleObject | ResponsiveStyleObject);\n UtilityClassCollector.collect(styleClasses);\n previewClasses.push(...styleClasses);\n }\n }\n if (previewClasses.length > 0) {\n classNames.push(...previewClasses);\n }\n }\n }\n }\n\n // Add extracted attributes className if present\n if (extractedAttributes.className) {\n const attrClasses = (extractedAttributes.className as string).split(/\\s+/);\n classNames.push(...attrClasses);\n delete extractedAttributes.className;\n }\n\n // Set final className\n if (classNames.length > 0) {\n embedProps.className = classNames.filter(Boolean).join(' ');\n }\n\n // Process item templates in extracted attributes (for List context)\n let processedAttributes = extractedAttributes;\n if (ctx.templateContext && Object.keys(extractedAttributes).length > 0) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n processedAttributes = processItemPropsTemplate(\n extractedAttributes, ctx.templateContext, i18nResolver\n ) as Record<string, string | number | boolean>;\n }\n\n // Add extracted attributes (like class, id, data-*, aria-*, etc.)\n if (Object.keys(processedAttributes).length > 0) {\n Object.assign(embedProps, processedAttributes);\n }\n\n // Add parent component context\n if (effectiveParentComponentName) {\n embedProps['data-parent-component'] = effectiveParentComponentName;\n }\n if (componentContext) {\n embedProps['data-component-context'] = componentContext;\n }\n\n // Always use span for embeds - valid inside <p> and other phrasing content\n return h('span', embedProps);\n}\n", "/**\n * Link Node Builder\n * Handles rendering of link nodes (links rendered as div in editor)\n */\n\nimport { createElement as h } from \"react\";\nimport type { ReactElement } from \"react\";\nimport type { LinkNode, StyleObject, ResponsiveStyleObject, InteractiveStyles } from \"../../../shared/types\";\nimport { extractAttributesFromNode } from \"../../../shared/attributeNodeUtils\";\nimport { responsiveStylesToClasses } from \"../../../shared/utilityClassMapper\";\nimport { pathToString } from \"../../../shared/pathArrayUtils\";\nimport { generateElementClassName, type ElementClassContext } from \"../../../shared/elementClassName\";\nimport { InteractiveStylesRegistry } from \"../../InteractiveStylesRegistry\";\nimport { hasInteractiveStyleMappings, extractInteractiveStyleMappings, resolveExtractedMappings } from \"../../../shared/interactiveStyleMappings\";\nimport { processItemPropsTemplate, type ValueResolver } from \"../../../shared/itemTemplateUtils\";\nimport { UtilityClassCollector } from \"../../styles/UtilityClassCollector\";\nimport { resolveI18nValue, DEFAULT_I18N_CONFIG } from \"../../../shared/i18n\";\nimport { isCurrentLink } from \"../../../shared/linkUtils\";\nimport type { ElementRegistry } from \"../../elementRegistry\";\nimport type { BuilderContext, BuildResult, BuildChildrenContext } from \"./types\";\n\nexport interface LinkNodeBuilderDeps {\n elementRegistry: ElementRegistry;\n buildChildren: (\n children: unknown,\n ctx: BuildChildrenContext\n ) => BuildResult;\n getEffectiveParentComponentName: (\n componentContext: string | null,\n parentComponentName: string | null\n ) => string | null;\n /** Optional getter for current page name (for interactive styles class generation) */\n getCurrentPageName?: () => string;\n /** Optional getter for current file type (for interactive styles class generation) */\n getCurrentFileType?: () => 'page' | 'component';\n /** Optional getter for current page path (for is-current class on link nodes) */\n getCurrentPagePath?: () => string;\n}\n\n/**\n * Build a link node (renders as div in editor)\n */\nexport function buildLinkNode(\n node: LinkNode,\n children: unknown,\n ctx: BuilderContext,\n deps: LinkNodeBuilderDeps\n): ReactElement {\n const {\n key, elementPath, parentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap,\n itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n } = ctx;\n\n const effectiveParentComponentName = deps.getEffectiveParentComponentName(componentContext, parentComponentName);\n\n // Extract attributes\n const extractedAttributes = extractAttributesFromNode(node as any);\n\n // Build link node props (renders as div in editor)\n const linkNodeProps: Record<string, any> = {\n key,\n 'data-element-path': pathToString(elementPath),\n 'data-link-node': 'true',\n ref: (el: HTMLElement | null) => {\n deps.elementRegistry.register(elementPath, el, effectiveParentComponentName, false);\n // Apply CSS variables for interactive styles\n if (el) {\n const cssVariables = InteractiveStylesRegistry.getVariables(elementPath);\n if (cssVariables && Object.keys(cssVariables).length > 0) {\n for (const [varName, value] of Object.entries(cssVariables)) {\n el.style.setProperty(varName, value);\n }\n }\n }\n }\n };\n\n // Add CMS item index path for elements inside CMS lists\n if (cmsItemIndexPath && cmsItemIndexPath.length > 0) {\n linkNodeProps['data-cms-item-index'] = cmsItemIndexPath.join('.');\n }\n\n // Start building className\n let classNames: string[] = [];\n\n // Convert link node styles to utility classes\n if (node.style) {\n // Process item templates in style values (for List context)\n let processedStyle = node.style;\n if (ctx.templateContext) {\n // Create i18n resolver for style template processing (matching SSR behavior)\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const i18nConfig = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, i18nConfig)\n : undefined;\n processedStyle = processItemPropsTemplate(\n node.style as Record<string, unknown>,\n ctx.templateContext,\n i18nResolver\n ) as StyleObject | ResponsiveStyleObject;\n }\n const utilityClasses = responsiveStylesToClasses(processedStyle as StyleObject | ResponsiveStyleObject);\n UtilityClassCollector.collect(utilityClasses);\n classNames.push(...utilityClasses);\n }\n\n // Handle interactive styles (cast to InteractiveStyles since Zod-inferred type is slightly different)\n const nodeInteractiveStyles = node.interactiveStyles as InteractiveStyles | undefined;\n const nodeGenerateElementClass = node.generateElementClass;\n const nodeLabel = node.label;\n\n if ((nodeInteractiveStyles && nodeInteractiveStyles.length > 0) || nodeGenerateElementClass) {\n // Determine file type and name for element class generation\n const useComponentContext = Boolean(componentContext);\n const fileType = useComponentContext ? 'component' : (deps.getCurrentFileType?.() || 'page');\n const fileName = useComponentContext ? componentContext! : (deps.getCurrentPageName?.() || 'page');\n const pathForClass = useComponentContext && componentRootPath\n ? elementPath.slice(componentRootPath.length)\n : elementPath;\n\n const elementClassCtx: ElementClassContext = {\n fileType,\n fileName,\n label: nodeLabel,\n path: pathForClass,\n };\n const elementClass = generateElementClassName(elementClassCtx);\n\n // Prepend element class\n classNames.unshift(elementClass);\n\n // Register interactive styles with mapping support\n if (nodeInteractiveStyles && nodeInteractiveStyles.length > 0) {\n if (ctx.componentResolvedProps && hasInteractiveStyleMappings(nodeInteractiveStyles)) {\n const { resolvedStyles, mappings } = extractInteractiveStyleMappings(nodeInteractiveStyles);\n const cssVariables = resolveExtractedMappings(mappings, ctx.componentResolvedProps);\n InteractiveStylesRegistry.set(elementClass, resolvedStyles);\n if (Object.keys(cssVariables).length > 0) {\n InteractiveStylesRegistry.setVariables(elementPath, cssVariables);\n }\n } else {\n InteractiveStylesRegistry.set(elementClass, nodeInteractiveStyles);\n }\n\n // Apply preview classes when previewProp is set and truthy\n if (ctx.componentResolvedProps) {\n const previewClasses: string[] = [];\n for (const rule of nodeInteractiveStyles) {\n if (rule.previewProp && ctx.componentResolvedProps[rule.previewProp] === true) {\n const styleClasses = responsiveStylesToClasses(rule.style as StyleObject | ResponsiveStyleObject);\n UtilityClassCollector.collect(styleClasses);\n previewClasses.push(...styleClasses);\n }\n }\n if (previewClasses.length > 0) {\n classNames.push(...previewClasses);\n }\n }\n }\n }\n\n // Add extracted attributes className if present\n if (extractedAttributes.className) {\n const attrClasses = (extractedAttributes.className as string).split(/\\s+/);\n classNames.push(...attrClasses);\n delete extractedAttributes.className;\n }\n\n // Add is-current class when link href matches current page path\n if (deps.getCurrentPagePath && typeof node.href === 'string') {\n if (isCurrentLink(node.href, deps.getCurrentPagePath())) {\n classNames.push('is-current');\n }\n }\n\n // Set final className\n if (classNames.length > 0) {\n linkNodeProps.className = classNames.filter(Boolean).join(' ');\n }\n\n // Process item templates in extracted attributes (for List context)\n let processedAttributes = extractedAttributes;\n if (ctx.templateContext && Object.keys(extractedAttributes).length > 0) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n processedAttributes = processItemPropsTemplate(\n extractedAttributes, ctx.templateContext, i18nResolver\n ) as Record<string, string | number | boolean>;\n }\n\n // Add extracted attributes (like class, id, data-*, aria-*, etc.)\n if (Object.keys(processedAttributes).length > 0) {\n Object.assign(linkNodeProps, processedAttributes);\n }\n\n // Add parent component context\n if (effectiveParentComponentName) {\n linkNodeProps['data-parent-component'] = effectiveParentComponentName;\n }\n if (componentContext) {\n linkNodeProps['data-component-context'] = componentContext;\n }\n\n // Build children recursively\n const linkNodeChildren = deps.buildChildren(children, {\n elementPath, parentComponentName: effectiveParentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap, itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n });\n\n return h('div', linkNodeProps, linkNodeChildren);\n}\n", "/**\n * Locale List Node Builder\n * Handles rendering of locale/language switcher nodes\n */\n\nimport { createElement as h } from \"react\";\nimport type { ReactElement } from \"react\";\nimport type { LocaleListNode, StyleObject, ResponsiveStyleObject, InteractiveStyles } from \"../../../shared/types\";\nimport { extractAttributesFromNode } from \"../../../shared/attributeNodeUtils\";\nimport { responsiveStylesToClasses } from \"../../../shared/utilityClassMapper\";\nimport { pathToString } from \"../../../shared/pathArrayUtils\";\nimport { generateElementClassName, type ElementClassContext } from \"../../../shared/elementClassName\";\nimport { InteractiveStylesRegistry } from \"../../InteractiveStylesRegistry\";\nimport { hasInteractiveStyleMappings, extractInteractiveStyleMappings, resolveExtractedMappings } from \"../../../shared/interactiveStyleMappings\";\nimport { UtilityClassCollector } from \"../../styles/UtilityClassCollector\";\nimport type { ElementRegistry } from \"../../elementRegistry\";\nimport type { BuilderContext } from \"./types\";\n\nexport interface LocaleListBuilderDeps {\n elementRegistry: ElementRegistry;\n getEffectiveParentComponentName: (\n componentContext: string | null,\n parentComponentName: string | null\n ) => string | null;\n /** Optional getter for current page name (for interactive styles class generation) */\n getCurrentPageName?: () => string;\n /** Optional getter for current file type (for interactive styles class generation) */\n getCurrentFileType?: () => 'page' | 'component';\n}\n\n/**\n * Build a locale list node (language switcher)\n */\nexport function buildLocaleList(\n node: LocaleListNode,\n ctx: BuilderContext,\n deps: LocaleListBuilderDeps\n): ReactElement {\n const {\n key, elementPath, parentComponentName, componentContext, componentRootPath,\n locale, i18nConfig, cmsItemIndexPath\n } = ctx;\n\n const effectiveParentComponentName = deps.getEffectiveParentComponentName(componentContext, parentComponentName);\n\n // Extract attributes\n const extractedAttributes = extractAttributesFromNode(node as any);\n\n // Build locale list props\n const localeListProps: Record<string, any> = {\n key,\n 'data-element-path': pathToString(elementPath),\n 'data-locale-list': 'true',\n ref: (el: HTMLElement | null) => {\n deps.elementRegistry.register(elementPath, el, effectiveParentComponentName, false);\n // Apply CSS variables for interactive styles\n if (el) {\n const cssVariables = InteractiveStylesRegistry.getVariables(elementPath);\n if (cssVariables && Object.keys(cssVariables).length > 0) {\n for (const [varName, value] of Object.entries(cssVariables)) {\n el.style.setProperty(varName, value);\n }\n }\n }\n }\n };\n\n // Add CMS item index path for elements inside CMS lists\n if (cmsItemIndexPath && cmsItemIndexPath.length > 0) {\n localeListProps['data-cms-item-index'] = cmsItemIndexPath.join('.');\n }\n\n // Start building className\n let classNames: string[] = [];\n\n // Convert container styles to utility classes\n if (node.style) {\n const utilityClasses = responsiveStylesToClasses(node.style as StyleObject | ResponsiveStyleObject);\n UtilityClassCollector.collect(utilityClasses);\n classNames.push(...utilityClasses);\n }\n\n // Handle interactive styles (cast to InteractiveStyles since Zod-inferred type is slightly different)\n const nodeInteractiveStyles = node.interactiveStyles as InteractiveStyles | undefined;\n const nodeGenerateElementClass = node.generateElementClass;\n const nodeLabel = node.label;\n\n if ((nodeInteractiveStyles && nodeInteractiveStyles.length > 0) || nodeGenerateElementClass) {\n // Determine file type and name for element class generation\n const useComponentContext = Boolean(componentContext);\n const fileType = useComponentContext ? 'component' : (deps.getCurrentFileType?.() || 'page');\n const fileName = useComponentContext ? componentContext! : (deps.getCurrentPageName?.() || 'page');\n const pathForClass = useComponentContext && componentRootPath\n ? elementPath.slice(componentRootPath.length)\n : elementPath;\n\n const elementClassCtx: ElementClassContext = {\n fileType,\n fileName,\n label: nodeLabel,\n path: pathForClass,\n };\n const elementClass = generateElementClassName(elementClassCtx);\n\n // Prepend element class\n classNames.unshift(elementClass);\n\n // Register interactive styles with mapping support\n if (nodeInteractiveStyles && nodeInteractiveStyles.length > 0) {\n if (ctx.componentResolvedProps && hasInteractiveStyleMappings(nodeInteractiveStyles)) {\n const { resolvedStyles, mappings } = extractInteractiveStyleMappings(nodeInteractiveStyles);\n const cssVariables = resolveExtractedMappings(mappings, ctx.componentResolvedProps);\n InteractiveStylesRegistry.set(elementClass, resolvedStyles);\n if (Object.keys(cssVariables).length > 0) {\n InteractiveStylesRegistry.setVariables(elementPath, cssVariables);\n }\n } else {\n InteractiveStylesRegistry.set(elementClass, nodeInteractiveStyles);\n }\n\n // Apply preview classes when previewProp is set and truthy\n if (ctx.componentResolvedProps) {\n const previewClasses: string[] = [];\n for (const rule of nodeInteractiveStyles) {\n if (rule.previewProp && ctx.componentResolvedProps[rule.previewProp] === true) {\n const styleClasses = responsiveStylesToClasses(rule.style as StyleObject | ResponsiveStyleObject);\n UtilityClassCollector.collect(styleClasses);\n previewClasses.push(...styleClasses);\n }\n }\n if (previewClasses.length > 0) {\n classNames.push(...previewClasses);\n }\n }\n }\n }\n\n // Add extracted attributes className if present\n if (extractedAttributes.className) {\n const attrClasses = (extractedAttributes.className as string).split(/\\s+/);\n classNames.push(...attrClasses);\n delete extractedAttributes.className;\n }\n\n // Set final className\n if (classNames.length > 0) {\n localeListProps.className = classNames.filter(Boolean).join(' ');\n }\n\n // Add extracted attributes\n if (Object.keys(extractedAttributes).length > 0) {\n Object.assign(localeListProps, extractedAttributes);\n }\n\n // Add parent component context\n if (effectiveParentComponentName) {\n localeListProps['data-parent-component'] = effectiveParentComponentName;\n }\n if (componentContext) {\n localeListProps['data-component-context'] = componentContext;\n }\n\n // Build locale links for editor preview using actual i18n config\n const showCurrent = node.showCurrent !== false;\n const showSeparator = node.showSeparator !== false;\n const showFlag = node.showFlag !== false;\n // Use actual locales from i18nConfig (LocaleConfig[])\n const configLocales = i18nConfig?.locales || [];\n const currentLocaleCode = locale || i18nConfig?.defaultLocale || 'en';\n\n // Convert item styles, active item styles, separator styles, and flag styles to utility classes\n const itemClasses = node.itemStyle ? responsiveStylesToClasses(node.itemStyle as StyleObject | ResponsiveStyleObject) : [];\n const activeItemClasses = node.activeItemStyle ? responsiveStylesToClasses(node.activeItemStyle as StyleObject | ResponsiveStyleObject) : [];\n const separatorClasses = node.separatorStyle ? responsiveStylesToClasses(node.separatorStyle as StyleObject | ResponsiveStyleObject) : [];\n const flagClasses = node.flagStyle ? responsiveStylesToClasses(node.flagStyle as StyleObject | ResponsiveStyleObject) : [];\n UtilityClassCollector.collect(itemClasses);\n UtilityClassCollector.collect(activeItemClasses);\n UtilityClassCollector.collect(separatorClasses);\n UtilityClassCollector.collect(flagClasses);\n\n // Build locale links from config\n const linkElements: ReactElement[] = [];\n for (let i = 0; i < configLocales.length; i++) {\n const localeConfig = configLocales[i];\n const isCurrent = localeConfig.code === currentLocaleCode;\n if (!showCurrent && isCurrent) continue;\n\n // Add separator between links (empty span styled via separatorStyle)\n if (showSeparator && linkElements.length > 0) {\n linkElements.push(h('span', {\n key: `sep-${i}`,\n className: separatorClasses.length > 0 ? separatorClasses.join(' ') : undefined\n }));\n }\n\n // Build link element content - flag icon (if enabled and exists) + nativeName in span\n const linkContent: (ReactElement | string)[] = [];\n if (showFlag && localeConfig.icon) {\n linkContent.push(h('img', {\n key: 'flag',\n src: localeConfig.icon,\n alt: `${localeConfig.name} flag`,\n className: flagClasses.length > 0 ? flagClasses.join(' ') : undefined\n }));\n }\n // Get display text based on displayType (mirrors SSR logic)\n const displayType = node.displayType || 'nativeName';\n let displayText: string;\n switch (displayType) {\n case 'code':\n displayText = localeConfig.code.toUpperCase();\n break;\n case 'name':\n displayText = localeConfig.name;\n break;\n case 'nativeName':\n default:\n displayText = localeConfig.nativeName;\n break;\n }\n linkContent.push(h('div', { key: 'text' }, displayText));\n\n // Current item gets both itemClasses + activeItemClasses (additive/override)\n const linkClasses = isCurrent ? [...itemClasses, ...activeItemClasses] : itemClasses;\n linkElements.push(h('div', {\n key: `locale-${localeConfig.code}`,\n 'data-current': isCurrent ? 'true' : 'false',\n 'data-locale': localeConfig.code,\n className: linkClasses.length > 0 ? linkClasses.join(' ') : undefined,\n style: { cursor: 'pointer' }\n }, ...linkContent));\n }\n\n return h('div', localeListProps, linkElements);\n}\n", "/**\n * Unified List Node Builder\n * Handles rendering of list nodes with item iteration from either:\n * - Component props (sourceType: 'prop')\n * - CMS collections (sourceType: 'collection')\n */\n\nimport { createElement as h, Fragment } from \"react\";\nimport type { ReactElement } from \"react\";\nimport type { ListNode } from \"../../../shared/registry/nodeTypes/ListNodeType\";\nimport type { CMSItem, CMSFilterCondition, CMSSortConfig, CMSFilterOperator } from \"../../../shared/types/cms\";\nimport { singularize, isItemDraftForLocale } from \"../../../shared/types/cms\";\nimport { buildTemplateContext, resolveItemsTemplate, getNestedValue } from \"../../../shared/itemTemplateUtils\";\nimport type { TemplateContext } from \"../../../shared/types/cms\";\nimport { pathToString } from \"../../../shared/pathArrayUtils\";\nimport { extractAttributesFromNode } from \"../../../shared/attributeNodeUtils\";\nimport type { ElementRegistry } from \"../../elementRegistry\";\nimport type { BuilderContext, BuildResult, BuildChildrenContext } from \"./types\";\n\nexport interface ListBuilderDeps {\n elementRegistry: ElementRegistry;\n buildChildren: (\n children: unknown,\n ctx: BuildChildrenContext\n ) => BuildResult;\n getEffectiveParentComponentName: (\n componentContext: string | null,\n parentComponentName: string | null\n ) => string | null;\n}\n\n/**\n * Build a unified list node - handles both prop and collection source types\n */\nexport function buildList(\n node: ListNode,\n children: unknown,\n ctx: BuilderContext,\n deps: ListBuilderDeps\n): ReactElement {\n const {\n key, elementPath, parentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap = {},\n cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n } = ctx;\n\n // Determine source type (default to 'prop', but handle legacy 'cms-list' type)\n const nodeType = (node as any).type;\n const isLegacyCMSList = nodeType === 'cms-list';\n const sourceType = isLegacyCMSList ? 'collection' : (node.sourceType || 'prop');\n const isCollectionMode = sourceType === 'collection';\n\n // Get source - handle both new 'source' and legacy 'collection' property\n // Source can be a string (prop name) or array (pre-resolved by processStructure)\n const rawSource = node.source || (node as any).collection;\n const source = typeof rawSource === 'string' ? rawSource : '';\n const sourceIsResolved = Array.isArray(rawSource);\n\n const effectiveParentComponentName = deps.getEffectiveParentComponentName(componentContext, parentComponentName);\n\n // Extract attributes\n const extractedAttributes = extractAttributesFromNode(node as any);\n\n // Build container props with appropriate data attributes\n const containerProps: Record<string, any> = {\n key,\n 'data-element-path': pathToString(elementPath),\n ref: (el: HTMLElement | null) => {\n deps.elementRegistry.register(elementPath, el, effectiveParentComponentName, false);\n }\n };\n\n // Set data attributes based on source type\n // All list types need data-cms-list for click handler to find them\n containerProps['data-cms-list'] = 'true';\n if (isCollectionMode) {\n containerProps['data-collection'] = source || '';\n } else {\n containerProps['data-list'] = 'true';\n containerProps['data-source'] = source || (sourceIsResolved ? 'resolved' : '');\n }\n\n // Add extracted attributes\n if (Object.keys(extractedAttributes).length > 0) {\n Object.assign(containerProps, extractedAttributes);\n }\n\n // Add parent component context\n if (effectiveParentComponentName) {\n containerProps['data-parent-component'] = effectiveParentComponentName;\n }\n if (componentContext) {\n containerProps['data-component-context'] = componentContext;\n }\n\n // Get items based on source type\n let itemsToRender: unknown[];\n\n if (isCollectionMode) {\n itemsToRender = getCollectionItems(node, source, ctx);\n } else {\n // Prop mode: Read from component props or template context\n // If source was already resolved to an array by processStructure (e.g., from {{features}}),\n // use it directly instead of looking up by prop name\n if (sourceIsResolved) {\n itemsToRender = rawSource as unknown[];\n } else if (source) {\n itemsToRender = getPropItems(source, ctx);\n } else {\n itemsToRender = [];\n }\n }\n\n // Determine variable name for this list's items\n let variableName: string;\n if (node.itemAs) {\n variableName = node.itemAs;\n } else if (isCollectionMode) {\n variableName = singularize(source);\n } else {\n variableName = 'item';\n }\n\n // Different colors for collection vs prop modes\n const bgColor = isCollectionMode ? 'rgba(139, 92, 246, 0.05)' : 'rgba(59, 130, 246, 0.05)';\n const borderColor = isCollectionMode ? 'rgba(139, 92, 246, 0.3)' : 'rgba(59, 130, 246, 0.3)';\n const textColor = isCollectionMode ? '#8b5cf6' : '#3b82f6';\n const label = isCollectionMode ? 'CMS List' : 'List';\n\n // Use configurable tag (defaults to 'div') - null means fragment mode (no wrapper)\n const tag = typeof node.tag === 'string' ? node.tag : null;\n\n if (!source && !sourceIsResolved) {\n // No source - render empty container with placeholder\n const emptyState = h('div', {\n key: 'list-empty',\n style: {\n padding: '12px',\n background: bgColor,\n border: `1px dashed ${borderColor}`,\n borderRadius: '4px',\n color: textColor,\n fontSize: '12px',\n fontFamily: 'system-ui, sans-serif',\n textAlign: 'center'\n }\n }, `${label}: No source - No items`);\n if (tag === null) {\n return emptyState;\n }\n return h(tag, containerProps, emptyState);\n }\n\n if (itemsToRender.length === 0) {\n // No items - render empty container with placeholder\n const emptyState = h('div', {\n key: 'list-empty',\n style: {\n padding: '12px',\n background: bgColor,\n border: `1px dashed ${borderColor}`,\n borderRadius: '4px',\n color: textColor,\n fontSize: '12px',\n fontFamily: 'system-ui, sans-serif',\n textAlign: 'center'\n }\n }, `${label}: ${source || 'resolved'} - No items`);\n if (tag === null) {\n return emptyState;\n }\n return h(tag, containerProps, emptyState);\n }\n\n // Render children for each item\n const renderedItems: (ReactElement | string | number)[] = [];\n\n for (let index = 0; index < itemsToRender.length; index++) {\n const item = itemsToRender[index];\n // Build template context for this item\n const itemTemplateContext = buildTemplateContext(\n variableName,\n item as CMSItem,\n index,\n itemsToRender.length,\n templateContext || undefined\n );\n\n // Build children with item context\n // Track item index for BOTH collection and prop mode (enables selection of individual list items)\n const newIndexPath = [...(cmsItemIndexPath || []), index];\n const newListPaths = [...(cmsListPaths || []), elementPath];\n\n const itemChildren = deps.buildChildren(children, {\n elementPath,\n parentComponentName: effectiveParentComponentName,\n viewportWidth,\n componentContext,\n componentRootPath,\n locale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n itemContext: null,\n cmsItemIndexPath: newIndexPath,\n cmsListPaths: newListPaths,\n templateContext: itemTemplateContext,\n componentResolvedProps\n });\n\n // Add children directly (no wrapper div)\n if (itemChildren === null) continue;\n if (Array.isArray(itemChildren)) {\n // Add unique keys by combining original key with item index\n for (const child of itemChildren) {\n if (typeof child === 'object' && child !== null && 'key' in child) {\n renderedItems.push({ ...child, key: `${child.key}-item-${index}` } as ReactElement);\n } else {\n renderedItems.push(child);\n }\n }\n } else if (typeof itemChildren === 'object' && itemChildren !== null && 'key' in itemChildren) {\n // Single child - ensure unique key\n renderedItems.push({ ...itemChildren, key: `${(itemChildren as ReactElement).key}-item-${index}` } as ReactElement);\n } else {\n renderedItems.push(itemChildren);\n }\n }\n\n if (tag === null) {\n return h(Fragment, null, renderedItems);\n }\n return h(tag, containerProps, renderedItems);\n}\n\n// ============================================================================\n// Item Fetching Functions\n// ============================================================================\n\n/**\n * Get items from CMS collection (for sourceType: 'collection')\n */\nfunction getCollectionItems(node: ListNode, source: string, ctx: BuilderContext): CMSItem[] {\n const { collectionItemsMap = {}, cmsContext, templateContext } = ctx;\n const collectionItems = source ? (collectionItemsMap[source] || []) : [];\n\n // Helper to lookup items by ID or filename\n const lookupItemsByIds = (ids: string[], items: CMSItem[]): CMSItem[] => {\n const itemMap = new Map(items.map(item => [item._id, item]));\n const filenameMap = new Map(items.map(item => [item._filename, item]));\n return ids\n .filter(Boolean)\n .map(id => itemMap.get(id) || filenameMap.get(id))\n .filter((item): item is CMSItem => item !== undefined);\n };\n\n let itemsToRender: CMSItem[] = [];\n\n // Check if items are specified directly (for nested reference lists)\n if (node.items) {\n // If items is a template expression, resolve it from current context\n if (typeof node.items === 'string' && node.items.startsWith('{{')) {\n let resolvedIds: string | string[] | undefined;\n\n // Check if this is a CMS template ({{cms.field}}) - resolve from cmsContext\n if (node.items.startsWith('{{cms.') && cmsContext) {\n const fieldPath = node.items.slice(6, -2); // Extract \"field\" from \"{{cms.field}}\"\n let value: unknown = cmsContext;\n for (const part of fieldPath.split('.')) {\n if (value && typeof value === 'object' && part in value) {\n value = (value as Record<string, unknown>)[part];\n } else {\n value = undefined;\n break;\n }\n }\n if (value !== null && value !== undefined) {\n resolvedIds = Array.isArray(value) ? value.map(v => String(v)) : String(value);\n }\n } else {\n // Otherwise resolve from template context (for nested lists)\n const effectiveTemplateContext = templateContext || { _type: 'template' as const };\n resolvedIds = resolveItemsTemplate(node.items, effectiveTemplateContext);\n }\n\n if (resolvedIds) {\n const ids = Array.isArray(resolvedIds) ? resolvedIds : [resolvedIds];\n itemsToRender = lookupItemsByIds(ids, collectionItems);\n }\n } else {\n // Direct IDs (string or array)\n const ids = Array.isArray(node.items) ? node.items : [node.items];\n itemsToRender = lookupItemsByIds(ids, collectionItems);\n }\n\n // Apply filters and sorting to referenced items\n if (node.filter) {\n itemsToRender = applyClientFilters(itemsToRender, node.filter as CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown>, cmsContext ?? undefined, templateContext ?? undefined);\n }\n if (node.sort) {\n itemsToRender = applyClientSorting(itemsToRender, node.sort);\n }\n } else {\n // Get items for this collection from the map\n itemsToRender = [...collectionItems];\n\n // Apply filters (BEFORE offset/limit)\n if (node.filter) {\n itemsToRender = applyClientFilters(itemsToRender, node.filter as CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown>, cmsContext ?? undefined, templateContext ?? undefined);\n }\n\n // Apply sorting (BEFORE offset/limit)\n if (node.sort) {\n itemsToRender = applyClientSorting(itemsToRender, node.sort);\n }\n\n // Apply offset and limit (AFTER filter/sort)\n if (node.offset) {\n itemsToRender = itemsToRender.slice(node.offset);\n }\n if (node.limit) {\n itemsToRender = itemsToRender.slice(0, node.limit);\n }\n }\n\n // Filter draft items for the current locale\n const locale = ctx.locale || ctx.cmsLocale;\n if (locale) {\n itemsToRender = itemsToRender.filter(item => !isItemDraftForLocale(item, locale));\n }\n\n // Exclude current item if option is set and we have a current CMS context\n if (node.excludeCurrentItem && cmsContext && (cmsContext as any)._id) {\n const currentId = (cmsContext as any)._id as string;\n itemsToRender = itemsToRender.filter(item => item._id !== currentId);\n }\n\n return itemsToRender;\n}\n\n/**\n * Get items from component props or template context (for sourceType: 'prop')\n */\nfunction getPropItems(source: string, ctx: BuilderContext): unknown[] {\n const { componentResolvedProps, templateContext, cmsContext } = ctx;\n\n // Check if source is a template expression\n if (source.startsWith('{{') && source.endsWith('}}')) {\n // Template expression - resolve from template context (for nested lists)\n // e.g., {{category.items}} where category is from parent list\n if (templateContext) {\n const path = source.slice(2, -2).trim(); // Extract \"category.items\"\n const resolved = getNestedValue(templateContext as Record<string, unknown>, path);\n if (Array.isArray(resolved)) {\n return resolved;\n }\n }\n return [];\n }\n\n // Direct prop name - resolve from component props\n if (componentResolvedProps) {\n const propValue = componentResolvedProps[source];\n if (Array.isArray(propValue)) {\n return propValue;\n }\n }\n\n // Also try CMS context for prop mode (for cms context values)\n if (cmsContext) {\n const cmsValue = (cmsContext as Record<string, unknown>)[source];\n if (Array.isArray(cmsValue)) {\n return cmsValue;\n }\n }\n\n return [];\n}\n\n// ============================================================================\n// Filter and Sort Helper Functions\n// ============================================================================\n\n/**\n * Apply filters to items (client-side)\n */\nfunction applyClientFilters(\n items: CMSItem[],\n filter: CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown>,\n cmsContext?: Record<string, unknown>,\n templateContext?: TemplateContext\n): CMSItem[] {\n // Handle simple object filter: { featured: true }\n if (!Array.isArray(filter) && !isFilterCondition(filter)) {\n return items.filter(item =>\n Object.entries(filter).every(([key, value]) => {\n const resolvedValue = resolveTemplateValue(value, cmsContext, templateContext);\n return item[key] === resolvedValue;\n })\n );\n }\n\n // Handle array of conditions or single condition\n const conditions = Array.isArray(filter) ? filter : [filter as CMSFilterCondition];\n return items.filter(item =>\n conditions.every(cond => matchCondition(item, cond, cmsContext, templateContext))\n );\n}\n\nfunction isFilterCondition(obj: unknown): obj is CMSFilterCondition {\n return typeof obj === 'object' && obj !== null && 'field' in obj;\n}\n\n/**\n * Resolve template value like {{cms.category}} or {{category.slug}} from context\n */\nfunction resolveTemplateValue(\n value: unknown,\n cmsContext?: Record<string, unknown>,\n templateContext?: TemplateContext\n): unknown {\n if (typeof value !== 'string' || !value.startsWith('{{') || !value.endsWith('}}')) {\n return value;\n }\n\n const path = value.slice(2, -2).trim(); // Remove {{ and }}\n\n // Handle {{cms.field}} - resolve from CMS context\n if (path.startsWith('cms.') && cmsContext) {\n const fieldPath = path.slice(4); // Remove 'cms.'\n let result: unknown = cmsContext;\n for (const part of fieldPath.split('.')) {\n if (result && typeof result === 'object' && part in result) {\n result = (result as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return result;\n }\n\n // Handle {{itemAs.field}} - resolve from template context (for nested lists)\n if (templateContext) {\n const result = getNestedValue(templateContext as Record<string, unknown>, path);\n if (result !== undefined) {\n return result;\n }\n }\n\n return value; // Return as-is if can't resolve\n}\n\nfunction matchCondition(\n item: CMSItem,\n condition: CMSFilterCondition,\n cmsContext?: Record<string, unknown>,\n templateContext?: TemplateContext\n): boolean {\n const value = item[condition.field];\n const target = resolveTemplateValue(condition.value, cmsContext, templateContext);\n const op: CMSFilterOperator = condition.operator || 'eq';\n\n switch (op) {\n case 'eq': return value === target;\n case 'neq': return value !== target;\n case 'gt': return typeof value === 'number' && typeof target === 'number' && value > target;\n case 'gte': return typeof value === 'number' && typeof target === 'number' && value >= target;\n case 'lt': return typeof value === 'number' && typeof target === 'number' && value < target;\n case 'lte': return typeof value === 'number' && typeof target === 'number' && value <= target;\n case 'contains': return typeof value === 'string' && typeof target === 'string' && value.includes(target);\n case 'in': return Array.isArray(target) && target.includes(value);\n default: return false;\n }\n}\n\n/**\n * Apply sorting to items (client-side)\n */\nfunction applyClientSorting(\n items: CMSItem[],\n sort: CMSSortConfig | CMSSortConfig[]\n): CMSItem[] {\n const sorts = Array.isArray(sort) ? sort : [sort];\n\n return [...items].sort((a, b) => {\n for (const s of sorts) {\n const aVal = a[s.field];\n const bVal = b[s.field];\n const isDesc = s.order === 'desc';\n\n if (aVal === bVal) continue;\n if (aVal === undefined || aVal === null) return isDesc ? -1 : 1;\n if (bVal === undefined || bVal === null) return isDesc ? 1 : -1;\n\n let cmp = 0;\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n cmp = aVal.localeCompare(bVal);\n } else if (typeof aVal === 'number' && typeof bVal === 'number') {\n cmp = aVal - bVal;\n } else {\n cmp = String(aVal).localeCompare(String(bVal));\n }\n\n if (cmp !== 0) return isDesc ? -cmp : cmp;\n }\n return 0;\n });\n}\n", "/**\n * Link Component Builder\n * Handles rendering of Link components with navigation and prefetching\n */\n\nimport { createElement as h } from \"react\";\nimport type { ReactElement } from \"react\";\nimport { navigateTo } from \"../../navigation\";\nimport { pathToString } from \"../../../shared/pathArrayUtils\";\nimport type { ElementRegistry } from \"../../elementRegistry\";\nimport type { PrefetchService } from \"../../services/PrefetchService\";\nimport type { PrefetchStrategy } from \"../../../shared/types/prefetch\";\nimport type { BuilderContext, BuildResult, BuildChildrenContext } from \"./types\";\n\nexport interface LinkBuilderDeps {\n elementRegistry: ElementRegistry;\n prefetchService?: PrefetchService;\n buildChildren: (\n children: unknown,\n ctx: BuildChildrenContext\n ) => BuildResult;\n getEffectiveParentComponentName: (\n componentContext: string | null,\n parentComponentName: string | null\n ) => string | null;\n}\n\n/**\n * Build a Link component (renders as <a> with navigation)\n */\nexport function buildLink(\n props: Record<string, unknown>,\n children: unknown,\n ctx: BuilderContext,\n deps: LinkBuilderDeps\n): ReactElement {\n const {\n key, elementPath, parentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap,\n itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n } = ctx;\n\n const { to, prefetch: prefetchAttr, ...restProps } = props;\n const href = typeof to === 'string' ? to : '#';\n\n // Use effective parent component name for consistency with regular HTML elements\n const effectiveParentComponentName = deps.getEffectiveParentComponentName(componentContext, parentComponentName);\n\n // Navigation click handler\n const navigationOnClick = (e: any) => {\n e.preventDefault();\n if (typeof to === 'string' && to) {\n navigateTo(to);\n }\n };\n\n // Prefetch handlers (only if prefetchService is available and enabled)\n const prefetchHandlers: Record<string, unknown> = {};\n const isInternalLink = href.startsWith('/');\n\n if (deps.prefetchService?.isEnabled() && isInternalLink) {\n const strategy = (prefetchAttr as PrefetchStrategy) || deps.prefetchService.getDefaultStrategy();\n\n if (strategy === 'hover') {\n prefetchHandlers.onMouseEnter = () => deps.prefetchService?.handleHover(href);\n prefetchHandlers.onMouseLeave = () => deps.prefetchService?.handleHoverLeave(href);\n prefetchHandlers.onFocus = () => deps.prefetchService?.handleHover(href);\n prefetchHandlers.onBlur = () => deps.prefetchService?.handleHoverLeave(href);\n } else if (strategy === 'tap') {\n prefetchHandlers.onTouchStart = () => deps.prefetchService?.handleTap(href);\n prefetchHandlers.onMouseDown = () => deps.prefetchService?.handleTap(href);\n }\n // viewport and load strategies are handled via ref callback below\n }\n\n // Build base link props\n const linkProps: Record<string, unknown> = {\n key,\n href,\n // Add data attributes for selection overlay\n 'data-element-path': pathToString(elementPath),\n };\n\n // Add prefetch strategy attribute if specified\n if (prefetchAttr) {\n linkProps['data-prefetch'] = prefetchAttr;\n }\n // Add parent component context\n if (effectiveParentComponentName) {\n linkProps['data-parent-component'] = effectiveParentComponentName;\n }\n // Add current component context (when inside component definition)\n if (componentContext) {\n linkProps['data-component-context'] = componentContext;\n }\n\n // Merge restProps safely\n if (restProps && typeof restProps === 'object') {\n for (const [propKey, propValue] of Object.entries(restProps)) {\n linkProps[propKey] = propValue;\n }\n }\n\n return h('a', {\n ...linkProps as Record<string, any>,\n ref: (el: HTMLElement | null): void => {\n const pathKey = pathToString(elementPath);\n\n // Cleanup when element is removed from DOM\n if (!el) {\n deps.prefetchService?.unobserveLinkByPath(pathKey);\n }\n\n deps.elementRegistry.register(elementPath, el, effectiveParentComponentName, false);\n\n // Handle viewport strategy - observe link when it enters DOM\n if (el && deps.prefetchService?.isEnabled() && isInternalLink) {\n const strategy = (prefetchAttr as PrefetchStrategy) || deps.prefetchService.getDefaultStrategy();\n if (strategy === 'viewport') {\n deps.prefetchService.observeLink(el as HTMLAnchorElement, pathKey);\n }\n }\n },\n onClick: navigationOnClick,\n ...prefetchHandlers,\n style: {\n textDecoration: 'none',\n color: '#0070f3',\n cursor: 'pointer',\n ...(props.style && typeof props.style === 'object' ? props.style : {}),\n }\n }, deps.buildChildren(children, {\n elementPath, parentComponentName: effectiveParentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap, itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n }));\n}\n", "/**\n * Navigation utilities for client-side routing\n */\n\n/**\n * Navigate to a path using the history API and dispatch a popstate event\n * This allows the router to handle the navigation\n */\nexport function navigateTo(path: string): void {\n window.history.pushState({}, '', path);\n window.dispatchEvent(new PopStateEvent('popstate'));\n}\n\n/**\n * Create a navigation click handler that prevents default and navigates\n */\nexport function createNavigationHandler(path: string): (e: Event) => void {\n return (e: Event) => {\n e.preventDefault();\n navigateTo(path);\n };\n}\n\n", "/**\n * Component Renderer\n * Provides rendering utilities for pages including error boundaries.\n */\n\nimport { createElement as h } from \"react\";\nimport type { ReactElement } from \"react\";\nimport { ComponentBuilder } from \"./ComponentBuilder\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport type { ComponentNode, I18nConfig, CMSItem } from \"../../shared/types\";\nimport type { TemplateContext } from \"../../shared/types/cms\";\n\n/**\n * Options for rendering a page\n */\nexport interface RenderPageOptions {\n /** Component tree to render (can be a single node, array of nodes, or null) */\n tree: ComponentNode | ComponentNode[] | null;\n /** Current page path (used for error reporting) */\n currentPath: string;\n /** Viewport width in pixels (used for responsive style resolution) */\n viewportWidth: number;\n /** ComponentBuilder instance to use for building React elements */\n componentBuilder: ComponentBuilder;\n /** Current locale for i18n resolution */\n locale?: string;\n /** i18n configuration */\n i18nConfig?: I18nConfig;\n /** CMS context for template interpolation */\n cmsContext?: Record<string, unknown> | null;\n /** CMS locale for i18n field resolution (can override page locale) */\n cmsLocale?: string | null;\n /** Map of collection name to items for CMS List rendering */\n collectionItemsMap?: Record<string, CMSItem[]>;\n /** Template context for nested cms-list item resolution */\n templateContext?: TemplateContext | null;\n}\n\n/**\n * Renders a page with ErrorBoundary\n * \n * This function wraps the component tree in an ErrorBoundary to catch and handle\n * rendering errors gracefully. It also handles null/empty trees by returning null.\n * \n * @param options - Rendering options including tree, path, viewport width, and builder\n * @returns ReactElement representing the rendered page, or null if tree is null\n * \n * @example\n * ```typescript\n * const result = renderPage({\n * tree: pageData.root,\n * currentPath: '/',\n * viewportWidth: 1920,\n * componentBuilder: builder\n * });\n * ```\n */\nexport function renderPage(options: RenderPageOptions): ReactElement | null {\n const { tree, currentPath, viewportWidth, componentBuilder, locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap, templateContext } = options;\n\n if (!tree) return null;\n\n return h(ErrorBoundary, {\n level: 'page',\n onError: (error, errorInfo) => {\n console.error('Page rendering error:', {\n path: currentPath,\n error: error.message,\n stack: error.stack,\n componentStack: errorInfo?.componentStack,\n });\n },\n }, componentBuilder.buildComponent({\n node: tree,\n key: 0,\n customProps: {},\n elementPath: [0],\n parentComponentName: null,\n viewportWidth,\n componentContext: null,\n locale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n templateContext: templateContext ?? null\n }));\n}\n\n\n", "/**\n * Router Component\n * \n * Main router component that handles routing, state management, and rendering.\n * Uses all extracted modules for a clean, modular architecture.\n * \n * Responsibilities:\n * - Route loading and navigation\n * - Component tree state management\n * - SSR hydration detection\n * - HMR integration\n * - Loading and error states\n * - Viewport width tracking for responsive styles\n */\n\nimport { createElement as h, useState, useEffect, useLayoutEffect, useRef, useCallback, useMemo } from \"react\";\nimport type { ReactElement } from \"react\";\nimport { renderPage } from \"../core/ComponentRenderer\";\nimport { RouteLoader } from \"./RouteLoader\";\nimport { detectSSRContent, getInitialLoadingState } from \"../hydration/HydrationUtils\";\nimport { HMRManager } from \"../hmr/HMRManager\";\nimport { createNavigationHandler } from \"../navigation\";\nimport { initializeBreakpoints } from \"../responsiveStyleResolver\";\nimport { elementRegistry } from \"../elementRegistry\";\nimport { InteractiveStylesRegistry } from \"../InteractiveStylesRegistry\";\nimport { UtilityClassCollector } from \"../styles/UtilityClassCollector\";\nimport { initializeClient, setupEventHandlers } from \"../ClientInitializer\";\nimport type { ComponentNode, I18nConfig, PrefetchConfig, CMSItem } from \"../../shared/types\";\nimport { parseLocaleFromPath, setStoredLocale, DEFAULT_I18N_CONFIG } from \"../../shared/i18n\";\nimport { fetchI18nConfig, setI18nConfig as setCachedI18nConfig } from \"../i18nConfigService\";\nimport { IFRAME_MESSAGE_TYPES } from \"../../shared/constants\";\n\n/** SSR-serialized CMS context for client-side hydration */\ninterface SSRCMSContext {\n item: Record<string, unknown>;\n templatePath: string;\n}\n\ndeclare global {\n interface Window {\n __MENO_CMS__?: SSRCMSContext;\n }\n}\n\n/**\n * Router component props\n */\nexport interface RouterProps {\n /**\n * Initial path (optional, defaults to window.location.pathname)\n *\n * @example\n * ```tsx\n * <Router initialPath=\"/about\" />\n * ```\n */\n initialPath?: string;\n\n /**\n * Prefetch configuration for Astro-style link prefetching.\n * Only effective in production builds (disabled by default).\n *\n * @example\n * ```tsx\n * <Router prefetch={{ enabled: true, defaultStrategy: 'hover' }} />\n * ```\n */\n prefetch?: Partial<PrefetchConfig>;\n\n /**\n * Disable script execution (for editor preview mode).\n * When true, component JavaScript will not be executed.\n * Used by the editor to prevent JS from running during editing.\n */\n disableScripts?: boolean;\n}\n\n/**\n * Router Component\n * \n * Main router component that handles client-side routing, page loading, and rendering.\n * Manages component tree state, loading states, and integrates with HMR for hot reloading.\n * \n * Features:\n * - Automatic route loading on path changes\n * - SSR hydration support\n * - Loading state management with previous content preservation\n * - 404 handling with available pages list\n * - Viewport width tracking for responsive styles\n * - HMR integration for development\n * \n * @param props - Router configuration props\n * @returns ReactElement representing the router and current page\n * \n * @example\n * ```tsx\n * // Basic usage\n * <Router />\n * \n * // With custom initial path\n * <Router initialPath=\"/custom\" />\n * ```\n */\nexport function Router(props: RouterProps = {}): ReactElement {\n const { initialPath = window.location.pathname, prefetch, disableScripts = false } = props;\n const hasSSRContent = detectSSRContent();\n\n // Initialize client services (created once on mount)\n const services = useMemo(() => initializeClient({ prefetch }), []);\n\n // Setup event handlers on mount\n useEffect(() => {\n const cleanup = setupEventHandlers(services);\n \n // Cleanup on unmount\n return cleanup;\n }, [services]);\n \n // State management\n const [componentTree, setComponentTree] = useState<ComponentNode | ComponentNode[] | null>(null);\n // Keep previous componentTree to show during transitions\n const [previousComponentTree, setPreviousComponentTree] = useState<ComponentNode | ComponentNode[] | null>(null);\n // Preview component tree (for hover preview from editor - temporarily overrides componentTree)\n const [previewComponentTree, setPreviewComponentTree] = useState<ComponentNode | ComponentNode[] | null>(null);\n // Ref to track current componentTree for closure access (needed for capturing current value in async functions)\n const componentTreeRef = useRef<ComponentNode | ComponentNode[] | null>(null);\n const [loading, setLoading] = useState(getInitialLoadingState(hasSSRContent));\n const [currentPath, setCurrentPath] = useState(initialPath);\n const [availablePages, setAvailablePages] = useState<string[]>([]);\n const [showNotFound, setShowNotFound] = useState(false);\n const [viewportWidth, setViewportWidth] = useState<number>(\n typeof window !== 'undefined' ? window.innerWidth : 1920\n );\n const [i18nConfig, setI18nConfig] = useState<I18nConfig>(DEFAULT_I18N_CONFIG);\n const [currentLocale, setCurrentLocale] = useState<string>(DEFAULT_I18N_CONFIG.defaultLocale);\n const [cmsContext, setCmsContext] = useState<Record<string, unknown> | null>(null);\n const [cmsLocale, setCmsLocale] = useState<string | null>(null);\n const [registryVersion, setRegistryVersion] = useState(0);\n // Don't block rendering waiting for CMS context - render immediately and re-render when context arrives\n const [awaitingCmsContext, setAwaitingCmsContext] = useState(false);\n const [collectionItemsMap, setCollectionItemsMap] = useState<Record<string, CMSItem[]>>({});\n // Store CMS template path for HMR reloads (so we don't lose it after initial load)\n const [cmsTemplatePath, setCmsTemplatePath] = useState<string | null>(null);\n\n // Grace period: skip HMR reloads shortly after receiving committed data via postMessage\n const lastCommitTimestampRef = useRef(0);\n const COMMIT_GRACE_MS = 1000;\n\n // Track if initial mount used SSR CMS context (to skip redundant path-based load)\n const ssrCmsHandledRef = useRef(false);\n // Track if initial load is done (to prevent currentPath effect from firing on mount)\n const initialLoadDoneRef = useRef(false);\n\n // Create RouteLoader instance\n const routeLoader = useRef(new RouteLoader({\n componentRegistry: services.componentRegistry,\n prefetchService: services.prefetchService,\n onLoadStart: () => {\n setLoading(true);\n setShowNotFound(false);\n // Clear interactive styles and utility class registries before new render\n InteractiveStylesRegistry.clear();\n UtilityClassCollector.clear();\n // Save current componentTree as previous before loading\n if (componentTreeRef.current) {\n setPreviousComponentTree(componentTreeRef.current);\n }\n },\n onLoadComplete: (tree) => {\n setComponentTree(tree);\n setLoading(false);\n setShowNotFound(false);\n // Clear previous componentTree now that we have new content\n setPreviousComponentTree(null);\n },\n onLoadError: (error) => {\n setLoading(false);\n setShowNotFound(false);\n setPreviousComponentTree(null);\n },\n onNotFound: () => setShowNotFound(true),\n onPagesLoaded: (pages) => setAvailablePages(pages),\n onLocaleDetected: (locale) => setCurrentLocale(locale),\n })).current;\n\n // Keep ref in sync with state\n useEffect(() => {\n componentTreeRef.current = componentTree;\n }, [componentTree]);\n\n // Initialize breakpoints on mount\n useEffect(() => {\n initializeBreakpoints();\n }, []);\n\n // Load i18n config on mount using shared service\n useEffect(() => {\n fetchI18nConfig().then(config => {\n setI18nConfig(config);\n setCachedI18nConfig(config);\n // Update RouteLoader with i18n config so it can extract locale from paths\n routeLoader.setI18nConfig(config);\n // Extract locale from current path\n const { locale } = parseLocaleFromPath(currentPath, config);\n setCurrentLocale(locale);\n setStoredLocale(locale); // Persist preference\n });\n }, []);\n\n // Update locale when path changes\n useEffect(() => {\n const { locale } = parseLocaleFromPath(currentPath, i18nConfig);\n setCurrentLocale(locale);\n setStoredLocale(locale); // Persist preference\n }, [currentPath, i18nConfig]);\n\n // Listen to viewport resize to update responsive styles\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleResize = () => {\n setViewportWidth(window.innerWidth);\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Listen for CMS context updates from parent window (editor)\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type === IFRAME_MESSAGE_TYPES.CMS_CONTEXT_UPDATE) {\n // Full context update (used for initial load and CMS_CONTEXT_REQUEST responses)\n setCmsContext(event.data.cmsItem);\n setCmsLocale(event.data.locale || null);\n setCollectionItemsMap(event.data.collectionItemsMap || {}); // Store collection items for CMS List rendering\n // Set template path for HMR reloads so loadComponents uses the template\n // path instead of the CMS item URL (which doesn't exist in PageCache)\n if (event.data.templatePath !== undefined) {\n setCmsTemplatePath(event.data.templatePath || null);\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, []);\n\n // Listen for interactive CSS updates from parent window (editor)\n // This allows the editor to send generated interactive styles CSS to the iframe\n // without requiring a full page reload\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type === IFRAME_MESSAGE_TYPES.INTERACTIVE_CSS_UPDATE) {\n const css = event.data.css as string;\n const styleId = 'interactive-styles';\n\n // Remove existing interactive styles tag if it exists\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n // Inject new CSS if provided\n if (css && document.head) {\n const styleTag = document.createElement('style');\n styleTag.id = styleId;\n styleTag.textContent = css;\n document.head.appendChild(styleTag);\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, []);\n\n // Listen for page data preview updates from parent window (editor)\n // Used for component hover preview in the components tab\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type === IFRAME_MESSAGE_TYPES.PAGE_DATA_PREVIEW) {\n // Set preview tree from pageData.root\n const pageData = event.data.pageData;\n if (pageData?.root) {\n setPreviewComponentTree(pageData.root);\n }\n } else if (event.data?.type === IFRAME_MESSAGE_TYPES.PAGE_DATA_PREVIEW_REVERT) {\n // Clear preview tree to revert to normal componentTree\n setPreviewComponentTree(null);\n } else if (event.data?.type === IFRAME_MESSAGE_TYPES.PAGE_DATA_COMMITTED) {\n // Update the real tree with committed editor mutations (instant preview)\n lastCommitTimestampRef.current = Date.now();\n const pageData = event.data.pageData;\n if (pageData?.root) {\n setComponentTree(pageData.root);\n setPreviewComponentTree(null);\n componentTreeRef.current = pageData.root;\n }\n } else if (event.data?.type === IFRAME_MESSAGE_TYPES.COMPONENT_DEFINITION_COMMITTED) {\n lastCommitTimestampRef.current = Date.now();\n const { componentName, definition } = event.data;\n if (componentName && definition) {\n services.componentRegistry.register(componentName, definition);\n setRegistryVersion(v => v + 1);\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [services]);\n\n // Request CMS context from parent when iframe is ready\n // Don't block rendering - just request context and re-render when it arrives\n useEffect(() => {\n if (typeof window === 'undefined') return;\n if (window.parent === window) return; // Not in iframe\n\n window.parent.postMessage({\n type: IFRAME_MESSAGE_TYPES.CMS_CONTEXT_REQUEST\n }, '*');\n }, []);\n\n // Inject CSS before browser paint to prevent FOUC on client-side navigation\n // useLayoutEffect runs synchronously after DOM mutations but before the browser paints\n useLayoutEffect(() => {\n const treeToRender = previewComponentTree || componentTree;\n if (treeToRender) {\n services.styleInjector.inject();\n } else {\n // Clear registry when tree is cleared (no elements to register)\n elementRegistry.clear();\n }\n }, [previewComponentTree, componentTree, services, cmsContext, registryVersion]);\n\n // Post-paint: send interactive styles to parent and execute scripts\n useEffect(() => {\n const treeToRender = previewComponentTree || componentTree;\n if (treeToRender) {\n // Send interactive styles registry to parent (editor) if in iframe\n // Editor will generate CSS and send back via INTERACTIVE_CSS_UPDATE\n if (typeof window !== 'undefined' && window.parent !== window) {\n const registryData = Object.fromEntries(InteractiveStylesRegistry.getAll());\n window.parent.postMessage({\n type: IFRAME_MESSAGE_TYPES.INTERACTIVE_STYLES_UPDATE,\n styles: registryData\n }, '*');\n }\n\n // Wait for React to render before executing JavaScript (unless disabled for editor)\n if (!disableScripts) {\n const timeoutId = setTimeout(() => {\n services.scriptExecutor.execute();\n }, 100);\n\n return () => {\n clearTimeout(timeoutId);\n // Don't clear registry here - ref callbacks handle cleanup when elements unmount\n // Clearing here would remove elements before React unmounts them\n };\n }\n }\n }, [previewComponentTree, componentTree, services, disableScripts, cmsContext, registryVersion]);\n\n // Prefetch all internal links when using 'load' strategy\n useEffect(() => {\n if (!componentTree) return;\n if (!services.prefetchService.isEnabled()) return;\n if (services.prefetchService.getDefaultStrategy() !== 'load') return;\n\n // Delay to let DOM fully render\n const timeoutId = setTimeout(() => {\n const links = document.querySelectorAll('a[href^=\"/\"]');\n links.forEach(link => {\n const href = link.getAttribute('href');\n // Skip current page and empty hrefs\n if (href && href !== currentPath && href !== '#') {\n services.prefetchService.prefetch(href);\n }\n });\n }, 100);\n\n return () => clearTimeout(timeoutId);\n }, [componentTree, currentPath, services]);\n\n // Load components function using RouteLoader\n // For CMS pages, use the stored template path instead of the URL path\n const loadComponents = useCallback(async (path: string) => {\n const pathToLoad = cmsTemplatePath || path;\n await routeLoader.loadComponents(pathToLoad);\n }, [cmsTemplatePath]);\n\n // Grace-aware version for HMR: skip reload if iframe just received committed data via postMessage\n const loadComponentsForHMR = useCallback(async (path: string) => {\n if (Date.now() - lastCommitTimestampRef.current < COMMIT_GRACE_MS) {\n return;\n }\n const pathToLoad = cmsTemplatePath || path;\n await routeLoader.loadComponents(pathToLoad);\n }, [cmsTemplatePath]);\n\n // Ref for loadComponents to avoid recreating effects when cmsTemplatePath changes\n const loadComponentsRef = useRef(loadComponents);\n useEffect(() => { loadComponentsRef.current = loadComponents; }, [loadComponents]);\n\n // Handle CMS HMR updates - fetch updated collection items directly\n // Stable callback - always fetches, lets React handle deduplication via setState\n const handleCMSUpdate = useCallback(async (collection: string) => {\n try {\n const response = await fetch(`/api/cms/${collection}`);\n if (response.ok) {\n const data = await response.json();\n // Using functional update - always merges with latest state\n setCollectionItemsMap(prev => ({ ...prev, [collection]: data.items || [] }));\n }\n } catch (error) {\n // Silently fail - CMS refresh is non-critical\n }\n }, []); // No dependencies - stable callback\n\n // Handle navigation\n useEffect(() => {\n const handlePopState = () => {\n const newPath = window.location.pathname;\n setCurrentPath(newPath);\n setShowNotFound(false); // Reset not found state on navigation\n loadComponentsRef.current(newPath);\n };\n\n window.addEventListener('popstate', handlePopState);\n return () => window.removeEventListener('popstate', handlePopState);\n }, []); // Stable \u2014 uses ref\n\n useEffect(() => {\n // Check for SSR-serialized CMS context (from window.__MENO_CMS__)\n // If present, use the template path instead of the CMS URL to avoid 404\n const ssrCmsContext = window.__MENO_CMS__;\n if (ssrCmsContext) {\n // Set CMS context from SSR\n setCmsContext(ssrCmsContext.item);\n // Store template path for HMR reloads\n setCmsTemplatePath(ssrCmsContext.templatePath);\n // Mark that we're handling SSR CMS (to skip path-based load below)\n ssrCmsHandledRef.current = true;\n // Clear to prevent stale data on SPA navigation\n delete window.__MENO_CMS__;\n }\n\n // Initial load\n routeLoader.loadPages();\n routeLoader.loadGlobalComponents().then(() => {\n // Use template path for CMS pages, otherwise use the current URL path\n const pathToLoad = ssrCmsContext ? ssrCmsContext.templatePath : currentPath;\n loadComponents(pathToLoad);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Only run on mount - currentPath handled by separate effect below\n\n // Reload when path changes\n useEffect(() => {\n // Skip initial mount - handled by mount effect above\n if (!initialLoadDoneRef.current) {\n initialLoadDoneRef.current = true;\n return;\n }\n // Skip if SSR CMS context was just handled (template already loading)\n if (ssrCmsHandledRef.current) {\n ssrCmsHandledRef.current = false;\n return;\n }\n setShowNotFound(false); // Reset not found state when path changes\n loadComponentsRef.current(currentPath);\n }, [currentPath]); // Only react to path changes\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n routeLoader.cancel();\n services.prefetchService.clear();\n };\n }, [services]);\n\n // Render logic: prioritize preview tree, then current tree, then previous tree during loading, then loading/not found states\n // Use preview tree if set (from component hover preview), otherwise use current tree\n const treeToRender = previewComponentTree || componentTree;\n let pageContent: ReactElement | null = null;\n\n if (treeToRender && !awaitingCmsContext) {\n // Show current/preview tree when we have it and CMS context is ready (or not needed)\n pageContent = renderPage({\n tree: treeToRender,\n currentPath,\n viewportWidth,\n componentBuilder: services.componentBuilder,\n locale: currentLocale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n templateContext: null\n });\n } else if (treeToRender && awaitingCmsContext && previousComponentTree) {\n // While waiting for CMS context, show previous tree to avoid blink\n pageContent = renderPage({\n tree: previousComponentTree,\n currentPath,\n viewportWidth,\n componentBuilder: services.componentBuilder,\n locale: currentLocale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n templateContext: null\n });\n } else if (loading || awaitingCmsContext) {\n // Show previous content while loading if available\n if (previousComponentTree) {\n pageContent = renderPage({\n tree: previousComponentTree,\n currentPath,\n viewportWidth,\n componentBuilder: services.componentBuilder,\n locale: currentLocale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n templateContext: null\n });\n } else {\n // Show subtle spinner while loading\n pageContent = h('div', {\n style: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100vh'\n }\n },\n h('style', null, '@keyframes meno-spin { to { transform: rotate(360deg); } }'),\n h('div', {\n style: {\n width: '24px',\n height: '24px',\n border: '2px solid #e5e7eb',\n borderTopColor: '#6b7280',\n borderRadius: '50%',\n animation: 'meno-spin 0.6s linear infinite'\n }\n })\n );\n }\n } else if (showNotFound) {\n pageContent = h('div', { \n style: { \n textAlign: 'center', \n padding: '40px',\n maxWidth: '800px',\n margin: '0 auto'\n } \n }, \n h('h2', null, `Page not found: ${currentPath}`),\n h('p', { style: { marginTop: '16px', marginBottom: '24px', color: '#666' } }, \n 'Available pages:'\n ),\n h('ul', { \n style: { \n listStyle: 'none', \n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n alignItems: 'center'\n } \n }, \n availablePages.map((page, i) => \n h('li', { key: i },\n h('a', {\n href: page,\n onClick: createNavigationHandler(page),\n style: {\n color: '#0070f3',\n textDecoration: 'none',\n fontSize: '18px',\n fontWeight: '600'\n }\n }, page === '/' ? 'Home (/)' : page)\n )\n )\n )\n );\n } else if (previousComponentTree) {\n // Keep previous content visible during timeout (waiting to determine if not found)\n pageContent = renderPage({\n tree: previousComponentTree,\n currentPath,\n viewportWidth,\n componentBuilder: services.componentBuilder,\n locale: currentLocale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n templateContext: null\n });\n }\n\n // Fallback: if no content matched, show spinner\n // This prevents empty flash when loading=false but componentTree=null\n if (!pageContent) {\n pageContent = h('div', {\n style: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100vh'\n }\n },\n h('style', null, '@keyframes meno-spin { to { transform: rotate(360deg); } }'),\n h('div', {\n style: {\n width: '24px',\n height: '24px',\n border: '2px solid #e5e7eb',\n borderTopColor: '#6b7280',\n borderRadius: '50%',\n animation: 'meno-spin 0.6s linear infinite'\n }\n })\n );\n }\n\n // Render HMRManager once at the top level with page content\n return h('div', null,\n h(HMRManager, {\n onReload: loadComponentsForHMR,\n onCMSUpdate: handleCMSUpdate,\n currentPath: currentPath,\n }),\n pageContent\n );\n}\n\n", "/**\n * Route Loader\n * Handles loading of pages, components, and manages race conditions\n */\n\nimport { API_ROUTES, NOT_FOUND_TIMEOUT_MS } from '../../shared/constants';\nimport type { ComponentRegistry } from '../componentRegistry';\nimport type { ComponentNode, I18nConfig, JSONPage } from '../../shared/types';\nimport { validatePageData } from '../../shared/validation/validators';\nimport { parseLocaleFromPath, DEFAULT_I18N_CONFIG } from '../../shared/i18n';\nimport type { PrefetchService } from '../services/PrefetchService';\nimport { logNetworkError } from '../../shared/errorLogger';\n\nexport interface RouteLoaderConfig {\n componentRegistry: ComponentRegistry;\n /** Optional prefetch service for cache integration */\n prefetchService?: PrefetchService;\n onLoadStart?: () => void;\n onLoadComplete?: (tree: ComponentNode | ComponentNode[] | null) => void;\n onLoadError?: (error: Error, errorTree?: ComponentNode) => void;\n onNotFound?: () => void;\n onPagesLoaded?: (pages: string[]) => void;\n onLocaleDetected?: (locale: string) => void;\n}\n\nexport class RouteLoader {\n private abortController: AbortController | null = null;\n private notFoundTimeout: NodeJS.Timeout | null = null;\n private config: RouteLoaderConfig;\n private isCancelled: boolean = false;\n private i18nConfig: I18nConfig = DEFAULT_I18N_CONFIG;\n private prefetchService?: PrefetchService;\n\n constructor(config: RouteLoaderConfig) {\n this.config = config;\n this.prefetchService = config.prefetchService;\n }\n\n /**\n * Update i18n configuration\n */\n setI18nConfig(config: I18nConfig): void {\n this.i18nConfig = config;\n }\n\n /**\n * Load global components (shared across all pages)\n * @param signal Optional abort signal to cancel the request\n */\n async loadGlobalComponents(signal?: AbortSignal): Promise<void> {\n try {\n const fetchOptions: RequestInit = { cache: 'no-store' };\n if (signal) {\n fetchOptions.signal = signal;\n }\n\n const response = await fetch(API_ROUTES.COMPONENTS, fetchOptions);\n \n // Check if aborted after fetch\n if (signal?.aborted) {\n return;\n }\n\n const globalComps = await response.json();\n\n // Check again if aborted after JSON parse\n if (signal?.aborted) {\n return;\n }\n\n if (Object.keys(globalComps).length > 0) {\n // Merge global components into registry (page-specific components will override)\n this.config.componentRegistry.merge(globalComps);\n // JavaScript will be executed via useEffect after componentTree renders\n }\n } catch (error) {\n // Ignore abort errors\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n // Continue anyway - components might still work with cached/previous registry state\n }\n }\n\n /**\n * Load available pages list\n */\n async loadPages(): Promise<string[]> {\n try {\n const response = await fetch(API_ROUTES.PAGES);\n const data = await response.json();\n const pages = (data.pages || []).map((p: unknown) =>\n typeof p === 'string' ? p : (p as { path: string }).path\n );\n \n if (this.config.onPagesLoaded) {\n this.config.onPagesLoaded(pages);\n }\n\n return pages;\n } catch (e) {\n logNetworkError('RouteLoader.loadPages', e);\n return [];\n }\n }\n\n /**\n * Load JSON components for current page\n */\n async loadComponents(path: string): Promise<ComponentNode | ComponentNode[] | null> {\n // Cancel any previous loading request\n if (this.abortController) {\n this.abortController.abort();\n }\n\n // Clear any pending \"not found\" timeout\n this.clearNotFoundTimeout();\n\n // Reset cancelled flag\n this.isCancelled = false;\n\n // Create new abort controller for this request\n const abortController = new AbortController();\n this.abortController = abortController;\n\n try {\n // Set loading state and reset showNotFound\n if (this.config.onLoadStart && !this.isCancelled) {\n this.config.onLoadStart();\n }\n\n // Reload global components first (with abort signal)\n await this.loadGlobalComponents(abortController.signal);\n\n // Check if request was aborted\n if (abortController.signal.aborted || this.isCancelled) {\n return null;\n }\n\n // Parse locale from path (e.g., /pl/about -> locale: 'pl', path: '/about')\n const { locale, pathWithoutLocale } = parseLocaleFromPath(path, this.i18nConfig);\n\n // Notify about detected locale\n if (this.config.onLocaleDetected && !this.isCancelled) {\n this.config.onLocaleDetected(locale);\n }\n\n // Check prefetch cache first for instant navigation\n const cached = this.prefetchService?.getFromCache(pathWithoutLocale);\n if (cached) {\n let tree: ComponentNode | ComponentNode[] | null = null;\n const parsed = cached.data as JSONPage;\n\n if (parsed.components) {\n this.config.componentRegistry.merge(parsed.components);\n tree = parsed.root || (parsed as unknown as ComponentNode | ComponentNode[]);\n } else if (parsed.root) {\n tree = parsed.root;\n } else {\n tree = parsed as unknown as ComponentNode | ComponentNode[];\n }\n\n if (this.config.onLoadComplete && !this.isCancelled) {\n this.config.onLoadComplete(tree);\n }\n\n this.clearNotFoundTimeout();\n this.abortController = null;\n return tree;\n }\n\n const response = await fetch(`${API_ROUTES.PAGE_CONTENT}?page=${encodeURIComponent(pathWithoutLocale)}`, {\n cache: 'no-store',\n signal: abortController.signal,\n });\n\n // Check again if aborted (after fetch completes)\n if (abortController.signal.aborted || this.isCancelled) {\n return null;\n }\n\n if (!response.ok) {\n \n if (this.config.onLoadComplete && !this.isCancelled) {\n this.config.onLoadComplete(null);\n }\n\n // Delay showing \"not found\" to prevent flash\n // Only set timeout if not cancelled\n if (!this.isCancelled) {\n this.notFoundTimeout = setTimeout(() => {\n // Check again before calling callback (component might have unmounted)\n if (!this.isCancelled && this.config.onNotFound) {\n this.config.onNotFound();\n }\n this.notFoundTimeout = null;\n }, NOT_FOUND_TIMEOUT_MS);\n }\n \n return null;\n }\n\n const jsonText = await response.text();\n\n // Check if aborted after text extraction\n if (abortController.signal.aborted || this.isCancelled) {\n return null;\n }\n\n let parsed;\n try {\n parsed = JSON.parse(jsonText);\n \n // Validate page data (logs warnings but doesn't fail - graceful degradation)\n const validationResult = validatePageData(parsed);\n if (!validationResult.valid) {\n console.warn(`[RouteLoader] Page validation failed for ${path}:`,\n validationResult.errors.map(e => `${e.path}: ${e.message}`).join('; '));\n }\n // Use validated data if available, otherwise use parsed (graceful degradation)\n parsed = validationResult.valid ? validationResult.data : parsed;\n } catch (parseError) {\n // Set an error tree to trigger error boundary\n const errorTree = this.createErrorTree(\n 'Invalid JSON format',\n `Failed to parse JSON for page: ${path}`,\n String(parseError)\n );\n \n if (this.config.onLoadComplete && !this.isCancelled) {\n this.config.onLoadComplete(errorTree);\n }\n \n if (this.config.onLoadError && !this.isCancelled) {\n this.config.onLoadError(\n parseError instanceof Error ? parseError : new Error(String(parseError)),\n errorTree\n );\n }\n \n return errorTree;\n }\n\n // Check if JSON has components section (page-specific components)\n let tree: ComponentNode | ComponentNode[] | null = null;\n \n if (parsed.components) {\n // Merge page-specific components with global (page-specific override global)\n try {\n this.config.componentRegistry.merge(parsed.components);\n // JavaScript will be executed via useEffect after componentTree renders\n } catch (componentError) {\n }\n tree = parsed.root || parsed;\n } else if (parsed.root) {\n // Has root property but no components section - use only global components\n tree = parsed.root;\n // JavaScript will be executed via useEffect after componentTree renders\n } else {\n // Legacy format - direct component tree\n tree = parsed;\n // JavaScript will be executed via useEffect after componentTree renders\n }\n\n // Check one more time if aborted\n if (abortController.signal.aborted || this.isCancelled) {\n return null;\n }\n\n if (this.config.onLoadComplete && !this.isCancelled) {\n this.config.onLoadComplete(tree);\n }\n\n this.clearNotFoundTimeout();\n this.abortController = null;\n \n return tree;\n } catch (error) {\n // Ignore abort errors\n if (error instanceof Error && error.name === 'AbortError') {\n return null;\n }\n\n // Check if aborted before handling error\n if (abortController.signal.aborted || this.isCancelled) {\n return null;\n }\n\n // Set a generic error tree\n const errorTree = this.createErrorTree('Error loading page', String(error));\n \n if (this.config.onLoadComplete && !this.isCancelled) {\n this.config.onLoadComplete(errorTree);\n }\n \n if (this.config.onLoadError && !this.isCancelled) {\n this.config.onLoadError(\n error instanceof Error ? error : new Error(String(error)),\n errorTree\n );\n }\n\n this.clearNotFoundTimeout();\n this.abortController = null;\n \n return errorTree;\n }\n }\n\n /**\n * Cancel current loading request\n */\n cancel(): void {\n this.isCancelled = true;\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n this.clearNotFoundTimeout();\n }\n\n /**\n * Create error tree ComponentNode structure\n */\n private createErrorTree(\n title: string,\n message: string,\n details?: string\n ): ComponentNode {\n const children: ComponentNode[] = [\n {\n type: 'node',\n tag: 'h2',\n style: { color: '#c00' },\n children: [title],\n },\n {\n type: 'node',\n tag: 'p',\n style: { color: '#666', marginTop: '16px' },\n children: [message],\n },\n ];\n\n if (details) {\n children.push({\n type: 'node',\n tag: 'pre',\n style: {\n background: '#f5f5f5',\n padding: '16px',\n borderRadius: '4px',\n textAlign: 'left',\n maxWidth: '600px',\n margin: '16px auto',\n overflow: 'auto',\n },\n children: [details],\n });\n }\n\n return {\n type: 'node',\n tag: 'div',\n style: { padding: '40px', textAlign: 'center' },\n children,\n };\n }\n\n /**\n * Clear not found timeout\n */\n private clearNotFoundTimeout(): void {\n if (this.notFoundTimeout) {\n clearTimeout(this.notFoundTimeout);\n this.notFoundTimeout = null;\n }\n }\n}\n\n", "/**\n * Hydration Utilities\n * Provides utilities for detecting SSR content and managing hydration state.\n */\n\n/**\n * Detects if server-side rendered content exists in the DOM.\n * Checks if the root element has children, which indicates SSR rendered content.\n * \n * @returns true if SSR content is detected, false otherwise\n */\nexport function detectSSRContent(): boolean {\n // Check if we're in a browser environment\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return false;\n }\n\n const rootElement = document.getElementById('root');\n \n // SSR content exists if root element has children\n return rootElement !== null && rootElement.children.length > 0;\n}\n\n/**\n * Determines the initial loading state based on SSR content presence.\n * \n * @param hasSSRContent - Whether SSR content was detected\n * @returns false if SSR content exists (for smooth hydration), true otherwise\n */\nexport function getInitialLoadingState(hasSSRContent: boolean): boolean {\n // If SSR content exists, start with loading=false for smooth hydration\n // If no SSR content, start with loading=true to show loading state\n return !hasSSRContent;\n}\n\n", "/**\n * HMR Manager\n * Manages Hot Module Replacement WebSocket connection, status tracking, and visual indicators.\n */\n\nimport { createElement as h, useState, useEffect, useRef } from \"react\";\nimport type { ReactElement } from \"react\";\nimport { HMRWebSocket } from \"../hmrWebSocket\";\n\nexport interface HMRManagerProps {\n /**\n * Callback when HMR update is received\n * @param path - Path of the updated file ('all' for global updates)\n */\n onUpdate?: (path: string) => void;\n\n /**\n * Callback when WebSocket status changes\n * @param status - Current connection status\n */\n onStatusChange?: (status: 'connecting' | 'connected' | 'disconnected' | 'error') => void;\n\n /**\n * Current path for determining if update should trigger reload\n */\n currentPath?: string;\n\n /**\n * Function to reload components for a given path\n */\n onReload?: (path: string) => void;\n\n /**\n * Callback when CMS content update is received\n * @param collection - Collection that was updated\n */\n onCMSUpdate?: (collection: string) => void;\n}\n\n/**\n * HMR Manager component\n * Manages WebSocket connection lifecycle and renders HMR indicators\n */\nexport function HMRManager({\n onUpdate,\n onStatusChange,\n currentPath = typeof window !== 'undefined' ? window.location.pathname : '/',\n onReload,\n onCMSUpdate\n}: HMRManagerProps): ReactElement | null {\n const [status, setStatus] = useState<'connecting' | 'connected' | 'disconnected' | 'error'>('connecting');\n\n // Track callbacks via refs to avoid stale closures and prevent WebSocket recreation\n const currentPathRef = useRef(currentPath);\n const onCMSUpdateRef = useRef(onCMSUpdate);\n const onReloadRef = useRef(onReload);\n\n useEffect(() => {\n currentPathRef.current = currentPath;\n }, [currentPath]);\n\n useEffect(() => {\n onCMSUpdateRef.current = onCMSUpdate;\n }, [onCMSUpdate]);\n\n useEffect(() => { onReloadRef.current = onReload; }, [onReload]);\n\n // Define message handler - reads from refs to always get latest values\n const createMessageHandler = () => (data: any) => {\n if (data.type === 'hmr:update') {\n // Always use current path (preserves locale) when reloading\n // The HMR path tells us which page changed, but we reload with current locale\n if (onReloadRef.current) {\n onReloadRef.current(currentPathRef.current);\n }\n\n // Call update callback with the original HMR path\n if (onUpdate) {\n onUpdate(data.path);\n }\n } else if (data.type === 'hmr:cms-update') {\n // Call CMS update callback via ref (avoids stale closure)\n if (onCMSUpdateRef.current && data.collection) {\n onCMSUpdateRef.current(data.collection);\n }\n } else if (data.type === 'hmr:colors-update') {\n // Dispatch custom event to notify color hooks of the update\n document.dispatchEvent(new CustomEvent('hmr-colors-update'));\n } else if (data.type === 'hmr:variables-update') {\n // Dispatch custom event to notify variable hooks of the update\n document.dispatchEvent(new CustomEvent('hmr-variables-update'));\n } else if (data.type === 'hmr:fonts-update') {\n // Dispatch custom event to notify font CSS injection\n document.dispatchEvent(new CustomEvent('hmr-fonts-update'));\n } else if (data.type === 'hmr:libraries-update') {\n // Dispatch custom event to trigger full page reload for library changes\n document.dispatchEvent(new CustomEvent('hmr-libraries-update'));\n }\n };\n\n // Define status handler\n const createStatusHandler = () => (newStatus: 'connecting' | 'connected' | 'disconnected' | 'error') => {\n setStatus(newStatus);\n if (onStatusChange) {\n onStatusChange(newStatus);\n }\n };\n\n // WebSocket setup and management\n useEffect(() => {\n // WebSocket URL construction\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${protocol}//${window.location.host}/hmr`;\n\n // Reuse existing connection if available (for HMR)\n let hmrWs: HMRWebSocket;\n\n if (import.meta.hot?.data.hmrWs) {\n hmrWs = import.meta.hot.data.hmrWs;\n // CRITICAL: Update handlers with fresh closures that reference current refs\n // Without this, reused WebSocket would have stale refs from previous component instance\n hmrWs.setMessageHandler(createMessageHandler());\n hmrWs.setStatusChangeHandler(createStatusHandler());\n } else {\n hmrWs = new HMRWebSocket({\n url: wsUrl,\n onMessage: createMessageHandler(),\n onStatusChange: createStatusHandler(),\n maxReconnectAttempts: 10,\n initialReconnectDelay: 1000,\n maxReconnectDelay: 30000,\n heartbeatInterval: 15000,\n });\n\n if (import.meta.hot) {\n import.meta.hot.data.hmrWs = hmrWs;\n }\n }\n\n // Cleanup on unmount (but not on HMR)\n return () => {\n // Don't close the WebSocket on HMR, it will be reused\n if (!import.meta.hot) {\n hmrWs.close();\n }\n };\n }, [onUpdate, onStatusChange]);\n\n // Bun HMR API integration\n useEffect(() => {\n if (import.meta.hot) {\n import.meta.hot.accept();\n \n import.meta.hot.on('bun:beforeUpdate', () => {\n // HMR update starting\n });\n \n import.meta.hot.on('bun:afterUpdate', () => {\n // HMR update complete\n });\n \n import.meta.hot.on('bun:error', () => {\n });\n }\n }, []);\n\n // Render indicators\n return h(HMRIndicator, { status });\n}\n\n/**\n * HMR indicator component\n * Shows WebSocket connection status\n */\nexport function HMRIndicator({ status }: { status: 'connecting' | 'connected' | 'disconnected' | 'error' }) {\n const statusConfig = {\n connecting: { bg: '#f59e0b', text: '\uD83D\uDD04 Connecting...', show: true },\n connected: { bg: '#10b981', text: '\u2705 Connected', show: false },\n disconnected: { bg: '#ef4444', text: '\u26A0\uFE0F Disconnected - Reconnecting...', show: false },\n error: { bg: '#dc2626', text: '\u274C Connection Failed - Refresh Page', show: true },\n };\n\n const config = statusConfig[status];\n\n return h('div', {\n id: 'hmr-indicator',\n style: {\n position: 'fixed',\n top: '20px',\n right: '20px',\n background: config.bg,\n color: 'white',\n padding: '12px 20px',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: '600',\n display: config.show ? 'block' : 'none',\n boxShadow: `0 4px 12px ${config.bg}40`,\n animation: 'slideIn 0.3s ease-out',\n zIndex: 9999,\n transition: 'all 0.3s ease',\n }\n }, config.text);\n}\n\n", "/**\n * Resilient HMR WebSocket Client\n * Handles automatic reconnection with exponential backoff\n */\n\nimport { logRuntimeError } from '../shared/errorLogger';\n\nexport interface HMRWebSocketConfig {\n url: string;\n onMessage: (data: any) => void;\n onStatusChange?: (status: 'connecting' | 'connected' | 'disconnected' | 'error') => void;\n maxReconnectAttempts?: number;\n initialReconnectDelay?: number;\n maxReconnectDelay?: number;\n heartbeatInterval?: number;\n}\n\nexport class HMRWebSocket {\n private ws: WebSocket | null = null;\n private config: Required<HMRWebSocketConfig>;\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private lastPongTime = 0;\n private isIntentionallyClosed = false;\n private messageQueue: any[] = [];\n\n constructor(config: HMRWebSocketConfig) {\n this.config = {\n maxReconnectAttempts: 10,\n initialReconnectDelay: 1000,\n maxReconnectDelay: 30000,\n heartbeatInterval: 15000,\n onStatusChange: () => {},\n ...config,\n };\n\n // Listen for online/offline events\n window.addEventListener('online', () => this.handleOnline());\n window.addEventListener('offline', () => this.handleOffline());\n\n // Listen for visibility change (tab becomes visible)\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n this.checkConnection();\n }\n });\n\n this.connect();\n }\n\n private connect(): void {\n if (this.ws?.readyState === WebSocket.OPEN || this.ws?.readyState === WebSocket.CONNECTING) {\n return;\n }\n\n this.isIntentionallyClosed = false;\n this.config.onStatusChange('connecting');\n \n\n try {\n this.ws = new WebSocket(this.config.url);\n \n this.ws.onopen = () => this.handleOpen();\n this.ws.onmessage = (event) => this.handleMessage(event);\n this.ws.onerror = (error) => this.handleError(error);\n this.ws.onclose = (event) => this.handleClose(event);\n \n } catch (error) {\n this.scheduleReconnect();\n }\n }\n\n private handleOpen(): void {\n this.reconnectAttempts = 0;\n this.config.onStatusChange('connected');\n \n // Start heartbeat\n this.startHeartbeat();\n \n // Flush queued messages\n this.flushMessageQueue();\n }\n\n private handleMessage(event: MessageEvent): void {\n try {\n // Check if this is a pong response\n if (event.data === 'pong') {\n this.lastPongTime = Date.now();\n return;\n }\n\n const data = JSON.parse(event.data);\n this.config.onMessage(data);\n } catch (e) {\n logRuntimeError('hmrWebSocket.handleMessage', e);\n }\n }\n\n private handleError(error: Event): void {\n this.config.onStatusChange('error');\n }\n\n private handleClose(event: CloseEvent): void {\n \n this.stopHeartbeat();\n \n if (!this.isIntentionallyClosed) {\n this.config.onStatusChange('disconnected');\n this.scheduleReconnect();\n }\n }\n\n private handleOnline(): void {\n this.reconnectAttempts = 0; // Reset attempts on network restore\n this.connect();\n }\n\n private handleOffline(): void {\n this.config.onStatusChange('disconnected');\n }\n\n private checkConnection(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.connect();\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n this.config.onStatusChange('error');\n return;\n }\n\n // Exponential backoff with jitter\n const delay = Math.min(\n this.config.initialReconnectDelay * Math.pow(2, this.reconnectAttempts),\n this.config.maxReconnectDelay\n );\n \n // Add jitter (\u00B125%)\n const jitter = delay * 0.25 * (Math.random() - 0.5);\n const finalDelay = Math.max(delay + jitter, 100);\n\n \n this.reconnectTimeout = setTimeout(() => {\n this.reconnectAttempts++;\n this.connect();\n }, finalDelay);\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.lastPongTime = Date.now();\n\n this.heartbeatInterval = setInterval(() => {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.stopHeartbeat();\n return;\n }\n\n // Check if we got a pong recently\n const timeSinceLastPong = Date.now() - this.lastPongTime;\n if (timeSinceLastPong > this.config.heartbeatInterval * 2) {\n this.ws.close();\n return;\n }\n\n // Send ping\n try {\n this.ws.send(JSON.stringify({ type: 'ping' }));\n } catch (e) {\n logRuntimeError('hmrWebSocket.sendPing', e);\n }\n }, this.config.heartbeatInterval);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n private flushMessageQueue(): void {\n while (this.messageQueue.length > 0 && this.ws?.readyState === WebSocket.OPEN) {\n const message = this.messageQueue.shift();\n this.send(message);\n }\n }\n\n /**\n * Send a message (queues if disconnected)\n */\n send(data: any): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(typeof data === 'string' ? data : JSON.stringify(data));\n } else {\n this.messageQueue.push(data);\n }\n }\n\n /**\n * Get current connection status\n */\n getStatus(): 'connecting' | 'connected' | 'disconnected' | 'closed' {\n if (!this.ws) return 'disconnected';\n \n switch (this.ws.readyState) {\n case WebSocket.CONNECTING:\n return 'connecting';\n case WebSocket.OPEN:\n return 'connected';\n case WebSocket.CLOSING:\n case WebSocket.CLOSED:\n return 'disconnected';\n default:\n return 'disconnected';\n }\n }\n\n /**\n * Manually close the connection (won't auto-reconnect)\n */\n close(): void {\n this.isIntentionallyClosed = true;\n this.stopHeartbeat();\n \n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n window.removeEventListener('online', () => this.handleOnline());\n window.removeEventListener('offline', () => this.handleOffline());\n }\n\n /**\n * Manually trigger a reconnection\n */\n reconnect(): void {\n this.reconnectAttempts = 0;\n if (this.ws) {\n this.ws.close();\n }\n this.connect();\n }\n\n /**\n * Update the message handler (useful when reusing WebSocket across HMR)\n * This ensures the handler closure has fresh references after component remount\n */\n setMessageHandler(handler: (data: any) => void): void {\n this.config.onMessage = handler;\n }\n\n /**\n * Update the status change handler (useful when reusing WebSocket across HMR)\n */\n setStatusChangeHandler(handler: (status: 'connecting' | 'connected' | 'disconnected' | 'error') => void): void {\n this.config.onStatusChange = handler;\n }\n}\n\n", "/**\n * Element Registry (Core Stub)\n * Minimal implementation for non-editor use cases.\n * For full functionality, use @meno/studio's ElementRegistry.\n *\n * This stub provides no-op implementations since element tracking\n * is only needed in the editor context.\n */\n\nimport type { Path } from '../shared/pathArrayUtils';\n\nexport interface ElementMetadata {\n isComponentRoot: boolean;\n parentComponentName: string | null;\n componentContext: string | null;\n props?: Record<string, unknown>;\n}\n\n/**\n * Minimal ElementRegistry for non-editor use\n * All methods are no-ops since element tracking is editor-only\n */\nexport class ElementRegistry {\n register(\n _path: Path | string,\n _element: HTMLElement | null,\n _componentName?: string | null,\n _isComponentRoot?: boolean,\n _props?: Record<string, unknown>,\n _metadata?: Partial<ElementMetadata>\n ): void {\n // No-op in core - element tracking is editor-only\n }\n\n get(_path: Path | string): HTMLElement | null {\n return null;\n }\n\n getMetadata(_path: Path | string): ElementMetadata | null {\n return null;\n }\n\n getAllByComponent(_componentName: string): HTMLElement[] {\n return [];\n }\n\n findComponentRootPath(_elementPath: Path | string, _parentComponentName: string): Path | null {\n return null;\n }\n\n getAllComponentNames(): string[] {\n return [];\n }\n\n getComponentRootPaths(_componentName: string): Path[] {\n return [];\n }\n\n getComponentRoots(_componentName: string): HTMLElement[] {\n return [];\n }\n\n getComponentProps(_path: Path | string): Record<string, unknown> | null {\n return null;\n }\n\n isComponentRoot(_path: Path | string): boolean {\n return false;\n }\n\n clear(): void {\n // No-op\n }\n\n getAllPaths(): Path[] {\n return [];\n }\n\n // CMS List item methods (no-op in core)\n registerCMSItem(\n _path: Path | string,\n _itemIndex: number,\n _element: HTMLElement | null,\n _metadata?: Partial<ElementMetadata>\n ): void {\n // No-op in core - element tracking is editor-only\n }\n\n getCMSItem(_path: Path | string, _itemIndex: number): HTMLElement | null {\n return null;\n }\n\n getCMSItemMetadata(_path: Path | string, _itemIndex: number): ElementMetadata | null {\n return null;\n }\n}\n\n// Mutable singleton instance - can be replaced by editor\nlet _elementRegistry: ElementRegistry = new ElementRegistry();\n\n/**\n * Get the current ElementRegistry instance\n * Returns the default stub in core, or the real implementation if set by studio\n */\nexport const elementRegistry: ElementRegistry = new Proxy({} as ElementRegistry, {\n get(_target, prop) {\n return (_elementRegistry as any)[prop];\n }\n});\n\n/**\n * Replace the ElementRegistry instance\n * Used by @meno/studio to inject the real implementation\n */\nexport function setElementRegistry(registry: ElementRegistry): void {\n _elementRegistry = registry;\n}\n", "/**\n * Component Registry\n * Manages registration and retrieval of custom components\n * \n * This now extends the base registry for consistency across client and SSR\n */\n\nimport { BaseComponentRegistry } from '../shared/registry/ComponentRegistry';\nimport type { ComponentDefinition } from '../shared/types';\n\nexport class ComponentRegistry extends BaseComponentRegistry {\n // Client-specific methods can be added here\n // For now, it uses all functionality from BaseComponentRegistry\n}\n\n// Export a singleton instance for convenience\nexport const globalComponentRegistry = new ComponentRegistry();\n\n", "/**\n * Style Injector\n * Handles CSS injection from component definitions into the page\n * Supports template processing for per-instance CSS\n * Unified with server-side CSS generation for consistency\n *\n * Utility CSS is injected eagerly by UtilityClassCollector during React render,\n * eliminating FOUC. This module handles component CSS and interactive styles.\n */\n\nimport type { ComponentRegistry } from '../componentRegistry';\nimport type { ElementRegistry } from '../elementRegistry';\nimport { hasTemplates, processCodeTemplates } from '../templateEngine';\nimport { generateAllInteractiveCSS } from '../../shared/cssGeneration';\nimport { getCachedBreakpointConfig } from '../responsiveStyleResolver';\nimport { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';\nimport { InteractiveStylesRegistry } from '../InteractiveStylesRegistry';\nimport { UtilityClassCollector } from './UtilityClassCollector';\nimport { logRuntimeError } from '../../shared/errorLogger';\n\nexport interface StyleInjectorConfig {\n componentRegistry: ComponentRegistry;\n elementRegistry: ElementRegistry;\n styleId?: string; // Default: 'component-css'\n /** Skip interactive CSS generation (e.g., when editor manages it via postMessage) */\n skipInteractiveCSS?: boolean;\n}\n\n/**\n * Simple string hash for change detection.\n * Not cryptographic - just for fast equality checks.\n */\nfunction simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0; // Convert to 32-bit integer\n }\n return hash;\n}\n\n/**\n * StyleInjector manages CSS injection from components into the page DOM\n *\n * Features:\n * - Collects CSS from all registered components (hashed for change detection)\n * - Processes templates per component instance when needed\n * - Manages separate style tags: component-css, interactive-styles\n * - Utility CSS is handled eagerly by UtilityClassCollector during render\n */\nexport class StyleInjector {\n private componentRegistry: ComponentRegistry;\n private elementRegistry: ElementRegistry;\n private styleId: string;\n private skipInteractiveCSS: boolean;\n\n /** Hash of previously injected component CSS (for change detection) */\n private previousComponentCSSHash: number = 0;\n\n constructor(config: StyleInjectorConfig) {\n this.componentRegistry = config.componentRegistry;\n this.elementRegistry = config.elementRegistry;\n this.styleId = config.styleId || 'component-css';\n this.skipInteractiveCSS = config.skipInteractiveCSS ?? false;\n }\n\n /**\n * Inject CSS from all registered components into the page.\n * Processes templates per component instance if needed.\n * Note: utility CSS is injected eagerly during render by UtilityClassCollector.\n */\n inject(): void {\n try {\n this.injectComponentCSS();\n\n // Generate and inject interactive styles CSS in a separate style tag\n // Skip if managed externally (e.g., editor sends CSS via postMessage)\n if (!this.skipInteractiveCSS) {\n this.injectInteractiveCSS();\n }\n } catch (e) {\n logRuntimeError('StyleInjector.inject', e);\n }\n }\n\n /**\n * Inject component CSS (from component definitions with optional template processing).\n * Uses hash comparison to skip updates when CSS hasn't changed.\n * Updates textContent in-place instead of remove+recreate.\n */\n private injectComponentCSS(): void {\n const allComponents = this.componentRegistry.getAll();\n const processedCSSBlocks: string[] = [];\n\n // Collect CSS from all components and process templates per instance\n for (const [name, component] of Object.entries(allComponents)) {\n if (component?.component?.css) {\n const originalCSS = component.component.css;\n\n // Check if CSS contains templates\n if (hasTemplates(originalCSS)) {\n const componentRootPaths = this.elementRegistry.getComponentRootPaths(name);\n\n for (const rootPath of componentRootPaths) {\n try {\n const props = this.elementRegistry.getComponentProps(rootPath);\n if (props) {\n const processedCSS = processCodeTemplates(originalCSS, props);\n processedCSSBlocks.push(`/* Component: ${name} (instance) */\\n${processedCSS}`);\n }\n } catch (error) {\n processedCSSBlocks.push(`/* Component: ${name} */\\n${originalCSS}`);\n }\n }\n } else {\n processedCSSBlocks.push(`/* Component: ${name} */\\n${originalCSS}`);\n }\n }\n }\n\n if (processedCSSBlocks.length === 0) return;\n\n const combinedCSS = processedCSSBlocks.join('\\n\\n');\n const hash = simpleHash(combinedCSS);\n\n // Skip if component CSS hasn't changed\n if (hash === this.previousComponentCSSHash) return;\n this.previousComponentCSSHash = hash;\n\n // Update textContent in-place if tag exists, otherwise create\n if (document.head) {\n let styleTag = document.getElementById(this.styleId) as HTMLStyleElement | null;\n if (!styleTag) {\n styleTag = document.createElement('style');\n styleTag.id = this.styleId;\n document.head.appendChild(styleTag);\n }\n styleTag.textContent = combinedCSS;\n }\n }\n\n /**\n * Generate and inject interactive styles CSS from InteractiveStylesRegistry.\n * Registry is populated by ComponentBuilder during rendering.\n */\n private injectInteractiveCSS(): void {\n try {\n const interactiveStylesMap = InteractiveStylesRegistry.getAll();\n const interactiveStyleId = 'interactive-styles';\n\n if (interactiveStylesMap.size === 0) return;\n\n const breakpointConfig = getCachedBreakpointConfig() || DEFAULT_BREAKPOINTS;\n const interactiveCSS = generateAllInteractiveCSS(interactiveStylesMap, breakpointConfig);\n if (!interactiveCSS) return;\n\n if (document.head) {\n let styleTag = document.getElementById(interactiveStyleId) as HTMLStyleElement | null;\n if (!styleTag) {\n styleTag = document.createElement('style');\n styleTag.id = interactiveStyleId;\n document.head.appendChild(styleTag);\n }\n styleTag.textContent = interactiveCSS;\n }\n } catch (e) {\n logRuntimeError('StyleInjector.injectInteractiveCSS', e);\n }\n }\n\n /**\n * Remove the injected style tags and reset incremental state\n */\n clear(): void {\n const existingStyle = document.getElementById(this.styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n const existingInteractiveStyle = document.getElementById('interactive-styles');\n if (existingInteractiveStyle) {\n existingInteractiveStyle.remove();\n }\n // Full teardown: clears injectedClasses tracking and removes utility-css tag\n UtilityClassCollector.destroy();\n this.previousComponentCSSHash = 0;\n }\n\n /**\n * Check if style tag exists in DOM\n */\n exists(): boolean {\n return document.getElementById(this.styleId) !== null;\n }\n}\n", "/**\n * Script Executor\n * Handles JavaScript execution from component definitions\n * Supports template processing for per-instance JavaScript execution\n * Supports defineVars for Astro-style prop injection\n */\n\nimport type { ComponentRegistry } from '../componentRegistry';\nimport type { ElementRegistry } from '../elementRegistry';\nimport type { PropDefinition } from '../../shared/types';\nimport { hasTemplates, processCodeTemplates } from '../templateEngine';\nimport { logRuntimeError } from '../../shared/errorLogger';\n\nexport interface ScriptExecutorConfig {\n componentRegistry: ComponentRegistry;\n elementRegistry: ElementRegistry;\n}\n\n/**\n * Generate destructure statement for defineVars\n */\nfunction generateDestructure(\n defineVars: true | string[],\n interfaceDef?: Record<string, PropDefinition>\n): string {\n const vars = defineVars === true\n ? Object.keys(interfaceDef || {})\n : defineVars;\n if (vars.length === 0) return '';\n return `var {${vars.join(', ')}} = props;`;\n}\n\n/**\n * ScriptExecutor manages JavaScript execution from components\n * \n * Features:\n * - Executes JavaScript from all registered components\n * - Processes templates per component instance when needed\n * - Wraps JavaScript in IIFE for proper scoping\n * - Handles error cases gracefully\n */\nexport class ScriptExecutor {\n private componentRegistry: ComponentRegistry;\n private elementRegistry: ElementRegistry;\n\n constructor(config: ScriptExecutorConfig) {\n this.componentRegistry = config.componentRegistry;\n this.elementRegistry = config.elementRegistry;\n }\n\n /**\n * Execute JavaScript code via new Function() with error isolation\n * Uses new Function() instead of script tags to avoid CSP violations\n * Each component is wrapped in try-catch for isolation\n * @param jsCode - JavaScript code to execute\n * @param componentName - Component name for error reporting\n * @private\n */\n private executeWrappedJS(jsCode: string, componentName: string): void {\n if (!jsCode || !jsCode.trim()) return;\n\n const wrappedJS = `(function() {\n // Component: ${componentName}\n try {\n ${jsCode}\n } catch (e) {\n console.error('[Meno] Runtime error in ' + ${JSON.stringify(componentName)} + ':', e);\n }\n })();`;\n\n try {\n new Function(wrappedJS)();\n } catch (syntaxError) {\n // Syntax errors caught here - doesn't affect other components\n console.error(`[Meno] Syntax error in ${componentName}:`, syntaxError);\n }\n }\n\n /**\n * Execute JavaScript for a component instance with template processing\n * Falls back to original JS if template processing fails\n * @param componentName - Component name\n * @param originalJS - Original JavaScript code (may contain templates)\n * @param rootPath - Component instance root path\n * @private\n */\n private executeInstanceJS(componentName: string, originalJS: string, rootPath: string): void {\n try {\n const props = this.elementRegistry.getComponentProps(rootPath);\n if (!props) {\n return;\n }\n\n try {\n const processedJS = processCodeTemplates(originalJS, props);\n this.executeWrappedJS(processedJS, `${componentName} (instance: ${rootPath})`);\n } catch (templateError) {\n // Fallback to original JS if template processing fails (similar to StyleInjector)\n this.executeWrappedJS(originalJS, `${componentName} (instance: ${rootPath})`);\n }\n } catch (e) {\n logRuntimeError('ScriptExecutor.executeInstanceJS', e, { componentName, rootPath });\n }\n }\n\n /**\n * Execute JavaScript using the initComponent pattern for defineVars\n * Queries all elements with data-component, parses their data-props, and calls the JS with props in scope\n * @param componentName - Component name\n * @param js - Original JavaScript code\n * @param defineVars - defineVars configuration (true or array of var names)\n * @param interfaceDef - Component interface definition for resolving var names\n * @private\n */\n private executeWithInitPattern(\n componentName: string,\n js: string,\n defineVars: true | string[],\n interfaceDef?: Record<string, PropDefinition>\n ): void {\n const destructure = generateDestructure(defineVars, interfaceDef);\n\n const wrappedJS = `(function() {\n // Component: ${componentName} (defineVars)\n try {\n var elements = document.querySelectorAll('[data-component~=\"${componentName}\"]');\n elements.forEach(function(el) {\n var propsStr = el.getAttribute('data-props');\n var allProps = propsStr ? JSON.parse(propsStr) : {};\n var props = allProps[\"${componentName}\"] || {};\n (function(el, props) {\n ${destructure}\n ${js}\n })(el, props);\n });\n } catch (e) {\n console.error('[Meno] Runtime error in ${componentName}:', e);\n }\n })();`;\n\n try {\n new Function(wrappedJS)();\n } catch (syntaxError) {\n console.error(`[Meno] Syntax error in ${componentName}:`, syntaxError);\n }\n }\n\n /**\n * Execute JavaScript from all registered components\n * Processes templates per component instance if needed\n * Uses initComponent pattern for defineVars components\n */\n execute(): void {\n try {\n const allComponents = this.componentRegistry.getAll();\n\n // Track which components have been executed (for non-template JS)\n const executedComponents = new Set<string>();\n\n // Execute JS for each component instance with processed templates\n // Iterate through all components and their instances from registry\n for (const [componentName, component] of Object.entries(allComponents)) {\n if (!component?.component?.javascript) continue;\n\n const originalJS = component.component.javascript;\n const defineVars = component.component.defineVars;\n\n // Check if component uses defineVars (Astro-style prop injection)\n if (defineVars) {\n // Use initComponent pattern - queries all instances and initializes each with props\n if (!executedComponents.has(componentName)) {\n this.executeWithInitPattern(\n componentName,\n originalJS,\n defineVars,\n component.component.interface\n );\n executedComponents.add(componentName);\n }\n } else if (hasTemplates(originalJS)) {\n // Legacy: Process and execute JS per instance (templates need instance-specific props)\n // Get all root paths for this component directly from registry\n const componentRootPaths = this.elementRegistry.getComponentRootPaths(componentName);\n\n for (const rootPath of componentRootPaths) {\n this.executeInstanceJS(componentName, originalJS, String(rootPath));\n }\n } else {\n // No templates, no defineVars - execute JS only once per component type\n if (!executedComponents.has(componentName)) {\n this.executeWrappedJS(originalJS, componentName);\n executedComponents.add(componentName);\n }\n }\n }\n\n // Also execute JS for components without instances (fallback)\n // This handles edge cases where components are registered but not yet rendered\n const componentNamesWithInstances = this.elementRegistry.getAllComponentNames();\n if (componentNamesWithInstances.length === 0) {\n // Execute JS for components that weren't executed above (no instances found)\n for (const [name, component] of Object.entries(allComponents)) {\n if (component?.component?.javascript && !executedComponents.has(name)) {\n const originalJS = component.component.javascript;\n const defineVars = component.component.defineVars;\n // Only execute if it doesn't have templates and doesn't use defineVars\n if (!hasTemplates(originalJS) && !defineVars) {\n // Use setTimeout to ensure DOM is ready (fallback case)\n setTimeout(() => {\n this.executeWrappedJS(originalJS, name);\n }, 0);\n }\n }\n }\n }\n } catch (e) {\n logRuntimeError('ScriptExecutor.execute', e);\n }\n }\n\n /**\n * Execute JavaScript for a specific component\n * @param componentName - Component name to execute JS for\n */\n executeForComponent(componentName: string): void {\n try {\n const component = this.componentRegistry.get(componentName);\n if (!component?.component?.javascript) return;\n\n const originalJS = component.component.javascript;\n const defineVars = component.component.defineVars;\n\n // Check if component uses defineVars (Astro-style prop injection)\n if (defineVars) {\n this.executeWithInitPattern(\n componentName,\n originalJS,\n defineVars,\n component.component.interface\n );\n } else if (hasTemplates(originalJS)) {\n // Legacy: Process and execute JS per instance (templates need instance-specific props)\n const componentRootPaths = this.elementRegistry.getComponentRootPaths(componentName);\n\n for (const rootPath of componentRootPaths) {\n this.executeInstanceJS(componentName, originalJS, String(rootPath));\n }\n } else {\n // No templates, no defineVars - execute JS once\n this.executeWrappedJS(originalJS, componentName);\n }\n } catch (e) {\n logRuntimeError('ScriptExecutor.executeForComponent', e, { componentName });\n }\n }\n\n /**\n * Re-execute JavaScript for a specific element instance (used for editor reactivity)\n * Updates data-props attribute and re-runs the component JS for that element\n * @param componentName - Component name\n * @param element - The DOM element to re-execute for\n * @param newProps - New props to inject\n */\n executeForElement(\n componentName: string,\n element: HTMLElement,\n newProps: Record<string, unknown>\n ): void {\n try {\n const component = this.componentRegistry.get(componentName);\n if (!component?.component?.javascript) return;\n\n const defineVars = component.component.defineVars;\n if (!defineVars) return;\n\n const js = component.component.javascript;\n const destructure = generateDestructure(defineVars, component.component.interface);\n\n // Update data-props attribute (keyed by component name)\n const varsToExpose = defineVars === true\n ? Object.keys(component.component.interface || {})\n : defineVars;\n\n const propsForJS: Record<string, unknown> = {};\n for (const varName of varsToExpose) {\n if (newProps[varName] !== undefined) {\n propsForJS[varName] = newProps[varName];\n }\n }\n\n // Preserve existing keyed props from other components\n let allProps: Record<string, unknown> = {};\n const existingStr = element.getAttribute('data-props');\n if (existingStr) {\n try { allProps = JSON.parse(existingStr); } catch {}\n }\n allProps[componentName] = propsForJS;\n element.setAttribute('data-props', JSON.stringify(allProps));\n\n // Execute JS for this element only\n const wrappedJS = `(function(el, props) {\n ${destructure}\n ${js}\n })(element, props);`;\n\n try {\n const fn = new Function('element', 'props', wrappedJS);\n fn(element, propsForJS);\n } catch (jsError) {\n console.error(`Error re-executing defineVars JS for ${componentName}:`, jsError);\n }\n } catch (e) {\n logRuntimeError('ScriptExecutor.executeForElement', e, { componentName });\n }\n }\n}\n\n", "/**\n * PrefetchService - Astro-style link prefetching for production SSR\n *\n * Features:\n * - Multiple strategies: hover, tap, viewport, load\n * - LRU cache with TTL\n * - Bandwidth-aware (saveData, slow connection detection)\n * - Debounced hover prefetching\n * - AbortController for request cancellation\n */\n\nimport { API_ROUTES } from '../../shared/constants';\nimport type {\n PrefetchConfig,\n PrefetchStrategy,\n CachedPageEntry,\n ConnectionInfo,\n} from '../../shared/types/prefetch';\nimport { DEFAULT_PREFETCH_CONFIG } from '../../shared/types/prefetch';\n\nexport interface PrefetchServiceConfig {\n config?: Partial<PrefetchConfig>;\n}\n\nexport class PrefetchService {\n private config: PrefetchConfig;\n private cache: Map<string, CachedPageEntry> = new Map();\n private pendingPrefetches: Map<string, AbortController> = new Map();\n private hoverTimeouts: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private viewportObserver: IntersectionObserver | null = null;\n private observedLinks: Set<HTMLAnchorElement> = new Set();\n /** Map element path to observed link for cleanup when element unmounts */\n private linkPathMap: Map<string, HTMLAnchorElement> = new Map();\n\n constructor(serviceConfig: PrefetchServiceConfig = {}) {\n this.config = { ...DEFAULT_PREFETCH_CONFIG, ...serviceConfig.config };\n }\n\n /**\n * Get connection quality info for adaptive prefetching\n */\n private getConnectionInfo(): ConnectionInfo {\n const nav = navigator as Navigator & {\n connection?: {\n saveData?: boolean;\n effectiveType?: string;\n downlink?: number;\n };\n };\n\n const connection = nav.connection;\n\n return {\n saveData: connection?.saveData ?? false,\n effectiveType:\n (connection?.effectiveType as ConnectionInfo['effectiveType']) ??\n 'unknown',\n downlink: connection?.downlink ?? Infinity,\n };\n }\n\n /**\n * Determine effective strategy based on connection quality\n */\n private getEffectiveStrategy(\n requestedStrategy: PrefetchStrategy\n ): PrefetchStrategy {\n if (!this.config.respectSaveData) return requestedStrategy;\n\n const { saveData, effectiveType, downlink } = this.getConnectionInfo();\n\n // If save-data is enabled, fall back to tap\n if (saveData) return 'tap';\n\n // If slow connection, fall back to tap\n if (effectiveType === 'slow-2g' || effectiveType === '2g') return 'tap';\n if (downlink < this.config.slowConnectionThreshold) return 'tap';\n\n return requestedStrategy;\n }\n\n /**\n * Check if page is in cache and not expired\n */\n hasValidCache(path: string): boolean {\n const entry = this.cache.get(path);\n if (!entry) return false;\n\n const isExpired = Date.now() - entry.timestamp > this.config.cacheTTL;\n if (isExpired) {\n this.cache.delete(path);\n return false;\n }\n\n return true;\n }\n\n /**\n * Get cached page data\n */\n getFromCache(path: string): CachedPageEntry | null {\n if (!this.hasValidCache(path)) return null;\n return this.cache.get(path) ?? null;\n }\n\n /**\n * Enforce LRU cache size limit\n */\n private enforceCacheLimit(): void {\n if (this.cache.size <= this.config.maxCacheSize) return;\n\n // Get oldest entries and remove them\n const entries = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp\n );\n\n const toRemove = this.cache.size - this.config.maxCacheSize;\n for (let i = 0; i < toRemove; i++) {\n this.cache.delete(entries[i][0]);\n }\n }\n\n /**\n * Prefetch a page and store in cache\n */\n async prefetch(path: string): Promise<void> {\n if (!this.config.enabled) return;\n if (this.hasValidCache(path)) return;\n if (this.pendingPrefetches.has(path)) return;\n\n const abortController = new AbortController();\n this.pendingPrefetches.set(path, abortController);\n\n try {\n // Fetch page data (same endpoint RouteLoader uses)\n const response = await fetch(\n `${API_ROUTES.PAGE_CONTENT}?page=${encodeURIComponent(path)}`,\n {\n signal: abortController.signal,\n // Allow browser caching for prefetched content\n cache: 'default',\n }\n );\n\n if (!response.ok) {\n this.pendingPrefetches.delete(path);\n return;\n }\n\n const data = await response.json();\n\n // Store in cache\n this.cache.set(path, {\n data,\n timestamp: Date.now(),\n components: data.components,\n });\n\n this.enforceCacheLimit();\n } catch (error) {\n // Ignore abort errors\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n // Silent fail for network errors - prefetching is opportunistic\n } finally {\n this.pendingPrefetches.delete(path);\n }\n }\n\n /**\n * Cancel pending prefetch for a path\n */\n cancelPrefetch(path: string): void {\n const controller = this.pendingPrefetches.get(path);\n if (controller) {\n controller.abort();\n this.pendingPrefetches.delete(path);\n }\n\n const timeout = this.hoverTimeouts.get(path);\n if (timeout) {\n clearTimeout(timeout);\n this.hoverTimeouts.delete(path);\n }\n }\n\n /**\n * Handle hover on a link - debounced prefetch\n */\n handleHover(path: string): void {\n if (!this.config.enabled) return;\n\n const strategy = this.getEffectiveStrategy('hover');\n if (strategy === 'tap') return; // Degraded to tap, don't prefetch on hover\n\n // Cancel any existing timeout for this path\n this.cancelHoverTimeout(path);\n\n // Set debounced prefetch\n const timeout = setTimeout(() => {\n this.prefetch(path);\n this.hoverTimeouts.delete(path);\n }, this.config.hoverDebounce);\n\n this.hoverTimeouts.set(path, timeout);\n }\n\n /**\n * Handle hover leave - cancel pending prefetch\n */\n handleHoverLeave(path: string): void {\n this.cancelHoverTimeout(path);\n }\n\n private cancelHoverTimeout(path: string): void {\n const timeout = this.hoverTimeouts.get(path);\n if (timeout) {\n clearTimeout(timeout);\n this.hoverTimeouts.delete(path);\n }\n }\n\n /**\n * Handle tap/touch start - immediate prefetch for tap strategy\n */\n handleTap(path: string): void {\n if (!this.config.enabled) return;\n this.prefetch(path);\n }\n\n /**\n * Setup viewport observer for viewport strategy links\n */\n setupViewportObserver(): void {\n if (this.viewportObserver) return;\n if (typeof IntersectionObserver === 'undefined') return;\n\n this.viewportObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n const link = entry.target as HTMLAnchorElement;\n const href = link.getAttribute('href');\n if (href && href.startsWith('/')) {\n this.prefetch(href);\n }\n }\n });\n },\n { rootMargin: '50px' } // Start prefetching slightly before visible\n );\n }\n\n /**\n * Observe a link for viewport strategy\n * @param link The anchor element to observe\n * @param elementPath Optional unique path identifier for cleanup\n */\n observeLink(link: HTMLAnchorElement, elementPath?: string): void {\n if (!this.config.enabled) return;\n if (!this.viewportObserver) this.setupViewportObserver();\n if (this.observedLinks.has(link)) return;\n\n this.observedLinks.add(link);\n this.viewportObserver?.observe(link);\n\n // Track by path for cleanup when element unmounts\n if (elementPath) {\n // Clean up previous link at this path if exists\n const previousLink = this.linkPathMap.get(elementPath);\n if (previousLink && previousLink !== link) {\n this.unobserveLink(previousLink);\n }\n this.linkPathMap.set(elementPath, link);\n }\n }\n\n /**\n * Unobserve a link\n */\n unobserveLink(link: HTMLAnchorElement): void {\n this.observedLinks.delete(link);\n this.viewportObserver?.unobserve(link);\n }\n\n /**\n * Unobserve a link by its element path\n * Used for cleanup when elements are removed from DOM\n */\n unobserveLinkByPath(elementPath: string): void {\n const link = this.linkPathMap.get(elementPath);\n if (link) {\n this.unobserveLink(link);\n this.linkPathMap.delete(elementPath);\n }\n }\n\n /**\n * Clear cache and cancel all pending operations\n */\n clear(): void {\n // Cancel all pending prefetches\n this.pendingPrefetches.forEach((controller) => controller.abort());\n this.pendingPrefetches.clear();\n\n // Clear all hover timeouts\n this.hoverTimeouts.forEach((timeout) => clearTimeout(timeout));\n this.hoverTimeouts.clear();\n\n // Clear cache\n this.cache.clear();\n\n // Cleanup viewport observer\n if (this.viewportObserver) {\n this.observedLinks.forEach((link) => this.viewportObserver?.unobserve(link));\n this.observedLinks.clear();\n this.linkPathMap.clear();\n this.viewportObserver.disconnect();\n this.viewportObserver = null;\n }\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<PrefetchConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Check if prefetching is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n\n /**\n * Get the default strategy\n */\n getDefaultStrategy(): PrefetchStrategy {\n return this.config.defaultStrategy;\n }\n}\n", "/**\n * Client Initializer (Core)\n * Basic client initialization for non-editor use cases.\n * For editor functionality, use @meno/studio's ClientInitializer.\n */\n\nimport { ComponentRegistry, globalComponentRegistry } from \"./componentRegistry\";\nimport { ComponentBuilder } from \"./core/ComponentBuilder\";\nimport { StyleInjector } from \"./styles/StyleInjector\";\nimport { ScriptExecutor } from \"./scripts/ScriptExecutor\";\nimport { PrefetchService } from \"./services/PrefetchService\";\nimport { elementRegistry } from \"./elementRegistry\";\nimport { setGlobalTemplateContext } from \"../shared/globalTemplateContext\";\nimport type { PrefetchConfig } from \"../shared/types/prefetch\";\n\n/**\n * Client initialization options\n */\nexport interface ClientInitOptions {\n /** Prefetch configuration (disabled by default) */\n prefetch?: Partial<PrefetchConfig>;\n}\n\n/**\n * Client services interface\n */\nexport interface ClientServices {\n componentRegistry: ComponentRegistry;\n componentBuilder: ComponentBuilder;\n styleInjector: StyleInjector;\n scriptExecutor: ScriptExecutor;\n prefetchService: PrefetchService;\n}\n\n/**\n * Helper to extract page name from URL path (same logic as SSR)\n */\nfunction getPageNameFromPath(): string {\n if (typeof window === 'undefined') return 'page';\n const pathname = window.location.pathname;\n // Extract file name from path (e.g., '/about' -> 'about', '/blog/post' -> 'blog_post', '/' -> 'index')\n return pathname.replace(/^\\//, '').replace(/\\//g, '_') || 'index';\n}\n\n/**\n * Detect if we're inside an editor iframe.\n * The editor manages interactive CSS via postMessage, so we should skip\n * generating it ourselves to avoid overwriting the correct CSS.\n */\nfunction isInEditorIframe(): boolean {\n if (typeof window === 'undefined') return false;\n // Check if we're in an iframe (parent !== self)\n return window.parent !== window;\n}\n\n/**\n * Initialize core client services\n */\nexport function initializeClient(options: ClientInitOptions = {}): ClientServices {\n // Set editor mode when running inside editor iframe (disables video autoplay, etc.)\n setGlobalTemplateContext({ isEditorMode: isInEditorIframe() });\n\n const componentRegistry = globalComponentRegistry;\n\n const prefetchService = new PrefetchService({\n config: options.prefetch,\n });\n\n const componentBuilder = new ComponentBuilder({\n componentRegistry,\n elementRegistry,\n prefetchService,\n // Provide page name getter for interactive styles class generation\n getCurrentPageName: getPageNameFromPath,\n getCurrentPagePath: () => {\n if (typeof window === 'undefined') return '/';\n return window.location.pathname;\n },\n });\n\n const styleInjector = new StyleInjector({\n componentRegistry,\n elementRegistry,\n styleId: 'component-css',\n // Skip interactive CSS when in editor iframe - editor sends CSS via postMessage\n skipInteractiveCSS: isInEditorIframe(),\n });\n\n const scriptExecutor = new ScriptExecutor({\n componentRegistry,\n elementRegistry,\n });\n\n return {\n componentRegistry,\n componentBuilder,\n styleInjector,\n scriptExecutor,\n prefetchService,\n };\n}\n\n/**\n * Setup event handlers (no-op in core, editor functionality in @meno/studio)\n */\nexport function setupEventHandlers(_services: ClientServices): () => void {\n // Core router doesn't set up editor event handlers\n // Studio's EditorRouter adds keyboard shortcuts and message handlers\n return () => {};\n}\n", "export type Theme = 'light' | 'dark';\n\nexport interface ThemeColors {\n sidebar: {\n background: string;\n border: string;\n text: string;\n textSecondary: string;\n textMuted: string;\n headerBackground: string;\n tabActiveBackground: string;\n tabActiveBorder: string;\n tabInactiveBackground: string;\n footerBackground: string;\n buttonPrimaryBackground: string;\n buttonPrimaryColor: string;\n hoverBackground: string;\n selectedBackground: string;\n selectedText: string;\n };\n scrollbar: {\n track: string;\n thumb: string;\n thumbHover: string;\n };\n propsPanel: {\n background: string;\n backgroundSecondary: string;\n backgroundTertiary: string;\n border: string;\n borderSecondary: string;\n text: string;\n textSecondary: string;\n textMuted: string;\n codeString: string;\n codeNumber: string;\n codeKey: string;\n codeType: string;\n buttonPrimary: string;\n buttonPrimaryHover: string;\n buttonSecondary: string;\n buttonDanger: string;\n buttonDangerHover: string;\n inputBackground: string;\n inputBorder: string;\n hoverBackground: string;\n };\n}\n\nconst lightThemeColors: ThemeColors = {\n sidebar: {\n background: '#ffffff',\n border: '#e1e4e8',\n text: '#24292e',\n textSecondary: '#586069',\n textMuted: '#6a737d',\n headerBackground: '#f6f8fa',\n tabActiveBackground: '#ffffff',\n tabActiveBorder: '#0366d6',\n tabInactiveBackground: 'transparent',\n footerBackground: '#f6f8fa',\n buttonPrimaryBackground: '#0366d6',\n buttonPrimaryColor: '#ffffff',\n hoverBackground: '#f1f3f5',\n selectedBackground: '#0366d6',\n selectedText: '#ffffff',\n },\n scrollbar: {\n track: '#f1f3f5',\n thumb: '#c1c9d1',\n thumbHover: '#a8b2bd',\n },\n propsPanel: {\n background: '#ffffff',\n backgroundSecondary: '#f6f8fa',\n backgroundTertiary: '#eaeef2',\n border: '#d0d7de',\n borderSecondary: '#d1d5da',\n text: '#24292e',\n textSecondary: '#586069',\n textMuted: '#6a737d',\n codeString: '#032f62',\n codeNumber: '#005cc5',\n codeKey: '#005cc5',\n codeType: '#6f42c1',\n buttonPrimary: '#0366d6',\n buttonPrimaryHover: '#0256cc',\n buttonSecondary: '#586069',\n buttonDanger: '#d73a49',\n buttonDangerHover: '#cb2431',\n inputBackground: '#f9fafb',\n inputBorder: '#e4e7ed',\n hoverBackground: '#f1f3f5',\n },\n};\n\nconst darkThemeColors: ThemeColors = {\n sidebar: {\n background: '#1e1e1e',\n border: '#333333',\n text: '#cccccc',\n textSecondary: '#cccccc',\n textMuted: '#888888',\n headerBackground: '#2d2d2d',\n tabActiveBackground: '#1e1e1e',\n tabActiveBorder: '#007acc',\n tabInactiveBackground: 'transparent',\n footerBackground: '#252526',\n buttonPrimaryBackground: '#0e639c',\n buttonPrimaryColor: '#ffffff',\n hoverBackground: '#2a2d2e',\n selectedBackground: '#37373d',\n selectedText: '#ffffff',\n },\n scrollbar: {\n track: '#1e1e1e',\n thumb: '#424242',\n thumbHover: '#4e4e4e',\n },\n propsPanel: {\n background: '#1e1e1e',\n backgroundSecondary: '#2d2d2d',\n backgroundTertiary: '#252525',\n border: '#333333',\n borderSecondary: '#444444',\n text: '#cccccc',\n textSecondary: '#cccccc',\n textMuted: '#888888',\n codeString: '#ce9178',\n codeNumber: '#b5cea8',\n codeKey: '#9cdcfe',\n codeType: '#4ec9b0',\n buttonPrimary: '#007acc',\n buttonPrimaryHover: '#0098ff',\n buttonSecondary: '#007acc',\n buttonDanger: '#f48771',\n buttonDangerHover: '#ff6b6b',\n inputBackground: '#1e1e1e',\n inputBorder: '#444444',\n hoverBackground: '#2a2d2e',\n },\n};\n\nexport function getThemeColors(theme: Theme): ThemeColors {\n return theme === 'light' ? lightThemeColors : darkThemeColors;\n}\n\n", "/**\n * Theme Context\n * Provides theme switching functionality to components\n */\n\nimport React, { createContext, useContext, useState, useEffect } from 'react';\nimport { useThemes } from '../hooks/useColorVariables';\n\ninterface ThemeContextType {\n currentTheme: string;\n setTheme: (themeName: string) => void;\n themes: string[];\n loading: boolean;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\n/**\n * Theme Provider Component\n * Wraps the app and provides theme context to all children\n */\nexport function ThemeProvider({ children }: { children: React.ReactNode }) {\n const { themes, defaultTheme, loading } = useThemes();\n const [currentTheme, setCurrentTheme] = useState<string>('dark');\n\n // Initialize theme from defaultTheme or localStorage\n useEffect(() => {\n if (defaultTheme) {\n const savedTheme = localStorage.getItem('theme');\n const themeToUse = savedTheme || defaultTheme;\n setCurrentTheme(themeToUse);\n applyTheme(themeToUse);\n }\n }, [defaultTheme]);\n\n const setTheme = (themeName: string) => {\n setCurrentTheme(themeName);\n localStorage.setItem('theme', themeName);\n applyTheme(themeName);\n };\n\n const applyTheme = (themeName: string) => {\n // Set the theme attribute on the root element\n const root = document.documentElement;\n root.setAttribute('theme', themeName);\n };\n\n const themeNames = themes?.map(theme => theme.name) || [];\n\n return (\n <ThemeContext.Provider\n value={{\n currentTheme,\n setTheme,\n themes: themeNames,\n loading,\n }}\n >\n {children}\n </ThemeContext.Provider>\n );\n}\n\n/**\n * Hook for using the theme context\n */\nexport function useTheme() {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n}\n", "/**\n * Hook for fetching and caching color variables\n */\n\nimport { useState, useEffect, useRef } from 'react';\nimport type { ColorVariables, ThemeEntry, HMRMessage } from '../../shared/types';\n\nlet cachedColors: Record<string, ColorVariables> = {};\nlet cachedThemes: ThemeEntry[] | null = null;\nlet cachedDefaultTheme: string | null = null;\nlet hmrCallbacks: Set<() => void> = new Set();\n\n// Setup HMR listener immediately when module loads\nfunction initializeHMRListener() {\n if (typeof window === 'undefined') return;\n\n // Only setup once\n if (window.__hmrColorsInitialized) return;\n window.__hmrColorsInitialized = true;\n\n // Listen for custom HMR events from HMRManager\n document.addEventListener('hmr-colors-update', async () => {\n // Clear all caches\n cachedColors = {};\n cachedThemes = null;\n cachedDefaultTheme = null;\n\n // Inject new CSS theme variables\n await injectUpdatedThemeCSS();\n\n // Notify all listeners to refresh their data\n hmrCallbacks.forEach(callback => callback());\n });\n}\n\n// Initialize immediately\nif (typeof window !== 'undefined') {\n initializeHMRListener();\n}\n\n/**\n * Fetch updated theme CSS and inject it into the page\n */\nasync function injectUpdatedThemeCSS() {\n try {\n // Fetch the theme config from the server\n const response = await fetch('/api/themes');\n if (!response.ok) return;\n\n const data = await response.json() as { themes: Array<{ name: string; label: string }>; default: string };\n\n // Fetch all theme colors\n const themeColors: Record<string, any> = {};\n for (const theme of data.themes) {\n const colorResponse = await fetch(`/api/colors?theme=${encodeURIComponent(theme.name)}`);\n if (colorResponse.ok) {\n themeColors[theme.name] = (await colorResponse.json()).colors;\n }\n }\n\n // Also get default theme colors\n const defaultResponse = await fetch('/api/colors');\n if (defaultResponse.ok) {\n themeColors['default'] = (await defaultResponse.json()).colors;\n }\n\n // Generate CSS\n let css = '';\n\n // Default theme in :root\n if (themeColors['default']) {\n const vars = Object.entries(themeColors['default'])\n .map(([name, value]) => ` --${name}: ${value};`)\n .join('\\n');\n css += `:root {\\n${vars}\\n}\\n\\n`;\n }\n\n // Each theme in [theme=\"...\"]\n for (const theme of data.themes) {\n if (themeColors[theme.name]) {\n const vars = Object.entries(themeColors[theme.name])\n .map(([name, value]) => ` --${name}: ${value};`)\n .join('\\n');\n css += `[theme=\"${theme.name}\"] {\\n${vars}\\n}\\n\\n`;\n }\n }\n\n // Find or create a style tag for theme variables\n let themeStyleTag = document.getElementById('hmr-theme-variables');\n if (!themeStyleTag) {\n themeStyleTag = document.createElement('style');\n themeStyleTag.id = 'hmr-theme-variables';\n // Insert after the main style tag\n const mainStyle = document.querySelector('style');\n if (mainStyle && mainStyle.nextSibling) {\n document.head.insertBefore(themeStyleTag, mainStyle.nextSibling);\n } else {\n document.head.appendChild(themeStyleTag);\n }\n }\n\n // Update the style tag with new CSS\n themeStyleTag.textContent = css;\n } catch (error) {\n console.error('Failed to inject updated theme CSS:', error);\n }\n}\n\nexport function useColorVariables(themeName?: string) {\n const [colors, setColors] = useState<ColorVariables | null>(themeName && cachedColors[themeName] ? cachedColors[themeName] : null);\n const [loading, setLoading] = useState(!cachedColors[themeName || 'default']);\n const [error, setError] = useState<Error | null>(null);\n const callbackRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n const theme = themeName || 'default';\n\n // Create a callback to refresh colors when HMR update is received\n const refreshCallback = async () => {\n try {\n const url = themeName ? `/api/colors?theme=${encodeURIComponent(themeName)}` : '/api/colors';\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('Failed to fetch colors');\n }\n const data = await response.json() as ColorVariables;\n cachedColors[theme] = data;\n setColors(data);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n }\n };\n\n // Register callback for HMR updates\n callbackRef.current = refreshCallback;\n hmrCallbacks.add(refreshCallback);\n\n // Return cached colors immediately\n if (cachedColors[theme]) {\n setColors(cachedColors[theme]);\n setLoading(false);\n return () => {\n if (callbackRef.current) {\n hmrCallbacks.delete(callbackRef.current);\n }\n };\n }\n\n // Fetch colors for specific theme\n const fetchColors = async () => {\n try {\n const url = themeName ? `/api/colors?theme=${encodeURIComponent(themeName)}` : '/api/colors';\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('Failed to fetch colors');\n }\n const data = await response.json() as ColorVariables;\n cachedColors[theme] = data;\n setColors(data);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setColors(null);\n } finally {\n setLoading(false);\n }\n };\n\n fetchColors();\n\n return () => {\n if (callbackRef.current) {\n hmrCallbacks.delete(callbackRef.current);\n }\n };\n }, [themeName]);\n\n return { colors, loading, error };\n}\n\n/**\n * Hook for fetching available themes\n */\nexport function useThemes() {\n const [themes, setThemes] = useState<ThemeEntry[] | null>(cachedThemes);\n const [defaultTheme, setDefaultTheme] = useState<string | null>(cachedDefaultTheme);\n const [loading, setLoading] = useState(!cachedThemes);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n // Return cached themes immediately\n if (cachedThemes && cachedDefaultTheme) {\n setThemes(cachedThemes);\n setDefaultTheme(cachedDefaultTheme);\n setLoading(false);\n return;\n }\n\n // Fetch themes\n const fetchThemes = async () => {\n try {\n const response = await fetch('/api/themes');\n if (!response.ok) {\n throw new Error('Failed to fetch themes');\n }\n const data = await response.json() as { themes: ThemeEntry[]; default: string };\n cachedThemes = data.themes;\n cachedDefaultTheme = data.default;\n setThemes(data.themes);\n setDefaultTheme(data.default);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setThemes(null);\n } finally {\n setLoading(false);\n }\n };\n\n fetchThemes();\n }, []);\n\n return { themes, defaultTheme, loading, error };\n}\n\n/**\n * Get color variable suggestions for value input\n */\nexport function getColorVariableSuggestions(colors: ColorVariables | null, input: string): string[] {\n if (!colors) return [];\n\n const normalizedInput = input.trim().toLowerCase();\n if (!normalizedInput) {\n return Object.keys(colors.colors).map(name => `var(--${name})`);\n }\n\n // Filter color variable names that match the input\n return Object.keys(colors.colors)\n .filter(name => name.toLowerCase().includes(normalizedInput) || normalizedInput.includes(name.toLowerCase()))\n .map(name => `var(--${name})`);\n}\n\n/**\n * Check if a value is a color variable reference\n */\nexport function isColorVariableValue(value: string): boolean {\n return /^var\\(--[\\w-]+\\)$/.test(value.trim());\n}\n", "/**\n * Style Processor\n * Handles component style merging from structured component definitions\n */\n\nimport type { ComponentDefinition, StyleObject, StyleValue } from '../shared/types';\nimport { processStructure, normalizeStyle } from './templateEngine';\n\ntype ComponentProps = Record<string, unknown>;\n\n/**\n * Merge component styles from structured component definition\n * Returns merged props with all applicable styles\n */\nexport function mergeComponentStyles(\n componentDef: ComponentDefinition,\n props: ComponentProps\n): ComponentProps {\n try {\n // Start with base props from component definition\n let mergedProps: ComponentProps = { ...(componentDef.props || {}) };\n\n const structuredComponentDef = componentDef.component;\n if (!structuredComponentDef) {\n return props || {};\n }\n\n // Build default props from structured component prop definitions (from interface)\n const defaultProps: ComponentProps = {};\n if (structuredComponentDef.interface) {\n for (const [key, def] of Object.entries(structuredComponentDef.interface)) {\n if (def && typeof def === 'object' && 'default' in def) {\n defaultProps[key] = def.default;\n }\n }\n }\n const effectiveInputProps = { ...defaultProps, ...(props || {}) };\n\n // Merge resolved props (with defaults) into mergedProps so they're available in PropsPanel\n mergedProps = { ...mergedProps, ...effectiveInputProps };\n\n // Compute base style from structure with templates evaluated\n // processStructure now reads from structure.style and merges into props.style\n try {\n if (structuredComponentDef.structure) {\n const processed = processStructure(structuredComponentDef.structure, { props: effectiveInputProps, componentDef: structuredComponentDef });\n // Type guard: ensure processed is a ComponentNode with props\n if (processed && typeof processed === 'object' && !Array.isArray(processed) && 'props' in processed) {\n const processedProps = processed.props as Record<string, unknown> | undefined;\n const structureStyle = (processedProps?.style && typeof processedProps.style === 'object' && processedProps.style !== null && !Array.isArray(processedProps.style))\n ? processedProps.style as Record<string, unknown>\n : {};\n const currentStyle = typeof mergedProps.style === 'object' && mergedProps.style !== null && !Array.isArray(mergedProps.style)\n ? { ...mergedProps.style as Record<string, unknown> }\n : {};\n mergedProps.style = { ...currentStyle, ...structureStyle };\n }\n }\n } catch (e) {\n }\n\n // Merge with instance props (allows overrides)\n // Normalize responsive styles to flat StyleObject\n const restProps = props || {};\n const normalizedMergedStyle = normalizeStyle(mergedProps.style as StyleValue) || {};\n const normalizedRestStyle = normalizeStyle(restProps?.style as StyleValue) || {};\n \n mergedProps = {\n ...mergedProps,\n ...restProps,\n style: {\n ...normalizedMergedStyle,\n ...normalizedRestStyle,\n },\n };\n\n return mergedProps;\n } catch (error) {\n // Return props as-is if merging fails\n return props || {};\n }\n}\n\n/**\n * Merge styles from multiple sources\n */\nexport function mergeStyles(...styles: (StyleObject | undefined)[]): StyleObject {\n return styles.reduce<StyleObject>((acc, style) => {\n if (!style) return acc;\n return { ...acc, ...style };\n }, {});\n}\n\n", "/**\n * Shared hook for property autocomplete functionality\n * Handles property input, suggestions, and keyboard navigation\n */\n\nimport { useState, useRef, useEffect } from 'react';\nimport { filterCSSProperties } from '../../shared/cssProperties';\n\nexport function usePropertyAutocomplete(initialProperty: string = '') {\n const [property, setProperty] = useState(initialProperty);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const suggestions = filterCSSProperties(property);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedIndex(prev =>\n prev < suggestions.length - 1 ? prev + 1 : prev\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedIndex(prev => prev > 0 ? prev - 1 : -1);\n }\n };\n\n return {\n property,\n setProperty,\n showSuggestions,\n setShowSuggestions,\n selectedIndex,\n setSelectedIndex,\n suggestions,\n inputRef,\n handleKeyDown\n };\n}\n", "/**\n * Hook for fetching and caching CSS variables (variables.json)\n */\n\nimport { useState, useEffect, useRef } from 'react';\nimport type { CSSVariable } from '../../shared/types/variables';\n\nlet cachedVariables: CSSVariable[] | null = null;\nlet hmrCallbacks: Set<() => void> = new Set();\n\n// Setup HMR listener immediately when module loads\nfunction initializeHMRListener() {\n if (typeof window === 'undefined') return;\n\n // Only setup once\n if ((window as any).__hmrVariablesInitialized) return;\n (window as any).__hmrVariablesInitialized = true;\n\n // Listen for custom HMR events from HMRManager\n document.addEventListener('hmr-variables-update', () => {\n // Clear cache\n cachedVariables = null;\n\n // Notify all listeners to refresh their data\n hmrCallbacks.forEach(callback => callback());\n });\n}\n\n// Initialize immediately\nif (typeof window !== 'undefined') {\n initializeHMRListener();\n}\n\nexport function useVariables() {\n const [variables, setVariables] = useState<CSSVariable[] | null>(cachedVariables);\n const [loading, setLoading] = useState(!cachedVariables);\n const [error, setError] = useState<Error | null>(null);\n const callbackRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n // Create a callback to refresh variables when HMR update is received\n const refreshCallback = async () => {\n try {\n const response = await fetch('/api/variables-status');\n if (!response.ok) {\n throw new Error('Failed to fetch variables');\n }\n const data = await response.json() as { status: string; config: { variables: CSSVariable[] } };\n cachedVariables = data.config.variables;\n setVariables(cachedVariables);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n }\n };\n\n // Register callback for HMR updates\n callbackRef.current = refreshCallback;\n hmrCallbacks.add(refreshCallback);\n\n // Return cached variables immediately\n if (cachedVariables) {\n setVariables(cachedVariables);\n setLoading(false);\n return () => {\n if (callbackRef.current) {\n hmrCallbacks.delete(callbackRef.current);\n }\n };\n }\n\n // Fetch variables\n const fetchVariables = async () => {\n try {\n const response = await fetch('/api/variables-status');\n if (!response.ok) {\n throw new Error('Failed to fetch variables');\n }\n const data = await response.json() as { status: string; config: { variables: CSSVariable[] } };\n cachedVariables = data.config.variables;\n setVariables(cachedVariables);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setVariables(null);\n } finally {\n setLoading(false);\n }\n };\n\n fetchVariables();\n\n return () => {\n if (callbackRef.current) {\n hmrCallbacks.delete(callbackRef.current);\n }\n };\n }, []);\n\n return { variables, loading, error };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Component Builder\n * Builds React elements from component tree nodes with support for custom components,\n * responsive styles, event handlers, and element registration.\n */\n\nimport { createElement as h, Fragment } from \"react\";\nimport type { ReactElement } from \"react\";\n\n// Component registry and utilities\nimport { ComponentRegistry } from \"../componentRegistry\";\nimport { processStructure } from \"../templateEngine\";\nimport { NODE_TYPE } from \"../../shared/constants\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport type { ComponentNode, StyleValue } from \"../../shared/types\";\nimport { isComponentNode, extractNodeProperties, isSlotMarker, isEmbedNode, isLinkNode, isLocaleListNode, isListNode, markAsSlotContent, evaluateNodeIf, isBooleanMapping } from \"../../shared/nodeUtils\";\nimport { mergeNodeStyles } from \"../../shared/styleNodeUtils\";\nimport { isCurrentLink } from \"../../shared/linkUtils\";\nimport { extractAttributesFromNode, skipEmptyTemplateAttributes } from \"../../shared/attributeNodeUtils\";\nimport { resolvePropsFromDefinition } from \"../../shared/propResolver\";\nimport { ElementRegistry } from \"../elementRegistry\";\nimport { InteractiveStylesRegistry } from \"../InteractiveStylesRegistry\";\nimport type { Path } from \"../../shared/pathArrayUtils\";\nimport type { I18nConfig } from \"../../shared/types/components\";\nimport type { ItemContext, TemplateContext } from \"../../shared/types/cms\";\nimport { processItemTemplate, processItemPropsTemplate, hasItemTemplates, type ValueResolver } from \"../../shared/itemTemplateUtils\";\nimport { DEFAULT_I18N_CONFIG, resolveI18nValue } from \"../../shared/i18n\";\nimport { getChildPath, pathToString } from \"../../shared/pathArrayUtils\";\nimport { responsiveStylesToClasses } from \"../../shared/utilityClassMapper\";\nimport { UtilityClassCollector } from \"../styles/UtilityClassCollector\";\nimport { processCMSTemplate, processCMSPropsTemplate, RAW_HTML_PREFIX } from \"./cmsTemplateProcessor\";\nimport type { PrefetchService } from \"../services/PrefetchService\";\nimport { generateElementClassName, type ElementClassContext } from \"../../shared/elementClassName\";\nimport type { InteractiveStyles } from \"../../shared/types/styles\";\nimport { extractInteractiveStyleMappings, resolveExtractedMappings, hasInteractiveStyleMappings } from \"../../shared/interactiveStyleMappings\";\n\n// Extracted builders\nimport {\n type BuildChildrenContext,\n type BuildComponentOptions,\n type BuildResult,\n type BuilderContext,\n buildEmbed,\n buildLinkNode,\n buildLocaleList,\n buildList,\n buildLink,\n} from \"./builders\";\n\ntype ComponentProps = Record<string, unknown>;\n\nexport interface ComponentBuilderConfig {\n componentRegistry: ComponentRegistry;\n elementRegistry: ElementRegistry;\n /** Optional prefetch service for link prefetching (production only) */\n prefetchService?: PrefetchService;\n /** Optional getter for current page name (for interactive styles class generation) */\n getCurrentPageName?: () => string;\n /** Optional getter for current file type (for interactive styles class generation) */\n getCurrentFileType?: () => 'page' | 'component';\n /** Optional getter for current page URL path (for is-current class on link nodes) */\n getCurrentPagePath?: () => string;\n}\n\n// Re-export types for backward compatibility\nexport type { BuildChildrenContext, BuildComponentOptions };\n\n/**\n * ComponentBuilder class for building React elements from component tree nodes\n */\nexport class ComponentBuilder {\n private componentRegistry: ComponentRegistry;\n private elementRegistry: ElementRegistry;\n private prefetchService?: PrefetchService;\n private getCurrentPageName?: () => string;\n private getCurrentFileType?: () => 'page' | 'component';\n private getCurrentPagePath?: () => string;\n // Cache for utility classes computed from style objects (avoids recomputation for same styles)\n private styleClassCache: WeakMap<object, string[]> = new WeakMap();\n\n constructor(config: ComponentBuilderConfig) {\n this.componentRegistry = config.componentRegistry;\n this.elementRegistry = config.elementRegistry;\n this.prefetchService = config.prefetchService;\n this.getCurrentPageName = config.getCurrentPageName;\n this.getCurrentFileType = config.getCurrentFileType;\n this.getCurrentPagePath = config.getCurrentPagePath;\n }\n\n /**\n * Get cached utility classes for a style object\n */\n private getCachedStyleClasses(style: object): string[] {\n let cached = this.styleClassCache.get(style);\n if (!cached) {\n cached = responsiveStylesToClasses(style as any);\n this.styleClassCache.set(style, cached);\n }\n UtilityClassCollector.collect(cached);\n return cached;\n }\n\n /**\n * Helper function to create onClick handlers from JSON-defined onClick values\n */\n private createOnClickHandler(onClickValue: unknown): () => void {\n return () => {\n alert(String(onClickValue));\n };\n }\n\n /**\n * Determines the parent component name for nested component instances.\n */\n private getParentComponentNameForNestedComponent(\n componentContext: string | null,\n parentComponentName: string | null,\n componentName: string | null\n ): string | null {\n return componentContext || parentComponentName || componentName || null;\n }\n\n /**\n * Determines the effective parent component name when building children.\n */\n private getEffectiveParentComponentName(\n componentContext: string | null,\n parentComponentName: string | null\n ): string | null {\n return componentContext || parentComponentName;\n }\n\n /**\n * Evaluate the if condition on a node with full context.\n * Handles boolean, mapping, and string template values.\n * Returns true if node should be rendered, false if it should be skipped.\n */\n private evaluateIfCondition(node: ComponentNode, ctx: BuilderContext): boolean {\n const ifValue = (node as any).if;\n\n // No if property = render (default true)\n if (ifValue === undefined) {\n return true;\n }\n\n // Boolean value\n if (typeof ifValue === 'boolean') {\n return ifValue;\n }\n\n // Mapping value - resolve using component props\n if (isBooleanMapping(ifValue)) {\n const props = ctx.componentResolvedProps || {};\n const propValue = props[ifValue.prop];\n const mappedValue = ifValue.values[String(propValue)];\n // If no mapping found for this prop value, default to true\n return mappedValue !== undefined ? Boolean(mappedValue) : true;\n }\n\n // String template - resolve using CMS or item context\n if (typeof ifValue === 'string') {\n let resolved: string = ifValue;\n\n // Process CMS templates\n if (ctx.cmsContext && resolved.includes('{{cms.')) {\n resolved = processCMSTemplate(resolved, ctx.cmsContext, ctx.cmsLocale || ctx.locale);\n }\n\n // Process item templates\n const effectiveTemplateContext = ctx.templateContext || ctx.itemContext;\n if (effectiveTemplateContext && resolved.includes('{{')) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n resolved = processItemTemplate(resolved, effectiveTemplateContext, i18nResolver);\n }\n\n // Evaluate truthiness - false, 0, empty string are falsy\n return Boolean(resolved) && resolved !== 'false' && resolved !== '0' && resolved !== '';\n }\n\n // Unknown type, default to true\n return true;\n }\n\n /**\n * Find the path to the slot marker in a component structure\n */\n private findSlotMarkerPath(structure: ComponentNode | undefined, currentPath: Path = [0]): Path | null {\n if (!structure) return null;\n if (isSlotMarker(structure)) return null;\n\n const nodeChildren = (structure as any).children;\n if (!nodeChildren || !Array.isArray(nodeChildren)) return null;\n\n for (let i = 0; i < nodeChildren.length; i++) {\n const child = nodeChildren[i];\n if (isSlotMarker(child)) {\n return getChildPath(currentPath, i);\n }\n if (typeof child === 'object' && child !== null && !Array.isArray(child) && 'type' in child) {\n const nestedPath = this.findSlotMarkerPath(child as ComponentNode, getChildPath(currentPath, i));\n if (nestedPath) return nestedPath;\n }\n }\n\n return null;\n }\n\n /**\n * Builds children elements recursively with proper component context tracking.\n */\n buildChildren(\n children: (string | ComponentNode)[] | string | ComponentNode | undefined,\n ctx: BuildChildrenContext\n ): ReactElement | ReactElement[] | string | number | null {\n const {\n elementPath, parentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap,\n itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n } = ctx;\n\n if (Array.isArray(children)) {\n return children\n .map((child, index) =>\n this.buildComponent({\n node: child,\n key: index,\n customProps: {},\n elementPath: getChildPath(elementPath, index),\n parentComponentName,\n viewportWidth,\n componentContext,\n componentRootPath,\n locale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n itemContext,\n cmsItemIndexPath,\n cmsListPaths,\n templateContext,\n componentResolvedProps\n })\n )\n .filter((item): item is ReactElement | string | number => item !== null) as ReactElement[];\n }\n return this.buildComponent({\n node: children,\n key: 0,\n customProps: {},\n elementPath: getChildPath(elementPath, 0),\n parentComponentName,\n viewportWidth,\n componentContext,\n componentRootPath,\n locale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n itemContext,\n cmsItemIndexPath,\n cmsListPaths,\n templateContext,\n componentResolvedProps\n });\n }\n\n /**\n * Component builder from JSON tree with support for custom components\n */\n buildComponent(options: BuildComponentOptions): BuildResult {\n const {\n node,\n key = 0,\n customProps = {},\n elementPath = [0],\n parentComponentName = null,\n viewportWidth = typeof window !== 'undefined' ? window.innerWidth : 1920,\n componentContext = null,\n componentRootPath,\n locale,\n i18nConfig,\n cmsContext = null,\n cmsLocale = null,\n collectionItemsMap = {},\n itemContext = null,\n templateContext = null,\n cmsItemIndexPath = null,\n cmsListPaths = null,\n componentResolvedProps = null\n } = options;\n\n if (!node) return null;\n\n // Build context for specialized builders (needed for if condition evaluation)\n const ctx: BuilderContext = {\n key, elementPath, parentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap,\n itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n };\n\n // Dependencies for specialized builders\n const builderDeps = {\n elementRegistry: this.elementRegistry,\n prefetchService: this.prefetchService,\n getCachedStyleClasses: this.getCachedStyleClasses.bind(this),\n buildChildren: this.buildChildren.bind(this) as (children: unknown, ctx: BuildChildrenContext) => BuildResult,\n getEffectiveParentComponentName: this.getEffectiveParentComponentName.bind(this),\n getCurrentPageName: this.getCurrentPageName,\n getCurrentFileType: this.getCurrentFileType,\n getCurrentPagePath: this.getCurrentPagePath,\n };\n\n // Handle text nodes - process CMS templates and item templates\n if (typeof node === 'string') {\n return this.processTextNode(node, ctx);\n }\n\n if (typeof node === 'number') {\n return node;\n }\n\n if (Array.isArray(node)) {\n return this.buildNodeArray(node, options);\n }\n\n // Check if condition - skip rendering if false\n if (typeof node === 'object' && node !== null && !this.evaluateIfCondition(node as ComponentNode, ctx)) {\n return null;\n }\n\n // Check if this node is slot content (for context attribute handling)\n const isSlotContent = typeof node === 'object' && node !== null && (node as any)._isSlotContent === true;\n\n // Get node type\n const nodeType = typeof node === 'object' && node !== null && 'type' in node ? node.type : undefined;\n const children = typeof node === 'object' && node !== null && 'children' in node ? (node.children || []) : [];\n\n // Handle specialized node types using extracted builders\n if (nodeType === NODE_TYPE.EMBED && isEmbedNode(node)) {\n return buildEmbed(node, ctx, builderDeps);\n }\n\n if (nodeType === NODE_TYPE.LINK && isLinkNode(node)) {\n return buildLinkNode(node, children, ctx, builderDeps);\n }\n\n if (nodeType === NODE_TYPE.LOCALE_LIST && isLocaleListNode(node)) {\n return buildLocaleList(node, ctx, builderDeps);\n }\n\n // Handle List nodes (unified - handles both prop and collection source types)\n // isListNode() also matches legacy 'cms-list' type for migration\n if (isListNode(node)) {\n return buildList(node, children, ctx, builderDeps);\n }\n\n // Extract node properties\n const { tag, componentName, props: nodeProps } = extractNodeProperties(node);\n\n // Filter internal props\n const props = this.filterInternalProps(nodeProps, tag);\n\n // Process templates in props\n const processedProps = this.processPropsTemplates(props, ctx);\n\n // Convert styles to utility classes\n const propsWithClasses = this.applyStyleClasses(processedProps, node, ctx);\n\n // Apply interactive styles\n const propsWithInteractive = this.applyInteractiveStyles(propsWithClasses, node, ctx);\n\n // Extract and merge attributes\n const finalProps = this.mergeAttributes(propsWithInteractive, node, ctx);\n\n // Handle custom component\n if (nodeType === NODE_TYPE.COMPONENT && componentName && this.componentRegistry.has(componentName)) {\n return this.buildCustomComponent(componentName, nodeProps, children, finalProps, options);\n }\n\n // Component not found in registry - warn and show placeholder\n if (nodeType === NODE_TYPE.COMPONENT && componentName) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[Meno] Component \"${componentName}\" not found in registry. ` +\n `Registered: [${this.componentRegistry.getNames().join(', ')}]`\n );\n }\n return h('div', {\n key,\n style: {\n border: '1px dashed #e5a00d',\n padding: '8px 12px',\n margin: '4px 0',\n borderRadius: '4px',\n color: '#b8860b',\n fontSize: '13px',\n fontFamily: 'monospace',\n background: '#fffbe6',\n },\n 'data-missing-component': componentName,\n }, `Component not found: ${componentName}`);\n }\n\n // Handle Link component\n if (tag === 'Link') {\n return buildLink(finalProps, children, ctx, builderDeps);\n }\n\n // Build regular HTML element - pass isSlotContent for context attribute handling\n const htmlElementOptions = isSlotContent ? { ...options, isSlotContent } : options;\n return this.buildHtmlElement(tag, finalProps, children, customProps, htmlElementOptions);\n }\n\n /**\n * Expand Meno component markers in rich-text HTML into rendered React components.\n * Mirrors the SSR expandRichTextComponents() function but produces React elements\n * instead of HTML strings.\n */\n private expandRichTextComponents(html: string, ctx: BuilderContext): ReactElement {\n // Quick bail-out if no component markers\n if (!html.includes('data-meno-component')) {\n return h('span', { dangerouslySetInnerHTML: { __html: html } });\n }\n\n const markerRegex = /<div\\s+data-meno-component=\"([^\"]+)\"\\s+data-meno-props=\"([^\"]*)\"[^>]*><\\/div>/g;\n const segments: ReactElement[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let segmentIndex = 0;\n\n while ((match = markerRegex.exec(html)) !== null) {\n // Add HTML before this match\n if (match.index > lastIndex) {\n const chunk = html.slice(lastIndex, match.index);\n segments.push(h('span', { key: `rt-${segmentIndex++}`, dangerouslySetInnerHTML: { __html: chunk } }));\n }\n\n const componentName = match[1];\n let props: Record<string, unknown> = {};\n try {\n const propsStr = match[2]\n .replace(/&quot;/g, '\"')\n .replace(/&#039;/g, \"'\")\n .replace(/&amp;/g, '&');\n props = JSON.parse(propsStr);\n } catch {\n // ignore parse errors\n }\n\n if (this.componentRegistry.has(componentName)) {\n const componentNode: ComponentNode = {\n type: NODE_TYPE.COMPONENT as 'component',\n component: componentName,\n props,\n };\n\n const rendered = this.buildComponent({\n node: componentNode,\n key: segmentIndex,\n customProps: {},\n elementPath: ctx.elementPath,\n parentComponentName: ctx.parentComponentName,\n viewportWidth: ctx.viewportWidth,\n componentContext: ctx.componentContext,\n componentRootPath: ctx.componentRootPath,\n locale: ctx.locale,\n i18nConfig: ctx.i18nConfig,\n cmsContext: ctx.cmsContext,\n cmsLocale: ctx.cmsLocale,\n collectionItemsMap: ctx.collectionItemsMap || {},\n itemContext: ctx.itemContext,\n cmsItemIndexPath: ctx.cmsItemIndexPath,\n cmsListPaths: ctx.cmsListPaths,\n templateContext: ctx.templateContext,\n componentResolvedProps: ctx.componentResolvedProps,\n });\n\n if (rendered !== null) {\n segments.push(rendered as ReactElement);\n }\n } else {\n // Keep marker as-is for unregistered components\n segments.push(h('span', { key: `rt-${segmentIndex}`, dangerouslySetInnerHTML: { __html: match[0] } }));\n }\n\n segmentIndex++;\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining HTML\n if (lastIndex < html.length) {\n segments.push(h('span', { key: `rt-${segmentIndex}`, dangerouslySetInnerHTML: { __html: html.slice(lastIndex) } }));\n }\n\n return h(Fragment, null, ...segments);\n }\n\n /**\n * Process text node with CMS and item templates\n * Returns a ReactElement with dangerouslySetInnerHTML for raw HTML content (rich-text),\n * or a plain string for regular text content.\n */\n private processTextNode(text: string, ctx: BuilderContext): string | ReactElement {\n let result = text;\n\n // Process CMS templates\n if (ctx.cmsContext && result.includes('{{cms.')) {\n result = processCMSTemplate(result, ctx.cmsContext, ctx.cmsLocale || ctx.locale);\n }\n\n // Process item templates\n const effectiveTemplateContext = ctx.templateContext || ctx.itemContext;\n if (effectiveTemplateContext && hasItemTemplates(result)) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n result = processItemTemplate(result, effectiveTemplateContext, i18nResolver);\n }\n\n // Check for raw HTML marker (from rich-text fields) - render with dangerouslySetInnerHTML\n if (result.startsWith(RAW_HTML_PREFIX)) {\n const rawHtml = result.slice(RAW_HTML_PREFIX.length);\n return this.expandRichTextComponents(rawHtml, ctx);\n }\n\n return result;\n }\n\n /**\n * Build array of nodes\n */\n private buildNodeArray(nodes: ComponentNode[], options: BuildComponentOptions): ReactElement[] {\n const {\n customProps, elementPath = [0], parentComponentName = null, viewportWidth = 1920,\n componentContext = null, locale, i18nConfig, cmsContext = null, cmsLocale = null,\n collectionItemsMap = {}, itemContext = null, cmsItemIndexPath = null,\n cmsListPaths = null, templateContext = null, componentResolvedProps = null\n } = options;\n\n return nodes.map((child, index) => {\n const childPath = getChildPath(elementPath, index);\n return this.buildComponent({\n node: child,\n key: index,\n customProps,\n elementPath: childPath,\n parentComponentName,\n viewportWidth,\n componentContext,\n locale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n itemContext,\n cmsItemIndexPath,\n cmsListPaths,\n templateContext,\n componentResolvedProps\n });\n }).filter((item): item is ReactElement => item !== null && typeof item === 'object');\n }\n\n /**\n * Filter internal props from node props\n */\n private filterInternalProps(nodeProps: Record<string, unknown>, tag: string | undefined): Record<string, unknown> {\n const imageOnlyProps = ['src', 'alt', 'loading', 'width', 'height', 'sizes', 'srcset', 'fetchpriority'];\n const internalProps = ['type', 'tag', 'component', 'props', 'children', 'html', 'style', ...imageOnlyProps];\n const props: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(nodeProps)) {\n if (internalProps.includes(key)) {\n if (tag === 'img' && imageOnlyProps.includes(key)) {\n props[key] = value;\n }\n } else {\n props[key] = value;\n }\n }\n\n return props;\n }\n\n /**\n * Process CMS and item templates in props\n */\n private processPropsTemplates(props: Record<string, unknown>, ctx: BuilderContext): Record<string, unknown> {\n let result = props;\n\n // Process CMS templates\n if (ctx.cmsContext && Object.keys(result).length > 0) {\n result = processCMSPropsTemplate(result, ctx.cmsContext, ctx.cmsLocale || ctx.locale);\n }\n\n // Process item templates\n const effectiveItemContext = ctx.templateContext || ctx.itemContext;\n if (effectiveItemContext && Object.keys(result).length > 0) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n result = processItemPropsTemplate(result, effectiveItemContext, i18nResolver);\n }\n\n return result;\n }\n\n /**\n * Apply style classes to props\n */\n private applyStyleClasses(props: Record<string, unknown>, node: ComponentNode, ctx: BuilderContext): Record<string, unknown> {\n const nodeStyle = node.style || (isComponentNode(node) ? node.props?.style : undefined);\n\n if (nodeStyle && typeof nodeStyle === 'object') {\n // Process item templates in style values (for List context)\n let processedStyle = nodeStyle as Record<string, unknown>;\n const templateCtx = ctx.templateContext || ctx.itemContext;\n if (templateCtx) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n processedStyle = processItemPropsTemplate(processedStyle, templateCtx, i18nResolver);\n }\n const utilityClasses = this.getCachedStyleClasses(processedStyle);\n if (utilityClasses.length > 0) {\n const existingClassName = (props.className || '') as string;\n const classArray = existingClassName ? existingClassName.split(/\\s+/) : [];\n return { ...props, className: [...classArray, ...utilityClasses].filter(Boolean).join(' ') };\n }\n }\n\n return props;\n }\n\n /**\n * Apply interactive styles and generate element class\n */\n private applyInteractiveStyles(props: Record<string, unknown>, node: ComponentNode, ctx: BuilderContext): Record<string, unknown> {\n const nodeInteractiveStyles = (node as any).interactiveStyles as InteractiveStyles | undefined;\n const nodeGenerateElementClass = (node as any).generateElementClass as boolean | undefined;\n const nodeLabel = (node as any).label as string | undefined;\n\n if (!((nodeInteractiveStyles && nodeInteractiveStyles.length > 0) || nodeGenerateElementClass)) {\n return props;\n }\n\n // Check if slot content\n const isSlotContent = (node as any)._isSlotContent === true;\n const useComponentContext = ctx.componentContext && !isSlotContent;\n const fileType = useComponentContext ? 'component' : (this.getCurrentFileType?.() || 'page');\n const fileName = useComponentContext ? ctx.componentContext! : (this.getCurrentPageName ? this.getCurrentPageName() : 'page');\n const pathForClass = useComponentContext && ctx.componentRootPath\n ? ctx.elementPath.slice(ctx.componentRootPath.length)\n : ctx.elementPath;\n\n const elementClassCtx: ElementClassContext = {\n fileType,\n fileName,\n label: nodeLabel,\n path: pathForClass,\n };\n const elementClass = generateElementClassName(elementClassCtx);\n\n // Prepend element class\n const existingClassName = (props.className || '') as string;\n const result = { ...props, className: [elementClass, existingClassName].filter(Boolean).join(' ') };\n\n // Register interactive styles\n if (nodeInteractiveStyles && nodeInteractiveStyles.length > 0) {\n if (ctx.componentResolvedProps && hasInteractiveStyleMappings(nodeInteractiveStyles)) {\n const { resolvedStyles, mappings } = extractInteractiveStyleMappings(nodeInteractiveStyles);\n const cssVariables = resolveExtractedMappings(mappings, ctx.componentResolvedProps);\n InteractiveStylesRegistry.set(elementClass, resolvedStyles);\n if (Object.keys(cssVariables).length > 0) {\n InteractiveStylesRegistry.setVariables(ctx.elementPath, cssVariables);\n }\n } else {\n InteractiveStylesRegistry.set(elementClass, nodeInteractiveStyles);\n }\n\n // Apply preview classes when previewProp is set and truthy\n if (ctx.componentResolvedProps) {\n const previewClasses: string[] = [];\n for (const rule of nodeInteractiveStyles) {\n if (rule.previewProp && ctx.componentResolvedProps[rule.previewProp] === true) {\n // Convert rule's style to utility classes\n const styleClasses = this.getCachedStyleClasses(rule.style);\n previewClasses.push(...styleClasses);\n }\n }\n if (previewClasses.length > 0) {\n result.className = [result.className, ...previewClasses].filter(Boolean).join(' ');\n }\n }\n }\n\n return result;\n }\n\n /**\n * Extract and merge attributes from node\n */\n private mergeAttributes(props: Record<string, unknown>, node: ComponentNode, ctx: BuilderContext): Record<string, unknown> {\n let extractedAttributes = extractAttributesFromNode(node);\n const originalAttributes = { ...extractedAttributes };\n\n // Process item templates in attributes\n const effectiveItemContext = ctx.templateContext || ctx.itemContext;\n if (effectiveItemContext && Object.keys(extractedAttributes).length > 0) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n extractedAttributes = processItemPropsTemplate(extractedAttributes, effectiveItemContext, i18nResolver) as Record<string, string | number | boolean>;\n }\n\n // Auto-skip attributes that were entirely template expressions and resolved to \"\"\n if (Object.keys(extractedAttributes).length > 0) {\n extractedAttributes = skipEmptyTemplateAttributes(originalAttributes, extractedAttributes) as Record<string, string | number | boolean>;\n }\n\n if (Object.keys(extractedAttributes).length === 0) {\n return props;\n }\n\n let result = { ...props };\n\n // Handle class/className specially - check key existence, not truthiness (empty string is valid)\n if ('class' in extractedAttributes || 'className' in extractedAttributes) {\n const attrClass = (extractedAttributes.class ?? extractedAttributes.className ?? '') as string;\n const existingClassName = (result.className || '') as string;\n result.className = [existingClassName, attrClass].filter(Boolean).join(' ');\n delete extractedAttributes.class;\n delete extractedAttributes.className;\n }\n\n // Convert boolean true to empty string for React compatibility\n // React strips boolean true for non-standard attributes, but SSR outputs them as presence-only\n // Using empty string makes React render the attribute (e.g., cmsrt=\"\" matches [cmsrt] selector)\n const normalizedAttributes: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(extractedAttributes)) {\n normalizedAttributes[key] = value === true ? '' : value;\n }\n\n return { ...result, ...normalizedAttributes };\n }\n\n /**\n * Build a custom component\n */\n private buildCustomComponent(\n componentName: string,\n nodeProps: Record<string, unknown>,\n children: unknown,\n finalProps: Record<string, unknown>,\n options: BuildComponentOptions\n ): ReactElement | null {\n const {\n key = 0, elementPath = [0], parentComponentName = null, viewportWidth = 1920,\n componentContext = null, locale, i18nConfig, cmsContext = null, cmsLocale = null,\n collectionItemsMap = {}, itemContext = null, cmsItemIndexPath = null,\n cmsListPaths = null, templateContext = null\n } = options;\n\n const componentDef = this.componentRegistry.get(componentName);\n if (!componentDef) return null;\n\n try {\n const structuredComponentDef = componentDef.component;\n if (!structuredComponentDef) {\n return h(ErrorBoundary, { key, componentName, level: 'component' }, null);\n }\n\n // Process templates on raw nodeProps BEFORE coercion/defaults\n // This matches the SSR path where templates are resolved before resolvePropsFromDefinition\n let propsToResolve = nodeProps;\n\n // CMS templates first (matching SSR: ssrRenderer.ts processes CMS before coercion)\n if (cmsContext) {\n propsToResolve = processCMSPropsTemplate(propsToResolve, cmsContext, cmsLocale || locale);\n }\n\n // Item templates second\n const effectiveItemContext = templateContext || itemContext;\n if (effectiveItemContext) {\n const effectiveLocale = cmsLocale || locale;\n const config = i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n propsToResolve = processItemPropsTemplate(propsToResolve, effectiveItemContext, i18nResolver);\n }\n\n // Resolve props (validate, coerce types, apply defaults) AFTER templates are resolved\n let resolvedProps = resolvePropsFromDefinition(\n structuredComponentDef,\n propsToResolve,\n children as ComponentNode | string | (ComponentNode | string)[] | null | undefined,\n locale,\n i18nConfig\n );\n\n // Process structure\n const typedChildren = children as ComponentNode | ComponentNode[] | string | number | null | undefined;\n const markedChildren = typedChildren ? markAsSlotContent(typedChildren) : undefined;\n const processedStructure = processStructure(\n structuredComponentDef.structure,\n { props: resolvedProps, componentDef: structuredComponentDef },\n viewportWidth,\n markedChildren\n );\n\n if (!processedStructure || typeof processedStructure === 'string' || typeof processedStructure === 'number' || Array.isArray(processedStructure)) {\n return null;\n }\n\n // Merge styles\n if (finalProps.style && typeof finalProps.style === 'object') {\n mergeNodeStyles(processedStructure, finalProps.style as StyleValue, viewportWidth);\n }\n\n // Add onClick\n if (finalProps.onClick && isComponentNode(processedStructure)) {\n if (!processedStructure.props) processedStructure.props = {};\n processedStructure.props.onClick = this.createOnClickHandler(finalProps.onClick);\n }\n\n const nestedParentComponentName = this.getParentComponentNameForNestedComponent(\n componentContext,\n parentComponentName,\n componentName\n );\n\n const componentElement = this.buildComponent({\n node: processedStructure,\n key,\n customProps: { '__componentProps': resolvedProps },\n elementPath,\n parentComponentName: nestedParentComponentName,\n viewportWidth,\n componentContext: componentName,\n componentRootPath: elementPath,\n locale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n itemContext,\n cmsItemIndexPath,\n cmsListPaths,\n templateContext,\n componentResolvedProps: resolvedProps\n });\n\n return h(ErrorBoundary, { key, componentName, level: 'component' }, componentElement);\n\n } catch (error) {\n return h(ErrorBoundary, { key, componentName, level: 'component' }, null);\n }\n }\n\n /**\n * Build a regular HTML element\n */\n private buildHtmlElement(\n tag: string | undefined,\n props: Record<string, unknown>,\n children: unknown,\n customProps: ComponentProps,\n options: BuildComponentOptions\n ): ReactElement | null {\n const {\n key = 0, elementPath = [0], parentComponentName = null, viewportWidth = 1920,\n componentContext = null, componentRootPath, locale, i18nConfig,\n cmsContext = null, cmsLocale = null, collectionItemsMap = {},\n itemContext = null, cmsItemIndexPath = null, cmsListPaths = null,\n templateContext = null, componentResolvedProps = null,\n isSlotContent = false\n } = options;\n\n const finalTag = tag || 'div';\n const effectiveParentComponentName = this.getEffectiveParentComponentName(componentContext, parentComponentName);\n\n // Remove __componentProps from customProps before spreading\n const { __componentProps, ...customPropsForDOM } = customProps || {};\n const isComponentRoot = !!(customProps && '__componentProps' in customProps);\n\n const processedProps: Record<string, unknown> = {\n ...props,\n ...customPropsForDOM,\n key\n };\n\n // Add is-current class for <a> tags when href matches current page path\n if (finalTag === 'a' && this.getCurrentPagePath) {\n const href = processedProps.href as string | undefined;\n if (href && typeof href === 'string' && isCurrentLink(href, this.getCurrentPagePath())) {\n const existing = (processedProps.className || '') as string;\n processedProps.className = existing ? `${existing} is-current` : 'is-current';\n }\n }\n\n // Register element via ref callback\n processedProps.ref = (el: HTMLElement | null) => {\n if (el) {\n el.setAttribute('data-element-path', pathToString(elementPath));\n if (cmsItemIndexPath && cmsItemIndexPath.length > 0) {\n el.setAttribute('data-cms-item-index', cmsItemIndexPath.join('.'));\n // Set full CMS context as JSON for nested CMS list support\n if (cmsListPaths && cmsListPaths.length === cmsItemIndexPath.length) {\n el.setAttribute('data-cms-context', JSON.stringify({\n itemIndexPath: cmsItemIndexPath,\n listPaths: cmsListPaths\n }));\n }\n }\n if (isComponentRoot) el.setAttribute('data-component-root', 'true');\n if (parentComponentName) el.setAttribute('data-parent-component', parentComponentName);\n // Only set componentContext for component structure elements, not slot content\n // Slot content belongs to the parent scope, not the component's internal structure\n if (componentContext && !isSlotContent) el.setAttribute('data-component-context', componentContext);\n\n // Add defineVars data attributes\n if (isComponentRoot && componentContext) {\n const componentDef = this.componentRegistry.get(componentContext);\n const defineVars = componentDef?.component?.defineVars;\n if (defineVars && customProps.__componentProps) {\n const varsToExpose = defineVars === true\n ? Object.keys(componentDef.component.interface || {})\n : defineVars;\n\n const propsForJS: Record<string, unknown> = {};\n const resolvedProps = customProps.__componentProps as Record<string, unknown>;\n for (const varName of varsToExpose) {\n if (resolvedProps[varName] !== undefined) {\n propsForJS[varName] = resolvedProps[varName];\n }\n }\n\n el.setAttribute('data-component', componentContext);\n el.setAttribute('data-props', JSON.stringify(propsForJS));\n }\n }\n\n // Apply CSS variables\n const cssVariables = InteractiveStylesRegistry.getVariables(elementPath);\n if (cssVariables && Object.keys(cssVariables).length > 0) {\n for (const [varName, value] of Object.entries(cssVariables)) {\n el.style.setProperty(varName, value);\n }\n }\n }\n\n const componentProps = isComponentRoot && customProps.__componentProps\n ? customProps.__componentProps as Record<string, unknown>\n : undefined;\n const componentNameForRegistry = isComponentRoot ? componentContext : parentComponentName;\n\n const metadata = {\n parentComponentName: parentComponentName ?? null,\n componentContext: componentContext ?? null\n };\n\n this.elementRegistry.register(elementPath, el, componentNameForRegistry, isComponentRoot, componentProps, metadata);\n };\n\n // Add onClick handler\n if (props.onClick) {\n processedProps.onClick = this.createOnClickHandler(props.onClick);\n }\n\n // HTML void elements\n const VOID_ELEMENTS = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];\n if (VOID_ELEMENTS.includes(finalTag.toLowerCase())) {\n const { children: _ignored, ...voidElementProps } = processedProps;\n return h(finalTag, voidElementProps);\n }\n\n // Build children\n const childElements = this.buildChildren(children as any, {\n elementPath, parentComponentName: effectiveParentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap, itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n });\n\n return h(finalTag, processedProps, childElements);\n }\n}\n", "/**\n * Error Boundary Component\n * Catches and handles React rendering errors gracefully\n */\n\nimport { Component, createElement as h, ReactNode } from 'react';\n\ninterface ErrorBoundaryProps {\n children?: ReactNode;\n fallback?: (error: Error, errorInfo: any) => ReactNode;\n onError?: (error: Error, errorInfo: any) => void;\n componentName?: string;\n level?: 'component' | 'page';\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: any;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n errorInfo: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return {\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: any) {\n const { onError, componentName, level = 'component' } = this.props;\n\n // Log error to console\n console.error(\n `\u274C [${level.toUpperCase()} ERROR]${componentName ? ` in ${componentName}` : ''}:`,\n error,\n errorInfo\n );\n\n // Call custom error handler if provided\n if (onError) {\n onError(error, errorInfo);\n }\n\n // Update state with error info\n this.setState({\n errorInfo,\n });\n }\n\n render() {\n const { hasError, error, errorInfo } = this.state;\n const { children, fallback, componentName, level = 'component' } = this.props;\n\n if (hasError && error) {\n // Use custom fallback if provided\n if (fallback) {\n return fallback(error, errorInfo);\n }\n\n // Default fallback UI\n if (level === 'page') {\n return h('div', {\n style: {\n padding: '40px',\n maxWidth: '800px',\n margin: '0 auto',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n }\n },\n h('div', {\n style: {\n background: '#fee',\n border: '2px solid #fcc',\n borderRadius: '8px',\n padding: '24px',\n }\n },\n h('h2', {\n style: {\n margin: '0 0 16px 0',\n color: '#c00',\n fontSize: '24px',\n fontWeight: '600',\n }\n }, '\u26A0\uFE0F Page Rendering Error'),\n h('p', {\n style: {\n margin: '0 0 16px 0',\n color: '#666',\n fontSize: '16px',\n lineHeight: '1.5',\n }\n }, 'An error occurred while rendering this page. Please check your JSON configuration.'),\n h('div', {\n style: {\n background: '#fff',\n border: '1px solid #ddd',\n borderRadius: '4px',\n padding: '16px',\n marginBottom: '16px',\n fontFamily: 'monospace',\n fontSize: '14px',\n color: '#c00',\n overflowX: 'auto',\n }\n }, error.message),\n process.env.NODE_ENV === 'development' && errorInfo?.componentStack && h('details', {\n style: {\n marginTop: '16px',\n fontSize: '14px',\n }\n },\n h('summary', {\n style: {\n cursor: 'pointer',\n color: '#666',\n fontWeight: '600',\n marginBottom: '8px',\n }\n }, 'Stack Trace'),\n h('pre', {\n style: {\n background: '#f5f5f5',\n border: '1px solid #ddd',\n borderRadius: '4px',\n padding: '12px',\n fontSize: '12px',\n overflowX: 'auto',\n color: '#333',\n }\n }, errorInfo.componentStack)\n ),\n h('button', {\n onClick: () => window.location.reload(),\n style: {\n marginTop: '16px',\n padding: '10px 20px',\n background: '#007acc',\n color: '#fff',\n border: 'none',\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: '600',\n cursor: 'pointer',\n }\n }, '\uD83D\uDD04 Reload Page')\n )\n );\n }\n\n // Component-level error\n return h('div', {\n style: {\n border: '2px dashed #fcc',\n borderRadius: '4px',\n padding: '12px',\n margin: '8px 0',\n background: '#fef5f5',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n }\n },\n h('div', {\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '8px',\n }\n },\n h('span', {\n style: {\n fontSize: '18px',\n }\n }, '\u26A0\uFE0F'),\n h('strong', {\n style: {\n color: '#c00',\n fontSize: '14px',\n }\n }, `Component Error${componentName ? `: ${componentName}` : ''}`)\n ),\n h('div', {\n style: {\n fontSize: '12px',\n color: '#666',\n fontFamily: 'monospace',\n background: '#fff',\n padding: '8px',\n borderRadius: '4px',\n border: '1px solid #fcc',\n }\n }, error.message)\n );\n }\n\n return children;\n }\n}\n\n/**\n * Higher-order function to wrap component building with error boundary\n */\nexport function withErrorBoundary<T>(\n renderFn: () => T,\n options: {\n componentName?: string;\n level?: 'component' | 'page';\n onError?: (error: Error, errorInfo: any) => void;\n } = {}\n): T | ReturnType<typeof h> {\n try {\n return renderFn();\n } catch (error) {\n return h(ErrorBoundary, {\n ...options,\n children: null,\n });\n }\n}\n\n", "/**\n * Interactive Styles Registry\n *\n * Global registry for interactive styles collected during component rendering.\n * ComponentBuilder registers styles here when rendering elements with interactiveStyles.\n * StyleInjector reads from here to generate CSS.\n *\n * This eliminates the need for complex JSON tree-walking to collect interactive styles,\n * as the registry is populated during render when component resolution already happens.\n */\n\nimport type { InteractiveStyles } from '../shared/types/styles';\nimport type { Path } from '../shared/paths';\nimport { pathToString } from '../shared/paths';\n\nclass InteractiveStylesRegistryImpl {\n private styles: Map<string, InteractiveStyles> = new Map();\n /** CSS variables per element path (for interactive style mappings) */\n private variables: Map<string, Record<string, string>> = new Map();\n\n /**\n * Register interactive styles for an element class.\n * Called by ComponentBuilder when rendering elements with interactiveStyles.\n * @param elementClass - The generated element class name (e.g., \"page_index_0_1\")\n * @param styles - The interactive styles array for this element\n */\n set(elementClass: string, styles: InteractiveStyles): void {\n this.styles.set(elementClass, styles);\n }\n\n /**\n * Get all registered interactive styles.\n * Called by StyleInjector to generate CSS.\n * @returns A copy of the styles map (to prevent external mutation)\n */\n getAll(): Map<string, InteractiveStyles> {\n return new Map(this.styles);\n }\n\n /**\n * Clear all registered styles and variables.\n * Called before re-rendering to avoid stale styles from previous render.\n */\n clear(): void {\n this.styles.clear();\n this.variables.clear();\n }\n\n /**\n * Check how many styles are registered.\n */\n get size(): number {\n return this.styles.size;\n }\n\n /**\n * Store CSS variables for an element path.\n * Called by ComponentBuilder when rendering elements with interactive style mappings.\n * @param elementPath - The element's path in the tree\n * @param variables - CSS variable name to value map (e.g., { '--is-0': '#0070f3' })\n */\n setVariables(elementPath: Path, variables: Record<string, string>): void {\n const pathKey = pathToString(elementPath);\n this.variables.set(pathKey, variables);\n }\n\n /**\n * Get CSS variables for an element path.\n * @param elementPath - The element's path in the tree\n * @returns CSS variable map or undefined if not found\n */\n getVariables(elementPath: Path): Record<string, string> | undefined {\n const pathKey = pathToString(elementPath);\n return this.variables.get(pathKey);\n }\n\n /**\n * Get CSS variables by path string key.\n * Used when the path is already stringified.\n * @param pathKey - The stringified path key\n * @returns CSS variable map or undefined if not found\n */\n getVariablesByKey(pathKey: string): Record<string, string> | undefined {\n return this.variables.get(pathKey);\n }\n\n /**\n * Check how many variable sets are registered.\n */\n get variablesSize(): number {\n return this.variables.size;\n }\n}\n\n// Singleton instance\nexport const InteractiveStylesRegistry = new InteractiveStylesRegistryImpl();\n", "/**\n * Responsive Style Resolver for Editor\n * Merges responsive styles into inline styles based on current viewport width\n */\n\nimport type { ResponsiveStyleObject, StyleObject } from '../shared/types';\nimport type { BreakpointConfig, BreakpointConfigInput, BreakpointEntry } from '../shared/breakpoints';\nimport { DEFAULT_BREAKPOINTS, normalizeBreakpointConfig } from '../shared/breakpoints';\nimport type { ResponsiveScales } from '../shared/responsiveScaling';\nimport { DEFAULT_RESPONSIVE_SCALES } from '../shared/responsiveScaling';\nimport { isResponsiveStyle } from '../shared/styleUtils';\nimport { mergeResponsiveStyles } from '../shared/responsiveStyleUtils';\n\n/**\n * Get breakpoint configuration (with caching)\n */\nlet breakpointConfig: BreakpointConfig | null = null;\nlet breakpointPromise: Promise<BreakpointConfig> | null = null;\n\n/**\n * Get responsive scales configuration (with caching)\n */\nlet responsiveScalesConfig: ResponsiveScales | null = null;\nlet responsiveScalesPromise: Promise<ResponsiveScales> | null = null;\n\n/**\n * Shared config fetching promise\n */\nlet configPromise: Promise<void> | null = null;\n\n/**\n * Clear the breakpoint config cache (useful when config file changes)\n */\nexport function clearBreakpointConfigCache(): void {\n breakpointConfig = null;\n breakpointPromise = null;\n}\n\n/**\n * Clear the responsive scales config cache (useful when config file changes)\n */\nexport function clearResponsiveScalesConfigCache(): void {\n responsiveScalesConfig = null;\n responsiveScalesPromise = null;\n}\n\n/**\n * Clear all config caches\n */\nexport function clearAllConfigCache(): void {\n clearBreakpointConfigCache();\n clearResponsiveScalesConfigCache();\n configPromise = null;\n}\n\n/**\n * Get cached breakpoint config synchronously (returns null if not loaded yet)\n */\nexport function getCachedBreakpointConfig(): BreakpointConfig | null {\n return breakpointConfig;\n}\n\n/**\n * Get cached responsive scales config synchronously (returns null if not loaded yet)\n */\nexport function getCachedResponsiveScalesConfig(): ResponsiveScales | null {\n return responsiveScalesConfig;\n}\n\n/**\n * Shared config fetching - loads both breakpoints and responsive scales from single API call\n */\nasync function loadConfig(): Promise<void> {\n if (breakpointConfig && responsiveScalesConfig) {\n return;\n }\n\n if (!configPromise) {\n configPromise = (async () => {\n try {\n const response = await fetch('/api/config');\n const config = await response.json();\n\n // Parse breakpoints - supports both legacy and new format\n if (config.breakpoints && typeof config.breakpoints === 'object') {\n const validInput: BreakpointConfigInput = {};\n for (const [key, value] of Object.entries(config.breakpoints)) {\n if (typeof value === 'number' && value > 0) {\n // Legacy format: number\n validInput[key] = value;\n } else if (typeof value === 'object' && value !== null) {\n // New format: object with breakpoint and optional previewPoint\n const entry = value as BreakpointEntry;\n if (typeof entry.breakpoint === 'number' && entry.breakpoint > 0) {\n validInput[key] = {\n breakpoint: entry.breakpoint,\n previewPoint: typeof entry.previewPoint === 'number' && entry.previewPoint > 0\n ? entry.previewPoint\n : entry.breakpoint,\n };\n }\n }\n }\n breakpointConfig = Object.keys(validInput).length > 0\n ? normalizeBreakpointConfig(validInput)\n : { ...DEFAULT_BREAKPOINTS };\n } else {\n breakpointConfig = { ...DEFAULT_BREAKPOINTS };\n }\n\n // Parse responsive scales\n if (config.responsiveScales && typeof config.responsiveScales === 'object') {\n responsiveScalesConfig = {\n ...DEFAULT_RESPONSIVE_SCALES,\n ...config.responsiveScales,\n };\n } else {\n responsiveScalesConfig = { ...DEFAULT_RESPONSIVE_SCALES };\n }\n } catch {\n breakpointConfig = { ...DEFAULT_BREAKPOINTS };\n responsiveScalesConfig = { ...DEFAULT_RESPONSIVE_SCALES };\n }\n })();\n }\n\n await configPromise;\n}\n\nasync function getBreakpointConfig(): Promise<BreakpointConfig> {\n await loadConfig();\n return breakpointConfig!;\n}\n\n/**\n * Get responsive scales configuration asynchronously\n */\nexport async function getResponsiveScalesConfig(): Promise<ResponsiveScales> {\n await loadConfig();\n return responsiveScalesConfig!;\n}\n\n/**\n * Merge responsive styles into a single style object based on current viewport\n * Styles cascade: base \u2192 tablet \u2192 mobile\n */\nexport async function resolveResponsiveStyle(\n style: ResponsiveStyleObject | StyleObject\n): Promise<StyleObject> {\n if (!isResponsiveStyle(style)) {\n return style as StyleObject;\n }\n \n const responsiveStyle = style as ResponsiveStyleObject;\n const viewportWidth = typeof window !== 'undefined' ? window.innerWidth : 1920;\n const breakpoints = await getBreakpointConfig();\n \n return mergeResponsiveStyles(responsiveStyle, 'viewport', viewportWidth, breakpoints);\n}\n\n/**\n * Synchronous version that uses cached breakpoints or defaults\n * For immediate rendering, then async update when breakpoints load\n */\nexport function resolveResponsiveStyleSync(\n style: ResponsiveStyleObject | StyleObject,\n viewportWidth: number = typeof window !== 'undefined' ? window.innerWidth : 1920\n): StyleObject {\n if (!isResponsiveStyle(style)) {\n return style as StyleObject;\n }\n \n const responsiveStyle = style as ResponsiveStyleObject;\n \n // Use cached breakpoints or defaults\n const breakpoints = breakpointConfig || { ...DEFAULT_BREAKPOINTS };\n \n return mergeResponsiveStyles(responsiveStyle, 'viewport', viewportWidth, breakpoints);\n}\n\n/**\n * Initialize breakpoint and responsive scales config (call this early)\n * If forceRefresh is true, clears cache and fetches fresh config\n */\nexport async function initializeBreakpoints(forceRefresh: boolean = false): Promise<void> {\n if (forceRefresh) {\n clearAllConfigCache();\n }\n await loadConfig();\n}\n\n/**\n * Alias for initializeBreakpoints - initializes all config including responsive scales\n */\nexport const initializeConfig = initializeBreakpoints;\n\n", "/**\n * Utility Class Collector \u2014 Eager CSS Injector\n *\n * Global registry for utility CSS classes collected during component rendering.\n * ComponentBuilder and builder modules register classes here during render.\n *\n * CSS is injected eagerly during React's render phase (inside collect()),\n * eliminating the micro-gap between DOM commit and CSS injection (FOUC).\n * This is the same pattern CSS-in-JS libraries (Emotion, styled-components) use.\n *\n * All injected CSS is kept sorted by CSS property precedence so that shorthand\n * properties (border) always appear before longhands (border-color), regardless\n * of which render batch introduced each class.\n */\n\nimport { generateSingleClassCSS, sortClassesByPropertyOrder, generateRuleForClass } from '../../shared/cssGeneration';\nimport { getCachedBreakpointConfig, getCachedResponsiveScalesConfig } from '../responsiveStyleResolver';\nimport { DEFAULT_BREAKPOINTS, getBreakpointValues } from '../../shared/breakpoints';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport { DEFAULT_RESPONSIVE_SCALES } from '../../shared/responsiveScaling';\n\n/**\n * Build a map from responsive prefix (e.g. 't', 'mob') to breakpoint value.\n * Same logic as generateSingleClassCSS / generateUtilityCSS.\n */\nfunction buildResponsivePrefixMap(breakpoints: BreakpointConfig): Record<string, number> {\n const breakpointValues = getBreakpointValues(breakpoints);\n const map: Record<string, number> = {};\n for (const [breakpointName, breakpointValue] of Object.entries(breakpointValues)) {\n let prefix = breakpointName.charAt(0).toLowerCase();\n if (breakpointName.toLowerCase() === 'mobile') {\n prefix = 'mob';\n }\n map[prefix] = breakpointValue;\n }\n return map;\n}\n\n/**\n * Get the responsive breakpoint value for a class, or 0 if it's not responsive.\n * A class is responsive if it starts with a known breakpoint prefix and the\n * remainder generates a valid CSS rule (same heuristic as generateSingleClassCSS).\n */\nfunction getClassBreakpointValue(\n className: string,\n prefixMap: Record<string, number>\n): number {\n for (const prefix of Object.keys(prefixMap)) {\n if (className.startsWith(`${prefix}-`) && className.length > prefix.length + 1) {\n const potentialClass = className.substring(prefix.length + 1);\n const rule = generateRuleForClass(potentialClass);\n if (rule && !potentialClass.match(/^(auto|0|[\\d.]+px|[\\d.]+p)$/)) {\n return prefixMap[prefix];\n }\n }\n }\n return 0;\n}\n\n/**\n * Sort utility classes with breakpoint-aware ordering:\n * 1. Non-responsive classes first, sorted by CSS property order (shorthand before longhand)\n * 2. Responsive classes after, sorted by breakpoint value descending (largest first),\n * then by property order within each breakpoint group.\n *\n * This matches the SSR output from generateUtilityCSS which sorts responsive\n * @media blocks by breakpoint value descending so that smaller breakpoints\n * (mobile 540px) can correctly override larger ones (tablet 1024px) in the cascade.\n */\nfunction sortClassesWithBreakpointOrder(\n classes: Iterable<string>,\n breakpoints: BreakpointConfig\n): string[] {\n const prefixMap = buildResponsivePrefixMap(breakpoints);\n const arr = Array.from(classes);\n\n // Pre-compute sort keys for each class\n const keys = arr.map(cls => {\n const bpValue = getClassBreakpointValue(cls, prefixMap);\n return { cls, isResponsive: bpValue > 0 ? 1 : 0, bpValue };\n });\n\n // Get property-order sorted array to derive per-class indices\n const propertySorted = sortClassesByPropertyOrder(arr);\n const propertyOrderIndex = new Map<string, number>();\n for (let i = 0; i < propertySorted.length; i++) {\n propertyOrderIndex.set(propertySorted[i], i);\n }\n\n keys.sort((a, b) => {\n // Non-responsive (0) before responsive (1)\n if (a.isResponsive !== b.isResponsive) return a.isResponsive - b.isResponsive;\n // Within responsive: larger breakpoint first (descending)\n if (a.bpValue !== b.bpValue) return b.bpValue - a.bpValue;\n // Within same group: property order\n return (propertyOrderIndex.get(a.cls) ?? Infinity) - (propertyOrderIndex.get(b.cls) ?? Infinity);\n });\n\n return keys.map(k => k.cls);\n}\n\nclass UtilityClassCollectorImpl {\n private classes: Set<string> = new Set();\n\n /** Map of injected class names \u2192 their generated CSS text */\n private injectedRules: Map<string, string> = new Map();\n\n /** Cached reference to <style id=\"utility-css\"> */\n private styleEl: HTMLStyleElement | null = null;\n\n /**\n * Ensure we have a valid reference to the utility-css style element.\n * Returns null during SSR (no document).\n */\n private ensureStyleElement(): HTMLStyleElement | null {\n if (typeof document === 'undefined') return null;\n\n // Check if cached ref is still in the DOM\n if (this.styleEl && this.styleEl.isConnected) {\n return this.styleEl;\n }\n\n // Try to find existing element\n this.styleEl = document.getElementById('utility-css') as HTMLStyleElement | null;\n if (this.styleEl) return this.styleEl;\n\n // Create new one\n if (document.head) {\n this.styleEl = document.createElement('style');\n this.styleEl.id = 'utility-css';\n document.head.appendChild(this.styleEl);\n }\n\n return this.styleEl;\n }\n\n /**\n * Collect utility class names from a render pass and eagerly inject CSS.\n * Called by ComponentBuilder and builder modules after computing style classes.\n * CSS is injected synchronously during render \u2014 before React commits the DOM.\n *\n * When new classes are added, the full style content is rebuilt in sorted order\n * so that shorthand properties (border) always precede longhands (border-color),\n * even when they arrive in different render batches.\n */\n collect(classNames: string[]): void {\n const breakpointConfig = getCachedBreakpointConfig() || DEFAULT_BREAKPOINTS;\n const responsiveScalesConfig = getCachedResponsiveScalesConfig() || DEFAULT_RESPONSIVE_SCALES;\n\n let hasNew = false;\n for (const name of classNames) {\n this.classes.add(name);\n\n if (this.injectedRules.has(name)) continue;\n\n const css = generateSingleClassCSS(name, breakpointConfig, responsiveScalesConfig);\n if (css) {\n this.injectedRules.set(name, css);\n hasNew = true;\n }\n }\n\n if (hasNew) {\n // Rebuild style element with all rules sorted by property order.\n // This ensures shorthands always precede longhands regardless of\n // which collect() batch introduced each class.\n const sorted = sortClassesWithBreakpointOrder(this.injectedRules.keys(), breakpointConfig);\n const styleEl = this.ensureStyleElement();\n if (styleEl) {\n styleEl.textContent = sorted\n .map(name => this.injectedRules.get(name)!)\n .join('\\n');\n }\n }\n }\n\n /**\n * Clear collected classes for route change.\n * Preserves injectedRules and style tag \u2014 old page CSS stays\n * (needed during transition via previousComponentTree).\n */\n clear(): void {\n this.classes.clear();\n }\n\n /**\n * Full teardown \u2014 clears everything and removes style tag from DOM.\n * Called by StyleInjector.clear() for complete reset.\n */\n destroy(): void {\n this.classes.clear();\n this.injectedRules.clear();\n if (this.styleEl && this.styleEl.isConnected) {\n this.styleEl.remove();\n }\n this.styleEl = null;\n }\n\n /**\n * Check how many classes are collected.\n */\n get size(): number {\n return this.classes.size;\n }\n}\n\n// Singleton instance\nexport const UtilityClassCollector = new UtilityClassCollectorImpl();\n", "/**\n * Client-side i18n Config Service\n * Provides cached, deduplicated access to i18n configuration\n */\n\nimport type { I18nConfig } from '../shared/types';\nimport { DEFAULT_I18N_CONFIG, migrateI18nConfig } from '../shared/i18n';\n\nlet cachedConfig: I18nConfig | null = null;\nlet configPromise: Promise<I18nConfig> | null = null;\n\n/**\n * Fetch i18n config from API with request deduplication and caching\n * Multiple simultaneous calls will share the same request\n */\nexport async function fetchI18nConfig(): Promise<I18nConfig> {\n // Return cached config if available\n if (cachedConfig) {\n return cachedConfig;\n }\n\n // Return existing promise if request is in flight\n if (configPromise) {\n return configPromise;\n }\n\n // Create new request\n configPromise = fetch('/api/config')\n .then(response => {\n if (!response.ok) {\n throw new Error('Failed to fetch config');\n }\n return response.json();\n })\n .then(config => {\n cachedConfig = migrateI18nConfig(config.i18n);\n return cachedConfig;\n })\n .catch(() => {\n cachedConfig = DEFAULT_I18N_CONFIG;\n return cachedConfig;\n })\n .finally(() => {\n configPromise = null;\n });\n\n return configPromise;\n}\n\n/**\n * Get cached i18n config synchronously\n * Returns default config if not yet loaded\n */\nexport function getI18nConfig(): I18nConfig {\n return cachedConfig || DEFAULT_I18N_CONFIG;\n}\n\n/**\n * Check if i18n config has been loaded\n */\nexport function isI18nConfigLoaded(): boolean {\n return cachedConfig !== null;\n}\n\n/**\n * Invalidate cached config (useful for HMR or config changes)\n */\nexport function invalidateI18nConfig(): void {\n cachedConfig = null;\n configPromise = null;\n}\n\n/**\n * Set config directly (useful for SSR hydration)\n */\nexport function setI18nConfig(config: I18nConfig): void {\n cachedConfig = config;\n}\n", "/**\n * CMS Template Processor (Client-side)\n *\n * Processes CMS template strings like {{cms.title}} in the preview iframe.\n * This enables live preview of CMS content when editing items.\n */\n\nimport type { I18nValue, I18nConfig } from '../../shared/types';\nimport { getI18nConfig } from '../i18nConfigService';\nimport { isRichTextMarker, richTextMarkerToHtml } from '../../shared/propResolver';\nimport { tiptapToHtml } from '../../shared/richtext/tiptapToHtml';\nimport { isTiptapDocument } from '../../shared/richtext/types';\nimport { RAW_HTML_PREFIX } from '../../shared/constants';\n\n// Re-export for backward compatibility\nexport { RAW_HTML_PREFIX };\n\n/**\n * Check if a value is an I18nValue object\n */\nfunction isI18nValue(value: unknown): value is I18nValue {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n return '_i18n' in value && (value as Record<string, unknown>)._i18n === true;\n}\n\n/**\n * Resolve an I18nValue to a string for the given locale\n * Falls back to default locale, then first available translation\n */\nfunction resolveI18nValue(value: I18nValue, locale: string, config: I18nConfig): unknown {\n // Try exact locale match\n if (value[locale] !== undefined) {\n return value[locale];\n }\n\n // Try default locale\n if (value[config.defaultLocale] !== undefined) {\n return value[config.defaultLocale];\n }\n\n // Get first available translation (skip _i18n marker)\n for (const key of Object.keys(value)) {\n if (key !== '_i18n' && value[key] !== undefined) {\n return value[key];\n }\n }\n\n return '';\n}\n\n/**\n * Process CMS template strings like {{cms.title}} or {{cms.author}}\n * Replaces template expressions with values from CMS item\n * Supports i18n values by resolving them to the current locale\n *\n * @param template - String containing {{cms.field}} patterns\n * @param cmsItem - CMS item data to interpolate\n * @param locale - Optional locale for i18n resolution (defaults to config's defaultLocale)\n * @returns Processed string with values filled in\n */\nexport function processCMSTemplate(\n template: string,\n cmsItem: Record<string, unknown>,\n locale?: string\n): string {\n const config = getI18nConfig();\n const effectiveLocale = locale || config.defaultLocale;\n\n return template.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (match, fieldPath) => {\n // Support nested paths like cms.author.name\n const parts = fieldPath.trim().split('.');\n let value: unknown = cmsItem;\n\n for (const part of parts) {\n if (value && typeof value === 'object' && part in value) {\n value = (value as Record<string, unknown>)[part];\n } else {\n // Field not found, return empty string\n return '';\n }\n }\n\n // Handle i18n values - resolve to locale-specific value, then continue\n // through rich-text detection (don't early-return, as resolved value may be Tiptap JSON)\n if (isI18nValue(value)) {\n value = resolveI18nValue(value, effectiveLocale, config);\n }\n\n // Return string representation\n if (value === null || value === undefined) {\n return '';\n }\n // Handle rich-text markers - extract HTML content for interpolation\n // Mark with RAW_HTML_PREFIX so renderer knows not to escape\n if (typeof value === 'object' && '__richtext__' in value && typeof (value as unknown as { html: string }).html === 'string') {\n return RAW_HTML_PREFIX + (value as unknown as { html: string }).html;\n }\n // Handle raw TipTap documents (fallback if not preprocessed)\n // Mark with RAW_HTML_PREFIX so renderer knows not to escape\n if (isTiptapDocument(value)) {\n return RAW_HTML_PREFIX + tiptapToHtml(value);\n }\n return String(value);\n });\n}\n\n/**\n * Process CMS templates in props object\n * Recursively processes all string values in props\n *\n * @param props - Props object with potential {{cms.field}} values\n * @param cmsItem - CMS item data to interpolate\n * @param locale - Optional locale for i18n resolution\n * @returns New props object with values filled in\n */\nexport function processCMSPropsTemplate(\n props: Record<string, unknown>,\n cmsItem: Record<string, unknown>,\n locale?: string\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === 'string' && value.includes('{{cms.')) {\n result[key] = processCMSTemplate(value, cmsItem, locale);\n } else if (value && typeof value === 'object' && !Array.isArray(value)) {\n // Recursively process nested objects (but not arrays or null)\n result[key] = processCMSPropsTemplate(value as Record<string, unknown>, cmsItem, locale);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Check if a string contains CMS template patterns\n *\n * @param text - String to check\n * @returns True if string contains {{cms.field}} patterns\n */\nexport function hasCMSTemplate(text: string): boolean {\n return text.includes('{{cms.');\n}\n", "/**\n * Embed Node Builder\n * Handles rendering of embed nodes (HTML content like SVGs, rich text, etc.)\n */\n\nimport { createElement as h } from \"react\";\nimport type { ReactElement } from \"react\";\nimport type { EmbedNode, StyleObject, ResponsiveStyleObject, InteractiveStyles } from \"../../../shared/types\";\nimport { extractAttributesFromNode } from \"../../../shared/attributeNodeUtils\";\nimport { responsiveStylesToClasses } from \"../../../shared/utilityClassMapper\";\nimport { pathToString } from \"../../../shared/pathArrayUtils\";\nimport { generateElementClassName, type ElementClassContext } from \"../../../shared/elementClassName\";\nimport { InteractiveStylesRegistry } from \"../../InteractiveStylesRegistry\";\nimport { hasInteractiveStyleMappings, extractInteractiveStyleMappings, resolveExtractedMappings } from \"../../../shared/interactiveStyleMappings\";\nimport { UtilityClassCollector } from \"../../styles/UtilityClassCollector\";\nimport DOMPurify from \"isomorphic-dompurify\";\nimport type { ElementRegistry } from \"../../elementRegistry\";\nimport type { BuilderContext } from \"./types\";\nimport { hasItemTemplates, processItemTemplate, processItemPropsTemplate, type ValueResolver } from \"../../../shared/itemTemplateUtils\";\nimport { resolveI18nValue, DEFAULT_I18N_CONFIG } from \"../../../shared/i18n\";\nimport { processCMSTemplate } from \"../cmsTemplateProcessor\";\n\nexport interface EmbedBuilderDeps {\n elementRegistry: ElementRegistry;\n getEffectiveParentComponentName: (\n componentContext: string | null,\n parentComponentName: string | null\n ) => string | null;\n /** Optional getter for current page name (for interactive styles class generation) */\n getCurrentPageName?: () => string;\n /** Optional getter for current file type (for interactive styles class generation) */\n getCurrentFileType?: () => 'page' | 'component';\n}\n\n/**\n * DOMPurify configuration for embed nodes\n * Allows safe SVG, rich-text formatting, and common elements\n * Script tags and event handlers are still removed for security\n */\nconst SANITIZE_CONFIG = {\n ALLOWED_TAGS: ['svg', 'path', 'circle', 'rect', 'line', 'polyline', 'polygon', 'g', 'text', 'tspan', 'image', 'defs', 'use', 'linearGradient', 'radialGradient', 'stop', 'clipPath', 'mask', 'pattern', 'marker', 'symbol', 'a', 'div', 'span', 'p', 'br', 'button', 'img', 'iframe', 'video', 'audio', 'source', 'canvas', 'b', 'i', 'u', 'strong', 'em', 'sub', 'sup', 'mark', 's', 'small', 'del', 'ins', 'q', 'abbr', 'code', 'pre', 'blockquote', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n ALLOWED_ATTR: ['class', 'id', 'style', 'width', 'height', 'viewBox', 'xmlns', 'fill', 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin', 'stroke-dasharray', 'stroke-dashoffset', 'd', 'cx', 'cy', 'r', 'x', 'y', 'x1', 'y1', 'x2', 'y2', 'points', 'href', 'src', 'alt', 'target', 'rel', 'data-*', 'aria-*', 'transform', 'opacity', 'fill-opacity', 'stroke-opacity', 'font-size', 'font-family', 'text-anchor', 'dominant-baseline', 'offset', 'stop-color', 'stop-opacity', 'frameborder', 'allowfullscreen', 'allow', 'title'],\n KEEP_CONTENT: true\n};\n\n/**\n * Build an embed node\n */\nexport function buildEmbed(\n node: EmbedNode,\n ctx: BuilderContext,\n deps: EmbedBuilderDeps\n): ReactElement {\n const { key, elementPath, parentComponentName, componentContext, componentRootPath, cmsItemIndexPath } = ctx;\n\n // Process templates in html property before sanitization (matching SSR behavior)\n // Mappings should already be resolved by processStructure, this is just a type safety guard\n let htmlContent = typeof node.html === 'string' ? node.html : '';\n\n // Process item template strings (for List context) - e.g., {{item.icon}}, {{feature.title}}\n if (ctx.templateContext && hasItemTemplates(htmlContent)) {\n // Create i18n resolver for template processing (matching SSR behavior)\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const i18nConfig = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, i18nConfig)\n : undefined;\n htmlContent = processItemTemplate(htmlContent, ctx.templateContext, i18nResolver);\n }\n\n // Process CMS template strings (for CMS page context) - e.g., {{cms.title}}, {{cms.description}}\n if (ctx.cmsContext && htmlContent.includes('{{cms.')) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n htmlContent = processCMSTemplate(htmlContent, ctx.cmsContext, effectiveLocale);\n }\n\n // Sanitize HTML with allowlist\n const sanitizedHtml = DOMPurify.sanitize(htmlContent, SANITIZE_CONFIG);\n const effectiveParentComponentName = deps.getEffectiveParentComponentName(componentContext, parentComponentName);\n\n // Extract attributes from node\n const extractedAttributes = extractAttributesFromNode(node as any);\n\n // Build embed node props with all features\n const embedProps: Record<string, any> = {\n key,\n 'data-element-path': pathToString(elementPath),\n 'data-embed-node': 'true',\n ref: (el: HTMLElement | null) => {\n deps.elementRegistry.register(elementPath, el, effectiveParentComponentName, false);\n // Apply CSS variables for interactive styles\n if (el) {\n const cssVariables = InteractiveStylesRegistry.getVariables(elementPath);\n if (cssVariables && Object.keys(cssVariables).length > 0) {\n for (const [varName, value] of Object.entries(cssVariables)) {\n el.style.setProperty(varName, value);\n }\n }\n }\n },\n dangerouslySetInnerHTML: { __html: sanitizedHtml }\n };\n\n // Add CMS item index path for elements inside CMS lists\n if (cmsItemIndexPath && cmsItemIndexPath.length > 0) {\n embedProps['data-cms-item-index'] = cmsItemIndexPath.join('.');\n }\n\n // Start building className\n let classNames: string[] = ['oem'];\n\n // Convert embed styles to utility classes\n if (node.style) {\n // Process item templates in style values (for List context)\n let processedStyle = node.style;\n if (ctx.templateContext) {\n // Create i18n resolver for style template processing (matching SSR behavior)\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const i18nConfig = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, i18nConfig)\n : undefined;\n processedStyle = processItemPropsTemplate(\n node.style as Record<string, unknown>,\n ctx.templateContext,\n i18nResolver\n ) as StyleObject | ResponsiveStyleObject;\n }\n const utilityClasses = responsiveStylesToClasses(processedStyle as StyleObject | ResponsiveStyleObject);\n UtilityClassCollector.collect(utilityClasses);\n classNames.push(...utilityClasses);\n }\n\n // Handle interactive styles (cast to InteractiveStyles since Zod-inferred type is slightly different)\n const nodeInteractiveStyles = node.interactiveStyles as InteractiveStyles | undefined;\n const nodeGenerateElementClass = node.generateElementClass;\n const nodeLabel = node.label;\n\n if ((nodeInteractiveStyles && nodeInteractiveStyles.length > 0) || nodeGenerateElementClass) {\n // Determine file type and name for element class generation\n const useComponentContext = Boolean(componentContext);\n const fileType = useComponentContext ? 'component' : (deps.getCurrentFileType?.() || 'page');\n const fileName = useComponentContext ? componentContext! : (deps.getCurrentPageName?.() || 'page');\n const pathForClass = useComponentContext && componentRootPath\n ? elementPath.slice(componentRootPath.length)\n : elementPath;\n\n const elementClassCtx: ElementClassContext = {\n fileType,\n fileName,\n label: nodeLabel,\n path: pathForClass,\n };\n const elementClass = generateElementClassName(elementClassCtx);\n\n // Prepend element class\n classNames.unshift(elementClass);\n\n // Register interactive styles with mapping support\n if (nodeInteractiveStyles && nodeInteractiveStyles.length > 0) {\n if (ctx.componentResolvedProps && hasInteractiveStyleMappings(nodeInteractiveStyles)) {\n const { resolvedStyles, mappings } = extractInteractiveStyleMappings(nodeInteractiveStyles);\n const cssVariables = resolveExtractedMappings(mappings, ctx.componentResolvedProps);\n InteractiveStylesRegistry.set(elementClass, resolvedStyles);\n if (Object.keys(cssVariables).length > 0) {\n InteractiveStylesRegistry.setVariables(elementPath, cssVariables);\n }\n } else {\n InteractiveStylesRegistry.set(elementClass, nodeInteractiveStyles);\n }\n\n // Apply preview classes when previewProp is set and truthy\n if (ctx.componentResolvedProps) {\n const previewClasses: string[] = [];\n for (const rule of nodeInteractiveStyles) {\n if (rule.previewProp && ctx.componentResolvedProps[rule.previewProp] === true) {\n const styleClasses = responsiveStylesToClasses(rule.style as StyleObject | ResponsiveStyleObject);\n UtilityClassCollector.collect(styleClasses);\n previewClasses.push(...styleClasses);\n }\n }\n if (previewClasses.length > 0) {\n classNames.push(...previewClasses);\n }\n }\n }\n }\n\n // Add extracted attributes className if present\n if (extractedAttributes.className) {\n const attrClasses = (extractedAttributes.className as string).split(/\\s+/);\n classNames.push(...attrClasses);\n delete extractedAttributes.className;\n }\n\n // Set final className\n if (classNames.length > 0) {\n embedProps.className = classNames.filter(Boolean).join(' ');\n }\n\n // Process item templates in extracted attributes (for List context)\n let processedAttributes = extractedAttributes;\n if (ctx.templateContext && Object.keys(extractedAttributes).length > 0) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n processedAttributes = processItemPropsTemplate(\n extractedAttributes, ctx.templateContext, i18nResolver\n ) as Record<string, string | number | boolean>;\n }\n\n // Add extracted attributes (like class, id, data-*, aria-*, etc.)\n if (Object.keys(processedAttributes).length > 0) {\n Object.assign(embedProps, processedAttributes);\n }\n\n // Add parent component context\n if (effectiveParentComponentName) {\n embedProps['data-parent-component'] = effectiveParentComponentName;\n }\n if (componentContext) {\n embedProps['data-component-context'] = componentContext;\n }\n\n // Always use span for embeds - valid inside <p> and other phrasing content\n return h('span', embedProps);\n}\n", "/**\n * Link Node Builder\n * Handles rendering of link nodes (links rendered as div in editor)\n */\n\nimport { createElement as h } from \"react\";\nimport type { ReactElement } from \"react\";\nimport type { LinkNode, StyleObject, ResponsiveStyleObject, InteractiveStyles } from \"../../../shared/types\";\nimport { extractAttributesFromNode } from \"../../../shared/attributeNodeUtils\";\nimport { responsiveStylesToClasses } from \"../../../shared/utilityClassMapper\";\nimport { pathToString } from \"../../../shared/pathArrayUtils\";\nimport { generateElementClassName, type ElementClassContext } from \"../../../shared/elementClassName\";\nimport { InteractiveStylesRegistry } from \"../../InteractiveStylesRegistry\";\nimport { hasInteractiveStyleMappings, extractInteractiveStyleMappings, resolveExtractedMappings } from \"../../../shared/interactiveStyleMappings\";\nimport { processItemPropsTemplate, type ValueResolver } from \"../../../shared/itemTemplateUtils\";\nimport { UtilityClassCollector } from \"../../styles/UtilityClassCollector\";\nimport { resolveI18nValue, DEFAULT_I18N_CONFIG } from \"../../../shared/i18n\";\nimport { isCurrentLink } from \"../../../shared/linkUtils\";\nimport type { ElementRegistry } from \"../../elementRegistry\";\nimport type { BuilderContext, BuildResult, BuildChildrenContext } from \"./types\";\n\nexport interface LinkNodeBuilderDeps {\n elementRegistry: ElementRegistry;\n buildChildren: (\n children: unknown,\n ctx: BuildChildrenContext\n ) => BuildResult;\n getEffectiveParentComponentName: (\n componentContext: string | null,\n parentComponentName: string | null\n ) => string | null;\n /** Optional getter for current page name (for interactive styles class generation) */\n getCurrentPageName?: () => string;\n /** Optional getter for current file type (for interactive styles class generation) */\n getCurrentFileType?: () => 'page' | 'component';\n /** Optional getter for current page path (for is-current class on link nodes) */\n getCurrentPagePath?: () => string;\n}\n\n/**\n * Build a link node (renders as div in editor)\n */\nexport function buildLinkNode(\n node: LinkNode,\n children: unknown,\n ctx: BuilderContext,\n deps: LinkNodeBuilderDeps\n): ReactElement {\n const {\n key, elementPath, parentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap,\n itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n } = ctx;\n\n const effectiveParentComponentName = deps.getEffectiveParentComponentName(componentContext, parentComponentName);\n\n // Extract attributes\n const extractedAttributes = extractAttributesFromNode(node as any);\n\n // Build link node props (renders as div in editor)\n const linkNodeProps: Record<string, any> = {\n key,\n 'data-element-path': pathToString(elementPath),\n 'data-link-node': 'true',\n ref: (el: HTMLElement | null) => {\n deps.elementRegistry.register(elementPath, el, effectiveParentComponentName, false);\n // Apply CSS variables for interactive styles\n if (el) {\n const cssVariables = InteractiveStylesRegistry.getVariables(elementPath);\n if (cssVariables && Object.keys(cssVariables).length > 0) {\n for (const [varName, value] of Object.entries(cssVariables)) {\n el.style.setProperty(varName, value);\n }\n }\n }\n }\n };\n\n // Add CMS item index path for elements inside CMS lists\n if (cmsItemIndexPath && cmsItemIndexPath.length > 0) {\n linkNodeProps['data-cms-item-index'] = cmsItemIndexPath.join('.');\n }\n\n // Start building className\n let classNames: string[] = [];\n\n // Convert link node styles to utility classes\n if (node.style) {\n // Process item templates in style values (for List context)\n let processedStyle = node.style;\n if (ctx.templateContext) {\n // Create i18n resolver for style template processing (matching SSR behavior)\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const i18nConfig = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, i18nConfig)\n : undefined;\n processedStyle = processItemPropsTemplate(\n node.style as Record<string, unknown>,\n ctx.templateContext,\n i18nResolver\n ) as StyleObject | ResponsiveStyleObject;\n }\n const utilityClasses = responsiveStylesToClasses(processedStyle as StyleObject | ResponsiveStyleObject);\n UtilityClassCollector.collect(utilityClasses);\n classNames.push(...utilityClasses);\n }\n\n // Handle interactive styles (cast to InteractiveStyles since Zod-inferred type is slightly different)\n const nodeInteractiveStyles = node.interactiveStyles as InteractiveStyles | undefined;\n const nodeGenerateElementClass = node.generateElementClass;\n const nodeLabel = node.label;\n\n if ((nodeInteractiveStyles && nodeInteractiveStyles.length > 0) || nodeGenerateElementClass) {\n // Determine file type and name for element class generation\n const useComponentContext = Boolean(componentContext);\n const fileType = useComponentContext ? 'component' : (deps.getCurrentFileType?.() || 'page');\n const fileName = useComponentContext ? componentContext! : (deps.getCurrentPageName?.() || 'page');\n const pathForClass = useComponentContext && componentRootPath\n ? elementPath.slice(componentRootPath.length)\n : elementPath;\n\n const elementClassCtx: ElementClassContext = {\n fileType,\n fileName,\n label: nodeLabel,\n path: pathForClass,\n };\n const elementClass = generateElementClassName(elementClassCtx);\n\n // Prepend element class\n classNames.unshift(elementClass);\n\n // Register interactive styles with mapping support\n if (nodeInteractiveStyles && nodeInteractiveStyles.length > 0) {\n if (ctx.componentResolvedProps && hasInteractiveStyleMappings(nodeInteractiveStyles)) {\n const { resolvedStyles, mappings } = extractInteractiveStyleMappings(nodeInteractiveStyles);\n const cssVariables = resolveExtractedMappings(mappings, ctx.componentResolvedProps);\n InteractiveStylesRegistry.set(elementClass, resolvedStyles);\n if (Object.keys(cssVariables).length > 0) {\n InteractiveStylesRegistry.setVariables(elementPath, cssVariables);\n }\n } else {\n InteractiveStylesRegistry.set(elementClass, nodeInteractiveStyles);\n }\n\n // Apply preview classes when previewProp is set and truthy\n if (ctx.componentResolvedProps) {\n const previewClasses: string[] = [];\n for (const rule of nodeInteractiveStyles) {\n if (rule.previewProp && ctx.componentResolvedProps[rule.previewProp] === true) {\n const styleClasses = responsiveStylesToClasses(rule.style as StyleObject | ResponsiveStyleObject);\n UtilityClassCollector.collect(styleClasses);\n previewClasses.push(...styleClasses);\n }\n }\n if (previewClasses.length > 0) {\n classNames.push(...previewClasses);\n }\n }\n }\n }\n\n // Add extracted attributes className if present\n if (extractedAttributes.className) {\n const attrClasses = (extractedAttributes.className as string).split(/\\s+/);\n classNames.push(...attrClasses);\n delete extractedAttributes.className;\n }\n\n // Add is-current class when link href matches current page path\n if (deps.getCurrentPagePath && typeof node.href === 'string') {\n if (isCurrentLink(node.href, deps.getCurrentPagePath())) {\n classNames.push('is-current');\n }\n }\n\n // Set final className\n if (classNames.length > 0) {\n linkNodeProps.className = classNames.filter(Boolean).join(' ');\n }\n\n // Process item templates in extracted attributes (for List context)\n let processedAttributes = extractedAttributes;\n if (ctx.templateContext && Object.keys(extractedAttributes).length > 0) {\n const effectiveLocale = ctx.cmsLocale || ctx.locale;\n const config = ctx.i18nConfig || DEFAULT_I18N_CONFIG;\n const i18nResolver: ValueResolver | undefined = effectiveLocale\n ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)\n : undefined;\n processedAttributes = processItemPropsTemplate(\n extractedAttributes, ctx.templateContext, i18nResolver\n ) as Record<string, string | number | boolean>;\n }\n\n // Add extracted attributes (like class, id, data-*, aria-*, etc.)\n if (Object.keys(processedAttributes).length > 0) {\n Object.assign(linkNodeProps, processedAttributes);\n }\n\n // Add parent component context\n if (effectiveParentComponentName) {\n linkNodeProps['data-parent-component'] = effectiveParentComponentName;\n }\n if (componentContext) {\n linkNodeProps['data-component-context'] = componentContext;\n }\n\n // Build children recursively\n const linkNodeChildren = deps.buildChildren(children, {\n elementPath, parentComponentName: effectiveParentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap, itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n });\n\n return h('div', linkNodeProps, linkNodeChildren);\n}\n", "/**\n * Locale List Node Builder\n * Handles rendering of locale/language switcher nodes\n */\n\nimport { createElement as h } from \"react\";\nimport type { ReactElement } from \"react\";\nimport type { LocaleListNode, StyleObject, ResponsiveStyleObject, InteractiveStyles } from \"../../../shared/types\";\nimport { extractAttributesFromNode } from \"../../../shared/attributeNodeUtils\";\nimport { responsiveStylesToClasses } from \"../../../shared/utilityClassMapper\";\nimport { pathToString } from \"../../../shared/pathArrayUtils\";\nimport { generateElementClassName, type ElementClassContext } from \"../../../shared/elementClassName\";\nimport { InteractiveStylesRegistry } from \"../../InteractiveStylesRegistry\";\nimport { hasInteractiveStyleMappings, extractInteractiveStyleMappings, resolveExtractedMappings } from \"../../../shared/interactiveStyleMappings\";\nimport { UtilityClassCollector } from \"../../styles/UtilityClassCollector\";\nimport type { ElementRegistry } from \"../../elementRegistry\";\nimport type { BuilderContext } from \"./types\";\n\nexport interface LocaleListBuilderDeps {\n elementRegistry: ElementRegistry;\n getEffectiveParentComponentName: (\n componentContext: string | null,\n parentComponentName: string | null\n ) => string | null;\n /** Optional getter for current page name (for interactive styles class generation) */\n getCurrentPageName?: () => string;\n /** Optional getter for current file type (for interactive styles class generation) */\n getCurrentFileType?: () => 'page' | 'component';\n}\n\n/**\n * Build a locale list node (language switcher)\n */\nexport function buildLocaleList(\n node: LocaleListNode,\n ctx: BuilderContext,\n deps: LocaleListBuilderDeps\n): ReactElement {\n const {\n key, elementPath, parentComponentName, componentContext, componentRootPath,\n locale, i18nConfig, cmsItemIndexPath\n } = ctx;\n\n const effectiveParentComponentName = deps.getEffectiveParentComponentName(componentContext, parentComponentName);\n\n // Extract attributes\n const extractedAttributes = extractAttributesFromNode(node as any);\n\n // Build locale list props\n const localeListProps: Record<string, any> = {\n key,\n 'data-element-path': pathToString(elementPath),\n 'data-locale-list': 'true',\n ref: (el: HTMLElement | null) => {\n deps.elementRegistry.register(elementPath, el, effectiveParentComponentName, false);\n // Apply CSS variables for interactive styles\n if (el) {\n const cssVariables = InteractiveStylesRegistry.getVariables(elementPath);\n if (cssVariables && Object.keys(cssVariables).length > 0) {\n for (const [varName, value] of Object.entries(cssVariables)) {\n el.style.setProperty(varName, value);\n }\n }\n }\n }\n };\n\n // Add CMS item index path for elements inside CMS lists\n if (cmsItemIndexPath && cmsItemIndexPath.length > 0) {\n localeListProps['data-cms-item-index'] = cmsItemIndexPath.join('.');\n }\n\n // Start building className\n let classNames: string[] = [];\n\n // Convert container styles to utility classes\n if (node.style) {\n const utilityClasses = responsiveStylesToClasses(node.style as StyleObject | ResponsiveStyleObject);\n UtilityClassCollector.collect(utilityClasses);\n classNames.push(...utilityClasses);\n }\n\n // Handle interactive styles (cast to InteractiveStyles since Zod-inferred type is slightly different)\n const nodeInteractiveStyles = node.interactiveStyles as InteractiveStyles | undefined;\n const nodeGenerateElementClass = node.generateElementClass;\n const nodeLabel = node.label;\n\n if ((nodeInteractiveStyles && nodeInteractiveStyles.length > 0) || nodeGenerateElementClass) {\n // Determine file type and name for element class generation\n const useComponentContext = Boolean(componentContext);\n const fileType = useComponentContext ? 'component' : (deps.getCurrentFileType?.() || 'page');\n const fileName = useComponentContext ? componentContext! : (deps.getCurrentPageName?.() || 'page');\n const pathForClass = useComponentContext && componentRootPath\n ? elementPath.slice(componentRootPath.length)\n : elementPath;\n\n const elementClassCtx: ElementClassContext = {\n fileType,\n fileName,\n label: nodeLabel,\n path: pathForClass,\n };\n const elementClass = generateElementClassName(elementClassCtx);\n\n // Prepend element class\n classNames.unshift(elementClass);\n\n // Register interactive styles with mapping support\n if (nodeInteractiveStyles && nodeInteractiveStyles.length > 0) {\n if (ctx.componentResolvedProps && hasInteractiveStyleMappings(nodeInteractiveStyles)) {\n const { resolvedStyles, mappings } = extractInteractiveStyleMappings(nodeInteractiveStyles);\n const cssVariables = resolveExtractedMappings(mappings, ctx.componentResolvedProps);\n InteractiveStylesRegistry.set(elementClass, resolvedStyles);\n if (Object.keys(cssVariables).length > 0) {\n InteractiveStylesRegistry.setVariables(elementPath, cssVariables);\n }\n } else {\n InteractiveStylesRegistry.set(elementClass, nodeInteractiveStyles);\n }\n\n // Apply preview classes when previewProp is set and truthy\n if (ctx.componentResolvedProps) {\n const previewClasses: string[] = [];\n for (const rule of nodeInteractiveStyles) {\n if (rule.previewProp && ctx.componentResolvedProps[rule.previewProp] === true) {\n const styleClasses = responsiveStylesToClasses(rule.style as StyleObject | ResponsiveStyleObject);\n UtilityClassCollector.collect(styleClasses);\n previewClasses.push(...styleClasses);\n }\n }\n if (previewClasses.length > 0) {\n classNames.push(...previewClasses);\n }\n }\n }\n }\n\n // Add extracted attributes className if present\n if (extractedAttributes.className) {\n const attrClasses = (extractedAttributes.className as string).split(/\\s+/);\n classNames.push(...attrClasses);\n delete extractedAttributes.className;\n }\n\n // Set final className\n if (classNames.length > 0) {\n localeListProps.className = classNames.filter(Boolean).join(' ');\n }\n\n // Add extracted attributes\n if (Object.keys(extractedAttributes).length > 0) {\n Object.assign(localeListProps, extractedAttributes);\n }\n\n // Add parent component context\n if (effectiveParentComponentName) {\n localeListProps['data-parent-component'] = effectiveParentComponentName;\n }\n if (componentContext) {\n localeListProps['data-component-context'] = componentContext;\n }\n\n // Build locale links for editor preview using actual i18n config\n const showCurrent = node.showCurrent !== false;\n const showSeparator = node.showSeparator !== false;\n const showFlag = node.showFlag !== false;\n // Use actual locales from i18nConfig (LocaleConfig[])\n const configLocales = i18nConfig?.locales || [];\n const currentLocaleCode = locale || i18nConfig?.defaultLocale || 'en';\n\n // Convert item styles, active item styles, separator styles, and flag styles to utility classes\n const itemClasses = node.itemStyle ? responsiveStylesToClasses(node.itemStyle as StyleObject | ResponsiveStyleObject) : [];\n const activeItemClasses = node.activeItemStyle ? responsiveStylesToClasses(node.activeItemStyle as StyleObject | ResponsiveStyleObject) : [];\n const separatorClasses = node.separatorStyle ? responsiveStylesToClasses(node.separatorStyle as StyleObject | ResponsiveStyleObject) : [];\n const flagClasses = node.flagStyle ? responsiveStylesToClasses(node.flagStyle as StyleObject | ResponsiveStyleObject) : [];\n UtilityClassCollector.collect(itemClasses);\n UtilityClassCollector.collect(activeItemClasses);\n UtilityClassCollector.collect(separatorClasses);\n UtilityClassCollector.collect(flagClasses);\n\n // Build locale links from config\n const linkElements: ReactElement[] = [];\n for (let i = 0; i < configLocales.length; i++) {\n const localeConfig = configLocales[i];\n const isCurrent = localeConfig.code === currentLocaleCode;\n if (!showCurrent && isCurrent) continue;\n\n // Add separator between links (empty span styled via separatorStyle)\n if (showSeparator && linkElements.length > 0) {\n linkElements.push(h('span', {\n key: `sep-${i}`,\n className: separatorClasses.length > 0 ? separatorClasses.join(' ') : undefined\n }));\n }\n\n // Build link element content - flag icon (if enabled and exists) + nativeName in span\n const linkContent: (ReactElement | string)[] = [];\n if (showFlag && localeConfig.icon) {\n linkContent.push(h('img', {\n key: 'flag',\n src: localeConfig.icon,\n alt: `${localeConfig.name} flag`,\n className: flagClasses.length > 0 ? flagClasses.join(' ') : undefined\n }));\n }\n // Get display text based on displayType (mirrors SSR logic)\n const displayType = node.displayType || 'nativeName';\n let displayText: string;\n switch (displayType) {\n case 'code':\n displayText = localeConfig.code.toUpperCase();\n break;\n case 'name':\n displayText = localeConfig.name;\n break;\n case 'nativeName':\n default:\n displayText = localeConfig.nativeName;\n break;\n }\n linkContent.push(h('div', { key: 'text' }, displayText));\n\n // Current item gets both itemClasses + activeItemClasses (additive/override)\n const linkClasses = isCurrent ? [...itemClasses, ...activeItemClasses] : itemClasses;\n linkElements.push(h('div', {\n key: `locale-${localeConfig.code}`,\n 'data-current': isCurrent ? 'true' : 'false',\n 'data-locale': localeConfig.code,\n className: linkClasses.length > 0 ? linkClasses.join(' ') : undefined,\n style: { cursor: 'pointer' }\n }, ...linkContent));\n }\n\n return h('div', localeListProps, linkElements);\n}\n", "/**\n * Unified List Node Builder\n * Handles rendering of list nodes with item iteration from either:\n * - Component props (sourceType: 'prop')\n * - CMS collections (sourceType: 'collection')\n */\n\nimport { createElement as h, Fragment } from \"react\";\nimport type { ReactElement } from \"react\";\nimport type { ListNode } from \"../../../shared/registry/nodeTypes/ListNodeType\";\nimport type { CMSItem, CMSFilterCondition, CMSSortConfig, CMSFilterOperator } from \"../../../shared/types/cms\";\nimport { singularize, isItemDraftForLocale } from \"../../../shared/types/cms\";\nimport { buildTemplateContext, resolveItemsTemplate, getNestedValue } from \"../../../shared/itemTemplateUtils\";\nimport type { TemplateContext } from \"../../../shared/types/cms\";\nimport { pathToString } from \"../../../shared/pathArrayUtils\";\nimport { extractAttributesFromNode } from \"../../../shared/attributeNodeUtils\";\nimport type { ElementRegistry } from \"../../elementRegistry\";\nimport type { BuilderContext, BuildResult, BuildChildrenContext } from \"./types\";\n\nexport interface ListBuilderDeps {\n elementRegistry: ElementRegistry;\n buildChildren: (\n children: unknown,\n ctx: BuildChildrenContext\n ) => BuildResult;\n getEffectiveParentComponentName: (\n componentContext: string | null,\n parentComponentName: string | null\n ) => string | null;\n}\n\n/**\n * Build a unified list node - handles both prop and collection source types\n */\nexport function buildList(\n node: ListNode,\n children: unknown,\n ctx: BuilderContext,\n deps: ListBuilderDeps\n): ReactElement {\n const {\n key, elementPath, parentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap = {},\n cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n } = ctx;\n\n // Determine source type (default to 'prop', but handle legacy 'cms-list' type)\n const nodeType = (node as any).type;\n const isLegacyCMSList = nodeType === 'cms-list';\n const sourceType = isLegacyCMSList ? 'collection' : (node.sourceType || 'prop');\n const isCollectionMode = sourceType === 'collection';\n\n // Get source - handle both new 'source' and legacy 'collection' property\n // Source can be a string (prop name) or array (pre-resolved by processStructure)\n const rawSource = node.source || (node as any).collection;\n const source = typeof rawSource === 'string' ? rawSource : '';\n const sourceIsResolved = Array.isArray(rawSource);\n\n const effectiveParentComponentName = deps.getEffectiveParentComponentName(componentContext, parentComponentName);\n\n // Extract attributes\n const extractedAttributes = extractAttributesFromNode(node as any);\n\n // Build container props with appropriate data attributes\n const containerProps: Record<string, any> = {\n key,\n 'data-element-path': pathToString(elementPath),\n ref: (el: HTMLElement | null) => {\n deps.elementRegistry.register(elementPath, el, effectiveParentComponentName, false);\n }\n };\n\n // Set data attributes based on source type\n // All list types need data-cms-list for click handler to find them\n containerProps['data-cms-list'] = 'true';\n if (isCollectionMode) {\n containerProps['data-collection'] = source || '';\n } else {\n containerProps['data-list'] = 'true';\n containerProps['data-source'] = source || (sourceIsResolved ? 'resolved' : '');\n }\n\n // Add extracted attributes\n if (Object.keys(extractedAttributes).length > 0) {\n Object.assign(containerProps, extractedAttributes);\n }\n\n // Add parent component context\n if (effectiveParentComponentName) {\n containerProps['data-parent-component'] = effectiveParentComponentName;\n }\n if (componentContext) {\n containerProps['data-component-context'] = componentContext;\n }\n\n // Get items based on source type\n let itemsToRender: unknown[];\n\n if (isCollectionMode) {\n itemsToRender = getCollectionItems(node, source, ctx);\n } else {\n // Prop mode: Read from component props or template context\n // If source was already resolved to an array by processStructure (e.g., from {{features}}),\n // use it directly instead of looking up by prop name\n if (sourceIsResolved) {\n itemsToRender = rawSource as unknown[];\n } else if (source) {\n itemsToRender = getPropItems(source, ctx);\n } else {\n itemsToRender = [];\n }\n }\n\n // Determine variable name for this list's items\n let variableName: string;\n if (node.itemAs) {\n variableName = node.itemAs;\n } else if (isCollectionMode) {\n variableName = singularize(source);\n } else {\n variableName = 'item';\n }\n\n // Different colors for collection vs prop modes\n const bgColor = isCollectionMode ? 'rgba(139, 92, 246, 0.05)' : 'rgba(59, 130, 246, 0.05)';\n const borderColor = isCollectionMode ? 'rgba(139, 92, 246, 0.3)' : 'rgba(59, 130, 246, 0.3)';\n const textColor = isCollectionMode ? '#8b5cf6' : '#3b82f6';\n const label = isCollectionMode ? 'CMS List' : 'List';\n\n // Use configurable tag (defaults to 'div') - null means fragment mode (no wrapper)\n const tag = typeof node.tag === 'string' ? node.tag : null;\n\n if (!source && !sourceIsResolved) {\n // No source - render empty container with placeholder\n const emptyState = h('div', {\n key: 'list-empty',\n style: {\n padding: '12px',\n background: bgColor,\n border: `1px dashed ${borderColor}`,\n borderRadius: '4px',\n color: textColor,\n fontSize: '12px',\n fontFamily: 'system-ui, sans-serif',\n textAlign: 'center'\n }\n }, `${label}: No source - No items`);\n if (tag === null) {\n return emptyState;\n }\n return h(tag, containerProps, emptyState);\n }\n\n if (itemsToRender.length === 0) {\n // No items - render empty container with placeholder\n const emptyState = h('div', {\n key: 'list-empty',\n style: {\n padding: '12px',\n background: bgColor,\n border: `1px dashed ${borderColor}`,\n borderRadius: '4px',\n color: textColor,\n fontSize: '12px',\n fontFamily: 'system-ui, sans-serif',\n textAlign: 'center'\n }\n }, `${label}: ${source || 'resolved'} - No items`);\n if (tag === null) {\n return emptyState;\n }\n return h(tag, containerProps, emptyState);\n }\n\n // Render children for each item\n const renderedItems: (ReactElement | string | number)[] = [];\n\n for (let index = 0; index < itemsToRender.length; index++) {\n const item = itemsToRender[index];\n // Build template context for this item\n const itemTemplateContext = buildTemplateContext(\n variableName,\n item as CMSItem,\n index,\n itemsToRender.length,\n templateContext || undefined\n );\n\n // Build children with item context\n // Track item index for BOTH collection and prop mode (enables selection of individual list items)\n const newIndexPath = [...(cmsItemIndexPath || []), index];\n const newListPaths = [...(cmsListPaths || []), elementPath];\n\n const itemChildren = deps.buildChildren(children, {\n elementPath,\n parentComponentName: effectiveParentComponentName,\n viewportWidth,\n componentContext,\n componentRootPath,\n locale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n itemContext: null,\n cmsItemIndexPath: newIndexPath,\n cmsListPaths: newListPaths,\n templateContext: itemTemplateContext,\n componentResolvedProps\n });\n\n // Add children directly (no wrapper div)\n if (itemChildren === null) continue;\n if (Array.isArray(itemChildren)) {\n // Add unique keys by combining original key with item index\n for (const child of itemChildren) {\n if (typeof child === 'object' && child !== null && 'key' in child) {\n renderedItems.push({ ...child, key: `${child.key}-item-${index}` } as ReactElement);\n } else {\n renderedItems.push(child);\n }\n }\n } else if (typeof itemChildren === 'object' && itemChildren !== null && 'key' in itemChildren) {\n // Single child - ensure unique key\n renderedItems.push({ ...itemChildren, key: `${(itemChildren as ReactElement).key}-item-${index}` } as ReactElement);\n } else {\n renderedItems.push(itemChildren);\n }\n }\n\n if (tag === null) {\n return h(Fragment, null, renderedItems);\n }\n return h(tag, containerProps, renderedItems);\n}\n\n// ============================================================================\n// Item Fetching Functions\n// ============================================================================\n\n/**\n * Get items from CMS collection (for sourceType: 'collection')\n */\nfunction getCollectionItems(node: ListNode, source: string, ctx: BuilderContext): CMSItem[] {\n const { collectionItemsMap = {}, cmsContext, templateContext } = ctx;\n const collectionItems = source ? (collectionItemsMap[source] || []) : [];\n\n // Helper to lookup items by ID or filename\n const lookupItemsByIds = (ids: string[], items: CMSItem[]): CMSItem[] => {\n const itemMap = new Map(items.map(item => [item._id, item]));\n const filenameMap = new Map(items.map(item => [item._filename, item]));\n return ids\n .filter(Boolean)\n .map(id => itemMap.get(id) || filenameMap.get(id))\n .filter((item): item is CMSItem => item !== undefined);\n };\n\n let itemsToRender: CMSItem[] = [];\n\n // Check if items are specified directly (for nested reference lists)\n if (node.items) {\n // If items is a template expression, resolve it from current context\n if (typeof node.items === 'string' && node.items.startsWith('{{')) {\n let resolvedIds: string | string[] | undefined;\n\n // Check if this is a CMS template ({{cms.field}}) - resolve from cmsContext\n if (node.items.startsWith('{{cms.') && cmsContext) {\n const fieldPath = node.items.slice(6, -2); // Extract \"field\" from \"{{cms.field}}\"\n let value: unknown = cmsContext;\n for (const part of fieldPath.split('.')) {\n if (value && typeof value === 'object' && part in value) {\n value = (value as Record<string, unknown>)[part];\n } else {\n value = undefined;\n break;\n }\n }\n if (value !== null && value !== undefined) {\n resolvedIds = Array.isArray(value) ? value.map(v => String(v)) : String(value);\n }\n } else {\n // Otherwise resolve from template context (for nested lists)\n const effectiveTemplateContext = templateContext || { _type: 'template' as const };\n resolvedIds = resolveItemsTemplate(node.items, effectiveTemplateContext);\n }\n\n if (resolvedIds) {\n const ids = Array.isArray(resolvedIds) ? resolvedIds : [resolvedIds];\n itemsToRender = lookupItemsByIds(ids, collectionItems);\n }\n } else {\n // Direct IDs (string or array)\n const ids = Array.isArray(node.items) ? node.items : [node.items];\n itemsToRender = lookupItemsByIds(ids, collectionItems);\n }\n\n // Apply filters and sorting to referenced items\n if (node.filter) {\n itemsToRender = applyClientFilters(itemsToRender, node.filter as CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown>, cmsContext ?? undefined, templateContext ?? undefined);\n }\n if (node.sort) {\n itemsToRender = applyClientSorting(itemsToRender, node.sort);\n }\n } else {\n // Get items for this collection from the map\n itemsToRender = [...collectionItems];\n\n // Apply filters (BEFORE offset/limit)\n if (node.filter) {\n itemsToRender = applyClientFilters(itemsToRender, node.filter as CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown>, cmsContext ?? undefined, templateContext ?? undefined);\n }\n\n // Apply sorting (BEFORE offset/limit)\n if (node.sort) {\n itemsToRender = applyClientSorting(itemsToRender, node.sort);\n }\n\n // Apply offset and limit (AFTER filter/sort)\n if (node.offset) {\n itemsToRender = itemsToRender.slice(node.offset);\n }\n if (node.limit) {\n itemsToRender = itemsToRender.slice(0, node.limit);\n }\n }\n\n // Filter draft items for the current locale\n const locale = ctx.locale || ctx.cmsLocale;\n if (locale) {\n itemsToRender = itemsToRender.filter(item => !isItemDraftForLocale(item, locale));\n }\n\n // Exclude current item if option is set and we have a current CMS context\n if (node.excludeCurrentItem && cmsContext && (cmsContext as any)._id) {\n const currentId = (cmsContext as any)._id as string;\n itemsToRender = itemsToRender.filter(item => item._id !== currentId);\n }\n\n return itemsToRender;\n}\n\n/**\n * Get items from component props or template context (for sourceType: 'prop')\n */\nfunction getPropItems(source: string, ctx: BuilderContext): unknown[] {\n const { componentResolvedProps, templateContext, cmsContext } = ctx;\n\n // Check if source is a template expression\n if (source.startsWith('{{') && source.endsWith('}}')) {\n // Template expression - resolve from template context (for nested lists)\n // e.g., {{category.items}} where category is from parent list\n if (templateContext) {\n const path = source.slice(2, -2).trim(); // Extract \"category.items\"\n const resolved = getNestedValue(templateContext as Record<string, unknown>, path);\n if (Array.isArray(resolved)) {\n return resolved;\n }\n }\n return [];\n }\n\n // Direct prop name - resolve from component props\n if (componentResolvedProps) {\n const propValue = componentResolvedProps[source];\n if (Array.isArray(propValue)) {\n return propValue;\n }\n }\n\n // Also try CMS context for prop mode (for cms context values)\n if (cmsContext) {\n const cmsValue = (cmsContext as Record<string, unknown>)[source];\n if (Array.isArray(cmsValue)) {\n return cmsValue;\n }\n }\n\n return [];\n}\n\n// ============================================================================\n// Filter and Sort Helper Functions\n// ============================================================================\n\n/**\n * Apply filters to items (client-side)\n */\nfunction applyClientFilters(\n items: CMSItem[],\n filter: CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown>,\n cmsContext?: Record<string, unknown>,\n templateContext?: TemplateContext\n): CMSItem[] {\n // Handle simple object filter: { featured: true }\n if (!Array.isArray(filter) && !isFilterCondition(filter)) {\n return items.filter(item =>\n Object.entries(filter).every(([key, value]) => {\n const resolvedValue = resolveTemplateValue(value, cmsContext, templateContext);\n return item[key] === resolvedValue;\n })\n );\n }\n\n // Handle array of conditions or single condition\n const conditions = Array.isArray(filter) ? filter : [filter as CMSFilterCondition];\n return items.filter(item =>\n conditions.every(cond => matchCondition(item, cond, cmsContext, templateContext))\n );\n}\n\nfunction isFilterCondition(obj: unknown): obj is CMSFilterCondition {\n return typeof obj === 'object' && obj !== null && 'field' in obj;\n}\n\n/**\n * Resolve template value like {{cms.category}} or {{category.slug}} from context\n */\nfunction resolveTemplateValue(\n value: unknown,\n cmsContext?: Record<string, unknown>,\n templateContext?: TemplateContext\n): unknown {\n if (typeof value !== 'string' || !value.startsWith('{{') || !value.endsWith('}}')) {\n return value;\n }\n\n const path = value.slice(2, -2).trim(); // Remove {{ and }}\n\n // Handle {{cms.field}} - resolve from CMS context\n if (path.startsWith('cms.') && cmsContext) {\n const fieldPath = path.slice(4); // Remove 'cms.'\n let result: unknown = cmsContext;\n for (const part of fieldPath.split('.')) {\n if (result && typeof result === 'object' && part in result) {\n result = (result as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return result;\n }\n\n // Handle {{itemAs.field}} - resolve from template context (for nested lists)\n if (templateContext) {\n const result = getNestedValue(templateContext as Record<string, unknown>, path);\n if (result !== undefined) {\n return result;\n }\n }\n\n return value; // Return as-is if can't resolve\n}\n\nfunction matchCondition(\n item: CMSItem,\n condition: CMSFilterCondition,\n cmsContext?: Record<string, unknown>,\n templateContext?: TemplateContext\n): boolean {\n const value = item[condition.field];\n const target = resolveTemplateValue(condition.value, cmsContext, templateContext);\n const op: CMSFilterOperator = condition.operator || 'eq';\n\n switch (op) {\n case 'eq': return value === target;\n case 'neq': return value !== target;\n case 'gt': return typeof value === 'number' && typeof target === 'number' && value > target;\n case 'gte': return typeof value === 'number' && typeof target === 'number' && value >= target;\n case 'lt': return typeof value === 'number' && typeof target === 'number' && value < target;\n case 'lte': return typeof value === 'number' && typeof target === 'number' && value <= target;\n case 'contains': return typeof value === 'string' && typeof target === 'string' && value.includes(target);\n case 'in': return Array.isArray(target) && target.includes(value);\n default: return false;\n }\n}\n\n/**\n * Apply sorting to items (client-side)\n */\nfunction applyClientSorting(\n items: CMSItem[],\n sort: CMSSortConfig | CMSSortConfig[]\n): CMSItem[] {\n const sorts = Array.isArray(sort) ? sort : [sort];\n\n return [...items].sort((a, b) => {\n for (const s of sorts) {\n const aVal = a[s.field];\n const bVal = b[s.field];\n const isDesc = s.order === 'desc';\n\n if (aVal === bVal) continue;\n if (aVal === undefined || aVal === null) return isDesc ? -1 : 1;\n if (bVal === undefined || bVal === null) return isDesc ? 1 : -1;\n\n let cmp = 0;\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n cmp = aVal.localeCompare(bVal);\n } else if (typeof aVal === 'number' && typeof bVal === 'number') {\n cmp = aVal - bVal;\n } else {\n cmp = String(aVal).localeCompare(String(bVal));\n }\n\n if (cmp !== 0) return isDesc ? -cmp : cmp;\n }\n return 0;\n });\n}\n", "/**\n * Link Component Builder\n * Handles rendering of Link components with navigation and prefetching\n */\n\nimport { createElement as h } from \"react\";\nimport type { ReactElement } from \"react\";\nimport { navigateTo } from \"../../navigation\";\nimport { pathToString } from \"../../../shared/pathArrayUtils\";\nimport type { ElementRegistry } from \"../../elementRegistry\";\nimport type { PrefetchService } from \"../../services/PrefetchService\";\nimport type { PrefetchStrategy } from \"../../../shared/types/prefetch\";\nimport type { BuilderContext, BuildResult, BuildChildrenContext } from \"./types\";\n\nexport interface LinkBuilderDeps {\n elementRegistry: ElementRegistry;\n prefetchService?: PrefetchService;\n buildChildren: (\n children: unknown,\n ctx: BuildChildrenContext\n ) => BuildResult;\n getEffectiveParentComponentName: (\n componentContext: string | null,\n parentComponentName: string | null\n ) => string | null;\n}\n\n/**\n * Build a Link component (renders as <a> with navigation)\n */\nexport function buildLink(\n props: Record<string, unknown>,\n children: unknown,\n ctx: BuilderContext,\n deps: LinkBuilderDeps\n): ReactElement {\n const {\n key, elementPath, parentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap,\n itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n } = ctx;\n\n const { to, prefetch: prefetchAttr, ...restProps } = props;\n const href = typeof to === 'string' ? to : '#';\n\n // Use effective parent component name for consistency with regular HTML elements\n const effectiveParentComponentName = deps.getEffectiveParentComponentName(componentContext, parentComponentName);\n\n // Navigation click handler\n const navigationOnClick = (e: any) => {\n e.preventDefault();\n if (typeof to === 'string' && to) {\n navigateTo(to);\n }\n };\n\n // Prefetch handlers (only if prefetchService is available and enabled)\n const prefetchHandlers: Record<string, unknown> = {};\n const isInternalLink = href.startsWith('/');\n\n if (deps.prefetchService?.isEnabled() && isInternalLink) {\n const strategy = (prefetchAttr as PrefetchStrategy) || deps.prefetchService.getDefaultStrategy();\n\n if (strategy === 'hover') {\n prefetchHandlers.onMouseEnter = () => deps.prefetchService?.handleHover(href);\n prefetchHandlers.onMouseLeave = () => deps.prefetchService?.handleHoverLeave(href);\n prefetchHandlers.onFocus = () => deps.prefetchService?.handleHover(href);\n prefetchHandlers.onBlur = () => deps.prefetchService?.handleHoverLeave(href);\n } else if (strategy === 'tap') {\n prefetchHandlers.onTouchStart = () => deps.prefetchService?.handleTap(href);\n prefetchHandlers.onMouseDown = () => deps.prefetchService?.handleTap(href);\n }\n // viewport and load strategies are handled via ref callback below\n }\n\n // Build base link props\n const linkProps: Record<string, unknown> = {\n key,\n href,\n // Add data attributes for selection overlay\n 'data-element-path': pathToString(elementPath),\n };\n\n // Add prefetch strategy attribute if specified\n if (prefetchAttr) {\n linkProps['data-prefetch'] = prefetchAttr;\n }\n // Add parent component context\n if (effectiveParentComponentName) {\n linkProps['data-parent-component'] = effectiveParentComponentName;\n }\n // Add current component context (when inside component definition)\n if (componentContext) {\n linkProps['data-component-context'] = componentContext;\n }\n\n // Merge restProps safely\n if (restProps && typeof restProps === 'object') {\n for (const [propKey, propValue] of Object.entries(restProps)) {\n linkProps[propKey] = propValue;\n }\n }\n\n return h('a', {\n ...linkProps as Record<string, any>,\n ref: (el: HTMLElement | null): void => {\n const pathKey = pathToString(elementPath);\n\n // Cleanup when element is removed from DOM\n if (!el) {\n deps.prefetchService?.unobserveLinkByPath(pathKey);\n }\n\n deps.elementRegistry.register(elementPath, el, effectiveParentComponentName, false);\n\n // Handle viewport strategy - observe link when it enters DOM\n if (el && deps.prefetchService?.isEnabled() && isInternalLink) {\n const strategy = (prefetchAttr as PrefetchStrategy) || deps.prefetchService.getDefaultStrategy();\n if (strategy === 'viewport') {\n deps.prefetchService.observeLink(el as HTMLAnchorElement, pathKey);\n }\n }\n },\n onClick: navigationOnClick,\n ...prefetchHandlers,\n style: {\n textDecoration: 'none',\n color: '#0070f3',\n cursor: 'pointer',\n ...(props.style && typeof props.style === 'object' ? props.style : {}),\n }\n }, deps.buildChildren(children, {\n elementPath, parentComponentName: effectiveParentComponentName, viewportWidth, componentContext, componentRootPath,\n locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap, itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps\n }));\n}\n", "/**\n * Navigation utilities for client-side routing\n */\n\n/**\n * Navigate to a path using the history API and dispatch a popstate event\n * This allows the router to handle the navigation\n */\nexport function navigateTo(path: string): void {\n window.history.pushState({}, '', path);\n window.dispatchEvent(new PopStateEvent('popstate'));\n}\n\n/**\n * Create a navigation click handler that prevents default and navigates\n */\nexport function createNavigationHandler(path: string): (e: Event) => void {\n return (e: Event) => {\n e.preventDefault();\n navigateTo(path);\n };\n}\n\n", "/**\n * Component Renderer\n * Provides rendering utilities for pages including error boundaries.\n */\n\nimport { createElement as h } from \"react\";\nimport type { ReactElement } from \"react\";\nimport { ComponentBuilder } from \"./ComponentBuilder\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport type { ComponentNode, I18nConfig, CMSItem } from \"../../shared/types\";\nimport type { TemplateContext } from \"../../shared/types/cms\";\n\n/**\n * Options for rendering a page\n */\nexport interface RenderPageOptions {\n /** Component tree to render (can be a single node, array of nodes, or null) */\n tree: ComponentNode | ComponentNode[] | null;\n /** Current page path (used for error reporting) */\n currentPath: string;\n /** Viewport width in pixels (used for responsive style resolution) */\n viewportWidth: number;\n /** ComponentBuilder instance to use for building React elements */\n componentBuilder: ComponentBuilder;\n /** Current locale for i18n resolution */\n locale?: string;\n /** i18n configuration */\n i18nConfig?: I18nConfig;\n /** CMS context for template interpolation */\n cmsContext?: Record<string, unknown> | null;\n /** CMS locale for i18n field resolution (can override page locale) */\n cmsLocale?: string | null;\n /** Map of collection name to items for CMS List rendering */\n collectionItemsMap?: Record<string, CMSItem[]>;\n /** Template context for nested cms-list item resolution */\n templateContext?: TemplateContext | null;\n}\n\n/**\n * Renders a page with ErrorBoundary\n * \n * This function wraps the component tree in an ErrorBoundary to catch and handle\n * rendering errors gracefully. It also handles null/empty trees by returning null.\n * \n * @param options - Rendering options including tree, path, viewport width, and builder\n * @returns ReactElement representing the rendered page, or null if tree is null\n * \n * @example\n * ```typescript\n * const result = renderPage({\n * tree: pageData.root,\n * currentPath: '/',\n * viewportWidth: 1920,\n * componentBuilder: builder\n * });\n * ```\n */\nexport function renderPage(options: RenderPageOptions): ReactElement | null {\n const { tree, currentPath, viewportWidth, componentBuilder, locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap, templateContext } = options;\n\n if (!tree) return null;\n\n return h(ErrorBoundary, {\n level: 'page',\n onError: (error, errorInfo) => {\n console.error('Page rendering error:', {\n path: currentPath,\n error: error.message,\n stack: error.stack,\n componentStack: errorInfo?.componentStack,\n });\n },\n }, componentBuilder.buildComponent({\n node: tree,\n key: 0,\n customProps: {},\n elementPath: [0],\n parentComponentName: null,\n viewportWidth,\n componentContext: null,\n locale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n templateContext: templateContext ?? null\n }));\n}\n\n\n", "/**\n * Router Component\n * \n * Main router component that handles routing, state management, and rendering.\n * Uses all extracted modules for a clean, modular architecture.\n * \n * Responsibilities:\n * - Route loading and navigation\n * - Component tree state management\n * - SSR hydration detection\n * - HMR integration\n * - Loading and error states\n * - Viewport width tracking for responsive styles\n */\n\nimport { createElement as h, useState, useEffect, useLayoutEffect, useRef, useCallback, useMemo } from \"react\";\nimport type { ReactElement } from \"react\";\nimport { renderPage } from \"../core/ComponentRenderer\";\nimport { RouteLoader } from \"./RouteLoader\";\nimport { detectSSRContent, getInitialLoadingState } from \"../hydration/HydrationUtils\";\nimport { HMRManager } from \"../hmr/HMRManager\";\nimport { createNavigationHandler } from \"../navigation\";\nimport { initializeBreakpoints } from \"../responsiveStyleResolver\";\nimport { elementRegistry } from \"../elementRegistry\";\nimport { InteractiveStylesRegistry } from \"../InteractiveStylesRegistry\";\nimport { UtilityClassCollector } from \"../styles/UtilityClassCollector\";\nimport { initializeClient, setupEventHandlers } from \"../ClientInitializer\";\nimport type { ComponentNode, I18nConfig, PrefetchConfig, CMSItem } from \"../../shared/types\";\nimport { parseLocaleFromPath, setStoredLocale, DEFAULT_I18N_CONFIG } from \"../../shared/i18n\";\nimport { fetchI18nConfig, setI18nConfig as setCachedI18nConfig } from \"../i18nConfigService\";\nimport { IFRAME_MESSAGE_TYPES } from \"../../shared/constants\";\n\n/** SSR-serialized CMS context for client-side hydration */\ninterface SSRCMSContext {\n item: Record<string, unknown>;\n templatePath: string;\n}\n\ndeclare global {\n interface Window {\n __MENO_CMS__?: SSRCMSContext;\n }\n}\n\n/**\n * Router component props\n */\nexport interface RouterProps {\n /**\n * Initial path (optional, defaults to window.location.pathname)\n *\n * @example\n * ```tsx\n * <Router initialPath=\"/about\" />\n * ```\n */\n initialPath?: string;\n\n /**\n * Prefetch configuration for Astro-style link prefetching.\n * Only effective in production builds (disabled by default).\n *\n * @example\n * ```tsx\n * <Router prefetch={{ enabled: true, defaultStrategy: 'hover' }} />\n * ```\n */\n prefetch?: Partial<PrefetchConfig>;\n\n /**\n * Disable script execution (for editor preview mode).\n * When true, component JavaScript will not be executed.\n * Used by the editor to prevent JS from running during editing.\n */\n disableScripts?: boolean;\n}\n\n/**\n * Router Component\n * \n * Main router component that handles client-side routing, page loading, and rendering.\n * Manages component tree state, loading states, and integrates with HMR for hot reloading.\n * \n * Features:\n * - Automatic route loading on path changes\n * - SSR hydration support\n * - Loading state management with previous content preservation\n * - 404 handling with available pages list\n * - Viewport width tracking for responsive styles\n * - HMR integration for development\n * \n * @param props - Router configuration props\n * @returns ReactElement representing the router and current page\n * \n * @example\n * ```tsx\n * // Basic usage\n * <Router />\n * \n * // With custom initial path\n * <Router initialPath=\"/custom\" />\n * ```\n */\nexport function Router(props: RouterProps = {}): ReactElement {\n const { initialPath = window.location.pathname, prefetch, disableScripts = false } = props;\n const hasSSRContent = detectSSRContent();\n\n // Initialize client services (created once on mount)\n const services = useMemo(() => initializeClient({ prefetch }), []);\n\n // Setup event handlers on mount\n useEffect(() => {\n const cleanup = setupEventHandlers(services);\n \n // Cleanup on unmount\n return cleanup;\n }, [services]);\n \n // State management\n const [componentTree, setComponentTree] = useState<ComponentNode | ComponentNode[] | null>(null);\n // Keep previous componentTree to show during transitions\n const [previousComponentTree, setPreviousComponentTree] = useState<ComponentNode | ComponentNode[] | null>(null);\n // Preview component tree (for hover preview from editor - temporarily overrides componentTree)\n const [previewComponentTree, setPreviewComponentTree] = useState<ComponentNode | ComponentNode[] | null>(null);\n // Ref to track current componentTree for closure access (needed for capturing current value in async functions)\n const componentTreeRef = useRef<ComponentNode | ComponentNode[] | null>(null);\n const [loading, setLoading] = useState(getInitialLoadingState(hasSSRContent));\n const [currentPath, setCurrentPath] = useState(initialPath);\n const [availablePages, setAvailablePages] = useState<string[]>([]);\n const [showNotFound, setShowNotFound] = useState(false);\n const [viewportWidth, setViewportWidth] = useState<number>(\n typeof window !== 'undefined' ? window.innerWidth : 1920\n );\n const [i18nConfig, setI18nConfig] = useState<I18nConfig>(DEFAULT_I18N_CONFIG);\n const [currentLocale, setCurrentLocale] = useState<string>(DEFAULT_I18N_CONFIG.defaultLocale);\n const [cmsContext, setCmsContext] = useState<Record<string, unknown> | null>(null);\n const [cmsLocale, setCmsLocale] = useState<string | null>(null);\n const [registryVersion, setRegistryVersion] = useState(0);\n // Don't block rendering waiting for CMS context - render immediately and re-render when context arrives\n const [awaitingCmsContext, setAwaitingCmsContext] = useState(false);\n const [collectionItemsMap, setCollectionItemsMap] = useState<Record<string, CMSItem[]>>({});\n // Store CMS template path for HMR reloads (so we don't lose it after initial load)\n const [cmsTemplatePath, setCmsTemplatePath] = useState<string | null>(null);\n\n // Grace period: skip HMR reloads shortly after receiving committed data via postMessage\n const lastCommitTimestampRef = useRef(0);\n const COMMIT_GRACE_MS = 1000;\n\n // Track if initial mount used SSR CMS context (to skip redundant path-based load)\n const ssrCmsHandledRef = useRef(false);\n // Track if initial load is done (to prevent currentPath effect from firing on mount)\n const initialLoadDoneRef = useRef(false);\n\n // Create RouteLoader instance\n const routeLoader = useRef(new RouteLoader({\n componentRegistry: services.componentRegistry,\n prefetchService: services.prefetchService,\n onLoadStart: () => {\n setLoading(true);\n setShowNotFound(false);\n // Clear interactive styles and utility class registries before new render\n InteractiveStylesRegistry.clear();\n UtilityClassCollector.clear();\n // Save current componentTree as previous before loading\n if (componentTreeRef.current) {\n setPreviousComponentTree(componentTreeRef.current);\n }\n },\n onLoadComplete: (tree) => {\n setComponentTree(tree);\n setLoading(false);\n setShowNotFound(false);\n // Clear previous componentTree now that we have new content\n setPreviousComponentTree(null);\n },\n onLoadError: (error) => {\n setLoading(false);\n setShowNotFound(false);\n setPreviousComponentTree(null);\n },\n onNotFound: () => setShowNotFound(true),\n onPagesLoaded: (pages) => setAvailablePages(pages),\n onLocaleDetected: (locale) => setCurrentLocale(locale),\n })).current;\n\n // Keep ref in sync with state\n useEffect(() => {\n componentTreeRef.current = componentTree;\n }, [componentTree]);\n\n // Initialize breakpoints on mount\n useEffect(() => {\n initializeBreakpoints();\n }, []);\n\n // Load i18n config on mount using shared service\n useEffect(() => {\n fetchI18nConfig().then(config => {\n setI18nConfig(config);\n setCachedI18nConfig(config);\n // Update RouteLoader with i18n config so it can extract locale from paths\n routeLoader.setI18nConfig(config);\n // Extract locale from current path\n const { locale } = parseLocaleFromPath(currentPath, config);\n setCurrentLocale(locale);\n setStoredLocale(locale); // Persist preference\n });\n }, []);\n\n // Update locale when path changes\n useEffect(() => {\n const { locale } = parseLocaleFromPath(currentPath, i18nConfig);\n setCurrentLocale(locale);\n setStoredLocale(locale); // Persist preference\n }, [currentPath, i18nConfig]);\n\n // Listen to viewport resize to update responsive styles\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleResize = () => {\n setViewportWidth(window.innerWidth);\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Listen for CMS context updates from parent window (editor)\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type === IFRAME_MESSAGE_TYPES.CMS_CONTEXT_UPDATE) {\n // Full context update (used for initial load and CMS_CONTEXT_REQUEST responses)\n setCmsContext(event.data.cmsItem);\n setCmsLocale(event.data.locale || null);\n setCollectionItemsMap(event.data.collectionItemsMap || {}); // Store collection items for CMS List rendering\n // Set template path for HMR reloads so loadComponents uses the template\n // path instead of the CMS item URL (which doesn't exist in PageCache)\n if (event.data.templatePath !== undefined) {\n setCmsTemplatePath(event.data.templatePath || null);\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, []);\n\n // Listen for interactive CSS updates from parent window (editor)\n // This allows the editor to send generated interactive styles CSS to the iframe\n // without requiring a full page reload\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type === IFRAME_MESSAGE_TYPES.INTERACTIVE_CSS_UPDATE) {\n const css = event.data.css as string;\n const styleId = 'interactive-styles';\n\n // Remove existing interactive styles tag if it exists\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n // Inject new CSS if provided\n if (css && document.head) {\n const styleTag = document.createElement('style');\n styleTag.id = styleId;\n styleTag.textContent = css;\n document.head.appendChild(styleTag);\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, []);\n\n // Listen for page data preview updates from parent window (editor)\n // Used for component hover preview in the components tab\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type === IFRAME_MESSAGE_TYPES.PAGE_DATA_PREVIEW) {\n // Set preview tree from pageData.root\n const pageData = event.data.pageData;\n if (pageData?.root) {\n setPreviewComponentTree(pageData.root);\n }\n } else if (event.data?.type === IFRAME_MESSAGE_TYPES.PAGE_DATA_PREVIEW_REVERT) {\n // Clear preview tree to revert to normal componentTree\n setPreviewComponentTree(null);\n } else if (event.data?.type === IFRAME_MESSAGE_TYPES.PAGE_DATA_COMMITTED) {\n // Update the real tree with committed editor mutations (instant preview)\n lastCommitTimestampRef.current = Date.now();\n const pageData = event.data.pageData;\n if (pageData?.root) {\n setComponentTree(pageData.root);\n setPreviewComponentTree(null);\n componentTreeRef.current = pageData.root;\n }\n } else if (event.data?.type === IFRAME_MESSAGE_TYPES.COMPONENT_DEFINITION_COMMITTED) {\n lastCommitTimestampRef.current = Date.now();\n const { componentName, definition } = event.data;\n if (componentName && definition) {\n services.componentRegistry.register(componentName, definition);\n setRegistryVersion(v => v + 1);\n }\n }\n };\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [services]);\n\n // Request CMS context from parent when iframe is ready\n // Don't block rendering - just request context and re-render when it arrives\n useEffect(() => {\n if (typeof window === 'undefined') return;\n if (window.parent === window) return; // Not in iframe\n\n window.parent.postMessage({\n type: IFRAME_MESSAGE_TYPES.CMS_CONTEXT_REQUEST\n }, '*');\n }, []);\n\n // Inject CSS before browser paint to prevent FOUC on client-side navigation\n // useLayoutEffect runs synchronously after DOM mutations but before the browser paints\n useLayoutEffect(() => {\n const treeToRender = previewComponentTree || componentTree;\n if (treeToRender) {\n services.styleInjector.inject();\n } else {\n // Clear registry when tree is cleared (no elements to register)\n elementRegistry.clear();\n }\n }, [previewComponentTree, componentTree, services, cmsContext, registryVersion]);\n\n // Post-paint: send interactive styles to parent and execute scripts\n useEffect(() => {\n const treeToRender = previewComponentTree || componentTree;\n if (treeToRender) {\n // Send interactive styles registry to parent (editor) if in iframe\n // Editor will generate CSS and send back via INTERACTIVE_CSS_UPDATE\n if (typeof window !== 'undefined' && window.parent !== window) {\n const registryData = Object.fromEntries(InteractiveStylesRegistry.getAll());\n window.parent.postMessage({\n type: IFRAME_MESSAGE_TYPES.INTERACTIVE_STYLES_UPDATE,\n styles: registryData\n }, '*');\n }\n\n // Wait for React to render before executing JavaScript (unless disabled for editor)\n if (!disableScripts) {\n const timeoutId = setTimeout(() => {\n services.scriptExecutor.execute();\n }, 100);\n\n return () => {\n clearTimeout(timeoutId);\n // Don't clear registry here - ref callbacks handle cleanup when elements unmount\n // Clearing here would remove elements before React unmounts them\n };\n }\n }\n }, [previewComponentTree, componentTree, services, disableScripts, cmsContext, registryVersion]);\n\n // Prefetch all internal links when using 'load' strategy\n useEffect(() => {\n if (!componentTree) return;\n if (!services.prefetchService.isEnabled()) return;\n if (services.prefetchService.getDefaultStrategy() !== 'load') return;\n\n // Delay to let DOM fully render\n const timeoutId = setTimeout(() => {\n const links = document.querySelectorAll('a[href^=\"/\"]');\n links.forEach(link => {\n const href = link.getAttribute('href');\n // Skip current page and empty hrefs\n if (href && href !== currentPath && href !== '#') {\n services.prefetchService.prefetch(href);\n }\n });\n }, 100);\n\n return () => clearTimeout(timeoutId);\n }, [componentTree, currentPath, services]);\n\n // Load components function using RouteLoader\n // For CMS pages, use the stored template path instead of the URL path\n const loadComponents = useCallback(async (path: string) => {\n const pathToLoad = cmsTemplatePath || path;\n await routeLoader.loadComponents(pathToLoad);\n }, [cmsTemplatePath]);\n\n // Grace-aware version for HMR: skip reload if iframe just received committed data via postMessage\n const loadComponentsForHMR = useCallback(async (path: string) => {\n if (Date.now() - lastCommitTimestampRef.current < COMMIT_GRACE_MS) {\n return;\n }\n const pathToLoad = cmsTemplatePath || path;\n await routeLoader.loadComponents(pathToLoad);\n }, [cmsTemplatePath]);\n\n // Ref for loadComponents to avoid recreating effects when cmsTemplatePath changes\n const loadComponentsRef = useRef(loadComponents);\n useEffect(() => { loadComponentsRef.current = loadComponents; }, [loadComponents]);\n\n // Handle CMS HMR updates - fetch updated collection items directly\n // Stable callback - always fetches, lets React handle deduplication via setState\n const handleCMSUpdate = useCallback(async (collection: string) => {\n try {\n const response = await fetch(`/api/cms/${collection}`);\n if (response.ok) {\n const data = await response.json();\n // Using functional update - always merges with latest state\n setCollectionItemsMap(prev => ({ ...prev, [collection]: data.items || [] }));\n }\n } catch (error) {\n // Silently fail - CMS refresh is non-critical\n }\n }, []); // No dependencies - stable callback\n\n // Handle navigation\n useEffect(() => {\n const handlePopState = () => {\n const newPath = window.location.pathname;\n setCurrentPath(newPath);\n setShowNotFound(false); // Reset not found state on navigation\n loadComponentsRef.current(newPath);\n };\n\n window.addEventListener('popstate', handlePopState);\n return () => window.removeEventListener('popstate', handlePopState);\n }, []); // Stable \u2014 uses ref\n\n useEffect(() => {\n // Check for SSR-serialized CMS context (from window.__MENO_CMS__)\n // If present, use the template path instead of the CMS URL to avoid 404\n const ssrCmsContext = window.__MENO_CMS__;\n if (ssrCmsContext) {\n // Set CMS context from SSR\n setCmsContext(ssrCmsContext.item);\n // Store template path for HMR reloads\n setCmsTemplatePath(ssrCmsContext.templatePath);\n // Mark that we're handling SSR CMS (to skip path-based load below)\n ssrCmsHandledRef.current = true;\n // Clear to prevent stale data on SPA navigation\n delete window.__MENO_CMS__;\n }\n\n // Initial load\n routeLoader.loadPages();\n routeLoader.loadGlobalComponents().then(() => {\n // Use template path for CMS pages, otherwise use the current URL path\n const pathToLoad = ssrCmsContext ? ssrCmsContext.templatePath : currentPath;\n loadComponents(pathToLoad);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Only run on mount - currentPath handled by separate effect below\n\n // Reload when path changes\n useEffect(() => {\n // Skip initial mount - handled by mount effect above\n if (!initialLoadDoneRef.current) {\n initialLoadDoneRef.current = true;\n return;\n }\n // Skip if SSR CMS context was just handled (template already loading)\n if (ssrCmsHandledRef.current) {\n ssrCmsHandledRef.current = false;\n return;\n }\n setShowNotFound(false); // Reset not found state when path changes\n loadComponentsRef.current(currentPath);\n }, [currentPath]); // Only react to path changes\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n routeLoader.cancel();\n services.prefetchService.clear();\n };\n }, [services]);\n\n // Render logic: prioritize preview tree, then current tree, then previous tree during loading, then loading/not found states\n // Use preview tree if set (from component hover preview), otherwise use current tree\n const treeToRender = previewComponentTree || componentTree;\n let pageContent: ReactElement | null = null;\n\n if (treeToRender && !awaitingCmsContext) {\n // Show current/preview tree when we have it and CMS context is ready (or not needed)\n pageContent = renderPage({\n tree: treeToRender,\n currentPath,\n viewportWidth,\n componentBuilder: services.componentBuilder,\n locale: currentLocale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n templateContext: null\n });\n } else if (treeToRender && awaitingCmsContext && previousComponentTree) {\n // While waiting for CMS context, show previous tree to avoid blink\n pageContent = renderPage({\n tree: previousComponentTree,\n currentPath,\n viewportWidth,\n componentBuilder: services.componentBuilder,\n locale: currentLocale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n templateContext: null\n });\n } else if (loading || awaitingCmsContext) {\n // Show previous content while loading if available\n if (previousComponentTree) {\n pageContent = renderPage({\n tree: previousComponentTree,\n currentPath,\n viewportWidth,\n componentBuilder: services.componentBuilder,\n locale: currentLocale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n templateContext: null\n });\n } else {\n // Show subtle spinner while loading\n pageContent = h('div', {\n style: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100vh'\n }\n },\n h('style', null, '@keyframes meno-spin { to { transform: rotate(360deg); } }'),\n h('div', {\n style: {\n width: '24px',\n height: '24px',\n border: '2px solid #e5e7eb',\n borderTopColor: '#6b7280',\n borderRadius: '50%',\n animation: 'meno-spin 0.6s linear infinite'\n }\n })\n );\n }\n } else if (showNotFound) {\n pageContent = h('div', { \n style: { \n textAlign: 'center', \n padding: '40px',\n maxWidth: '800px',\n margin: '0 auto'\n } \n }, \n h('h2', null, `Page not found: ${currentPath}`),\n h('p', { style: { marginTop: '16px', marginBottom: '24px', color: '#666' } }, \n 'Available pages:'\n ),\n h('ul', { \n style: { \n listStyle: 'none', \n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n alignItems: 'center'\n } \n }, \n availablePages.map((page, i) => \n h('li', { key: i },\n h('a', {\n href: page,\n onClick: createNavigationHandler(page),\n style: {\n color: '#0070f3',\n textDecoration: 'none',\n fontSize: '18px',\n fontWeight: '600'\n }\n }, page === '/' ? 'Home (/)' : page)\n )\n )\n )\n );\n } else if (previousComponentTree) {\n // Keep previous content visible during timeout (waiting to determine if not found)\n pageContent = renderPage({\n tree: previousComponentTree,\n currentPath,\n viewportWidth,\n componentBuilder: services.componentBuilder,\n locale: currentLocale,\n i18nConfig,\n cmsContext,\n cmsLocale,\n collectionItemsMap,\n templateContext: null\n });\n }\n\n // Fallback: if no content matched, show spinner\n // This prevents empty flash when loading=false but componentTree=null\n if (!pageContent) {\n pageContent = h('div', {\n style: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100vh'\n }\n },\n h('style', null, '@keyframes meno-spin { to { transform: rotate(360deg); } }'),\n h('div', {\n style: {\n width: '24px',\n height: '24px',\n border: '2px solid #e5e7eb',\n borderTopColor: '#6b7280',\n borderRadius: '50%',\n animation: 'meno-spin 0.6s linear infinite'\n }\n })\n );\n }\n\n // Render HMRManager once at the top level with page content\n return h('div', null,\n h(HMRManager, {\n onReload: loadComponentsForHMR,\n onCMSUpdate: handleCMSUpdate,\n currentPath: currentPath,\n }),\n pageContent\n );\n}\n\n", "/**\n * Route Loader\n * Handles loading of pages, components, and manages race conditions\n */\n\nimport { API_ROUTES, NOT_FOUND_TIMEOUT_MS } from '../../shared/constants';\nimport type { ComponentRegistry } from '../componentRegistry';\nimport type { ComponentNode, I18nConfig, JSONPage } from '../../shared/types';\nimport { validatePageData } from '../../shared/validation/validators';\nimport { parseLocaleFromPath, DEFAULT_I18N_CONFIG } from '../../shared/i18n';\nimport type { PrefetchService } from '../services/PrefetchService';\nimport { logNetworkError } from '../../shared/errorLogger';\n\nexport interface RouteLoaderConfig {\n componentRegistry: ComponentRegistry;\n /** Optional prefetch service for cache integration */\n prefetchService?: PrefetchService;\n onLoadStart?: () => void;\n onLoadComplete?: (tree: ComponentNode | ComponentNode[] | null) => void;\n onLoadError?: (error: Error, errorTree?: ComponentNode) => void;\n onNotFound?: () => void;\n onPagesLoaded?: (pages: string[]) => void;\n onLocaleDetected?: (locale: string) => void;\n}\n\nexport class RouteLoader {\n private abortController: AbortController | null = null;\n private notFoundTimeout: NodeJS.Timeout | null = null;\n private config: RouteLoaderConfig;\n private isCancelled: boolean = false;\n private i18nConfig: I18nConfig = DEFAULT_I18N_CONFIG;\n private prefetchService?: PrefetchService;\n\n constructor(config: RouteLoaderConfig) {\n this.config = config;\n this.prefetchService = config.prefetchService;\n }\n\n /**\n * Update i18n configuration\n */\n setI18nConfig(config: I18nConfig): void {\n this.i18nConfig = config;\n }\n\n /**\n * Load global components (shared across all pages)\n * @param signal Optional abort signal to cancel the request\n */\n async loadGlobalComponents(signal?: AbortSignal): Promise<void> {\n try {\n const fetchOptions: RequestInit = { cache: 'no-store' };\n if (signal) {\n fetchOptions.signal = signal;\n }\n\n const response = await fetch(API_ROUTES.COMPONENTS, fetchOptions);\n \n // Check if aborted after fetch\n if (signal?.aborted) {\n return;\n }\n\n const globalComps = await response.json();\n\n // Check again if aborted after JSON parse\n if (signal?.aborted) {\n return;\n }\n\n if (Object.keys(globalComps).length > 0) {\n // Merge global components into registry (page-specific components will override)\n this.config.componentRegistry.merge(globalComps);\n // JavaScript will be executed via useEffect after componentTree renders\n }\n } catch (error) {\n // Ignore abort errors\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n // Continue anyway - components might still work with cached/previous registry state\n }\n }\n\n /**\n * Load available pages list\n */\n async loadPages(): Promise<string[]> {\n try {\n const response = await fetch(API_ROUTES.PAGES);\n const data = await response.json();\n const pages = (data.pages || []).map((p: unknown) =>\n typeof p === 'string' ? p : (p as { path: string }).path\n );\n \n if (this.config.onPagesLoaded) {\n this.config.onPagesLoaded(pages);\n }\n\n return pages;\n } catch (e) {\n logNetworkError('RouteLoader.loadPages', e);\n return [];\n }\n }\n\n /**\n * Load JSON components for current page\n */\n async loadComponents(path: string): Promise<ComponentNode | ComponentNode[] | null> {\n // Cancel any previous loading request\n if (this.abortController) {\n this.abortController.abort();\n }\n\n // Clear any pending \"not found\" timeout\n this.clearNotFoundTimeout();\n\n // Reset cancelled flag\n this.isCancelled = false;\n\n // Create new abort controller for this request\n const abortController = new AbortController();\n this.abortController = abortController;\n\n try {\n // Set loading state and reset showNotFound\n if (this.config.onLoadStart && !this.isCancelled) {\n this.config.onLoadStart();\n }\n\n // Reload global components first (with abort signal)\n await this.loadGlobalComponents(abortController.signal);\n\n // Check if request was aborted\n if (abortController.signal.aborted || this.isCancelled) {\n return null;\n }\n\n // Parse locale from path (e.g., /pl/about -> locale: 'pl', path: '/about')\n const { locale, pathWithoutLocale } = parseLocaleFromPath(path, this.i18nConfig);\n\n // Notify about detected locale\n if (this.config.onLocaleDetected && !this.isCancelled) {\n this.config.onLocaleDetected(locale);\n }\n\n // Check prefetch cache first for instant navigation\n const cached = this.prefetchService?.getFromCache(pathWithoutLocale);\n if (cached) {\n let tree: ComponentNode | ComponentNode[] | null = null;\n const parsed = cached.data as JSONPage;\n\n if (parsed.components) {\n this.config.componentRegistry.merge(parsed.components);\n tree = parsed.root || (parsed as unknown as ComponentNode | ComponentNode[]);\n } else if (parsed.root) {\n tree = parsed.root;\n } else {\n tree = parsed as unknown as ComponentNode | ComponentNode[];\n }\n\n if (this.config.onLoadComplete && !this.isCancelled) {\n this.config.onLoadComplete(tree);\n }\n\n this.clearNotFoundTimeout();\n this.abortController = null;\n return tree;\n }\n\n const response = await fetch(`${API_ROUTES.PAGE_CONTENT}?page=${encodeURIComponent(pathWithoutLocale)}`, {\n cache: 'no-store',\n signal: abortController.signal,\n });\n\n // Check again if aborted (after fetch completes)\n if (abortController.signal.aborted || this.isCancelled) {\n return null;\n }\n\n if (!response.ok) {\n \n if (this.config.onLoadComplete && !this.isCancelled) {\n this.config.onLoadComplete(null);\n }\n\n // Delay showing \"not found\" to prevent flash\n // Only set timeout if not cancelled\n if (!this.isCancelled) {\n this.notFoundTimeout = setTimeout(() => {\n // Check again before calling callback (component might have unmounted)\n if (!this.isCancelled && this.config.onNotFound) {\n this.config.onNotFound();\n }\n this.notFoundTimeout = null;\n }, NOT_FOUND_TIMEOUT_MS);\n }\n \n return null;\n }\n\n const jsonText = await response.text();\n\n // Check if aborted after text extraction\n if (abortController.signal.aborted || this.isCancelled) {\n return null;\n }\n\n let parsed;\n try {\n parsed = JSON.parse(jsonText);\n \n // Validate page data (logs warnings but doesn't fail - graceful degradation)\n const validationResult = validatePageData(parsed);\n if (!validationResult.valid) {\n console.warn(`[RouteLoader] Page validation failed for ${path}:`,\n validationResult.errors.map(e => `${e.path}: ${e.message}`).join('; '));\n }\n // Use validated data if available, otherwise use parsed (graceful degradation)\n parsed = validationResult.valid ? validationResult.data : parsed;\n } catch (parseError) {\n // Set an error tree to trigger error boundary\n const errorTree = this.createErrorTree(\n 'Invalid JSON format',\n `Failed to parse JSON for page: ${path}`,\n String(parseError)\n );\n \n if (this.config.onLoadComplete && !this.isCancelled) {\n this.config.onLoadComplete(errorTree);\n }\n \n if (this.config.onLoadError && !this.isCancelled) {\n this.config.onLoadError(\n parseError instanceof Error ? parseError : new Error(String(parseError)),\n errorTree\n );\n }\n \n return errorTree;\n }\n\n // Check if JSON has components section (page-specific components)\n let tree: ComponentNode | ComponentNode[] | null = null;\n \n if (parsed.components) {\n // Merge page-specific components with global (page-specific override global)\n try {\n this.config.componentRegistry.merge(parsed.components);\n // JavaScript will be executed via useEffect after componentTree renders\n } catch (componentError) {\n }\n tree = parsed.root || parsed;\n } else if (parsed.root) {\n // Has root property but no components section - use only global components\n tree = parsed.root;\n // JavaScript will be executed via useEffect after componentTree renders\n } else {\n // Legacy format - direct component tree\n tree = parsed;\n // JavaScript will be executed via useEffect after componentTree renders\n }\n\n // Check one more time if aborted\n if (abortController.signal.aborted || this.isCancelled) {\n return null;\n }\n\n if (this.config.onLoadComplete && !this.isCancelled) {\n this.config.onLoadComplete(tree);\n }\n\n this.clearNotFoundTimeout();\n this.abortController = null;\n \n return tree;\n } catch (error) {\n // Ignore abort errors\n if (error instanceof Error && error.name === 'AbortError') {\n return null;\n }\n\n // Check if aborted before handling error\n if (abortController.signal.aborted || this.isCancelled) {\n return null;\n }\n\n // Set a generic error tree\n const errorTree = this.createErrorTree('Error loading page', String(error));\n \n if (this.config.onLoadComplete && !this.isCancelled) {\n this.config.onLoadComplete(errorTree);\n }\n \n if (this.config.onLoadError && !this.isCancelled) {\n this.config.onLoadError(\n error instanceof Error ? error : new Error(String(error)),\n errorTree\n );\n }\n\n this.clearNotFoundTimeout();\n this.abortController = null;\n \n return errorTree;\n }\n }\n\n /**\n * Cancel current loading request\n */\n cancel(): void {\n this.isCancelled = true;\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n this.clearNotFoundTimeout();\n }\n\n /**\n * Create error tree ComponentNode structure\n */\n private createErrorTree(\n title: string,\n message: string,\n details?: string\n ): ComponentNode {\n const children: ComponentNode[] = [\n {\n type: 'node',\n tag: 'h2',\n style: { color: '#c00' },\n children: [title],\n },\n {\n type: 'node',\n tag: 'p',\n style: { color: '#666', marginTop: '16px' },\n children: [message],\n },\n ];\n\n if (details) {\n children.push({\n type: 'node',\n tag: 'pre',\n style: {\n background: '#f5f5f5',\n padding: '16px',\n borderRadius: '4px',\n textAlign: 'left',\n maxWidth: '600px',\n margin: '16px auto',\n overflow: 'auto',\n },\n children: [details],\n });\n }\n\n return {\n type: 'node',\n tag: 'div',\n style: { padding: '40px', textAlign: 'center' },\n children,\n };\n }\n\n /**\n * Clear not found timeout\n */\n private clearNotFoundTimeout(): void {\n if (this.notFoundTimeout) {\n clearTimeout(this.notFoundTimeout);\n this.notFoundTimeout = null;\n }\n }\n}\n\n", "/**\n * Hydration Utilities\n * Provides utilities for detecting SSR content and managing hydration state.\n */\n\n/**\n * Detects if server-side rendered content exists in the DOM.\n * Checks if the root element has children, which indicates SSR rendered content.\n * \n * @returns true if SSR content is detected, false otherwise\n */\nexport function detectSSRContent(): boolean {\n // Check if we're in a browser environment\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return false;\n }\n\n const rootElement = document.getElementById('root');\n \n // SSR content exists if root element has children\n return rootElement !== null && rootElement.children.length > 0;\n}\n\n/**\n * Determines the initial loading state based on SSR content presence.\n * \n * @param hasSSRContent - Whether SSR content was detected\n * @returns false if SSR content exists (for smooth hydration), true otherwise\n */\nexport function getInitialLoadingState(hasSSRContent: boolean): boolean {\n // If SSR content exists, start with loading=false for smooth hydration\n // If no SSR content, start with loading=true to show loading state\n return !hasSSRContent;\n}\n\n", "/**\n * HMR Manager\n * Manages Hot Module Replacement WebSocket connection, status tracking, and visual indicators.\n */\n\nimport { createElement as h, useState, useEffect, useRef } from \"react\";\nimport type { ReactElement } from \"react\";\nimport { HMRWebSocket } from \"../hmrWebSocket\";\n\nexport interface HMRManagerProps {\n /**\n * Callback when HMR update is received\n * @param path - Path of the updated file ('all' for global updates)\n */\n onUpdate?: (path: string) => void;\n\n /**\n * Callback when WebSocket status changes\n * @param status - Current connection status\n */\n onStatusChange?: (status: 'connecting' | 'connected' | 'disconnected' | 'error') => void;\n\n /**\n * Current path for determining if update should trigger reload\n */\n currentPath?: string;\n\n /**\n * Function to reload components for a given path\n */\n onReload?: (path: string) => void;\n\n /**\n * Callback when CMS content update is received\n * @param collection - Collection that was updated\n */\n onCMSUpdate?: (collection: string) => void;\n}\n\n/**\n * HMR Manager component\n * Manages WebSocket connection lifecycle and renders HMR indicators\n */\nexport function HMRManager({\n onUpdate,\n onStatusChange,\n currentPath = typeof window !== 'undefined' ? window.location.pathname : '/',\n onReload,\n onCMSUpdate\n}: HMRManagerProps): ReactElement | null {\n const [status, setStatus] = useState<'connecting' | 'connected' | 'disconnected' | 'error'>('connecting');\n\n // Track callbacks via refs to avoid stale closures and prevent WebSocket recreation\n const currentPathRef = useRef(currentPath);\n const onCMSUpdateRef = useRef(onCMSUpdate);\n const onReloadRef = useRef(onReload);\n\n useEffect(() => {\n currentPathRef.current = currentPath;\n }, [currentPath]);\n\n useEffect(() => {\n onCMSUpdateRef.current = onCMSUpdate;\n }, [onCMSUpdate]);\n\n useEffect(() => { onReloadRef.current = onReload; }, [onReload]);\n\n // Define message handler - reads from refs to always get latest values\n const createMessageHandler = () => (data: any) => {\n if (data.type === 'hmr:update') {\n // Always use current path (preserves locale) when reloading\n // The HMR path tells us which page changed, but we reload with current locale\n if (onReloadRef.current) {\n onReloadRef.current(currentPathRef.current);\n }\n\n // Call update callback with the original HMR path\n if (onUpdate) {\n onUpdate(data.path);\n }\n } else if (data.type === 'hmr:cms-update') {\n // Call CMS update callback via ref (avoids stale closure)\n if (onCMSUpdateRef.current && data.collection) {\n onCMSUpdateRef.current(data.collection);\n }\n } else if (data.type === 'hmr:colors-update') {\n // Dispatch custom event to notify color hooks of the update\n document.dispatchEvent(new CustomEvent('hmr-colors-update'));\n } else if (data.type === 'hmr:variables-update') {\n // Dispatch custom event to notify variable hooks of the update\n document.dispatchEvent(new CustomEvent('hmr-variables-update'));\n } else if (data.type === 'hmr:fonts-update') {\n // Dispatch custom event to notify font CSS injection\n document.dispatchEvent(new CustomEvent('hmr-fonts-update'));\n } else if (data.type === 'hmr:libraries-update') {\n // Dispatch custom event to trigger full page reload for library changes\n document.dispatchEvent(new CustomEvent('hmr-libraries-update'));\n }\n };\n\n // Define status handler\n const createStatusHandler = () => (newStatus: 'connecting' | 'connected' | 'disconnected' | 'error') => {\n setStatus(newStatus);\n if (onStatusChange) {\n onStatusChange(newStatus);\n }\n };\n\n // WebSocket setup and management\n useEffect(() => {\n // WebSocket URL construction\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${protocol}//${window.location.host}/hmr`;\n\n // Reuse existing connection if available (for HMR)\n let hmrWs: HMRWebSocket;\n\n if (import.meta.hot?.data.hmrWs) {\n hmrWs = import.meta.hot.data.hmrWs;\n // CRITICAL: Update handlers with fresh closures that reference current refs\n // Without this, reused WebSocket would have stale refs from previous component instance\n hmrWs.setMessageHandler(createMessageHandler());\n hmrWs.setStatusChangeHandler(createStatusHandler());\n } else {\n hmrWs = new HMRWebSocket({\n url: wsUrl,\n onMessage: createMessageHandler(),\n onStatusChange: createStatusHandler(),\n maxReconnectAttempts: 10,\n initialReconnectDelay: 1000,\n maxReconnectDelay: 30000,\n heartbeatInterval: 15000,\n });\n\n if (import.meta.hot) {\n import.meta.hot.data.hmrWs = hmrWs;\n }\n }\n\n // Cleanup on unmount (but not on HMR)\n return () => {\n // Don't close the WebSocket on HMR, it will be reused\n if (!import.meta.hot) {\n hmrWs.close();\n }\n };\n }, [onUpdate, onStatusChange]);\n\n // Bun HMR API integration\n useEffect(() => {\n if (import.meta.hot) {\n import.meta.hot.accept();\n \n import.meta.hot.on('bun:beforeUpdate', () => {\n // HMR update starting\n });\n \n import.meta.hot.on('bun:afterUpdate', () => {\n // HMR update complete\n });\n \n import.meta.hot.on('bun:error', () => {\n });\n }\n }, []);\n\n // Render indicators\n return h(HMRIndicator, { status });\n}\n\n/**\n * HMR indicator component\n * Shows WebSocket connection status\n */\nexport function HMRIndicator({ status }: { status: 'connecting' | 'connected' | 'disconnected' | 'error' }) {\n const statusConfig = {\n connecting: { bg: '#f59e0b', text: '\uD83D\uDD04 Connecting...', show: true },\n connected: { bg: '#10b981', text: '\u2705 Connected', show: false },\n disconnected: { bg: '#ef4444', text: '\u26A0\uFE0F Disconnected - Reconnecting...', show: false },\n error: { bg: '#dc2626', text: '\u274C Connection Failed - Refresh Page', show: true },\n };\n\n const config = statusConfig[status];\n\n return h('div', {\n id: 'hmr-indicator',\n style: {\n position: 'fixed',\n top: '20px',\n right: '20px',\n background: config.bg,\n color: 'white',\n padding: '12px 20px',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: '600',\n display: config.show ? 'block' : 'none',\n boxShadow: `0 4px 12px ${config.bg}40`,\n animation: 'slideIn 0.3s ease-out',\n zIndex: 9999,\n transition: 'all 0.3s ease',\n }\n }, config.text);\n}\n\n", "/**\n * Resilient HMR WebSocket Client\n * Handles automatic reconnection with exponential backoff\n */\n\nimport { logRuntimeError } from '../shared/errorLogger';\n\nexport interface HMRWebSocketConfig {\n url: string;\n onMessage: (data: any) => void;\n onStatusChange?: (status: 'connecting' | 'connected' | 'disconnected' | 'error') => void;\n maxReconnectAttempts?: number;\n initialReconnectDelay?: number;\n maxReconnectDelay?: number;\n heartbeatInterval?: number;\n}\n\nexport class HMRWebSocket {\n private ws: WebSocket | null = null;\n private config: Required<HMRWebSocketConfig>;\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private lastPongTime = 0;\n private isIntentionallyClosed = false;\n private messageQueue: any[] = [];\n\n constructor(config: HMRWebSocketConfig) {\n this.config = {\n maxReconnectAttempts: 10,\n initialReconnectDelay: 1000,\n maxReconnectDelay: 30000,\n heartbeatInterval: 15000,\n onStatusChange: () => {},\n ...config,\n };\n\n // Listen for online/offline events\n window.addEventListener('online', () => this.handleOnline());\n window.addEventListener('offline', () => this.handleOffline());\n\n // Listen for visibility change (tab becomes visible)\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n this.checkConnection();\n }\n });\n\n this.connect();\n }\n\n private connect(): void {\n if (this.ws?.readyState === WebSocket.OPEN || this.ws?.readyState === WebSocket.CONNECTING) {\n return;\n }\n\n this.isIntentionallyClosed = false;\n this.config.onStatusChange('connecting');\n \n\n try {\n this.ws = new WebSocket(this.config.url);\n \n this.ws.onopen = () => this.handleOpen();\n this.ws.onmessage = (event) => this.handleMessage(event);\n this.ws.onerror = (error) => this.handleError(error);\n this.ws.onclose = (event) => this.handleClose(event);\n \n } catch (error) {\n this.scheduleReconnect();\n }\n }\n\n private handleOpen(): void {\n this.reconnectAttempts = 0;\n this.config.onStatusChange('connected');\n \n // Start heartbeat\n this.startHeartbeat();\n \n // Flush queued messages\n this.flushMessageQueue();\n }\n\n private handleMessage(event: MessageEvent): void {\n try {\n // Check if this is a pong response\n if (event.data === 'pong') {\n this.lastPongTime = Date.now();\n return;\n }\n\n const data = JSON.parse(event.data);\n this.config.onMessage(data);\n } catch (e) {\n logRuntimeError('hmrWebSocket.handleMessage', e);\n }\n }\n\n private handleError(error: Event): void {\n this.config.onStatusChange('error');\n }\n\n private handleClose(event: CloseEvent): void {\n \n this.stopHeartbeat();\n \n if (!this.isIntentionallyClosed) {\n this.config.onStatusChange('disconnected');\n this.scheduleReconnect();\n }\n }\n\n private handleOnline(): void {\n this.reconnectAttempts = 0; // Reset attempts on network restore\n this.connect();\n }\n\n private handleOffline(): void {\n this.config.onStatusChange('disconnected');\n }\n\n private checkConnection(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.connect();\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n this.config.onStatusChange('error');\n return;\n }\n\n // Exponential backoff with jitter\n const delay = Math.min(\n this.config.initialReconnectDelay * Math.pow(2, this.reconnectAttempts),\n this.config.maxReconnectDelay\n );\n \n // Add jitter (\u00B125%)\n const jitter = delay * 0.25 * (Math.random() - 0.5);\n const finalDelay = Math.max(delay + jitter, 100);\n\n \n this.reconnectTimeout = setTimeout(() => {\n this.reconnectAttempts++;\n this.connect();\n }, finalDelay);\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.lastPongTime = Date.now();\n\n this.heartbeatInterval = setInterval(() => {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.stopHeartbeat();\n return;\n }\n\n // Check if we got a pong recently\n const timeSinceLastPong = Date.now() - this.lastPongTime;\n if (timeSinceLastPong > this.config.heartbeatInterval * 2) {\n this.ws.close();\n return;\n }\n\n // Send ping\n try {\n this.ws.send(JSON.stringify({ type: 'ping' }));\n } catch (e) {\n logRuntimeError('hmrWebSocket.sendPing', e);\n }\n }, this.config.heartbeatInterval);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n private flushMessageQueue(): void {\n while (this.messageQueue.length > 0 && this.ws?.readyState === WebSocket.OPEN) {\n const message = this.messageQueue.shift();\n this.send(message);\n }\n }\n\n /**\n * Send a message (queues if disconnected)\n */\n send(data: any): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(typeof data === 'string' ? data : JSON.stringify(data));\n } else {\n this.messageQueue.push(data);\n }\n }\n\n /**\n * Get current connection status\n */\n getStatus(): 'connecting' | 'connected' | 'disconnected' | 'closed' {\n if (!this.ws) return 'disconnected';\n \n switch (this.ws.readyState) {\n case WebSocket.CONNECTING:\n return 'connecting';\n case WebSocket.OPEN:\n return 'connected';\n case WebSocket.CLOSING:\n case WebSocket.CLOSED:\n return 'disconnected';\n default:\n return 'disconnected';\n }\n }\n\n /**\n * Manually close the connection (won't auto-reconnect)\n */\n close(): void {\n this.isIntentionallyClosed = true;\n this.stopHeartbeat();\n \n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n window.removeEventListener('online', () => this.handleOnline());\n window.removeEventListener('offline', () => this.handleOffline());\n }\n\n /**\n * Manually trigger a reconnection\n */\n reconnect(): void {\n this.reconnectAttempts = 0;\n if (this.ws) {\n this.ws.close();\n }\n this.connect();\n }\n\n /**\n * Update the message handler (useful when reusing WebSocket across HMR)\n * This ensures the handler closure has fresh references after component remount\n */\n setMessageHandler(handler: (data: any) => void): void {\n this.config.onMessage = handler;\n }\n\n /**\n * Update the status change handler (useful when reusing WebSocket across HMR)\n */\n setStatusChangeHandler(handler: (status: 'connecting' | 'connected' | 'disconnected' | 'error') => void): void {\n this.config.onStatusChange = handler;\n }\n}\n\n", "/**\n * Element Registry (Core Stub)\n * Minimal implementation for non-editor use cases.\n * For full functionality, use @meno/studio's ElementRegistry.\n *\n * This stub provides no-op implementations since element tracking\n * is only needed in the editor context.\n */\n\nimport type { Path } from '../shared/pathArrayUtils';\n\nexport interface ElementMetadata {\n isComponentRoot: boolean;\n parentComponentName: string | null;\n componentContext: string | null;\n props?: Record<string, unknown>;\n}\n\n/**\n * Minimal ElementRegistry for non-editor use\n * All methods are no-ops since element tracking is editor-only\n */\nexport class ElementRegistry {\n register(\n _path: Path | string,\n _element: HTMLElement | null,\n _componentName?: string | null,\n _isComponentRoot?: boolean,\n _props?: Record<string, unknown>,\n _metadata?: Partial<ElementMetadata>\n ): void {\n // No-op in core - element tracking is editor-only\n }\n\n get(_path: Path | string): HTMLElement | null {\n return null;\n }\n\n getMetadata(_path: Path | string): ElementMetadata | null {\n return null;\n }\n\n getAllByComponent(_componentName: string): HTMLElement[] {\n return [];\n }\n\n findComponentRootPath(_elementPath: Path | string, _parentComponentName: string): Path | null {\n return null;\n }\n\n getAllComponentNames(): string[] {\n return [];\n }\n\n getComponentRootPaths(_componentName: string): Path[] {\n return [];\n }\n\n getComponentRoots(_componentName: string): HTMLElement[] {\n return [];\n }\n\n getComponentProps(_path: Path | string): Record<string, unknown> | null {\n return null;\n }\n\n isComponentRoot(_path: Path | string): boolean {\n return false;\n }\n\n clear(): void {\n // No-op\n }\n\n getAllPaths(): Path[] {\n return [];\n }\n\n // CMS List item methods (no-op in core)\n registerCMSItem(\n _path: Path | string,\n _itemIndex: number,\n _element: HTMLElement | null,\n _metadata?: Partial<ElementMetadata>\n ): void {\n // No-op in core - element tracking is editor-only\n }\n\n getCMSItem(_path: Path | string, _itemIndex: number): HTMLElement | null {\n return null;\n }\n\n getCMSItemMetadata(_path: Path | string, _itemIndex: number): ElementMetadata | null {\n return null;\n }\n}\n\n// Mutable singleton instance - can be replaced by editor\nlet _elementRegistry: ElementRegistry = new ElementRegistry();\n\n/**\n * Get the current ElementRegistry instance\n * Returns the default stub in core, or the real implementation if set by studio\n */\nexport const elementRegistry: ElementRegistry = new Proxy({} as ElementRegistry, {\n get(_target, prop) {\n return (_elementRegistry as any)[prop];\n }\n});\n\n/**\n * Replace the ElementRegistry instance\n * Used by @meno/studio to inject the real implementation\n */\nexport function setElementRegistry(registry: ElementRegistry): void {\n _elementRegistry = registry;\n}\n", "/**\n * Component Registry\n * Manages registration and retrieval of custom components\n * \n * This now extends the base registry for consistency across client and SSR\n */\n\nimport { BaseComponentRegistry } from '../shared/registry/ComponentRegistry';\nimport type { ComponentDefinition } from '../shared/types';\n\nexport class ComponentRegistry extends BaseComponentRegistry {\n // Client-specific methods can be added here\n // For now, it uses all functionality from BaseComponentRegistry\n}\n\n// Export a singleton instance for convenience\nexport const globalComponentRegistry = new ComponentRegistry();\n\n", "/**\n * Style Injector\n * Handles CSS injection from component definitions into the page\n * Supports template processing for per-instance CSS\n * Unified with server-side CSS generation for consistency\n *\n * Utility CSS is injected eagerly by UtilityClassCollector during React render,\n * eliminating FOUC. This module handles component CSS and interactive styles.\n */\n\nimport type { ComponentRegistry } from '../componentRegistry';\nimport type { ElementRegistry } from '../elementRegistry';\nimport { hasTemplates, processCodeTemplates } from '../templateEngine';\nimport { generateAllInteractiveCSS } from '../../shared/cssGeneration';\nimport { getCachedBreakpointConfig } from '../responsiveStyleResolver';\nimport { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';\nimport { InteractiveStylesRegistry } from '../InteractiveStylesRegistry';\nimport { UtilityClassCollector } from './UtilityClassCollector';\nimport { logRuntimeError } from '../../shared/errorLogger';\n\nexport interface StyleInjectorConfig {\n componentRegistry: ComponentRegistry;\n elementRegistry: ElementRegistry;\n styleId?: string; // Default: 'component-css'\n /** Skip interactive CSS generation (e.g., when editor manages it via postMessage) */\n skipInteractiveCSS?: boolean;\n}\n\n/**\n * Simple string hash for change detection.\n * Not cryptographic - just for fast equality checks.\n */\nfunction simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0; // Convert to 32-bit integer\n }\n return hash;\n}\n\n/**\n * StyleInjector manages CSS injection from components into the page DOM\n *\n * Features:\n * - Collects CSS from all registered components (hashed for change detection)\n * - Processes templates per component instance when needed\n * - Manages separate style tags: component-css, interactive-styles\n * - Utility CSS is handled eagerly by UtilityClassCollector during render\n */\nexport class StyleInjector {\n private componentRegistry: ComponentRegistry;\n private elementRegistry: ElementRegistry;\n private styleId: string;\n private skipInteractiveCSS: boolean;\n\n /** Hash of previously injected component CSS (for change detection) */\n private previousComponentCSSHash: number = 0;\n\n constructor(config: StyleInjectorConfig) {\n this.componentRegistry = config.componentRegistry;\n this.elementRegistry = config.elementRegistry;\n this.styleId = config.styleId || 'component-css';\n this.skipInteractiveCSS = config.skipInteractiveCSS ?? false;\n }\n\n /**\n * Inject CSS from all registered components into the page.\n * Processes templates per component instance if needed.\n * Note: utility CSS is injected eagerly during render by UtilityClassCollector.\n */\n inject(): void {\n try {\n this.injectComponentCSS();\n\n // Generate and inject interactive styles CSS in a separate style tag\n // Skip if managed externally (e.g., editor sends CSS via postMessage)\n if (!this.skipInteractiveCSS) {\n this.injectInteractiveCSS();\n }\n } catch (e) {\n logRuntimeError('StyleInjector.inject', e);\n }\n }\n\n /**\n * Inject component CSS (from component definitions with optional template processing).\n * Uses hash comparison to skip updates when CSS hasn't changed.\n * Updates textContent in-place instead of remove+recreate.\n */\n private injectComponentCSS(): void {\n const allComponents = this.componentRegistry.getAll();\n const processedCSSBlocks: string[] = [];\n\n // Collect CSS from all components and process templates per instance\n for (const [name, component] of Object.entries(allComponents)) {\n if (component?.component?.css) {\n const originalCSS = component.component.css;\n\n // Check if CSS contains templates\n if (hasTemplates(originalCSS)) {\n const componentRootPaths = this.elementRegistry.getComponentRootPaths(name);\n\n for (const rootPath of componentRootPaths) {\n try {\n const props = this.elementRegistry.getComponentProps(rootPath);\n if (props) {\n const processedCSS = processCodeTemplates(originalCSS, props);\n processedCSSBlocks.push(`/* Component: ${name} (instance) */\\n${processedCSS}`);\n }\n } catch (error) {\n processedCSSBlocks.push(`/* Component: ${name} */\\n${originalCSS}`);\n }\n }\n } else {\n processedCSSBlocks.push(`/* Component: ${name} */\\n${originalCSS}`);\n }\n }\n }\n\n if (processedCSSBlocks.length === 0) return;\n\n const combinedCSS = processedCSSBlocks.join('\\n\\n');\n const hash = simpleHash(combinedCSS);\n\n // Skip if component CSS hasn't changed\n if (hash === this.previousComponentCSSHash) return;\n this.previousComponentCSSHash = hash;\n\n // Update textContent in-place if tag exists, otherwise create\n if (document.head) {\n let styleTag = document.getElementById(this.styleId) as HTMLStyleElement | null;\n if (!styleTag) {\n styleTag = document.createElement('style');\n styleTag.id = this.styleId;\n document.head.appendChild(styleTag);\n }\n styleTag.textContent = combinedCSS;\n }\n }\n\n /**\n * Generate and inject interactive styles CSS from InteractiveStylesRegistry.\n * Registry is populated by ComponentBuilder during rendering.\n */\n private injectInteractiveCSS(): void {\n try {\n const interactiveStylesMap = InteractiveStylesRegistry.getAll();\n const interactiveStyleId = 'interactive-styles';\n\n if (interactiveStylesMap.size === 0) return;\n\n const breakpointConfig = getCachedBreakpointConfig() || DEFAULT_BREAKPOINTS;\n const interactiveCSS = generateAllInteractiveCSS(interactiveStylesMap, breakpointConfig);\n if (!interactiveCSS) return;\n\n if (document.head) {\n let styleTag = document.getElementById(interactiveStyleId) as HTMLStyleElement | null;\n if (!styleTag) {\n styleTag = document.createElement('style');\n styleTag.id = interactiveStyleId;\n document.head.appendChild(styleTag);\n }\n styleTag.textContent = interactiveCSS;\n }\n } catch (e) {\n logRuntimeError('StyleInjector.injectInteractiveCSS', e);\n }\n }\n\n /**\n * Remove the injected style tags and reset incremental state\n */\n clear(): void {\n const existingStyle = document.getElementById(this.styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n const existingInteractiveStyle = document.getElementById('interactive-styles');\n if (existingInteractiveStyle) {\n existingInteractiveStyle.remove();\n }\n // Full teardown: clears injectedClasses tracking and removes utility-css tag\n UtilityClassCollector.destroy();\n this.previousComponentCSSHash = 0;\n }\n\n /**\n * Check if style tag exists in DOM\n */\n exists(): boolean {\n return document.getElementById(this.styleId) !== null;\n }\n}\n", "/**\n * Script Executor\n * Handles JavaScript execution from component definitions\n * Supports template processing for per-instance JavaScript execution\n * Supports defineVars for Astro-style prop injection\n */\n\nimport type { ComponentRegistry } from '../componentRegistry';\nimport type { ElementRegistry } from '../elementRegistry';\nimport type { PropDefinition } from '../../shared/types';\nimport { hasTemplates, processCodeTemplates } from '../templateEngine';\nimport { logRuntimeError } from '../../shared/errorLogger';\n\nexport interface ScriptExecutorConfig {\n componentRegistry: ComponentRegistry;\n elementRegistry: ElementRegistry;\n}\n\n/**\n * Generate destructure statement for defineVars\n */\nfunction generateDestructure(\n defineVars: true | string[],\n interfaceDef?: Record<string, PropDefinition>\n): string {\n const vars = defineVars === true\n ? Object.keys(interfaceDef || {})\n : defineVars;\n if (vars.length === 0) return '';\n return `var {${vars.join(', ')}} = props;`;\n}\n\n/**\n * ScriptExecutor manages JavaScript execution from components\n * \n * Features:\n * - Executes JavaScript from all registered components\n * - Processes templates per component instance when needed\n * - Wraps JavaScript in IIFE for proper scoping\n * - Handles error cases gracefully\n */\nexport class ScriptExecutor {\n private componentRegistry: ComponentRegistry;\n private elementRegistry: ElementRegistry;\n\n constructor(config: ScriptExecutorConfig) {\n this.componentRegistry = config.componentRegistry;\n this.elementRegistry = config.elementRegistry;\n }\n\n /**\n * Execute JavaScript code via new Function() with error isolation\n * Uses new Function() instead of script tags to avoid CSP violations\n * Each component is wrapped in try-catch for isolation\n * @param jsCode - JavaScript code to execute\n * @param componentName - Component name for error reporting\n * @private\n */\n private executeWrappedJS(jsCode: string, componentName: string): void {\n if (!jsCode || !jsCode.trim()) return;\n\n const wrappedJS = `(function() {\n // Component: ${componentName}\n try {\n ${jsCode}\n } catch (e) {\n console.error('[Meno] Runtime error in ' + ${JSON.stringify(componentName)} + ':', e);\n }\n })();`;\n\n try {\n new Function(wrappedJS)();\n } catch (syntaxError) {\n // Syntax errors caught here - doesn't affect other components\n console.error(`[Meno] Syntax error in ${componentName}:`, syntaxError);\n }\n }\n\n /**\n * Execute JavaScript for a component instance with template processing\n * Falls back to original JS if template processing fails\n * @param componentName - Component name\n * @param originalJS - Original JavaScript code (may contain templates)\n * @param rootPath - Component instance root path\n * @private\n */\n private executeInstanceJS(componentName: string, originalJS: string, rootPath: string): void {\n try {\n const props = this.elementRegistry.getComponentProps(rootPath);\n if (!props) {\n return;\n }\n\n try {\n const processedJS = processCodeTemplates(originalJS, props);\n this.executeWrappedJS(processedJS, `${componentName} (instance: ${rootPath})`);\n } catch (templateError) {\n // Fallback to original JS if template processing fails (similar to StyleInjector)\n this.executeWrappedJS(originalJS, `${componentName} (instance: ${rootPath})`);\n }\n } catch (e) {\n logRuntimeError('ScriptExecutor.executeInstanceJS', e, { componentName, rootPath });\n }\n }\n\n /**\n * Execute JavaScript using the initComponent pattern for defineVars\n * Queries all elements with data-component, parses their data-props, and calls the JS with props in scope\n * @param componentName - Component name\n * @param js - Original JavaScript code\n * @param defineVars - defineVars configuration (true or array of var names)\n * @param interfaceDef - Component interface definition for resolving var names\n * @private\n */\n private executeWithInitPattern(\n componentName: string,\n js: string,\n defineVars: true | string[],\n interfaceDef?: Record<string, PropDefinition>\n ): void {\n const destructure = generateDestructure(defineVars, interfaceDef);\n\n const wrappedJS = `(function() {\n // Component: ${componentName} (defineVars)\n try {\n var elements = document.querySelectorAll('[data-component~=\"${componentName}\"]');\n elements.forEach(function(el) {\n var propsStr = el.getAttribute('data-props');\n var allProps = propsStr ? JSON.parse(propsStr) : {};\n var props = allProps[\"${componentName}\"] || {};\n (function(el, props) {\n ${destructure}\n ${js}\n })(el, props);\n });\n } catch (e) {\n console.error('[Meno] Runtime error in ${componentName}:', e);\n }\n })();`;\n\n try {\n new Function(wrappedJS)();\n } catch (syntaxError) {\n console.error(`[Meno] Syntax error in ${componentName}:`, syntaxError);\n }\n }\n\n /**\n * Execute JavaScript from all registered components\n * Processes templates per component instance if needed\n * Uses initComponent pattern for defineVars components\n */\n execute(): void {\n try {\n const allComponents = this.componentRegistry.getAll();\n\n // Track which components have been executed (for non-template JS)\n const executedComponents = new Set<string>();\n\n // Execute JS for each component instance with processed templates\n // Iterate through all components and their instances from registry\n for (const [componentName, component] of Object.entries(allComponents)) {\n if (!component?.component?.javascript) continue;\n\n const originalJS = component.component.javascript;\n const defineVars = component.component.defineVars;\n\n // Check if component uses defineVars (Astro-style prop injection)\n if (defineVars) {\n // Use initComponent pattern - queries all instances and initializes each with props\n if (!executedComponents.has(componentName)) {\n this.executeWithInitPattern(\n componentName,\n originalJS,\n defineVars,\n component.component.interface\n );\n executedComponents.add(componentName);\n }\n } else if (hasTemplates(originalJS)) {\n // Legacy: Process and execute JS per instance (templates need instance-specific props)\n // Get all root paths for this component directly from registry\n const componentRootPaths = this.elementRegistry.getComponentRootPaths(componentName);\n\n for (const rootPath of componentRootPaths) {\n this.executeInstanceJS(componentName, originalJS, String(rootPath));\n }\n } else {\n // No templates, no defineVars - execute JS only once per component type\n if (!executedComponents.has(componentName)) {\n this.executeWrappedJS(originalJS, componentName);\n executedComponents.add(componentName);\n }\n }\n }\n\n // Also execute JS for components without instances (fallback)\n // This handles edge cases where components are registered but not yet rendered\n const componentNamesWithInstances = this.elementRegistry.getAllComponentNames();\n if (componentNamesWithInstances.length === 0) {\n // Execute JS for components that weren't executed above (no instances found)\n for (const [name, component] of Object.entries(allComponents)) {\n if (component?.component?.javascript && !executedComponents.has(name)) {\n const originalJS = component.component.javascript;\n const defineVars = component.component.defineVars;\n // Only execute if it doesn't have templates and doesn't use defineVars\n if (!hasTemplates(originalJS) && !defineVars) {\n // Use setTimeout to ensure DOM is ready (fallback case)\n setTimeout(() => {\n this.executeWrappedJS(originalJS, name);\n }, 0);\n }\n }\n }\n }\n } catch (e) {\n logRuntimeError('ScriptExecutor.execute', e);\n }\n }\n\n /**\n * Execute JavaScript for a specific component\n * @param componentName - Component name to execute JS for\n */\n executeForComponent(componentName: string): void {\n try {\n const component = this.componentRegistry.get(componentName);\n if (!component?.component?.javascript) return;\n\n const originalJS = component.component.javascript;\n const defineVars = component.component.defineVars;\n\n // Check if component uses defineVars (Astro-style prop injection)\n if (defineVars) {\n this.executeWithInitPattern(\n componentName,\n originalJS,\n defineVars,\n component.component.interface\n );\n } else if (hasTemplates(originalJS)) {\n // Legacy: Process and execute JS per instance (templates need instance-specific props)\n const componentRootPaths = this.elementRegistry.getComponentRootPaths(componentName);\n\n for (const rootPath of componentRootPaths) {\n this.executeInstanceJS(componentName, originalJS, String(rootPath));\n }\n } else {\n // No templates, no defineVars - execute JS once\n this.executeWrappedJS(originalJS, componentName);\n }\n } catch (e) {\n logRuntimeError('ScriptExecutor.executeForComponent', e, { componentName });\n }\n }\n\n /**\n * Re-execute JavaScript for a specific element instance (used for editor reactivity)\n * Updates data-props attribute and re-runs the component JS for that element\n * @param componentName - Component name\n * @param element - The DOM element to re-execute for\n * @param newProps - New props to inject\n */\n executeForElement(\n componentName: string,\n element: HTMLElement,\n newProps: Record<string, unknown>\n ): void {\n try {\n const component = this.componentRegistry.get(componentName);\n if (!component?.component?.javascript) return;\n\n const defineVars = component.component.defineVars;\n if (!defineVars) return;\n\n const js = component.component.javascript;\n const destructure = generateDestructure(defineVars, component.component.interface);\n\n // Update data-props attribute (keyed by component name)\n const varsToExpose = defineVars === true\n ? Object.keys(component.component.interface || {})\n : defineVars;\n\n const propsForJS: Record<string, unknown> = {};\n for (const varName of varsToExpose) {\n if (newProps[varName] !== undefined) {\n propsForJS[varName] = newProps[varName];\n }\n }\n\n // Preserve existing keyed props from other components\n let allProps: Record<string, unknown> = {};\n const existingStr = element.getAttribute('data-props');\n if (existingStr) {\n try { allProps = JSON.parse(existingStr); } catch {}\n }\n allProps[componentName] = propsForJS;\n element.setAttribute('data-props', JSON.stringify(allProps));\n\n // Execute JS for this element only\n const wrappedJS = `(function(el, props) {\n ${destructure}\n ${js}\n })(element, props);`;\n\n try {\n const fn = new Function('element', 'props', wrappedJS);\n fn(element, propsForJS);\n } catch (jsError) {\n console.error(`Error re-executing defineVars JS for ${componentName}:`, jsError);\n }\n } catch (e) {\n logRuntimeError('ScriptExecutor.executeForElement', e, { componentName });\n }\n }\n}\n\n", "/**\n * PrefetchService - Astro-style link prefetching for production SSR\n *\n * Features:\n * - Multiple strategies: hover, tap, viewport, load\n * - LRU cache with TTL\n * - Bandwidth-aware (saveData, slow connection detection)\n * - Debounced hover prefetching\n * - AbortController for request cancellation\n */\n\nimport { API_ROUTES } from '../../shared/constants';\nimport type {\n PrefetchConfig,\n PrefetchStrategy,\n CachedPageEntry,\n ConnectionInfo,\n} from '../../shared/types/prefetch';\nimport { DEFAULT_PREFETCH_CONFIG } from '../../shared/types/prefetch';\n\nexport interface PrefetchServiceConfig {\n config?: Partial<PrefetchConfig>;\n}\n\nexport class PrefetchService {\n private config: PrefetchConfig;\n private cache: Map<string, CachedPageEntry> = new Map();\n private pendingPrefetches: Map<string, AbortController> = new Map();\n private hoverTimeouts: Map<string, ReturnType<typeof setTimeout>> = new Map();\n private viewportObserver: IntersectionObserver | null = null;\n private observedLinks: Set<HTMLAnchorElement> = new Set();\n /** Map element path to observed link for cleanup when element unmounts */\n private linkPathMap: Map<string, HTMLAnchorElement> = new Map();\n\n constructor(serviceConfig: PrefetchServiceConfig = {}) {\n this.config = { ...DEFAULT_PREFETCH_CONFIG, ...serviceConfig.config };\n }\n\n /**\n * Get connection quality info for adaptive prefetching\n */\n private getConnectionInfo(): ConnectionInfo {\n const nav = navigator as Navigator & {\n connection?: {\n saveData?: boolean;\n effectiveType?: string;\n downlink?: number;\n };\n };\n\n const connection = nav.connection;\n\n return {\n saveData: connection?.saveData ?? false,\n effectiveType:\n (connection?.effectiveType as ConnectionInfo['effectiveType']) ??\n 'unknown',\n downlink: connection?.downlink ?? Infinity,\n };\n }\n\n /**\n * Determine effective strategy based on connection quality\n */\n private getEffectiveStrategy(\n requestedStrategy: PrefetchStrategy\n ): PrefetchStrategy {\n if (!this.config.respectSaveData) return requestedStrategy;\n\n const { saveData, effectiveType, downlink } = this.getConnectionInfo();\n\n // If save-data is enabled, fall back to tap\n if (saveData) return 'tap';\n\n // If slow connection, fall back to tap\n if (effectiveType === 'slow-2g' || effectiveType === '2g') return 'tap';\n if (downlink < this.config.slowConnectionThreshold) return 'tap';\n\n return requestedStrategy;\n }\n\n /**\n * Check if page is in cache and not expired\n */\n hasValidCache(path: string): boolean {\n const entry = this.cache.get(path);\n if (!entry) return false;\n\n const isExpired = Date.now() - entry.timestamp > this.config.cacheTTL;\n if (isExpired) {\n this.cache.delete(path);\n return false;\n }\n\n return true;\n }\n\n /**\n * Get cached page data\n */\n getFromCache(path: string): CachedPageEntry | null {\n if (!this.hasValidCache(path)) return null;\n return this.cache.get(path) ?? null;\n }\n\n /**\n * Enforce LRU cache size limit\n */\n private enforceCacheLimit(): void {\n if (this.cache.size <= this.config.maxCacheSize) return;\n\n // Get oldest entries and remove them\n const entries = Array.from(this.cache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp\n );\n\n const toRemove = this.cache.size - this.config.maxCacheSize;\n for (let i = 0; i < toRemove; i++) {\n this.cache.delete(entries[i][0]);\n }\n }\n\n /**\n * Prefetch a page and store in cache\n */\n async prefetch(path: string): Promise<void> {\n if (!this.config.enabled) return;\n if (this.hasValidCache(path)) return;\n if (this.pendingPrefetches.has(path)) return;\n\n const abortController = new AbortController();\n this.pendingPrefetches.set(path, abortController);\n\n try {\n // Fetch page data (same endpoint RouteLoader uses)\n const response = await fetch(\n `${API_ROUTES.PAGE_CONTENT}?page=${encodeURIComponent(path)}`,\n {\n signal: abortController.signal,\n // Allow browser caching for prefetched content\n cache: 'default',\n }\n );\n\n if (!response.ok) {\n this.pendingPrefetches.delete(path);\n return;\n }\n\n const data = await response.json();\n\n // Store in cache\n this.cache.set(path, {\n data,\n timestamp: Date.now(),\n components: data.components,\n });\n\n this.enforceCacheLimit();\n } catch (error) {\n // Ignore abort errors\n if (error instanceof Error && error.name === 'AbortError') {\n return;\n }\n // Silent fail for network errors - prefetching is opportunistic\n } finally {\n this.pendingPrefetches.delete(path);\n }\n }\n\n /**\n * Cancel pending prefetch for a path\n */\n cancelPrefetch(path: string): void {\n const controller = this.pendingPrefetches.get(path);\n if (controller) {\n controller.abort();\n this.pendingPrefetches.delete(path);\n }\n\n const timeout = this.hoverTimeouts.get(path);\n if (timeout) {\n clearTimeout(timeout);\n this.hoverTimeouts.delete(path);\n }\n }\n\n /**\n * Handle hover on a link - debounced prefetch\n */\n handleHover(path: string): void {\n if (!this.config.enabled) return;\n\n const strategy = this.getEffectiveStrategy('hover');\n if (strategy === 'tap') return; // Degraded to tap, don't prefetch on hover\n\n // Cancel any existing timeout for this path\n this.cancelHoverTimeout(path);\n\n // Set debounced prefetch\n const timeout = setTimeout(() => {\n this.prefetch(path);\n this.hoverTimeouts.delete(path);\n }, this.config.hoverDebounce);\n\n this.hoverTimeouts.set(path, timeout);\n }\n\n /**\n * Handle hover leave - cancel pending prefetch\n */\n handleHoverLeave(path: string): void {\n this.cancelHoverTimeout(path);\n }\n\n private cancelHoverTimeout(path: string): void {\n const timeout = this.hoverTimeouts.get(path);\n if (timeout) {\n clearTimeout(timeout);\n this.hoverTimeouts.delete(path);\n }\n }\n\n /**\n * Handle tap/touch start - immediate prefetch for tap strategy\n */\n handleTap(path: string): void {\n if (!this.config.enabled) return;\n this.prefetch(path);\n }\n\n /**\n * Setup viewport observer for viewport strategy links\n */\n setupViewportObserver(): void {\n if (this.viewportObserver) return;\n if (typeof IntersectionObserver === 'undefined') return;\n\n this.viewportObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n const link = entry.target as HTMLAnchorElement;\n const href = link.getAttribute('href');\n if (href && href.startsWith('/')) {\n this.prefetch(href);\n }\n }\n });\n },\n { rootMargin: '50px' } // Start prefetching slightly before visible\n );\n }\n\n /**\n * Observe a link for viewport strategy\n * @param link The anchor element to observe\n * @param elementPath Optional unique path identifier for cleanup\n */\n observeLink(link: HTMLAnchorElement, elementPath?: string): void {\n if (!this.config.enabled) return;\n if (!this.viewportObserver) this.setupViewportObserver();\n if (this.observedLinks.has(link)) return;\n\n this.observedLinks.add(link);\n this.viewportObserver?.observe(link);\n\n // Track by path for cleanup when element unmounts\n if (elementPath) {\n // Clean up previous link at this path if exists\n const previousLink = this.linkPathMap.get(elementPath);\n if (previousLink && previousLink !== link) {\n this.unobserveLink(previousLink);\n }\n this.linkPathMap.set(elementPath, link);\n }\n }\n\n /**\n * Unobserve a link\n */\n unobserveLink(link: HTMLAnchorElement): void {\n this.observedLinks.delete(link);\n this.viewportObserver?.unobserve(link);\n }\n\n /**\n * Unobserve a link by its element path\n * Used for cleanup when elements are removed from DOM\n */\n unobserveLinkByPath(elementPath: string): void {\n const link = this.linkPathMap.get(elementPath);\n if (link) {\n this.unobserveLink(link);\n this.linkPathMap.delete(elementPath);\n }\n }\n\n /**\n * Clear cache and cancel all pending operations\n */\n clear(): void {\n // Cancel all pending prefetches\n this.pendingPrefetches.forEach((controller) => controller.abort());\n this.pendingPrefetches.clear();\n\n // Clear all hover timeouts\n this.hoverTimeouts.forEach((timeout) => clearTimeout(timeout));\n this.hoverTimeouts.clear();\n\n // Clear cache\n this.cache.clear();\n\n // Cleanup viewport observer\n if (this.viewportObserver) {\n this.observedLinks.forEach((link) => this.viewportObserver?.unobserve(link));\n this.observedLinks.clear();\n this.linkPathMap.clear();\n this.viewportObserver.disconnect();\n this.viewportObserver = null;\n }\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<PrefetchConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Check if prefetching is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n\n /**\n * Get the default strategy\n */\n getDefaultStrategy(): PrefetchStrategy {\n return this.config.defaultStrategy;\n }\n}\n", "/**\n * Client Initializer (Core)\n * Basic client initialization for non-editor use cases.\n * For editor functionality, use @meno/studio's ClientInitializer.\n */\n\nimport { ComponentRegistry, globalComponentRegistry } from \"./componentRegistry\";\nimport { ComponentBuilder } from \"./core/ComponentBuilder\";\nimport { StyleInjector } from \"./styles/StyleInjector\";\nimport { ScriptExecutor } from \"./scripts/ScriptExecutor\";\nimport { PrefetchService } from \"./services/PrefetchService\";\nimport { elementRegistry } from \"./elementRegistry\";\nimport { setGlobalTemplateContext } from \"../shared/globalTemplateContext\";\nimport type { PrefetchConfig } from \"../shared/types/prefetch\";\n\n/**\n * Client initialization options\n */\nexport interface ClientInitOptions {\n /** Prefetch configuration (disabled by default) */\n prefetch?: Partial<PrefetchConfig>;\n}\n\n/**\n * Client services interface\n */\nexport interface ClientServices {\n componentRegistry: ComponentRegistry;\n componentBuilder: ComponentBuilder;\n styleInjector: StyleInjector;\n scriptExecutor: ScriptExecutor;\n prefetchService: PrefetchService;\n}\n\n/**\n * Helper to extract page name from URL path (same logic as SSR)\n */\nfunction getPageNameFromPath(): string {\n if (typeof window === 'undefined') return 'page';\n const pathname = window.location.pathname;\n // Extract file name from path (e.g., '/about' -> 'about', '/blog/post' -> 'blog_post', '/' -> 'index')\n return pathname.replace(/^\\//, '').replace(/\\//g, '_') || 'index';\n}\n\n/**\n * Detect if we're inside an editor iframe.\n * The editor manages interactive CSS via postMessage, so we should skip\n * generating it ourselves to avoid overwriting the correct CSS.\n */\nfunction isInEditorIframe(): boolean {\n if (typeof window === 'undefined') return false;\n // Check if we're in an iframe (parent !== self)\n return window.parent !== window;\n}\n\n/**\n * Initialize core client services\n */\nexport function initializeClient(options: ClientInitOptions = {}): ClientServices {\n // Set editor mode when running inside editor iframe (disables video autoplay, etc.)\n setGlobalTemplateContext({ isEditorMode: isInEditorIframe() });\n\n const componentRegistry = globalComponentRegistry;\n\n const prefetchService = new PrefetchService({\n config: options.prefetch,\n });\n\n const componentBuilder = new ComponentBuilder({\n componentRegistry,\n elementRegistry,\n prefetchService,\n // Provide page name getter for interactive styles class generation\n getCurrentPageName: getPageNameFromPath,\n getCurrentPagePath: () => {\n if (typeof window === 'undefined') return '/';\n return window.location.pathname;\n },\n });\n\n const styleInjector = new StyleInjector({\n componentRegistry,\n elementRegistry,\n styleId: 'component-css',\n // Skip interactive CSS when in editor iframe - editor sends CSS via postMessage\n skipInteractiveCSS: isInEditorIframe(),\n });\n\n const scriptExecutor = new ScriptExecutor({\n componentRegistry,\n elementRegistry,\n });\n\n return {\n componentRegistry,\n componentBuilder,\n styleInjector,\n scriptExecutor,\n prefetchService,\n };\n}\n\n/**\n * Setup event handlers (no-op in core, editor functionality in @meno/studio)\n */\nexport function setupEventHandlers(_services: ClientServices): () => void {\n // Core router doesn't set up editor event handlers\n // Studio's EditorRouter adds keyboard shortcuts and message handlers\n return () => {};\n}\n", "export type Theme = 'light' | 'dark';\n\nexport interface ThemeColors {\n sidebar: {\n background: string;\n border: string;\n text: string;\n textSecondary: string;\n textMuted: string;\n headerBackground: string;\n tabActiveBackground: string;\n tabActiveBorder: string;\n tabInactiveBackground: string;\n footerBackground: string;\n buttonPrimaryBackground: string;\n buttonPrimaryColor: string;\n hoverBackground: string;\n selectedBackground: string;\n selectedText: string;\n };\n scrollbar: {\n track: string;\n thumb: string;\n thumbHover: string;\n };\n propsPanel: {\n background: string;\n backgroundSecondary: string;\n backgroundTertiary: string;\n border: string;\n borderSecondary: string;\n text: string;\n textSecondary: string;\n textMuted: string;\n codeString: string;\n codeNumber: string;\n codeKey: string;\n codeType: string;\n buttonPrimary: string;\n buttonPrimaryHover: string;\n buttonSecondary: string;\n buttonDanger: string;\n buttonDangerHover: string;\n inputBackground: string;\n inputBorder: string;\n hoverBackground: string;\n variableBackground?: string;\n };\n}\n\nconst lightThemeColors: ThemeColors = {\n sidebar: {\n background: '#ffffff',\n border: '#e1e4e8',\n text: '#24292e',\n textSecondary: '#586069',\n textMuted: '#6a737d',\n headerBackground: '#f6f8fa',\n tabActiveBackground: '#ffffff',\n tabActiveBorder: '#0366d6',\n tabInactiveBackground: 'transparent',\n footerBackground: '#f6f8fa',\n buttonPrimaryBackground: '#0366d6',\n buttonPrimaryColor: '#ffffff',\n hoverBackground: '#f1f3f5',\n selectedBackground: '#0366d6',\n selectedText: '#ffffff',\n },\n scrollbar: {\n track: '#f1f3f5',\n thumb: '#c1c9d1',\n thumbHover: '#a8b2bd',\n },\n propsPanel: {\n background: '#ffffff',\n backgroundSecondary: '#f6f8fa',\n backgroundTertiary: '#eaeef2',\n border: '#d0d7de',\n borderSecondary: '#d1d5da',\n text: '#24292e',\n textSecondary: '#586069',\n textMuted: '#6a737d',\n codeString: '#032f62',\n codeNumber: '#005cc5',\n codeKey: '#005cc5',\n codeType: '#6f42c1',\n buttonPrimary: '#0366d6',\n buttonPrimaryHover: '#0256cc',\n buttonSecondary: '#586069',\n buttonDanger: '#d73a49',\n buttonDangerHover: '#cb2431',\n inputBackground: '#f9fafb',\n inputBorder: '#e4e7ed',\n hoverBackground: '#f1f3f5',\n variableBackground: '#ebedf0',\n },\n};\n\nconst darkThemeColors: ThemeColors = {\n sidebar: {\n background: '#1e1e1e',\n border: '#333333',\n text: '#cccccc',\n textSecondary: '#cccccc',\n textMuted: '#888888',\n headerBackground: '#2d2d2d',\n tabActiveBackground: '#1e1e1e',\n tabActiveBorder: '#007acc',\n tabInactiveBackground: 'transparent',\n footerBackground: '#252526',\n buttonPrimaryBackground: '#0e639c',\n buttonPrimaryColor: '#ffffff',\n hoverBackground: '#2a2d2e',\n selectedBackground: '#37373d',\n selectedText: '#ffffff',\n },\n scrollbar: {\n track: '#1e1e1e',\n thumb: '#424242',\n thumbHover: '#4e4e4e',\n },\n propsPanel: {\n background: '#1e1e1e',\n backgroundSecondary: '#2d2d2d',\n backgroundTertiary: '#252525',\n border: '#333333',\n borderSecondary: '#444444',\n text: '#cccccc',\n textSecondary: '#cccccc',\n textMuted: '#888888',\n codeString: '#ffffff',\n codeNumber: '#b5cea8',\n codeKey: '#9cdcfe',\n codeType: '#4ec9b0',\n buttonPrimary: '#007acc',\n buttonPrimaryHover: '#0098ff',\n buttonSecondary: '#007acc',\n buttonDanger: '#f48771',\n buttonDangerHover: '#ff6b6b',\n inputBackground: '#1e1e1e',\n inputBorder: '#444444',\n hoverBackground: '#2a2d2e',\n variableBackground: '#2a2a2a',\n },\n};\n\nexport function getThemeColors(theme: Theme): ThemeColors {\n return theme === 'light' ? lightThemeColors : darkThemeColors;\n}\n\n", "/**\n * Theme Context\n * Provides theme switching functionality to components\n */\n\nimport React, { createContext, useContext, useState, useEffect } from 'react';\nimport { useThemes } from '../hooks/useColorVariables';\n\ninterface ThemeContextType {\n currentTheme: string;\n setTheme: (themeName: string) => void;\n themes: string[];\n loading: boolean;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\n/**\n * Theme Provider Component\n * Wraps the app and provides theme context to all children\n */\nexport function ThemeProvider({ children }: { children: React.ReactNode }) {\n const { themes, defaultTheme, loading } = useThemes();\n const [currentTheme, setCurrentTheme] = useState<string>('dark');\n\n // Initialize theme from defaultTheme or localStorage\n useEffect(() => {\n if (defaultTheme) {\n const savedTheme = localStorage.getItem('theme');\n const themeToUse = savedTheme || defaultTheme;\n setCurrentTheme(themeToUse);\n applyTheme(themeToUse);\n }\n }, [defaultTheme]);\n\n const setTheme = (themeName: string) => {\n setCurrentTheme(themeName);\n localStorage.setItem('theme', themeName);\n applyTheme(themeName);\n };\n\n const applyTheme = (themeName: string) => {\n // Set the theme attribute on the root element\n const root = document.documentElement;\n root.setAttribute('theme', themeName);\n };\n\n const themeNames = themes?.map(theme => theme.name) || [];\n\n return (\n <ThemeContext.Provider\n value={{\n currentTheme,\n setTheme,\n themes: themeNames,\n loading,\n }}\n >\n {children}\n </ThemeContext.Provider>\n );\n}\n\n/**\n * Hook for using the theme context\n */\nexport function useTheme() {\n const context = useContext(ThemeContext);\n if (context === undefined) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n}\n", "/**\n * Hook for fetching and caching color variables\n */\n\nimport { useState, useEffect, useRef } from 'react';\nimport type { ColorVariables, ThemeEntry, HMRMessage } from '../../shared/types';\n\nlet cachedColors: Record<string, ColorVariables> = {};\nlet cachedThemes: ThemeEntry[] | null = null;\nlet cachedDefaultTheme: string | null = null;\nlet hmrCallbacks: Set<() => void> = new Set();\n\n// Setup HMR listener immediately when module loads\nfunction initializeHMRListener() {\n if (typeof window === 'undefined') return;\n\n // Only setup once\n if (window.__hmrColorsInitialized) return;\n window.__hmrColorsInitialized = true;\n\n // Listen for custom HMR events from HMRManager\n document.addEventListener('hmr-colors-update', async () => {\n // Clear all caches\n cachedColors = {};\n cachedThemes = null;\n cachedDefaultTheme = null;\n\n // Inject new CSS theme variables\n await injectUpdatedThemeCSS();\n\n // Notify all listeners to refresh their data\n hmrCallbacks.forEach(callback => callback());\n });\n}\n\n// Initialize immediately\nif (typeof window !== 'undefined') {\n initializeHMRListener();\n}\n\n/**\n * Fetch updated theme CSS and inject it into the page\n */\nasync function injectUpdatedThemeCSS() {\n try {\n // Fetch the theme config from the server\n const response = await fetch('/api/themes');\n if (!response.ok) return;\n\n const data = await response.json() as { themes: Array<{ name: string; label: string }>; default: string };\n\n // Fetch all theme colors\n const themeColors: Record<string, any> = {};\n for (const theme of data.themes) {\n const colorResponse = await fetch(`/api/colors?theme=${encodeURIComponent(theme.name)}`);\n if (colorResponse.ok) {\n themeColors[theme.name] = (await colorResponse.json()).colors;\n }\n }\n\n // Also get default theme colors\n const defaultResponse = await fetch('/api/colors');\n if (defaultResponse.ok) {\n themeColors['default'] = (await defaultResponse.json()).colors;\n }\n\n // Generate CSS\n let css = '';\n\n // Default theme in :root\n if (themeColors['default']) {\n const vars = Object.entries(themeColors['default'])\n .map(([name, value]) => ` --${name}: ${value};`)\n .join('\\n');\n css += `:root {\\n${vars}\\n}\\n\\n`;\n }\n\n // Each theme in [theme=\"...\"]\n for (const theme of data.themes) {\n if (themeColors[theme.name]) {\n const vars = Object.entries(themeColors[theme.name])\n .map(([name, value]) => ` --${name}: ${value};`)\n .join('\\n');\n css += `[theme=\"${theme.name}\"] {\\n${vars}\\n}\\n\\n`;\n }\n }\n\n // Find or create a style tag for theme variables\n let themeStyleTag = document.getElementById('hmr-theme-variables');\n if (!themeStyleTag) {\n themeStyleTag = document.createElement('style');\n themeStyleTag.id = 'hmr-theme-variables';\n // Insert after the main style tag\n const mainStyle = document.querySelector('style');\n if (mainStyle && mainStyle.nextSibling) {\n document.head.insertBefore(themeStyleTag, mainStyle.nextSibling);\n } else {\n document.head.appendChild(themeStyleTag);\n }\n }\n\n // Update the style tag with new CSS\n themeStyleTag.textContent = css;\n } catch (error) {\n console.error('Failed to inject updated theme CSS:', error);\n }\n}\n\nexport function useColorVariables(themeName?: string) {\n const [colors, setColors] = useState<ColorVariables | null>(themeName && cachedColors[themeName] ? cachedColors[themeName] : null);\n const [loading, setLoading] = useState(!cachedColors[themeName || 'default']);\n const [error, setError] = useState<Error | null>(null);\n const callbackRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n const theme = themeName || 'default';\n\n // Create a callback to refresh colors when HMR update is received\n const refreshCallback = async () => {\n try {\n const url = themeName ? `/api/colors?theme=${encodeURIComponent(themeName)}` : '/api/colors';\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('Failed to fetch colors');\n }\n const data = await response.json() as ColorVariables;\n cachedColors[theme] = data;\n setColors(data);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n }\n };\n\n // Register callback for HMR updates\n callbackRef.current = refreshCallback;\n hmrCallbacks.add(refreshCallback);\n\n // Return cached colors immediately\n if (cachedColors[theme]) {\n setColors(cachedColors[theme]);\n setLoading(false);\n return () => {\n if (callbackRef.current) {\n hmrCallbacks.delete(callbackRef.current);\n }\n };\n }\n\n // Fetch colors for specific theme\n const fetchColors = async () => {\n try {\n const url = themeName ? `/api/colors?theme=${encodeURIComponent(themeName)}` : '/api/colors';\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('Failed to fetch colors');\n }\n const data = await response.json() as ColorVariables;\n cachedColors[theme] = data;\n setColors(data);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setColors(null);\n } finally {\n setLoading(false);\n }\n };\n\n fetchColors();\n\n return () => {\n if (callbackRef.current) {\n hmrCallbacks.delete(callbackRef.current);\n }\n };\n }, [themeName]);\n\n return { colors, loading, error };\n}\n\n/**\n * Hook for fetching available themes\n */\nexport function useThemes() {\n const [themes, setThemes] = useState<ThemeEntry[] | null>(cachedThemes);\n const [defaultTheme, setDefaultTheme] = useState<string | null>(cachedDefaultTheme);\n const [loading, setLoading] = useState(!cachedThemes);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n // Return cached themes immediately\n if (cachedThemes && cachedDefaultTheme) {\n setThemes(cachedThemes);\n setDefaultTheme(cachedDefaultTheme);\n setLoading(false);\n return;\n }\n\n // Fetch themes\n const fetchThemes = async () => {\n try {\n const response = await fetch('/api/themes');\n if (!response.ok) {\n throw new Error('Failed to fetch themes');\n }\n const data = await response.json() as { themes: ThemeEntry[]; default: string };\n cachedThemes = data.themes;\n cachedDefaultTheme = data.default;\n setThemes(data.themes);\n setDefaultTheme(data.default);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setThemes(null);\n } finally {\n setLoading(false);\n }\n };\n\n fetchThemes();\n }, []);\n\n return { themes, defaultTheme, loading, error };\n}\n\n/**\n * Get color variable suggestions for value input\n */\nexport function getColorVariableSuggestions(colors: ColorVariables | null, input: string): string[] {\n if (!colors) return [];\n\n const normalizedInput = input.trim().toLowerCase();\n if (!normalizedInput) {\n return Object.keys(colors.colors).map(name => `var(--${name})`);\n }\n\n // Filter color variable names that match the input\n return Object.keys(colors.colors)\n .filter(name => name.toLowerCase().includes(normalizedInput) || normalizedInput.includes(name.toLowerCase()))\n .map(name => `var(--${name})`);\n}\n\n/**\n * Check if a value is a color variable reference\n */\nexport function isColorVariableValue(value: string): boolean {\n return /^var\\(--[\\w-]+\\)$/.test(value.trim());\n}\n", "/**\n * Style Processor\n * Handles component style merging from structured component definitions\n */\n\nimport type { ComponentDefinition, StyleObject, StyleValue } from '../shared/types';\nimport { processStructure, normalizeStyle } from './templateEngine';\n\ntype ComponentProps = Record<string, unknown>;\n\n/**\n * Merge component styles from structured component definition\n * Returns merged props with all applicable styles\n */\nexport function mergeComponentStyles(\n componentDef: ComponentDefinition,\n props: ComponentProps\n): ComponentProps {\n try {\n // Start with base props from component definition\n let mergedProps: ComponentProps = { ...(componentDef.props || {}) };\n\n const structuredComponentDef = componentDef.component;\n if (!structuredComponentDef) {\n return props || {};\n }\n\n // Build default props from structured component prop definitions (from interface)\n const defaultProps: ComponentProps = {};\n if (structuredComponentDef.interface) {\n for (const [key, def] of Object.entries(structuredComponentDef.interface)) {\n if (def && typeof def === 'object' && 'default' in def) {\n defaultProps[key] = def.default;\n }\n }\n }\n const effectiveInputProps = { ...defaultProps, ...(props || {}) };\n\n // Merge resolved props (with defaults) into mergedProps so they're available in PropsPanel\n mergedProps = { ...mergedProps, ...effectiveInputProps };\n\n // Compute base style from structure with templates evaluated\n // processStructure now reads from structure.style and merges into props.style\n try {\n if (structuredComponentDef.structure) {\n const processed = processStructure(structuredComponentDef.structure, { props: effectiveInputProps, componentDef: structuredComponentDef });\n // Type guard: ensure processed is a ComponentNode with props\n if (processed && typeof processed === 'object' && !Array.isArray(processed) && 'props' in processed) {\n const processedProps = processed.props as Record<string, unknown> | undefined;\n const structureStyle = (processedProps?.style && typeof processedProps.style === 'object' && processedProps.style !== null && !Array.isArray(processedProps.style))\n ? processedProps.style as Record<string, unknown>\n : {};\n const currentStyle = typeof mergedProps.style === 'object' && mergedProps.style !== null && !Array.isArray(mergedProps.style)\n ? { ...mergedProps.style as Record<string, unknown> }\n : {};\n mergedProps.style = { ...currentStyle, ...structureStyle };\n }\n }\n } catch (e) {\n }\n\n // Merge with instance props (allows overrides)\n // Normalize responsive styles to flat StyleObject\n const restProps = props || {};\n const normalizedMergedStyle = normalizeStyle(mergedProps.style as StyleValue) || {};\n const normalizedRestStyle = normalizeStyle(restProps?.style as StyleValue) || {};\n \n mergedProps = {\n ...mergedProps,\n ...restProps,\n style: {\n ...normalizedMergedStyle,\n ...normalizedRestStyle,\n },\n };\n\n return mergedProps;\n } catch (error) {\n // Return props as-is if merging fails\n return props || {};\n }\n}\n\n/**\n * Merge styles from multiple sources\n */\nexport function mergeStyles(...styles: (StyleObject | undefined)[]): StyleObject {\n return styles.reduce<StyleObject>((acc, style) => {\n if (!style) return acc;\n return { ...acc, ...style };\n }, {});\n}\n\n", "/**\n * Shared hook for property autocomplete functionality\n * Handles property input, suggestions, and keyboard navigation\n */\n\nimport { useState, useRef, useEffect } from 'react';\nimport { filterCSSProperties } from '../../shared/cssProperties';\n\nexport function usePropertyAutocomplete(initialProperty: string = '') {\n const [property, setProperty] = useState(initialProperty);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const suggestions = filterCSSProperties(property);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedIndex(prev =>\n prev < suggestions.length - 1 ? prev + 1 : prev\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedIndex(prev => prev > 0 ? prev - 1 : -1);\n }\n };\n\n return {\n property,\n setProperty,\n showSuggestions,\n setShowSuggestions,\n selectedIndex,\n setSelectedIndex,\n suggestions,\n inputRef,\n handleKeyDown\n };\n}\n", "/**\n * Hook for fetching and caching CSS variables (variables.json)\n */\n\nimport { useState, useEffect, useRef } from 'react';\nimport type { CSSVariable } from '../../shared/types/variables';\n\nlet cachedVariables: CSSVariable[] | null = null;\nlet hmrCallbacks: Set<() => void> = new Set();\n\n// Setup HMR listener immediately when module loads\nfunction initializeHMRListener() {\n if (typeof window === 'undefined') return;\n\n // Only setup once\n if ((window as any).__hmrVariablesInitialized) return;\n (window as any).__hmrVariablesInitialized = true;\n\n // Listen for custom HMR events from HMRManager\n document.addEventListener('hmr-variables-update', () => {\n // Clear cache\n cachedVariables = null;\n\n // Notify all listeners to refresh their data\n hmrCallbacks.forEach(callback => callback());\n });\n}\n\n// Initialize immediately\nif (typeof window !== 'undefined') {\n initializeHMRListener();\n}\n\nexport function useVariables() {\n const [variables, setVariables] = useState<CSSVariable[] | null>(cachedVariables);\n const [loading, setLoading] = useState(!cachedVariables);\n const [error, setError] = useState<Error | null>(null);\n const callbackRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n // Create a callback to refresh variables when HMR update is received\n const refreshCallback = async () => {\n try {\n const response = await fetch('/api/variables-status');\n if (!response.ok) {\n throw new Error('Failed to fetch variables');\n }\n const data = await response.json() as { status: string; config: { variables: CSSVariable[] } };\n cachedVariables = data.config.variables;\n setVariables(cachedVariables);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n }\n };\n\n // Register callback for HMR updates\n callbackRef.current = refreshCallback;\n hmrCallbacks.add(refreshCallback);\n\n // Return cached variables immediately\n if (cachedVariables) {\n setVariables(cachedVariables);\n setLoading(false);\n return () => {\n if (callbackRef.current) {\n hmrCallbacks.delete(callbackRef.current);\n }\n };\n }\n\n // Fetch variables\n const fetchVariables = async () => {\n try {\n const response = await fetch('/api/variables-status');\n if (!response.ok) {\n throw new Error('Failed to fetch variables');\n }\n const data = await response.json() as { status: string; config: { variables: CSSVariable[] } };\n cachedVariables = data.config.variables;\n setVariables(cachedVariables);\n setError(null);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setVariables(null);\n } finally {\n setLoading(false);\n }\n };\n\n fetchVariables();\n\n return () => {\n if (callbackRef.current) {\n hmrCallbacks.delete(callbackRef.current);\n }\n };\n }, []);\n\n return { variables, loading, error };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["h", "Fragment", "breakpointConfig", "responsiveScalesConfig", "configPromise", "resolveI18nValue", "h", "h", "h", "i18nConfig", "h", "h", "h", "h", "h", "h", "h", "h", "Fragment", "h", "h", "h", "useState", "useEffect", "useRef", "tree", "parsed", "h", "h", "breakpointConfig", "useEffect", "useState", "useRef", "setI18nConfig", "treeToRender", "h", "useState", "useEffect", "useState", "useEffect", "useRef", "useState", "useEffect", "useState", "useRef", "useState", "useRef", "useState", "useEffect", "useRef", "hmrCallbacks", "initializeHMRListener"]
7
7
  }