meno-core 1.0.49 → 1.0.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/build-astro.ts +6 -2
  2. package/dist/build-static.js +5 -5
  3. package/dist/chunks/{chunk-JER5NQVM.js → chunk-56EUSC6D.js} +4 -4
  4. package/dist/chunks/{chunk-S2CX6HFM.js → chunk-7NIC4I3V.js} +42 -20
  5. package/dist/chunks/chunk-7NIC4I3V.js.map +7 -0
  6. package/dist/chunks/{chunk-EQYDSPBB.js → chunk-CVLFID6V.js} +64 -20
  7. package/dist/chunks/chunk-CVLFID6V.js.map +7 -0
  8. package/dist/chunks/{chunk-LKAGAQ3M.js → chunk-EDQSMAMP.js} +13 -2
  9. package/dist/chunks/{chunk-LKAGAQ3M.js.map → chunk-EDQSMAMP.js.map} +2 -2
  10. package/dist/chunks/{chunk-6IVUG7FY.js → chunk-LPVETICS.js} +19 -2
  11. package/dist/chunks/{chunk-6IVUG7FY.js.map → chunk-LPVETICS.js.map} +2 -2
  12. package/dist/chunks/{chunk-KPU2XHOS.js → chunk-PQ2HRXDR.js} +1 -1
  13. package/dist/chunks/chunk-PQ2HRXDR.js.map +7 -0
  14. package/dist/chunks/{chunk-CHD5UCFF.js → chunk-YWJJD5D6.js} +116 -32
  15. package/dist/chunks/chunk-YWJJD5D6.js.map +7 -0
  16. package/dist/chunks/{configService-CCA6AIDI.js → configService-VOY2MY2K.js} +2 -2
  17. package/dist/entries/server-router.js +5 -5
  18. package/dist/lib/client/index.js +41 -15
  19. package/dist/lib/client/index.js.map +3 -3
  20. package/dist/lib/server/index.js +11 -9
  21. package/dist/lib/server/index.js.map +2 -2
  22. package/dist/lib/shared/index.js +2 -2
  23. package/lib/client/core/ComponentBuilder.test.ts +34 -0
  24. package/lib/client/core/ComponentBuilder.ts +25 -3
  25. package/lib/client/core/builders/embedBuilder.ts +13 -5
  26. package/lib/client/core/builders/linkNodeBuilder.ts +13 -5
  27. package/lib/client/core/builders/localeListBuilder.ts +13 -5
  28. package/lib/client/templateEngine.ts +24 -0
  29. package/lib/server/fileWatcher.test.ts +134 -0
  30. package/lib/server/fileWatcher.ts +100 -32
  31. package/lib/server/jsonLoader.ts +1 -0
  32. package/lib/server/providers/fileSystemCMSProvider.ts +46 -14
  33. package/lib/server/services/configService.ts +1 -0
  34. package/lib/server/services/fileWatcherService.ts +17 -0
  35. package/lib/server/ssr/htmlGenerator.ts +11 -3
  36. package/lib/server/ssr/ssrRenderer.test.ts +258 -0
  37. package/lib/server/ssr/ssrRenderer.ts +46 -5
  38. package/lib/server/webflow/buildWebflow.ts +1 -1
  39. package/lib/server/websocketManager.test.ts +61 -6
  40. package/lib/server/websocketManager.ts +25 -1
  41. package/lib/shared/cssProperties.test.ts +28 -0
  42. package/lib/shared/cssProperties.ts +27 -1
  43. package/lib/shared/types/api.ts +10 -1
  44. package/lib/shared/types/cms.ts +18 -9
  45. package/lib/shared/validation/schemas.test.ts +93 -0
  46. package/lib/shared/validation/schemas.ts +56 -15
  47. package/package.json +1 -1
  48. package/dist/chunks/chunk-CHD5UCFF.js.map +0 -7
  49. package/dist/chunks/chunk-EQYDSPBB.js.map +0 -7
  50. package/dist/chunks/chunk-KPU2XHOS.js.map +0 -7
  51. package/dist/chunks/chunk-S2CX6HFM.js.map +0 -7
  52. /package/dist/chunks/{chunk-JER5NQVM.js.map → chunk-56EUSC6D.js.map} +0 -0
  53. /package/dist/chunks/{configService-CCA6AIDI.js.map → configService-VOY2MY2K.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../build-astro.ts", "../../../lib/server/astro/tailwindMapper.ts", "../../../lib/server/astro/nodeToAstro.ts", "../../../lib/server/astro/templateTransformer.ts", "../../../lib/server/astro/astroEmitHelpers.ts", "../../../lib/server/astro/componentEmitter.ts", "../../../lib/server/astro/pageEmitter.ts", "../../../lib/server/astro/cmsPageEmitter.ts", "../../../lib/server/astro/cssCollector.ts", "../../../lib/server/webflow/buildWebflow.ts", "../../../lib/server/webflow/nodeToWebflow.ts", "../../../lib/server/webflow/types.ts", "../../../lib/server/webflow/styleMapper.ts", "../../../lib/server/webflow/templateWrapper.ts", "../../../lib/server/index.ts"],
4
- "sourcesContent": ["/**\n * Astro Export Build Script\n * Renders all pages via the SSR pipeline, then wraps them as Astro page files\n * with a shared layout, global CSS, and optional CMS content collections.\n */\n\nimport { existsSync, readdirSync, mkdirSync, rmSync, statSync, copyFileSync, writeFileSync } from \"fs\";\nimport { writeFile, readFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { createHash } from \"crypto\";\nimport { inspect, minifyJS as runtimeMinifyJS } from './lib/server/runtime';\nimport {\n loadJSONFile,\n loadComponentDirectory,\n mapPageNameToPath,\n parseJSON,\n loadI18nConfig\n} from \"./lib/server/jsonLoader\";\nimport { generateSSRHTML } from \"./lib/server/ssrRenderer\";\nimport type { SSRHTMLResult } from \"./lib/server/ssr/htmlGenerator\";\nimport { projectPaths } from \"./lib/server/projectContext\";\nimport { loadProjectConfig, generateFontCSS, generateFontPreloadTags } from \"./lib/shared/fontLoader\";\nimport { FileSystemCMSProvider } from \"./lib/server/providers/fileSystemCMSProvider\";\nimport { CMSService } from \"./lib/server/services/cmsService\";\nimport { isI18nValue, resolveI18nValue } from \"./lib/shared/i18n\";\nimport type { ComponentDefinition, JSONPage, CMSSchema, CMSItem, I18nConfig } from \"./lib/shared/types\";\nimport type { CMSFieldDefinition } from \"./lib/shared/types/cms\";\nimport { isItemDraftForLocale } from \"./lib/shared/types\";\nimport type { SlugMap } from \"./lib/shared/slugTranslator\";\nimport { renderPageSSR } from \"./lib/server/ssr/ssrRenderer\";\nimport { generateThemeColorVariablesCSS, generateVariablesCSS } from \"./lib/server/cssGenerator\";\nimport { colorService } from \"./lib/server/services/ColorService\";\nimport { variableService } from \"./lib/server/services/VariableService\";\nimport { configService } from \"./lib/server/services/configService\";\nimport { loadBreakpointConfig, loadIconsConfig } from \"./lib/server/jsonLoader\";\nimport type { InteractiveStyles } from \"./lib/shared/types/styles\";\nimport { collectComponentLibraries, filterLibrariesByContext, mergeLibraries, generateLibraryTags } from \"./lib/shared/libraryLoader\";\nimport { migrateTemplatesDirectory } from \"./lib/server/migrateTemplates\";\nimport { emitAstroComponent } from \"./lib/server/astro/componentEmitter\";\nimport { emitAstroPage } from \"./lib/server/astro/pageEmitter\";\nimport { emitCMSPage } from './lib/server/astro/cmsPageEmitter';\nimport { collectAllMappingClasses } from \"./lib/server/astro/cssCollector\";\nimport { buildImageMetadataMap, RESPONSIVE_WIDTHS } from \"./lib/server/ssr/imageMetadata\";\nimport { needsFormHandler, formHandlerScript } from \"./lib/client/scripts/formHandler\";\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex').slice(0, 8);\n}\n\nfunction writePageScript(javascript: string | undefined, scriptsDir: string): string[] {\n if (!javascript) return [];\n const hash = hashContent(javascript);\n const scriptFile = `${hash}.js`;\n if (!existsSync(scriptsDir)) {\n mkdirSync(scriptsDir, { recursive: true });\n }\n const fullScriptPath = join(scriptsDir, scriptFile);\n if (!existsSync(fullScriptPath)) {\n writeFileSync(fullScriptPath, javascript, 'utf-8');\n }\n return [`/_scripts/${scriptFile}`];\n}\n\nfunction copyDirectory(\n src: string,\n dest: string,\n filter?: (filename: string) => boolean,\n): void {\n if (!existsSync(src)) return;\n if (!existsSync(dest)) mkdirSync(dest, { recursive: true });\n const files = readdirSync(src);\n for (const file of files) {\n if (filter && !filter(file)) continue;\n const srcPath = join(src, file);\n const destPath = join(dest, file);\n const stat = statSync(srcPath);\n if (stat.isDirectory()) copyDirectory(srcPath, destPath, filter);\n else copyFileSync(srcPath, destPath);\n }\n}\n\n// Astro's <Picture> re-derives responsive variants from originals at build\n// time, so the pre-baked -{width}.webp/.avif files and the SSR-only\n// manifest.json are dead weight in the exported project.\nconst imageVariantSuffixRe = new RegExp(\n `-(${RESPONSIVE_WIDTHS.join('|')})\\\\.(webp|avif)$`,\n);\nfunction shouldCopyImageForAstro(filename: string): boolean {\n if (filename === 'manifest.json') return false;\n if (imageVariantSuffixRe.test(filename)) return false;\n return true;\n}\n\nfunction isCMSPage(pageData: JSONPage): boolean {\n return pageData.meta?.source === 'cms' && !!pageData.meta?.cms;\n}\n\n/**\n * Build URL path for a CMS item based on the URL pattern\n */\nfunction buildCMSItemPath(\n urlPattern: string,\n item: CMSItem,\n slugField: string,\n locale: string,\n i18nConfig: I18nConfig\n): string {\n let slug = item[slugField] ?? item._slug ?? item._id;\n if (isI18nValue(slug)) {\n slug = resolveI18nValue(slug, locale, i18nConfig) as string;\n }\n return urlPattern.replace('{{slug}}', String(slug));\n}\n\n/**\n * Recursively scan a directory for .json files, returning relative paths.\n */\nfunction scanJSONFiles(dir: string, prefix: string = ''): string[] {\n const results: string[] = [];\n if (!existsSync(dir)) return results;\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.json')) {\n results.push(prefix ? `${prefix}/${entry.name}` : entry.name);\n } else if (entry.isDirectory()) {\n results.push(...scanJSONFiles(join(dir, entry.name), prefix ? `${prefix}/${entry.name}` : entry.name));\n }\n }\n return results;\n}\n\n/**\n * Compute the relative import path from a file at `fromDepth` levels under src/pages/\n * back to src/layouts/BaseLayout.astro.\n */\nfunction layoutImportPath(fileDepth: number): string {\n // fileDepth = 0 means file is at src/pages/index.astro -> ../layouts/BaseLayout.astro\n // fileDepth = 1 means src/pages/en/index.astro -> ../../layouts/BaseLayout.astro\n const ups = '../'.repeat(fileDepth + 1);\n return `${ups}layouts/BaseLayout.astro`;\n}\n\n/**\n * Escape a string for use inside a JS template literal (backtick string).\n */\nfunction escapeTemplateLiteral(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\$\\{/g, '\\\\${');\n}\n\n/**\n * Compute locale \u2192 URL path map for a page's slug translations.\n * Used by locale list rendering to generate correct links.\n */\nfunction computePageSlugMap(\n slugs: Record<string, string>,\n i18nConfig: I18nConfig\n): Record<string, string> {\n const map: Record<string, string> = {};\n for (const localeConfig of i18nConfig.locales) {\n const code = localeConfig.code;\n const isDefault = code === i18nConfig.defaultLocale;\n const slug = slugs[code] || '';\n if (isDefault) {\n map[code] = slug === '' ? '/' : `/${slug}`;\n } else {\n map[code] = slug === '' ? `/${code}` : `/${code}/${slug}`;\n }\n }\n return map;\n}\n\n/**\n * Map a CMS field type to a Zod schema string for the Astro content config.\n */\nfunction cmsFieldToZod(field: CMSFieldDefinition): string {\n switch (field.type) {\n case 'string':\n case 'text':\n case 'rich-text':\n // Support both plain strings and i18n objects { _i18n: true, en: \"...\", pl: \"...\" }\n return 'z.union([z.string(), z.object({ _i18n: z.literal(true) }).passthrough()])';\n case 'number':\n return 'z.number()';\n case 'boolean':\n return 'z.boolean()';\n case 'date':\n return 'z.coerce.date()';\n case 'select':\n if (field.options && field.options.length > 0) {\n const opts = field.options.map(o => `'${o.replace(/'/g, \"\\\\'\")}'`).join(', ');\n return `z.enum([${opts}])`;\n }\n return 'z.string()';\n case 'image':\n case 'file':\n return 'z.string()';\n case 'reference':\n return 'z.string()';\n default:\n return 'z.string()';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface PageRenderResult {\n /** Body HTML (inner content, no DOCTYPE wrapper) */\n html: string;\n /** Head meta tags HTML string */\n meta: string;\n /** Page title */\n title: string;\n /** Extracted JavaScript (if any) */\n javascript: string;\n /** Per-component CSS */\n componentCSS?: string;\n /** Locale used */\n locale: string;\n /** Interactive styles (hover, focus, etc.) */\n interactiveStylesMap: Map<string, InteractiveStyles>;\n /** The URL path this page will live at */\n urlPath: string;\n /** File depth relative to src/pages/ (0 = root, 1 = one dir deep, etc.) */\n fileDepth: number;\n /** Relative file path within src/pages/ */\n astroFilePath: string;\n /** Original page data (for Pass 2 component-structured emission) */\n pageData?: JSONPage;\n /** Page name without extension */\n pageName?: string;\n /** Whether this is a CMS template page */\n isCMSPage?: boolean;\n /** SSR fallback HTML for complex nodes (list, locale-list) keyed by element path */\n ssrFallbackCollector?: Map<string, string>;\n /** Raw-HTML slice \u2192 processed HTML captured during SSR (for Astro exporter parity) */\n processedRawHtmlCollector?: Map<string, string>;\n}\n\ninterface AstroBuildStats {\n pages: number;\n cmsPages: number;\n collections: number;\n errors: number;\n}\n\n// ---------------------------------------------------------------------------\n// SSR Fallback page builder (used for CMS pages and error fallback)\n// ---------------------------------------------------------------------------\n\nfunction buildSSRFallbackPage(\n result: PageRenderResult,\n importPath: string,\n fontPreloads: string,\n libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string },\n defaultTheme: string,\n scriptPaths: string[]\n): string {\n const escapedMeta = escapeTemplateLiteral(result.meta);\n const escapedHTML = escapeTemplateLiteral(result.html);\n const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);\n\n const scriptsArrayLiteral = scriptPaths.length > 0\n ? `[${scriptPaths.map(s => `\"${s}\"`).join(', ')}]`\n : '[]';\n\n const libraryTagsLiteral = `{ headCSS: \\`${escapeTemplateLiteral(libraryTags.headCSS || '')}\\`, headJS: \\`${escapeTemplateLiteral(libraryTags.headJS || '')}\\`, bodyEndJS: \\`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\\` }`;\n\n return `---\nimport BaseLayout from '${importPath}';\n---\n<BaseLayout\n title=\"${result.title.replace(/\"/g, '&quot;')}\"\n meta={\\`${escapedMeta}\\`}\n scripts={${scriptsArrayLiteral}}\n locale=\"${result.locale}\"\n theme=\"${defaultTheme}\"\n fontPreloads={\\`${escapedFontPreloads}\\`}\n libraryTags={${libraryTagsLiteral}}\n>\n <Fragment set:html={\\`<div id=\"root\">${escapedHTML}</div>\\`} />\n</BaseLayout>\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\nexport async function buildAstroProject(\n projectRoot?: string,\n outputDir?: string\n): Promise<AstroBuildStats> {\n // ----------------------------------------------------------\n // 1. Setup: load project configuration\n // ----------------------------------------------------------\n configService.reset();\n\n const projectConfig = await loadProjectConfig();\n const siteUrl = (projectConfig as { siteUrl?: string }).siteUrl?.replace(/\\/$/, '') || '';\n\n const i18nConfig = await loadI18nConfig();\n\n await migrateTemplatesDirectory();\n\n const { components, warnings, errors: compErrors } = await loadComponentDirectory(projectPaths.components());\n const globalComponents: Record<string, ComponentDefinition> = {};\n components.forEach((value, key) => { globalComponents[key] = value; });\n for (const w of warnings) console.warn(` Warning: ${w}`);\n for (const e of compErrors) console.error(` Error: ${e}`);\n\n const cmsProvider = new FileSystemCMSProvider(projectPaths.templates(), projectPaths.cms());\n const cmsService = new CMSService(cmsProvider);\n await cmsService.initialize();\n\n const themeConfig = await colorService.loadThemeConfig();\n const variablesConfig = await variableService.loadConfig();\n const breakpoints = await loadBreakpointConfig();\n\n // Libraries (global + component)\n await configService.load();\n const responsiveScales = configService.getResponsiveScales();\n const globalLibraries = configService.getLibraries();\n const componentLibraries = collectComponentLibraries(globalComponents);\n\n // Build image metadata map for responsive image generation\n const imageMetadataMap = await buildImageMetadataMap();\n\n // ----------------------------------------------------------\n // 2. Clean and create output directory\n // ----------------------------------------------------------\n const outDir = outputDir || join(projectPaths.project, 'astro-export');\n\n if (existsSync(outDir)) {\n rmSync(outDir, { recursive: true, force: true });\n }\n mkdirSync(outDir, { recursive: true });\n\n // Create directory structure\n const srcDir = join(outDir, 'src');\n const pagesOutDir = join(srcDir, 'pages');\n const layoutsDir = join(srcDir, 'layouts');\n const stylesDir = join(srcDir, 'styles');\n const componentsOutDir = join(srcDir, 'components');\n const publicDir = join(outDir, 'public');\n const scriptsDir = join(publicDir, '_scripts');\n for (const d of [srcDir, pagesOutDir, layoutsDir, stylesDir, componentsOutDir, publicDir]) {\n mkdirSync(d, { recursive: true });\n }\n\n // ----------------------------------------------------------\n // 3. Scan pages\n // ----------------------------------------------------------\n const pagesDir = projectPaths.pages();\n if (!existsSync(pagesDir)) {\n console.error('Pages directory not found!');\n return { pages: 0, cmsPages: 0, collections: 0, errors: 1 };\n }\n\n const pageFiles = scanJSONFiles(pagesDir);\n if (pageFiles.length === 0) {\n console.warn('No pages found in ./pages directory');\n return { pages: 0, cmsPages: 0, collections: 0, errors: 0 };\n }\n\n // Collect slug mappings (first pass)\n const slugMappings: SlugMap[] = [];\n for (const file of pageFiles) {\n const pageName = file.replace('.json', '');\n const basePath = mapPageNameToPath(pageName);\n const pageContent = await loadJSONFile(join(pagesDir, file));\n if (!pageContent) continue;\n try {\n const pageData = parseJSON<JSONPage>(pageContent);\n if (pageData.meta?.slugs) {\n const pageId = basePath === '/' ? 'index' : basePath.substring(1);\n slugMappings.push({ pageId, slugs: pageData.meta.slugs });\n }\n } catch { /* ignore parse errors in first pass */ }\n }\n\n // ----------------------------------------------------------\n // 4 & 5. Render all pages (regular + CMS templates)\n // ----------------------------------------------------------\n const allResults: PageRenderResult[] = [];\n const allInteractiveStyles = new Map<string, InteractiveStyles>();\n const allComponentCSS = new Set<string>();\n const jsContents = new Map<string, string>(); // hash -> JS content\n let errorCount = 0;\n let projectNeedsFormHandler = false;\n\n // Helper to merge interactive styles maps\n function mergeInteractiveStyles(source: Map<string, InteractiveStyles>): void {\n for (const [key, value] of source) {\n if (!allInteractiveStyles.has(key)) {\n allInteractiveStyles.set(key, value);\n }\n }\n }\n\n // Helper to process a render result\n function processRenderResult(\n result: { html: string; meta: string; title: string; javascript: string; componentCSS?: string; locale: string; interactiveStylesMap: Map<string, InteractiveStyles>; preloadImages: any[]; neededCollections: Set<string>; ssrFallbackCollector?: Map<string, string>; processedRawHtmlCollector?: Map<string, string> },\n urlPath: string,\n astroFilePath: string,\n fileDepth: number,\n pageData?: JSONPage,\n pageName?: string,\n isCMSPage?: boolean\n ): void {\n // Collect interactive styles\n mergeInteractiveStyles(result.interactiveStylesMap);\n\n // Collect component CSS\n if (result.componentCSS) {\n allComponentCSS.add(result.componentCSS);\n }\n\n // Deduplicate JavaScript by content hash\n if (result.javascript) {\n const hash = hashContent(result.javascript);\n if (!jsContents.has(hash)) {\n jsContents.set(hash, result.javascript);\n }\n }\n\n // Detect forms that need the fetch handler\n if (!projectNeedsFormHandler && needsFormHandler(result.html)) {\n projectNeedsFormHandler = true;\n }\n\n allResults.push({\n html: result.html,\n meta: result.meta,\n title: result.title,\n javascript: result.javascript,\n componentCSS: result.componentCSS,\n locale: result.locale,\n interactiveStylesMap: result.interactiveStylesMap,\n urlPath,\n fileDepth,\n astroFilePath,\n pageData,\n pageName,\n isCMSPage,\n ssrFallbackCollector: result.ssrFallbackCollector,\n processedRawHtmlCollector: result.processedRawHtmlCollector,\n });\n }\n\n // ---------- Regular pages ----------\n for (const file of pageFiles) {\n const pageName = file.replace('.json', '');\n const basePath = mapPageNameToPath(pageName);\n const pageContent = await loadJSONFile(join(pagesDir, file));\n\n if (!pageContent) {\n console.warn(` Skipping ${basePath} (empty file)`);\n errorCount++;\n continue;\n }\n\n try {\n const pageData = parseJSON<JSONPage>(pageContent);\n\n // Skip draft pages in production\n const isDevBuild = process.env.MENO_DEV_BUILD === 'true';\n if (pageData.meta?.draft === true && !isDevBuild) {\n continue;\n }\n\n const slugs = pageData.meta?.slugs;\n\n for (const localeConfig of i18nConfig.locales) {\n const locale = localeConfig.code;\n const isDefault = locale === i18nConfig.defaultLocale;\n\n // Compute URL path\n let slug: string;\n if (slugs && slugs[locale]) {\n slug = slugs[locale];\n } else if (basePath === '/') {\n slug = '';\n } else {\n slug = basePath.substring(1);\n }\n\n const urlPath = isDefault\n ? (slug === '' ? '/' : `/${slug}`)\n : (slug === '' ? `/${locale}` : `/${locale}/${slug}`);\n\n // Determine .astro file path relative to src/pages/\n const astroFileName = slug === '' ? 'index.astro' : `${slug}.astro`;\n const astroFilePath = isDefault ? astroFileName : `${locale}/${astroFileName}`;\n const fileDepth = astroFilePath.split('/').length - 1;\n\n const result = await renderPageSSR(\n pageData,\n globalComponents,\n urlPath,\n siteUrl,\n locale,\n i18nConfig,\n slugMappings,\n undefined, // cmsContext\n cmsService,\n true // isProductionBuild\n );\n\n processRenderResult(result, urlPath, astroFilePath, fileDepth, pageData, pageName, false);\n }\n } catch (error: any) {\n console.error(` Error rendering ${basePath}:`, error?.message || error);\n errorCount++;\n }\n }\n\n // Pre-compute layout dependencies needed by both CMS and regular page emission\n const fontPreloads = generateFontPreloadTags();\n const mergedLibraries = mergeLibraries(globalLibraries, componentLibraries);\n const buildLibraries = filterLibrariesByContext(mergedLibraries, 'build');\n\n // Mirror htmlGenerator.ts: local CSS libraries with `inline !== false` are inlined\n // into a <style> tag, otherwise the file is copied to public/ so the <link href>\n // resolves. This keeps any `/some-file.css` referenced in project.config.json\n // libraries working, not just the special `custom.css` case.\n const inlineContents = new Map<string, string>();\n const localLibsToCopy: string[] = [];\n for (const css of buildLibraries.css || []) {\n if (!css.url.startsWith('/')) continue;\n const shouldInline = css.inline !== false;\n const relPath = css.url.slice(1);\n const srcPath = join(projectPaths.project, relPath);\n if (!existsSync(srcPath)) continue;\n if (shouldInline) {\n try {\n inlineContents.set(css.url, await readFile(srcPath, 'utf-8'));\n } catch {\n localLibsToCopy.push(relPath);\n }\n } else {\n localLibsToCopy.push(relPath);\n }\n }\n for (const js of buildLibraries.js || []) {\n if (js.url.startsWith('/')) {\n const relPath = js.url.slice(1);\n if (existsSync(join(projectPaths.project, relPath))) {\n localLibsToCopy.push(relPath);\n }\n }\n }\n const libraryTags = generateLibraryTags(buildLibraries, inlineContents);\n const defaultTheme = themeConfig.default || 'light';\n\n // Global customCode (head/bodyStart/bodyEnd) and icons from project.config.json\n // are page-independent, so we bake them directly into BaseLayout.astro rather\n // than plumbing them through every page's props. Mirrors htmlGenerator.ts's\n // SSR output (htmlGenerator.ts:269-507 for customCode, 368-473 for icons).\n const customCode = configService.getCustomCode();\n const iconsConfig = await loadIconsConfig();\n const faviconTag = iconsConfig.favicon\n ? `<link rel=\"icon\" href=\"${iconsConfig.favicon.replace(/\"/g, '&quot;')}\" />`\n : '';\n const appleTouchIconTag = iconsConfig.appleTouchIcon\n ? `<link rel=\"apple-touch-icon\" href=\"${iconsConfig.appleTouchIcon.replace(/\"/g, '&quot;')}\" />`\n : '';\n const iconTagsHtml = [faviconTag, appleTouchIconTag].filter(Boolean).join('\\n ');\n\n const remConversionConfig = configService.getRemConversion();\n\n // ---------- CMS template pages ----------\n const templatesDir = projectPaths.templates();\n const templateSchemas: CMSSchema[] = [];\n let cmsPageCount = 0;\n\n if (existsSync(templatesDir)) {\n const templateFiles = readdirSync(templatesDir).filter(f => f.endsWith('.json'));\n\n for (const file of templateFiles) {\n const templateContent = await loadJSONFile(join(templatesDir, file));\n if (!templateContent) continue;\n\n try {\n const pageData = parseJSON<JSONPage>(templateContent);\n\n const isDevBuild = process.env.MENO_DEV_BUILD === 'true';\n if (pageData.meta?.draft === true && !isDevBuild) {\n continue;\n }\n\n if (!isCMSPage(pageData)) {\n console.warn(` ${file} is in templates/ but missing meta.source: \"cms\"`);\n continue;\n }\n\n const cmsSchema = pageData.meta!.cms as CMSSchema;\n templateSchemas.push(cmsSchema);\n\n // Count items for stats\n const items = await cmsService.queryItems({ collection: cmsSchema.id });\n const itemCount = items.length;\n\n // Render SSR once for metadata collection (interactive styles, component CSS, JS)\n const defaultLocale = i18nConfig.defaultLocale;\n const dummyPath = cmsSchema.urlPattern.replace('{{slug}}', '__placeholder__');\n\n const metaResult = await renderPageSSR(\n pageData,\n globalComponents,\n dummyPath,\n siteUrl,\n defaultLocale,\n i18nConfig,\n slugMappings,\n undefined, // no CMS context - just collecting metadata\n cmsService,\n true\n );\n\n // Collect interactive styles and component CSS\n mergeInteractiveStyles(metaResult.interactiveStylesMap);\n if (metaResult.componentCSS) {\n allComponentCSS.add(metaResult.componentCSS);\n }\n\n // Deduplicate JavaScript by content hash\n const scriptPaths: string[] = [];\n if (metaResult.javascript) {\n const hash = hashContent(metaResult.javascript);\n if (!jsContents.has(hash)) {\n jsContents.set(hash, metaResult.javascript);\n }\n scriptPaths.push(`/_scripts/${hash}.js`);\n }\n\n // Determine route file path from urlPattern\n const isMultiLocale = i18nConfig.locales.length > 1;\n const urlPatternWithoutSlash = cmsSchema.urlPattern.replace(/^\\//, '');\n const slugPlaceholderIdx = urlPatternWithoutSlash.indexOf('{{');\n const pathPrefix = slugPlaceholderIdx > 0 ? urlPatternWithoutSlash.substring(0, slugPlaceholderIdx) : '';\n\n // Generate CMS page with getStaticPaths()\n const ssrFallbacks = metaResult.ssrFallbackCollector ?? new Map<string, string>();\n\n // For each locale (or just default), generate a route file\n const localesToEmit = isMultiLocale ? i18nConfig.locales : [{ code: i18nConfig.defaultLocale }];\n\n for (const localeEntry of localesToEmit) {\n const localeCode = localeEntry.code;\n const isDefault = localeCode === i18nConfig.defaultLocale;\n\n // Route file path: blog/[slug].astro for default, pl/blog/[slug].astro for non-default\n let astroFilePath: string;\n if (pathPrefix) {\n astroFilePath = isDefault\n ? `${pathPrefix}[slug].astro`\n : `${localeCode}/${pathPrefix}[slug].astro`;\n } else {\n astroFilePath = isDefault\n ? '[slug].astro'\n : `${localeCode}/[slug].astro`;\n }\n\n const fileDepth = astroFilePath.split('/').length - 1;\n const importPath = layoutImportPath(fileDepth);\n\n const astroContent = emitCMSPage({\n pageData,\n globalComponents,\n cmsSchema,\n title: String(pageData.meta?.title || cmsSchema.name),\n meta: metaResult.meta,\n locale: localeCode,\n theme: defaultTheme,\n fontPreloads,\n libraryTags,\n scriptPaths,\n layoutImportPath: importPath,\n fileDepth,\n ssrFallbacks,\n pageName: file.replace('.json', ''),\n breakpoints,\n responsiveScales,\n imageMetadataMap,\n i18nConfig,\n isMultiLocale: false, // Each file handles one locale\n slugMappings,\n imageFormat: configService.getImageFormat(),\n processedRawHtml: metaResult.processedRawHtmlCollector,\n remConfig: remConversionConfig,\n });\n\n const astroFileFull = join(pagesOutDir, astroFilePath);\n const astroFileDir = astroFileFull.substring(0, astroFileFull.lastIndexOf('/'));\n if (!existsSync(astroFileDir)) {\n mkdirSync(astroFileDir, { recursive: true });\n }\n\n await writeFile(astroFileFull, astroContent, 'utf-8');\n }\n\n cmsPageCount += itemCount * i18nConfig.locales.length;\n } catch (error: any) {\n console.error(` Error processing template ${file}:`, error?.message || error);\n errorCount++;\n }\n }\n }\n\n // ----------------------------------------------------------\n // 6. Generate global CSS (Tailwind + theme + interactive styles)\n // ----------------------------------------------------------\n // Collect Tailwind safelist classes from mapping variants\n const mappingClasses = collectAllMappingClasses(globalComponents, breakpoints, responsiveScales);\n\n const fontCSS = generateFontCSS();\n const themeColorCSS = generateThemeColorVariablesCSS(themeConfig);\n const variablesCSS = generateVariablesCSS(variablesConfig, breakpoints, responsiveScales);\n const componentCSSCombined = Array.from(allComponentCSS).join('\\n');\n\n const baseCSS = `@layer base {\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif; }\n button { background: none; border: none; padding: 0; font: inherit; cursor: pointer; outline: inherit; }\n img { max-width: 100%; height: auto; }\n picture { display: block; }\n .olink { text-decoration: none; display: block; color: inherit; }\n .oem { display: inline-block; }\n}`;\n\n const safelistClasses = Array.from(mappingClasses);\n const safelistDirectives = safelistClasses\n .map(c => `@source inline(\"${c}\");`)\n .join('\\n');\n const tailwindDirectives = safelistDirectives\n ? `@import \"tailwindcss\";\\n\\n${safelistDirectives}`\n : `@import \"tailwindcss\";`;\n\n const globalCSS = [tailwindDirectives, fontCSS, themeColorCSS, variablesCSS, baseCSS, componentCSSCombined]\n .filter(Boolean)\n .join('\\n\\n');\n\n await writeFile(join(stylesDir, 'global.css'), globalCSS, 'utf-8');\n\n // ----------------------------------------------------------\n // 7. Generate BaseLayout.astro\n // ----------------------------------------------------------\n // Escape for embedding inside Astro <Fragment set:html={`...`}> template\n // literals in the generated BaseLayout file.\n const escForTemplateLiteral = (s: string) => s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$\\{/g, '\\\\${');\n\n const customHeadLiteral = escForTemplateLiteral(customCode.head || '');\n const customBodyStartLiteral = escForTemplateLiteral(customCode.bodyStart || '');\n const customBodyEndLiteral = escForTemplateLiteral(customCode.bodyEnd || '');\n const iconTagsLiteral = escForTemplateLiteral(iconTagsHtml);\n\n const formHandlerBlock = projectNeedsFormHandler\n ? `\\n <script is:inline>\\n${formHandlerScript}\\n </script>`\n : '';\n\n const baseLayoutContent = `---\nimport '../styles/global.css';\n\ninterface Props {\n title: string;\n meta?: string;\n scripts?: string[];\n locale?: string;\n theme?: string;\n fontPreloads?: string;\n libraryTags?: { headCSS?: string; headJS?: string; bodyEndJS?: string };\n}\n\nconst { title, meta = '', scripts = [], locale = 'en', theme = '${themeConfig.default || 'light'}', fontPreloads = '', libraryTags = {} } = Astro.props;\n---\n<!DOCTYPE html>\n<html lang={locale} data-theme={theme}>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <Fragment set:html={\\`${iconTagsLiteral}\\`} />\n <Fragment set:html={fontPreloads} />\n <Fragment set:html={libraryTags.headCSS || ''} />\n <Fragment set:html={libraryTags.headJS || ''} />\n <Fragment set:html={meta} />\n <Fragment set:html={\\`${customHeadLiteral}\\`} />\n <title>{title}</title>\n</head>\n<body>\n <Fragment set:html={\\`${customBodyStartLiteral}\\`} />\n <slot />\n {scripts.map((s) => <script src={s} />)}\n <Fragment set:html={libraryTags.bodyEndJS || ''} />\n <Fragment set:html={\\`${customBodyEndLiteral}\\`} />${formHandlerBlock}\n</body>\n</html>\n`;\n\n await writeFile(join(layoutsDir, 'BaseLayout.astro'), baseLayoutContent, 'utf-8');\n\n // ----------------------------------------------------------\n // 7.5. Generate component .astro files\n // ----------------------------------------------------------\n let componentFileCount = 0;\n for (const [compName, compDef] of Object.entries(globalComponents)) {\n try {\n const astroContent = emitAstroComponent(compName, compDef, globalComponents, breakpoints, i18nConfig.defaultLocale, responsiveScales, remConversionConfig);\n await writeFile(join(componentsOutDir, `${compName}.astro`), astroContent, 'utf-8');\n componentFileCount++;\n } catch (error: any) {\n console.warn(` Warning: could not generate component ${compName}: ${error?.message}`);\n }\n }\n // ----------------------------------------------------------\n // 8. Generate .astro page files (component-structured)\n // ----------------------------------------------------------\n for (const result of allResults) {\n const importPath = layoutImportPath(result.fileDepth);\n\n // Write JavaScript to public/_scripts/ if present (only needed for SSR fallback pages)\n let scriptPaths: string[] = [];\n\n let astroContent: string;\n\n // Use component-structured emission for pages with page data\n if (result.pageData) {\n try {\n // Use SSR fallback collector from the initial render (paths already match nodeToAstro convention)\n const ssrFallbacks = result.ssrFallbackCollector ?? new Map<string, string>();\n\n // Compute slug map for locale list rendering\n const pageSlugMap: Record<string, string> | undefined =\n result.pageData.meta?.slugs\n ? computePageSlugMap(result.pageData.meta.slugs, i18nConfig)\n : undefined;\n\n // Component-structured pages don't need page-level _scripts/*.js\n // because each .astro component already has its own inline <script>\n astroContent = emitAstroPage({\n pageData: result.pageData,\n globalComponents,\n title: result.title,\n meta: result.meta,\n locale: result.locale,\n theme: defaultTheme,\n fontPreloads,\n libraryTags,\n scriptPaths: [],\n layoutImportPath: importPath,\n fileDepth: result.fileDepth,\n ssrFallbacks,\n pageName: result.pageName || 'index',\n breakpoints,\n responsiveScales,\n imageMetadataMap,\n i18nConfig: i18nConfig.locales.length > 1 ? i18nConfig : undefined,\n currentPageSlugMap: pageSlugMap,\n slugMappings: i18nConfig.locales.length > 1 ? slugMappings : undefined,\n imageFormat: configService.getImageFormat(),\n processedRawHtml: result.processedRawHtmlCollector,\n remConfig: remConversionConfig,\n });\n } catch (error: any) {\n // Fallback to SSR HTML if component emission fails \u2014 needs page-level script\n console.warn(` Warning: component emission failed for ${result.urlPath}, using SSR fallback: ${error?.message}`);\n scriptPaths = writePageScript(result.javascript, scriptsDir);\n astroContent = buildSSRFallbackPage(result, importPath, fontPreloads, libraryTags, defaultTheme, scriptPaths);\n }\n } else {\n // Pages without pageData: use SSR fallback \u2014 needs page-level script\n scriptPaths = writePageScript(result.javascript, scriptsDir);\n astroContent = buildSSRFallbackPage(result, importPath, fontPreloads, libraryTags, defaultTheme, scriptPaths);\n }\n\n const astroFileFull = join(pagesOutDir, result.astroFilePath);\n const astroFileDir = astroFileFull.substring(0, astroFileFull.lastIndexOf('/'));\n if (!existsSync(astroFileDir)) {\n mkdirSync(astroFileDir, { recursive: true });\n }\n\n await writeFile(astroFileFull, astroContent, 'utf-8');\n }\n\n // ----------------------------------------------------------\n // 8.5. Generate robots.txt endpoint\n // ----------------------------------------------------------\n const robotsTsContent = `import type { APIRoute } from 'astro';\n\nexport const GET: APIRoute = () => {\n const siteUrl = import.meta.env.SITE;\n const robotsTxt = [\n 'User-agent: *',\n 'Allow: /',\n '',\n siteUrl ? \\`Sitemap: \\${siteUrl}/sitemap-index.xml\\` : '',\n ].filter(Boolean).join('\\\\n');\n\n return new Response(robotsTxt, {\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\n });\n};\n`;\n await writeFile(join(pagesOutDir, 'robots.txt.ts'), robotsTsContent, 'utf-8');\n\n // ----------------------------------------------------------\n // 9. Generate CMS content collections (if templates exist)\n // ----------------------------------------------------------\n let collectionCount = 0;\n\n if (templateSchemas.length > 0) {\n const contentDir = join(srcDir, 'content');\n mkdirSync(contentDir, { recursive: true });\n\n const collectionDefs: string[] = [];\n\n for (const schema of templateSchemas) {\n const collectionDir = join(contentDir, schema.id);\n mkdirSync(collectionDir, { recursive: true });\n\n // Copy CMS item JSON files, resolving i18n values to default locale\n const cmsItemsDir = join(projectPaths.cms(), schema.id);\n if (existsSync(cmsItemsDir)) {\n const itemFiles = readdirSync(cmsItemsDir).filter(f => f.endsWith('.json'));\n\n for (const itemFile of itemFiles) {\n try {\n const rawContent = await readFile(join(cmsItemsDir, itemFile), 'utf-8');\n const item = JSON.parse(rawContent) as CMSItem;\n\n // Keep i18n values as-is so getStaticPaths() can resolve per-locale\n const resolved: Record<string, unknown> = { ...item };\n\n await writeFile(\n join(collectionDir, itemFile),\n JSON.stringify(resolved, null, 2),\n 'utf-8'\n );\n } catch (err: any) {\n console.warn(` Warning: could not process CMS item ${itemFile}: ${err?.message}`);\n }\n }\n }\n\n // Build Zod schema for this collection\n const fieldDefs: string[] = [];\n if (schema.fields) {\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n const zodType = cmsFieldToZod(fieldDef);\n const optional = fieldDef.required ? '' : '.optional()';\n fieldDefs.push(` ${fieldName}: ${zodType}${optional}`);\n }\n }\n\n collectionDefs.push(` '${schema.id}': defineCollection({\n loader: glob({ pattern: '**/*.json', base: './src/content/${schema.id}' }),\n schema: z.object({\n${fieldDefs.join(',\\n')}\n })\n })`);\n\n collectionCount++;\n }\n\n // Write src/content.config.ts (Astro 6 location \u2014 legacy src/content/config.ts is rejected)\n const configContent = `import { z, defineCollection } from 'astro:content';\nimport { glob } from 'astro/loaders';\n\nconst collections = {\n${collectionDefs.join(',\\n')}\n};\n\nexport { collections };\n`;\n\n await writeFile(join(srcDir, 'content.config.ts'), configContent, 'utf-8');\n }\n\n // ----------------------------------------------------------\n // 10. Copy assets\n // ----------------------------------------------------------\n // Images go to src/assets/images so Astro's asset pipeline can process\n // them via astro:assets `<Picture>` (hashing, on-edit reprocessing).\n // Everything else stays in public/ \u2014 fonts/icons/videos need stable URLs.\n\n const imagesSrcDir = join(projectPaths.project, 'images');\n if (existsSync(imagesSrcDir)) {\n // src/assets/images: used by static <Picture> via ESM imports + Vite asset\n // pipeline. Pre-baked responsive variants and manifest.json are excluded \u2014\n // Astro regenerates those from the originals.\n copyDirectory(imagesSrcDir, join(srcDir, 'assets', 'images'), shouldCopyImageForAstro);\n // public/images: used by the legacy <img>/<picture> srcset path and\n // rich-text image rewrites, which emit plain `/images/...` URLs pointing at\n // the pre-built variants. Without this mirror, any image not routed through\n // the static Picture path (variants referenced directly in a srcset,\n // CMS/template-bound images, component-prop images) 404s in `astro dev`.\n copyDirectory(imagesSrcDir, join(publicDir, 'images'));\n }\n\n const publicAssetDirs = ['fonts', 'icons', 'videos', 'assets'];\n for (const dir of publicAssetDirs) {\n const srcAssetDir = join(projectPaths.project, dir);\n if (existsSync(srcAssetDir)) {\n copyDirectory(srcAssetDir, join(publicDir, dir));\n }\n }\n\n // Copy libraries folder if it exists\n const librariesDir = join(projectPaths.project, 'libraries');\n if (existsSync(librariesDir)) {\n copyDirectory(librariesDir, join(publicDir, 'libraries'));\n }\n\n // Copy any project-root library files referenced by absolute URL in\n // project.config.json (e.g. `/custom.css`). Only copies entries we already\n // validated exist on disk during library tag generation above.\n for (const relPath of localLibsToCopy) {\n const srcPath = join(projectPaths.project, relPath);\n const destPath = join(publicDir, relPath);\n const destDir = destPath.substring(0, destPath.lastIndexOf('/'));\n if (destDir && !existsSync(destDir)) mkdirSync(destDir, { recursive: true });\n copyFileSync(srcPath, destPath);\n }\n\n // ----------------------------------------------------------\n // 11. Generate scaffold files\n // ----------------------------------------------------------\n\n // package.json\n const packageJson = {\n name: 'astro-export',\n type: 'module',\n version: '0.0.1',\n private: true,\n scripts: {\n dev: 'astro dev',\n start: 'astro dev',\n build: 'astro build',\n preview: 'astro preview',\n },\n dependencies: {\n 'astro': '^6.0.0',\n '@astrojs/sitemap': '^3.0.0',\n '@tailwindcss/vite': '^4.0.0',\n 'tailwindcss': '^4.0.0',\n },\n // Astro 6 expects Vite 7; pin it so npm doesn't pull Vite 8+ and warn.\n overrides: {\n 'vite': '^7.0.0',\n },\n };\n\n await writeFile(join(outDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');\n\n // astro.config.mjs\n const localeCodes = i18nConfig.locales.map(l => l.code);\n const i18nBlock = i18nConfig.locales.length > 1\n ? `\\n i18n: {\\n defaultLocale: '${i18nConfig.defaultLocale}',\\n locales: [${localeCodes.map(c => `'${c}'`).join(', ')}],\\n routing: { prefixDefaultLocale: false },\\n },`\n : '';\n\n const astroConfig = `import { defineConfig } from 'astro/config';\nimport tailwindcss from '@tailwindcss/vite';\nimport sitemap from '@astrojs/sitemap';\n\nexport default defineConfig({${siteUrl ? `\\n site: '${siteUrl}',` : ''}${i18nBlock}\n integrations: [sitemap()],\n vite: {\n plugins: [tailwindcss()],\n },\n});\n`;\n\n await writeFile(join(outDir, 'astro.config.mjs'), astroConfig, 'utf-8');\n\n // tsconfig.json\n const tsConfig = {\n extends: 'astro/tsconfigs/strict',\n };\n\n await writeFile(join(outDir, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2), 'utf-8');\n\n // src/env.d.ts \u2014 resolves astro:assets and other virtual module types in IDE\n await writeFile(join(outDir, 'src', 'env.d.ts'), '/// <reference path=\"../.astro/types.d.ts\" />\\n', 'utf-8');\n\n // ----------------------------------------------------------\n // 12. Summary\n // ----------------------------------------------------------\n const totalPages = allResults.length;\n\n return {\n pages: totalPages - cmsPageCount,\n cmsPages: cmsPageCount,\n collections: collectionCount,\n errors: errorCount,\n };\n}\n", "/**\n * Tailwind CSS Class Mapper for Astro Export\n * Converts CSS property:value pairs to Tailwind utility classes.\n * Uses exact-match table for common values, arbitrary value fallback for the rest.\n */\n\nimport type {\n StyleObject,\n ResponsiveStyleObject,\n StyleMapping,\n} from '../../shared/types/styles';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport type { ResponsiveScales, CSSPropertyType } from '../../shared/responsiveScaling';\nimport { getScaleMultiplier, scalePropertyValue } from '../../shared/responsiveScaling';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isStyleMapping(value: unknown): value is StyleMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as StyleMapping)._mapping === true\n );\n}\n\nfunction hasTemplateExpression(value: string): boolean {\n return /\\{\\{.+?\\}\\}/.test(value);\n}\n\nfunction isResponsiveStyle(\n style: StyleObject | ResponsiveStyleObject\n): style is ResponsiveStyleObject {\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n// ---------------------------------------------------------------------------\n// Exact match table: property+value \u2192 Tailwind class\n// ---------------------------------------------------------------------------\n\nconst exactMatches: Record<string, Record<string, string>> = {\n display: {\n flex: 'flex',\n grid: 'grid',\n block: 'block',\n none: 'hidden',\n inline: 'inline',\n 'inline-block': 'inline-block',\n 'inline-flex': 'inline-flex',\n 'inline-grid': 'inline-grid',\n },\n flexDirection: {\n column: 'flex-col',\n row: 'flex-row',\n 'column-reverse': 'flex-col-reverse',\n 'row-reverse': 'flex-row-reverse',\n },\n justifyContent: {\n center: 'justify-center',\n 'flex-start': 'justify-start',\n 'flex-end': 'justify-end',\n 'space-between': 'justify-between',\n 'space-around': 'justify-around',\n 'space-evenly': 'justify-evenly',\n // camelCase aliases (component data uses camelCase)\n spaceBetween: 'justify-between',\n spaceAround: 'justify-around',\n spaceEvenly: 'justify-evenly',\n flexStart: 'justify-start',\n flexEnd: 'justify-end',\n },\n alignItems: {\n center: 'items-center',\n 'flex-start': 'items-start',\n 'flex-end': 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n // camelCase aliases\n flexStart: 'items-start',\n flexEnd: 'items-end',\n },\n alignContent: {\n center: 'content-center',\n 'flex-start': 'content-start',\n 'flex-end': 'content-end',\n 'space-between': 'content-between',\n 'space-around': 'content-around',\n stretch: 'content-stretch',\n },\n alignSelf: {\n auto: 'self-auto',\n center: 'self-center',\n 'flex-start': 'self-start',\n 'flex-end': 'self-end',\n stretch: 'self-stretch',\n },\n position: {\n relative: 'relative',\n absolute: 'absolute',\n fixed: 'fixed',\n sticky: 'sticky',\n static: 'static',\n },\n overflow: {\n hidden: 'overflow-hidden',\n auto: 'overflow-auto',\n scroll: 'overflow-scroll',\n visible: 'overflow-visible',\n },\n overflowX: {\n hidden: 'overflow-x-hidden',\n auto: 'overflow-x-auto',\n scroll: 'overflow-x-scroll',\n visible: 'overflow-x-visible',\n },\n overflowY: {\n hidden: 'overflow-y-hidden',\n auto: 'overflow-y-auto',\n scroll: 'overflow-y-scroll',\n visible: 'overflow-y-visible',\n },\n cursor: {\n pointer: 'cursor-pointer',\n default: 'cursor-default',\n 'not-allowed': 'cursor-not-allowed',\n grab: 'cursor-grab',\n grabbing: 'cursor-grabbing',\n text: 'cursor-text',\n move: 'cursor-move',\n wait: 'cursor-wait',\n },\n textAlign: {\n center: 'text-center',\n left: 'text-left',\n right: 'text-right',\n justify: 'text-justify',\n },\n textDecoration: {\n none: 'no-underline',\n underline: 'underline',\n 'line-through': 'line-through',\n overline: 'overline',\n },\n textTransform: {\n uppercase: 'uppercase',\n lowercase: 'lowercase',\n capitalize: 'capitalize',\n none: 'normal-case',\n },\n objectFit: {\n cover: 'object-cover',\n contain: 'object-contain',\n fill: 'object-fill',\n none: 'object-none',\n 'scale-down': 'object-scale-down',\n },\n objectPosition: {\n center: 'object-center',\n top: 'object-top',\n bottom: 'object-bottom',\n left: 'object-left',\n right: 'object-right',\n },\n flexWrap: {\n wrap: 'flex-wrap',\n nowrap: 'flex-nowrap',\n 'wrap-reverse': 'flex-wrap-reverse',\n },\n pointerEvents: {\n none: 'pointer-events-none',\n auto: 'pointer-events-auto',\n },\n userSelect: {\n none: 'select-none',\n auto: 'select-auto',\n text: 'select-text',\n all: 'select-all',\n },\n visibility: {\n hidden: 'invisible',\n visible: 'visible',\n },\n whiteSpace: {\n normal: 'whitespace-normal',\n nowrap: 'whitespace-nowrap',\n pre: 'whitespace-pre',\n 'pre-wrap': 'whitespace-pre-wrap',\n 'pre-line': 'whitespace-pre-line',\n },\n wordBreak: {\n 'break-all': 'break-all',\n 'break-word': 'break-words',\n normal: 'break-normal',\n },\n listStyleType: {\n none: 'list-none',\n disc: 'list-disc',\n decimal: 'list-decimal',\n },\n listStylePosition: {\n inside: 'list-inside',\n outside: 'list-outside',\n },\n boxSizing: {\n 'border-box': 'box-border',\n 'content-box': 'box-content',\n },\n gridAutoFlow: {\n row: 'grid-flow-row',\n column: 'grid-flow-col',\n dense: 'grid-flow-dense',\n 'row dense': 'grid-flow-row-dense',\n 'column dense': 'grid-flow-col-dense',\n },\n};\n\n// Single-value exact matches (property \u2192 class when value matches)\nconst singleValueMatches: Record<string, string> = {\n // width/height 100%\n 'width:100%': 'w-full',\n 'height:100%': 'h-full',\n 'width:100vw': 'w-screen',\n 'height:100vh': 'h-screen',\n 'width:auto': 'w-auto',\n 'height:auto': 'h-auto',\n 'width:fit-content': 'w-fit',\n 'height:fit-content': 'h-fit',\n 'width:min-content': 'w-min',\n 'height:min-content': 'h-min',\n 'width:max-content': 'w-max',\n 'height:max-content': 'h-max',\n 'maxWidth:100%': 'max-w-full',\n 'maxWidth:none': 'max-w-none',\n 'maxHeight:100%': 'max-h-full',\n 'maxHeight:none': 'max-h-none',\n 'minWidth:0': 'min-w-0',\n 'minHeight:0': 'min-h-0',\n 'margin:auto': 'm-auto',\n 'margin:0 auto': 'mx-auto',\n 'marginLeft:auto': 'ml-auto',\n 'marginRight:auto': 'mr-auto',\n 'marginInline:auto': 'mx-auto',\n 'borderRadius:50%': 'rounded-full',\n 'borderRadius:9999px': 'rounded-full',\n 'borderRadius:0': 'rounded-none',\n 'flex:1': 'flex-1',\n 'flex:none': 'flex-none',\n 'flex:auto': 'flex-auto',\n 'flexGrow:0': 'grow-0',\n 'flexGrow:1': 'grow',\n 'flexShrink:0': 'shrink-0',\n 'flexShrink:1': 'shrink',\n 'opacity:0': 'opacity-0',\n 'opacity:1': 'opacity-100',\n 'zIndex:0': 'z-0',\n 'zIndex:10': 'z-10',\n 'zIndex:20': 'z-20',\n 'zIndex:30': 'z-30',\n 'zIndex:40': 'z-40',\n 'zIndex:50': 'z-50',\n 'inset:0': 'inset-0',\n 'top:0': 'top-0',\n 'right:0': 'right-0',\n 'bottom:0': 'bottom-0',\n 'left:0': 'left-0',\n 'outline:none': '[outline:none]',\n 'background:none': '[background:none]',\n 'background:transparent': '[background:transparent]',\n 'backgroundColor:transparent': 'bg-transparent',\n};\n\n// ---------------------------------------------------------------------------\n// Arbitrary value prefix map: CSS property \u2192 Tailwind prefix\n// ---------------------------------------------------------------------------\n\nconst arbitraryPrefixMap: Record<string, string> = {\n // Spacing\n padding: 'p',\n paddingTop: 'pt',\n paddingRight: 'pr',\n paddingBottom: 'pb',\n paddingLeft: 'pl',\n paddingInline: 'px',\n paddingBlock: 'py',\n margin: 'm',\n marginTop: 'mt',\n marginRight: 'mr',\n marginBottom: 'mb',\n marginLeft: 'ml',\n marginInline: 'mx',\n marginBlock: 'my',\n gap: 'gap',\n rowGap: 'gap-y',\n columnGap: 'gap-x',\n\n // Sizing\n width: 'w',\n height: 'h',\n maxWidth: 'max-w',\n maxHeight: 'max-h',\n minWidth: 'min-w',\n minHeight: 'min-h',\n\n // Typography\n fontSize: 'text',\n fontWeight: 'font',\n fontFamily: 'font',\n lineHeight: 'leading',\n letterSpacing: 'tracking',\n\n // Borders\n borderRadius: 'rounded',\n borderTopLeftRadius: 'rounded-tl',\n borderTopRightRadius: 'rounded-tr',\n borderBottomLeftRadius: 'rounded-bl',\n borderBottomRightRadius: 'rounded-br',\n border: 'border',\n borderTop: 'border-t',\n borderRight: 'border-r',\n borderBottom: 'border-b',\n borderLeft: 'border-l',\n borderColor: 'border',\n\n // Colors\n color: 'text',\n backgroundColor: 'bg',\n background: 'bg',\n backgroundImage: 'bg',\n\n // Effects\n opacity: 'opacity',\n boxShadow: 'shadow',\n textShadow: '[text-shadow]',\n filter: '[filter]',\n backdropFilter: 'backdrop',\n transform: '[transform]',\n transformOrigin: 'origin',\n transition: '[transition]',\n mixBlendMode: 'mix-blend',\n clipPath: '[clip-path]',\n\n // Positioning\n top: 'top',\n right: 'right',\n bottom: 'bottom',\n left: 'left',\n inset: 'inset',\n zIndex: 'z',\n\n // Grid\n gridTemplateColumns: 'grid-cols',\n gridTemplateRows: 'grid-rows',\n gridColumn: 'col',\n gridRow: 'row',\n gridAutoRows: 'auto-rows',\n gridAutoColumns: 'auto-cols',\n\n // Flexbox extras\n flexGrow: 'grow',\n flexShrink: 'shrink',\n flexBasis: 'basis',\n order: 'order',\n flex: 'flex',\n\n // Aspect ratio\n aspectRatio: 'aspect',\n\n // Outline\n outline: 'outline',\n outlineWidth: 'outline',\n outlineOffset: 'outline-offset',\n outlineColor: 'outline',\n\n // Other\n accentColor: 'accent',\n textIndent: '[text-indent]',\n verticalAlign: 'align',\n overflowWrap: '[overflow-wrap]',\n scrollBehavior: 'scroll',\n resize: 'resize',\n};\n\n// ---------------------------------------------------------------------------\n// Core conversion functions\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a single CSS property:value pair to a Tailwind class.\n * Returns null if the value should be skipped (mappings, templates).\n */\nexport function propertyToTailwind(\n property: string,\n value: string | number\n): string | null {\n const strValue = String(value);\n\n // Skip empty values \u2014 they produce broken classes like gap-[], mt-[]\n if (strValue === '') return null;\n\n // Skip template expressions \u2014 these must be handled via inline style\n if (hasTemplateExpression(strValue)) return null;\n\n // Check single-value exact matches first\n const singleKey = `${property}:${strValue}`;\n if (singleValueMatches[singleKey]) {\n return singleValueMatches[singleKey];\n }\n\n // Check exact match table\n if (exactMatches[property]?.[strValue]) {\n return exactMatches[property][strValue];\n }\n\n // Color variable handling:\n // \"var(--text)\" \u2192 \"text-[color:var(--text)]\" (type hint avoids ambiguity with font-size)\n // Bare color name like \"text\" \u2192 \"text-[color:var(--text)]\"\n if (property === 'color' || property === 'backgroundColor' || property === 'borderColor') {\n const prefix = property === 'color' ? 'text' : property === 'backgroundColor' ? 'bg' : 'border';\n if (strValue.includes('var(')) {\n return `${prefix}-[color:${strValue}]`;\n }\n // Bare name (not a hex, rgb, or number-starting value)\n if (!strValue.match(/^[#\\d]/) && !strValue.includes('rgb') && !strValue.includes('hsl')) {\n return `${prefix}-[color:var(--${strValue})]`;\n }\n }\n\n // Color properties with actual color values need type hints to avoid ambiguity\n if (property === 'borderColor' || property === 'color') {\n const prefix = property === 'color' ? 'text' : 'border';\n const sanitized = strValue.replace(/\\s+/g, '_');\n return `${prefix}-[color:${sanitized}]`;\n }\n\n // Border shorthand (e.g., \"1px solid\", \"2px solid var(--border)\") needs arbitrary property syntax\n // because Tailwind's border-[...] only accepts width values, not compound shorthands\n if (property === 'border' || property === 'borderTop' || property === 'borderRight' ||\n property === 'borderBottom' || property === 'borderLeft') {\n if (strValue.includes('solid') || strValue.includes('dashed') || strValue.includes('dotted') || strValue.includes('none')) {\n const cssProp = property.replace(/([A-Z])/g, '-$1').toLowerCase();\n const sanitized = strValue.replace(/\\s+/g, '_');\n return `[${cssProp}:${sanitized}]`;\n }\n }\n\n // `background` is a CSS shorthand \u2014 Tailwind's bg-[...] maps to background-color, not background.\n // For non-color values (none, transparent, gradients, etc.), use arbitrary property syntax.\n if (property === 'background') {\n const isSimpleColor = /^(#[0-9a-fA-F]{3,8}|rgb|hsl|var\\()/.test(strValue);\n if (!isSimpleColor) {\n const sanitized = strValue.replace(/\\s+/g, '_');\n return `[background:${sanitized}]`;\n }\n }\n\n // Arbitrary value fallback\n const twPrefix = arbitraryPrefixMap[property];\n if (!twPrefix) {\n // Unknown property: use arbitrary property syntax\n const cssProp = property.replace(/([A-Z])/g, '-$1').toLowerCase();\n const sanitized = strValue.replace(/\\s+/g, '_');\n return `[${cssProp}:${sanitized}]`;\n }\n\n // For prefixes that start with '[' it's an arbitrary property\n if (twPrefix.startsWith('[')) {\n const sanitized = strValue.replace(/\\s+/g, '_');\n return `${twPrefix.slice(0, -1)}:${sanitized}]`;\n }\n\n // Standard arbitrary value: prefix-[value]\n const sanitized = strValue.replace(/\\s+/g, '_');\n\n // Disambiguate properties that share a Tailwind prefix with another CSS property.\n // Without type hints, Tailwind guesses wrong (e.g., text-[var(--x)] \u2192 color instead of font-size).\n if (property === 'fontSize') {\n return `text-[length:${sanitized}]`;\n }\n if (property === 'fontFamily') {\n return `font-[family-name:${sanitized}]`;\n }\n if (property === 'fontWeight') {\n return `font-[number:${sanitized}]`;\n }\n\n return `${twPrefix}-[${sanitized}]`;\n}\n\n/**\n * Convert a flat style object to an array of Tailwind classes.\n * Skips StyleMapping values (handled separately via class:list).\n * Returns { classes, dynamicStyles } where dynamicStyles are template-expression\n * styles that need inline style attributes.\n */\nexport function stylesToTailwind(\n style: StyleObject | Record<string, string | number>\n): { classes: string[]; dynamicStyles: Record<string, string> } {\n const classes: string[] = [];\n const dynamicStyles: Record<string, string> = {};\n\n // When borderColor is present alongside a border shorthand, Tailwind's CSS\n // ordering can cause the shorthand's arbitrary property `[border:...]` to\n // override the longhand `border-[color:...]`. To avoid this, decompose\n // border shorthands into width + style only (dropping the color part) so\n // borderColor can take effect without conflicts.\n const hasBorderColor = 'borderColor' in style && !isStyleMapping(style.borderColor);\n const borderShorthands = new Set([\n 'border', 'borderTop', 'borderRight', 'borderBottom', 'borderLeft',\n ]);\n\n for (const [prop, value] of Object.entries(style)) {\n if (isStyleMapping(value)) continue;\n\n const strValue = String(value);\n\n // Template expressions go to dynamic/inline styles\n if (hasTemplateExpression(strValue)) {\n const cssProp = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n dynamicStyles[cssProp] = strValue;\n continue;\n }\n\n // Decompose border shorthands when borderColor is separately specified\n if (hasBorderColor && borderShorthands.has(prop)) {\n const parts = strValue.split(/\\s+/);\n // Parse width and style from shorthand (e.g. \"1px solid #ccc\" \u2192 \"1px\", \"solid\")\n const width = parts.find(p => /^\\d/.test(p) || p === '0');\n const borderStyle = parts.find(p => /^(solid|dashed|dotted|double|groove|ridge|inset|outset|none|hidden)$/.test(p));\n const cssProp = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n if (width) classes.push(`[${cssProp}-width:${width}]`);\n if (borderStyle) classes.push(`[${cssProp}-style:${borderStyle}]`);\n continue;\n }\n\n const twClass = propertyToTailwind(prop, value);\n if (twClass) {\n classes.push(twClass);\n }\n }\n\n return { classes, dynamicStyles };\n}\n\n/**\n * Convert a responsive style object to Tailwind classes with responsive prefixes.\n * Uses desktop-first max-width breakpoints.\n *\n * - base styles \u2192 no prefix (desktop default)\n * - tablet styles \u2192 max-[{breakpoint}px]: prefix\n * - mobile styles \u2192 max-[{breakpoint}px]: prefix\n */\nexport function responsiveStylesToTailwind(\n style: StyleObject | ResponsiveStyleObject | null | undefined,\n breakpoints: BreakpointConfig,\n responsiveScales?: ResponsiveScales\n): { classes: string[]; dynamicStyles: Record<string, string> } {\n if (!style) return { classes: [], dynamicStyles: {} };\n\n const allClasses: string[] = [];\n const allDynamicStyles: Record<string, string> = {};\n\n if (isResponsiveStyle(style)) {\n const responsive = style as ResponsiveStyleObject;\n\n // Base styles (no prefix)\n if (responsive.base) {\n const { classes, dynamicStyles } = stylesToTailwind(responsive.base);\n allClasses.push(...classes);\n Object.assign(allDynamicStyles, dynamicStyles);\n }\n\n // Tablet styles\n if (responsive.tablet) {\n const bpValue = breakpoints.tablet?.breakpoint ?? 1024;\n const prefix = `max-[${bpValue}px]:`;\n const { classes, dynamicStyles } = stylesToTailwind(responsive.tablet);\n allClasses.push(...classes.map(cls => `${prefix}${cls}`));\n // Dynamic styles for tablet \u2014 just merge (can't do responsive inline styles easily)\n Object.assign(allDynamicStyles, dynamicStyles);\n }\n\n // Mobile styles\n if (responsive.mobile) {\n const bpValue = breakpoints.mobile?.breakpoint ?? 540;\n const prefix = `max-[${bpValue}px]:`;\n const { classes, dynamicStyles } = stylesToTailwind(responsive.mobile);\n allClasses.push(...classes.map(cls => `${prefix}${cls}`));\n Object.assign(allDynamicStyles, dynamicStyles);\n }\n\n // Handle any other custom breakpoints\n for (const [bpName, bpStyle] of Object.entries(responsive)) {\n if (bpName === 'base' || bpName === 'tablet' || bpName === 'mobile' || !bpStyle) continue;\n const bpValue = breakpoints[bpName]?.breakpoint;\n if (!bpValue) continue;\n const prefix = `max-[${bpValue}px]:`;\n const { classes, dynamicStyles } = stylesToTailwind(bpStyle);\n allClasses.push(...classes.map(cls => `${prefix}${cls}`));\n Object.assign(allDynamicStyles, dynamicStyles);\n }\n\n // Auto-responsive scaling: for each scalable base property, emit scaled\n // max-[Npx]: variants for every enabled breakpoint that doesn't already\n // have an explicit override for that property.\n if (responsiveScales?.enabled === true && responsive.base) {\n appendAutoScaledClasses(responsive, breakpoints, responsiveScales, allClasses);\n }\n } else {\n // Flat style object \u2014 treat as base\n const { classes, dynamicStyles } = stylesToTailwind(style as StyleObject);\n allClasses.push(...classes);\n Object.assign(allDynamicStyles, dynamicStyles);\n }\n\n return { classes: allClasses, dynamicStyles: allDynamicStyles };\n}\n\n/**\n * Emit `max-[Npx]:` class variants with pre-scaled values for every base\n * property in a scale category, skipping breakpoints where the author set\n * an explicit override for the same property.\n *\n * Breakpoints are processed in descending pixel order so the emitted class\n * order matches the cascade order Tailwind's variant compiler expects.\n */\nfunction appendAutoScaledClasses(\n responsive: ResponsiveStyleObject,\n breakpoints: BreakpointConfig,\n responsiveScales: ResponsiveScales,\n out: string[]\n): void {\n const base = responsive.base;\n if (!base) return;\n\n const baseRef = responsiveScales.baseReference ?? 16;\n\n const sortedBps = Object.entries(breakpoints)\n .map(([name, cfg]) => ({ name, value: cfg?.breakpoint }))\n .filter((bp): bp is { name: string; value: number } =>\n typeof bp.value === 'number' && bp.value > 0\n )\n .sort((a, b) => b.value - a.value);\n\n for (const [property, value] of Object.entries(base)) {\n if (isStyleMapping(value)) continue;\n if (value == null) continue;\n\n const strValue = String(value);\n if (strValue === '' || hasTemplateExpression(strValue)) continue;\n\n for (const { name: bpName, value: bpPixels } of sortedBps) {\n // Explicit override at this breakpoint wins \u2014 skip auto-scaling.\n const bpBranch = responsive[bpName] as StyleObject | undefined;\n if (bpBranch && property in bpBranch) continue;\n\n const scale = getScaleMultiplier(\n responsiveScales,\n property as CSSPropertyType,\n bpName\n );\n if (scale == null) continue;\n\n const scaledValue = scalePropertyValue(strValue, baseRef, scale);\n if (scaledValue == null || scaledValue === strValue) continue;\n\n const scaledClass = propertyToTailwind(property, scaledValue);\n if (!scaledClass) continue;\n\n out.push(`max-[${bpPixels}px]:${scaledClass}`);\n }\n }\n}\n", "/**\n * Core converter: ComponentNode \u2192 Astro template markup\n * Recursively walks JSON node trees and emits Astro template syntax.\n */\n\nimport type {\n ComponentNode,\n ComponentDefinition,\n StructuredComponentDefinition,\n PropDefinition,\n HtmlNode,\n ComponentInstanceNode,\n SlotMarker,\n EmbedNode,\n LinkNode,\n LocaleListNode,\n I18nConfig,\n CMSSchema,\n ListNode,\n} from '../../shared/types';\nimport { singularize } from '../../shared/types';\nimport type {\n StyleObject,\n ResponsiveStyleObject,\n StyleMapping,\n InteractiveStyles,\n LinkMapping,\n HtmlMapping,\n} from '../../shared/types/styles';\nimport { responsiveStylesToTailwind, propertyToTailwind } from './tailwindMapper';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport { generateElementClassName, type ElementClassContext } from '../../shared/elementClassName';\nimport { isVoidElement, hasIf, hasChildren, isSlotContent as isSlotContentNode } from '../../shared/nodeUtils';\nimport { NODE_TYPE, RAW_HTML_PREFIX } from '../../shared/constants';\nimport { extractInteractiveStyleMappings, hasInteractiveStyleMappings } from '../../shared/interactiveStyleMappings';\nimport type { ImageMetadataMap } from '../ssr/imageMetadata';\nimport { isI18nValue, resolveI18nValue, DEFAULT_I18N_CONFIG, buildLocalizedPath } from '../../shared/i18n';\nimport { transformCMSTemplate, isTemplateExpression, transformItemTemplate, replaceItemMetaVars, rewriteItemVar } from './templateTransformer';\nimport type { SlugMap } from '../../shared/slugTranslator';\nimport { buildSlugIndex, translatePath } from '../../shared/slugTranslator';\nimport { stripRawHtmlPrefixDeep, astroComponentName } from './astroEmitHelpers';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AstroEmitContext {\n /** Component names collected for import statements */\n imports: Set<string>;\n /** true = inside component definition (use prop refs) */\n isComponentDef: boolean;\n /** Available props when in component */\n componentProps: Record<string, PropDefinition>;\n /** All global components */\n globalComponents: Record<string, ComponentDefinition>;\n /** Current indentation level */\n indent: number;\n /** node path \u2192 SSR HTML for complex nodes */\n ssrFallbacks: Map<string, string>;\n /** Current element path for element class generation */\n elementPath: number[];\n /** File type for element class context */\n fileType: 'component' | 'page';\n /** File name for element class context */\n fileName: string;\n /** Breakpoint config for responsive Tailwind classes */\n breakpoints: BreakpointConfig;\n /** Responsive scales config for auto-scaling spacing/typography/sizing */\n responsiveScales?: ResponsiveScales;\n /** Dynamic tag definitions collected during traversal (for frontmatter) */\n dynamicTags?: Map<string, string>;\n /** Image metadata map for responsive image generation */\n imageMetadataMap?: ImageMetadataMap;\n /** Page locale for resolving i18n values */\n locale?: string;\n /** CMS mode: transform {{cms.field}} to entry data expressions */\n cmsMode?: boolean;\n /** Variable name bound to the CMS entry (default: 'entry') */\n cmsEntryBinding?: string;\n /** Rich-text field names for CMS mode (use Fragment set:html) */\n cmsRichTextFields?: Set<string>;\n /** Current list item iteration variable name */\n listItemBinding?: string;\n /** Extra frontmatter code lines collected during emission */\n frontmatterLines?: string[];\n /** Astro API imports needed (e.g., 'getCollection') */\n astroImports?: Set<string>;\n /** Full i18n config for locale list emission */\n i18nConfig?: I18nConfig;\n /** locale\u2192slug for current page (for locale list links) */\n currentPageSlugMap?: Record<string, string>;\n /** CMS schema for rich-text field detection */\n cmsSchema?: CMSSchema;\n /** Wrap function name for i18n resolution (e.g., 'r') */\n cmsWrapFn?: string;\n /** Default locale for i18n resolver (used in component defs) */\n defaultLocale?: string;\n /** Set to true during emission when an i18n object is encountered in a component def */\n needsI18nResolver?: boolean;\n /** Index variable name for current list .map() callback (e.g., \"itemIndex\") */\n listIndexVar?: string;\n /** Source array expression for current list (e.g., \"items\"), used for itemLast */\n listSourceVar?: string;\n /** Slug mappings for translating internal links */\n slugMappings?: SlugMap[];\n /** I18n default locale (for slug translation) */\n i18nDefaultLocale?: string;\n /**\n * Raw-HTML slice \u2192 processed HTML captured during the SSR pass for this page.\n * Used by the RAW_HTML_PREFIX branch to emit rich-text content that has had\n * image rewriting, component expansion, and link localization applied.\n */\n processedRawHtml?: Map<string, string>;\n /** Image format: 'webp' uses plain <img>, 'avif' uses <picture> with AVIF+WebP sources */\n imageFormat?: 'webp' | 'avif';\n /**\n * Static image imports collected during emission: varName \u2192 import path\n * relative to the emitting file. Drives `import foo from '...'` in\n * frontmatter and unlocks astro:assets <Picture> for static local images.\n *\n * Note: this is a Map (ref-shared across child ctx spreads), so mutations\n * inside list/dynamic inner contexts remain visible to the parent. A\n * separate boolean flag would be dropped by `{ ...ctx }` shallow copies \u2014\n * the presence of any entry here implies `import { Picture } from 'astro:assets'`.\n */\n imageImports?: Map<string, string>;\n /** File depth (relative to src/pages or src/components) for import path computation */\n fileDepth?: number;\n /** Collected interactive styles during emission: elementClass \u2192 InteractiveStyles */\n collectedInteractiveStyles?: Map<string, InteractiveStyles>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction ind(ctx: AstroEmitContext): string {\n return ' '.repeat(ctx.indent);\n}\n\nfunction localizeHref(href: string, ctx: AstroEmitContext): string {\n if (!href.startsWith('/') || href.startsWith('//')) return href;\n const { locale, i18nDefaultLocale, slugMappings } = ctx;\n if (!locale || !i18nDefaultLocale) return href;\n if (slugMappings && slugMappings.length > 0) {\n const slugIndex = buildSlugIndex(slugMappings);\n return translatePath(href, locale, i18nDefaultLocale, i18nDefaultLocale, slugIndex);\n } else if (locale !== i18nDefaultLocale) {\n return buildLocalizedPath(href, locale);\n }\n return href;\n}\n\nfunction isStyleMapping(value: unknown): value is StyleMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as StyleMapping)._mapping === true\n );\n}\n\nfunction isLinkMapping(value: unknown): value is LinkMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as LinkMapping)._mapping === true\n );\n}\n\n/**\n * Emit a single attribute key=value, applying CMS/list template transformation if needed.\n */\nfunction emitAttrValue(key: string, value: string, ctx: AstroEmitContext): string {\n if (ctx.cmsMode && /\\{\\{cms\\./.test(value)) {\n const b = ctx.cmsEntryBinding || 'entry';\n const w = (expr: string) => ctx.cmsWrapFn ? `${ctx.cmsWrapFn}(${expr})` : expr;\n const fullMatch = value.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (fullMatch) {\n return `${key}={${w(`${b}.data.${fullMatch[1].trim()}`)}}`;\n }\n const replaced = value.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (_, fp) =>\n `\\${${w(`${b}.data.${fp.trim()}`)}}`\n );\n return `${key}={\\`${replaced}\\`}`;\n }\n if (ctx.listItemBinding && /\\{\\{/.test(value)) {\n const fullMatch = value.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let expr = fullMatch[1].trim();\n expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n return `${key}={${expr}}`;\n }\n const replaced = value.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n trimmed = rewriteItemVar(trimmed, ctx.listItemBinding!);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n return `\\${${trimmed}}`;\n });\n return `${key}={\\`${replaced}\\`}`;\n }\n return `${key}=\"${escapeJSX(value)}\"`;\n}\n\nfunction isHtmlMapping(value: unknown): value is HtmlMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as HtmlMapping)._mapping === true\n );\n}\n\nfunction isResponsiveStyle(\n style: StyleObject | ResponsiveStyleObject\n): style is ResponsiveStyleObject {\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n/**\n * Escape a string for use in Astro JSX attribute\n */\nfunction escapeJSX(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n/**\n * Escape a string for use inside a JS template literal\n */\nfunction escapeTemplateLiteral(s: string): string {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$\\{/g, '\\\\${')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\n/**\n * Get all style mappings from a style value, collecting { prop, property, values } tuples\n */\nfunction collectStyleMappings(\n style: StyleObject | ResponsiveStyleObject | undefined\n): Array<{ property: string; mapping: StyleMapping; breakpoint?: string }> {\n if (!style) return [];\n const result: Array<{ property: string; mapping: StyleMapping; breakpoint?: string }> = [];\n\n if (isResponsiveStyle(style)) {\n const responsive = style as ResponsiveStyleObject;\n for (const [bp, bpStyle] of Object.entries(responsive)) {\n if (!bpStyle) continue;\n for (const [prop, value] of Object.entries(bpStyle)) {\n if (isStyleMapping(value)) {\n result.push({ property: prop, mapping: value, breakpoint: bp });\n }\n }\n }\n } else {\n for (const [prop, value] of Object.entries(style)) {\n if (isStyleMapping(value)) {\n result.push({ property: prop, mapping: value });\n }\n }\n }\n return result;\n}\n\n/**\n * Convert a style mapping to class:list conditional entries.\n * For each value in the mapping, generates the utility class name and a ternary.\n */\nfunction mappingToClassListEntries(\n mapping: StyleMapping,\n property: string,\n breakpointPrefix: string,\n ctx: AstroEmitContext\n): string[] {\n const entries: string[] = [];\n const values = Object.entries(mapping.values);\n if (values.length === 0) return entries;\n\n // Generate utility class for each possible value\n const propRef = ctx.isComponentDef ? mapping.prop : mapping.prop;\n\n if (values.length === 2) {\n const [[val1, css1], [val2, css2]] = values;\n // Generate Tailwind classes for each possible mapping value\n const cls1 = getClassForValue(property, css1, breakpointPrefix);\n const cls2 = getClassForValue(property, css2, breakpointPrefix);\n if (cls1 && cls2) {\n // Use String() coercion so number props match string mapping keys (e.g., size=2 matches \"2\")\n entries.push(`String(${propRef}) === ${JSON.stringify(String(coerceValue(val1)))} ? '${cls1}' : '${cls2}'`);\n }\n } else {\n // Multiple values: use a lookup object or multiple ternaries\n for (const [val, cssValue] of values) {\n const cls = getClassForValue(property, cssValue, breakpointPrefix);\n if (cls) {\n entries.push(`String(${propRef}) === ${JSON.stringify(String(coerceValue(val)))} && '${cls}'`);\n }\n }\n }\n\n return entries;\n}\n\n/**\n * Convert a mapping key to the right JS type (booleans stay booleans)\n */\nfunction coerceValue(val: string): string | boolean {\n if (val === 'true') return true;\n if (val === 'false') return false;\n return val;\n}\n\n/**\n * Generate a Tailwind class name for a single property:value pair\n */\nfunction getClassForValue(\n property: string,\n value: string | number,\n breakpointPrefix: string\n): string | null {\n const twClass = propertyToTailwind(property, value);\n if (!twClass) return null;\n return breakpointPrefix ? `${breakpointPrefix}${twClass}` : twClass;\n}\n\n/**\n * Build the class list for a node, handling static Tailwind classes and mapping-based conditionals.\n * Also returns a style attribute string for dynamic (template-expression) styles.\n */\nfunction buildClassAndStyleExpression(\n style: StyleObject | ResponsiveStyleObject | undefined,\n interactiveStyles: InteractiveStyles | undefined,\n elementClass: string | null,\n ctx: AstroEmitContext\n): { classExpr: string; styleAttr: string } {\n // Static Tailwind classes from non-mapping styles\n const result = style\n ? responsiveStylesToTailwind(style, ctx.breakpoints, ctx.responsiveScales)\n : { classes: [], dynamicStyles: {} };\n const staticClasses = result.classes;\n const dynamicStyles = result.dynamicStyles;\n\n // Add element class for interactive styles\n if (elementClass) {\n staticClasses.unshift(elementClass);\n }\n\n // Collect mapping-based conditionals\n const conditionals: string[] = [];\n const mappings = collectStyleMappings(style);\n\n for (const { property, mapping, breakpoint } of mappings) {\n const bpValue = breakpoint === 'tablet'\n ? ctx.breakpoints.tablet?.breakpoint ?? 1024\n : breakpoint === 'mobile'\n ? ctx.breakpoints.mobile?.breakpoint ?? 540\n : 0;\n const prefix = bpValue ? `max-[${bpValue}px]:` : '';\n const entries = mappingToClassListEntries(mapping, property, prefix, ctx);\n conditionals.push(...entries);\n }\n\n // Build style attribute for dynamic (template expression) styles\n let styleAttr = '';\n if (Object.keys(dynamicStyles).length > 0 && ctx.isComponentDef) {\n const styleParts: string[] = [];\n for (const [cssProp, value] of Object.entries(dynamicStyles)) {\n // Convert {{propName}} to Astro expression in style\n const resolved = value.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n if (ctx.listItemBinding) trimmed = rewriteItemVar(trimmed, ctx.listItemBinding);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n return `\\${${trimmed}}`;\n });\n styleParts.push(`${cssProp}: \\${${resolved.includes('${') ? resolved.replace(/\\$\\{(.+?)\\}/g, '$1') : `'${resolved}'`}}`);\n }\n // Build as template literal style attribute\n const entries: string[] = [];\n for (const [cssProp, value] of Object.entries(dynamicStyles)) {\n const resolved = value.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n if (ctx.listItemBinding) trimmed = rewriteItemVar(trimmed, ctx.listItemBinding);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n return `\\${${trimmed}}`;\n });\n entries.push(`${cssProp}: ${resolved}`);\n }\n styleAttr = ` style={\\`${entries.join('; ')}\\`}`;\n }\n\n // Handle interactive style mappings: emit --is-N CSS variables as inline style\n if (interactiveStyles && interactiveStyles.length > 0 && ctx.isComponentDef && hasInteractiveStyleMappings(interactiveStyles)) {\n const { mappings } = extractInteractiveStyleMappings(interactiveStyles);\n if (mappings.length > 0) {\n // Group mappings by prop for efficient ternary generation\n const varParts: string[] = [];\n for (const extracted of mappings) {\n const { mapping, variableIndex } = extracted;\n const varName = `--is-${variableIndex}`;\n const entries = Object.entries(mapping.values);\n\n if (entries.length === 2) {\n const [[val1, css1], [val2, css2]] = entries;\n varParts.push(`'${varName}': ${mapping.prop} === ${JSON.stringify(coerceValue(val1))} ? '${css1}' : '${css2}'`);\n } else {\n // Build a lookup object inline\n const lookupEntries = entries\n .filter(([, v]) => v !== '')\n .map(([k, v]) => `${JSON.stringify(coerceValue(k))}: '${v}'`)\n .join(', ');\n varParts.push(`'${varName}': ({${lookupEntries}})[${mapping.prop}] || ''`);\n }\n }\n\n // Merge with existing dynamic styles\n if (varParts.length > 0) {\n const existingStyleParts = styleAttr\n ? styleAttr.replace(/^ style=\\{`/, '').replace(/`\\}$/, '')\n : '';\n const varStyleExpr = varParts.join(', ');\n if (existingStyleParts) {\n styleAttr = ` style={\\`${existingStyleParts}; \\${ Object.entries({${varStyleExpr}}).map(([k,v]) => \\`\\${k}:\\${v}\\`).join(';') }\\`}`;\n } else {\n styleAttr = ` style={Object.entries({${varStyleExpr}}).map(([k,v]) => \\`\\${k}:\\${v}\\`).join(';')}`;\n }\n }\n }\n }\n\n let classExpr: string;\n if (conditionals.length === 0) {\n // Pure static classes\n if (staticClasses.length === 0) {\n classExpr = '';\n } else {\n classExpr = ` class=\"${staticClasses.join(' ')}\"`;\n }\n } else {\n // Use class:list with both static and dynamic\n const parts: string[] = [];\n if (staticClasses.length > 0) {\n parts.push(`'${staticClasses.join(' ')}'`);\n }\n parts.push(...conditionals);\n classExpr = ` class:list={[${parts.join(', ')}]}`;\n }\n\n return { classExpr, styleAttr };\n}\n\n/**\n * Convert {{propName}} template to Astro expression\n */\nfunction resolveTemplate(text: string, ctx: AstroEmitContext): string {\n if (!ctx.isComponentDef) {\n // In page context, templates can't be resolved - return literal\n return text;\n }\n // Check if entire text is a single {{expression}}\n const fullMatch = text.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let propName = fullMatch[1].trim();\n if (ctx.listItemBinding) propName = rewriteItemVar(propName, ctx.listItemBinding);\n if (ctx.listIndexVar) propName = replaceItemMetaVars(propName, ctx.listIndexVar, ctx.listSourceVar);\n // Rich-text props contain HTML - render unescaped via set:html\n if (ctx.componentProps[propName]?.type === 'rich-text' || ctx.componentProps[propName]?.type === 'embed') {\n return `<Fragment set:html={${propName}} />`;\n }\n return `{${propName}}`;\n }\n // Mixed content: replace each {{expr}} with {expr}\n return text.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n if (ctx.listItemBinding) trimmed = rewriteItemVar(trimmed, ctx.listItemBinding);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n return `{${trimmed}}`;\n });\n}\n\n/**\n * Check if text contains template expressions\n */\nfunction hasTemplates(text: string): boolean {\n return /\\{\\{.+?\\}\\}/.test(text);\n}\n\n/**\n * Build element class name for interactive styles\n */\nfunction buildElementClass(\n ctx: AstroEmitContext,\n label: string | undefined\n): string {\n return generateElementClassName({\n fileType: ctx.fileType,\n fileName: ctx.fileName,\n label,\n path: ctx.elementPath,\n });\n}\n\n\n/**\n * Build HTML attributes string from node attributes\n */\nfunction buildAttributesString(\n attributes: Record<string, string | number | boolean> | undefined,\n ctx: AstroEmitContext\n): string {\n if (!attributes) return '';\n const parts: string[] = [];\n for (const [key, value] of Object.entries(attributes)) {\n if (typeof value === 'boolean') {\n if (value) parts.push(key);\n } else {\n const strVal = String(value);\n if (hasTemplates(strVal) && ctx.isComponentDef) {\n // Check if entire value is a single {{expression}}\n const fullMatch = strVal.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let expr = fullMatch[1].trim();\n if (ctx.listItemBinding) expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n const propDef = ctx.componentProps[expr];\n if (propDef && propDef.type === 'link') {\n parts.push(`${key}={${expr}?.href ?? \"#\"}`);\n } else {\n parts.push(`${key}={${expr} || undefined}`);\n }\n } else {\n // Mixed content: use template literal\n const resolved = strVal.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n if (ctx.listItemBinding) trimmed = rewriteItemVar(trimmed, ctx.listItemBinding);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n const pd = ctx.componentProps[trimmed];\n return pd?.type === 'link' ? `\\${${trimmed}?.href ?? \"#\"}` : `\\${${trimmed}}`;\n });\n parts.push(`${key}={\\`${resolved}\\`}`);\n }\n } else if (ctx.listItemBinding && hasTemplates(strVal)) {\n // List item binding: transform {{item.field}} in attributes\n const fullMatch = strVal.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let expr = fullMatch[1].trim();\n expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n parts.push(`${key}={${expr} || undefined}`);\n } else {\n const resolved = strVal.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n trimmed = rewriteItemVar(trimmed, ctx.listItemBinding!);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n return `\\${${trimmed}}`;\n });\n parts.push(`${key}={\\`${resolved}\\`}`);\n }\n } else if (ctx.cmsMode && /\\{\\{cms\\./.test(strVal)) {\n // CMS mode: transform {{cms.field}} in attributes\n const b = ctx.cmsEntryBinding || 'entry';\n const w = (expr: string) => ctx.cmsWrapFn ? `${ctx.cmsWrapFn}(${expr})` : expr;\n const fullMatch = strVal.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (fullMatch) {\n parts.push(`${key}={${w(`${b}.data.${fullMatch[1].trim()}`)}}`);\n } else {\n const replaced = strVal.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (_, fieldPath) => {\n return `\\${${w(`${b}.data.${fieldPath.trim()}`)}}`;\n });\n parts.push(`${key}={\\`${replaced}\\`}`);\n }\n } else {\n parts.push(`${key}=\"${escapeJSX(strVal)}\"`);\n }\n }\n }\n return parts.length > 0 ? ' ' + parts.join(' ') : '';\n}\n\n/**\n * Format a prop value for Astro template usage\n */\nfunction formatPropValue(value: unknown): string {\n value = stripRawHtmlPrefixDeep(value);\n if (typeof value === 'string') return `\"${escapeJSX(value)}\"`;\n if (typeof value === 'number') return `{${value}}`;\n if (typeof value === 'boolean') return `{${value}}`;\n if (value === null || value === undefined) return `{undefined}`;\n // Objects/arrays\n return `{${JSON.stringify(value)}}`;\n}\n\n// ---------------------------------------------------------------------------\n// Main recursive converter\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve an i18n value to a locale string using the context locale.\n * Returns the original value unchanged if it's not an i18n object or no locale is set.\n */\nfunction resolveI18n(value: unknown, ctx: AstroEmitContext): unknown {\n if (ctx.locale && isI18nValue(value)) {\n return resolveI18nValue(value, ctx.locale, DEFAULT_I18N_CONFIG);\n }\n return value;\n}\n\n/**\n * Convert a ComponentNode tree to Astro template markup\n */\nexport function nodeToAstro(\n node: ComponentNode | ComponentNode[] | string | number | null | undefined,\n ctx: AstroEmitContext\n): string {\n if (node === null || node === undefined) return '';\n\n // Resolve i18n objects to locale strings before further processing\n if (typeof node === 'object' && !Array.isArray(node) && isI18nValue(node)) {\n const resolved = resolveI18n(node, ctx);\n if (typeof resolved === 'string') {\n // Delegate to the text-node path so RAW_HTML_PREFIX gets emitted via <Fragment set:html>.\n return nodeToAstro(resolved, ctx);\n }\n // In component def without locale: wrap with r() resolver\n if (ctx.isComponentDef && isI18nValue(resolved)) {\n ctx.needsI18nResolver = true;\n return `${ind(ctx)}{r(${JSON.stringify(stripRawHtmlPrefixDeep(resolved))})}\\n`;\n }\n // If resolution returned a non-string (e.g. array), stringify it\n return `${ind(ctx)}${String(resolved ?? '')}\\n`;\n }\n\n // Text/number\n if (typeof node === 'string') {\n // CMS mode: transform {{cms.field}} expressions to entry data access\n if (ctx.cmsMode && isTemplateExpression(node) && /\\{\\{cms\\./.test(node)) {\n const transformed = transformCMSTemplate(node, ctx.cmsEntryBinding || 'entry', ctx.cmsRichTextFields, ctx.cmsWrapFn);\n return `${ind(ctx)}${transformed}\\n`;\n }\n // List item binding: transform {{item.field}} expressions\n if (ctx.listItemBinding && isTemplateExpression(node)) {\n const transformed = transformItemTemplate(node, ctx.listItemBinding, ctx.listIndexVar, ctx.listSourceVar);\n return `${ind(ctx)}${transformed}\\n`;\n }\n if (hasTemplates(node) && ctx.isComponentDef) {\n return `${ind(ctx)}${resolveTemplate(node, ctx)}\\n`;\n }\n // Raw HTML marker (from rich-text fields) - render unescaped via set:html.\n // Prefer the SSR-processed HTML when available so image rewriting, component\n // expansion, and link localization match what meno-core renders at runtime.\n if (node.startsWith(RAW_HTML_PREFIX)) {\n const rawSlice = node.slice(RAW_HTML_PREFIX.length);\n const rawHtml = ctx.processedRawHtml?.get(rawSlice) ?? rawSlice;\n return `${ind(ctx)}<Fragment set:html={\\`${escapeTemplateLiteral(rawHtml)}\\`} />\\n`;\n }\n return `${ind(ctx)}${escapeJSX(node)}\\n`;\n }\n if (typeof node === 'number') {\n return `${ind(ctx)}${node}\\n`;\n }\n\n // Array of nodes \u2013 replace the last path segment (matches SSR renderer's top-level array convention)\n if (Array.isArray(node)) {\n let result = '';\n for (let i = 0; i < node.length; i++) {\n const child = node[i];\n const savedPath = [...ctx.elementPath];\n ctx.elementPath = [...ctx.elementPath.slice(0, -1), i];\n result += nodeToAstro(child, ctx);\n ctx.elementPath = savedPath;\n }\n return result;\n }\n\n // Dispatch by node type (cast to string for legacy type values like 'cms-list', 'image')\n switch (node.type as string) {\n case NODE_TYPE.NODE:\n return emitHtmlNode(node as HtmlNode, ctx);\n case NODE_TYPE.COMPONENT:\n return emitComponentInstance(node as ComponentInstanceNode, ctx);\n case NODE_TYPE.SLOT:\n return emitSlotMarker(node as SlotMarker, ctx);\n case NODE_TYPE.EMBED:\n return emitEmbedNode(node as EmbedNode, ctx);\n case NODE_TYPE.LINK:\n return emitLinkNode(node as LinkNode, ctx);\n case NODE_TYPE.LOCALE_LIST:\n return emitLocaleListNode(node as LocaleListNode, ctx);\n case NODE_TYPE.LIST:\n case 'cms-list':\n return emitListNode(node as ListNode, ctx);\n case 'image':\n return emitImageTypeNode(node, ctx);\n default:\n return emitFallback(ctx);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Node type emitters\n// ---------------------------------------------------------------------------\n\n/**\n * Tailwind class prefixes that belong on the <img> element (not the <picture> wrapper).\n * These correspond to image-specific visual properties.\n */\nconst IMG_TAILWIND_PREFIXES = ['object-', 'rounded', 'border', 'shadow', '[filter', '[transform', 'mix-blend'];\nconst IMG_OPACITY_PATTERN = /^opacity-/;\n\n/**\n * Default sizes attribute for responsive images\n */\nconst DEFAULT_SIZES = '100vw';\n\n/**\n * Tailwind classes applied to the inner <img> so it fills its wrapper (<picture>)\n * when a responsive/blurred image wraps the element.\n */\nconst IMG_FILL_CLASSES = ['block', 'w-full', 'h-full'];\n\n/**\n * Split Tailwind classes into picture (layout) and img (visual) groups.\n * Layout classes go on <picture>, image-specific classes go on <img>.\n */\nfunction splitImageClasses(allClasses: string[]): { pictureClasses: string[]; imgClasses: string[] } {\n const imgClasses: string[] = [];\n const pictureClasses: string[] = [];\n\n for (const cls of allClasses) {\n // Strip responsive prefix (e.g., \"md:object-cover\" -> \"object-cover\") for matching\n const baseCls = cls.includes(':') ? cls.split(':').pop()! : cls;\n if (IMG_TAILWIND_PREFIXES.some(p => baseCls.startsWith(p)) || IMG_OPACITY_PATTERN.test(baseCls)) {\n imgClasses.push(cls);\n } else {\n pictureClasses.push(cls);\n }\n }\n\n return { pictureClasses, imgClasses };\n}\n\n/**\n * Extract a pixel width from a style value. Returns null for %, vw, auto,\n * or any other non-px value we can't translate into a sizes hint.\n */\nfunction extractPxWidth(val: unknown): number | null {\n if (typeof val === 'number' && Number.isFinite(val) && val > 0) return val;\n if (typeof val !== 'string') return null;\n const match = val.trim().match(/^(\\d+(?:\\.\\d+)?)px$/);\n if (!match) return null;\n const n = parseFloat(match[1]);\n return n > 0 ? n : null;\n}\n\n/**\n * Compute a `sizes` attribute from a node's responsive style + breakpoint config.\n * Produces something like `(max-width: 540px) 400px, (max-width: 1024px) 500px, 700px`\n * so the browser can pick the smallest srcset variant that covers the rendered width\n * at each viewport. Falls back to `100vw` when no usable px width is available.\n */\nfunction computeSizesAttribute(\n style: StyleObject | ResponsiveStyleObject | undefined,\n breakpoints: BreakpointConfig\n): string {\n if (!style) return DEFAULT_SIZES;\n\n const responsive = isResponsiveStyle(style as any);\n const baseStyle: StyleObject | undefined = responsive\n ? (style as ResponsiveStyleObject).base\n : (style as StyleObject);\n\n // Base (desktop) width \u2014 the biggest viewport\n const baseWidth = baseStyle ? extractPxWidth((baseStyle as StyleObject).width) : null;\n // If even the base width is unknown, nothing we can do \u2014 use 100vw.\n if (baseWidth == null) return DEFAULT_SIZES;\n\n // Walk breakpoints from smallest to largest so the emitted media queries\n // are ordered from narrowest to widest, with the unconditional base last.\n const bpEntries = Object.entries(breakpoints).sort(\n (a, b) => a[1].breakpoint - b[1].breakpoint\n );\n\n const parts: string[] = [];\n // Track the \"effective\" width as we walk up: if a breakpoint doesn't set its\n // own width, it inherits from the next step up, and ultimately from base.\n // We walk ascending, so we need to resolve by looking from smallest bp up to base.\n for (const [name, entry] of bpEntries) {\n let effective: number | null = null;\n if (responsive) {\n // Look at this bp, then larger bps, then base\n const bpStyle = (style as ResponsiveStyleObject)[name];\n effective = bpStyle ? extractPxWidth((bpStyle as StyleObject).width) : null;\n if (effective == null) {\n // Inherit from next-larger breakpoint(s)\n for (const [largerName, largerEntry] of bpEntries) {\n if (largerEntry.breakpoint <= entry.breakpoint) continue;\n const largerStyle = (style as ResponsiveStyleObject)[largerName];\n const larger = largerStyle ? extractPxWidth((largerStyle as StyleObject).width) : null;\n if (larger != null) {\n effective = larger;\n break;\n }\n }\n }\n if (effective == null) effective = baseWidth;\n } else {\n effective = baseWidth;\n }\n parts.push(`(max-width: ${entry.breakpoint}px) ${effective}px`);\n }\n parts.push(`${baseWidth}px`);\n return parts.join(', ');\n}\n\n/**\n * Merge additional CSS declarations into an existing ` style=\"...\"` attribute\n * string. If no style attribute exists yet, builds one. The inputs are raw CSS\n * already escaped for HTML attribute context.\n */\nfunction injectInlineStyle(styleAttr: string, extraCss: string): string {\n if (!extraCss) return styleAttr;\n if (!styleAttr) return ` style=\"${extraCss}\"`;\n return styleAttr.replace(/style=\"([^\"]*)\"/, (_, existing: string) => {\n const trimmed = existing.trimEnd();\n const sep = trimmed.length > 0 && !trimmed.endsWith(';') ? ';' : '';\n return `style=\"${existing}${sep}${extraCss}\"`;\n });\n}\n\n/**\n * Emit an <img> node as a <picture> element with AVIF/WebP sources when\n * image metadata is available, or as a plain <img> with srcset otherwise.\n */\n// Widths used for <Picture> srcset generation. Mirrors\n// RESPONSIVE_WIDTHS in imageMetadata.ts.\nconst PICTURE_WIDTHS = [500, 800, 1080, 1600, 2400];\n\n/**\n * Turn an image path like `/images/sub/hero-photo.jpg` into a stable JS\n * identifier (`imgSubHeroPhoto`) for use as an ESM import variable.\n */\nfunction imagePathToVarName(srcPath: string): string {\n const stripped = srcPath.replace(/^\\/+/, '').replace(/^images\\//, '').replace(/\\.[^.]+$/, '');\n const parts = stripped.split(/[/_\\-\\s.]+/).filter(Boolean);\n if (parts.length === 0) return 'imgAsset';\n const camel = parts\n .map((p, i) => {\n const clean = p.replace(/[^a-zA-Z0-9]/g, '');\n if (!clean) return '';\n if (i === 0) return clean.toLowerCase();\n return clean[0].toUpperCase() + clean.slice(1).toLowerCase();\n })\n .join('');\n if (!camel) return 'imgAsset';\n return 'img' + camel[0].toUpperCase() + camel.slice(1);\n}\n\n/**\n * Compute an ESM import path relative to the emitting file for a Meno image\n * URL. For file depth N (e.g. `src/pages/en/about.astro` is depth 1), the\n * path is `'../'.repeat(N + 1) + 'assets/images/<rest>'`.\n */\nfunction imageImportPath(srcPath: string, fileDepth: number): string {\n const rest = srcPath.replace(/^\\/+/, '').replace(/^images\\//, '');\n const ups = '../'.repeat(Math.max(0, fileDepth) + 1);\n return `${ups}assets/images/${rest}`;\n}\n\n/**\n * Decide whether an image src can be switched to <Picture>. Only plain\n * literal local paths (`/images/...`) with known metadata qualify \u2014 CMS\n * templates, list-item bindings, component props, and remote URLs take the\n * legacy <img>/<picture> path.\n */\nfunction isStaticImageSrc(src: string | undefined, ctx: AstroEmitContext): src is string {\n if (!src) return false;\n if (typeof src !== 'string') return false;\n if (hasTemplates(src)) return false;\n if (!src.startsWith('/images/')) return false;\n if (!ctx.imageMetadataMap?.has(src)) return false;\n return true;\n}\n\n/**\n * Register (or reuse) an ESM image import on the emit context. Returns the\n * JS variable name to reference in the generated template.\n */\nfunction registerStaticImageImport(src: string, ctx: AstroEmitContext): string {\n if (!ctx.imageImports) ctx.imageImports = new Map();\n const depth = ctx.fileDepth ?? 0;\n const importPath = imageImportPath(src, depth);\n\n for (const [existingName, existingPath] of ctx.imageImports) {\n if (existingPath === importPath) return existingName;\n }\n\n const base = imagePathToVarName(src);\n let name = base;\n let counter = 2;\n while (ctx.imageImports.has(name)) {\n name = `${base}${counter++}`;\n }\n ctx.imageImports.set(name, importPath);\n return name;\n}\n\n/**\n * Split a static `classExpr` into the outer layout classes (for <picture> /\n * wrapper) and the inner image classes (for the emitted <img> inside\n * <Picture>). Mirrors `splitImageClasses()` used by the legacy emitter so\n * object-cover / opacity-* keep landing on the <img>. Returns null when the\n * class expression is dynamic (class:list) \u2014 callers fall back to div wrap.\n */\nfunction splitStaticClassExpr(\n classExpr: string\n): { outerClasses: string[]; innerClasses: string[] } | null {\n if (classExpr.includes('class:list=')) return null;\n const classMatch = classExpr.match(/class=\"([^\"]*)\"/);\n if (!classMatch) return { outerClasses: [], innerClasses: [] };\n const all = classMatch[1].split(/\\s+/).filter(Boolean);\n const { pictureClasses, imgClasses } = splitImageClasses(all);\n return { outerClasses: pictureClasses, innerClasses: imgClasses };\n}\n\n/**\n * Format a static class+style pair as an Astro `pictureAttributes={{...}}`\n * prop. `classValue` comes pre-split (outer layout classes only).\n */\nfunction formatPictureAttributesProp(\n classValue: string,\n styleAttr: string\n): string {\n const styleMatch = styleAttr.match(/style=\"([^\"]*)\"/);\n const parts: string[] = [];\n if (classValue) parts.push(`class: ${JSON.stringify(classValue)}`);\n if (styleMatch) parts.push(`style: ${JSON.stringify(styleMatch[1])}`);\n if (parts.length === 0) return '';\n return ` pictureAttributes={{${parts.join(', ')}}}`;\n}\n\n/**\n * Emit a static local image as an astro:assets <Picture>. Called only after\n * isStaticImageSrc() has passed. Non-static paths should never reach here.\n */\nfunction emitStaticPictureImage(\n src: string,\n alt: string | undefined,\n loading: string | undefined,\n fetchpriority: string | undefined,\n sizesValue: string,\n classExpr: string,\n styleAttr: string,\n ifExpr: string,\n ifClose: string,\n blurHash: string | undefined,\n ctx: AstroEmitContext\n): string {\n const varName = registerStaticImageImport(src, ctx);\n\n const widthsLiteral = `[${PICTURE_WIDTHS.join(', ')}]`;\n const altAttr = alt !== undefined ? ` alt=\"${escapeJSX(String(alt))}\"` : ' alt=\"\"';\n const loadingAttr = loading ? ` loading=\"${escapeJSX(loading)}\"` : '';\n const fetchpriorityAttr = fetchpriority ? ` fetchpriority=\"${escapeJSX(fetchpriority)}\"` : '';\n\n // Split classes so object-cover / opacity land on the <img>, not the\n // outer <picture>/wrapper. splitStaticClassExpr returns null for dynamic\n // class:list \u2014 callers fall back to a <div> wrapper without splitting.\n const split = splitStaticClassExpr(classExpr);\n\n if (blurHash) {\n // Blur placeholder: put the blur background-image + layout classes on\n // the <picture> element via pictureAttributes. This mirrors the legacy\n // path where <picture> was both the blur host and layout container.\n // The inner <img> gets fill + img-specific classes and clears the blur\n // on load via this.parentElement (direct parent = <picture>).\n const blurCss = `background-image:url(${escapeJSX(blurHash)});background-size:cover`;\n const blurStyleAttr = injectInlineStyle(styleAttr, blurCss);\n const onloadAttr = ` onload=\"this.parentElement.style.backgroundImage=''\"`;\n\n if (split) {\n const outerClassValue = split.outerClasses.join(' ');\n const pictureAttrs = formatPictureAttributesProp(outerClassValue, blurStyleAttr);\n const innerClasses = [...split.innerClasses, ...IMG_FILL_CLASSES];\n const innerClassAttr = ` class=\"${innerClasses.join(' ')}\"`;\n return `${ifExpr}${ind(ctx)}<Picture${pictureAttrs} src={${varName}}${altAttr}${innerClassAttr} formats={['avif','webp']} widths={${widthsLiteral}} sizes=\"${escapeJSX(sizesValue)}\"${loadingAttr}${fetchpriorityAttr}${onloadAttr} />\\n${ifClose}`;\n }\n\n // Dynamic class:list: fall back to a <div> wrapper since we can't\n // convert class:list to a pictureAttributes JS object.\n const wrapperClassExpr = classExpr;\n const wrapperStyleAttr = injectInlineStyle(styleAttr, blurCss);\n const fillClassAttr = ` class=\"${IMG_FILL_CLASSES.join(' ')}\"`;\n return (\n `${ifExpr}${ind(ctx)}<div${wrapperClassExpr}${wrapperStyleAttr}>\\n` +\n `${ind(ctx)} <Picture pictureAttributes={{class: \"${IMG_FILL_CLASSES.join(' ')}\"}} src={${varName}}${altAttr}${fillClassAttr} formats={['avif','webp']} widths={${widthsLiteral}} sizes=\"${escapeJSX(sizesValue)}\"${loadingAttr}${fetchpriorityAttr} onload=\"this.parentElement.parentElement.style.backgroundImage=''\" />\\n` +\n `${ind(ctx)}</div>\\n${ifClose}`\n );\n }\n\n // Non-blur case: forward outer classes via pictureAttributes so they land\n // on the <picture>, inner img-specific classes as `class` on <Picture>.\n if (split) {\n const outerClassValue = split.outerClasses.join(' ');\n const innerClassAttr = split.innerClasses.length > 0\n ? ` class=\"${split.innerClasses.join(' ')}\"`\n : '';\n const pictureAttrs = formatPictureAttributesProp(outerClassValue, styleAttr);\n return `${ifExpr}${ind(ctx)}<Picture${pictureAttrs} src={${varName}}${altAttr}${innerClassAttr} formats={['avif','webp']} widths={${widthsLiteral}} sizes=\"${escapeJSX(sizesValue)}\"${loadingAttr}${fetchpriorityAttr} />\\n${ifClose}`;\n }\n\n // Dynamic class:list: wrap in a <div> so the dynamic expression survives.\n return (\n `${ifExpr}${ind(ctx)}<div${classExpr}${styleAttr}>\\n` +\n `${ind(ctx)} <Picture src={${varName}}${altAttr} formats={['avif','webp']} widths={${widthsLiteral}} sizes=\"${escapeJSX(sizesValue)}\"${loadingAttr}${fetchpriorityAttr} />\\n` +\n `${ind(ctx)}</div>\\n${ifClose}`\n );\n}\n\nfunction emitImageNode(node: HtmlNode, ctx: AstroEmitContext): string {\n const style = node.style as StyleObject | ResponsiveStyleObject | undefined;\n\n // Element class for interactive styles\n let elementClass: string | null = null;\n if (\n (node.interactiveStyles && node.interactiveStyles.length > 0) ||\n node.generateElementClass\n ) {\n elementClass = buildElementClass(ctx, node.label);\n if (elementClass && node.interactiveStyles?.length && ctx.collectedInteractiveStyles) {\n ctx.collectedInteractiveStyles.set(elementClass, node.interactiveStyles as InteractiveStyles);\n }\n }\n\n const { classExpr, styleAttr } = buildClassAndStyleExpression(\n style,\n node.interactiveStyles as InteractiveStyles | undefined,\n elementClass,\n ctx\n );\n\n // Extract image-specific attributes\n const attrs = node.attributes || {};\n const src = attrs.src as string | undefined;\n const alt = attrs.alt as string | undefined;\n const loading = attrs.loading as string | undefined;\n const fetchpriority = attrs.fetchpriority as string | undefined;\n let width = attrs.width as string | number | undefined;\n let height = attrs.height as string | number | undefined;\n const sizes = attrs.sizes as string | undefined;\n\n // Look up image metadata\n const metadata = src ? ctx.imageMetadataMap?.get(String(src)) : undefined;\n\n // Use dimensions from metadata if not explicitly set\n if (metadata) {\n if (width === undefined && metadata.width) width = metadata.width;\n if (height === undefined && metadata.height) height = metadata.height;\n }\n\n // Compute real sizes from responsive style widths; user override wins.\n const sizesValue = sizes || computeSizesAttribute(style, ctx.breakpoints);\n\n // Static local image \u2192 astro:assets <Picture> (ESM import, Astro-managed\n // optimization). Predicate rejects CMS/list/template/remote src.\n if (isStaticImageSrc(src, ctx)) {\n return emitStaticPictureImage(\n src,\n alt,\n loading,\n fetchpriority,\n sizesValue,\n classExpr,\n styleAttr,\n emitIfOpen(node, ctx),\n emitIfClose(node, ctx),\n metadata?.blurHash,\n ctx\n );\n }\n\n // Build remaining attributes (exclude image-specific ones we handle manually)\n const imageSpecificKeys = new Set(['src', 'alt', 'loading', 'width', 'height', 'sizes', 'srcset', 'fetchpriority']);\n const otherAttrs: Record<string, string | number | boolean> = {};\n if (node.attributes) {\n for (const [k, v] of Object.entries(node.attributes)) {\n if (!imageSpecificKeys.has(k)) otherAttrs[k] = v;\n }\n }\n const otherAttrsStr = buildAttributesString(otherAttrs, ctx);\n\n // Build core img attributes (with CMS/list template support)\n let imgAttrs = '';\n if (src) imgAttrs += ` ${emitAttrValue('src', String(src), ctx)}`;\n if (alt !== undefined) imgAttrs += ` ${emitAttrValue('alt', String(alt), ctx)}`;\n if (fetchpriority) imgAttrs += ` fetchpriority=\"${escapeJSX(String(fetchpriority))}\"`;\n if (loading) imgAttrs += ` loading=\"${escapeJSX(String(loading))}\"`;\n if (width !== undefined) imgAttrs += ` width=\"${escapeJSX(String(width))}\"`;\n if (height !== undefined) imgAttrs += ` height=\"${escapeJSX(String(height))}\"`;\n\n const hasAvif = !!(metadata?.avifSrcset && ctx.imageFormat !== 'webp');\n const hasBlur = !!metadata?.blurHash;\n // Any time we need a wrapper to host the blur placeholder or <source> tags.\n const useWrapper = hasAvif || hasBlur;\n\n // Blur placeholder is painted on the wrapper element (NOT the <img>, which\n // is a replaced element and doesn't paint CSS backgrounds reliably).\n // Once the real image loads we clear the background on the wrapper so the\n // low-quality placeholder disappears.\n const blurWrapperCss = hasBlur\n ? `background-image:url(${escapeJSX(metadata!.blurHash!)});background-size:cover`\n : '';\n const blurOnload = hasBlur\n ? ` onload=\"this.parentElement.style.backgroundImage=''\"`\n : '';\n\n // Conditional rendering\n const ifExpr = emitIfOpen(node, ctx);\n const ifClose = emitIfClose(node, ctx);\n\n if (useWrapper) {\n // The inner <img> must fill the picture wrapper; otherwise it renders at\n // its intrinsic size and the wrapper's layout (w/h/position) is wasted.\n const imgFillClasses = IMG_FILL_CLASSES.slice();\n\n const classListMatch = classExpr.match(/class:list={\\[(.+)\\]}/);\n const classMatch = classExpr.match(/class=\"([^\"]*)\"/);\n\n let pictureClassExpr = '';\n let imgClassAttr = '';\n if (classListMatch) {\n // Dynamic class:list - put it all on the picture. The inner img only\n // needs fill classes (splitting dynamic class lists isn't worth it).\n pictureClassExpr = classExpr;\n imgClassAttr = ` class=\"${imgFillClasses.join(' ')}\"`;\n } else {\n const allClasses = classMatch ? classMatch[1].split(/\\s+/).filter(Boolean) : [];\n const { pictureClasses, imgClasses } = splitImageClasses(allClasses);\n const fullImgClasses = [...imgClasses, ...imgFillClasses];\n pictureClassExpr = pictureClasses.length > 0 ? ` class=\"${pictureClasses.join(' ')}\"` : '';\n imgClassAttr = fullImgClasses.length > 0 ? ` class=\"${fullImgClasses.join(' ')}\"` : '';\n }\n\n const wrapperStyleAttr = injectInlineStyle(styleAttr, blurWrapperCss);\n\n // With AVIF: full <picture> + <source> elements\n if (hasAvif) {\n return (\n `${ifExpr}${ind(ctx)}<picture${pictureClassExpr}${wrapperStyleAttr}>\\n` +\n `${ind(ctx)} <source type=\"image/avif\" srcset=\"${escapeJSX(metadata!.avifSrcset!)}\" sizes=\"${escapeJSX(sizesValue)}\" />\\n` +\n `${ind(ctx)} <source type=\"image/webp\" srcset=\"${escapeJSX(metadata!.srcset)}\" sizes=\"${escapeJSX(sizesValue)}\" />\\n` +\n `${ind(ctx)} <img${imgClassAttr}${imgAttrs}${blurOnload}${otherAttrsStr} />\\n` +\n `${ind(ctx)}</picture>\\n${ifClose}`\n );\n }\n\n // No AVIF, but we still need the wrapper for blur. Put srcset on the <img>\n // itself since we're not using <source>.\n if (metadata?.srcset) {\n imgAttrs += ` srcset=\"${escapeJSX(metadata.srcset)}\"`;\n imgAttrs += ` sizes=\"${escapeJSX(sizesValue)}\"`;\n }\n return (\n `${ifExpr}${ind(ctx)}<picture${pictureClassExpr}${wrapperStyleAttr}>\\n` +\n `${ind(ctx)} <img${imgClassAttr}${imgAttrs}${blurOnload}${otherAttrsStr} />\\n` +\n `${ind(ctx)}</picture>\\n${ifClose}`\n );\n }\n\n // No wrapper needed: plain <img> with optional srcset/sizes\n if (metadata?.srcset) {\n imgAttrs += ` srcset=\"${escapeJSX(metadata.srcset)}\"`;\n imgAttrs += ` sizes=\"${escapeJSX(sizesValue)}\"`;\n }\n\n return `${ifExpr}${ind(ctx)}<img${classExpr}${styleAttr}${imgAttrs}${otherAttrsStr} />\\n${ifClose}`;\n}\n\nfunction emitHtmlNode(node: HtmlNode, ctx: AstroEmitContext): string {\n let tag = node.tag;\n\n // Astro treats capitalized tags as component imports \u2014 lowercase custom tags to avoid this\n if (tag && /^[A-Z]/.test(tag)) {\n tag = tag.toLowerCase();\n }\n\n // Delegate img tags to the image-specific emitter when metadata is available\n if (tag === 'img' && ctx.imageMetadataMap) {\n return emitImageNode(node, ctx);\n }\n\n const label = node.label;\n const style = node.style as StyleObject | ResponsiveStyleObject | undefined;\n\n // Handle dynamic tags: <h{{size}}> \u2192 define Tag variable in frontmatter, use <Tag> in template\n let isDynamic = false;\n let dynamicTagVar = '';\n if (hasTemplates(tag) && ctx.isComponentDef) {\n isDynamic = true;\n // Generate a unique variable name based on element path\n dynamicTagVar = `Tag_${ctx.elementPath.join('_')}`;\n const resolved = tag.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => `\\${${expr.trim()}}`);\n // Register dynamic tag for frontmatter emission\n if (!ctx.dynamicTags) ctx.dynamicTags = new Map();\n ctx.dynamicTags.set(dynamicTagVar, resolved);\n tag = dynamicTagVar;\n }\n\n // Conditional rendering\n const ifExpr = emitIfOpen(node, ctx);\n\n // Element class for interactive styles\n let elementClass: string | null = null;\n if (\n (node.interactiveStyles && node.interactiveStyles.length > 0) ||\n node.generateElementClass\n ) {\n elementClass = buildElementClass(ctx, label);\n if (elementClass && node.interactiveStyles?.length && ctx.collectedInteractiveStyles) {\n ctx.collectedInteractiveStyles.set(elementClass, node.interactiveStyles as InteractiveStyles);\n }\n }\n\n const { classExpr, styleAttr } = buildClassAndStyleExpression(style, node.interactiveStyles as InteractiveStyles | undefined, elementClass, ctx);\n const attrs = buildAttributesString(node.attributes, ctx);\n\n // Dynamic tags use the variable name directly (capitalized, defined in frontmatter)\n const openClose = isDynamic ? dynamicTagVar : tag;\n\n if (!isDynamic && isVoidElement(tag)) {\n return `${ifExpr}${ind(ctx)}<${tag}${classExpr}${styleAttr}${attrs} />\\n${emitIfClose(node, ctx)}`;\n }\n\n const children = emitChildren(node.children, ctx);\n\n if (!children.trim() && !isDynamic) {\n return `${ifExpr}${ind(ctx)}<${tag}${classExpr}${styleAttr}${attrs} />\\n${emitIfClose(node, ctx)}`;\n }\n\n return (\n `${ifExpr}${ind(ctx)}<${openClose}${classExpr}${styleAttr}${attrs}>\\n` +\n children +\n `${ind(ctx)}</${openClose}>\\n${emitIfClose(node, ctx)}`\n );\n}\n\nfunction emitComponentInstance(node: ComponentInstanceNode, ctx: AstroEmitContext): string {\n const name = astroComponentName(node.component);\n ctx.imports.add(node.component);\n\n const ifExpr = emitIfOpen(node, ctx);\n\n // Build prop expressions\n const propParts: string[] = [];\n if (node.props) {\n for (const [key, rawValue] of Object.entries(node.props)) {\n if (key === 'children') continue;\n\n // Resolve i18n values to the page locale\n const value = resolveI18n(rawValue, ctx);\n\n // Resolve template expressions in string props when inside component def\n if (typeof value === 'string' && hasTemplates(value) && ctx.isComponentDef) {\n const fullMatch = value.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let expr = fullMatch[1].trim();\n if (ctx.listItemBinding) expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n propParts.push(`${key}={${expr}}`);\n } else {\n const resolved = value.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n if (ctx.listItemBinding) trimmed = rewriteItemVar(trimmed, ctx.listItemBinding);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n return `\\${${trimmed}}`;\n });\n propParts.push(`${key}={\\`${resolved}\\`}`);\n }\n } else if (typeof value === 'string' && ctx.cmsMode && /\\{\\{cms\\./.test(value)) {\n const b = ctx.cmsEntryBinding || 'entry';\n const w = (expr: string) => ctx.cmsWrapFn ? `${ctx.cmsWrapFn}(${expr})` : expr;\n const fullMatch = value.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (fullMatch) {\n propParts.push(`${key}={${w(`${b}.data.${fullMatch[1].trim()}`)}}`);\n } else {\n const replaced = value.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (_, fieldPath) => {\n return `\\${${w(`${b}.data.${fieldPath.trim()}`)}}`;\n });\n propParts.push(`${key}={\\`${replaced}\\`}`);\n }\n } else if (ctx.isComponentDef && isI18nValue(value)) {\n // i18n object in component def \u2014 wrap with r() resolver (resolved at runtime via Astro.currentLocale)\n ctx.needsI18nResolver = true;\n propParts.push(`${key}={r(${JSON.stringify(stripRawHtmlPrefixDeep(value))})}`);\n } else {\n // Rich-text / embed props contain HTML/SVG \u2014 pass as template literal\n // so the component can render via set:html without entity escaping\n const targetInterface = ctx.globalComponents[name]?.component?.interface;\n const propDef = targetInterface?.[key];\n if (typeof value === 'string' && (propDef?.type === 'rich-text' || propDef?.type === 'embed')) {\n propParts.push(`${key}={\\`${escapeTemplateLiteral(stripRawHtmlPrefixDeep(value) as string)}\\`}`);\n } else {\n propParts.push(`${key}=${formatPropValue(value)}`);\n }\n }\n }\n }\n\n // Instance-level style overrides as className (Tailwind)\n if (node.style) {\n const { classes: instanceClasses } = responsiveStylesToTailwind(node.style as StyleObject | ResponsiveStyleObject, ctx.breakpoints, ctx.responsiveScales);\n if (instanceClasses.length > 0) {\n propParts.push(`class=\"${instanceClasses.join(' ')}\"`);\n }\n }\n\n const propsStr = propParts.length > 0 ? ' ' + propParts.join(' ') : '';\n\n // Reset elementPath to [0] when entering a component instance, matching SSR's\n // renderComponent behavior. This ensures hash-based element class names for\n // slot content are identical between SSR (CSS) and Astro (HTML).\n const childCtx = { ...ctx, elementPath: [0] };\n const children = emitChildren(node.children, childCtx);\n\n if (!children.trim()) {\n return `${ifExpr}${ind(ctx)}<${name}${propsStr} />\\n${emitIfClose(node, ctx)}`;\n }\n\n return (\n `${ifExpr}${ind(ctx)}<${name}${propsStr}>\\n` +\n children +\n `${ind(ctx)}</${name}>\\n${emitIfClose(node, ctx)}`\n );\n}\n\nfunction emitSlotMarker(node: SlotMarker, ctx: AstroEmitContext): string {\n if (node.default) {\n const defaultContent = emitChildren(node.default as (ComponentNode | string)[] | string | undefined, ctx);\n if (defaultContent.trim()) {\n return (\n `${ind(ctx)}<slot>\\n` +\n defaultContent +\n `${ind(ctx)}</slot>\\n`\n );\n }\n }\n return `${ind(ctx)}<slot />\\n`;\n}\n\nfunction emitEmbedNode(node: EmbedNode, ctx: AstroEmitContext): string {\n const ifExpr = emitIfOpen(node, ctx);\n const style = node.style as StyleObject | ResponsiveStyleObject | undefined;\n\n let elementClass: string | null = null;\n if (\n (node.interactiveStyles && node.interactiveStyles.length > 0) ||\n node.generateElementClass\n ) {\n elementClass = buildElementClass(ctx, node.label);\n if (elementClass && node.interactiveStyles?.length && ctx.collectedInteractiveStyles) {\n ctx.collectedInteractiveStyles.set(elementClass, node.interactiveStyles as InteractiveStyles);\n }\n }\n\n const { classExpr, styleAttr } = buildClassAndStyleExpression(style, node.interactiveStyles as InteractiveStyles | undefined, elementClass, ctx);\n const attrs = buildAttributesString(node.attributes, ctx);\n\n // Handle HTML mapping (prop-dependent content)\n if (isHtmlMapping(node.html)) {\n if (ctx.isComponentDef) {\n const propRef = node.html.prop;\n return (\n `${ifExpr}${ind(ctx)}<div${classExpr.replace('\"', '\"oem ') || ' class=\"oem\"'}${attrs}>\\n` +\n `${ind(ctx)} <Fragment set:html={${propRef}} />\\n` +\n `${ind(ctx)}</div>\\n${emitIfClose(node, ctx)}`\n );\n }\n }\n\n // Handle template expressions in HTML string (e.g., \"{{icon}}\")\n if (typeof node.html === 'string' && hasTemplates(node.html) && ctx.isComponentDef) {\n const fullMatch = node.html.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let propRef = fullMatch[1].trim();\n if (ctx.listItemBinding) propRef = rewriteItemVar(propRef, ctx.listItemBinding);\n if (ctx.listIndexVar) propRef = replaceItemMetaVars(propRef, ctx.listIndexVar, ctx.listSourceVar);\n\n let tplClassExpr = classExpr;\n if (!classExpr.includes('oem')) {\n if (classExpr) {\n tplClassExpr = classExpr.replace(/class=\"/, 'class=\"oem ').replace(/class:list={\\['/, \"class:list={['oem \");\n } else {\n tplClassExpr = ' class=\"oem\"';\n }\n }\n\n return (\n `${ifExpr}${ind(ctx)}<div${tplClassExpr}${attrs}>\\n` +\n `${ind(ctx)} <Fragment set:html={${propRef}} />\\n` +\n `${ind(ctx)}</div>\\n${emitIfClose(node, ctx)}`\n );\n }\n }\n\n const htmlStr = typeof node.html === 'string' ? node.html : '';\n const escapedHtml = escapeTemplateLiteral(htmlStr);\n\n // Ensure oem class is present\n let finalClassExpr = classExpr;\n if (!classExpr.includes('oem')) {\n if (classExpr) {\n finalClassExpr = classExpr.replace(/class=\"/, 'class=\"oem ').replace(/class:list={\\['/, \"class:list={['oem \");\n } else {\n finalClassExpr = ' class=\"oem\"';\n }\n }\n\n return (\n `${ifExpr}${ind(ctx)}<div${finalClassExpr}${attrs}>\\n` +\n `${ind(ctx)} <Fragment set:html={\\`${escapedHtml}\\`} />\\n` +\n `${ind(ctx)}</div>\\n${emitIfClose(node, ctx)}`\n );\n}\n\nfunction emitLinkNode(node: LinkNode, ctx: AstroEmitContext): string {\n const ifExpr = emitIfOpen(node, ctx);\n const style = node.style as StyleObject | ResponsiveStyleObject | undefined;\n\n let elementClass: string | null = null;\n if (\n (node.interactiveStyles && node.interactiveStyles.length > 0) ||\n node.generateElementClass\n ) {\n elementClass = buildElementClass(ctx, node.label);\n if (elementClass && node.interactiveStyles?.length && ctx.collectedInteractiveStyles) {\n ctx.collectedInteractiveStyles.set(elementClass, node.interactiveStyles as InteractiveStyles);\n }\n }\n\n // Build class expression with olink base class\n const { classExpr, styleAttr } = buildClassAndStyleExpression(style, node.interactiveStyles as InteractiveStyles | undefined, elementClass, ctx);\n let finalClassExpr = classExpr;\n if (!classExpr.includes('olink')) {\n if (classExpr) {\n finalClassExpr = classExpr.replace(/class=\"/, 'class=\"olink ').replace(/class:list={\\['/, \"class:list={['olink \");\n } else {\n finalClassExpr = ' class=\"olink\"';\n }\n }\n\n // Resolve i18n on href before processing\n const resolvedHref = resolveI18n(node.href, ctx);\n const nodeHref = resolvedHref as typeof node.href;\n\n // Handle href\n let hrefAttr: string;\n if (isLinkMapping(nodeHref)) {\n if (ctx.isComponentDef) {\n const propRef = (nodeHref as LinkMapping).prop;\n // Link props are objects with {href, target?}\n hrefAttr = ` href={${propRef}?.href ?? \"#\"}`;\n } else {\n hrefAttr = ' href=\"#\"';\n }\n } else {\n const href = typeof nodeHref === 'string' ? nodeHref : '#';\n if (hasTemplates(href) && ctx.isComponentDef) {\n const fullMatch = href.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let expr = fullMatch[1].trim();\n if (ctx.listItemBinding) expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n const propDef = ctx.componentProps[expr];\n if (propDef && propDef.type === 'link') {\n hrefAttr = ` href={${expr}?.href ?? \"#\"}`;\n } else {\n hrefAttr = ` href={${expr}}`;\n }\n } else {\n const resolved = href.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n if (ctx.listItemBinding) trimmed = rewriteItemVar(trimmed, ctx.listItemBinding);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n const pd = ctx.componentProps[trimmed];\n return pd?.type === 'link' ? `\\${${trimmed}?.href ?? \"#\"}` : `\\${${trimmed}}`;\n });\n hrefAttr = ` href={\\`${resolved}\\`}`;\n }\n } else if (ctx.cmsMode && /\\{\\{cms\\./.test(href)) {\n const b = ctx.cmsEntryBinding || 'entry';\n const w = (expr: string) => ctx.cmsWrapFn ? `${ctx.cmsWrapFn}(${expr})` : expr;\n const fullMatch = href.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (fullMatch) {\n hrefAttr = ` href={${w(`${b}.data.${fullMatch[1].trim()}`)}}`;\n } else {\n const replaced = href.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (_, fieldPath) => {\n return `\\${${w(`${b}.data.${fieldPath.trim()}`)}}`;\n });\n hrefAttr = ` href={\\`${replaced}\\`}`;\n }\n } else {\n const localizedHref = localizeHref(href, ctx);\n hrefAttr = ` href=\"${escapeJSX(localizedHref)}\"`;\n }\n }\n\n const attrs = buildAttributesString(node.attributes, ctx);\n const children = emitChildren(node.children, ctx);\n\n if (!children.trim()) {\n return `${ifExpr}${ind(ctx)}<a${hrefAttr}${finalClassExpr}${styleAttr}${attrs} />\\n${emitIfClose(node, ctx)}`;\n }\n\n return (\n `${ifExpr}${ind(ctx)}<a${hrefAttr}${finalClassExpr}${styleAttr}${attrs}>\\n` +\n children +\n `${ind(ctx)}</a>\\n${emitIfClose(node, ctx)}`\n );\n}\n\n/**\n * Emit an \"image\" type node (standalone image, not an HTML img tag)\n * These have src, alt, style directly on the node.\n */\nfunction emitImageTypeNode(node: any, ctx: AstroEmitContext): string {\n const style = node.style as StyleObject | ResponsiveStyleObject | undefined;\n\n let elementClass: string | null = null;\n if (\n (node.interactiveStyles && node.interactiveStyles.length > 0) ||\n node.generateElementClass\n ) {\n elementClass = buildElementClass(ctx, node.label);\n if (elementClass && node.interactiveStyles?.length && ctx.collectedInteractiveStyles) {\n ctx.collectedInteractiveStyles.set(elementClass, node.interactiveStyles as InteractiveStyles);\n }\n }\n\n const { classExpr, styleAttr } = buildClassAndStyleExpression(\n style,\n node.interactiveStyles as InteractiveStyles | undefined,\n elementClass,\n ctx\n );\n\n const src = node.src as string | undefined;\n const alt = node.alt as string | undefined;\n\n // Static local image \u2192 astro:assets <Picture>\n if (isStaticImageSrc(src, ctx)) {\n const staticMeta = ctx.imageMetadataMap!.get(src)!;\n return emitStaticPictureImage(\n src,\n alt,\n undefined,\n undefined,\n computeSizesAttribute(style, ctx.breakpoints),\n classExpr,\n styleAttr,\n '',\n '',\n staticMeta.blurHash,\n ctx\n );\n }\n\n let imgAttrs = '';\n if (src) imgAttrs += ` src=\"${escapeJSX(String(src))}\"`;\n if (alt !== undefined) imgAttrs += ` alt=\"${escapeJSX(String(alt))}\"`;\n\n // Check for image metadata for responsive images\n const metadata = src ? ctx.imageMetadataMap?.get(String(src)) : undefined;\n\n if (!metadata) {\n return `${ind(ctx)}<img${classExpr}${styleAttr}${imgAttrs} />\\n`;\n }\n\n if (metadata.width !== undefined) imgAttrs += ` width=\"${metadata.width}\"`;\n if (metadata.height !== undefined) imgAttrs += ` height=\"${metadata.height}\"`;\n\n const sizesValue = computeSizesAttribute(style, ctx.breakpoints);\n\n const hasAvif = !!(metadata.avifSrcset && ctx.imageFormat !== 'webp');\n const hasBlur = !!metadata.blurHash;\n const useWrapper = hasAvif || hasBlur;\n\n const blurWrapperCss = hasBlur\n ? `background-image:url(${escapeJSX(metadata.blurHash!)});background-size:cover`\n : '';\n const blurOnload = hasBlur\n ? ` onload=\"this.parentElement.style.backgroundImage=''\"`\n : '';\n\n if (useWrapper) {\n const imgFillClasses = IMG_FILL_CLASSES.slice();\n const classMatch = classExpr.match(/class=\"([^\"]*)\"/);\n const allClasses = classMatch ? classMatch[1].split(/\\s+/).filter(Boolean) : [];\n const { pictureClasses, imgClasses } = splitImageClasses(allClasses);\n const fullImgClasses = [...imgClasses, ...imgFillClasses];\n\n const pictureClassAttr = pictureClasses.length > 0 ? ` class=\"${pictureClasses.join(' ')}\"` : '';\n const imgClassAttr = fullImgClasses.length > 0 ? ` class=\"${fullImgClasses.join(' ')}\"` : '';\n const wrapperStyleAttr = injectInlineStyle(styleAttr, blurWrapperCss);\n\n if (hasAvif) {\n return (\n `${ind(ctx)}<picture${pictureClassAttr}${wrapperStyleAttr}>\\n` +\n `${ind(ctx)} <source type=\"image/avif\" srcset=\"${escapeJSX(metadata.avifSrcset!)}\" sizes=\"${escapeJSX(sizesValue)}\" />\\n` +\n `${ind(ctx)} <source type=\"image/webp\" srcset=\"${escapeJSX(metadata.srcset)}\" sizes=\"${escapeJSX(sizesValue)}\" />\\n` +\n `${ind(ctx)} <img${imgClassAttr}${imgAttrs}${blurOnload} />\\n` +\n `${ind(ctx)}</picture>\\n`\n );\n }\n\n if (metadata.srcset) {\n imgAttrs += ` srcset=\"${escapeJSX(metadata.srcset)}\"`;\n imgAttrs += ` sizes=\"${escapeJSX(sizesValue)}\"`;\n }\n return (\n `${ind(ctx)}<picture${pictureClassAttr}${wrapperStyleAttr}>\\n` +\n `${ind(ctx)} <img${imgClassAttr}${imgAttrs}${blurOnload} />\\n` +\n `${ind(ctx)}</picture>\\n`\n );\n }\n\n if (metadata.srcset) {\n imgAttrs += ` srcset=\"${escapeJSX(metadata.srcset)}\"`;\n imgAttrs += ` sizes=\"${escapeJSX(sizesValue)}\"`;\n }\n\n return `${ind(ctx)}<img${classExpr}${styleAttr}${imgAttrs} />\\n`;\n}\n\n/**\n * Emit a list node as native Astro .map() call\n */\nfunction emitListNode(node: ListNode, ctx: AstroEmitContext): string {\n const sourceType = node.sourceType || 'prop';\n const itemAs = node.itemAs || 'item';\n\n if (sourceType === 'collection') {\n return emitCollectionListNode(node, ctx);\n }\n\n // Prop lists only work inside component definitions where the prop is available\n // On pages, the data source doesn't exist at template level - use SSR fallback\n if (!ctx.isComponentDef && !ctx.listItemBinding) {\n return emitFallback(ctx);\n }\n\n // Prop list: emit {items.map((item, index) => (...))}\n // Resolve source: \"{{features}}\" \u2192 \"features\"\n let source = node.source || 'items';\n const templateMatch = source.match(/^\\{\\{(.+)\\}\\}$/);\n if (templateMatch) {\n source = templateMatch[1].trim();\n }\n\n // Build the .map() source expression (compute before children so ctx has it)\n let mapSource = source;\n if (node.offset && node.limit) {\n mapSource = `${source}.slice(${node.offset}, ${node.offset + node.limit})`;\n } else if (node.offset) {\n mapSource = `${source}.slice(${node.offset})`;\n } else if (node.limit) {\n mapSource = `${source}.slice(0, ${node.limit})`;\n }\n\n // Build children with list item binding context\n const indexVar = `${itemAs}Index`;\n const innerCtx: AstroEmitContext = {\n ...ctx,\n indent: ctx.indent + 1,\n listItemBinding: itemAs,\n listIndexVar: indexVar,\n listSourceVar: mapSource,\n elementPath: [...ctx.elementPath, 0],\n };\n\n const children = node.children\n ? (node.children as (ComponentNode | string)[]).map((child, i) => {\n const childCtx = { ...innerCtx, elementPath: [...ctx.elementPath, i] };\n const out = nodeToAstro(child, childCtx);\n if (childCtx.needsI18nResolver) ctx.needsI18nResolver = true;\n return out;\n }).join('')\n : '';\n\n return (\n `${ind(ctx)}{${mapSource}.map((${itemAs}, ${indexVar}) => (\\n` +\n children +\n `${ind(ctx)}))}\\n`\n );\n}\n\n/**\n * Emit a collection-sourced list node using getCollection() in frontmatter\n */\nfunction emitCollectionListNode(node: ListNode, ctx: AstroEmitContext): string {\n // For collection lists, the data fetching happens in frontmatter\n const source = node.source || '';\n const itemAs = node.itemAs || singularize(source);\n\n // Add frontmatter lines and imports\n if (!ctx.frontmatterLines) ctx.frontmatterLines = [];\n if (!ctx.astroImports) ctx.astroImports = new Set();\n\n ctx.astroImports.add('getCollection');\n\n // Variable name for the collection data\n const collectionVar = `${source}List`;\n\n // Build the collection query with filter/sort/limit\n let queryChain = `await getCollection('${source}')`;\n\n if (node.filter) {\n // Simple filter support\n if (typeof node.filter === 'object' && !Array.isArray(node.filter) && 'field' in node.filter) {\n const f = node.filter as { field: string; operator?: string; value: unknown };\n const op = f.operator || 'eq';\n if (op === 'eq') {\n queryChain += `.then(items => items.filter(e => e.data.${f.field} === ${JSON.stringify(f.value)}))`;\n }\n }\n }\n\n if (node.sort) {\n const sortConfig = Array.isArray(node.sort) ? node.sort[0] : node.sort;\n if (sortConfig) {\n const order = sortConfig.order === 'desc' ? -1 : 1;\n queryChain += `.then(items => items.sort((a, b) => a.data.${sortConfig.field} > b.data.${sortConfig.field} ? ${order} : ${-order}))`;\n }\n }\n\n if (node.offset || node.limit) {\n const start = node.offset || 0;\n const end = node.limit ? start + node.limit : undefined;\n queryChain += `.then(items => items.slice(${start}${end !== undefined ? `, ${end}` : ''}))`;\n }\n\n ctx.frontmatterLines.push(`const ${collectionVar} = ${queryChain};`);\n\n // Build children with item binding\n const indexVar = `${itemAs}Index`;\n const innerCtx: AstroEmitContext = {\n ...ctx,\n indent: ctx.indent + 1,\n listItemBinding: itemAs,\n listIndexVar: indexVar,\n listSourceVar: collectionVar,\n cmsMode: true,\n cmsEntryBinding: itemAs,\n elementPath: [...ctx.elementPath, 0],\n };\n\n const children = node.children\n ? (node.children as (ComponentNode | string)[]).map((child, i) => {\n const childCtx = { ...innerCtx, elementPath: [...ctx.elementPath, i] };\n const out = nodeToAstro(child, childCtx);\n if (childCtx.needsI18nResolver) ctx.needsI18nResolver = true;\n return out;\n }).join('')\n : '';\n\n return (\n `${ind(ctx)}{${collectionVar}.map((${itemAs}, ${indexVar}) => (\\n` +\n children +\n `${ind(ctx)}))}\\n`\n );\n}\n\n/**\n * Emit a locale list node with static locale links\n * Since locales are known at build time, we emit static HTML\n */\nfunction emitLocaleListNode(node: LocaleListNode, ctx: AstroEmitContext): string {\n // If we don't have i18n config or slug map, fall back to SSR\n if (!ctx.i18nConfig || !ctx.currentPageSlugMap) {\n return emitFallback(ctx);\n }\n\n const i18nConfig = ctx.i18nConfig;\n const slugMap = ctx.currentPageSlugMap;\n const showCurrent = node.showCurrent !== false;\n const showSeparator = node.showSeparator !== false;\n const showFlag = node.showFlag !== false;\n const displayType = node.displayType || 'nativeName';\n\n // Build container classes from style\n const style = node.style as StyleObject | ResponsiveStyleObject | undefined;\n\n let elementClass: string | null = null;\n if ((node.interactiveStyles && (node.interactiveStyles as InteractiveStyles).length > 0) || node.generateElementClass) {\n elementClass = buildElementClass(ctx, node.label);\n if (elementClass && (node.interactiveStyles as InteractiveStyles)?.length && ctx.collectedInteractiveStyles) {\n ctx.collectedInteractiveStyles.set(elementClass, node.interactiveStyles as InteractiveStyles);\n }\n }\n\n const { classExpr: containerClassExpr, styleAttr: containerStyleAttr } = buildClassAndStyleExpression(\n style,\n node.interactiveStyles as InteractiveStyles | undefined,\n elementClass,\n ctx\n );\n\n // Build item classes\n const itemStyle = node.itemStyle as StyleObject | ResponsiveStyleObject | undefined;\n const itemResult = itemStyle ? responsiveStylesToTailwind(itemStyle, ctx.breakpoints, ctx.responsiveScales) : { classes: [], dynamicStyles: {} };\n const itemClasses = itemResult.classes;\n\n // Build active item classes (item + active combined)\n const activeItemStyle = node.activeItemStyle as StyleObject | ResponsiveStyleObject | undefined;\n const activeResult = activeItemStyle ? responsiveStylesToTailwind(activeItemStyle, ctx.breakpoints, ctx.responsiveScales) : { classes: [], dynamicStyles: {} };\n const activeItemClasses = [...itemClasses, ...activeResult.classes];\n\n // Build separator classes\n const separatorStyle = node.separatorStyle as StyleObject | ResponsiveStyleObject | undefined;\n const sepResult = separatorStyle ? responsiveStylesToTailwind(separatorStyle, ctx.breakpoints, ctx.responsiveScales) : { classes: [], dynamicStyles: {} };\n const separatorClasses = sepResult.classes;\n\n // Build locale icon map\n const localeIconMap = new Map<string, string>();\n for (const localeConfig of i18nConfig.locales) {\n if (localeConfig.icon) {\n localeIconMap.set(localeConfig.code, localeConfig.icon);\n }\n }\n\n // Flag classes\n const flagStyle = node.flagStyle as StyleObject | ResponsiveStyleObject | undefined;\n const flagResult = flagStyle ? responsiveStylesToTailwind(flagStyle, ctx.breakpoints, ctx.responsiveScales) : { classes: [], dynamicStyles: {} };\n const flagClasses = flagResult.classes;\n\n // Build links\n const links: string[] = [];\n const currentLocale = ctx.locale || i18nConfig.defaultLocale;\n\n for (const localeConfig of i18nConfig.locales) {\n const code = localeConfig.code;\n const isCurrent = code === currentLocale;\n\n if (!showCurrent && isCurrent) continue;\n\n const path = slugMap[code] || '/';\n const classes = isCurrent ? activeItemClasses : itemClasses;\n const classAttr = classes.length > 0 ? ` class=\"${classes.join(' ')}\"` : '';\n const currentAttr = isCurrent ? ' data-current=\"true\"' : ' data-current=\"false\"';\n const hreflangAttr = ` hreflang=\"${localeConfig.langTag}\"`;\n\n // Display text\n let displayText: string;\n switch (displayType) {\n case 'code': displayText = code.toUpperCase(); break;\n case 'name': displayText = localeConfig.name; break;\n case 'nativeName': default: displayText = localeConfig.nativeName; break;\n }\n\n // Build link content\n let linkContent = '';\n const localeIcon = localeIconMap.get(code);\n if (showFlag && localeIcon) {\n const flagClassAttr = flagClasses.length > 0 ? ` class=\"${flagClasses.join(' ')}\"` : '';\n linkContent += `<img src=\"${escapeJSX(localeIcon)}\" alt=\"${escapeJSX(localeConfig.nativeName)} flag\"${flagClassAttr}>`;\n }\n linkContent += `<div>${escapeJSX(displayText)}</div>`;\n\n links.push(`${ind(ctx)} <a href=\"${escapeJSX(path)}\"${hreflangAttr}${currentAttr} data-locale=\"${escapeJSX(code)}\"${classAttr}>${linkContent}</a>`);\n }\n\n // Join with separator\n let linksContent: string;\n if (showSeparator && links.length > 1) {\n const sepClassAttr = separatorClasses.length > 0 ? ` class=\"${separatorClasses.join(' ')}\"` : '';\n linksContent = links.join(`\\n${ind(ctx)} <span${sepClassAttr}></span>\\n`);\n } else {\n linksContent = links.join('\\n');\n }\n\n const attrs = buildAttributesString(node.attributes, ctx);\n\n return (\n `${ind(ctx)}<div data-locale-list=\"true\"${containerClassExpr}${containerStyleAttr}${attrs}>\\n` +\n linksContent + '\\n' +\n `${ind(ctx)}</div>\\n`\n );\n}\n\n/**\n * Emit SSR fallback for complex nodes (list, locale-list)\n */\nfunction emitFallback(ctx: AstroEmitContext): string {\n const pathKey = ctx.elementPath.join('.');\n const ssrHtml = ctx.ssrFallbacks.get(pathKey);\n if (ssrHtml) {\n const escaped = escapeTemplateLiteral(ssrHtml);\n return `${ind(ctx)}<Fragment set:html={\\`${escaped}\\`} />\\n`;\n }\n return `${ind(ctx)}{/* Complex node - SSR fallback not available */}\\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Conditional rendering helpers\n// ---------------------------------------------------------------------------\n\nfunction emitIfOpen(node: ComponentNode, ctx: AstroEmitContext): string {\n const ifValue = hasIf(node) ? node.if : undefined;\n if (ifValue === undefined || ifValue === true) return '';\n\n if (typeof ifValue === 'boolean') {\n return ifValue ? '' : `${ind(ctx)}{/* hidden */}\\n`;\n }\n\n // BooleanMapping \u2192 generate conditional from values map\n if (typeof ifValue === 'object' && ifValue._mapping && ctx.isComponentDef) {\n const trueValues = Object.entries(ifValue.values)\n .filter(([, v]) => v === true)\n .map(([k]) => `'${k}'`);\n if (trueValues.length === 0) return `${ind(ctx)}{/* hidden */}\\n`;\n if (trueValues.length === 1) {\n return `${ind(ctx)}{${ifValue.prop} === ${trueValues[0]} && (\\n`;\n }\n return `${ind(ctx)}{[${trueValues.join(', ')}].includes(${ifValue.prop}) && (\\n`;\n }\n\n // String template\n if (typeof ifValue === 'string') {\n // CMS mode: {{cms.field}} \u2192 entry.data.field\n if (ctx.cmsMode && ifValue.includes('{{cms.')) {\n const match = ifValue.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (match) {\n const binding = ctx.cmsEntryBinding || 'entry';\n return `${ind(ctx)}{${binding}.data.${match[1].trim()} && (\\n`;\n }\n }\n\n // List item context: {{item.field}} or {{!itemLast}} etc.\n if (ctx.listItemBinding && /\\{\\{/.test(ifValue)) {\n const match = ifValue.match(/^\\{\\{([^}]+)\\}\\}$/);\n if (match) {\n let expr = match[1].trim();\n expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n return `${ind(ctx)}{${expr} && (\\n`;\n }\n }\n\n // Component prop context\n if (ctx.isComponentDef) {\n const fullMatch = ifValue.match(/^\\{\\{(.+)\\}\\}$/);\n if (!fullMatch && !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(ifValue)) {\n // Plain string without template syntax and not a valid identifier \u2014 always truthy, skip conditional\n return '';\n }\n let expr = fullMatch ? fullMatch[1].trim() : ifValue.replace(/\\{\\{(.+?)\\}\\}/g, '$1');\n if (ctx.listItemBinding) expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n return `${ind(ctx)}{${expr} && (\\n`;\n }\n }\n\n return '';\n}\n\nfunction emitIfClose(node: ComponentNode, ctx: AstroEmitContext): string {\n const ifValue = hasIf(node) ? node.if : undefined;\n if (ifValue === undefined || ifValue === true) return '';\n\n if (typeof ifValue === 'boolean') return '';\n\n if (typeof ifValue === 'object' && ifValue._mapping && ctx.isComponentDef) {\n return `${ind(ctx)})}\\n`;\n }\n\n if (typeof ifValue === 'string') {\n const hasCmsCondition = ctx.cmsMode && ifValue.includes('{{cms.');\n const hasItemCondition = ctx.listItemBinding && /\\{\\{/.test(ifValue);\n if (hasCmsCondition || hasItemCondition) {\n return `${ind(ctx)})}\\n`;\n }\n if (ctx.isComponentDef) {\n const fullMatch = ifValue.match(/^\\{\\{(.+)\\}\\}$/);\n if (!fullMatch && !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(ifValue)) {\n // Matches the skip in emitIfOpen \u2014 no open brace was emitted\n return '';\n }\n return `${ind(ctx)})}\\n`;\n }\n }\n\n return '';\n}\n\n// ---------------------------------------------------------------------------\n// Children helper\n// ---------------------------------------------------------------------------\n\nfunction emitChildren(\n children: (ComponentNode | string)[] | string | ComponentNode | null | undefined,\n ctx: AstroEmitContext\n): string {\n if (!children) return '';\n\n const innerCtx = { ...ctx, indent: ctx.indent + 1, elementPath: [...ctx.elementPath] };\n\n if (typeof children === 'string') {\n const out = nodeToAstro(children, innerCtx);\n if (innerCtx.needsI18nResolver) ctx.needsI18nResolver = true;\n return out;\n }\n\n // Iterate children arrays inline with appended index (matches SSR renderer's\n // children iteration which uses [...parentPath, index] for each child)\n if (Array.isArray(children)) {\n let result = '';\n for (let i = 0; i < children.length; i++) {\n const childCtx = { ...innerCtx, elementPath: [...ctx.elementPath, i] };\n result += nodeToAstro(children[i], childCtx);\n if (childCtx.needsI18nResolver) ctx.needsI18nResolver = true;\n }\n return result;\n }\n\n // Single node\n const out = nodeToAstro(children, innerCtx);\n if (innerCtx.needsI18nResolver) ctx.needsI18nResolver = true;\n return out;\n}\n", "/**\n * CMS Template Expression Transformer for Astro Export\n * Converts {{cms.field}} and {{item.field}} template expressions to Astro expressions\n */\n\n// CMS template pattern (from cmsSSRProcessor.ts)\nconst CMS_TEMPLATE_PATTERN = /\\{\\{cms\\.([^}]+)\\}\\}/g;\n// Item template pattern for list iteration\nconst ITEM_TEMPLATE_PATTERN = /\\{\\{([^}]+)\\}\\}/g;\n\nexport function isTemplateExpression(text: string): boolean {\n return /\\{\\{.+?\\}\\}/.test(text);\n}\n\nexport function transformCMSTemplate(\n text: string,\n binding: string = 'entry',\n richTextFields?: Set<string>,\n wrapFn?: string\n): string {\n const w = (expr: string) => wrapFn ? `${wrapFn}(${expr})` : expr;\n\n // Check if entire text is a single {{cms.field}} expression\n const fullMatch = text.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (fullMatch) {\n const fieldPath = fullMatch[1].trim();\n const topLevelField = fieldPath.split('.')[0];\n\n // Rich-text fields use Fragment set:html\n if (richTextFields?.has(topLevelField)) {\n return `<Fragment set:html={${w(`${binding}.data.${fieldPath}`)}} />`;\n }\n\n return `{${w(`${binding}.data.${fieldPath}`)}}`;\n }\n\n // Mixed content: \"Hello {{cms.name}}\" \u2192 {`Hello ${entry.data.name}`}\n if (CMS_TEMPLATE_PATTERN.test(text)) {\n CMS_TEMPLATE_PATTERN.lastIndex = 0;\n const replaced = text.replace(CMS_TEMPLATE_PATTERN, (_, fieldPath) => {\n return `\\${${w(`${binding}.data.${fieldPath.trim()}`)}}`;\n });\n return `{\\`${replaced}\\`}`;\n }\n\n return text;\n}\n\n/**\n * Replace legacy itemIndex/itemFirst/itemLast meta-variables with\n * the actual .map() callback index parameter name.\n */\n/**\n * Rewrite the default `item.` prefix to the actual .map() parameter name\n * when itemAs differs from 'item' (e.g., itemAs='link' \u2192 item.text \u2192 link.text).\n */\nexport function rewriteItemVar(expr: string, itemVar: string): string {\n if (itemVar === 'item') return expr;\n return expr.replace(/\\bitem\\./g, `${itemVar}.`);\n}\n\nexport function replaceItemMetaVars(expr: string, indexVar: string, sourceVar?: string, itemVar?: string): string {\n const lastExpr = sourceVar\n ? `(${indexVar} === ${sourceVar}.length - 1)`\n : `false /* itemLast not supported */`;\n let result = expr\n .replace(/\\bitemIndex\\b/g, indexVar)\n .replace(/\\bitemFirst\\b/g, `(${indexVar} === 0)`)\n .replace(/\\bitemLast\\b/g, lastExpr);\n if (itemVar) result = rewriteItemVar(result, itemVar);\n return result;\n}\n\nexport function transformItemTemplate(\n text: string,\n itemVar: string = 'item',\n indexVar?: string,\n sourceVar?: string\n): string {\n // Check if entire text is a single {{expression}}\n const fullMatch = text.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let expr = fullMatch[1].trim();\n expr = rewriteItemVar(expr, itemVar);\n if (indexVar) expr = replaceItemMetaVars(expr, indexVar, sourceVar);\n // If it contains a dot, it's item.field\n if (expr.startsWith(`${itemVar}.`)) {\n return `{${expr}}`;\n }\n // Bare expression like {{features}} - keep as prop reference\n return `{${expr}}`;\n }\n\n // Mixed content: replace each {{expr}}\n if (ITEM_TEMPLATE_PATTERN.test(text)) {\n ITEM_TEMPLATE_PATTERN.lastIndex = 0;\n const replaced = text.replace(ITEM_TEMPLATE_PATTERN, (_, expr) => {\n let trimmed = expr.trim();\n trimmed = rewriteItemVar(trimmed, itemVar);\n if (indexVar) trimmed = replaceItemMetaVars(trimmed, indexVar, sourceVar);\n return `\\${${trimmed}}`;\n });\n return `{\\`${replaced}\\`}`;\n }\n\n return text;\n}\n", "import { RAW_HTML_PREFIX } from '../../shared/constants';\n\nexport function stripRawHtmlPrefixDeep<T>(value: T): T {\n if (typeof value === 'string') {\n return (value.startsWith(RAW_HTML_PREFIX) ? value.slice(RAW_HTML_PREFIX.length) : value) as T;\n }\n if (Array.isArray(value)) {\n return value.map((item) => stripRawHtmlPrefixDeep(item)) as unknown as T;\n }\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = stripRawHtmlPrefixDeep(v);\n }\n return out as T;\n }\n return value;\n}\n\n/** Ensure a component name starts with an uppercase letter so Astro treats it as a component tag, not an HTML element. */\nexport function astroComponentName(name: string): string {\n return name.charAt(0).toUpperCase() + name.slice(1);\n}\n", "/**\n * Component File Generator\n * Generates .astro files from StructuredComponentDefinitions\n */\n\nimport type {\n ComponentDefinition,\n StructuredComponentDefinition,\n PropDefinition,\n} from '../../shared/types';\nimport type { BasePropDefinition, ListPropDefinition, LinkPropValue } from '../../shared/types/components';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';\nimport { nodeToAstro, type AstroEmitContext } from './nodeToAstro';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport { stripRawHtmlPrefixDeep, astroComponentName } from './astroEmitHelpers';\nimport type { InteractiveStyles } from '../../shared/types/styles';\nimport type { RemConversionConfig } from '../../shared/pxToRem';\nimport { generateAllInteractiveCSS } from '../../shared/cssGeneration';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a PropDefinition to a TypeScript type string\n */\nfunction propDefToTSType(def: PropDefinition): string {\n switch (def.type) {\n case 'string':\n case 'rich-text':\n case 'file':\n return 'string';\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'select':\n if ('options' in def && def.options && def.options.length > 0) {\n return def.options.map((o) => `'${o}'`).join(' | ');\n }\n return 'string';\n case 'link':\n return '{ href: string; target?: string }';\n case 'list':\n return 'any[]';\n default:\n return 'any';\n }\n}\n\n/**\n * Format a default value for destructuring\n */\nfunction formatDefault(def: PropDefinition): string | null {\n if (!('default' in def) || def.default === undefined) return null;\n const val = stripRawHtmlPrefixDeep(def.default);\n\n if (typeof val === 'string') return JSON.stringify(val);\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n\n // I18nValue\n if (typeof val === 'object' && val !== null && '_i18n' in val) {\n // Use the first available locale value\n for (const [key, v] of Object.entries(val)) {\n if (key !== '_i18n' && typeof v === 'string') return JSON.stringify(v);\n }\n return null;\n }\n\n // Link value\n if (typeof val === 'object' && val !== null && 'href' in val) {\n return JSON.stringify(val);\n }\n\n // Arrays\n if (Array.isArray(val)) {\n return JSON.stringify(val);\n }\n\n return JSON.stringify(val);\n}\n\n/**\n * Merge the `className` variable onto the root element's class attribute.\n * Handles: class=\"existing\", class:list={[...]}, class={expr}, or no class at all.\n */\nfunction mergeClassNameOntoRoot(template: string): string {\n // Find the first opening tag (skip whitespace/newlines)\n const tagMatch = template.match(/^(\\s*<)(\\w[\\w-]*)([\\s\\S]*?)(\\/?>)/);\n if (!tagMatch) return template;\n\n const [fullMatch, prefix, tagName, attrs, close] = tagMatch;\n\n // Check for existing class:list\n const classListMatch = attrs.match(/\\s+class:list=\\{(\\[[\\s\\S]*?\\])\\}/);\n if (classListMatch) {\n const existingList = classListMatch[1];\n // Append className to the array\n const newList = existingList.replace(/\\]$/, `, className]`);\n const newAttrs = attrs.replace(classListMatch[0], ` class:list={${newList}}`);\n return prefix + tagName + newAttrs + close + template.slice(fullMatch.length);\n }\n\n // Check for existing class=\"...\" (static)\n const classStaticMatch = attrs.match(/\\s+class=\"([^\"]*)\"/);\n if (classStaticMatch) {\n const existing = classStaticMatch[1];\n const newAttrs = attrs.replace(classStaticMatch[0], ` class:list={[\"${existing}\", className]}`);\n return prefix + tagName + newAttrs + close + template.slice(fullMatch.length);\n }\n\n // Check for existing class={expr} (dynamic)\n const classDynMatch = attrs.match(/\\s+class=\\{([^}]+)\\}/);\n if (classDynMatch) {\n const expr = classDynMatch[1];\n const newAttrs = attrs.replace(classDynMatch[0], ` class:list={[${expr}, className]}`);\n return prefix + tagName + newAttrs + close + template.slice(fullMatch.length);\n }\n\n // No existing class \u2014 add class={className}\n return prefix + tagName + ` class={className}` + attrs + close + template.slice(fullMatch.length);\n}\n\n// ---------------------------------------------------------------------------\n// Main emitter\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a .astro file string from a component definition\n */\nexport function emitAstroComponent(\n name: string,\n def: ComponentDefinition,\n allComponents: Record<string, ComponentDefinition>,\n breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS,\n defaultLocale: string = 'en',\n responsiveScales?: ResponsiveScales,\n remConfig?: RemConversionConfig\n): string {\n const comp = def.component;\n const propDefs = comp.interface || {};\n const structure = comp.structure;\n\n if (!structure) {\n // Component with no structure - just CSS/JS\n return buildNoStructureComponent(name, comp);\n }\n\n // Build the Astro context for template emission\n const ctx: AstroEmitContext = {\n imports: new Set<string>(),\n isComponentDef: true,\n componentProps: propDefs,\n globalComponents: allComponents,\n indent: 0,\n ssrFallbacks: new Map(),\n elementPath: [0],\n fileType: 'component',\n fileName: name,\n breakpoints,\n responsiveScales,\n defaultLocale,\n imageImports: new Map<string, string>(),\n fileDepth: 0, // components live at src/components/\n collectedInteractiveStyles: new Map<string, InteractiveStyles>(),\n };\n\n // Emit the template body\n let templateBody = nodeToAstro(structure, ctx);\n\n // Merge instance className onto the root element (for acceptsStyles support)\n templateBody = mergeClassNameOntoRoot(templateBody);\n\n // Build frontmatter (includes class prop for instance style support)\n const frontmatter = buildFrontmatter(\n name,\n propDefs,\n ctx.imports,\n ctx.dynamicTags,\n ctx.needsI18nResolver ? defaultLocale : undefined,\n ctx.imageImports\n );\n\n // Build style/script sections\n const styleSection = comp.css ? `\\n<style>\\n${comp.css}\\n</style>\\n` : '';\n const interactiveStyleSection = ctx.collectedInteractiveStyles!.size > 0\n ? `\\n<style is:global>\\n${generateAllInteractiveCSS(ctx.collectedInteractiveStyles!, breakpoints, remConfig, responsiveScales)}\\n</style>\\n`\n : '';\n const scriptSection = comp.javascript\n ? buildScriptSection(comp.javascript, comp, propDefs)\n : '';\n\n return `---\\n${frontmatter}---\\n${templateBody}${styleSection}${interactiveStyleSection}${scriptSection}`;\n}\n\n/**\n * Build the frontmatter section (imports, Props interface, destructuring)\n */\nfunction buildFrontmatter(\n componentName: string,\n propDefs: Record<string, PropDefinition>,\n imports: Set<string>,\n dynamicTags?: Map<string, string>,\n i18nDefaultLocale?: string,\n imageImports?: Map<string, string>\n): string {\n const lines: string[] = [];\n\n // Component imports\n for (const imp of Array.from(imports).sort()) {\n lines.push(`import ${astroComponentName(imp)} from './${imp}.astro';`);\n }\n\n // Static image imports (astro:assets <Picture>). Map size is the single\n // source of truth \u2014 a separate boolean would be lost by child-ctx spreads.\n if (imageImports && imageImports.size > 0) {\n lines.push(`import { Picture } from 'astro:assets';`);\n const sortedImages = Array.from(imageImports.entries()).sort(([a], [b]) => a.localeCompare(b));\n for (const [varName, importPath] of sortedImages) {\n lines.push(`import ${varName} from '${importPath}';`);\n }\n }\n\n if (lines.length > 0) lines.push('');\n\n const propEntries = Object.entries(propDefs);\n\n // Always generate Props interface and destructuring (at minimum for class prop)\n {\n // Interface\n lines.push('interface Props {');\n for (const [propName, propDef] of propEntries) {\n if (propName === 'children') continue;\n const tsType = propDefToTSType(propDef);\n const optional = 'default' in propDef && propDef.default !== undefined;\n lines.push(` ${propName}${optional ? '?' : ''}: ${tsType};`);\n }\n // Always include class prop for instance style support\n lines.push(' class?: string;');\n lines.push('}');\n lines.push('');\n\n // Destructuring with defaults\n const destructParts: string[] = [];\n for (const [propName, propDef] of propEntries) {\n if (propName === 'children') continue;\n const defaultVal = formatDefault(propDef);\n if (defaultVal !== null) {\n destructParts.push(`${propName} = ${defaultVal}`);\n } else if (propDef.type === 'link') {\n destructParts.push(`${propName} = { href: \"#\" }`);\n } else {\n destructParts.push(propName);\n }\n }\n\n // Always include class prop (renamed to className to avoid reserved word)\n destructParts.push('class: className = \"\"');\n\n if (destructParts.length <= 3 && destructParts.join(', ').length < 80) {\n lines.push(`const { ${destructParts.join(', ')} } = Astro.props;`);\n } else {\n lines.push('const {');\n for (const part of destructParts) {\n lines.push(` ${part},`);\n }\n lines.push('} = Astro.props;');\n }\n }\n\n // Dynamic tag definitions (e.g., const Tag_0_0 = `h${size}`)\n if (dynamicTags && dynamicTags.size > 0) {\n lines.push('');\n for (const [varName, templateExpr] of dynamicTags) {\n lines.push(`const ${varName} = \\`${templateExpr}\\`;`);\n }\n }\n\n // i18n resolver helper \u2014 resolves { _i18n: true, en: \"...\", pl: \"...\" } at runtime\n if (i18nDefaultLocale) {\n lines.push('');\n lines.push(`const r = (v: any) => {`);\n lines.push(` if (v && typeof v === 'object' && v._i18n) {`);\n lines.push(` const locale = Astro.currentLocale ?? '${i18nDefaultLocale}';`);\n lines.push(` return v[locale] ?? v['${i18nDefaultLocale}'] ?? Object.values(v).find((s: any) => typeof s === 'string' && s !== '') ?? '';`);\n lines.push(` }`);\n lines.push(` return v ?? '';`);\n lines.push(`};`);\n }\n\n if (lines.length > 0) lines.push('');\n return lines.join('\\n');\n}\n\n/**\n * Build a component with no structure (CSS/JS only)\n */\nfunction buildNoStructureComponent(\n name: string,\n comp: StructuredComponentDefinition\n): string {\n let content = '---\\n---\\n<slot />\\n';\n if (comp.css) content += `\\n<style>\\n${comp.css}\\n</style>\\n`;\n if (comp.javascript) content += `\\n<script is:inline>\\n${comp.javascript}\\n</script>\\n`;\n return content;\n}\n\n/**\n * Transform JS for define:vars compatibility.\n * Astro's define:vars injects each prop as a script-scope variable, not a `props` object.\n * This function:\n * 1. Removes `const/let/var { x, y } = props;` destructuring lines\n * 2. Replaces `props.X` references with direct `X` variable access\n * 3. Drops `var/let/const` from redeclarations of define:vars variables\n */\nfunction transformDefineVarsJS(js: string, varNames: string[]): string {\n let result = js;\n\n // 1. Remove destructuring from props: `const { x, y } = props;`\n result = result.replace(\n /^\\s*(const|let|var)\\s+\\{([^}]+)\\}\\s*=\\s*props\\s*;?\\s*$/gm,\n (match, _keyword, inner) => {\n const names = inner.split(',').map((s: string) => s.trim()).filter(Boolean);\n if (names.every((n: string) => varNames.includes(n))) return '';\n return match;\n }\n );\n\n // 2. Replace `props.X` with `X` (longest names first to avoid substring conflicts)\n const sorted = [...varNames].sort((a, b) => b.length - a.length);\n for (const name of sorted) {\n result = result.replace(new RegExp(`props\\\\.${name}\\\\b`, 'g'), name);\n }\n\n // 3. Remove redeclarations of define:vars variables (already injected as const by Astro)\n for (const name of varNames) {\n result = result.replace(\n new RegExp(`^\\\\s*(var|let|const)\\\\s+${name}\\\\s*=[^;]*;?\\\\s*$`, 'gm'),\n ''\n );\n }\n\n return result;\n}\n\n/**\n * Build the script section with proper el/props initialization.\n * Captures el immediately via document.currentScript.previousElementSibling,\n * then defers actual JS execution until DOMContentLoaded so that external\n * libraries (e.g. Swiper loaded with defer) are available.\n */\nfunction buildScriptSection(\n js: string,\n comp: StructuredComponentDefinition,\n propDefs: Record<string, PropDefinition>\n): string {\n // Capture el immediately (document.currentScript is only valid during script execution)\n // but defer the component init until DOMContentLoaded so deferred libraries are ready\n // Remove whitespace-only text nodes so Astro's formatted HTML matches SSR's minified output.\n // Without this, scripts that use firstChild/childNodes pick up whitespace between elements.\n const cleanTextNodes = `(function _w(n){var c=n.firstChild,x;while(c){x=c.nextSibling;if(c.nodeType===3){if(!c.textContent.trim())n.removeChild(c)}else if(c.nodeType===1){if(c.tagName==='SCRIPT')n.removeChild(c);else _w(c)}c=x}})(el);`;\n\n const deferWrapper = (innerJS: string) =>\n `var el = document.currentScript.previousElementSibling;\\n` +\n `function __init__() {\\n${cleanTextNodes}\\n${innerJS}\\n}\\n` +\n `if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', __init__); } else { __init__(); }`;\n\n if (comp.defineVars) {\n const vars = comp.defineVars === true\n ? Object.keys(propDefs).filter(k => k !== 'children')\n : comp.defineVars;\n\n if (vars.length > 0) {\n const transformedJS = transformDefineVarsJS(js, vars);\n const defineVarsObj = `{ ${vars.join(', ')} }`;\n return `\\n<script define:vars={${defineVarsObj}}>\\n(function(){\\n${deferWrapper(transformedJS)}\\n})();\\n</script>\\n`;\n }\n }\n\n return `\\n<script is:inline>\\n(function(){\\n${deferWrapper(js)}\\n})();\\n</script>\\n`;\n}\n", "/**\n * Page File Generator\n * Generates .astro page files that import and compose components\n */\n\nimport type { JSONPage, ComponentDefinition, I18nConfig } from '../../shared/types';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';\nimport { nodeToAstro, type AstroEmitContext } from './nodeToAstro';\nimport type { ImageMetadataMap } from '../ssr/imageMetadata';\nimport type { SlugMap } from '../../shared/slugTranslator';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport type { InteractiveStyles } from '../../shared/types/styles';\nimport type { RemConversionConfig } from '../../shared/pxToRem';\nimport { generateAllInteractiveCSS } from '../../shared/cssGeneration';\nimport { astroComponentName } from './astroEmitHelpers';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PageEmitOptions {\n /** Page data */\n pageData: JSONPage;\n /** All global components */\n globalComponents: Record<string, ComponentDefinition>;\n /** Page title */\n title: string;\n /** Page meta HTML */\n meta: string;\n /** Locale */\n locale: string;\n /** Default theme */\n theme: string;\n /** Font preloads HTML */\n fontPreloads: string;\n /** Library tags */\n libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string };\n /** Script paths */\n scriptPaths: string[];\n /** Import path to BaseLayout */\n layoutImportPath: string;\n /** File depth relative to src/pages */\n fileDepth: number;\n /** SSR HTML fallbacks: node path \u2192 rendered HTML (for ListNode, LocaleListNode) */\n ssrFallbacks: Map<string, string>;\n /** Page name (without extension) */\n pageName: string;\n /** Breakpoint config for responsive Tailwind classes */\n breakpoints?: BreakpointConfig;\n /** Responsive scales config for auto-scaling at breakpoints */\n responsiveScales?: ResponsiveScales;\n /** Image metadata map for responsive image generation */\n imageMetadataMap?: ImageMetadataMap;\n /** I18n config for locale list rendering */\n i18nConfig?: I18nConfig;\n /** Locale\u2192slug map for current page (for locale list links) */\n currentPageSlugMap?: Record<string, string>;\n /** Slug mappings for translating internal link hrefs */\n slugMappings?: SlugMap[];\n /** Image format: 'webp' uses plain <img>, 'avif' uses <picture> */\n imageFormat?: 'webp' | 'avif';\n /**\n * Raw-HTML slice \u2192 processed HTML captured during the page's SSR pass.\n * Ensures `<Fragment set:html>` matches SSR output for rich-text content\n * (image rewriting, component expansion, link localization).\n */\n processedRawHtml?: Map<string, string>;\n /** Rem conversion config for interactive CSS generation */\n remConfig?: RemConversionConfig;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction escapeTemplateLiteral(s: string): string {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$\\{/g, '\\\\${')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\nfunction escapeJSX(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n}\n\n/**\n * Compute relative import path from page to components directory\n */\nfunction componentImportPath(fileDepth: number, componentName: string): string {\n // fileDepth 0 = src/pages/index.astro \u2192 ../components/X.astro\n // fileDepth 1 = src/pages/en/index.astro \u2192 ../../components/X.astro\n const ups = '../'.repeat(fileDepth + 1);\n return `${ups}components/${componentName}.astro`;\n}\n\n// ---------------------------------------------------------------------------\n// Main emitter\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a page .astro file from page data with component imports\n */\nexport function emitAstroPage(options: PageEmitOptions): string {\n const {\n pageData,\n globalComponents,\n title,\n meta,\n locale,\n theme,\n fontPreloads,\n libraryTags,\n scriptPaths,\n layoutImportPath,\n fileDepth,\n ssrFallbacks,\n pageName,\n breakpoints: breakpointsOpt,\n responsiveScales,\n imageMetadataMap,\n i18nConfig,\n currentPageSlugMap,\n slugMappings,\n imageFormat,\n processedRawHtml,\n remConfig,\n } = options;\n\n const breakpoints = breakpointsOpt ?? DEFAULT_BREAKPOINTS;\n\n const root = pageData.root;\n if (!root) {\n // Empty page - just layout wrapper\n return buildEmptyPage(layoutImportPath, title, meta, locale, theme, fontPreloads, libraryTags, scriptPaths);\n }\n\n // Build the Astro emit context\n const ctx: AstroEmitContext = {\n imports: new Set<string>(),\n isComponentDef: false,\n componentProps: {},\n globalComponents,\n indent: 1, // inside BaseLayout\n ssrFallbacks,\n elementPath: [0],\n fileType: 'page',\n fileName: pageName,\n breakpoints,\n responsiveScales,\n imageMetadataMap,\n locale,\n i18nConfig,\n currentPageSlugMap,\n frontmatterLines: [],\n astroImports: new Set<string>(),\n slugMappings,\n i18nDefaultLocale: i18nConfig?.defaultLocale,\n imageFormat,\n processedRawHtml,\n imageImports: new Map<string, string>(),\n fileDepth,\n collectedInteractiveStyles: new Map<string, InteractiveStyles>(),\n };\n\n // Emit the template body\n const templateBody = nodeToAstro(root, ctx);\n\n // Build frontmatter with imports\n const importLines: string[] = [];\n\n // Add Astro API imports (e.g., getCollection) if collected during emission\n if (ctx.astroImports && ctx.astroImports.size > 0) {\n const astroImports = Array.from(ctx.astroImports);\n importLines.push(`import { ${astroImports.join(', ')} } from 'astro:content';`);\n }\n\n importLines.push(`import BaseLayout from '${layoutImportPath}';`);\n\n // Static image imports (astro:assets <Picture>). Map size is the single\n // source of truth \u2014 a separate boolean would be lost by child-ctx spreads.\n if (ctx.imageImports && ctx.imageImports.size > 0) {\n importLines.push(`import { Picture } from 'astro:assets';`);\n const sortedImages = Array.from(ctx.imageImports.entries()).sort(([a], [b]) => a.localeCompare(b));\n for (const [varName, importPath] of sortedImages) {\n importLines.push(`import ${varName} from '${importPath}';`);\n }\n }\n\n // Sort component imports alphabetically\n const componentImports = Array.from(ctx.imports).sort();\n for (const comp of componentImports) {\n const path = componentImportPath(fileDepth, comp);\n importLines.push(`import ${astroComponentName(comp)} from '${path}';`);\n }\n\n // Build script paths array\n const scriptsArrayLiteral = scriptPaths.length > 0\n ? `[${scriptPaths.map((s) => `\"${s}\"`).join(', ')}]`\n : '[]';\n\n // Build library tags literal\n const libraryTagsLiteral = `{ headCSS: \\`${escapeTemplateLiteral(libraryTags.headCSS || '')}\\`, headJS: \\`${escapeTemplateLiteral(libraryTags.headJS || '')}\\`, bodyEndJS: \\`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\\` }`;\n\n const escapedMeta = escapeTemplateLiteral(meta);\n const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);\n\n // Collect frontmatter lines from list emission (e.g., getCollection calls)\n const extraFrontmatter = ctx.frontmatterLines && ctx.frontmatterLines.length > 0\n ? '\\n' + ctx.frontmatterLines.join('\\n')\n : '';\n\n // Generate interactive style block for page-level interactive styles\n const interactiveStyleSection = ctx.collectedInteractiveStyles!.size > 0\n ? `\\n<style is:global>\\n${generateAllInteractiveCSS(ctx.collectedInteractiveStyles!, breakpoints, remConfig, responsiveScales)}\\n</style>\\n`\n : '';\n\n return `---\n${importLines.join('\\n')}${extraFrontmatter}\n---\n<BaseLayout\n title=\"${escapeJSX(title)}\"\n meta={\\`${escapedMeta}\\`}\n scripts={${scriptsArrayLiteral}}\n locale=\"${locale}\"\n theme=\"${theme}\"\n fontPreloads={\\`${escapedFontPreloads}\\`}\n libraryTags={${libraryTagsLiteral}}\n>\n <div id=\"root\">\n${templateBody} </div>\n</BaseLayout>\n${interactiveStyleSection}`;\n}\n\n/**\n * Build an empty page with just the layout wrapper\n */\nfunction buildEmptyPage(\n layoutImport: string,\n title: string,\n meta: string,\n locale: string,\n theme: string,\n fontPreloads: string,\n libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string },\n scriptPaths: string[]\n): string {\n const escapedMeta = escapeTemplateLiteral(meta);\n const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);\n const scriptsArrayLiteral = scriptPaths.length > 0\n ? `[${scriptPaths.map((s) => `\"${s}\"`).join(', ')}]`\n : '[]';\n const libraryTagsLiteral = `{ headCSS: \\`${escapeTemplateLiteral(libraryTags.headCSS || '')}\\`, headJS: \\`${escapeTemplateLiteral(libraryTags.headJS || '')}\\`, bodyEndJS: \\`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\\` }`;\n\n return `---\nimport BaseLayout from '${layoutImport}';\n---\n<BaseLayout\n title=\"${escapeJSX(title)}\"\n meta={\\`${escapedMeta}\\`}\n scripts={${scriptsArrayLiteral}}\n locale=\"${locale}\"\n theme=\"${theme}\"\n fontPreloads={\\`${escapedFontPreloads}\\`}\n libraryTags={${libraryTagsLiteral}}\n>\n</BaseLayout>\n`;\n}\n", "/**\n * CMS Page File Generator\n * Generates .astro page files for CMS template pages with getStaticPaths()\n */\n\nimport type { JSONPage, ComponentDefinition, CMSSchema, I18nConfig } from '../../shared/types';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';\nimport { nodeToAstro, type AstroEmitContext } from './nodeToAstro';\nimport { transformCMSTemplate } from './templateTransformer';\nimport type { ImageMetadataMap } from '../ssr/imageMetadata';\nimport type { SlugMap } from '../../shared/slugTranslator';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport type { InteractiveStyles } from '../../shared/types/styles';\nimport type { RemConversionConfig } from '../../shared/pxToRem';\nimport { generateAllInteractiveCSS } from '../../shared/cssGeneration';\nimport { astroComponentName } from './astroEmitHelpers';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CMSPageEmitOptions {\n /** Page data */\n pageData: JSONPage;\n /** All global components */\n globalComponents: Record<string, ComponentDefinition>;\n /** CMS collection schema */\n cmsSchema: CMSSchema;\n /** Page title (may contain {{cms.field}}) */\n title: string;\n /** Page meta HTML */\n meta: string;\n /** Locale */\n locale: string;\n /** Default theme */\n theme: string;\n /** Font preloads HTML */\n fontPreloads: string;\n /** Library tags */\n libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string };\n /** Script paths */\n scriptPaths: string[];\n /** Import path to BaseLayout */\n layoutImportPath: string;\n /** File depth relative to src/pages */\n fileDepth: number;\n /** SSR HTML fallbacks: node path -> rendered HTML (for ListNode, LocaleListNode) */\n ssrFallbacks: Map<string, string>;\n /** Page name (without extension) */\n pageName: string;\n /** Breakpoint config for responsive Tailwind classes */\n breakpoints?: BreakpointConfig;\n /** Responsive scales config for auto-scaling at breakpoints */\n responsiveScales?: ResponsiveScales;\n /** Image metadata map for responsive image generation */\n imageMetadataMap?: ImageMetadataMap;\n /** Internationalization config */\n i18nConfig: I18nConfig;\n /** Whether site has multiple locales */\n isMultiLocale: boolean;\n /** Slug mappings for translating internal link hrefs */\n slugMappings?: SlugMap[];\n /** Image format: 'webp' uses plain <img>, 'avif' uses <picture> */\n imageFormat?: 'webp' | 'avif';\n /**\n * Raw-HTML slice \u2192 processed HTML captured during the template's SSR pass.\n * Ensures `<Fragment set:html>` matches SSR output for rich-text content\n * (image rewriting, component expansion, link localization).\n */\n processedRawHtml?: Map<string, string>;\n /** Rem conversion config for interactive CSS generation */\n remConfig?: RemConversionConfig;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction escapeTemplateLiteral(s: string): string {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$\\{/g, '\\\\${')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\nfunction escapeJSX(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n}\n\nfunction componentImportPath(fileDepth: number, componentName: string): string {\n const ups = '../'.repeat(fileDepth + 1);\n return `${ups}components/${componentName}.astro`;\n}\n\n/**\n * Collect rich-text field names from CMS schema\n */\nfunction collectRichTextFields(schema: CMSSchema): Set<string> {\n const richTextFields = new Set<string>();\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n if (fieldDef.type === 'rich-text') {\n richTextFields.add(fieldName);\n }\n }\n return richTextFields;\n}\n\n/**\n * Transform a title string that may contain {{cms.field}} to an Astro expression.\n * Returns the transformed title suitable for use in a JSX attribute.\n */\nfunction transformTitleExpression(\n title: string,\n binding: string,\n richTextFields: Set<string>,\n wrapFn?: string\n): string {\n if (!/\\{\\{cms\\./.test(title)) {\n return `\"${escapeJSX(title)}\"`;\n }\n\n const w = (expr: string) => wrapFn ? `${wrapFn}(${expr})` : expr;\n\n // Full match: entire title is a single {{cms.field}}\n const fullMatch = title.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (fullMatch) {\n return `{${w(`${binding}.data.${fullMatch[1].trim()}`)}}`;\n }\n\n // Mixed content: \"Page - {{cms.title}}\" -> {`Page - ${entry.data.title}`}\n const replaced = title.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (_, fieldPath) => {\n return `\\${${w(`${binding}.data.${fieldPath.trim()}`)}}`;\n });\n return `{\\`${replaced}\\`}`;\n}\n\n/**\n * Extract the path prefix from a URL pattern.\n * E.g., \"/blog/{{slug}}\" -> \"blog/\"\n * E.g., \"/posts/{{slug}}\" -> \"posts/\"\n */\nfunction extractPathPrefix(urlPattern: string): string {\n // Remove leading slash, then remove the slug placeholder and everything after\n const withoutLeading = urlPattern.replace(/^\\//, '');\n const idx = withoutLeading.indexOf('{{');\n if (idx <= 0) return '';\n return withoutLeading.substring(0, idx);\n}\n\n// ---------------------------------------------------------------------------\n// getStaticPaths generator\n// ---------------------------------------------------------------------------\n\nfunction buildGetStaticPaths(\n schema: CMSSchema,\n isMultiLocale: boolean,\n i18nConfig: I18nConfig,\n locale?: string\n): string {\n const collectionId = schema.id;\n const slugField = schema.slugField || 'slug';\n const pathPrefix = extractPathPrefix(schema.urlPattern);\n const targetLocale = locale || i18nConfig.defaultLocale;\n\n if (!isMultiLocale) {\n // Single-locale version: resolve slug for this specific locale\n // Route file is at blog/[slug].astro (or pl/blog/[slug].astro for non-default)\n // If i18n values exist, resolve for the target locale\n const slugExpr = i18nConfig.locales.length > 1\n ? `entry.data.${slugField}?.${targetLocale} || entry.data.${slugField} || entry.id`\n : `entry.data.${slugField} || entry.id`;\n\n return [\n `export async function getStaticPaths() {`,\n ` const entries = await getCollection('${collectionId}');`,\n ` return entries.map(entry => ({`,\n ` params: { slug: ${slugExpr} },`,\n ` props: { entry },`,\n ` }));`,\n `}`,\n ``,\n `const { entry } = Astro.props;`,\n ].join('\\n');\n }\n\n // Multi-locale version: enumerate items x locales\n // Route file is at [...slug].astro (top level), so slug includes full path\n const defaultLocale = i18nConfig.defaultLocale;\n const locales = i18nConfig.locales;\n\n const lines: string[] = [\n `export async function getStaticPaths() {`,\n ` const entries = await getCollection('${collectionId}');`,\n ` const paths = [];`,\n ` for (const entry of entries) {`,\n ];\n\n for (const locale of locales) {\n const code = locale.code;\n const slugExpr = `entry.data.${slugField}?.${code} || entry.data.${slugField} || entry.id`;\n\n if (code === defaultLocale) {\n // Default locale: include path prefix but no locale prefix\n // e.g., /blog/{{slug}} \u2192 slug = \"blog/hello\"\n if (pathPrefix) {\n lines.push(\n ` paths.push({`,\n ` params: { slug: \\`${pathPrefix}\\${${slugExpr}}\\` },`,\n ` props: { entry, locale: '${code}' },`,\n ` });`\n );\n } else {\n lines.push(\n ` paths.push({`,\n ` params: { slug: ${slugExpr} },`,\n ` props: { entry, locale: '${code}' },`,\n ` });`\n );\n }\n } else {\n // Non-default locale: locale prefix + path prefix + slug\n // e.g., slug = \"pl/blog/witaj\"\n lines.push(\n ` paths.push({`,\n ` params: { slug: \\`${code}/${pathPrefix}\\${${slugExpr}}\\` },`,\n ` props: { entry, locale: '${code}' },`,\n ` });`\n );\n }\n }\n\n lines.push(\n ` }`,\n ` return paths;`,\n `}`,\n ``,\n `const { entry, locale = '${defaultLocale}' } = Astro.props;`\n );\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Main emitter\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a CMS template .astro page file with getStaticPaths()\n */\nexport function emitCMSPage(options: CMSPageEmitOptions): string {\n const {\n pageData,\n globalComponents,\n cmsSchema,\n title,\n meta,\n locale,\n theme,\n fontPreloads,\n libraryTags,\n scriptPaths,\n layoutImportPath,\n fileDepth,\n ssrFallbacks,\n pageName,\n breakpoints: breakpointsOpt,\n responsiveScales,\n imageMetadataMap,\n i18nConfig,\n isMultiLocale,\n slugMappings,\n processedRawHtml,\n remConfig,\n } = options;\n\n const breakpoints = breakpointsOpt ?? DEFAULT_BREAKPOINTS;\n const binding = 'entry';\n const richTextFields = collectRichTextFields(cmsSchema);\n const wrapFn = 'r';\n\n const root = pageData.root;\n if (!root) {\n return buildEmptyCMSPage(\n layoutImportPath,\n title,\n meta,\n locale,\n theme,\n fontPreloads,\n libraryTags,\n scriptPaths,\n cmsSchema,\n isMultiLocale,\n i18nConfig,\n binding,\n richTextFields\n );\n }\n\n // Build the Astro emit context with CMS mode enabled\n const ctx: AstroEmitContext = {\n imports: new Set<string>(),\n isComponentDef: false,\n componentProps: {},\n globalComponents,\n indent: 1, // inside BaseLayout\n ssrFallbacks,\n elementPath: [0],\n fileType: 'page',\n fileName: pageName,\n breakpoints,\n responsiveScales,\n imageMetadataMap,\n locale,\n cmsMode: true,\n cmsEntryBinding: binding,\n cmsRichTextFields: richTextFields,\n cmsWrapFn: wrapFn,\n slugMappings,\n i18nDefaultLocale: i18nConfig.defaultLocale,\n imageFormat: options.imageFormat,\n processedRawHtml,\n imageImports: new Map<string, string>(),\n fileDepth,\n collectedInteractiveStyles: new Map<string, InteractiveStyles>(),\n };\n\n // Emit the template body\n const templateBody = nodeToAstro(root, ctx);\n\n // Build frontmatter with imports\n const importLines: string[] = [];\n importLines.push(`import { getCollection } from 'astro:content';`);\n importLines.push(`import BaseLayout from '${layoutImportPath}';`);\n\n // Static image imports (astro:assets <Picture>). Map size is the single\n // source of truth \u2014 a separate boolean would be lost by child-ctx spreads.\n if (ctx.imageImports && ctx.imageImports.size > 0) {\n importLines.push(`import { Picture } from 'astro:assets';`);\n const sortedImages = Array.from(ctx.imageImports.entries()).sort(([a], [b]) => a.localeCompare(b));\n for (const [varName, importPath] of sortedImages) {\n importLines.push(`import ${varName} from '${importPath}';`);\n }\n }\n\n // Sort component imports alphabetically\n const componentImports = Array.from(ctx.imports).sort();\n for (const comp of componentImports) {\n const path = componentImportPath(fileDepth, comp);\n importLines.push(`import ${astroComponentName(comp)} from '${path}';`);\n }\n\n // Build getStaticPaths\n const staticPaths = buildGetStaticPaths(cmsSchema, isMultiLocale, i18nConfig, locale);\n\n // Build script paths array\n const scriptsArrayLiteral = scriptPaths.length > 0\n ? `[${scriptPaths.map((s) => `\"${s}\"`).join(', ')}]`\n : '[]';\n\n // Build library tags literal\n const libraryTagsLiteral = `{ headCSS: \\`${escapeTemplateLiteral(libraryTags.headCSS || '')}\\`, headJS: \\`${escapeTemplateLiteral(libraryTags.headJS || '')}\\`, bodyEndJS: \\`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\\` }`;\n\n // Escape meta first, then transform CMS templates ({{cms.X}} survives escaping intact)\n const escapedMeta = escapeTemplateLiteral(meta).replace(\n /\\{\\{cms\\.([^}]+)\\}\\}/g,\n (_, fieldPath) => `\\${${wrapFn}(${binding}.data.${fieldPath.trim()})}`\n );\n const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);\n\n // Transform title for CMS entry data\n const titleExpr = transformTitleExpression(title, binding, richTextFields, wrapFn);\n\n // i18n resolver helper \u2014 resolves {_i18n: true, en: \"...\", pl: \"...\"} to the correct locale string\n const resolverHelper = `function r(v) {\n if (v && typeof v === 'object' && v._i18n) return v['${locale}'] ?? v['${i18nConfig.defaultLocale}'] ?? Object.values(v).find(x => x !== true && x !== undefined) ?? '';\n return v ?? '';\n}`;\n\n // Generate interactive style block for page-level interactive styles\n const interactiveStyleSection = ctx.collectedInteractiveStyles!.size > 0\n ? `\\n<style is:global>\\n${generateAllInteractiveCSS(ctx.collectedInteractiveStyles!, breakpoints, remConfig, responsiveScales)}\\n</style>\\n`\n : '';\n\n return `---\n${importLines.join('\\n')}\n\n${staticPaths}\n\n${resolverHelper}\n---\n<BaseLayout\n title=${titleExpr}\n meta={\\`${escapedMeta}\\`}\n scripts={${scriptsArrayLiteral}}\n locale=\"${locale}\"\n theme=\"${theme}\"\n fontPreloads={\\`${escapedFontPreloads}\\`}\n libraryTags={${libraryTagsLiteral}}\n>\n <div id=\"root\">\n${templateBody} </div>\n</BaseLayout>\n${interactiveStyleSection}`;\n}\n\n/**\n * Build an empty CMS page with just the layout wrapper and getStaticPaths\n */\nfunction buildEmptyCMSPage(\n layoutImport: string,\n title: string,\n meta: string,\n locale: string,\n theme: string,\n fontPreloads: string,\n libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string },\n scriptPaths: string[],\n cmsSchema: CMSSchema,\n isMultiLocale: boolean,\n i18nConfig: I18nConfig,\n binding: string,\n richTextFields: Set<string>\n): string {\n const escapedMeta = escapeTemplateLiteral(meta);\n const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);\n const scriptsArrayLiteral = scriptPaths.length > 0\n ? `[${scriptPaths.map((s) => `\"${s}\"`).join(', ')}]`\n : '[]';\n const libraryTagsLiteral = `{ headCSS: \\`${escapeTemplateLiteral(libraryTags.headCSS || '')}\\`, headJS: \\`${escapeTemplateLiteral(libraryTags.headJS || '')}\\`, bodyEndJS: \\`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\\` }`;\n\n const wrapFn = 'r';\n const staticPaths = buildGetStaticPaths(cmsSchema, isMultiLocale, i18nConfig, locale);\n const titleExpr = transformTitleExpression(title, binding, richTextFields, wrapFn);\n\n const resolverHelper = `function r(v) {\n if (v && typeof v === 'object' && v._i18n) return v['${locale}'] ?? v['${i18nConfig.defaultLocale}'] ?? Object.values(v).find(x => x !== true && x !== undefined) ?? '';\n return v ?? '';\n}`;\n\n return `---\nimport { getCollection } from 'astro:content';\nimport BaseLayout from '${layoutImport}';\n\n${staticPaths}\n\n${resolverHelper}\n---\n<BaseLayout\n title=${titleExpr}\n meta={\\`${escapedMeta}\\`}\n scripts={${scriptsArrayLiteral}}\n locale=\"${locale}\"\n theme=\"${theme}\"\n fontPreloads={\\`${escapedFontPreloads}\\`}\n libraryTags={${libraryTagsLiteral}}\n>\n</BaseLayout>\n`;\n}\n", "/**\n * Mapping Variant CSS Collector (Tailwind)\n * Walks all component definitions to find StyleMapping objects,\n * generates Tailwind classes for every possible value, ensuring\n * the Tailwind safelist covers all prop variants.\n */\n\nimport type { ComponentDefinition, ComponentNode } from '../../shared/types';\nimport type {\n StyleObject,\n ResponsiveStyleObject,\n StyleMapping,\n} from '../../shared/types/styles';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';\nimport { propertyToTailwind } from './tailwindMapper';\nimport type { ResponsiveScales, CSSPropertyType } from '../../shared/responsiveScaling';\nimport { getScaleMultiplier, scalePropertyValue } from '../../shared/responsiveScaling';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isStyleMapping(value: unknown): value is StyleMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as StyleMapping)._mapping === true\n );\n}\n\nfunction isResponsiveStyle(\n style: StyleObject | ResponsiveStyleObject\n): style is ResponsiveStyleObject {\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n/**\n * Walk a style object and collect Tailwind classes for every possible mapping value\n */\nfunction collectFromStyle(\n style: StyleObject | ResponsiveStyleObject | undefined,\n classes: Set<string>,\n breakpoints: BreakpointConfig,\n responsiveScales?: ResponsiveScales\n): void {\n if (!style) return;\n\n if (isResponsiveStyle(style)) {\n for (const [bp, bpStyle] of Object.entries(style)) {\n if (!bpStyle) continue;\n let prefix = '';\n let bpName: string | undefined;\n if (bp !== 'base') {\n const bpValue = breakpoints[bp]?.breakpoint;\n if (bpValue) {\n prefix = `max-[${bpValue}px]:`;\n bpName = bp;\n }\n }\n collectFromFlatStyle(bpStyle, prefix, classes, breakpoints, responsiveScales, bpName);\n }\n } else {\n collectFromFlatStyle(style, '', classes, breakpoints, responsiveScales);\n }\n}\n\nfunction collectFromFlatStyle(\n style: StyleObject,\n prefix: string,\n classes: Set<string>,\n breakpoints: BreakpointConfig,\n responsiveScales?: ResponsiveScales,\n sourceBreakpoint?: string\n): void {\n // Only auto-scale when mapping value lives in the base branch (or a flat\n // top-level style). Mappings inside an explicit breakpoint branch already\n // describe the override the author wants \u2014 don't re-scale them.\n const shouldAutoScale =\n responsiveScales?.enabled === true && sourceBreakpoint === undefined;\n\n const scaleBreakpoints = shouldAutoScale\n ? Object.entries(breakpoints)\n .map(([name, cfg]) => ({ name, value: cfg?.breakpoint }))\n .filter((bp): bp is { name: string; value: number } =>\n typeof bp.value === 'number' && bp.value > 0\n )\n .sort((a, b) => b.value - a.value)\n : [];\n\n const baseRef = responsiveScales?.baseReference ?? 16;\n\n for (const [property, value] of Object.entries(style)) {\n if (!isStyleMapping(value)) continue;\n\n // Generate a Tailwind class for each possible value in the mapping\n for (const [, cssValue] of Object.entries(value.values)) {\n const twClass = propertyToTailwind(property, cssValue);\n if (twClass) {\n classes.add(prefix ? `${prefix}${twClass}` : twClass);\n }\n\n // Safelist auto-scaled `max-[Npx]:` variants so Tailwind generates\n // CSS for each breakpoint-scaled class the runtime might produce.\n if (shouldAutoScale && responsiveScales) {\n const strValue = String(cssValue);\n if (strValue === '') continue;\n for (const { name: bpName, value: bpPixels } of scaleBreakpoints) {\n const scale = getScaleMultiplier(\n responsiveScales,\n property as CSSPropertyType,\n bpName\n );\n if (scale == null) continue;\n const scaledValue = scalePropertyValue(strValue, baseRef, scale);\n if (scaledValue == null || scaledValue === strValue) continue;\n const scaledClass = propertyToTailwind(property, scaledValue);\n if (!scaledClass) continue;\n classes.add(`max-[${bpPixels}px]:${scaledClass}`);\n }\n }\n }\n }\n}\n\n/**\n * Recursively walk a component node tree to collect mapping classes\n */\nfunction walkNode(\n node: ComponentNode | ComponentNode[] | string | number | null | undefined,\n classes: Set<string>,\n breakpoints: BreakpointConfig,\n responsiveScales?: ResponsiveScales\n): void {\n if (!node || typeof node === 'string' || typeof node === 'number') return;\n\n if (Array.isArray(node)) {\n for (const child of node) {\n walkNode(child, classes, breakpoints, responsiveScales);\n }\n return;\n }\n\n // Collect from style\n if ('style' in node && node.style) {\n collectFromStyle(node.style as StyleObject | ResponsiveStyleObject, classes, breakpoints, responsiveScales);\n }\n\n // Collect from interactive styles\n if ('interactiveStyles' in node && Array.isArray((node as any).interactiveStyles)) {\n for (const rule of (node as any).interactiveStyles) {\n if (rule.style) {\n collectFromStyle(rule.style, classes, breakpoints, responsiveScales);\n }\n }\n }\n\n // Recurse into children\n if ('children' in node && node.children) {\n if (Array.isArray(node.children)) {\n for (const child of node.children) {\n walkNode(child as ComponentNode, classes, breakpoints, responsiveScales);\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\n/**\n * Walk all component definitions, find all StyleMapping objects,\n * and generate Tailwind classes for every value.\n *\n * @returns Set of Tailwind class names for the safelist\n */\nexport function collectAllMappingClasses(\n componentDefs: Record<string, ComponentDefinition>,\n breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS,\n responsiveScales?: ResponsiveScales\n): Set<string> {\n const classes = new Set<string>();\n\n for (const def of Object.values(componentDefs)) {\n const structure = def.component?.structure;\n if (structure) {\n walkNode(structure, classes, breakpoints, responsiveScales);\n }\n }\n\n return classes;\n}\n", "/**\n * Webflow Export Build Orchestrator\n * Loads the project, renders all pages, and converts to Webflow payload.\n * Mirrors the pattern of build-astro.ts.\n */\n\nimport { existsSync, readdirSync } from 'fs';\nimport { readFile } from 'fs/promises';\nimport { join } from 'path';\nimport {\n loadJSONFile,\n loadComponentDirectory,\n mapPageNameToPath,\n parseJSON,\n loadI18nConfig,\n loadBreakpointConfig,\n} from '../jsonLoader';\nimport { renderPageSSR } from '../ssr/ssrRenderer';\nimport { projectPaths } from '../projectContext';\nimport { loadProjectConfig } from '../../shared/fontLoader';\nimport { FileSystemCMSProvider } from '../providers/fileSystemCMSProvider';\nimport { CMSService } from '../services/cmsService';\nimport { isI18nValue, resolveI18nValue } from '../../shared/i18n';\nimport { RAW_HTML_PREFIX } from '../../shared/constants';\nimport { extractPageMeta, type PageMeta } from '../ssr/metaTagGenerator';\nimport { configService } from '../services/configService';\nimport { colorService } from '../services/ColorService';\nimport { variableService } from '../services/VariableService';\nimport { migrateTemplatesDirectory } from '../migrateTemplates';\nimport type {\n ComponentDefinition,\n JSONPage,\n CMSSchema,\n CMSItem,\n I18nConfig,\n ThemeConfig,\n} from '../../shared/types';\nimport { resolvePaletteColor } from '../../shared/types/colors';\nimport type { SlugMap } from '../../shared/slugTranslator';\nimport type {\n WebflowExportPayload,\n WebflowPage,\n WebflowStyleClass,\n WebflowAssetRef,\n WebflowScript,\n WebflowComponentDef,\n} from './types';\nimport { nodeToWebflow, normalizeListChildren, type WebflowEmitContext } from './nodeToWebflow';\nimport { isWebflowHandledRule } from './styleMapper';\nimport { generateInteractiveCSS } from '../../shared/cssGeneration';\nimport { generateVariablesCSS } from '../cssGenerator';\nimport type { InteractiveStyles } from '../../shared/types/styles';\nimport { resolveVariableValueAtBreakpoint } from '../../shared/responsiveScaling';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport type { VariablesConfig } from '../../shared/types';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction scanJSONFiles(dir: string, prefix: string = ''): string[] {\n const results: string[] = [];\n if (!existsSync(dir)) return results;\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.json')) {\n results.push(prefix ? `${prefix}/${entry.name}` : entry.name);\n } else if (entry.isDirectory()) {\n results.push(...scanJSONFiles(join(dir, entry.name), prefix ? `${prefix}/${entry.name}` : entry.name));\n }\n }\n return results;\n}\n\nfunction isCMSPage(pageData: JSONPage): boolean {\n return pageData.meta?.source === 'cms' && !!pageData.meta?.cms;\n}\n\n/**\n * Flatten a CMS item for the Webflow emit path: resolve i18n values to the\n * current locale and unwrap rich-text markers (`{ __richtext__, html }`) into\n * `RAW_HTML_PREFIX + html` so `nodeToWebflow`'s `resolveTemplate` can flatten\n * inline HTML to plain text. Mirrors what SSR's `processCMSTemplate`\n * (`cmsSSRProcessor.ts`) does inline at every interpolation site \u2014 but applied\n * once up front so the simpler Webflow `resolveTemplate` (which only does\n * `String(value)`) renders meaningful text instead of `[object Object]` /\n * empty strings.\n */\nfunction flattenCMSItemForLocale(\n item: CMSItem,\n locale: string,\n i18nConfig: I18nConfig\n): Record<string, unknown> {\n const flatten = (value: unknown): unknown => {\n if (value === null || value === undefined) return value;\n if (isI18nValue(value)) {\n return flatten(resolveI18nValue(value, locale, i18nConfig));\n }\n if (typeof value === 'object' && '__richtext__' in (value as object)) {\n const html = (value as { html?: unknown }).html;\n if (typeof html === 'string') return RAW_HTML_PREFIX + html;\n }\n return value;\n };\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(item)) {\n out[key] = flatten(value);\n }\n return out;\n}\n\n/**\n * Resolve a page-meta value (which may be an i18n object) to a string for the\n * given locale, or undefined when the field is empty.\n */\nfunction resolveMetaString(\n value: unknown,\n locale: string,\n i18nConfig: I18nConfig\n): string | undefined {\n if (value === undefined || value === null || value === '') return undefined;\n const resolved = isI18nValue(value)\n ? resolveI18nValue(value, locale, i18nConfig)\n : value;\n if (resolved === undefined || resolved === null || resolved === '') return undefined;\n return String(resolved);\n}\n\n/**\n * Lift the structured meta from a page (title, description, OG fields,\n * keywords) into the per-locale fields of a `WebflowPage`. SSR's `result.title`\n * is preserved as the canonical title; the rest comes from `extractPageMeta`.\n */\nfunction buildPageMetaForLocale(\n meta: PageMeta,\n locale: string,\n i18nConfig: I18nConfig\n): Pick<WebflowPage, 'description' | 'keywords' | 'ogTitle' | 'ogDescription' | 'ogImage'> {\n return {\n description: resolveMetaString(meta.description, locale, i18nConfig),\n keywords: resolveMetaString(meta.keywords, locale, i18nConfig),\n ogTitle: resolveMetaString(meta.ogTitle, locale, i18nConfig),\n ogDescription: resolveMetaString(meta.ogDescription, locale, i18nConfig),\n ogImage: resolveMetaString(meta.ogImage, locale, i18nConfig),\n };\n}\n\nfunction scanAssets(projectRoot: string): WebflowAssetRef[] {\n const assets: WebflowAssetRef[] = [];\n const assetDirs: Array<{ dir: string; type: WebflowAssetRef['type'] }> = [\n { dir: 'images', type: 'image' },\n { dir: 'fonts', type: 'font' },\n { dir: 'videos', type: 'video' },\n { dir: 'assets', type: 'file' },\n ];\n\n for (const { dir, type } of assetDirs) {\n const fullDir = join(projectRoot, dir);\n if (!existsSync(fullDir)) continue;\n const files = scanJSONFiles(fullDir).map(f => f.replace('.json', '')); // scanJSONFiles works for any extension\n // Re-scan properly for all file types\n const allFiles = scanAllFiles(fullDir);\n for (const file of allFiles) {\n assets.push({\n localPath: `${dir}/${file}`,\n type,\n fileName: file.split('/').pop()!,\n });\n }\n }\n\n return assets;\n}\n\nfunction scanAllFiles(dir: string, prefix: string = ''): string[] {\n const results: string[] = [];\n if (!existsSync(dir)) return results;\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isFile()) {\n results.push(relativePath);\n } else if (entry.isDirectory()) {\n results.push(...scanAllFiles(join(dir, entry.name), relativePath));\n }\n }\n return results;\n}\n\n/**\n * Build per-theme `--var` maps so the walker can resolve `var(--bg)` against\n * whatever theme an element actually inherits. Each theme key holds its full\n * resolved palette (text, bg, border, \u2026); `defaultThemeName` is what we fall\n * back to when an element has no `theme` ancestor.\n */\nfunction buildThemeVarMaps(\n themeConfig: ThemeConfig\n): { byTheme: Record<string, Record<string, string>>; defaultTheme: string } {\n const palette = themeConfig.palette;\n const byTheme: Record<string, Record<string, string>> = {};\n for (const [themeName, theme] of Object.entries(themeConfig.themes)) {\n const vars: Record<string, string> = {};\n for (const [name, value] of Object.entries(theme.colors)) {\n vars[`--${name}`] = resolvePaletteColor(value, palette);\n }\n byTheme[themeName] = vars;\n }\n return { byTheme, defaultTheme: themeConfig.default };\n}\n\n/**\n * Build a per-breakpoint `--var \u2192 value` map directly from the variables\n * config. Each breakpoint key (`base`, `tablet`, `mobile`, \u2026) holds the full\n * resolved variable map at that breakpoint, with per-variable `scales`\n * overrides and global category scaling already applied\n * (`resolveVariableValueAtBreakpoint` mirrors `generateVariablesCSS` and the\n * runtime CSS resolver).\n *\n * The walker uses these maps to inline `var(--x)` references in element\n * styles per-breakpoint, so the Webflow class system receives concrete\n * scaled values at every tier instead of a single flat base value.\n */\nfunction buildProjectVarMaps(\n variablesConfig: VariablesConfig,\n breakpoints: BreakpointConfig,\n responsiveScales: ResponsiveScales | undefined\n): Record<string, Record<string, string>> {\n const out: Record<string, Record<string, string>> = { base: {} };\n for (const bpName of Object.keys(breakpoints)) out[bpName] = {};\n\n for (const variable of variablesConfig.variables) {\n if (!variable.cssVar) continue;\n out.base[variable.cssVar] = variable.value;\n for (const bpName of Object.keys(breakpoints)) {\n const resolved = resolveVariableValueAtBreakpoint(\n { value: variable.value, type: variable.type, scales: variable.scales },\n bpName,\n responsiveScales\n );\n out[bpName][variable.cssVar] = resolved;\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\nexport async function buildWebflowPayload(\n options?: { bindCollectionLists?: boolean; promotedComponentNames?: string[]; locale?: string }\n): Promise<WebflowExportPayload> {\n const bindCollectionLists = options?.bindCollectionLists === true;\n const promotedComponentNames = Array.isArray(options?.promotedComponentNames)\n ? new Set(options!.promotedComponentNames.filter((n): n is string => typeof n === 'string' && n.length > 0))\n : undefined;\n // 1. Setup: load project configuration\n configService.reset();\n\n const projectConfig = await loadProjectConfig();\n const siteUrl = (projectConfig as { siteUrl?: string }).siteUrl?.replace(/\\/$/, '') || '';\n const i18nConfig = await loadI18nConfig();\n\n // Pick which locale to render. Multi-locale projects export one locale at a\n // time so the Webflow site mirrors a single language; the extension surfaces\n // a picker that defaults to `i18nConfig.defaultLocale`. An invalid/missing\n // request falls back to the default locale (silent \u2014 the picker is the\n // source of truth here, not the URL).\n const requestedLocale = options?.locale;\n const selectedLocale = (requestedLocale && i18nConfig.locales.some(l => l.code === requestedLocale))\n ? requestedLocale\n : i18nConfig.defaultLocale;\n const localesToBuild = i18nConfig.locales.filter(l => l.code === selectedLocale);\n\n await migrateTemplatesDirectory();\n\n const { components } = await loadComponentDirectory(projectPaths.components());\n const globalComponents: Record<string, ComponentDefinition> = {};\n components.forEach((value, key) => { globalComponents[key] = value; });\n\n const cmsProvider = new FileSystemCMSProvider(projectPaths.templates(), projectPaths.cms());\n const cmsService = new CMSService(cmsProvider);\n await cmsService.initialize();\n\n const themeConfig = await colorService.loadThemeConfig();\n const variablesConfig = await variableService.loadConfig();\n const breakpoints = await loadBreakpointConfig();\n\n await configService.load();\n const responsiveScales = configService.getResponsiveScales();\n\n // 2. Scan pages\n const pagesDir = projectPaths.pages();\n if (!existsSync(pagesDir)) {\n return emptyPayload();\n }\n\n const pageFiles = scanJSONFiles(pagesDir);\n if (pageFiles.length === 0) {\n return emptyPayload();\n }\n\n // Collect slug mappings\n const slugMappings: SlugMap[] = [];\n for (const file of pageFiles) {\n const pageName = file.replace('.json', '');\n const basePath = mapPageNameToPath(pageName);\n const pageContent = await loadJSONFile(join(pagesDir, file));\n if (!pageContent) continue;\n try {\n const pageData = parseJSON<JSONPage>(pageContent);\n if (pageData.meta?.slugs) {\n const pageId = basePath === '/' ? 'index' : basePath.substring(1);\n slugMappings.push({ pageId, slugs: pageData.meta.slugs });\n }\n } catch { /* ignore */ }\n }\n\n // 3. Render and convert pages\n const allPages: WebflowPage[] = [];\n const allStyleClasses = new Map<string, WebflowStyleClass>();\n // elementClass \u2192 interactiveStyles, populated during the node walk and\n // drained at the end into raw CSS (see step 6 below).\n const allInteractiveStylesMap = new Map<string, InteractiveStyles>();\n // Combo class name \u2192 owning identity, shared across every page emit so\n // collisions are visible project-wide. Drives `mintInstanceComboName` in\n // nodeToWebflow.ts.\n const allComboIdentityByName = new Map<string, string>();\n // First-encounter snapshot of each promoted component (Navigation, Footer)\n // shared across every page so the extension registers each definition once.\n const promotedComponents = new Map<string, WebflowComponentDef>();\n\n // Theme + project-level CSS variables are resolved during the walk so the\n // ancestor `theme` attribute can pick the right palette per element. The\n // project var map is per-breakpoint so `var(--x)` refs in element styles\n // can be inlined at each tier with the right scaled value.\n const variablesCSS = generateVariablesCSS(variablesConfig, breakpoints, responsiveScales);\n const projectVars = buildProjectVarMaps(variablesConfig, breakpoints, responsiveScales);\n const { byTheme: themeVars, defaultTheme } = buildThemeVarMaps(themeConfig);\n\n // Regular pages\n for (const file of pageFiles) {\n const pageName = file.replace('.json', '');\n const basePath = mapPageNameToPath(pageName);\n const pageContent = await loadJSONFile(join(pagesDir, file));\n if (!pageContent) continue;\n\n try {\n const pageData = parseJSON<JSONPage>(pageContent);\n if (pageData.meta?.draft === true) continue;\n\n const slugs = pageData.meta?.slugs;\n\n for (const localeConfig of localesToBuild) {\n const locale = localeConfig.code;\n const isDefault = locale === i18nConfig.defaultLocale;\n\n let slug: string;\n if (slugs && slugs[locale]) {\n slug = slugs[locale];\n } else if (basePath === '/') {\n slug = '';\n } else {\n slug = basePath.substring(1);\n }\n\n const urlPath = isDefault\n ? (slug === '' ? '/' : `/${slug}`)\n : (slug === '' ? `/${locale}` : `/${locale}/${slug}`);\n\n // Render via SSR to resolve all props\n const result = await renderPageSSR(\n pageData,\n globalComponents,\n urlPath,\n siteUrl,\n locale,\n i18nConfig,\n slugMappings,\n undefined,\n cmsService,\n true\n );\n\n // Convert node tree to Webflow elements\n const ctx: WebflowEmitContext = {\n globalComponents,\n elementPath: [0],\n fileType: 'page',\n fileName: pageName,\n breakpoints,\n styleClasses: allStyleClasses,\n comboIdentityByName: allComboIdentityByName,\n interactiveStylesMap: allInteractiveStylesMap,\n cmsService,\n i18nConfig,\n locale,\n slugMappings,\n pagePath: urlPath,\n themeVars,\n projectVars,\n defaultTheme,\n responsiveScales,\n promotedComponents,\n promotedComponentNames,\n bindCollectionLists,\n };\n\n const body = pageData.root || (pageData as any).node;\n const elements = body ? await nodeToWebflow(body, ctx) : [];\n normalizeListChildren(elements);\n\n const pageMeta = extractPageMeta(pageData);\n allPages.push({\n title: result.title,\n slug: slug || 'index',\n elements,\n locale,\n ...buildPageMetaForLocale(pageMeta, locale, i18nConfig),\n });\n }\n } catch (error: any) {\n console.error(`Error processing ${basePath}:`, error?.message);\n }\n }\n\n // CMS template pages \u2014 imported as a single regular Webflow page per locale,\n // bound to the FIRST CMS item's content. Webflow can't natively bind a page\n // to a Meno-side collection, and a separate \"Sync CMS\" flow in the extension\n // handles collection schema/items, so this code path stays page-only.\n const templatesDir = projectPaths.templates();\n\n if (existsSync(templatesDir)) {\n const templateFiles = readdirSync(templatesDir).filter(f => f.endsWith('.json'));\n\n for (const file of templateFiles) {\n const templateContent = await loadJSONFile(join(templatesDir, file));\n if (!templateContent) continue;\n\n try {\n const pageData = parseJSON<JSONPage>(templateContent);\n if (pageData.meta?.draft === true) continue;\n if (!isCMSPage(pageData)) continue;\n\n const cmsSchema = pageData.meta!.cms as CMSSchema;\n const items = await cmsService.queryItems({ collection: cmsSchema.id });\n if (items.length === 0) continue;\n\n const item = items[0];\n const pageName = file.replace('.json', '');\n\n for (const localeConfig of localesToBuild) {\n const locale = localeConfig.code;\n // Use the first item's resolved URL (from cmsSchema.urlPattern) as\n // the slug, so a template like `templates/blog.json` lands at\n // `/blog/<first-slug>` and doesn't collide with a sibling listing\n // page like `pages/blog.json`.\n let itemSlug = item[cmsSchema.slugField] ?? item._slug ?? item._id;\n if (isI18nValue(itemSlug)) {\n itemSlug = resolveI18nValue(itemSlug, locale, i18nConfig) as string;\n }\n const resolvedItemPath = cmsSchema.urlPattern.replace('{{slug}}', String(itemSlug));\n const isDefault = locale === i18nConfig.defaultLocale;\n const localizedItemPath = isDefault\n ? resolvedItemPath\n : `/${locale}${resolvedItemPath.startsWith('/') ? '' : '/'}${resolvedItemPath}`;\n const slug = localizedItemPath.startsWith('/')\n ? localizedItemPath.substring(1)\n : localizedItemPath;\n const urlPath = localizedItemPath;\n // SSR (`renderPageSSR`) gets the raw item \u2014 its `processCMSTemplate`\n // resolves i18n + richtext at each interpolation. The Webflow path\n // re-walks the same `pageData.root` with the simpler `resolveTemplate`\n // (no i18n / richtext awareness), so we hand it a pre-flattened item.\n const flatItem = flattenCMSItemForLocale(item, locale, i18nConfig);\n const itemWithUrl: CMSItem = { ...flatItem, _url: urlPath } as CMSItem;\n const ssrItem: CMSItem = { ...item, _url: urlPath };\n\n const result = await renderPageSSR(\n pageData,\n globalComponents,\n urlPath,\n siteUrl,\n locale,\n i18nConfig,\n slugMappings,\n { cms: ssrItem },\n cmsService,\n true\n );\n\n const ctx: WebflowEmitContext = {\n globalComponents,\n elementPath: [0],\n fileType: 'page',\n fileName: pageName,\n breakpoints,\n styleClasses: allStyleClasses,\n comboIdentityByName: allComboIdentityByName,\n interactiveStylesMap: allInteractiveStylesMap,\n cmsService,\n i18nConfig,\n locale,\n slugMappings,\n pagePath: urlPath,\n cmsContext: { cms: itemWithUrl },\n // Seed `templateContext` with the bound item so descendants inside\n // a component slot still see `cms`. `emitInlineComponentBody`\n // merges `ctx.templateContext` into the body's `instanceProps`\n // (nodeToWebflow.ts:1140-1143), and `<slot>` rendering forwards\n // those merged props to slot children \u2014 without this, anything\n // wrapped in (e.g.) Section loses the page-level CMS scope and\n // `{{cms.title}}` resolves to empty.\n templateContext: { cms: itemWithUrl } as Record<string, unknown>,\n themeVars,\n projectVars,\n defaultTheme,\n responsiveScales,\n promotedComponents,\n promotedComponentNames,\n bindCollectionLists,\n };\n\n const body = pageData.root || (pageData as any).node;\n const elements = body ? await nodeToWebflow(body, ctx, { cms: itemWithUrl }) : [];\n normalizeListChildren(elements);\n\n const cmsPageMeta = extractPageMeta(pageData);\n allPages.push({\n title: result.title,\n slug,\n elements,\n locale,\n ...buildPageMetaForLocale(cmsPageMeta, locale, i18nConfig),\n });\n }\n } catch (error: any) {\n console.error(`Error processing template ${file}:`, error?.message);\n }\n }\n }\n\n // Promoted components (Navigation, Footer) are emitted via the same\n // `nodeToWebflow` walk as pages, so they share the same `<ul>`-with-\n // non-`<li>`-children pitfall. Normalize their element trees too before\n // they leave the build.\n for (const def of promotedComponents.values()) {\n normalizeListChildren(def.elements);\n }\n\n // 4. Scan assets\n const styleClasses = Array.from(allStyleClasses.values());\n const assets = scanAssets(projectPaths.project);\n\n // 5. Collect component scripts and component-scoped CSS sidecars. Both get\n // bundled into the manual-paste UI: scripts as a `<script>` at body end,\n // CSS as part of the `<style>` block at head. CSS in particular is\n // critical for components that drive visibility through hand-written\n // rules (e.g. NavDropdown's `[data-nav-dropdown=\"container\"].open ...`)\n // \u2014 those don't translate to Webflow's class system at all.\n const scripts: WebflowScript[] = [];\n const cssBlocks: string[] = [];\n for (const [name, def] of Object.entries(globalComponents)) {\n const code = def.component?.javascript;\n if (typeof code === 'string' && code.trim().length > 0) {\n scripts.push({\n componentName: name,\n code,\n defineVars: def.component?.defineVars,\n });\n }\n const css = def.component?.css;\n if (typeof css === 'string' && css.trim().length > 0) {\n cssBlocks.push(`/* ${name}.css */\\n${css.trim()}`);\n }\n }\n const componentCss = cssBlocks.length > 0 ? cssBlocks.join('\\n\\n') : undefined;\n\n // 6. Per-element interactiveStyles \u2192 raw CSS for rules Webflow's class\n // system can't represent (anything with `prefix`, class-style postfix,\n // or breakpoint-divided pseudos). Pseudo-only rules with empty prefix\n // have already been written into `primaryClass.pseudoStates` upstream\n // via `Style.setProperties({ pseudo })`; we filter those out here so\n // the bundle doesn't double-emit them.\n const interactiveCssBlocks: string[] = [];\n for (const [elementClass, rules] of allInteractiveStylesMap) {\n const customRules = rules.filter((r) => !isWebflowHandledRule(r));\n if (customRules.length === 0) continue;\n const css = generateInteractiveCSS(elementClass, customRules, breakpoints, undefined, responsiveScales);\n if (css && css.trim().length > 0) {\n interactiveCssBlocks.push(css);\n }\n }\n const interactiveCss = interactiveCssBlocks.length > 0\n ? interactiveCssBlocks.join('\\n\\n')\n : undefined;\n\n return {\n version: 1,\n exportedAt: new Date().toISOString(),\n pages: allPages,\n styles: styleClasses,\n cms: [],\n assets,\n slugMappings: slugMappings.length > 0 ? slugMappings : undefined,\n scripts: scripts.length > 0 ? scripts : undefined,\n components: promotedComponents.size > 0\n ? Array.from(promotedComponents.values())\n : undefined,\n componentCss,\n interactiveCss,\n i18n: {\n defaultLocale: i18nConfig.defaultLocale,\n locales: i18nConfig.locales.map(l => ({\n code: l.code,\n name: l.name,\n nativeName: l.nativeName,\n })),\n selectedLocale,\n },\n };\n}\n\nfunction emptyPayload(): WebflowExportPayload {\n return {\n version: 1,\n exportedAt: new Date().toISOString(),\n pages: [],\n styles: [],\n cms: [],\n assets: [],\n };\n}\n\n", "/**\n * Node-to-Webflow Converter\n * Recursively converts Meno's ComponentNode tree into Webflow element tree.\n * Follows the same traversal pattern as nodeToAstro.ts.\n */\n\nimport type {\n ComponentNode,\n ComponentDefinition,\n StructuredComponentDefinition,\n HtmlNode,\n ComponentInstanceNode,\n SlotMarker,\n EmbedNode,\n LinkNode,\n LocaleListNode,\n CMSItem,\n CMSSchema,\n I18nConfig,\n CMSFilterCondition,\n} from '../../shared/types';\nimport type { ListNode } from '../../shared/registry/nodeTypes/ListNodeType';\nimport type {\n StyleObject,\n ResponsiveStyleObject,\n InteractiveStyles,\n InteractiveStyleRule,\n StyleValue,\n StyleMapping,\n} from '../../shared/types/styles';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport { generateElementClassName, shortHash } from '../../shared/elementClassName';\nimport { isVoidElement, hasIf, isBooleanMapping } from '../../shared/nodeUtils';\nimport { NODE_TYPE, RAW_HTML_PREFIX } from '../../shared/constants';\nimport { isI18nValue, resolveI18nValue, resolveI18nInProps } from '../../shared/i18n';\nimport { isItemDraftForLocale } from '../../shared/types';\nimport {\n buildTemplateContext,\n resolveItemsTemplate,\n getNestedValue,\n addItemUrl,\n type ValueResolver,\n} from '../../shared/itemTemplateUtils';\nimport { buildSlugIndex, getLocaleLinks, translatePath, type SlugMap } from '../../shared/slugTranslator';\nimport type { CMSService } from '../services/cmsService';\nimport type { WebflowElement, WebflowStyleClass, WebflowComponentDef } from './types';\nimport {\n COLLECTION_LIST_TAG,\n MENO_BIND_SENTINEL_PREFIX,\n MENO_BIND_SENTINEL_SUFFIX,\n MENO_BIND_SENTINEL_RE,\n MENO_BIND_SENTINEL_EXACT_RE,\n} from './types';\nimport { mapStylesToWebflow, buildInstanceStyleCombo } from './styleMapper';\nimport { processCodeTemplates, hasTemplates as hasCodeTemplates, resolveHtmlMapping, isHtmlMapping } from '../../client/templateEngine';\nimport { resolvePropsFromDefinition } from '../../shared/propResolver';\nimport { readFile } from 'fs/promises';\nimport { join, basename, extname } from 'path';\nimport { getProjectRoot } from '../projectContext';\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport interface WebflowEmitContext {\n /** All global components */\n globalComponents: Record<string, ComponentDefinition>;\n /** Current element path for class name generation */\n elementPath: number[];\n /** File type for element class context */\n fileType: 'component' | 'page';\n /** File name for element class context */\n fileName: string;\n /** Breakpoint config */\n breakpoints: BreakpointConfig;\n /** Collected style classes (side output) */\n styleClasses: Map<string, WebflowStyleClass>;\n /**\n * Combo class name \u2192 identity that owns it. Lets `mintInstanceComboName`\n * detect when two different element identities hash to the same 5-char\n * slice and re-hash with a salt until unique. Shared by reference across\n * every nested context in a single export so collisions are visible\n * across pages/components, not just within one subtree.\n */\n comboIdentityByName: Map<string, string>;\n /** Children passed from a component instance to fill slot markers */\n slotChildren?: (ComponentNode | string)[] | ComponentNode | string;\n /**\n * Caller's identity at the moment a component instance was emitted. When the\n * component body hits a `<slot/>`, slot children are restored to this\n * context so their generated class names hash against the page (or outer\n * component) that supplied them \u2014 not against the slot host. Without this,\n * every page routed through the same wrapper component (e.g. Layout) would\n * collide on identical (fileName, elementPath) pairs in `styleClasses`.\n */\n slotEmitContext?: {\n fileType: 'component' | 'page';\n fileName: string;\n elementPath: number[];\n };\n /**\n * Resolved props of the OUTER component instance whose body authored these\n * slot children. Templates inside slot children (`{{title}}` on a Heading\n * placed inside a `<Stack>` slot of a Hero section) refer to that outer\n * component's interface, not the slot host's. Captured in\n * `emitInlineComponentBody` as `parentProps`, consumed by `emitSlotMarker`\n * when filling the slot.\n */\n slotInstanceProps?: Record<string, unknown>;\n /** CMS service for resolving collection-sourced lists. */\n cmsService?: CMSService;\n /** i18n config so list items / locale-list can resolve translations. */\n i18nConfig?: I18nConfig;\n /** Locale this page is being exported under. */\n locale?: string;\n /** Slug mappings for cross-locale URL generation in locale-lists. */\n slugMappings?: SlugMap[];\n /**\n * Lazily-built reverse slug index, shared by `emitLinkNode` (rewriting\n * internal `/path` hrefs to the current locale's Webflow URL) and\n * `emitLocaleListNode` so we don't rebuild the same Map per link.\n */\n slugIndex?: ReturnType<typeof buildSlugIndex>;\n /** URL path of the page being exported (used by locale-list). */\n pagePath?: string;\n /** Currently-rendered CMS item for CMS template pages. */\n cmsContext?: { cms: CMSItem };\n /** Cumulative template context for nested lists. */\n templateContext?: Record<string, unknown>;\n /** Per-theme map: themeName \u2192 { '--bg': '#fff', \u2026 } from colors.json. */\n themeVars?: Record<string, Record<string, string>>;\n /**\n * Project-wide vars from variables.json (not theme-dependent), keyed by\n * Meno breakpoint name (`base`, `tablet`, `mobile`, \u2026). Each map holds the\n * full `--name \u2192 resolved value` set at that breakpoint, with per-variable\n * `scales` overrides and global category scaling already baked in. The\n * walker substitutes `var(--x)` per-breakpoint so the Webflow class system\n * receives concrete scaled values at every tier.\n */\n projectVars?: Record<string, Record<string, string>>;\n /** Default theme name from colors.json (used when no ancestor theme). */\n defaultTheme?: string;\n /**\n * Responsive auto-scaling config. When `enabled`, raw scalable values\n * (`font-size: 48px`, `padding: 40px`, \u2026) are auto-filled per breakpoint\n * by `mapStylesToWebflow` even when the author didn't write a per-bp\n * override.\n */\n responsiveScales?: ResponsiveScales;\n /**\n * The theme inherited from an ancestor's `theme` attribute. Set by\n * `emitHtmlNode` when a node carries `theme=\"\u2026\"`, then forwarded to its\n * descendants so `var(--bg)` resolves to the right palette per element.\n */\n currentTheme?: string;\n /**\n * elementClass \u2192 its `interactiveStyles`, collected during the walk so\n * `buildWebflowPayload` can render them into raw CSS afterwards via\n * `generateInteractiveCSS`. Pseudo-only rules with empty prefix and\n * non-responsive style continue to flow through `primaryClass.pseudoStates`\n * (Webflow's class-system path); everything else is filtered to the\n * manual-paste `<style>` block.\n */\n interactiveStylesMap?: Map<string, InteractiveStyles>;\n /**\n * Meno components promoted to Webflow Components (`Navigation`, `Footer`).\n * The first encounter of each name registers a definition here; subsequent\n * encounters emit a `componentRef` element instead of inlining markup.\n * `undefined` inside a component body disables further promotion (so a\n * Navigation that nests another promoted name doesn't recurse).\n */\n promotedComponents?: Map<string, WebflowComponentDef> | null;\n /**\n * Component names eligible for promotion. When omitted, the built-in\n * `PROMOTED_TO_WEBFLOW_COMPONENT` defaults (`Navigation`, `Footer`) apply.\n * Configurable from the Webflow extension UI so users can promote their own\n * shared components (e.g. `Sidebar`) without forking core.\n */\n promotedComponentNames?: Set<string>;\n /**\n * Opt-in: emit `<list sourceType=\"collection\">` as a single bound\n * Collection List shell (`tag: COLLECTION_LIST_TAG`) carrying field-binding\n * markers, instead of the default static N-times expansion. The extension\n * inserts a Webflow `DynamoWrapper` and tags children with\n * `data-meno-bind-*` attributes so the user can finish binding in the\n * Designer UI (no programmatic binding API exists yet \u2014 Apr 2026).\n */\n bindCollectionLists?: boolean;\n /**\n * Default values from the enclosing component's `interface` (`{ size: '1',\n * variant: 'default', \u2026 }`). Used by `mapStylesToWebflow` to bake\n * default-prop StyleMapping values into the primary class's base, so the\n * primary represents the default-prop visual and combos carry only the\n * deltas for non-default values. Set in `emitInlineComponentBody` when\n * entering a component body; absent for page-level walks.\n */\n componentDefaults?: Record<string, unknown>;\n /**\n * Most recent ancestor's resolved CSS `color` value, threaded down so that\n * `<embed>` SVG markup can substitute `currentColor` with a concrete color\n * before being uploaded as an `image/svg+xml` asset. SVG assets render\n * standalone in Webflow \u2014 `currentColor` no longer inherits from the\n * surrounding DOM, so it would otherwise paint as black.\n */\n inheritedColor?: string;\n}\n\n/**\n * Meno component names that should become Webflow Components instead of\n * inline markup. Exact, case-sensitive match \u2014 e.g. `NavLink` and\n * `NavDropdown` continue to inline today.\n */\nexport const PROMOTED_TO_WEBFLOW_COMPONENT = new Set(['Navigation', 'Footer']);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildElementClass(ctx: WebflowEmitContext, label: string | undefined): string {\n const generated = generateElementClassName({\n fileType: ctx.fileType,\n fileName: ctx.fileName,\n label,\n path: ctx.elementPath,\n });\n // Drop the `c_` component prefix for the Webflow output \u2014 the file name is\n // already in the class. Pages keep `p_` so page-scoped classes can't collide\n // with component class names that happen to share the same file name.\n if (ctx.fileType !== 'component') return generated;\n const stripped = generated.replace(/^c_/, '');\n // Collapse `heading_heading` \u2192 `heading` when component and element names\n // match \u2014 the duplication carries no extra info.\n return stripped.replace(/^([a-z0-9-]+)_\\1$/, '$1');\n}\n\n/**\n * Suffix used to keep two placements of the same element under different\n * ancestor `theme=\"\u2026\"` values from collapsing onto one entry in\n * `ctx.styleClasses`. Theme `var(--\u2026)` refs are baked to concrete colors at\n * export time, so a `button` rendered under `theme=\"light\"` and one under\n * `theme=\"dark\"` produce different resolved CSS \u2014 but absent this suffix they\n * share the class name `button`, and the last write wins (silently\n * mis-rendering the earlier instance). Returns `''` for the project's default\n * theme (or no theme), so default-theme exports stay byte-identical.\n *\n * Callers append this AFTER any other suffixes they compose (sub-classes like\n * `\u2026-item`, identity hashes, etc.) so the theme suffix consistently lives at\n * the tail of the name. Sanitization mirrors `sanitizeClassName` in styleMapper\n * so unusual theme names from `colors.json` produce valid CSS segments.\n */\nfunction themedClassSuffix(ctx: WebflowEmitContext): string {\n const t = ctx.currentTheme;\n if (!t) return '';\n if (ctx.defaultTheme && t === ctx.defaultTheme) return '';\n const safe = t.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n if (!safe) return '';\n return `-theme-${safe}`;\n}\n\n/** Append `themedClassSuffix(ctx)` to a class name, or return it unchanged. */\nfunction withThemeSuffix(name: string, ctx: WebflowEmitContext): string {\n return name + themedClassSuffix(ctx);\n}\n\n/**\n * Mint a per-instance combo class name of the form `is-<5char>`. The hash is\n * derived from the placement's full element identity (page + path or label),\n * so two placements at different positions get different combos and the same\n * placement re-derives the same combo across re-imports.\n *\n * Webflow stores classes in a single project-wide stylesheet, so the 5-char\n * base36 space (~60M) is birthday-vulnerable across large exports. When the\n * computed name is already claimed by a *different* identity, we re-hash with\n * an attempt suffix until the slot is free or matches our identity.\n */\nfunction mintInstanceComboName(ctx: WebflowEmitContext, identity: string): string {\n let attempt = 0;\n let name = `is-${shortHash(identity)}`;\n while (true) {\n const claimedBy = ctx.comboIdentityByName.get(name);\n if (!claimedBy || claimedBy === identity) {\n ctx.comboIdentityByName.set(name, identity);\n return name;\n }\n attempt++;\n name = `is-${shortHash(`${identity}#${attempt}`)}`;\n }\n}\n\n/**\n * Pull `{ propName: defaultValue }` from a component's `interface` definition.\n * Returns undefined when the interface is absent or contributes no defaults,\n * so callers can leave `componentDefaults` off the context (page-level walks\n * skip default-baking entirely).\n */\nfunction extractInterfaceDefaults(\n iface: Record<string, { default?: unknown }> | undefined\n): Record<string, unknown> | undefined {\n if (!iface) return undefined;\n const out: Record<string, unknown> = {};\n let any = false;\n for (const [key, def] of Object.entries(iface)) {\n if (def && 'default' in def) {\n out[key] = def.default;\n any = true;\n }\n }\n return any ? out : undefined;\n}\n\n/**\n * Layered template-resolution context. Mirrors the namespaces meno-core's\n * `templateEngine.buildEvalContext` walks: instance props win over slot props,\n * which win over component defaults, with CMS / list iteration data underneath.\n * Page-level walks (no enclosing component) still get a usable context \u2014 we\n * just won't have `instanceProps` to layer on top.\n */\nfunction buildTemplateProps(\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Record<string, unknown> {\n return {\n ...(ctx.templateContext ?? {}),\n ...(ctx.cmsContext ?? {}),\n ...(ctx.componentDefaults ?? {}),\n ...(ctx.slotInstanceProps ?? {}),\n ...(instanceProps ?? {}),\n };\n}\n\n/**\n * Resolve `{{...}}` templates in a string using the same engine as meno-core's\n * runtime. Returns `text` unchanged when it carries no templates so we don't\n * thrash `flattenInlineHtmlToText` over rich-text strings without placeholders.\n * `RAW_HTML_PREFIX`-marked rich-text values get flattened to visible text after\n * substitution so the sentinel + inline HTML can't leak into a tag/attribute.\n */\nfunction resolveStringTemplate(\n text: string,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): string {\n if (!hasCodeTemplates(text)) return text;\n const out = processCodeTemplates(text, buildTemplateProps(ctx, instanceProps));\n return out.startsWith(RAW_HTML_PREFIX)\n ? flattenInlineHtmlToText(out.slice(RAW_HTML_PREFIX.length))\n : out;\n}\n\nconst HEADING_TAGS = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);\n// Tags whose Webflow preset is a clickable wrapper (`LinkBlock`) \u2014 they\n// inherit the browser-default `<a>` underline unless we override it.\nconst LINK_LIKE_TAGS = new Set(['button']);\n// Tags whose Webflow preset ships with a default `margin-bottom: 10px`.\nconst LIST_TAGS = new Set(['ul', 'ol']);\n\n/**\n * Zero out a heading's vertical margins when the source styles don't set them.\n * Webflow (and browser UA stylesheets) ship h1\u2013h6 with non-trivial\n * margin-top/bottom; designs in Meno almost never account for that. Shorthand\n * `margin` is expanded into the four sides upstream (see `styleMapper.ts`),\n * so by the time we get here every author-set margin is already a longhand.\n */\nfunction applyHeadingMarginDefaults(cls: WebflowStyleClass): void {\n const base = cls.base;\n if (!('margin-top' in base)) base['margin-top'] = '0px';\n if (!('margin-bottom' in base)) base['margin-bottom'] = '0px';\n}\n\n/**\n * Zero out a paragraph's bottom margin when the source styles don't set it.\n * Webflow's `<p>` preset ships with a default `margin-bottom`; designs in Meno\n * almost never account for that. Only `margin-bottom` is touched \u2014 paragraphs\n * commonly want their natural top spacing.\n */\nfunction applyParagraphMarginDefaults(cls: WebflowStyleClass): void {\n const base = cls.base;\n if (!('margin-bottom' in base)) base['margin-bottom'] = '0px';\n}\n\n/**\n * Zero out a list's bottom margin when the source styles don't set it.\n * Webflow's `<ul>`/`<ol>` preset ships with `margin-bottom: 10px`; designs in\n * Meno almost never account for that.\n */\nfunction applyListMarginDefaults(cls: WebflowStyleClass): void {\n const base = cls.base;\n if (!('margin-bottom' in base)) base['margin-bottom'] = '0px';\n}\n\n/**\n * For `display: grid` (or `inline-grid`) elements, default\n * `grid-template-rows` to `1fr` (a single row) when the source styles don't\n * specify rows. Webflow's grid preset ships with two rows; designs in Meno\n * almost never want that. The `grid` / `grid-template` shorthands opt out.\n */\nfunction applyGridRowsDefault(cls: WebflowStyleClass): void {\n const base = cls.base;\n const display = base['display'];\n if (display !== 'grid' && display !== 'inline-grid') return;\n if ('grid' in base) return;\n if ('grid-template' in base) return;\n if ('grid-template-rows' in base) return;\n base['grid-template-rows'] = '1fr';\n}\n\n/**\n * Default `<a>` to `text-decoration: none`. Browser UA stylesheets underline\n * links; source designs almost never opt out explicitly. If the author set\n * `text-decoration` (or `text-decoration-line`) themselves, leave it.\n */\nfunction applyLinkTextDecorationDefault(cls: WebflowStyleClass): void {\n const base = cls.base;\n if ('text-decoration' in base || 'text-decoration-line' in base) return;\n base['text-decoration'] = 'none';\n}\n\n/**\n * Fold two combo classes into one. Webflow's class system permits at most a\n * single combo on top of the primary, so when an `acceptsStyles` instance\n * override would stack a second combo on a body root that already carries a\n * StyleMapping-driven combo, we merge into a fresh class instead. `outer`'s\n * properties win on key conflicts at every scope (base, breakpoints,\n * pseudo-states), mirroring runtime SSR's outer-overrides-inner order.\n *\n * The merged name concatenates both combo names so it stays deterministic\n * across re-imports and is unique to this exact body root (the outer combo\n * name is keyed by the instance's outer location).\n */\nfunction mergeComboClasses(\n inner: WebflowStyleClass,\n outer: WebflowStyleClass,\n parentName: string,\n): WebflowStyleClass {\n const innerSuffix = inner.name.startsWith('is-') ? inner.name.slice(3) : inner.name;\n const merged: WebflowStyleClass = {\n name: `${outer.name}_${innerSuffix}`,\n base: { ...inner.base, ...outer.base },\n comboParent: parentName,\n };\n\n if (inner.breakpoints || outer.breakpoints) {\n const bps: NonNullable<WebflowStyleClass['breakpoints']> = {};\n const tiers = new Set<keyof typeof bps>([\n ...(Object.keys(inner.breakpoints || {}) as Array<keyof typeof bps>),\n ...(Object.keys(outer.breakpoints || {}) as Array<keyof typeof bps>),\n ]);\n for (const tier of tiers) {\n bps[tier] = { ...(inner.breakpoints?.[tier] || {}), ...(outer.breakpoints?.[tier] || {}) };\n }\n merged.breakpoints = bps;\n }\n\n if (inner.pseudoStates || outer.pseudoStates) {\n const ps: NonNullable<WebflowStyleClass['pseudoStates']> = {};\n const states = new Set<keyof typeof ps>([\n ...(Object.keys(inner.pseudoStates || {}) as Array<keyof typeof ps>),\n ...(Object.keys(outer.pseudoStates || {}) as Array<keyof typeof ps>),\n ]);\n for (const state of states) {\n ps[state] = { ...(inner.pseudoStates?.[state] || {}), ...(outer.pseudoStates?.[state] || {}) };\n }\n merged.pseudoStates = ps;\n }\n\n return merged;\n}\n\nconst IMAGE_EXT_MIME: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.svg': 'image/svg+xml',\n '.bmp': 'image/bmp',\n '.ico': 'image/x-icon',\n};\n\nfunction isAbsoluteUrl(s: string): boolean {\n return /^[a-z][a-z0-9+.-]*:\\/\\//i.test(s) || s.startsWith('data:');\n}\n\n/**\n * If `src` points at a file inside the project (project-relative path like\n * `/images/foo.webp`), read it from disk and stash the bytes onto `element`\n * for the Webflow extension to upload. Absolute http(s)/data URLs are left\n * alone \u2014 the extension fetches those itself.\n */\nasync function maybeInlineLocalImage(element: WebflowElement, src: string): Promise<void> {\n if (!src || isAbsoluteUrl(src)) return;\n const projectRoot = getProjectRoot();\n // Strip leading slash so `join` doesn't escape the project root, and\n // verify the resolved path stays inside it (path-traversal guard).\n const rel = src.replace(/^\\/+/, '');\n const abs = join(projectRoot, rel);\n if (!abs.startsWith(projectRoot)) return;\n try {\n const buf = await readFile(abs);\n const ext = extname(abs).toLowerCase();\n const mime = IMAGE_EXT_MIME[ext] || 'application/octet-stream';\n element.imageDataBase64 = buf.toString('base64');\n element.imageDataMime = mime;\n element.imageDataFileName = basename(abs);\n } catch {\n // File missing / unreadable \u2014 leave `attributes.src` alone. The extension\n // will then drop the image with a warning, same observable behavior as\n // before this change.\n }\n}\n\n/**\n * Strip a small subset of inline HTML \u2014 `<span>`, `<em>`, `<strong>`, `<br>`,\n * etc. \u2014 and return the concatenated visible text. Used for heading /\n * paragraph content that ships with the `<!--MENO_RAW_HTML-->` sentinel.\n *\n * We previously emitted structured children to preserve inline emphasis\n * (`<span class=\"custom-span\">need</span>`), but Webflow's Designer API for\n * Heading / Paragraph elements does not reliably accept mixed string +\n * element children, and `parent.append(string)` interprets the string as a\n * tag name (so \"need\" became `<need></need>`). For now we drop inline\n * styling and keep visible text \u2014 the user explicitly accepts this\n * trade-off and we'll revisit once we have a working inline-rich-text path.\n *\n * `<br>` collapses to `\\n`; HTML entities (`&amp;`/`&lt;`/`&gt;`/`&quot;`)\n * are decoded; comments are stripped.\n */\nfunction flattenInlineHtmlToText(raw: string): string {\n const decode = (s: string) => s\n .replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"').replace(/&#39;/g, \"'\").replace(/&nbsp;/g, ' ');\n\n let out = '';\n const tagRe = /<!--[\\s\\S]*?-->|<\\/?([a-zA-Z][a-zA-Z0-9]*)[^>]*>/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = tagRe.exec(raw)) !== null) {\n if (match.index > lastIndex) {\n out += decode(raw.slice(lastIndex, match.index));\n }\n lastIndex = match.index + match[0].length;\n if (match[0].startsWith('<!--')) continue;\n if ((match[1] || '').toLowerCase() === 'br') out += '\\n';\n }\n if (lastIndex < raw.length) out += decode(raw.slice(lastIndex));\n return out;\n}\n\n/**\n * Substitute `var(--name[, fallback])` in a CSS value with literals from the\n * walker context, resolving project vars at the requested breakpoint. Theme\n * vars are resolved per the active theme (the nearest ancestor's `theme`\n * attribute, or the project default) and don't vary by breakpoint. Anything\n * we can't resolve is left intact.\n *\n * Webflow style classes don't share Meno's `:root` declarations and we don't\n * inject a `<style>` block, so each element has to receive concrete values\n * in its style class \u2014 and with theme awareness, identical `var(--bg)`\n * references in different theme contexts produce different colours. The\n * breakpoint parameter lets us materialize the same `var(--h1-fs)` reference\n * to its scaled value at every Meno breakpoint.\n */\nfunction resolveVarsInValue(\n value: string,\n ctx: WebflowEmitContext,\n breakpoint: string = 'base'\n): string {\n if (!value || (!ctx.themeVars && !ctx.projectVars)) return value;\n // If `currentTheme` names a theme that doesn't exist in this project's\n // colors.json, fall back to the project default \u2014 that mirrors runtime\n // behaviour, where `[theme=\"primary\"]` without a matching selector inherits\n // `:root`'s default-theme vars. Without the fallback, `var(--text)` etc.\n // would survive the substitution pass and ship as literal `var(--\u2026)` to\n // Webflow.\n const themeMap = ctx.themeVars\n ? (\n (ctx.currentTheme && ctx.themeVars[ctx.currentTheme])\n ?? (ctx.defaultTheme ? ctx.themeVars[ctx.defaultTheme] : undefined)\n )\n : undefined;\n const projectMap = ctx.projectVars\n ? (ctx.projectVars[breakpoint] || ctx.projectVars.base)\n : undefined;\n const pattern = /var\\(\\s*(--[\\w-]+)\\s*(?:,\\s*([^)]+))?\\)/g;\n\n let current = value;\n for (let pass = 0; pass < 3; pass++) {\n let changed = false;\n current = current.replace(pattern, (match, name: string, fallback: string | undefined) => {\n const resolved = (themeMap && themeMap[name]) ?? (projectMap && projectMap[name]);\n if (resolved !== undefined) {\n changed = true;\n return resolved;\n }\n if (fallback !== undefined) {\n changed = true;\n return fallback.trim();\n }\n return match;\n });\n if (!changed) break;\n }\n return current;\n}\n\nfunction substituteVarsInStyleObject(\n style: StyleObject,\n ctx: WebflowEmitContext,\n breakpoint: string = 'base'\n): StyleObject {\n const out: StyleObject = {};\n for (const [k, v] of Object.entries(style)) {\n out[k] = typeof v === 'string' ? resolveVarsInValue(v, ctx, breakpoint) : v;\n }\n return out;\n}\n\n/**\n * Names of project breakpoints whose `var(--x)` resolutions might differ\n * from base \u2014 i.e., every breakpoint in the project config. Returns an empty\n * list when no projectVars map is present (e.g., test contexts).\n */\nfunction projectBreakpointNames(ctx: WebflowEmitContext): string[] {\n return Object.keys(ctx.breakpoints);\n}\n\n/**\n * For each base property containing a `var(--x)` reference, expand to a\n * per-breakpoint entry on the responsive style if its resolved value differs\n * from base. Author-provided per-breakpoint overrides win. Mirrors what\n * Meno's runtime does via `:root { --x }` + `@media { :root { --x } }`,\n * except materialized into class-level breakpoint entries since Webflow's\n * class system reads concrete values per tier.\n */\nfunction expandResponsiveVarsInto(\n baseStyle: StyleObject,\n responsive: ResponsiveStyleObject,\n ctx: WebflowEmitContext\n): void {\n if (!ctx.projectVars) return;\n const bps = projectBreakpointNames(ctx);\n if (bps.length === 0) return;\n\n for (const [prop, rawVal] of Object.entries(baseStyle)) {\n if (typeof rawVal !== 'string' || !rawVal.includes('var(--')) continue;\n const baseResolved = resolveVarsInValue(rawVal, ctx, 'base');\n\n for (const bp of bps) {\n const bpResolved = resolveVarsInValue(rawVal, ctx, bp);\n if (bpResolved === baseResolved) continue;\n const bucket = (responsive[bp] as StyleObject | undefined) || {};\n // Author override wins.\n if (bucket[prop] !== undefined) continue;\n bucket[prop] = bpResolved;\n responsive[bp] = bucket;\n }\n }\n}\n\n/**\n * Apply theme/project `var(--x)` substitution across a flat or responsive\n * style object. Skipped for StyleMappings \u2014 those are passed through and\n * resolved later when the styleMapper turns them into combo classes (each\n * combo's value gets its own substitution then).\n *\n * For each authored breakpoint, vars are resolved using that breakpoint's\n * project var map. Then the base properties are scanned for `var(--x)` refs\n * whose resolved value differs at any project breakpoint \u2014 those get\n * synthesized into the responsive style so `mapStylesToWebflow` can route\n * them into Webflow's per-breakpoint buckets.\n */\nfunction substituteVarsInStyle(\n style: StyleObject | ResponsiveStyleObject | undefined,\n ctx: WebflowEmitContext\n): StyleObject | ResponsiveStyleObject | undefined {\n if (!style) return style;\n if (isResponsiveStyleObject(style)) {\n const out: ResponsiveStyleObject = {};\n for (const [bp, obj] of Object.entries(style)) {\n if (!obj || typeof obj !== 'object') continue;\n out[bp] = substituteVarsInStyleObject(obj as StyleObject, ctx, bp);\n }\n const baseObj = (style as ResponsiveStyleObject).base;\n if (baseObj) expandResponsiveVarsInto(baseObj as StyleObject, out, ctx);\n return out;\n }\n // Flat style: substitute base, then expand per-breakpoint values into a\n // responsive wrapper so var-driven scaling reaches the breakpoint buckets.\n const flatStyle = style as StyleObject;\n const baseSubstituted = substituteVarsInStyleObject(flatStyle, ctx, 'base');\n const responsive: ResponsiveStyleObject = { base: baseSubstituted };\n expandResponsiveVarsInto(flatStyle, responsive, ctx);\n // If no per-breakpoint expansion happened, return the flat shape to keep\n // downstream behavior identical for projects without project vars.\n if (Object.keys(responsive).length === 1) return baseSubstituted;\n return responsive;\n}\n\nfunction substituteVarsInInteractive(\n rules: InteractiveStyles | undefined,\n ctx: WebflowEmitContext\n): InteractiveStyles | undefined {\n if (!rules) return rules;\n return rules.map((rule): InteractiveStyleRule => ({\n ...rule,\n style: (substituteVarsInStyle(rule.style as StyleObject | ResponsiveStyleObject, ctx) ?? rule.style) as StyleValue,\n }));\n}\n\n/**\n * In-place pass over a finished WebflowStyleClass to inline `var(--x)` refs\n * that survived an upstream substitution. Combo classes built from\n * StyleMappings carry their values as plain strings \u2014 we couldn't substitute\n * before `mapStylesToWebflow` ran (the mapping shape is opaque to our\n * resolver), so we sweep them here. Also expands any base property that\n * still contains a `var(--x)` ref into per-breakpoint entries so combo\n * classes inherit the same variable-driven responsive scaling as the\n * primary class.\n */\nfunction substituteVarsInStyleClass(cls: WebflowStyleClass, ctx: WebflowEmitContext): void {\n // Capture which base props still hold a var() ref BEFORE substitution so\n // we can expand them per-breakpoint after.\n const varBaseProps: Array<{ prop: string; raw: string }> = [];\n for (const [k, v] of Object.entries(cls.base)) {\n if (typeof v === 'string' && v.includes('var(--')) {\n varBaseProps.push({ prop: k, raw: v });\n }\n }\n\n for (const k of Object.keys(cls.base)) {\n cls.base[k] = resolveVarsInValue(cls.base[k], ctx, 'base');\n }\n if (cls.breakpoints) {\n for (const [tier, bp] of Object.entries(cls.breakpoints)) {\n if (!bp) continue;\n for (const k of Object.keys(bp)) {\n bp[k] = resolveVarsInValue(bp[k], ctx, tier);\n }\n }\n }\n if (cls.pseudoStates) {\n for (const ps of Object.values(cls.pseudoStates)) {\n if (!ps) continue;\n for (const k of Object.keys(ps)) ps[k] = resolveVarsInValue(ps[k], ctx, 'base');\n }\n }\n\n // Per-breakpoint expansion for combo classes whose base values were vars.\n if (varBaseProps.length === 0 || !ctx.projectVars) return;\n for (const bpName of Object.keys(ctx.breakpoints)) {\n const tier = menoBreakpointToWebflowTier(bpName, ctx.breakpoints);\n for (const { prop, raw } of varBaseProps) {\n const baseResolved = cls.base[prop];\n const bpResolved = resolveVarsInValue(raw, ctx, bpName);\n if (bpResolved === baseResolved) continue;\n if (!cls.breakpoints) cls.breakpoints = {};\n const bucket = cls.breakpoints[tier as keyof typeof cls.breakpoints] || {};\n if (bucket[prop] !== undefined) continue;\n bucket[prop] = bpResolved;\n (cls.breakpoints as Record<string, Record<string, string>>)[tier] = bucket;\n }\n }\n}\n\n/**\n * Local copy of the Meno\u2192Webflow breakpoint mapping used by styleMapper.\n * Kept private so we don't widen styleMapper's public surface just for the\n * combo-class expansion above.\n */\nfunction menoBreakpointToWebflowTier(\n bpName: string,\n breakpoints: BreakpointConfig\n): string {\n if (bpName === 'tablet') return 'medium';\n if (bpName === 'mobile') return 'small';\n const entry = breakpoints[bpName];\n const w = entry && typeof entry.breakpoint === 'number' ? entry.breakpoint : 992;\n if (w < 480) return 'tiny';\n if (w < 768) return 'small';\n if (w < 992) return 'medium';\n if (w < 1280) return 'main';\n if (w < 1440) return 'large';\n if (w < 1920) return 'xl';\n return 'xxl';\n}\n\n/**\n * A responsive style object nests StyleObjects under breakpoint keys (base/tablet/mobile/...).\n * A flat style object has CSS property values directly (strings, numbers, or StyleMappings).\n */\nfunction isResponsiveStyleObject(style: StyleObject | ResponsiveStyleObject): style is ResponsiveStyleObject {\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n/**\n * Pull the base-breakpoint `color` value from a flat or responsive style.\n * Returns undefined if absent. Values like `currentColor` / `inherit` are\n * returned as-is so callers can decide to skip them.\n *\n * StyleMapping colors (e.g. `Button.variant \u2192 primary|secondary`) are\n * resolved using the active instance prop, falling back to the enclosing\n * component's default. Without this, variant-mapped buttons fail to thread\n * a color into nested SVG `<embed>` children \u2014 those ship with\n * `currentColor` intact and Webflow paints the standalone SVG asset black.\n * Resolved mapping values may still hold `var(--\u2026)`; we run them through\n * `resolveVarsInValue` so the SVG asset bakes a concrete color.\n */\nfunction extractBaseColor(\n style: StyleObject | ResponsiveStyleObject | undefined,\n ctx?: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): string | undefined {\n if (!style) return undefined;\n const flat: StyleObject | undefined = isResponsiveStyleObject(style)\n ? ((style as ResponsiveStyleObject).base as StyleObject | undefined)\n : (style as StyleObject);\n const c = flat?.color;\n if (typeof c === 'string') return c;\n if (c && typeof c === 'object' && (c as StyleMapping)._mapping === true) {\n const mapping = c as StyleMapping;\n const propValue = instanceProps?.[mapping.prop] ?? ctx?.componentDefaults?.[mapping.prop];\n if (propValue == null) return undefined;\n const key = String(propValue);\n const raw = mapping.values[key];\n if (typeof raw !== 'string' || raw === '') return undefined;\n return ctx ? resolveVarsInValue(raw, ctx) : raw;\n }\n return undefined;\n}\n\n/**\n * Returns a concrete color (something we can substitute into SVG markup) or\n * undefined for keywords that don't carry one (`currentColor`, `inherit`,\n * unset). Caller should fall back to ancestor color when undefined.\n */\nfunction concreteColor(c: string | undefined): string | undefined {\n if (!c) return undefined;\n const lower = c.trim().toLowerCase();\n if (lower === 'currentcolor' || lower === 'inherit' || lower === 'unset' || lower === 'initial') {\n return undefined;\n }\n return c;\n}\n\n/**\n * Replace `currentColor` references in inline SVG markup with the given color.\n * Webflow uploads `<embed>` SVGs as standalone `image/svg+xml` assets, so the\n * normal `currentColor` \u2192 ancestor `color` inheritance is broken \u2014 we resolve\n * it here at export time. Match is case-insensitive.\n */\nfunction inlineCurrentColorInSvg(svg: string, color: string): string {\n return svg.replace(/currentColor/gi, color);\n}\n\n/**\n * Resolve `{{prop}}` templates in a flat style object's values using component instance\n * props. StyleMapping objects (`{_mapping: true, ...}`) are preserved so that\n * styleMapper can still emit them as Webflow combo classes. Values without\n * templates pass through unchanged.\n */\nfunction resolveTemplatesInStyleObject(\n style: StyleObject,\n props: Record<string, unknown>\n): StyleObject {\n const result: StyleObject = {};\n for (const [key, value] of Object.entries(style)) {\n if (typeof value === 'string' && hasCodeTemplates(value)) {\n result[key] = processCodeTemplates(value, props);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Resolve templates inside a flat or responsive style object. Uses meno-core's\n * template engine so Webflow receives concrete values (e.g. `1280px`) instead of\n * `{{maxWidth}}` placeholders.\n */\nfunction resolveStyleTemplates(\n style: StyleObject | ResponsiveStyleObject | undefined,\n props: Record<string, unknown> | undefined\n): StyleObject | ResponsiveStyleObject | undefined {\n if (!style || !props) return style;\n if (isResponsiveStyleObject(style)) {\n const result: ResponsiveStyleObject = {};\n for (const [bp, styleObj] of Object.entries(style)) {\n if (styleObj && typeof styleObj === 'object') {\n result[bp] = resolveTemplatesInStyleObject(styleObj as StyleObject, props);\n }\n }\n return result;\n }\n return resolveTemplatesInStyleObject(style as StyleObject, props);\n}\n\n/**\n * Match a style value that is a single bare `{{prop}}` template \u2014 optionally\n * wrapped by literal text (`\"calc({{maxWidth}} + 1rem)\"`). The captured prop\n * name must be a plain identifier (no dotted paths like `{{user.name}}`, no\n * expressions). Returns the prop name, or null when the value isn't a\n * single-prop template we can convert.\n */\nconst SINGLE_TEMPLATE_RE = /^([^{]*)\\{\\{\\s*([A-Za-z_$][\\w$]*)\\s*\\}\\}([^{]*)$/;\nfunction extractSingleTemplateProp(value: string): { prop: string; prefix: string; suffix: string } | null {\n const m = SINGLE_TEMPLATE_RE.exec(value);\n if (!m) return null;\n return { prefix: m[1] ?? '', prop: m[2]!, suffix: m[3] ?? '' };\n}\n\n/**\n * Convert single-prop string templates (`\"{{maxWidth}}\"`,\n * `\"calc({{maxWidth}} + 1rem)\"`) inside a style object into synthetic\n * `StyleMapping` entries so the downstream Webflow combo emitter treats them\n * the same as authored mappings: bake the default-prop resolution into the\n * primary class and emit a combo for non-default instance values.\n *\n * The synthetic mapping carries the values for *both* the component default\n * and the current instance \u2014 `mapStylesToWebflow` looks the right one up via\n * `componentDefaults` / `instanceProps`. Multi-template strings, dotted paths,\n * and props without an interface default fall through unchanged so today's\n * resolve-and-bake behavior still applies.\n */\nfunction templatesToSyntheticMappings(\n style: StyleObject,\n componentDefaults: Record<string, unknown>,\n instanceProps: Record<string, unknown>\n): StyleObject {\n const out: StyleObject = {};\n for (const [key, value] of Object.entries(style)) {\n if (typeof value !== 'string' || !hasCodeTemplates(value)) {\n out[key] = value;\n continue;\n }\n const parsed = extractSingleTemplateProp(value);\n if (!parsed) {\n out[key] = value;\n continue;\n }\n const { prop } = parsed;\n const defaultPropValue = componentDefaults[prop];\n if (defaultPropValue == null) {\n out[key] = value;\n continue;\n }\n const instancePropValue = instanceProps[prop] ?? defaultPropValue;\n // Resolve the full template string (literals + placeholder) once with the\n // default prop value substituted and once with the instance value. The\n // resulting strings are full CSS values \u2014 `mappingValueToCSS` downstream\n // consumes them verbatim.\n const defaultResolved = processCodeTemplates(value, { ...instanceProps, [prop]: defaultPropValue });\n const instanceResolved = processCodeTemplates(value, { ...instanceProps, [prop]: instancePropValue });\n out[key] = {\n _mapping: true,\n prop,\n values: {\n [String(defaultPropValue)]: defaultResolved,\n [String(instancePropValue)]: instanceResolved,\n },\n } as StyleMapping;\n }\n return out;\n}\n\n/**\n * Apply `templatesToSyntheticMappings` across a flat or responsive style.\n * Returns a new style object; original is left untouched. Skipped entirely\n * when no `componentDefaults` / `instanceProps` are available.\n */\nfunction convertStyleTemplatesToMappings(\n style: StyleObject | ResponsiveStyleObject | undefined,\n componentDefaults: Record<string, unknown> | undefined,\n instanceProps: Record<string, unknown> | undefined\n): StyleObject | ResponsiveStyleObject | undefined {\n if (!style || !componentDefaults || !instanceProps) return style;\n if (isResponsiveStyleObject(style)) {\n const result: ResponsiveStyleObject = {};\n for (const [bp, styleObj] of Object.entries(style)) {\n if (styleObj && typeof styleObj === 'object') {\n result[bp] = templatesToSyntheticMappings(styleObj as StyleObject, componentDefaults, instanceProps);\n }\n }\n return result;\n }\n return templatesToSyntheticMappings(style as StyleObject, componentDefaults, instanceProps);\n}\n\n/**\n * Evaluate a node's `if` condition at export time. Mirrors meno-core's SSR semantics:\n * boolean passes through, BooleanMapping is resolved against instance props,\n * and string templates are evaluated with meno-core's template engine. When no\n * context is available to decide, default to rendering (true) so we don't drop\n * nodes that would otherwise be shown.\n */\nfunction shouldRenderNode(\n node: ComponentNode,\n instanceProps?: Record<string, unknown>\n): boolean {\n if (!hasIf(node)) return true;\n const ifValue = node.if;\n\n if (typeof ifValue === 'boolean') return ifValue;\n\n if (isBooleanMapping(ifValue)) {\n if (!instanceProps) return true;\n const propValue = instanceProps[ifValue.prop];\n const mapped = ifValue.values[String(propValue)];\n return mapped !== undefined ? Boolean(mapped) : true;\n }\n\n if (typeof ifValue === 'string') {\n if (!instanceProps) return true;\n const resolved = processCodeTemplates(ifValue, instanceProps);\n return (\n Boolean(resolved) &&\n resolved !== 'false' &&\n resolved !== '0' &&\n resolved !== ''\n );\n }\n\n return true;\n}\n\n/**\n * Resolve templates in the inner `style` of each interactive-style rule.\n */\nfunction resolveInteractiveStyleTemplates(\n rules: InteractiveStyles | undefined,\n props: Record<string, unknown> | undefined\n): InteractiveStyles | undefined {\n if (!rules || !props) return rules;\n return rules.map((rule): InteractiveStyleRule => ({\n ...rule,\n style: (resolveStyleTemplates(rule.style as StyleObject | ResponsiveStyleObject, props) ?? rule.style) as StyleValue,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Main recursive converter\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a ComponentNode tree to Webflow element tree.\n * Also collects WebflowStyleClass definitions as a side effect in ctx.styleClasses.\n *\n * Async because list expansion may query the CMS service. Sync paths still\n * resolve in a single tick \u2014 only collection-sourced lists actually `await`.\n */\nexport async function nodeToWebflow(\n node: ComponentNode | ComponentNode[] | string | number | null | undefined,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement[]> {\n if (node === null || node === undefined) return [];\n\n // Text/number\n if (typeof node === 'string') {\n const text = resolveStringTemplate(node, ctx, instanceProps);\n // Empty/whitespace-only strings render as nothing in Meno's SSR, but a\n // bare `<span>` becomes a selectable Text Block in Webflow \u2014 skip them.\n if (text === '' || text.trim() === '') return [];\n return [{ tag: 'span', textContent: text }];\n }\n if (typeof node === 'number') {\n return [{ tag: 'span', textContent: String(node) }];\n }\n\n // Array of nodes\n if (Array.isArray(node)) {\n const results: WebflowElement[] = [];\n for (let i = 0; i < node.length; i++) {\n const child = node[i];\n const savedPath = [...ctx.elementPath];\n ctx.elementPath = [...ctx.elementPath, i];\n results.push(...(await nodeToWebflow(child, ctx, instanceProps)));\n ctx.elementPath = savedPath;\n }\n return results;\n }\n\n // Skip nodes whose `if` evaluates to false \u2014 meno-core's rendering treats\n // `if: false` (or a falsy mapping/template) as \"don't render\".\n if (!shouldRenderNode(node, instanceProps)) return [];\n\n // Dispatch by node type\n switch (node.type) {\n case NODE_TYPE.NODE:\n return [await emitHtmlNode(node as HtmlNode, ctx, instanceProps)];\n case NODE_TYPE.COMPONENT:\n return emitComponentInstance(node as ComponentInstanceNode, ctx, instanceProps);\n case NODE_TYPE.SLOT:\n return emitSlotMarker(node as SlotMarker, ctx, instanceProps);\n case NODE_TYPE.EMBED:\n return [await emitEmbedNode(node as EmbedNode, ctx, instanceProps)];\n case NODE_TYPE.LINK:\n return [await emitLinkNode(node as LinkNode, ctx, instanceProps)];\n case NODE_TYPE.LIST:\n case 'cms-list' as any:\n return emitListNode(node as ListNode, ctx, instanceProps);\n case NODE_TYPE.LOCALE_LIST:\n return emitLocaleListNode(node as LocaleListNode, ctx, instanceProps);\n default:\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Node type emitters\n// ---------------------------------------------------------------------------\n\nasync function emitHtmlNode(\n node: HtmlNode,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement> {\n // Resolve `{{...}}` in the tag against the same layered context meno-core\n // walks at runtime \u2014 page-level / slot-injected nodes don't have\n // `instanceProps`, so the helper falls back to slot props, component\n // defaults, and the active CMS / list iteration context.\n const tag = resolveStringTemplate(node.tag, ctx, instanceProps);\n\n // Build attributes early so we can check for a `theme=\"\u2026\"` override and\n // propagate it to the descendant context BEFORE resolving CSS variables.\n const attributes: Record<string, string | number | boolean> = {};\n if (node.attributes) {\n for (const [key, value] of Object.entries(node.attributes)) {\n attributes[key] = (typeof value === 'string')\n ? resolveStringTemplate(value, ctx, instanceProps)\n : value;\n }\n }\n\n const themedCtx: WebflowEmitContext = typeof attributes.theme === 'string' && attributes.theme\n ? { ...ctx, currentTheme: attributes.theme as string }\n : ctx;\n\n const rawStyle = node.style as StyleObject | ResponsiveStyleObject | undefined;\n const rawInteractiveStyles = node.interactiveStyles as InteractiveStyles | undefined;\n // Convert single-prop string templates (`\"{{maxWidth}}\"`) into synthetic\n // StyleMappings before resolution, so values driven by an interface prop\n // emit per-instance combo classes (`is-maxwidth-640px`) instead of\n // collapsing into a single primary class shared by every instance.\n const styleWithMappings = convertStyleTemplatesToMappings(\n rawStyle,\n ctx.componentDefaults,\n instanceProps,\n );\n const style = substituteVarsInStyle(\n resolveStyleTemplates(styleWithMappings, instanceProps),\n themedCtx\n );\n const interactiveStyles = substituteVarsInInteractive(\n resolveInteractiveStyleTemplates(rawInteractiveStyles, instanceProps),\n themedCtx\n );\n\n // Generate element class and map styles.\n // - Headings always get a class so we can zero out the default heading\n // margins Webflow ships with h1\u2013h6.\n // - `<button>` always gets a class so we can default `text-decoration: none`:\n // we route `<button>` through the `LinkBlock` preset (Webflow's\n // `FormButton` preset is form-only and gets rejected outside `<form>`),\n // which ships with the browser-default `<a>` underline carrier.\n const tagLower = tag.toLowerCase();\n const isHeading = HEADING_TAGS.has(tagLower);\n const isLinkLike = LINK_LIKE_TAGS.has(tagLower);\n const isParagraph = tagLower === 'p';\n const isList = LIST_TAGS.has(tagLower);\n const needsClass = style || (interactiveStyles && interactiveStyles.length > 0) || node.generateElementClass || isHeading || isLinkLike || isParagraph || isList;\n let className: string | undefined;\n let comboClassNames: string[] | undefined;\n\n if (needsClass) {\n const elementClass = withThemeSuffix(buildElementClass(ctx, node.label), themedCtx);\n const { primaryClass, comboClasses } = mapStylesToWebflow(\n elementClass, style, interactiveStyles, ctx.breakpoints, ctx.responsiveScales,\n { instanceProps, componentDefaults: ctx.componentDefaults, themeSuffix: themedClassSuffix(themedCtx) }\n );\n\n substituteVarsInStyleClass(primaryClass, themedCtx);\n if (isHeading) applyHeadingMarginDefaults(primaryClass);\n if (isParagraph) applyParagraphMarginDefaults(primaryClass);\n if (isList) applyListMarginDefaults(primaryClass);\n if (isLinkLike) applyLinkTextDecorationDefault(primaryClass);\n applyGridRowsDefault(primaryClass);\n className = primaryClass.name;\n ctx.styleClasses.set(primaryClass.name, primaryClass);\n\n if (comboClasses.length > 0) {\n comboClassNames = [];\n for (const combo of comboClasses) {\n substituteVarsInStyleClass(combo, themedCtx);\n ctx.styleClasses.set(combo.name, combo);\n comboClassNames.push(combo.name);\n }\n }\n\n // Capture the raw interactiveStyles per element so `buildWebflowPayload`\n // can later run them through `generateInteractiveCSS` for any rules\n // Webflow's class system can't represent (descendant selectors via\n // `prefix`, class-style postfixes, breakpoint-divided pseudos).\n if (\n ctx.interactiveStylesMap\n && Array.isArray(interactiveStyles)\n && interactiveStyles.length > 0\n ) {\n ctx.interactiveStylesMap.set(primaryClass.name, interactiveStyles);\n }\n }\n\n // Build children \u2014 use the themed context so descendants resolve `var()`\n // against the theme this element introduces.\n let children: Array<WebflowElement | string> | undefined;\n let textContent: string | undefined;\n if (!isVoidElement(tag) && node.children) {\n // Optimize: single string child becomes textContent instead of child element\n if (typeof node.children === 'string') {\n textContent = resolveStringTemplate(node.children, ctx, instanceProps);\n } else if (\n Array.isArray(node.children) &&\n node.children.length === 1 &&\n typeof node.children[0] === 'string'\n ) {\n const text = node.children[0] as string;\n textContent = resolveStringTemplate(text, ctx, instanceProps);\n } else {\n const innerCtx = { ...themedCtx, elementPath: [...themedCtx.elementPath] };\n const ownColor = concreteColor(extractBaseColor(style, themedCtx, instanceProps));\n if (ownColor) innerCtx.inheritedColor = ownColor;\n children = await convertChildren(node.children, innerCtx, instanceProps);\n if (children.length === 0) children = undefined;\n }\n }\n\n // Rich-text headings/paragraphs ship with the RAW_HTML_PREFIX sentinel.\n // Strip inline HTML and keep the concatenated visible text \u2014 Webflow's\n // Heading/Paragraph elements don't accept inline span children reliably\n // and `parent.append(string)` produces custom-tag elements, not text.\n // Inline emphasis styling is dropped for now (deliberate trade-off).\n if (textContent && textContent.startsWith(RAW_HTML_PREFIX)) {\n textContent = flattenInlineHtmlToText(textContent.slice(RAW_HTML_PREFIX.length));\n } else if (textContent && (isHeading || isParagraph) && /<[a-zA-Z!]/.test(textContent)) {\n // Rich-text props on static pages don't carry the sentinel \u2014 they're stored\n // as plain HTML by the editor. Headings/paragraphs still can't host inline\n // markup in Webflow, so flatten any tags we find to visible text.\n textContent = flattenInlineHtmlToText(textContent);\n }\n\n const element: WebflowElement = { tag };\n if (className) element.className = className;\n if (comboClassNames) element.comboClasses = comboClassNames;\n if (textContent) element.textContent = textContent;\n if (children) element.children = children;\n if (Object.keys(attributes).length > 0) element.attributes = attributes;\n\n // For project-relative `<img>` srcs the Webflow extension can't `fetch`\n // them (its iframe runs on `designer.webflow.com`). Inline the file bytes\n // here so the extension uploads via `createAsset` instead.\n if (tag.toLowerCase() === 'img' && typeof attributes.src === 'string') {\n await maybeInlineLocalImage(element, attributes.src);\n }\n\n return element;\n}\n\nasync function emitComponentInstance(\n node: ComponentInstanceNode,\n ctx: WebflowEmitContext,\n parentProps?: Record<string, unknown>\n): Promise<WebflowElement[]> {\n const compDef = ctx.globalComponents[node.component];\n if (!compDef) {\n // Unknown component \u2014 emit placeholder\n return [{ tag: 'div', attributes: { 'data-component': node.component } }];\n }\n\n const structured = compDef.component;\n\n // Resolve template placeholders in incoming instance props against the\n // PARENT scope first (e.g. `<Heading size=\"{{level}}\"/>` placed in a Hero\n // body \u2014 `level` belongs to Hero's interface, not Heading's). Then hand off\n // to meno-core's `resolvePropsFromDefinition` so defaults / validation /\n // rich-text wrapping / i18n match what SSR does. Without this parity, a\n // template like `tag: 'h{{size}}'` can read different values here than at\n // runtime \u2014 exactly the bug that produced literal `<h>` for `h{{size}}`\n // when SSR was happily rendering `<h2>`.\n const passedProps: Record<string, unknown> = {};\n if (node.props) {\n const parentTemplateProps = parentProps ?? buildTemplateProps(ctx);\n for (const [key, value] of Object.entries(node.props)) {\n if (key === 'children') continue;\n passedProps[key] = (typeof value === 'string' && hasCodeTemplates(value))\n ? processCodeTemplates(value, parentTemplateProps)\n : value;\n }\n }\n\n const resolvedProps: Record<string, unknown> = structured\n ? resolvePropsFromDefinition(\n structured,\n passedProps,\n node.children as Array<ComponentNode | string> | string | ComponentNode | null | undefined,\n ctx.locale,\n ctx.i18nConfig,\n )\n : { ...passedProps };\n // `resolvePropsFromDefinition` doesn't carry the children prop into its\n // output unless the interface declares it. The Webflow body walk reads\n // children via `slotChildren`, not props, so dropping it here is safe and\n // matches SSR (`ssrRenderer.ts:1217-1220` passes children separately too).\n delete resolvedProps.children;\n\n // Inline-expand the component's node tree\n const body = structured?.structure || (compDef as any).node;\n if (!body) return [];\n\n // Promote `Navigation` / `Footer` to Webflow Components. Render the body\n // ONCE with default props only \u2014 no slot children, no instance prop\n // overrides \u2014 so every page references the same registered Component. The\n // inline expansion is still emitted as `inlineFallback` so the extension\n // can render today's markup when the Designer API can't register\n // Components (older runtime, missing `canCreateComponents` permission).\n //\n // `acceptsStyles` opt-out: when the instance carries its own style /\n // interactiveStyles overrides, a single shared registered Component can't\n // represent them (combos would need a per-instance parent). Skip\n // promotion for that instance and fall through to inline expansion so\n // `emitInlineComponentBody` attaches the per-property combos directly.\n const hasInstanceStyleOverrides =\n Boolean(structured?.acceptsStyles)\n && (\n (node.style && Object.keys(node.style as object).length > 0)\n || (Array.isArray(node.interactiveStyles) && node.interactiveStyles.length > 0)\n );\n const promotedNames = ctx.promotedComponentNames || PROMOTED_TO_WEBFLOW_COMPONENT;\n if (\n promotedNames.has(node.component)\n && ctx.promotedComponents\n && !hasInstanceStyleOverrides\n ) {\n const promoted = ctx.promotedComponents;\n if (!promoted.has(node.component)) {\n const defaultProps: Record<string, unknown> = {};\n if (structured?.interface) {\n for (const [k, p] of Object.entries(structured.interface)) {\n defaultProps[k] = p.default;\n }\n }\n const compBodyCtx: WebflowEmitContext = {\n ...ctx,\n fileType: 'component',\n fileName: node.component,\n elementPath: [0],\n slotChildren: undefined,\n slotEmitContext: undefined,\n // Disable further promotion inside the component body \u2014 a Navigation\n // that nests Footer (or itself) would loop. Nested promoted names\n // inline within the registered Component's body.\n promotedComponents: null,\n componentDefaults: defaultProps,\n };\n const elements = await nodeToWebflow(body, compBodyCtx, defaultProps);\n promoted.set(node.component, { name: node.component, elements });\n }\n // The fallback represents an all-inline world; disable promotion inside\n // it so a self-nested promoted component doesn't recurse forever (each\n // call would emit yet another fallback under the same promoted name).\n const fallback = await emitInlineComponentBody(\n node,\n compDef,\n resolvedProps,\n body,\n { ...ctx, promotedComponents: null },\n parentProps,\n );\n return [{ tag: 'div', componentRef: node.component, inlineFallback: fallback }];\n }\n\n return emitInlineComponentBody(node, compDef, resolvedProps, body, ctx, parentProps);\n}\n\n/**\n * Inline-expand a component instance into Webflow elements. Used for both\n * the regular (non-promoted) path and the `inlineFallback` carried alongside\n * a `componentRef` element so older extensions can render today's markup.\n */\nasync function emitInlineComponentBody(\n node: ComponentInstanceNode,\n compDef: ComponentDefinition,\n resolvedProps: Record<string, unknown>,\n body: ComponentNode,\n ctx: WebflowEmitContext,\n parentProps?: Record<string, unknown>,\n): Promise<WebflowElement[]> {\n const structured = compDef.component;\n\n // Slot forwarding: when `node.children` contains `<slot/>` markers, those\n // markers reference the OUTER (current) component's slot \u2014 substitute them\n // with `ctx.slotChildren` now so this nested component receives the actual\n // slot content. Mirrors SSR's `processStructure`, which substitutes slot\n // markers throughout the parent's structure tree before walking. Without\n // this, a wrapper like `<Section>` whose body places `<Container>{slot}</Container>`\n // forwards the bare `{slot}` marker to Container as its slotChildren \u2014 when\n // Container's body fires its own slot, the marker is the only thing\n // available, has no slot context left, and renders nothing.\n let effectiveChildren = node.children;\n let inheritedSlotEmitContext = ctx.slotEmitContext;\n let inheritedSlotInstanceProps: Record<string, unknown> | undefined = undefined;\n let didForwardSlot = false;\n if (node.children != null && typeof node.children !== 'string') {\n const childArr = Array.isArray(node.children) ? node.children : [node.children];\n if (childArr.some((c) => c && typeof c === 'object' && (c as { type?: string }).type === NODE_TYPE.SLOT)) {\n const out: typeof childArr = [];\n for (const c of childArr) {\n if (c && typeof c === 'object' && (c as { type?: string }).type === NODE_TYPE.SLOT) {\n didForwardSlot = true;\n if (ctx.slotChildren !== undefined) {\n const sc = ctx.slotChildren;\n const subArr = Array.isArray(sc) ? sc : [sc];\n out.push(...subArr);\n } else {\n const def = (c as SlotMarker).default;\n if (def !== undefined) {\n const defArr = Array.isArray(def) ? def : [def];\n out.push(...defArr);\n }\n }\n } else {\n out.push(c);\n }\n }\n if (didForwardSlot) {\n effectiveChildren = out;\n // Forwarded slot children were authored in the OUTER scope \u2014 preserve\n // their original `slotInstanceProps` (so templates resolve against the\n // outer component's props) and `slotEmitContext` (so generated class\n // names hash against the outer authoring identity).\n inheritedSlotInstanceProps = ctx.slotInstanceProps;\n }\n }\n }\n\n const compCtx: WebflowEmitContext = {\n ...ctx,\n fileType: 'component',\n fileName: node.component,\n elementPath: [0],\n slotChildren: effectiveChildren,\n slotEmitContext: didForwardSlot && inheritedSlotEmitContext\n ? inheritedSlotEmitContext\n : {\n fileType: ctx.fileType,\n fileName: ctx.fileName,\n elementPath: [...ctx.elementPath],\n },\n // Slot children authored alongside this instance refer to the OUTER\n // component's interface (the one whose body contains `<Component \u2026>{slot\n // children}</Component>`). When the body hits its `<slot/>`, those\n // children must resolve `{{title}}` etc. against `parentProps` \u2014 not\n // against this component's resolved props. For forwarded slot children,\n // use the original outer slot's `slotInstanceProps` instead so they keep\n // their original authoring scope through the wrapper.\n slotInstanceProps: didForwardSlot ? inheritedSlotInstanceProps : parentProps,\n componentDefaults: extractInterfaceDefaults(structured?.interface),\n };\n\n // Layer the active CMS template context (e.g. `post` from a `<list>`\n // iteration) underneath the component's resolved props so descendants\n // inside the body can resolve `{{post.title}}` etc. Mirrors SSR's\n // ssrRenderer.ts:1231 which passes `itemContext: ctx.templateContext`\n // alongside resolved props. resolvedProps wins on key conflicts so\n // explicit instance props still override.\n const ctxTemplate = ctx.templateContext as Record<string, unknown> | undefined;\n const bodyProps = ctxTemplate\n ? { ...ctxTemplate, ...resolvedProps }\n : resolvedProps;\n const emitted = await nodeToWebflow(body, compCtx, bodyProps);\n\n // `acceptsStyles`: forward instance-level style / interactiveStyles\n // overrides as ONE combo class on the body's emitted root, mirroring how\n // SSR merges them onto the root node (ssrRenderer.ts:1244). All authored\n // overrides \u2014 base, breakpoint, pseudo-state \u2014 fold into a single combo\n // named after the instance's outer location so two instances of the same\n // component on the same page don't share a single class.\n if (\n structured?.acceptsStyles\n && emitted.length > 0\n && (\n (node.style && Object.keys(node.style as object).length > 0)\n || (Array.isArray(node.interactiveStyles) && node.interactiveStyles.length > 0)\n )\n ) {\n const root = emitted[0];\n if (root && typeof root === 'object') {\n // The body root may not have needed a class on its own (e.g. a plain\n // <section> without authored styles). Mint one so the combo has a\n // primary class to attach to \u2014 uses the same `buildElementClass`\n // identity emitHtmlNode would have produced for this root.\n if (!root.className) {\n const minted = withThemeSuffix(buildElementClass(compCtx, undefined), compCtx);\n ctx.styleClasses.set(minted, { name: minted, base: {} });\n root.className = minted;\n }\n\n const rawStyle = node.style as StyleObject | ResponsiveStyleObject | undefined;\n const rawInteractive = node.interactiveStyles as InteractiveStyles | undefined;\n const resolvedStyle = substituteVarsInStyle(\n resolveStyleTemplates(rawStyle, parentProps),\n ctx,\n );\n const resolvedInteractive = substituteVarsInInteractive(\n resolveInteractiveStyleTemplates(rawInteractive, parentProps),\n ctx,\n );\n\n // Stable per-instance combo name: `is-<5char hash>` where the hash is\n // derived from the placement's full element-class identity in the OUTER\n // tree. Two instances of the same component at different positions get\n // distinct combos; the same instance produces the same name across\n // re-imports. `mintInstanceComboName` resolves the rare case where two\n // identities collapse to the same hash slice within one export.\n const instanceLocClass = withThemeSuffix(buildElementClass(ctx, node.label), ctx);\n const comboName = mintInstanceComboName(ctx, instanceLocClass);\n\n const combo = buildInstanceStyleCombo(\n comboName,\n root.className,\n resolvedStyle,\n resolvedInteractive,\n ctx.breakpoints,\n ctx.responsiveScales,\n );\n if (combo) {\n substituteVarsInStyleClass(combo, ctx);\n // Webflow only honors a single combo class on top of the primary. If\n // the body root already wears a StyleMapping-driven combo from\n // `mapStylesToWebflow` (e.g. `is-size-small`), fold this instance\n // override into a fresh merged class instead of stacking. Outer\n // instance overrides land last so they win on key conflicts,\n // mirroring SSR's merge order in `ssrRenderer.ts:1244`.\n const existingComboName = Array.isArray(root.comboClasses) && root.comboClasses.length > 0\n ? root.comboClasses[0]\n : undefined;\n const inner = existingComboName ? ctx.styleClasses.get(existingComboName) : undefined;\n if (inner) {\n const merged = mergeComboClasses(inner, combo, root.className);\n ctx.styleClasses.set(merged.name, merged);\n root.comboClasses = [merged.name];\n } else {\n ctx.styleClasses.set(combo.name, combo);\n root.comboClasses = [combo.name];\n }\n }\n }\n }\n\n // Mark the first emitted element as the component root so bundled scripts\n // can find their instances at runtime via [data-component~=\"\u2026\"] and read\n // their props via data-props. Mirrors ssrRenderer.ts:1311-1345 \u2014 same shape\n // (`data-component` space-separated, `data-props` JSON keyed by component\n // name) so component code runs unmodified in the published Webflow page.\n // Only tag if the component actually ships JavaScript; otherwise the marker\n // is dead weight.\n if (emitted.length > 0 && structured?.javascript) {\n const root = emitted[0];\n if (root && typeof root === 'object') {\n root.attributes = root.attributes || {};\n const existing = root.attributes['data-component'];\n root.attributes['data-component'] = existing\n ? `${existing} ${node.component}`\n : node.component;\n\n // Serialize defineVars-exposed props into data-props, keyed by component\n // name so nested components don't clobber each other on a shared root.\n const defineVars = structured.defineVars;\n if (defineVars) {\n const varsToExpose = defineVars === true\n ? Object.keys(structured.interface || {})\n : defineVars;\n const propsForJS: Record<string, unknown> = {};\n for (const varName of varsToExpose) {\n if (resolvedProps[varName] !== undefined) {\n propsForJS[varName] = resolvedProps[varName];\n }\n }\n\n let existingPropsMap: Record<string, unknown> = {};\n const existingPropsStr = root.attributes['data-props'];\n if (typeof existingPropsStr === 'string' && existingPropsStr) {\n try {\n // Stored URL-encoded (see comment below) \u2014 decode before parsing.\n const parsed = JSON.parse(decodeURIComponent(existingPropsStr));\n if (parsed && typeof parsed === 'object') {\n existingPropsMap = parsed as Record<string, unknown>;\n }\n } catch { /* ignore malformed */ }\n }\n existingPropsMap[node.component] = propsForJS;\n // URL-encode the serialized JSON. Webflow's `<DOM>`-type element\n // (used for `<input>`, `<label>` etc.) rejects attribute values\n // containing double quotes via setAttribute. Encoding sidesteps that\n // by removing literal `\"` characters \u2014 the runtime IIFE in the JS\n // bundle decodes via decodeURIComponent before JSON.parse.\n root.attributes['data-props'] = encodeURIComponent(JSON.stringify(existingPropsMap));\n }\n }\n }\n\n return emitted;\n}\n\nasync function emitSlotMarker(\n node: SlotMarker,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement[]> {\n // Use instance children passed via context to fill the slot\n if (ctx.slotChildren) {\n // Switch back to caller context so slot children's generated class names\n // hash against the page that supplied them, not the slot-host component.\n const restored = ctx.slotEmitContext;\n const parentCtx: WebflowEmitContext = {\n ...ctx,\n ...(restored\n ? {\n fileType: restored.fileType,\n fileName: restored.fileName,\n elementPath: [...restored.elementPath],\n }\n : {}),\n slotChildren: undefined, // prevent infinite slot nesting\n slotEmitContext: undefined, // consumed\n slotInstanceProps: undefined, // consumed\n };\n // Slot children's `{{prop}}` templates reference the OUTER component's\n // interface (the component whose body authored these children), not the\n // slot host's. `slotInstanceProps` captures that outer prop set in\n // `emitInlineComponentBody`. Without this, a Heading with `text=\"{{title}}\"`\n // placed inside a `<Stack>` slot would look up `title` on Stack's props\n // (where it doesn't exist) and emit an empty heading.\n const slotProps = ctx.slotInstanceProps ?? instanceProps;\n return convertChildren(ctx.slotChildren as any, parentCtx, slotProps);\n }\n // Fall back to slot defaults\n if (node.default) {\n return convertChildren(node.default as any, ctx, instanceProps);\n }\n return [];\n}\n\nasync function emitEmbedNode(\n node: EmbedNode,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement> {\n const style = substituteVarsInStyle(\n resolveStyleTemplates(\n node.style as StyleObject | ResponsiveStyleObject | undefined,\n instanceProps\n ),\n ctx\n );\n const interactiveStyles = substituteVarsInInteractive(\n resolveInteractiveStyleTemplates(\n node.interactiveStyles as InteractiveStyles | undefined,\n instanceProps\n ),\n ctx\n );\n\n let className: string | undefined;\n if (style || (interactiveStyles && interactiveStyles.length > 0)) {\n const elementClass = withThemeSuffix(buildElementClass(ctx, node.label), ctx);\n const { primaryClass } = mapStylesToWebflow(\n elementClass, style, interactiveStyles, ctx.breakpoints, ctx.responsiveScales\n );\n substituteVarsInStyleClass(primaryClass, ctx);\n className = primaryClass.name;\n ctx.styleClasses.set(primaryClass.name, primaryClass);\n }\n\n // `node.html` may be an HtmlMapping (`{_mapping: true, prop, values}`) bound\n // to a component prop \u2014 e.g. an `Icon` component switches its inline SVG by\n // the `icon` enum. Resolve it against the same layered prop context the\n // runtime SSR uses, otherwise the embed silently exports as empty.\n const props = buildTemplateProps(ctx, instanceProps);\n let htmlStr: string;\n if (isHtmlMapping(node.html)) {\n htmlStr = resolveHtmlMapping(node.html, props) ?? '';\n } else if (typeof node.html === 'string') {\n htmlStr = hasCodeTemplates(node.html) ? processCodeTemplates(node.html, props) : node.html;\n } else {\n htmlStr = '';\n }\n\n const element: WebflowElement = { tag: 'div' };\n if (className) element.className = className;\n\n const trimmed = htmlStr.trim();\n if (/^<svg\\b/i.test(trimmed) && /<\\/svg\\s*>\\s*$/i.test(trimmed)) {\n let svg = trimmed;\n if (/currentColor/i.test(svg)) {\n const resolved = concreteColor(extractBaseColor(style, ctx, instanceProps)) ?? ctx.inheritedColor;\n if (resolved) svg = inlineCurrentColorInSvg(svg, resolved);\n }\n element.svgSource = svg;\n if (node.label) element.imageAlt = node.label;\n return element;\n }\n\n const imgMatch = trimmed.match(/^<img\\b([^>]*)\\/?>\\s*$/i);\n if (imgMatch) {\n const attrs = imgMatch[1];\n const src = /\\bsrc\\s*=\\s*\"([^\"]*)\"|\\bsrc\\s*=\\s*'([^']*)'/i.exec(attrs);\n const alt = /\\balt\\s*=\\s*\"([^\"]*)\"|\\balt\\s*=\\s*'([^']*)'/i.exec(attrs);\n if (src) {\n element.imageSrc = src[1] ?? src[2] ?? '';\n element.imageAlt = (alt?.[1] ?? alt?.[2] ?? node.label) || '';\n await maybeInlineLocalImage(element, element.imageSrc);\n return element;\n }\n }\n\n if (trimmed.length) {\n element.unsupportedEmbed = {\n reason: 'embed-not-svg-or-image',\n preview: trimmed.slice(0, 120),\n label: node.label,\n };\n }\n return element;\n}\n\n/**\n * Rewrite an internal `/path` href to the current-locale Webflow URL. Other\n * link forms (external, protocol-relative, anchor, mailto, tel, javascript,\n * data, relative, empty) pass through unchanged.\n *\n * Webflow has no Designer API for binding `<a>` to a Page entity (Apr 2026),\n * so this is a pure string rewrite that mirrors the URL structure\n * `buildWebflow.ts` already produces for imported pages\n * (`/`, `/${slug}`, `/${locale}`, `/${locale}/${slug}`).\n */\nfunction resolveLinkHref(rawHref: string, ctx: WebflowEmitContext): string {\n if (!rawHref) return rawHref;\n // Only `^/` paths are candidates. `//` is protocol-relative \u2014 leave alone.\n if (!rawHref.startsWith('/') || rawHref.startsWith('//')) return rawHref;\n // No locale machinery wired in this context \u2014 nothing to translate against.\n if (!ctx.i18nConfig || !ctx.locale || !ctx.slugMappings) return rawHref;\n\n // Split off `?query` and `#fragment` so they survive translation, then\n // reattach. Whichever comes first marks the boundary of the path.\n const hashIdx = rawHref.indexOf('#');\n const queryIdx = rawHref.indexOf('?');\n let cut = -1;\n if (hashIdx >= 0 && queryIdx >= 0) cut = Math.min(hashIdx, queryIdx);\n else if (hashIdx >= 0) cut = hashIdx;\n else if (queryIdx >= 0) cut = queryIdx;\n\n const path = cut >= 0 ? rawHref.slice(0, cut) : rawHref;\n const suffix = cut >= 0 ? rawHref.slice(cut) : '';\n\n if (!ctx.slugIndex) {\n ctx.slugIndex = buildSlugIndex(ctx.slugMappings);\n }\n\n // Meno hrefs are authored in canonical (default-locale) form. Translate\n // from default-locale \u2192 ctx.locale; `translatePath` falls back to the same\n // slug + locale prefix for paths without an explicit slugMapping entry,\n // which is the correct behavior for unlocalized pages.\n const translated = translatePath(\n path,\n ctx.locale,\n ctx.i18nConfig.defaultLocale,\n ctx.i18nConfig.defaultLocale,\n ctx.slugIndex\n );\n\n return translated + suffix;\n}\n\nasync function emitLinkNode(\n node: LinkNode,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement> {\n const style = substituteVarsInStyle(\n resolveStyleTemplates(\n node.style as StyleObject | ResponsiveStyleObject | undefined,\n instanceProps\n ),\n ctx\n );\n const interactiveStyles = substituteVarsInInteractive(\n resolveInteractiveStyleTemplates(\n node.interactiveStyles as InteractiveStyles | undefined,\n instanceProps\n ),\n ctx\n );\n\n // Always assign a class so we can default `text-decoration: none` \u2014\n // browsers underline `<a>` by default and source designs almost never\n // override it. Mirrors the heading-margin default for `h1`\u2013`h6`.\n let className: string | undefined;\n let comboClassNames: string[] | undefined;\n {\n const elementClass = withThemeSuffix(buildElementClass(ctx, node.label), ctx);\n const { primaryClass, comboClasses } = mapStylesToWebflow(\n elementClass, style, interactiveStyles, ctx.breakpoints, ctx.responsiveScales,\n { instanceProps, componentDefaults: ctx.componentDefaults, themeSuffix: themedClassSuffix(ctx) }\n );\n substituteVarsInStyleClass(primaryClass, ctx);\n applyLinkTextDecorationDefault(primaryClass);\n applyGridRowsDefault(primaryClass);\n className = primaryClass.name;\n ctx.styleClasses.set(primaryClass.name, primaryClass);\n\n if (comboClasses.length > 0) {\n comboClassNames = [];\n for (const combo of comboClasses) {\n substituteVarsInStyleClass(combo, ctx);\n ctx.styleClasses.set(combo.name, combo);\n comboClassNames.push(combo.name);\n }\n }\n\n if (\n ctx.interactiveStylesMap\n && Array.isArray(interactiveStyles)\n && interactiveStyles.length > 0\n ) {\n ctx.interactiveStylesMap.set(primaryClass.name, interactiveStyles);\n }\n }\n\n // Resolve href, then rewrite internal page paths to the current-locale\n // Webflow URL so links survive localized slugs and non-default-locale\n // prefixes (`/about` \u2192 `/fr/\u00E0-propos`). External / anchor / mailto / tel\n // / protocol-relative hrefs pass through unchanged.\n let href = '#';\n if (typeof node.href === 'string') {\n href = resolveStringTemplate(node.href, ctx, instanceProps);\n }\n href = resolveLinkHref(href, ctx);\n\n const attributes: Record<string, string | number | boolean> = { href };\n if (node.attributes) {\n for (const [key, value] of Object.entries(node.attributes)) {\n attributes[key] = (typeof value === 'string')\n ? resolveStringTemplate(value, ctx, instanceProps)\n : value;\n }\n }\n\n let children: WebflowElement[] | undefined;\n if (node.children) {\n const ownColor = concreteColor(extractBaseColor(style, ctx, instanceProps));\n const childCtx = ownColor ? { ...ctx, inheritedColor: ownColor } : ctx;\n children = await convertChildren(node.children, childCtx, instanceProps);\n if (children.length === 0) children = undefined;\n }\n\n const element: WebflowElement = { tag: 'a', attributes };\n if (className) element.className = className;\n if (comboClassNames) element.comboClasses = comboClassNames;\n if (children) element.children = children;\n\n return element;\n}\n\n// ---------------------------------------------------------------------------\n// List nodes (prop + collection) \u2014 static expansion\n// ---------------------------------------------------------------------------\n\nfunction singularize(name: string): string {\n if (name.endsWith('ies') && name.length > 3) return name.slice(0, -3) + 'y';\n if (name.endsWith('s') && name.length > 1) return name.slice(0, -1);\n return name;\n}\n\nfunction makeI18nResolver(ctx: WebflowEmitContext): ValueResolver | undefined {\n if (!ctx.locale || !ctx.i18nConfig) return undefined;\n const { locale, i18nConfig } = ctx;\n return (value: unknown) => resolveI18nValue(value, locale, i18nConfig);\n}\n\n/**\n * Resolve i18n values inside a CMS item so list children see the right locale.\n * Mirrors the pre-render shaping the SSR list does via templateContext.\n */\nfunction resolveItemI18n(item: CMSItem, ctx: WebflowEmitContext): CMSItem {\n if (!ctx.locale || !ctx.i18nConfig) return item;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(item)) {\n out[k] = isI18nValue(v) ? resolveI18nValue(v, ctx.locale, ctx.i18nConfig) : v;\n }\n return out as CMSItem;\n}\n\nasync function getCollectionItemsForExport(\n node: ListNode,\n source: string,\n ctx: WebflowEmitContext\n): Promise<CMSItem[]> {\n if (!ctx.cmsService) return [];\n\n let items: CMSItem[] = [];\n\n // Reference list (`items: \"{{cms.tagIds}}\"` or `items: [\"id1\", \"id2\"]`)\n if ((node as any).items) {\n const itemsField = (node as any).items;\n let resolvedIds: string | string[] | undefined;\n\n if (typeof itemsField === 'string' && itemsField.startsWith('{{')) {\n if (itemsField.startsWith('{{cms.') && ctx.cmsContext?.cms) {\n const fieldPath = itemsField.slice(6, -2);\n let value: unknown = ctx.cmsContext.cms;\n for (const part of fieldPath.split('.')) {\n if (value && typeof value === 'object' && part in (value as object)) {\n value = (value as Record<string, unknown>)[part];\n } else { value = undefined; break; }\n }\n if (value !== null && value !== undefined) {\n resolvedIds = Array.isArray(value) ? value.map(v => String(v)) : String(value);\n }\n } else {\n resolvedIds = resolveItemsTemplate(\n itemsField,\n (ctx.templateContext || { _type: 'template' }) as any\n );\n }\n if (!resolvedIds) return [];\n const ids = Array.isArray(resolvedIds) ? resolvedIds : [resolvedIds];\n items = await ctx.cmsService.getItemsByIds(source, ids);\n } else {\n const ids = Array.isArray(itemsField) ? itemsField : [itemsField];\n items = await ctx.cmsService.getItemsByIds(source, ids);\n }\n if (ctx.locale) {\n items = items.filter(it => !isItemDraftForLocale(it, ctx.locale!));\n }\n } else {\n items = await ctx.cmsService.queryItems({\n collection: source,\n filter: node.filter as CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown> | undefined,\n sort: node.sort,\n limit: node.limit,\n offset: node.offset,\n excludeDraftLocale: ctx.locale,\n });\n }\n\n if ((node as any).excludeCurrentItem && ctx.cmsContext?.cms?._id) {\n const currentId = ctx.cmsContext.cms._id as string;\n items = items.filter(it => it._id !== currentId);\n }\n\n return items;\n}\n\nfunction getPropItemsForExport(source: string, ctx: WebflowEmitContext, instanceProps?: Record<string, unknown>): unknown[] {\n // Template expression like \"{{items}}\" or \"{{category.items}}\". SSR pre-\n // substitutes these against the merged prop scope via `processStructure`\n // before the list node is reached, so its `getPropItems` only needs to look\n // at templateContext. The Webflow exporter walks the raw JSON, so we\n // resolve here against both scopes: `templateContext` carries outer-list\n // iteration variables (`{{category.items}}`); `instanceProps` carries the\n // enclosing component's resolved props (`{{items}}` referring to the\n // component's own `items` prop, the form generated by the editor).\n if (source.startsWith('{{') && source.endsWith('}}')) {\n const path = source.slice(2, -2).trim();\n const ctxObj = ctx.templateContext as Record<string, unknown> | undefined;\n if (ctxObj) {\n const resolved = getNestedValue(ctxObj, path);\n if (Array.isArray(resolved)) return resolved;\n }\n if (instanceProps) {\n const resolved = getNestedValue(instanceProps, path);\n if (Array.isArray(resolved)) return resolved;\n }\n return [];\n }\n // Direct prop name \u2014 resolve from current component scope, then CMS context.\n if (instanceProps && Array.isArray(instanceProps[source])) {\n return instanceProps[source] as unknown[];\n }\n if (ctx.cmsContext?.cms) {\n const cmsValue = (ctx.cmsContext.cms as Record<string, unknown>)[source];\n if (Array.isArray(cmsValue)) return cmsValue;\n }\n return [];\n}\n\n/**\n * Build a synthetic CMSItem whose every field is the binding sentinel string\n * for that field slug. Used in bound mode so the existing template engine\n * resolves `{{post.title}}` to a sentinel that the post-walk can rewrite into\n * a `menoBind.textField` marker.\n */\nfunction buildBindingPlaceholderItem(schema: CMSSchema | undefined): CMSItem {\n const item: Record<string, unknown> = {};\n if (schema?.fields) {\n for (const fieldSlug of Object.keys(schema.fields)) {\n item[fieldSlug] = `${MENO_BIND_SENTINEL_PREFIX}${fieldSlug}${MENO_BIND_SENTINEL_SUFFIX}`;\n }\n }\n // System fields commonly referenced in templates (`{{post._url}}` for links,\n // `{{post._slug}}` for hrefs). Webflow's binding panel exposes these as\n // \"Current item URL\" / \"Slug\" \u2014 map back to the same names so the manual\n // binding step is unambiguous.\n item._id = `${MENO_BIND_SENTINEL_PREFIX}_id${MENO_BIND_SENTINEL_SUFFIX}`;\n item._slug = `${MENO_BIND_SENTINEL_PREFIX}_slug${MENO_BIND_SENTINEL_SUFFIX}`;\n item._url = `${MENO_BIND_SENTINEL_PREFIX}_url${MENO_BIND_SENTINEL_SUFFIX}`;\n return item as CMSItem;\n}\n\n/**\n * Walk a rendered element subtree and convert binding sentinels into\n * `menoBind` markers so the extension can surface them to the user. Sentinels\n * appear in `textContent` (from `<h2>{{post.title}}</h2>`) or in attribute\n * values (from `<a href=\"{{post._url}}\">` / `<img src=\"{{post.cover}}\">`).\n *\n * Exact-match sentinels become a clean `{textField}` / `{attrFields}` entry;\n * partial matches (`/blog/__MENO_BIND__:_url:__`) record the binding hint but\n * keep the literal text so the user can see the URL pattern context.\n *\n * Side effect: image inlining done by `maybeInlineLocalImage` for sentinel\n * srcs leaks file bytes that point at no real asset. Strip them so the\n * extension doesn't try to upload garbage.\n */\nfunction applyBindingMarkers(el: WebflowElement): void {\n // Text content\n if (typeof el.textContent === 'string') {\n const exact = el.textContent.match(MENO_BIND_SENTINEL_EXACT_RE);\n if (exact) {\n const field = exact[1];\n el.menoBind = { ...(el.menoBind || {}), textField: field };\n el.textContent = `{${field}}`;\n } else if (MENO_BIND_SENTINEL_RE.test(el.textContent)) {\n MENO_BIND_SENTINEL_RE.lastIndex = 0;\n const fields: string[] = [];\n el.textContent = el.textContent.replace(MENO_BIND_SENTINEL_RE, (_m, f) => {\n fields.push(f);\n return `{${f}}`;\n });\n if (fields.length) {\n el.menoBind = { ...(el.menoBind || {}), textField: fields[0] };\n }\n }\n MENO_BIND_SENTINEL_RE.lastIndex = 0;\n }\n\n // Attributes\n if (el.attributes) {\n const attrFields: Record<string, string> = el.menoBind?.attrFields || {};\n for (const [key, rawValue] of Object.entries(el.attributes)) {\n if (typeof rawValue !== 'string') continue;\n const exact = rawValue.match(MENO_BIND_SENTINEL_EXACT_RE);\n if (exact) {\n attrFields[key] = exact[1];\n el.attributes[key] = `{${exact[1]}}`;\n continue;\n }\n MENO_BIND_SENTINEL_RE.lastIndex = 0;\n if (MENO_BIND_SENTINEL_RE.test(rawValue)) {\n MENO_BIND_SENTINEL_RE.lastIndex = 0;\n let firstField: string | undefined;\n const replaced = rawValue.replace(MENO_BIND_SENTINEL_RE, (_m, f) => {\n if (!firstField) firstField = f;\n return `{${f}}`;\n });\n if (firstField) attrFields[key] = firstField;\n el.attributes[key] = replaced;\n }\n MENO_BIND_SENTINEL_RE.lastIndex = 0;\n }\n if (Object.keys(attrFields).length > 0) {\n el.menoBind = { ...(el.menoBind || {}), attrFields };\n }\n }\n\n // Image inlining produced bytes for a sentinel src \u2014 drop them; user will\n // re-bind the image to a real CMS field after insertion.\n if (\n el.menoBind?.attrFields?.src\n && (el.imageDataBase64 || el.imageSrc)\n ) {\n delete el.imageDataBase64;\n delete el.imageDataMime;\n delete el.imageDataFileName;\n delete el.imageSrc;\n }\n\n // Recurse\n if (Array.isArray(el.children)) {\n for (const child of el.children) {\n if (typeof child !== 'string') applyBindingMarkers(child);\n }\n }\n if (Array.isArray(el.inlineFallback)) {\n for (const child of el.inlineFallback) applyBindingMarkers(child);\n }\n}\n\n/**\n * Wrap any non-`<li>` child of a `<ul>`/`<ol>` element in a synthetic `<li>`.\n * Webflow's Designer API enforces that the `List` preset only accepts\n * `ListItem` children \u2014 so an `<a>` or `<div>` directly under `<ul>` (a common\n * Meno pattern when a `list` node iterates a link-style item template inside\n * a `<ul>` wrapper) is rejected at insert time with\n * \"Non-List Item can not be placed in a List.\" This pass corrects the structure\n * at the source so the exported tree is structurally valid Webflow markup.\n *\n * Walks recursively, in-place. Idempotent: existing `<li>` children pass\n * through untouched.\n */\nexport function normalizeListChildren(\n elements: Array<WebflowElement | string> | undefined\n): void {\n if (!Array.isArray(elements)) return;\n for (const el of elements) {\n if (typeof el === 'string') continue;\n const tag = (el.tag || '').toLowerCase();\n if ((tag === 'ul' || tag === 'ol') && Array.isArray(el.children)) {\n el.children = el.children.map((child): WebflowElement | string => {\n if (typeof child === 'string') return { tag: 'li', children: [child] };\n if ((child.tag || '').toLowerCase() === 'li') return child;\n return { tag: 'li', children: [child] };\n });\n }\n if (Array.isArray(el.children)) normalizeListChildren(el.children);\n if (Array.isArray(el.inlineFallback)) normalizeListChildren(el.inlineFallback);\n }\n}\n\n/**\n * Static expansion of a List/CMS-list node. Mirrors SSR's `processList`:\n * resolves the source (CMS query, prop array, or template expression),\n * applies filter/sort/limit/offset, and emits children once per item with\n * the per-item template context layered onto `instanceProps`.\n */\nasync function emitListNode(\n node: ListNode,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement[]> {\n const nodeType = node.type as string;\n const isLegacyCMSList = nodeType === 'cms-list';\n const sourceType = isLegacyCMSList ? 'collection' : (node.sourceType || 'prop');\n\n if (sourceType === 'collection' && !ctx.cmsService) return [];\n\n const rawSource = (node as any).source || (node as any).collection;\n const source = typeof rawSource === 'string' ? rawSource : '';\n const sourceIsResolved = Array.isArray(rawSource);\n\n let variableName: string;\n if (node.itemAs) variableName = node.itemAs;\n else if (sourceType === 'collection') variableName = singularize(source);\n else variableName = 'item';\n\n // Bound mode: emit a single-item synthetic Collection List wrapper instead\n // of expanding statically. Children are rendered ONCE against a sentinel\n // placeholder item; sentinels are then converted to `menoBind` markers the\n // extension picks up. Only reached for `sourceType === 'collection'`.\n if (sourceType === 'collection' && ctx.bindCollectionLists && ctx.cmsService && source) {\n const schema = ctx.cmsService.getSchema(source) || undefined;\n const placeholder = buildBindingPlaceholderItem(schema);\n const templateContext = buildTemplateContext(\n variableName,\n placeholder,\n 0,\n 1,\n ctx.templateContext as any\n );\n const childCtx: WebflowEmitContext = {\n ...ctx,\n templateContext: templateContext as Record<string, unknown>,\n };\n const mergedProps: Record<string, unknown> = {\n ...(instanceProps || {}),\n ...templateContext,\n };\n const renderedChildren = node.children\n ? await convertChildren(node.children as any, childCtx, mergedProps)\n : [];\n for (const child of renderedChildren) {\n if (typeof child !== 'string') applyBindingMarkers(child);\n }\n return [{\n tag: COLLECTION_LIST_TAG,\n menoCollectionRef: source,\n children: renderedChildren,\n }];\n }\n\n let items: unknown[];\n if (sourceType === 'collection') {\n items = await getCollectionItemsForExport(node, source, ctx);\n } else if (sourceIsResolved) {\n items = rawSource as unknown[];\n } else if (source) {\n items = getPropItemsForExport(source, ctx, instanceProps);\n if (node.offset) items = items.slice(node.offset);\n if (node.limit) items = items.slice(0, node.limit);\n } else {\n items = [];\n }\n\n return expandListItems(node, ctx, instanceProps, items, variableName, source);\n}\n\nasync function expandListItems(\n node: ListNode,\n ctx: WebflowEmitContext,\n instanceProps: Record<string, unknown> | undefined,\n items: unknown[],\n variableName: string,\n source: string\n): Promise<WebflowElement[]> {\n if (items.length === 0) return [];\n\n const schema: CMSSchema | undefined = ctx.cmsService\n ? (ctx.cmsService.getSchema(source) || undefined)\n : undefined;\n\n const out: WebflowElement[] = [];\n for (let i = 0; i < items.length; i++) {\n const rawItem = items[i] as Record<string, unknown>;\n const enriched = schema && ctx.locale && ctx.i18nConfig\n ? addItemUrl(rawItem as CMSItem, schema, ctx.locale, ctx.i18nConfig)\n : (rawItem as CMSItem);\n const item = resolveItemI18n(enriched, ctx);\n\n const templateContext = buildTemplateContext(\n variableName,\n item,\n i,\n items.length,\n (ctx.templateContext as any)\n );\n\n const childCtx: WebflowEmitContext = {\n ...ctx,\n templateContext: templateContext as Record<string, unknown>,\n };\n\n // Merge per-item context onto the instance prop scope so templates\n // ({{item.title}}, {{post.field}}, {{itemIndex}}) resolve via the\n // existing template helpers in this file.\n const mergedProps: Record<string, unknown> = {\n ...(instanceProps || {}),\n ...templateContext,\n };\n\n if (node.children) {\n const savedPath = [...childCtx.elementPath];\n childCtx.elementPath = [...savedPath, i];\n out.push(...(await convertChildren(node.children as any, childCtx, mergedProps)));\n childCtx.elementPath = savedPath;\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// LocaleList \u2014 static link list per configured locale\n// ---------------------------------------------------------------------------\n\nasync function emitLocaleListNode(\n node: LocaleListNode,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement[]> {\n if (!ctx.slugMappings || !ctx.pagePath || !ctx.i18nConfig || !ctx.locale) {\n return [{ tag: 'div', attributes: { 'data-locale-list': 'true' } }];\n }\n\n if (!ctx.slugIndex) {\n ctx.slugIndex = buildSlugIndex(ctx.slugMappings);\n }\n const localeLinks = getLocaleLinks(ctx.pagePath, ctx.locale, ctx.i18nConfig, ctx.slugIndex);\n\n const showCurrent = node.showCurrent !== false;\n const showSeparator = node.showSeparator !== false;\n const showFlag = node.showFlag !== false;\n const displayType = node.displayType || 'nativeName';\n\n const localeIconMap = new Map<string, string>();\n for (const lc of ctx.i18nConfig.locales) {\n if (lc.icon) localeIconMap.set(lc.code, lc.icon);\n }\n\n // Build container style class\n const containerStyle = substituteVarsInStyle(\n resolveStyleTemplates(\n node.style as StyleObject | ResponsiveStyleObject | undefined,\n instanceProps\n ),\n ctx\n );\n const containerInteractive = substituteVarsInInteractive(\n resolveInteractiveStyleTemplates(\n node.interactiveStyles as InteractiveStyles | undefined,\n instanceProps\n ),\n ctx\n );\n\n let containerClass: string | undefined;\n if (containerStyle || (containerInteractive && containerInteractive.length > 0)) {\n const elementClass = withThemeSuffix(buildElementClass(ctx, node.label), ctx);\n const { primaryClass } = mapStylesToWebflow(\n elementClass, containerStyle, containerInteractive, ctx.breakpoints, ctx.responsiveScales\n );\n substituteVarsInStyleClass(primaryClass, ctx);\n containerClass = primaryClass.name;\n ctx.styleClasses.set(primaryClass.name, primaryClass);\n }\n\n const buildSubClass = (\n style: unknown,\n suffix: string\n ): string | undefined => {\n const resolved = substituteVarsInStyle(\n resolveStyleTemplates(\n style as StyleObject | ResponsiveStyleObject | undefined,\n instanceProps\n ),\n ctx\n );\n if (!resolved) return undefined;\n const className = withThemeSuffix(`${buildElementClass(ctx, node.label)}-${suffix}`, ctx);\n const { primaryClass } = mapStylesToWebflow(className, resolved, undefined, ctx.breakpoints, ctx.responsiveScales);\n substituteVarsInStyleClass(primaryClass, ctx);\n if (Object.keys(primaryClass.base).length === 0\n && !primaryClass.breakpoints\n && !primaryClass.pseudoStates) return undefined;\n ctx.styleClasses.set(primaryClass.name, primaryClass);\n return primaryClass.name;\n };\n\n const itemClassName = buildSubClass((node as any).itemStyle, 'item');\n const activeItemClassName = buildSubClass((node as any).activeItemStyle, 'item-active');\n const separatorClassName = buildSubClass((node as any).separatorStyle, 'separator');\n const flagClassName = buildSubClass((node as any).flagStyle, 'flag');\n\n const linkChildren: WebflowElement[] = [];\n for (let i = 0; i < localeLinks.length; i++) {\n const link = localeLinks[i];\n if (!showCurrent && link.isCurrent) continue;\n\n if (i > 0 && showSeparator) {\n const sep: WebflowElement = { tag: 'span' };\n if (separatorClassName) sep.className = separatorClassName;\n linkChildren.push(sep);\n }\n\n const anchor: WebflowElement = {\n tag: 'a',\n attributes: {\n href: link.path,\n hreflang: link.langTag,\n 'data-current': link.isCurrent ? 'true' : 'false',\n 'data-locale': link.locale,\n },\n };\n if (link.isCurrent && (activeItemClassName || itemClassName)) {\n anchor.className = itemClassName;\n if (activeItemClassName) anchor.comboClasses = [activeItemClassName];\n } else if (itemClassName) {\n anchor.className = itemClassName;\n }\n\n const innerChildren: WebflowElement[] = [];\n const icon = localeIconMap.get(link.locale);\n if (showFlag && icon) {\n const img: WebflowElement = {\n tag: 'img',\n attributes: { src: icon, alt: `${link.nativeName} flag` },\n };\n if (flagClassName) img.className = flagClassName;\n innerChildren.push(img);\n }\n\n let displayText: string;\n switch (displayType) {\n case 'code': displayText = link.locale.toUpperCase(); break;\n case 'name': displayText = link.name; break;\n case 'nativeName':\n default: displayText = link.nativeName; break;\n }\n innerChildren.push({ tag: 'div', textContent: displayText });\n anchor.children = innerChildren;\n\n linkChildren.push(anchor);\n }\n\n const wrapper: WebflowElement = {\n tag: 'div',\n attributes: { 'data-locale-list': 'true' },\n children: linkChildren,\n };\n if (containerClass) wrapper.className = containerClass;\n\n return [wrapper];\n}\n\n// ---------------------------------------------------------------------------\n// Children helper\n// ---------------------------------------------------------------------------\n\nasync function convertChildren(\n children: (ComponentNode | string)[] | string | ComponentNode | null | undefined,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement[]> {\n if (!children) return [];\n\n if (typeof children === 'string') {\n return nodeToWebflow(children, ctx, instanceProps);\n }\n\n if (Array.isArray(children)) {\n return nodeToWebflow(children as ComponentNode[], ctx, instanceProps);\n }\n\n // Single node\n return nodeToWebflow(children, ctx, instanceProps);\n}\n", "/**\n * Webflow Export Types\n * Defines the payload structure for Webflow Designer API consumption.\n */\n\nimport type { CMSFieldType } from '../../shared/types/cms';\n\n// ---------------------------------------------------------------------------\n// Style Classes\n// ---------------------------------------------------------------------------\n\n/**\n * Webflow Designer API breakpoint identifiers.\n * `main` is the desktop / default tier; `xxl|xl|large` are above-desktop;\n * `medium|small|tiny` are below-desktop.\n * Reference: https://developers.webflow.com/designer/reference/set-style-properties\n */\nexport type WebflowBreakpoint =\n | 'xxl'\n | 'xl'\n | 'large'\n | 'main'\n | 'medium'\n | 'small'\n | 'tiny';\n\n/**\n * Webflow Designer API pseudo-state identifiers.\n * Reference: https://developers.webflow.com/designer/reference/set-style-properties\n */\nexport type WebflowPseudoState =\n | 'noPseudo'\n | 'hover'\n | 'focus'\n | 'focus-visible'\n | 'focus-within'\n | 'active'\n | 'visited'\n | 'pressed'\n | 'before'\n | 'after'\n | 'placeholder'\n | 'empty'\n | 'first-child'\n | 'last-child'\n | 'nth-child(odd)'\n | 'nth-child(even)';\n\n/** CSS properties as a flat record */\nexport type CSSProperties = Record<string, string>;\n\n/** A named Webflow style class with responsive + pseudo-state overrides */\nexport interface WebflowStyleClass {\n /** Unique class name (e.g., \"navigation-hamburger\" for components, \"p-about-grid5\" for pages) */\n name: string;\n /** Base (Desktop) CSS properties */\n base: CSSProperties;\n /** Breakpoint overrides */\n breakpoints?: Partial<Record<WebflowBreakpoint, CSSProperties>>;\n /** Pseudo-state overrides */\n pseudoStates?: Partial<Record<WebflowPseudoState, CSSProperties>>;\n /** Combo class parent (if this is a variant class) */\n comboParent?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Elements\n// ---------------------------------------------------------------------------\n\n/** A Webflow element (DOM node) */\nexport interface WebflowElement {\n /** HTML tag (div, section, h1, a, img, etc.) */\n tag: string;\n /** Primary class name applied to this element */\n className?: string;\n /** Additional combo class names (for StyleMapping variants) */\n comboClasses?: string[];\n /** Inline text content (for text nodes) */\n textContent?: string;\n /**\n * Child elements. Plain strings are inline text runs (Webflow String nodes)\n * \u2014 used for mixed content like `<h1>foo <span>bar</span> baz</h1>`.\n */\n children?: Array<WebflowElement | string>;\n /** HTML attributes (src, alt, href, target, etc.) */\n attributes?: Record<string, string | number | boolean>;\n /**\n * Inline SVG markup for an embed node. The Webflow extension uploads this\n * as an `image/svg+xml` asset and emits an Image element \u2014 Webflow's\n * Designer API has no public method to set HtmlEmbed code content.\n */\n svgSource?: string;\n /** Source URL for an `<img>`-rooted embed; uploaded into Webflow as an asset. */\n imageSrc?: string;\n /** Alt text paired with `svgSource` / `imageSrc`. */\n imageAlt?: string;\n /**\n * Pre-fetched image bytes for `<img>` / embed elements whose source URL\n * the Webflow Designer iframe can't reach (e.g. project-relative paths\n * like `/images/foo.webp`, which would resolve against `designer.webflow.com`).\n * The extension uploads these directly via `createAsset` instead of\n * `fetch`-ing them.\n */\n imageDataBase64?: string;\n imageDataMime?: string;\n imageDataFileName?: string;\n /**\n * Embed payload that is neither SVG nor a single `<img>`. The extension\n * logs it and skips insertion (no equivalent Webflow API exists).\n */\n unsupportedEmbed?: { reason: string; preview: string; label?: string };\n /**\n * When set, this element is an instance of a Webflow Component registered\n * via `payload.components`. The extension appends the registered Component\n * (looked up by name) instead of building children. `tag`/`className`/etc.\n * remain set as a fallback for older extensions that don't understand\n * `componentRef`.\n */\n componentRef?: string;\n /**\n * Inline-expanded element tree to use when the Webflow Designer API can't\n * register Components (older runtime, missing `canCreateComponents`\n * permission). Mirrors the pre-promotion expansion of the Meno component so\n * the extension can render the same markup it does today.\n */\n inlineFallback?: WebflowElement[];\n /**\n * Bound CMS list marker. When set, this element is the synthetic wrapper\n * for `<list sourceType=\"collection\">` emitted in bound mode (see\n * `buildWebflowPayload({ bindCollectionLists: true })`). Value is the Meno\n * collection slug; the extension translates that to a Webflow collection\n * ID via the v1 sync ID map and inserts a `DynamoWrapper` preset.\n * Children are the *single* rendered item template (not N copies), with\n * field references preserved as `menoBind` markers below.\n */\n menoCollectionRef?: string;\n /**\n * Per-element CMS field binding markers. Captured at server emit time from\n * the source `{{field}}` template; the extension translates them into\n * `data-meno-bind-*` custom attributes on the inserted element and surfaces\n * a manual-bind checklist. Webflow's Designer API has no `setBinding` /\n * `setCollection` write surface yet (Apr 2026 \u2014 confirmed by Webflow\n * staff Plata + Selser on the developer forum), so the user does the\n * actual field binding once in the Designer UI after insertion.\n */\n menoBind?: {\n /** Bind this element's text content to this CMS field slug. */\n textField?: string;\n /** Map of attribute name \u2192 CMS field slug to bind. */\n attrFields?: Record<string, string>;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Bound-list sentinel (server-side internal \u2014 extension consumes `menoBind`)\n// ---------------------------------------------------------------------------\n\n/**\n * String sentinel inserted in place of a real CMS field value when emitting a\n * bound Collection List. The existing template engine is reused unchanged: a\n * synthetic placeholder item maps every schema field to\n * `${SENTINEL_PREFIX}${fieldSlug}${SENTINEL_SUFFIX}`, so `{{post.title}}`\n * resolves to that string. A post-walk then converts those strings into\n * `WebflowElement.menoBind` markers and replaces them with a readable\n * placeholder so the user can see what each child is meant to display.\n */\nexport const MENO_BIND_SENTINEL_PREFIX = '__MENO_BIND__:';\nexport const MENO_BIND_SENTINEL_SUFFIX = ':__';\nexport const MENO_BIND_SENTINEL_RE = /__MENO_BIND__:([^:]+):__/g;\nexport const MENO_BIND_SENTINEL_EXACT_RE = /^__MENO_BIND__:([^:]+):__$/;\n\n/** Synthetic tag for the bound Collection List wrapper. */\nexport const COLLECTION_LIST_TAG = '__collection_list__';\n\n/**\n * A Meno component promoted to a Webflow Component. The extension calls\n * `webflow.registerComponent` once per entry, then `parent.append(component)`\n * for every element in the page tree that has a matching `componentRef`.\n */\nexport interface WebflowComponentDef {\n /** Component name as it appears in Webflow's Components panel. */\n name: string;\n /** Element tree that becomes the Component's body. */\n elements: WebflowElement[];\n}\n\n// ---------------------------------------------------------------------------\n// Pages\n// ---------------------------------------------------------------------------\n\n/** A Webflow page */\nexport interface WebflowPage {\n /** Page title */\n title: string;\n /** URL slug (e.g., \"about\", \"blog/post-1\") */\n slug: string;\n /** Meta description */\n description?: string;\n /** Comma-separated keywords from page meta */\n keywords?: string;\n /** Open Graph title */\n ogTitle?: string;\n /** Open Graph description */\n ogDescription?: string;\n /** Open Graph image URL */\n ogImage?: string;\n /** Root elements of the page body */\n elements: WebflowElement[];\n /** Locale code */\n locale?: string;\n}\n\n/**\n * A component-level script bundled into the export. The Webflow extension\n * concatenates these into a single `<script>` injected at the end of `<body>`\n * so interactive Meno components (FAQ accordion, dropdowns, mobile menu) work\n * once published.\n */\nexport interface WebflowScript {\n /** Component name (used by the runtime to find element instances). */\n componentName: string;\n /** Component's JavaScript code (verbatim from `Component.js`). */\n code: string;\n /** Whether the source defined defineVars (true / explicit list / undefined). */\n defineVars?: true | string[];\n}\n\n// ---------------------------------------------------------------------------\n// CMS\n// ---------------------------------------------------------------------------\n\n/** Webflow CMS field type mapping */\nexport type WebflowFieldType =\n | 'PlainText'\n | 'RichText'\n | 'Number'\n | 'Switch'\n | 'Image'\n | 'Date'\n | 'Option'\n | 'File'\n | 'Reference';\n\n/** A field in a Webflow CMS collection */\nexport interface WebflowCMSField {\n /** Field display name */\n name: string;\n /** Field slug (machine name) */\n slug: string;\n /** Webflow field type */\n type: WebflowFieldType;\n /** Whether this field is required */\n required?: boolean;\n /** Options for Option type fields */\n options?: string[];\n /** Help text shown to editors in the Webflow CMS UI */\n helpText?: string;\n /**\n * For Reference fields: Meno collection slug of the target collection.\n * The sync orchestrator resolves this to a Webflow collection ID at create\n * time (pass 2 of the two-pass collection create \u2014 references can only be\n * added once their target exists).\n */\n referenceCollection?: string;\n /** True for multi-reference (array of IDs); false / undefined for single ref. */\n multiReference?: boolean;\n}\n\n/** A Webflow CMS collection definition */\nexport interface WebflowCMSCollection {\n /** Collection display name (plural) */\n name: string;\n /** Singular form of the display name (Webflow requires this for new collections) */\n singularName: string;\n /** Collection slug */\n slug: string;\n /** URL pattern for detail pages */\n urlPattern?: string;\n /** Field definitions */\n fields: WebflowCMSField[];\n /** Collection items */\n items: Record<string, unknown>[];\n}\n\n// ---------------------------------------------------------------------------\n// Assets\n// ---------------------------------------------------------------------------\n\n/** Reference to an asset that needs uploading to Webflow */\nexport interface WebflowAssetRef {\n /** Local file path relative to project root */\n localPath: string;\n /** Asset type */\n type: 'image' | 'font' | 'video' | 'file';\n /** File name */\n fileName: string;\n}\n\n// ---------------------------------------------------------------------------\n// Export Payload\n// ---------------------------------------------------------------------------\n\n/** Per-locale slug mapping for a single source page */\nexport interface WebflowSlugMap {\n /** The page's canonical id (e.g., \"about\", \"blog/post-1\") */\n pageId: string;\n /** Locale code \u2192 translated slug */\n slugs: Record<string, string>;\n}\n\n/** Complete Webflow export payload */\nexport interface WebflowExportPayload {\n /** Export format version */\n version: 1;\n /** Timestamp of export */\n exportedAt: string;\n /** All pages with their element trees */\n pages: WebflowPage[];\n /** All style class definitions */\n styles: WebflowStyleClass[];\n /** CMS collection definitions (if any) */\n cms: WebflowCMSCollection[];\n /** Asset references (images, fonts, etc.) */\n assets: WebflowAssetRef[];\n /** Per-locale slug translations so the consumer can route between locales */\n slugMappings?: WebflowSlugMap[];\n /** Component scripts \u2014 bundled at body end so components stay interactive. */\n scripts?: WebflowScript[];\n /**\n * Meno components promoted to Webflow Components (currently `Navigation`\n * and `Footer`). The extension registers each one before inserting page\n * elements; pages reference them via `WebflowElement.componentRef`.\n */\n components?: WebflowComponentDef[];\n /**\n * Concatenated `Component.css` sidecars (raw CSS) for components that ship\n * hand-written styles. Component-scoped rules \u2014 data-attribute selectors,\n * runtime state classes (e.g. `.is-open`), `:checked ~` siblings \u2014 aren't\n * representable in Webflow's class system and are silently lost when only\n * the per-element classes are emitted. The user pastes this into Site\n * Settings \u2192 Custom Code \u2192 Head Code along with the combo-class overrides.\n */\n componentCss?: string;\n /**\n * Raw CSS for `interactiveStyles` rules that Webflow's class system can't\n * represent natively \u2014 anything with a `prefix` (descendant/sibling\n * selector built from a state class on an ancestor), a class-style\n * `postfix` like `.is-open`, or breakpoint-divided pseudo states.\n * Pseudo-only rules with empty prefix continue to flow through Webflow's\n * `Style.setProperties({ pseudo })`. Pasted into Site Settings \u2192 Custom\n * Code \u2192 Head Code along with `componentCss`.\n */\n interactiveCss?: string;\n /**\n * Project i18n summary so the extension can show a locale picker. Always\n * present; single-locale projects still receive their lone locale here.\n * `selectedLocale` reflects which locale's pages were emitted in this\n * payload \u2014 the extension uses it to round-trip the picker selection.\n */\n i18n?: {\n defaultLocale: string;\n locales: Array<{ code: string; name: string; nativeName?: string }>;\n selectedLocale: string;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Map Meno CMS field type \u2192 Webflow field type */\nexport function mapCMSFieldType(menoType: CMSFieldType): WebflowFieldType {\n switch (menoType) {\n case 'string':\n return 'PlainText';\n case 'text':\n case 'rich-text':\n return 'RichText';\n case 'number':\n return 'Number';\n case 'boolean':\n return 'Switch';\n case 'image':\n return 'Image';\n case 'date':\n return 'Date';\n case 'select':\n return 'Option';\n case 'file':\n return 'File';\n case 'reference':\n return 'Reference';\n default:\n return 'PlainText';\n }\n}\n", "/**\n * Webflow Style Mapper\n * Converts Meno styles (ResponsiveStyleObject + InteractiveStyles) into\n * Webflow named style classes with breakpoint and pseudo-state overrides.\n */\n\nimport type {\n StyleObject,\n ResponsiveStyleObject,\n StyleMapping,\n InteractiveStyles,\n InteractiveStyleRule,\n} from '../../shared/types/styles';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport type { WebflowStyleClass, WebflowBreakpoint, WebflowPseudoState, CSSProperties } from './types';\nimport {\n type ResponsiveScales,\n type CSSPropertyType,\n getScaleMultiplier,\n scalePropertyValue,\n} from '../../shared/responsiveScaling';\nimport { isCssNamedColor } from '../../shared/cssNamedColors';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** CSS properties that accept unitless numeric values */\nconst UNITLESS_PROPERTIES = new Set([\n 'opacity', 'z-index', 'flex-grow', 'flex-shrink', 'flex',\n 'order', 'orphans', 'widows', 'column-count', 'font-weight',\n 'tab-size',\n]);\n\n/**\n * CSS properties that accept time values (`0`, `0s`, `0ms`). Excluded from\n * the bare-zero \u2192 `0px` normalization below \u2014 `transition-duration: 0px`\n * would be invalid and silently dropped.\n */\nconst TIME_PROPERTIES = new Set([\n 'transition-duration', 'transition-delay',\n 'animation-duration', 'animation-delay',\n]);\n\n/**\n * Webflow's class system rejects bare `0` for length properties \u2014 it expects\n * a unit. Numeric `0` already flows through as `0px` (see `styleObjectToCSS`),\n * but string `'0'` (from authored `marginTop: '0'`, shorthand expansion of\n * `margin: 0 auto`, etc.) needs the same treatment. Unitless props (opacity,\n * z-index) and time props (transition-duration) keep the bare `0`.\n */\nfunction normalizeZero(cssProp: string, cssValue: string): string {\n if (cssValue !== '0') return cssValue;\n if (UNITLESS_PROPERTIES.has(cssProp)) return cssValue;\n if (TIME_PROPERTIES.has(cssProp)) return cssValue;\n return '0px';\n}\n\n/**\n * Color properties whose authored value can be a bare token (e.g. `\"primary\"`)\n * that Meno's runtime auto-wraps into `var(--primary)` (see\n * `cssGeneration.ts` `styleObjectToCSS`). Mirrored here so the Webflow exporter\n * doesn't ship literal `\"background-color: primary\"` to the Designer \u2014 that\n * value is invalid CSS and Webflow renders nothing. After wrapping, the\n * second-pass `substituteVarsInStyleClass` in `nodeToWebflow` resolves the\n * `var(--\u2026)` against the project's theme/variable maps.\n */\nconst COLOR_PROPS_CAMEL = new Set(['color', 'backgroundColor', 'borderColor']);\n\n/**\n * If `value` is a bare Meno color token on a color-accepting property, wrap it\n * in `var(--\u2026)`. Hex / rgb / hsl / any functional notation / already-wrapped\n * `var(...)` / CSS-named keywords (red, transparent, currentColor, inherit, \u2026)\n * pass through unchanged.\n */\nfunction maybeWrapColorVar(camelProp: string, value: string): string {\n if (!COLOR_PROPS_CAMEL.has(camelProp)) return value;\n if (!value) return value;\n if (value.startsWith('#')) return value;\n if (value.startsWith('var(')) return value;\n if (value.includes('(')) return value;\n if (isCssNamedColor(value)) return value;\n return `var(--${value})`;\n}\n\nfunction isStyleMapping(value: unknown): value is StyleMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as StyleMapping)._mapping === true\n );\n}\n\nfunction isResponsiveStyle(\n style: StyleObject | ResponsiveStyleObject\n): style is ResponsiveStyleObject {\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n/**\n * Convert a camelCase CSS property to kebab-case\n */\nfunction toKebabCase(prop: string): string {\n return prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\n\n/**\n * Split a CSS value at top-level whitespace, leaving parenthesised groups\n * (`var(--x, 16px)`, `calc(1rem + 2px)`) intact as a single token.\n */\nfunction splitTopLevel(value: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let buf = '';\n for (const ch of value.trim()) {\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n if (depth === 0 && /\\s/.test(ch)) {\n if (buf) { out.push(buf); buf = ''; }\n continue;\n }\n buf += ch;\n }\n if (buf) out.push(buf);\n return out;\n}\n\n/**\n * Expand `margin` / `padding` / `gap` shorthand values into the longhand\n * properties Webflow's class system models directly (per-side margin/padding,\n * per-axis row-gap/column-gap). Webflow drops or mis-renders these shorthands\n * when written via `Style.setProperties`, so every Webflow-bound style flows\n * through this expansion at the CSS-conversion boundary.\n *\n * Returns `null` when the property isn't a handled shorthand or the value\n * shape doesn't match (1\u20134 tokens for margin/padding, 1\u20132 for gap). Callers\n * fall through to passing the value as-is in those cases.\n */\nfunction expandShorthand(cssProp: string, cssValue: string): CSSProperties | null {\n if (cssProp !== 'margin' && cssProp !== 'padding' && cssProp !== 'gap') {\n return null;\n }\n const parts = splitTopLevel(cssValue);\n\n if (cssProp === 'gap') {\n if (parts.length === 1) {\n const v = normalizeZero('row-gap', parts[0]!);\n return { 'row-gap': v, 'column-gap': v };\n }\n if (parts.length === 2) {\n return {\n 'row-gap': normalizeZero('row-gap', parts[0]!),\n 'column-gap': normalizeZero('column-gap', parts[1]!),\n };\n }\n return null;\n }\n\n // margin / padding\n let top: string, right: string, bottom: string, left: string;\n if (parts.length === 1) {\n top = right = bottom = left = parts[0]!;\n } else if (parts.length === 2) {\n top = bottom = parts[0]!;\n right = left = parts[1]!;\n } else if (parts.length === 3) {\n top = parts[0]!;\n right = left = parts[1]!;\n bottom = parts[2]!;\n } else if (parts.length === 4) {\n [top, right, bottom, left] = parts as [string, string, string, string];\n } else {\n return null;\n }\n return {\n [`${cssProp}-top`]: normalizeZero(`${cssProp}-top`, top),\n [`${cssProp}-right`]: normalizeZero(`${cssProp}-right`, right),\n [`${cssProp}-bottom`]: normalizeZero(`${cssProp}-bottom`, bottom),\n [`${cssProp}-left`]: normalizeZero(`${cssProp}-left`, left),\n };\n}\n\n/**\n * Convert a flat StyleObject to CSS properties, skipping StyleMappings.\n * `margin`, `padding`, and `gap` shorthands are expanded in place (see\n * `expandShorthand`) so Webflow's class system receives only longhands.\n * Iteration order follows CSS cascade \u2014 a longhand declared after a\n * shorthand wins; declared before, the shorthand's expansion clobbers it.\n */\nfunction styleObjectToCSS(style: StyleObject): CSSProperties {\n const css: CSSProperties = {};\n for (const [prop, value] of Object.entries(style)) {\n if (isStyleMapping(value)) continue;\n if (value === '' || value === undefined || value === null) continue;\n if (typeof value === 'boolean' || typeof value === 'object') continue;\n const cssProp = toKebabCase(prop);\n let cssValue: string;\n if (typeof value === 'number') {\n if (isNaN(value)) continue;\n cssValue = UNITLESS_PROPERTIES.has(cssProp) ? String(value) : `${value}px`;\n } else {\n cssValue = maybeWrapColorVar(prop, String(value));\n }\n const expanded = expandShorthand(cssProp, cssValue);\n if (expanded) {\n Object.assign(css, expanded);\n } else {\n css[cssProp] = normalizeZero(cssProp, cssValue);\n }\n }\n return css;\n}\n\n/**\n * Extract all StyleMappings from a style object (flat or responsive)\n */\nfunction collectStyleMappings(\n style: StyleObject | ResponsiveStyleObject | undefined\n): Array<{ property: string; mapping: StyleMapping }> {\n if (!style) return [];\n const result: Array<{ property: string; mapping: StyleMapping }> = [];\n\n if (isResponsiveStyle(style)) {\n // Only collect from base \u2014 mappings apply across breakpoints\n const base = (style as ResponsiveStyleObject).base;\n if (base) {\n for (const [prop, value] of Object.entries(base)) {\n if (isStyleMapping(value)) {\n result.push({ property: prop, mapping: value });\n }\n }\n }\n } else {\n for (const [prop, value] of Object.entries(style)) {\n if (isStyleMapping(value)) {\n result.push({ property: prop, mapping: value });\n }\n }\n }\n return result;\n}\n\n/**\n * Map interactive style postfix to a Webflow pseudo-state.\n * Order matters \u2014 longer suffixes (`:focus-visible`, `:focus-within`,\n * `:nth-child(odd)`) must be tested before their substring matches.\n */\nexport function postfixToPseudoState(postfix: string): WebflowPseudoState | null {\n // Pseudo-class style: ':hover', ':focus-visible', etc.\n if (postfix.includes(':focus-visible')) return 'focus-visible';\n if (postfix.includes(':focus-within')) return 'focus-within';\n if (postfix.includes(':nth-child(odd)')) return 'nth-child(odd)';\n if (postfix.includes(':nth-child(even)')) return 'nth-child(even)';\n if (postfix.includes(':first-child')) return 'first-child';\n if (postfix.includes(':last-child')) return 'last-child';\n if (postfix.includes(':placeholder')) return 'placeholder';\n if (postfix.includes(':empty')) return 'empty';\n if (postfix.includes(':before')) return 'before';\n if (postfix.includes(':after')) return 'after';\n if (postfix.includes(':hover')) return 'hover';\n if (postfix.includes(':focus')) return 'focus';\n if (postfix.includes(':active')) return 'active';\n if (postfix.includes(':visited')) return 'visited';\n if (postfix.includes(':pressed')) return 'pressed';\n // Pseudo-element style: '::before', '::after', '::placeholder'\n if (postfix.includes('::before')) return 'before';\n if (postfix.includes('::after')) return 'after';\n if (postfix.includes('::placeholder')) return 'placeholder';\n return null;\n}\n\n/**\n * Whether an interactive-styles rule fits Webflow's class-system surface.\n * \"Yes\" means: empty `prefix`, a known pseudo-state `postfix`, and a\n * non-responsive `style` (no breakpoint subdivision). Webflow's\n * `Style.setProperties({ pseudo })` covers exactly this case.\n *\n * Anything else (descendant selectors via `prefix`, class-style postfixes\n * like `.is-open`, responsive pseudos that need media queries) gets routed\n * to the manual-paste `interactiveCss` bundle via `generateInteractiveCSS`.\n */\nexport function isWebflowHandledRule(rule: InteractiveStyleRule): boolean {\n if (rule.prefix && rule.prefix.trim().length > 0) return false;\n if (!rule.postfix) return false;\n if (postfixToPseudoState(rule.postfix) === null) return false;\n const s = rule.style as ResponsiveStyleObject;\n if (!s || typeof s !== 'object') return false;\n const responsiveKeys = Object.keys(s).filter((k) => k !== 'base');\n return responsiveKeys.length === 0;\n}\n\n/**\n * Pick the Webflow breakpoint tier closest to a Meno breakpoint by its\n * max-width threshold. Meno's responsive cascade is max-width based, and\n * Webflow's tiers below `main` are also max-width \u2014 so we map the threshold\n * into Webflow's bucket.\n *\n * Webflow tiers (max-width values per Webflow's defaults):\n * tiny < 480, small 480-767, medium 768-991, main 992-1279,\n * large 1280-1439, xl 1440-1919, xxl \u2265 1920.\n */\nfunction widthToWebflowBreakpoint(maxWidthPx: number): WebflowBreakpoint {\n if (maxWidthPx < 480) return 'tiny';\n if (maxWidthPx < 768) return 'small';\n if (maxWidthPx < 992) return 'medium';\n if (maxWidthPx < 1280) return 'main';\n if (maxWidthPx < 1440) return 'large';\n if (maxWidthPx < 1920) return 'xl';\n return 'xxl';\n}\n\n/**\n * Resolve a Meno breakpoint name to its Webflow tier. The two well-known\n * names (`tablet`, `mobile`) map to fixed tiers; custom names route by their\n * configured numeric width via `widthToWebflowBreakpoint`. Defaults if a\n * project's breakpoints config omits the entry.\n */\nfunction menoBreakpointToWebflow(\n bpName: string,\n breakpoints: BreakpointConfig\n): WebflowBreakpoint {\n if (bpName === 'tablet') return 'medium';\n if (bpName === 'mobile') return 'small';\n const entry = breakpoints[bpName];\n if (entry && typeof entry.breakpoint === 'number') {\n return widthToWebflowBreakpoint(entry.breakpoint);\n }\n // Unknown name with no width info \u2014 default to `main` (no-op).\n return 'main';\n}\n\n/**\n * Merge a CSS map into the breakpoints record on a WebflowStyleClass under\n * the given Webflow tier, layering on top of anything already there.\n */\nfunction mergeIntoBreakpoint(\n cls: WebflowStyleClass,\n tier: WebflowBreakpoint,\n css: CSSProperties\n): void {\n if (!cls.breakpoints) cls.breakpoints = {};\n cls.breakpoints[tier] = { ...cls.breakpoints[tier], ...css };\n}\n\n/** Convert a kebab-case CSS property to camelCase for scale-category lookup. */\nfunction kebabToCamel(s: string): string {\n return s.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/**\n * For each scalable property in the class's base map, fill in auto-scaled\n * values at every Meno breakpoint that doesn't already carry an explicit\n * value for that property. Mirrors what Meno's runtime CSS generator does\n * for utility classes, so the Webflow site renders the same numbers per\n * breakpoint as the Meno preview.\n *\n * Skips values that still contain `var(--\u2026)` \u2014 the variable-aware pass in\n * `nodeToWebflow` handles those before this runs (it expands per-breakpoint\n * variable values into authored breakpoint entries, which take precedence\n * over global category scaling here).\n */\nexport function applyAutoScaling(\n cls: WebflowStyleClass,\n breakpoints: BreakpointConfig,\n responsiveScales: ResponsiveScales | undefined\n): void {\n if (!responsiveScales?.enabled) return;\n const baseRef = responsiveScales.baseReference || 16;\n\n for (const [prop, baseValue] of Object.entries(cls.base)) {\n if (!baseValue || baseValue.includes('var(--')) continue;\n const camelProp = kebabToCamel(prop) as CSSPropertyType;\n\n for (const [bpName, bpEntry] of Object.entries(breakpoints)) {\n if (!bpEntry) continue;\n const scale = getScaleMultiplier(responsiveScales, camelProp, bpName);\n if (scale === null) continue;\n const scaled = scalePropertyValue(baseValue, baseRef, scale);\n if (scaled === null || scaled === baseValue) continue;\n\n const tier = menoBreakpointToWebflow(bpName, breakpoints);\n if (!cls.breakpoints) cls.breakpoints = {};\n const bucket = cls.breakpoints[tier] || {};\n // Author override wins \u2014 only fill missing entries.\n if (bucket[prop] !== undefined) continue;\n bucket[prop] = scaled;\n cls.breakpoints[tier] = bucket;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main Mapper\n// ---------------------------------------------------------------------------\n\nexport interface StyleMapperResult {\n /** The primary style class for this element */\n primaryClass: WebflowStyleClass;\n /**\n * Combo classes carrying *only* the deltas for the current instance's\n * non-default StyleMapping prop values. Already filtered by the mapper \u2014\n * the caller attaches every entry to the element verbatim.\n */\n comboClasses: WebflowStyleClass[];\n}\n\nexport interface MapStylesOptions {\n /**\n * Resolved props for the current component instance. Only the value the\n * mapping actually resolves to (`instanceProps[mapping.prop]`) becomes a\n * combo on this element; other values are ignored. When omitted, no\n * combos are emitted (page elements without a prop context).\n */\n instanceProps?: Record<string, unknown>;\n /**\n * Default values from the enclosing component's interface. When provided,\n * each StyleMapping's default-value entry is baked into `primaryClass.base`\n * so the primary represents the default-prop visual; combos cover only the\n * non-default deltas. Omit for page-level elements (defaults unavailable).\n */\n componentDefaults?: Record<string, unknown>;\n /**\n * Suffix appended to combo class names so two placements that resolve their\n * `var(--\u2026)` refs against different ancestor themes occupy distinct map\n * slots in `ctx.styleClasses`. Without this, the default theme's combo and a\n * non-default theme's combo collapse onto the same name and the last-written\n * one wins \u2014 silently corrupting whichever placement was processed earlier.\n * Caller passes e.g. `'-theme-dark'`; empty/undefined means default theme,\n * no suffix added. Caller is responsible for sanitizing the theme name.\n */\n themeSuffix?: string;\n}\n\n/**\n * Convert Meno element styles to Webflow style classes.\n *\n * @param className - Element class name (e.g., \"c_navigation_hamburger\")\n * @param style - Element's responsive style object\n * @param interactiveStyles - Element's interactive (hover/focus/etc.) styles\n * @param breakpoints - Project breakpoint configuration\n * @param responsiveScales - When `enabled`, auto-fill scaled per-breakpoint\n * values for scalable properties not explicitly authored at that\n * breakpoint (mirrors Meno's runtime CSS generator).\n * @param options - Instance-aware combo emission. See `MapStylesOptions`.\n */\nexport function mapStylesToWebflow(\n className: string,\n style: StyleObject | ResponsiveStyleObject | undefined,\n interactiveStyles: InteractiveStyles | undefined,\n breakpoints: BreakpointConfig,\n responsiveScales?: ResponsiveScales,\n options?: MapStylesOptions\n): StyleMapperResult {\n const instanceProps = options?.instanceProps;\n const componentDefaults = options?.componentDefaults;\n const themeSuffix = options?.themeSuffix ?? '';\n // Convert underscores to dashes for Webflow class naming convention\n const webflowClassName = className.replace(/_/g, '-');\n\n const primaryClass: WebflowStyleClass = {\n name: webflowClassName,\n base: {},\n };\n\n // --- Base + breakpoint styles ---\n // Meno's `base` is the desktop default \u2192 Webflow's `main` tier (set as\n // `primaryClass.base` so the consumer writes it without a breakpoint\n // option). Named tiers (`tablet`, `mobile`) and custom breakpoints route\n // to Webflow tiers via `menoBreakpointToWebflow`.\n if (style) {\n if (isResponsiveStyle(style)) {\n const responsive = style as ResponsiveStyleObject;\n\n if (responsive.base) {\n primaryClass.base = styleObjectToCSS(responsive.base);\n }\n\n for (const [bpName, bpStyle] of Object.entries(responsive)) {\n if (!bpStyle || bpName === 'base') continue;\n const css = styleObjectToCSS(bpStyle);\n if (Object.keys(css).length === 0) continue;\n const tier = menoBreakpointToWebflow(bpName, breakpoints);\n mergeIntoBreakpoint(primaryClass, tier, css);\n }\n } else {\n // Flat style object \u2014 treat as base/main.\n primaryClass.base = styleObjectToCSS(style as StyleObject);\n }\n }\n\n // --- Interactive styles (hover, focus, \u2026) ---\n // Pseudo-state postfixes with empty prefix and non-responsive ruleStyle go\n // to `primaryClass.pseudoStates` so Webflow's class system applies them via\n // `Style.setProperties({ pseudo })`. Anything else (prefix-built selectors,\n // class-style postfixes, breakpoint-divided pseudos) is collected into\n // `interactiveCss` server-side via `generateInteractiveCSS` \u2014 see\n // `buildWebflow.ts` and `isWebflowHandledRule` below.\n if (interactiveStyles && interactiveStyles.length > 0) {\n for (const rule of interactiveStyles) {\n if (!isWebflowHandledRule(rule)) continue;\n\n const baseProps: CSSProperties = isResponsiveStyle(rule.style as StyleObject | ResponsiveStyleObject)\n ? styleObjectToCSS(((rule.style as ResponsiveStyleObject).base) || {})\n : styleObjectToCSS(rule.style as StyleObject);\n\n // Skip empty rules \u2014 writing an empty pseudoStates entry triggers a\n // destructive wipe in `applyStyleScope` on re-import (it diffs\n // `existing` against `next={}` and removes every property).\n if (Object.keys(baseProps).length === 0) continue;\n\n const pseudoState = postfixToPseudoState(rule.postfix!);\n if (!pseudoState) continue;\n\n if (!primaryClass.pseudoStates) primaryClass.pseudoStates = {};\n primaryClass.pseudoStates[pseudoState] = {\n ...primaryClass.pseudoStates[pseudoState],\n ...baseProps,\n };\n }\n }\n\n // --- Default-prop bake + single consolidated combo for the instance ---\n // Webflow combo classes only make sense as deltas: the primary carries the\n // default-prop visual; one combo per element holds the merged deltas for\n // every non-default StyleMapping prop value the instance authored. Folding\n // every mapped delta into one combo (rather than one combo per prop) means\n // each element wears exactly one extra class regardless of how many props\n // its component declares \u2014 simpler in the Webflow Designer and avoids\n // fan-out where two unrelated instances accidentally share a delta combo.\n const comboClasses: WebflowStyleClass[] = [];\n const mappings = collectStyleMappings(style);\n\n const comboCss: CSSProperties = {};\n const comboNameParts: string[] = [];\n\n for (const { property, mapping } of mappings) {\n const defaultValue = componentDefaults?.[mapping.prop];\n const defaultKey = defaultValue != null ? String(defaultValue) : undefined;\n\n // Bake the default-value resolution into the primary class's base so the\n // primary stands on its own for default-prop instances. Values authored\n // outside the mapping (declared on `style.fontSize` directly) already\n // landed in `primaryClass.base` via `styleObjectToCSS`.\n if (defaultKey !== undefined && defaultKey in mapping.values) {\n const defaultCss = mappingValueToCSS(property, mapping.values[defaultKey]);\n if (defaultCss) {\n // StyleMapping bakes feed into the primary's `main` tier (its `base`),\n // matching how `styleObjectToCSS` handles non-mapped properties.\n primaryClass.base = { ...primaryClass.base, ...defaultCss };\n }\n }\n\n if (!instanceProps) continue;\n const instanceValue = instanceProps[mapping.prop];\n if (instanceValue == null) continue;\n const instanceKey = String(instanceValue);\n if (instanceKey === defaultKey) continue; // covered by primary\n if (!(instanceKey in mapping.values)) continue; // unknown value\n const css = mappingValueToCSS(property, mapping.values[instanceKey]);\n if (!css) continue;\n\n Object.assign(comboCss, css);\n const part = `${sanitizeClassName(mapping.prop)}-${sanitizeClassName(instanceKey)}`;\n // Same prop appears once per mapping (e.g. `version` on both\n // `backgroundColor` and `color` Button mappings) \u2014 dedupe so the combo\n // name stays `is-version-secondary` rather than repeating the segment.\n if (!comboNameParts.includes(part)) comboNameParts.push(part);\n }\n\n if (comboNameParts.length > 0 && Object.keys(comboCss).length > 0) {\n // Sort so different declaration orders of the same prop set produce the\n // same combo name \u2014 instances with identical variants share one class.\n comboNameParts.sort();\n comboClasses.push({\n name: `is-${comboNameParts.join('-')}${themeSuffix}`,\n base: comboCss,\n comboParent: webflowClassName,\n });\n }\n\n // --- Auto-scaling: fill in scaled values at each Meno breakpoint for any\n // scalable base property the author hasn't already overridden. Variable\n // refs (`var(--\u2026)`) are skipped here \u2014 `nodeToWebflow` expands them with\n // breakpoint awareness before this runs, so authored breakpoint values\n // already capture the variable's per-breakpoint scaling.\n applyAutoScaling(primaryClass, breakpoints, responsiveScales);\n for (const combo of comboClasses) {\n applyAutoScaling(combo, breakpoints, responsiveScales);\n }\n\n return { primaryClass, comboClasses };\n}\n\n/**\n * Convert a single StyleMapping value (already looked up from `mapping.values`)\n * into a CSSProperties entry, mirroring `styleObjectToCSS`'s unit handling\n * and shorthand expansion. Returns `null` when the value is empty/missing.\n */\nfunction mappingValueToCSS(\n property: string,\n rawValue: string | number | undefined | null\n): CSSProperties | null {\n if (rawValue === '' || rawValue === undefined || rawValue === null) return null;\n const cssProp = toKebabCase(property);\n const cssValueStr = typeof rawValue === 'number'\n ? (UNITLESS_PROPERTIES.has(cssProp) ? String(rawValue) : `${rawValue}px`)\n : maybeWrapColorVar(property, String(rawValue));\n return expandShorthand(cssProp, cssValueStr) ?? { [cssProp]: normalizeZero(cssProp, cssValueStr) };\n}\n\n/**\n * Sanitize a string for use as a CSS class name segment\n */\nexport function sanitizeClassName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/**\n * Build a single combo class from a component instance's style /\n * interactiveStyles overrides \u2014 the `acceptsStyles` analogue of the\n * prop-mapped combo in `mapStylesToWebflow`.\n *\n * Every override the instance authored \u2014 flat or responsive base values,\n * per-breakpoint values, Webflow-handled pseudo-state values \u2014 is folded\n * into one combo's `.base` / `.breakpoints` / `.pseudoStates`. The caller\n * supplies a stable name (typically derived from the instance's outer\n * location so two distinct instances don't collide) and the body root's\n * primary class for `comboParent`. Returns `null` if no overrides survive\n * the filters.\n */\nexport function buildInstanceStyleCombo(\n comboName: string,\n rootClassName: string,\n style: StyleObject | ResponsiveStyleObject | undefined,\n interactiveStyles: InteractiveStyles | undefined,\n breakpoints: BreakpointConfig,\n responsiveScales?: ResponsiveScales,\n): WebflowStyleClass | null {\n const base: CSSProperties = {};\n const bps: Partial<Record<WebflowBreakpoint, CSSProperties>> = {};\n const pseudos: Partial<Record<WebflowPseudoState, CSSProperties>> = {};\n\n if (style) {\n if (isResponsiveStyle(style)) {\n const responsive = style as ResponsiveStyleObject;\n if (responsive.base) Object.assign(base, styleObjectToCSS(responsive.base));\n for (const [bpName, bpStyle] of Object.entries(responsive)) {\n if (!bpStyle || bpName === 'base') continue;\n const css = styleObjectToCSS(bpStyle);\n if (Object.keys(css).length === 0) continue;\n const tier = menoBreakpointToWebflow(bpName, breakpoints);\n bps[tier] = { ...bps[tier], ...css };\n }\n } else {\n Object.assign(base, styleObjectToCSS(style as StyleObject));\n }\n }\n\n if (interactiveStyles && interactiveStyles.length > 0) {\n for (const rule of interactiveStyles) {\n if (!isWebflowHandledRule(rule)) continue;\n const ruleStyle = rule.style as StyleObject | ResponsiveStyleObject;\n const flat = isResponsiveStyle(ruleStyle)\n ? ((ruleStyle as ResponsiveStyleObject).base as StyleObject | undefined)\n : (ruleStyle as StyleObject);\n if (!flat) continue;\n const css = styleObjectToCSS(flat);\n if (Object.keys(css).length === 0) continue;\n const pseudo = postfixToPseudoState(rule.postfix!);\n if (!pseudo) continue;\n pseudos[pseudo] = { ...pseudos[pseudo], ...css };\n }\n }\n\n if (\n Object.keys(base).length === 0\n && Object.keys(bps).length === 0\n && Object.keys(pseudos).length === 0\n ) return null;\n\n const cls: WebflowStyleClass = {\n name: comboName,\n base,\n comboParent: rootClassName,\n };\n if (Object.keys(bps).length > 0) cls.breakpoints = bps;\n if (Object.keys(pseudos).length > 0) cls.pseudoStates = pseudos;\n applyAutoScaling(cls, breakpoints, responsiveScales);\n return cls;\n}\n", "/**\n * Webflow Designer Extension template wrapper.\n *\n * The Webflow Designer injects the `webflow` API global only when extension\n * HTML is wrapped in a template fetched from `webflow-ext.com`. This module\n * fetches the template once per process, caches it, then splices the\n * extension's <head>/<body> content into the `{{ui}}` placeholder.\n *\n * Used by both the studio's mounted `/webflow-extension/*` route and the\n * standalone serve.ts on port 1337, so they stay in sync automatically.\n */\n\nimport { readFile } from 'fs/promises';\n\nlet cachedTemplate: string | null = null;\n\nasync function getWebflowTemplate(appName: string): Promise<string> {\n if (cachedTemplate) return cachedTemplate;\n const url = `https://webflow-ext.com/template/v2?name=${encodeURIComponent(appName)}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch Webflow template: ${res.status}`);\n cachedTemplate = await res.text();\n return cachedTemplate;\n}\n\n/**\n * Wrap extension HTML in the Webflow Designer template.\n * `manifestPath` points to the extension's `webflow.json` \u2014 its `name` field\n * is forwarded as the `?name=` query param to webflow-ext.com.\n *\n * On any failure (manifest read, template fetch) we log a warning and return\n * the raw HTML, matching the prior behavior of the two duplicate copies.\n */\nexport async function wrapInWebflowTemplate(html: string, manifestPath: string): Promise<string> {\n try {\n const manifest = JSON.parse(await readFile(manifestPath, 'utf-8'));\n const template = await getWebflowTemplate(manifest.name || 'Meno Import');\n\n const headMatch = html.match(/<head[^>]*>([\\s\\S]*?)<\\/head>/i);\n const bodyMatch = html.match(/<body[^>]*>([\\s\\S]*?)<\\/body>/i);\n const headContent = headMatch ? headMatch[1] : '';\n const bodyContent = bodyMatch ? bodyMatch[1] : '';\n\n return template.replace('{{ui}}', headContent + bodyContent);\n } catch (err: any) {\n console.warn('Could not fetch Webflow wrapper template:', err.message);\n return html;\n }\n}\n", "/**\n * meno-core/server exports\n * Core server-side utilities for SSR and read APIs\n * Does NOT include editor-specific routes (that's in @meno/studio)\n */\n\n// Server factory\nexport { createServer, type ServerConfig } from './createServer';\n\n// SSR Rendering\nexport * from './ssrRenderer';\n\n// Build error overlay for static server\nexport { generateBuildErrorPage, type BuildError, type BuildErrorsData } from './ssr/buildErrorOverlay';\n\n// Services\nexport { PageService } from './services/pageService';\nexport { ComponentService, type ComponentInfo } from './services/componentService';\nexport { CMSService, type ReferenceLocation } from './services/cmsService';\nexport { configService, ConfigService } from './services/configService';\nexport { ColorService, colorService } from './services/ColorService';\nexport { VariableService, variableService } from './services/VariableService';\nexport { EnumService, enumService } from './services/EnumService';\n\n// Providers\nexport { FileSystemPageProvider } from './providers/fileSystemPageProvider';\nexport { FileSystemCMSProvider } from './providers/fileSystemCMSProvider';\n\n// CMS interfaces\nexport type { CMSProvider, CMSSchemaInfo } from '../shared/interfaces/contentProvider';\n\n// Core routes\nexport { handleCoreApiRoutes, type CoreRouteContext } from './routes/api/core-routes';\n\n// CMS read routes (GET handlers)\nexport { handleCollectionsRoute, handleCollectionSchemaRoute, handleItemsRoute, handleItemRoute } from './routes/api/cms';\n\n// Route utilities\nexport { jsonResponse, errorResponse } from './routes/api/shared';\n\n// Note: Write route handlers moved to @meno/studio:\n// - handleSavePageRoute\n// - handleSaveComponentRoute, handleSaveComponentJavaScriptRoute, handleSaveComponentCSSRoute\n// - handleSaveConfigRoute, handleSaveColorsRoute\n// - handleCreateCollectionRoute, handleCreateItemRoute, handleUpdateItemRoute, handleDeleteItemRoute\n\n// WebSocket\nexport { WebSocketManager } from './websocketManager';\n\n// Page cache\nexport { PageCache } from './pageCache';\n\n// Project context\nexport * from './projectContext';\n\n// File watcher\nexport { FileWatcherService } from './services/fileWatcherService';\n\n// Migration\nexport { migrateTemplatesDirectory } from './migrateTemplates';\n\n// Static build\nexport { buildStaticPages } from '../../build-static';\n\n// Astro export\nexport { buildAstroProject } from '../../build-astro';\n\n// Webflow export\nexport { buildWebflowPayload, wrapInWebflowTemplate } from './webflow';\nexport type {\n WebflowExportPayload,\n WebflowPage,\n WebflowElement,\n WebflowStyleClass,\n} from './webflow';\n\n// Utilities\nexport * from './utils';\n\n// Middleware\nexport * from './middleware';\n\n// Font loader (legacy config loader for server entry points)\nexport { loadProjectConfig, resetFontConfig } from '../shared/fontLoader';\n\n// Constants\nexport { SERVE_PORT, SERVER_PORT, HMR_ROUTE, MAX_PORT_ATTEMPTS } from '../shared/constants';\n\n// CSS generators\nexport { generateVariablesCSS } from './cssGenerator';\n\n// Runtime abstraction\nexport * from './runtime';\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Astro Export Build Script\n * Renders all pages via the SSR pipeline, then wraps them as Astro page files\n * with a shared layout, global CSS, and optional CMS content collections.\n */\n\nimport { existsSync, readdirSync, mkdirSync, rmSync, statSync, copyFileSync, writeFileSync } from \"fs\";\nimport { writeFile, readFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { createHash } from \"crypto\";\nimport { inspect, minifyJS as runtimeMinifyJS } from './lib/server/runtime';\nimport {\n loadJSONFile,\n loadComponentDirectory,\n mapPageNameToPath,\n parseJSON,\n loadI18nConfig\n} from \"./lib/server/jsonLoader\";\nimport { generateSSRHTML } from \"./lib/server/ssrRenderer\";\nimport type { SSRHTMLResult } from \"./lib/server/ssr/htmlGenerator\";\nimport { projectPaths } from \"./lib/server/projectContext\";\nimport { loadProjectConfig, generateFontCSS, generateFontPreloadTags } from \"./lib/shared/fontLoader\";\nimport { FileSystemCMSProvider } from \"./lib/server/providers/fileSystemCMSProvider\";\nimport { CMSService } from \"./lib/server/services/cmsService\";\nimport { isI18nValue, resolveI18nValue } from \"./lib/shared/i18n\";\nimport type { ComponentDefinition, JSONPage, CMSSchema, CMSItem, I18nConfig } from \"./lib/shared/types\";\nimport type { CMSFieldDefinition } from \"./lib/shared/types/cms\";\nimport { isItemDraftForLocale } from \"./lib/shared/types\";\nimport type { SlugMap } from \"./lib/shared/slugTranslator\";\nimport { renderPageSSR } from \"./lib/server/ssr/ssrRenderer\";\nimport { generateThemeColorVariablesCSS, generateVariablesCSS } from \"./lib/server/cssGenerator\";\nimport { colorService } from \"./lib/server/services/ColorService\";\nimport { variableService } from \"./lib/server/services/VariableService\";\nimport { configService } from \"./lib/server/services/configService\";\nimport { loadBreakpointConfig, loadIconsConfig } from \"./lib/server/jsonLoader\";\nimport type { InteractiveStyles } from \"./lib/shared/types/styles\";\nimport { collectComponentLibraries, filterLibrariesByContext, mergeLibraries, generateLibraryTags } from \"./lib/shared/libraryLoader\";\nimport { migrateTemplatesDirectory } from \"./lib/server/migrateTemplates\";\nimport { emitAstroComponent } from \"./lib/server/astro/componentEmitter\";\nimport { emitAstroPage } from \"./lib/server/astro/pageEmitter\";\nimport { emitCMSPage } from './lib/server/astro/cmsPageEmitter';\nimport { collectAllMappingClasses } from \"./lib/server/astro/cssCollector\";\nimport { buildImageMetadataMap, RESPONSIVE_WIDTHS } from \"./lib/server/ssr/imageMetadata\";\nimport { needsFormHandler, formHandlerScript } from \"./lib/client/scripts/formHandler\";\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex').slice(0, 8);\n}\n\nfunction writePageScript(javascript: string | undefined, scriptsDir: string): string[] {\n if (!javascript) return [];\n const hash = hashContent(javascript);\n const scriptFile = `${hash}.js`;\n if (!existsSync(scriptsDir)) {\n mkdirSync(scriptsDir, { recursive: true });\n }\n const fullScriptPath = join(scriptsDir, scriptFile);\n if (!existsSync(fullScriptPath)) {\n writeFileSync(fullScriptPath, javascript, 'utf-8');\n }\n return [`/_scripts/${scriptFile}`];\n}\n\nfunction copyDirectory(\n src: string,\n dest: string,\n filter?: (filename: string) => boolean,\n): void {\n if (!existsSync(src)) return;\n if (!existsSync(dest)) mkdirSync(dest, { recursive: true });\n const files = readdirSync(src);\n for (const file of files) {\n if (filter && !filter(file)) continue;\n const srcPath = join(src, file);\n const destPath = join(dest, file);\n const stat = statSync(srcPath);\n if (stat.isDirectory()) copyDirectory(srcPath, destPath, filter);\n else copyFileSync(srcPath, destPath);\n }\n}\n\n// Astro's <Picture> re-derives responsive variants from originals at build\n// time, so the pre-baked -{width}.webp/.avif files and the SSR-only\n// manifest.json are dead weight in the exported project.\nconst imageVariantSuffixRe = new RegExp(\n `-(${RESPONSIVE_WIDTHS.join('|')})\\\\.(webp|avif)$`,\n);\nfunction shouldCopyImageForAstro(filename: string): boolean {\n if (filename === 'manifest.json') return false;\n if (imageVariantSuffixRe.test(filename)) return false;\n return true;\n}\n\nfunction isCMSPage(pageData: JSONPage): boolean {\n return pageData.meta?.source === 'cms' && !!pageData.meta?.cms;\n}\n\n/**\n * Build URL path for a CMS item based on the URL pattern\n */\nfunction buildCMSItemPath(\n urlPattern: string,\n item: CMSItem,\n slugField: string,\n locale: string,\n i18nConfig: I18nConfig\n): string {\n let slug = item[slugField] ?? item._slug ?? item._id;\n if (isI18nValue(slug)) {\n slug = resolveI18nValue(slug, locale, i18nConfig) as string;\n }\n return urlPattern.replace('{{slug}}', String(slug));\n}\n\n/**\n * Recursively scan a directory for .json files, returning relative paths.\n */\nfunction scanJSONFiles(dir: string, prefix: string = ''): string[] {\n const results: string[] = [];\n if (!existsSync(dir)) return results;\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.json')) {\n results.push(prefix ? `${prefix}/${entry.name}` : entry.name);\n } else if (entry.isDirectory()) {\n results.push(...scanJSONFiles(join(dir, entry.name), prefix ? `${prefix}/${entry.name}` : entry.name));\n }\n }\n return results;\n}\n\n/**\n * Compute the relative import path from a file at `fromDepth` levels under src/pages/\n * back to src/layouts/BaseLayout.astro.\n */\nfunction layoutImportPath(fileDepth: number): string {\n // fileDepth = 0 means file is at src/pages/index.astro -> ../layouts/BaseLayout.astro\n // fileDepth = 1 means src/pages/en/index.astro -> ../../layouts/BaseLayout.astro\n const ups = '../'.repeat(fileDepth + 1);\n return `${ups}layouts/BaseLayout.astro`;\n}\n\n/**\n * Escape a string for use inside a JS template literal (backtick string).\n */\nfunction escapeTemplateLiteral(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\$\\{/g, '\\\\${');\n}\n\n/**\n * Compute locale \u2192 URL path map for a page's slug translations.\n * Used by locale list rendering to generate correct links.\n */\nfunction computePageSlugMap(\n slugs: Record<string, string>,\n i18nConfig: I18nConfig\n): Record<string, string> {\n const map: Record<string, string> = {};\n for (const localeConfig of i18nConfig.locales) {\n const code = localeConfig.code;\n const isDefault = code === i18nConfig.defaultLocale;\n const slug = slugs[code] || '';\n if (isDefault) {\n map[code] = slug === '' ? '/' : `/${slug}`;\n } else {\n map[code] = slug === '' ? `/${code}` : `/${code}/${slug}`;\n }\n }\n return map;\n}\n\n/**\n * Map a CMS field type to a Zod schema string for the Astro content config.\n */\nfunction cmsFieldToZod(field: CMSFieldDefinition): string {\n switch (field.type) {\n case 'string':\n case 'text':\n case 'rich-text':\n // Support both plain strings and i18n objects { _i18n: true, en: \"...\", pl: \"...\" }\n return 'z.union([z.string(), z.object({ _i18n: z.literal(true) }).passthrough()])';\n case 'number':\n return 'z.number()';\n case 'boolean':\n return 'z.boolean()';\n case 'date':\n return 'z.coerce.date()';\n case 'select':\n if (field.options && field.options.length > 0) {\n const opts = field.options.map(o => `'${o.replace(/'/g, \"\\\\'\")}'`).join(', ');\n return `z.enum([${opts}])`;\n }\n return 'z.string()';\n case 'image':\n case 'file':\n return 'z.string()';\n case 'reference':\n return 'z.string()';\n default:\n return 'z.string()';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface PageRenderResult {\n /** Body HTML (inner content, no DOCTYPE wrapper) */\n html: string;\n /** Head meta tags HTML string */\n meta: string;\n /** Page title */\n title: string;\n /** Extracted JavaScript (if any) */\n javascript: string;\n /** Per-component CSS */\n componentCSS?: string;\n /** Locale used */\n locale: string;\n /** Interactive styles (hover, focus, etc.) */\n interactiveStylesMap: Map<string, InteractiveStyles>;\n /** The URL path this page will live at */\n urlPath: string;\n /** File depth relative to src/pages/ (0 = root, 1 = one dir deep, etc.) */\n fileDepth: number;\n /** Relative file path within src/pages/ */\n astroFilePath: string;\n /** Original page data (for Pass 2 component-structured emission) */\n pageData?: JSONPage;\n /** Page name without extension */\n pageName?: string;\n /** Whether this is a CMS template page */\n isCMSPage?: boolean;\n /** SSR fallback HTML for complex nodes (list, locale-list) keyed by element path */\n ssrFallbackCollector?: Map<string, string>;\n /** Raw-HTML slice \u2192 processed HTML captured during SSR (for Astro exporter parity) */\n processedRawHtmlCollector?: Map<string, string>;\n}\n\ninterface AstroBuildStats {\n pages: number;\n cmsPages: number;\n collections: number;\n errors: number;\n}\n\n// ---------------------------------------------------------------------------\n// SSR Fallback page builder (used for CMS pages and error fallback)\n// ---------------------------------------------------------------------------\n\nfunction buildSSRFallbackPage(\n result: PageRenderResult,\n importPath: string,\n fontPreloads: string,\n libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string },\n defaultTheme: string,\n scriptPaths: string[]\n): string {\n const escapedMeta = escapeTemplateLiteral(result.meta);\n const escapedHTML = escapeTemplateLiteral(result.html);\n const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);\n\n const scriptsArrayLiteral = scriptPaths.length > 0\n ? `[${scriptPaths.map(s => `\"${s}\"`).join(', ')}]`\n : '[]';\n\n const libraryTagsLiteral = `{ headCSS: \\`${escapeTemplateLiteral(libraryTags.headCSS || '')}\\`, headJS: \\`${escapeTemplateLiteral(libraryTags.headJS || '')}\\`, bodyEndJS: \\`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\\` }`;\n\n return `---\nimport BaseLayout from '${importPath}';\n---\n<BaseLayout\n title=\"${result.title.replace(/\"/g, '&quot;')}\"\n meta={\\`${escapedMeta}\\`}\n scripts={${scriptsArrayLiteral}}\n locale=\"${result.locale}\"\n theme=\"${defaultTheme}\"\n fontPreloads={\\`${escapedFontPreloads}\\`}\n libraryTags={${libraryTagsLiteral}}\n>\n <Fragment set:html={\\`<div id=\"root\">${escapedHTML}</div>\\`} />\n</BaseLayout>\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\nexport async function buildAstroProject(\n projectRoot?: string,\n outputDir?: string\n): Promise<AstroBuildStats> {\n // ----------------------------------------------------------\n // 1. Setup: load project configuration\n // ----------------------------------------------------------\n configService.reset();\n\n const projectConfig = await loadProjectConfig();\n const siteUrl = (projectConfig as { siteUrl?: string }).siteUrl?.replace(/\\/$/, '') || '';\n\n const i18nConfig = await loadI18nConfig();\n\n await migrateTemplatesDirectory();\n\n const { components, warnings, errors: compErrors } = await loadComponentDirectory(projectPaths.components());\n const globalComponents: Record<string, ComponentDefinition> = {};\n components.forEach((value, key) => { globalComponents[key] = value; });\n for (const w of warnings) console.warn(` Warning: ${w}`);\n for (const e of compErrors) console.error(` Error: ${e}`);\n\n const cmsProvider = new FileSystemCMSProvider(projectPaths.templates(), projectPaths.cms());\n const cmsService = new CMSService(cmsProvider);\n await cmsService.initialize();\n\n const themeConfig = await colorService.loadThemeConfig();\n const variablesConfig = await variableService.loadConfig();\n const breakpoints = await loadBreakpointConfig();\n\n // Libraries (global + component)\n await configService.load();\n const responsiveScales = configService.getResponsiveScales();\n const globalLibraries = configService.getLibraries();\n const componentLibraries = collectComponentLibraries(globalComponents);\n\n // Build image metadata map for responsive image generation\n const imageMetadataMap = await buildImageMetadataMap();\n\n // ----------------------------------------------------------\n // 2. Clean and create output directory\n // ----------------------------------------------------------\n const outDir = outputDir || join(projectPaths.project, 'astro-export');\n\n if (existsSync(outDir)) {\n rmSync(outDir, { recursive: true, force: true });\n }\n mkdirSync(outDir, { recursive: true });\n\n // Create directory structure\n const srcDir = join(outDir, 'src');\n const pagesOutDir = join(srcDir, 'pages');\n const layoutsDir = join(srcDir, 'layouts');\n const stylesDir = join(srcDir, 'styles');\n const componentsOutDir = join(srcDir, 'components');\n const publicDir = join(outDir, 'public');\n const scriptsDir = join(publicDir, '_scripts');\n for (const d of [srcDir, pagesOutDir, layoutsDir, stylesDir, componentsOutDir, publicDir]) {\n mkdirSync(d, { recursive: true });\n }\n\n // ----------------------------------------------------------\n // 3. Scan pages\n // ----------------------------------------------------------\n const pagesDir = projectPaths.pages();\n if (!existsSync(pagesDir)) {\n console.error('Pages directory not found!');\n return { pages: 0, cmsPages: 0, collections: 0, errors: 1 };\n }\n\n const pageFiles = scanJSONFiles(pagesDir);\n if (pageFiles.length === 0) {\n console.warn('No pages found in ./pages directory');\n return { pages: 0, cmsPages: 0, collections: 0, errors: 0 };\n }\n\n // Collect slug mappings (first pass)\n const slugMappings: SlugMap[] = [];\n for (const file of pageFiles) {\n const pageName = file.replace('.json', '');\n const basePath = mapPageNameToPath(pageName);\n const pageContent = await loadJSONFile(join(pagesDir, file));\n if (!pageContent) continue;\n try {\n const pageData = parseJSON<JSONPage>(pageContent);\n if (pageData.meta?.slugs) {\n const pageId = basePath === '/' ? 'index' : basePath.substring(1);\n slugMappings.push({ pageId, slugs: pageData.meta.slugs });\n }\n } catch { /* ignore parse errors in first pass */ }\n }\n\n // ----------------------------------------------------------\n // 4 & 5. Render all pages (regular + CMS templates)\n // ----------------------------------------------------------\n const allResults: PageRenderResult[] = [];\n const allInteractiveStyles = new Map<string, InteractiveStyles>();\n const allComponentCSS = new Set<string>();\n const jsContents = new Map<string, string>(); // hash -> JS content\n let errorCount = 0;\n let projectNeedsFormHandler = false;\n\n // Helper to merge interactive styles maps\n function mergeInteractiveStyles(source: Map<string, InteractiveStyles>): void {\n for (const [key, value] of source) {\n if (!allInteractiveStyles.has(key)) {\n allInteractiveStyles.set(key, value);\n }\n }\n }\n\n // Helper to process a render result\n function processRenderResult(\n result: { html: string; meta: string; title: string; javascript: string; componentCSS?: string; locale: string; interactiveStylesMap: Map<string, InteractiveStyles>; preloadImages: any[]; neededCollections: Set<string>; ssrFallbackCollector?: Map<string, string>; processedRawHtmlCollector?: Map<string, string> },\n urlPath: string,\n astroFilePath: string,\n fileDepth: number,\n pageData?: JSONPage,\n pageName?: string,\n isCMSPage?: boolean\n ): void {\n // Collect interactive styles\n mergeInteractiveStyles(result.interactiveStylesMap);\n\n // Collect component CSS\n if (result.componentCSS) {\n allComponentCSS.add(result.componentCSS);\n }\n\n // Deduplicate JavaScript by content hash\n if (result.javascript) {\n const hash = hashContent(result.javascript);\n if (!jsContents.has(hash)) {\n jsContents.set(hash, result.javascript);\n }\n }\n\n // Detect forms that need the fetch handler\n if (!projectNeedsFormHandler && needsFormHandler(result.html)) {\n projectNeedsFormHandler = true;\n }\n\n allResults.push({\n html: result.html,\n meta: result.meta,\n title: result.title,\n javascript: result.javascript,\n componentCSS: result.componentCSS,\n locale: result.locale,\n interactiveStylesMap: result.interactiveStylesMap,\n urlPath,\n fileDepth,\n astroFilePath,\n pageData,\n pageName,\n isCMSPage,\n ssrFallbackCollector: result.ssrFallbackCollector,\n processedRawHtmlCollector: result.processedRawHtmlCollector,\n });\n }\n\n // ---------- Regular pages ----------\n for (const file of pageFiles) {\n const pageName = file.replace('.json', '');\n const basePath = mapPageNameToPath(pageName);\n const pageContent = await loadJSONFile(join(pagesDir, file));\n\n if (!pageContent) {\n console.warn(` Skipping ${basePath} (empty file)`);\n errorCount++;\n continue;\n }\n\n try {\n const pageData = parseJSON<JSONPage>(pageContent);\n\n // Skip draft pages in production\n const isDevBuild = process.env.MENO_DEV_BUILD === 'true';\n if (pageData.meta?.draft === true && !isDevBuild) {\n continue;\n }\n\n const slugs = pageData.meta?.slugs;\n\n for (const localeConfig of i18nConfig.locales) {\n const locale = localeConfig.code;\n const isDefault = locale === i18nConfig.defaultLocale;\n\n // Compute URL path\n let slug: string;\n if (slugs && slugs[locale]) {\n slug = slugs[locale];\n } else if (basePath === '/') {\n slug = '';\n } else {\n slug = basePath.substring(1);\n }\n\n const urlPath = isDefault\n ? (slug === '' ? '/' : `/${slug}`)\n : (slug === '' ? `/${locale}` : `/${locale}/${slug}`);\n\n // Determine .astro file path relative to src/pages/\n const astroFileName = slug === '' ? 'index.astro' : `${slug}.astro`;\n const astroFilePath = isDefault ? astroFileName : `${locale}/${astroFileName}`;\n const fileDepth = astroFilePath.split('/').length - 1;\n\n const result = await renderPageSSR(\n pageData,\n globalComponents,\n urlPath,\n siteUrl,\n locale,\n i18nConfig,\n slugMappings,\n undefined, // cmsContext\n cmsService,\n true // isProductionBuild\n );\n\n processRenderResult(result, urlPath, astroFilePath, fileDepth, pageData, pageName, false);\n }\n } catch (error: any) {\n console.error(` Error rendering ${basePath}:`, error?.message || error);\n errorCount++;\n }\n }\n\n // Pre-compute layout dependencies needed by both CMS and regular page emission\n const fontPreloads = generateFontPreloadTags();\n const mergedLibraries = mergeLibraries(globalLibraries, componentLibraries);\n const buildLibraries = filterLibrariesByContext(mergedLibraries, 'build');\n\n // Mirror htmlGenerator.ts: local CSS libraries with `inline !== false` are inlined\n // into a <style> tag, otherwise the file is copied to public/ so the <link href>\n // resolves. This keeps any `/some-file.css` referenced in project.config.json\n // libraries working, not just the special `custom.css` case.\n const inlineContents = new Map<string, string>();\n const localLibsToCopy: string[] = [];\n for (const css of buildLibraries.css || []) {\n if (!css.url.startsWith('/')) continue;\n const shouldInline = css.inline !== false;\n const relPath = css.url.slice(1);\n const srcPath = join(projectPaths.project, relPath);\n if (!existsSync(srcPath)) continue;\n if (shouldInline) {\n try {\n inlineContents.set(css.url, await readFile(srcPath, 'utf-8'));\n } catch {\n localLibsToCopy.push(relPath);\n }\n } else {\n localLibsToCopy.push(relPath);\n }\n }\n for (const js of buildLibraries.js || []) {\n if (js.url.startsWith('/')) {\n const relPath = js.url.slice(1);\n if (existsSync(join(projectPaths.project, relPath))) {\n localLibsToCopy.push(relPath);\n }\n }\n }\n const libraryTags = generateLibraryTags(buildLibraries, inlineContents);\n const defaultTheme = themeConfig.default || 'light';\n\n // Global customCode (head/bodyStart/bodyEnd) and icons from project.config.json\n // are page-independent, so we bake them directly into BaseLayout.astro rather\n // than plumbing them through every page's props. Mirrors htmlGenerator.ts's\n // SSR output (htmlGenerator.ts:269-507 for customCode, 368-473 for icons).\n const customCode = configService.getCustomCode();\n const iconsConfig = await loadIconsConfig();\n const hasDarkFavicon = !!(iconsConfig.favicon && iconsConfig.faviconDark);\n const faviconTag = iconsConfig.favicon\n ? `<link rel=\"icon\" href=\"${iconsConfig.favicon.replace(/\"/g, '&quot;')}\"${hasDarkFavicon ? ' media=\"(prefers-color-scheme: light)\"' : ''} />`\n : '';\n const faviconDarkTag = iconsConfig.faviconDark\n ? `<link rel=\"icon\" href=\"${iconsConfig.faviconDark.replace(/\"/g, '&quot;')}\" media=\"(prefers-color-scheme: dark)\" />`\n : '';\n const appleTouchIconTag = iconsConfig.appleTouchIcon\n ? `<link rel=\"apple-touch-icon\" href=\"${iconsConfig.appleTouchIcon.replace(/\"/g, '&quot;')}\" />`\n : '';\n const iconTagsHtml = [faviconTag, faviconDarkTag, appleTouchIconTag].filter(Boolean).join('\\n ');\n\n const remConversionConfig = configService.getRemConversion();\n\n // ---------- CMS template pages ----------\n const templatesDir = projectPaths.templates();\n const templateSchemas: CMSSchema[] = [];\n let cmsPageCount = 0;\n\n if (existsSync(templatesDir)) {\n const templateFiles = readdirSync(templatesDir).filter(f => f.endsWith('.json'));\n\n for (const file of templateFiles) {\n const templateContent = await loadJSONFile(join(templatesDir, file));\n if (!templateContent) continue;\n\n try {\n const pageData = parseJSON<JSONPage>(templateContent);\n\n const isDevBuild = process.env.MENO_DEV_BUILD === 'true';\n if (pageData.meta?.draft === true && !isDevBuild) {\n continue;\n }\n\n if (!isCMSPage(pageData)) {\n console.warn(` ${file} is in templates/ but missing meta.source: \"cms\"`);\n continue;\n }\n\n const cmsSchema = pageData.meta!.cms as CMSSchema;\n templateSchemas.push(cmsSchema);\n\n // Count items for stats\n const items = await cmsService.queryItems({ collection: cmsSchema.id });\n const itemCount = items.length;\n\n // Render SSR once for metadata collection (interactive styles, component CSS, JS)\n const defaultLocale = i18nConfig.defaultLocale;\n const dummyPath = cmsSchema.urlPattern.replace('{{slug}}', '__placeholder__');\n\n const metaResult = await renderPageSSR(\n pageData,\n globalComponents,\n dummyPath,\n siteUrl,\n defaultLocale,\n i18nConfig,\n slugMappings,\n undefined, // no CMS context - just collecting metadata\n cmsService,\n true\n );\n\n // Collect interactive styles and component CSS\n mergeInteractiveStyles(metaResult.interactiveStylesMap);\n if (metaResult.componentCSS) {\n allComponentCSS.add(metaResult.componentCSS);\n }\n\n // Deduplicate JavaScript by content hash\n const scriptPaths: string[] = [];\n if (metaResult.javascript) {\n const hash = hashContent(metaResult.javascript);\n if (!jsContents.has(hash)) {\n jsContents.set(hash, metaResult.javascript);\n }\n scriptPaths.push(`/_scripts/${hash}.js`);\n }\n\n // Determine route file path from urlPattern\n const isMultiLocale = i18nConfig.locales.length > 1;\n const urlPatternWithoutSlash = cmsSchema.urlPattern.replace(/^\\//, '');\n const slugPlaceholderIdx = urlPatternWithoutSlash.indexOf('{{');\n const pathPrefix = slugPlaceholderIdx > 0 ? urlPatternWithoutSlash.substring(0, slugPlaceholderIdx) : '';\n\n // Generate CMS page with getStaticPaths()\n const ssrFallbacks = metaResult.ssrFallbackCollector ?? new Map<string, string>();\n\n // For each locale (or just default), generate a route file\n const localesToEmit = isMultiLocale ? i18nConfig.locales : [{ code: i18nConfig.defaultLocale }];\n\n for (const localeEntry of localesToEmit) {\n const localeCode = localeEntry.code;\n const isDefault = localeCode === i18nConfig.defaultLocale;\n\n // Route file path: blog/[slug].astro for default, pl/blog/[slug].astro for non-default\n let astroFilePath: string;\n if (pathPrefix) {\n astroFilePath = isDefault\n ? `${pathPrefix}[slug].astro`\n : `${localeCode}/${pathPrefix}[slug].astro`;\n } else {\n astroFilePath = isDefault\n ? '[slug].astro'\n : `${localeCode}/[slug].astro`;\n }\n\n const fileDepth = astroFilePath.split('/').length - 1;\n const importPath = layoutImportPath(fileDepth);\n\n const astroContent = emitCMSPage({\n pageData,\n globalComponents,\n cmsSchema,\n title: String(pageData.meta?.title || cmsSchema.name),\n meta: metaResult.meta,\n locale: localeCode,\n theme: defaultTheme,\n fontPreloads,\n libraryTags,\n scriptPaths,\n layoutImportPath: importPath,\n fileDepth,\n ssrFallbacks,\n pageName: file.replace('.json', ''),\n breakpoints,\n responsiveScales,\n imageMetadataMap,\n i18nConfig,\n isMultiLocale: false, // Each file handles one locale\n slugMappings,\n imageFormat: configService.getImageFormat(),\n processedRawHtml: metaResult.processedRawHtmlCollector,\n remConfig: remConversionConfig,\n });\n\n const astroFileFull = join(pagesOutDir, astroFilePath);\n const astroFileDir = astroFileFull.substring(0, astroFileFull.lastIndexOf('/'));\n if (!existsSync(astroFileDir)) {\n mkdirSync(astroFileDir, { recursive: true });\n }\n\n await writeFile(astroFileFull, astroContent, 'utf-8');\n }\n\n cmsPageCount += itemCount * i18nConfig.locales.length;\n } catch (error: any) {\n console.error(` Error processing template ${file}:`, error?.message || error);\n errorCount++;\n }\n }\n }\n\n // ----------------------------------------------------------\n // 6. Generate global CSS (Tailwind + theme + interactive styles)\n // ----------------------------------------------------------\n // Collect Tailwind safelist classes from mapping variants\n const mappingClasses = collectAllMappingClasses(globalComponents, breakpoints, responsiveScales);\n\n const fontCSS = generateFontCSS();\n const themeColorCSS = generateThemeColorVariablesCSS(themeConfig);\n const variablesCSS = generateVariablesCSS(variablesConfig, breakpoints, responsiveScales);\n const componentCSSCombined = Array.from(allComponentCSS).join('\\n');\n\n const baseCSS = `@layer base {\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif; }\n button { background: none; border: none; padding: 0; font: inherit; cursor: pointer; outline: inherit; }\n img { max-width: 100%; height: auto; }\n picture { display: block; }\n .olink { text-decoration: none; display: block; color: inherit; }\n .oem { display: inline-block; }\n}`;\n\n const safelistClasses = Array.from(mappingClasses);\n const safelistDirectives = safelistClasses\n .map(c => `@source inline(\"${c}\");`)\n .join('\\n');\n const tailwindDirectives = safelistDirectives\n ? `@import \"tailwindcss\";\\n\\n${safelistDirectives}`\n : `@import \"tailwindcss\";`;\n\n const globalCSS = [tailwindDirectives, fontCSS, themeColorCSS, variablesCSS, baseCSS, componentCSSCombined]\n .filter(Boolean)\n .join('\\n\\n');\n\n await writeFile(join(stylesDir, 'global.css'), globalCSS, 'utf-8');\n\n // ----------------------------------------------------------\n // 7. Generate BaseLayout.astro\n // ----------------------------------------------------------\n // Escape for embedding inside Astro <Fragment set:html={`...`}> template\n // literals in the generated BaseLayout file.\n const escForTemplateLiteral = (s: string) => s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$\\{/g, '\\\\${');\n\n const customHeadLiteral = escForTemplateLiteral(customCode.head || '');\n const customBodyStartLiteral = escForTemplateLiteral(customCode.bodyStart || '');\n const customBodyEndLiteral = escForTemplateLiteral(customCode.bodyEnd || '');\n const iconTagsLiteral = escForTemplateLiteral(iconTagsHtml);\n\n const formHandlerBlock = projectNeedsFormHandler\n ? `\\n <script is:inline>\\n${formHandlerScript}\\n </script>`\n : '';\n\n const baseLayoutContent = `---\nimport '../styles/global.css';\n\ninterface Props {\n title: string;\n meta?: string;\n scripts?: string[];\n locale?: string;\n theme?: string;\n fontPreloads?: string;\n libraryTags?: { headCSS?: string; headJS?: string; bodyEndJS?: string };\n}\n\nconst { title, meta = '', scripts = [], locale = 'en', theme = '${themeConfig.default || 'light'}', fontPreloads = '', libraryTags = {} } = Astro.props;\n---\n<!DOCTYPE html>\n<html lang={locale} data-theme={theme}>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <Fragment set:html={\\`${iconTagsLiteral}\\`} />\n <Fragment set:html={fontPreloads} />\n <Fragment set:html={libraryTags.headCSS || ''} />\n <Fragment set:html={libraryTags.headJS || ''} />\n <Fragment set:html={meta} />\n <Fragment set:html={\\`${customHeadLiteral}\\`} />\n <title>{title}</title>\n</head>\n<body>\n <Fragment set:html={\\`${customBodyStartLiteral}\\`} />\n <slot />\n {scripts.map((s) => <script src={s} />)}\n <Fragment set:html={libraryTags.bodyEndJS || ''} />\n <Fragment set:html={\\`${customBodyEndLiteral}\\`} />${formHandlerBlock}\n</body>\n</html>\n`;\n\n await writeFile(join(layoutsDir, 'BaseLayout.astro'), baseLayoutContent, 'utf-8');\n\n // ----------------------------------------------------------\n // 7.5. Generate component .astro files\n // ----------------------------------------------------------\n let componentFileCount = 0;\n for (const [compName, compDef] of Object.entries(globalComponents)) {\n try {\n const astroContent = emitAstroComponent(compName, compDef, globalComponents, breakpoints, i18nConfig.defaultLocale, responsiveScales, remConversionConfig);\n await writeFile(join(componentsOutDir, `${compName}.astro`), astroContent, 'utf-8');\n componentFileCount++;\n } catch (error: any) {\n console.warn(` Warning: could not generate component ${compName}: ${error?.message}`);\n }\n }\n // ----------------------------------------------------------\n // 8. Generate .astro page files (component-structured)\n // ----------------------------------------------------------\n for (const result of allResults) {\n const importPath = layoutImportPath(result.fileDepth);\n\n // Write JavaScript to public/_scripts/ if present (only needed for SSR fallback pages)\n let scriptPaths: string[] = [];\n\n let astroContent: string;\n\n // Use component-structured emission for pages with page data\n if (result.pageData) {\n try {\n // Use SSR fallback collector from the initial render (paths already match nodeToAstro convention)\n const ssrFallbacks = result.ssrFallbackCollector ?? new Map<string, string>();\n\n // Compute slug map for locale list rendering\n const pageSlugMap: Record<string, string> | undefined =\n result.pageData.meta?.slugs\n ? computePageSlugMap(result.pageData.meta.slugs, i18nConfig)\n : undefined;\n\n // Component-structured pages don't need page-level _scripts/*.js\n // because each .astro component already has its own inline <script>\n astroContent = emitAstroPage({\n pageData: result.pageData,\n globalComponents,\n title: result.title,\n meta: result.meta,\n locale: result.locale,\n theme: defaultTheme,\n fontPreloads,\n libraryTags,\n scriptPaths: [],\n layoutImportPath: importPath,\n fileDepth: result.fileDepth,\n ssrFallbacks,\n pageName: result.pageName || 'index',\n breakpoints,\n responsiveScales,\n imageMetadataMap,\n i18nConfig: i18nConfig.locales.length > 1 ? i18nConfig : undefined,\n currentPageSlugMap: pageSlugMap,\n slugMappings: i18nConfig.locales.length > 1 ? slugMappings : undefined,\n imageFormat: configService.getImageFormat(),\n processedRawHtml: result.processedRawHtmlCollector,\n remConfig: remConversionConfig,\n });\n } catch (error: any) {\n // Fallback to SSR HTML if component emission fails \u2014 needs page-level script\n console.warn(` Warning: component emission failed for ${result.urlPath}, using SSR fallback: ${error?.message}`);\n scriptPaths = writePageScript(result.javascript, scriptsDir);\n astroContent = buildSSRFallbackPage(result, importPath, fontPreloads, libraryTags, defaultTheme, scriptPaths);\n }\n } else {\n // Pages without pageData: use SSR fallback \u2014 needs page-level script\n scriptPaths = writePageScript(result.javascript, scriptsDir);\n astroContent = buildSSRFallbackPage(result, importPath, fontPreloads, libraryTags, defaultTheme, scriptPaths);\n }\n\n const astroFileFull = join(pagesOutDir, result.astroFilePath);\n const astroFileDir = astroFileFull.substring(0, astroFileFull.lastIndexOf('/'));\n if (!existsSync(astroFileDir)) {\n mkdirSync(astroFileDir, { recursive: true });\n }\n\n await writeFile(astroFileFull, astroContent, 'utf-8');\n }\n\n // ----------------------------------------------------------\n // 8.5. Generate robots.txt endpoint\n // ----------------------------------------------------------\n const robotsTsContent = `import type { APIRoute } from 'astro';\n\nexport const GET: APIRoute = () => {\n const siteUrl = import.meta.env.SITE;\n const robotsTxt = [\n 'User-agent: *',\n 'Allow: /',\n '',\n siteUrl ? \\`Sitemap: \\${siteUrl}/sitemap-index.xml\\` : '',\n ].filter(Boolean).join('\\\\n');\n\n return new Response(robotsTxt, {\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\n });\n};\n`;\n await writeFile(join(pagesOutDir, 'robots.txt.ts'), robotsTsContent, 'utf-8');\n\n // ----------------------------------------------------------\n // 9. Generate CMS content collections (if templates exist)\n // ----------------------------------------------------------\n let collectionCount = 0;\n\n if (templateSchemas.length > 0) {\n const contentDir = join(srcDir, 'content');\n mkdirSync(contentDir, { recursive: true });\n\n const collectionDefs: string[] = [];\n\n for (const schema of templateSchemas) {\n const collectionDir = join(contentDir, schema.id);\n mkdirSync(collectionDir, { recursive: true });\n\n // Copy CMS item JSON files, resolving i18n values to default locale\n const cmsItemsDir = join(projectPaths.cms(), schema.id);\n if (existsSync(cmsItemsDir)) {\n const itemFiles = readdirSync(cmsItemsDir).filter(f => f.endsWith('.json'));\n\n for (const itemFile of itemFiles) {\n try {\n const rawContent = await readFile(join(cmsItemsDir, itemFile), 'utf-8');\n const item = JSON.parse(rawContent) as CMSItem;\n\n // Keep i18n values as-is so getStaticPaths() can resolve per-locale\n const resolved: Record<string, unknown> = { ...item };\n\n await writeFile(\n join(collectionDir, itemFile),\n JSON.stringify(resolved, null, 2),\n 'utf-8'\n );\n } catch (err: any) {\n console.warn(` Warning: could not process CMS item ${itemFile}: ${err?.message}`);\n }\n }\n }\n\n // Build Zod schema for this collection\n const fieldDefs: string[] = [];\n if (schema.fields) {\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n const zodType = cmsFieldToZod(fieldDef);\n const optional = fieldDef.required ? '' : '.optional()';\n fieldDefs.push(` ${fieldName}: ${zodType}${optional}`);\n }\n }\n\n collectionDefs.push(` '${schema.id}': defineCollection({\n loader: glob({ pattern: '**/*.json', base: './src/content/${schema.id}' }),\n schema: z.object({\n${fieldDefs.join(',\\n')}\n })\n })`);\n\n collectionCount++;\n }\n\n // Write src/content.config.ts (Astro 6 location \u2014 legacy src/content/config.ts is rejected)\n const configContent = `import { z, defineCollection } from 'astro:content';\nimport { glob } from 'astro/loaders';\n\nconst collections = {\n${collectionDefs.join(',\\n')}\n};\n\nexport { collections };\n`;\n\n await writeFile(join(srcDir, 'content.config.ts'), configContent, 'utf-8');\n }\n\n // ----------------------------------------------------------\n // 10. Copy assets\n // ----------------------------------------------------------\n // Images go to src/assets/images so Astro's asset pipeline can process\n // them via astro:assets `<Picture>` (hashing, on-edit reprocessing).\n // Everything else stays in public/ \u2014 fonts/icons/videos need stable URLs.\n\n const imagesSrcDir = join(projectPaths.project, 'images');\n if (existsSync(imagesSrcDir)) {\n // src/assets/images: used by static <Picture> via ESM imports + Vite asset\n // pipeline. Pre-baked responsive variants and manifest.json are excluded \u2014\n // Astro regenerates those from the originals.\n copyDirectory(imagesSrcDir, join(srcDir, 'assets', 'images'), shouldCopyImageForAstro);\n // public/images: used by the legacy <img>/<picture> srcset path and\n // rich-text image rewrites, which emit plain `/images/...` URLs pointing at\n // the pre-built variants. Without this mirror, any image not routed through\n // the static Picture path (variants referenced directly in a srcset,\n // CMS/template-bound images, component-prop images) 404s in `astro dev`.\n copyDirectory(imagesSrcDir, join(publicDir, 'images'));\n }\n\n const publicAssetDirs = ['fonts', 'icons', 'videos', 'assets'];\n for (const dir of publicAssetDirs) {\n const srcAssetDir = join(projectPaths.project, dir);\n if (existsSync(srcAssetDir)) {\n copyDirectory(srcAssetDir, join(publicDir, dir));\n }\n }\n\n // Copy libraries folder if it exists\n const librariesDir = join(projectPaths.project, 'libraries');\n if (existsSync(librariesDir)) {\n copyDirectory(librariesDir, join(publicDir, 'libraries'));\n }\n\n // Copy any project-root library files referenced by absolute URL in\n // project.config.json (e.g. `/custom.css`). Only copies entries we already\n // validated exist on disk during library tag generation above.\n for (const relPath of localLibsToCopy) {\n const srcPath = join(projectPaths.project, relPath);\n const destPath = join(publicDir, relPath);\n const destDir = destPath.substring(0, destPath.lastIndexOf('/'));\n if (destDir && !existsSync(destDir)) mkdirSync(destDir, { recursive: true });\n copyFileSync(srcPath, destPath);\n }\n\n // ----------------------------------------------------------\n // 11. Generate scaffold files\n // ----------------------------------------------------------\n\n // package.json\n const packageJson = {\n name: 'astro-export',\n type: 'module',\n version: '0.0.1',\n private: true,\n scripts: {\n dev: 'astro dev',\n start: 'astro dev',\n build: 'astro build',\n preview: 'astro preview',\n },\n dependencies: {\n 'astro': '^6.0.0',\n '@astrojs/sitemap': '^3.0.0',\n '@tailwindcss/vite': '^4.0.0',\n 'tailwindcss': '^4.0.0',\n },\n // Astro 6 expects Vite 7; pin it so npm doesn't pull Vite 8+ and warn.\n overrides: {\n 'vite': '^7.0.0',\n },\n };\n\n await writeFile(join(outDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');\n\n // astro.config.mjs\n const localeCodes = i18nConfig.locales.map(l => l.code);\n const i18nBlock = i18nConfig.locales.length > 1\n ? `\\n i18n: {\\n defaultLocale: '${i18nConfig.defaultLocale}',\\n locales: [${localeCodes.map(c => `'${c}'`).join(', ')}],\\n routing: { prefixDefaultLocale: false },\\n },`\n : '';\n\n const astroConfig = `import { defineConfig } from 'astro/config';\nimport tailwindcss from '@tailwindcss/vite';\nimport sitemap from '@astrojs/sitemap';\n\nexport default defineConfig({${siteUrl ? `\\n site: '${siteUrl}',` : ''}${i18nBlock}\n integrations: [sitemap()],\n vite: {\n plugins: [tailwindcss()],\n },\n});\n`;\n\n await writeFile(join(outDir, 'astro.config.mjs'), astroConfig, 'utf-8');\n\n // tsconfig.json\n const tsConfig = {\n extends: 'astro/tsconfigs/strict',\n };\n\n await writeFile(join(outDir, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2), 'utf-8');\n\n // src/env.d.ts \u2014 resolves astro:assets and other virtual module types in IDE\n await writeFile(join(outDir, 'src', 'env.d.ts'), '/// <reference path=\"../.astro/types.d.ts\" />\\n', 'utf-8');\n\n // ----------------------------------------------------------\n // 12. Summary\n // ----------------------------------------------------------\n const totalPages = allResults.length;\n\n return {\n pages: totalPages - cmsPageCount,\n cmsPages: cmsPageCount,\n collections: collectionCount,\n errors: errorCount,\n };\n}\n", "/**\n * Tailwind CSS Class Mapper for Astro Export\n * Converts CSS property:value pairs to Tailwind utility classes.\n * Uses exact-match table for common values, arbitrary value fallback for the rest.\n */\n\nimport type {\n StyleObject,\n ResponsiveStyleObject,\n StyleMapping,\n} from '../../shared/types/styles';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport type { ResponsiveScales, CSSPropertyType } from '../../shared/responsiveScaling';\nimport { getScaleMultiplier, scalePropertyValue } from '../../shared/responsiveScaling';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isStyleMapping(value: unknown): value is StyleMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as StyleMapping)._mapping === true\n );\n}\n\nfunction hasTemplateExpression(value: string): boolean {\n return /\\{\\{.+?\\}\\}/.test(value);\n}\n\nfunction isResponsiveStyle(\n style: StyleObject | ResponsiveStyleObject\n): style is ResponsiveStyleObject {\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n// ---------------------------------------------------------------------------\n// Exact match table: property+value \u2192 Tailwind class\n// ---------------------------------------------------------------------------\n\nconst exactMatches: Record<string, Record<string, string>> = {\n display: {\n flex: 'flex',\n grid: 'grid',\n block: 'block',\n none: 'hidden',\n inline: 'inline',\n 'inline-block': 'inline-block',\n 'inline-flex': 'inline-flex',\n 'inline-grid': 'inline-grid',\n },\n flexDirection: {\n column: 'flex-col',\n row: 'flex-row',\n 'column-reverse': 'flex-col-reverse',\n 'row-reverse': 'flex-row-reverse',\n },\n justifyContent: {\n center: 'justify-center',\n 'flex-start': 'justify-start',\n 'flex-end': 'justify-end',\n 'space-between': 'justify-between',\n 'space-around': 'justify-around',\n 'space-evenly': 'justify-evenly',\n // camelCase aliases (component data uses camelCase)\n spaceBetween: 'justify-between',\n spaceAround: 'justify-around',\n spaceEvenly: 'justify-evenly',\n flexStart: 'justify-start',\n flexEnd: 'justify-end',\n },\n alignItems: {\n center: 'items-center',\n 'flex-start': 'items-start',\n 'flex-end': 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n // camelCase aliases\n flexStart: 'items-start',\n flexEnd: 'items-end',\n },\n alignContent: {\n center: 'content-center',\n 'flex-start': 'content-start',\n 'flex-end': 'content-end',\n 'space-between': 'content-between',\n 'space-around': 'content-around',\n stretch: 'content-stretch',\n },\n alignSelf: {\n auto: 'self-auto',\n center: 'self-center',\n 'flex-start': 'self-start',\n 'flex-end': 'self-end',\n stretch: 'self-stretch',\n },\n position: {\n relative: 'relative',\n absolute: 'absolute',\n fixed: 'fixed',\n sticky: 'sticky',\n static: 'static',\n },\n overflow: {\n hidden: 'overflow-hidden',\n auto: 'overflow-auto',\n scroll: 'overflow-scroll',\n visible: 'overflow-visible',\n },\n overflowX: {\n hidden: 'overflow-x-hidden',\n auto: 'overflow-x-auto',\n scroll: 'overflow-x-scroll',\n visible: 'overflow-x-visible',\n },\n overflowY: {\n hidden: 'overflow-y-hidden',\n auto: 'overflow-y-auto',\n scroll: 'overflow-y-scroll',\n visible: 'overflow-y-visible',\n },\n cursor: {\n pointer: 'cursor-pointer',\n default: 'cursor-default',\n 'not-allowed': 'cursor-not-allowed',\n grab: 'cursor-grab',\n grabbing: 'cursor-grabbing',\n text: 'cursor-text',\n move: 'cursor-move',\n wait: 'cursor-wait',\n },\n textAlign: {\n center: 'text-center',\n left: 'text-left',\n right: 'text-right',\n justify: 'text-justify',\n },\n textDecoration: {\n none: 'no-underline',\n underline: 'underline',\n 'line-through': 'line-through',\n overline: 'overline',\n },\n textTransform: {\n uppercase: 'uppercase',\n lowercase: 'lowercase',\n capitalize: 'capitalize',\n none: 'normal-case',\n },\n objectFit: {\n cover: 'object-cover',\n contain: 'object-contain',\n fill: 'object-fill',\n none: 'object-none',\n 'scale-down': 'object-scale-down',\n },\n objectPosition: {\n center: 'object-center',\n top: 'object-top',\n bottom: 'object-bottom',\n left: 'object-left',\n right: 'object-right',\n },\n flexWrap: {\n wrap: 'flex-wrap',\n nowrap: 'flex-nowrap',\n 'wrap-reverse': 'flex-wrap-reverse',\n },\n pointerEvents: {\n none: 'pointer-events-none',\n auto: 'pointer-events-auto',\n },\n userSelect: {\n none: 'select-none',\n auto: 'select-auto',\n text: 'select-text',\n all: 'select-all',\n },\n visibility: {\n hidden: 'invisible',\n visible: 'visible',\n },\n whiteSpace: {\n normal: 'whitespace-normal',\n nowrap: 'whitespace-nowrap',\n pre: 'whitespace-pre',\n 'pre-wrap': 'whitespace-pre-wrap',\n 'pre-line': 'whitespace-pre-line',\n },\n wordBreak: {\n 'break-all': 'break-all',\n 'break-word': 'break-words',\n normal: 'break-normal',\n },\n listStyleType: {\n none: 'list-none',\n disc: 'list-disc',\n decimal: 'list-decimal',\n },\n listStylePosition: {\n inside: 'list-inside',\n outside: 'list-outside',\n },\n boxSizing: {\n 'border-box': 'box-border',\n 'content-box': 'box-content',\n },\n gridAutoFlow: {\n row: 'grid-flow-row',\n column: 'grid-flow-col',\n dense: 'grid-flow-dense',\n 'row dense': 'grid-flow-row-dense',\n 'column dense': 'grid-flow-col-dense',\n },\n};\n\n// Single-value exact matches (property \u2192 class when value matches)\nconst singleValueMatches: Record<string, string> = {\n // width/height 100%\n 'width:100%': 'w-full',\n 'height:100%': 'h-full',\n 'width:100vw': 'w-screen',\n 'height:100vh': 'h-screen',\n 'width:auto': 'w-auto',\n 'height:auto': 'h-auto',\n 'width:fit-content': 'w-fit',\n 'height:fit-content': 'h-fit',\n 'width:min-content': 'w-min',\n 'height:min-content': 'h-min',\n 'width:max-content': 'w-max',\n 'height:max-content': 'h-max',\n 'maxWidth:100%': 'max-w-full',\n 'maxWidth:none': 'max-w-none',\n 'maxHeight:100%': 'max-h-full',\n 'maxHeight:none': 'max-h-none',\n 'minWidth:0': 'min-w-0',\n 'minHeight:0': 'min-h-0',\n 'margin:auto': 'm-auto',\n 'margin:0 auto': 'mx-auto',\n 'marginLeft:auto': 'ml-auto',\n 'marginRight:auto': 'mr-auto',\n 'marginInline:auto': 'mx-auto',\n 'borderRadius:50%': 'rounded-full',\n 'borderRadius:9999px': 'rounded-full',\n 'borderRadius:0': 'rounded-none',\n 'flex:1': 'flex-1',\n 'flex:none': 'flex-none',\n 'flex:auto': 'flex-auto',\n 'flexGrow:0': 'grow-0',\n 'flexGrow:1': 'grow',\n 'flexShrink:0': 'shrink-0',\n 'flexShrink:1': 'shrink',\n 'opacity:0': 'opacity-0',\n 'opacity:1': 'opacity-100',\n 'zIndex:0': 'z-0',\n 'zIndex:10': 'z-10',\n 'zIndex:20': 'z-20',\n 'zIndex:30': 'z-30',\n 'zIndex:40': 'z-40',\n 'zIndex:50': 'z-50',\n 'inset:0': 'inset-0',\n 'top:0': 'top-0',\n 'right:0': 'right-0',\n 'bottom:0': 'bottom-0',\n 'left:0': 'left-0',\n 'outline:none': '[outline:none]',\n 'background:none': '[background:none]',\n 'background:transparent': '[background:transparent]',\n 'backgroundColor:transparent': 'bg-transparent',\n};\n\n// ---------------------------------------------------------------------------\n// Arbitrary value prefix map: CSS property \u2192 Tailwind prefix\n// ---------------------------------------------------------------------------\n\nconst arbitraryPrefixMap: Record<string, string> = {\n // Spacing\n padding: 'p',\n paddingTop: 'pt',\n paddingRight: 'pr',\n paddingBottom: 'pb',\n paddingLeft: 'pl',\n paddingInline: 'px',\n paddingBlock: 'py',\n margin: 'm',\n marginTop: 'mt',\n marginRight: 'mr',\n marginBottom: 'mb',\n marginLeft: 'ml',\n marginInline: 'mx',\n marginBlock: 'my',\n gap: 'gap',\n rowGap: 'gap-y',\n columnGap: 'gap-x',\n\n // Sizing\n width: 'w',\n height: 'h',\n maxWidth: 'max-w',\n maxHeight: 'max-h',\n minWidth: 'min-w',\n minHeight: 'min-h',\n\n // Typography\n fontSize: 'text',\n fontWeight: 'font',\n fontFamily: 'font',\n lineHeight: 'leading',\n letterSpacing: 'tracking',\n\n // Borders\n borderRadius: 'rounded',\n borderTopLeftRadius: 'rounded-tl',\n borderTopRightRadius: 'rounded-tr',\n borderBottomLeftRadius: 'rounded-bl',\n borderBottomRightRadius: 'rounded-br',\n border: 'border',\n borderTop: 'border-t',\n borderRight: 'border-r',\n borderBottom: 'border-b',\n borderLeft: 'border-l',\n borderColor: 'border',\n\n // Colors\n color: 'text',\n backgroundColor: 'bg',\n background: 'bg',\n backgroundImage: 'bg',\n\n // Effects\n opacity: 'opacity',\n boxShadow: 'shadow',\n textShadow: '[text-shadow]',\n filter: '[filter]',\n backdropFilter: 'backdrop',\n transform: '[transform]',\n transformOrigin: 'origin',\n transition: '[transition]',\n mixBlendMode: 'mix-blend',\n clipPath: '[clip-path]',\n\n // Positioning\n top: 'top',\n right: 'right',\n bottom: 'bottom',\n left: 'left',\n inset: 'inset',\n zIndex: 'z',\n\n // Grid\n gridTemplateColumns: 'grid-cols',\n gridTemplateRows: 'grid-rows',\n gridColumn: 'col',\n gridRow: 'row',\n gridAutoRows: 'auto-rows',\n gridAutoColumns: 'auto-cols',\n\n // Flexbox extras\n flexGrow: 'grow',\n flexShrink: 'shrink',\n flexBasis: 'basis',\n order: 'order',\n flex: 'flex',\n\n // Aspect ratio\n aspectRatio: 'aspect',\n\n // Outline\n outline: 'outline',\n outlineWidth: 'outline',\n outlineOffset: 'outline-offset',\n outlineColor: 'outline',\n\n // Other\n accentColor: 'accent',\n textIndent: '[text-indent]',\n verticalAlign: 'align',\n overflowWrap: '[overflow-wrap]',\n scrollBehavior: 'scroll',\n resize: 'resize',\n};\n\n// ---------------------------------------------------------------------------\n// Core conversion functions\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a single CSS property:value pair to a Tailwind class.\n * Returns null if the value should be skipped (mappings, templates).\n */\nexport function propertyToTailwind(\n property: string,\n value: string | number\n): string | null {\n const strValue = String(value);\n\n // Skip empty values \u2014 they produce broken classes like gap-[], mt-[]\n if (strValue === '') return null;\n\n // Skip template expressions \u2014 these must be handled via inline style\n if (hasTemplateExpression(strValue)) return null;\n\n // Check single-value exact matches first\n const singleKey = `${property}:${strValue}`;\n if (singleValueMatches[singleKey]) {\n return singleValueMatches[singleKey];\n }\n\n // Check exact match table\n if (exactMatches[property]?.[strValue]) {\n return exactMatches[property][strValue];\n }\n\n // Color variable handling:\n // \"var(--text)\" \u2192 \"text-[color:var(--text)]\" (type hint avoids ambiguity with font-size)\n // Bare color name like \"text\" \u2192 \"text-[color:var(--text)]\"\n if (property === 'color' || property === 'backgroundColor' || property === 'borderColor') {\n const prefix = property === 'color' ? 'text' : property === 'backgroundColor' ? 'bg' : 'border';\n if (strValue.includes('var(')) {\n return `${prefix}-[color:${strValue}]`;\n }\n // Bare name (not a hex, rgb, or number-starting value)\n if (!strValue.match(/^[#\\d]/) && !strValue.includes('rgb') && !strValue.includes('hsl')) {\n return `${prefix}-[color:var(--${strValue})]`;\n }\n }\n\n // Color properties with actual color values need type hints to avoid ambiguity\n if (property === 'borderColor' || property === 'color') {\n const prefix = property === 'color' ? 'text' : 'border';\n const sanitized = strValue.replace(/\\s+/g, '_');\n return `${prefix}-[color:${sanitized}]`;\n }\n\n // Border shorthand (e.g., \"1px solid\", \"2px solid var(--border)\") needs arbitrary property syntax\n // because Tailwind's border-[...] only accepts width values, not compound shorthands\n if (property === 'border' || property === 'borderTop' || property === 'borderRight' ||\n property === 'borderBottom' || property === 'borderLeft') {\n if (strValue.includes('solid') || strValue.includes('dashed') || strValue.includes('dotted') || strValue.includes('none')) {\n const cssProp = property.replace(/([A-Z])/g, '-$1').toLowerCase();\n const sanitized = strValue.replace(/\\s+/g, '_');\n return `[${cssProp}:${sanitized}]`;\n }\n }\n\n // `background` is a CSS shorthand \u2014 Tailwind's bg-[...] maps to background-color, not background.\n // For non-color values (none, transparent, gradients, etc.), use arbitrary property syntax.\n if (property === 'background') {\n const isSimpleColor = /^(#[0-9a-fA-F]{3,8}|rgb|hsl|var\\()/.test(strValue);\n if (!isSimpleColor) {\n const sanitized = strValue.replace(/\\s+/g, '_');\n return `[background:${sanitized}]`;\n }\n }\n\n // Arbitrary value fallback\n const twPrefix = arbitraryPrefixMap[property];\n if (!twPrefix) {\n // Unknown property: use arbitrary property syntax\n const cssProp = property.replace(/([A-Z])/g, '-$1').toLowerCase();\n const sanitized = strValue.replace(/\\s+/g, '_');\n return `[${cssProp}:${sanitized}]`;\n }\n\n // For prefixes that start with '[' it's an arbitrary property\n if (twPrefix.startsWith('[')) {\n const sanitized = strValue.replace(/\\s+/g, '_');\n return `${twPrefix.slice(0, -1)}:${sanitized}]`;\n }\n\n // Standard arbitrary value: prefix-[value]\n const sanitized = strValue.replace(/\\s+/g, '_');\n\n // Disambiguate properties that share a Tailwind prefix with another CSS property.\n // Without type hints, Tailwind guesses wrong (e.g., text-[var(--x)] \u2192 color instead of font-size).\n if (property === 'fontSize') {\n return `text-[length:${sanitized}]`;\n }\n if (property === 'fontFamily') {\n return `font-[family-name:${sanitized}]`;\n }\n if (property === 'fontWeight') {\n return `font-[number:${sanitized}]`;\n }\n\n return `${twPrefix}-[${sanitized}]`;\n}\n\n/**\n * Convert a flat style object to an array of Tailwind classes.\n * Skips StyleMapping values (handled separately via class:list).\n * Returns { classes, dynamicStyles } where dynamicStyles are template-expression\n * styles that need inline style attributes.\n */\nexport function stylesToTailwind(\n style: StyleObject | Record<string, string | number>\n): { classes: string[]; dynamicStyles: Record<string, string> } {\n const classes: string[] = [];\n const dynamicStyles: Record<string, string> = {};\n\n // When borderColor is present alongside a border shorthand, Tailwind's CSS\n // ordering can cause the shorthand's arbitrary property `[border:...]` to\n // override the longhand `border-[color:...]`. To avoid this, decompose\n // border shorthands into width + style only (dropping the color part) so\n // borderColor can take effect without conflicts.\n const hasBorderColor = 'borderColor' in style && !isStyleMapping(style.borderColor);\n const borderShorthands = new Set([\n 'border', 'borderTop', 'borderRight', 'borderBottom', 'borderLeft',\n ]);\n\n for (const [prop, value] of Object.entries(style)) {\n if (isStyleMapping(value)) continue;\n\n const strValue = String(value);\n\n // Template expressions go to dynamic/inline styles\n if (hasTemplateExpression(strValue)) {\n const cssProp = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n dynamicStyles[cssProp] = strValue;\n continue;\n }\n\n // Decompose border shorthands when borderColor is separately specified\n if (hasBorderColor && borderShorthands.has(prop)) {\n const parts = strValue.split(/\\s+/);\n // Parse width and style from shorthand (e.g. \"1px solid #ccc\" \u2192 \"1px\", \"solid\")\n const width = parts.find(p => /^\\d/.test(p) || p === '0');\n const borderStyle = parts.find(p => /^(solid|dashed|dotted|double|groove|ridge|inset|outset|none|hidden)$/.test(p));\n const cssProp = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n if (width) classes.push(`[${cssProp}-width:${width}]`);\n if (borderStyle) classes.push(`[${cssProp}-style:${borderStyle}]`);\n continue;\n }\n\n const twClass = propertyToTailwind(prop, value);\n if (twClass) {\n classes.push(twClass);\n }\n }\n\n return { classes, dynamicStyles };\n}\n\n/**\n * Convert a responsive style object to Tailwind classes with responsive prefixes.\n * Uses desktop-first max-width breakpoints.\n *\n * - base styles \u2192 no prefix (desktop default)\n * - tablet styles \u2192 max-[{breakpoint}px]: prefix\n * - mobile styles \u2192 max-[{breakpoint}px]: prefix\n */\nexport function responsiveStylesToTailwind(\n style: StyleObject | ResponsiveStyleObject | null | undefined,\n breakpoints: BreakpointConfig,\n responsiveScales?: ResponsiveScales\n): { classes: string[]; dynamicStyles: Record<string, string> } {\n if (!style) return { classes: [], dynamicStyles: {} };\n\n const allClasses: string[] = [];\n const allDynamicStyles: Record<string, string> = {};\n\n if (isResponsiveStyle(style)) {\n const responsive = style as ResponsiveStyleObject;\n\n // Base styles (no prefix)\n if (responsive.base) {\n const { classes, dynamicStyles } = stylesToTailwind(responsive.base);\n allClasses.push(...classes);\n Object.assign(allDynamicStyles, dynamicStyles);\n }\n\n // Tablet styles\n if (responsive.tablet) {\n const bpValue = breakpoints.tablet?.breakpoint ?? 1024;\n const prefix = `max-[${bpValue}px]:`;\n const { classes, dynamicStyles } = stylesToTailwind(responsive.tablet);\n allClasses.push(...classes.map(cls => `${prefix}${cls}`));\n // Dynamic styles for tablet \u2014 just merge (can't do responsive inline styles easily)\n Object.assign(allDynamicStyles, dynamicStyles);\n }\n\n // Mobile styles\n if (responsive.mobile) {\n const bpValue = breakpoints.mobile?.breakpoint ?? 540;\n const prefix = `max-[${bpValue}px]:`;\n const { classes, dynamicStyles } = stylesToTailwind(responsive.mobile);\n allClasses.push(...classes.map(cls => `${prefix}${cls}`));\n Object.assign(allDynamicStyles, dynamicStyles);\n }\n\n // Handle any other custom breakpoints\n for (const [bpName, bpStyle] of Object.entries(responsive)) {\n if (bpName === 'base' || bpName === 'tablet' || bpName === 'mobile' || !bpStyle) continue;\n const bpValue = breakpoints[bpName]?.breakpoint;\n if (!bpValue) continue;\n const prefix = `max-[${bpValue}px]:`;\n const { classes, dynamicStyles } = stylesToTailwind(bpStyle);\n allClasses.push(...classes.map(cls => `${prefix}${cls}`));\n Object.assign(allDynamicStyles, dynamicStyles);\n }\n\n // Auto-responsive scaling: for each scalable base property, emit scaled\n // max-[Npx]: variants for every enabled breakpoint that doesn't already\n // have an explicit override for that property.\n if (responsiveScales?.enabled === true && responsive.base) {\n appendAutoScaledClasses(responsive, breakpoints, responsiveScales, allClasses);\n }\n } else {\n // Flat style object \u2014 treat as base\n const { classes, dynamicStyles } = stylesToTailwind(style as StyleObject);\n allClasses.push(...classes);\n Object.assign(allDynamicStyles, dynamicStyles);\n }\n\n return { classes: allClasses, dynamicStyles: allDynamicStyles };\n}\n\n/**\n * Emit `max-[Npx]:` class variants with pre-scaled values for every base\n * property in a scale category, skipping breakpoints where the author set\n * an explicit override for the same property.\n *\n * Breakpoints are processed in descending pixel order so the emitted class\n * order matches the cascade order Tailwind's variant compiler expects.\n */\nfunction appendAutoScaledClasses(\n responsive: ResponsiveStyleObject,\n breakpoints: BreakpointConfig,\n responsiveScales: ResponsiveScales,\n out: string[]\n): void {\n const base = responsive.base;\n if (!base) return;\n\n const baseRef = responsiveScales.baseReference ?? 16;\n\n const sortedBps = Object.entries(breakpoints)\n .map(([name, cfg]) => ({ name, value: cfg?.breakpoint }))\n .filter((bp): bp is { name: string; value: number } =>\n typeof bp.value === 'number' && bp.value > 0\n )\n .sort((a, b) => b.value - a.value);\n\n for (const [property, value] of Object.entries(base)) {\n if (isStyleMapping(value)) continue;\n if (value == null) continue;\n\n const strValue = String(value);\n if (strValue === '' || hasTemplateExpression(strValue)) continue;\n\n for (const { name: bpName, value: bpPixels } of sortedBps) {\n // Explicit override at this breakpoint wins \u2014 skip auto-scaling.\n const bpBranch = responsive[bpName] as StyleObject | undefined;\n if (bpBranch && property in bpBranch) continue;\n\n const scale = getScaleMultiplier(\n responsiveScales,\n property as CSSPropertyType,\n bpName\n );\n if (scale == null) continue;\n\n const scaledValue = scalePropertyValue(strValue, baseRef, scale);\n if (scaledValue == null || scaledValue === strValue) continue;\n\n const scaledClass = propertyToTailwind(property, scaledValue);\n if (!scaledClass) continue;\n\n out.push(`max-[${bpPixels}px]:${scaledClass}`);\n }\n }\n}\n", "/**\n * Core converter: ComponentNode \u2192 Astro template markup\n * Recursively walks JSON node trees and emits Astro template syntax.\n */\n\nimport type {\n ComponentNode,\n ComponentDefinition,\n StructuredComponentDefinition,\n PropDefinition,\n HtmlNode,\n ComponentInstanceNode,\n SlotMarker,\n EmbedNode,\n LinkNode,\n LocaleListNode,\n I18nConfig,\n CMSSchema,\n ListNode,\n} from '../../shared/types';\nimport { singularize } from '../../shared/types';\nimport type {\n StyleObject,\n ResponsiveStyleObject,\n StyleMapping,\n InteractiveStyles,\n LinkMapping,\n HtmlMapping,\n} from '../../shared/types/styles';\nimport { responsiveStylesToTailwind, propertyToTailwind } from './tailwindMapper';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport { generateElementClassName, type ElementClassContext } from '../../shared/elementClassName';\nimport { isVoidElement, hasIf, hasChildren, isSlotContent as isSlotContentNode } from '../../shared/nodeUtils';\nimport { NODE_TYPE, RAW_HTML_PREFIX } from '../../shared/constants';\nimport { extractInteractiveStyleMappings, hasInteractiveStyleMappings } from '../../shared/interactiveStyleMappings';\nimport type { ImageMetadataMap } from '../ssr/imageMetadata';\nimport { isI18nValue, resolveI18nValue, DEFAULT_I18N_CONFIG, buildLocalizedPath } from '../../shared/i18n';\nimport { transformCMSTemplate, isTemplateExpression, transformItemTemplate, replaceItemMetaVars, rewriteItemVar } from './templateTransformer';\nimport type { SlugMap } from '../../shared/slugTranslator';\nimport { buildSlugIndex, translatePath } from '../../shared/slugTranslator';\nimport { stripRawHtmlPrefixDeep, astroComponentName } from './astroEmitHelpers';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AstroEmitContext {\n /** Component names collected for import statements */\n imports: Set<string>;\n /** true = inside component definition (use prop refs) */\n isComponentDef: boolean;\n /** Available props when in component */\n componentProps: Record<string, PropDefinition>;\n /** All global components */\n globalComponents: Record<string, ComponentDefinition>;\n /** Current indentation level */\n indent: number;\n /** node path \u2192 SSR HTML for complex nodes */\n ssrFallbacks: Map<string, string>;\n /** Current element path for element class generation */\n elementPath: number[];\n /** File type for element class context */\n fileType: 'component' | 'page';\n /** File name for element class context */\n fileName: string;\n /** Breakpoint config for responsive Tailwind classes */\n breakpoints: BreakpointConfig;\n /** Responsive scales config for auto-scaling spacing/typography/sizing */\n responsiveScales?: ResponsiveScales;\n /** Dynamic tag definitions collected during traversal (for frontmatter) */\n dynamicTags?: Map<string, string>;\n /** Image metadata map for responsive image generation */\n imageMetadataMap?: ImageMetadataMap;\n /** Page locale for resolving i18n values */\n locale?: string;\n /** CMS mode: transform {{cms.field}} to entry data expressions */\n cmsMode?: boolean;\n /** Variable name bound to the CMS entry (default: 'entry') */\n cmsEntryBinding?: string;\n /** Rich-text field names for CMS mode (use Fragment set:html) */\n cmsRichTextFields?: Set<string>;\n /** Current list item iteration variable name */\n listItemBinding?: string;\n /** Extra frontmatter code lines collected during emission */\n frontmatterLines?: string[];\n /** Astro API imports needed (e.g., 'getCollection') */\n astroImports?: Set<string>;\n /** Full i18n config for locale list emission */\n i18nConfig?: I18nConfig;\n /** locale\u2192slug for current page (for locale list links) */\n currentPageSlugMap?: Record<string, string>;\n /** CMS schema for rich-text field detection */\n cmsSchema?: CMSSchema;\n /** Wrap function name for i18n resolution (e.g., 'r') */\n cmsWrapFn?: string;\n /** Default locale for i18n resolver (used in component defs) */\n defaultLocale?: string;\n /** Set to true during emission when an i18n object is encountered in a component def */\n needsI18nResolver?: boolean;\n /** Index variable name for current list .map() callback (e.g., \"itemIndex\") */\n listIndexVar?: string;\n /** Source array expression for current list (e.g., \"items\"), used for itemLast */\n listSourceVar?: string;\n /** Slug mappings for translating internal links */\n slugMappings?: SlugMap[];\n /** I18n default locale (for slug translation) */\n i18nDefaultLocale?: string;\n /**\n * Raw-HTML slice \u2192 processed HTML captured during the SSR pass for this page.\n * Used by the RAW_HTML_PREFIX branch to emit rich-text content that has had\n * image rewriting, component expansion, and link localization applied.\n */\n processedRawHtml?: Map<string, string>;\n /** Image format: 'webp' uses plain <img>, 'avif' uses <picture> with AVIF+WebP sources */\n imageFormat?: 'webp' | 'avif';\n /**\n * Static image imports collected during emission: varName \u2192 import path\n * relative to the emitting file. Drives `import foo from '...'` in\n * frontmatter and unlocks astro:assets <Picture> for static local images.\n *\n * Note: this is a Map (ref-shared across child ctx spreads), so mutations\n * inside list/dynamic inner contexts remain visible to the parent. A\n * separate boolean flag would be dropped by `{ ...ctx }` shallow copies \u2014\n * the presence of any entry here implies `import { Picture } from 'astro:assets'`.\n */\n imageImports?: Map<string, string>;\n /** File depth (relative to src/pages or src/components) for import path computation */\n fileDepth?: number;\n /** Collected interactive styles during emission: elementClass \u2192 InteractiveStyles */\n collectedInteractiveStyles?: Map<string, InteractiveStyles>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction ind(ctx: AstroEmitContext): string {\n return ' '.repeat(ctx.indent);\n}\n\nfunction localizeHref(href: string, ctx: AstroEmitContext): string {\n if (!href.startsWith('/') || href.startsWith('//')) return href;\n const { locale, i18nDefaultLocale, slugMappings } = ctx;\n if (!locale || !i18nDefaultLocale) return href;\n if (slugMappings && slugMappings.length > 0) {\n const slugIndex = buildSlugIndex(slugMappings);\n return translatePath(href, locale, i18nDefaultLocale, i18nDefaultLocale, slugIndex);\n } else if (locale !== i18nDefaultLocale) {\n return buildLocalizedPath(href, locale);\n }\n return href;\n}\n\nfunction isStyleMapping(value: unknown): value is StyleMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as StyleMapping)._mapping === true\n );\n}\n\nfunction isLinkMapping(value: unknown): value is LinkMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as LinkMapping)._mapping === true\n );\n}\n\n/**\n * Emit a single attribute key=value, applying CMS/list template transformation if needed.\n */\nfunction emitAttrValue(key: string, value: string, ctx: AstroEmitContext): string {\n if (ctx.cmsMode && /\\{\\{cms\\./.test(value)) {\n const b = ctx.cmsEntryBinding || 'entry';\n const w = (expr: string) => ctx.cmsWrapFn ? `${ctx.cmsWrapFn}(${expr})` : expr;\n const fullMatch = value.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (fullMatch) {\n return `${key}={${w(`${b}.data.${fullMatch[1].trim()}`)}}`;\n }\n const replaced = value.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (_, fp) =>\n `\\${${w(`${b}.data.${fp.trim()}`)}}`\n );\n return `${key}={\\`${replaced}\\`}`;\n }\n if (ctx.listItemBinding && /\\{\\{/.test(value)) {\n const fullMatch = value.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let expr = fullMatch[1].trim();\n expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n return `${key}={${expr}}`;\n }\n const replaced = value.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n trimmed = rewriteItemVar(trimmed, ctx.listItemBinding!);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n return `\\${${trimmed}}`;\n });\n return `${key}={\\`${replaced}\\`}`;\n }\n return `${key}=\"${escapeJSX(value)}\"`;\n}\n\nfunction isHtmlMapping(value: unknown): value is HtmlMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as HtmlMapping)._mapping === true\n );\n}\n\nfunction isResponsiveStyle(\n style: StyleObject | ResponsiveStyleObject\n): style is ResponsiveStyleObject {\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n/**\n * Escape a string for use in Astro JSX attribute\n */\nfunction escapeJSX(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n/**\n * Escape a string for use inside a JS template literal\n */\nfunction escapeTemplateLiteral(s: string): string {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$\\{/g, '\\\\${')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\n/**\n * Get all style mappings from a style value, collecting { prop, property, values } tuples\n */\nfunction collectStyleMappings(\n style: StyleObject | ResponsiveStyleObject | undefined\n): Array<{ property: string; mapping: StyleMapping; breakpoint?: string }> {\n if (!style) return [];\n const result: Array<{ property: string; mapping: StyleMapping; breakpoint?: string }> = [];\n\n if (isResponsiveStyle(style)) {\n const responsive = style as ResponsiveStyleObject;\n for (const [bp, bpStyle] of Object.entries(responsive)) {\n if (!bpStyle) continue;\n for (const [prop, value] of Object.entries(bpStyle)) {\n if (isStyleMapping(value)) {\n result.push({ property: prop, mapping: value, breakpoint: bp });\n }\n }\n }\n } else {\n for (const [prop, value] of Object.entries(style)) {\n if (isStyleMapping(value)) {\n result.push({ property: prop, mapping: value });\n }\n }\n }\n return result;\n}\n\n/**\n * Convert a style mapping to class:list conditional entries.\n * For each value in the mapping, generates the utility class name and a ternary.\n */\nfunction mappingToClassListEntries(\n mapping: StyleMapping,\n property: string,\n breakpointPrefix: string,\n ctx: AstroEmitContext\n): string[] {\n const entries: string[] = [];\n const values = Object.entries(mapping.values);\n if (values.length === 0) return entries;\n\n // Generate utility class for each possible value\n const propRef = ctx.isComponentDef ? mapping.prop : mapping.prop;\n\n if (values.length === 2) {\n const [[val1, css1], [val2, css2]] = values;\n // Generate Tailwind classes for each possible mapping value\n const cls1 = getClassForValue(property, css1, breakpointPrefix);\n const cls2 = getClassForValue(property, css2, breakpointPrefix);\n if (cls1 && cls2) {\n // Use String() coercion so number props match string mapping keys (e.g., size=2 matches \"2\")\n entries.push(`String(${propRef}) === ${JSON.stringify(String(coerceValue(val1)))} ? '${cls1}' : '${cls2}'`);\n }\n } else {\n // Multiple values: use a lookup object or multiple ternaries\n for (const [val, cssValue] of values) {\n const cls = getClassForValue(property, cssValue, breakpointPrefix);\n if (cls) {\n entries.push(`String(${propRef}) === ${JSON.stringify(String(coerceValue(val)))} && '${cls}'`);\n }\n }\n }\n\n return entries;\n}\n\n/**\n * Convert a mapping key to the right JS type (booleans stay booleans)\n */\nfunction coerceValue(val: string): string | boolean {\n if (val === 'true') return true;\n if (val === 'false') return false;\n return val;\n}\n\n/**\n * Generate a Tailwind class name for a single property:value pair\n */\nfunction getClassForValue(\n property: string,\n value: string | number,\n breakpointPrefix: string\n): string | null {\n const twClass = propertyToTailwind(property, value);\n if (!twClass) return null;\n return breakpointPrefix ? `${breakpointPrefix}${twClass}` : twClass;\n}\n\n/**\n * Build the class list for a node, handling static Tailwind classes and mapping-based conditionals.\n * Also returns a style attribute string for dynamic (template-expression) styles.\n */\nfunction buildClassAndStyleExpression(\n style: StyleObject | ResponsiveStyleObject | undefined,\n interactiveStyles: InteractiveStyles | undefined,\n elementClass: string | null,\n ctx: AstroEmitContext\n): { classExpr: string; styleAttr: string } {\n // Static Tailwind classes from non-mapping styles\n const result = style\n ? responsiveStylesToTailwind(style, ctx.breakpoints, ctx.responsiveScales)\n : { classes: [], dynamicStyles: {} };\n const staticClasses = result.classes;\n const dynamicStyles = result.dynamicStyles;\n\n // Add element class for interactive styles\n if (elementClass) {\n staticClasses.unshift(elementClass);\n }\n\n // Collect mapping-based conditionals\n const conditionals: string[] = [];\n const mappings = collectStyleMappings(style);\n\n for (const { property, mapping, breakpoint } of mappings) {\n const bpValue = breakpoint === 'tablet'\n ? ctx.breakpoints.tablet?.breakpoint ?? 1024\n : breakpoint === 'mobile'\n ? ctx.breakpoints.mobile?.breakpoint ?? 540\n : 0;\n const prefix = bpValue ? `max-[${bpValue}px]:` : '';\n const entries = mappingToClassListEntries(mapping, property, prefix, ctx);\n conditionals.push(...entries);\n }\n\n // Build style attribute for dynamic (template expression) styles\n let styleAttr = '';\n if (Object.keys(dynamicStyles).length > 0 && ctx.isComponentDef) {\n const styleParts: string[] = [];\n for (const [cssProp, value] of Object.entries(dynamicStyles)) {\n // Convert {{propName}} to Astro expression in style\n const resolved = value.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n if (ctx.listItemBinding) trimmed = rewriteItemVar(trimmed, ctx.listItemBinding);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n return `\\${${trimmed}}`;\n });\n styleParts.push(`${cssProp}: \\${${resolved.includes('${') ? resolved.replace(/\\$\\{(.+?)\\}/g, '$1') : `'${resolved}'`}}`);\n }\n // Build as template literal style attribute\n const entries: string[] = [];\n for (const [cssProp, value] of Object.entries(dynamicStyles)) {\n const resolved = value.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n if (ctx.listItemBinding) trimmed = rewriteItemVar(trimmed, ctx.listItemBinding);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n return `\\${${trimmed}}`;\n });\n entries.push(`${cssProp}: ${resolved}`);\n }\n styleAttr = ` style={\\`${entries.join('; ')}\\`}`;\n }\n\n // Handle interactive style mappings: emit --is-N CSS variables as inline style\n if (interactiveStyles && interactiveStyles.length > 0 && ctx.isComponentDef && hasInteractiveStyleMappings(interactiveStyles)) {\n const { mappings } = extractInteractiveStyleMappings(interactiveStyles);\n if (mappings.length > 0) {\n // Group mappings by prop for efficient ternary generation\n const varParts: string[] = [];\n for (const extracted of mappings) {\n const { mapping, variableIndex } = extracted;\n const varName = `--is-${variableIndex}`;\n const entries = Object.entries(mapping.values);\n\n if (entries.length === 2) {\n const [[val1, css1], [val2, css2]] = entries;\n varParts.push(`'${varName}': ${mapping.prop} === ${JSON.stringify(coerceValue(val1))} ? '${css1}' : '${css2}'`);\n } else {\n // Build a lookup object inline\n const lookupEntries = entries\n .filter(([, v]) => v !== '')\n .map(([k, v]) => `${JSON.stringify(coerceValue(k))}: '${v}'`)\n .join(', ');\n varParts.push(`'${varName}': ({${lookupEntries}})[${mapping.prop}] || ''`);\n }\n }\n\n // Merge with existing dynamic styles\n if (varParts.length > 0) {\n const existingStyleParts = styleAttr\n ? styleAttr.replace(/^ style=\\{`/, '').replace(/`\\}$/, '')\n : '';\n const varStyleExpr = varParts.join(', ');\n if (existingStyleParts) {\n styleAttr = ` style={\\`${existingStyleParts}; \\${ Object.entries({${varStyleExpr}}).map(([k,v]) => \\`\\${k}:\\${v}\\`).join(';') }\\`}`;\n } else {\n styleAttr = ` style={Object.entries({${varStyleExpr}}).map(([k,v]) => \\`\\${k}:\\${v}\\`).join(';')}`;\n }\n }\n }\n }\n\n let classExpr: string;\n if (conditionals.length === 0) {\n // Pure static classes\n if (staticClasses.length === 0) {\n classExpr = '';\n } else {\n classExpr = ` class=\"${staticClasses.join(' ')}\"`;\n }\n } else {\n // Use class:list with both static and dynamic\n const parts: string[] = [];\n if (staticClasses.length > 0) {\n parts.push(`'${staticClasses.join(' ')}'`);\n }\n parts.push(...conditionals);\n classExpr = ` class:list={[${parts.join(', ')}]}`;\n }\n\n return { classExpr, styleAttr };\n}\n\n/**\n * Convert {{propName}} template to Astro expression\n */\nfunction resolveTemplate(text: string, ctx: AstroEmitContext): string {\n if (!ctx.isComponentDef) {\n // In page context, templates can't be resolved - return literal\n return text;\n }\n // Check if entire text is a single {{expression}}\n const fullMatch = text.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let propName = fullMatch[1].trim();\n if (ctx.listItemBinding) propName = rewriteItemVar(propName, ctx.listItemBinding);\n if (ctx.listIndexVar) propName = replaceItemMetaVars(propName, ctx.listIndexVar, ctx.listSourceVar);\n // Rich-text props contain HTML - render unescaped via set:html\n if (ctx.componentProps[propName]?.type === 'rich-text' || ctx.componentProps[propName]?.type === 'embed') {\n return `<Fragment set:html={${propName}} />`;\n }\n return `{${propName}}`;\n }\n // Mixed content: replace each {{expr}} with {expr}\n return text.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n if (ctx.listItemBinding) trimmed = rewriteItemVar(trimmed, ctx.listItemBinding);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n return `{${trimmed}}`;\n });\n}\n\n/**\n * Check if text contains template expressions\n */\nfunction hasTemplates(text: string): boolean {\n return /\\{\\{.+?\\}\\}/.test(text);\n}\n\n/**\n * Build element class name for interactive styles\n */\nfunction buildElementClass(\n ctx: AstroEmitContext,\n label: string | undefined\n): string {\n return generateElementClassName({\n fileType: ctx.fileType,\n fileName: ctx.fileName,\n label,\n path: ctx.elementPath,\n });\n}\n\n\n/**\n * Build HTML attributes string from node attributes\n */\nfunction buildAttributesString(\n attributes: Record<string, string | number | boolean> | undefined,\n ctx: AstroEmitContext\n): string {\n if (!attributes) return '';\n const parts: string[] = [];\n for (const [key, value] of Object.entries(attributes)) {\n if (typeof value === 'boolean') {\n if (value) parts.push(key);\n } else {\n const strVal = String(value);\n if (hasTemplates(strVal) && ctx.isComponentDef) {\n // Check if entire value is a single {{expression}}\n const fullMatch = strVal.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let expr = fullMatch[1].trim();\n if (ctx.listItemBinding) expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n const propDef = ctx.componentProps[expr];\n if (propDef && propDef.type === 'link') {\n parts.push(`${key}={${expr}?.href ?? \"#\"}`);\n } else {\n parts.push(`${key}={${expr} || undefined}`);\n }\n } else {\n // Mixed content: use template literal\n const resolved = strVal.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n if (ctx.listItemBinding) trimmed = rewriteItemVar(trimmed, ctx.listItemBinding);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n const pd = ctx.componentProps[trimmed];\n return pd?.type === 'link' ? `\\${${trimmed}?.href ?? \"#\"}` : `\\${${trimmed}}`;\n });\n parts.push(`${key}={\\`${resolved}\\`}`);\n }\n } else if (ctx.listItemBinding && hasTemplates(strVal)) {\n // List item binding: transform {{item.field}} in attributes\n const fullMatch = strVal.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let expr = fullMatch[1].trim();\n expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n parts.push(`${key}={${expr} || undefined}`);\n } else {\n const resolved = strVal.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n trimmed = rewriteItemVar(trimmed, ctx.listItemBinding!);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n return `\\${${trimmed}}`;\n });\n parts.push(`${key}={\\`${resolved}\\`}`);\n }\n } else if (ctx.cmsMode && /\\{\\{cms\\./.test(strVal)) {\n // CMS mode: transform {{cms.field}} in attributes\n const b = ctx.cmsEntryBinding || 'entry';\n const w = (expr: string) => ctx.cmsWrapFn ? `${ctx.cmsWrapFn}(${expr})` : expr;\n const fullMatch = strVal.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (fullMatch) {\n parts.push(`${key}={${w(`${b}.data.${fullMatch[1].trim()}`)}}`);\n } else {\n const replaced = strVal.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (_, fieldPath) => {\n return `\\${${w(`${b}.data.${fieldPath.trim()}`)}}`;\n });\n parts.push(`${key}={\\`${replaced}\\`}`);\n }\n } else {\n parts.push(`${key}=\"${escapeJSX(strVal)}\"`);\n }\n }\n }\n return parts.length > 0 ? ' ' + parts.join(' ') : '';\n}\n\n/**\n * Format a prop value for Astro template usage\n */\nfunction formatPropValue(value: unknown): string {\n value = stripRawHtmlPrefixDeep(value);\n if (typeof value === 'string') return `\"${escapeJSX(value)}\"`;\n if (typeof value === 'number') return `{${value}}`;\n if (typeof value === 'boolean') return `{${value}}`;\n if (value === null || value === undefined) return `{undefined}`;\n // Objects/arrays\n return `{${JSON.stringify(value)}}`;\n}\n\n// ---------------------------------------------------------------------------\n// Main recursive converter\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve an i18n value to a locale string using the context locale.\n * Returns the original value unchanged if it's not an i18n object or no locale is set.\n */\nfunction resolveI18n(value: unknown, ctx: AstroEmitContext): unknown {\n if (ctx.locale && isI18nValue(value)) {\n return resolveI18nValue(value, ctx.locale, DEFAULT_I18N_CONFIG);\n }\n return value;\n}\n\n/**\n * Convert a ComponentNode tree to Astro template markup\n */\nexport function nodeToAstro(\n node: ComponentNode | ComponentNode[] | string | number | null | undefined,\n ctx: AstroEmitContext\n): string {\n if (node === null || node === undefined) return '';\n\n // Resolve i18n objects to locale strings before further processing\n if (typeof node === 'object' && !Array.isArray(node) && isI18nValue(node)) {\n const resolved = resolveI18n(node, ctx);\n if (typeof resolved === 'string') {\n // Delegate to the text-node path so RAW_HTML_PREFIX gets emitted via <Fragment set:html>.\n return nodeToAstro(resolved, ctx);\n }\n // In component def without locale: wrap with r() resolver\n if (ctx.isComponentDef && isI18nValue(resolved)) {\n ctx.needsI18nResolver = true;\n return `${ind(ctx)}{r(${JSON.stringify(stripRawHtmlPrefixDeep(resolved))})}\\n`;\n }\n // If resolution returned a non-string (e.g. array), stringify it\n return `${ind(ctx)}${String(resolved ?? '')}\\n`;\n }\n\n // Text/number\n if (typeof node === 'string') {\n // CMS mode: transform {{cms.field}} expressions to entry data access\n if (ctx.cmsMode && isTemplateExpression(node) && /\\{\\{cms\\./.test(node)) {\n const transformed = transformCMSTemplate(node, ctx.cmsEntryBinding || 'entry', ctx.cmsRichTextFields, ctx.cmsWrapFn);\n return `${ind(ctx)}${transformed}\\n`;\n }\n // List item binding: transform {{item.field}} expressions\n if (ctx.listItemBinding && isTemplateExpression(node)) {\n const transformed = transformItemTemplate(node, ctx.listItemBinding, ctx.listIndexVar, ctx.listSourceVar);\n return `${ind(ctx)}${transformed}\\n`;\n }\n if (hasTemplates(node) && ctx.isComponentDef) {\n return `${ind(ctx)}${resolveTemplate(node, ctx)}\\n`;\n }\n // Raw HTML marker (from rich-text fields) - render unescaped via set:html.\n // Prefer the SSR-processed HTML when available so image rewriting, component\n // expansion, and link localization match what meno-core renders at runtime.\n if (node.startsWith(RAW_HTML_PREFIX)) {\n const rawSlice = node.slice(RAW_HTML_PREFIX.length);\n const rawHtml = ctx.processedRawHtml?.get(rawSlice) ?? rawSlice;\n return `${ind(ctx)}<Fragment set:html={\\`${escapeTemplateLiteral(rawHtml)}\\`} />\\n`;\n }\n return `${ind(ctx)}${escapeJSX(node)}\\n`;\n }\n if (typeof node === 'number') {\n return `${ind(ctx)}${node}\\n`;\n }\n\n // Array of nodes \u2013 replace the last path segment (matches SSR renderer's top-level array convention)\n if (Array.isArray(node)) {\n let result = '';\n for (let i = 0; i < node.length; i++) {\n const child = node[i];\n const savedPath = [...ctx.elementPath];\n ctx.elementPath = [...ctx.elementPath.slice(0, -1), i];\n result += nodeToAstro(child, ctx);\n ctx.elementPath = savedPath;\n }\n return result;\n }\n\n // Dispatch by node type (cast to string for legacy type values like 'cms-list', 'image')\n switch (node.type as string) {\n case NODE_TYPE.NODE:\n return emitHtmlNode(node as HtmlNode, ctx);\n case NODE_TYPE.COMPONENT:\n return emitComponentInstance(node as ComponentInstanceNode, ctx);\n case NODE_TYPE.SLOT:\n return emitSlotMarker(node as SlotMarker, ctx);\n case NODE_TYPE.EMBED:\n return emitEmbedNode(node as EmbedNode, ctx);\n case NODE_TYPE.LINK:\n return emitLinkNode(node as LinkNode, ctx);\n case NODE_TYPE.LOCALE_LIST:\n return emitLocaleListNode(node as LocaleListNode, ctx);\n case NODE_TYPE.LIST:\n case 'cms-list':\n return emitListNode(node as ListNode, ctx);\n case 'image':\n return emitImageTypeNode(node, ctx);\n default:\n return emitFallback(ctx);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Node type emitters\n// ---------------------------------------------------------------------------\n\n/**\n * Tailwind class prefixes that belong on the <img> element (not the <picture> wrapper).\n * These correspond to image-specific visual properties.\n */\nconst IMG_TAILWIND_PREFIXES = ['object-', 'rounded', 'border', 'shadow', '[filter', '[transform', 'mix-blend'];\nconst IMG_OPACITY_PATTERN = /^opacity-/;\n\n/**\n * Default sizes attribute for responsive images\n */\nconst DEFAULT_SIZES = '100vw';\n\n/**\n * Tailwind classes applied to the inner <img> so it fills its wrapper (<picture>)\n * when a responsive/blurred image wraps the element.\n */\nconst IMG_FILL_CLASSES = ['block', 'w-full', 'h-full'];\n\n/**\n * Split Tailwind classes into picture (layout) and img (visual) groups.\n * Layout classes go on <picture>, image-specific classes go on <img>.\n */\nfunction splitImageClasses(allClasses: string[]): { pictureClasses: string[]; imgClasses: string[] } {\n const imgClasses: string[] = [];\n const pictureClasses: string[] = [];\n\n for (const cls of allClasses) {\n // Strip responsive prefix (e.g., \"md:object-cover\" -> \"object-cover\") for matching\n const baseCls = cls.includes(':') ? cls.split(':').pop()! : cls;\n if (IMG_TAILWIND_PREFIXES.some(p => baseCls.startsWith(p)) || IMG_OPACITY_PATTERN.test(baseCls)) {\n imgClasses.push(cls);\n } else {\n pictureClasses.push(cls);\n }\n }\n\n return { pictureClasses, imgClasses };\n}\n\n/**\n * Extract a pixel width from a style value. Returns null for %, vw, auto,\n * or any other non-px value we can't translate into a sizes hint.\n */\nfunction extractPxWidth(val: unknown): number | null {\n if (typeof val === 'number' && Number.isFinite(val) && val > 0) return val;\n if (typeof val !== 'string') return null;\n const match = val.trim().match(/^(\\d+(?:\\.\\d+)?)px$/);\n if (!match) return null;\n const n = parseFloat(match[1]);\n return n > 0 ? n : null;\n}\n\n/**\n * Compute a `sizes` attribute from a node's responsive style + breakpoint config.\n * Produces something like `(max-width: 540px) 400px, (max-width: 1024px) 500px, 700px`\n * so the browser can pick the smallest srcset variant that covers the rendered width\n * at each viewport. Falls back to `100vw` when no usable px width is available.\n */\nfunction computeSizesAttribute(\n style: StyleObject | ResponsiveStyleObject | undefined,\n breakpoints: BreakpointConfig\n): string {\n if (!style) return DEFAULT_SIZES;\n\n const responsive = isResponsiveStyle(style as any);\n const baseStyle: StyleObject | undefined = responsive\n ? (style as ResponsiveStyleObject).base\n : (style as StyleObject);\n\n // Base (desktop) width \u2014 the biggest viewport\n const baseWidth = baseStyle ? extractPxWidth((baseStyle as StyleObject).width) : null;\n // If even the base width is unknown, nothing we can do \u2014 use 100vw.\n if (baseWidth == null) return DEFAULT_SIZES;\n\n // Walk breakpoints from smallest to largest so the emitted media queries\n // are ordered from narrowest to widest, with the unconditional base last.\n const bpEntries = Object.entries(breakpoints).sort(\n (a, b) => a[1].breakpoint - b[1].breakpoint\n );\n\n const parts: string[] = [];\n // Track the \"effective\" width as we walk up: if a breakpoint doesn't set its\n // own width, it inherits from the next step up, and ultimately from base.\n // We walk ascending, so we need to resolve by looking from smallest bp up to base.\n for (const [name, entry] of bpEntries) {\n let effective: number | null = null;\n if (responsive) {\n // Look at this bp, then larger bps, then base\n const bpStyle = (style as ResponsiveStyleObject)[name];\n effective = bpStyle ? extractPxWidth((bpStyle as StyleObject).width) : null;\n if (effective == null) {\n // Inherit from next-larger breakpoint(s)\n for (const [largerName, largerEntry] of bpEntries) {\n if (largerEntry.breakpoint <= entry.breakpoint) continue;\n const largerStyle = (style as ResponsiveStyleObject)[largerName];\n const larger = largerStyle ? extractPxWidth((largerStyle as StyleObject).width) : null;\n if (larger != null) {\n effective = larger;\n break;\n }\n }\n }\n if (effective == null) effective = baseWidth;\n } else {\n effective = baseWidth;\n }\n parts.push(`(max-width: ${entry.breakpoint}px) ${effective}px`);\n }\n parts.push(`${baseWidth}px`);\n return parts.join(', ');\n}\n\n/**\n * Merge additional CSS declarations into an existing ` style=\"...\"` attribute\n * string. If no style attribute exists yet, builds one. The inputs are raw CSS\n * already escaped for HTML attribute context.\n */\nfunction injectInlineStyle(styleAttr: string, extraCss: string): string {\n if (!extraCss) return styleAttr;\n if (!styleAttr) return ` style=\"${extraCss}\"`;\n return styleAttr.replace(/style=\"([^\"]*)\"/, (_, existing: string) => {\n const trimmed = existing.trimEnd();\n const sep = trimmed.length > 0 && !trimmed.endsWith(';') ? ';' : '';\n return `style=\"${existing}${sep}${extraCss}\"`;\n });\n}\n\n/**\n * Emit an <img> node as a <picture> element with AVIF/WebP sources when\n * image metadata is available, or as a plain <img> with srcset otherwise.\n */\n// Widths used for <Picture> srcset generation. Mirrors\n// RESPONSIVE_WIDTHS in imageMetadata.ts.\nconst PICTURE_WIDTHS = [500, 800, 1080, 1600, 2400];\n\n/**\n * Turn an image path like `/images/sub/hero-photo.jpg` into a stable JS\n * identifier (`imgSubHeroPhoto`) for use as an ESM import variable.\n */\nfunction imagePathToVarName(srcPath: string): string {\n const stripped = srcPath.replace(/^\\/+/, '').replace(/^images\\//, '').replace(/\\.[^.]+$/, '');\n const parts = stripped.split(/[/_\\-\\s.]+/).filter(Boolean);\n if (parts.length === 0) return 'imgAsset';\n const camel = parts\n .map((p, i) => {\n const clean = p.replace(/[^a-zA-Z0-9]/g, '');\n if (!clean) return '';\n if (i === 0) return clean.toLowerCase();\n return clean[0].toUpperCase() + clean.slice(1).toLowerCase();\n })\n .join('');\n if (!camel) return 'imgAsset';\n return 'img' + camel[0].toUpperCase() + camel.slice(1);\n}\n\n/**\n * Compute an ESM import path relative to the emitting file for a Meno image\n * URL. For file depth N (e.g. `src/pages/en/about.astro` is depth 1), the\n * path is `'../'.repeat(N + 1) + 'assets/images/<rest>'`.\n */\nfunction imageImportPath(srcPath: string, fileDepth: number): string {\n const rest = srcPath.replace(/^\\/+/, '').replace(/^images\\//, '');\n const ups = '../'.repeat(Math.max(0, fileDepth) + 1);\n return `${ups}assets/images/${rest}`;\n}\n\n/**\n * Decide whether an image src can be switched to <Picture>. Only plain\n * literal local paths (`/images/...`) with known metadata qualify \u2014 CMS\n * templates, list-item bindings, component props, and remote URLs take the\n * legacy <img>/<picture> path.\n */\nfunction isStaticImageSrc(src: string | undefined, ctx: AstroEmitContext): src is string {\n if (!src) return false;\n if (typeof src !== 'string') return false;\n if (hasTemplates(src)) return false;\n if (!src.startsWith('/images/')) return false;\n if (!ctx.imageMetadataMap?.has(src)) return false;\n return true;\n}\n\n/**\n * Register (or reuse) an ESM image import on the emit context. Returns the\n * JS variable name to reference in the generated template.\n */\nfunction registerStaticImageImport(src: string, ctx: AstroEmitContext): string {\n if (!ctx.imageImports) ctx.imageImports = new Map();\n const depth = ctx.fileDepth ?? 0;\n const importPath = imageImportPath(src, depth);\n\n for (const [existingName, existingPath] of ctx.imageImports) {\n if (existingPath === importPath) return existingName;\n }\n\n const base = imagePathToVarName(src);\n let name = base;\n let counter = 2;\n while (ctx.imageImports.has(name)) {\n name = `${base}${counter++}`;\n }\n ctx.imageImports.set(name, importPath);\n return name;\n}\n\n/**\n * Split a static `classExpr` into the outer layout classes (for <picture> /\n * wrapper) and the inner image classes (for the emitted <img> inside\n * <Picture>). Mirrors `splitImageClasses()` used by the legacy emitter so\n * object-cover / opacity-* keep landing on the <img>. Returns null when the\n * class expression is dynamic (class:list) \u2014 callers fall back to div wrap.\n */\nfunction splitStaticClassExpr(\n classExpr: string\n): { outerClasses: string[]; innerClasses: string[] } | null {\n if (classExpr.includes('class:list=')) return null;\n const classMatch = classExpr.match(/class=\"([^\"]*)\"/);\n if (!classMatch) return { outerClasses: [], innerClasses: [] };\n const all = classMatch[1].split(/\\s+/).filter(Boolean);\n const { pictureClasses, imgClasses } = splitImageClasses(all);\n return { outerClasses: pictureClasses, innerClasses: imgClasses };\n}\n\n/**\n * Format a static class+style pair as an Astro `pictureAttributes={{...}}`\n * prop. `classValue` comes pre-split (outer layout classes only).\n */\nfunction formatPictureAttributesProp(\n classValue: string,\n styleAttr: string\n): string {\n const styleMatch = styleAttr.match(/style=\"([^\"]*)\"/);\n const parts: string[] = [];\n if (classValue) parts.push(`class: ${JSON.stringify(classValue)}`);\n if (styleMatch) parts.push(`style: ${JSON.stringify(styleMatch[1])}`);\n if (parts.length === 0) return '';\n return ` pictureAttributes={{${parts.join(', ')}}}`;\n}\n\n/**\n * Emit a static local image as an astro:assets <Picture>. Called only after\n * isStaticImageSrc() has passed. Non-static paths should never reach here.\n */\nfunction emitStaticPictureImage(\n src: string,\n alt: string | undefined,\n loading: string | undefined,\n fetchpriority: string | undefined,\n sizesValue: string,\n classExpr: string,\n styleAttr: string,\n ifExpr: string,\n ifClose: string,\n blurHash: string | undefined,\n ctx: AstroEmitContext\n): string {\n const varName = registerStaticImageImport(src, ctx);\n\n const widthsLiteral = `[${PICTURE_WIDTHS.join(', ')}]`;\n const altAttr = alt !== undefined ? ` alt=\"${escapeJSX(String(alt))}\"` : ' alt=\"\"';\n const loadingAttr = loading ? ` loading=\"${escapeJSX(loading)}\"` : '';\n const fetchpriorityAttr = fetchpriority ? ` fetchpriority=\"${escapeJSX(fetchpriority)}\"` : '';\n\n // Split classes so object-cover / opacity land on the <img>, not the\n // outer <picture>/wrapper. splitStaticClassExpr returns null for dynamic\n // class:list \u2014 callers fall back to a <div> wrapper without splitting.\n const split = splitStaticClassExpr(classExpr);\n\n if (blurHash) {\n // Blur placeholder: put the blur background-image + layout classes on\n // the <picture> element via pictureAttributes. This mirrors the legacy\n // path where <picture> was both the blur host and layout container.\n // The inner <img> gets fill + img-specific classes and clears the blur\n // on load via this.parentElement (direct parent = <picture>).\n const blurCss = `background-image:url(${escapeJSX(blurHash)});background-size:cover`;\n const blurStyleAttr = injectInlineStyle(styleAttr, blurCss);\n const onloadAttr = ` onload=\"this.parentElement.style.backgroundImage=''\"`;\n\n if (split) {\n const outerClassValue = split.outerClasses.join(' ');\n const pictureAttrs = formatPictureAttributesProp(outerClassValue, blurStyleAttr);\n const innerClasses = [...split.innerClasses, ...IMG_FILL_CLASSES];\n const innerClassAttr = ` class=\"${innerClasses.join(' ')}\"`;\n return `${ifExpr}${ind(ctx)}<Picture${pictureAttrs} src={${varName}}${altAttr}${innerClassAttr} formats={['avif','webp']} widths={${widthsLiteral}} sizes=\"${escapeJSX(sizesValue)}\"${loadingAttr}${fetchpriorityAttr}${onloadAttr} />\\n${ifClose}`;\n }\n\n // Dynamic class:list: fall back to a <div> wrapper since we can't\n // convert class:list to a pictureAttributes JS object.\n const wrapperClassExpr = classExpr;\n const wrapperStyleAttr = injectInlineStyle(styleAttr, blurCss);\n const fillClassAttr = ` class=\"${IMG_FILL_CLASSES.join(' ')}\"`;\n return (\n `${ifExpr}${ind(ctx)}<div${wrapperClassExpr}${wrapperStyleAttr}>\\n` +\n `${ind(ctx)} <Picture pictureAttributes={{class: \"${IMG_FILL_CLASSES.join(' ')}\"}} src={${varName}}${altAttr}${fillClassAttr} formats={['avif','webp']} widths={${widthsLiteral}} sizes=\"${escapeJSX(sizesValue)}\"${loadingAttr}${fetchpriorityAttr} onload=\"this.parentElement.parentElement.style.backgroundImage=''\" />\\n` +\n `${ind(ctx)}</div>\\n${ifClose}`\n );\n }\n\n // Non-blur case: forward outer classes via pictureAttributes so they land\n // on the <picture>, inner img-specific classes as `class` on <Picture>.\n if (split) {\n const outerClassValue = split.outerClasses.join(' ');\n const innerClassAttr = split.innerClasses.length > 0\n ? ` class=\"${split.innerClasses.join(' ')}\"`\n : '';\n const pictureAttrs = formatPictureAttributesProp(outerClassValue, styleAttr);\n return `${ifExpr}${ind(ctx)}<Picture${pictureAttrs} src={${varName}}${altAttr}${innerClassAttr} formats={['avif','webp']} widths={${widthsLiteral}} sizes=\"${escapeJSX(sizesValue)}\"${loadingAttr}${fetchpriorityAttr} />\\n${ifClose}`;\n }\n\n // Dynamic class:list: wrap in a <div> so the dynamic expression survives.\n return (\n `${ifExpr}${ind(ctx)}<div${classExpr}${styleAttr}>\\n` +\n `${ind(ctx)} <Picture src={${varName}}${altAttr} formats={['avif','webp']} widths={${widthsLiteral}} sizes=\"${escapeJSX(sizesValue)}\"${loadingAttr}${fetchpriorityAttr} />\\n` +\n `${ind(ctx)}</div>\\n${ifClose}`\n );\n}\n\nfunction emitImageNode(node: HtmlNode, ctx: AstroEmitContext): string {\n const style = node.style as StyleObject | ResponsiveStyleObject | undefined;\n\n // Element class for interactive styles\n let elementClass: string | null = null;\n if (\n (node.interactiveStyles && node.interactiveStyles.length > 0) ||\n node.generateElementClass\n ) {\n elementClass = buildElementClass(ctx, node.label);\n if (elementClass && node.interactiveStyles?.length && ctx.collectedInteractiveStyles) {\n ctx.collectedInteractiveStyles.set(elementClass, node.interactiveStyles as InteractiveStyles);\n }\n }\n\n const { classExpr, styleAttr } = buildClassAndStyleExpression(\n style,\n node.interactiveStyles as InteractiveStyles | undefined,\n elementClass,\n ctx\n );\n\n // Extract image-specific attributes\n const attrs = node.attributes || {};\n const src = attrs.src as string | undefined;\n const alt = attrs.alt as string | undefined;\n const loading = attrs.loading as string | undefined;\n const fetchpriority = attrs.fetchpriority as string | undefined;\n let width = attrs.width as string | number | undefined;\n let height = attrs.height as string | number | undefined;\n const sizes = attrs.sizes as string | undefined;\n\n // Look up image metadata\n const metadata = src ? ctx.imageMetadataMap?.get(String(src)) : undefined;\n\n // Use dimensions from metadata if not explicitly set\n if (metadata) {\n if (width === undefined && metadata.width) width = metadata.width;\n if (height === undefined && metadata.height) height = metadata.height;\n }\n\n // Compute real sizes from responsive style widths; user override wins.\n const sizesValue = sizes || computeSizesAttribute(style, ctx.breakpoints);\n\n // Static local image \u2192 astro:assets <Picture> (ESM import, Astro-managed\n // optimization). Predicate rejects CMS/list/template/remote src.\n if (isStaticImageSrc(src, ctx)) {\n return emitStaticPictureImage(\n src,\n alt,\n loading,\n fetchpriority,\n sizesValue,\n classExpr,\n styleAttr,\n emitIfOpen(node, ctx),\n emitIfClose(node, ctx),\n metadata?.blurHash,\n ctx\n );\n }\n\n // Build remaining attributes (exclude image-specific ones we handle manually)\n const imageSpecificKeys = new Set(['src', 'alt', 'loading', 'width', 'height', 'sizes', 'srcset', 'fetchpriority']);\n const otherAttrs: Record<string, string | number | boolean> = {};\n if (node.attributes) {\n for (const [k, v] of Object.entries(node.attributes)) {\n if (!imageSpecificKeys.has(k)) otherAttrs[k] = v;\n }\n }\n const otherAttrsStr = buildAttributesString(otherAttrs, ctx);\n\n // Build core img attributes (with CMS/list template support)\n let imgAttrs = '';\n if (src) imgAttrs += ` ${emitAttrValue('src', String(src), ctx)}`;\n if (alt !== undefined) imgAttrs += ` ${emitAttrValue('alt', String(alt), ctx)}`;\n if (fetchpriority) imgAttrs += ` fetchpriority=\"${escapeJSX(String(fetchpriority))}\"`;\n if (loading) imgAttrs += ` loading=\"${escapeJSX(String(loading))}\"`;\n if (width !== undefined) imgAttrs += ` width=\"${escapeJSX(String(width))}\"`;\n if (height !== undefined) imgAttrs += ` height=\"${escapeJSX(String(height))}\"`;\n\n const hasAvif = !!(metadata?.avifSrcset && ctx.imageFormat !== 'webp');\n const hasBlur = !!metadata?.blurHash;\n // Any time we need a wrapper to host the blur placeholder or <source> tags.\n const useWrapper = hasAvif || hasBlur;\n\n // Blur placeholder is painted on the wrapper element (NOT the <img>, which\n // is a replaced element and doesn't paint CSS backgrounds reliably).\n // Once the real image loads we clear the background on the wrapper so the\n // low-quality placeholder disappears.\n const blurWrapperCss = hasBlur\n ? `background-image:url(${escapeJSX(metadata!.blurHash!)});background-size:cover`\n : '';\n const blurOnload = hasBlur\n ? ` onload=\"this.parentElement.style.backgroundImage=''\"`\n : '';\n\n // Conditional rendering\n const ifExpr = emitIfOpen(node, ctx);\n const ifClose = emitIfClose(node, ctx);\n\n if (useWrapper) {\n // The inner <img> must fill the picture wrapper; otherwise it renders at\n // its intrinsic size and the wrapper's layout (w/h/position) is wasted.\n const imgFillClasses = IMG_FILL_CLASSES.slice();\n\n const classListMatch = classExpr.match(/class:list={\\[(.+)\\]}/);\n const classMatch = classExpr.match(/class=\"([^\"]*)\"/);\n\n let pictureClassExpr = '';\n let imgClassAttr = '';\n if (classListMatch) {\n // Dynamic class:list - put it all on the picture. The inner img only\n // needs fill classes (splitting dynamic class lists isn't worth it).\n pictureClassExpr = classExpr;\n imgClassAttr = ` class=\"${imgFillClasses.join(' ')}\"`;\n } else {\n const allClasses = classMatch ? classMatch[1].split(/\\s+/).filter(Boolean) : [];\n const { pictureClasses, imgClasses } = splitImageClasses(allClasses);\n const fullImgClasses = [...imgClasses, ...imgFillClasses];\n pictureClassExpr = pictureClasses.length > 0 ? ` class=\"${pictureClasses.join(' ')}\"` : '';\n imgClassAttr = fullImgClasses.length > 0 ? ` class=\"${fullImgClasses.join(' ')}\"` : '';\n }\n\n const wrapperStyleAttr = injectInlineStyle(styleAttr, blurWrapperCss);\n\n // With AVIF: full <picture> + <source> elements\n if (hasAvif) {\n return (\n `${ifExpr}${ind(ctx)}<picture${pictureClassExpr}${wrapperStyleAttr}>\\n` +\n `${ind(ctx)} <source type=\"image/avif\" srcset=\"${escapeJSX(metadata!.avifSrcset!)}\" sizes=\"${escapeJSX(sizesValue)}\" />\\n` +\n `${ind(ctx)} <source type=\"image/webp\" srcset=\"${escapeJSX(metadata!.srcset)}\" sizes=\"${escapeJSX(sizesValue)}\" />\\n` +\n `${ind(ctx)} <img${imgClassAttr}${imgAttrs}${blurOnload}${otherAttrsStr} />\\n` +\n `${ind(ctx)}</picture>\\n${ifClose}`\n );\n }\n\n // No AVIF, but we still need the wrapper for blur. Put srcset on the <img>\n // itself since we're not using <source>.\n if (metadata?.srcset) {\n imgAttrs += ` srcset=\"${escapeJSX(metadata.srcset)}\"`;\n imgAttrs += ` sizes=\"${escapeJSX(sizesValue)}\"`;\n }\n return (\n `${ifExpr}${ind(ctx)}<picture${pictureClassExpr}${wrapperStyleAttr}>\\n` +\n `${ind(ctx)} <img${imgClassAttr}${imgAttrs}${blurOnload}${otherAttrsStr} />\\n` +\n `${ind(ctx)}</picture>\\n${ifClose}`\n );\n }\n\n // No wrapper needed: plain <img> with optional srcset/sizes\n if (metadata?.srcset) {\n imgAttrs += ` srcset=\"${escapeJSX(metadata.srcset)}\"`;\n imgAttrs += ` sizes=\"${escapeJSX(sizesValue)}\"`;\n }\n\n return `${ifExpr}${ind(ctx)}<img${classExpr}${styleAttr}${imgAttrs}${otherAttrsStr} />\\n${ifClose}`;\n}\n\nfunction emitHtmlNode(node: HtmlNode, ctx: AstroEmitContext): string {\n let tag = node.tag;\n\n // Astro treats capitalized tags as component imports \u2014 lowercase custom tags to avoid this\n if (tag && /^[A-Z]/.test(tag)) {\n tag = tag.toLowerCase();\n }\n\n // Delegate img tags to the image-specific emitter when metadata is available\n if (tag === 'img' && ctx.imageMetadataMap) {\n return emitImageNode(node, ctx);\n }\n\n const label = node.label;\n const style = node.style as StyleObject | ResponsiveStyleObject | undefined;\n\n // Handle dynamic tags: <h{{size}}> \u2192 define Tag variable in frontmatter, use <Tag> in template\n let isDynamic = false;\n let dynamicTagVar = '';\n if (hasTemplates(tag) && ctx.isComponentDef) {\n isDynamic = true;\n // Generate a unique variable name based on element path\n dynamicTagVar = `Tag_${ctx.elementPath.join('_')}`;\n const resolved = tag.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => `\\${${expr.trim()}}`);\n // Register dynamic tag for frontmatter emission\n if (!ctx.dynamicTags) ctx.dynamicTags = new Map();\n ctx.dynamicTags.set(dynamicTagVar, resolved);\n tag = dynamicTagVar;\n }\n\n // Conditional rendering\n const ifExpr = emitIfOpen(node, ctx);\n\n // Element class for interactive styles\n let elementClass: string | null = null;\n if (\n (node.interactiveStyles && node.interactiveStyles.length > 0) ||\n node.generateElementClass\n ) {\n elementClass = buildElementClass(ctx, label);\n if (elementClass && node.interactiveStyles?.length && ctx.collectedInteractiveStyles) {\n ctx.collectedInteractiveStyles.set(elementClass, node.interactiveStyles as InteractiveStyles);\n }\n }\n\n const { classExpr, styleAttr } = buildClassAndStyleExpression(style, node.interactiveStyles as InteractiveStyles | undefined, elementClass, ctx);\n const attrs = buildAttributesString(node.attributes, ctx);\n\n // Dynamic tags use the variable name directly (capitalized, defined in frontmatter)\n const openClose = isDynamic ? dynamicTagVar : tag;\n\n if (!isDynamic && isVoidElement(tag)) {\n return `${ifExpr}${ind(ctx)}<${tag}${classExpr}${styleAttr}${attrs} />\\n${emitIfClose(node, ctx)}`;\n }\n\n const children = emitChildren(node.children, ctx);\n\n if (!children.trim() && !isDynamic) {\n return `${ifExpr}${ind(ctx)}<${tag}${classExpr}${styleAttr}${attrs} />\\n${emitIfClose(node, ctx)}`;\n }\n\n return (\n `${ifExpr}${ind(ctx)}<${openClose}${classExpr}${styleAttr}${attrs}>\\n` +\n children +\n `${ind(ctx)}</${openClose}>\\n${emitIfClose(node, ctx)}`\n );\n}\n\nfunction emitComponentInstance(node: ComponentInstanceNode, ctx: AstroEmitContext): string {\n const name = astroComponentName(node.component);\n ctx.imports.add(node.component);\n\n const ifExpr = emitIfOpen(node, ctx);\n\n // Build prop expressions\n const propParts: string[] = [];\n if (node.props) {\n for (const [key, rawValue] of Object.entries(node.props)) {\n if (key === 'children') continue;\n\n // Resolve i18n values to the page locale\n const value = resolveI18n(rawValue, ctx);\n\n // Resolve template expressions in string props when inside component def\n if (typeof value === 'string' && hasTemplates(value) && ctx.isComponentDef) {\n const fullMatch = value.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let expr = fullMatch[1].trim();\n if (ctx.listItemBinding) expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n propParts.push(`${key}={${expr}}`);\n } else {\n const resolved = value.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n if (ctx.listItemBinding) trimmed = rewriteItemVar(trimmed, ctx.listItemBinding);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n return `\\${${trimmed}}`;\n });\n propParts.push(`${key}={\\`${resolved}\\`}`);\n }\n } else if (typeof value === 'string' && ctx.cmsMode && /\\{\\{cms\\./.test(value)) {\n const b = ctx.cmsEntryBinding || 'entry';\n const w = (expr: string) => ctx.cmsWrapFn ? `${ctx.cmsWrapFn}(${expr})` : expr;\n const fullMatch = value.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (fullMatch) {\n propParts.push(`${key}={${w(`${b}.data.${fullMatch[1].trim()}`)}}`);\n } else {\n const replaced = value.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (_, fieldPath) => {\n return `\\${${w(`${b}.data.${fieldPath.trim()}`)}}`;\n });\n propParts.push(`${key}={\\`${replaced}\\`}`);\n }\n } else if (ctx.isComponentDef && isI18nValue(value)) {\n // i18n object in component def \u2014 wrap with r() resolver (resolved at runtime via Astro.currentLocale)\n ctx.needsI18nResolver = true;\n propParts.push(`${key}={r(${JSON.stringify(stripRawHtmlPrefixDeep(value))})}`);\n } else {\n // Rich-text / embed props contain HTML/SVG \u2014 pass as template literal\n // so the component can render via set:html without entity escaping\n const targetInterface = ctx.globalComponents[name]?.component?.interface;\n const propDef = targetInterface?.[key];\n if (typeof value === 'string' && (propDef?.type === 'rich-text' || propDef?.type === 'embed')) {\n propParts.push(`${key}={\\`${escapeTemplateLiteral(stripRawHtmlPrefixDeep(value) as string)}\\`}`);\n } else {\n propParts.push(`${key}=${formatPropValue(value)}`);\n }\n }\n }\n }\n\n // Instance-level style overrides as className (Tailwind)\n if (node.style) {\n const { classes: instanceClasses } = responsiveStylesToTailwind(node.style as StyleObject | ResponsiveStyleObject, ctx.breakpoints, ctx.responsiveScales);\n if (instanceClasses.length > 0) {\n propParts.push(`class=\"${instanceClasses.join(' ')}\"`);\n }\n }\n\n const propsStr = propParts.length > 0 ? ' ' + propParts.join(' ') : '';\n\n // Reset elementPath to [0] when entering a component instance, matching SSR's\n // renderComponent behavior. This ensures hash-based element class names for\n // slot content are identical between SSR (CSS) and Astro (HTML).\n const childCtx = { ...ctx, elementPath: [0] };\n const children = emitChildren(node.children, childCtx);\n\n if (!children.trim()) {\n return `${ifExpr}${ind(ctx)}<${name}${propsStr} />\\n${emitIfClose(node, ctx)}`;\n }\n\n return (\n `${ifExpr}${ind(ctx)}<${name}${propsStr}>\\n` +\n children +\n `${ind(ctx)}</${name}>\\n${emitIfClose(node, ctx)}`\n );\n}\n\nfunction emitSlotMarker(node: SlotMarker, ctx: AstroEmitContext): string {\n if (node.default) {\n const defaultContent = emitChildren(node.default as (ComponentNode | string)[] | string | undefined, ctx);\n if (defaultContent.trim()) {\n return (\n `${ind(ctx)}<slot>\\n` +\n defaultContent +\n `${ind(ctx)}</slot>\\n`\n );\n }\n }\n return `${ind(ctx)}<slot />\\n`;\n}\n\nfunction emitEmbedNode(node: EmbedNode, ctx: AstroEmitContext): string {\n const ifExpr = emitIfOpen(node, ctx);\n const style = node.style as StyleObject | ResponsiveStyleObject | undefined;\n\n let elementClass: string | null = null;\n if (\n (node.interactiveStyles && node.interactiveStyles.length > 0) ||\n node.generateElementClass\n ) {\n elementClass = buildElementClass(ctx, node.label);\n if (elementClass && node.interactiveStyles?.length && ctx.collectedInteractiveStyles) {\n ctx.collectedInteractiveStyles.set(elementClass, node.interactiveStyles as InteractiveStyles);\n }\n }\n\n const { classExpr, styleAttr } = buildClassAndStyleExpression(style, node.interactiveStyles as InteractiveStyles | undefined, elementClass, ctx);\n const attrs = buildAttributesString(node.attributes, ctx);\n\n // Handle HTML mapping (prop-dependent content)\n if (isHtmlMapping(node.html)) {\n if (ctx.isComponentDef) {\n const propRef = node.html.prop;\n return (\n `${ifExpr}${ind(ctx)}<div${classExpr.replace('\"', '\"oem ') || ' class=\"oem\"'}${attrs}>\\n` +\n `${ind(ctx)} <Fragment set:html={${propRef}} />\\n` +\n `${ind(ctx)}</div>\\n${emitIfClose(node, ctx)}`\n );\n }\n }\n\n // Handle template expressions in HTML string (e.g., \"{{icon}}\")\n if (typeof node.html === 'string' && hasTemplates(node.html) && ctx.isComponentDef) {\n const fullMatch = node.html.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let propRef = fullMatch[1].trim();\n if (ctx.listItemBinding) propRef = rewriteItemVar(propRef, ctx.listItemBinding);\n if (ctx.listIndexVar) propRef = replaceItemMetaVars(propRef, ctx.listIndexVar, ctx.listSourceVar);\n\n let tplClassExpr = classExpr;\n if (!classExpr.includes('oem')) {\n if (classExpr) {\n tplClassExpr = classExpr.replace(/class=\"/, 'class=\"oem ').replace(/class:list={\\['/, \"class:list={['oem \");\n } else {\n tplClassExpr = ' class=\"oem\"';\n }\n }\n\n return (\n `${ifExpr}${ind(ctx)}<div${tplClassExpr}${attrs}>\\n` +\n `${ind(ctx)} <Fragment set:html={${propRef}} />\\n` +\n `${ind(ctx)}</div>\\n${emitIfClose(node, ctx)}`\n );\n }\n }\n\n const htmlStr = typeof node.html === 'string' ? node.html : '';\n const escapedHtml = escapeTemplateLiteral(htmlStr);\n\n // Ensure oem class is present\n let finalClassExpr = classExpr;\n if (!classExpr.includes('oem')) {\n if (classExpr) {\n finalClassExpr = classExpr.replace(/class=\"/, 'class=\"oem ').replace(/class:list={\\['/, \"class:list={['oem \");\n } else {\n finalClassExpr = ' class=\"oem\"';\n }\n }\n\n return (\n `${ifExpr}${ind(ctx)}<div${finalClassExpr}${attrs}>\\n` +\n `${ind(ctx)} <Fragment set:html={\\`${escapedHtml}\\`} />\\n` +\n `${ind(ctx)}</div>\\n${emitIfClose(node, ctx)}`\n );\n}\n\nfunction emitLinkNode(node: LinkNode, ctx: AstroEmitContext): string {\n const ifExpr = emitIfOpen(node, ctx);\n const style = node.style as StyleObject | ResponsiveStyleObject | undefined;\n\n let elementClass: string | null = null;\n if (\n (node.interactiveStyles && node.interactiveStyles.length > 0) ||\n node.generateElementClass\n ) {\n elementClass = buildElementClass(ctx, node.label);\n if (elementClass && node.interactiveStyles?.length && ctx.collectedInteractiveStyles) {\n ctx.collectedInteractiveStyles.set(elementClass, node.interactiveStyles as InteractiveStyles);\n }\n }\n\n // Build class expression with olink base class\n const { classExpr, styleAttr } = buildClassAndStyleExpression(style, node.interactiveStyles as InteractiveStyles | undefined, elementClass, ctx);\n let finalClassExpr = classExpr;\n if (!classExpr.includes('olink')) {\n if (classExpr) {\n finalClassExpr = classExpr.replace(/class=\"/, 'class=\"olink ').replace(/class:list={\\['/, \"class:list={['olink \");\n } else {\n finalClassExpr = ' class=\"olink\"';\n }\n }\n\n // Resolve i18n on href before processing\n const resolvedHref = resolveI18n(node.href, ctx);\n const nodeHref = resolvedHref as typeof node.href;\n\n // Handle href\n let hrefAttr: string;\n if (isLinkMapping(nodeHref)) {\n if (ctx.isComponentDef) {\n const propRef = (nodeHref as LinkMapping).prop;\n // Link props are objects with {href, target?}\n hrefAttr = ` href={${propRef}?.href ?? \"#\"}`;\n } else {\n hrefAttr = ' href=\"#\"';\n }\n } else {\n const href = typeof nodeHref === 'string' ? nodeHref : '#';\n if (hasTemplates(href) && ctx.isComponentDef) {\n const fullMatch = href.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let expr = fullMatch[1].trim();\n if (ctx.listItemBinding) expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n const propDef = ctx.componentProps[expr];\n if (propDef && propDef.type === 'link') {\n hrefAttr = ` href={${expr}?.href ?? \"#\"}`;\n } else {\n hrefAttr = ` href={${expr}}`;\n }\n } else {\n const resolved = href.replace(/\\{\\{(.+?)\\}\\}/g, (_, expr) => {\n let trimmed = expr.trim();\n if (ctx.listItemBinding) trimmed = rewriteItemVar(trimmed, ctx.listItemBinding);\n if (ctx.listIndexVar) trimmed = replaceItemMetaVars(trimmed, ctx.listIndexVar, ctx.listSourceVar);\n const pd = ctx.componentProps[trimmed];\n return pd?.type === 'link' ? `\\${${trimmed}?.href ?? \"#\"}` : `\\${${trimmed}}`;\n });\n hrefAttr = ` href={\\`${resolved}\\`}`;\n }\n } else if (ctx.cmsMode && /\\{\\{cms\\./.test(href)) {\n const b = ctx.cmsEntryBinding || 'entry';\n const w = (expr: string) => ctx.cmsWrapFn ? `${ctx.cmsWrapFn}(${expr})` : expr;\n const fullMatch = href.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (fullMatch) {\n hrefAttr = ` href={${w(`${b}.data.${fullMatch[1].trim()}`)}}`;\n } else {\n const replaced = href.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (_, fieldPath) => {\n return `\\${${w(`${b}.data.${fieldPath.trim()}`)}}`;\n });\n hrefAttr = ` href={\\`${replaced}\\`}`;\n }\n } else {\n const localizedHref = localizeHref(href, ctx);\n hrefAttr = ` href=\"${escapeJSX(localizedHref)}\"`;\n }\n }\n\n const attrs = buildAttributesString(node.attributes, ctx);\n const children = emitChildren(node.children, ctx);\n\n if (!children.trim()) {\n return `${ifExpr}${ind(ctx)}<a${hrefAttr}${finalClassExpr}${styleAttr}${attrs} />\\n${emitIfClose(node, ctx)}`;\n }\n\n return (\n `${ifExpr}${ind(ctx)}<a${hrefAttr}${finalClassExpr}${styleAttr}${attrs}>\\n` +\n children +\n `${ind(ctx)}</a>\\n${emitIfClose(node, ctx)}`\n );\n}\n\n/**\n * Emit an \"image\" type node (standalone image, not an HTML img tag)\n * These have src, alt, style directly on the node.\n */\nfunction emitImageTypeNode(node: any, ctx: AstroEmitContext): string {\n const style = node.style as StyleObject | ResponsiveStyleObject | undefined;\n\n let elementClass: string | null = null;\n if (\n (node.interactiveStyles && node.interactiveStyles.length > 0) ||\n node.generateElementClass\n ) {\n elementClass = buildElementClass(ctx, node.label);\n if (elementClass && node.interactiveStyles?.length && ctx.collectedInteractiveStyles) {\n ctx.collectedInteractiveStyles.set(elementClass, node.interactiveStyles as InteractiveStyles);\n }\n }\n\n const { classExpr, styleAttr } = buildClassAndStyleExpression(\n style,\n node.interactiveStyles as InteractiveStyles | undefined,\n elementClass,\n ctx\n );\n\n const src = node.src as string | undefined;\n const alt = node.alt as string | undefined;\n\n // Static local image \u2192 astro:assets <Picture>\n if (isStaticImageSrc(src, ctx)) {\n const staticMeta = ctx.imageMetadataMap!.get(src)!;\n return emitStaticPictureImage(\n src,\n alt,\n undefined,\n undefined,\n computeSizesAttribute(style, ctx.breakpoints),\n classExpr,\n styleAttr,\n '',\n '',\n staticMeta.blurHash,\n ctx\n );\n }\n\n let imgAttrs = '';\n if (src) imgAttrs += ` src=\"${escapeJSX(String(src))}\"`;\n if (alt !== undefined) imgAttrs += ` alt=\"${escapeJSX(String(alt))}\"`;\n\n // Check for image metadata for responsive images\n const metadata = src ? ctx.imageMetadataMap?.get(String(src)) : undefined;\n\n if (!metadata) {\n return `${ind(ctx)}<img${classExpr}${styleAttr}${imgAttrs} />\\n`;\n }\n\n if (metadata.width !== undefined) imgAttrs += ` width=\"${metadata.width}\"`;\n if (metadata.height !== undefined) imgAttrs += ` height=\"${metadata.height}\"`;\n\n const sizesValue = computeSizesAttribute(style, ctx.breakpoints);\n\n const hasAvif = !!(metadata.avifSrcset && ctx.imageFormat !== 'webp');\n const hasBlur = !!metadata.blurHash;\n const useWrapper = hasAvif || hasBlur;\n\n const blurWrapperCss = hasBlur\n ? `background-image:url(${escapeJSX(metadata.blurHash!)});background-size:cover`\n : '';\n const blurOnload = hasBlur\n ? ` onload=\"this.parentElement.style.backgroundImage=''\"`\n : '';\n\n if (useWrapper) {\n const imgFillClasses = IMG_FILL_CLASSES.slice();\n const classMatch = classExpr.match(/class=\"([^\"]*)\"/);\n const allClasses = classMatch ? classMatch[1].split(/\\s+/).filter(Boolean) : [];\n const { pictureClasses, imgClasses } = splitImageClasses(allClasses);\n const fullImgClasses = [...imgClasses, ...imgFillClasses];\n\n const pictureClassAttr = pictureClasses.length > 0 ? ` class=\"${pictureClasses.join(' ')}\"` : '';\n const imgClassAttr = fullImgClasses.length > 0 ? ` class=\"${fullImgClasses.join(' ')}\"` : '';\n const wrapperStyleAttr = injectInlineStyle(styleAttr, blurWrapperCss);\n\n if (hasAvif) {\n return (\n `${ind(ctx)}<picture${pictureClassAttr}${wrapperStyleAttr}>\\n` +\n `${ind(ctx)} <source type=\"image/avif\" srcset=\"${escapeJSX(metadata.avifSrcset!)}\" sizes=\"${escapeJSX(sizesValue)}\" />\\n` +\n `${ind(ctx)} <source type=\"image/webp\" srcset=\"${escapeJSX(metadata.srcset)}\" sizes=\"${escapeJSX(sizesValue)}\" />\\n` +\n `${ind(ctx)} <img${imgClassAttr}${imgAttrs}${blurOnload} />\\n` +\n `${ind(ctx)}</picture>\\n`\n );\n }\n\n if (metadata.srcset) {\n imgAttrs += ` srcset=\"${escapeJSX(metadata.srcset)}\"`;\n imgAttrs += ` sizes=\"${escapeJSX(sizesValue)}\"`;\n }\n return (\n `${ind(ctx)}<picture${pictureClassAttr}${wrapperStyleAttr}>\\n` +\n `${ind(ctx)} <img${imgClassAttr}${imgAttrs}${blurOnload} />\\n` +\n `${ind(ctx)}</picture>\\n`\n );\n }\n\n if (metadata.srcset) {\n imgAttrs += ` srcset=\"${escapeJSX(metadata.srcset)}\"`;\n imgAttrs += ` sizes=\"${escapeJSX(sizesValue)}\"`;\n }\n\n return `${ind(ctx)}<img${classExpr}${styleAttr}${imgAttrs} />\\n`;\n}\n\n/**\n * Emit a list node as native Astro .map() call\n */\nfunction emitListNode(node: ListNode, ctx: AstroEmitContext): string {\n const sourceType = node.sourceType || 'prop';\n const itemAs = node.itemAs || 'item';\n\n if (sourceType === 'collection') {\n return emitCollectionListNode(node, ctx);\n }\n\n // Prop lists only work inside component definitions where the prop is available\n // On pages, the data source doesn't exist at template level - use SSR fallback\n if (!ctx.isComponentDef && !ctx.listItemBinding) {\n return emitFallback(ctx);\n }\n\n // Prop list: emit {items.map((item, index) => (...))}\n // Resolve source: \"{{features}}\" \u2192 \"features\"\n let source = node.source || 'items';\n const templateMatch = source.match(/^\\{\\{(.+)\\}\\}$/);\n if (templateMatch) {\n source = templateMatch[1].trim();\n }\n\n // Build the .map() source expression (compute before children so ctx has it)\n let mapSource = source;\n if (node.offset && node.limit) {\n mapSource = `${source}.slice(${node.offset}, ${node.offset + node.limit})`;\n } else if (node.offset) {\n mapSource = `${source}.slice(${node.offset})`;\n } else if (node.limit) {\n mapSource = `${source}.slice(0, ${node.limit})`;\n }\n\n // Build children with list item binding context\n const indexVar = `${itemAs}Index`;\n const innerCtx: AstroEmitContext = {\n ...ctx,\n indent: ctx.indent + 1,\n listItemBinding: itemAs,\n listIndexVar: indexVar,\n listSourceVar: mapSource,\n elementPath: [...ctx.elementPath, 0],\n };\n\n const children = node.children\n ? (node.children as (ComponentNode | string)[]).map((child, i) => {\n const childCtx = { ...innerCtx, elementPath: [...ctx.elementPath, i] };\n const out = nodeToAstro(child, childCtx);\n if (childCtx.needsI18nResolver) ctx.needsI18nResolver = true;\n return out;\n }).join('')\n : '';\n\n return (\n `${ind(ctx)}{${mapSource}.map((${itemAs}, ${indexVar}) => (\\n` +\n children +\n `${ind(ctx)}))}\\n`\n );\n}\n\n/**\n * Emit a collection-sourced list node using getCollection() in frontmatter\n */\nfunction emitCollectionListNode(node: ListNode, ctx: AstroEmitContext): string {\n // For collection lists, the data fetching happens in frontmatter\n const source = node.source || '';\n const itemAs = node.itemAs || singularize(source);\n\n // Add frontmatter lines and imports\n if (!ctx.frontmatterLines) ctx.frontmatterLines = [];\n if (!ctx.astroImports) ctx.astroImports = new Set();\n\n ctx.astroImports.add('getCollection');\n\n // Variable name for the collection data\n const collectionVar = `${source}List`;\n\n // Build the collection query with filter/sort/limit\n let queryChain = `await getCollection('${source}')`;\n\n if (node.filter) {\n // Simple filter support\n if (typeof node.filter === 'object' && !Array.isArray(node.filter) && 'field' in node.filter) {\n const f = node.filter as { field: string; operator?: string; value: unknown };\n const op = f.operator || 'eq';\n if (op === 'eq') {\n queryChain += `.then(items => items.filter(e => e.data.${f.field} === ${JSON.stringify(f.value)}))`;\n }\n }\n }\n\n if (node.sort) {\n const sortConfig = Array.isArray(node.sort) ? node.sort[0] : node.sort;\n if (sortConfig) {\n const order = sortConfig.order === 'desc' ? -1 : 1;\n queryChain += `.then(items => items.sort((a, b) => a.data.${sortConfig.field} > b.data.${sortConfig.field} ? ${order} : ${-order}))`;\n }\n }\n\n if (node.offset || node.limit) {\n const start = node.offset || 0;\n const end = node.limit ? start + node.limit : undefined;\n queryChain += `.then(items => items.slice(${start}${end !== undefined ? `, ${end}` : ''}))`;\n }\n\n ctx.frontmatterLines.push(`const ${collectionVar} = ${queryChain};`);\n\n // Build children with item binding\n const indexVar = `${itemAs}Index`;\n const innerCtx: AstroEmitContext = {\n ...ctx,\n indent: ctx.indent + 1,\n listItemBinding: itemAs,\n listIndexVar: indexVar,\n listSourceVar: collectionVar,\n cmsMode: true,\n cmsEntryBinding: itemAs,\n elementPath: [...ctx.elementPath, 0],\n };\n\n const children = node.children\n ? (node.children as (ComponentNode | string)[]).map((child, i) => {\n const childCtx = { ...innerCtx, elementPath: [...ctx.elementPath, i] };\n const out = nodeToAstro(child, childCtx);\n if (childCtx.needsI18nResolver) ctx.needsI18nResolver = true;\n return out;\n }).join('')\n : '';\n\n return (\n `${ind(ctx)}{${collectionVar}.map((${itemAs}, ${indexVar}) => (\\n` +\n children +\n `${ind(ctx)}))}\\n`\n );\n}\n\n/**\n * Emit a locale list node with static locale links\n * Since locales are known at build time, we emit static HTML\n */\nfunction emitLocaleListNode(node: LocaleListNode, ctx: AstroEmitContext): string {\n // If we don't have i18n config or slug map, fall back to SSR\n if (!ctx.i18nConfig || !ctx.currentPageSlugMap) {\n return emitFallback(ctx);\n }\n\n const i18nConfig = ctx.i18nConfig;\n const slugMap = ctx.currentPageSlugMap;\n const showCurrent = node.showCurrent !== false;\n const showSeparator = node.showSeparator !== false;\n const showFlag = node.showFlag !== false;\n const displayType = node.displayType || 'nativeName';\n\n // Build container classes from style\n const style = node.style as StyleObject | ResponsiveStyleObject | undefined;\n\n let elementClass: string | null = null;\n if ((node.interactiveStyles && (node.interactiveStyles as InteractiveStyles).length > 0) || node.generateElementClass) {\n elementClass = buildElementClass(ctx, node.label);\n if (elementClass && (node.interactiveStyles as InteractiveStyles)?.length && ctx.collectedInteractiveStyles) {\n ctx.collectedInteractiveStyles.set(elementClass, node.interactiveStyles as InteractiveStyles);\n }\n }\n\n const { classExpr: containerClassExpr, styleAttr: containerStyleAttr } = buildClassAndStyleExpression(\n style,\n node.interactiveStyles as InteractiveStyles | undefined,\n elementClass,\n ctx\n );\n\n // Build item classes\n const itemStyle = node.itemStyle as StyleObject | ResponsiveStyleObject | undefined;\n const itemResult = itemStyle ? responsiveStylesToTailwind(itemStyle, ctx.breakpoints, ctx.responsiveScales) : { classes: [], dynamicStyles: {} };\n const itemClasses = itemResult.classes;\n\n // Build active item classes (item + active combined)\n const activeItemStyle = node.activeItemStyle as StyleObject | ResponsiveStyleObject | undefined;\n const activeResult = activeItemStyle ? responsiveStylesToTailwind(activeItemStyle, ctx.breakpoints, ctx.responsiveScales) : { classes: [], dynamicStyles: {} };\n const activeItemClasses = [...itemClasses, ...activeResult.classes];\n\n // Build separator classes\n const separatorStyle = node.separatorStyle as StyleObject | ResponsiveStyleObject | undefined;\n const sepResult = separatorStyle ? responsiveStylesToTailwind(separatorStyle, ctx.breakpoints, ctx.responsiveScales) : { classes: [], dynamicStyles: {} };\n const separatorClasses = sepResult.classes;\n\n // Build locale icon map\n const localeIconMap = new Map<string, string>();\n for (const localeConfig of i18nConfig.locales) {\n if (localeConfig.icon) {\n localeIconMap.set(localeConfig.code, localeConfig.icon);\n }\n }\n\n // Flag classes\n const flagStyle = node.flagStyle as StyleObject | ResponsiveStyleObject | undefined;\n const flagResult = flagStyle ? responsiveStylesToTailwind(flagStyle, ctx.breakpoints, ctx.responsiveScales) : { classes: [], dynamicStyles: {} };\n const flagClasses = flagResult.classes;\n\n // Build links\n const links: string[] = [];\n const currentLocale = ctx.locale || i18nConfig.defaultLocale;\n\n for (const localeConfig of i18nConfig.locales) {\n const code = localeConfig.code;\n const isCurrent = code === currentLocale;\n\n if (!showCurrent && isCurrent) continue;\n\n const path = slugMap[code] || '/';\n const classes = isCurrent ? activeItemClasses : itemClasses;\n const classAttr = classes.length > 0 ? ` class=\"${classes.join(' ')}\"` : '';\n const currentAttr = isCurrent ? ' data-current=\"true\"' : ' data-current=\"false\"';\n const hreflangAttr = ` hreflang=\"${localeConfig.langTag}\"`;\n\n // Display text\n let displayText: string;\n switch (displayType) {\n case 'code': displayText = code.toUpperCase(); break;\n case 'name': displayText = localeConfig.name; break;\n case 'nativeName': default: displayText = localeConfig.nativeName; break;\n }\n\n // Build link content\n let linkContent = '';\n const localeIcon = localeIconMap.get(code);\n if (showFlag && localeIcon) {\n const flagClassAttr = flagClasses.length > 0 ? ` class=\"${flagClasses.join(' ')}\"` : '';\n linkContent += `<img src=\"${escapeJSX(localeIcon)}\" alt=\"${escapeJSX(localeConfig.nativeName)} flag\"${flagClassAttr}>`;\n }\n linkContent += `<div>${escapeJSX(displayText)}</div>`;\n\n links.push(`${ind(ctx)} <a href=\"${escapeJSX(path)}\"${hreflangAttr}${currentAttr} data-locale=\"${escapeJSX(code)}\"${classAttr}>${linkContent}</a>`);\n }\n\n // Join with separator\n let linksContent: string;\n if (showSeparator && links.length > 1) {\n const sepClassAttr = separatorClasses.length > 0 ? ` class=\"${separatorClasses.join(' ')}\"` : '';\n linksContent = links.join(`\\n${ind(ctx)} <span${sepClassAttr}></span>\\n`);\n } else {\n linksContent = links.join('\\n');\n }\n\n const attrs = buildAttributesString(node.attributes, ctx);\n\n return (\n `${ind(ctx)}<div data-locale-list=\"true\"${containerClassExpr}${containerStyleAttr}${attrs}>\\n` +\n linksContent + '\\n' +\n `${ind(ctx)}</div>\\n`\n );\n}\n\n/**\n * Emit SSR fallback for complex nodes (list, locale-list)\n */\nfunction emitFallback(ctx: AstroEmitContext): string {\n const pathKey = ctx.elementPath.join('.');\n const ssrHtml = ctx.ssrFallbacks.get(pathKey);\n if (ssrHtml) {\n const escaped = escapeTemplateLiteral(ssrHtml);\n return `${ind(ctx)}<Fragment set:html={\\`${escaped}\\`} />\\n`;\n }\n return `${ind(ctx)}{/* Complex node - SSR fallback not available */}\\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Conditional rendering helpers\n// ---------------------------------------------------------------------------\n\nfunction emitIfOpen(node: ComponentNode, ctx: AstroEmitContext): string {\n const ifValue = hasIf(node) ? node.if : undefined;\n if (ifValue === undefined || ifValue === true) return '';\n\n if (typeof ifValue === 'boolean') {\n return ifValue ? '' : `${ind(ctx)}{/* hidden */}\\n`;\n }\n\n // BooleanMapping \u2192 generate conditional from values map\n if (typeof ifValue === 'object' && ifValue._mapping && ctx.isComponentDef) {\n const trueValues = Object.entries(ifValue.values)\n .filter(([, v]) => v === true)\n .map(([k]) => `'${k}'`);\n if (trueValues.length === 0) return `${ind(ctx)}{/* hidden */}\\n`;\n if (trueValues.length === 1) {\n return `${ind(ctx)}{${ifValue.prop} === ${trueValues[0]} && (\\n`;\n }\n return `${ind(ctx)}{[${trueValues.join(', ')}].includes(${ifValue.prop}) && (\\n`;\n }\n\n // String template\n if (typeof ifValue === 'string') {\n // CMS mode: {{cms.field}} \u2192 entry.data.field\n if (ctx.cmsMode && ifValue.includes('{{cms.')) {\n const match = ifValue.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (match) {\n const binding = ctx.cmsEntryBinding || 'entry';\n return `${ind(ctx)}{${binding}.data.${match[1].trim()} && (\\n`;\n }\n }\n\n // List item context: {{item.field}} or {{!itemLast}} etc.\n if (ctx.listItemBinding && /\\{\\{/.test(ifValue)) {\n const match = ifValue.match(/^\\{\\{([^}]+)\\}\\}$/);\n if (match) {\n let expr = match[1].trim();\n expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n return `${ind(ctx)}{${expr} && (\\n`;\n }\n }\n\n // Component prop context\n if (ctx.isComponentDef) {\n const fullMatch = ifValue.match(/^\\{\\{(.+)\\}\\}$/);\n if (!fullMatch && !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(ifValue)) {\n // Plain string without template syntax and not a valid identifier \u2014 always truthy, skip conditional\n return '';\n }\n let expr = fullMatch ? fullMatch[1].trim() : ifValue.replace(/\\{\\{(.+?)\\}\\}/g, '$1');\n if (ctx.listItemBinding) expr = rewriteItemVar(expr, ctx.listItemBinding);\n if (ctx.listIndexVar) expr = replaceItemMetaVars(expr, ctx.listIndexVar, ctx.listSourceVar);\n return `${ind(ctx)}{${expr} && (\\n`;\n }\n }\n\n return '';\n}\n\nfunction emitIfClose(node: ComponentNode, ctx: AstroEmitContext): string {\n const ifValue = hasIf(node) ? node.if : undefined;\n if (ifValue === undefined || ifValue === true) return '';\n\n if (typeof ifValue === 'boolean') return '';\n\n if (typeof ifValue === 'object' && ifValue._mapping && ctx.isComponentDef) {\n return `${ind(ctx)})}\\n`;\n }\n\n if (typeof ifValue === 'string') {\n const hasCmsCondition = ctx.cmsMode && ifValue.includes('{{cms.');\n const hasItemCondition = ctx.listItemBinding && /\\{\\{/.test(ifValue);\n if (hasCmsCondition || hasItemCondition) {\n return `${ind(ctx)})}\\n`;\n }\n if (ctx.isComponentDef) {\n const fullMatch = ifValue.match(/^\\{\\{(.+)\\}\\}$/);\n if (!fullMatch && !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(ifValue)) {\n // Matches the skip in emitIfOpen \u2014 no open brace was emitted\n return '';\n }\n return `${ind(ctx)})}\\n`;\n }\n }\n\n return '';\n}\n\n// ---------------------------------------------------------------------------\n// Children helper\n// ---------------------------------------------------------------------------\n\nfunction emitChildren(\n children: (ComponentNode | string)[] | string | ComponentNode | null | undefined,\n ctx: AstroEmitContext\n): string {\n if (!children) return '';\n\n const innerCtx = { ...ctx, indent: ctx.indent + 1, elementPath: [...ctx.elementPath] };\n\n if (typeof children === 'string') {\n const out = nodeToAstro(children, innerCtx);\n if (innerCtx.needsI18nResolver) ctx.needsI18nResolver = true;\n return out;\n }\n\n // Iterate children arrays inline with appended index (matches SSR renderer's\n // children iteration which uses [...parentPath, index] for each child)\n if (Array.isArray(children)) {\n let result = '';\n for (let i = 0; i < children.length; i++) {\n const childCtx = { ...innerCtx, elementPath: [...ctx.elementPath, i] };\n result += nodeToAstro(children[i], childCtx);\n if (childCtx.needsI18nResolver) ctx.needsI18nResolver = true;\n }\n return result;\n }\n\n // Single node\n const out = nodeToAstro(children, innerCtx);\n if (innerCtx.needsI18nResolver) ctx.needsI18nResolver = true;\n return out;\n}\n", "/**\n * CMS Template Expression Transformer for Astro Export\n * Converts {{cms.field}} and {{item.field}} template expressions to Astro expressions\n */\n\n// CMS template pattern (from cmsSSRProcessor.ts)\nconst CMS_TEMPLATE_PATTERN = /\\{\\{cms\\.([^}]+)\\}\\}/g;\n// Item template pattern for list iteration\nconst ITEM_TEMPLATE_PATTERN = /\\{\\{([^}]+)\\}\\}/g;\n\nexport function isTemplateExpression(text: string): boolean {\n return /\\{\\{.+?\\}\\}/.test(text);\n}\n\nexport function transformCMSTemplate(\n text: string,\n binding: string = 'entry',\n richTextFields?: Set<string>,\n wrapFn?: string\n): string {\n const w = (expr: string) => wrapFn ? `${wrapFn}(${expr})` : expr;\n\n // Check if entire text is a single {{cms.field}} expression\n const fullMatch = text.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (fullMatch) {\n const fieldPath = fullMatch[1].trim();\n const topLevelField = fieldPath.split('.')[0];\n\n // Rich-text fields use Fragment set:html\n if (richTextFields?.has(topLevelField)) {\n return `<Fragment set:html={${w(`${binding}.data.${fieldPath}`)}} />`;\n }\n\n return `{${w(`${binding}.data.${fieldPath}`)}}`;\n }\n\n // Mixed content: \"Hello {{cms.name}}\" \u2192 {`Hello ${entry.data.name}`}\n if (CMS_TEMPLATE_PATTERN.test(text)) {\n CMS_TEMPLATE_PATTERN.lastIndex = 0;\n const replaced = text.replace(CMS_TEMPLATE_PATTERN, (_, fieldPath) => {\n return `\\${${w(`${binding}.data.${fieldPath.trim()}`)}}`;\n });\n return `{\\`${replaced}\\`}`;\n }\n\n return text;\n}\n\n/**\n * Replace legacy itemIndex/itemFirst/itemLast meta-variables with\n * the actual .map() callback index parameter name.\n */\n/**\n * Rewrite the default `item.` prefix to the actual .map() parameter name\n * when itemAs differs from 'item' (e.g., itemAs='link' \u2192 item.text \u2192 link.text).\n */\nexport function rewriteItemVar(expr: string, itemVar: string): string {\n if (itemVar === 'item') return expr;\n return expr.replace(/\\bitem\\./g, `${itemVar}.`);\n}\n\nexport function replaceItemMetaVars(expr: string, indexVar: string, sourceVar?: string, itemVar?: string): string {\n const lastExpr = sourceVar\n ? `(${indexVar} === ${sourceVar}.length - 1)`\n : `false /* itemLast not supported */`;\n let result = expr\n .replace(/\\bitemIndex\\b/g, indexVar)\n .replace(/\\bitemFirst\\b/g, `(${indexVar} === 0)`)\n .replace(/\\bitemLast\\b/g, lastExpr);\n if (itemVar) result = rewriteItemVar(result, itemVar);\n return result;\n}\n\nexport function transformItemTemplate(\n text: string,\n itemVar: string = 'item',\n indexVar?: string,\n sourceVar?: string\n): string {\n // Check if entire text is a single {{expression}}\n const fullMatch = text.match(/^\\{\\{(.+)\\}\\}$/);\n if (fullMatch) {\n let expr = fullMatch[1].trim();\n expr = rewriteItemVar(expr, itemVar);\n if (indexVar) expr = replaceItemMetaVars(expr, indexVar, sourceVar);\n // If it contains a dot, it's item.field\n if (expr.startsWith(`${itemVar}.`)) {\n return `{${expr}}`;\n }\n // Bare expression like {{features}} - keep as prop reference\n return `{${expr}}`;\n }\n\n // Mixed content: replace each {{expr}}\n if (ITEM_TEMPLATE_PATTERN.test(text)) {\n ITEM_TEMPLATE_PATTERN.lastIndex = 0;\n const replaced = text.replace(ITEM_TEMPLATE_PATTERN, (_, expr) => {\n let trimmed = expr.trim();\n trimmed = rewriteItemVar(trimmed, itemVar);\n if (indexVar) trimmed = replaceItemMetaVars(trimmed, indexVar, sourceVar);\n return `\\${${trimmed}}`;\n });\n return `{\\`${replaced}\\`}`;\n }\n\n return text;\n}\n", "import { RAW_HTML_PREFIX } from '../../shared/constants';\n\nexport function stripRawHtmlPrefixDeep<T>(value: T): T {\n if (typeof value === 'string') {\n return (value.startsWith(RAW_HTML_PREFIX) ? value.slice(RAW_HTML_PREFIX.length) : value) as T;\n }\n if (Array.isArray(value)) {\n return value.map((item) => stripRawHtmlPrefixDeep(item)) as unknown as T;\n }\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = stripRawHtmlPrefixDeep(v);\n }\n return out as T;\n }\n return value;\n}\n\n/** Ensure a component name starts with an uppercase letter so Astro treats it as a component tag, not an HTML element. */\nexport function astroComponentName(name: string): string {\n return name.charAt(0).toUpperCase() + name.slice(1);\n}\n", "/**\n * Component File Generator\n * Generates .astro files from StructuredComponentDefinitions\n */\n\nimport type {\n ComponentDefinition,\n StructuredComponentDefinition,\n PropDefinition,\n} from '../../shared/types';\nimport type { BasePropDefinition, ListPropDefinition, LinkPropValue } from '../../shared/types/components';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';\nimport { nodeToAstro, type AstroEmitContext } from './nodeToAstro';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport { stripRawHtmlPrefixDeep, astroComponentName } from './astroEmitHelpers';\nimport type { InteractiveStyles } from '../../shared/types/styles';\nimport type { RemConversionConfig } from '../../shared/pxToRem';\nimport { generateAllInteractiveCSS } from '../../shared/cssGeneration';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a PropDefinition to a TypeScript type string\n */\nfunction propDefToTSType(def: PropDefinition): string {\n switch (def.type) {\n case 'string':\n case 'rich-text':\n case 'file':\n return 'string';\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'select':\n if ('options' in def && def.options && def.options.length > 0) {\n return def.options.map((o) => `'${o}'`).join(' | ');\n }\n return 'string';\n case 'link':\n return '{ href: string; target?: string }';\n case 'list':\n return 'any[]';\n default:\n return 'any';\n }\n}\n\n/**\n * Format a default value for destructuring\n */\nfunction formatDefault(def: PropDefinition): string | null {\n if (!('default' in def) || def.default === undefined) return null;\n const val = stripRawHtmlPrefixDeep(def.default);\n\n if (typeof val === 'string') return JSON.stringify(val);\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n\n // I18nValue\n if (typeof val === 'object' && val !== null && '_i18n' in val) {\n // Use the first available locale value\n for (const [key, v] of Object.entries(val)) {\n if (key !== '_i18n' && typeof v === 'string') return JSON.stringify(v);\n }\n return null;\n }\n\n // Link value\n if (typeof val === 'object' && val !== null && 'href' in val) {\n return JSON.stringify(val);\n }\n\n // Arrays\n if (Array.isArray(val)) {\n return JSON.stringify(val);\n }\n\n return JSON.stringify(val);\n}\n\n/**\n * Merge the `className` variable onto the root element's class attribute.\n * Handles: class=\"existing\", class:list={[...]}, class={expr}, or no class at all.\n */\nfunction mergeClassNameOntoRoot(template: string): string {\n // Find the first opening tag (skip whitespace/newlines)\n const tagMatch = template.match(/^(\\s*<)(\\w[\\w-]*)([\\s\\S]*?)(\\/?>)/);\n if (!tagMatch) return template;\n\n const [fullMatch, prefix, tagName, attrs, close] = tagMatch;\n\n // Check for existing class:list\n const classListMatch = attrs.match(/\\s+class:list=\\{(\\[[\\s\\S]*?\\])\\}/);\n if (classListMatch) {\n const existingList = classListMatch[1];\n // Append className to the array\n const newList = existingList.replace(/\\]$/, `, className]`);\n const newAttrs = attrs.replace(classListMatch[0], ` class:list={${newList}}`);\n return prefix + tagName + newAttrs + close + template.slice(fullMatch.length);\n }\n\n // Check for existing class=\"...\" (static)\n const classStaticMatch = attrs.match(/\\s+class=\"([^\"]*)\"/);\n if (classStaticMatch) {\n const existing = classStaticMatch[1];\n const newAttrs = attrs.replace(classStaticMatch[0], ` class:list={[\"${existing}\", className]}`);\n return prefix + tagName + newAttrs + close + template.slice(fullMatch.length);\n }\n\n // Check for existing class={expr} (dynamic)\n const classDynMatch = attrs.match(/\\s+class=\\{([^}]+)\\}/);\n if (classDynMatch) {\n const expr = classDynMatch[1];\n const newAttrs = attrs.replace(classDynMatch[0], ` class:list={[${expr}, className]}`);\n return prefix + tagName + newAttrs + close + template.slice(fullMatch.length);\n }\n\n // No existing class \u2014 add class={className}\n return prefix + tagName + ` class={className}` + attrs + close + template.slice(fullMatch.length);\n}\n\n// ---------------------------------------------------------------------------\n// Main emitter\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a .astro file string from a component definition\n */\nexport function emitAstroComponent(\n name: string,\n def: ComponentDefinition,\n allComponents: Record<string, ComponentDefinition>,\n breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS,\n defaultLocale: string = 'en',\n responsiveScales?: ResponsiveScales,\n remConfig?: RemConversionConfig\n): string {\n const comp = def.component;\n const propDefs = comp.interface || {};\n const structure = comp.structure;\n\n if (!structure) {\n // Component with no structure - just CSS/JS\n return buildNoStructureComponent(name, comp);\n }\n\n // Build the Astro context for template emission\n const ctx: AstroEmitContext = {\n imports: new Set<string>(),\n isComponentDef: true,\n componentProps: propDefs,\n globalComponents: allComponents,\n indent: 0,\n ssrFallbacks: new Map(),\n elementPath: [0],\n fileType: 'component',\n fileName: name,\n breakpoints,\n responsiveScales,\n defaultLocale,\n imageImports: new Map<string, string>(),\n fileDepth: 0, // components live at src/components/\n collectedInteractiveStyles: new Map<string, InteractiveStyles>(),\n };\n\n // Emit the template body\n let templateBody = nodeToAstro(structure, ctx);\n\n // Merge instance className onto the root element (for acceptsStyles support)\n templateBody = mergeClassNameOntoRoot(templateBody);\n\n // Build frontmatter (includes class prop for instance style support)\n const frontmatter = buildFrontmatter(\n name,\n propDefs,\n ctx.imports,\n ctx.dynamicTags,\n ctx.needsI18nResolver ? defaultLocale : undefined,\n ctx.imageImports\n );\n\n // Build style/script sections\n const styleSection = comp.css ? `\\n<style>\\n${comp.css}\\n</style>\\n` : '';\n const interactiveStyleSection = ctx.collectedInteractiveStyles!.size > 0\n ? `\\n<style is:global>\\n${generateAllInteractiveCSS(ctx.collectedInteractiveStyles!, breakpoints, remConfig, responsiveScales)}\\n</style>\\n`\n : '';\n const scriptSection = comp.javascript\n ? buildScriptSection(comp.javascript, comp, propDefs)\n : '';\n\n return `---\\n${frontmatter}---\\n${templateBody}${styleSection}${interactiveStyleSection}${scriptSection}`;\n}\n\n/**\n * Build the frontmatter section (imports, Props interface, destructuring)\n */\nfunction buildFrontmatter(\n componentName: string,\n propDefs: Record<string, PropDefinition>,\n imports: Set<string>,\n dynamicTags?: Map<string, string>,\n i18nDefaultLocale?: string,\n imageImports?: Map<string, string>\n): string {\n const lines: string[] = [];\n\n // Component imports\n for (const imp of Array.from(imports).sort()) {\n lines.push(`import ${astroComponentName(imp)} from './${imp}.astro';`);\n }\n\n // Static image imports (astro:assets <Picture>). Map size is the single\n // source of truth \u2014 a separate boolean would be lost by child-ctx spreads.\n if (imageImports && imageImports.size > 0) {\n lines.push(`import { Picture } from 'astro:assets';`);\n const sortedImages = Array.from(imageImports.entries()).sort(([a], [b]) => a.localeCompare(b));\n for (const [varName, importPath] of sortedImages) {\n lines.push(`import ${varName} from '${importPath}';`);\n }\n }\n\n if (lines.length > 0) lines.push('');\n\n const propEntries = Object.entries(propDefs);\n\n // Always generate Props interface and destructuring (at minimum for class prop)\n {\n // Interface\n lines.push('interface Props {');\n for (const [propName, propDef] of propEntries) {\n if (propName === 'children') continue;\n const tsType = propDefToTSType(propDef);\n const optional = 'default' in propDef && propDef.default !== undefined;\n lines.push(` ${propName}${optional ? '?' : ''}: ${tsType};`);\n }\n // Always include class prop for instance style support\n lines.push(' class?: string;');\n lines.push('}');\n lines.push('');\n\n // Destructuring with defaults\n const destructParts: string[] = [];\n for (const [propName, propDef] of propEntries) {\n if (propName === 'children') continue;\n const defaultVal = formatDefault(propDef);\n if (defaultVal !== null) {\n destructParts.push(`${propName} = ${defaultVal}`);\n } else if (propDef.type === 'link') {\n destructParts.push(`${propName} = { href: \"#\" }`);\n } else {\n destructParts.push(propName);\n }\n }\n\n // Always include class prop (renamed to className to avoid reserved word)\n destructParts.push('class: className = \"\"');\n\n if (destructParts.length <= 3 && destructParts.join(', ').length < 80) {\n lines.push(`const { ${destructParts.join(', ')} } = Astro.props;`);\n } else {\n lines.push('const {');\n for (const part of destructParts) {\n lines.push(` ${part},`);\n }\n lines.push('} = Astro.props;');\n }\n }\n\n // Dynamic tag definitions (e.g., const Tag_0_0 = `h${size}`)\n if (dynamicTags && dynamicTags.size > 0) {\n lines.push('');\n for (const [varName, templateExpr] of dynamicTags) {\n lines.push(`const ${varName} = \\`${templateExpr}\\`;`);\n }\n }\n\n // i18n resolver helper \u2014 resolves { _i18n: true, en: \"...\", pl: \"...\" } at runtime\n if (i18nDefaultLocale) {\n lines.push('');\n lines.push(`const r = (v: any) => {`);\n lines.push(` if (v && typeof v === 'object' && v._i18n) {`);\n lines.push(` const locale = Astro.currentLocale ?? '${i18nDefaultLocale}';`);\n lines.push(` return v[locale] ?? v['${i18nDefaultLocale}'] ?? Object.values(v).find((s: any) => typeof s === 'string' && s !== '') ?? '';`);\n lines.push(` }`);\n lines.push(` return v ?? '';`);\n lines.push(`};`);\n }\n\n if (lines.length > 0) lines.push('');\n return lines.join('\\n');\n}\n\n/**\n * Build a component with no structure (CSS/JS only)\n */\nfunction buildNoStructureComponent(\n name: string,\n comp: StructuredComponentDefinition\n): string {\n let content = '---\\n---\\n<slot />\\n';\n if (comp.css) content += `\\n<style>\\n${comp.css}\\n</style>\\n`;\n if (comp.javascript) content += `\\n<script is:inline>\\n${comp.javascript}\\n</script>\\n`;\n return content;\n}\n\n/**\n * Transform JS for define:vars compatibility.\n * Astro's define:vars injects each prop as a script-scope variable, not a `props` object.\n * This function:\n * 1. Removes `const/let/var { x, y } = props;` destructuring lines\n * 2. Replaces `props.X` references with direct `X` variable access\n * 3. Drops `var/let/const` from redeclarations of define:vars variables\n */\nfunction transformDefineVarsJS(js: string, varNames: string[]): string {\n let result = js;\n\n // 1. Remove destructuring from props: `const { x, y } = props;`\n result = result.replace(\n /^\\s*(const|let|var)\\s+\\{([^}]+)\\}\\s*=\\s*props\\s*;?\\s*$/gm,\n (match, _keyword, inner) => {\n const names = inner.split(',').map((s: string) => s.trim()).filter(Boolean);\n if (names.every((n: string) => varNames.includes(n))) return '';\n return match;\n }\n );\n\n // 2. Replace `props.X` with `X` (longest names first to avoid substring conflicts)\n const sorted = [...varNames].sort((a, b) => b.length - a.length);\n for (const name of sorted) {\n result = result.replace(new RegExp(`props\\\\.${name}\\\\b`, 'g'), name);\n }\n\n // 3. Remove redeclarations of define:vars variables (already injected as const by Astro)\n for (const name of varNames) {\n result = result.replace(\n new RegExp(`^\\\\s*(var|let|const)\\\\s+${name}\\\\s*=[^;]*;?\\\\s*$`, 'gm'),\n ''\n );\n }\n\n return result;\n}\n\n/**\n * Build the script section with proper el/props initialization.\n * Captures el immediately via document.currentScript.previousElementSibling,\n * then defers actual JS execution until DOMContentLoaded so that external\n * libraries (e.g. Swiper loaded with defer) are available.\n */\nfunction buildScriptSection(\n js: string,\n comp: StructuredComponentDefinition,\n propDefs: Record<string, PropDefinition>\n): string {\n // Capture el immediately (document.currentScript is only valid during script execution)\n // but defer the component init until DOMContentLoaded so deferred libraries are ready\n // Remove whitespace-only text nodes so Astro's formatted HTML matches SSR's minified output.\n // Without this, scripts that use firstChild/childNodes pick up whitespace between elements.\n const cleanTextNodes = `(function _w(n){var c=n.firstChild,x;while(c){x=c.nextSibling;if(c.nodeType===3){if(!c.textContent.trim())n.removeChild(c)}else if(c.nodeType===1){if(c.tagName==='SCRIPT')n.removeChild(c);else _w(c)}c=x}})(el);`;\n\n const deferWrapper = (innerJS: string) =>\n `var el = document.currentScript.previousElementSibling;\\n` +\n `function __init__() {\\n${cleanTextNodes}\\n${innerJS}\\n}\\n` +\n `if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', __init__); } else { __init__(); }`;\n\n if (comp.defineVars) {\n const vars = comp.defineVars === true\n ? Object.keys(propDefs).filter(k => k !== 'children')\n : comp.defineVars;\n\n if (vars.length > 0) {\n const transformedJS = transformDefineVarsJS(js, vars);\n const defineVarsObj = `{ ${vars.join(', ')} }`;\n return `\\n<script define:vars={${defineVarsObj}}>\\n(function(){\\n${deferWrapper(transformedJS)}\\n})();\\n</script>\\n`;\n }\n }\n\n return `\\n<script is:inline>\\n(function(){\\n${deferWrapper(js)}\\n})();\\n</script>\\n`;\n}\n", "/**\n * Page File Generator\n * Generates .astro page files that import and compose components\n */\n\nimport type { JSONPage, ComponentDefinition, I18nConfig } from '../../shared/types';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';\nimport { nodeToAstro, type AstroEmitContext } from './nodeToAstro';\nimport type { ImageMetadataMap } from '../ssr/imageMetadata';\nimport type { SlugMap } from '../../shared/slugTranslator';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport type { InteractiveStyles } from '../../shared/types/styles';\nimport type { RemConversionConfig } from '../../shared/pxToRem';\nimport { generateAllInteractiveCSS } from '../../shared/cssGeneration';\nimport { astroComponentName } from './astroEmitHelpers';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PageEmitOptions {\n /** Page data */\n pageData: JSONPage;\n /** All global components */\n globalComponents: Record<string, ComponentDefinition>;\n /** Page title */\n title: string;\n /** Page meta HTML */\n meta: string;\n /** Locale */\n locale: string;\n /** Default theme */\n theme: string;\n /** Font preloads HTML */\n fontPreloads: string;\n /** Library tags */\n libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string };\n /** Script paths */\n scriptPaths: string[];\n /** Import path to BaseLayout */\n layoutImportPath: string;\n /** File depth relative to src/pages */\n fileDepth: number;\n /** SSR HTML fallbacks: node path \u2192 rendered HTML (for ListNode, LocaleListNode) */\n ssrFallbacks: Map<string, string>;\n /** Page name (without extension) */\n pageName: string;\n /** Breakpoint config for responsive Tailwind classes */\n breakpoints?: BreakpointConfig;\n /** Responsive scales config for auto-scaling at breakpoints */\n responsiveScales?: ResponsiveScales;\n /** Image metadata map for responsive image generation */\n imageMetadataMap?: ImageMetadataMap;\n /** I18n config for locale list rendering */\n i18nConfig?: I18nConfig;\n /** Locale\u2192slug map for current page (for locale list links) */\n currentPageSlugMap?: Record<string, string>;\n /** Slug mappings for translating internal link hrefs */\n slugMappings?: SlugMap[];\n /** Image format: 'webp' uses plain <img>, 'avif' uses <picture> */\n imageFormat?: 'webp' | 'avif';\n /**\n * Raw-HTML slice \u2192 processed HTML captured during the page's SSR pass.\n * Ensures `<Fragment set:html>` matches SSR output for rich-text content\n * (image rewriting, component expansion, link localization).\n */\n processedRawHtml?: Map<string, string>;\n /** Rem conversion config for interactive CSS generation */\n remConfig?: RemConversionConfig;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction escapeTemplateLiteral(s: string): string {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$\\{/g, '\\\\${')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\nfunction escapeJSX(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n}\n\n/**\n * Compute relative import path from page to components directory\n */\nfunction componentImportPath(fileDepth: number, componentName: string): string {\n // fileDepth 0 = src/pages/index.astro \u2192 ../components/X.astro\n // fileDepth 1 = src/pages/en/index.astro \u2192 ../../components/X.astro\n const ups = '../'.repeat(fileDepth + 1);\n return `${ups}components/${componentName}.astro`;\n}\n\n// ---------------------------------------------------------------------------\n// Main emitter\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a page .astro file from page data with component imports\n */\nexport function emitAstroPage(options: PageEmitOptions): string {\n const {\n pageData,\n globalComponents,\n title,\n meta,\n locale,\n theme,\n fontPreloads,\n libraryTags,\n scriptPaths,\n layoutImportPath,\n fileDepth,\n ssrFallbacks,\n pageName,\n breakpoints: breakpointsOpt,\n responsiveScales,\n imageMetadataMap,\n i18nConfig,\n currentPageSlugMap,\n slugMappings,\n imageFormat,\n processedRawHtml,\n remConfig,\n } = options;\n\n const breakpoints = breakpointsOpt ?? DEFAULT_BREAKPOINTS;\n\n const root = pageData.root;\n if (!root) {\n // Empty page - just layout wrapper\n return buildEmptyPage(layoutImportPath, title, meta, locale, theme, fontPreloads, libraryTags, scriptPaths);\n }\n\n // Build the Astro emit context\n const ctx: AstroEmitContext = {\n imports: new Set<string>(),\n isComponentDef: false,\n componentProps: {},\n globalComponents,\n indent: 1, // inside BaseLayout\n ssrFallbacks,\n elementPath: [0],\n fileType: 'page',\n fileName: pageName,\n breakpoints,\n responsiveScales,\n imageMetadataMap,\n locale,\n i18nConfig,\n currentPageSlugMap,\n frontmatterLines: [],\n astroImports: new Set<string>(),\n slugMappings,\n i18nDefaultLocale: i18nConfig?.defaultLocale,\n imageFormat,\n processedRawHtml,\n imageImports: new Map<string, string>(),\n fileDepth,\n collectedInteractiveStyles: new Map<string, InteractiveStyles>(),\n };\n\n // Emit the template body\n const templateBody = nodeToAstro(root, ctx);\n\n // Build frontmatter with imports\n const importLines: string[] = [];\n\n // Add Astro API imports (e.g., getCollection) if collected during emission\n if (ctx.astroImports && ctx.astroImports.size > 0) {\n const astroImports = Array.from(ctx.astroImports);\n importLines.push(`import { ${astroImports.join(', ')} } from 'astro:content';`);\n }\n\n importLines.push(`import BaseLayout from '${layoutImportPath}';`);\n\n // Static image imports (astro:assets <Picture>). Map size is the single\n // source of truth \u2014 a separate boolean would be lost by child-ctx spreads.\n if (ctx.imageImports && ctx.imageImports.size > 0) {\n importLines.push(`import { Picture } from 'astro:assets';`);\n const sortedImages = Array.from(ctx.imageImports.entries()).sort(([a], [b]) => a.localeCompare(b));\n for (const [varName, importPath] of sortedImages) {\n importLines.push(`import ${varName} from '${importPath}';`);\n }\n }\n\n // Sort component imports alphabetically\n const componentImports = Array.from(ctx.imports).sort();\n for (const comp of componentImports) {\n const path = componentImportPath(fileDepth, comp);\n importLines.push(`import ${astroComponentName(comp)} from '${path}';`);\n }\n\n // Build script paths array\n const scriptsArrayLiteral = scriptPaths.length > 0\n ? `[${scriptPaths.map((s) => `\"${s}\"`).join(', ')}]`\n : '[]';\n\n // Build library tags literal\n const libraryTagsLiteral = `{ headCSS: \\`${escapeTemplateLiteral(libraryTags.headCSS || '')}\\`, headJS: \\`${escapeTemplateLiteral(libraryTags.headJS || '')}\\`, bodyEndJS: \\`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\\` }`;\n\n const escapedMeta = escapeTemplateLiteral(meta);\n const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);\n\n // Collect frontmatter lines from list emission (e.g., getCollection calls)\n const extraFrontmatter = ctx.frontmatterLines && ctx.frontmatterLines.length > 0\n ? '\\n' + ctx.frontmatterLines.join('\\n')\n : '';\n\n // Generate interactive style block for page-level interactive styles\n const interactiveStyleSection = ctx.collectedInteractiveStyles!.size > 0\n ? `\\n<style is:global>\\n${generateAllInteractiveCSS(ctx.collectedInteractiveStyles!, breakpoints, remConfig, responsiveScales)}\\n</style>\\n`\n : '';\n\n return `---\n${importLines.join('\\n')}${extraFrontmatter}\n---\n<BaseLayout\n title=\"${escapeJSX(title)}\"\n meta={\\`${escapedMeta}\\`}\n scripts={${scriptsArrayLiteral}}\n locale=\"${locale}\"\n theme=\"${theme}\"\n fontPreloads={\\`${escapedFontPreloads}\\`}\n libraryTags={${libraryTagsLiteral}}\n>\n <div id=\"root\">\n${templateBody} </div>\n</BaseLayout>\n${interactiveStyleSection}`;\n}\n\n/**\n * Build an empty page with just the layout wrapper\n */\nfunction buildEmptyPage(\n layoutImport: string,\n title: string,\n meta: string,\n locale: string,\n theme: string,\n fontPreloads: string,\n libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string },\n scriptPaths: string[]\n): string {\n const escapedMeta = escapeTemplateLiteral(meta);\n const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);\n const scriptsArrayLiteral = scriptPaths.length > 0\n ? `[${scriptPaths.map((s) => `\"${s}\"`).join(', ')}]`\n : '[]';\n const libraryTagsLiteral = `{ headCSS: \\`${escapeTemplateLiteral(libraryTags.headCSS || '')}\\`, headJS: \\`${escapeTemplateLiteral(libraryTags.headJS || '')}\\`, bodyEndJS: \\`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\\` }`;\n\n return `---\nimport BaseLayout from '${layoutImport}';\n---\n<BaseLayout\n title=\"${escapeJSX(title)}\"\n meta={\\`${escapedMeta}\\`}\n scripts={${scriptsArrayLiteral}}\n locale=\"${locale}\"\n theme=\"${theme}\"\n fontPreloads={\\`${escapedFontPreloads}\\`}\n libraryTags={${libraryTagsLiteral}}\n>\n</BaseLayout>\n`;\n}\n", "/**\n * CMS Page File Generator\n * Generates .astro page files for CMS template pages with getStaticPaths()\n */\n\nimport type { JSONPage, ComponentDefinition, CMSSchema, I18nConfig } from '../../shared/types';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';\nimport { nodeToAstro, type AstroEmitContext } from './nodeToAstro';\nimport { transformCMSTemplate } from './templateTransformer';\nimport type { ImageMetadataMap } from '../ssr/imageMetadata';\nimport type { SlugMap } from '../../shared/slugTranslator';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport type { InteractiveStyles } from '../../shared/types/styles';\nimport type { RemConversionConfig } from '../../shared/pxToRem';\nimport { generateAllInteractiveCSS } from '../../shared/cssGeneration';\nimport { astroComponentName } from './astroEmitHelpers';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CMSPageEmitOptions {\n /** Page data */\n pageData: JSONPage;\n /** All global components */\n globalComponents: Record<string, ComponentDefinition>;\n /** CMS collection schema */\n cmsSchema: CMSSchema;\n /** Page title (may contain {{cms.field}}) */\n title: string;\n /** Page meta HTML */\n meta: string;\n /** Locale */\n locale: string;\n /** Default theme */\n theme: string;\n /** Font preloads HTML */\n fontPreloads: string;\n /** Library tags */\n libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string };\n /** Script paths */\n scriptPaths: string[];\n /** Import path to BaseLayout */\n layoutImportPath: string;\n /** File depth relative to src/pages */\n fileDepth: number;\n /** SSR HTML fallbacks: node path -> rendered HTML (for ListNode, LocaleListNode) */\n ssrFallbacks: Map<string, string>;\n /** Page name (without extension) */\n pageName: string;\n /** Breakpoint config for responsive Tailwind classes */\n breakpoints?: BreakpointConfig;\n /** Responsive scales config for auto-scaling at breakpoints */\n responsiveScales?: ResponsiveScales;\n /** Image metadata map for responsive image generation */\n imageMetadataMap?: ImageMetadataMap;\n /** Internationalization config */\n i18nConfig: I18nConfig;\n /** Whether site has multiple locales */\n isMultiLocale: boolean;\n /** Slug mappings for translating internal link hrefs */\n slugMappings?: SlugMap[];\n /** Image format: 'webp' uses plain <img>, 'avif' uses <picture> */\n imageFormat?: 'webp' | 'avif';\n /**\n * Raw-HTML slice \u2192 processed HTML captured during the template's SSR pass.\n * Ensures `<Fragment set:html>` matches SSR output for rich-text content\n * (image rewriting, component expansion, link localization).\n */\n processedRawHtml?: Map<string, string>;\n /** Rem conversion config for interactive CSS generation */\n remConfig?: RemConversionConfig;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction escapeTemplateLiteral(s: string): string {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$\\{/g, '\\\\${')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\nfunction escapeJSX(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n}\n\nfunction componentImportPath(fileDepth: number, componentName: string): string {\n const ups = '../'.repeat(fileDepth + 1);\n return `${ups}components/${componentName}.astro`;\n}\n\n/**\n * Collect rich-text field names from CMS schema\n */\nfunction collectRichTextFields(schema: CMSSchema): Set<string> {\n const richTextFields = new Set<string>();\n for (const [fieldName, fieldDef] of Object.entries(schema.fields)) {\n if (fieldDef.type === 'rich-text') {\n richTextFields.add(fieldName);\n }\n }\n return richTextFields;\n}\n\n/**\n * Transform a title string that may contain {{cms.field}} to an Astro expression.\n * Returns the transformed title suitable for use in a JSX attribute.\n */\nfunction transformTitleExpression(\n title: string,\n binding: string,\n richTextFields: Set<string>,\n wrapFn?: string\n): string {\n if (!/\\{\\{cms\\./.test(title)) {\n return `\"${escapeJSX(title)}\"`;\n }\n\n const w = (expr: string) => wrapFn ? `${wrapFn}(${expr})` : expr;\n\n // Full match: entire title is a single {{cms.field}}\n const fullMatch = title.match(/^\\{\\{cms\\.([^}]+)\\}\\}$/);\n if (fullMatch) {\n return `{${w(`${binding}.data.${fullMatch[1].trim()}`)}}`;\n }\n\n // Mixed content: \"Page - {{cms.title}}\" -> {`Page - ${entry.data.title}`}\n const replaced = title.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (_, fieldPath) => {\n return `\\${${w(`${binding}.data.${fieldPath.trim()}`)}}`;\n });\n return `{\\`${replaced}\\`}`;\n}\n\n/**\n * Extract the path prefix from a URL pattern.\n * E.g., \"/blog/{{slug}}\" -> \"blog/\"\n * E.g., \"/posts/{{slug}}\" -> \"posts/\"\n */\nfunction extractPathPrefix(urlPattern: string): string {\n // Remove leading slash, then remove the slug placeholder and everything after\n const withoutLeading = urlPattern.replace(/^\\//, '');\n const idx = withoutLeading.indexOf('{{');\n if (idx <= 0) return '';\n return withoutLeading.substring(0, idx);\n}\n\n// ---------------------------------------------------------------------------\n// getStaticPaths generator\n// ---------------------------------------------------------------------------\n\nfunction buildGetStaticPaths(\n schema: CMSSchema,\n isMultiLocale: boolean,\n i18nConfig: I18nConfig,\n locale?: string\n): string {\n const collectionId = schema.id;\n const slugField = schema.slugField || 'slug';\n const pathPrefix = extractPathPrefix(schema.urlPattern);\n const targetLocale = locale || i18nConfig.defaultLocale;\n\n if (!isMultiLocale) {\n // Single-locale version: resolve slug for this specific locale\n // Route file is at blog/[slug].astro (or pl/blog/[slug].astro for non-default)\n // If i18n values exist, resolve for the target locale\n const slugExpr = i18nConfig.locales.length > 1\n ? `entry.data.${slugField}?.${targetLocale} || entry.data.${slugField} || entry.id`\n : `entry.data.${slugField} || entry.id`;\n\n return [\n `export async function getStaticPaths() {`,\n ` const entries = await getCollection('${collectionId}');`,\n ` return entries.map(entry => ({`,\n ` params: { slug: ${slugExpr} },`,\n ` props: { entry },`,\n ` }));`,\n `}`,\n ``,\n `const { entry } = Astro.props;`,\n ].join('\\n');\n }\n\n // Multi-locale version: enumerate items x locales\n // Route file is at [...slug].astro (top level), so slug includes full path\n const defaultLocale = i18nConfig.defaultLocale;\n const locales = i18nConfig.locales;\n\n const lines: string[] = [\n `export async function getStaticPaths() {`,\n ` const entries = await getCollection('${collectionId}');`,\n ` const paths = [];`,\n ` for (const entry of entries) {`,\n ];\n\n for (const locale of locales) {\n const code = locale.code;\n const slugExpr = `entry.data.${slugField}?.${code} || entry.data.${slugField} || entry.id`;\n\n if (code === defaultLocale) {\n // Default locale: include path prefix but no locale prefix\n // e.g., /blog/{{slug}} \u2192 slug = \"blog/hello\"\n if (pathPrefix) {\n lines.push(\n ` paths.push({`,\n ` params: { slug: \\`${pathPrefix}\\${${slugExpr}}\\` },`,\n ` props: { entry, locale: '${code}' },`,\n ` });`\n );\n } else {\n lines.push(\n ` paths.push({`,\n ` params: { slug: ${slugExpr} },`,\n ` props: { entry, locale: '${code}' },`,\n ` });`\n );\n }\n } else {\n // Non-default locale: locale prefix + path prefix + slug\n // e.g., slug = \"pl/blog/witaj\"\n lines.push(\n ` paths.push({`,\n ` params: { slug: \\`${code}/${pathPrefix}\\${${slugExpr}}\\` },`,\n ` props: { entry, locale: '${code}' },`,\n ` });`\n );\n }\n }\n\n lines.push(\n ` }`,\n ` return paths;`,\n `}`,\n ``,\n `const { entry, locale = '${defaultLocale}' } = Astro.props;`\n );\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Main emitter\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a CMS template .astro page file with getStaticPaths()\n */\nexport function emitCMSPage(options: CMSPageEmitOptions): string {\n const {\n pageData,\n globalComponents,\n cmsSchema,\n title,\n meta,\n locale,\n theme,\n fontPreloads,\n libraryTags,\n scriptPaths,\n layoutImportPath,\n fileDepth,\n ssrFallbacks,\n pageName,\n breakpoints: breakpointsOpt,\n responsiveScales,\n imageMetadataMap,\n i18nConfig,\n isMultiLocale,\n slugMappings,\n processedRawHtml,\n remConfig,\n } = options;\n\n const breakpoints = breakpointsOpt ?? DEFAULT_BREAKPOINTS;\n const binding = 'entry';\n const richTextFields = collectRichTextFields(cmsSchema);\n const wrapFn = 'r';\n\n const root = pageData.root;\n if (!root) {\n return buildEmptyCMSPage(\n layoutImportPath,\n title,\n meta,\n locale,\n theme,\n fontPreloads,\n libraryTags,\n scriptPaths,\n cmsSchema,\n isMultiLocale,\n i18nConfig,\n binding,\n richTextFields\n );\n }\n\n // Build the Astro emit context with CMS mode enabled\n const ctx: AstroEmitContext = {\n imports: new Set<string>(),\n isComponentDef: false,\n componentProps: {},\n globalComponents,\n indent: 1, // inside BaseLayout\n ssrFallbacks,\n elementPath: [0],\n fileType: 'page',\n fileName: pageName,\n breakpoints,\n responsiveScales,\n imageMetadataMap,\n locale,\n cmsMode: true,\n cmsEntryBinding: binding,\n cmsRichTextFields: richTextFields,\n cmsWrapFn: wrapFn,\n slugMappings,\n i18nDefaultLocale: i18nConfig.defaultLocale,\n imageFormat: options.imageFormat,\n processedRawHtml,\n imageImports: new Map<string, string>(),\n fileDepth,\n collectedInteractiveStyles: new Map<string, InteractiveStyles>(),\n };\n\n // Emit the template body\n const templateBody = nodeToAstro(root, ctx);\n\n // Build frontmatter with imports\n const importLines: string[] = [];\n importLines.push(`import { getCollection } from 'astro:content';`);\n importLines.push(`import BaseLayout from '${layoutImportPath}';`);\n\n // Static image imports (astro:assets <Picture>). Map size is the single\n // source of truth \u2014 a separate boolean would be lost by child-ctx spreads.\n if (ctx.imageImports && ctx.imageImports.size > 0) {\n importLines.push(`import { Picture } from 'astro:assets';`);\n const sortedImages = Array.from(ctx.imageImports.entries()).sort(([a], [b]) => a.localeCompare(b));\n for (const [varName, importPath] of sortedImages) {\n importLines.push(`import ${varName} from '${importPath}';`);\n }\n }\n\n // Sort component imports alphabetically\n const componentImports = Array.from(ctx.imports).sort();\n for (const comp of componentImports) {\n const path = componentImportPath(fileDepth, comp);\n importLines.push(`import ${astroComponentName(comp)} from '${path}';`);\n }\n\n // Build getStaticPaths\n const staticPaths = buildGetStaticPaths(cmsSchema, isMultiLocale, i18nConfig, locale);\n\n // Build script paths array\n const scriptsArrayLiteral = scriptPaths.length > 0\n ? `[${scriptPaths.map((s) => `\"${s}\"`).join(', ')}]`\n : '[]';\n\n // Build library tags literal\n const libraryTagsLiteral = `{ headCSS: \\`${escapeTemplateLiteral(libraryTags.headCSS || '')}\\`, headJS: \\`${escapeTemplateLiteral(libraryTags.headJS || '')}\\`, bodyEndJS: \\`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\\` }`;\n\n // Escape meta first, then transform CMS templates ({{cms.X}} survives escaping intact)\n const escapedMeta = escapeTemplateLiteral(meta).replace(\n /\\{\\{cms\\.([^}]+)\\}\\}/g,\n (_, fieldPath) => `\\${${wrapFn}(${binding}.data.${fieldPath.trim()})}`\n );\n const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);\n\n // Transform title for CMS entry data\n const titleExpr = transformTitleExpression(title, binding, richTextFields, wrapFn);\n\n // i18n resolver helper \u2014 resolves {_i18n: true, en: \"...\", pl: \"...\"} to the correct locale string\n const resolverHelper = `function r(v) {\n if (v && typeof v === 'object' && v._i18n) return v['${locale}'] ?? v['${i18nConfig.defaultLocale}'] ?? Object.values(v).find(x => x !== true && x !== undefined) ?? '';\n return v ?? '';\n}`;\n\n // Generate interactive style block for page-level interactive styles\n const interactiveStyleSection = ctx.collectedInteractiveStyles!.size > 0\n ? `\\n<style is:global>\\n${generateAllInteractiveCSS(ctx.collectedInteractiveStyles!, breakpoints, remConfig, responsiveScales)}\\n</style>\\n`\n : '';\n\n return `---\n${importLines.join('\\n')}\n\n${staticPaths}\n\n${resolverHelper}\n---\n<BaseLayout\n title=${titleExpr}\n meta={\\`${escapedMeta}\\`}\n scripts={${scriptsArrayLiteral}}\n locale=\"${locale}\"\n theme=\"${theme}\"\n fontPreloads={\\`${escapedFontPreloads}\\`}\n libraryTags={${libraryTagsLiteral}}\n>\n <div id=\"root\">\n${templateBody} </div>\n</BaseLayout>\n${interactiveStyleSection}`;\n}\n\n/**\n * Build an empty CMS page with just the layout wrapper and getStaticPaths\n */\nfunction buildEmptyCMSPage(\n layoutImport: string,\n title: string,\n meta: string,\n locale: string,\n theme: string,\n fontPreloads: string,\n libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string },\n scriptPaths: string[],\n cmsSchema: CMSSchema,\n isMultiLocale: boolean,\n i18nConfig: I18nConfig,\n binding: string,\n richTextFields: Set<string>\n): string {\n const escapedMeta = escapeTemplateLiteral(meta);\n const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);\n const scriptsArrayLiteral = scriptPaths.length > 0\n ? `[${scriptPaths.map((s) => `\"${s}\"`).join(', ')}]`\n : '[]';\n const libraryTagsLiteral = `{ headCSS: \\`${escapeTemplateLiteral(libraryTags.headCSS || '')}\\`, headJS: \\`${escapeTemplateLiteral(libraryTags.headJS || '')}\\`, bodyEndJS: \\`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\\` }`;\n\n const wrapFn = 'r';\n const staticPaths = buildGetStaticPaths(cmsSchema, isMultiLocale, i18nConfig, locale);\n const titleExpr = transformTitleExpression(title, binding, richTextFields, wrapFn);\n\n const resolverHelper = `function r(v) {\n if (v && typeof v === 'object' && v._i18n) return v['${locale}'] ?? v['${i18nConfig.defaultLocale}'] ?? Object.values(v).find(x => x !== true && x !== undefined) ?? '';\n return v ?? '';\n}`;\n\n return `---\nimport { getCollection } from 'astro:content';\nimport BaseLayout from '${layoutImport}';\n\n${staticPaths}\n\n${resolverHelper}\n---\n<BaseLayout\n title=${titleExpr}\n meta={\\`${escapedMeta}\\`}\n scripts={${scriptsArrayLiteral}}\n locale=\"${locale}\"\n theme=\"${theme}\"\n fontPreloads={\\`${escapedFontPreloads}\\`}\n libraryTags={${libraryTagsLiteral}}\n>\n</BaseLayout>\n`;\n}\n", "/**\n * Mapping Variant CSS Collector (Tailwind)\n * Walks all component definitions to find StyleMapping objects,\n * generates Tailwind classes for every possible value, ensuring\n * the Tailwind safelist covers all prop variants.\n */\n\nimport type { ComponentDefinition, ComponentNode } from '../../shared/types';\nimport type {\n StyleObject,\n ResponsiveStyleObject,\n StyleMapping,\n} from '../../shared/types/styles';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';\nimport { propertyToTailwind } from './tailwindMapper';\nimport type { ResponsiveScales, CSSPropertyType } from '../../shared/responsiveScaling';\nimport { getScaleMultiplier, scalePropertyValue } from '../../shared/responsiveScaling';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isStyleMapping(value: unknown): value is StyleMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as StyleMapping)._mapping === true\n );\n}\n\nfunction isResponsiveStyle(\n style: StyleObject | ResponsiveStyleObject\n): style is ResponsiveStyleObject {\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n/**\n * Walk a style object and collect Tailwind classes for every possible mapping value\n */\nfunction collectFromStyle(\n style: StyleObject | ResponsiveStyleObject | undefined,\n classes: Set<string>,\n breakpoints: BreakpointConfig,\n responsiveScales?: ResponsiveScales\n): void {\n if (!style) return;\n\n if (isResponsiveStyle(style)) {\n for (const [bp, bpStyle] of Object.entries(style)) {\n if (!bpStyle) continue;\n let prefix = '';\n let bpName: string | undefined;\n if (bp !== 'base') {\n const bpValue = breakpoints[bp]?.breakpoint;\n if (bpValue) {\n prefix = `max-[${bpValue}px]:`;\n bpName = bp;\n }\n }\n collectFromFlatStyle(bpStyle, prefix, classes, breakpoints, responsiveScales, bpName);\n }\n } else {\n collectFromFlatStyle(style, '', classes, breakpoints, responsiveScales);\n }\n}\n\nfunction collectFromFlatStyle(\n style: StyleObject,\n prefix: string,\n classes: Set<string>,\n breakpoints: BreakpointConfig,\n responsiveScales?: ResponsiveScales,\n sourceBreakpoint?: string\n): void {\n // Only auto-scale when mapping value lives in the base branch (or a flat\n // top-level style). Mappings inside an explicit breakpoint branch already\n // describe the override the author wants \u2014 don't re-scale them.\n const shouldAutoScale =\n responsiveScales?.enabled === true && sourceBreakpoint === undefined;\n\n const scaleBreakpoints = shouldAutoScale\n ? Object.entries(breakpoints)\n .map(([name, cfg]) => ({ name, value: cfg?.breakpoint }))\n .filter((bp): bp is { name: string; value: number } =>\n typeof bp.value === 'number' && bp.value > 0\n )\n .sort((a, b) => b.value - a.value)\n : [];\n\n const baseRef = responsiveScales?.baseReference ?? 16;\n\n for (const [property, value] of Object.entries(style)) {\n if (!isStyleMapping(value)) continue;\n\n // Generate a Tailwind class for each possible value in the mapping\n for (const [, cssValue] of Object.entries(value.values)) {\n const twClass = propertyToTailwind(property, cssValue);\n if (twClass) {\n classes.add(prefix ? `${prefix}${twClass}` : twClass);\n }\n\n // Safelist auto-scaled `max-[Npx]:` variants so Tailwind generates\n // CSS for each breakpoint-scaled class the runtime might produce.\n if (shouldAutoScale && responsiveScales) {\n const strValue = String(cssValue);\n if (strValue === '') continue;\n for (const { name: bpName, value: bpPixels } of scaleBreakpoints) {\n const scale = getScaleMultiplier(\n responsiveScales,\n property as CSSPropertyType,\n bpName\n );\n if (scale == null) continue;\n const scaledValue = scalePropertyValue(strValue, baseRef, scale);\n if (scaledValue == null || scaledValue === strValue) continue;\n const scaledClass = propertyToTailwind(property, scaledValue);\n if (!scaledClass) continue;\n classes.add(`max-[${bpPixels}px]:${scaledClass}`);\n }\n }\n }\n }\n}\n\n/**\n * Recursively walk a component node tree to collect mapping classes\n */\nfunction walkNode(\n node: ComponentNode | ComponentNode[] | string | number | null | undefined,\n classes: Set<string>,\n breakpoints: BreakpointConfig,\n responsiveScales?: ResponsiveScales\n): void {\n if (!node || typeof node === 'string' || typeof node === 'number') return;\n\n if (Array.isArray(node)) {\n for (const child of node) {\n walkNode(child, classes, breakpoints, responsiveScales);\n }\n return;\n }\n\n // Collect from style\n if ('style' in node && node.style) {\n collectFromStyle(node.style as StyleObject | ResponsiveStyleObject, classes, breakpoints, responsiveScales);\n }\n\n // Collect from interactive styles\n if ('interactiveStyles' in node && Array.isArray((node as any).interactiveStyles)) {\n for (const rule of (node as any).interactiveStyles) {\n if (rule.style) {\n collectFromStyle(rule.style, classes, breakpoints, responsiveScales);\n }\n }\n }\n\n // Recurse into children\n if ('children' in node && node.children) {\n if (Array.isArray(node.children)) {\n for (const child of node.children) {\n walkNode(child as ComponentNode, classes, breakpoints, responsiveScales);\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\n/**\n * Walk all component definitions, find all StyleMapping objects,\n * and generate Tailwind classes for every value.\n *\n * @returns Set of Tailwind class names for the safelist\n */\nexport function collectAllMappingClasses(\n componentDefs: Record<string, ComponentDefinition>,\n breakpoints: BreakpointConfig = DEFAULT_BREAKPOINTS,\n responsiveScales?: ResponsiveScales\n): Set<string> {\n const classes = new Set<string>();\n\n for (const def of Object.values(componentDefs)) {\n const structure = def.component?.structure;\n if (structure) {\n walkNode(structure, classes, breakpoints, responsiveScales);\n }\n }\n\n return classes;\n}\n", "/**\n * Webflow Export Build Orchestrator\n * Loads the project, renders all pages, and converts to Webflow payload.\n * Mirrors the pattern of build-astro.ts.\n */\n\nimport { existsSync, readdirSync } from 'fs';\nimport { readFile } from 'fs/promises';\nimport { join } from 'path';\nimport {\n loadJSONFile,\n loadComponentDirectory,\n mapPageNameToPath,\n parseJSON,\n loadI18nConfig,\n loadBreakpointConfig,\n} from '../jsonLoader';\nimport { renderPageSSR } from '../ssr/ssrRenderer';\nimport { projectPaths } from '../projectContext';\nimport { loadProjectConfig } from '../../shared/fontLoader';\nimport { FileSystemCMSProvider } from '../providers/fileSystemCMSProvider';\nimport { CMSService } from '../services/cmsService';\nimport { isI18nValue, resolveI18nValue } from '../../shared/i18n';\nimport { RAW_HTML_PREFIX } from '../../shared/constants';\nimport { extractPageMeta, type PageMeta } from '../ssr/metaTagGenerator';\nimport { configService } from '../services/configService';\nimport { colorService } from '../services/ColorService';\nimport { variableService } from '../services/VariableService';\nimport { migrateTemplatesDirectory } from '../migrateTemplates';\nimport type {\n ComponentDefinition,\n JSONPage,\n CMSSchema,\n CMSItem,\n I18nConfig,\n ThemeConfig,\n} from '../../shared/types';\nimport { resolvePaletteColor } from '../../shared/types/colors';\nimport type { SlugMap } from '../../shared/slugTranslator';\nimport type {\n WebflowExportPayload,\n WebflowPage,\n WebflowStyleClass,\n WebflowAssetRef,\n WebflowScript,\n WebflowComponentDef,\n} from './types';\nimport { nodeToWebflow, normalizeListChildren, type WebflowEmitContext } from './nodeToWebflow';\nimport { isWebflowHandledRule } from './styleMapper';\nimport { generateInteractiveCSS } from '../../shared/cssGeneration';\nimport { generateVariablesCSS } from '../cssGenerator';\nimport type { InteractiveStyles } from '../../shared/types/styles';\nimport { resolveVariableValueAtBreakpoint } from '../../shared/responsiveScaling';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport type { VariablesConfig } from '../../shared/types';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction scanJSONFiles(dir: string, prefix: string = ''): string[] {\n const results: string[] = [];\n if (!existsSync(dir)) return results;\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.json')) {\n results.push(prefix ? `${prefix}/${entry.name}` : entry.name);\n } else if (entry.isDirectory()) {\n results.push(...scanJSONFiles(join(dir, entry.name), prefix ? `${prefix}/${entry.name}` : entry.name));\n }\n }\n return results;\n}\n\nfunction isCMSPage(pageData: JSONPage): boolean {\n return pageData.meta?.source === 'cms' && !!pageData.meta?.cms;\n}\n\n/**\n * Flatten a CMS item for the Webflow emit path: resolve i18n values to the\n * current locale and unwrap rich-text markers (`{ __richtext__, html }`) into\n * `RAW_HTML_PREFIX + html` so `nodeToWebflow`'s `resolveTemplate` can flatten\n * inline HTML to plain text. Mirrors what SSR's `processCMSTemplate`\n * (`cmsSSRProcessor.ts`) does inline at every interpolation site \u2014 but applied\n * once up front so the simpler Webflow `resolveTemplate` (which only does\n * `String(value)`) renders meaningful text instead of `[object Object]` /\n * empty strings.\n */\nfunction flattenCMSItemForLocale(\n item: CMSItem,\n locale: string,\n i18nConfig: I18nConfig\n): Record<string, unknown> {\n const flatten = (value: unknown): unknown => {\n if (value === null || value === undefined) return value;\n if (isI18nValue(value)) {\n return flatten(resolveI18nValue(value, locale, i18nConfig));\n }\n if (typeof value === 'object' && '__richtext__' in (value as object)) {\n const html = (value as { html?: unknown }).html;\n if (typeof html === 'string') return RAW_HTML_PREFIX + html;\n }\n return value;\n };\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(item)) {\n out[key] = flatten(value);\n }\n return out;\n}\n\n/**\n * Resolve a page-meta value (which may be an i18n object) to a string for the\n * given locale, or undefined when the field is empty.\n */\nfunction resolveMetaString(\n value: unknown,\n locale: string,\n i18nConfig: I18nConfig\n): string | undefined {\n if (value === undefined || value === null || value === '') return undefined;\n const resolved = isI18nValue(value)\n ? resolveI18nValue(value, locale, i18nConfig)\n : value;\n if (resolved === undefined || resolved === null || resolved === '') return undefined;\n return String(resolved);\n}\n\n/**\n * Lift the structured meta from a page (title, description, OG fields,\n * keywords) into the per-locale fields of a `WebflowPage`. SSR's `result.title`\n * is preserved as the canonical title; the rest comes from `extractPageMeta`.\n */\nfunction buildPageMetaForLocale(\n meta: PageMeta,\n locale: string,\n i18nConfig: I18nConfig\n): Pick<WebflowPage, 'description' | 'keywords' | 'ogTitle' | 'ogDescription' | 'ogImage'> {\n return {\n description: resolveMetaString(meta.description, locale, i18nConfig),\n keywords: resolveMetaString(meta.keywords, locale, i18nConfig),\n ogTitle: resolveMetaString(meta.ogTitle, locale, i18nConfig),\n ogDescription: resolveMetaString(meta.ogDescription, locale, i18nConfig),\n ogImage: resolveMetaString(meta.ogImage, locale, i18nConfig),\n };\n}\n\nfunction scanAssets(projectRoot: string): WebflowAssetRef[] {\n const assets: WebflowAssetRef[] = [];\n const assetDirs: Array<{ dir: string; type: WebflowAssetRef['type'] }> = [\n { dir: 'images', type: 'image' },\n { dir: 'fonts', type: 'font' },\n { dir: 'videos', type: 'video' },\n { dir: 'assets', type: 'file' },\n ];\n\n for (const { dir, type } of assetDirs) {\n const fullDir = join(projectRoot, dir);\n if (!existsSync(fullDir)) continue;\n const files = scanJSONFiles(fullDir).map(f => f.replace('.json', '')); // scanJSONFiles works for any extension\n // Re-scan properly for all file types\n const allFiles = scanAllFiles(fullDir);\n for (const file of allFiles) {\n assets.push({\n localPath: `${dir}/${file}`,\n type,\n fileName: file.split('/').pop()!,\n });\n }\n }\n\n return assets;\n}\n\nfunction scanAllFiles(dir: string, prefix: string = ''): string[] {\n const results: string[] = [];\n if (!existsSync(dir)) return results;\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isFile()) {\n results.push(relativePath);\n } else if (entry.isDirectory()) {\n results.push(...scanAllFiles(join(dir, entry.name), relativePath));\n }\n }\n return results;\n}\n\n/**\n * Build per-theme `--var` maps so the walker can resolve `var(--bg)` against\n * whatever theme an element actually inherits. Each theme key holds its full\n * resolved palette (text, bg, border, \u2026); `defaultThemeName` is what we fall\n * back to when an element has no `theme` ancestor.\n */\nfunction buildThemeVarMaps(\n themeConfig: ThemeConfig\n): { byTheme: Record<string, Record<string, string>>; defaultTheme: string } {\n const palette = themeConfig.palette;\n const byTheme: Record<string, Record<string, string>> = {};\n for (const [themeName, theme] of Object.entries(themeConfig.themes)) {\n const vars: Record<string, string> = {};\n for (const [name, value] of Object.entries(theme.colors)) {\n vars[`--${name}`] = resolvePaletteColor(value, palette);\n }\n byTheme[themeName] = vars;\n }\n return { byTheme, defaultTheme: themeConfig.default };\n}\n\n/**\n * Build a per-breakpoint `--var \u2192 value` map directly from the variables\n * config. Each breakpoint key (`base`, `tablet`, `mobile`, \u2026) holds the full\n * resolved variable map at that breakpoint, with per-variable `scales`\n * overrides and global category scaling already applied\n * (`resolveVariableValueAtBreakpoint` mirrors `generateVariablesCSS` and the\n * runtime CSS resolver).\n *\n * The walker uses these maps to inline `var(--x)` references in element\n * styles per-breakpoint, so the Webflow class system receives concrete\n * scaled values at every tier instead of a single flat base value.\n */\nfunction buildProjectVarMaps(\n variablesConfig: VariablesConfig,\n breakpoints: BreakpointConfig,\n responsiveScales: ResponsiveScales | undefined\n): Record<string, Record<string, string>> {\n const out: Record<string, Record<string, string>> = { base: {} };\n for (const bpName of Object.keys(breakpoints)) out[bpName] = {};\n\n for (const variable of variablesConfig.variables) {\n if (!variable.cssVar) continue;\n out.base[variable.cssVar] = variable.value;\n for (const bpName of Object.keys(breakpoints)) {\n const resolved = resolveVariableValueAtBreakpoint(\n { value: variable.value, type: variable.type, scales: variable.scales },\n bpName,\n responsiveScales\n );\n out[bpName][variable.cssVar] = resolved;\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\nexport async function buildWebflowPayload(\n options?: { bindCollectionLists?: boolean; promotedComponentNames?: string[]; locale?: string }\n): Promise<WebflowExportPayload> {\n const bindCollectionLists = options?.bindCollectionLists === true;\n const promotedComponentNames = Array.isArray(options?.promotedComponentNames)\n ? new Set(options!.promotedComponentNames.filter((n): n is string => typeof n === 'string' && n.length > 0))\n : undefined;\n // 1. Setup: load project configuration\n configService.reset();\n\n const projectConfig = await loadProjectConfig();\n const siteUrl = (projectConfig as { siteUrl?: string }).siteUrl?.replace(/\\/$/, '') || '';\n const i18nConfig = await loadI18nConfig();\n\n // Pick which locale to render. Multi-locale projects export one locale at a\n // time so the Webflow site mirrors a single language; the extension surfaces\n // a picker that defaults to `i18nConfig.defaultLocale`. An invalid/missing\n // request falls back to the default locale (silent \u2014 the picker is the\n // source of truth here, not the URL).\n const requestedLocale = options?.locale;\n const selectedLocale = (requestedLocale && i18nConfig.locales.some(l => l.code === requestedLocale))\n ? requestedLocale\n : i18nConfig.defaultLocale;\n const localesToBuild = i18nConfig.locales.filter(l => l.code === selectedLocale);\n\n await migrateTemplatesDirectory();\n\n const { components } = await loadComponentDirectory(projectPaths.components());\n const globalComponents: Record<string, ComponentDefinition> = {};\n components.forEach((value, key) => { globalComponents[key] = value; });\n\n const cmsProvider = new FileSystemCMSProvider(projectPaths.templates(), projectPaths.cms());\n const cmsService = new CMSService(cmsProvider);\n await cmsService.initialize();\n\n const themeConfig = await colorService.loadThemeConfig();\n const variablesConfig = await variableService.loadConfig();\n const breakpoints = await loadBreakpointConfig();\n\n await configService.load();\n const responsiveScales = configService.getResponsiveScales();\n\n // 2. Scan pages\n const pagesDir = projectPaths.pages();\n if (!existsSync(pagesDir)) {\n return emptyPayload();\n }\n\n const pageFiles = scanJSONFiles(pagesDir);\n if (pageFiles.length === 0) {\n return emptyPayload();\n }\n\n // Collect slug mappings\n const slugMappings: SlugMap[] = [];\n for (const file of pageFiles) {\n const pageName = file.replace('.json', '');\n const basePath = mapPageNameToPath(pageName);\n const pageContent = await loadJSONFile(join(pagesDir, file));\n if (!pageContent) continue;\n try {\n const pageData = parseJSON<JSONPage>(pageContent);\n if (pageData.meta?.slugs) {\n const pageId = basePath === '/' ? 'index' : basePath.substring(1);\n slugMappings.push({ pageId, slugs: pageData.meta.slugs });\n }\n } catch { /* ignore */ }\n }\n\n // 3. Render and convert pages\n const allPages: WebflowPage[] = [];\n const allStyleClasses = new Map<string, WebflowStyleClass>();\n // elementClass \u2192 interactiveStyles, populated during the node walk and\n // drained at the end into raw CSS (see step 6 below).\n const allInteractiveStylesMap = new Map<string, InteractiveStyles>();\n // Combo class name \u2192 owning identity, shared across every page emit so\n // collisions are visible project-wide. Drives `mintInstanceComboName` in\n // nodeToWebflow.ts.\n const allComboIdentityByName = new Map<string, string>();\n // First-encounter snapshot of each promoted component (Navigation, Footer)\n // shared across every page so the extension registers each definition once.\n const promotedComponents = new Map<string, WebflowComponentDef>();\n\n // Theme + project-level CSS variables are resolved during the walk so the\n // ancestor `theme` attribute can pick the right palette per element. The\n // project var map is per-breakpoint so `var(--x)` refs in element styles\n // can be inlined at each tier with the right scaled value.\n const variablesCSS = generateVariablesCSS(variablesConfig, breakpoints, responsiveScales);\n const projectVars = buildProjectVarMaps(variablesConfig, breakpoints, responsiveScales);\n const { byTheme: themeVars, defaultTheme } = buildThemeVarMaps(themeConfig);\n\n // Regular pages\n for (const file of pageFiles) {\n const pageName = file.replace('.json', '');\n const basePath = mapPageNameToPath(pageName);\n const pageContent = await loadJSONFile(join(pagesDir, file));\n if (!pageContent) continue;\n\n try {\n const pageData = parseJSON<JSONPage>(pageContent);\n if (pageData.meta?.draft === true) continue;\n\n const slugs = pageData.meta?.slugs;\n\n for (const localeConfig of localesToBuild) {\n const locale = localeConfig.code;\n const isDefault = locale === i18nConfig.defaultLocale;\n\n let slug: string;\n if (slugs && slugs[locale]) {\n slug = slugs[locale];\n } else if (basePath === '/') {\n slug = '';\n } else {\n slug = basePath.substring(1);\n }\n\n const urlPath = isDefault\n ? (slug === '' ? '/' : `/${slug}`)\n : (slug === '' ? `/${locale}` : `/${locale}/${slug}`);\n\n // Render via SSR to resolve all props\n const result = await renderPageSSR(\n pageData,\n globalComponents,\n urlPath,\n siteUrl,\n locale,\n i18nConfig,\n slugMappings,\n undefined,\n cmsService,\n true\n );\n\n // Convert node tree to Webflow elements\n const ctx: WebflowEmitContext = {\n globalComponents,\n elementPath: [0],\n fileType: 'page',\n fileName: pageName,\n breakpoints,\n styleClasses: allStyleClasses,\n comboIdentityByName: allComboIdentityByName,\n interactiveStylesMap: allInteractiveStylesMap,\n cmsService,\n i18nConfig,\n locale,\n slugMappings,\n pagePath: urlPath,\n themeVars,\n projectVars,\n defaultTheme,\n responsiveScales,\n promotedComponents,\n promotedComponentNames,\n bindCollectionLists,\n };\n\n const body = pageData.root || (pageData as any).node;\n const elements = body ? await nodeToWebflow(body, ctx) : [];\n normalizeListChildren(elements);\n\n const pageMeta = extractPageMeta(pageData);\n allPages.push({\n title: result.title,\n slug: slug || 'index',\n elements,\n locale,\n ...buildPageMetaForLocale(pageMeta, locale, i18nConfig),\n });\n }\n } catch (error: any) {\n console.error(`Error processing ${basePath}:`, error?.message);\n }\n }\n\n // CMS template pages \u2014 imported as a single regular Webflow page per locale,\n // bound to the FIRST CMS item's content. Webflow can't natively bind a page\n // to a Meno-side collection, and a separate \"Sync CMS\" flow in the extension\n // handles collection schema/items, so this code path stays page-only.\n const templatesDir = projectPaths.templates();\n\n if (existsSync(templatesDir)) {\n const templateFiles = readdirSync(templatesDir).filter(f => f.endsWith('.json'));\n\n for (const file of templateFiles) {\n const templateContent = await loadJSONFile(join(templatesDir, file));\n if (!templateContent) continue;\n\n try {\n const pageData = parseJSON<JSONPage>(templateContent);\n if (pageData.meta?.draft === true) continue;\n if (!isCMSPage(pageData)) continue;\n\n const cmsSchema = pageData.meta!.cms as CMSSchema;\n const items = await cmsService.queryItems({ collection: cmsSchema.id });\n if (items.length === 0) continue;\n\n const item = items[0];\n const pageName = file.replace('.json', '');\n\n for (const localeConfig of localesToBuild) {\n const locale = localeConfig.code;\n // Use the first item's resolved URL (from cmsSchema.urlPattern) as\n // the slug, so a template like `templates/blog.json` lands at\n // `/blog/<first-slug>` and doesn't collide with a sibling listing\n // page like `pages/blog.json`.\n let itemSlug = item[cmsSchema.slugField] ?? item._slug ?? item._filename ?? item._id;\n if (isI18nValue(itemSlug)) {\n itemSlug = resolveI18nValue(itemSlug, locale, i18nConfig) as string;\n }\n const resolvedItemPath = cmsSchema.urlPattern.replace('{{slug}}', String(itemSlug));\n const isDefault = locale === i18nConfig.defaultLocale;\n const localizedItemPath = isDefault\n ? resolvedItemPath\n : `/${locale}${resolvedItemPath.startsWith('/') ? '' : '/'}${resolvedItemPath}`;\n const slug = localizedItemPath.startsWith('/')\n ? localizedItemPath.substring(1)\n : localizedItemPath;\n const urlPath = localizedItemPath;\n // SSR (`renderPageSSR`) gets the raw item \u2014 its `processCMSTemplate`\n // resolves i18n + richtext at each interpolation. The Webflow path\n // re-walks the same `pageData.root` with the simpler `resolveTemplate`\n // (no i18n / richtext awareness), so we hand it a pre-flattened item.\n const flatItem = flattenCMSItemForLocale(item, locale, i18nConfig);\n const itemWithUrl: CMSItem = { ...flatItem, _url: urlPath } as CMSItem;\n const ssrItem: CMSItem = { ...item, _url: urlPath };\n\n const result = await renderPageSSR(\n pageData,\n globalComponents,\n urlPath,\n siteUrl,\n locale,\n i18nConfig,\n slugMappings,\n { cms: ssrItem },\n cmsService,\n true\n );\n\n const ctx: WebflowEmitContext = {\n globalComponents,\n elementPath: [0],\n fileType: 'page',\n fileName: pageName,\n breakpoints,\n styleClasses: allStyleClasses,\n comboIdentityByName: allComboIdentityByName,\n interactiveStylesMap: allInteractiveStylesMap,\n cmsService,\n i18nConfig,\n locale,\n slugMappings,\n pagePath: urlPath,\n cmsContext: { cms: itemWithUrl },\n // Seed `templateContext` with the bound item so descendants inside\n // a component slot still see `cms`. `emitInlineComponentBody`\n // merges `ctx.templateContext` into the body's `instanceProps`\n // (nodeToWebflow.ts:1140-1143), and `<slot>` rendering forwards\n // those merged props to slot children \u2014 without this, anything\n // wrapped in (e.g.) Section loses the page-level CMS scope and\n // `{{cms.title}}` resolves to empty.\n templateContext: { cms: itemWithUrl } as Record<string, unknown>,\n themeVars,\n projectVars,\n defaultTheme,\n responsiveScales,\n promotedComponents,\n promotedComponentNames,\n bindCollectionLists,\n };\n\n const body = pageData.root || (pageData as any).node;\n const elements = body ? await nodeToWebflow(body, ctx, { cms: itemWithUrl }) : [];\n normalizeListChildren(elements);\n\n const cmsPageMeta = extractPageMeta(pageData);\n allPages.push({\n title: result.title,\n slug,\n elements,\n locale,\n ...buildPageMetaForLocale(cmsPageMeta, locale, i18nConfig),\n });\n }\n } catch (error: any) {\n console.error(`Error processing template ${file}:`, error?.message);\n }\n }\n }\n\n // Promoted components (Navigation, Footer) are emitted via the same\n // `nodeToWebflow` walk as pages, so they share the same `<ul>`-with-\n // non-`<li>`-children pitfall. Normalize their element trees too before\n // they leave the build.\n for (const def of promotedComponents.values()) {\n normalizeListChildren(def.elements);\n }\n\n // 4. Scan assets\n const styleClasses = Array.from(allStyleClasses.values());\n const assets = scanAssets(projectPaths.project);\n\n // 5. Collect component scripts and component-scoped CSS sidecars. Both get\n // bundled into the manual-paste UI: scripts as a `<script>` at body end,\n // CSS as part of the `<style>` block at head. CSS in particular is\n // critical for components that drive visibility through hand-written\n // rules (e.g. NavDropdown's `[data-nav-dropdown=\"container\"].open ...`)\n // \u2014 those don't translate to Webflow's class system at all.\n const scripts: WebflowScript[] = [];\n const cssBlocks: string[] = [];\n for (const [name, def] of Object.entries(globalComponents)) {\n const code = def.component?.javascript;\n if (typeof code === 'string' && code.trim().length > 0) {\n scripts.push({\n componentName: name,\n code,\n defineVars: def.component?.defineVars,\n });\n }\n const css = def.component?.css;\n if (typeof css === 'string' && css.trim().length > 0) {\n cssBlocks.push(`/* ${name}.css */\\n${css.trim()}`);\n }\n }\n const componentCss = cssBlocks.length > 0 ? cssBlocks.join('\\n\\n') : undefined;\n\n // 6. Per-element interactiveStyles \u2192 raw CSS for rules Webflow's class\n // system can't represent (anything with `prefix`, class-style postfix,\n // or breakpoint-divided pseudos). Pseudo-only rules with empty prefix\n // have already been written into `primaryClass.pseudoStates` upstream\n // via `Style.setProperties({ pseudo })`; we filter those out here so\n // the bundle doesn't double-emit them.\n const interactiveCssBlocks: string[] = [];\n for (const [elementClass, rules] of allInteractiveStylesMap) {\n const customRules = rules.filter((r) => !isWebflowHandledRule(r));\n if (customRules.length === 0) continue;\n const css = generateInteractiveCSS(elementClass, customRules, breakpoints, undefined, responsiveScales);\n if (css && css.trim().length > 0) {\n interactiveCssBlocks.push(css);\n }\n }\n const interactiveCss = interactiveCssBlocks.length > 0\n ? interactiveCssBlocks.join('\\n\\n')\n : undefined;\n\n return {\n version: 1,\n exportedAt: new Date().toISOString(),\n pages: allPages,\n styles: styleClasses,\n cms: [],\n assets,\n slugMappings: slugMappings.length > 0 ? slugMappings : undefined,\n scripts: scripts.length > 0 ? scripts : undefined,\n components: promotedComponents.size > 0\n ? Array.from(promotedComponents.values())\n : undefined,\n componentCss,\n interactiveCss,\n i18n: {\n defaultLocale: i18nConfig.defaultLocale,\n locales: i18nConfig.locales.map(l => ({\n code: l.code,\n name: l.name,\n nativeName: l.nativeName,\n })),\n selectedLocale,\n },\n };\n}\n\nfunction emptyPayload(): WebflowExportPayload {\n return {\n version: 1,\n exportedAt: new Date().toISOString(),\n pages: [],\n styles: [],\n cms: [],\n assets: [],\n };\n}\n\n", "/**\n * Node-to-Webflow Converter\n * Recursively converts Meno's ComponentNode tree into Webflow element tree.\n * Follows the same traversal pattern as nodeToAstro.ts.\n */\n\nimport type {\n ComponentNode,\n ComponentDefinition,\n StructuredComponentDefinition,\n HtmlNode,\n ComponentInstanceNode,\n SlotMarker,\n EmbedNode,\n LinkNode,\n LocaleListNode,\n CMSItem,\n CMSSchema,\n I18nConfig,\n CMSFilterCondition,\n} from '../../shared/types';\nimport type { ListNode } from '../../shared/registry/nodeTypes/ListNodeType';\nimport type {\n StyleObject,\n ResponsiveStyleObject,\n InteractiveStyles,\n InteractiveStyleRule,\n StyleValue,\n StyleMapping,\n} from '../../shared/types/styles';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport { generateElementClassName, shortHash } from '../../shared/elementClassName';\nimport { isVoidElement, hasIf, isBooleanMapping } from '../../shared/nodeUtils';\nimport { NODE_TYPE, RAW_HTML_PREFIX } from '../../shared/constants';\nimport { isI18nValue, resolveI18nValue, resolveI18nInProps } from '../../shared/i18n';\nimport { isItemDraftForLocale } from '../../shared/types';\nimport {\n buildTemplateContext,\n resolveItemsTemplate,\n getNestedValue,\n addItemUrl,\n type ValueResolver,\n} from '../../shared/itemTemplateUtils';\nimport { buildSlugIndex, getLocaleLinks, translatePath, type SlugMap } from '../../shared/slugTranslator';\nimport type { CMSService } from '../services/cmsService';\nimport type { WebflowElement, WebflowStyleClass, WebflowComponentDef } from './types';\nimport {\n COLLECTION_LIST_TAG,\n MENO_BIND_SENTINEL_PREFIX,\n MENO_BIND_SENTINEL_SUFFIX,\n MENO_BIND_SENTINEL_RE,\n MENO_BIND_SENTINEL_EXACT_RE,\n} from './types';\nimport { mapStylesToWebflow, buildInstanceStyleCombo } from './styleMapper';\nimport { processCodeTemplates, hasTemplates as hasCodeTemplates, resolveHtmlMapping, isHtmlMapping } from '../../client/templateEngine';\nimport { resolvePropsFromDefinition } from '../../shared/propResolver';\nimport { readFile } from 'fs/promises';\nimport { join, basename, extname } from 'path';\nimport { getProjectRoot } from '../projectContext';\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport interface WebflowEmitContext {\n /** All global components */\n globalComponents: Record<string, ComponentDefinition>;\n /** Current element path for class name generation */\n elementPath: number[];\n /** File type for element class context */\n fileType: 'component' | 'page';\n /** File name for element class context */\n fileName: string;\n /** Breakpoint config */\n breakpoints: BreakpointConfig;\n /** Collected style classes (side output) */\n styleClasses: Map<string, WebflowStyleClass>;\n /**\n * Combo class name \u2192 identity that owns it. Lets `mintInstanceComboName`\n * detect when two different element identities hash to the same 5-char\n * slice and re-hash with a salt until unique. Shared by reference across\n * every nested context in a single export so collisions are visible\n * across pages/components, not just within one subtree.\n */\n comboIdentityByName: Map<string, string>;\n /** Children passed from a component instance to fill slot markers */\n slotChildren?: (ComponentNode | string)[] | ComponentNode | string;\n /**\n * Caller's identity at the moment a component instance was emitted. When the\n * component body hits a `<slot/>`, slot children are restored to this\n * context so their generated class names hash against the page (or outer\n * component) that supplied them \u2014 not against the slot host. Without this,\n * every page routed through the same wrapper component (e.g. Layout) would\n * collide on identical (fileName, elementPath) pairs in `styleClasses`.\n */\n slotEmitContext?: {\n fileType: 'component' | 'page';\n fileName: string;\n elementPath: number[];\n };\n /**\n * Resolved props of the OUTER component instance whose body authored these\n * slot children. Templates inside slot children (`{{title}}` on a Heading\n * placed inside a `<Stack>` slot of a Hero section) refer to that outer\n * component's interface, not the slot host's. Captured in\n * `emitInlineComponentBody` as `parentProps`, consumed by `emitSlotMarker`\n * when filling the slot.\n */\n slotInstanceProps?: Record<string, unknown>;\n /** CMS service for resolving collection-sourced lists. */\n cmsService?: CMSService;\n /** i18n config so list items / locale-list can resolve translations. */\n i18nConfig?: I18nConfig;\n /** Locale this page is being exported under. */\n locale?: string;\n /** Slug mappings for cross-locale URL generation in locale-lists. */\n slugMappings?: SlugMap[];\n /**\n * Lazily-built reverse slug index, shared by `emitLinkNode` (rewriting\n * internal `/path` hrefs to the current locale's Webflow URL) and\n * `emitLocaleListNode` so we don't rebuild the same Map per link.\n */\n slugIndex?: ReturnType<typeof buildSlugIndex>;\n /** URL path of the page being exported (used by locale-list). */\n pagePath?: string;\n /** Currently-rendered CMS item for CMS template pages. */\n cmsContext?: { cms: CMSItem };\n /** Cumulative template context for nested lists. */\n templateContext?: Record<string, unknown>;\n /** Per-theme map: themeName \u2192 { '--bg': '#fff', \u2026 } from colors.json. */\n themeVars?: Record<string, Record<string, string>>;\n /**\n * Project-wide vars from variables.json (not theme-dependent), keyed by\n * Meno breakpoint name (`base`, `tablet`, `mobile`, \u2026). Each map holds the\n * full `--name \u2192 resolved value` set at that breakpoint, with per-variable\n * `scales` overrides and global category scaling already baked in. The\n * walker substitutes `var(--x)` per-breakpoint so the Webflow class system\n * receives concrete scaled values at every tier.\n */\n projectVars?: Record<string, Record<string, string>>;\n /** Default theme name from colors.json (used when no ancestor theme). */\n defaultTheme?: string;\n /**\n * Responsive auto-scaling config. When `enabled`, raw scalable values\n * (`font-size: 48px`, `padding: 40px`, \u2026) are auto-filled per breakpoint\n * by `mapStylesToWebflow` even when the author didn't write a per-bp\n * override.\n */\n responsiveScales?: ResponsiveScales;\n /**\n * The theme inherited from an ancestor's `theme` attribute. Set by\n * `emitHtmlNode` when a node carries `theme=\"\u2026\"`, then forwarded to its\n * descendants so `var(--bg)` resolves to the right palette per element.\n */\n currentTheme?: string;\n /**\n * elementClass \u2192 its `interactiveStyles`, collected during the walk so\n * `buildWebflowPayload` can render them into raw CSS afterwards via\n * `generateInteractiveCSS`. Pseudo-only rules with empty prefix and\n * non-responsive style continue to flow through `primaryClass.pseudoStates`\n * (Webflow's class-system path); everything else is filtered to the\n * manual-paste `<style>` block.\n */\n interactiveStylesMap?: Map<string, InteractiveStyles>;\n /**\n * Meno components promoted to Webflow Components (`Navigation`, `Footer`).\n * The first encounter of each name registers a definition here; subsequent\n * encounters emit a `componentRef` element instead of inlining markup.\n * `undefined` inside a component body disables further promotion (so a\n * Navigation that nests another promoted name doesn't recurse).\n */\n promotedComponents?: Map<string, WebflowComponentDef> | null;\n /**\n * Component names eligible for promotion. When omitted, the built-in\n * `PROMOTED_TO_WEBFLOW_COMPONENT` defaults (`Navigation`, `Footer`) apply.\n * Configurable from the Webflow extension UI so users can promote their own\n * shared components (e.g. `Sidebar`) without forking core.\n */\n promotedComponentNames?: Set<string>;\n /**\n * Opt-in: emit `<list sourceType=\"collection\">` as a single bound\n * Collection List shell (`tag: COLLECTION_LIST_TAG`) carrying field-binding\n * markers, instead of the default static N-times expansion. The extension\n * inserts a Webflow `DynamoWrapper` and tags children with\n * `data-meno-bind-*` attributes so the user can finish binding in the\n * Designer UI (no programmatic binding API exists yet \u2014 Apr 2026).\n */\n bindCollectionLists?: boolean;\n /**\n * Default values from the enclosing component's `interface` (`{ size: '1',\n * variant: 'default', \u2026 }`). Used by `mapStylesToWebflow` to bake\n * default-prop StyleMapping values into the primary class's base, so the\n * primary represents the default-prop visual and combos carry only the\n * deltas for non-default values. Set in `emitInlineComponentBody` when\n * entering a component body; absent for page-level walks.\n */\n componentDefaults?: Record<string, unknown>;\n /**\n * Most recent ancestor's resolved CSS `color` value, threaded down so that\n * `<embed>` SVG markup can substitute `currentColor` with a concrete color\n * before being uploaded as an `image/svg+xml` asset. SVG assets render\n * standalone in Webflow \u2014 `currentColor` no longer inherits from the\n * surrounding DOM, so it would otherwise paint as black.\n */\n inheritedColor?: string;\n}\n\n/**\n * Meno component names that should become Webflow Components instead of\n * inline markup. Exact, case-sensitive match \u2014 e.g. `NavLink` and\n * `NavDropdown` continue to inline today.\n */\nexport const PROMOTED_TO_WEBFLOW_COMPONENT = new Set(['Navigation', 'Footer']);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildElementClass(ctx: WebflowEmitContext, label: string | undefined): string {\n const generated = generateElementClassName({\n fileType: ctx.fileType,\n fileName: ctx.fileName,\n label,\n path: ctx.elementPath,\n });\n // Drop the `c_` component prefix for the Webflow output \u2014 the file name is\n // already in the class. Pages keep `p_` so page-scoped classes can't collide\n // with component class names that happen to share the same file name.\n if (ctx.fileType !== 'component') return generated;\n const stripped = generated.replace(/^c_/, '');\n // Collapse `heading_heading` \u2192 `heading` when component and element names\n // match \u2014 the duplication carries no extra info.\n return stripped.replace(/^([a-z0-9-]+)_\\1$/, '$1');\n}\n\n/**\n * Suffix used to keep two placements of the same element under different\n * ancestor `theme=\"\u2026\"` values from collapsing onto one entry in\n * `ctx.styleClasses`. Theme `var(--\u2026)` refs are baked to concrete colors at\n * export time, so a `button` rendered under `theme=\"light\"` and one under\n * `theme=\"dark\"` produce different resolved CSS \u2014 but absent this suffix they\n * share the class name `button`, and the last write wins (silently\n * mis-rendering the earlier instance). Returns `''` for the project's default\n * theme (or no theme), so default-theme exports stay byte-identical.\n *\n * Callers append this AFTER any other suffixes they compose (sub-classes like\n * `\u2026-item`, identity hashes, etc.) so the theme suffix consistently lives at\n * the tail of the name. Sanitization mirrors `sanitizeClassName` in styleMapper\n * so unusual theme names from `colors.json` produce valid CSS segments.\n */\nfunction themedClassSuffix(ctx: WebflowEmitContext): string {\n const t = ctx.currentTheme;\n if (!t) return '';\n if (ctx.defaultTheme && t === ctx.defaultTheme) return '';\n const safe = t.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n if (!safe) return '';\n return `-theme-${safe}`;\n}\n\n/** Append `themedClassSuffix(ctx)` to a class name, or return it unchanged. */\nfunction withThemeSuffix(name: string, ctx: WebflowEmitContext): string {\n return name + themedClassSuffix(ctx);\n}\n\n/**\n * Mint a per-instance combo class name of the form `is-<5char>`. The hash is\n * derived from the placement's full element identity (page + path or label),\n * so two placements at different positions get different combos and the same\n * placement re-derives the same combo across re-imports.\n *\n * Webflow stores classes in a single project-wide stylesheet, so the 5-char\n * base36 space (~60M) is birthday-vulnerable across large exports. When the\n * computed name is already claimed by a *different* identity, we re-hash with\n * an attempt suffix until the slot is free or matches our identity.\n */\nfunction mintInstanceComboName(ctx: WebflowEmitContext, identity: string): string {\n let attempt = 0;\n let name = `is-${shortHash(identity)}`;\n while (true) {\n const claimedBy = ctx.comboIdentityByName.get(name);\n if (!claimedBy || claimedBy === identity) {\n ctx.comboIdentityByName.set(name, identity);\n return name;\n }\n attempt++;\n name = `is-${shortHash(`${identity}#${attempt}`)}`;\n }\n}\n\n/**\n * Pull `{ propName: defaultValue }` from a component's `interface` definition.\n * Returns undefined when the interface is absent or contributes no defaults,\n * so callers can leave `componentDefaults` off the context (page-level walks\n * skip default-baking entirely).\n */\nfunction extractInterfaceDefaults(\n iface: Record<string, { default?: unknown }> | undefined\n): Record<string, unknown> | undefined {\n if (!iface) return undefined;\n const out: Record<string, unknown> = {};\n let any = false;\n for (const [key, def] of Object.entries(iface)) {\n if (def && 'default' in def) {\n out[key] = def.default;\n any = true;\n }\n }\n return any ? out : undefined;\n}\n\n/**\n * Layered template-resolution context. Mirrors the namespaces meno-core's\n * `templateEngine.buildEvalContext` walks: instance props win over slot props,\n * which win over component defaults, with CMS / list iteration data underneath.\n * Page-level walks (no enclosing component) still get a usable context \u2014 we\n * just won't have `instanceProps` to layer on top.\n */\nfunction buildTemplateProps(\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Record<string, unknown> {\n return {\n ...(ctx.templateContext ?? {}),\n ...(ctx.cmsContext ?? {}),\n ...(ctx.componentDefaults ?? {}),\n ...(ctx.slotInstanceProps ?? {}),\n ...(instanceProps ?? {}),\n };\n}\n\n/**\n * Resolve `{{...}}` templates in a string using the same engine as meno-core's\n * runtime. Returns `text` unchanged when it carries no templates so we don't\n * thrash `flattenInlineHtmlToText` over rich-text strings without placeholders.\n * `RAW_HTML_PREFIX`-marked rich-text values get flattened to visible text after\n * substitution so the sentinel + inline HTML can't leak into a tag/attribute.\n */\nfunction resolveStringTemplate(\n text: string,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): string {\n if (!hasCodeTemplates(text)) return text;\n const out = processCodeTemplates(text, buildTemplateProps(ctx, instanceProps));\n return out.startsWith(RAW_HTML_PREFIX)\n ? flattenInlineHtmlToText(out.slice(RAW_HTML_PREFIX.length))\n : out;\n}\n\nconst HEADING_TAGS = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);\n// Tags whose Webflow preset is a clickable wrapper (`LinkBlock`) \u2014 they\n// inherit the browser-default `<a>` underline unless we override it.\nconst LINK_LIKE_TAGS = new Set(['button']);\n// Tags whose Webflow preset ships with a default `margin-bottom: 10px`.\nconst LIST_TAGS = new Set(['ul', 'ol']);\n\n/**\n * Zero out a heading's vertical margins when the source styles don't set them.\n * Webflow (and browser UA stylesheets) ship h1\u2013h6 with non-trivial\n * margin-top/bottom; designs in Meno almost never account for that. Shorthand\n * `margin` is expanded into the four sides upstream (see `styleMapper.ts`),\n * so by the time we get here every author-set margin is already a longhand.\n */\nfunction applyHeadingMarginDefaults(cls: WebflowStyleClass): void {\n const base = cls.base;\n if (!('margin-top' in base)) base['margin-top'] = '0px';\n if (!('margin-bottom' in base)) base['margin-bottom'] = '0px';\n}\n\n/**\n * Zero out a paragraph's bottom margin when the source styles don't set it.\n * Webflow's `<p>` preset ships with a default `margin-bottom`; designs in Meno\n * almost never account for that. Only `margin-bottom` is touched \u2014 paragraphs\n * commonly want their natural top spacing.\n */\nfunction applyParagraphMarginDefaults(cls: WebflowStyleClass): void {\n const base = cls.base;\n if (!('margin-bottom' in base)) base['margin-bottom'] = '0px';\n}\n\n/**\n * Zero out a list's bottom margin when the source styles don't set it.\n * Webflow's `<ul>`/`<ol>` preset ships with `margin-bottom: 10px`; designs in\n * Meno almost never account for that.\n */\nfunction applyListMarginDefaults(cls: WebflowStyleClass): void {\n const base = cls.base;\n if (!('margin-bottom' in base)) base['margin-bottom'] = '0px';\n}\n\n/**\n * For `display: grid` (or `inline-grid`) elements, default\n * `grid-template-rows` to `1fr` (a single row) when the source styles don't\n * specify rows. Webflow's grid preset ships with two rows; designs in Meno\n * almost never want that. The `grid` / `grid-template` shorthands opt out.\n */\nfunction applyGridRowsDefault(cls: WebflowStyleClass): void {\n const base = cls.base;\n const display = base['display'];\n if (display !== 'grid' && display !== 'inline-grid') return;\n if ('grid' in base) return;\n if ('grid-template' in base) return;\n if ('grid-template-rows' in base) return;\n base['grid-template-rows'] = '1fr';\n}\n\n/**\n * Default `<a>` to `text-decoration: none`. Browser UA stylesheets underline\n * links; source designs almost never opt out explicitly. If the author set\n * `text-decoration` (or `text-decoration-line`) themselves, leave it.\n */\nfunction applyLinkTextDecorationDefault(cls: WebflowStyleClass): void {\n const base = cls.base;\n if ('text-decoration' in base || 'text-decoration-line' in base) return;\n base['text-decoration'] = 'none';\n}\n\n/**\n * Fold two combo classes into one. Webflow's class system permits at most a\n * single combo on top of the primary, so when an `acceptsStyles` instance\n * override would stack a second combo on a body root that already carries a\n * StyleMapping-driven combo, we merge into a fresh class instead. `outer`'s\n * properties win on key conflicts at every scope (base, breakpoints,\n * pseudo-states), mirroring runtime SSR's outer-overrides-inner order.\n *\n * The merged name concatenates both combo names so it stays deterministic\n * across re-imports and is unique to this exact body root (the outer combo\n * name is keyed by the instance's outer location).\n */\nfunction mergeComboClasses(\n inner: WebflowStyleClass,\n outer: WebflowStyleClass,\n parentName: string,\n): WebflowStyleClass {\n const innerSuffix = inner.name.startsWith('is-') ? inner.name.slice(3) : inner.name;\n const merged: WebflowStyleClass = {\n name: `${outer.name}_${innerSuffix}`,\n base: { ...inner.base, ...outer.base },\n comboParent: parentName,\n };\n\n if (inner.breakpoints || outer.breakpoints) {\n const bps: NonNullable<WebflowStyleClass['breakpoints']> = {};\n const tiers = new Set<keyof typeof bps>([\n ...(Object.keys(inner.breakpoints || {}) as Array<keyof typeof bps>),\n ...(Object.keys(outer.breakpoints || {}) as Array<keyof typeof bps>),\n ]);\n for (const tier of tiers) {\n bps[tier] = { ...(inner.breakpoints?.[tier] || {}), ...(outer.breakpoints?.[tier] || {}) };\n }\n merged.breakpoints = bps;\n }\n\n if (inner.pseudoStates || outer.pseudoStates) {\n const ps: NonNullable<WebflowStyleClass['pseudoStates']> = {};\n const states = new Set<keyof typeof ps>([\n ...(Object.keys(inner.pseudoStates || {}) as Array<keyof typeof ps>),\n ...(Object.keys(outer.pseudoStates || {}) as Array<keyof typeof ps>),\n ]);\n for (const state of states) {\n ps[state] = { ...(inner.pseudoStates?.[state] || {}), ...(outer.pseudoStates?.[state] || {}) };\n }\n merged.pseudoStates = ps;\n }\n\n return merged;\n}\n\nconst IMAGE_EXT_MIME: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.svg': 'image/svg+xml',\n '.bmp': 'image/bmp',\n '.ico': 'image/x-icon',\n};\n\nfunction isAbsoluteUrl(s: string): boolean {\n return /^[a-z][a-z0-9+.-]*:\\/\\//i.test(s) || s.startsWith('data:');\n}\n\n/**\n * If `src` points at a file inside the project (project-relative path like\n * `/images/foo.webp`), read it from disk and stash the bytes onto `element`\n * for the Webflow extension to upload. Absolute http(s)/data URLs are left\n * alone \u2014 the extension fetches those itself.\n */\nasync function maybeInlineLocalImage(element: WebflowElement, src: string): Promise<void> {\n if (!src || isAbsoluteUrl(src)) return;\n const projectRoot = getProjectRoot();\n // Strip leading slash so `join` doesn't escape the project root, and\n // verify the resolved path stays inside it (path-traversal guard).\n const rel = src.replace(/^\\/+/, '');\n const abs = join(projectRoot, rel);\n if (!abs.startsWith(projectRoot)) return;\n try {\n const buf = await readFile(abs);\n const ext = extname(abs).toLowerCase();\n const mime = IMAGE_EXT_MIME[ext] || 'application/octet-stream';\n element.imageDataBase64 = buf.toString('base64');\n element.imageDataMime = mime;\n element.imageDataFileName = basename(abs);\n } catch {\n // File missing / unreadable \u2014 leave `attributes.src` alone. The extension\n // will then drop the image with a warning, same observable behavior as\n // before this change.\n }\n}\n\n/**\n * Strip a small subset of inline HTML \u2014 `<span>`, `<em>`, `<strong>`, `<br>`,\n * etc. \u2014 and return the concatenated visible text. Used for heading /\n * paragraph content that ships with the `<!--MENO_RAW_HTML-->` sentinel.\n *\n * We previously emitted structured children to preserve inline emphasis\n * (`<span class=\"custom-span\">need</span>`), but Webflow's Designer API for\n * Heading / Paragraph elements does not reliably accept mixed string +\n * element children, and `parent.append(string)` interprets the string as a\n * tag name (so \"need\" became `<need></need>`). For now we drop inline\n * styling and keep visible text \u2014 the user explicitly accepts this\n * trade-off and we'll revisit once we have a working inline-rich-text path.\n *\n * `<br>` collapses to `\\n`; HTML entities (`&amp;`/`&lt;`/`&gt;`/`&quot;`)\n * are decoded; comments are stripped.\n */\nfunction flattenInlineHtmlToText(raw: string): string {\n const decode = (s: string) => s\n .replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"').replace(/&#39;/g, \"'\").replace(/&nbsp;/g, ' ');\n\n let out = '';\n const tagRe = /<!--[\\s\\S]*?-->|<\\/?([a-zA-Z][a-zA-Z0-9]*)[^>]*>/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = tagRe.exec(raw)) !== null) {\n if (match.index > lastIndex) {\n out += decode(raw.slice(lastIndex, match.index));\n }\n lastIndex = match.index + match[0].length;\n if (match[0].startsWith('<!--')) continue;\n if ((match[1] || '').toLowerCase() === 'br') out += '\\n';\n }\n if (lastIndex < raw.length) out += decode(raw.slice(lastIndex));\n return out;\n}\n\n/**\n * Substitute `var(--name[, fallback])` in a CSS value with literals from the\n * walker context, resolving project vars at the requested breakpoint. Theme\n * vars are resolved per the active theme (the nearest ancestor's `theme`\n * attribute, or the project default) and don't vary by breakpoint. Anything\n * we can't resolve is left intact.\n *\n * Webflow style classes don't share Meno's `:root` declarations and we don't\n * inject a `<style>` block, so each element has to receive concrete values\n * in its style class \u2014 and with theme awareness, identical `var(--bg)`\n * references in different theme contexts produce different colours. The\n * breakpoint parameter lets us materialize the same `var(--h1-fs)` reference\n * to its scaled value at every Meno breakpoint.\n */\nfunction resolveVarsInValue(\n value: string,\n ctx: WebflowEmitContext,\n breakpoint: string = 'base'\n): string {\n if (!value || (!ctx.themeVars && !ctx.projectVars)) return value;\n // If `currentTheme` names a theme that doesn't exist in this project's\n // colors.json, fall back to the project default \u2014 that mirrors runtime\n // behaviour, where `[theme=\"primary\"]` without a matching selector inherits\n // `:root`'s default-theme vars. Without the fallback, `var(--text)` etc.\n // would survive the substitution pass and ship as literal `var(--\u2026)` to\n // Webflow.\n const themeMap = ctx.themeVars\n ? (\n (ctx.currentTheme && ctx.themeVars[ctx.currentTheme])\n ?? (ctx.defaultTheme ? ctx.themeVars[ctx.defaultTheme] : undefined)\n )\n : undefined;\n const projectMap = ctx.projectVars\n ? (ctx.projectVars[breakpoint] || ctx.projectVars.base)\n : undefined;\n const pattern = /var\\(\\s*(--[\\w-]+)\\s*(?:,\\s*([^)]+))?\\)/g;\n\n let current = value;\n for (let pass = 0; pass < 3; pass++) {\n let changed = false;\n current = current.replace(pattern, (match, name: string, fallback: string | undefined) => {\n const resolved = (themeMap && themeMap[name]) ?? (projectMap && projectMap[name]);\n if (resolved !== undefined) {\n changed = true;\n return resolved;\n }\n if (fallback !== undefined) {\n changed = true;\n return fallback.trim();\n }\n return match;\n });\n if (!changed) break;\n }\n return current;\n}\n\nfunction substituteVarsInStyleObject(\n style: StyleObject,\n ctx: WebflowEmitContext,\n breakpoint: string = 'base'\n): StyleObject {\n const out: StyleObject = {};\n for (const [k, v] of Object.entries(style)) {\n out[k] = typeof v === 'string' ? resolveVarsInValue(v, ctx, breakpoint) : v;\n }\n return out;\n}\n\n/**\n * Names of project breakpoints whose `var(--x)` resolutions might differ\n * from base \u2014 i.e., every breakpoint in the project config. Returns an empty\n * list when no projectVars map is present (e.g., test contexts).\n */\nfunction projectBreakpointNames(ctx: WebflowEmitContext): string[] {\n return Object.keys(ctx.breakpoints);\n}\n\n/**\n * For each base property containing a `var(--x)` reference, expand to a\n * per-breakpoint entry on the responsive style if its resolved value differs\n * from base. Author-provided per-breakpoint overrides win. Mirrors what\n * Meno's runtime does via `:root { --x }` + `@media { :root { --x } }`,\n * except materialized into class-level breakpoint entries since Webflow's\n * class system reads concrete values per tier.\n */\nfunction expandResponsiveVarsInto(\n baseStyle: StyleObject,\n responsive: ResponsiveStyleObject,\n ctx: WebflowEmitContext\n): void {\n if (!ctx.projectVars) return;\n const bps = projectBreakpointNames(ctx);\n if (bps.length === 0) return;\n\n for (const [prop, rawVal] of Object.entries(baseStyle)) {\n if (typeof rawVal !== 'string' || !rawVal.includes('var(--')) continue;\n const baseResolved = resolveVarsInValue(rawVal, ctx, 'base');\n\n for (const bp of bps) {\n const bpResolved = resolveVarsInValue(rawVal, ctx, bp);\n if (bpResolved === baseResolved) continue;\n const bucket = (responsive[bp] as StyleObject | undefined) || {};\n // Author override wins.\n if (bucket[prop] !== undefined) continue;\n bucket[prop] = bpResolved;\n responsive[bp] = bucket;\n }\n }\n}\n\n/**\n * Apply theme/project `var(--x)` substitution across a flat or responsive\n * style object. Skipped for StyleMappings \u2014 those are passed through and\n * resolved later when the styleMapper turns them into combo classes (each\n * combo's value gets its own substitution then).\n *\n * For each authored breakpoint, vars are resolved using that breakpoint's\n * project var map. Then the base properties are scanned for `var(--x)` refs\n * whose resolved value differs at any project breakpoint \u2014 those get\n * synthesized into the responsive style so `mapStylesToWebflow` can route\n * them into Webflow's per-breakpoint buckets.\n */\nfunction substituteVarsInStyle(\n style: StyleObject | ResponsiveStyleObject | undefined,\n ctx: WebflowEmitContext\n): StyleObject | ResponsiveStyleObject | undefined {\n if (!style) return style;\n if (isResponsiveStyleObject(style)) {\n const out: ResponsiveStyleObject = {};\n for (const [bp, obj] of Object.entries(style)) {\n if (!obj || typeof obj !== 'object') continue;\n out[bp] = substituteVarsInStyleObject(obj as StyleObject, ctx, bp);\n }\n const baseObj = (style as ResponsiveStyleObject).base;\n if (baseObj) expandResponsiveVarsInto(baseObj as StyleObject, out, ctx);\n return out;\n }\n // Flat style: substitute base, then expand per-breakpoint values into a\n // responsive wrapper so var-driven scaling reaches the breakpoint buckets.\n const flatStyle = style as StyleObject;\n const baseSubstituted = substituteVarsInStyleObject(flatStyle, ctx, 'base');\n const responsive: ResponsiveStyleObject = { base: baseSubstituted };\n expandResponsiveVarsInto(flatStyle, responsive, ctx);\n // If no per-breakpoint expansion happened, return the flat shape to keep\n // downstream behavior identical for projects without project vars.\n if (Object.keys(responsive).length === 1) return baseSubstituted;\n return responsive;\n}\n\nfunction substituteVarsInInteractive(\n rules: InteractiveStyles | undefined,\n ctx: WebflowEmitContext\n): InteractiveStyles | undefined {\n if (!rules) return rules;\n return rules.map((rule): InteractiveStyleRule => ({\n ...rule,\n style: (substituteVarsInStyle(rule.style as StyleObject | ResponsiveStyleObject, ctx) ?? rule.style) as StyleValue,\n }));\n}\n\n/**\n * In-place pass over a finished WebflowStyleClass to inline `var(--x)` refs\n * that survived an upstream substitution. Combo classes built from\n * StyleMappings carry their values as plain strings \u2014 we couldn't substitute\n * before `mapStylesToWebflow` ran (the mapping shape is opaque to our\n * resolver), so we sweep them here. Also expands any base property that\n * still contains a `var(--x)` ref into per-breakpoint entries so combo\n * classes inherit the same variable-driven responsive scaling as the\n * primary class.\n */\nfunction substituteVarsInStyleClass(cls: WebflowStyleClass, ctx: WebflowEmitContext): void {\n // Capture which base props still hold a var() ref BEFORE substitution so\n // we can expand them per-breakpoint after.\n const varBaseProps: Array<{ prop: string; raw: string }> = [];\n for (const [k, v] of Object.entries(cls.base)) {\n if (typeof v === 'string' && v.includes('var(--')) {\n varBaseProps.push({ prop: k, raw: v });\n }\n }\n\n for (const k of Object.keys(cls.base)) {\n cls.base[k] = resolveVarsInValue(cls.base[k], ctx, 'base');\n }\n if (cls.breakpoints) {\n for (const [tier, bp] of Object.entries(cls.breakpoints)) {\n if (!bp) continue;\n for (const k of Object.keys(bp)) {\n bp[k] = resolveVarsInValue(bp[k], ctx, tier);\n }\n }\n }\n if (cls.pseudoStates) {\n for (const ps of Object.values(cls.pseudoStates)) {\n if (!ps) continue;\n for (const k of Object.keys(ps)) ps[k] = resolveVarsInValue(ps[k], ctx, 'base');\n }\n }\n\n // Per-breakpoint expansion for combo classes whose base values were vars.\n if (varBaseProps.length === 0 || !ctx.projectVars) return;\n for (const bpName of Object.keys(ctx.breakpoints)) {\n const tier = menoBreakpointToWebflowTier(bpName, ctx.breakpoints);\n for (const { prop, raw } of varBaseProps) {\n const baseResolved = cls.base[prop];\n const bpResolved = resolveVarsInValue(raw, ctx, bpName);\n if (bpResolved === baseResolved) continue;\n if (!cls.breakpoints) cls.breakpoints = {};\n const bucket = cls.breakpoints[tier as keyof typeof cls.breakpoints] || {};\n if (bucket[prop] !== undefined) continue;\n bucket[prop] = bpResolved;\n (cls.breakpoints as Record<string, Record<string, string>>)[tier] = bucket;\n }\n }\n}\n\n/**\n * Local copy of the Meno\u2192Webflow breakpoint mapping used by styleMapper.\n * Kept private so we don't widen styleMapper's public surface just for the\n * combo-class expansion above.\n */\nfunction menoBreakpointToWebflowTier(\n bpName: string,\n breakpoints: BreakpointConfig\n): string {\n if (bpName === 'tablet') return 'medium';\n if (bpName === 'mobile') return 'small';\n const entry = breakpoints[bpName];\n const w = entry && typeof entry.breakpoint === 'number' ? entry.breakpoint : 992;\n if (w < 480) return 'tiny';\n if (w < 768) return 'small';\n if (w < 992) return 'medium';\n if (w < 1280) return 'main';\n if (w < 1440) return 'large';\n if (w < 1920) return 'xl';\n return 'xxl';\n}\n\n/**\n * A responsive style object nests StyleObjects under breakpoint keys (base/tablet/mobile/...).\n * A flat style object has CSS property values directly (strings, numbers, or StyleMappings).\n */\nfunction isResponsiveStyleObject(style: StyleObject | ResponsiveStyleObject): style is ResponsiveStyleObject {\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n/**\n * Pull the base-breakpoint `color` value from a flat or responsive style.\n * Returns undefined if absent. Values like `currentColor` / `inherit` are\n * returned as-is so callers can decide to skip them.\n *\n * StyleMapping colors (e.g. `Button.variant \u2192 primary|secondary`) are\n * resolved using the active instance prop, falling back to the enclosing\n * component's default. Without this, variant-mapped buttons fail to thread\n * a color into nested SVG `<embed>` children \u2014 those ship with\n * `currentColor` intact and Webflow paints the standalone SVG asset black.\n * Resolved mapping values may still hold `var(--\u2026)`; we run them through\n * `resolveVarsInValue` so the SVG asset bakes a concrete color.\n */\nfunction extractBaseColor(\n style: StyleObject | ResponsiveStyleObject | undefined,\n ctx?: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): string | undefined {\n if (!style) return undefined;\n const flat: StyleObject | undefined = isResponsiveStyleObject(style)\n ? ((style as ResponsiveStyleObject).base as StyleObject | undefined)\n : (style as StyleObject);\n const c = flat?.color;\n if (typeof c === 'string') return c;\n if (c && typeof c === 'object' && (c as StyleMapping)._mapping === true) {\n const mapping = c as StyleMapping;\n const propValue = instanceProps?.[mapping.prop] ?? ctx?.componentDefaults?.[mapping.prop];\n if (propValue == null) return undefined;\n const key = String(propValue);\n const raw = mapping.values[key];\n if (typeof raw !== 'string' || raw === '') return undefined;\n return ctx ? resolveVarsInValue(raw, ctx) : raw;\n }\n return undefined;\n}\n\n/**\n * Returns a concrete color (something we can substitute into SVG markup) or\n * undefined for keywords that don't carry one (`currentColor`, `inherit`,\n * unset). Caller should fall back to ancestor color when undefined.\n */\nfunction concreteColor(c: string | undefined): string | undefined {\n if (!c) return undefined;\n const lower = c.trim().toLowerCase();\n if (lower === 'currentcolor' || lower === 'inherit' || lower === 'unset' || lower === 'initial') {\n return undefined;\n }\n return c;\n}\n\n/**\n * Replace `currentColor` references in inline SVG markup with the given color.\n * Webflow uploads `<embed>` SVGs as standalone `image/svg+xml` assets, so the\n * normal `currentColor` \u2192 ancestor `color` inheritance is broken \u2014 we resolve\n * it here at export time. Match is case-insensitive.\n */\nfunction inlineCurrentColorInSvg(svg: string, color: string): string {\n return svg.replace(/currentColor/gi, color);\n}\n\n/**\n * Resolve `{{prop}}` templates in a flat style object's values using component instance\n * props. StyleMapping objects (`{_mapping: true, ...}`) are preserved so that\n * styleMapper can still emit them as Webflow combo classes. Values without\n * templates pass through unchanged.\n */\nfunction resolveTemplatesInStyleObject(\n style: StyleObject,\n props: Record<string, unknown>\n): StyleObject {\n const result: StyleObject = {};\n for (const [key, value] of Object.entries(style)) {\n if (typeof value === 'string' && hasCodeTemplates(value)) {\n result[key] = processCodeTemplates(value, props);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Resolve templates inside a flat or responsive style object. Uses meno-core's\n * template engine so Webflow receives concrete values (e.g. `1280px`) instead of\n * `{{maxWidth}}` placeholders.\n */\nfunction resolveStyleTemplates(\n style: StyleObject | ResponsiveStyleObject | undefined,\n props: Record<string, unknown> | undefined\n): StyleObject | ResponsiveStyleObject | undefined {\n if (!style || !props) return style;\n if (isResponsiveStyleObject(style)) {\n const result: ResponsiveStyleObject = {};\n for (const [bp, styleObj] of Object.entries(style)) {\n if (styleObj && typeof styleObj === 'object') {\n result[bp] = resolveTemplatesInStyleObject(styleObj as StyleObject, props);\n }\n }\n return result;\n }\n return resolveTemplatesInStyleObject(style as StyleObject, props);\n}\n\n/**\n * Match a style value that is a single bare `{{prop}}` template \u2014 optionally\n * wrapped by literal text (`\"calc({{maxWidth}} + 1rem)\"`). The captured prop\n * name must be a plain identifier (no dotted paths like `{{user.name}}`, no\n * expressions). Returns the prop name, or null when the value isn't a\n * single-prop template we can convert.\n */\nconst SINGLE_TEMPLATE_RE = /^([^{]*)\\{\\{\\s*([A-Za-z_$][\\w$]*)\\s*\\}\\}([^{]*)$/;\nfunction extractSingleTemplateProp(value: string): { prop: string; prefix: string; suffix: string } | null {\n const m = SINGLE_TEMPLATE_RE.exec(value);\n if (!m) return null;\n return { prefix: m[1] ?? '', prop: m[2]!, suffix: m[3] ?? '' };\n}\n\n/**\n * Convert single-prop string templates (`\"{{maxWidth}}\"`,\n * `\"calc({{maxWidth}} + 1rem)\"`) inside a style object into synthetic\n * `StyleMapping` entries so the downstream Webflow combo emitter treats them\n * the same as authored mappings: bake the default-prop resolution into the\n * primary class and emit a combo for non-default instance values.\n *\n * The synthetic mapping carries the values for *both* the component default\n * and the current instance \u2014 `mapStylesToWebflow` looks the right one up via\n * `componentDefaults` / `instanceProps`. Multi-template strings, dotted paths,\n * and props without an interface default fall through unchanged so today's\n * resolve-and-bake behavior still applies.\n */\nfunction templatesToSyntheticMappings(\n style: StyleObject,\n componentDefaults: Record<string, unknown>,\n instanceProps: Record<string, unknown>\n): StyleObject {\n const out: StyleObject = {};\n for (const [key, value] of Object.entries(style)) {\n if (typeof value !== 'string' || !hasCodeTemplates(value)) {\n out[key] = value;\n continue;\n }\n const parsed = extractSingleTemplateProp(value);\n if (!parsed) {\n out[key] = value;\n continue;\n }\n const { prop } = parsed;\n const defaultPropValue = componentDefaults[prop];\n if (defaultPropValue == null) {\n out[key] = value;\n continue;\n }\n const instancePropValue = instanceProps[prop] ?? defaultPropValue;\n // Resolve the full template string (literals + placeholder) once with the\n // default prop value substituted and once with the instance value. The\n // resulting strings are full CSS values \u2014 `mappingValueToCSS` downstream\n // consumes them verbatim.\n const defaultResolved = processCodeTemplates(value, { ...instanceProps, [prop]: defaultPropValue });\n const instanceResolved = processCodeTemplates(value, { ...instanceProps, [prop]: instancePropValue });\n out[key] = {\n _mapping: true,\n prop,\n values: {\n [String(defaultPropValue)]: defaultResolved,\n [String(instancePropValue)]: instanceResolved,\n },\n } as StyleMapping;\n }\n return out;\n}\n\n/**\n * Apply `templatesToSyntheticMappings` across a flat or responsive style.\n * Returns a new style object; original is left untouched. Skipped entirely\n * when no `componentDefaults` / `instanceProps` are available.\n */\nfunction convertStyleTemplatesToMappings(\n style: StyleObject | ResponsiveStyleObject | undefined,\n componentDefaults: Record<string, unknown> | undefined,\n instanceProps: Record<string, unknown> | undefined\n): StyleObject | ResponsiveStyleObject | undefined {\n if (!style || !componentDefaults || !instanceProps) return style;\n if (isResponsiveStyleObject(style)) {\n const result: ResponsiveStyleObject = {};\n for (const [bp, styleObj] of Object.entries(style)) {\n if (styleObj && typeof styleObj === 'object') {\n result[bp] = templatesToSyntheticMappings(styleObj as StyleObject, componentDefaults, instanceProps);\n }\n }\n return result;\n }\n return templatesToSyntheticMappings(style as StyleObject, componentDefaults, instanceProps);\n}\n\n/**\n * Evaluate a node's `if` condition at export time. Mirrors meno-core's SSR semantics:\n * boolean passes through, BooleanMapping is resolved against instance props,\n * and string templates are evaluated with meno-core's template engine. When no\n * context is available to decide, default to rendering (true) so we don't drop\n * nodes that would otherwise be shown.\n */\nfunction shouldRenderNode(\n node: ComponentNode,\n instanceProps?: Record<string, unknown>\n): boolean {\n if (!hasIf(node)) return true;\n const ifValue = node.if;\n\n if (typeof ifValue === 'boolean') return ifValue;\n\n if (isBooleanMapping(ifValue)) {\n if (!instanceProps) return true;\n const propValue = instanceProps[ifValue.prop];\n const mapped = ifValue.values[String(propValue)];\n return mapped !== undefined ? Boolean(mapped) : true;\n }\n\n if (typeof ifValue === 'string') {\n if (!instanceProps) return true;\n const resolved = processCodeTemplates(ifValue, instanceProps);\n return (\n Boolean(resolved) &&\n resolved !== 'false' &&\n resolved !== '0' &&\n resolved !== ''\n );\n }\n\n return true;\n}\n\n/**\n * Resolve templates in the inner `style` of each interactive-style rule.\n */\nfunction resolveInteractiveStyleTemplates(\n rules: InteractiveStyles | undefined,\n props: Record<string, unknown> | undefined\n): InteractiveStyles | undefined {\n if (!rules || !props) return rules;\n return rules.map((rule): InteractiveStyleRule => ({\n ...rule,\n style: (resolveStyleTemplates(rule.style as StyleObject | ResponsiveStyleObject, props) ?? rule.style) as StyleValue,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Main recursive converter\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a ComponentNode tree to Webflow element tree.\n * Also collects WebflowStyleClass definitions as a side effect in ctx.styleClasses.\n *\n * Async because list expansion may query the CMS service. Sync paths still\n * resolve in a single tick \u2014 only collection-sourced lists actually `await`.\n */\nexport async function nodeToWebflow(\n node: ComponentNode | ComponentNode[] | string | number | null | undefined,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement[]> {\n if (node === null || node === undefined) return [];\n\n // Text/number\n if (typeof node === 'string') {\n const text = resolveStringTemplate(node, ctx, instanceProps);\n // Empty/whitespace-only strings render as nothing in Meno's SSR, but a\n // bare `<span>` becomes a selectable Text Block in Webflow \u2014 skip them.\n if (text === '' || text.trim() === '') return [];\n return [{ tag: 'span', textContent: text }];\n }\n if (typeof node === 'number') {\n return [{ tag: 'span', textContent: String(node) }];\n }\n\n // Array of nodes\n if (Array.isArray(node)) {\n const results: WebflowElement[] = [];\n for (let i = 0; i < node.length; i++) {\n const child = node[i];\n const savedPath = [...ctx.elementPath];\n ctx.elementPath = [...ctx.elementPath, i];\n results.push(...(await nodeToWebflow(child, ctx, instanceProps)));\n ctx.elementPath = savedPath;\n }\n return results;\n }\n\n // Skip nodes whose `if` evaluates to false \u2014 meno-core's rendering treats\n // `if: false` (or a falsy mapping/template) as \"don't render\".\n if (!shouldRenderNode(node, instanceProps)) return [];\n\n // Dispatch by node type\n switch (node.type) {\n case NODE_TYPE.NODE:\n return [await emitHtmlNode(node as HtmlNode, ctx, instanceProps)];\n case NODE_TYPE.COMPONENT:\n return emitComponentInstance(node as ComponentInstanceNode, ctx, instanceProps);\n case NODE_TYPE.SLOT:\n return emitSlotMarker(node as SlotMarker, ctx, instanceProps);\n case NODE_TYPE.EMBED:\n return [await emitEmbedNode(node as EmbedNode, ctx, instanceProps)];\n case NODE_TYPE.LINK:\n return [await emitLinkNode(node as LinkNode, ctx, instanceProps)];\n case NODE_TYPE.LIST:\n case 'cms-list' as any:\n return emitListNode(node as ListNode, ctx, instanceProps);\n case NODE_TYPE.LOCALE_LIST:\n return emitLocaleListNode(node as LocaleListNode, ctx, instanceProps);\n default:\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Node type emitters\n// ---------------------------------------------------------------------------\n\nasync function emitHtmlNode(\n node: HtmlNode,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement> {\n // Resolve `{{...}}` in the tag against the same layered context meno-core\n // walks at runtime \u2014 page-level / slot-injected nodes don't have\n // `instanceProps`, so the helper falls back to slot props, component\n // defaults, and the active CMS / list iteration context.\n const tag = resolveStringTemplate(node.tag, ctx, instanceProps);\n\n // Build attributes early so we can check for a `theme=\"\u2026\"` override and\n // propagate it to the descendant context BEFORE resolving CSS variables.\n const attributes: Record<string, string | number | boolean> = {};\n if (node.attributes) {\n for (const [key, value] of Object.entries(node.attributes)) {\n attributes[key] = (typeof value === 'string')\n ? resolveStringTemplate(value, ctx, instanceProps)\n : value;\n }\n }\n\n const themedCtx: WebflowEmitContext = typeof attributes.theme === 'string' && attributes.theme\n ? { ...ctx, currentTheme: attributes.theme as string }\n : ctx;\n\n const rawStyle = node.style as StyleObject | ResponsiveStyleObject | undefined;\n const rawInteractiveStyles = node.interactiveStyles as InteractiveStyles | undefined;\n // Convert single-prop string templates (`\"{{maxWidth}}\"`) into synthetic\n // StyleMappings before resolution, so values driven by an interface prop\n // emit per-instance combo classes (`is-maxwidth-640px`) instead of\n // collapsing into a single primary class shared by every instance.\n const styleWithMappings = convertStyleTemplatesToMappings(\n rawStyle,\n ctx.componentDefaults,\n instanceProps,\n );\n const style = substituteVarsInStyle(\n resolveStyleTemplates(styleWithMappings, instanceProps),\n themedCtx\n );\n const interactiveStyles = substituteVarsInInteractive(\n resolveInteractiveStyleTemplates(rawInteractiveStyles, instanceProps),\n themedCtx\n );\n\n // Generate element class and map styles.\n // - Headings always get a class so we can zero out the default heading\n // margins Webflow ships with h1\u2013h6.\n // - `<button>` always gets a class so we can default `text-decoration: none`:\n // we route `<button>` through the `LinkBlock` preset (Webflow's\n // `FormButton` preset is form-only and gets rejected outside `<form>`),\n // which ships with the browser-default `<a>` underline carrier.\n const tagLower = tag.toLowerCase();\n const isHeading = HEADING_TAGS.has(tagLower);\n const isLinkLike = LINK_LIKE_TAGS.has(tagLower);\n const isParagraph = tagLower === 'p';\n const isList = LIST_TAGS.has(tagLower);\n const needsClass = style || (interactiveStyles && interactiveStyles.length > 0) || node.generateElementClass || isHeading || isLinkLike || isParagraph || isList;\n let className: string | undefined;\n let comboClassNames: string[] | undefined;\n\n if (needsClass) {\n const elementClass = withThemeSuffix(buildElementClass(ctx, node.label), themedCtx);\n const { primaryClass, comboClasses } = mapStylesToWebflow(\n elementClass, style, interactiveStyles, ctx.breakpoints, ctx.responsiveScales,\n { instanceProps, componentDefaults: ctx.componentDefaults, themeSuffix: themedClassSuffix(themedCtx) }\n );\n\n substituteVarsInStyleClass(primaryClass, themedCtx);\n if (isHeading) applyHeadingMarginDefaults(primaryClass);\n if (isParagraph) applyParagraphMarginDefaults(primaryClass);\n if (isList) applyListMarginDefaults(primaryClass);\n if (isLinkLike) applyLinkTextDecorationDefault(primaryClass);\n applyGridRowsDefault(primaryClass);\n className = primaryClass.name;\n ctx.styleClasses.set(primaryClass.name, primaryClass);\n\n if (comboClasses.length > 0) {\n comboClassNames = [];\n for (const combo of comboClasses) {\n substituteVarsInStyleClass(combo, themedCtx);\n ctx.styleClasses.set(combo.name, combo);\n comboClassNames.push(combo.name);\n }\n }\n\n // Capture the raw interactiveStyles per element so `buildWebflowPayload`\n // can later run them through `generateInteractiveCSS` for any rules\n // Webflow's class system can't represent (descendant selectors via\n // `prefix`, class-style postfixes, breakpoint-divided pseudos).\n if (\n ctx.interactiveStylesMap\n && Array.isArray(interactiveStyles)\n && interactiveStyles.length > 0\n ) {\n ctx.interactiveStylesMap.set(primaryClass.name, interactiveStyles);\n }\n }\n\n // Build children \u2014 use the themed context so descendants resolve `var()`\n // against the theme this element introduces.\n let children: Array<WebflowElement | string> | undefined;\n let textContent: string | undefined;\n if (!isVoidElement(tag) && node.children) {\n // Optimize: single string child becomes textContent instead of child element\n if (typeof node.children === 'string') {\n textContent = resolveStringTemplate(node.children, ctx, instanceProps);\n } else if (\n Array.isArray(node.children) &&\n node.children.length === 1 &&\n typeof node.children[0] === 'string'\n ) {\n const text = node.children[0] as string;\n textContent = resolveStringTemplate(text, ctx, instanceProps);\n } else {\n const innerCtx = { ...themedCtx, elementPath: [...themedCtx.elementPath] };\n const ownColor = concreteColor(extractBaseColor(style, themedCtx, instanceProps));\n if (ownColor) innerCtx.inheritedColor = ownColor;\n children = await convertChildren(node.children, innerCtx, instanceProps);\n if (children.length === 0) children = undefined;\n }\n }\n\n // Rich-text headings/paragraphs ship with the RAW_HTML_PREFIX sentinel.\n // Strip inline HTML and keep the concatenated visible text \u2014 Webflow's\n // Heading/Paragraph elements don't accept inline span children reliably\n // and `parent.append(string)` produces custom-tag elements, not text.\n // Inline emphasis styling is dropped for now (deliberate trade-off).\n if (textContent && textContent.startsWith(RAW_HTML_PREFIX)) {\n textContent = flattenInlineHtmlToText(textContent.slice(RAW_HTML_PREFIX.length));\n } else if (textContent && (isHeading || isParagraph) && /<[a-zA-Z!]/.test(textContent)) {\n // Rich-text props on static pages don't carry the sentinel \u2014 they're stored\n // as plain HTML by the editor. Headings/paragraphs still can't host inline\n // markup in Webflow, so flatten any tags we find to visible text.\n textContent = flattenInlineHtmlToText(textContent);\n }\n\n const element: WebflowElement = { tag };\n if (className) element.className = className;\n if (comboClassNames) element.comboClasses = comboClassNames;\n if (textContent) element.textContent = textContent;\n if (children) element.children = children;\n if (Object.keys(attributes).length > 0) element.attributes = attributes;\n\n // For project-relative `<img>` srcs the Webflow extension can't `fetch`\n // them (its iframe runs on `designer.webflow.com`). Inline the file bytes\n // here so the extension uploads via `createAsset` instead.\n if (tag.toLowerCase() === 'img' && typeof attributes.src === 'string') {\n await maybeInlineLocalImage(element, attributes.src);\n }\n\n return element;\n}\n\nasync function emitComponentInstance(\n node: ComponentInstanceNode,\n ctx: WebflowEmitContext,\n parentProps?: Record<string, unknown>\n): Promise<WebflowElement[]> {\n const compDef = ctx.globalComponents[node.component];\n if (!compDef) {\n // Unknown component \u2014 emit placeholder\n return [{ tag: 'div', attributes: { 'data-component': node.component } }];\n }\n\n const structured = compDef.component;\n\n // Resolve template placeholders in incoming instance props against the\n // PARENT scope first (e.g. `<Heading size=\"{{level}}\"/>` placed in a Hero\n // body \u2014 `level` belongs to Hero's interface, not Heading's). Then hand off\n // to meno-core's `resolvePropsFromDefinition` so defaults / validation /\n // rich-text wrapping / i18n match what SSR does. Without this parity, a\n // template like `tag: 'h{{size}}'` can read different values here than at\n // runtime \u2014 exactly the bug that produced literal `<h>` for `h{{size}}`\n // when SSR was happily rendering `<h2>`.\n const passedProps: Record<string, unknown> = {};\n if (node.props) {\n const parentTemplateProps = parentProps ?? buildTemplateProps(ctx);\n for (const [key, value] of Object.entries(node.props)) {\n if (key === 'children') continue;\n passedProps[key] = (typeof value === 'string' && hasCodeTemplates(value))\n ? processCodeTemplates(value, parentTemplateProps)\n : value;\n }\n }\n\n const resolvedProps: Record<string, unknown> = structured\n ? resolvePropsFromDefinition(\n structured,\n passedProps,\n node.children as Array<ComponentNode | string> | string | ComponentNode | null | undefined,\n ctx.locale,\n ctx.i18nConfig,\n )\n : { ...passedProps };\n // `resolvePropsFromDefinition` doesn't carry the children prop into its\n // output unless the interface declares it. The Webflow body walk reads\n // children via `slotChildren`, not props, so dropping it here is safe and\n // matches SSR (`ssrRenderer.ts:1217-1220` passes children separately too).\n delete resolvedProps.children;\n\n // Inline-expand the component's node tree\n const body = structured?.structure || (compDef as any).node;\n if (!body) return [];\n\n // Promote `Navigation` / `Footer` to Webflow Components. Render the body\n // ONCE with default props only \u2014 no slot children, no instance prop\n // overrides \u2014 so every page references the same registered Component. The\n // inline expansion is still emitted as `inlineFallback` so the extension\n // can render today's markup when the Designer API can't register\n // Components (older runtime, missing `canCreateComponents` permission).\n //\n // `acceptsStyles` opt-out: when the instance carries its own style /\n // interactiveStyles overrides, a single shared registered Component can't\n // represent them (combos would need a per-instance parent). Skip\n // promotion for that instance and fall through to inline expansion so\n // `emitInlineComponentBody` attaches the per-property combos directly.\n const hasInstanceStyleOverrides =\n Boolean(structured?.acceptsStyles)\n && (\n (node.style && Object.keys(node.style as object).length > 0)\n || (Array.isArray(node.interactiveStyles) && node.interactiveStyles.length > 0)\n );\n const promotedNames = ctx.promotedComponentNames || PROMOTED_TO_WEBFLOW_COMPONENT;\n if (\n promotedNames.has(node.component)\n && ctx.promotedComponents\n && !hasInstanceStyleOverrides\n ) {\n const promoted = ctx.promotedComponents;\n if (!promoted.has(node.component)) {\n const defaultProps: Record<string, unknown> = {};\n if (structured?.interface) {\n for (const [k, p] of Object.entries(structured.interface)) {\n defaultProps[k] = p.default;\n }\n }\n const compBodyCtx: WebflowEmitContext = {\n ...ctx,\n fileType: 'component',\n fileName: node.component,\n elementPath: [0],\n slotChildren: undefined,\n slotEmitContext: undefined,\n // Disable further promotion inside the component body \u2014 a Navigation\n // that nests Footer (or itself) would loop. Nested promoted names\n // inline within the registered Component's body.\n promotedComponents: null,\n componentDefaults: defaultProps,\n };\n const elements = await nodeToWebflow(body, compBodyCtx, defaultProps);\n promoted.set(node.component, { name: node.component, elements });\n }\n // The fallback represents an all-inline world; disable promotion inside\n // it so a self-nested promoted component doesn't recurse forever (each\n // call would emit yet another fallback under the same promoted name).\n const fallback = await emitInlineComponentBody(\n node,\n compDef,\n resolvedProps,\n body,\n { ...ctx, promotedComponents: null },\n parentProps,\n );\n return [{ tag: 'div', componentRef: node.component, inlineFallback: fallback }];\n }\n\n return emitInlineComponentBody(node, compDef, resolvedProps, body, ctx, parentProps);\n}\n\n/**\n * Inline-expand a component instance into Webflow elements. Used for both\n * the regular (non-promoted) path and the `inlineFallback` carried alongside\n * a `componentRef` element so older extensions can render today's markup.\n */\nasync function emitInlineComponentBody(\n node: ComponentInstanceNode,\n compDef: ComponentDefinition,\n resolvedProps: Record<string, unknown>,\n body: ComponentNode,\n ctx: WebflowEmitContext,\n parentProps?: Record<string, unknown>,\n): Promise<WebflowElement[]> {\n const structured = compDef.component;\n\n // Slot forwarding: when `node.children` contains `<slot/>` markers, those\n // markers reference the OUTER (current) component's slot \u2014 substitute them\n // with `ctx.slotChildren` now so this nested component receives the actual\n // slot content. Mirrors SSR's `processStructure`, which substitutes slot\n // markers throughout the parent's structure tree before walking. Without\n // this, a wrapper like `<Section>` whose body places `<Container>{slot}</Container>`\n // forwards the bare `{slot}` marker to Container as its slotChildren \u2014 when\n // Container's body fires its own slot, the marker is the only thing\n // available, has no slot context left, and renders nothing.\n let effectiveChildren = node.children;\n let inheritedSlotEmitContext = ctx.slotEmitContext;\n let inheritedSlotInstanceProps: Record<string, unknown> | undefined = undefined;\n let didForwardSlot = false;\n if (node.children != null && typeof node.children !== 'string') {\n const childArr = Array.isArray(node.children) ? node.children : [node.children];\n if (childArr.some((c) => c && typeof c === 'object' && (c as { type?: string }).type === NODE_TYPE.SLOT)) {\n const out: typeof childArr = [];\n for (const c of childArr) {\n if (c && typeof c === 'object' && (c as { type?: string }).type === NODE_TYPE.SLOT) {\n didForwardSlot = true;\n if (ctx.slotChildren !== undefined) {\n const sc = ctx.slotChildren;\n const subArr = Array.isArray(sc) ? sc : [sc];\n out.push(...subArr);\n } else {\n const def = (c as SlotMarker).default;\n if (def !== undefined) {\n const defArr = Array.isArray(def) ? def : [def];\n out.push(...defArr);\n }\n }\n } else {\n out.push(c);\n }\n }\n if (didForwardSlot) {\n effectiveChildren = out;\n // Forwarded slot children were authored in the OUTER scope \u2014 preserve\n // their original `slotInstanceProps` (so templates resolve against the\n // outer component's props) and `slotEmitContext` (so generated class\n // names hash against the outer authoring identity).\n inheritedSlotInstanceProps = ctx.slotInstanceProps;\n }\n }\n }\n\n const compCtx: WebflowEmitContext = {\n ...ctx,\n fileType: 'component',\n fileName: node.component,\n elementPath: [0],\n slotChildren: effectiveChildren,\n slotEmitContext: didForwardSlot && inheritedSlotEmitContext\n ? inheritedSlotEmitContext\n : {\n fileType: ctx.fileType,\n fileName: ctx.fileName,\n elementPath: [...ctx.elementPath],\n },\n // Slot children authored alongside this instance refer to the OUTER\n // component's interface (the one whose body contains `<Component \u2026>{slot\n // children}</Component>`). When the body hits its `<slot/>`, those\n // children must resolve `{{title}}` etc. against `parentProps` \u2014 not\n // against this component's resolved props. For forwarded slot children,\n // use the original outer slot's `slotInstanceProps` instead so they keep\n // their original authoring scope through the wrapper.\n slotInstanceProps: didForwardSlot ? inheritedSlotInstanceProps : parentProps,\n componentDefaults: extractInterfaceDefaults(structured?.interface),\n };\n\n // Layer the active CMS template context (e.g. `post` from a `<list>`\n // iteration) underneath the component's resolved props so descendants\n // inside the body can resolve `{{post.title}}` etc. Mirrors SSR's\n // ssrRenderer.ts:1231 which passes `itemContext: ctx.templateContext`\n // alongside resolved props. resolvedProps wins on key conflicts so\n // explicit instance props still override.\n const ctxTemplate = ctx.templateContext as Record<string, unknown> | undefined;\n const bodyProps = ctxTemplate\n ? { ...ctxTemplate, ...resolvedProps }\n : resolvedProps;\n const emitted = await nodeToWebflow(body, compCtx, bodyProps);\n\n // `acceptsStyles`: forward instance-level style / interactiveStyles\n // overrides as ONE combo class on the body's emitted root, mirroring how\n // SSR merges them onto the root node (ssrRenderer.ts:1244). All authored\n // overrides \u2014 base, breakpoint, pseudo-state \u2014 fold into a single combo\n // named after the instance's outer location so two instances of the same\n // component on the same page don't share a single class.\n if (\n structured?.acceptsStyles\n && emitted.length > 0\n && (\n (node.style && Object.keys(node.style as object).length > 0)\n || (Array.isArray(node.interactiveStyles) && node.interactiveStyles.length > 0)\n )\n ) {\n const root = emitted[0];\n if (root && typeof root === 'object') {\n // The body root may not have needed a class on its own (e.g. a plain\n // <section> without authored styles). Mint one so the combo has a\n // primary class to attach to \u2014 uses the same `buildElementClass`\n // identity emitHtmlNode would have produced for this root.\n if (!root.className) {\n const minted = withThemeSuffix(buildElementClass(compCtx, undefined), compCtx);\n ctx.styleClasses.set(minted, { name: minted, base: {} });\n root.className = minted;\n }\n\n const rawStyle = node.style as StyleObject | ResponsiveStyleObject | undefined;\n const rawInteractive = node.interactiveStyles as InteractiveStyles | undefined;\n const resolvedStyle = substituteVarsInStyle(\n resolveStyleTemplates(rawStyle, parentProps),\n ctx,\n );\n const resolvedInteractive = substituteVarsInInteractive(\n resolveInteractiveStyleTemplates(rawInteractive, parentProps),\n ctx,\n );\n\n // Stable per-instance combo name: `is-<5char hash>` where the hash is\n // derived from the placement's full element-class identity in the OUTER\n // tree. Two instances of the same component at different positions get\n // distinct combos; the same instance produces the same name across\n // re-imports. `mintInstanceComboName` resolves the rare case where two\n // identities collapse to the same hash slice within one export.\n const instanceLocClass = withThemeSuffix(buildElementClass(ctx, node.label), ctx);\n const comboName = mintInstanceComboName(ctx, instanceLocClass);\n\n const combo = buildInstanceStyleCombo(\n comboName,\n root.className,\n resolvedStyle,\n resolvedInteractive,\n ctx.breakpoints,\n ctx.responsiveScales,\n );\n if (combo) {\n substituteVarsInStyleClass(combo, ctx);\n // Webflow only honors a single combo class on top of the primary. If\n // the body root already wears a StyleMapping-driven combo from\n // `mapStylesToWebflow` (e.g. `is-size-small`), fold this instance\n // override into a fresh merged class instead of stacking. Outer\n // instance overrides land last so they win on key conflicts,\n // mirroring SSR's merge order in `ssrRenderer.ts:1244`.\n const existingComboName = Array.isArray(root.comboClasses) && root.comboClasses.length > 0\n ? root.comboClasses[0]\n : undefined;\n const inner = existingComboName ? ctx.styleClasses.get(existingComboName) : undefined;\n if (inner) {\n const merged = mergeComboClasses(inner, combo, root.className);\n ctx.styleClasses.set(merged.name, merged);\n root.comboClasses = [merged.name];\n } else {\n ctx.styleClasses.set(combo.name, combo);\n root.comboClasses = [combo.name];\n }\n }\n }\n }\n\n // Mark the first emitted element as the component root so bundled scripts\n // can find their instances at runtime via [data-component~=\"\u2026\"] and read\n // their props via data-props. Mirrors ssrRenderer.ts:1311-1345 \u2014 same shape\n // (`data-component` space-separated, `data-props` JSON keyed by component\n // name) so component code runs unmodified in the published Webflow page.\n // Only tag if the component actually ships JavaScript; otherwise the marker\n // is dead weight.\n if (emitted.length > 0 && structured?.javascript) {\n const root = emitted[0];\n if (root && typeof root === 'object') {\n root.attributes = root.attributes || {};\n const existing = root.attributes['data-component'];\n root.attributes['data-component'] = existing\n ? `${existing} ${node.component}`\n : node.component;\n\n // Serialize defineVars-exposed props into data-props, keyed by component\n // name so nested components don't clobber each other on a shared root.\n const defineVars = structured.defineVars;\n if (defineVars) {\n const varsToExpose = defineVars === true\n ? Object.keys(structured.interface || {})\n : defineVars;\n const propsForJS: Record<string, unknown> = {};\n for (const varName of varsToExpose) {\n if (resolvedProps[varName] !== undefined) {\n propsForJS[varName] = resolvedProps[varName];\n }\n }\n\n let existingPropsMap: Record<string, unknown> = {};\n const existingPropsStr = root.attributes['data-props'];\n if (typeof existingPropsStr === 'string' && existingPropsStr) {\n try {\n // Stored URL-encoded (see comment below) \u2014 decode before parsing.\n const parsed = JSON.parse(decodeURIComponent(existingPropsStr));\n if (parsed && typeof parsed === 'object') {\n existingPropsMap = parsed as Record<string, unknown>;\n }\n } catch { /* ignore malformed */ }\n }\n existingPropsMap[node.component] = propsForJS;\n // URL-encode the serialized JSON. Webflow's `<DOM>`-type element\n // (used for `<input>`, `<label>` etc.) rejects attribute values\n // containing double quotes via setAttribute. Encoding sidesteps that\n // by removing literal `\"` characters \u2014 the runtime IIFE in the JS\n // bundle decodes via decodeURIComponent before JSON.parse.\n root.attributes['data-props'] = encodeURIComponent(JSON.stringify(existingPropsMap));\n }\n }\n }\n\n return emitted;\n}\n\nasync function emitSlotMarker(\n node: SlotMarker,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement[]> {\n // Use instance children passed via context to fill the slot\n if (ctx.slotChildren) {\n // Switch back to caller context so slot children's generated class names\n // hash against the page that supplied them, not the slot-host component.\n const restored = ctx.slotEmitContext;\n const parentCtx: WebflowEmitContext = {\n ...ctx,\n ...(restored\n ? {\n fileType: restored.fileType,\n fileName: restored.fileName,\n elementPath: [...restored.elementPath],\n }\n : {}),\n slotChildren: undefined, // prevent infinite slot nesting\n slotEmitContext: undefined, // consumed\n slotInstanceProps: undefined, // consumed\n };\n // Slot children's `{{prop}}` templates reference the OUTER component's\n // interface (the component whose body authored these children), not the\n // slot host's. `slotInstanceProps` captures that outer prop set in\n // `emitInlineComponentBody`. Without this, a Heading with `text=\"{{title}}\"`\n // placed inside a `<Stack>` slot would look up `title` on Stack's props\n // (where it doesn't exist) and emit an empty heading.\n const slotProps = ctx.slotInstanceProps ?? instanceProps;\n return convertChildren(ctx.slotChildren as any, parentCtx, slotProps);\n }\n // Fall back to slot defaults\n if (node.default) {\n return convertChildren(node.default as any, ctx, instanceProps);\n }\n return [];\n}\n\nasync function emitEmbedNode(\n node: EmbedNode,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement> {\n const style = substituteVarsInStyle(\n resolveStyleTemplates(\n node.style as StyleObject | ResponsiveStyleObject | undefined,\n instanceProps\n ),\n ctx\n );\n const interactiveStyles = substituteVarsInInteractive(\n resolveInteractiveStyleTemplates(\n node.interactiveStyles as InteractiveStyles | undefined,\n instanceProps\n ),\n ctx\n );\n\n let className: string | undefined;\n if (style || (interactiveStyles && interactiveStyles.length > 0)) {\n const elementClass = withThemeSuffix(buildElementClass(ctx, node.label), ctx);\n const { primaryClass } = mapStylesToWebflow(\n elementClass, style, interactiveStyles, ctx.breakpoints, ctx.responsiveScales\n );\n substituteVarsInStyleClass(primaryClass, ctx);\n className = primaryClass.name;\n ctx.styleClasses.set(primaryClass.name, primaryClass);\n }\n\n // `node.html` may be an HtmlMapping (`{_mapping: true, prop, values}`) bound\n // to a component prop \u2014 e.g. an `Icon` component switches its inline SVG by\n // the `icon` enum. Resolve it against the same layered prop context the\n // runtime SSR uses, otherwise the embed silently exports as empty.\n const props = buildTemplateProps(ctx, instanceProps);\n let htmlStr: string;\n if (isHtmlMapping(node.html)) {\n htmlStr = resolveHtmlMapping(node.html, props) ?? '';\n } else if (typeof node.html === 'string') {\n htmlStr = hasCodeTemplates(node.html) ? processCodeTemplates(node.html, props) : node.html;\n } else {\n htmlStr = '';\n }\n\n const element: WebflowElement = { tag: 'div' };\n if (className) element.className = className;\n\n const trimmed = htmlStr.trim();\n if (/^<svg\\b/i.test(trimmed) && /<\\/svg\\s*>\\s*$/i.test(trimmed)) {\n let svg = trimmed;\n if (/currentColor/i.test(svg)) {\n const resolved = concreteColor(extractBaseColor(style, ctx, instanceProps)) ?? ctx.inheritedColor;\n if (resolved) svg = inlineCurrentColorInSvg(svg, resolved);\n }\n element.svgSource = svg;\n if (node.label) element.imageAlt = node.label;\n return element;\n }\n\n const imgMatch = trimmed.match(/^<img\\b([^>]*)\\/?>\\s*$/i);\n if (imgMatch) {\n const attrs = imgMatch[1];\n const src = /\\bsrc\\s*=\\s*\"([^\"]*)\"|\\bsrc\\s*=\\s*'([^']*)'/i.exec(attrs);\n const alt = /\\balt\\s*=\\s*\"([^\"]*)\"|\\balt\\s*=\\s*'([^']*)'/i.exec(attrs);\n if (src) {\n element.imageSrc = src[1] ?? src[2] ?? '';\n element.imageAlt = (alt?.[1] ?? alt?.[2] ?? node.label) || '';\n await maybeInlineLocalImage(element, element.imageSrc);\n return element;\n }\n }\n\n if (trimmed.length) {\n element.unsupportedEmbed = {\n reason: 'embed-not-svg-or-image',\n preview: trimmed.slice(0, 120),\n label: node.label,\n };\n }\n return element;\n}\n\n/**\n * Rewrite an internal `/path` href to the current-locale Webflow URL. Other\n * link forms (external, protocol-relative, anchor, mailto, tel, javascript,\n * data, relative, empty) pass through unchanged.\n *\n * Webflow has no Designer API for binding `<a>` to a Page entity (Apr 2026),\n * so this is a pure string rewrite that mirrors the URL structure\n * `buildWebflow.ts` already produces for imported pages\n * (`/`, `/${slug}`, `/${locale}`, `/${locale}/${slug}`).\n */\nfunction resolveLinkHref(rawHref: string, ctx: WebflowEmitContext): string {\n if (!rawHref) return rawHref;\n // Only `^/` paths are candidates. `//` is protocol-relative \u2014 leave alone.\n if (!rawHref.startsWith('/') || rawHref.startsWith('//')) return rawHref;\n // No locale machinery wired in this context \u2014 nothing to translate against.\n if (!ctx.i18nConfig || !ctx.locale || !ctx.slugMappings) return rawHref;\n\n // Split off `?query` and `#fragment` so they survive translation, then\n // reattach. Whichever comes first marks the boundary of the path.\n const hashIdx = rawHref.indexOf('#');\n const queryIdx = rawHref.indexOf('?');\n let cut = -1;\n if (hashIdx >= 0 && queryIdx >= 0) cut = Math.min(hashIdx, queryIdx);\n else if (hashIdx >= 0) cut = hashIdx;\n else if (queryIdx >= 0) cut = queryIdx;\n\n const path = cut >= 0 ? rawHref.slice(0, cut) : rawHref;\n const suffix = cut >= 0 ? rawHref.slice(cut) : '';\n\n if (!ctx.slugIndex) {\n ctx.slugIndex = buildSlugIndex(ctx.slugMappings);\n }\n\n // Meno hrefs are authored in canonical (default-locale) form. Translate\n // from default-locale \u2192 ctx.locale; `translatePath` falls back to the same\n // slug + locale prefix for paths without an explicit slugMapping entry,\n // which is the correct behavior for unlocalized pages.\n const translated = translatePath(\n path,\n ctx.locale,\n ctx.i18nConfig.defaultLocale,\n ctx.i18nConfig.defaultLocale,\n ctx.slugIndex\n );\n\n return translated + suffix;\n}\n\nasync function emitLinkNode(\n node: LinkNode,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement> {\n const style = substituteVarsInStyle(\n resolveStyleTemplates(\n node.style as StyleObject | ResponsiveStyleObject | undefined,\n instanceProps\n ),\n ctx\n );\n const interactiveStyles = substituteVarsInInteractive(\n resolveInteractiveStyleTemplates(\n node.interactiveStyles as InteractiveStyles | undefined,\n instanceProps\n ),\n ctx\n );\n\n // Always assign a class so we can default `text-decoration: none` \u2014\n // browsers underline `<a>` by default and source designs almost never\n // override it. Mirrors the heading-margin default for `h1`\u2013`h6`.\n let className: string | undefined;\n let comboClassNames: string[] | undefined;\n {\n const elementClass = withThemeSuffix(buildElementClass(ctx, node.label), ctx);\n const { primaryClass, comboClasses } = mapStylesToWebflow(\n elementClass, style, interactiveStyles, ctx.breakpoints, ctx.responsiveScales,\n { instanceProps, componentDefaults: ctx.componentDefaults, themeSuffix: themedClassSuffix(ctx) }\n );\n substituteVarsInStyleClass(primaryClass, ctx);\n applyLinkTextDecorationDefault(primaryClass);\n applyGridRowsDefault(primaryClass);\n className = primaryClass.name;\n ctx.styleClasses.set(primaryClass.name, primaryClass);\n\n if (comboClasses.length > 0) {\n comboClassNames = [];\n for (const combo of comboClasses) {\n substituteVarsInStyleClass(combo, ctx);\n ctx.styleClasses.set(combo.name, combo);\n comboClassNames.push(combo.name);\n }\n }\n\n if (\n ctx.interactiveStylesMap\n && Array.isArray(interactiveStyles)\n && interactiveStyles.length > 0\n ) {\n ctx.interactiveStylesMap.set(primaryClass.name, interactiveStyles);\n }\n }\n\n // Resolve href, then rewrite internal page paths to the current-locale\n // Webflow URL so links survive localized slugs and non-default-locale\n // prefixes (`/about` \u2192 `/fr/\u00E0-propos`). External / anchor / mailto / tel\n // / protocol-relative hrefs pass through unchanged.\n let href = '#';\n if (typeof node.href === 'string') {\n href = resolveStringTemplate(node.href, ctx, instanceProps);\n }\n href = resolveLinkHref(href, ctx);\n\n const attributes: Record<string, string | number | boolean> = { href };\n if (node.attributes) {\n for (const [key, value] of Object.entries(node.attributes)) {\n attributes[key] = (typeof value === 'string')\n ? resolveStringTemplate(value, ctx, instanceProps)\n : value;\n }\n }\n\n let children: WebflowElement[] | undefined;\n if (node.children) {\n const ownColor = concreteColor(extractBaseColor(style, ctx, instanceProps));\n const childCtx = ownColor ? { ...ctx, inheritedColor: ownColor } : ctx;\n children = await convertChildren(node.children, childCtx, instanceProps);\n if (children.length === 0) children = undefined;\n }\n\n const element: WebflowElement = { tag: 'a', attributes };\n if (className) element.className = className;\n if (comboClassNames) element.comboClasses = comboClassNames;\n if (children) element.children = children;\n\n return element;\n}\n\n// ---------------------------------------------------------------------------\n// List nodes (prop + collection) \u2014 static expansion\n// ---------------------------------------------------------------------------\n\nfunction singularize(name: string): string {\n if (name.endsWith('ies') && name.length > 3) return name.slice(0, -3) + 'y';\n if (name.endsWith('s') && name.length > 1) return name.slice(0, -1);\n return name;\n}\n\nfunction makeI18nResolver(ctx: WebflowEmitContext): ValueResolver | undefined {\n if (!ctx.locale || !ctx.i18nConfig) return undefined;\n const { locale, i18nConfig } = ctx;\n return (value: unknown) => resolveI18nValue(value, locale, i18nConfig);\n}\n\n/**\n * Resolve i18n values inside a CMS item so list children see the right locale.\n * Mirrors the pre-render shaping the SSR list does via templateContext.\n */\nfunction resolveItemI18n(item: CMSItem, ctx: WebflowEmitContext): CMSItem {\n if (!ctx.locale || !ctx.i18nConfig) return item;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(item)) {\n out[k] = isI18nValue(v) ? resolveI18nValue(v, ctx.locale, ctx.i18nConfig) : v;\n }\n return out as CMSItem;\n}\n\nasync function getCollectionItemsForExport(\n node: ListNode,\n source: string,\n ctx: WebflowEmitContext\n): Promise<CMSItem[]> {\n if (!ctx.cmsService) return [];\n\n let items: CMSItem[] = [];\n\n // Reference list (`items: \"{{cms.tagIds}}\"` or `items: [\"id1\", \"id2\"]`)\n if ((node as any).items) {\n const itemsField = (node as any).items;\n let resolvedIds: string | string[] | undefined;\n\n if (typeof itemsField === 'string' && itemsField.startsWith('{{')) {\n if (itemsField.startsWith('{{cms.') && ctx.cmsContext?.cms) {\n const fieldPath = itemsField.slice(6, -2);\n let value: unknown = ctx.cmsContext.cms;\n for (const part of fieldPath.split('.')) {\n if (value && typeof value === 'object' && part in (value as object)) {\n value = (value as Record<string, unknown>)[part];\n } else { value = undefined; break; }\n }\n if (value !== null && value !== undefined) {\n resolvedIds = Array.isArray(value) ? value.map(v => String(v)) : String(value);\n }\n } else {\n resolvedIds = resolveItemsTemplate(\n itemsField,\n (ctx.templateContext || { _type: 'template' }) as any\n );\n }\n if (!resolvedIds) return [];\n const ids = Array.isArray(resolvedIds) ? resolvedIds : [resolvedIds];\n items = await ctx.cmsService.getItemsByIds(source, ids);\n } else {\n const ids = Array.isArray(itemsField) ? itemsField : [itemsField];\n items = await ctx.cmsService.getItemsByIds(source, ids);\n }\n if (ctx.locale) {\n items = items.filter(it => !isItemDraftForLocale(it, ctx.locale!));\n }\n } else {\n items = await ctx.cmsService.queryItems({\n collection: source,\n filter: node.filter as CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown> | undefined,\n sort: node.sort,\n limit: node.limit,\n offset: node.offset,\n excludeDraftLocale: ctx.locale,\n });\n }\n\n if ((node as any).excludeCurrentItem && ctx.cmsContext?.cms?._id) {\n const currentId = ctx.cmsContext.cms._id as string;\n items = items.filter(it => it._id !== currentId);\n }\n\n return items;\n}\n\nfunction getPropItemsForExport(source: string, ctx: WebflowEmitContext, instanceProps?: Record<string, unknown>): unknown[] {\n // Template expression like \"{{items}}\" or \"{{category.items}}\". SSR pre-\n // substitutes these against the merged prop scope via `processStructure`\n // before the list node is reached, so its `getPropItems` only needs to look\n // at templateContext. The Webflow exporter walks the raw JSON, so we\n // resolve here against both scopes: `templateContext` carries outer-list\n // iteration variables (`{{category.items}}`); `instanceProps` carries the\n // enclosing component's resolved props (`{{items}}` referring to the\n // component's own `items` prop, the form generated by the editor).\n if (source.startsWith('{{') && source.endsWith('}}')) {\n const path = source.slice(2, -2).trim();\n const ctxObj = ctx.templateContext as Record<string, unknown> | undefined;\n if (ctxObj) {\n const resolved = getNestedValue(ctxObj, path);\n if (Array.isArray(resolved)) return resolved;\n }\n if (instanceProps) {\n const resolved = getNestedValue(instanceProps, path);\n if (Array.isArray(resolved)) return resolved;\n }\n return [];\n }\n // Direct prop name \u2014 resolve from current component scope, then CMS context.\n if (instanceProps && Array.isArray(instanceProps[source])) {\n return instanceProps[source] as unknown[];\n }\n if (ctx.cmsContext?.cms) {\n const cmsValue = (ctx.cmsContext.cms as Record<string, unknown>)[source];\n if (Array.isArray(cmsValue)) return cmsValue;\n }\n return [];\n}\n\n/**\n * Build a synthetic CMSItem whose every field is the binding sentinel string\n * for that field slug. Used in bound mode so the existing template engine\n * resolves `{{post.title}}` to a sentinel that the post-walk can rewrite into\n * a `menoBind.textField` marker.\n */\nfunction buildBindingPlaceholderItem(schema: CMSSchema | undefined): CMSItem {\n const item: Record<string, unknown> = {};\n if (schema?.fields) {\n for (const fieldSlug of Object.keys(schema.fields)) {\n item[fieldSlug] = `${MENO_BIND_SENTINEL_PREFIX}${fieldSlug}${MENO_BIND_SENTINEL_SUFFIX}`;\n }\n }\n // System fields commonly referenced in templates (`{{post._url}}` for links,\n // `{{post._slug}}` for hrefs). Webflow's binding panel exposes these as\n // \"Current item URL\" / \"Slug\" \u2014 map back to the same names so the manual\n // binding step is unambiguous.\n item._id = `${MENO_BIND_SENTINEL_PREFIX}_id${MENO_BIND_SENTINEL_SUFFIX}`;\n item._slug = `${MENO_BIND_SENTINEL_PREFIX}_slug${MENO_BIND_SENTINEL_SUFFIX}`;\n item._url = `${MENO_BIND_SENTINEL_PREFIX}_url${MENO_BIND_SENTINEL_SUFFIX}`;\n return item as CMSItem;\n}\n\n/**\n * Walk a rendered element subtree and convert binding sentinels into\n * `menoBind` markers so the extension can surface them to the user. Sentinels\n * appear in `textContent` (from `<h2>{{post.title}}</h2>`) or in attribute\n * values (from `<a href=\"{{post._url}}\">` / `<img src=\"{{post.cover}}\">`).\n *\n * Exact-match sentinels become a clean `{textField}` / `{attrFields}` entry;\n * partial matches (`/blog/__MENO_BIND__:_url:__`) record the binding hint but\n * keep the literal text so the user can see the URL pattern context.\n *\n * Side effect: image inlining done by `maybeInlineLocalImage` for sentinel\n * srcs leaks file bytes that point at no real asset. Strip them so the\n * extension doesn't try to upload garbage.\n */\nfunction applyBindingMarkers(el: WebflowElement): void {\n // Text content\n if (typeof el.textContent === 'string') {\n const exact = el.textContent.match(MENO_BIND_SENTINEL_EXACT_RE);\n if (exact) {\n const field = exact[1];\n el.menoBind = { ...(el.menoBind || {}), textField: field };\n el.textContent = `{${field}}`;\n } else if (MENO_BIND_SENTINEL_RE.test(el.textContent)) {\n MENO_BIND_SENTINEL_RE.lastIndex = 0;\n const fields: string[] = [];\n el.textContent = el.textContent.replace(MENO_BIND_SENTINEL_RE, (_m, f) => {\n fields.push(f);\n return `{${f}}`;\n });\n if (fields.length) {\n el.menoBind = { ...(el.menoBind || {}), textField: fields[0] };\n }\n }\n MENO_BIND_SENTINEL_RE.lastIndex = 0;\n }\n\n // Attributes\n if (el.attributes) {\n const attrFields: Record<string, string> = el.menoBind?.attrFields || {};\n for (const [key, rawValue] of Object.entries(el.attributes)) {\n if (typeof rawValue !== 'string') continue;\n const exact = rawValue.match(MENO_BIND_SENTINEL_EXACT_RE);\n if (exact) {\n attrFields[key] = exact[1];\n el.attributes[key] = `{${exact[1]}}`;\n continue;\n }\n MENO_BIND_SENTINEL_RE.lastIndex = 0;\n if (MENO_BIND_SENTINEL_RE.test(rawValue)) {\n MENO_BIND_SENTINEL_RE.lastIndex = 0;\n let firstField: string | undefined;\n const replaced = rawValue.replace(MENO_BIND_SENTINEL_RE, (_m, f) => {\n if (!firstField) firstField = f;\n return `{${f}}`;\n });\n if (firstField) attrFields[key] = firstField;\n el.attributes[key] = replaced;\n }\n MENO_BIND_SENTINEL_RE.lastIndex = 0;\n }\n if (Object.keys(attrFields).length > 0) {\n el.menoBind = { ...(el.menoBind || {}), attrFields };\n }\n }\n\n // Image inlining produced bytes for a sentinel src \u2014 drop them; user will\n // re-bind the image to a real CMS field after insertion.\n if (\n el.menoBind?.attrFields?.src\n && (el.imageDataBase64 || el.imageSrc)\n ) {\n delete el.imageDataBase64;\n delete el.imageDataMime;\n delete el.imageDataFileName;\n delete el.imageSrc;\n }\n\n // Recurse\n if (Array.isArray(el.children)) {\n for (const child of el.children) {\n if (typeof child !== 'string') applyBindingMarkers(child);\n }\n }\n if (Array.isArray(el.inlineFallback)) {\n for (const child of el.inlineFallback) applyBindingMarkers(child);\n }\n}\n\n/**\n * Wrap any non-`<li>` child of a `<ul>`/`<ol>` element in a synthetic `<li>`.\n * Webflow's Designer API enforces that the `List` preset only accepts\n * `ListItem` children \u2014 so an `<a>` or `<div>` directly under `<ul>` (a common\n * Meno pattern when a `list` node iterates a link-style item template inside\n * a `<ul>` wrapper) is rejected at insert time with\n * \"Non-List Item can not be placed in a List.\" This pass corrects the structure\n * at the source so the exported tree is structurally valid Webflow markup.\n *\n * Walks recursively, in-place. Idempotent: existing `<li>` children pass\n * through untouched.\n */\nexport function normalizeListChildren(\n elements: Array<WebflowElement | string> | undefined\n): void {\n if (!Array.isArray(elements)) return;\n for (const el of elements) {\n if (typeof el === 'string') continue;\n const tag = (el.tag || '').toLowerCase();\n if ((tag === 'ul' || tag === 'ol') && Array.isArray(el.children)) {\n el.children = el.children.map((child): WebflowElement | string => {\n if (typeof child === 'string') return { tag: 'li', children: [child] };\n if ((child.tag || '').toLowerCase() === 'li') return child;\n return { tag: 'li', children: [child] };\n });\n }\n if (Array.isArray(el.children)) normalizeListChildren(el.children);\n if (Array.isArray(el.inlineFallback)) normalizeListChildren(el.inlineFallback);\n }\n}\n\n/**\n * Static expansion of a List/CMS-list node. Mirrors SSR's `processList`:\n * resolves the source (CMS query, prop array, or template expression),\n * applies filter/sort/limit/offset, and emits children once per item with\n * the per-item template context layered onto `instanceProps`.\n */\nasync function emitListNode(\n node: ListNode,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement[]> {\n const nodeType = node.type as string;\n const isLegacyCMSList = nodeType === 'cms-list';\n const sourceType = isLegacyCMSList ? 'collection' : (node.sourceType || 'prop');\n\n if (sourceType === 'collection' && !ctx.cmsService) return [];\n\n const rawSource = (node as any).source || (node as any).collection;\n const source = typeof rawSource === 'string' ? rawSource : '';\n const sourceIsResolved = Array.isArray(rawSource);\n\n let variableName: string;\n if (node.itemAs) variableName = node.itemAs;\n else if (sourceType === 'collection') variableName = singularize(source);\n else variableName = 'item';\n\n // Bound mode: emit a single-item synthetic Collection List wrapper instead\n // of expanding statically. Children are rendered ONCE against a sentinel\n // placeholder item; sentinels are then converted to `menoBind` markers the\n // extension picks up. Only reached for `sourceType === 'collection'`.\n if (sourceType === 'collection' && ctx.bindCollectionLists && ctx.cmsService && source) {\n const schema = ctx.cmsService.getSchema(source) || undefined;\n const placeholder = buildBindingPlaceholderItem(schema);\n const templateContext = buildTemplateContext(\n variableName,\n placeholder,\n 0,\n 1,\n ctx.templateContext as any\n );\n const childCtx: WebflowEmitContext = {\n ...ctx,\n templateContext: templateContext as Record<string, unknown>,\n };\n const mergedProps: Record<string, unknown> = {\n ...(instanceProps || {}),\n ...templateContext,\n };\n const renderedChildren = node.children\n ? await convertChildren(node.children as any, childCtx, mergedProps)\n : [];\n for (const child of renderedChildren) {\n if (typeof child !== 'string') applyBindingMarkers(child);\n }\n return [{\n tag: COLLECTION_LIST_TAG,\n menoCollectionRef: source,\n children: renderedChildren,\n }];\n }\n\n let items: unknown[];\n if (sourceType === 'collection') {\n items = await getCollectionItemsForExport(node, source, ctx);\n } else if (sourceIsResolved) {\n items = rawSource as unknown[];\n } else if (source) {\n items = getPropItemsForExport(source, ctx, instanceProps);\n if (node.offset) items = items.slice(node.offset);\n if (node.limit) items = items.slice(0, node.limit);\n } else {\n items = [];\n }\n\n return expandListItems(node, ctx, instanceProps, items, variableName, source);\n}\n\nasync function expandListItems(\n node: ListNode,\n ctx: WebflowEmitContext,\n instanceProps: Record<string, unknown> | undefined,\n items: unknown[],\n variableName: string,\n source: string\n): Promise<WebflowElement[]> {\n if (items.length === 0) return [];\n\n const schema: CMSSchema | undefined = ctx.cmsService\n ? (ctx.cmsService.getSchema(source) || undefined)\n : undefined;\n\n const out: WebflowElement[] = [];\n for (let i = 0; i < items.length; i++) {\n const rawItem = items[i] as Record<string, unknown>;\n const enriched = schema && ctx.locale && ctx.i18nConfig\n ? addItemUrl(rawItem as CMSItem, schema, ctx.locale, ctx.i18nConfig)\n : (rawItem as CMSItem);\n const item = resolveItemI18n(enriched, ctx);\n\n const templateContext = buildTemplateContext(\n variableName,\n item,\n i,\n items.length,\n (ctx.templateContext as any)\n );\n\n const childCtx: WebflowEmitContext = {\n ...ctx,\n templateContext: templateContext as Record<string, unknown>,\n };\n\n // Merge per-item context onto the instance prop scope so templates\n // ({{item.title}}, {{post.field}}, {{itemIndex}}) resolve via the\n // existing template helpers in this file.\n const mergedProps: Record<string, unknown> = {\n ...(instanceProps || {}),\n ...templateContext,\n };\n\n if (node.children) {\n const savedPath = [...childCtx.elementPath];\n childCtx.elementPath = [...savedPath, i];\n out.push(...(await convertChildren(node.children as any, childCtx, mergedProps)));\n childCtx.elementPath = savedPath;\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// LocaleList \u2014 static link list per configured locale\n// ---------------------------------------------------------------------------\n\nasync function emitLocaleListNode(\n node: LocaleListNode,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement[]> {\n if (!ctx.slugMappings || !ctx.pagePath || !ctx.i18nConfig || !ctx.locale) {\n return [{ tag: 'div', attributes: { 'data-locale-list': 'true' } }];\n }\n\n if (!ctx.slugIndex) {\n ctx.slugIndex = buildSlugIndex(ctx.slugMappings);\n }\n const localeLinks = getLocaleLinks(ctx.pagePath, ctx.locale, ctx.i18nConfig, ctx.slugIndex);\n\n const showCurrent = node.showCurrent !== false;\n const showSeparator = node.showSeparator !== false;\n const showFlag = node.showFlag !== false;\n const displayType = node.displayType || 'nativeName';\n\n const localeIconMap = new Map<string, string>();\n for (const lc of ctx.i18nConfig.locales) {\n if (lc.icon) localeIconMap.set(lc.code, lc.icon);\n }\n\n // Build container style class\n const containerStyle = substituteVarsInStyle(\n resolveStyleTemplates(\n node.style as StyleObject | ResponsiveStyleObject | undefined,\n instanceProps\n ),\n ctx\n );\n const containerInteractive = substituteVarsInInteractive(\n resolveInteractiveStyleTemplates(\n node.interactiveStyles as InteractiveStyles | undefined,\n instanceProps\n ),\n ctx\n );\n\n let containerClass: string | undefined;\n if (containerStyle || (containerInteractive && containerInteractive.length > 0)) {\n const elementClass = withThemeSuffix(buildElementClass(ctx, node.label), ctx);\n const { primaryClass } = mapStylesToWebflow(\n elementClass, containerStyle, containerInteractive, ctx.breakpoints, ctx.responsiveScales\n );\n substituteVarsInStyleClass(primaryClass, ctx);\n containerClass = primaryClass.name;\n ctx.styleClasses.set(primaryClass.name, primaryClass);\n }\n\n const buildSubClass = (\n style: unknown,\n suffix: string\n ): string | undefined => {\n const resolved = substituteVarsInStyle(\n resolveStyleTemplates(\n style as StyleObject | ResponsiveStyleObject | undefined,\n instanceProps\n ),\n ctx\n );\n if (!resolved) return undefined;\n const className = withThemeSuffix(`${buildElementClass(ctx, node.label)}-${suffix}`, ctx);\n const { primaryClass } = mapStylesToWebflow(className, resolved, undefined, ctx.breakpoints, ctx.responsiveScales);\n substituteVarsInStyleClass(primaryClass, ctx);\n if (Object.keys(primaryClass.base).length === 0\n && !primaryClass.breakpoints\n && !primaryClass.pseudoStates) return undefined;\n ctx.styleClasses.set(primaryClass.name, primaryClass);\n return primaryClass.name;\n };\n\n const itemClassName = buildSubClass((node as any).itemStyle, 'item');\n const activeItemClassName = buildSubClass((node as any).activeItemStyle, 'item-active');\n const separatorClassName = buildSubClass((node as any).separatorStyle, 'separator');\n const flagClassName = buildSubClass((node as any).flagStyle, 'flag');\n\n const linkChildren: WebflowElement[] = [];\n for (let i = 0; i < localeLinks.length; i++) {\n const link = localeLinks[i];\n if (!showCurrent && link.isCurrent) continue;\n\n if (i > 0 && showSeparator) {\n const sep: WebflowElement = { tag: 'span' };\n if (separatorClassName) sep.className = separatorClassName;\n linkChildren.push(sep);\n }\n\n const anchor: WebflowElement = {\n tag: 'a',\n attributes: {\n href: link.path,\n hreflang: link.langTag,\n 'data-current': link.isCurrent ? 'true' : 'false',\n 'data-locale': link.locale,\n },\n };\n if (link.isCurrent && (activeItemClassName || itemClassName)) {\n anchor.className = itemClassName;\n if (activeItemClassName) anchor.comboClasses = [activeItemClassName];\n } else if (itemClassName) {\n anchor.className = itemClassName;\n }\n\n const innerChildren: WebflowElement[] = [];\n const icon = localeIconMap.get(link.locale);\n if (showFlag && icon) {\n const img: WebflowElement = {\n tag: 'img',\n attributes: { src: icon, alt: `${link.nativeName} flag` },\n };\n if (flagClassName) img.className = flagClassName;\n innerChildren.push(img);\n }\n\n let displayText: string;\n switch (displayType) {\n case 'code': displayText = link.locale.toUpperCase(); break;\n case 'name': displayText = link.name; break;\n case 'nativeName':\n default: displayText = link.nativeName; break;\n }\n innerChildren.push({ tag: 'div', textContent: displayText });\n anchor.children = innerChildren;\n\n linkChildren.push(anchor);\n }\n\n const wrapper: WebflowElement = {\n tag: 'div',\n attributes: { 'data-locale-list': 'true' },\n children: linkChildren,\n };\n if (containerClass) wrapper.className = containerClass;\n\n return [wrapper];\n}\n\n// ---------------------------------------------------------------------------\n// Children helper\n// ---------------------------------------------------------------------------\n\nasync function convertChildren(\n children: (ComponentNode | string)[] | string | ComponentNode | null | undefined,\n ctx: WebflowEmitContext,\n instanceProps?: Record<string, unknown>\n): Promise<WebflowElement[]> {\n if (!children) return [];\n\n if (typeof children === 'string') {\n return nodeToWebflow(children, ctx, instanceProps);\n }\n\n if (Array.isArray(children)) {\n return nodeToWebflow(children as ComponentNode[], ctx, instanceProps);\n }\n\n // Single node\n return nodeToWebflow(children, ctx, instanceProps);\n}\n", "/**\n * Webflow Export Types\n * Defines the payload structure for Webflow Designer API consumption.\n */\n\nimport type { CMSFieldType } from '../../shared/types/cms';\n\n// ---------------------------------------------------------------------------\n// Style Classes\n// ---------------------------------------------------------------------------\n\n/**\n * Webflow Designer API breakpoint identifiers.\n * `main` is the desktop / default tier; `xxl|xl|large` are above-desktop;\n * `medium|small|tiny` are below-desktop.\n * Reference: https://developers.webflow.com/designer/reference/set-style-properties\n */\nexport type WebflowBreakpoint =\n | 'xxl'\n | 'xl'\n | 'large'\n | 'main'\n | 'medium'\n | 'small'\n | 'tiny';\n\n/**\n * Webflow Designer API pseudo-state identifiers.\n * Reference: https://developers.webflow.com/designer/reference/set-style-properties\n */\nexport type WebflowPseudoState =\n | 'noPseudo'\n | 'hover'\n | 'focus'\n | 'focus-visible'\n | 'focus-within'\n | 'active'\n | 'visited'\n | 'pressed'\n | 'before'\n | 'after'\n | 'placeholder'\n | 'empty'\n | 'first-child'\n | 'last-child'\n | 'nth-child(odd)'\n | 'nth-child(even)';\n\n/** CSS properties as a flat record */\nexport type CSSProperties = Record<string, string>;\n\n/** A named Webflow style class with responsive + pseudo-state overrides */\nexport interface WebflowStyleClass {\n /** Unique class name (e.g., \"navigation-hamburger\" for components, \"p-about-grid5\" for pages) */\n name: string;\n /** Base (Desktop) CSS properties */\n base: CSSProperties;\n /** Breakpoint overrides */\n breakpoints?: Partial<Record<WebflowBreakpoint, CSSProperties>>;\n /** Pseudo-state overrides */\n pseudoStates?: Partial<Record<WebflowPseudoState, CSSProperties>>;\n /** Combo class parent (if this is a variant class) */\n comboParent?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Elements\n// ---------------------------------------------------------------------------\n\n/** A Webflow element (DOM node) */\nexport interface WebflowElement {\n /** HTML tag (div, section, h1, a, img, etc.) */\n tag: string;\n /** Primary class name applied to this element */\n className?: string;\n /** Additional combo class names (for StyleMapping variants) */\n comboClasses?: string[];\n /** Inline text content (for text nodes) */\n textContent?: string;\n /**\n * Child elements. Plain strings are inline text runs (Webflow String nodes)\n * \u2014 used for mixed content like `<h1>foo <span>bar</span> baz</h1>`.\n */\n children?: Array<WebflowElement | string>;\n /** HTML attributes (src, alt, href, target, etc.) */\n attributes?: Record<string, string | number | boolean>;\n /**\n * Inline SVG markup for an embed node. The Webflow extension uploads this\n * as an `image/svg+xml` asset and emits an Image element \u2014 Webflow's\n * Designer API has no public method to set HtmlEmbed code content.\n */\n svgSource?: string;\n /** Source URL for an `<img>`-rooted embed; uploaded into Webflow as an asset. */\n imageSrc?: string;\n /** Alt text paired with `svgSource` / `imageSrc`. */\n imageAlt?: string;\n /**\n * Pre-fetched image bytes for `<img>` / embed elements whose source URL\n * the Webflow Designer iframe can't reach (e.g. project-relative paths\n * like `/images/foo.webp`, which would resolve against `designer.webflow.com`).\n * The extension uploads these directly via `createAsset` instead of\n * `fetch`-ing them.\n */\n imageDataBase64?: string;\n imageDataMime?: string;\n imageDataFileName?: string;\n /**\n * Embed payload that is neither SVG nor a single `<img>`. The extension\n * logs it and skips insertion (no equivalent Webflow API exists).\n */\n unsupportedEmbed?: { reason: string; preview: string; label?: string };\n /**\n * When set, this element is an instance of a Webflow Component registered\n * via `payload.components`. The extension appends the registered Component\n * (looked up by name) instead of building children. `tag`/`className`/etc.\n * remain set as a fallback for older extensions that don't understand\n * `componentRef`.\n */\n componentRef?: string;\n /**\n * Inline-expanded element tree to use when the Webflow Designer API can't\n * register Components (older runtime, missing `canCreateComponents`\n * permission). Mirrors the pre-promotion expansion of the Meno component so\n * the extension can render the same markup it does today.\n */\n inlineFallback?: WebflowElement[];\n /**\n * Bound CMS list marker. When set, this element is the synthetic wrapper\n * for `<list sourceType=\"collection\">` emitted in bound mode (see\n * `buildWebflowPayload({ bindCollectionLists: true })`). Value is the Meno\n * collection slug; the extension translates that to a Webflow collection\n * ID via the v1 sync ID map and inserts a `DynamoWrapper` preset.\n * Children are the *single* rendered item template (not N copies), with\n * field references preserved as `menoBind` markers below.\n */\n menoCollectionRef?: string;\n /**\n * Per-element CMS field binding markers. Captured at server emit time from\n * the source `{{field}}` template; the extension translates them into\n * `data-meno-bind-*` custom attributes on the inserted element and surfaces\n * a manual-bind checklist. Webflow's Designer API has no `setBinding` /\n * `setCollection` write surface yet (Apr 2026 \u2014 confirmed by Webflow\n * staff Plata + Selser on the developer forum), so the user does the\n * actual field binding once in the Designer UI after insertion.\n */\n menoBind?: {\n /** Bind this element's text content to this CMS field slug. */\n textField?: string;\n /** Map of attribute name \u2192 CMS field slug to bind. */\n attrFields?: Record<string, string>;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Bound-list sentinel (server-side internal \u2014 extension consumes `menoBind`)\n// ---------------------------------------------------------------------------\n\n/**\n * String sentinel inserted in place of a real CMS field value when emitting a\n * bound Collection List. The existing template engine is reused unchanged: a\n * synthetic placeholder item maps every schema field to\n * `${SENTINEL_PREFIX}${fieldSlug}${SENTINEL_SUFFIX}`, so `{{post.title}}`\n * resolves to that string. A post-walk then converts those strings into\n * `WebflowElement.menoBind` markers and replaces them with a readable\n * placeholder so the user can see what each child is meant to display.\n */\nexport const MENO_BIND_SENTINEL_PREFIX = '__MENO_BIND__:';\nexport const MENO_BIND_SENTINEL_SUFFIX = ':__';\nexport const MENO_BIND_SENTINEL_RE = /__MENO_BIND__:([^:]+):__/g;\nexport const MENO_BIND_SENTINEL_EXACT_RE = /^__MENO_BIND__:([^:]+):__$/;\n\n/** Synthetic tag for the bound Collection List wrapper. */\nexport const COLLECTION_LIST_TAG = '__collection_list__';\n\n/**\n * A Meno component promoted to a Webflow Component. The extension calls\n * `webflow.registerComponent` once per entry, then `parent.append(component)`\n * for every element in the page tree that has a matching `componentRef`.\n */\nexport interface WebflowComponentDef {\n /** Component name as it appears in Webflow's Components panel. */\n name: string;\n /** Element tree that becomes the Component's body. */\n elements: WebflowElement[];\n}\n\n// ---------------------------------------------------------------------------\n// Pages\n// ---------------------------------------------------------------------------\n\n/** A Webflow page */\nexport interface WebflowPage {\n /** Page title */\n title: string;\n /** URL slug (e.g., \"about\", \"blog/post-1\") */\n slug: string;\n /** Meta description */\n description?: string;\n /** Comma-separated keywords from page meta */\n keywords?: string;\n /** Open Graph title */\n ogTitle?: string;\n /** Open Graph description */\n ogDescription?: string;\n /** Open Graph image URL */\n ogImage?: string;\n /** Root elements of the page body */\n elements: WebflowElement[];\n /** Locale code */\n locale?: string;\n}\n\n/**\n * A component-level script bundled into the export. The Webflow extension\n * concatenates these into a single `<script>` injected at the end of `<body>`\n * so interactive Meno components (FAQ accordion, dropdowns, mobile menu) work\n * once published.\n */\nexport interface WebflowScript {\n /** Component name (used by the runtime to find element instances). */\n componentName: string;\n /** Component's JavaScript code (verbatim from `Component.js`). */\n code: string;\n /** Whether the source defined defineVars (true / explicit list / undefined). */\n defineVars?: true | string[];\n}\n\n// ---------------------------------------------------------------------------\n// CMS\n// ---------------------------------------------------------------------------\n\n/** Webflow CMS field type mapping */\nexport type WebflowFieldType =\n | 'PlainText'\n | 'RichText'\n | 'Number'\n | 'Switch'\n | 'Image'\n | 'Date'\n | 'Option'\n | 'File'\n | 'Reference';\n\n/** A field in a Webflow CMS collection */\nexport interface WebflowCMSField {\n /** Field display name */\n name: string;\n /** Field slug (machine name) */\n slug: string;\n /** Webflow field type */\n type: WebflowFieldType;\n /** Whether this field is required */\n required?: boolean;\n /** Options for Option type fields */\n options?: string[];\n /** Help text shown to editors in the Webflow CMS UI */\n helpText?: string;\n /**\n * For Reference fields: Meno collection slug of the target collection.\n * The sync orchestrator resolves this to a Webflow collection ID at create\n * time (pass 2 of the two-pass collection create \u2014 references can only be\n * added once their target exists).\n */\n referenceCollection?: string;\n /** True for multi-reference (array of IDs); false / undefined for single ref. */\n multiReference?: boolean;\n}\n\n/** A Webflow CMS collection definition */\nexport interface WebflowCMSCollection {\n /** Collection display name (plural) */\n name: string;\n /** Singular form of the display name (Webflow requires this for new collections) */\n singularName: string;\n /** Collection slug */\n slug: string;\n /** URL pattern for detail pages */\n urlPattern?: string;\n /** Field definitions */\n fields: WebflowCMSField[];\n /** Collection items */\n items: Record<string, unknown>[];\n}\n\n// ---------------------------------------------------------------------------\n// Assets\n// ---------------------------------------------------------------------------\n\n/** Reference to an asset that needs uploading to Webflow */\nexport interface WebflowAssetRef {\n /** Local file path relative to project root */\n localPath: string;\n /** Asset type */\n type: 'image' | 'font' | 'video' | 'file';\n /** File name */\n fileName: string;\n}\n\n// ---------------------------------------------------------------------------\n// Export Payload\n// ---------------------------------------------------------------------------\n\n/** Per-locale slug mapping for a single source page */\nexport interface WebflowSlugMap {\n /** The page's canonical id (e.g., \"about\", \"blog/post-1\") */\n pageId: string;\n /** Locale code \u2192 translated slug */\n slugs: Record<string, string>;\n}\n\n/** Complete Webflow export payload */\nexport interface WebflowExportPayload {\n /** Export format version */\n version: 1;\n /** Timestamp of export */\n exportedAt: string;\n /** All pages with their element trees */\n pages: WebflowPage[];\n /** All style class definitions */\n styles: WebflowStyleClass[];\n /** CMS collection definitions (if any) */\n cms: WebflowCMSCollection[];\n /** Asset references (images, fonts, etc.) */\n assets: WebflowAssetRef[];\n /** Per-locale slug translations so the consumer can route between locales */\n slugMappings?: WebflowSlugMap[];\n /** Component scripts \u2014 bundled at body end so components stay interactive. */\n scripts?: WebflowScript[];\n /**\n * Meno components promoted to Webflow Components (currently `Navigation`\n * and `Footer`). The extension registers each one before inserting page\n * elements; pages reference them via `WebflowElement.componentRef`.\n */\n components?: WebflowComponentDef[];\n /**\n * Concatenated `Component.css` sidecars (raw CSS) for components that ship\n * hand-written styles. Component-scoped rules \u2014 data-attribute selectors,\n * runtime state classes (e.g. `.is-open`), `:checked ~` siblings \u2014 aren't\n * representable in Webflow's class system and are silently lost when only\n * the per-element classes are emitted. The user pastes this into Site\n * Settings \u2192 Custom Code \u2192 Head Code along with the combo-class overrides.\n */\n componentCss?: string;\n /**\n * Raw CSS for `interactiveStyles` rules that Webflow's class system can't\n * represent natively \u2014 anything with a `prefix` (descendant/sibling\n * selector built from a state class on an ancestor), a class-style\n * `postfix` like `.is-open`, or breakpoint-divided pseudo states.\n * Pseudo-only rules with empty prefix continue to flow through Webflow's\n * `Style.setProperties({ pseudo })`. Pasted into Site Settings \u2192 Custom\n * Code \u2192 Head Code along with `componentCss`.\n */\n interactiveCss?: string;\n /**\n * Project i18n summary so the extension can show a locale picker. Always\n * present; single-locale projects still receive their lone locale here.\n * `selectedLocale` reflects which locale's pages were emitted in this\n * payload \u2014 the extension uses it to round-trip the picker selection.\n */\n i18n?: {\n defaultLocale: string;\n locales: Array<{ code: string; name: string; nativeName?: string }>;\n selectedLocale: string;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Map Meno CMS field type \u2192 Webflow field type */\nexport function mapCMSFieldType(menoType: CMSFieldType): WebflowFieldType {\n switch (menoType) {\n case 'string':\n return 'PlainText';\n case 'text':\n case 'rich-text':\n return 'RichText';\n case 'number':\n return 'Number';\n case 'boolean':\n return 'Switch';\n case 'image':\n return 'Image';\n case 'date':\n return 'Date';\n case 'select':\n return 'Option';\n case 'file':\n return 'File';\n case 'reference':\n return 'Reference';\n default:\n return 'PlainText';\n }\n}\n", "/**\n * Webflow Style Mapper\n * Converts Meno styles (ResponsiveStyleObject + InteractiveStyles) into\n * Webflow named style classes with breakpoint and pseudo-state overrides.\n */\n\nimport type {\n StyleObject,\n ResponsiveStyleObject,\n StyleMapping,\n InteractiveStyles,\n InteractiveStyleRule,\n} from '../../shared/types/styles';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport type { WebflowStyleClass, WebflowBreakpoint, WebflowPseudoState, CSSProperties } from './types';\nimport {\n type ResponsiveScales,\n type CSSPropertyType,\n getScaleMultiplier,\n scalePropertyValue,\n} from '../../shared/responsiveScaling';\nimport { isCssNamedColor } from '../../shared/cssNamedColors';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** CSS properties that accept unitless numeric values */\nconst UNITLESS_PROPERTIES = new Set([\n 'opacity', 'z-index', 'flex-grow', 'flex-shrink', 'flex',\n 'order', 'orphans', 'widows', 'column-count', 'font-weight',\n 'tab-size',\n]);\n\n/**\n * CSS properties that accept time values (`0`, `0s`, `0ms`). Excluded from\n * the bare-zero \u2192 `0px` normalization below \u2014 `transition-duration: 0px`\n * would be invalid and silently dropped.\n */\nconst TIME_PROPERTIES = new Set([\n 'transition-duration', 'transition-delay',\n 'animation-duration', 'animation-delay',\n]);\n\n/**\n * Webflow's class system rejects bare `0` for length properties \u2014 it expects\n * a unit. Numeric `0` already flows through as `0px` (see `styleObjectToCSS`),\n * but string `'0'` (from authored `marginTop: '0'`, shorthand expansion of\n * `margin: 0 auto`, etc.) needs the same treatment. Unitless props (opacity,\n * z-index) and time props (transition-duration) keep the bare `0`.\n */\nfunction normalizeZero(cssProp: string, cssValue: string): string {\n if (cssValue !== '0') return cssValue;\n if (UNITLESS_PROPERTIES.has(cssProp)) return cssValue;\n if (TIME_PROPERTIES.has(cssProp)) return cssValue;\n return '0px';\n}\n\n/**\n * Color properties whose authored value can be a bare token (e.g. `\"primary\"`)\n * that Meno's runtime auto-wraps into `var(--primary)` (see\n * `cssGeneration.ts` `styleObjectToCSS`). Mirrored here so the Webflow exporter\n * doesn't ship literal `\"background-color: primary\"` to the Designer \u2014 that\n * value is invalid CSS and Webflow renders nothing. After wrapping, the\n * second-pass `substituteVarsInStyleClass` in `nodeToWebflow` resolves the\n * `var(--\u2026)` against the project's theme/variable maps.\n */\nconst COLOR_PROPS_CAMEL = new Set(['color', 'backgroundColor', 'borderColor']);\n\n/**\n * If `value` is a bare Meno color token on a color-accepting property, wrap it\n * in `var(--\u2026)`. Hex / rgb / hsl / any functional notation / already-wrapped\n * `var(...)` / CSS-named keywords (red, transparent, currentColor, inherit, \u2026)\n * pass through unchanged.\n */\nfunction maybeWrapColorVar(camelProp: string, value: string): string {\n if (!COLOR_PROPS_CAMEL.has(camelProp)) return value;\n if (!value) return value;\n if (value.startsWith('#')) return value;\n if (value.startsWith('var(')) return value;\n if (value.includes('(')) return value;\n if (isCssNamedColor(value)) return value;\n return `var(--${value})`;\n}\n\nfunction isStyleMapping(value: unknown): value is StyleMapping {\n return (\n typeof value === 'object' &&\n value !== null &&\n '_mapping' in value &&\n (value as StyleMapping)._mapping === true\n );\n}\n\nfunction isResponsiveStyle(\n style: StyleObject | ResponsiveStyleObject\n): style is ResponsiveStyleObject {\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n/**\n * Convert a camelCase CSS property to kebab-case\n */\nfunction toKebabCase(prop: string): string {\n return prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\n\n/**\n * Split a CSS value at top-level whitespace, leaving parenthesised groups\n * (`var(--x, 16px)`, `calc(1rem + 2px)`) intact as a single token.\n */\nfunction splitTopLevel(value: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let buf = '';\n for (const ch of value.trim()) {\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n if (depth === 0 && /\\s/.test(ch)) {\n if (buf) { out.push(buf); buf = ''; }\n continue;\n }\n buf += ch;\n }\n if (buf) out.push(buf);\n return out;\n}\n\n/**\n * Expand `margin` / `padding` / `gap` shorthand values into the longhand\n * properties Webflow's class system models directly (per-side margin/padding,\n * per-axis row-gap/column-gap). Webflow drops or mis-renders these shorthands\n * when written via `Style.setProperties`, so every Webflow-bound style flows\n * through this expansion at the CSS-conversion boundary.\n *\n * Returns `null` when the property isn't a handled shorthand or the value\n * shape doesn't match (1\u20134 tokens for margin/padding, 1\u20132 for gap). Callers\n * fall through to passing the value as-is in those cases.\n */\nfunction expandShorthand(cssProp: string, cssValue: string): CSSProperties | null {\n if (cssProp !== 'margin' && cssProp !== 'padding' && cssProp !== 'gap') {\n return null;\n }\n const parts = splitTopLevel(cssValue);\n\n if (cssProp === 'gap') {\n if (parts.length === 1) {\n const v = normalizeZero('row-gap', parts[0]!);\n return { 'row-gap': v, 'column-gap': v };\n }\n if (parts.length === 2) {\n return {\n 'row-gap': normalizeZero('row-gap', parts[0]!),\n 'column-gap': normalizeZero('column-gap', parts[1]!),\n };\n }\n return null;\n }\n\n // margin / padding\n let top: string, right: string, bottom: string, left: string;\n if (parts.length === 1) {\n top = right = bottom = left = parts[0]!;\n } else if (parts.length === 2) {\n top = bottom = parts[0]!;\n right = left = parts[1]!;\n } else if (parts.length === 3) {\n top = parts[0]!;\n right = left = parts[1]!;\n bottom = parts[2]!;\n } else if (parts.length === 4) {\n [top, right, bottom, left] = parts as [string, string, string, string];\n } else {\n return null;\n }\n return {\n [`${cssProp}-top`]: normalizeZero(`${cssProp}-top`, top),\n [`${cssProp}-right`]: normalizeZero(`${cssProp}-right`, right),\n [`${cssProp}-bottom`]: normalizeZero(`${cssProp}-bottom`, bottom),\n [`${cssProp}-left`]: normalizeZero(`${cssProp}-left`, left),\n };\n}\n\n/**\n * Convert a flat StyleObject to CSS properties, skipping StyleMappings.\n * `margin`, `padding`, and `gap` shorthands are expanded in place (see\n * `expandShorthand`) so Webflow's class system receives only longhands.\n * Iteration order follows CSS cascade \u2014 a longhand declared after a\n * shorthand wins; declared before, the shorthand's expansion clobbers it.\n */\nfunction styleObjectToCSS(style: StyleObject): CSSProperties {\n const css: CSSProperties = {};\n for (const [prop, value] of Object.entries(style)) {\n if (isStyleMapping(value)) continue;\n if (value === '' || value === undefined || value === null) continue;\n if (typeof value === 'boolean' || typeof value === 'object') continue;\n const cssProp = toKebabCase(prop);\n let cssValue: string;\n if (typeof value === 'number') {\n if (isNaN(value)) continue;\n cssValue = UNITLESS_PROPERTIES.has(cssProp) ? String(value) : `${value}px`;\n } else {\n cssValue = maybeWrapColorVar(prop, String(value));\n }\n const expanded = expandShorthand(cssProp, cssValue);\n if (expanded) {\n Object.assign(css, expanded);\n } else {\n css[cssProp] = normalizeZero(cssProp, cssValue);\n }\n }\n return css;\n}\n\n/**\n * Extract all StyleMappings from a style object (flat or responsive)\n */\nfunction collectStyleMappings(\n style: StyleObject | ResponsiveStyleObject | undefined\n): Array<{ property: string; mapping: StyleMapping }> {\n if (!style) return [];\n const result: Array<{ property: string; mapping: StyleMapping }> = [];\n\n if (isResponsiveStyle(style)) {\n // Only collect from base \u2014 mappings apply across breakpoints\n const base = (style as ResponsiveStyleObject).base;\n if (base) {\n for (const [prop, value] of Object.entries(base)) {\n if (isStyleMapping(value)) {\n result.push({ property: prop, mapping: value });\n }\n }\n }\n } else {\n for (const [prop, value] of Object.entries(style)) {\n if (isStyleMapping(value)) {\n result.push({ property: prop, mapping: value });\n }\n }\n }\n return result;\n}\n\n/**\n * Map interactive style postfix to a Webflow pseudo-state.\n * Order matters \u2014 longer suffixes (`:focus-visible`, `:focus-within`,\n * `:nth-child(odd)`) must be tested before their substring matches.\n */\nexport function postfixToPseudoState(postfix: string): WebflowPseudoState | null {\n // Pseudo-class style: ':hover', ':focus-visible', etc.\n if (postfix.includes(':focus-visible')) return 'focus-visible';\n if (postfix.includes(':focus-within')) return 'focus-within';\n if (postfix.includes(':nth-child(odd)')) return 'nth-child(odd)';\n if (postfix.includes(':nth-child(even)')) return 'nth-child(even)';\n if (postfix.includes(':first-child')) return 'first-child';\n if (postfix.includes(':last-child')) return 'last-child';\n if (postfix.includes(':placeholder')) return 'placeholder';\n if (postfix.includes(':empty')) return 'empty';\n if (postfix.includes(':before')) return 'before';\n if (postfix.includes(':after')) return 'after';\n if (postfix.includes(':hover')) return 'hover';\n if (postfix.includes(':focus')) return 'focus';\n if (postfix.includes(':active')) return 'active';\n if (postfix.includes(':visited')) return 'visited';\n if (postfix.includes(':pressed')) return 'pressed';\n // Pseudo-element style: '::before', '::after', '::placeholder'\n if (postfix.includes('::before')) return 'before';\n if (postfix.includes('::after')) return 'after';\n if (postfix.includes('::placeholder')) return 'placeholder';\n return null;\n}\n\n/**\n * Whether an interactive-styles rule fits Webflow's class-system surface.\n * \"Yes\" means: empty `prefix`, a known pseudo-state `postfix`, and a\n * non-responsive `style` (no breakpoint subdivision). Webflow's\n * `Style.setProperties({ pseudo })` covers exactly this case.\n *\n * Anything else (descendant selectors via `prefix`, class-style postfixes\n * like `.is-open`, responsive pseudos that need media queries) gets routed\n * to the manual-paste `interactiveCss` bundle via `generateInteractiveCSS`.\n */\nexport function isWebflowHandledRule(rule: InteractiveStyleRule): boolean {\n if (rule.prefix && rule.prefix.trim().length > 0) return false;\n if (!rule.postfix) return false;\n if (postfixToPseudoState(rule.postfix) === null) return false;\n const s = rule.style as ResponsiveStyleObject;\n if (!s || typeof s !== 'object') return false;\n const responsiveKeys = Object.keys(s).filter((k) => k !== 'base');\n return responsiveKeys.length === 0;\n}\n\n/**\n * Pick the Webflow breakpoint tier closest to a Meno breakpoint by its\n * max-width threshold. Meno's responsive cascade is max-width based, and\n * Webflow's tiers below `main` are also max-width \u2014 so we map the threshold\n * into Webflow's bucket.\n *\n * Webflow tiers (max-width values per Webflow's defaults):\n * tiny < 480, small 480-767, medium 768-991, main 992-1279,\n * large 1280-1439, xl 1440-1919, xxl \u2265 1920.\n */\nfunction widthToWebflowBreakpoint(maxWidthPx: number): WebflowBreakpoint {\n if (maxWidthPx < 480) return 'tiny';\n if (maxWidthPx < 768) return 'small';\n if (maxWidthPx < 992) return 'medium';\n if (maxWidthPx < 1280) return 'main';\n if (maxWidthPx < 1440) return 'large';\n if (maxWidthPx < 1920) return 'xl';\n return 'xxl';\n}\n\n/**\n * Resolve a Meno breakpoint name to its Webflow tier. The two well-known\n * names (`tablet`, `mobile`) map to fixed tiers; custom names route by their\n * configured numeric width via `widthToWebflowBreakpoint`. Defaults if a\n * project's breakpoints config omits the entry.\n */\nfunction menoBreakpointToWebflow(\n bpName: string,\n breakpoints: BreakpointConfig\n): WebflowBreakpoint {\n if (bpName === 'tablet') return 'medium';\n if (bpName === 'mobile') return 'small';\n const entry = breakpoints[bpName];\n if (entry && typeof entry.breakpoint === 'number') {\n return widthToWebflowBreakpoint(entry.breakpoint);\n }\n // Unknown name with no width info \u2014 default to `main` (no-op).\n return 'main';\n}\n\n/**\n * Merge a CSS map into the breakpoints record on a WebflowStyleClass under\n * the given Webflow tier, layering on top of anything already there.\n */\nfunction mergeIntoBreakpoint(\n cls: WebflowStyleClass,\n tier: WebflowBreakpoint,\n css: CSSProperties\n): void {\n if (!cls.breakpoints) cls.breakpoints = {};\n cls.breakpoints[tier] = { ...cls.breakpoints[tier], ...css };\n}\n\n/** Convert a kebab-case CSS property to camelCase for scale-category lookup. */\nfunction kebabToCamel(s: string): string {\n return s.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/**\n * For each scalable property in the class's base map, fill in auto-scaled\n * values at every Meno breakpoint that doesn't already carry an explicit\n * value for that property. Mirrors what Meno's runtime CSS generator does\n * for utility classes, so the Webflow site renders the same numbers per\n * breakpoint as the Meno preview.\n *\n * Skips values that still contain `var(--\u2026)` \u2014 the variable-aware pass in\n * `nodeToWebflow` handles those before this runs (it expands per-breakpoint\n * variable values into authored breakpoint entries, which take precedence\n * over global category scaling here).\n */\nexport function applyAutoScaling(\n cls: WebflowStyleClass,\n breakpoints: BreakpointConfig,\n responsiveScales: ResponsiveScales | undefined\n): void {\n if (!responsiveScales?.enabled) return;\n const baseRef = responsiveScales.baseReference || 16;\n\n for (const [prop, baseValue] of Object.entries(cls.base)) {\n if (!baseValue || baseValue.includes('var(--')) continue;\n const camelProp = kebabToCamel(prop) as CSSPropertyType;\n\n for (const [bpName, bpEntry] of Object.entries(breakpoints)) {\n if (!bpEntry) continue;\n const scale = getScaleMultiplier(responsiveScales, camelProp, bpName);\n if (scale === null) continue;\n const scaled = scalePropertyValue(baseValue, baseRef, scale);\n if (scaled === null || scaled === baseValue) continue;\n\n const tier = menoBreakpointToWebflow(bpName, breakpoints);\n if (!cls.breakpoints) cls.breakpoints = {};\n const bucket = cls.breakpoints[tier] || {};\n // Author override wins \u2014 only fill missing entries.\n if (bucket[prop] !== undefined) continue;\n bucket[prop] = scaled;\n cls.breakpoints[tier] = bucket;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main Mapper\n// ---------------------------------------------------------------------------\n\nexport interface StyleMapperResult {\n /** The primary style class for this element */\n primaryClass: WebflowStyleClass;\n /**\n * Combo classes carrying *only* the deltas for the current instance's\n * non-default StyleMapping prop values. Already filtered by the mapper \u2014\n * the caller attaches every entry to the element verbatim.\n */\n comboClasses: WebflowStyleClass[];\n}\n\nexport interface MapStylesOptions {\n /**\n * Resolved props for the current component instance. Only the value the\n * mapping actually resolves to (`instanceProps[mapping.prop]`) becomes a\n * combo on this element; other values are ignored. When omitted, no\n * combos are emitted (page elements without a prop context).\n */\n instanceProps?: Record<string, unknown>;\n /**\n * Default values from the enclosing component's interface. When provided,\n * each StyleMapping's default-value entry is baked into `primaryClass.base`\n * so the primary represents the default-prop visual; combos cover only the\n * non-default deltas. Omit for page-level elements (defaults unavailable).\n */\n componentDefaults?: Record<string, unknown>;\n /**\n * Suffix appended to combo class names so two placements that resolve their\n * `var(--\u2026)` refs against different ancestor themes occupy distinct map\n * slots in `ctx.styleClasses`. Without this, the default theme's combo and a\n * non-default theme's combo collapse onto the same name and the last-written\n * one wins \u2014 silently corrupting whichever placement was processed earlier.\n * Caller passes e.g. `'-theme-dark'`; empty/undefined means default theme,\n * no suffix added. Caller is responsible for sanitizing the theme name.\n */\n themeSuffix?: string;\n}\n\n/**\n * Convert Meno element styles to Webflow style classes.\n *\n * @param className - Element class name (e.g., \"c_navigation_hamburger\")\n * @param style - Element's responsive style object\n * @param interactiveStyles - Element's interactive (hover/focus/etc.) styles\n * @param breakpoints - Project breakpoint configuration\n * @param responsiveScales - When `enabled`, auto-fill scaled per-breakpoint\n * values for scalable properties not explicitly authored at that\n * breakpoint (mirrors Meno's runtime CSS generator).\n * @param options - Instance-aware combo emission. See `MapStylesOptions`.\n */\nexport function mapStylesToWebflow(\n className: string,\n style: StyleObject | ResponsiveStyleObject | undefined,\n interactiveStyles: InteractiveStyles | undefined,\n breakpoints: BreakpointConfig,\n responsiveScales?: ResponsiveScales,\n options?: MapStylesOptions\n): StyleMapperResult {\n const instanceProps = options?.instanceProps;\n const componentDefaults = options?.componentDefaults;\n const themeSuffix = options?.themeSuffix ?? '';\n // Convert underscores to dashes for Webflow class naming convention\n const webflowClassName = className.replace(/_/g, '-');\n\n const primaryClass: WebflowStyleClass = {\n name: webflowClassName,\n base: {},\n };\n\n // --- Base + breakpoint styles ---\n // Meno's `base` is the desktop default \u2192 Webflow's `main` tier (set as\n // `primaryClass.base` so the consumer writes it without a breakpoint\n // option). Named tiers (`tablet`, `mobile`) and custom breakpoints route\n // to Webflow tiers via `menoBreakpointToWebflow`.\n if (style) {\n if (isResponsiveStyle(style)) {\n const responsive = style as ResponsiveStyleObject;\n\n if (responsive.base) {\n primaryClass.base = styleObjectToCSS(responsive.base);\n }\n\n for (const [bpName, bpStyle] of Object.entries(responsive)) {\n if (!bpStyle || bpName === 'base') continue;\n const css = styleObjectToCSS(bpStyle);\n if (Object.keys(css).length === 0) continue;\n const tier = menoBreakpointToWebflow(bpName, breakpoints);\n mergeIntoBreakpoint(primaryClass, tier, css);\n }\n } else {\n // Flat style object \u2014 treat as base/main.\n primaryClass.base = styleObjectToCSS(style as StyleObject);\n }\n }\n\n // --- Interactive styles (hover, focus, \u2026) ---\n // Pseudo-state postfixes with empty prefix and non-responsive ruleStyle go\n // to `primaryClass.pseudoStates` so Webflow's class system applies them via\n // `Style.setProperties({ pseudo })`. Anything else (prefix-built selectors,\n // class-style postfixes, breakpoint-divided pseudos) is collected into\n // `interactiveCss` server-side via `generateInteractiveCSS` \u2014 see\n // `buildWebflow.ts` and `isWebflowHandledRule` below.\n if (interactiveStyles && interactiveStyles.length > 0) {\n for (const rule of interactiveStyles) {\n if (!isWebflowHandledRule(rule)) continue;\n\n const baseProps: CSSProperties = isResponsiveStyle(rule.style as StyleObject | ResponsiveStyleObject)\n ? styleObjectToCSS(((rule.style as ResponsiveStyleObject).base) || {})\n : styleObjectToCSS(rule.style as StyleObject);\n\n // Skip empty rules \u2014 writing an empty pseudoStates entry triggers a\n // destructive wipe in `applyStyleScope` on re-import (it diffs\n // `existing` against `next={}` and removes every property).\n if (Object.keys(baseProps).length === 0) continue;\n\n const pseudoState = postfixToPseudoState(rule.postfix!);\n if (!pseudoState) continue;\n\n if (!primaryClass.pseudoStates) primaryClass.pseudoStates = {};\n primaryClass.pseudoStates[pseudoState] = {\n ...primaryClass.pseudoStates[pseudoState],\n ...baseProps,\n };\n }\n }\n\n // --- Default-prop bake + single consolidated combo for the instance ---\n // Webflow combo classes only make sense as deltas: the primary carries the\n // default-prop visual; one combo per element holds the merged deltas for\n // every non-default StyleMapping prop value the instance authored. Folding\n // every mapped delta into one combo (rather than one combo per prop) means\n // each element wears exactly one extra class regardless of how many props\n // its component declares \u2014 simpler in the Webflow Designer and avoids\n // fan-out where two unrelated instances accidentally share a delta combo.\n const comboClasses: WebflowStyleClass[] = [];\n const mappings = collectStyleMappings(style);\n\n const comboCss: CSSProperties = {};\n const comboNameParts: string[] = [];\n\n for (const { property, mapping } of mappings) {\n const defaultValue = componentDefaults?.[mapping.prop];\n const defaultKey = defaultValue != null ? String(defaultValue) : undefined;\n\n // Bake the default-value resolution into the primary class's base so the\n // primary stands on its own for default-prop instances. Values authored\n // outside the mapping (declared on `style.fontSize` directly) already\n // landed in `primaryClass.base` via `styleObjectToCSS`.\n if (defaultKey !== undefined && defaultKey in mapping.values) {\n const defaultCss = mappingValueToCSS(property, mapping.values[defaultKey]);\n if (defaultCss) {\n // StyleMapping bakes feed into the primary's `main` tier (its `base`),\n // matching how `styleObjectToCSS` handles non-mapped properties.\n primaryClass.base = { ...primaryClass.base, ...defaultCss };\n }\n }\n\n if (!instanceProps) continue;\n const instanceValue = instanceProps[mapping.prop];\n if (instanceValue == null) continue;\n const instanceKey = String(instanceValue);\n if (instanceKey === defaultKey) continue; // covered by primary\n if (!(instanceKey in mapping.values)) continue; // unknown value\n const css = mappingValueToCSS(property, mapping.values[instanceKey]);\n if (!css) continue;\n\n Object.assign(comboCss, css);\n const part = `${sanitizeClassName(mapping.prop)}-${sanitizeClassName(instanceKey)}`;\n // Same prop appears once per mapping (e.g. `version` on both\n // `backgroundColor` and `color` Button mappings) \u2014 dedupe so the combo\n // name stays `is-version-secondary` rather than repeating the segment.\n if (!comboNameParts.includes(part)) comboNameParts.push(part);\n }\n\n if (comboNameParts.length > 0 && Object.keys(comboCss).length > 0) {\n // Sort so different declaration orders of the same prop set produce the\n // same combo name \u2014 instances with identical variants share one class.\n comboNameParts.sort();\n comboClasses.push({\n name: `is-${comboNameParts.join('-')}${themeSuffix}`,\n base: comboCss,\n comboParent: webflowClassName,\n });\n }\n\n // --- Auto-scaling: fill in scaled values at each Meno breakpoint for any\n // scalable base property the author hasn't already overridden. Variable\n // refs (`var(--\u2026)`) are skipped here \u2014 `nodeToWebflow` expands them with\n // breakpoint awareness before this runs, so authored breakpoint values\n // already capture the variable's per-breakpoint scaling.\n applyAutoScaling(primaryClass, breakpoints, responsiveScales);\n for (const combo of comboClasses) {\n applyAutoScaling(combo, breakpoints, responsiveScales);\n }\n\n return { primaryClass, comboClasses };\n}\n\n/**\n * Convert a single StyleMapping value (already looked up from `mapping.values`)\n * into a CSSProperties entry, mirroring `styleObjectToCSS`'s unit handling\n * and shorthand expansion. Returns `null` when the value is empty/missing.\n */\nfunction mappingValueToCSS(\n property: string,\n rawValue: string | number | undefined | null\n): CSSProperties | null {\n if (rawValue === '' || rawValue === undefined || rawValue === null) return null;\n const cssProp = toKebabCase(property);\n const cssValueStr = typeof rawValue === 'number'\n ? (UNITLESS_PROPERTIES.has(cssProp) ? String(rawValue) : `${rawValue}px`)\n : maybeWrapColorVar(property, String(rawValue));\n return expandShorthand(cssProp, cssValueStr) ?? { [cssProp]: normalizeZero(cssProp, cssValueStr) };\n}\n\n/**\n * Sanitize a string for use as a CSS class name segment\n */\nexport function sanitizeClassName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/**\n * Build a single combo class from a component instance's style /\n * interactiveStyles overrides \u2014 the `acceptsStyles` analogue of the\n * prop-mapped combo in `mapStylesToWebflow`.\n *\n * Every override the instance authored \u2014 flat or responsive base values,\n * per-breakpoint values, Webflow-handled pseudo-state values \u2014 is folded\n * into one combo's `.base` / `.breakpoints` / `.pseudoStates`. The caller\n * supplies a stable name (typically derived from the instance's outer\n * location so two distinct instances don't collide) and the body root's\n * primary class for `comboParent`. Returns `null` if no overrides survive\n * the filters.\n */\nexport function buildInstanceStyleCombo(\n comboName: string,\n rootClassName: string,\n style: StyleObject | ResponsiveStyleObject | undefined,\n interactiveStyles: InteractiveStyles | undefined,\n breakpoints: BreakpointConfig,\n responsiveScales?: ResponsiveScales,\n): WebflowStyleClass | null {\n const base: CSSProperties = {};\n const bps: Partial<Record<WebflowBreakpoint, CSSProperties>> = {};\n const pseudos: Partial<Record<WebflowPseudoState, CSSProperties>> = {};\n\n if (style) {\n if (isResponsiveStyle(style)) {\n const responsive = style as ResponsiveStyleObject;\n if (responsive.base) Object.assign(base, styleObjectToCSS(responsive.base));\n for (const [bpName, bpStyle] of Object.entries(responsive)) {\n if (!bpStyle || bpName === 'base') continue;\n const css = styleObjectToCSS(bpStyle);\n if (Object.keys(css).length === 0) continue;\n const tier = menoBreakpointToWebflow(bpName, breakpoints);\n bps[tier] = { ...bps[tier], ...css };\n }\n } else {\n Object.assign(base, styleObjectToCSS(style as StyleObject));\n }\n }\n\n if (interactiveStyles && interactiveStyles.length > 0) {\n for (const rule of interactiveStyles) {\n if (!isWebflowHandledRule(rule)) continue;\n const ruleStyle = rule.style as StyleObject | ResponsiveStyleObject;\n const flat = isResponsiveStyle(ruleStyle)\n ? ((ruleStyle as ResponsiveStyleObject).base as StyleObject | undefined)\n : (ruleStyle as StyleObject);\n if (!flat) continue;\n const css = styleObjectToCSS(flat);\n if (Object.keys(css).length === 0) continue;\n const pseudo = postfixToPseudoState(rule.postfix!);\n if (!pseudo) continue;\n pseudos[pseudo] = { ...pseudos[pseudo], ...css };\n }\n }\n\n if (\n Object.keys(base).length === 0\n && Object.keys(bps).length === 0\n && Object.keys(pseudos).length === 0\n ) return null;\n\n const cls: WebflowStyleClass = {\n name: comboName,\n base,\n comboParent: rootClassName,\n };\n if (Object.keys(bps).length > 0) cls.breakpoints = bps;\n if (Object.keys(pseudos).length > 0) cls.pseudoStates = pseudos;\n applyAutoScaling(cls, breakpoints, responsiveScales);\n return cls;\n}\n", "/**\n * Webflow Designer Extension template wrapper.\n *\n * The Webflow Designer injects the `webflow` API global only when extension\n * HTML is wrapped in a template fetched from `webflow-ext.com`. This module\n * fetches the template once per process, caches it, then splices the\n * extension's <head>/<body> content into the `{{ui}}` placeholder.\n *\n * Used by both the studio's mounted `/webflow-extension/*` route and the\n * standalone serve.ts on port 1337, so they stay in sync automatically.\n */\n\nimport { readFile } from 'fs/promises';\n\nlet cachedTemplate: string | null = null;\n\nasync function getWebflowTemplate(appName: string): Promise<string> {\n if (cachedTemplate) return cachedTemplate;\n const url = `https://webflow-ext.com/template/v2?name=${encodeURIComponent(appName)}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch Webflow template: ${res.status}`);\n cachedTemplate = await res.text();\n return cachedTemplate;\n}\n\n/**\n * Wrap extension HTML in the Webflow Designer template.\n * `manifestPath` points to the extension's `webflow.json` \u2014 its `name` field\n * is forwarded as the `?name=` query param to webflow-ext.com.\n *\n * On any failure (manifest read, template fetch) we log a warning and return\n * the raw HTML, matching the prior behavior of the two duplicate copies.\n */\nexport async function wrapInWebflowTemplate(html: string, manifestPath: string): Promise<string> {\n try {\n const manifest = JSON.parse(await readFile(manifestPath, 'utf-8'));\n const template = await getWebflowTemplate(manifest.name || 'Meno Import');\n\n const headMatch = html.match(/<head[^>]*>([\\s\\S]*?)<\\/head>/i);\n const bodyMatch = html.match(/<body[^>]*>([\\s\\S]*?)<\\/body>/i);\n const headContent = headMatch ? headMatch[1] : '';\n const bodyContent = bodyMatch ? bodyMatch[1] : '';\n\n return template.replace('{{ui}}', headContent + bodyContent);\n } catch (err: any) {\n console.warn('Could not fetch Webflow wrapper template:', err.message);\n return html;\n }\n}\n", "/**\n * meno-core/server exports\n * Core server-side utilities for SSR and read APIs\n * Does NOT include editor-specific routes (that's in @meno/studio)\n */\n\n// Server factory\nexport { createServer, type ServerConfig } from './createServer';\n\n// SSR Rendering\nexport * from './ssrRenderer';\n\n// Build error overlay for static server\nexport { generateBuildErrorPage, type BuildError, type BuildErrorsData } from './ssr/buildErrorOverlay';\n\n// Services\nexport { PageService } from './services/pageService';\nexport { ComponentService, type ComponentInfo } from './services/componentService';\nexport { CMSService, type ReferenceLocation } from './services/cmsService';\nexport { configService, ConfigService } from './services/configService';\nexport { ColorService, colorService } from './services/ColorService';\nexport { VariableService, variableService } from './services/VariableService';\nexport { EnumService, enumService } from './services/EnumService';\n\n// Providers\nexport { FileSystemPageProvider } from './providers/fileSystemPageProvider';\nexport { FileSystemCMSProvider } from './providers/fileSystemCMSProvider';\n\n// CMS interfaces\nexport type { CMSProvider, CMSSchemaInfo } from '../shared/interfaces/contentProvider';\n\n// Core routes\nexport { handleCoreApiRoutes, type CoreRouteContext } from './routes/api/core-routes';\n\n// CMS read routes (GET handlers)\nexport { handleCollectionsRoute, handleCollectionSchemaRoute, handleItemsRoute, handleItemRoute } from './routes/api/cms';\n\n// Route utilities\nexport { jsonResponse, errorResponse } from './routes/api/shared';\n\n// Note: Write route handlers moved to @meno/studio:\n// - handleSavePageRoute\n// - handleSaveComponentRoute, handleSaveComponentJavaScriptRoute, handleSaveComponentCSSRoute\n// - handleSaveConfigRoute, handleSaveColorsRoute\n// - handleCreateCollectionRoute, handleCreateItemRoute, handleUpdateItemRoute, handleDeleteItemRoute\n\n// WebSocket\nexport { WebSocketManager } from './websocketManager';\n\n// Page cache\nexport { PageCache } from './pageCache';\n\n// Project context\nexport * from './projectContext';\n\n// File watcher\nexport { FileWatcherService } from './services/fileWatcherService';\n\n// Migration\nexport { migrateTemplatesDirectory } from './migrateTemplates';\n\n// Static build\nexport { buildStaticPages } from '../../build-static';\n\n// Astro export\nexport { buildAstroProject } from '../../build-astro';\n\n// Webflow export\nexport { buildWebflowPayload, wrapInWebflowTemplate } from './webflow';\nexport type {\n WebflowExportPayload,\n WebflowPage,\n WebflowElement,\n WebflowStyleClass,\n} from './webflow';\n\n// Utilities\nexport * from './utils';\n\n// Middleware\nexport * from './middleware';\n\n// Font loader (legacy config loader for server entry points)\nexport { loadProjectConfig, resetFontConfig } from '../shared/fontLoader';\n\n// Constants\nexport { SERVE_PORT, SERVER_PORT, HMR_ROUTE, MAX_PORT_ATTEMPTS } from '../shared/constants';\n\n// CSS generators\nexport { generateVariablesCSS } from './cssGenerator';\n\n// Runtime abstraction\nexport * from './runtime';\n"],
5
+ "mappings": "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",
6
6
  "names": ["writeFile", "sanitized", "isStyleMapping", "isHtmlMapping", "isResponsiveStyle", "mappings", "hasTemplates", "DEFAULT_SIZES", "out", "escapeTemplateLiteral", "escapeJSX", "layoutImportPath", "escapeTemplateLiteral", "escapeJSX", "componentImportPath", "locale", "layoutImportPath", "isStyleMapping", "isResponsiveStyle", "hashContent", "escapeTemplateLiteral", "isCMSPage", "hashContent", "writeFile", "existsSync", "readdirSync", "join", "isStyleMapping", "isResponsiveStyle", "collectStyleMappings", "readFile", "join", "buildElementClass", "join", "readFile", "emitHtmlNode", "emitComponentInstance", "emitSlotMarker", "emitEmbedNode", "emitLinkNode", "emitListNode", "emitLocaleListNode", "singularize", "emitListNode", "singularize", "emitLocaleListNode", "buildElementClass", "scanJSONFiles", "existsSync", "readdirSync", "join", "isCMSPage", "readFile"]
7
7
  }