meno-core 1.0.53 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/.claude/settings.local.json +1 -3
  2. package/bin/cli.ts +66 -261
  3. package/build-astro.ts +150 -128
  4. package/dist/bin/cli.js +42 -185
  5. package/dist/bin/cli.js.map +2 -2
  6. package/dist/chunks/chunk-2AR55GYH.js +42 -0
  7. package/dist/chunks/chunk-2AR55GYH.js.map +7 -0
  8. package/dist/chunks/{chunk-JGWFTO6P.js → chunk-2IIQK7T3.js} +2624 -1389
  9. package/dist/chunks/chunk-2IIQK7T3.js.map +7 -0
  10. package/dist/chunks/chunk-4ZRU52J2.js +169 -0
  11. package/dist/chunks/chunk-4ZRU52J2.js.map +7 -0
  12. package/dist/chunks/{chunk-UB44F4Z2.js → chunk-5X4HCN7J.js} +5 -7
  13. package/dist/chunks/chunk-5X4HCN7J.js.map +7 -0
  14. package/dist/chunks/{chunk-WQFG7PAH.js → chunk-7CCVOL5M.js} +15 -19
  15. package/dist/chunks/chunk-7CCVOL5M.js.map +7 -0
  16. package/dist/chunks/{chunk-YBLHKYFF.js → chunk-AR7LHIFY.js} +8 -2
  17. package/dist/chunks/chunk-AR7LHIFY.js.map +7 -0
  18. package/dist/chunks/{chunk-O3NAGJP4.js → chunk-NUP7H7D3.js} +135 -41
  19. package/dist/chunks/chunk-NUP7H7D3.js.map +7 -0
  20. package/dist/chunks/{chunk-X754AHS5.js → chunk-QWTQZHG3.js} +194 -90
  21. package/dist/chunks/chunk-QWTQZHG3.js.map +7 -0
  22. package/dist/chunks/{chunk-H3GJ4H2U.js → chunk-XTKNX4FW.js} +216 -87
  23. package/dist/chunks/chunk-XTKNX4FW.js.map +7 -0
  24. package/dist/chunks/{fs-JGINUXGL.js → fs-G3ANWEFP.js} +2 -2
  25. package/dist/lib/client/index.js +1003 -475
  26. package/dist/lib/client/index.js.map +3 -3
  27. package/dist/lib/server/index.js +14393 -6371
  28. package/dist/lib/server/index.js.map +4 -4
  29. package/dist/lib/shared/index.js +342 -101
  30. package/dist/lib/shared/index.js.map +4 -4
  31. package/dist/lib/shared/richtext/index.js +1 -1
  32. package/dist/lib/test-utils/index.js +64 -80
  33. package/dist/lib/test-utils/index.js.map +2 -2
  34. package/entries/client-router.tsx +10 -8
  35. package/lib/client/ClientInitializer.ts +8 -8
  36. package/lib/client/ErrorBoundary.test.tsx +246 -186
  37. package/lib/client/ErrorBoundary.tsx +183 -132
  38. package/lib/client/componentRegistry.test.ts +96 -108
  39. package/lib/client/componentRegistry.ts +1 -3
  40. package/lib/client/contexts/ThemeContext.tsx +3 -2
  41. package/lib/client/core/ComponentBuilder.test.ts +663 -560
  42. package/lib/client/core/ComponentBuilder.ts +427 -155
  43. package/lib/client/core/ComponentRenderer.test.tsx +2 -4
  44. package/lib/client/core/ComponentRenderer.tsx +46 -33
  45. package/lib/client/core/builders/embedBuilder.ts +242 -54
  46. package/lib/client/core/builders/linkBuilder.ts +72 -45
  47. package/lib/client/core/builders/linkNodeBuilder.ts +79 -54
  48. package/lib/client/core/builders/listBuilder.ts +155 -89
  49. package/lib/client/core/builders/localeListBuilder.ts +97 -62
  50. package/lib/client/core/builders/types.ts +5 -5
  51. package/lib/client/core/cmsTemplateProcessor.ts +8 -9
  52. package/lib/client/elementRegistry.ts +3 -3
  53. package/lib/client/fontFamiliesService.test.ts +2 -10
  54. package/lib/client/fontFamiliesService.ts +3 -3
  55. package/lib/client/hmr/HMRManager.tsx +47 -30
  56. package/lib/client/hmrCssReload.ts +49 -14
  57. package/lib/client/hmrWebSocket.ts +14 -19
  58. package/lib/client/hooks/useColorVariables.test.ts +21 -21
  59. package/lib/client/hooks/useColorVariables.ts +23 -18
  60. package/lib/client/hooks/usePropertyAutocomplete.ts +4 -6
  61. package/lib/client/hooks/useVariables.ts +6 -4
  62. package/lib/client/hydration/HydrationUtils.test.ts +24 -25
  63. package/lib/client/hydration/HydrationUtils.ts +3 -4
  64. package/lib/client/i18nConfigService.test.ts +2 -7
  65. package/lib/client/i18nConfigService.ts +2 -2
  66. package/lib/client/meno-filter/MenoFilter.test.ts +47 -49
  67. package/lib/client/meno-filter/MenoFilter.ts +14 -15
  68. package/lib/client/meno-filter/bindings.ts +18 -43
  69. package/lib/client/meno-filter/init.ts +4 -4
  70. package/lib/client/meno-filter/renderer.ts +30 -32
  71. package/lib/client/meno-filter/script.generated.ts +1 -3
  72. package/lib/client/meno-filter/ui.ts +4 -6
  73. package/lib/client/meno-filter/updates.ts +18 -23
  74. package/lib/client/meno-filter/utils.ts +1 -1
  75. package/lib/client/navigation.test.ts +174 -178
  76. package/lib/client/navigation.ts +0 -1
  77. package/lib/client/responsiveStyleResolver.knownTokens.test.ts +71 -0
  78. package/lib/client/responsiveStyleResolver.test.ts +234 -232
  79. package/lib/client/responsiveStyleResolver.ts +74 -20
  80. package/lib/client/routing/RouteLoader.test.ts +24 -25
  81. package/lib/client/routing/RouteLoader.ts +27 -35
  82. package/lib/client/routing/Router.tsx +210 -153
  83. package/lib/client/scripts/ScriptExecutor.test.ts +157 -158
  84. package/lib/client/scripts/ScriptExecutor.ts +18 -36
  85. package/lib/client/services/PrefetchService.test.ts +3 -3
  86. package/lib/client/services/PrefetchService.ts +23 -29
  87. package/lib/client/styleProcessor.test.ts +9 -9
  88. package/lib/client/styleProcessor.ts +24 -15
  89. package/lib/client/styles/StyleInjector.test.ts +122 -115
  90. package/lib/client/styles/StyleInjector.ts +10 -7
  91. package/lib/client/styles/UtilityClassCollector.ts +62 -28
  92. package/lib/client/styles/cspNonce.test.ts +2 -5
  93. package/lib/client/templateEngine.test.ts +554 -488
  94. package/lib/client/templateEngine.ts +203 -73
  95. package/lib/client/theme.test.ts +1 -1
  96. package/lib/client/theme.ts +0 -1
  97. package/lib/client/utils/toast.ts +0 -1
  98. package/lib/server/__integration__/api-routes.test.ts +8 -4
  99. package/lib/server/__integration__/cms-integration.test.ts +1 -4
  100. package/lib/server/__integration__/server-lifecycle.test.ts +4 -5
  101. package/lib/server/__integration__/ssr-rendering.test.ts +47 -37
  102. package/lib/server/__integration__/static-assets.test.ts +3 -3
  103. package/lib/server/__integration__/test-helpers.ts +87 -74
  104. package/lib/server/ab/generateFunctions.ts +12 -10
  105. package/lib/server/astro/cmsPageEmitter.ts +26 -42
  106. package/lib/server/astro/componentEmitter.ts +35 -43
  107. package/lib/server/astro/cssCollector.ts +10 -26
  108. package/lib/server/astro/nodeToAstro.test.ts +1754 -34
  109. package/lib/server/astro/nodeToAstro.ts +232 -216
  110. package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +115 -119
  111. package/lib/server/astro/normalizeOrphanTemplateProps.ts +11 -18
  112. package/lib/server/astro/pageEmitter.ts +9 -13
  113. package/lib/server/astro/tailwindMapper.test.ts +10 -37
  114. package/lib/server/astro/tailwindMapper.ts +33 -40
  115. package/lib/server/astro/templateTransformer.ts +17 -20
  116. package/lib/server/createServer.ts +7 -19
  117. package/lib/server/cssGenerator.test.ts +35 -44
  118. package/lib/server/cssGenerator.ts +8 -19
  119. package/lib/server/fileWatcher.test.ts +164 -13
  120. package/lib/server/fileWatcher.ts +209 -124
  121. package/lib/server/index.ts +14 -17
  122. package/lib/server/jsonLoader.test.ts +39 -2
  123. package/lib/server/jsonLoader.ts +39 -34
  124. package/lib/server/middleware/cors.test.ts +21 -21
  125. package/lib/server/middleware/cors.ts +28 -4
  126. package/lib/server/middleware/errorHandler.test.ts +7 -5
  127. package/lib/server/middleware/errorHandler.ts +3 -8
  128. package/lib/server/middleware/index.ts +0 -1
  129. package/lib/server/middleware/logger.test.ts +10 -8
  130. package/lib/server/middleware/logger.ts +17 -29
  131. package/lib/server/migrateTemplates.ts +3 -3
  132. package/lib/server/pageCache.test.ts +76 -77
  133. package/lib/server/pageCache.ts +0 -1
  134. package/lib/server/projectContext.ts +5 -4
  135. package/lib/server/providers/fileSystemCMSProvider.test.ts +142 -99
  136. package/lib/server/providers/fileSystemCMSProvider.ts +62 -38
  137. package/lib/server/routes/api/cms.test.ts +26 -14
  138. package/lib/server/routes/api/cms.ts +9 -14
  139. package/lib/server/routes/api/colors.test.ts +2 -2
  140. package/lib/server/routes/api/components.ts +31 -35
  141. package/lib/server/routes/api/config.ts +3 -4
  142. package/lib/server/routes/api/core-routes.ts +49 -76
  143. package/lib/server/routes/api/enums.test.ts +2 -2
  144. package/lib/server/routes/api/functions.ts +9 -17
  145. package/lib/server/routes/api/index.ts +3 -6
  146. package/lib/server/routes/api/pages.ts +8 -11
  147. package/lib/server/routes/api/shared.test.ts +1 -1
  148. package/lib/server/routes/api/shared.ts +12 -9
  149. package/lib/server/routes/api/variables.test.ts +3 -5
  150. package/lib/server/routes/api/variables.ts +1 -1
  151. package/lib/server/routes/index.ts +25 -28
  152. package/lib/server/routes/pages.ts +35 -31
  153. package/lib/server/routes/static.ts +17 -6
  154. package/lib/server/runtime/bundler.ts +98 -61
  155. package/lib/server/runtime/fs.ts +16 -26
  156. package/lib/server/runtime/httpServer.ts +8 -12
  157. package/lib/server/services/ColorService.test.ts +3 -3
  158. package/lib/server/services/ColorService.ts +37 -29
  159. package/lib/server/services/EnumService.test.ts +4 -8
  160. package/lib/server/services/EnumService.ts +11 -3
  161. package/lib/server/services/VariableService.test.ts +8 -12
  162. package/lib/server/services/VariableService.ts +11 -3
  163. package/lib/server/services/cmsService.test.ts +158 -120
  164. package/lib/server/services/cmsService.ts +36 -146
  165. package/lib/server/services/componentService.test.ts +125 -45
  166. package/lib/server/services/componentService.ts +70 -46
  167. package/lib/server/services/configService.test.ts +22 -45
  168. package/lib/server/services/configService.ts +50 -27
  169. package/lib/server/services/fileWatcherService.ts +42 -8
  170. package/lib/server/services/index.ts +0 -1
  171. package/lib/server/services/pageService.test.ts +8 -10
  172. package/lib/server/services/pageService.ts +32 -18
  173. package/lib/server/ssr/attributeBuilder.ts +18 -8
  174. package/lib/server/ssr/buildErrorOverlay.ts +11 -12
  175. package/lib/server/ssr/clientDataInjector.ts +7 -21
  176. package/lib/server/ssr/cmsSSRProcessor.ts +4 -8
  177. package/lib/server/ssr/cssCollector.ts +1 -1
  178. package/lib/server/ssr/errorOverlay.test.ts +1 -1
  179. package/lib/server/ssr/errorOverlay.ts +3 -9
  180. package/lib/server/ssr/htmlGenerator.nonce.test.ts +9 -14
  181. package/lib/server/ssr/htmlGenerator.test.ts +120 -44
  182. package/lib/server/ssr/htmlGenerator.ts +126 -91
  183. package/lib/server/ssr/imageMetadata.test.ts +3 -1
  184. package/lib/server/ssr/imageMetadata.ts +27 -21
  185. package/lib/server/ssr/jsCollector.test.ts +8 -18
  186. package/lib/server/ssr/jsCollector.ts +3 -8
  187. package/lib/server/ssr/liveReloadIntegration.test.ts +76 -36
  188. package/lib/server/ssr/metaTagGenerator.ts +2 -2
  189. package/lib/server/ssr/ssrRenderer.branches.test.ts +1103 -0
  190. package/lib/server/ssr/ssrRenderer.test.ts +316 -256
  191. package/lib/server/ssr/ssrRenderer.ts +795 -243
  192. package/lib/server/ssrRenderer.test.ts +1048 -954
  193. package/lib/server/utils/jsonLineMapper.test.ts +28 -28
  194. package/lib/server/utils/jsonLineMapper.ts +7 -7
  195. package/lib/server/validateStyleCoverage.ts +18 -21
  196. package/lib/server/websocketManager.ts +28 -19
  197. package/lib/shared/attributeNodeUtils.test.ts +15 -15
  198. package/lib/shared/attributeNodeUtils.ts +5 -12
  199. package/lib/shared/breakpoints.test.ts +5 -5
  200. package/lib/shared/breakpoints.ts +4 -11
  201. package/lib/shared/cmsQuery.test.ts +81 -0
  202. package/lib/shared/cmsQuery.ts +92 -0
  203. package/lib/shared/cmsQueryParser.test.ts +50 -42
  204. package/lib/shared/cmsQueryParser.ts +60 -38
  205. package/lib/shared/colorConversions.ts +9 -9
  206. package/lib/shared/colorVariableUtils.test.ts +27 -5
  207. package/lib/shared/colorVariableUtils.ts +21 -12
  208. package/lib/shared/componentRefs.ts +1 -5
  209. package/lib/shared/constants.test.ts +3 -3
  210. package/lib/shared/constants.ts +8 -8
  211. package/lib/shared/cssGeneration.test.ts +285 -144
  212. package/lib/shared/cssGeneration.ts +217 -531
  213. package/lib/shared/cssNamedColors.ts +152 -30
  214. package/lib/shared/cssProperties.test.ts +69 -70
  215. package/lib/shared/cssProperties.ts +298 -114
  216. package/lib/shared/elementClassName.test.ts +109 -109
  217. package/lib/shared/elementClassName.ts +3 -3
  218. package/lib/shared/elementUtils.ts +12 -16
  219. package/lib/shared/errorLogger.test.ts +12 -12
  220. package/lib/shared/errorLogger.ts +2 -10
  221. package/lib/shared/errors.test.ts +2 -13
  222. package/lib/shared/errors.ts +2 -8
  223. package/lib/shared/expressionEvaluator.test.ts +145 -0
  224. package/lib/shared/expressionEvaluator.ts +52 -24
  225. package/lib/shared/fontLoader.test.ts +32 -18
  226. package/lib/shared/fontLoader.ts +2 -2
  227. package/lib/shared/friendlyError.ts +2 -3
  228. package/lib/shared/gradientUtils.test.ts +3 -7
  229. package/lib/shared/gradientUtils.ts +17 -14
  230. package/lib/shared/hrefRefs.test.ts +2 -2
  231. package/lib/shared/hrefRefs.ts +2 -10
  232. package/lib/shared/i18n.test.ts +4 -4
  233. package/lib/shared/i18n.ts +18 -38
  234. package/lib/shared/index.ts +27 -0
  235. package/lib/shared/inlineSvgStyleRules.ts +14 -13
  236. package/lib/shared/interactiveStyleMappings.test.ts +32 -54
  237. package/lib/shared/interactiveStyleMappings.ts +11 -24
  238. package/lib/shared/interactiveStyles.test.ts +165 -188
  239. package/lib/shared/interfaces/contentProvider.ts +1 -1
  240. package/lib/shared/itemTemplateUtils.test.ts +11 -17
  241. package/lib/shared/itemTemplateUtils.ts +27 -39
  242. package/lib/shared/jsonRepair.ts +16 -10
  243. package/lib/shared/libraryLoader.test.ts +21 -55
  244. package/lib/shared/libraryLoader.ts +7 -22
  245. package/lib/shared/linkUtils.ts +1 -1
  246. package/lib/shared/logger.test.ts +66 -0
  247. package/lib/shared/logger.ts +94 -0
  248. package/lib/shared/markdown.ts +25 -0
  249. package/lib/shared/netlifyLocale404.test.ts +179 -0
  250. package/lib/shared/netlifyLocale404.ts +110 -0
  251. package/lib/shared/nodeUtils.test.ts +28 -16
  252. package/lib/shared/nodeUtils.ts +76 -23
  253. package/lib/shared/pathArrayUtils.test.ts +1 -2
  254. package/lib/shared/pathArrayUtils.ts +1 -1
  255. package/lib/shared/pathSecurity.ts +2 -2
  256. package/lib/shared/pathUtils.test.ts +4 -6
  257. package/lib/shared/pathUtils.ts +42 -49
  258. package/lib/shared/paths/Path.test.ts +2 -2
  259. package/lib/shared/paths/Path.ts +0 -1
  260. package/lib/shared/paths/PathConverter.test.ts +1 -1
  261. package/lib/shared/paths/PathConverter.ts +17 -20
  262. package/lib/shared/paths/PathUtils.ts +13 -13
  263. package/lib/shared/paths/PathValidator.test.ts +2 -15
  264. package/lib/shared/paths/PathValidator.ts +12 -10
  265. package/lib/shared/paths/index.ts +1 -2
  266. package/lib/shared/permissions.test.ts +168 -0
  267. package/lib/shared/permissions.ts +162 -0
  268. package/lib/shared/propResolver.test.ts +240 -244
  269. package/lib/shared/propResolver.ts +15 -26
  270. package/lib/shared/pxToRem.test.ts +7 -6
  271. package/lib/shared/pxToRem.ts +2 -5
  272. package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +12 -6
  273. package/lib/shared/registry/ClientRegistry.ts +0 -2
  274. package/lib/shared/registry/ComponentRegistry.test.ts +46 -32
  275. package/lib/shared/registry/ComponentRegistry.ts +12 -9
  276. package/lib/shared/registry/NodeTypeDefinition.ts +16 -9
  277. package/lib/shared/registry/RegistryManager.ts +1 -2
  278. package/lib/shared/registry/SSRRegistry.ts +0 -2
  279. package/lib/shared/registry/createNodeType.ts +7 -9
  280. package/lib/shared/registry/defineNodeType.ts +2 -6
  281. package/lib/shared/registry/fieldPresets.ts +3 -1
  282. package/lib/shared/registry/index.ts +0 -1
  283. package/lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts +14 -15
  284. package/lib/shared/registry/nodeTypes/CustomNodeType.ts +103 -0
  285. package/lib/shared/registry/nodeTypes/EmbedNodeType.ts +18 -11
  286. package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +48 -19
  287. package/lib/shared/registry/nodeTypes/IslandNodeType.ts +129 -0
  288. package/lib/shared/registry/nodeTypes/LinkNodeType.ts +21 -19
  289. package/lib/shared/registry/nodeTypes/ListNodeType.ts +117 -77
  290. package/lib/shared/registry/nodeTypes/LocaleListNodeType.ts +27 -21
  291. package/lib/shared/registry/nodeTypes/MarkdownNodeType.ts +78 -0
  292. package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +12 -8
  293. package/lib/shared/registry/nodeTypes/index.ts +26 -3
  294. package/lib/shared/responsiveScaling.test.ts +16 -34
  295. package/lib/shared/responsiveScaling.ts +61 -42
  296. package/lib/shared/responsiveStyleUtils.test.ts +0 -1
  297. package/lib/shared/responsiveStyleUtils.ts +11 -13
  298. package/lib/shared/richtext/htmlToTiptap.test.ts +139 -130
  299. package/lib/shared/richtext/htmlToTiptap.ts +2 -4
  300. package/lib/shared/richtext/tiptapToHtml.test.ts +5 -6
  301. package/lib/shared/richtext/types.ts +1 -8
  302. package/lib/shared/slugTranslator.test.ts +13 -13
  303. package/lib/shared/slugTranslator.ts +12 -16
  304. package/lib/shared/slugify.ts +9 -15
  305. package/lib/shared/styleNodeUtils.test.ts +8 -8
  306. package/lib/shared/styleNodeUtils.ts +18 -20
  307. package/lib/shared/styleUtils.test.ts +87 -61
  308. package/lib/shared/styleUtils.ts +5 -6
  309. package/lib/shared/themeDefaults.test.ts +11 -14
  310. package/lib/shared/themeDefaults.ts +3 -4
  311. package/lib/shared/tree/PathBuilder.test.ts +63 -145
  312. package/lib/shared/tree/PathBuilder.ts +59 -47
  313. package/lib/shared/treePathUtils.test.ts +51 -12
  314. package/lib/shared/treePathUtils.ts +91 -60
  315. package/lib/shared/types/api.ts +105 -8
  316. package/lib/shared/types/cms.test.ts +34 -0
  317. package/lib/shared/types/cms.ts +90 -34
  318. package/lib/shared/types/comment.ts +49 -16
  319. package/lib/shared/types/components.ts +51 -25
  320. package/lib/shared/types/errors.test.ts +1 -6
  321. package/lib/shared/types/errors.ts +3 -7
  322. package/lib/shared/types/experiments.ts +28 -28
  323. package/lib/shared/types/index.ts +25 -2
  324. package/lib/shared/types/permissions.ts +139 -0
  325. package/lib/shared/types/styles.ts +0 -1
  326. package/lib/shared/types/variables.test.ts +4 -13
  327. package/lib/shared/types/variables.ts +51 -30
  328. package/lib/shared/types.ts +1 -2
  329. package/lib/shared/utilityClassConfig.ts +751 -321
  330. package/lib/shared/utilityClassMapper.durability.test.ts +117 -0
  331. package/lib/shared/utilityClassMapper.test.ts +433 -95
  332. package/lib/shared/utilityClassMapper.ts +322 -249
  333. package/lib/shared/utilityClassNames.test.ts +38 -0
  334. package/lib/shared/utilityClassNames.ts +458 -0
  335. package/lib/shared/utils.test.ts +2 -10
  336. package/lib/shared/utils.ts +19 -10
  337. package/lib/shared/validation/cmsValidators.ts +2 -1
  338. package/lib/shared/validation/commentValidators.test.ts +53 -0
  339. package/lib/shared/validation/commentValidators.ts +12 -1
  340. package/lib/shared/validation/index.ts +1 -0
  341. package/lib/shared/validation/permissionsValidators.test.ts +49 -0
  342. package/lib/shared/validation/permissionsValidators.ts +49 -0
  343. package/lib/shared/validation/propValidator.test.ts +19 -21
  344. package/lib/shared/validation/propValidator.ts +13 -18
  345. package/lib/shared/validation/schemas.test.ts +64 -32
  346. package/lib/shared/validation/schemas.ts +616 -345
  347. package/lib/shared/validation/validators.test.ts +3 -8
  348. package/lib/shared/validation/validators.ts +89 -68
  349. package/lib/shared/viewportUnits.integration.test.ts +14 -10
  350. package/lib/shared/viewportUnits.test.ts +24 -23
  351. package/lib/shared/viewportUnits.ts +12 -5
  352. package/lib/test-utils/dom-setup.ts +1 -1
  353. package/lib/test-utils/factories/ConsoleMockFactory.ts +10 -14
  354. package/lib/test-utils/factories/DomMockFactory.ts +17 -23
  355. package/lib/test-utils/factories/EventMockFactory.ts +7 -13
  356. package/lib/test-utils/factories/FetchMockFactory.ts +39 -57
  357. package/lib/test-utils/factories/ServerMockFactory.ts +6 -10
  358. package/lib/test-utils/factories/StoreMockFactory.ts +18 -29
  359. package/lib/test-utils/fixtures.ts +45 -45
  360. package/lib/test-utils/helpers/asyncHelpers.test.ts +15 -18
  361. package/lib/test-utils/helpers/asyncHelpers.ts +11 -20
  362. package/lib/test-utils/helpers.ts +1 -5
  363. package/lib/test-utils/index.ts +0 -4
  364. package/lib/test-utils/mockFactories.ts +13 -19
  365. package/lib/test-utils/mocks.ts +6 -4
  366. package/package.json +3 -5
  367. package/scripts/build-for-publish.mjs +2 -4
  368. package/scripts/build-meno-filter.ts +4 -7
  369. package/tsconfig.json +1 -0
  370. package/vite.config.ts +4 -4
  371. package/build-next.ts +0 -1361
  372. package/build-static.test.ts +0 -424
  373. package/build-static.ts +0 -1074
  374. package/dist/build-static.js +0 -36
  375. package/dist/chunks/chunk-2MHDV5BF.js +0 -251
  376. package/dist/chunks/chunk-2MHDV5BF.js.map +0 -7
  377. package/dist/chunks/chunk-AZQYF6KE.js +0 -559
  378. package/dist/chunks/chunk-AZQYF6KE.js.map +0 -7
  379. package/dist/chunks/chunk-GZHGVVW3.js +0 -322
  380. package/dist/chunks/chunk-GZHGVVW3.js.map +0 -7
  381. package/dist/chunks/chunk-H3GJ4H2U.js.map +0 -7
  382. package/dist/chunks/chunk-I7YIGZXT.js +0 -467
  383. package/dist/chunks/chunk-I7YIGZXT.js.map +0 -7
  384. package/dist/chunks/chunk-IGYR22T6.js +0 -6192
  385. package/dist/chunks/chunk-IGYR22T6.js.map +0 -7
  386. package/dist/chunks/chunk-JGP5A3Y5.js +0 -1136
  387. package/dist/chunks/chunk-JGP5A3Y5.js.map +0 -7
  388. package/dist/chunks/chunk-JGWFTO6P.js.map +0 -7
  389. package/dist/chunks/chunk-O3NAGJP4.js.map +0 -7
  390. package/dist/chunks/chunk-QB2LNO4W.js +0 -77
  391. package/dist/chunks/chunk-QB2LNO4W.js.map +0 -7
  392. package/dist/chunks/chunk-R6XHAFBF.js +0 -3821
  393. package/dist/chunks/chunk-R6XHAFBF.js.map +0 -7
  394. package/dist/chunks/chunk-UB44F4Z2.js.map +0 -7
  395. package/dist/chunks/chunk-WQFG7PAH.js.map +0 -7
  396. package/dist/chunks/chunk-X754AHS5.js.map +0 -7
  397. package/dist/chunks/chunk-YBLHKYFF.js.map +0 -7
  398. package/dist/chunks/configService-R3OGU2UD.js +0 -13
  399. package/dist/chunks/configService-R3OGU2UD.js.map +0 -7
  400. package/dist/chunks/constants-STK2YBIW.js +0 -46
  401. package/dist/chunks/constants-STK2YBIW.js.map +0 -7
  402. package/dist/chunks/fs-JGINUXGL.js.map +0 -7
  403. package/dist/entries/server-router.js +0 -67
  404. package/dist/entries/server-router.js.map +0 -7
  405. package/entries/server-router.tsx +0 -81
  406. package/lib/server/providers/fileSystemPageProvider.ts +0 -160
  407. package/lib/server/webflow/buildWebflow.ts +0 -635
  408. package/lib/server/webflow/index.ts +0 -23
  409. package/lib/server/webflow/nodeToWebflow.test.ts +0 -3170
  410. package/lib/server/webflow/nodeToWebflow.ts +0 -2435
  411. package/lib/server/webflow/styleMapper.test.ts +0 -389
  412. package/lib/server/webflow/styleMapper.ts +0 -695
  413. package/lib/server/webflow/templateWrapper.ts +0 -49
  414. package/lib/server/webflow/types.ts +0 -396
  415. /package/dist/{build-static.js.map → chunks/fs-G3ANWEFP.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../lib/server/draftPageStore.ts", "../../../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/normalizeOrphanTemplateProps.ts", "../../../lib/server/astro/cmsPageEmitter.ts", "../../../lib/server/astro/cssCollector.ts", "../../../build-next.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 * DraftPageStore\n *\n * Holds ephemeral, unsaved versions of pages that the studio is currently\n * editing. The SSR page route consults this store before falling back to\n * the on-disk content, which lets external browser tabs see the editor's\n * in-flight edits without anything being persisted.\n *\n * Drafts are cleared when the user saves the page to disk (so the next\n * request reads the fresh disk version), and otherwise live only as long\n * as the dev-server process.\n */\nexport class DraftPageStore {\n private drafts = new Map<string, string>();\n\n /**\n * Store a draft for a page path. The value is the raw JSON string the\n * SSR pipeline expects, matching PageService.getPage()'s contract.\n */\n set(path: string, content: string): void {\n this.drafts.set(path, content);\n }\n\n /**\n * Get the current draft string for a page path, if any.\n */\n get(path: string): string | undefined {\n return this.drafts.get(path);\n }\n\n /**\n * Drop the draft for a specific path. Called when the page is saved to\n * disk so subsequent renders read the persisted version.\n */\n clear(path: string): void {\n this.drafts.delete(path);\n }\n\n /**\n * Drop every draft. Used on shutdown / project switch.\n */\n clearAll(): void {\n this.drafts.clear();\n }\n\n has(path: string): boolean {\n return this.drafts.has(path);\n }\n}\n", "/**\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 { tiptapToHtml } from \"./lib/shared/richtext/tiptapToHtml\";\nimport { isTiptapDocument } from \"./lib/shared/richtext/types\";\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 { CMS_DRAFT_SUFFIX } from \"./lib/shared/pathSecurity\";\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 { normalizeOrphanTemplateProps } from \"./lib/server/astro/normalizeOrphanTemplateProps\";\nimport { emitCMSPage, CMS_SLUG_PLACEHOLDER } 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 // Rich-text is serialized to an HTML string at item-copy time (see the\n // CMS collection emission below), so by the time Astro validates it the\n // value is a string (or an i18n object of strings). Support both.\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 * Serialize a single rich-text field value to an HTML string. Handles plain\n * Tiptap doc objects, the `{ html: \"...\" }` marker shape, i18n-wrapped values\n * ({ _i18n: true, en: <doc|string>, ... }), and already-serialized strings.\n */\nfunction serializeRichTextValue(value: unknown): unknown {\n const one = (v: unknown): unknown => {\n if (v == null || typeof v === 'string') return v ?? '';\n if (isTiptapDocument(v)) return tiptapToHtml(v);\n if (typeof v === 'object' && v !== null && typeof (v as { html?: unknown }).html === 'string') {\n return (v as { html: string }).html;\n }\n return v;\n };\n\n if (isI18nValue(value)) {\n const out: Record<string, unknown> = { _i18n: true };\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (k === '_i18n') continue;\n out[k] = one(v);\n }\n return out;\n }\n return one(value);\n}\n\n/**\n * Walk a component structure and collect the names of every component instance\n * it references (`{ type: 'component', component: 'X' }`).\n */\nfunction collectComponentRefs(node: unknown, acc: Set<string>): void {\n if (Array.isArray(node)) {\n for (const child of node) collectComponentRefs(child, acc);\n return;\n }\n if (!node || typeof node !== 'object') return;\n const n = node as Record<string, unknown>;\n if (n.type === 'component' && typeof n.component === 'string') {\n acc.add(n.component);\n }\n for (const value of Object.values(n)) {\n if (value && typeof value === 'object') collectComponentRefs(value, acc);\n }\n}\n\n/**\n * Compute the set of components that consume the CMS entry (`{{cms.*}}`),\n * transitively including any component that renders a consumer in its own\n * structure (it must forward the `cms` prop down). Astro components have\n * isolated scopes, so each consumer needs the entry threaded in explicitly.\n */\nfunction computeCmsConsumerComponents(\n components: Record<string, ComponentDefinition>\n): Set<string> {\n const consumers = new Set<string>();\n const refsByComponent = new Map<string, Set<string>>();\n\n for (const [name, def] of Object.entries(components)) {\n const structure = def.component?.structure;\n if (structure && JSON.stringify(structure).includes('{{cms.')) {\n consumers.add(name);\n }\n const refs = new Set<string>();\n collectComponentRefs(structure, refs);\n refsByComponent.set(name, refs);\n }\n\n // Fixpoint: a component that renders a consumer is itself a consumer/forwarder.\n let changed = true;\n while (changed) {\n changed = false;\n for (const [name, refs] of refsByComponent) {\n if (consumers.has(name)) continue;\n for (const ref of refs) {\n if (consumers.has(ref)) { consumers.add(name); changed = true; break; }\n }\n }\n }\n return consumers;\n}\n\n/**\n * Build the `_url` expression (a JS template literal over the `e` collection\n * entry) for a CMS collection, so flattened list items expose a usable link.\n * E.g. urlPattern \"/blog/{{slug}}\" + slugField \"slug\" \u2192 `/blog/${e.data.slug ?? e.id}`.\n */\nfunction buildCollectionUrlExpr(schema: CMSSchema): string {\n const slugField = schema.slugField || 'slug';\n const pattern = schema.urlPattern || `/${schema.id}/{{slug}}`;\n const body = pattern.replace(/\\{\\{[^}]+\\}\\}/, '${e.data.' + slugField + ' ?? e.id}');\n return '`' + body + '`';\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 // Slugs may be authored with a leading slash (e.g. \"/blog\" from the\n // page-rename flow). Normalize to the bare form the rest of the\n // pipeline expects \u2014 matches buildPageUrlForLocale(). A leading slash\n // here would otherwise inflate fileDepth (\".../blog.astro\".split('/'))\n // and produce a wrong \"../../layouts\" import.\n slug = slugs[locale].replace(/^\\/+/, '');\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 // Pre-pass: components that consume the CMS entry (so the page/component\n // emitters know which instances to thread `cms={...}` into), plus per-\n // collection `_url` expressions (for flattened collection lists). Built\n // before the template loop so the very first emitted CMS page sees the\n // full picture even when it lists items from another collection.\n const cmsConsumerComponents = computeCmsConsumerComponents(globalComponents);\n const collectionUrlExpr = new Map<string, string>();\n const mergedRichTextFields = new Set<string>();\n if (existsSync(templatesDir)) {\n for (const file of readdirSync(templatesDir).filter((f) => f.endsWith('.json'))) {\n const tc = await loadJSONFile(join(templatesDir, file));\n if (!tc) continue;\n try {\n const pd = parseJSON<JSONPage>(tc);\n const schema = pd.meta?.cms as CMSSchema | undefined;\n if (!schema?.id) continue;\n collectionUrlExpr.set(schema.id, buildCollectionUrlExpr(schema));\n for (const [fn, fd] of Object.entries(schema.fields || {})) {\n if (fd.type === 'rich-text') mergedRichTextFields.add(fn);\n }\n } catch { /* ignore parse errors; handled in main loop */ }\n }\n }\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}}', CMS_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 cmsConsumers: cmsConsumerComponents,\n collectionUrlExpr,\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 // SSR/Next.js resolve orphan `{{x}}` refs in a component's structure via\n // the parentProps cascade in templateEngine. Astro can't fall back at\n // runtime (each .astro file is its own scope), so we lift orphan refs\n // onto each component's interface and forward them from hosts that\n // declare the same prop. See `normalizeOrphanTemplateProps` for details.\n const emittableComponents = normalizeOrphanTemplateProps(globalComponents);\n let componentFileCount = 0;\n for (const [compName, compDef] of Object.entries(emittableComponents)) {\n try {\n const astroContent = emitAstroComponent(compName, compDef, emittableComponents, breakpoints, i18nConfig.defaultLocale, responsiveScales, remConversionConfig, {\n cmsConsumers: cmsConsumerComponents,\n cmsRichTextFields: mergedRichTextFields,\n collectionUrlExpr,\n });\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: emittableComponents,\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 // Rich-text fields are stored as Tiptap doc objects; Astro's content\n // schema (and `<Fragment set:html>`) expects HTML strings. Mirror the\n // live SSR (cmsSSRProcessor) by serializing them to HTML at copy time.\n const richTextFieldNames = Object.entries(schema.fields || {})\n .filter(([, fd]) => fd.type === 'rich-text')\n .map(([fn]) => fn);\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 // Skip `*.draft.json` siblings in production builds \u2014 they mirror the\n // published item-list filter and may hold partial/invalid WIP data.\n const isDevBuild = process.env.MENO_DEV_BUILD === 'true';\n const itemFiles = readdirSync(cmsItemsDir).filter(f =>\n f.endsWith('.json') && (isDevBuild || !f.endsWith(`${CMS_DRAFT_SUFFIX}.json`))\n );\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 // Serialize rich-text fields (Tiptap doc \u2192 HTML string), handling\n // i18n-wrapped values ({ _i18n: true, en: <doc>, ... }) per-locale.\n for (const fieldName of richTextFieldNames) {\n resolved[fieldName] = serializeRichTextValue(resolved[fieldName]);\n }\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 5 (stable Vite), NOT 6 \u2014 Astro 6's rolldown-vite breaks\n // @tailwindcss/vite at build time (\"Missing field `tsconfigPaths`\").\n 'astro': '^5.0.0',\n '@astrojs/sitemap': '^3.0.0',\n '@tailwindcss/vite': '^4.0.0',\n 'tailwindcss': '^4.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 // netlify.toml \u2014 makes the exported project deployable on Netlify out of the\n // box. `astro` is a real dependency here (see package.json above), so once\n // Netlify runs `npm install`, `astro build` is on PATH and writes to dist/.\n // Harmless on other hosts (Cloudflare Pages / Vercel ignore this file).\n const netlifyToml = `# Generated by Meno's Astro build.\n[build]\n command = \"npm run build\"\n publish = \"dist\"\n\n[build.environment]\n NODE_VERSION = \"22\"\n`;\n await writeFile(join(outDir, 'netlify.toml'), netlifyToml, '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 { deepMergeStyles } from '../../shared/styleNodeUtils';\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 /**\n * Names of components that consume the CMS entry. When emitting an instance\n * of one of these inside a CMS context, thread `cms={<entry binding>}` so the\n * component (which has an isolated Astro scope) can resolve `{{cms.*}}`.\n */\n cmsConsumers?: Set<string>;\n /**\n * collectionId \u2192 JS template literal (over entry `e`) for an item's `_url`,\n * used when flattening `sourceType: 'collection'` lists so list items expose\n * a usable link (`{{item._url}}`).\n */\n collectionUrlExpr?: Map<string, 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\n/**\n * Build the runtime href expression for a link-typed value. A link value may be\n * an object `{ href, target? }` or a bare string URL \u2014 the prop validator\n * coerces strings to `{ href }`, so collection lists and CMS fields legitimately\n * pass a string (e.g. `post._url`). Mirror that coercion at render time.\n */\nfunction linkHrefExpr(expr: string): string {\n return `(typeof ${expr} === 'string' ? ${expr} : ${expr}?.href) ?? \"#\"`;\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\nfunction isResponsiveStyleObject(\n style: StyleObject | ResponsiveStyleObject\n): style is ResponsiveStyleObject {\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n/**\n * The style on a component's root element \u2014 `node.style` for HTML/embed/list/\n * link roots, or `props.style` for a component/link-instance root. Used to\n * replicate SSR's per-breakpoint merge of an instance override into the root.\n */\nfunction getComponentRootStyle(\n def: ComponentDefinition | undefined\n): StyleObject | ResponsiveStyleObject | undefined {\n const root = def?.component?.structure as\n | { style?: unknown; props?: { style?: unknown } }\n | undefined;\n if (!root || typeof root !== 'object') return undefined;\n const s = (root.style ?? root.props?.style);\n return s && typeof s === 'object' ? (s as StyleObject | ResponsiveStyleObject) : undefined;\n}\n\n/**\n * True when a flat style has any property, or any responsive branch\n * (base/tablet/mobile/custom breakpoint) is non-empty. Guards against emitting\n * an empty `.class {}` rule / dangling `class=\"\"` for the common empty override\n * shape `{ base:{}, tablet:{}, mobile:{} }`.\n */\nfunction hasNonEmptyStyle(style: StyleObject | ResponsiveStyleObject): boolean {\n if (isResponsiveStyleObject(style)) {\n return Object.values(style).some(\n (branch) => !!branch && typeof branch === 'object' && Object.keys(branch as object).length > 0\n );\n }\n return Object.keys(style).length > 0;\n}\n\n/**\n * Drop properties whose value is a `{{...}}` template expression \u2014 these can't\n * be serialized to static CSS. Recurses into responsive branches. Template-\n * expression instance overrides are a pre-existing unsupported case; this just\n * avoids emitting invalid CSS like `padding: {{x}}`.\n */\nfunction stripTemplateExpressionStyle<T extends StyleObject | ResponsiveStyleObject>(style: T): T {\n const cleanFlat = (s: Record<string, unknown>): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(s)) {\n if (typeof v === 'string' && hasTemplates(v)) continue;\n out[k] = v;\n }\n return out;\n };\n if (isResponsiveStyleObject(style)) {\n const out: Record<string, unknown> = {};\n for (const [bp, branch] of Object.entries(style as Record<string, unknown>)) {\n out[bp] = branch && typeof branch === 'object'\n ? cleanFlat(branch as Record<string, unknown>)\n : branch;\n }\n return out as T;\n }\n return cleanFlat(style as Record<string, unknown>) as T;\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}={${linkHrefExpr(expr)}}`);\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' ? `\\${${linkHrefExpr(trimmed)}}` : `\\${${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 // Thread the CMS entry into consumer components. Astro components have\n // isolated scopes, so a component referencing `{{cms.*}}` can't see the\n // page's `entry`/`cms` binding unless we pass it explicitly. The binding is\n // `entry` at the CMS page level and `cms` inside a consumer component, so\n // this also forwards correctly through nested consumers.\n if (ctx.cmsMode && ctx.cmsConsumers?.has(node.component) && !('cms' in (node.props ?? {}))) {\n propParts.push(`cms={${ctx.cmsEntryBinding || 'entry'}}`);\n }\n\n // Instance-level style overrides (+ interactive styles) via element-class CSS.\n // Route them through the same machinery the export uses for hover styles: an\n // UNLAYERED `<style is:global>` rule, which beats Tailwind v4's `@layer\n // utilities` deterministically \u2014 so the instance override wins over the\n // component's base utilities. This mirrors live SSR, which deep-merges the\n // instance style into the component root. (The previous approach appended the\n // override as more utility classes at equal specificity, so CSS output order\n // decided the winner and the override frequently lost.)\n {\n const instanceStyle = node.style as StyleObject | ResponsiveStyleObject | undefined;\n const instanceInteractive = node.interactiveStyles as InteractiveStyles | undefined;\n const hasStyle = !!instanceStyle && hasNonEmptyStyle(instanceStyle);\n const hasInteractive = Array.isArray(instanceInteractive) && instanceInteractive.length > 0;\n\n if ((hasStyle || hasInteractive) && ctx.collectedInteractiveStyles) {\n const elementClass = buildElementClass(ctx, node.label);\n const rules: InteractiveStyles = [];\n if (hasStyle) {\n // Per-breakpoint merge the component's root style UNDER the instance\n // override (mirrors SSR's mergeNodeStyles). This keeps the component's\n // own responsive breakpoint values for properties the instance only sets\n // at `base`, so a base override doesn't leak past tablet/mobile. The\n // merged rule is unlayered, so it fully shadows the component's own\n // (layered) root utilities. `_mapping`/`{{\u2026}}` values carried in from the\n // root are dropped downstream (styleObjectToCSS skips mappings) /\n // stripped here, falling back to the component's own emission.\n const rootStyle = getComponentRootStyle(ctx.globalComponents[node.component]);\n const merged = (rootStyle\n ? deepMergeStyles(rootStyle, instanceStyle!)\n : instanceStyle!) as StyleObject | ResponsiveStyleObject;\n const cssSafe = stripTemplateExpressionStyle(merged);\n if (hasNonEmptyStyle(cssSafe)) rules.push({ style: cssSafe }); // no prefix/postfix \u2192 `.cls {\u2026}`\n }\n if (hasInteractive) rules.push(...instanceInteractive!); // fold hover/etc. into the same class\n if (rules.length > 0) {\n const existing = ctx.collectedInteractiveStyles.get(elementClass);\n ctx.collectedInteractiveStyles.set(elementClass, existing ? [...existing, ...rules] : rules);\n propParts.push(`class=\"${elementClass}\"`);\n }\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?} \u2014 or a coerced string URL\n hrefAttr = ` href={${linkHrefExpr(propRef)}}`;\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={${linkHrefExpr(expr)}}`;\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' ? `\\${${linkHrefExpr(trimmed)}}` : `\\${${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 // Flatten content-collection entries ({ id, data: {...} }) into the flat item\n // shape the templates expect ({{item.field}} \u2192 item.field), and synthesize the\n // `_url`/`_id` meta the CMS data model exposes. Filter/sort above operate on the\n // raw entries (e.data.*); this map runs last so it sees the final set.\n const urlExpr = ctx.collectionUrlExpr?.get(source)\n ?? `\\`/${source}/\\${e.data.slug ?? e.id}\\``;\n queryChain += `.then(items => items.map((e) => ({ ...e.data, _id: e.id, _url: ${urlExpr} })))`;\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 */\n/** CMS-aware emission options threaded from build-astro. */\nexport interface ComponentCmsOptions {\n /** Names of components that consume the CMS entry (transitive). */\n cmsConsumers?: Set<string>;\n /** Rich-text field names across all collections (for `set:html`). */\n cmsRichTextFields?: Set<string>;\n /** collectionId \u2192 `_url` template expression for flattened lists. */\n collectionUrlExpr?: Map<string, string>;\n}\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 cmsOptions?: ComponentCmsOptions\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 // A \"CMS consumer\" references {{cms.*}} (transitively). It receives the CMS\n // entry via a `cms` prop and resolves field refs against it (binding 'cms'),\n // mirroring how the CMS template page resolves them against `entry`.\n const isCmsConsumer = cmsOptions?.cmsConsumers?.has(name) ?? false;\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 // Frontmatter sink for collection queries (getCollection) emitted by lists.\n frontmatterLines: [],\n astroImports: new Set<string>(),\n cmsConsumers: cmsOptions?.cmsConsumers,\n collectionUrlExpr: cmsOptions?.collectionUrlExpr,\n ...(isCmsConsumer\n ? {\n cmsMode: true,\n cmsEntryBinding: 'cms',\n cmsWrapFn: 'r',\n cmsRichTextFields: cmsOptions?.cmsRichTextFields,\n }\n : {}),\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 // Consumers always get the `r` resolver (the cms wrap fn) and a `cms` prop.\n const frontmatter = buildFrontmatter(\n name,\n propDefs,\n ctx.imports,\n ctx.dynamicTags,\n (ctx.needsI18nResolver || isCmsConsumer) ? defaultLocale : undefined,\n ctx.imageImports,\n ctx.astroImports,\n ctx.frontmatterLines,\n isCmsConsumer\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 astroImports?: Set<string>,\n frontmatterLines?: string[],\n isCmsConsumer?: boolean\n): string {\n const lines: string[] = [];\n\n // Astro API imports (e.g., getCollection) needed by collection-sourced lists\n if (astroImports && astroImports.size > 0) {\n lines.push(`import { ${Array.from(astroImports).sort().join(', ')} } from 'astro:content';`);\n }\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 // CMS consumers receive the current entry as a `cms` prop\n if (isCmsConsumer) {\n lines.push(' cms?: any;');\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 // CMS consumers destructure the entry prop\n if (isCmsConsumer) {\n destructParts.push('cms');\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 // Collection queries emitted by collection-sourced list nodes\n // (e.g. `const blogList = await getCollection('blog')...`).\n if (frontmatterLines && frontmatterLines.length > 0) {\n lines.push('');\n for (const line of frontmatterLines) lines.push(line);\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 * Normalize orphan template props for Astro emission.\n *\n * Each Meno component becomes its own `.astro` file. Templates like\n * `{{ctaText}}` are emitted as `{ctaText}` \u2014 a JSX reference to a destructured\n * `Astro.props` variable. If the component's `interface` doesn't declare the\n * prop, the variable isn't in scope and Astro errors at build time.\n *\n * SSR/Next.js handles this at runtime via `processStructure`'s `parentProps`\n * fallback (see templateEngine.ts). Astro can't fall back at runtime \u2014 each\n * .astro file is its own scope \u2014 so we normalize the component graph before\n * emission:\n *\n * 1. For each component, find orphan `{{x}}` refs in its structure (not\n * declared in the interface, not item/cms/page namespaced, not a list\n * loop var) and add them as optional string props with `default: \"\"`.\n *\n * 2. For each component-instance ref `<X />` inside any host's structure,\n * forward each of X's auto-lifted props by writing\n * `props.x = \"{{x}}\"` on the instance \u2014 but ONLY when the host itself\n * already declares `x`. This mirrors the SSR cascade's one-level scope:\n * the cascade fixes the single-step host\u2192child case, never the leap to\n * a grandparent.\n *\n * Multi-level chains (host doesn't have the prop either) gracefully degrade\n * to the lifted default (\"\") instead of failing the build \u2014 same outcome as\n * the SSR cascade for that shape.\n */\n\nimport type { ComponentDefinition, PropDefinition } from '../../shared/types';\n\n// Bare or dotted identifier inside `{{...}}`, with whitespace allowed around\n// the body. Skips anything containing operators, calls, ternaries, etc. \u2014\n// liftable refs are *only* simple prop reads.\nconst BARE_IDENT_BODY = /^\\s*([a-zA-Z_$][a-zA-Z0-9_$]*)(?:\\s*\\.\\s*[a-zA-Z_$][a-zA-Z0-9_$]*)*\\s*$/;\n\n// Namespaces and meta-vars that are never component-instance props.\nconst RESERVED_BASES = new Set([\n 'cms', 'item', 'page',\n 'itemIndex', 'itemFirst', 'itemLast',\n]);\n\nfunction recordRef(\n base: string,\n declared: Set<string>,\n listVars: Set<string>,\n out: Set<string>\n): void {\n if (RESERVED_BASES.has(base)) return;\n if (listVars.has(base)) return;\n if (declared.has(base)) return;\n out.add(base);\n}\n\nfunction findOrphanRefs(value: unknown, declared: Set<string>, listVars: Set<string>, out: Set<string>): void {\n if (value == null) return;\n if (typeof value === 'string') {\n const re = /\\{\\{([^}]+)\\}\\}/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(value)) !== null) {\n const body = m[1];\n const idMatch = body.match(BARE_IDENT_BODY);\n if (!idMatch) continue; // expressions, operators, calls \u2014 skip\n recordRef(idMatch[1], declared, listVars, out);\n }\n return;\n }\n if (Array.isArray(value)) {\n for (const v of value) findOrphanRefs(v, declared, listVars, out);\n return;\n }\n if (typeof value !== 'object') return;\n const obj = value as Record<string, unknown>;\n\n // Mapping objects (`{ _mapping: true, prop: \"variant\", values: {...} }`)\n // reference a component prop by name. The Astro emitter turns these into\n // bare identifier references like `String(variant) === \"default\"`, so the\n // `prop` field is just as much a binding site as a `{{variant}}` template.\n // Used for style mappings, link mappings, HTML mappings, and `if` boolean\n // mappings \u2014 all share the same shape.\n if (obj._mapping === true && typeof obj.prop === 'string') {\n recordRef(obj.prop, declared, listVars, out);\n // Keep walking \u2014 `values` may contain nested templates too (rare, but\n // not impossible).\n }\n\n // A `list` node introduces a new loop variable into the scope of its\n // children (the template instance). Default name is `item` when\n // `itemAs` is omitted.\n let nextListVars = listVars;\n if (obj.type === 'list') {\n const itemAs = typeof obj.itemAs === 'string' && obj.itemAs ? obj.itemAs : 'item';\n nextListVars = new Set(listVars);\n nextListVars.add(itemAs);\n }\n\n for (const key of Object.keys(obj)) {\n // Don't peek into a nested component instance's `props` \u2014 those refs\n // are resolved in the host's scope, not the target's. We handle them\n // when walking the host itself.\n if (obj.type === 'component' && key === 'props') continue;\n findOrphanRefs(obj[key], declared, nextListVars, out);\n }\n}\n\n/**\n * Walk a host's structure and forward each target component's lifted props\n * from the host's scope. Only forwards props the host itself declares \u2014 see\n * the module docstring for why.\n */\nfunction forwardLiftedPropsOnInstances(\n structure: unknown,\n hostProps: Set<string>,\n liftedByComp: ReadonlyMap<string, ReadonlySet<string>>\n): void {\n if (structure == null || typeof structure !== 'object') return;\n if (Array.isArray(structure)) {\n for (const s of structure) forwardLiftedPropsOnInstances(s, hostProps, liftedByComp);\n return;\n }\n const obj = structure as Record<string, unknown>;\n if (obj.type === 'component' && typeof obj.component === 'string') {\n const lifted = liftedByComp.get(obj.component);\n if (lifted && lifted.size > 0) {\n const props = (obj.props as Record<string, unknown> | undefined) ?? {};\n let changed = false;\n for (const propName of lifted) {\n if (propName in props) continue;\n if (!hostProps.has(propName)) continue;\n props[propName] = `{{${propName}}}`;\n changed = true;\n }\n if (changed) obj.props = props;\n }\n }\n for (const key of Object.keys(obj)) {\n forwardLiftedPropsOnInstances(obj[key], hostProps, liftedByComp);\n }\n}\n\n/**\n * Produce a normalized copy of the component map suitable for Astro emission.\n * The input map is not mutated.\n */\nexport function normalizeOrphanTemplateProps(\n components: Record<string, ComponentDefinition>\n): Record<string, ComponentDefinition> {\n const next: Record<string, ComponentDefinition> = {};\n const liftedByComp = new Map<string, Set<string>>();\n\n // Pass 1: clone every component and lift orphan refs onto its interface.\n for (const [name, def] of Object.entries(components)) {\n // structuredClone preserves Map/Set/Date but plain JSON deep-clone is\n // enough here \u2014 component defs are JSON-serializable by construction.\n const cloned = structuredClone(def) as ComponentDefinition;\n next[name] = cloned;\n\n const comp = cloned.component;\n if (!comp || !comp.structure) continue;\n const iface = (comp.interface ?? {}) as Record<string, PropDefinition>;\n const declared = new Set(Object.keys(iface));\n const orphans = new Set<string>();\n findOrphanRefs(comp.structure, declared, new Set(), orphans);\n if (orphans.size === 0) continue;\n\n const augmented: Record<string, PropDefinition> = { ...iface };\n for (const propName of orphans) {\n augmented[propName] = { type: 'string', default: '' } as PropDefinition;\n }\n comp.interface = augmented;\n liftedByComp.set(name, orphans);\n }\n\n // Pass 2: forward lifted props from each host where the host declares the\n // same prop. Mutates the cloned structures in `next`.\n for (const [, hostDef] of Object.entries(next)) {\n const comp = hostDef.component;\n if (!comp || !comp.structure) continue;\n const hostProps = new Set(Object.keys(comp.interface ?? {}));\n forwardLiftedPropsOnInstances(comp.structure, hostProps, liftedByComp);\n }\n\n return next;\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 * Slug token baked into the SSR metadata pass's dummy URL (build-astro renders\n * each CMS template once with this stand-in slug to collect meta). The emitter\n * swaps it for the per-entry slug expression so canonical/og:url are correct.\n */\nexport const CMS_SLUG_PLACEHOLDER = '__placeholder__';\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 /** Components that consume the CMS entry (thread `cms={entry}` into them) */\n cmsConsumers?: Set<string>;\n /** collectionId \u2192 `_url` template expression for flattened collection lists */\n collectionUrlExpr?: Map<string, string>;\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 // Frontmatter sink for any page-level collection-sourced lists.\n frontmatterLines: [],\n astroImports: new Set<string>(),\n cmsConsumers: options.cmsConsumers,\n collectionUrlExpr: options.collectionUrlExpr,\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 slugField = cmsSchema.slugField || 'slug';\n const escapedMeta = escapeTemplateLiteral(meta)\n .replace(\n /\\{\\{cms\\.([^}]+)\\}\\}/g,\n (_, fieldPath) => `\\${${wrapFn}(${binding}.data.${fieldPath.trim()})}`\n )\n // Replace the metadata-pass stand-in slug with the per-entry slug so\n // canonical/og:url point at the real page instead of \"__placeholder__\".\n .replace(\n new RegExp(CMS_SLUG_PLACEHOLDER, 'g'),\n `\\${${wrapFn}(${binding}.data.${slugField}) || ${binding}.id}`\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 // Page-level collection queries emitted by collection-sourced list nodes\n // (getCollection import is already present in importLines above).\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')}\n\n${staticPaths}\n\n${resolverHelper}${extraFrontmatter}\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 * Next.js Export Build Script\n * Renders all pages via the SSR pipeline, then wraps them as Next.js App Router\n * server components (`app/<route>/page.tsx`) with a shared root layout, global\n * CSS, and dynamic `[slug]` routes (via `generateStaticParams`) for CMS pages.\n *\n * Mirrors `buildAstroProject` but emits a Next.js 15 static export instead of\n * an Astro project. The SSR HTML is embedded into each page via React's\n * `dangerouslySetInnerHTML`, matching the Astro export's `<Fragment set:html>`\n * fallback path. Inline `<script>` tags inside the SSR HTML run when the\n * browser parses the statically exported `.html` file.\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 {\n loadJSONFile,\n loadComponentDirectory,\n mapPageNameToPath,\n parseJSON,\n loadI18nConfig,\n} from \"./lib/server/jsonLoader\";\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 { 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 { collectAllMappingClasses } from \"./lib/server/astro/cssCollector\";\nimport { generateAllInteractiveCSS, generateUtilityCSS, extractUtilityClassesFromHTML } from \"./lib/shared/cssGeneration\";\nimport { needsFormHandler, formHandlerScript } from \"./lib/client/scripts/formHandler\";\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\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 * Escape a string for use inside a JS backtick template literal.\n * The output is wrapped in backticks by callers.\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 * Escape a string for use inside a JS single-quoted string literal.\n */\nfunction escapeSingleQuoted(s: string): string {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\n/**\n * Build the URL path \u2192 `app/<route>/page.tsx` mapping for a given URL.\n * The home route lives at `app/page.tsx`; everything else lives at\n * `app/<segments>/page.tsx`. Special characters in path segments are\n * left as-is so the URL \u2194 file mapping matches Next.js conventions.\n */\nfunction urlPathToAppRoute(urlPath: string): { dir: string; isRoot: boolean } {\n if (urlPath === '/' || urlPath === '') {\n return { dir: '', isRoot: true };\n }\n const trimmed = urlPath.replace(/^\\/+/, '').replace(/\\/+$/, '');\n return { dir: trimmed, isRoot: false };\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 /** Original page data */\n pageData?: JSONPage;\n /** Page name without extension */\n pageName?: string;\n}\n\ninterface NextBuildStats {\n pages: number;\n cmsPages: number;\n collections: number;\n errors: number;\n}\n\n// ---------------------------------------------------------------------------\n// Head <meta> tag converter\n// ---------------------------------------------------------------------------\n\n/**\n * Parse the SSR `meta` HTML string into JSX-ready React element source.\n *\n * `generateMetaTags()` emits one well-formed self-closing or paired tag per\n * line: `<title>...</title>`, `<meta ... />`, `<link ... />`. React 19 hoists\n * `<title>`, `<meta>`, and `<link>` JSX elements to `<head>` automatically, so\n * we just need to emit those tags as React-compatible JSX.\n *\n * Returns a JSX fragment string (no surrounding braces) suitable for inlining\n * into a `.tsx` file.\n */\nfunction metaHtmlToJSX(metaHtml: string): string {\n if (!metaHtml || !metaHtml.trim()) return '';\n const lines = metaHtml.split(/\\r?\\n/).map((l) => l.trim()).filter(Boolean);\n\n const elements: string[] = [];\n for (const line of lines) {\n // <title>foo</title>\n const titleMatch = line.match(/^<title>([\\s\\S]*?)<\\/title>$/);\n if (titleMatch) {\n elements.push(`<title>{${JSON.stringify(decodeBasicEntities(titleMatch[1]))}}</title>`);\n continue;\n }\n // <meta ... /> or <link ... />\n const selfMatch = line.match(/^<(meta|link)\\s+([\\s\\S]*?)\\s*\\/?>$/);\n if (selfMatch) {\n const tagName = selfMatch[1];\n const attrsSrc = selfMatch[2];\n const attrs = parseAttrs(attrsSrc);\n const attrParts = Object.entries(attrs)\n .map(([k, v]) => `${jsxAttrName(k)}=${JSON.stringify(v)}`)\n .join(' ');\n elements.push(`<${tagName} ${attrParts} />`);\n continue;\n }\n // Unknown tag \u2014 skip rather than crash the build.\n }\n return elements.join('\\n ');\n}\n\n/**\n * Map HTML attribute names to their JSX equivalents. `<meta>` / `<link>` /\n * `<title>` are the only emit targets so the rename set stays small \u2014\n * extend this lookup if `generateMetaTags()` starts emitting new attrs.\n */\nconst JSX_ATTR_NAMES: Record<string, string> = {\n 'http-equiv': 'httpEquiv',\n 'hreflang': 'hrefLang',\n 'crossorigin': 'crossOrigin',\n 'referrerpolicy': 'referrerPolicy',\n 'imagesrcset': 'imageSrcSet',\n 'imagesizes': 'imageSizes',\n 'fetchpriority': 'fetchPriority',\n 'class': 'className',\n 'for': 'htmlFor',\n 'charset': 'charSet',\n};\n\nfunction jsxAttrName(name: string): string {\n return JSX_ATTR_NAMES[name] ?? name;\n}\n\n/**\n * Parse a flat attribute list like `name=\"og:title\" content=\"Hello\"` into a\n * record. Values must be double-quoted; this matches what `generateMetaTags()`\n * emits today.\n */\nfunction parseAttrs(src: string): Record<string, string> {\n const out: Record<string, string> = {};\n const re = /([a-zA-Z_:][\\w:.-]*)\\s*=\\s*\"([^\"]*)\"/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(src)) !== null) {\n out[match[1]] = decodeBasicEntities(match[2]);\n }\n return out;\n}\n\n/**\n * Decode the basic HTML entities that `escapeHtml()` in metaTagGenerator emits\n * (`&amp;`, `&quot;`, `&lt;`, `&gt;`, `&#39;`). The output is then re-escaped\n * by `JSON.stringify` when we emit it as a JSX string attribute, so this\n * round-trip is safe.\n */\nfunction decodeBasicEntities(s: string): string {\n return s\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&');\n}\n\n// ---------------------------------------------------------------------------\n// page.tsx emitter\n// ---------------------------------------------------------------------------\n\n/**\n * Emit a Next.js App Router page component that renders the SSR HTML.\n * The page is a server component (no `'use client'`) so the inline scripts\n * inside `__html` execute as part of the statically exported HTML file.\n */\nfunction emitNextPage(options: {\n html: string;\n meta: string;\n title: string;\n locale: string;\n theme: string;\n fontPreloads: string;\n libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string };\n scriptPaths: string[];\n customCode: { head?: string; bodyStart?: string; bodyEnd?: string };\n iconTagsHtml: string;\n formHandlerNeeded: boolean;\n}): string {\n const {\n html,\n meta,\n title,\n locale,\n theme,\n fontPreloads,\n libraryTags,\n scriptPaths,\n customCode,\n iconTagsHtml,\n formHandlerNeeded,\n } = options;\n\n const metaJSX = metaHtmlToJSX(meta);\n\n // Combine all head-targeted raw HTML strings into one block. Order matches\n // BaseLayout.astro: icons, font preloads, library head CSS/JS, custom head.\n const headHtmlBlocks: string[] = [];\n if (iconTagsHtml) headHtmlBlocks.push(iconTagsHtml);\n if (fontPreloads) headHtmlBlocks.push(fontPreloads);\n if (libraryTags.headCSS) headHtmlBlocks.push(libraryTags.headCSS);\n if (libraryTags.headJS) headHtmlBlocks.push(libraryTags.headJS);\n if (customCode.head) headHtmlBlocks.push(customCode.head);\n const headHtml = headHtmlBlocks.join('\\n');\n\n // Body-end raw HTML: scripts + library body-end + custom body-end + form\n // handler. These run after the SSR HTML so they can attach behavior to\n // server-rendered nodes (matches BaseLayout.astro ordering).\n const scriptTags = scriptPaths.map((s) => `<script src=\"${s}\" defer></script>`).join('\\n');\n const bodyEndBlocks: string[] = [];\n if (scriptTags) bodyEndBlocks.push(scriptTags);\n if (libraryTags.bodyEndJS) bodyEndBlocks.push(libraryTags.bodyEndJS);\n if (customCode.bodyEnd) bodyEndBlocks.push(customCode.bodyEnd);\n if (formHandlerNeeded) bodyEndBlocks.push(`<script>${formHandlerScript}</script>`);\n const bodyEndHtml = bodyEndBlocks.join('\\n');\n\n const bodyStartHtml = customCode.bodyStart || '';\n\n // Emit the body HTML and any raw HTML head/body fragments as JS template\n // literals so embedded backticks and ${...} sequences in the SSR output are\n // neutralized. The runtime reads them back as plain strings.\n return `// Auto-generated by meno-core/build-next. Do not edit.\nimport RawHead from '../components/RawHead';\n\nconst TITLE = ${JSON.stringify(title)};\nconst LOCALE = ${JSON.stringify(locale)};\nconst THEME = ${JSON.stringify(theme)};\nconst HEAD_HTML = \\`${escapeTemplateLiteral(headHtml)}\\`;\nconst BODY_START_HTML = \\`${escapeTemplateLiteral(bodyStartHtml)}\\`;\nconst PAGE_HTML = \\`${escapeTemplateLiteral(html)}\\`;\nconst BODY_END_HTML = \\`${escapeTemplateLiteral(bodyEndHtml)}\\`;\n\nexport const metadata = {\n title: TITLE,\n};\n\nexport default function Page() {\n return (\n <>\n ${metaJSX || ''}\n <RawHead html={HEAD_HTML} locale={LOCALE} theme={THEME} />\n {BODY_START_HTML ? <div data-meno-body-start dangerouslySetInnerHTML={{ __html: BODY_START_HTML }} /> : null}\n <div id=\"root\" dangerouslySetInnerHTML={{ __html: PAGE_HTML }} />\n {BODY_END_HTML ? <div data-meno-body-end dangerouslySetInnerHTML={{ __html: BODY_END_HTML }} /> : null}\n </>\n );\n}\n`;\n}\n\n/**\n * Emit a CMS-template page (`app/<prefix>/[slug]/page.tsx`) that uses\n * `generateStaticParams` to pre-render one HTML file per CMS item.\n *\n * Each rendered page is just an SSR HTML wrap (same shape as `emitNextPage`),\n * keyed by the item slug + locale. We pre-render the HTML for every\n * combination at build time and embed it in a lookup table in the page module\n * so `generateStaticParams` + the default export work together.\n */\nfunction emitNextCMSPage(options: {\n slugs: string[];\n perSlugData: Record<string, {\n html: string;\n meta: string;\n title: string;\n scriptPaths: string[];\n }>;\n locale: string;\n theme: string;\n fontPreloads: string;\n libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string };\n customCode: { head?: string; bodyStart?: string; bodyEnd?: string };\n iconTagsHtml: string;\n formHandlerNeeded: boolean;\n}): string {\n const {\n slugs,\n perSlugData,\n locale,\n theme,\n fontPreloads,\n libraryTags,\n customCode,\n iconTagsHtml,\n formHandlerNeeded,\n } = options;\n\n const headHtmlBlocks: string[] = [];\n if (iconTagsHtml) headHtmlBlocks.push(iconTagsHtml);\n if (fontPreloads) headHtmlBlocks.push(fontPreloads);\n if (libraryTags.headCSS) headHtmlBlocks.push(libraryTags.headCSS);\n if (libraryTags.headJS) headHtmlBlocks.push(libraryTags.headJS);\n if (customCode.head) headHtmlBlocks.push(customCode.head);\n const headHtml = headHtmlBlocks.join('\\n');\n\n const bodyStartHtml = customCode.bodyStart || '';\n const trailingFormHandler = formHandlerNeeded ? `<script>${formHandlerScript}</script>` : '';\n\n // Build the lookup map: slug \u2192 { html, metaJsx, title, bodyEndHtml }\n const entries: string[] = [];\n for (const slug of slugs) {\n const data = perSlugData[slug];\n if (!data) continue;\n const scriptTags = data.scriptPaths.map((s) => `<script src=\"${s}\" defer></script>`).join('\\n');\n const bodyEndBlocks: string[] = [];\n if (scriptTags) bodyEndBlocks.push(scriptTags);\n if (libraryTags.bodyEndJS) bodyEndBlocks.push(libraryTags.bodyEndJS);\n if (customCode.bodyEnd) bodyEndBlocks.push(customCode.bodyEnd);\n if (trailingFormHandler) bodyEndBlocks.push(trailingFormHandler);\n const bodyEndHtml = bodyEndBlocks.join('\\n');\n\n entries.push(\n ` ${JSON.stringify(slug)}: {\n title: ${JSON.stringify(data.title)},\n metaHtml: \\`${escapeTemplateLiteral(data.meta)}\\`,\n html: \\`${escapeTemplateLiteral(data.html)}\\`,\n bodyEndHtml: \\`${escapeTemplateLiteral(bodyEndHtml)}\\`,\n }`\n );\n }\n\n return `// Auto-generated by meno-core/build-next. Do not edit.\nimport RawHead from '${cmsRawHeadImport(options)}';\nimport MetaTags from '${cmsMetaTagsImport(options)}';\n\nconst LOCALE = ${JSON.stringify(locale)};\nconst THEME = ${JSON.stringify(theme)};\nconst HEAD_HTML = \\`${escapeTemplateLiteral(headHtml)}\\`;\nconst BODY_START_HTML = \\`${escapeTemplateLiteral(bodyStartHtml)}\\`;\n\ntype Entry = {\n title: string;\n metaHtml: string;\n html: string;\n bodyEndHtml: string;\n};\n\nconst ENTRIES: Record<string, Entry> = {\n${entries.join(',\\n')}\n};\n\nexport function generateStaticParams() {\n return Object.keys(ENTRIES).map((slug) => ({ slug }));\n}\n\nexport async function generateMetadata({ params }: { params: Promise<{ slug: string }> }) {\n const { slug } = await params;\n const entry = ENTRIES[slug];\n return entry ? { title: entry.title } : {};\n}\n\nexport default async function Page({ params }: { params: Promise<{ slug: string }> }) {\n const { slug } = await params;\n const entry = ENTRIES[slug];\n if (!entry) return null;\n return (\n <>\n <MetaTags html={entry.metaHtml} />\n <RawHead html={HEAD_HTML} locale={LOCALE} theme={THEME} />\n {BODY_START_HTML ? <div data-meno-body-start dangerouslySetInnerHTML={{ __html: BODY_START_HTML }} /> : null}\n <div id=\"root\" dangerouslySetInnerHTML={{ __html: entry.html }} />\n {entry.bodyEndHtml ? <div data-meno-body-end dangerouslySetInnerHTML={{ __html: entry.bodyEndHtml }} /> : null}\n </>\n );\n}\n`;\n}\n\nfunction cmsRawHeadImport(_options: { /* keep for future depth handling */ }): string {\n // CMS files live two levels under app/ (e.g. app/blog/[slug]/page.tsx), so\n // the relative path to app/components/RawHead.tsx is \"../../components/RawHead\".\n // When the URL pattern's path prefix is empty (e.g. \"/[slug]\"), they live at\n // app/[slug]/page.tsx \u2014 one level deep. The caller passes the correct depth\n // via the file location; we always emit \"../../components/RawHead\" because\n // build-next places CMS pages at depth 2 (see emitCMSPages).\n return '../../components/RawHead';\n}\n\nfunction cmsMetaTagsImport(_options: { /* placeholder */ }): string {\n return '../../components/MetaTags';\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\nexport async function buildNextProject(\n projectRoot?: string,\n outputDir?: string\n): Promise<NextBuildStats> {\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 await configService.load();\n const responsiveScales = configService.getResponsiveScales();\n const globalLibraries = configService.getLibraries();\n const componentLibraries = collectComponentLibraries(globalComponents);\n\n // ----------------------------------------------------------\n // 2. Clean and create output directory\n // ----------------------------------------------------------\n const outDir = outputDir || join(projectPaths.project, 'next-export');\n\n if (existsSync(outDir)) {\n rmSync(outDir, { recursive: true, force: true });\n }\n mkdirSync(outDir, { recursive: true });\n\n const appDir = join(outDir, 'app');\n const componentsDir = join(appDir, 'components');\n const publicDir = join(outDir, 'public');\n const scriptsDir = join(publicDir, '_scripts');\n for (const d of [appDir, componentsDir, publicDir]) {\n mkdirSync(d, { recursive: true });\n }\n\n // ----------------------------------------------------------\n // 3. Scan pages and gather slug mappings\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 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. Render regular pages\n // ----------------------------------------------------------\n const allResults: PageRenderResult[] = [];\n const allInteractiveStyles = new Map<string, InteractiveStyles>();\n const allComponentCSS = new Set<string>();\n const allUtilityClasses = new Set<string>();\n const jsContents = new Map<string, string>();\n let errorCount = 0;\n let projectNeedsFormHandler = false;\n\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 function recordRender(\n result: { html: string; meta: string; title: string; javascript: string; componentCSS?: string; locale: string; interactiveStylesMap: Map<string, InteractiveStyles> },\n urlPath: string,\n pageData?: JSONPage,\n pageName?: string,\n ): void {\n mergeInteractiveStyles(result.interactiveStylesMap);\n if (result.componentCSS) allComponentCSS.add(result.componentCSS);\n for (const c of extractUtilityClassesFromHTML(result.html)) {\n allUtilityClasses.add(c);\n }\n if (result.javascript) {\n const hash = hashContent(result.javascript);\n if (!jsContents.has(hash)) {\n jsContents.set(hash, result.javascript);\n }\n }\n if (!projectNeedsFormHandler && needsFormHandler(result.html)) {\n projectNeedsFormHandler = true;\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 pageData,\n pageName,\n });\n }\n\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 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 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 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 recordRender(result, urlPath, pageData, pageName);\n }\n } catch (error) {\n const err = error as { message?: string };\n console.error(` Error rendering ${basePath}:`, err?.message || error);\n errorCount++;\n }\n }\n\n // ----------------------------------------------------------\n // 5. Pre-compute shared layout dependencies\n // ----------------------------------------------------------\n const fontPreloads = generateFontPreloadTags();\n const mergedLibraries = mergeLibraries(globalLibraries, componentLibraries);\n const buildLibraries = filterLibrariesByContext(mergedLibraries, 'build');\n\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 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 // ----------------------------------------------------------\n // 6. Render CMS template pages\n // ----------------------------------------------------------\n const templatesDir = projectPaths.templates();\n const templateSchemas: CMSSchema[] = [];\n let cmsPageCount = 0;\n\n type CMSEmission = {\n schema: CMSSchema;\n locale: string;\n pathPrefix: string;\n isDefaultLocale: boolean;\n perSlugData: Record<string, { html: string; meta: string; title: string; scriptPaths: string[] }>;\n };\n const cmsEmissions: CMSEmission[] = [];\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 const slugField = cmsSchema.slugField || 'slug';\n const items = await cmsService.queryItems({ collection: cmsSchema.id });\n const urlPatternWithoutSlash = cmsSchema.urlPattern.replace(/^\\//, '');\n const slugPlaceholderIdx = urlPatternWithoutSlash.indexOf('{{');\n const pathPrefix = slugPlaceholderIdx > 0\n ? urlPatternWithoutSlash.substring(0, slugPlaceholderIdx).replace(/\\/$/, '')\n : '';\n\n for (const localeEntry of i18nConfig.locales) {\n const localeCode = localeEntry.code;\n const isDefault = localeCode === i18nConfig.defaultLocale;\n\n const perSlugData: Record<string, { html: string; meta: string; title: string; scriptPaths: string[] }> = {};\n\n for (const item of items) {\n if (!isDevBuild && isItemDraftForLocale(item, localeCode)) continue;\n\n const itemPath = buildCMSItemPath(cmsSchema.urlPattern, item, slugField, localeCode, i18nConfig);\n const itemWithUrl: CMSItem = { ...item, _url: itemPath };\n\n const fullPath = isDefault ? itemPath : `/${localeCode}${itemPath}`;\n\n const result = await renderPageSSR(\n pageData,\n globalComponents,\n fullPath,\n siteUrl,\n localeCode,\n i18nConfig,\n slugMappings,\n { cms: itemWithUrl },\n cmsService,\n true\n );\n\n mergeInteractiveStyles(result.interactiveStylesMap);\n if (result.componentCSS) allComponentCSS.add(result.componentCSS);\n for (const c of extractUtilityClassesFromHTML(result.html)) {\n allUtilityClasses.add(c);\n }\n if (!projectNeedsFormHandler && needsFormHandler(result.html)) {\n projectNeedsFormHandler = true;\n }\n\n const scriptPaths: string[] = [];\n if (result.javascript) {\n const hash = hashContent(result.javascript);\n if (!jsContents.has(hash)) jsContents.set(hash, result.javascript);\n scriptPaths.push(`/_scripts/${hash}.js`);\n }\n\n // Slug used as the dynamic-segment key (must match\n // `generateStaticParams`'s output for this locale).\n let rawSlug = item[slugField] ?? item._slug ?? item._id;\n if (isI18nValue(rawSlug)) {\n rawSlug = resolveI18nValue(rawSlug, localeCode, i18nConfig) as string;\n }\n const slugKey = String(rawSlug);\n\n perSlugData[slugKey] = {\n html: result.html,\n meta: result.meta,\n title: result.title,\n scriptPaths,\n };\n\n cmsPageCount++;\n }\n\n if (Object.keys(perSlugData).length > 0) {\n cmsEmissions.push({\n schema: cmsSchema,\n locale: localeCode,\n pathPrefix,\n isDefaultLocale: isDefault,\n perSlugData,\n });\n }\n }\n } catch (error) {\n const err = error as { message?: string };\n console.error(` Error processing template ${file}:`, err?.message || error);\n errorCount++;\n }\n }\n }\n\n // ----------------------------------------------------------\n // 7. Write extracted scripts to public/_scripts/\n // ----------------------------------------------------------\n for (const [hash, js] of jsContents) {\n writePageScript(js, scriptsDir);\n // touch to mark as referenced (writePageScript handles dedup internally)\n void hash;\n }\n\n // ----------------------------------------------------------\n // 8. Generate global CSS\n // ----------------------------------------------------------\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 const utilityCSS = allUtilityClasses.size > 0\n ? generateUtilityCSS(allUtilityClasses, breakpoints, responsiveScales, remConversionConfig)\n : '';\n const interactiveStylesCSS = allInteractiveStyles.size > 0\n ? generateAllInteractiveCSS(allInteractiveStyles, breakpoints, remConversionConfig, responsiveScales)\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 // Tailwind v4 inline safelist \u2014 every class referenced by a runtime mapping\n // needs to survive purging. The dynamic markup is inside string literals so\n // Tailwind's source scan won't pick them up otherwise.\n const safelistDirectives = Array.from(mappingClasses)\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 = [\n tailwindDirectives,\n fontCSS,\n themeColorCSS,\n variablesCSS,\n baseCSS,\n utilityCSS,\n componentCSSCombined,\n interactiveStylesCSS,\n ].filter(Boolean).join('\\n\\n');\n\n await writeFile(join(appDir, 'globals.css'), globalCSS, 'utf-8');\n\n // ----------------------------------------------------------\n // 9. Generate shared layout (app/layout.tsx) + helper components\n // ----------------------------------------------------------\n const projectName = (projectConfig as { name?: string } | null | undefined)?.name || 'Site';\n const rootLayoutContent = `// Auto-generated by meno-core/build-next. Do not edit.\nimport './globals.css';\n\nexport const metadata = {\n title: ${JSON.stringify(projectName)},\n};\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n <html lang=${JSON.stringify(i18nConfig.defaultLocale)} data-theme=${JSON.stringify(defaultTheme)} suppressHydrationWarning>\n <head>\n <meta charSet=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n </head>\n <body>{children}</body>\n </html>\n );\n}\n`;\n await writeFile(join(appDir, 'layout.tsx'), rootLayoutContent, 'utf-8');\n\n // RawHead: dumps a raw HTML string into <head>. React 19 will hoist\n // <link>/<meta>/<title> elements emitted via dangerouslySetInnerHTML, but\n // <style>/<script>/inline tags need a stable target \u2014 we mount this as a\n // hidden marker and let the script in app/layout.tsx (or the browser HTML\n // parser) handle the rest. For Next.js static export the SSR pipeline\n // serializes everything verbatim, so a simple inline strategy works.\n const rawHeadContent = `// Auto-generated by meno-core/build-next. Do not edit.\n// Renders an arbitrary HTML string. Used for head fragments emitted by the\n// SSR pipeline (font preloads, icon links, customCode.head, library tags)\n// and per-locale data-theme/lang updates. Because this is a server component,\n// the HTML appears in the statically exported file as-is.\n\nexport default function RawHead({ html, locale, theme }: { html: string; locale: string; theme: string }) {\n return (\n <>\n {/* Force locale/theme on <html> via a lightweight inline script. */}\n <script\n dangerouslySetInnerHTML={{\n __html: \\`document.documentElement.lang=\\${JSON.stringify(locale)};document.documentElement.dataset.theme=\\${JSON.stringify(theme)};\\`,\n }}\n />\n {html ? <span data-meno-head dangerouslySetInnerHTML={{ __html: html }} style={{ display: 'none' }} /> : null}\n </>\n );\n}\n`;\n await writeFile(join(componentsDir, 'RawHead.tsx'), rawHeadContent, 'utf-8');\n\n // MetaTags: parses an HTML meta-tag string into React elements that React 19\n // can hoist to <head>. Used by CMS pages where the meta varies per slug.\n const metaTagsContent = `// Auto-generated by meno-core/build-next. Do not edit.\n// Parses a string of self-closing <meta>/<link>/<title> tags emitted by\n// meno-core's generateMetaTags() into React elements. React 19 hoists these\n// to <head> automatically.\n\ntype MetaEl =\n | { kind: 'title'; text: string }\n | { kind: 'meta' | 'link'; attrs: Record<string, string> };\n\nfunction decodeEntities(s: string): string {\n return s\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&');\n}\n\nfunction parseAttrs(src: string): Record<string, string> {\n const out: Record<string, string> = {};\n const re = /([a-zA-Z_:][\\\\w:.-]*)\\\\s*=\\\\s*\"([^\"]*)\"/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(src)) !== null) {\n out[match[1]] = decodeEntities(match[2]);\n }\n return out;\n}\n\nconst JSX_ATTR_NAMES: Record<string, string> = {\n 'http-equiv': 'httpEquiv',\n 'hreflang': 'hrefLang',\n 'crossorigin': 'crossOrigin',\n 'referrerpolicy': 'referrerPolicy',\n 'imagesrcset': 'imageSrcSet',\n 'imagesizes': 'imageSizes',\n 'fetchpriority': 'fetchPriority',\n 'class': 'className',\n 'for': 'htmlFor',\n 'charset': 'charSet',\n};\n\nfunction jsxAttrName(name: string): string {\n return JSX_ATTR_NAMES[name] ?? name;\n}\n\nfunction parseMeta(html: string): MetaEl[] {\n if (!html) return [];\n const lines = html.split(/\\\\r?\\\\n/).map((l) => l.trim()).filter(Boolean);\n const out: MetaEl[] = [];\n for (const line of lines) {\n const titleMatch = line.match(/^<title>([\\\\s\\\\S]*?)<\\\\/title>$/);\n if (titleMatch) {\n out.push({ kind: 'title', text: decodeEntities(titleMatch[1]) });\n continue;\n }\n const selfMatch = line.match(/^<(meta|link)\\\\s+([\\\\s\\\\S]*?)\\\\s*\\\\/?>$/);\n if (selfMatch) {\n out.push({ kind: selfMatch[1] as 'meta' | 'link', attrs: parseAttrs(selfMatch[2]) });\n }\n }\n return out;\n}\n\nexport default function MetaTags({ html }: { html: string }) {\n const els = parseMeta(html);\n return (\n <>\n {els.map((el, i) => {\n if (el.kind === 'title') return <title key={i}>{el.text}</title>;\n const attrs: Record<string, string> = {};\n for (const [k, v] of Object.entries(el.attrs)) attrs[jsxAttrName(k)] = v;\n if (el.kind === 'meta') return <meta key={i} {...attrs} />;\n return <link key={i} {...attrs} />;\n })}\n </>\n );\n}\n`;\n await writeFile(join(componentsDir, 'MetaTags.tsx'), metaTagsContent, 'utf-8');\n\n // ----------------------------------------------------------\n // 10. Emit regular page files (app/<path>/page.tsx)\n // ----------------------------------------------------------\n for (const result of allResults) {\n const scriptPaths: string[] = result.javascript\n ? [`/_scripts/${hashContent(result.javascript)}.js`]\n : [];\n\n const route = urlPathToAppRoute(result.urlPath);\n const targetDir = route.isRoot ? appDir : join(appDir, route.dir);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n const pageFilePath = join(targetDir, 'page.tsx');\n\n // Patch the RawHead import path so it correctly resolves from the page's\n // location. app/page.tsx \u2192 './components/RawHead'; app/about/page.tsx \u2192\n // '../components/RawHead'; app/pl/about/page.tsx \u2192 '../../components/RawHead'.\n const depth = route.isRoot ? 0 : route.dir.split('/').length;\n const rawHeadImportPath = depth === 0 ? './components/RawHead' : '../'.repeat(depth) + 'components/RawHead';\n\n let content = emitNextPage({\n html: result.html,\n meta: result.meta,\n title: result.title,\n locale: result.locale,\n theme: defaultTheme,\n fontPreloads,\n libraryTags,\n scriptPaths,\n customCode,\n iconTagsHtml,\n formHandlerNeeded: projectNeedsFormHandler,\n });\n content = content.replace(\n \"import RawHead from '../components/RawHead';\",\n `import RawHead from '${rawHeadImportPath}';`\n );\n\n await writeFile(pageFilePath, content, 'utf-8');\n }\n\n // ----------------------------------------------------------\n // 11. Emit CMS dynamic [slug] pages\n // ----------------------------------------------------------\n for (const emission of cmsEmissions) {\n const { locale, pathPrefix, isDefaultLocale, perSlugData } = emission;\n\n // Route folder for the [slug] segment:\n // pattern \"/blog/{{slug}}\" + default locale \u2192 app/blog/[slug]\n // pattern \"/blog/{{slug}}\" + locale \"pl\" \u2192 app/pl/blog/[slug]\n // pattern \"/{{slug}}\" + default locale \u2192 app/[slug]\n // pattern \"/{{slug}}\" + locale \"pl\" \u2192 app/pl/[slug]\n const segments: string[] = [];\n if (!isDefaultLocale) segments.push(locale);\n if (pathPrefix) {\n // Split nested prefixes (e.g. \"blog/posts\") into individual segments so\n // depth-based imports below count correctly.\n for (const part of pathPrefix.split('/').filter(Boolean)) {\n segments.push(part);\n }\n }\n segments.push('[slug]');\n const routeDir = join(appDir, ...segments);\n mkdirSync(routeDir, { recursive: true });\n\n // Compute the correct relative path back to app/components/* from the\n // page file. The file lives at app/<segments...>/page.tsx.\n const depth = segments.length;\n const upToApp = '../'.repeat(depth);\n\n let content = emitNextCMSPage({\n slugs: Object.keys(perSlugData),\n perSlugData,\n locale,\n theme: defaultTheme,\n fontPreloads,\n libraryTags,\n customCode,\n iconTagsHtml,\n formHandlerNeeded: projectNeedsFormHandler,\n });\n\n // Replace placeholder import paths with the right relative depth. The\n // initial emit hardcodes '../../components/*' for the depth-2 common case;\n // patch it here so all depths work uniformly.\n content = content.replace(\n \"import RawHead from '../../components/RawHead';\",\n `import RawHead from '${upToApp}components/RawHead';`,\n );\n content = content.replace(\n \"import MetaTags from '../../components/MetaTags';\",\n `import MetaTags from '${upToApp}components/MetaTags';`,\n );\n\n const pageFile = join(routeDir, 'page.tsx');\n await writeFile(pageFile, content, 'utf-8');\n }\n\n // ----------------------------------------------------------\n // 12. Copy assets\n // ----------------------------------------------------------\n const imagesSrcDir = join(projectPaths.project, 'images');\n if (existsSync(imagesSrcDir)) {\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 const librariesDir = join(projectPaths.project, 'libraries');\n if (existsSync(librariesDir)) {\n copyDirectory(librariesDir, join(publicDir, 'libraries'));\n }\n\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 // 13. Scaffold files (package.json, next.config.mjs, tsconfig.json, etc.)\n // ----------------------------------------------------------\n const packageJson = {\n name: 'next-export',\n type: 'module',\n version: '0.0.1',\n private: true,\n scripts: {\n dev: 'next dev',\n build: 'next build',\n start: 'next start',\n },\n dependencies: {\n next: '^15.0.0',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n '@tailwindcss/postcss': '^4.0.0',\n tailwindcss: '^4.0.0',\n },\n devDependencies: {\n '@types/node': '^22.0.0',\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n typescript: '^5.6.0',\n },\n };\n await writeFile(join(outDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');\n\n // next.config.mjs \u2014 static export so the built site is a folder of HTML files,\n // matching the Astro export's `astro build` behavior.\n const nextConfig = `/** @type {import('next').NextConfig} */\nconst nextConfig = {\n output: 'export',${siteUrl ? `\\n // Set NEXT_PUBLIC_SITE_URL=${siteUrl} for absolute URLs in metadata.` : ''}\n images: { unoptimized: true },\n trailingSlash: false,\n // The SSR HTML contains arbitrary inline scripts and styles; disable\n // automatic font/image transforms so they survive unchanged.\n experimental: {\n optimizePackageImports: [],\n },\n};\n\nexport default nextConfig;\n`;\n await writeFile(join(outDir, 'next.config.mjs'), nextConfig, 'utf-8');\n\n // postcss.config.mjs \u2014 Tailwind v4 uses a PostCSS plugin for class generation.\n const postcssConfig = `export default {\n plugins: {\n '@tailwindcss/postcss': {},\n },\n};\n`;\n await writeFile(join(outDir, 'postcss.config.mjs'), postcssConfig, 'utf-8');\n\n // tsconfig.json\n const tsConfig = {\n compilerOptions: {\n target: 'ES2022',\n lib: ['dom', 'dom.iterable', 'esnext'],\n allowJs: true,\n skipLibCheck: true,\n strict: true,\n noEmit: true,\n esModuleInterop: true,\n module: 'esnext',\n moduleResolution: 'bundler',\n resolveJsonModule: true,\n isolatedModules: true,\n jsx: 'preserve',\n incremental: true,\n plugins: [{ name: 'next' }],\n paths: { '@/*': ['./*'] },\n },\n include: ['next-env.d.ts', '**/*.ts', '**/*.tsx', '.next/types/**/*.ts'],\n exclude: ['node_modules'],\n };\n await writeFile(join(outDir, 'tsconfig.json'), JSON.stringify(tsConfig, null, 2), 'utf-8');\n\n await writeFile(\n join(outDir, 'next-env.d.ts'),\n `/// <reference types=\"next\" />\\n/// <reference types=\"next/image-types/global\" />\\n`,\n 'utf-8'\n );\n\n // .gitignore \u2014 keep the exported project clean when committed.\n const gitignore = [\n 'node_modules',\n '.next',\n 'out',\n '.DS_Store',\n '*.log',\n ].join('\\n') + '\\n';\n await writeFile(join(outDir, '.gitignore'), gitignore, 'utf-8');\n\n // README \u2014 quick start, mirrors what Astro export ships.\n const readme = `# Next.js export\n\nThis project was generated by Meno from the SSR-rendered HTML of your pages.\n\n## Run locally\n\n\\`\\`\\`bash\nnpm install\nnpm run dev\n\\`\\`\\`\n\nOpen http://localhost:3000.\n\n## Build a static site\n\n\\`\\`\\`bash\nnpm run build\n\\`\\`\\`\n\nOutput lands in \\`./out\\` (configured via \\`output: 'export'\\` in \\`next.config.mjs\\`).\n\n## How this differs from a hand-written Next.js app\n\n- Each page is a server component that embeds the SSR HTML via \\`dangerouslySetInnerHTML\\`.\n- Interactive behavior lives in the inline scripts inside that HTML \u2014 they run when the browser parses the static file.\n- Tailwind v4 is used for utility classes; safelisted classes referenced only by runtime mappings live in \\`app/globals.css\\`.\n- Routing is plain App Router: one \\`page.tsx\\` per URL, with \\`[slug]\\` dynamic segments for CMS collections.\n`;\n await writeFile(join(outDir, 'README.md'), readme, 'utf-8');\n\n // ----------------------------------------------------------\n // 14. Summary\n // ----------------------------------------------------------\n const collectionCount = templateSchemas.length;\n\n // Use the dummy reference so the linter doesn't complain about\n // escapeSingleQuoted being unused \u2014 it's exported-style helper kept for\n // future expansions (e.g. parameterized CMS metadata).\n void escapeSingleQuoted;\n\n return {\n pages: allResults.length,\n cmsPages: cmsPageCount,\n collections: collectionCount,\n errors: errorCount,\n };\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 {\n ComponentService,\n type ComponentInfo,\n type ComponentLoader,\n type ComponentWriter,\n type ComponentServiceFs,\n} 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// Draft page store (in-memory unsaved page versions for live preview)\nexport { DraftPageStore } from './draftPageStore';\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// Next.js export\nexport { buildNextProject } from '../../build-next';\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
- "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", "mkdirSync", "rmSync", "statSync", "copyFileSync", "writeFileSync", "writeFile", "readFile", "join", "createHash", "hashContent", "createHash", "writePageScript", "existsSync", "mkdirSync", "join", "writeFileSync", "copyDirectory", "readdirSync", "statSync", "copyFileSync", "isCMSPage", "scanJSONFiles", "escapeTemplateLiteral", "rmSync", "readFile", "writeFile", "existsSync", "readdirSync", "join", "isStyleMapping", "isResponsiveStyle", "collectStyleMappings", "readFile", "join", "buildElementClass", "join", "readFile", "isResponsiveStyleObject", "emitHtmlNode", "emitComponentInstance", "emitSlotMarker", "emitEmbedNode", "emitLinkNode", "emitListNode", "emitLocaleListNode", "singularize", "emitListNode", "singularize", "emitLocaleListNode", "buildElementClass", "scanJSONFiles", "existsSync", "readdirSync", "join", "isCMSPage", "readFile"]
3
+ "sources": ["../../../lib/server/websocketManager.ts", "../../../lib/server/routes/index.ts", "../../../lib/server/middleware/cors.ts", "../../../lib/server/middleware/errorHandler.ts", "../../../lib/server/middleware/logger.ts", "../../../lib/server/routes/api/core-routes.ts", "../../../lib/server/projectContext.ts", "../../../lib/server/runtime/bundler.ts", "../../../lib/server/runtime/httpServer.ts", "../../../lib/server/runtime/index.ts", "../../../lib/server/services/configService.ts", "../../../lib/shared/fontLoader.ts", "../../../lib/server/routes/api/pages.ts", "../../../lib/server/jsonLoader.ts", "../../../lib/shared/jsonRepair.ts", "../../../lib/server/routes/api/shared.ts", "../../../lib/server/routes/api/components.ts", "../../../lib/server/routes/api/config.ts", "../../../lib/server/services/CachedConfigLoader.ts", "../../../lib/server/services/ColorService.ts", "../../../lib/server/routes/api/colors.ts", "../../../lib/server/services/VariableService.ts", "../../../lib/server/cssGenerator.ts", "../../../lib/server/routes/api/variables.ts", "../../../lib/server/services/EnumService.ts", "../../../lib/server/routes/api/enums.ts", "../../../lib/server/routes/api/cms.ts", "../../../lib/server/routes/api/functions.ts", "../../../lib/server/routes/api/index.ts", "../../../lib/server/routes/pages.ts", "../../../lib/shared/cmsQuery.ts", "../../../lib/server/ssr/ssrRenderer.ts", "../../../lib/server/validateStyleCoverage.ts", "../../../lib/server/ssr/attributeBuilder.ts", "../../../lib/server/ssr/metaTagGenerator.ts", "../../../lib/server/ssr/cssCollector.ts", "../../../lib/server/ssr/jsCollector.ts", "../../../lib/server/ssr/cmsSSRProcessor.ts", "../../../lib/server/ssr/imageMetadata.ts", "../../../lib/client/scripts/formHandler.ts", "../../../lib/client/meno-filter/script.generated.ts", "../../../lib/server/ssr/clientDataInjector.ts", "../../../lib/server/ssr/htmlGenerator.ts", "../../../lib/client/meno-filter/MenoFilter.ts", "../../../lib/client/meno-filter/constants.ts", "../../../lib/client/meno-filter/bindings.ts", "../../../lib/client/meno-filter/utils.ts", "../../../lib/client/meno-filter/renderer.ts", "../../../lib/client/meno-filter/updates.ts", "../../../lib/client/meno-filter/init.ts", "../../../lib/shared/pathUtils.ts", "../../../lib/server/ssr/errorOverlay.ts", "../../../lib/server/scriptCache.ts", "../../../lib/server/routes/static.ts", "../../../lib/server/createServer.ts", "../../../lib/server/ssr/buildErrorOverlay.ts", "../../../lib/server/services/pageService.ts", "../../../lib/server/utils/jsonLineMapper.ts", "../../../lib/server/services/componentService.ts", "../../../lib/server/services/cmsService.ts", "../../../lib/server/providers/fileSystemCMSProvider.ts", "../../../lib/server/pageCache.ts", "../../../lib/server/draftPageStore.ts", "../../../lib/server/fileWatcher.ts", "../../../lib/server/services/fileWatcherService.ts", "../../../lib/server/migrateTemplates.ts", "../../../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/normalizeOrphanTemplateProps.ts", "../../../lib/server/astro/cmsPageEmitter.ts", "../../../lib/server/astro/cssCollector.ts", "../../../lib/server/index.ts"],
4
+ "sourcesContent": ["/**\n * WebSocket Manager\n * Manages WebSocket connections for HMR\n */\n\nimport type { HMRMessage } from '../shared/types';\nimport { WEBSOCKET_STATES } from '../shared/constants';\nimport type { RuntimeWSClient } from './runtime';\n\nexport class WebSocketManager {\n private clients = new Set<RuntimeWSClient>();\n\n /**\n * Add a WebSocket client\n */\n addClient(ws: RuntimeWSClient): void {\n this.clients.add(ws);\n }\n\n /**\n * Remove a WebSocket client\n */\n removeClient(ws: RuntimeWSClient): void {\n this.clients.delete(ws);\n }\n\n /**\n * Broadcast message to all connected clients\n */\n broadcast(message: HMRMessage | string): void {\n const messageStr = typeof message === 'string' ? message : JSON.stringify(message);\n\n for (const ws of this.clients) {\n if (ws.readyState === WEBSOCKET_STATES.OPEN) {\n ws.send(messageStr);\n }\n }\n }\n\n /**\n * Broadcast update notification\n */\n broadcastUpdate(path?: string): void {\n this.broadcast({\n type: 'hmr:update',\n path: path || 'all',\n });\n }\n\n /**\n * Broadcast colors/themes update notification\n */\n broadcastColorsUpdate(): void {\n this.broadcast({\n type: 'hmr:colors-update',\n });\n }\n\n /**\n * Broadcast variables update notification\n */\n broadcastVariablesUpdate(): void {\n this.broadcast({\n type: 'hmr:variables-update',\n });\n }\n\n /**\n * Broadcast fonts update notification\n */\n broadcastFontsUpdate(): void {\n this.broadcast({\n type: 'hmr:fonts-update',\n });\n }\n\n /**\n * Broadcast libraries update notification\n */\n broadcastLibrariesUpdate(): void {\n this.broadcast({\n type: 'hmr:libraries-update',\n });\n }\n\n /**\n * Broadcast enums update notification\n */\n broadcastEnumsUpdate(): void {\n this.broadcast({\n type: 'hmr:enums-update',\n });\n }\n\n /**\n * Broadcast CMS content update notification\n */\n broadcastCMSUpdate(collection: string): void {\n this.broadcast({\n type: 'hmr:cms-update',\n collection,\n });\n }\n\n /**\n * Broadcast CMS collections-list update notification.\n * Emitted when a template file is added, removed, or its schema changes \u2014\n * tells connected clients to re-fetch the collections list.\n */\n broadcastCollectionsUpdate(): void {\n this.broadcast({\n type: 'hmr:cms-collections-update',\n });\n }\n\n /**\n * Broadcast project.config.json update notification.\n * Emitted when project.config.json changes (e.g. an AI tool adds a new\n * locale) \u2014 tells connected clients to re-fetch config-derived state\n * such as the i18n locale list.\n */\n broadcastConfigUpdate(): void {\n this.broadcast({\n type: 'hmr:config-update',\n });\n }\n\n /**\n * Broadcast external-stylesheet update notification. Emitted when a project CSS\n * file outside the watched categories changes (e.g. a mirror-import class edit\n * via /api/element-styles/update) \u2014 tells the canvas to cache-bust its `<link>`\n * stylesheets and repaint, since the file watcher doesn't cover public/ CSS.\n */\n broadcastStylesheetUpdate(): void {\n this.broadcast({\n type: 'hmr:stylesheet-update',\n });\n }\n\n /**\n * Get number of connected clients\n */\n getClientCount(): number {\n return this.clients.size;\n }\n\n /**\n * Clear all clients\n */\n clear(): void {\n this.clients.clear();\n }\n\n /**\n * Get all clients\n */\n getClients(): Set<RuntimeWSClient> {\n return new Set(this.clients);\n }\n\n /**\n * Check if any clients are connected\n */\n hasClients(): boolean {\n return this.clients.size > 0;\n }\n}\n", "/**\n * Route Registration\n * Centralized route handling with middleware\n */\n\nimport type { PageService } from '../services/pageService';\nimport type { ComponentService } from '../services/componentService';\nimport type { CMSService } from '../services/cmsService';\nimport type { CMSProvider } from '../../shared/interfaces/contentProvider';\nimport type { WebSocketManager } from '../websocketManager';\nimport type { DraftPageStore } from '../draftPageStore';\nimport { HMR_ROUTE } from '../../shared/constants';\nimport { handleCorsPreflight } from '../middleware/cors';\nimport { handleRouteError } from '../middleware/errorHandler';\nimport { logRequest, logResponseTime } from '../middleware/logger';\nimport { handleApiRoutes, type CMSRouteContext } from './api/index';\nimport { handlePageRoute } from './pages';\nimport { handleStaticRoute } from './static';\nimport { getScript } from '../scriptCache';\nimport { loadI18nConfig } from '../jsonLoader';\nimport { parseLocaleFromPath } from '../../shared/i18n';\n\nexport interface RouteContext {\n pageService: PageService;\n componentService: ComponentService;\n cmsService?: CMSService;\n cmsProvider?: CMSProvider;\n /**\n * Inject live reload script for on-demand SSR preview mode.\n * When true, pages include a WebSocket client that reloads on HMR messages.\n */\n injectLiveReload?: boolean;\n /** Whether this is the visual editor (studio). Affects library filtering. */\n isEditor?: boolean;\n /** Actual bound server port, used to connect live reload WS directly to SSR server */\n serverPort?: number;\n /**\n * WebSocket manager for this server. Used by the /__draft-page endpoint\n * to nudge live-reload clients (external browser tabs) to refetch after a\n * draft pageData has been stored on the server.\n */\n wsManager?: WebSocketManager;\n /**\n * In-memory draft page store. When the page route finds a draft for the\n * requested path it renders from that instead of disk, so external\n * browser tabs see the editor's in-flight edits without anything being\n * persisted.\n */\n draftPageStore?: DraftPageStore;\n}\n\n/**\n * Handle all routes with middleware\n */\nexport async function handleRoutes(\n req: Request,\n url: URL,\n _server: any,\n context: RouteContext,\n): Promise<Response | undefined> {\n const startTime = Date.now();\n const { pageService, componentService, cmsService, cmsProvider } = context;\n\n // Log request\n logRequest(req);\n\n // Handle CORS preflight requests\n const corsResponse = handleCorsPreflight(req);\n if (corsResponse) {\n logResponseTime(startTime, req);\n return corsResponse;\n }\n\n try {\n // WebSocket upgrade is now handled by the HTTP server abstraction\n // (in createServer's fetch handler before calling handleRoutes)\n if (url.pathname === HMR_ROUTE) {\n logResponseTime(startTime, req);\n return undefined;\n }\n\n // Ephemeral draft-page channel for external browser tabs.\n // POST /__draft-page body: { path, content } \u2014 store draft + nudge clients\n // POST /__draft-page/clear body: { path } \u2014 drop draft (e.g. after save)\n // GET /__draft-page/clients \u2014 probe connected-client count\n //\n // The studio fire-and-forgets POSTs here while the user edits. We bail\n // before parsing the body when no external tab is listening, so this\n // path costs ~zero in the common case.\n if (url.pathname === '/__draft-page' && req.method === 'POST') {\n const corsHeaders = { 'Access-Control-Allow-Origin': '*' };\n const store = context.draftPageStore;\n const ws = context.wsManager;\n if (!store || !ws || ws.getClientCount() === 0) {\n logResponseTime(startTime, req);\n return new Response(null, { status: 204, headers: corsHeaders });\n }\n try {\n const body = (await req.json()) as { path?: string; content?: string };\n if (typeof body.path === 'string' && typeof body.content === 'string' && body.path.startsWith('/')) {\n store.set(body.path, body.content);\n // Nudge connected tabs to refetch. The existing live-reload\n // script does a smart-diff hotReload off this message and will\n // pull the draft-rendered HTML (classes + utility CSS together).\n ws.broadcastUpdate(body.path);\n }\n } catch {\n // Drop silently \u2014 studio retries on next commit.\n }\n logResponseTime(startTime, req);\n return new Response(null, { status: 204, headers: corsHeaders });\n }\n\n if (url.pathname === '/__draft-page/clear' && req.method === 'POST') {\n const corsHeaders = { 'Access-Control-Allow-Origin': '*' };\n const store = context.draftPageStore;\n if (store) {\n try {\n const body = (await req.json()) as { path?: string };\n if (typeof body.path === 'string') {\n store.clear(body.path);\n // External tabs viewing this path should refetch the disk\n // version now that the draft is gone.\n context.wsManager?.broadcastUpdate(body.path);\n }\n } catch {\n /* ignore */\n }\n }\n logResponseTime(startTime, req);\n return new Response(null, { status: 204, headers: corsHeaders });\n }\n\n if (url.pathname === '/__draft-page/clients' && req.method === 'GET') {\n const count = context.wsManager?.getClientCount() ?? 0;\n logResponseTime(startTime, req);\n return new Response(JSON.stringify({ count }), {\n status: 200,\n headers: {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-store',\n 'Access-Control-Allow-Origin': '*',\n },\n });\n }\n\n // Build CMS context if CMS service and provider are available\n const cmsContext: CMSRouteContext | undefined = cmsService && cmsProvider ? { cmsService, cmsProvider } : undefined;\n\n // API Routes\n const apiResponse = await handleApiRoutes(req, url, pageService, componentService, cmsContext);\n if (apiResponse) {\n logResponseTime(startTime, req);\n return apiResponse;\n }\n\n // CMS data routes - serve collection items as JSON for client-side filtering\n // Pattern: /data/{collection}/index.json\n if (url.pathname.startsWith('/data/') && url.pathname.endsWith('/index.json') && cmsService) {\n const match = url.pathname.match(/^\\/data\\/([^/]+)\\/index\\.json$/);\n if (match && match[1] !== undefined) {\n const collectionId = match[1];\n try {\n // Resolve locale to filter draft items\n const i18nConfig = await loadI18nConfig();\n let refererPath = '/';\n try {\n const referer = req.headers.get('referer');\n if (referer) refererPath = new URL(referer).pathname;\n } catch {\n /* ignore malformed referer */\n }\n const { locale } = parseLocaleFromPath(refererPath, i18nConfig);\n const items = await cmsService.queryItems({ collection: collectionId, excludeDraftLocale: locale });\n logResponseTime(startTime, req);\n return new Response(JSON.stringify(items), {\n headers: {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n },\n });\n } catch {\n logResponseTime(startTime, req);\n return new Response('[]', {\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n }\n\n // Serve cached scripts (SSR preview mode - same pattern as static build)\n if (url.pathname.startsWith('/_scripts/') && url.pathname.endsWith('.js')) {\n const hash = url.pathname.slice(10, -3); // Extract hash from /_scripts/{hash}.js\n const script = getScript(hash);\n if (script) {\n logResponseTime(startTime, req);\n return new Response(script, {\n headers: {\n 'Content-Type': 'application/javascript',\n 'Cache-Control': 'no-cache',\n },\n });\n }\n }\n\n // Static asset directories - serve before page routes\n if (\n url.pathname.startsWith('/images/') ||\n url.pathname.startsWith('/videos/') ||\n url.pathname.startsWith('/assets/') ||\n url.pathname.startsWith('/public/') ||\n url.pathname.startsWith('/icons/')\n ) {\n const response = await handleStaticRoute(url, req);\n if (response) {\n logResponseTime(startTime, req);\n return response;\n }\n }\n\n // Unknown /api/* \u2014 return a real 404 instead of falling through to the\n // SPA shell. Without this guard, an /api/foo that no handler claimed gets\n // rendered as a 200 HTML page (the catch-all below), which makes broken\n // route wiring look like a working endpoint to API clients.\n if (url.pathname.startsWith('/api/')) {\n logResponseTime(startTime, req);\n return new Response(JSON.stringify({ error: 'Not Found', path: url.pathname }), {\n status: 404,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n // Page routes (SSR)\n if (url.pathname === '/' || (url.pathname.startsWith('/') && !url.pathname.includes('.'))) {\n const response = await handlePageRoute(url, context, req);\n logResponseTime(startTime, req);\n return response;\n }\n\n // Static files\n const response = await handleStaticRoute(url, req);\n logResponseTime(startTime, req);\n return response;\n } catch (error) {\n logResponseTime(startTime, req);\n return handleRouteError(() => Promise.reject(error), `Error handling route: ${url.pathname}`);\n }\n}\n", "/**\n * CORS Middleware\n * Handles Cross-Origin Resource Sharing headers\n */\n\nexport interface CorsOptions {\n origin?: string | string[] | ((origin: string) => boolean);\n methods?: string[];\n allowedHeaders?: string[];\n credentials?: boolean;\n /**\n * The incoming request's `Origin` header. When provided alongside a function\n * or array `origin`, the matching request origin is REFLECTED (and `Vary: Origin`\n * set) so an allow-list can be enforced per-request; a non-matching origin gets\n * no `Access-Control-Allow-Origin` header at all (browser blocks it). When omitted,\n * function/array origins keep their legacy permissive/joined behavior.\n */\n requestOrigin?: string;\n}\n\nconst DEFAULT_OPTIONS: CorsOptions = {\n origin: '*',\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowedHeaders: ['Content-Type', 'Authorization'],\n credentials: false,\n};\n\n/**\n * Create CORS headers for a response\n */\nexport function createCorsHeaders(options: CorsOptions = {}): Record<string, string> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const headers: Record<string, string> = {};\n\n // Handle origin\n if (opts.origin) {\n if (typeof opts.origin === 'function') {\n if (opts.requestOrigin !== undefined) {\n // Allow-list mode: reflect the request Origin only when the predicate\n // accepts it; otherwise emit no ACAO header so the browser blocks it.\n if (opts.origin(opts.requestOrigin)) {\n headers['Access-Control-Allow-Origin'] = opts.requestOrigin;\n headers.Vary = 'Origin';\n }\n } else {\n // No request Origin to evaluate against \u2014 legacy permissive fallback.\n headers['Access-Control-Allow-Origin'] = '*';\n }\n } else if (Array.isArray(opts.origin)) {\n if (opts.requestOrigin !== undefined) {\n // Allow-list mode: reflect the request Origin only when it's listed.\n if (opts.origin.includes(opts.requestOrigin)) {\n headers['Access-Control-Allow-Origin'] = opts.requestOrigin;\n headers.Vary = 'Origin';\n }\n } else {\n headers['Access-Control-Allow-Origin'] = opts.origin.join(', ');\n }\n } else {\n headers['Access-Control-Allow-Origin'] = opts.origin;\n }\n }\n\n // Handle methods\n if (opts.methods && opts.methods.length > 0) {\n headers['Access-Control-Allow-Methods'] = opts.methods.join(', ');\n }\n\n // Handle headers\n if (opts.allowedHeaders && opts.allowedHeaders.length > 0) {\n headers['Access-Control-Allow-Headers'] = opts.allowedHeaders.join(', ');\n }\n\n // Handle credentials\n if (opts.credentials) {\n headers['Access-Control-Allow-Credentials'] = 'true';\n }\n\n return headers;\n}\n\n/**\n * Handle CORS preflight requests\n */\nexport function handleCorsPreflight(req: Request, options: CorsOptions = {}): Response | null {\n if (req.method === 'OPTIONS') {\n return new Response(null, {\n status: 204,\n headers: createCorsHeaders(options),\n });\n }\n return null;\n}\n", "/**\n * Error Handler Middleware\n * Centralized error handling for routes\n */\n\nexport interface ErrorResponse {\n error: string;\n message?: string;\n status: number;\n}\n\n/**\n * Create an error response\n */\nexport function createErrorResponse(error: unknown, status: number = 500, message?: string): Response {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const response: ErrorResponse = {\n error: errorMessage,\n status,\n };\n\n if (message) {\n response.message = message;\n }\n\n return new Response(JSON.stringify(response), {\n status,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n}\n\n/**\n * Handle errors in async route handlers\n */\nexport async function handleRouteError(\n handler: () => Promise<Response>,\n errorMessage: string = 'Internal server error',\n): Promise<Response> {\n try {\n return await handler();\n } catch (error) {\n return createErrorResponse(error, 500, errorMessage);\n }\n}\n\n/**\n * Wrap a route handler with error handling\n */\nexport function withErrorHandling<T extends unknown[]>(\n handler: (...args: T) => Promise<Response>,\n errorMessage?: string,\n): (...args: T) => Promise<Response> {\n return async (...args: T) => {\n return handleRouteError(() => handler(...args), errorMessage);\n };\n}\n", "/**\n * Logger Middleware\n * Request logging for development and debugging\n */\n\nexport interface LogOptions {\n logRequests?: boolean;\n logErrors?: boolean;\n logResponseTime?: boolean;\n}\n\nconst DEFAULT_OPTIONS: LogOptions = {\n logRequests: true,\n logErrors: true,\n logResponseTime: true,\n};\n\n/**\n * Log a request\n */\nexport function logRequest(req: Request, options: LogOptions = {}): void {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n if (!opts.logRequests) {\n return;\n }\n\n const _url = new URL(req.url);\n const _timestamp = new Date().toISOString();\n}\n\n/**\n * Log an error\n */\nexport function logError(error: unknown, context?: string, options: LogOptions = {}): void {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n if (!opts.logErrors) {\n return;\n }\n\n const _timestamp = new Date().toISOString();\n const _contextStr = context ? ` [${context}]` : '';\n const _errorMessage = error instanceof Error ? error.message : String(error);\n\n if (error instanceof Error && error.stack) {\n }\n}\n\n/**\n * Log response time\n */\nexport function logResponseTime(startTime: number, req: Request, options: LogOptions = {}): void {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n if (!opts.logResponseTime) {\n return;\n }\n\n const _url = new URL(req.url);\n const _duration = Date.now() - startTime;\n}\n\n/**\n * Wrap a route handler with logging\n */\nexport function withLogging<T extends unknown[]>(\n handler: (...args: T) => Promise<Response>,\n options: LogOptions = {},\n): (...args: T) => Promise<Response> {\n return async (...args: T) => {\n const startTime = Date.now();\n const req = args[0] as Request;\n\n logRequest(req, options);\n\n try {\n const response = await handler(...args);\n logResponseTime(startTime, req, options);\n return response;\n } catch (error) {\n logError(error, req.method, options);\n logResponseTime(startTime, req, options);\n throw error;\n }\n };\n}\n", "/**\n * Core API Routes (Read-only)\n * These routes are part of meno-core and handle read operations\n */\n\nimport { API_ROUTES } from '../../../shared/constants';\nimport type { PageService } from '../../services/pageService';\nimport type { ComponentService } from '../../services/componentService';\nimport type { CMSService } from '../../services/cmsService';\nimport { configService } from '../../services/configService';\nimport { handleRouteError } from '../../middleware/errorHandler';\nimport { generateFontCSS, loadProjectConfig } from '../../../shared/fontLoader';\n\n// Import route handlers\nimport * as pagesRoutes from './pages';\nimport * as componentsRoutes from './components';\nimport * as configRoutes from './config';\nimport * as colorsRoutes from './colors';\nimport * as variablesRoutes from './variables';\nimport * as enumsRoutes from './enums';\nimport * as cmsRoutes from './cms';\nimport { handleFunctionsRoute, handleFunctionsPreflight } from './functions';\n\n/** Context for core API routes */\nexport interface CoreRouteContext {\n pageService: PageService;\n componentService: ComponentService;\n cmsService?: CMSService;\n}\n\n/**\n * Handle core API routes (read-only operations)\n * Returns undefined if route is not handled\n */\nexport async function handleCoreApiRoutes(\n req: Request,\n url: URL,\n context: CoreRouteContext,\n): Promise<Response | undefined> {\n const { pageService, componentService, cmsService } = context;\n\n // Handle CORS preflight for project functions\n const preflightResponse = handleFunctionsPreflight(req, url);\n if (preflightResponse) {\n return preflightResponse;\n }\n\n // Handle project functions (e.g., /api/contact -> functions/api/contact.ts)\n const functionsResponse = await handleFunctionsRoute(req, url);\n if (functionsResponse) {\n return functionsResponse;\n }\n\n // Pages API routes (read-only)\n if (url.pathname === API_ROUTES.PAGES && req.method === 'GET') {\n return await handleRouteError(\n () => Promise.resolve(pagesRoutes.handlePagesRoute(pageService)),\n 'Failed to fetch pages list',\n );\n }\n\n if (url.pathname.startsWith(API_ROUTES.PAGE_DATA) && req.method === 'GET') {\n return await handleRouteError(\n () => Promise.resolve(pagesRoutes.handlePageDataRoute(url, pageService)),\n 'Failed to fetch page data',\n );\n }\n\n if (url.pathname === API_ROUTES.PAGE_CONTENT && req.method === 'GET') {\n return await handleRouteError(\n () => Promise.resolve(pagesRoutes.handlePageContentRoute(req, url, pageService)),\n 'Failed to fetch page content',\n );\n }\n\n // Components API routes (read-only)\n if (url.pathname === API_ROUTES.COMPONENTS && req.method === 'GET') {\n return await handleRouteError(\n () => Promise.resolve(componentsRoutes.handleComponentsRoute(req, componentService)),\n 'Failed to fetch components list',\n );\n }\n\n if (url.pathname.startsWith('/api/component-data/') && req.method === 'GET') {\n return await handleRouteError(\n () => Promise.resolve(componentsRoutes.handleComponentDataRoute(url, componentService)),\n 'Failed to fetch component data',\n );\n }\n\n if (url.pathname.startsWith('/api/component-js/') && req.method === 'GET') {\n return await handleRouteError(\n () => componentsRoutes.handleComponentJavaScriptRoute(url, componentService),\n 'Failed to fetch component JavaScript',\n );\n }\n\n // Config API routes (read-only)\n if (url.pathname === '/api/config' && req.method === 'GET') {\n return await handleRouteError(() => configRoutes.handleConfigRoute(), 'Failed to fetch config');\n }\n\n if (url.pathname === '/api/components-config' && req.method === 'GET') {\n return await handleRouteError(\n () => configRoutes.handleComponentsConfigRoute(),\n 'Failed to fetch components config',\n );\n }\n\n // Colors API routes (read-only)\n if (url.pathname === '/api/colors' && req.method === 'GET') {\n return await handleRouteError(() => colorsRoutes.handleColorsRoute(url), 'Failed to fetch colors');\n }\n\n if (url.pathname === '/api/themes' && req.method === 'GET') {\n return await handleRouteError(() => colorsRoutes.handleThemesRoute(), 'Failed to fetch themes');\n }\n\n if (url.pathname === '/api/colors-config' && req.method === 'GET') {\n return await handleRouteError(() => colorsRoutes.handleColorsConfigRoute(), 'Failed to fetch colors config');\n }\n\n if (url.pathname === '/api/colors-status' && req.method === 'GET') {\n return await handleRouteError(() => colorsRoutes.handleColorsStatusRoute(), 'Failed to fetch colors status');\n }\n\n // Variables API routes (read-only)\n if (url.pathname === '/api/variables-status' && req.method === 'GET') {\n return await handleRouteError(\n () => variablesRoutes.handleVariablesStatusRoute(),\n 'Failed to fetch variables status',\n );\n }\n\n if (url.pathname === '/api/variables-css' && req.method === 'GET') {\n return await handleRouteError(() => variablesRoutes.handleVariablesCSSRoute(), 'Failed to generate variables CSS');\n }\n\n // Fonts CSS route (read-only)\n if (url.pathname === '/api/fonts-css' && req.method === 'GET') {\n return await handleRouteError(async () => {\n await loadProjectConfig();\n const css = generateFontCSS();\n return new Response(css, {\n headers: { 'Content-Type': 'text/css' },\n });\n }, 'Failed to generate fonts CSS');\n }\n\n // Enums API route (read-only)\n if (url.pathname === '/api/enums' && req.method === 'GET') {\n return await handleRouteError(() => enumsRoutes.handleEnumsRoute(), 'Failed to fetch enums');\n }\n\n // Usage API route (for license limit checks)\n if (url.pathname === '/api/usage' && req.method === 'GET') {\n return await handleRouteError(() => {\n // Count CMS collections\n const cmsCollections = cmsService ? cmsService.getAllSchemas().size : 0;\n\n // Count pages (exclude templates directory)\n const allPages = pageService.getAllPagePaths();\n const pages = allPages.filter((p) => !p.includes('/templates/')).length;\n\n // Count locales from config\n const i18n = configService.getI18n();\n const locales = i18n.locales.length;\n\n return Promise.resolve(\n new Response(JSON.stringify({ cmsCollections, pages, locales }), {\n headers: { 'Content-Type': 'application/json' },\n }),\n );\n }, 'Failed to fetch usage stats');\n }\n\n // Component usage API route (read-only)\n if (url.pathname === API_ROUTES.COMPONENT_USAGE && req.method === 'GET') {\n return await handleRouteError(\n () => Promise.resolve(componentsRoutes.handleComponentUsageRoute(pageService, componentService)),\n 'Failed to fetch component usage',\n );\n }\n\n // Slug mappings API route (read-only)\n if (url.pathname === '/api/slug-mappings' && req.method === 'GET') {\n return await handleRouteError(\n () => Promise.resolve(pagesRoutes.handleSlugMappingsRoute(pageService)),\n 'Failed to fetch slug mappings',\n );\n }\n\n // CMS API routes (read-only - only if CMS service is available)\n if (cmsService && url.pathname.startsWith('/api/cms/')) {\n // GET /api/cms/collections - List all collections\n if (url.pathname === '/api/cms/collections' && req.method === 'GET') {\n return await handleRouteError(\n () => Promise.resolve(cmsRoutes.handleCollectionsRoute(cmsService)),\n 'Failed to fetch CMS collections',\n );\n }\n\n // GET /api/cms/collections/:collection - Get collection schema\n const collectionSchemaMatch = url.pathname.match(/^\\/api\\/cms\\/collections\\/([^/]+)$/);\n if (collectionSchemaMatch && collectionSchemaMatch[1] !== undefined && req.method === 'GET') {\n const collection = collectionSchemaMatch[1];\n return await handleRouteError(\n () => Promise.resolve(cmsRoutes.handleCollectionSchemaRoute(collection, cmsService)),\n 'Failed to fetch collection schema',\n );\n }\n\n // Parse collection and slug from path: /api/cms/:collection/:slug?\n const cmsPathMatch = url.pathname.match(/^\\/api\\/cms\\/([^/]+)(?:\\/([^/]+))?$/);\n if (cmsPathMatch && cmsPathMatch[1] !== undefined) {\n const collection = cmsPathMatch[1];\n const slug = cmsPathMatch[2];\n\n // Skip if this is the 'collections' path (handled above)\n if (collection === 'collections') {\n return undefined;\n }\n\n // GET /api/cms/:collection - List items (supports pagination via query params)\n if (!slug && req.method === 'GET') {\n return await handleRouteError(\n () => cmsRoutes.handleItemsRoute(collection, cmsService, url.searchParams),\n 'Failed to fetch CMS items',\n );\n }\n\n // GET /api/cms/:collection/:slug - Get item\n if (slug && req.method === 'GET') {\n return await handleRouteError(\n () => cmsRoutes.handleItemRoute(collection, slug, cmsService),\n 'Failed to fetch CMS item',\n );\n }\n }\n }\n\n return undefined;\n}\n", "import { join, dirname } from 'node:path';\nimport { getModuleDir } from './runtime';\n\nlet projectRoot: string = process.cwd();\n\n// Package root is where the editor files are installed (2 levels up from this file)\n// In packaged Electron builds, MENO_CORE_ROOT overrides import.meta.url resolution\nconst packageRoot = process.env.MENO_CORE_ROOT || join(dirname(getModuleDir(import.meta.url)), '..');\n\nexport function setProjectRoot(root: string): void {\n projectRoot = root;\n}\n\nexport function getProjectRoot(): string {\n return projectRoot;\n}\n\nexport function getPackageRoot(): string {\n return packageRoot;\n}\n\n// Path getters for project files (user's project)\nexport const projectPaths = {\n pages: () => join(projectRoot, 'pages'),\n templates: () => join(projectRoot, 'templates'),\n components: () => join(projectRoot, 'components'),\n fonts: () => join(projectRoot, 'fonts'),\n images: () => join(projectRoot, 'images'),\n videos: () => join(projectRoot, 'videos'),\n assets: () => join(projectRoot, 'assets'),\n icons: () => join(projectRoot, 'icons'),\n cms: () => join(projectRoot, 'cms'),\n libraries: () => join(projectRoot, 'libraries'),\n functions: () => join(projectRoot, 'functions'),\n config: () => join(projectRoot, 'project.config.json'),\n componentsConfig: () => join(projectRoot, 'components.config.json'),\n colors: () => join(projectRoot, 'colors.json'),\n variables: () => join(projectRoot, 'variables.json'),\n enums: () => join(projectRoot, 'enums.json'),\n dist: () => join(projectRoot, 'dist'),\n env: () => join(projectRoot, '.env'),\n get project() {\n return projectRoot;\n }, // Direct access to project root\n};\n\n// Path getters for package files (core assets)\n// Note: Editor-specific paths (editorHtml) are now in @meno/studio\nexport const packagePaths = {\n indexHtml: () => join(packageRoot, 'templates', 'index-router.html'),\n clientRouter: () => join(packageRoot, 'entries', 'client-router.tsx'),\n};\n\nexport function resolveProjectPath(...segments: string[]): string {\n return join(projectRoot, ...segments);\n}\n\nexport function resolvePackagePath(...segments: string[]): string {\n return join(packageRoot, ...segments);\n}\n", "/**\n * Runtime-agnostic bundler abstraction.\n * Uses Bun.build when available, falls back to esbuild for Node.js.\n */\n\nconst isBun = typeof (globalThis as any).Bun !== 'undefined';\n\nexport interface BundleResult {\n code: string;\n success: boolean;\n errors: string[];\n}\n\nexport interface BundleOptions {\n target?: 'browser' | 'node';\n format?: 'esm' | 'cjs';\n minify?: boolean;\n sourcemap?: 'inline' | 'external' | boolean;\n /** When true, throw on build errors instead of returning them */\n throw?: boolean;\n}\n\n/** The fields we read from a Bun build-log entry (`Bun.build` result `logs`). */\ninterface BunBuildLog {\n message?: string;\n position?: { file?: string; line?: number; column?: number; lineText?: string };\n}\n\n/** The fields we read from an esbuild diagnostic message (`error.errors[]`). */\ninterface EsbuildMessage {\n text?: string;\n location?: { file?: string; line?: number; column?: number; lineText?: string };\n}\n\n/** Structural shape of a thrown build error \u2014 Bun exposes `logs`, esbuild `errors`. */\ninterface BuildErrorLike {\n logs?: BunBuildLog[];\n errors?: EsbuildMessage[];\n message?: string;\n stack?: string;\n}\n\n/**\n * Bundle a file entry point.\n * Returns the bundled code as a string.\n */\nexport async function bundleFile(entrypoint: string, opts: BundleOptions = {}): Promise<BundleResult> {\n if (isBun) {\n return bundleWithBun(entrypoint, opts);\n }\n return bundleWithEsbuild(entrypoint, opts);\n}\n\n/**\n * Minify JavaScript code.\n */\nexport async function minifyJS(code: string): Promise<BundleResult> {\n if (isBun) {\n return minifyWithBun(code);\n }\n return minifyWithEsbuild(code);\n}\n\n/**\n * Validate JavaScript syntax (check for errors without producing output).\n */\nexport async function validateJS(code: string): Promise<string | null> {\n try {\n if (isBun) {\n return await validateWithBun(code);\n }\n return await validateWithEsbuild(code);\n } catch {\n // Validation not available (e.g., Cloudflare Workers) \u2014 skip and trust the JS\n return null;\n }\n}\n\n// \u2500\u2500 Bun implementations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function bundleWithBun(entrypoint: string, opts: BundleOptions): Promise<BundleResult> {\n try {\n const result = await Bun.build({\n entrypoints: [entrypoint],\n target: opts.target || 'browser',\n format: opts.format || 'esm',\n minify: opts.minify ?? false,\n sourcemap: opts.sourcemap === true ? 'inline' : opts.sourcemap || 'none',\n throw: opts.throw ?? false,\n });\n\n if (result.success && result.outputs[0]) {\n const code = await result.outputs[0].text();\n return { code, success: true, errors: [] };\n }\n\n const errors = (result.logs || []).map((log) => {\n const parts: string[] = [];\n if (log.position?.file) parts.push(`File: ${log.position.file}`);\n if (log.position?.line) parts.push(`Line ${log.position.line}:${log.position.column || 0}`);\n if (log.position?.lineText) parts.push(log.position.lineText);\n if (log.message) parts.push(log.message);\n return parts.length > 0 ? parts.join('\\n') : String(log);\n });\n\n return { code: '', success: false, errors };\n } catch (err) {\n const be = err as BuildErrorLike;\n if (opts.throw) throw err;\n\n const errors: string[] = [];\n if (be.logs && Array.isArray(be.logs)) {\n for (const log of be.logs) {\n const parts: string[] = [];\n if (log.position?.line) parts.push(`Line ${log.position.line}:${log.position.column || 0}`);\n if (log.position?.lineText) parts.push(log.position.lineText);\n if (log.message) parts.push(log.message);\n errors.push(parts.length > 0 ? parts.join('\\n') : String(log));\n }\n } else {\n errors.push(be.message || String(err));\n }\n\n return { code: '', success: false, errors };\n }\n}\n\nasync function minifyWithBun(code: string): Promise<BundleResult> {\n const { writeFile, rm: _rm } = await import('node:fs/promises');\n const { join } = await import('node:path');\n const tempFile = join('/tmp', `meno-minify-${Date.now()}.js`);\n\n try {\n await writeFile(tempFile, code, 'utf-8');\n\n const result = await Bun.build({\n entrypoints: [tempFile],\n minify: true,\n throw: true,\n });\n\n const firstOutput = result.outputs[0];\n if (firstOutput) {\n const minified = await firstOutput.text();\n return { code: minified, success: true, errors: [] };\n }\n\n return { code: '', success: false, errors: ['Minification produced no output'] };\n } catch (err) {\n const be = err as BuildErrorLike;\n const { inspect } = await import('./fs');\n let details = '';\n if (be.logs && Array.isArray(be.logs)) {\n details = be.logs\n .map((log: BunBuildLog) => {\n const parts: string[] = [];\n if (log.position?.line) parts.push(`Line ${log.position.line}:${log.position.column || 0}`);\n if (log.position?.lineText) parts.push(log.position.lineText);\n if (log.message) parts.push(log.message);\n return parts.length > 0 ? parts.join('\\n') : String(log);\n })\n .join('\\n\\n');\n }\n if (!details) {\n try {\n details = inspect(err);\n } catch {\n details = be.stack || be.message || String(err);\n }\n }\n return { code: '', success: false, errors: [details] };\n } finally {\n try {\n const { rm } = await import('node:fs/promises');\n await rm(tempFile, { force: true });\n } catch {}\n }\n}\n\nasync function validateWithBun(code: string): Promise<string | null> {\n const { writeFile, rm } = await import('node:fs/promises');\n const { join } = await import('node:path');\n const tempFile = join('/tmp', `meno-validate-${Date.now()}-${Math.random().toString(36).slice(2)}.js`);\n\n try {\n await writeFile(tempFile, code, 'utf-8');\n await Bun.build({\n entrypoints: [tempFile],\n minify: true,\n throw: true,\n });\n return null; // Valid\n } catch (err) {\n const be = err as BuildErrorLike;\n const { inspect } = await import('./fs');\n let details = '';\n if (be.logs && Array.isArray(be.logs)) {\n details = be.logs\n .map((log: BunBuildLog) => {\n const parts: string[] = [];\n if (log.position?.line) parts.push(`Line ${log.position.line}:${log.position.column || 0}`);\n if (log.position?.lineText) parts.push(log.position.lineText);\n if (log.message) parts.push(log.message);\n return parts.length > 0 ? parts.join('\\n') : String(log);\n })\n .join('\\n\\n');\n }\n if (!details) {\n try {\n details = inspect(err);\n } catch {\n details = be.stack || be.message || String(err);\n }\n }\n return details || 'Unknown JavaScript error';\n } finally {\n try {\n await rm(tempFile, { force: true });\n } catch {}\n }\n}\n\n// \u2500\u2500 esbuild implementations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function getEsbuild() {\n return await import('esbuild');\n}\n\nasync function bundleWithEsbuild(entrypoint: string, opts: BundleOptions): Promise<BundleResult> {\n const esbuild = await getEsbuild();\n\n try {\n const result = await esbuild.build({\n entryPoints: [entrypoint],\n bundle: true,\n write: false,\n platform: opts.target === 'node' ? 'node' : 'browser',\n format: opts.format || 'esm',\n minify: opts.minify ?? false,\n sourcemap:\n opts.sourcemap === true ? 'inline' : opts.sourcemap === 'inline' ? 'inline' : opts.sourcemap === 'external',\n jsx: 'automatic',\n jsxImportSource: 'react',\n logLevel: 'silent',\n });\n\n const firstOutputFile = result.outputFiles?.[0];\n if (firstOutputFile) {\n return { code: firstOutputFile.text, success: true, errors: [] };\n }\n\n return { code: '', success: false, errors: ['Build produced no output'] };\n } catch (err) {\n const be = err as BuildErrorLike;\n if (opts.throw) throw err;\n\n const errors: string[] = [];\n if (be.errors && Array.isArray(be.errors)) {\n for (const e of be.errors) {\n const parts: string[] = [];\n if (e.location?.file) parts.push(`File: ${e.location.file}`);\n if (e.location?.line) parts.push(`Line ${e.location.line}:${e.location.column || 0}`);\n if (e.location?.lineText) parts.push(e.location.lineText);\n if (e.text) parts.push(e.text);\n errors.push(parts.length > 0 ? parts.join('\\n') : String(e));\n }\n } else {\n errors.push(be.message || String(err));\n }\n\n return { code: '', success: false, errors };\n }\n}\n\nasync function minifyWithEsbuild(code: string): Promise<BundleResult> {\n const esbuild = await getEsbuild();\n\n try {\n const result = await esbuild.transform(code, {\n minify: true,\n loader: 'js',\n });\n\n return { code: result.code, success: true, errors: [] };\n } catch (err) {\n const be = err as BuildErrorLike;\n const errors: string[] = [];\n if (be.errors && Array.isArray(be.errors)) {\n for (const e of be.errors) {\n const parts: string[] = [];\n if (e.location?.line) parts.push(`Line ${e.location.line}:${e.location.column || 0}`);\n if (e.location?.lineText) parts.push(e.location.lineText);\n if (e.text) parts.push(e.text);\n errors.push(parts.length > 0 ? parts.join('\\n') : String(e));\n }\n } else {\n errors.push(be.message || String(err));\n }\n\n return { code: '', success: false, errors };\n }\n}\n\nasync function validateWithEsbuild(code: string): Promise<string | null> {\n const esbuild = await getEsbuild();\n\n try {\n await esbuild.transform(code, { loader: 'js' });\n return null; // Valid\n } catch (err) {\n const be = err as BuildErrorLike;\n const errors: string[] = [];\n if (be.errors && Array.isArray(be.errors)) {\n for (const e of be.errors) {\n const parts: string[] = [];\n if (e.location?.line) parts.push(`Line ${e.location.line}:${e.location.column || 0}`);\n if (e.location?.lineText) parts.push(e.location.lineText);\n if (e.text) parts.push(e.text);\n errors.push(parts.length > 0 ? parts.join('\\n') : String(e));\n }\n } else {\n errors.push(be.message || String(err));\n }\n\n return errors.join('\\n\\n') || 'Unknown JavaScript error';\n }\n}\n", "/**\n * Runtime-agnostic HTTP server abstraction.\n * Uses Bun.serve when available, falls back to Node.js http + ws.\n */\n\nconst isBun = typeof globalThis.Bun !== 'undefined';\n\nexport interface RuntimeServer {\n port: number;\n /**\n * Stop the server. When `force` is true, active connections are\n * closed immediately (Bun: closeActiveConnections=true). Defaults to\n * a graceful stop that lets in-flight requests finish.\n */\n stop(force?: boolean): void;\n}\n\nexport interface RuntimeWSClient {\n send(data: string | ArrayBuffer | Uint8Array): void;\n readyState: number;\n close(code?: number, reason?: string): void;\n}\n\nexport interface ServerOptions {\n port: number;\n hostname?: string;\n fetch: (req: Request, upgradeWebSocket: (req: Request) => boolean) => Promise<Response | undefined>;\n websocket?: {\n open(ws: RuntimeWSClient): void;\n message(ws: RuntimeWSClient, data: string): void;\n close(ws: RuntimeWSClient): void;\n };\n /** Path to upgrade to WebSocket (e.g., \"/__hmr\") */\n wsPath?: string;\n}\n\nexport async function createRuntimeServer(options: ServerOptions): Promise<RuntimeServer> {\n if (isBun) {\n return createBunServer(options);\n }\n return createNodeServer(options);\n}\n\n// \u2500\u2500 Bun implementation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction createBunServer(options: ServerOptions): RuntimeServer {\n const { port, hostname, fetch, websocket, wsPath: _wsPath } = options;\n\n const bunConfig: any = {\n port,\n hostname: hostname || 'localhost',\n\n async fetch(req: Request, server: any) {\n // Create upgrade function that delegates to Bun's server.upgrade\n const upgradeWebSocket = (upgradeReq: Request): boolean => {\n return server.upgrade(upgradeReq);\n };\n\n const response = await fetch(req, upgradeWebSocket);\n return response || new Response('Not Found', { status: 404 });\n },\n };\n\n if (websocket) {\n bunConfig.websocket = {\n open(ws: RuntimeWSClient) {\n websocket.open(ws);\n },\n message(ws: RuntimeWSClient, message: unknown) {\n websocket.message(ws, String(message));\n },\n close(ws: RuntimeWSClient) {\n websocket.close(ws);\n },\n };\n }\n\n const server = Bun.serve(bunConfig);\n\n return {\n port: server.port ?? port,\n stop(force?: boolean) {\n server.stop(force === true);\n },\n };\n}\n\n// \u2500\u2500 Node.js implementation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function createNodeServer(options: ServerOptions): Promise<RuntimeServer> {\n const { port, hostname, fetch, websocket, wsPath } = options;\n const http = await import('node:http');\n\n const server = http.createServer(async (nodeReq, nodeRes) => {\n try {\n // Convert Node.js IncomingMessage \u2192 Web Request\n const url = `http://${hostname || 'localhost'}:${port}${nodeReq.url || '/'}`;\n const headers = new Headers();\n for (const [key, value] of Object.entries(nodeReq.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v);\n } else {\n headers.set(key, value);\n }\n }\n }\n\n let body: ReadableStream | null = null;\n if (nodeReq.method !== 'GET' && nodeReq.method !== 'HEAD') {\n const { Readable } = await import('node:stream');\n body = Readable.toWeb(nodeReq) as unknown as ReadableStream;\n }\n\n const request = new Request(url, {\n method: nodeReq.method || 'GET',\n headers,\n body,\n // @ts-expect-error - duplex is needed for streaming request bodies in Node\n duplex: body ? 'half' : undefined,\n });\n\n // No-op upgrade function for non-upgrade requests\n const upgradeWebSocket = (): boolean => false;\n\n const response = await fetch(request, upgradeWebSocket);\n if (!response) {\n nodeRes.writeHead(404);\n nodeRes.end('Not Found');\n return;\n }\n\n // Convert Web Response \u2192 Node.js ServerResponse\n nodeRes.writeHead(response.status, Object.fromEntries(response.headers.entries()));\n\n if (response.body) {\n const reader = response.body.getReader();\n const pump = async () => {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n nodeRes.end();\n break;\n }\n const canContinue = nodeRes.write(value);\n if (!canContinue) {\n await new Promise<void>((resolve) => nodeRes.once('drain', resolve));\n }\n }\n };\n await pump();\n } else {\n const text = await response.text();\n nodeRes.end(text);\n }\n } catch (err) {\n console.error('Server error:', err);\n if (!nodeRes.headersSent) {\n nodeRes.writeHead(500);\n nodeRes.end('Internal Server Error');\n }\n }\n });\n\n // WebSocket support via 'ws' package\n if (websocket && wsPath) {\n try {\n const { WebSocketServer } = await import('ws');\n const wss = new WebSocketServer({ noServer: true });\n\n server.on('upgrade', (request, socket, head) => {\n const pathname = new URL(request.url || '/', `http://${hostname || 'localhost'}:${port}`).pathname;\n\n if (pathname === wsPath) {\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit('connection', ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n\n wss.on('connection', (ws) => {\n const client: RuntimeWSClient = {\n send(data) {\n if (ws.readyState === 1) {\n // OPEN\n ws.send(data);\n }\n },\n get readyState() {\n return ws.readyState;\n },\n close(code, reason) {\n ws.close(code, reason);\n },\n };\n\n websocket.open(client);\n\n ws.on('message', (data) => {\n websocket.message(client, data.toString());\n });\n\n ws.on('close', () => {\n websocket.close(client);\n });\n });\n } catch {\n console.warn('WebSocket support requires the \"ws\" package. Install it with: npm install ws');\n }\n }\n\n // Start listening\n return new Promise((resolve, reject) => {\n server.on('error', reject);\n server.listen(port, hostname || 'localhost', () => {\n const addr = server.address();\n const actualPort = typeof addr === 'object' && addr ? addr.port : port;\n\n resolve({\n port: actualPort,\n stop(_force?: boolean) {\n // Node http.Server.close is graceful by default; the force\n // flag is accepted for API parity with Bun but currently has\n // no additional effect on the Node path.\n server.close();\n },\n });\n });\n });\n}\n", "/**\n * Runtime Abstraction\n * Detects Bun vs Node.js and re-exports runtime-agnostic utilities.\n */\n\nexport const isBun = typeof globalThis.Bun !== 'undefined';\n\nexport {\n readTextFile,\n readJsonFile,\n fileExists,\n writeFile,\n serveFile,\n hashContent,\n inspect,\n ensureDir,\n getModuleDir,\n spawnProcess,\n getFileSize,\n getMimeType,\n} from './fs';\n\nexport {\n bundleFile,\n minifyJS,\n validateJS,\n type BundleResult,\n type BundleOptions,\n} from './bundler';\n\nexport {\n createRuntimeServer,\n type RuntimeServer,\n type RuntimeWSClient,\n type ServerOptions,\n} from './httpServer';\n", "/**\n * Config Service\n * Centralized configuration loading and access\n *\n * Consolidates multiple config loaders into a single service that loads\n * the project.config.json file once and exposes typed sections.\n */\n\nimport type { BreakpointConfig, BreakpointConfigInput, BreakpointEntry } from '../../shared/breakpoints';\nimport { DEFAULT_BREAKPOINTS, normalizeBreakpointConfig } from '../../shared/breakpoints';\nimport type { ResponsiveScales, BreakpointScales } from '../../shared/responsiveScaling';\nimport { DEFAULT_RESPONSIVE_SCALES } from '../../shared/responsiveScaling';\nimport type { I18nConfig } from '../../shared/types/components';\nimport type { LibrariesConfig, JSLibraryConfig, CSSLibraryConfig } from '../../shared/types/libraries';\nimport type { CSPConfig } from '../../shared/types/config';\nimport type { CustomCodeConfig } from '../../shared/types/api';\nimport type { RemConversionConfig } from '../../shared/pxToRem';\nimport { DEFAULT_REM_CONFIG } from '../../shared/pxToRem';\nimport { DEFAULT_I18N_CONFIG, migrateI18nConfig } from '../../shared/i18n';\nimport { projectPaths } from '../projectContext';\nimport { readTextFile, fileExists } from '../runtime';\nimport { logRuntimeError } from '../../shared/errorLogger';\n\n/**\n * Icons configuration\n */\nexport interface IconsConfig {\n favicon?: string;\n faviconDark?: string;\n appleTouchIcon?: string;\n}\n\n/**\n * Site-wide social configuration\n */\nexport interface SocialConfig {\n twitterHandle?: string;\n}\n\n/**\n * Sanity CMS integration config (read-only, public datasets).\n * Connection info only \u2014 the runtime builds GROQ query URLs from this. No token (public).\n */\nexport interface SanityConfig {\n projectId: string;\n dataset: string;\n apiVersion?: string;\n useCdn?: boolean;\n}\n\n/**\n * Raw project config structure from project.config.json\n */\nexport type ImageFormat = 'webp' | 'avif';\n\ninterface RawProjectConfig {\n breakpoints?: BreakpointConfigInput;\n responsiveScales?: Partial<ResponsiveScales>;\n i18n?: unknown;\n icons?: IconsConfig;\n social?: SocialConfig;\n integrations?: { sanity?: SanityConfig };\n libraries?: LibrariesConfig;\n csp?: CSPConfig;\n baseComponent?: string;\n imageFormat?: ImageFormat;\n remConversion?: Partial<RemConversionConfig>;\n customCode?: CustomCodeConfig;\n showMenoBadge?: boolean;\n}\n\n/**\n * ConfigService\n * Loads project configuration once and provides typed access to sections\n */\nexport class ConfigService {\n private config: RawProjectConfig | null = null;\n private loaded = false;\n\n /**\n * Load configuration from project.config.json\n * Safe to call multiple times - only loads once\n */\n async load(): Promise<void> {\n if (this.loaded) {\n return;\n }\n\n try {\n if (await fileExists(projectPaths.config())) {\n const content = await readTextFile(projectPaths.config());\n this.config = JSON.parse(content);\n }\n } catch (error) {\n // Fall through to defaults\n logRuntimeError('configService.load', error, { filePath: projectPaths.config() });\n this.config = null;\n }\n\n this.loaded = true;\n }\n\n /**\n * Check if configuration has been loaded\n */\n isLoaded(): boolean {\n return this.loaded;\n }\n\n /**\n * Reset the service (for testing)\n */\n reset(): void {\n this.config = null;\n this.loaded = false;\n }\n\n /**\n * Get breakpoint configuration\n * Returns validated and normalized breakpoints (always object format)\n * Supports both legacy format { tablet: 1024 } and new format { tablet: { breakpoint: 1024, previewPoint: 768 } }\n */\n getBreakpoints(): BreakpointConfig {\n if (!this.config?.breakpoints || typeof this.config.breakpoints !== 'object') {\n return { ...DEFAULT_BREAKPOINTS };\n }\n\n // Validate breakpoint values before normalization\n const validInput: BreakpointConfigInput = {};\n for (const [key, value] of Object.entries(this.config.breakpoints)) {\n if (typeof value === 'number' && value > 0) {\n // Legacy format: number\n validInput[key] = value;\n } else if (typeof value === 'object' && value !== null) {\n // New format: object with breakpoint and optional previewPoint\n const entry = value as BreakpointEntry;\n if (typeof entry.breakpoint === 'number' && entry.breakpoint > 0) {\n validInput[key] = {\n breakpoint: entry.breakpoint,\n previewPoint:\n typeof entry.previewPoint === 'number' && entry.previewPoint > 0 ? entry.previewPoint : entry.breakpoint,\n };\n }\n }\n }\n\n // Return normalized breakpoints or defaults if none valid\n if (Object.keys(validInput).length === 0) {\n return { ...DEFAULT_BREAKPOINTS };\n }\n\n return normalizeBreakpointConfig(validInput);\n }\n\n /**\n * Get i18n configuration\n * Automatically migrates old string[] format to LocaleConfig[] format\n */\n getI18n(): I18nConfig {\n if (!this.config?.i18n) {\n return { ...DEFAULT_I18N_CONFIG };\n }\n\n return migrateI18nConfig(this.config.i18n);\n }\n\n /**\n * Deep merge scale categories, preserving user-defined breakpoints\n * while filling in missing values from defaults\n */\n private mergeScaleCategory(\n userScales: BreakpointScales | undefined,\n defaultScales: BreakpointScales | undefined,\n ): BreakpointScales | undefined {\n if (!userScales && !defaultScales) return undefined;\n if (!userScales) return defaultScales ? { ...defaultScales } : undefined;\n if (!defaultScales) return { ...userScales };\n\n // User scales take precedence, but include defaults for breakpoints not specified\n return {\n ...defaultScales,\n ...userScales,\n };\n }\n\n /**\n * Get responsive scales configuration\n * Supports dynamic breakpoints - scales are keyed by breakpoint name\n * Deep merges scale categories to preserve user breakpoint definitions\n */\n getResponsiveScales(): ResponsiveScales {\n if (!this.config?.responsiveScales || typeof this.config.responsiveScales !== 'object') {\n return { ...DEFAULT_RESPONSIVE_SCALES };\n }\n\n const userScales = this.config.responsiveScales;\n\n return {\n enabled: userScales.enabled ?? DEFAULT_RESPONSIVE_SCALES.enabled,\n mode: (userScales as { mode?: 'breakpoints' | 'fluid' }).mode ?? DEFAULT_RESPONSIVE_SCALES.mode,\n baseReference: userScales.baseReference ?? DEFAULT_RESPONSIVE_SCALES.baseReference,\n fluidRange:\n (userScales as { fluidRange?: { min: number; max: number } }).fluidRange ??\n (DEFAULT_RESPONSIVE_SCALES.fluidRange ? { ...DEFAULT_RESPONSIVE_SCALES.fluidRange } : undefined),\n siteMargin:\n (userScales as { siteMargin?: { min: number; max: number } }).siteMargin ??\n (DEFAULT_RESPONSIVE_SCALES.siteMargin ? { ...DEFAULT_RESPONSIVE_SCALES.siteMargin } : undefined),\n fontSize: this.mergeScaleCategory(\n userScales.fontSize as BreakpointScales | undefined,\n DEFAULT_RESPONSIVE_SCALES.fontSize,\n ),\n padding: this.mergeScaleCategory(\n userScales.padding as BreakpointScales | undefined,\n DEFAULT_RESPONSIVE_SCALES.padding,\n ),\n margin: this.mergeScaleCategory(\n userScales.margin as BreakpointScales | undefined,\n DEFAULT_RESPONSIVE_SCALES.margin,\n ),\n gap: this.mergeScaleCategory(userScales.gap as BreakpointScales | undefined, DEFAULT_RESPONSIVE_SCALES.gap),\n borderRadius: this.mergeScaleCategory(\n userScales.borderRadius as BreakpointScales | undefined,\n DEFAULT_RESPONSIVE_SCALES.borderRadius,\n ),\n size: this.mergeScaleCategory(userScales.size as BreakpointScales | undefined, DEFAULT_RESPONSIVE_SCALES.size),\n };\n }\n\n /**\n * Get rem conversion configuration\n */\n getRemConversion(): RemConversionConfig {\n if (!this.config?.remConversion || typeof this.config.remConversion !== 'object') {\n return { ...DEFAULT_REM_CONFIG };\n }\n return {\n enabled: this.config.remConversion.enabled ?? DEFAULT_REM_CONFIG.enabled,\n baseFontSize: this.config.remConversion.baseFontSize ?? DEFAULT_REM_CONFIG.baseFontSize,\n };\n }\n\n /**\n * Get icons configuration\n * Returns empty object if not configured\n */\n getIcons(): IconsConfig {\n if (!this.config?.icons || typeof this.config.icons !== 'object') {\n return {};\n }\n\n return this.config.icons;\n }\n\n /**\n * Get site-wide social configuration\n * Returns empty object if not configured\n */\n getSocial(): SocialConfig {\n if (!this.config?.social || typeof this.config.social !== 'object') {\n return {};\n }\n\n return this.config.social;\n }\n\n /**\n * Get Sanity CMS integration config (read-only, public datasets).\n * Returns undefined when not configured or missing required projectId/dataset.\n */\n getSanity(): SanityConfig | undefined {\n const sanity = this.config?.integrations?.sanity;\n if (!sanity || typeof sanity !== 'object') {\n return undefined;\n }\n if (typeof sanity.projectId !== 'string' || typeof sanity.dataset !== 'string') {\n return undefined;\n }\n if (sanity.projectId.trim() === '' || sanity.dataset.trim() === '') {\n return undefined;\n }\n return sanity;\n }\n\n /**\n * Get libraries configuration\n * Returns empty arrays if not configured\n * Normalizes string URLs to object format for backwards compatibility\n */\n getLibraries(): LibrariesConfig {\n if (!this.config?.libraries || typeof this.config.libraries !== 'object') {\n return { js: [], css: [] };\n }\n\n const libs = this.config.libraries;\n\n // Normalize JS libraries: support both string URLs and object format\n const normalizedJs = Array.isArray(libs.js)\n ? (libs.js.map((lib) => (typeof lib === 'string' ? { url: lib } : lib)) as JSLibraryConfig[])\n : [];\n\n // Normalize CSS libraries: support both string URLs and object format\n const normalizedCss = Array.isArray(libs.css)\n ? (libs.css.map((lib) => (typeof lib === 'string' ? { url: lib } : lib)) as CSSLibraryConfig[])\n : [];\n\n return {\n js: normalizedJs,\n css: normalizedCss,\n };\n }\n\n /**\n * Get CSP configuration\n * Returns empty object if not configured\n */\n getCSP(): CSPConfig {\n if (!this.config?.csp || typeof this.config.csp !== 'object') {\n return {};\n }\n\n return this.config.csp;\n }\n\n /**\n * Get base component name for new pages\n * Returns undefined if not configured\n */\n getBaseComponent(): string | undefined {\n if (!this.config?.baseComponent || typeof this.config.baseComponent !== 'string') {\n return undefined;\n }\n return this.config.baseComponent;\n }\n\n /**\n * Get image format setting\n * Returns 'webp' (default) or 'avif'\n */\n getCustomCode(): CustomCodeConfig {\n if (!this.config?.customCode || typeof this.config.customCode !== 'object') {\n return {};\n }\n return this.config.customCode;\n }\n\n getShowMenoBadge(): boolean {\n return this.config?.showMenoBadge === true;\n }\n\n getImageFormat(): ImageFormat {\n if (this.config?.imageFormat === 'avif') return 'avif';\n return 'webp';\n }\n\n /**\n * Get raw config value by key (for extension)\n */\n getRaw<T>(key: string): T | undefined {\n if (!this.config) {\n return undefined;\n }\n return (this.config as Record<string, unknown>)[key] as T | undefined;\n }\n}\n\n/**\n * Singleton instance for global access\n * Use this for convenience, or create your own instance for testing\n */\nexport const configService = new ConfigService();\n", "import { projectPaths } from '../server/projectContext';\nimport { readJsonFile, fileExists } from '../server/runtime';\nimport { fontFaceCss, fontPreloadLinks, extractFamilyName, type FontConfig } from './fontCss';\n\nexport type { FontConfig };\n\ninterface ProjectConfig {\n fonts?: FontConfig[];\n siteUrl?: string;\n [key: string]: unknown;\n}\n\nlet cachedConfig: ProjectConfig | null = null;\n\nexport function resetFontConfig(): void {\n cachedConfig = null;\n}\n\nexport async function loadProjectConfig(): Promise<ProjectConfig> {\n if (cachedConfig) return cachedConfig;\n if (await fileExists(projectPaths.config())) {\n cachedConfig = await readJsonFile<ProjectConfig>(projectPaths.config());\n } else {\n cachedConfig = { fonts: [] };\n }\n return cachedConfig!;\n}\n\n// For synchronous access after config is loaded\nexport function getProjectConfig(): ProjectConfig {\n return cachedConfig || { fonts: [] };\n}\n\n/**\n * Generate `@font-face` CSS for the project's configured fonts.\n * Thin wrapper over the pure {@link fontFaceCss} (formatting lives in `./fontCss`\n * so renderers without a project-context cache \u2014 e.g. the Astro twin \u2014 can reuse it).\n */\nexport function generateFontCSS(): string {\n return fontFaceCss(getProjectConfig().fonts || []);\n}\n\n/**\n * Generate font preload link tags for early font loading.\n * This prevents font swap flash on SPA navigation by ensuring fonts are\n * loaded and cached before they're needed.\n */\nexport function generateFontPreloadTags(): string {\n return fontPreloadLinks(getProjectConfig().fonts || []);\n}\n\nexport function getFontFamilies(): Record<string, number[]> {\n const config = getProjectConfig();\n const fonts = config.fonts || [];\n const familiesMap: Record<string, number[]> = {};\n\n fonts.forEach((font: { path?: string; src?: string; family?: string; weight?: number; weightMax?: number }) => {\n const fontPath: string = font.path || font.src || '';\n if (!fontPath) return;\n const family = font.family || extractFamilyName(fontPath);\n const weight = font.weight ?? 400;\n const weightMax = font.weightMax;\n\n if (!familiesMap[family]) {\n familiesMap[family] = [];\n }\n\n // Variable fonts: include all weights in range (100, 200, ..., weightMax)\n if (weightMax != null) {\n for (let w = weight; w <= weightMax; w += 100) {\n if (!familiesMap[family].includes(w)) {\n familiesMap[family].push(w);\n }\n }\n } else {\n if (!familiesMap[family].includes(weight)) {\n familiesMap[family].push(weight);\n }\n }\n });\n\n return familiesMap;\n}\n", "/**\n * Pages API Routes\n * Handles page CRUD endpoints\n */\n\nimport type { PageService } from '../../services/pageService';\nimport { API_ROUTES } from '../../../shared/constants';\nimport { parseJSON } from '../../jsonLoader';\nimport { logRuntimeError } from '../../../shared/errorLogger';\nimport { createCorsHeaders } from '../../middleware/cors';\nimport { jsonResponse, cachedJsonResponse } from './shared';\n\n/**\n * Handle pages API endpoint - GET /api/pages\n * Returns pages with draft status info\n */\nexport function handlePagesRoute(pageService: PageService): Response {\n const pages = pageService.getAllPagesWithInfo();\n return jsonResponse({ pages });\n}\n\n/**\n * Handle page data API endpoint - GET /api/page-data/:path\n */\nexport function handlePageDataRoute(url: URL, pageService: PageService): Response {\n const pagePath = url.pathname.replace(API_ROUTES.PAGE_DATA, '') || '/';\n const content = pageService.getPage(pagePath);\n\n if (content) {\n try {\n const parsedContent = parseJSON(content);\n // Include line map for element line number tracking\n const lineMap = pageService.getLineMap(pagePath);\n const lineMapObj: Record<string, { startLine: number; endLine: number }> = {};\n if (lineMap) {\n lineMap.forEach((value, key) => {\n lineMapObj[key] = value;\n });\n }\n return jsonResponse({ ...(parsedContent as Record<string, unknown>), _lineMap: lineMapObj });\n } catch (error) {\n // The stored page content failed to parse \u2014 a server-side data-integrity\n // problem (corrupt file / partial write), so this stays a 5xx. Surface the\n // parser message + path instead of an opaque \"Invalid JSON\".\n logRuntimeError('api.pageData.parse', error, { pagePath });\n return jsonResponse({ error: error instanceof Error ? error.message : 'Invalid JSON' }, { status: 500 });\n }\n } else {\n return jsonResponse({ error: 'Page not found' }, { status: 404 });\n }\n}\n\n// Note: handleSavePageRoute moved to @meno/studio\n\n/**\n * Handle page content API endpoint - GET /api/page-content?page=...\n * Returns raw JSON text for client routing, prefetching, and studio editor.\n * Uses ETag revalidation so repeat navigations to the same page get a 304\n * instead of re-transmitting an unchanged body.\n */\nexport function handlePageContentRoute(req: Request, url: URL, pageService: PageService): Response {\n const page = url.searchParams.get('page') || '/';\n const content = pageService.getPage(page);\n\n if (content) {\n return cachedJsonResponse(req, content);\n }\n const corsHeaders = createCorsHeaders();\n return new Response('Page not found', {\n status: 404,\n headers: {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-store, max-age=0',\n ...corsHeaders,\n },\n });\n}\n\n/**\n * Handle slug mappings API endpoint - GET /api/slug-mappings\n * Returns all page slug translations for locale switching\n */\nexport function handleSlugMappingsRoute(pageService: PageService): Response {\n const mappings = pageService.getSlugMappings();\n return jsonResponse({ mappings });\n}\n", "/**\n * JSON Loader\n * Utilities for loading and parsing JSON files\n */\n\nimport { existsSync, readdirSync } from 'node:fs';\nimport type { z } from 'zod';\nimport type { ComponentDefinition } from '../shared/types';\nimport type { BreakpointConfig, BreakpointConfigInput, BreakpointEntry } from '../shared/breakpoints';\nimport { readTextFile, fileExists } from './runtime';\nimport { DEFAULT_BREAKPOINTS, normalizeBreakpointConfig } from '../shared/breakpoints';\nimport type { I18nConfig } from '../shared/types/components';\nimport { createLogger } from '../shared/logger';\nimport { DEFAULT_I18N_CONFIG, migrateI18nConfig } from '../shared/i18n';\nimport type { PrefetchConfig } from '../shared/types/prefetch';\nimport { DEFAULT_PREFETCH_CONFIG } from '../shared/types/prefetch';\nimport { validateComponentDefinition } from '../shared/validation/validators';\nimport { attemptJsonRepair } from '../shared/jsonRepair';\nimport { logRuntimeError } from '../shared/errorLogger';\nimport { projectPaths } from './projectContext';\n\nconst log = createLogger('jsonLoader');\n\n/**\n * Load JSON file from a file path\n */\nexport async function loadJSONFile(filePath: string): Promise<string | null> {\n try {\n if (await fileExists(filePath)) {\n return await readTextFile(filePath);\n }\n return null;\n } catch (error) {\n logRuntimeError('jsonLoader.loadJSONFile', error, { filePath });\n return null;\n }\n}\n\n/**\n * Parse JSON content\n */\nexport function parseJSON<T = unknown>(content: string): T {\n return JSON.parse(content);\n}\n\n/**\n * Parse and validate JSON content against a zod schema\n * Returns null on validation failure (for backward compatibility)\n */\nexport function parseAndValidateJSON<T>(content: string, schema: z.ZodType<T>): T | null {\n try {\n const parsed = JSON.parse(content);\n const result = schema.safeParse(parsed);\n if (result.success) {\n return result.data;\n }\n // Return parsed value anyway for backward compatibility\n return parsed as T;\n } catch (error) {\n logRuntimeError('jsonLoader.parseAndValidateJSON', error);\n return null;\n }\n}\n\n/**\n * Load and parse JSON file\n */\nexport async function loadAndParseJSON<T = any>(filePath: string): Promise<T | null> {\n const content = await loadJSONFile(filePath);\n if (!content) return null;\n\n try {\n return parseJSON<T>(content);\n } catch (error) {\n logRuntimeError('jsonLoader.loadAndParseJSON', error, { filePath });\n return null;\n }\n}\n\n/**\n * Load all JSON files from a directory\n */\nexport async function loadJSONDirectory(dirPath: string): Promise<Map<string, string>> {\n const files = new Map<string, string>();\n\n if (!existsSync(dirPath)) {\n return files;\n }\n\n const fileList = readdirSync(dirPath);\n\n const jsonFiles = fileList.filter((f) => f.endsWith('.json'));\n const results = await Promise.all(\n jsonFiles.map(async (file) => {\n const name = file.replace('.json', '');\n const content = await loadJSONFile(`${dirPath}/${file}`);\n return content ? { name, content } : null;\n }),\n );\n for (const r of results) {\n if (r) files.set(r.name, r.content);\n }\n\n return files;\n}\n\n/**\n * Load file content as text (for .js, .css, etc.)\n */\nasync function loadFileAsText(filePath: string): Promise<string | null> {\n try {\n if (await fileExists(filePath)) {\n return await readTextFile(filePath);\n }\n return null;\n } catch (error) {\n logRuntimeError('jsonLoader.loadFileAsText', error, { filePath });\n return null;\n }\n}\n\n/**\n * Component with category metadata from folder structure\n */\nexport interface ComponentWithCategory extends ComponentDefinition {\n _category?: string;\n _relativePath?: string;\n}\n\nexport interface ComponentLoadDiagnostic {\n componentName: string;\n description: string;\n line: number;\n column: number;\n}\n\nexport interface ComponentLoadResult {\n component: ComponentWithCategory | null;\n warning?: ComponentLoadDiagnostic;\n error?: ComponentLoadDiagnostic;\n}\n\nexport interface ComponentDirectoryResult {\n components: Map<string, ComponentWithCategory>;\n warnings: ComponentLoadDiagnostic[];\n errors: ComponentLoadDiagnostic[];\n}\n\n/**\n * Load a single component from a file path\n * @internal\n */\nasync function loadSingleComponent(\n filePath: string,\n componentName: string,\n category?: string,\n): Promise<ComponentLoadResult> {\n const content = await loadJSONFile(filePath);\n if (!content) return { component: null };\n\n const _fileName = `${componentName}.json`;\n const repairResult = attemptJsonRepair(content);\n\n if (!repairResult.success) {\n return {\n component: null,\n error: {\n componentName,\n description: repairResult.error!.message,\n line: repairResult.error!.line,\n column: repairResult.error!.column,\n },\n };\n }\n\n const warning: ComponentLoadDiagnostic | undefined = repairResult.repaired\n ? {\n componentName,\n description: repairResult.repairDescription!,\n line: repairResult.repairLine ?? 1,\n column: repairResult.repairColumn ?? 1,\n }\n : undefined;\n\n try {\n const parsed = repairResult.data as ComponentDefinition;\n\n // Validate component definition (logs warnings but doesn't fail - graceful degradation)\n const validationResult = validateComponentDefinition(parsed);\n if (!validationResult.valid) {\n log.warn(\n `Component validation failed for ${componentName}:`,\n validationResult.errors.map((e) => `${e.path}: ${e.message}`).join('; '),\n );\n }\n const componentDef: ComponentWithCategory = validationResult.valid ? validationResult.data : parsed;\n\n // Determine the directory where the component file is located\n const dirPath = filePath.substring(0, filePath.lastIndexOf('/'));\n\n // Load .js and .css files in parallel\n const jsFilePath = `${dirPath}/${componentName}.js`;\n const cssFilePath = `${dirPath}/${componentName}.css`;\n const [jsContent, cssContent] = await Promise.all([loadFileAsText(jsFilePath), loadFileAsText(cssFilePath)]);\n\n if (!componentDef.component) {\n componentDef.component = {};\n }\n\n // If .js file exists, use its content for javascript field\n // This takes precedence over any javascript field in the JSON\n if (jsContent) {\n componentDef.component.javascript = jsContent;\n\n // Auto-enable defineVars when .js file exists (unless explicitly set to false)\n if (componentDef.component.defineVars === undefined) {\n componentDef.component.defineVars = true;\n }\n }\n\n // If .css file exists, use its content for css field\n // This takes precedence over any css field in the JSON\n if (cssContent) {\n componentDef.component.css = cssContent;\n }\n\n // Add category metadata from folder structure\n if (category) {\n componentDef._category = category;\n componentDef._relativePath = `${category}/${componentName}`;\n }\n\n return { component: componentDef, warning };\n } catch (error) {\n logRuntimeError('jsonLoader.loadSingleComponent', error, { filePath, componentName });\n return { component: null };\n }\n}\n\n/**\n * Load all component definitions from components directory (recursive)\n * Scans subdirectories as category folders. Component names must be unique across all folders.\n *\n * Folder structure:\n * - /components/Button.json \u2192 name: \"Button\", category: undefined\n * - /components/ui/Card.json \u2192 name: \"Card\", category: \"ui\"\n *\n * @param dirPath - Root components directory path\n * @returns Map of component names to ComponentDefinition with category metadata\n */\nexport async function loadComponentDirectory(dirPath: string = './components'): Promise<ComponentDirectoryResult> {\n const components = new Map<string, ComponentWithCategory>();\n const warnings: ComponentLoadDiagnostic[] = [];\n const errors: ComponentLoadDiagnostic[] = [];\n\n if (!existsSync(dirPath)) {\n return { components, warnings, errors };\n }\n\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n // Collect all component entries to load in parallel\n const loadEntries: { filePath: string; componentName: string; category?: string }[] = [];\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const category = entry.name;\n const categoryPath = `${dirPath}/${category}`;\n const categoryFiles = readdirSync(categoryPath);\n\n for (const file of categoryFiles) {\n if (file.endsWith('.json')) {\n loadEntries.push({\n filePath: `${categoryPath}/${file}`,\n componentName: file.replace('.json', ''),\n category,\n });\n }\n }\n } else if (entry.name.endsWith('.json')) {\n loadEntries.push({\n filePath: `${dirPath}/${entry.name}`,\n componentName: entry.name.replace('.json', ''),\n });\n }\n }\n\n // Load all components in parallel\n const results = await Promise.all(\n loadEntries.map(async (e) => ({\n ...e,\n result: await loadSingleComponent(e.filePath, e.componentName, e.category),\n })),\n );\n\n // Insert into map preserving listing order, with duplicate detection\n for (const { componentName, category, result } of results) {\n if (result.warning) warnings.push(result.warning);\n if (result.error) errors.push(result.error);\n if (!result.component) continue;\n if (components.has(componentName)) {\n const location = category ? `category \"${category}\"` : 'root level';\n log.warn(`Duplicate component name \"${componentName}\" found at ${location}. Skipping.`);\n continue;\n }\n components.set(componentName, result.component);\n }\n\n return { components, warnings, errors };\n}\n\n/**\n * Map page filename to route path\n */\nexport function mapPageNameToPath(pageName: string): string {\n return pageName === 'index' ? '/' : `/${pageName}`;\n}\n\n/**\n * Map route path to page filename\n */\nexport function mapPathToPageName(path: string): string {\n return path === '/' ? 'index' : path.substring(1);\n}\n\n// Breakpoint types are now imported from shared/breakpoints\n\n/**\n * Load and validate breakpoint configuration from project.config.json\n */\nexport async function loadBreakpointConfig(): Promise<BreakpointConfig> {\n try {\n const configContent = await loadJSONFile(projectPaths.config());\n if (configContent) {\n const config = parseJSON<{ breakpoints?: BreakpointConfigInput }>(configContent);\n\n if (config.breakpoints && typeof config.breakpoints === 'object') {\n // Preserve all breakpoints from config, filtering out invalid values\n const validInput: BreakpointConfigInput = {};\n for (const [key, value] of Object.entries(config.breakpoints)) {\n if (typeof value === 'number' && value > 0) {\n // Legacy format: number\n validInput[key] = value;\n } else if (typeof value === 'object' && value !== null) {\n // New format: object with breakpoint and optional previewPoint\n const entry = value as BreakpointEntry;\n if (typeof entry.breakpoint === 'number' && entry.breakpoint > 0) {\n validInput[key] = {\n breakpoint: entry.breakpoint,\n previewPoint:\n typeof entry.previewPoint === 'number' && entry.previewPoint > 0\n ? entry.previewPoint\n : entry.breakpoint,\n };\n }\n }\n }\n\n // If we have valid breakpoints, return them normalized; otherwise fall back to defaults\n if (Object.keys(validInput).length > 0) {\n return normalizeBreakpointConfig(validInput);\n }\n }\n }\n } catch (error) {\n logRuntimeError('jsonLoader.loadBreakpointConfig', error, { filePath: projectPaths.config() });\n }\n\n return { ...DEFAULT_BREAKPOINTS };\n}\n\n/**\n * Get breakpoint config synchronously (for cases where async is not available)\n * Uses cached value if available, otherwise defaults\n */\nlet cachedBreakpoints: BreakpointConfig | null = null;\n\nexport function getBreakpointConfig(): BreakpointConfig {\n if (cachedBreakpoints) {\n return cachedBreakpoints;\n }\n return DEFAULT_BREAKPOINTS;\n}\n\nexport function setBreakpointConfig(config: BreakpointConfig): void {\n cachedBreakpoints = config;\n}\n\n/**\n * Load and validate i18n configuration from project.config.json\n * Automatically migrates old string[] format to new LocaleConfig[] format\n */\nexport async function loadI18nConfig(): Promise<I18nConfig> {\n try {\n const configContent = await loadJSONFile(projectPaths.config());\n if (configContent) {\n const config = parseJSON<{ i18n?: unknown }>(configContent);\n return migrateI18nConfig(config.i18n);\n }\n } catch (error) {\n // Fall through to default\n logRuntimeError('jsonLoader.loadI18nConfig', error, { filePath: projectPaths.config() });\n }\n\n return { ...DEFAULT_I18N_CONFIG };\n}\n\n/**\n * Get i18n config synchronously (for cases where async is not available)\n * Uses cached value if available, otherwise defaults\n */\nlet cachedI18nConfig: I18nConfig | null = null;\n\nexport function getI18nConfig(): I18nConfig {\n if (cachedI18nConfig) {\n return cachedI18nConfig;\n }\n return { ...DEFAULT_I18N_CONFIG };\n}\n\nexport function setI18nConfig(config: I18nConfig): void {\n cachedI18nConfig = config;\n}\n\n/**\n * Icons configuration from project.config.json\n */\nexport interface IconsConfig {\n favicon?: string;\n faviconDark?: string;\n appleTouchIcon?: string;\n}\n\n/**\n * Load icons configuration from project.config.json\n */\nexport async function loadIconsConfig(): Promise<IconsConfig> {\n try {\n const configContent = await loadJSONFile(projectPaths.config());\n if (configContent) {\n const config = parseJSON<{ icons?: IconsConfig }>(configContent);\n if (config.icons && typeof config.icons === 'object') {\n return config.icons;\n }\n }\n } catch (error) {\n // Fall through to default\n logRuntimeError('jsonLoader.loadIconsConfig', error, { filePath: projectPaths.config() });\n }\n\n return {};\n}\n\n/**\n * Load prefetch configuration from project.config.json\n * Used for production SSR sites to enable link prefetching\n */\nexport async function loadPrefetchConfig(): Promise<PrefetchConfig> {\n try {\n const configContent = await loadJSONFile(projectPaths.config());\n if (configContent) {\n const config = parseJSON<{ prefetch?: Partial<PrefetchConfig> }>(configContent);\n if (config.prefetch && typeof config.prefetch === 'object') {\n // Merge with defaults to ensure all required fields are present\n return {\n ...DEFAULT_PREFETCH_CONFIG,\n ...config.prefetch,\n };\n }\n }\n } catch (error) {\n // Fall through to default\n logRuntimeError('jsonLoader.loadPrefetchConfig', error, { filePath: projectPaths.config() });\n }\n\n return { ...DEFAULT_PREFETCH_CONFIG };\n}\n", "/**\n * JSON Repair Utility\n * Attempts to fix common JSON syntax errors (trailing commas, missing commas)\n */\n\nexport interface JsonParseErrorInfo {\n message: string;\n line: number;\n column: number;\n}\n\nexport interface JsonRepairResult {\n success: boolean;\n data?: unknown;\n repaired: boolean;\n repairDescription?: string;\n repairLine?: number;\n repairColumn?: number;\n error?: JsonParseErrorInfo;\n}\n\n/**\n * Extract line/column from a JSON SyntaxError\n */\nexport function parseJsonError(error: unknown, content: string): JsonParseErrorInfo {\n if (!(error instanceof SyntaxError)) {\n return { message: String(error), line: 1, column: 1 };\n }\n\n const msg = error.message;\n\n // Bun/V8: \"JSON Parse error: Expected '}'\" or \"Unexpected token } in JSON at position 42\"\n // Try to extract position from message\n const posMatch = msg.match(/at position (\\d+)/i);\n if (posMatch) {\n const pos = parseInt(posMatch[1] ?? '', 10);\n const { line, column } = offsetToLineColumn(content, pos);\n return { message: msg, line, column };\n }\n\n // Bun format: \"JSON Parse error: ...\"\n // Try line number extraction\n const lineMatch = msg.match(/line (\\d+)/i);\n const colMatch = msg.match(/column (\\d+)/i);\n if (lineMatch) {\n return {\n message: msg,\n line: parseInt(lineMatch[1] ?? '', 10),\n column: colMatch ? parseInt(colMatch[1] ?? '', 10) : 1,\n };\n }\n\n return { message: msg, line: 1, column: 1 };\n}\n\nfunction offsetToLineColumn(content: string, offset: number): { line: number; column: number } {\n let line = 1;\n let lastNewline = -1;\n for (let i = 0; i < offset && i < content.length; i++) {\n if (content[i] === '\\n') {\n line++;\n lastNewline = i;\n }\n }\n return { line, column: offset - lastNewline };\n}\n\n/**\n * Attempt to repair common JSON errors\n */\nexport function attemptJsonRepair(content: string): JsonRepairResult {\n // Try parsing as-is first\n try {\n const data = JSON.parse(content);\n return { success: true, repaired: false, data };\n } catch (_firstError) {\n // Continue to repair attempts\n }\n\n // Attempt: remove trailing commas (e.g., {a: 1,} or [1,])\n {\n const fixed = content.replace(/,\\s*([\\]}])/g, '$1');\n try {\n const data = JSON.parse(fixed);\n // Find where we removed a comma for the description\n const trailingCommaMatch = content.match(/,\\s*([\\]}])/);\n const pos = trailingCommaMatch ? content.indexOf(trailingCommaMatch[0]) : 0;\n const { line, column } = offsetToLineColumn(content, pos);\n return {\n success: true,\n repaired: true,\n data,\n repairDescription: `removed trailing comma at line ${line}`,\n repairLine: line,\n repairColumn: column,\n };\n } catch {\n // Continue\n }\n }\n\n // Attempt: insert missing commas between properties/elements\n // Pattern: value on one line, key/value on next line without comma\n // e.g., \"foo\": \"bar\"\\n \"baz\": ... or \"value\"\\n \"next\"\n {\n const lines = content.split('\\n');\n let fixed = '';\n let repairLine = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n const trimmed = line.trimEnd();\n const nextLine = i + 1 < lines.length ? (lines[i + 1] ?? null) : null;\n\n if (nextLine !== null) {\n const nextTrimmed = nextLine.trimStart();\n // Check if current line ends with a value (not comma, not opening bracket, not colon)\n // and next line starts with a key or value\n const needsComma =\n /[\"\\d\\w\\]}-]$/.test(trimmed) &&\n !trimmed.endsWith(',') &&\n !trimmed.endsWith('{') &&\n !trimmed.endsWith('[') &&\n !trimmed.endsWith(':') &&\n (nextTrimmed.startsWith('\"') ||\n nextTrimmed.startsWith('{') ||\n nextTrimmed.startsWith('[') ||\n /^\\d/.test(nextTrimmed) ||\n nextTrimmed === 'true' ||\n nextTrimmed === 'false' ||\n nextTrimmed === 'null');\n\n if (needsComma) {\n fixed += `${trimmed},\\n`;\n if (repairLine === 0) repairLine = i + 1;\n } else {\n fixed += `${line}\\n`;\n }\n } else {\n fixed += line;\n }\n }\n\n try {\n const data = JSON.parse(fixed);\n return {\n success: true,\n repaired: true,\n data,\n repairDescription: `auto-fixed missing comma at line ${repairLine}`,\n repairLine,\n repairColumn: 1,\n };\n } catch {\n // Continue\n }\n }\n\n // All repairs failed - return structured error\n let errorInfo: JsonParseErrorInfo;\n try {\n JSON.parse(content);\n errorInfo = { message: 'Unknown error', line: 1, column: 1 };\n } catch (e) {\n errorInfo = parseJsonError(e, content);\n }\n\n return { success: false, repaired: false, error: errorInfo };\n}\n\n/**\n * Format a user-friendly error message for JSON parse failures\n */\nexport function formatJsonErrorMessage(fileName: string, error: JsonParseErrorInfo): string {\n return `${fileName}: JSON syntax error at line ${error.line}, column ${error.column} \u2014 ${error.message}`;\n}\n\n/**\n * Format a message describing a successful JSON repair\n */\nexport function formatJsonRepairMessage(fileName: string, description: string): string {\n return `${fileName}: ${description}. Save to apply fix.`;\n}\n", "/**\n * Shared utilities for API routes\n */\n\nimport { createCorsHeaders, type CorsOptions } from '../../middleware/cors';\n\n/**\n * Helper function for JSON responses with CORS headers.\n *\n * `options.cors` lets a caller scope CORS for a sensitive route (e.g. pass a\n * localhost-only `origin` allow-list + the request `Origin`); when omitted the\n * default permissive `*` headers are used, so existing callers are unaffected.\n */\nexport function jsonResponse(data: unknown, options: { status?: number; cors?: CorsOptions } = {}): Response {\n const corsHeaders = createCorsHeaders(options.cors);\n\n return new Response(JSON.stringify(data), {\n status: options.status || 200,\n headers: {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-store, max-age=0',\n Pragma: 'no-cache',\n Expires: '0',\n ...corsHeaders,\n },\n });\n}\n\n/**\n * Helper function for error responses with CORS headers\n */\nexport function errorResponse(message: string, status: number = 500): Response {\n return jsonResponse({ error: message }, { status });\n}\n\n/**\n * Cheap, fast 32-bit string hash (FNV-1a). Used to build ETag values for\n * read endpoints \u2014 collision chance is tiny and a false match only delays\n * propagation of a change by one revalidation cycle.\n */\nfunction fnv1a(str: string): string {\n let hash = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(36);\n}\n\n/**\n * JSON response variant that lets the browser keep the body cached and\n * revalidates cheaply via `ETag` / `If-None-Match`. Returns 304 with no\n * body when the client already has the same version. Used by the\n * high-frequency read endpoints (`/api/page-content`, `/api/components`)\n * so iframe page navigations don't re-download identical bodies.\n */\nexport function cachedJsonResponse(\n req: Request,\n body: string,\n options: { status?: number; contentType?: string } = {},\n): Response {\n const corsHeaders = createCorsHeaders();\n const contentType = options.contentType ?? 'application/json';\n const etag = `W/\"${fnv1a(body)}\"`;\n const ifNoneMatch = req.headers.get('if-none-match');\n\n // 304 path: identical body, skip transmission and parsing on the client.\n if (ifNoneMatch && ifNoneMatch === etag) {\n return new Response(null, {\n status: 304,\n headers: {\n ETag: etag,\n 'Cache-Control': 'no-cache',\n ...corsHeaders,\n },\n });\n }\n\n return new Response(body, {\n status: options.status ?? 200,\n headers: {\n 'Content-Type': contentType,\n ETag: etag,\n // `no-cache` (not `no-store`) \u2014 browser may keep the body but must\n // revalidate every time. Pairs with the 304 branch above.\n 'Cache-Control': 'no-cache',\n ...corsHeaders,\n },\n });\n}\n", "/**\n * Components API Routes\n * Handles component CRUD endpoints\n */\n\nimport type { ComponentService } from '../../services/componentService';\nimport type { PageService } from '../../services/pageService';\nimport type { ComponentNode } from '../../../shared/types';\nimport { createCorsHeaders } from '../../middleware/cors';\nimport { jsonResponse, cachedJsonResponse } from './shared';\nimport { formatJsonErrorMessage } from '../../../shared/jsonRepair';\n\n/**\n * Handle components API endpoint - GET /api/components\n * Returns components with category metadata derived from folder structure.\n * Uses ETag revalidation so repeat page navigations get a 304 when the\n * registry hasn't changed.\n */\nexport function handleComponentsRoute(req: Request, componentService: ComponentService): Response {\n const componentsWithCategories = componentService.getAllComponentsWithCategories();\n\n // Transform to API format: { name: { ...definition, _category } }\n const result: Record<string, unknown> = {};\n for (const [name, info] of Object.entries(componentsWithCategories)) {\n result[name] = {\n ...info.definition,\n _category: info.category,\n };\n }\n\n // Include load diagnostics if any\n const diagnostics = componentService.getLoadDiagnostics();\n if (diagnostics.errors.length > 0 || diagnostics.warnings.length > 0) {\n result._diagnostics = diagnostics;\n }\n\n return cachedJsonResponse(req, JSON.stringify(result));\n}\n\n/**\n * Handle component data API endpoint - GET /api/component-data/:name\n * Validates that component has structure before returning\n */\nexport function handleComponentDataRoute(url: URL, componentService: ComponentService): Response {\n const componentName = url.pathname.replace('/api/component-data/', '');\n const componentDef = componentService.getComponent(componentName);\n\n if (!componentDef) {\n // Check if there's a JSON parse error for this component\n const loadErrors = componentService.getLoadErrors();\n const diagnostic = loadErrors.get(componentName);\n if (diagnostic) {\n const message = formatJsonErrorMessage(`${diagnostic.componentName}.json`, {\n message: diagnostic.description,\n line: diagnostic.line,\n column: diagnostic.column,\n });\n return jsonResponse({ error: 'json_parse_error', message, errorCode: 'JSON_PARSE_ERROR' }, { status: 422 });\n }\n return jsonResponse({ error: 'Component not found' }, { status: 404 });\n }\n\n // Debug: Log what we're about to return\n\n // Validate that component has structure\n if (!componentService.validateComponentStructure(componentDef)) {\n return jsonResponse(\n {\n error: 'Component structure is missing',\n message: `Component \"${componentName}\" does not have a valid structure definition. Please add a structure field to the component definition.`,\n },\n { status: 400 },\n );\n }\n\n return jsonResponse(componentDef);\n}\n\n/**\n * Handle component JavaScript API endpoint - GET /api/component-js/:name\n */\nexport async function handleComponentJavaScriptRoute(url: URL, componentService: ComponentService): Promise<Response> {\n const componentName = url.pathname.replace('/api/component-js/', '');\n const jsContent = await componentService.getComponentJavaScript(componentName);\n const corsHeaders = createCorsHeaders();\n\n return new Response(jsContent || '', {\n headers: {\n 'Content-Type': 'text/javascript',\n ...corsHeaders,\n },\n });\n}\n\n/**\n * Handle component usage API endpoint - GET /api/component-usage\n * Returns how many times each component is used across all pages and other components\n */\nexport function handleComponentUsageRoute(pageService: PageService, componentService: ComponentService): Response {\n const usageMap = new Map<\n string,\n { count: number; files: Map<string, { name: string; path: string; type: 'page' | 'component' }> }\n >();\n\n function walkTree(\n node: ComponentNode | undefined | null,\n fileName: string,\n filePath: string,\n fileType: 'page' | 'component',\n ) {\n if (!node || typeof node !== 'object') return;\n if (node.type === 'component' && 'component' in node && (node as any).component) {\n const compName = (node as any).component as string;\n if (!usageMap.has(compName)) {\n usageMap.set(compName, { count: 0, files: new Map() });\n }\n const entry = usageMap.get(compName)!;\n entry.count++;\n entry.files.set(filePath, { name: fileName, path: filePath, type: fileType });\n }\n if ('children' in node && Array.isArray((node as any).children)) {\n for (const child of (node as any).children) {\n if (child && typeof child === 'object') {\n walkTree(child as ComponentNode, fileName, filePath, fileType);\n }\n }\n }\n }\n\n // Walk all pages\n const pagePaths = pageService.getAllPagePaths();\n for (const path of pagePaths) {\n const pageData = pageService.getPageData(path);\n if (pageData && 'root' in pageData && pageData.root) {\n const name = path === '/' ? 'index' : path.replace(/^\\//, '').replace(/\\//g, '-');\n walkTree(pageData.root, name, path, 'page');\n }\n }\n\n // Walk all component structures\n const allComponents = componentService.getAllComponents();\n for (const [compName, compDef] of Object.entries(allComponents)) {\n if (compDef.component?.structure) {\n walkTree(compDef.component.structure, compName, compName, 'component');\n }\n }\n\n // Convert to plain object\n const result: Record<\n string,\n { count: number; files: Array<{ name: string; path: string; type: 'page' | 'component' }> }\n > = {};\n for (const [name, data] of usageMap) {\n result[name] = {\n count: data.count,\n files: Array.from(data.files.values()),\n };\n }\n\n return jsonResponse(result);\n}\n\n// Note: Write handlers (handleSaveComponentRoute, handleSaveComponentJavaScriptRoute,\n// handleSaveComponentCSSRoute, handleComponentCategoryRoute) moved to @meno/studio\n", "/**\n * Config API Routes\n * Handles configuration endpoints\n */\n\nimport { loadJSONFile, parseJSON } from '../../jsonLoader';\nimport { projectPaths } from '../../projectContext';\nimport { jsonResponse } from './shared';\n\n/**\n * Handle config API endpoint - GET /api/config\n */\nexport async function handleConfigRoute(): Promise<Response> {\n try {\n const configContent = await loadJSONFile(projectPaths.config());\n if (configContent) {\n const config = parseJSON(configContent);\n return jsonResponse(config);\n } else {\n return jsonResponse({ editor: { theme: 'dark' } });\n }\n } catch (_error) {\n return jsonResponse({ editor: { theme: 'dark' } });\n }\n}\n\n/**\n * Handle components config API endpoint - GET /api/components-config\n */\nexport async function handleComponentsConfigRoute(): Promise<Response> {\n try {\n const configContent = await loadJSONFile(projectPaths.componentsConfig());\n if (configContent) {\n const config = parseJSON(configContent);\n return jsonResponse(config);\n } else {\n // Return empty defaults if file doesn't exist\n return jsonResponse({ componentTypes: [], componentCategories: {} });\n }\n } catch (_error) {\n return jsonResponse({ componentTypes: [], componentCategories: {} });\n }\n}\n\n// Note: handleSaveConfigRoute moved to @meno/studio\n// Note: handleSaveComponentsConfigRoute moved to @meno/studio\n", "/**\n * Base class for services that lazy-load, cache, and deduplicate config file access.\n *\n * Subclasses implement `performLoad()` and optionally `getDefaultConfig()`.\n */\nexport abstract class CachedConfigLoader<T> {\n private config: T | null = null;\n private loadingPromise: Promise<T> | null = null;\n\n /**\n * Load config, returning cached value if available.\n * Concurrent calls share the same loading promise.\n */\n async load(): Promise<T> {\n if (this.config) {\n return this.config;\n }\n\n if (this.loadingPromise) {\n return this.loadingPromise;\n }\n\n this.loadingPromise = this.performLoad();\n this.config = await this.loadingPromise;\n this.loadingPromise = null;\n\n return this.config;\n }\n\n /**\n * Override in subclass to load config from disk.\n */\n protected abstract performLoad(): Promise<T>;\n\n /**\n * Reset cached value so the next `load()` re-reads from disk.\n */\n clearCache(): void {\n this.config = null;\n }\n\n /**\n * Update the cached value directly (used after saving to disk).\n */\n protected setCache(config: T): void {\n this.config = config;\n }\n\n /**\n * Peek at the current cached value (null if not loaded).\n */\n protected getCache(): T | null {\n return this.config;\n }\n}\n", "/**\n * Color Service\n * Manages loading and caching of color variables and themes from colors.json\n */\n\nimport { loadJSONFile, parseJSON } from '../jsonLoader';\nimport { projectPaths } from '../projectContext';\nimport type { ColorVariables, ColorVariableEntry, ThemeConfig, ThemeEntry } from '../../shared/types';\nimport { resolvePaletteColor } from '../../shared/types';\nimport { CachedConfigLoader } from './CachedConfigLoader';\nimport { writeFile } from '../runtime';\nimport { createLogger } from '../../shared/logger';\n\nconst log = createLogger('ColorService');\n\nexport class ColorService extends CachedConfigLoader<ThemeConfig> {\n /**\n * Load theme configuration from colors.json\n */\n async loadThemeConfig(): Promise<ThemeConfig> {\n return this.load();\n }\n\n /**\n * Perform the actual loading from file\n */\n protected async performLoad(): Promise<ThemeConfig> {\n try {\n const content = await loadJSONFile(projectPaths.colors());\n if (content) {\n const data = parseJSON(content);\n if (data && typeof data === 'object' && 'themes' in data && 'default' in data) {\n return data as ThemeConfig;\n }\n }\n } catch (error) {\n log.warn('Failed to load colors.json:', error);\n }\n\n // Return default theme config if file not found or invalid\n return this.getDefaultThemeConfig();\n }\n\n /**\n * Get default theme configuration\n */\n private getDefaultThemeConfig(): ThemeConfig {\n return {\n default: 'dark',\n themes: {\n dark: {\n label: 'Dark',\n colors: {\n primary: '#007acc',\n 'primary-light': '#0099ff',\n 'primary-dark': '#005a99',\n secondary: '#6c757d',\n success: '#28a745',\n warning: '#ffc107',\n danger: '#dc3545',\n error: '#d32f2f',\n info: '#17a2b8',\n light: '#f8f9fa',\n dark: '#343a40',\n text: '#cccccc',\n 'text-dark': '#1e1e1e',\n background: '#1e1e1e',\n 'background-light': '#252526',\n border: '#444444',\n 'border-light': '#d0d0d0',\n },\n },\n light: {\n label: 'Light',\n colors: {\n primary: '#0066ff',\n 'primary-light': '#3385ff',\n 'primary-dark': '#0052cc',\n secondary: '#888888',\n success: '#22c55e',\n warning: '#f59e0b',\n danger: '#ef4444',\n error: '#dc2626',\n info: '#06b6d4',\n light: '#f8f9fa',\n dark: '#1f2937',\n text: '#1f2937',\n 'text-dark': '#ffffff',\n background: '#ffffff',\n 'background-light': '#f3f4f6',\n border: '#d1d5db',\n 'border-light': '#e5e7eb',\n },\n },\n },\n };\n }\n\n /**\n * Get minimal theme configuration (for new file creation)\n */\n private getMinimalConfig(): ThemeConfig {\n return {\n default: 'default',\n themes: {\n default: {\n label: 'Default',\n colors: {\n background: '#1e1e1e',\n text: '#cccccc',\n },\n },\n },\n };\n }\n\n /**\n * Get config with status info (for editor UI)\n * Distinguishes between missing file, invalid JSON, and valid config\n */\n async getConfigWithStatus(): Promise<{\n status: 'valid' | 'missing' | 'invalid';\n config: ThemeConfig;\n error?: string;\n filePath: string;\n }> {\n const filePath = projectPaths.colors();\n try {\n const content = await loadJSONFile(filePath);\n if (!content) {\n return { status: 'missing', config: this.getMinimalConfig(), filePath };\n }\n const data = parseJSON(content);\n if (data && typeof data === 'object' && 'themes' in data && 'default' in data) {\n return { status: 'valid', config: data as ThemeConfig, filePath };\n }\n return {\n status: 'invalid',\n config: this.getMinimalConfig(),\n error: 'Invalid structure: missing \"themes\" or \"default\" property',\n filePath,\n };\n } catch (error) {\n return {\n status: 'invalid',\n config: this.getMinimalConfig(),\n error: error instanceof Error ? error.message : 'Parse error',\n filePath,\n };\n }\n }\n\n /**\n * Get colors for a specific theme (or default if not found)\n */\n async getThemeColors(themeName?: string): Promise<ColorVariables> {\n const config = await this.loadThemeConfig();\n const theme = themeName && config.themes[themeName] ? config.themes[themeName] : config.themes[config.default];\n const resolvedColors: Record<string, string> = {};\n for (const [name, value] of Object.entries(theme?.colors ?? {})) {\n resolvedColors[name] = resolvePaletteColor(value, config.palette);\n }\n return { colors: resolvedColors };\n }\n\n /**\n * Load color variables from colors.json (for backward compatibility)\n */\n async loadColors(): Promise<ColorVariables> {\n return this.getThemeColors();\n }\n\n /**\n * Get all available themes\n */\n async getAvailableThemes(): Promise<ThemeEntry[]> {\n const config = await this.loadThemeConfig();\n return Object.entries(config.themes).map(([name, theme]) => ({\n name,\n label: theme.label,\n }));\n }\n\n /**\n * Get default theme name\n */\n async getDefaultTheme(): Promise<string> {\n const config = await this.loadThemeConfig();\n return config.default;\n }\n\n /**\n * Get all color variables as entries for a theme\n */\n async getColorEntries(themeName?: string): Promise<ColorVariableEntry[]> {\n const colors = await this.getThemeColors(themeName);\n return Object.entries(colors.colors).map(([name, value]) => ({\n name,\n value,\n }));\n }\n\n /**\n * Get a specific color by name from a theme\n */\n async getColor(name: string, themeName?: string): Promise<string | null> {\n const colors = await this.getThemeColors(themeName);\n return colors.colors[name] || null;\n }\n\n /**\n * Get the full theme configuration (for editor)\n */\n async getFullConfig(): Promise<ThemeConfig> {\n return this.loadThemeConfig();\n }\n\n /**\n * Save theme configuration to colors.json\n */\n async saveThemeConfig(config: ThemeConfig): Promise<void> {\n const colorsPath = projectPaths.colors();\n const content = JSON.stringify(config, null, 2);\n await writeFile(colorsPath, content);\n\n // Update cache with new config\n this.setCache(config);\n }\n}\n\n// Export singleton instance\nexport const colorService = new ColorService();\n", "/**\n * Colors API Routes\n * Handles color variables endpoints with theme support\n */\n\nimport { colorService } from '../../services/ColorService';\nimport { jsonResponse } from './shared';\n\n/**\n * Handle colors API endpoint - GET /api/colors?theme=<themeName>\n */\nexport async function handleColorsRoute(url?: URL): Promise<Response> {\n const themeName = url?.searchParams.get('theme') || undefined;\n const colors = await colorService.getThemeColors(themeName);\n return jsonResponse(colors);\n}\n\n/**\n * Handle themes API endpoint - GET /api/themes\n */\nexport async function handleThemesRoute(): Promise<Response> {\n const themes = await colorService.getAvailableThemes();\n const defaultTheme = await colorService.getDefaultTheme();\n return jsonResponse({ themes, default: defaultTheme });\n}\n\n/**\n * Handle full colors config API endpoint - GET /api/colors-config\n */\nexport async function handleColorsConfigRoute(): Promise<Response> {\n const config = await colorService.getFullConfig();\n return jsonResponse(config);\n}\n\n/**\n * Handle colors status API endpoint - GET /api/colors-status\n * Returns status info: whether file exists, is valid, or has errors\n */\nexport async function handleColorsStatusRoute(): Promise<Response> {\n const result = await colorService.getConfigWithStatus();\n return jsonResponse(result);\n}\n\n// Note: handleSaveColorsRoute moved to @meno/studio\n", "/**\n * Variable Service\n * Manages loading and caching of CSS variables from variables.json\n */\n\nimport { loadJSONFile, parseJSON } from '../jsonLoader';\nimport { projectPaths } from '../projectContext';\nimport type { VariablesConfig } from '../../shared/types';\nimport { CachedConfigLoader } from './CachedConfigLoader';\nimport { writeFile } from '../runtime';\nimport { createLogger } from '../../shared/logger';\n\nconst log = createLogger('VariableService');\n\nexport class VariableService extends CachedConfigLoader<VariablesConfig> {\n /**\n * Load variables configuration from variables.json\n */\n async loadConfig(): Promise<VariablesConfig> {\n return this.load();\n }\n\n protected async performLoad(): Promise<VariablesConfig> {\n try {\n const content = await loadJSONFile(projectPaths.variables());\n if (content) {\n const data = parseJSON(content);\n if (data && typeof data === 'object' && 'variables' in data && Array.isArray(data.variables)) {\n return this.migrateConfig(data as VariablesConfig);\n }\n }\n } catch (error) {\n log.warn('Failed to load variables.json:', error);\n }\n\n return this.getDefaultConfig();\n }\n\n private getDefaultConfig(): VariablesConfig {\n return { variables: [] };\n }\n\n /**\n * Migrate legacy config values (e.g. \"spacing\" group -> margin/padding/gap)\n */\n private migrateConfig(config: VariablesConfig): VariablesConfig {\n for (const variable of config.variables) {\n if ((variable.group as string) === 'spacing') {\n const lower = `${variable.cssVar} ${variable.name}`.toLowerCase();\n if (lower.includes('margin')) {\n variable.group = 'margin';\n } else if (lower.includes('gap')) {\n variable.group = 'gap';\n } else {\n variable.group = 'padding';\n }\n }\n }\n return config;\n }\n\n /**\n * Get config with status info (for editor UI)\n */\n async getConfigWithStatus(): Promise<{\n status: 'valid' | 'missing' | 'invalid';\n config: VariablesConfig;\n error?: string;\n filePath: string;\n }> {\n const filePath = projectPaths.variables();\n try {\n const content = await loadJSONFile(filePath);\n if (!content) {\n return { status: 'missing', config: this.getDefaultConfig(), filePath };\n }\n const data = parseJSON(content);\n if (data && typeof data === 'object' && 'variables' in data && Array.isArray(data.variables)) {\n return { status: 'valid', config: this.migrateConfig(data as VariablesConfig), filePath };\n }\n return {\n status: 'invalid',\n config: this.getDefaultConfig(),\n error: 'Invalid structure: missing \"variables\" array',\n filePath,\n };\n } catch (error) {\n return {\n status: 'invalid',\n config: this.getDefaultConfig(),\n error: error instanceof Error ? error.message : 'Parse error',\n filePath,\n };\n }\n }\n\n /**\n * Save variables configuration to variables.json\n */\n async saveConfig(config: VariablesConfig): Promise<void> {\n const variablesPath = projectPaths.variables();\n const content = JSON.stringify(config, null, 2);\n await writeFile(variablesPath, content);\n this.setCache(config);\n }\n}\n\n// Export singleton instance\nexport const variableService = new VariableService();\n", "/**\n * CSS Variables Generator\n * Generates CSS color variable declarations for themes\n * and CSS custom property declarations from variables.json\n */\n\nimport type { ColorVariables, ThemeConfig } from '../shared/types/colors';\nimport { resolvePaletteColor } from '../shared/types/colors';\nimport type { VariablesConfig } from '../shared/types/variables';\nimport type { BreakpointConfig } from '../shared/breakpoints';\nimport type { ResponsiveScales, BreakpointScales } from '../shared/responsiveScaling';\nimport {\n scalePropertyValue,\n buildSiteMarginClamp,\n buildFluidPropertyValue,\n getSmallestBreakpointName,\n DEFAULT_FLUID_RANGE,\n DEFAULT_SITE_MARGIN,\n} from '../shared/responsiveScaling';\n\n/**\n * Generate CSS color variable declarations from color variables\n * Creates :root { --variable-name: value; } CSS\n */\nexport function generateColorVariablesCSS(colors: ColorVariables): string {\n const cssVars: string[] = [];\n\n for (const [name, value] of Object.entries(colors.colors)) {\n cssVars.push(` --${name}: ${value};`);\n }\n\n if (cssVars.length === 0) {\n return '';\n }\n\n return `:root {\\n${cssVars.join('\\n')}\\n}`;\n}\n\n/**\n * Generate CSS color variable declarations for multiple themes\n * Creates [theme=\"dark\"] { --variable-name: value; } selectors for each theme\n */\nexport function generateThemeColorVariablesCSS(themeConfig: ThemeConfig): string {\n const cssBlocks: string[] = [];\n const palette = themeConfig.palette;\n\n for (const [themeName, theme] of Object.entries(themeConfig.themes)) {\n const cssVars: string[] = [];\n\n for (const [name, value] of Object.entries(theme.colors)) {\n const resolved = resolvePaletteColor(value, palette);\n cssVars.push(` --${name}: ${resolved};`);\n }\n\n if (cssVars.length > 0) {\n cssBlocks.push(`[theme=\"${themeName}\"] {\\n${cssVars.join('\\n')}\\n}`);\n }\n }\n\n // Also include :root with default theme colors\n const defaultTheme = themeConfig.themes[themeConfig.default];\n if (defaultTheme) {\n const cssVars: string[] = [];\n for (const [name, value] of Object.entries(defaultTheme.colors)) {\n const resolved = resolvePaletteColor(value, palette);\n cssVars.push(` --${name}: ${resolved};`);\n }\n if (cssVars.length > 0) {\n cssBlocks.unshift(`:root {\\n${cssVars.join('\\n')}\\n}`);\n }\n }\n\n return cssBlocks.join('\\n\\n');\n}\n\n/**\n * Generate CSS custom property declarations from variables.json config\n * Produces :root block for base values and @media blocks for responsive scaling\n */\nexport function generateVariablesCSS(\n config: VariablesConfig,\n breakpoints?: BreakpointConfig,\n responsiveScales?: ResponsiveScales,\n): string {\n const cssBlocks: string[] = [];\n const fluidActive = responsiveScales?.enabled === true && responsiveScales?.mode === 'fluid';\n\n // Build base :root block: user-defined variables + (in fluid mode) --site-margin.\n // In fluid mode user variables get clamp() values directly on :root rather\n // than @media overrides \u2014 so we run them through buildFluidPropertyValue here.\n const fluidRange = responsiveScales?.fluidRange ?? DEFAULT_FLUID_RANGE;\n const fluidBaseRef = responsiveScales?.baseReference || 16;\n const smallestBp = fluidActive ? getSmallestBreakpointName(breakpoints) : null;\n\n const baseVars: string[] = (config.variables ?? []).map((v) => {\n if (fluidActive && smallestBp && v.type !== 'none') {\n const categoryScales = responsiveScales?.[v.type] as BreakpointScales | undefined;\n const scale = categoryScales?.[smallestBp];\n if (scale != null && scale !== 1) {\n const fluid = buildFluidPropertyValue(v.value, scale, fluidRange.min, fluidRange.max, fluidBaseRef);\n if (fluid) return ` ${v.cssVar}: ${fluid};`;\n }\n }\n return ` ${v.cssVar}: ${v.value};`;\n });\n\n if (fluidActive) {\n const siteMargin = responsiveScales?.siteMargin ?? DEFAULT_SITE_MARGIN;\n baseVars.push(` --site-margin: ${buildSiteMarginClamp(siteMargin, fluidRange)};`);\n }\n\n if (baseVars.length === 0) {\n return '';\n }\n\n cssBlocks.push(`:root {\\n${baseVars.join('\\n')}\\n}`);\n\n // Generate @media blocks for responsive scaling \u2014 only in breakpoints mode.\n // In fluid mode all scaling is encoded in clamp() on the base :root block.\n const userVariables = config.variables ?? [];\n if (breakpoints && responsiveScales?.enabled && !fluidActive && userVariables.length > 0) {\n const baseRef = responsiveScales.baseReference || 16;\n\n // Sort breakpoints by value descending (largest first)\n const sortedBreakpoints = Object.entries(breakpoints).sort((a, b) => b[1].breakpoint - a[1].breakpoint);\n\n for (const [bpName, bpEntry] of sortedBreakpoints) {\n const scaledVars: string[] = [];\n\n for (const variable of userVariables) {\n // Per-variable override takes priority \u2014 stored string is the CSS value\n if (variable.scales?.[bpName]) {\n const overrideValue = variable.scales[bpName];\n if (overrideValue !== variable.value) {\n scaledVars.push(` ${variable.cssVar}: ${overrideValue};`);\n }\n continue;\n }\n\n // Global category scale (existing logic)\n if (variable.type === 'none') continue;\n const categoryScales = responsiveScales[variable.type] as BreakpointScales | undefined;\n const scale = categoryScales?.[bpName] ?? null;\n if (scale === null) continue;\n\n const scaled = scalePropertyValue(variable.value, baseRef, scale);\n if (scaled !== null && scaled !== variable.value) {\n scaledVars.push(` ${variable.cssVar}: ${scaled};`);\n }\n }\n\n if (scaledVars.length > 0) {\n cssBlocks.push(`@media (max-width: ${bpEntry.breakpoint}px) {\\n :root {\\n${scaledVars.join('\\n')}\\n }\\n}`);\n }\n }\n }\n\n return cssBlocks.join('\\n');\n}\n", "/**\n * Variables API Routes (Read-only)\n * Handles CSS variables status and CSS generation endpoints\n */\n\nimport { variableService } from '../../services/VariableService';\nimport { generateVariablesCSS } from '../../cssGenerator';\nimport { loadBreakpointConfig } from '../../jsonLoader';\nimport { configService } from '../../services/configService';\nimport { jsonResponse } from './shared';\n\n/**\n * Handle variables status API endpoint - GET /api/variables-status\n * Returns status info: whether file exists, is valid, or has errors\n */\nexport async function handleVariablesStatusRoute(): Promise<Response> {\n const result = await variableService.getConfigWithStatus();\n return jsonResponse(result);\n}\n\n/**\n * Handle variables CSS API endpoint - GET /api/variables-css\n * Returns generated CSS custom properties from variables.json\n */\nexport async function handleVariablesCSSRoute(): Promise<Response> {\n await configService.load();\n const variablesConfig = await variableService.loadConfig();\n const breakpointConfig = await loadBreakpointConfig();\n const responsiveScalesConfig = configService.getResponsiveScales();\n const css = generateVariablesCSS(variablesConfig, breakpointConfig, responsiveScalesConfig);\n return new Response(css, {\n headers: { 'Content-Type': 'text/css' },\n });\n}\n", "/**\n * Enum Service\n * Manages loading and caching of project-level enums from enums.json\n */\n\nimport { loadJSONFile, parseJSON } from '../jsonLoader';\nimport { projectPaths } from '../projectContext';\nimport type { EnumsConfig } from '../../shared/types';\nimport { CachedConfigLoader } from './CachedConfigLoader';\nimport { writeFile } from '../runtime';\nimport { createLogger } from '../../shared/logger';\n\nconst log = createLogger('EnumService');\n\nexport class EnumService extends CachedConfigLoader<EnumsConfig> {\n /**\n * Load enums configuration from enums.json\n */\n async loadConfig(): Promise<EnumsConfig> {\n return this.load();\n }\n\n protected async performLoad(): Promise<EnumsConfig> {\n // Load both files in parallel \u2014 enums.json takes priority over config fallback\n const [enumsContent, configContent] = await Promise.all([\n loadJSONFile(projectPaths.enums()).catch(() => null),\n loadJSONFile(projectPaths.config()).catch(() => null),\n ]);\n\n // Try enums.json first\n if (enumsContent) {\n try {\n const data = parseJSON(enumsContent);\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n return this.validateEnums(data as Record<string, unknown>);\n }\n } catch (error) {\n log.warn('Failed to parse enums.json:', error);\n }\n }\n\n // Fallback: check project.config.json for existing enums (migration support)\n if (configContent) {\n try {\n const configData = parseJSON(configContent);\n if (configData && typeof configData === 'object' && 'enums' in configData) {\n const enums = (configData as Record<string, unknown>).enums;\n if (enums && typeof enums === 'object' && !Array.isArray(enums)) {\n return this.validateEnums(enums as Record<string, unknown>);\n }\n }\n } catch {\n // Ignore errors from config fallback\n }\n }\n\n return this.getDefaultConfig();\n }\n\n private getDefaultConfig(): EnumsConfig {\n return {};\n }\n\n /**\n * Validate that all values are string arrays\n */\n private validateEnums(data: Record<string, unknown>): EnumsConfig {\n const result: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(data)) {\n if (Array.isArray(value) && value.every((item) => typeof item === 'string')) {\n result[key] = value;\n }\n }\n return result;\n }\n\n /**\n * Get config with status info (for editor UI)\n */\n async getConfigWithStatus(): Promise<{\n status: 'valid' | 'missing' | 'invalid';\n config: EnumsConfig;\n error?: string;\n filePath: string;\n }> {\n const filePath = projectPaths.enums();\n try {\n const content = await loadJSONFile(filePath);\n if (!content) {\n // File doesn't exist - try migration fallback\n const fallbackConfig = await this.performLoad();\n const hasFallback = Object.keys(fallbackConfig).length > 0;\n return {\n status: hasFallback ? 'valid' : 'missing',\n config: fallbackConfig,\n filePath,\n };\n }\n const data = parseJSON(content);\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n return { status: 'valid', config: this.validateEnums(data as Record<string, unknown>), filePath };\n }\n return {\n status: 'invalid',\n config: this.getDefaultConfig(),\n error: 'Invalid structure: expected Record<string, string[]>',\n filePath,\n };\n } catch (error) {\n return {\n status: 'invalid',\n config: this.getDefaultConfig(),\n error: error instanceof Error ? error.message : 'Parse error',\n filePath,\n };\n }\n }\n\n /**\n * Save enums configuration to enums.json\n */\n async saveConfig(config: EnumsConfig): Promise<void> {\n const enumsPath = projectPaths.enums();\n const content = JSON.stringify(config, null, 2);\n await writeFile(enumsPath, content);\n this.setCache(config);\n }\n}\n\n// Export singleton instance\nexport const enumService = new EnumService();\n", "/**\n * Enums API Routes (Read-only)\n * Handles project-level enums endpoint\n */\n\nimport { enumService } from '../../services/EnumService';\nimport { jsonResponse } from './shared';\n\n/**\n * Handle enums API endpoint - GET /api/enums\n * Returns enums config with status info\n */\nexport async function handleEnumsRoute(): Promise<Response> {\n const result = await enumService.getConfigWithStatus();\n return jsonResponse(result);\n}\n", "/**\n * CMS API Routes\n * Handles CMS content CRUD endpoints\n */\n\nimport type { CMSService } from '../../services/cmsService';\nimport type { CMSSchema } from '../../../shared/types';\nimport { jsonResponse, errorResponse } from './shared';\nimport { addItemUrls } from '../../../shared/itemTemplateUtils';\nimport { extractStringValue } from '../../../shared/slugify';\n\n/**\n * GET /api/cms/collections - List all collections with their schemas\n */\nexport function handleCollectionsRoute(cmsService: CMSService): Response {\n const schemas = cmsService.getAllSchemas();\n const collections: CMSSchema[] = [];\n\n for (const [, schemaInfo] of schemas) {\n collections.push(schemaInfo.schema);\n }\n\n return jsonResponse({ collections });\n}\n\n/**\n * GET /api/cms/collections/:collection - Get schema for specific collection\n */\nexport function handleCollectionSchemaRoute(collection: string, cmsService: CMSService): Response {\n const schema = cmsService.getSchema(collection);\n\n if (!schema) {\n return errorResponse('Collection not found', 404);\n }\n\n return jsonResponse({ schema });\n}\n\n// Note: handleCreateCollectionRoute moved to @meno/studio\n\n/**\n * GET /api/cms/:collection - List items in a collection with pagination\n * Query params:\n * - limit: max items to return (default: all)\n * - offset: items to skip (default: 0)\n * - search: filter items by title/slug containing this string\n */\nexport async function handleItemsRoute(\n collection: string,\n cmsService: CMSService,\n searchParams?: URLSearchParams,\n): Promise<Response> {\n // Parse pagination params\n const limit = searchParams?.get('limit') ? parseInt(searchParams.get('limit')!, 10) : undefined;\n const offset = searchParams?.get('offset') ? parseInt(searchParams.get('offset')!, 10) : undefined;\n const search = searchParams?.get('search') || undefined;\n\n // Get total count first (without limit/offset)\n const allItems = await cmsService.queryItems({ collection });\n const total = allItems.length;\n\n // Apply search filter if provided\n let filteredItems = allItems;\n if (search) {\n const searchLower = search.toLowerCase();\n const schema = cmsService.getSchema(collection);\n const slugField = schema?.slugField || 'slug';\n\n filteredItems = allItems.filter((item) => {\n // Search in title, slug, and filename\n const title = extractStringValue(item.title || '').toLowerCase();\n const slug = extractStringValue(item[slugField] || item._slug || '').toLowerCase();\n const filename = String(item._filename || '').toLowerCase();\n return title.includes(searchLower) || slug.includes(searchLower) || filename.includes(searchLower);\n });\n }\n\n // Apply pagination\n let items = filteredItems;\n if (offset !== undefined && offset > 0) {\n items = items.slice(offset);\n }\n if (limit !== undefined && limit > 0) {\n items = items.slice(0, limit);\n }\n\n // Add computed _url field to items for template access ({{item._url}})\n const schema = cmsService.getSchema(collection);\n const itemsWithUrl = schema ? addItemUrls(items, schema) : items;\n\n return jsonResponse({\n items: itemsWithUrl,\n total: search ? filteredItems.length : total,\n limit,\n offset: offset || 0,\n });\n}\n\n/**\n * GET /api/cms/:collection/:slug - Get specific item by slug\n */\nexport async function handleItemRoute(collection: string, slug: string, cmsService: CMSService): Promise<Response> {\n const match = await cmsService.matchRoute(\n cmsService.getSchema(collection)?.urlPattern?.replace('{{slug}}', slug) || '',\n );\n\n // If no match via route, try direct provider access\n if (!match) {\n // For direct item access, we need to check if item exists\n const items = await cmsService.queryItems({ collection });\n const item = items.find(\n (i) => i._slug === slug || i[cmsService.getSchema(collection)?.slugField || 'slug'] === slug,\n );\n\n if (!item) {\n return errorResponse('Item not found', 404);\n }\n\n return jsonResponse({ item });\n }\n\n return jsonResponse({ item: match.item });\n}\n\n// Note: Write handlers (handleCreateItemRoute, handleUpdateItemRoute, handleDeleteItemRoute)\n// moved to @meno/studio\n", "/**\n * Functions Route Handler (Development)\n * Loads and executes Cloudflare Pages Functions locally for development\n *\n * In production, Cloudflare Pages handles these routes directly.\n * This handler simulates the Cloudflare environment for local dev.\n */\n\nimport { projectPaths } from '../../projectContext';\nimport path from 'node:path';\nimport { readTextFile, fileExists } from '../../runtime';\n\n/**\n * Mock Cloudflare EventContext for local development\n */\ninterface MockEventContext {\n request: Request;\n env: Record<string, string>;\n params: Record<string, string>;\n waitUntil: (promise: Promise<unknown>) => void;\n passThroughOnException: () => void;\n}\n\n/**\n * Load environment variables from project .env file\n */\nasync function loadProjectEnv(): Promise<Record<string, string>> {\n const envPath = projectPaths.env();\n const env: Record<string, string> = {};\n\n try {\n if (await fileExists(envPath)) {\n const content = await readTextFile(envPath);\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) {\n const [key, ...valueParts] = trimmed.split('=');\n if (key) {\n // Remove quotes from value if present\n let value = valueParts.join('=');\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n env[key.trim()] = value;\n }\n }\n }\n }\n } catch (error) {\n console.warn('Could not load .env file:', error);\n }\n\n return env;\n}\n\n/**\n * Handle API function requests in development\n * Routes like /api/contact are mapped to /functions/api/contact.ts\n */\nexport async function handleFunctionsRoute(req: Request, url: URL): Promise<Response | undefined> {\n // Only handle /api/* routes\n if (!url.pathname.startsWith('/api/')) {\n return undefined;\n }\n\n // Skip /api/editor/* routes - those are handled by the editor API\n if (url.pathname.startsWith('/api/editor/')) {\n return undefined;\n }\n\n // Extract function path from URL\n // /api/contact -> functions/api/contact.ts\n const functionPath = url.pathname.replace('/api/', '');\n const functionFilePath = path.join(projectPaths.functions(), 'api', `${functionPath}.ts`);\n\n // Check if function file exists\n if (!(await fileExists(functionFilePath))) {\n // Also try .js extension\n const jsFilePath = functionFilePath.replace('.ts', '.js');\n if (!(await fileExists(jsFilePath))) {\n return undefined; // Let other handlers deal with it\n }\n }\n\n try {\n // Dynamically import the function module\n // Use timestamp to bust cache in development\n const moduleUrl = `${functionFilePath}?t=${Date.now()}`;\n const functionModule = await import(moduleUrl);\n\n // Determine which handler to call based on HTTP method\n const method = req.method.toUpperCase();\n const handlerName = `onRequest${method.charAt(0)}${method.slice(1).toLowerCase()}`;\n\n // Try method-specific handler first, then generic onRequest\n const handler = functionModule[handlerName] || functionModule.onRequest;\n\n if (!handler || typeof handler !== 'function') {\n return new Response(JSON.stringify({ error: `No handler found for ${method} request` }), {\n status: 405,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n // Load environment variables\n const env = await loadProjectEnv();\n\n // Create mock Cloudflare context\n const context: MockEventContext = {\n request: req,\n env,\n params: {}, // Could parse URL params if needed\n waitUntil: () => {}, // No-op in dev\n passThroughOnException: () => {}, // No-op in dev\n };\n\n // Call the handler\n const response = await handler(context);\n\n // Add CORS headers for development\n const headers = new Headers(response.headers);\n headers.set('Access-Control-Allow-Origin', '*');\n headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n headers.set('Access-Control-Allow-Headers', 'Content-Type');\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n } catch (error) {\n console.error(`Error executing function ${functionPath}:`, error);\n return new Response(\n JSON.stringify({\n error: 'Function execution error',\n message: error instanceof Error ? error.message : 'Unknown error',\n }),\n { status: 500, headers: { 'Content-Type': 'application/json' } },\n );\n }\n}\n\n/**\n * Handle OPTIONS preflight for CORS\n */\nexport function handleFunctionsPreflight(req: Request, url: URL): Response | undefined {\n if (req.method !== 'OPTIONS' || !url.pathname.startsWith('/api/')) {\n return undefined;\n }\n\n return new Response(null, {\n status: 204,\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type',\n 'Access-Control-Max-Age': '86400',\n },\n });\n}\n", "/**\n * API Route Registration\n * Centralized API route handling with error handling\n *\n * Core routes are read-only operations. Write operations are in @meno/studio.\n */\n\nimport type { PageService } from '../../services/pageService';\nimport type { ComponentService } from '../../services/componentService';\nimport type { CMSService } from '../../services/cmsService';\nimport type { CMSProvider } from '../../../shared/interfaces/contentProvider';\nimport { handleRouteError } from '../../middleware/errorHandler';\nimport { handleCoreApiRoutes, type CoreRouteContext } from './core-routes';\n\n/** Context for CMS API routes */\nexport interface CMSRouteContext {\n cmsService: CMSService;\n cmsProvider: CMSProvider;\n}\n\n// Re-export route contexts for external use\nexport type { CoreRouteContext };\n\n/**\n * Handle core API routes (read-only operations)\n * Write operations are handled by @meno/studio via additionalRoutes\n */\nexport async function handleApiRoutes(\n req: Request,\n url: URL,\n pageService: PageService,\n componentService: ComponentService,\n cmsContext?: CMSRouteContext,\n): Promise<Response | undefined> {\n try {\n const coreContext: CoreRouteContext = {\n pageService,\n componentService,\n cmsService: cmsContext?.cmsService,\n };\n\n return await handleCoreApiRoutes(req, url, coreContext);\n } catch (error) {\n // This catch is a fallback - individual routes should handle their own errors\n return handleRouteError(() => Promise.reject(error), 'API route error');\n }\n}\n\n/**\n * Handle only core API routes (for meno-core without editor)\n */\nexport async function handleCoreOnlyApiRoutes(\n req: Request,\n url: URL,\n pageService: PageService,\n componentService: ComponentService,\n cmsService?: CMSService,\n): Promise<Response | undefined> {\n const context: CoreRouteContext = {\n pageService,\n componentService,\n cmsService,\n };\n\n return handleCoreApiRoutes(req, url, context);\n}\n", "/**\n * Page Route Handler\n * Handles page route requests with SSR, i18n, and CMS support\n */\n\nimport { randomBytes } from 'node:crypto';\nimport type { RouteContext } from './index';\nimport { generateSSRHTML, type SSRHTMLResult } from '../ssrRenderer';\nimport { getStaticFilePath } from '../../shared/pathUtils';\nimport { parseJSON, loadI18nConfig } from '../jsonLoader';\nimport { packagePaths } from '../projectContext';\nimport { parseLocaleFromPath } from '../../shared/i18n';\nimport { buildSlugIndex, resolveSlugToPageId } from '../../shared/slugTranslator';\nimport { generateErrorPage } from '../ssr/errorOverlay';\nimport { cacheScript, hashContent } from '../scriptCache';\nimport { readTextFile, fileExists, serveFile } from '../runtime';\n\n/** HTTP header sent by the studio's /__static__/ proxy to flag editor-preview requests. */\nconst EDITOR_HEADER = 'x-meno-editor';\n\n/**\n * Response header carrying the per-request CSP nonce. The Electron main\n * process (electron-app/main/window.js) reads this in onHeadersReceived and\n * splices `'nonce-${nonce}'` into the script-src directive while dropping\n * `'unsafe-inline'`, so the inline scripts the SSR pipeline emits (config,\n * CMS context, live reload, scroll sync, component script) keep executing\n * without re-enabling unrestricted inline JavaScript.\n */\nconst CSP_NONCE_HEADER = 'x-meno-csp-nonce';\n\n/**\n * Generate a fresh per-request CSP nonce.\n * 16 bytes of randomness \u2192 24 base64 chars, well above CSP3's 128-bit floor.\n */\nfunction generateCspNonce(): string {\n return randomBytes(16).toString('base64');\n}\n\n/**\n * Handle page route requests\n */\nexport async function handlePageRoute(url: URL, context: RouteContext, req?: Request): Promise<Response | undefined> {\n const { pageService, componentService, cmsService, injectLiveReload, isEditor, serverPort } = context;\n const pagePath = url.pathname;\n // Editor selection attributes (data-element-path, data-cms-context, ...).\n // Emitted whenever live-reload is on (dev SSR preview) so the inline\n // smart-diff script can identify elements when external browser tabs\n // refetch on draft pushes \u2014 without these attrs the diff only syncs\n // text nodes and className changes get silently dropped. Also still\n // emitted when the studio's /__static__/ proxy sets `x-meno-editor: 1`\n // (back-compat). Static/production builds keep clean output because\n // injectLiveReload is false there.\n const injectEditorAttrs = injectLiveReload === true || req?.headers.get(EDITOR_HEADER) === '1';\n\n // Fresh CSP nonce per request: stamped onto every inline <script> emitted\n // by the SSR pipeline AND sent back to the Electron main process via the\n // x-meno-csp-nonce header so it can splice `'nonce-XXX'` into the BrowserWindow\n // CSP in place of `'unsafe-inline'`. See electron-app/main/window.js.\n const cspNonce = generateCspNonce();\n\n // Load i18n config for locale extraction\n const i18nConfig = await loadI18nConfig();\n\n // Parse locale from URL path (e.g., /pl/o-nas -> locale: 'pl', path: '/o-nas')\n const { locale, pathWithoutLocale } = parseLocaleFromPath(pagePath, i18nConfig);\n\n // Build slug index for translation lookup\n const slugMappings = pageService.getSlugMappings();\n const slugIndex = buildSlugIndex(slugMappings);\n\n // 1. Try CMS route match first (pass locale for i18n slug matching)\n if (cmsService) {\n const cmsMatch = await cmsService.matchRoute(pathWithoutLocale, locale);\n\n if (cmsMatch) {\n // Editor-only draft preview: when the studio editor requests a CMS page\n // with `?previewDraft=1` and a draft exists for that item, swap the\n // matched item for the draft. SSR continues to render normally; the\n // live site (no editor header, no query param) is unaffected.\n if (injectEditorAttrs && url.searchParams.get('previewDraft') === '1' && cmsMatch.item._filename) {\n const draft = await cmsService.getDraft(cmsMatch.collection, cmsMatch.item._filename);\n if (draft) {\n cmsMatch.item = draft;\n }\n }\n // Load the CMS template page. PageService caches it at `/templates/<collection>`\n // already converted to JSON \u2014 for astro projects the provider parses the\n // `[slug].astro` dialect file into the JSON model there. Reading the raw file\n // (loadPageByFilePath) only yields JSON in JSON-format projects; in astro\n // projects it would hand parseJSON() raw `.astro` source and throw\n // (\"Content that should be valid JSON couldn't be parsed\"). Fall back to the raw\n // read for JSON-project edge cases (template filename \u2260 collection id) / a cold cache.\n const templatePageContent =\n pageService.getPage(`/templates/${cmsMatch.collection}`) ?? (await loadPageByFilePath(cmsMatch.pagePath));\n\n if (templatePageContent) {\n // The editor page-path of the CMS template \u2014 `/templates/<collectionId>` \u2014 which\n // is also the PageCache key for both formats (JSON provider scans templates/ to\n // /templates/<stem>; AstroPageProvider maps [slug].astro to /templates/<cms.id>).\n // The client (window.__MENO_CMS__.templatePath) reloads this on HMR, so it MUST be\n // the cache key. Deriving it from cmsMatch.pagePath via string-stripping only works\n // for JSON (a templates/<id>.json file); in astro pagePath is the absolute\n // src/pages/<col>/[slug].astro, so stripping produced a bogus path \u2192 the canvas\n // rendered the SSR'd page then 404'd on its first HMR/mount reload.\n const cmsTemplatePath = `/templates/${cmsMatch.collection}`;\n\n try {\n // Parse page JSON\n const pageData = parseJSON(templatePageContent);\n\n // Convert global components Map to Record for SSR\n const globalComponentsRecord = componentService.getAllComponents();\n\n // Generate SSR HTML with CMS context\n const baseUrl = `${url.protocol}//${url.host}`;\n const typedPageData = pageData as import('../../shared/types').JSONPage;\n\n // SSR preview mode: use external JS file (same pattern as static build)\n if (injectLiveReload) {\n const result = (await generateSSRHTML({\n pageData: typedPageData,\n globalComponents: globalComponentsRecord,\n pagePath,\n baseUrl,\n useBuiltBundle: true,\n locale,\n slugMappings,\n cmsContext: { cms: cmsMatch.item },\n cmsService,\n cmsTemplatePath,\n pageLibraries: typedPageData.meta?.libraries,\n pageCustomCode: typedPageData.meta?.customCode,\n injectLiveReload,\n injectEditorAttrs,\n isEditor,\n serverPort,\n returnSeparateJS: true,\n cspNonce,\n })) as SSRHTMLResult;\n\n let finalHtml = result.html;\n if (result.javascript) {\n const hash = hashContent(result.javascript);\n cacheScript(hash, result.javascript);\n finalHtml = finalHtml.replace('</body>', ` <script src=\"/_scripts/${hash}.js\" defer></script>\\n</body>`);\n }\n\n return new Response(finalHtml, {\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-store, max-age=0',\n Pragma: 'no-cache',\n Expires: '0',\n [CSP_NONCE_HEADER]: cspNonce,\n },\n });\n }\n\n // Dev mode: inline JS\n const ssrHTML = await generateSSRHTML({\n pageData: typedPageData,\n globalComponents: globalComponentsRecord,\n pagePath,\n baseUrl,\n useBuiltBundle: false,\n locale,\n slugMappings,\n cmsContext: { cms: cmsMatch.item },\n cmsService,\n cmsTemplatePath,\n pageLibraries: typedPageData.meta?.libraries,\n pageCustomCode: typedPageData.meta?.customCode,\n injectEditorAttrs,\n isEditor,\n cspNonce,\n });\n\n return new Response(ssrHTML, {\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-store, max-age=0',\n Pragma: 'no-cache',\n Expires: '0',\n [CSP_NONCE_HEADER]: cspNonce,\n },\n });\n } catch (error) {\n console.error('Error rendering CMS page:', error);\n // Show error overlay in preview instead of silent fallback\n return new Response(generateErrorPage(error, `Error rendering template: ${cmsTemplatePath}`, cspNonce), {\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-store',\n [CSP_NONCE_HEADER]: cspNonce,\n },\n });\n }\n }\n }\n }\n\n // 2. Fall back to static page routing\n\n // Extract slug from path (remove leading slash)\n const slug = pathWithoutLocale === '/' ? '' : pathWithoutLocale.substring(1);\n\n // Try to resolve translated slug to pageId (e.g., \"o-nas\" + \"pl\" -> \"about\")\n const pageId = resolveSlugToPageId(slug, locale, slugIndex);\n\n // Determine lookup path: use resolved pageId or fall back to original path\n let lookupPath: string;\n if (pageId) {\n lookupPath = pageId === 'index' ? '/' : `/${pageId}`;\n } else {\n // No translation found, use original path without locale\n lookupPath = pathWithoutLocale;\n }\n\n // Skip static files in development mode - always use fresh SSR from JSON files\n const isDevelopment = true; // Always true when running dev server\n\n if (!isDevelopment) {\n // Production mode: Check for pre-built static file first\n const staticFilePath = getStaticFilePath(pagePath);\n\n if (await fileExists(staticFilePath)) {\n return serveFile(staticFilePath, {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'public, max-age=31536000', // 1 year cache for static files\n });\n }\n }\n\n // Development mode: Always use fresh SSR from JSON files (no caching).\n // Studio-pushed draft (if any) wins over the on-disk version so external\n // browser tabs reflect unsaved edits.\n const pageContent = context.draftPageStore?.get(lookupPath) ?? pageService.getPage(lookupPath);\n\n if (pageContent) {\n try {\n // Parse page JSON\n const pageData = parseJSON(pageContent) as import('../../shared/types').JSONPage;\n\n // Convert global components Map to Record for SSR\n const globalComponentsRecord = componentService.getAllComponents();\n\n // Generate SSR HTML with pre-rendered content and locale\n const baseUrl = `${url.protocol}//${url.host}`;\n\n // SSR preview mode: use external JS file (same pattern as static build)\n if (injectLiveReload) {\n const result = (await generateSSRHTML({\n pageData,\n globalComponents: globalComponentsRecord,\n pagePath,\n baseUrl,\n useBuiltBundle: true,\n locale,\n slugMappings,\n cmsService,\n pageLibraries: pageData.meta?.libraries,\n pageCustomCode: pageData.meta?.customCode,\n injectLiveReload,\n injectEditorAttrs,\n isEditor,\n serverPort,\n returnSeparateJS: true,\n cspNonce,\n })) as SSRHTMLResult;\n\n let finalHtml = result.html;\n if (result.javascript) {\n const hash = hashContent(result.javascript);\n cacheScript(hash, result.javascript);\n finalHtml = finalHtml.replace('</body>', ` <script src=\"/_scripts/${hash}.js\" defer></script>\\n</body>`);\n }\n\n return new Response(finalHtml, {\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-store, max-age=0',\n Pragma: 'no-cache',\n Expires: '0',\n [CSP_NONCE_HEADER]: cspNonce,\n },\n });\n }\n\n // Dev mode: inline JS\n const ssrHTML = await generateSSRHTML({\n pageData,\n globalComponents: globalComponentsRecord,\n pagePath,\n baseUrl,\n useBuiltBundle: false,\n locale,\n slugMappings,\n cmsService,\n pageLibraries: pageData.meta?.libraries,\n pageCustomCode: pageData.meta?.customCode,\n injectEditorAttrs,\n isEditor,\n cspNonce,\n });\n\n return new Response(ssrHTML, {\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-store, max-age=0',\n Pragma: 'no-cache',\n Expires: '0',\n [CSP_NONCE_HEADER]: cspNonce,\n },\n });\n } catch (error) {\n console.error('Error rendering page:', error);\n // Show error overlay in preview instead of silent fallback\n return new Response(generateErrorPage(error, `Error rendering page: ${lookupPath}`, cspNonce), {\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-store',\n [CSP_NONCE_HEADER]: cspNonce,\n },\n });\n }\n } else {\n // Page not found - still return HTML shell for client-side 404 handling\n return serveFile(packagePaths.indexHtml());\n }\n}\n\n/**\n * Load page content by file path (for CMS template pages)\n */\nasync function loadPageByFilePath(filePath: string): Promise<string | null> {\n try {\n if (await fileExists(filePath)) {\n return await readTextFile(filePath);\n }\n return null;\n } catch {\n return null;\n }\n}\n", "/**\n * CMS query primitives \u2014 the SINGLE source of truth for filtering and sorting\n * CMS items. Pure (no IO), so it is shared by every consumer that has to apply a\n * `CMSListQuery`'s `filter`/`sort` to a set of items:\n * - `meno-core` CMSService (local file-backed collections)\n * - `meno-core` SSR renderer (remote / Sanity-backed list items)\n * - `meno-astro` runtime `getCollectionList` (built/SSR Astro pages)\n *\n * These used to be three hand-copied implementations; one (the SSR remote path)\n * had already drifted and dropped the boolean-sort special case, so a boolean\n * field sorted differently for remote items than for local ones. Keeping the\n * logic here \u2014 operating on plain `Record<string, unknown>` rows so it works for\n * both `CMSItem` and the astro runtime's item shape \u2014 prevents that recurring.\n */\n\nimport type { CMSFilterCondition, CMSSortConfig } from './types/cms';\n\n/** A CMS item, structurally \u2014 query primitives only ever index it by field name. */\ntype Row = Record<string, unknown>;\n\n/** True when `obj` is a single {@link CMSFilterCondition} (vs a plain equality map). */\nexport function isCmsFilterCondition(obj: unknown): obj is CMSFilterCondition {\n return typeof obj === 'object' && obj !== null && 'field' in obj;\n}\n\n/** Evaluate one filter condition against an item. Unknown operators never match. */\nexport function matchCmsCondition(item: Row, condition: CMSFilterCondition): boolean {\n const value = item[condition.field];\n switch (condition.operator || 'eq') {\n case 'eq':\n return value === condition.value;\n case 'neq':\n return value !== condition.value;\n case 'gt':\n return (value as number) > (condition.value as number);\n case 'gte':\n return (value as number) >= (condition.value as number);\n case 'lt':\n return (value as number) < (condition.value as number);\n case 'lte':\n return (value as number) <= (condition.value as number);\n case 'contains':\n return String(value).includes(String(condition.value));\n case 'in':\n return Array.isArray(condition.value) && condition.value.includes(value);\n default:\n return false;\n }\n}\n\n/**\n * Filter items by a `CMSListQuery.filter`: a plain equality map (`{ featured: true }`\n * \u2192 every key must match), a single condition, or an array of conditions (AND).\n */\nexport function applyCmsFilters<T extends Row>(\n items: T[],\n filter: CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown>,\n): T[] {\n if (!Array.isArray(filter) && !isCmsFilterCondition(filter)) {\n const entries = Object.entries(filter);\n return items.filter((item) => entries.every(([key, value]) => item[key] === value));\n }\n const conditions = Array.isArray(filter) ? filter : [filter as CMSFilterCondition];\n return items.filter((item) => conditions.every((cond) => matchCmsCondition(item, cond)));\n}\n\n/**\n * Stable multi-key sort. Booleans compare specially (desc \u2192 true first); other\n * values compare as primitives. Returns a new array (input is not mutated).\n */\nexport function applyCmsSorting<T extends Row>(items: T[], sort: CMSSortConfig | CMSSortConfig[]): T[] {\n const sorts = Array.isArray(sort) ? sort : [sort];\n return [...items].sort((a, b) => {\n for (const s of sorts) {\n const aVal = a[s.field];\n const bVal = b[s.field];\n const isDesc = s.order === 'desc';\n\n // Boolean fields: desc puts `true` first, asc puts `false` first.\n if (typeof aVal === 'boolean' && typeof bVal === 'boolean') {\n if (aVal === bVal) continue;\n return isDesc ? (aVal ? -1 : 1) : aVal ? 1 : -1;\n }\n\n let result = 0;\n if ((aVal as string | number) < (bVal as string | number)) result = -1;\n else if ((aVal as string | number) > (bVal as string | number)) result = 1;\n if (result !== 0) return isDesc ? -result : result;\n }\n return 0;\n });\n}\n", "/**\n * Server-Side Rendering (SSR) Core Module\n * Converts JSON component structures to HTML strings for SEO-friendly initial page loads\n */\n\nimport type { ComponentNode, ComponentDefinition, JSONPage, CMSItem, CMSFilterCondition } from '../../shared/types';\nimport type { TemplateContext, NestedCMSListConfig } from '../../shared/types/cms';\nimport {\n processItemTemplate,\n processItemPropsTemplate,\n hasItemTemplates,\n buildTemplateContext,\n resolveItemsTemplate,\n resolveTemplateRawValue,\n addItemUrl,\n getNestedValue,\n type ValueResolver,\n} from '../../shared/itemTemplateUtils';\nimport { singularize, isItemDraftForLocale } from '../../shared/types/cms';\nimport { applyCmsFilters, applyCmsSorting } from '../../shared/cmsQuery';\nimport type { ResponsiveStyleObject, StyleObject } from '../../shared/types';\nimport type { BreakpointConfig } from '../../shared/breakpoints';\nimport type { ResponsiveScales } from '../../shared/responsiveScaling';\nimport { processStructure, isResponsiveStyle, isHtmlMapping, resolveHtmlMapping } from '../../client/templateEngine';\nimport { resolvePropsFromDefinition } from '../../shared/propResolver';\nimport { loadBreakpointConfig, loadI18nConfig } from '../jsonLoader';\nimport { configService } from '../services/configService';\nimport type { I18nConfig } from '../../shared/types/components';\nimport {\n extractLocaleFromPath,\n DEFAULT_I18N_CONFIG,\n resolveI18nValue,\n buildLocalizedPath,\n isI18nValue,\n} from '../../shared/i18n';\nimport { NODE_TYPE } from '../../shared/constants';\nimport {\n isComponentNode,\n isHtmlNode,\n isLinkNode,\n isEmbedNode,\n isLocaleListNode,\n isListNode,\n isIslandNode,\n isCustomNode,\n markAsSlotContent,\n isBooleanMapping,\n hasIf,\n isSlotContent,\n} from '../../shared/nodeUtils';\nimport type { ListNode } from '../../shared/registry/nodeTypes/ListNodeType';\nimport type { CMSService } from '../services/cmsService';\nimport { extractAttributesFromNode, skipEmptyTemplateAttributes } from '../../shared/attributeNodeUtils';\nimport { inlineSvgStyleRules } from '../../shared/inlineSvgStyleRules';\nimport { mergeNodeStyles } from '../../shared/styleNodeUtils';\nimport { SSRRegistry } from '../../shared/registry/SSRRegistry';\nimport { mergeResponsiveStyles } from '../../shared/responsiveStyleUtils';\n// Lazy-loaded: jsdom (used by isomorphic-dompurify on the server) can't be bundled by esbuild\n// because it reads CSS files relative to __dirname at init time. When the module is unavailable\n// (packaged Electron app), embed HTML is returned unsanitized \u2014 acceptable since content is local.\n/** The one DOMPurify method the renderer calls. */\ninterface DOMPurifyLike {\n sanitize: (html: string, opts?: Record<string, unknown>) => string;\n}\nlet _DOMPurify: DOMPurifyLike | null = null;\nlet _DOMPurifyLoaded = false;\nfunction getDOMPurify(): DOMPurifyLike | null {\n if (!_DOMPurifyLoaded) {\n _DOMPurifyLoaded = true;\n try {\n const mod = require('isomorphic-dompurify') as DOMPurifyLike & { default?: DOMPurifyLike };\n _DOMPurify = mod.default ?? mod;\n } catch {\n // Not available in bundled environment\n }\n }\n return _DOMPurify;\n}\nimport { responsiveStylesToClasses } from '../../shared/utilityClassMapper';\nimport { validateStyleCoverage } from '../validateStyleCoverage';\nimport { generateElementClassName, type ElementClassContext } from '../../shared/elementClassName';\nimport type { InteractiveStyles } from '../../shared/types/styles';\nimport {\n extractInteractiveStyleMappings,\n resolveExtractedMappings,\n hasInteractiveStyleMappings,\n} from '../../shared/interactiveStyleMappings';\nimport { isCurrentLink } from '../../shared/linkUtils';\nimport type { SlugMap } from '../../shared/slugTranslator';\nimport { buildSlugIndex, getLocaleLinks, translatePath } from '../../shared/slugTranslator';\n\n// Import from modularized files\nimport { escapeHtml, buildAttributes, buildEditorAttrs, styleToString } from './attributeBuilder';\nimport { logRuntimeError } from '../../shared/errorLogger';\nimport { toFriendlyError } from '../../shared/friendlyError';\nimport { rewriteViewportUnits } from '../../shared/viewportUnits';\nimport { extractPageMeta, generateMetaTags } from './metaTagGenerator';\nimport { collectComponentCSS } from './cssCollector';\nimport { collectComponentJavaScript } from './jsCollector';\nimport {\n type CMSContext,\n processCMSTemplate,\n processCMSPropsTemplate,\n createI18nResolver,\n RAW_HTML_PREFIX,\n} from './cmsSSRProcessor';\nimport { type ImageMetadataMap, DEFAULT_SIZES, buildImageMetadataMap, rewriteRichTextImages } from './imageMetadata';\n\n/**\n * Image preload info for generating <link rel=\"preload\"> tags in head\n */\nexport interface PreloadImage {\n /** Best available srcset (AVIF preferred, then WebP) */\n srcset: string;\n /** Image type (image/avif or image/webp) */\n type: 'image/avif' | 'image/webp';\n /** Sizes attribute */\n sizes: string;\n}\n\n// Re-export types for external consumers\nexport type { CMSContext } from './cmsSSRProcessor';\n\n/**\n * Resolve any `_i18n` value objects inside an attributes record into the\n * active locale's string. Authors can write `attributes: { alt: { _i18n:\n * true, en: \"Photo\", pl: \"Zdj\u0119cie\" } }` and the runtime substitutes a single\n * locale-appropriate string here, before `buildAttributes` (which silently\n * drops object-typed values to avoid `[object Object]` in HTML).\n */\nfunction resolveI18nAttrs<T extends Record<string, unknown>>(\n attrs: T,\n locale: string | undefined,\n i18nConfig: I18nConfig | undefined,\n): T {\n let mutated: Record<string, unknown> | null = null;\n const config = i18nConfig ?? DEFAULT_I18N_CONFIG;\n const effectiveLocale = locale || config.defaultLocale;\n for (const [key, value] of Object.entries(attrs)) {\n if (isI18nValue(value)) {\n mutated = mutated ?? { ...attrs };\n mutated[key] = resolveI18nValue(value, effectiveLocale, config);\n }\n }\n return (mutated ?? attrs) as T;\n}\nexport type { PageMeta } from './metaTagGenerator';\nexport { extractPageMeta, generateMetaTags } from './metaTagGenerator';\n\n/**\n * SSR rendering context - passed through the render chain\n */\ninterface SSRContext {\n locale?: string;\n i18nConfig?: I18nConfig;\n slugMappings?: SlugMap[];\n pagePath?: string;\n breakpoints?: BreakpointConfig;\n viewportWidth?: number;\n cmsContext?: CMSContext;\n imageMetadataMap?: ImageMetadataMap;\n cmsService?: CMSService;\n /** Template context for CMSList iteration with named contexts */\n templateContext?: TemplateContext;\n /** Element path for tracking position in tree (for element class generation) */\n elementPath?: number[];\n /** Map to collect interactive styles during render */\n interactiveStylesMap?: Map<string, InteractiveStyles>;\n /** Component context for tracking when inside a component definition */\n componentContext?: string;\n /** Resolved component props for interactive style mapping resolution */\n componentResolvedProps?: Record<string, unknown>;\n /** Array to collect high-priority images for preloading */\n preloadImages?: PreloadImage[];\n /**\n * Template mode: preserve {{item.field}} placeholders instead of processing them.\n * Used when emitting item templates for client-side dynamic rendering.\n */\n templateMode?: boolean;\n /**\n * When true, nested cms-list nodes should be emitted as placeholders\n * for client-side hydration rather than fully rendered.\n * Set when parent cms-list has emitTemplate: true.\n */\n nestedCMSListMode?: boolean;\n /**\n * Set of collection IDs that need client-side data injection.\n * Populated during rendering when nested cms-list placeholders are emitted.\n * Used by build process to prepare and inject collection data scripts.\n */\n neededCollections?: Set<string>;\n /** When true, draft items are filtered out from CMS lists */\n isProductionBuild?: boolean;\n /** Collector for SSR fallback HTML of complex nodes (list, locale-list) keyed by element path */\n ssrFallbackCollector?: Map<string, string>;\n /**\n * Collector mapping the raw slice of a RAW_HTML_PREFIX string to its fully processed HTML\n * (after image rewriting, component expansion, and link localization). Consumed by the\n * Astro exporter so its `<Fragment set:html>` output matches SSR exactly.\n */\n processedRawHtmlCollector?: Map<string, string>;\n /** Image format: 'webp' uses plain <img>, 'avif' uses <picture> with AVIF+WebP sources */\n imageFormat?: 'webp' | 'avif';\n /**\n * When true, emit editor-only attributes (data-element-path, data-cms-item-index,\n * data-cms-context, data-component-root, data-parent-component, data-component-context)\n * so XRayOverlay and click-to-select can hook into SSR-rendered DOM.\n * Set only in preview/dev mode \u2014 never in production builds.\n */\n injectEditorAttrs?: boolean;\n /** CMS list item index path (parallel to cmsListPaths) for nested list selection support */\n cmsItemIndexPath?: number[];\n /** CMS list element paths (parallel to cmsItemIndexPath) \u2014 outer lists first */\n cmsListPaths?: number[][];\n /** Name of the enclosing component instance (for data-parent-component on descendants) */\n parentComponentName?: string;\n /**\n * Per-page counter of how many times each component name has been rendered so\n * far. Used to stamp data-meno-component / data-meno-component-instance onto\n * each component's outermost element so tooling (e.g. /screenshot) can target\n * `[data-meno-component=\"PricingSection\"][data-meno-component-instance=\"0\"]`.\n */\n componentInstanceCounter?: Map<string, number>;\n /**\n * Element path of the current component instance's root, in the component's local\n * (reset) coordinate space. When ctx.elementPath deeply equals this, the element\n * being rendered is the component root and gets data-component-root=\"true\".\n */\n componentRootPath?: number[];\n /**\n * Responsive scales config \u2014 needed for fluid-mode style transformations\n * (e.g. `applyContainerPattern` when width === maxWidth).\n */\n responsiveScales?: ResponsiveScales;\n}\n\n/**\n * Get template context from SSRContext (for use with shared itemTemplateUtils)\n * Returns the full TemplateContext which includes named contexts\n */\nfunction getTemplateContext(ctx: SSRContext): TemplateContext | null {\n return ctx.templateContext || null;\n}\n\n/**\n * Build the resolution scope for list `items` and `filter` value templates inside a\n * component structure. Merge order (lowest \u2192 highest precedence):\n * componentResolvedProps \u2192 templateContext (parent list loop variables)\n * The cmsContext stays out of this scope \u2014 it's namespaced via {{cms.X}} and resolved\n * on its own branch in getCollectionItems. Returns undefined when no scope is available\n * (e.g. page root with no host component and no parent list).\n */\nfunction buildListResolutionScope(ctx: SSRContext): Record<string, unknown> | undefined {\n const tplCtx = ctx.templateContext as Record<string, unknown> | undefined;\n const props = ctx.componentResolvedProps;\n if (!tplCtx && !props) return undefined;\n return { ...(props ?? {}), ...(tplCtx ?? {}) };\n}\n\n/**\n * Create a value resolver for i18n resolution (for use with item templates)\n */\nfunction getI18nResolver(ctx: SSRContext): ValueResolver | undefined {\n return createI18nResolver(ctx.locale, ctx.i18nConfig);\n}\n\n/**\n * Localize an internal href to the current locale.\n * Reusable helper extracted from LinkNode rendering.\n */\nfunction localizeHref(href: string, ctx: SSRContext): string {\n if (ctx.templateMode) return href;\n if (!href.startsWith('/') || href.startsWith('//')) return href;\n const { locale, i18nConfig, slugMappings } = ctx;\n if (!locale || !i18nConfig) return href;\n if (slugMappings) {\n const slugIndex = buildSlugIndex(slugMappings);\n return translatePath(href, locale, i18nConfig.defaultLocale, i18nConfig.defaultLocale, slugIndex);\n } else if (locale !== i18nConfig.defaultLocale) {\n return buildLocalizedPath(href, locale);\n }\n return href;\n}\n\n/**\n * Localize <a href=\"...\"> links within rich-text HTML output.\n * Similar pattern to rewriteRichTextImages.\n */\nfunction localizeRichTextLinks(html: string, ctx: SSRContext): string {\n if (ctx.templateMode || !ctx.locale || !ctx.i18nConfig) return html;\n return html.replace(/<a\\b([^>]*?)href=([\"'])([^\"']*?)\\2([^>]*?)>/gi, (match, before, quote, href, after) => {\n if (!href.startsWith('/') || href.startsWith('//')) return match;\n const localized = localizeHref(href, ctx);\n return localized === href ? match : `<a${before}href=${quote}${localized}${quote}${after}>`;\n });\n}\n\n/**\n * Process style templates and convert to utility classes.\n * Handles {{item.field}} patterns within list contexts.\n */\nfunction processStyleToClasses(style: StyleObject | ResponsiveStyleObject | undefined, ctx: SSRContext): string[] {\n if (!style) return [];\n\n let processedStyle = style;\n const templateCtx = getTemplateContext(ctx);\n if (templateCtx && !ctx.templateMode) {\n processedStyle = processItemPropsTemplate(style as Record<string, unknown>, templateCtx, getI18nResolver(ctx)) as\n | StyleObject\n | ResponsiveStyleObject;\n }\n\n // Fluid container pattern: in fluid mode `responsiveStylesToClasses` rewrites\n // any tier whose `width === maxWidth` to use `calc(100% - var(--site-margin)*2)`\n // with auto margins.\n const fluidActive = ctx.responsiveScales?.enabled === true && ctx.responsiveScales?.mode === 'fluid';\n\n return responsiveStylesToClasses(processedStyle as ResponsiveStyleObject, {\n fluidActive,\n responsiveScales: ctx.responsiveScales,\n });\n}\n\n/**\n * Evaluate the if condition on a node with full SSR context.\n * Handles boolean, mapping, and string template values.\n * Returns true if node should be rendered, false if it should be skipped.\n */\nfunction evaluateIfCondition(node: ComponentNode, ctx: SSRContext): boolean {\n const ifValue = hasIf(node) ? node.if : undefined;\n\n // No if property = render (default true)\n if (ifValue === undefined) {\n return true;\n }\n\n // Boolean value\n if (typeof ifValue === 'boolean') {\n return ifValue;\n }\n\n // Mapping value - resolve using component props\n if (isBooleanMapping(ifValue)) {\n const props = ctx.componentResolvedProps || {};\n const propValue = props[ifValue.prop];\n const mappedValue = ifValue.values[String(propValue)];\n // If no mapping found for this prop value, default to true\n return mappedValue !== undefined ? Boolean(mappedValue) : true;\n }\n\n // String template - resolve using CMS or item context\n if (typeof ifValue === 'string') {\n let resolved: string = ifValue;\n\n // Process item templates first (for CMSList context)\n const templateCtx = getTemplateContext(ctx);\n if (templateCtx && hasItemTemplates(resolved)) {\n resolved = processItemTemplate(resolved, templateCtx, getI18nResolver(ctx));\n }\n\n // Process CMS template strings like {{cms.field}}\n if (ctx.cmsContext?.cms && resolved.includes('{{cms.')) {\n resolved = processCMSTemplate(resolved, ctx.cmsContext.cms, ctx.locale, ctx.i18nConfig);\n }\n\n // Unresolved template (e.g. {{prop}} where the prop is undefined and\n // processStructure preserved the original template per evaluateTemplate's\n // backward-compat fallback) \u2192 treat as falsy so missing context means\n // \"don't render\", matching `if: false` and unset BooleanMapping values.\n if (resolved.includes('{{') && resolved.includes('}}')) {\n return false;\n }\n\n // Evaluate truthiness - false, 0, empty string are falsy\n return Boolean(resolved) && resolved !== 'false' && resolved !== '0' && resolved !== '';\n }\n\n // Unknown type, default to true\n return true;\n}\n\n/**\n * Sentinel returned by resolveFilterValue when a {{...}} template value can't\n * be resolved from the available scope. Lets resolveFilterTemplates tell\n * \"resolved to a real value\" apart from \"unresolvable\" so the condition can be\n * dropped from the CMS query instead of being sent as a literal template\n * string \u2014 which would never match a real value and silently return nothing.\n */\nconst UNRESOLVED_FILTER_VALUE = Symbol('unresolved-filter-value');\n\n/**\n * Resolve a template value like \"{{category.slug}}\" from a flat scope.\n * Returns the original value for non-template values, and\n * UNRESOLVED_FILTER_VALUE when a template can't be resolved.\n */\nfunction resolveFilterValue(value: unknown, scope: Record<string, unknown> | undefined): unknown {\n if (typeof value !== 'string' || !value.startsWith('{{') || !value.endsWith('}}')) {\n return value;\n }\n const path = value.slice(2, -2).trim();\n const resolved = scope ? getNestedValue(scope, path) : undefined;\n return resolved !== undefined ? resolved : UNRESOLVED_FILTER_VALUE;\n}\n\n/**\n * Resolve template values in CMS filter for nested cms-list support.\n * Handles filter values like \"{{category.slug}}\" against a flat scope built from\n * parent template context overlaid on host-component resolved props.\n *\n * Conditions whose template value can't be resolved are dropped from the query\n * (a verbatim \"{{x.y}}\" string would match nothing) and surfaced via\n * logRuntimeError \u2014 dropping a condition changes results, so users must be\n * able to see why.\n */\nfunction resolveFilterTemplates(\n filter: CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown> | undefined,\n scope: Record<string, unknown> | undefined,\n collection: string,\n): CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown> | undefined {\n if (!filter) return filter;\n\n const reportDropped = (field: unknown, template: unknown): void => {\n logRuntimeError(\n 'ssrRenderer.resolveFilterTemplates',\n new Error(`Unresolved filter template ${String(template)} \u2014 condition dropped from \"${collection}\" query`),\n { collection, field: String(field), template: String(template) },\n );\n };\n\n // Handle array of conditions\n if (Array.isArray(filter)) {\n const conditions: CMSFilterCondition[] = [];\n for (const cond of filter) {\n const value = resolveFilterValue(cond.value, scope);\n if (value === UNRESOLVED_FILTER_VALUE) {\n reportDropped(cond.field, cond.value);\n continue;\n }\n conditions.push({ ...cond, value } as CMSFilterCondition);\n }\n return conditions;\n }\n\n // Handle single condition object with field/value\n if ('field' in filter && 'value' in filter) {\n const cond = filter as CMSFilterCondition;\n const value = resolveFilterValue(cond.value, scope);\n if (value === UNRESOLVED_FILTER_VALUE) {\n reportDropped(cond.field, cond.value);\n return undefined;\n }\n return { ...cond, value } as CMSFilterCondition;\n }\n\n // Handle simple object filter: { category: \"{{category.slug}}\" }\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(filter)) {\n const resolvedValue = resolveFilterValue(value, scope);\n if (resolvedValue === UNRESOLVED_FILTER_VALUE) {\n reportDropped(key, value);\n continue;\n }\n resolved[key] = resolvedValue;\n }\n return resolved;\n}\n\n/**\n * Expand Meno component markers in rich text HTML output.\n * Scans for <div data-meno-component=\"Name\" data-meno-props='{\"key\":\"val\"}'></div>\n * and replaces them with rendered component HTML using the existing SSR component renderer.\n */\nasync function expandRichTextComponents(html: string, ctx: SSRContext): Promise<string> {\n // Quick check - if no component markers, return as-is\n if (!html.includes('data-meno-component')) return html;\n\n // Match component markers\n const markerRegex = /<div\\s+data-meno-component=\"([^\"]+)\"\\s+data-meno-props=\"([^\"]*)\"[^>]*><\\/div>/g;\n const parts: (string | Promise<string>)[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null = markerRegex.exec(html);\n\n while (match !== null) {\n const currentMatch = match;\n match = markerRegex.exec(html);\n // Add text before this match\n if (currentMatch.index > lastIndex) {\n parts.push(html.slice(lastIndex, currentMatch.index));\n }\n\n const componentName = currentMatch[1];\n if (componentName === undefined) {\n // Keep marker; mirror the unknown-component fallback below.\n parts.push(currentMatch[0]);\n lastIndex = currentMatch.index + currentMatch[0].length;\n continue;\n }\n let props: Record<string, unknown> = {};\n try {\n // Unescape HTML entities in the JSON\n const propsStr = (currentMatch[2] ?? '')\n .replace(/&quot;/g, '\"')\n .replace(/&#039;/g, \"'\")\n .replace(/&amp;/g, '&');\n props = JSON.parse(propsStr);\n } catch (error) {\n // Malformed data-meno-props JSON: fall back to interface defaults so the\n // marker never crashes the page, but surface the parse failure \u2014 the\n // component silently losing its instance props is otherwise invisible.\n logRuntimeError('ssrRenderer.expandRichTextComponents', error, { component: componentName });\n }\n\n // Render the component using SSR registry\n if (ssrComponentRegistry.has(componentName)) {\n parts.push(renderComponent(componentName, props, [], {}, ctx));\n } else {\n // Keep marker for unknown components\n parts.push(currentMatch[0]);\n }\n\n lastIndex = currentMatch.index + currentMatch[0].length;\n }\n\n // Add remaining text\n if (lastIndex < html.length) {\n parts.push(html.slice(lastIndex));\n }\n\n // Resolve all promises\n const resolved = await Promise.all(parts);\n return resolved.join('');\n}\n\n/**\n * Component registry for SSR (shared between requests)\n * Uses the shared SSRRegistry for consistency\n */\nconst ssrComponentRegistry = new SSRRegistry();\n\n/**\n * Build HTML string from component node (server-side)\n * Exported for component preview rendering\n */\nexport async function buildComponentHTML(\n node: ComponentNode | ComponentNode[] | string | number | null | undefined,\n globalComponents: Record<string, ComponentDefinition> = {},\n pageComponents: Record<string, ComponentDefinition> = {},\n locale?: string,\n i18nConfig?: I18nConfig,\n slugMappings?: SlugMap[],\n pagePath?: string,\n cmsContext?: CMSContext,\n cmsService?: CMSService,\n isProductionBuild?: boolean,\n injectEditorAttrs?: boolean,\n): Promise<{\n html: string;\n interactiveStylesMap: Map<string, InteractiveStyles>;\n preloadImages: PreloadImage[];\n neededCollections: Set<string>;\n ssrFallbackCollector: Map<string, string>;\n processedRawHtmlCollector: Map<string, string>;\n}> {\n // Create map to collect interactive styles during render\n const interactiveStylesMap = new Map<string, InteractiveStyles>();\n // Create array to collect high-priority images for preloading\n const preloadImages: PreloadImage[] = [];\n // Create set to track collections that need client-side data injection\n const neededCollections = new Set<string>();\n // Create map to collect SSR fallback HTML for complex nodes (list, locale-list)\n const ssrFallbackCollector = new Map<string, string>();\n // Create map to collect raw-HTML \u2192 processed-HTML for Astro exporter parity\n const processedRawHtmlCollector = new Map<string, string>();\n\n if (!node)\n return {\n html: '',\n interactiveStylesMap,\n preloadImages,\n neededCollections,\n ssrFallbackCollector,\n processedRawHtmlCollector,\n };\n\n // Register components for this render\n ssrComponentRegistry.merge(globalComponents);\n ssrComponentRegistry.merge(pageComponents);\n\n // Load breakpoint config for responsive style resolution\n const breakpoints = await loadBreakpointConfig();\n\n // Build image metadata map for responsive images (from manifest)\n const imageMetadataMap = await buildImageMetadataMap();\n\n // Render using desktop viewport (1920px) - same as editor system\n const SSR_VIEWPORT_WIDTH = 1920;\n\n // Build SSR context\n const ctx: SSRContext = {\n locale,\n i18nConfig,\n slugMappings,\n pagePath,\n breakpoints,\n viewportWidth: SSR_VIEWPORT_WIDTH,\n cmsContext,\n imageMetadataMap,\n cmsService,\n elementPath: [0], // Initialize path tracking for interactive styles\n interactiveStylesMap, // Collect interactive styles during render\n preloadImages, // Collect high-priority images for preloading\n neededCollections, // Track collections that need client-side data\n isProductionBuild,\n ssrFallbackCollector, // Collect SSR fallback HTML for complex nodes\n processedRawHtmlCollector, // Collect raw\u2192processed HTML for Astro exporter\n imageFormat: configService.getImageFormat(),\n injectEditorAttrs,\n responsiveScales: configService.getResponsiveScales(),\n };\n\n const html = await renderNode(node, ctx);\n\n return {\n html,\n interactiveStylesMap,\n preloadImages,\n neededCollections,\n ssrFallbackCollector,\n processedRawHtmlCollector,\n };\n}\n\n/**\n * Render a nested list (collection mode) as a placeholder for client-side hydration.\n * Used when parent list has emitTemplate: true.\n * The placeholder contains the configuration and template for MenoFilter to hydrate.\n */\nasync function renderNestedListPlaceholder(node: ListNode, ctx: SSRContext): Promise<string> {\n // Get source - handle both string and pre-resolved array sources\n const sourceValue = node.source || node.collection;\n const sourceStr = typeof sourceValue === 'string' ? sourceValue : '';\n\n // Track this collection for client-side data injection\n if (ctx.neededCollections && sourceStr) {\n ctx.neededCollections.add(sourceStr);\n }\n\n // Build configuration for client-side hydration\n const config: NestedCMSListConfig = {\n collection: sourceStr,\n itemAs: node.itemAs,\n items: node.items,\n filter: node.filter as CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown> | undefined,\n sort: node.sort,\n limit: node.limit,\n offset: node.offset,\n excludeCurrentItem: node.excludeCurrentItem,\n };\n\n // Render children template (preserving {{item.field}} placeholders)\n const childTemplateCtx: SSRContext = {\n ...ctx,\n templateMode: true,\n templateContext: undefined, // Clear context for inner item templates\n nestedCMSListMode: false, // Reset for deeper nesting levels\n };\n const templateContent = node.children ? await renderChildrenAsync(node.children, childTemplateCtx) : '';\n\n // Escape config for attribute\n const configJson = escapeHtml(JSON.stringify(config));\n\n // Emit placeholder with embedded config and template\n return (\n `<div data-cms-list-nested=\"true\" data-collection=\"${escapeHtml(sourceStr)}\" data-cms-config=\"${configJson}\"${editorAttrs(ctx, { isCMSListContainer: true })}>` +\n `<template data-nested-template>${templateContent}</template>` +\n `</div>`\n );\n}\n\n/**\n * Graceful fallback for a node that threw during SSR. Keeps one bad section from\n * taking down the whole page: in the editor preview (injectEditorAttrs) it emits\n * a small, plain-language placeholder so the user can see which section failed;\n * everywhere else (static builds, the published site) it renders nothing so real\n * visitors never see an error. Carries no XRay-selectable attributes.\n */\nfunction renderNodeFallback(ctx: SSRContext, error: unknown, label: string): string {\n console.error(`\u274C SSR render error in ${label}:`, error);\n if (!ctx.injectEditorAttrs) return '';\n const friendly = toFriendlyError(error);\n const text = `${friendly.title} \u2014 ${friendly.friendlyMessage}`;\n return (\n `<div data-meno-render-error style=\"margin:8px 0;padding:12px 14px;` +\n `border:1px dashed #e0a3a3;border-radius:6px;background:#fdf3f3;color:#9a3b3b;` +\n `font:13px/1.5 -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;\">` +\n `\u26A0\uFE0F ${escapeHtml(text)}</div>`\n );\n}\n\n/**\n * Unified List node processor - renders children for each item\n * Supports both source types:\n * - 'prop': Reads from component props or template context\n * - 'collection': Queries from CMS collections\n */\nasync function processList(node: ListNode, ctx: SSRContext): Promise<string> {\n // Determine source type (default to 'prop', but handle legacy 'cms-list' type)\n const nodeType = node.type as string;\n const isLegacyCMSList = nodeType === 'cms-list';\n const sourceType = isLegacyCMSList ? 'collection' : node.sourceType || 'prop';\n\n // For collection mode, check CMS service availability\n if (sourceType === 'collection' && !ctx.cmsService) {\n console.warn('List with sourceType \"collection\" requires CMS service');\n return '';\n }\n\n // When in templateMode with nestedCMSListMode, emit placeholder for client-side hydration\n // This allows nested lists inside emitTemplate to work with MenoFilter\n if (sourceType === 'collection' && ctx.templateMode && ctx.nestedCMSListMode) {\n return renderNestedListPlaceholder(node, ctx);\n }\n\n // Get source - handle both new 'source' and legacy 'collection' property\n // Source can be a string (prop name) or array (pre-resolved by processStructure)\n const rawSource = node.source || node.collection;\n const source = typeof rawSource === 'string' ? rawSource : '';\n const sourceIsResolved = Array.isArray(rawSource);\n\n // Determine variable name for this list's items\n let variableName: string;\n if (node.itemAs) {\n variableName = node.itemAs;\n } else if (sourceType === 'collection') {\n variableName = singularize(source);\n } else {\n variableName = 'item';\n }\n\n // Get items based on sourceType\n let items: unknown[];\n\n if (sourceType === 'collection') {\n // Collection mode: Query from CMS service\n items = await getCollectionItems(node, source, ctx);\n } else if (sourceType === 'remote') {\n // Remote mode: fetch the endpoint and apply the query (filter/sort/offset/limit), mirroring\n // the meno-astro runtime's getRemoteData so the editor SSR matches the real Astro build.\n items = await getRemoteItems(node, ctx);\n } else if (sourceType === 'sanity') {\n // Sanity mode: fetch the document type via GROQ and apply the query, mirroring the\n // meno-astro runtime's getSanityData so the editor SSR matches the real Astro build.\n items = await getSanityItems(node);\n } else if (sourceType === 'expression') {\n // Expression mode: the source is a verbatim JS expression (e.g. an Astro Action / supabase\n // result) the editor has no data for \u2014 it resolves only in the real Astro build/play. Render\n // empty here (the design-canvas SSR) rather than guessing. Real Astro play renders it for real.\n items = [];\n } else {\n // Prop mode: Read from component props or template context\n // If source was already resolved to an array by processStructure (e.g., from {{features}}),\n // use it directly instead of looking up by prop name\n if (sourceIsResolved) {\n // Source was resolved to array by processStructure\n items = rawSource as unknown[];\n } else if (source) {\n // Source is a prop name or template expression - resolve it\n items = getPropItems(source, ctx);\n } else {\n items = [];\n }\n }\n\n // Defend against a source that resolved to null or a non-array (e.g. an unset\n // CMS field, or an array-of-ID prop accidentally coerced to a string). Without\n // this, the `items.length` check below throws\n // \"Cannot read properties of null (reading 'length')\".\n if (!Array.isArray(items)) items = [];\n\n // Apply shared options: offset and limit\n if (node.offset && sourceType === 'prop') {\n items = items.slice(node.offset);\n }\n if (node.limit && sourceType === 'prop') {\n items = items.slice(0, node.limit);\n }\n\n if (items.length === 0) {\n return '';\n }\n\n // Get schema for URL computation (collection mode only)\n const schema = sourceType === 'collection' && ctx.cmsService ? ctx.cmsService.getSchema(source) : undefined;\n\n // Render children for each item\n const renderedItems: string[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const rawItem = items[i] as Record<string, unknown>;\n const item = schema ? addItemUrl(rawItem as CMSItem, schema, ctx.locale, ctx.i18nConfig) : rawItem;\n\n const templateContext = buildTemplateContext(variableName, item as CMSItem, i, items.length, ctx.templateContext);\n\n const itemCtx: SSRContext = {\n ...ctx,\n templateContext,\n cmsItemIndexPath: [...(ctx.cmsItemIndexPath ?? []), i],\n cmsListPaths: [...(ctx.cmsListPaths ?? []), ctx.elementPath ?? []],\n };\n\n const childrenHtml = await renderChildrenAsync(node.children || [], itemCtx);\n renderedItems.push(childrenHtml);\n }\n\n const childrenHTML = renderedItems.join('');\n\n // Emit item template when emitTemplate is enabled (collection mode)\n // This allows MenoFilter to dynamically render items from JSON data\n let templateHtml = '';\n if (sourceType === 'collection' && node.emitTemplate && node.children && node.children.length > 0) {\n const templateCtx: SSRContext = {\n ...ctx,\n templateMode: true,\n templateContext: ctx.templateContext,\n nestedCMSListMode: true,\n };\n const templateContent = await renderChildrenAsync(node.children, templateCtx);\n templateHtml = `<template data-meno-item>${templateContent}</template>`;\n }\n\n // List is a pure repeater - no container element, just children + optional template\n const listResult = childrenHTML + templateHtml;\n\n // Store SSR fallback for Astro export (list nodes can't be expressed as static Astro components)\n if (ctx.ssrFallbackCollector && ctx.elementPath) {\n ctx.ssrFallbackCollector.set(ctx.elementPath.join('.'), listResult);\n }\n\n return listResult;\n}\n\n/**\n * Get items from CMS collection (for sourceType: 'collection')\n */\nasync function getCollectionItems(node: ListNode, source: string, ctx: SSRContext): Promise<CMSItem[]> {\n if (!ctx.cmsService) return [];\n\n let items: CMSItem[];\n\n // Check if items are specified directly (for nested reference lists)\n if (node.items) {\n // If items is a template expression, resolve it from current context\n if (typeof node.items === 'string' && node.items.startsWith('{{')) {\n let resolvedIds: string | string[] | undefined;\n\n // Check if this is a CMS template ({{cms.field}}) - resolve from cmsContext\n if (node.items.startsWith('{{cms.') && ctx.cmsContext?.cms) {\n const fieldPath = node.items.slice(6, -2); // Extract \"field\" from \"{{cms.field}}\"\n let value: unknown = ctx.cmsContext.cms;\n for (const part of fieldPath.split('.')) {\n if (value && typeof value === 'object' && part in value) {\n value = (value as Record<string, unknown>)[part];\n } else {\n value = undefined;\n break;\n }\n }\n if (value !== null && value !== undefined) {\n resolvedIds = Array.isArray(value) ? value.map((v) => String(v)) : String(value);\n }\n } else {\n // Otherwise resolve from a merged scope: parent list loop variables (highest precedence)\n // overlaid on the host component's resolved props (lowest precedence). This lets\n // {{config.tagIds}} resolve against a component prop named `config` while {{post.X}}\n // from a parent list still wins on key collisions.\n const mergedScope = buildListResolutionScope(ctx) ?? {};\n const parentContext = { _type: 'template' as const, ...mergedScope } as TemplateContext;\n resolvedIds = resolveItemsTemplate(node.items, parentContext);\n }\n\n if (!resolvedIds) {\n return [];\n }\n const ids = Array.isArray(resolvedIds) ? resolvedIds : [resolvedIds];\n items = await ctx.cmsService.getItemsByIds(source, ids);\n } else {\n // Direct IDs (string or array)\n const ids = Array.isArray(node.items) ? node.items : [node.items];\n items = await ctx.cmsService.getItemsByIds(source, ids);\n }\n // Filter draft items from ID-based queries\n if (ctx.locale) {\n items = items.filter((item) => !isItemDraftForLocale(item, ctx.locale!));\n }\n } else {\n // Build query from node props (resolve filter templates against parent loop variables\n // overlaid on host-component resolved props, with parent loop variables winning).\n const query = {\n collection: source,\n filter: resolveFilterTemplates(\n node.filter as CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown> | undefined,\n buildListResolutionScope(ctx),\n source,\n ),\n sort: node.sort,\n limit: node.limit,\n offset: node.offset,\n excludeDraftLocale: ctx.locale,\n };\n items = await ctx.cmsService.queryItems(query);\n }\n\n // Exclude current item if option is set and we have a current CMS context\n if (node.excludeCurrentItem && ctx.cmsContext?.cms?._id) {\n const currentId = ctx.cmsContext.cms._id as string;\n items = items.filter((item) => item._id !== currentId);\n }\n\n return items;\n}\n\n/**\n * Get items for a remote-data list (`sourceType: 'remote'`). Fetches the endpoint at render\n * time, navigates the optional dot-`path` to the items array, synthesizes a stable `_id` per\n * item, and applies the node's filter/sort/offset/limit. This mirrors the meno-astro runtime's\n * `getRemoteData` (the build/preview rendering path) so the editor's own SSR matches the real\n * Astro output. Graceful `[]` on any network/parse error, exactly like the runtime.\n */\nasync function getRemoteItems(node: ListNode, _ctx: SSRContext): Promise<CMSItem[]> {\n const url = typeof node.url === 'string' ? node.url : '';\n if (!url) return [];\n\n let payload: unknown;\n try {\n const res = await fetch(url, { headers: { accept: 'application/json' } });\n if (!res.ok) return [];\n payload = await res.json();\n } catch {\n return [];\n }\n\n // Navigate the dot-path (e.g. \"data.items\"); empty/absent = the response is the array.\n let raw: unknown = payload;\n if (node.path) {\n for (const seg of node.path.split('.')) {\n if (raw && typeof raw === 'object') raw = (raw as Record<string, unknown>)[seg];\n else {\n raw = undefined;\n break;\n }\n }\n }\n if (!Array.isArray(raw)) return [];\n\n // Synthesize `_id` (item id/_id else index; primitives \u2192 { _id, value }) so card bindings\n // ({{item._id}}) and React keys resolve \u2014 same shape getRemoteData produces.\n let items: CMSItem[] = raw.map((it, i) => {\n if (it && typeof it === 'object' && !Array.isArray(it)) {\n const rec = it as Record<string, unknown>;\n return { ...rec, _id: String(rec._id ?? rec.id ?? i) } as CMSItem;\n }\n return { _id: String(i), value: it } as unknown as CMSItem;\n });\n\n // Apply the query in the same order as the runtime (filter \u2192 sort \u2192 offset \u2192 limit).\n if (node.filter) {\n items = applyCmsFilters(items, node.filter as CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown>);\n }\n if (node.sort) items = applyCmsSorting(items, node.sort);\n if (node.offset && node.offset > 0) items = items.slice(node.offset);\n if (node.limit && node.limit > 0) items = items.slice(0, node.limit);\n\n return items;\n}\n\n/**\n * Get items for a Sanity list (`sourceType: 'sanity'`). Reads the project's Sanity connection\n * (`integrations.sanity`) from the config service, fetches the document type via GROQ at render\n * time, reads `payload.result`, flattens slug-typed fields, synthesizes `_id`, and applies the\n * node's filter/sort/offset/limit. Mirrors the meno-astro runtime's `getSanityData` so the\n * editor's own SSR matches the real Astro build. Graceful `[]` on missing config / any error.\n */\nasync function getSanityItems(node: ListNode): Promise<CMSItem[]> {\n const documentType = typeof node.documentType === 'string' ? node.documentType : '';\n if (!documentType) return [];\n const cfg = configService.getSanity();\n if (!cfg) return [];\n\n const host = cfg.useCdn === false ? 'api' : 'apicdn';\n const version = (cfg.apiVersion ?? '2024-01-01').replace(/^v/, '');\n const groq = `*[_type == ${JSON.stringify(documentType)}]`;\n const url = `https://${cfg.projectId}.${host}.sanity.io/v${version}/data/query/${cfg.dataset}?query=${encodeURIComponent(groq)}`;\n\n let payload: unknown;\n try {\n const res = await fetch(url, { headers: { accept: 'application/json' } });\n if (!res.ok) return [];\n payload = await res.json();\n } catch {\n return [];\n }\n\n const raw = (payload as { result?: unknown } | null)?.result;\n if (!Array.isArray(raw)) return [];\n\n let items: CMSItem[] = raw.map((it, i) => {\n if (it && typeof it === 'object' && !Array.isArray(it)) {\n const rec = resolveSanityScalars(cfg.projectId, cfg.dataset, it) as Record<string, unknown>;\n return { ...rec, _id: String(rec._id ?? i) } as CMSItem;\n }\n return { _id: String(i), value: it } as unknown as CMSItem;\n });\n\n if (node.filter) {\n items = applyCmsFilters(items, node.filter as CMSFilterCondition | CMSFilterCondition[] | Record<string, unknown>);\n }\n if (node.sort) items = applyCmsSorting(items, node.sort);\n if (node.offset && node.offset > 0) items = items.slice(node.offset);\n if (node.limit && node.limit > 0) items = items.slice(0, node.limit);\n\n return items;\n}\n\n/**\n * Resolve Sanity scalar shapes for the editor's SSR LIST preview: slug \u2192 `current`, image/file\n * asset \u2192 cdn URL (deterministic from the ref + projectId/dataset). Recursive. Mirrors meno-astro's\n * `resolveScalars`, minus Portable Text (no serializer dep in core) and reference joins (no extra\n * fetch) \u2014 the authoritative build/CMS-template paths in meno-astro do the full resolution.\n */\nfunction resolveSanityScalars(projectId: string, dataset: string, value: unknown): unknown {\n if (Array.isArray(value)) return value.map((v) => resolveSanityScalars(projectId, dataset, v));\n if (value !== null && typeof value === 'object') {\n const o = value as Record<string, unknown>;\n if (o._type === 'slug' && typeof o.current === 'string') return o.current;\n if ((o._type === 'image' || o._type === 'file') && o.asset && typeof o.asset === 'object') {\n const ref = (o.asset as { _ref?: unknown })._ref;\n if (typeof ref === 'string') {\n const m = /^(image|file)-(.+)-([a-z0-9]+)$/i.exec(ref);\n if (m)\n return `https://cdn.sanity.io/${m[1] === 'image' ? 'images' : 'files'}/${projectId}/${dataset}/${m[2]}.${m[3]}`;\n }\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(o)) out[k] = resolveSanityScalars(projectId, dataset, v);\n return out;\n }\n return value;\n}\n\n/**\n * Get items from component props or template context (for sourceType: 'prop')\n */\nfunction getPropItems(source: string, ctx: SSRContext): unknown[] {\n // Resolve the source - can be a direct prop name or a template expression\n if (source.startsWith('{{') && source.endsWith('}}')) {\n // Template expression - resolve from template context (for nested lists)\n // e.g., {{category.items}} where category is from parent list\n const templateCtx = ctx.templateContext;\n if (templateCtx) {\n const path = source.slice(2, -2).trim(); // Extract \"category.items\"\n const resolved = getNestedValue(templateCtx as Record<string, unknown>, path);\n if (Array.isArray(resolved)) {\n return resolved;\n } else if (resolved !== undefined) {\n // Warn if resolved to non-array value (likely a bug in template)\n console.warn(`List source \"${source}\" resolved to non-array value (type: ${typeof resolved})`);\n }\n }\n return [];\n } else {\n // Direct prop name - resolve from component props\n const propValue = ctx.componentResolvedProps?.[source];\n if (Array.isArray(propValue)) {\n return propValue;\n }\n\n // Also try template context for prop mode (for cms context values)\n if (ctx.cmsContext?.cms) {\n const cmsValue = ctx.cmsContext.cms[source];\n if (Array.isArray(cmsValue)) {\n return cmsValue;\n }\n }\n }\n return [];\n}\n\n/**\n * Render children array asynchronously\n */\nasync function renderChildrenAsync(children: unknown[], ctx: SSRContext): Promise<string> {\n const rendered: string[] = [];\n for (let index = 0; index < children.length; index++) {\n const child = children[index];\n const childPath = ctx.elementPath ? [...ctx.elementPath, index] : [index];\n rendered.push(await renderNode(child as ComponentNode | string | number, { ...ctx, elementPath: childPath }));\n }\n return rendered.join('');\n}\n\n/**\n * Build element class name for a node based on its SSR context.\n * Used by embed, link, locale-list, and regular HTML nodes.\n */\nfunction buildNodeElementClass(ctx: SSRContext, label: string | undefined, isSlotContent?: boolean): string {\n const { pagePath } = ctx;\n // Slot content uses page context (defined in page, not component)\n const useComponentContext = !isSlotContent && Boolean(ctx.componentContext);\n const effectiveFileType = useComponentContext ? 'component' : 'page';\n const effectiveFileName = useComponentContext\n ? ctx.componentContext\n : pagePath\n ? pagePath.replace(/^\\//, '').replace(/\\//g, '_') || 'index'\n : 'page';\n\n // Slice off the component-instance prefix so class hashes stay stable across\n // instances of the same component (mirrors ComponentBuilder.ts:678-680).\n const rawPath = ctx.elementPath || [];\n const path = useComponentContext && ctx.componentRootPath ? rawPath.slice(ctx.componentRootPath.length) : rawPath;\n\n const elementClassCtx: ElementClassContext = {\n fileType: effectiveFileType,\n fileName: effectiveFileName || 'page',\n label,\n path,\n };\n return generateElementClassName(elementClassCtx);\n}\n\n/**\n * Register interactive styles for CSS generation with mapping support.\n * Returns CSS variable overrides (if any) from resolved prop mappings.\n */\nfunction registerInteractiveStyles(\n ctx: SSRContext,\n elementClass: string,\n interactiveStyles: InteractiveStyles,\n): Record<string, string> {\n if (!ctx.interactiveStylesMap) return {};\n\n if (ctx.componentResolvedProps && hasInteractiveStyleMappings(interactiveStyles)) {\n const { resolvedStyles, mappings } = extractInteractiveStyleMappings(interactiveStyles);\n const cssVariables = resolveExtractedMappings(mappings, ctx.componentResolvedProps);\n ctx.interactiveStylesMap.set(elementClass, resolvedStyles);\n return cssVariables;\n }\n\n ctx.interactiveStylesMap.set(elementClass, interactiveStyles);\n return {};\n}\n\n/**\n * Build inline style attribute string from CSS variable overrides.\n */\nfunction buildCssVariableStyleAttr(cssVariables: Record<string, string>): string {\n if (Object.keys(cssVariables).length === 0) return '';\n const styleString = Object.entries(cssVariables)\n // Route values through the viewport-unit rewriter \u2014 see viewportUnits.ts.\n .map(([k, v]) => `${k}: ${rewriteViewportUnits(v)}`)\n .join('; ');\n return ` style=\"${escapeHtml(styleString)}\"`;\n}\n\nfunction arraysEqual(a: number[] | undefined, b: number[] | undefined): boolean {\n if (!a || !b || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\n/**\n * Compute editor-only attributes for the current context.\n * Returns '' when injectEditorAttrs is off \u2014 preview-only feature.\n */\nfunction editorAttrs(ctx: SSRContext, opts: { isSlotContent?: boolean; isCMSListContainer?: boolean } = {}): string {\n if (!ctx.injectEditorAttrs) return '';\n // Component root: inside a component instance and at the path the instance was reset to.\n const isComponentRoot =\n !!ctx.componentContext && !opts.isSlotContent && arraysEqual(ctx.elementPath, ctx.componentRootPath);\n // Mirror client semantics: at component root, parent is the outer component;\n // for descendants of a component, parent is the current component itself.\n const effectiveParent = opts.isSlotContent\n ? ctx.parentComponentName\n : isComponentRoot\n ? ctx.parentComponentName\n : (ctx.componentContext ?? ctx.parentComponentName);\n return buildEditorAttrs({\n elementPath: ctx.elementPath,\n cmsItemIndexPath: ctx.cmsItemIndexPath,\n cmsListPaths: ctx.cmsListPaths,\n componentContext: ctx.componentContext,\n parentComponentName: effectiveParent,\n isComponentRoot,\n isSlotContent: opts.isSlotContent,\n isCMSListContainer: opts.isCMSListContainer,\n });\n}\n\n/**\n * Render a node (or array of nodes) to HTML string\n */\nasync function renderNode(\n node: ComponentNode | ComponentNode[] | string | number | null | undefined,\n ctx: SSRContext,\n): Promise<string> {\n const { breakpoints, viewportWidth, locale, i18nConfig, slugMappings: _slugMappings, pagePath } = ctx;\n\n if (node === null || node === undefined) return '';\n\n // Verbatim-code markers ({ _code, expr }) from the meno-astro dialect carry arbitrary\n // JS the model can't represent. They render natively in the Astro build; meno-core SSR\n // has nothing to evaluate, so emit nothing rather than treating the marker as an element.\n if (typeof node === 'object' && !Array.isArray(node) && (node as { _code?: unknown })._code === true) {\n return '';\n }\n\n if (typeof node === 'string' || typeof node === 'number') {\n let text = String(node);\n\n // In template mode, preserve {{item.field}} placeholders for client-side rendering\n if (ctx.templateMode) {\n // Only process CMS template strings ({{cms.field}}) - preserve item templates\n if (ctx.cmsContext?.cms && text.includes('{{cms.')) {\n text = processCMSTemplate(text, ctx.cmsContext.cms, locale, i18nConfig);\n }\n // Check for raw HTML marker (from rich-text fields) - don't escape\n if (text.startsWith(RAW_HTML_PREFIX)) {\n const rawSlice = text.slice(RAW_HTML_PREFIX.length);\n let rawHtml = rawSlice;\n if (ctx.imageMetadataMap) rawHtml = rewriteRichTextImages(rawHtml, ctx.imageMetadataMap, ctx.imageFormat);\n rawHtml = await expandRichTextComponents(rawHtml, ctx);\n rawHtml = localizeRichTextLinks(rawHtml, ctx);\n ctx.processedRawHtmlCollector?.set(rawSlice, rawHtml);\n return rawHtml;\n }\n return escapeHtml(text);\n }\n\n // Normal mode: Process item template strings first (for CMSList context)\n const templateCtx = getTemplateContext(ctx);\n if (templateCtx && hasItemTemplates(text)) {\n text = processItemTemplate(text, templateCtx, getI18nResolver(ctx));\n }\n // Process CMS template strings like {{cms.title}}\n if (ctx.cmsContext?.cms && text.includes('{{cms.')) {\n text = processCMSTemplate(text, ctx.cmsContext.cms, locale, i18nConfig);\n }\n // Check for raw HTML marker (from rich-text fields) - don't escape\n if (text.startsWith(RAW_HTML_PREFIX)) {\n const rawSlice = text.slice(RAW_HTML_PREFIX.length);\n let rawHtml = rawSlice;\n if (ctx.imageMetadataMap) rawHtml = rewriteRichTextImages(rawHtml, ctx.imageMetadataMap, ctx.imageFormat);\n rawHtml = await expandRichTextComponents(rawHtml, ctx);\n rawHtml = localizeRichTextLinks(rawHtml, ctx);\n ctx.processedRawHtmlCollector?.set(rawSlice, rawHtml);\n return rawHtml;\n }\n return escapeHtml(text);\n }\n\n if (Array.isArray(node)) {\n return (\n await Promise.all(\n node.map((child, index) => {\n const childPath = ctx.elementPath ? [...ctx.elementPath.slice(0, -1), index] : [index];\n return renderNode(child, { ...ctx, elementPath: childPath });\n }),\n )\n ).join('');\n }\n\n if (typeof node !== 'object') return '';\n\n // Resolve `_i18n` value objects to a single string before node-shape\n // dispatch. Authors can write a localized string anywhere `children` is\n // accepted \u2014 on `type: \"node\"` elements, list templates, link children, etc.\n // \u2014 and the runtime resolves it to the active locale here. Precedence rule:\n // an object with both `_i18n: true` and `type`/`tag` resolves as i18n.\n if (isI18nValue(node)) {\n const i18nResolveConfig = i18nConfig ?? DEFAULT_I18N_CONFIG;\n const i18nEffectiveLocale = locale || i18nResolveConfig.defaultLocale;\n const resolved = resolveI18nValue(node, i18nEffectiveLocale, i18nResolveConfig);\n return renderNode(resolved as ComponentNode | string | number | null | undefined, ctx);\n }\n\n // Check if condition - skip rendering if false\n if (!evaluateIfCondition(node as ComponentNode, ctx)) {\n return '';\n }\n\n // Handle List nodes (async operation - handles both prop and collection source types)\n // isListNode() also matches legacy 'cms-list' type for migration\n if (isListNode(node)) {\n try {\n return await processList(node, ctx);\n } catch (error) {\n // A list at page-root level isn't wrapped by renderComponent's catch, so\n // guard it here too \u2014 one broken list shouldn't take down the whole page.\n return renderNodeFallback(ctx, error, 'list');\n }\n }\n\n const nodeType = 'type' in node ? node.type : undefined;\n const nodeStyle = 'style' in node ? (node.style as StyleObject | ResponsiveStyleObject | undefined) : undefined;\n const children = 'children' in node ? node.children || [] : [];\n\n // Islands (BYO framework components) and Custom nodes (opaque hand-authored\n // `.astro` black boxes) can't run in meno-core's SSR \u2014 real rendering happens\n // only in a real `astro build` / play preview (the meno-astro codec emits the\n // `<Component client:* />` / `<Fancy />` markup). On the design canvas we render\n // their slotted children as normal content (so pages built from them read\n // cleanly) and fall back to a quiet inline marker when there are none. The\n // wrapper carries `data-element-path` (via editorAttrs) so a click selects the\n // node like any other, plus `data-island`/`data-custom` for identification \u2014\n // no loud highlight box.\n if (isIslandNode(node) || isCustomNode(node)) {\n const src = typeof node.src === 'string' ? node.src : '';\n const extPattern = isIslandNode(node) ? /\\.(tsx|jsx|vue|svelte)$/i : /\\.astro$/i;\n const name = src.split('/').pop()?.replace(extPattern, '') || '?';\n const dataAttr = isIslandNode(node) ? 'data-island' : 'data-custom';\n const blackBoxChildren = Array.isArray(node.children)\n ? node.children\n : typeof node.children === 'string'\n ? [node.children]\n : [];\n const inner = blackBoxChildren.length\n ? await renderChildrenAsync(blackBoxChildren, ctx)\n : `<span style=\"color:#9ca3af;font-size:13px\">${escapeHtml(name)}</span>`;\n return `<div ${dataAttr}=\"${escapeHtml(src)}\" style=\"display:contents\"${editorAttrs(ctx, { isSlotContent: isSlotContent(node) })}>${inner}</div>`;\n }\n\n // Handle embed nodes - render custom HTML content\n if (isEmbedNode(node)) {\n // Resolve HTML mapping if present\n let htmlContent: string;\n if (isHtmlMapping(node.html)) {\n const resolved = resolveHtmlMapping(node.html, ctx.componentResolvedProps);\n htmlContent = resolved ?? '';\n } else if (typeof node.html === 'string') {\n htmlContent = node.html;\n } else {\n // Fallback: non-string, non-mapping value \u2014 default to empty\n htmlContent = '';\n }\n\n // In template mode, preserve {{item.field}} placeholders for client-side rendering\n if (ctx.templateMode) {\n // Only process CMS template strings ({{cms.field}}) - preserve item templates\n if (ctx.cmsContext?.cms && htmlContent.includes('{{cms.')) {\n htmlContent = processCMSTemplate(htmlContent, ctx.cmsContext.cms, locale, i18nConfig);\n }\n } else {\n // Normal mode: Process item template strings first (for CMSList context)\n const templateCtx = getTemplateContext(ctx);\n if (templateCtx && hasItemTemplates(htmlContent)) {\n htmlContent = processItemTemplate(htmlContent, templateCtx, getI18nResolver(ctx));\n }\n // Process CMS template strings like {{cms.title}}\n if (ctx.cmsContext?.cms && htmlContent.includes('{{cms.')) {\n htmlContent = processCMSTemplate(htmlContent, ctx.cmsContext.cms, locale, i18nConfig);\n }\n }\n\n // Sanitize HTML with allowlist for SVG, rich-text formatting, and common elements (same as client)\n const purify = getDOMPurify();\n const purifiedHtml = purify\n ? purify.sanitize(htmlContent, {\n ALLOWED_TAGS: [\n 'svg',\n 'path',\n 'circle',\n 'rect',\n 'line',\n 'polyline',\n 'polygon',\n 'g',\n 'text',\n 'tspan',\n 'image',\n 'defs',\n 'use',\n 'linearGradient',\n 'radialGradient',\n 'stop',\n 'clipPath',\n 'mask',\n 'pattern',\n 'marker',\n 'symbol',\n 'a',\n 'div',\n 'span',\n 'p',\n 'br',\n 'button',\n 'img',\n 'iframe',\n 'video',\n 'audio',\n 'source',\n 'canvas',\n 'b',\n 'i',\n 'u',\n 'strong',\n 'em',\n 'sub',\n 'sup',\n 'mark',\n 's',\n 'small',\n 'del',\n 'ins',\n 'q',\n 'abbr',\n 'code',\n 'pre',\n 'blockquote',\n 'ul',\n 'ol',\n 'li',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'style',\n 'animate',\n 'animateTransform',\n 'animateMotion',\n 'set',\n 'filter',\n 'feGaussianBlur',\n 'feOffset',\n 'feMerge',\n 'feMergeNode',\n 'feColorMatrix',\n 'feComposite',\n 'feFlood',\n 'feMorphology',\n 'feBlend',\n 'feDropShadow',\n 'feTurbulence',\n 'feDisplacementMap',\n 'foreignObject',\n ],\n ALLOWED_ATTR: [\n 'class',\n 'id',\n 'style',\n 'width',\n 'height',\n 'viewBox',\n 'xmlns',\n 'xmlns:xlink',\n 'xlink:href',\n 'fill',\n 'stroke',\n 'stroke-width',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'd',\n 'cx',\n 'cy',\n 'r',\n 'x',\n 'y',\n 'x1',\n 'y1',\n 'x2',\n 'y2',\n 'points',\n 'href',\n 'src',\n 'alt',\n 'target',\n 'rel',\n 'data-*',\n 'aria-*',\n 'transform',\n 'opacity',\n 'fill-opacity',\n 'fill-rule',\n 'clip-rule',\n 'clip-path',\n 'clipPathUnits',\n 'mask',\n 'mask-type',\n 'maskUnits',\n 'maskContentUnits',\n 'patternUnits',\n 'patternContentUnits',\n 'patternTransform',\n 'gradientUnits',\n 'gradientTransform',\n 'spreadMethod',\n 'preserveAspectRatio',\n 'marker-start',\n 'marker-mid',\n 'marker-end',\n 'markerUnits',\n 'markerWidth',\n 'markerHeight',\n 'refX',\n 'refY',\n 'orient',\n 'paint-order',\n 'vector-effect',\n 'filter',\n 'filterUnits',\n 'primitiveUnits',\n 'in',\n 'in2',\n 'result',\n 'stdDeviation',\n 'flood-color',\n 'flood-opacity',\n 'stroke-opacity',\n 'font-size',\n 'font-family',\n 'font-weight',\n 'font-style',\n 'text-anchor',\n 'dominant-baseline',\n 'offset',\n 'stop-color',\n 'stop-opacity',\n 'frameborder',\n 'allowfullscreen',\n 'allow',\n 'title',\n 'attributeName',\n 'values',\n 'dur',\n 'begin',\n 'end',\n 'repeatCount',\n 'repeatDur',\n 'keyTimes',\n 'keySplines',\n 'calcMode',\n 'from',\n 'to',\n 'by',\n 'additive',\n 'accumulate',\n 'type',\n 'rotate',\n 'keyPoints',\n 'path',\n ],\n KEEP_CONTENT: true,\n })\n : htmlContent;\n // Inline simple SVG <style> rules as style=\"\" attributes \u2014 class-scoped\n // declarations don't survive the editor preview's HMR `innerHTML` reparse\n // path (`htmlGenerator.ts:574`), but inline attributes always render.\n const sanitizedHtml = inlineSvgStyleRules(purifiedHtml);\n const optimizedHtml = ctx.imageMetadataMap\n ? rewriteRichTextImages(sanitizedHtml, ctx.imageMetadataMap, ctx.imageFormat)\n : sanitizedHtml;\n\n // Extract attributes from node\n const nodeAttributes = resolveI18nAttrs(extractAttributesFromNode(node), locale, i18nConfig);\n\n // Build className array\n const classNames: string[] = ['oem'];\n\n // Convert styles to utility classes (process templates in style values)\n if (nodeStyle) {\n const utilityClasses = processStyleToClasses(nodeStyle, ctx);\n classNames.push(...utilityClasses);\n }\n\n // Handle interactive styles for embed nodes\n const embedInteractiveStyles = node.interactiveStyles as InteractiveStyles | undefined;\n const embedGenerateElementClass = node.generateElementClass;\n\n if ((embedInteractiveStyles && embedInteractiveStyles.length > 0) || embedGenerateElementClass) {\n const elementClass = buildNodeElementClass(ctx, node.label);\n classNames.unshift(elementClass);\n\n let embedCssVariables: Record<string, string> = {};\n if (embedInteractiveStyles && embedInteractiveStyles.length > 0) {\n embedCssVariables = registerInteractiveStyles(ctx, elementClass, embedInteractiveStyles);\n }\n\n const embedStyleAttr = buildCssVariableStyleAttr(embedCssVariables);\n\n // Add attribute className if present\n const attrClassName = (nodeAttributes.className || nodeAttributes.class || '') as string;\n if (attrClassName) {\n classNames.push(attrClassName);\n }\n delete nodeAttributes.className;\n delete nodeAttributes.class;\n\n const attrs = buildAttributes(nodeAttributes);\n const classAttr = classNames.length > 0 ? ` class=\"${escapeHtml(classNames.filter(Boolean).join(' '))}\"` : '';\n\n // Always use span for embeds - valid inside <p> and other phrasing content\n return `<span${classAttr}${embedStyleAttr}${attrs}${editorAttrs(ctx, { isSlotContent: isSlotContent(node) })}>${optimizedHtml}</span>`;\n }\n\n // Add attribute className if present (fallback when no interactive styles)\n const attrClassName = (nodeAttributes.className || nodeAttributes.class || '') as string;\n if (attrClassName) {\n classNames.push(attrClassName);\n }\n delete nodeAttributes.className;\n delete nodeAttributes.class;\n\n const attrs = buildAttributes(nodeAttributes);\n const classAttr = classNames.length > 0 ? ` class=\"${escapeHtml(classNames.filter(Boolean).join(' '))}\"` : '';\n\n // Always use span for embeds - valid inside <p> and other phrasing content\n return `<span${classAttr}${attrs}${editorAttrs(ctx, { isSlotContent: isSlotContent(node) })}>${optimizedHtml}</span>`;\n }\n\n // Handle link nodes (render as <a> tag in SSR)\n if (isLinkNode(node)) {\n let href: string = typeof node.href === 'string' ? node.href : '#';\n let targetFromLink: string | undefined;\n\n // Process item templates in href (for CMSList context)\n // Skip when in templateMode to preserve {{item.field}} placeholders\n const templateCtx = getTemplateContext(ctx);\n if (!ctx.templateMode && templateCtx && hasItemTemplates(href)) {\n // Get raw value first to check if it's a link object (like { href: \"/path\", target: \"_blank\" })\n const rawValue = resolveTemplateRawValue(href, templateCtx);\n if (rawValue && typeof rawValue === 'object' && 'href' in rawValue) {\n // Link object - extract href and target\n // Unwrap nested link objects (e.g., {href: {href: \"/path\"}} from double-wrapped list item templates)\n let linkObj = rawValue as { href: unknown; target?: string };\n while (\n typeof linkObj.href === 'object' &&\n linkObj.href !== null &&\n 'href' in (linkObj.href as Record<string, unknown>)\n ) {\n const nested = linkObj.href as { href: unknown; target?: string };\n if (!linkObj.target && nested.target) linkObj = { ...linkObj, target: nested.target };\n linkObj = { ...linkObj, href: nested.href };\n }\n href = String(linkObj.href);\n targetFromLink = linkObj.target;\n } else {\n // Regular value - use string processing\n href = processItemTemplate(href, templateCtx, getI18nResolver(ctx));\n }\n }\n\n // Process CMS templates in href (e.g., {{cms.ctaLink}})\n if (ctx.cmsContext?.cms && href.includes('{{cms.')) {\n href = processCMSTemplate(href, ctx.cmsContext.cms, locale, i18nConfig);\n }\n\n // Localize internal page links to current locale\n href = localizeHref(href, ctx);\n\n // Extract attributes from node\n const nodeAttributes = resolveI18nAttrs(extractAttributesFromNode(node), locale, i18nConfig);\n\n // Build className array - start with olink base class\n const classNames: string[] = ['olink'];\n\n // Convert styles to utility classes (process templates in style values)\n if (nodeStyle) {\n const utilityClasses = processStyleToClasses(nodeStyle, ctx);\n classNames.push(...utilityClasses);\n }\n\n // Handle interactive styles for link nodes\n const olinkInteractiveStyles = node.interactiveStyles as InteractiveStyles | undefined;\n const olinkGenerateElementClass = node.generateElementClass;\n let olinkCssVariables: Record<string, string> = {};\n let olinkStyleAttr = '';\n\n if ((olinkInteractiveStyles && olinkInteractiveStyles.length > 0) || olinkGenerateElementClass) {\n const elementClass = buildNodeElementClass(ctx, node.label);\n classNames.splice(1, 0, elementClass);\n\n if (olinkInteractiveStyles && olinkInteractiveStyles.length > 0) {\n olinkCssVariables = registerInteractiveStyles(ctx, elementClass, olinkInteractiveStyles);\n }\n olinkStyleAttr = buildCssVariableStyleAttr(olinkCssVariables);\n }\n\n // Add attribute className if present\n const attrClassName = (nodeAttributes.className || nodeAttributes.class || '') as string;\n if (attrClassName) {\n classNames.push(attrClassName);\n }\n delete nodeAttributes.className;\n delete nodeAttributes.class;\n\n // Add is-current class when link href matches current page path\n if (pagePath && !ctx.templateMode && isCurrentLink(href, pagePath)) {\n classNames.push('is-current');\n }\n\n // Add target from link object if present (and not already set in attributes)\n if (targetFromLink && !nodeAttributes.target) {\n nodeAttributes.target = targetFromLink;\n }\n\n const attrs = buildAttributes(nodeAttributes, ['href']);\n const classAttr = ` class=\"${escapeHtml(classNames.filter(Boolean).join(' '))}\"`;\n\n const childrenHTML = Array.isArray(children)\n ? (\n await Promise.all(\n children.map((child, index) => {\n const childPath = ctx.elementPath ? [...ctx.elementPath, index] : [index];\n return renderNode(child, { ...ctx, elementPath: childPath });\n }),\n )\n ).join('')\n : await renderNode(children as ComponentNode | string | number | null | undefined, {\n ...ctx,\n elementPath: ctx.elementPath ? [...ctx.elementPath, 0] : [0],\n });\n\n return `<a href=\"${escapeHtml(String(href))}\"${classAttr}${olinkStyleAttr}${attrs}${editorAttrs(ctx, { isSlotContent: isSlotContent(node) })}>${childrenHTML}</a>`;\n }\n\n // Handle locale-list node type (render locale switcher links)\n if (isLocaleListNode(node)) {\n return renderLocaleList(node, ctx);\n }\n\n // Extract tag or component name based on node type\n const tag = isHtmlNode(node) ? node.tag : undefined;\n const componentName = isComponentNode(node) ? node.component : undefined;\n let nodeProps = isComponentNode(node) ? node.props || {} : {};\n\n // Process CMS templates in props\n if (ctx.cmsContext?.cms && Object.keys(nodeProps).length > 0) {\n nodeProps = processCMSPropsTemplate(nodeProps, ctx.cmsContext.cms, locale, i18nConfig);\n }\n\n // Process item templates in props (for CMSList context)\n // Skip when in templateMode to preserve {{item.field}} placeholders\n const templateCtx = getTemplateContext(ctx);\n const i18nResolver = getI18nResolver(ctx);\n if (!ctx.templateMode && templateCtx && Object.keys(nodeProps).length > 0) {\n nodeProps = processItemPropsTemplate(nodeProps, templateCtx, i18nResolver);\n }\n\n // Extract attributes from node. Resolve any `_i18n` value objects on\n // attribute values to the active locale's string before downstream\n // processing (templates, CMS substitution, kebab-casing).\n let nodeAttributes = resolveI18nAttrs(extractAttributesFromNode(node), locale, i18nConfig);\n const originalAttributes = { ...nodeAttributes };\n\n // Process CMS templates in attributes (e.g., href=\"{{cms.link}}\")\n if (ctx.cmsContext?.cms && Object.keys(nodeAttributes).length > 0) {\n nodeAttributes = processCMSPropsTemplate(\n nodeAttributes as Record<string, unknown>,\n ctx.cmsContext.cms,\n locale,\n i18nConfig,\n ) as Record<string, string | number | boolean>;\n }\n\n // Process item templates in attributes (for CMSList context)\n // Skip when in templateMode to preserve {{item.field}} placeholders\n if (!ctx.templateMode && templateCtx && Object.keys(nodeAttributes).length > 0) {\n nodeAttributes = processItemPropsTemplate(nodeAttributes, templateCtx, i18nResolver) as Record<\n string,\n string | number | boolean\n >;\n }\n\n // Auto-skip attributes that were entirely template expressions and resolved to \"\"\n if (Object.keys(nodeAttributes).length > 0) {\n nodeAttributes = skipEmptyTemplateAttributes(originalAttributes, nodeAttributes) as Record<\n string,\n string | number | boolean\n >;\n }\n\n if (!tag && !componentName) return '';\n\n // Convert styles to utility classes instead of inline styles\n let utilityClasses: string[] = [];\n let resolvedStyle: StyleObject = {};\n // For custom component instances, defer style\u2192class conversion: forward the\n // style object so renderComponent can deep-merge it into the structure root,\n // then let the recursive renderNode call generate classes from the merged\n // result. This matches the client (ComponentBuilder.mergeNodeStyles) so that\n // an instance override of e.g. marginBottom actually replaces the structure's\n // marginBottom instead of fighting it as a same-specificity utility class.\n const isCustomComponentNode =\n nodeType === NODE_TYPE.COMPONENT && isComponentNode(node) && ssrComponentRegistry.has(node.component);\n let deferredComponentStyle: StyleObject | ResponsiveStyleObject | undefined;\n\n if (nodeStyle) {\n if (isCustomComponentNode) {\n deferredComponentStyle = nodeStyle;\n } else {\n // Validate that all styles can generate utility classes (build-time warnings)\n validateStyleCoverage(nodeStyle, `Node: ${nodeType || 'unknown'}`);\n\n // Convert style object to utility class names (process templates in style values)\n utilityClasses = processStyleToClasses(nodeStyle, ctx);\n }\n } else if (nodeProps.style) {\n // If no node.style but props have style, keep it for backward compatibility\n if (isResponsiveStyle(nodeProps.style) && breakpoints && viewportWidth) {\n resolvedStyle = mergeResponsiveStyles(\n nodeProps.style as ResponsiveStyleObject,\n 'viewport',\n viewportWidth,\n breakpoints,\n );\n } else {\n resolvedStyle = nodeProps.style as StyleObject;\n }\n }\n\n // Generate element-specific class if node has interactive styles or generateElementClass flag\n const nodeInteractiveStyles =\n 'interactiveStyles' in node ? (node.interactiveStyles as InteractiveStyles | undefined) : undefined;\n const nodeGenerateElementClass =\n 'generateElementClass' in node ? (node.generateElementClass as boolean | undefined) : undefined;\n const nodeLabel = 'label' in node ? (node.label as string | undefined) : undefined;\n let elementClass = '';\n\n if ((nodeInteractiveStyles && nodeInteractiveStyles.length > 0) || nodeGenerateElementClass) {\n const nodeIsSlotContent = isSlotContent(node);\n elementClass = buildNodeElementClass(ctx, nodeLabel, nodeIsSlotContent);\n\n if (nodeInteractiveStyles && nodeInteractiveStyles.length > 0) {\n const cssVariables = registerInteractiveStyles(ctx, elementClass, nodeInteractiveStyles);\n // Add CSS variables to resolved style for inline output\n if (Object.keys(cssVariables).length > 0) {\n for (const [varName, value] of Object.entries(cssVariables)) {\n (resolvedStyle as Record<string, string | number>)[varName] = value;\n }\n }\n }\n }\n\n // Merge resolved style into props.style, and merge attributes\n // Handle class/className specially - merge with utility classes instead of replacing\n const attrClassName = (nodeAttributes.className || nodeAttributes.class || '') as string;\n const nodeAttributesWithoutClass = { ...nodeAttributes };\n delete nodeAttributesWithoutClass.className;\n delete nodeAttributesWithoutClass.class;\n\n // Merge classNames: element class (first for specificity) + attribute classes + utility classes\n const allClassNames = [elementClass, attrClassName, ...utilityClasses].filter(Boolean);\n const mergedClassName = allClassNames.length > 0 ? allClassNames.join(' ') : '';\n\n const propsWithStyleAndAttrs = {\n ...nodeProps,\n ...nodeAttributesWithoutClass,\n ...(mergedClassName ? { className: mergedClassName } : {}),\n ...(deferredComponentStyle\n ? { style: deferredComponentStyle }\n : Object.keys(resolvedStyle).length > 0\n ? { style: resolvedStyle }\n : {}),\n };\n\n // Check if this is a custom component\n if (nodeType === NODE_TYPE.COMPONENT && componentName && ssrComponentRegistry.has(componentName)) {\n return renderComponent(componentName, propsWithStyleAndAttrs, children, nodeAttributes, ctx);\n }\n\n // Component not found in registry - warn and return empty\n if (nodeType === NODE_TYPE.COMPONENT && componentName) {\n console.warn(`[Meno SSR] Component \"${componentName}\" not found in registry.`);\n return '';\n }\n\n // Handle Link component for navigation (only for HTML nodes)\n if (tag === 'Link') {\n return renderLinkNode(propsWithStyleAndAttrs, children, ctx);\n }\n\n // Regular HTML element. `tag` is necessarily set here: the `!tag &&\n // !componentName` case returned at the top of this section, and every\n // `componentName` path has already returned (isComponentNode \u21D2 type ===\n // 'component', which the two component branches above handle exhaustively).\n return renderHtmlElement(tag as string, propsWithStyleAndAttrs, children, ctx);\n}\n\n/**\n * Render a custom component\n */\nasync function renderComponent(\n componentName: string,\n propsWithStyleAndAttrs: Record<string, unknown>,\n children: unknown,\n nodeAttributes: Record<string, unknown>,\n ctx: SSRContext,\n): Promise<string> {\n const { locale, i18nConfig, pagePath: _pagePath } = ctx;\n const componentDef = ssrComponentRegistry.get(componentName);\n if (!componentDef) return '';\n\n try {\n const structuredComponentDef = componentDef.component;\n if (!structuredComponentDef) return '';\n\n // Resolve props with defaults from interface definition (with i18n support)\n const resolvedProps = resolvePropsFromDefinition(\n structuredComponentDef,\n propsWithStyleAndAttrs,\n children as Array<ComponentNode | string> | string | ComponentNode | null | undefined,\n locale,\n i18nConfig,\n );\n\n // Process the structure with resolved props\n // Pass instance children to replace { type: \"children\" } markers\n // Use preserveResponsiveStyles: true to keep responsive styles intact for SSR rendering\n // Mark children as slot content so they use page context for element class generation\n // Pass parent template context (itemContext) for nested cms-list template resolution\n const markedChildren = children\n ? markAsSlotContent(children as ComponentNode | ComponentNode[] | string | number | null | undefined)\n : undefined;\n\n const processedStructure = processStructure(\n structuredComponentDef.structure,\n {\n props: resolvedProps,\n componentDef: structuredComponentDef,\n itemContext: ctx.templateContext,\n // Host (outer) component's resolved props \u2014 used as fallback scope\n // for `{{x}}` templates the child's interface doesn't declare. At\n // this point `ctx.componentResolvedProps` still belongs to the\n // outer component; it's only swapped to `resolvedProps` below when\n // we recurse via `renderNode`.\n parentProps: ctx.componentResolvedProps,\n },\n undefined,\n markedChildren,\n true,\n );\n\n if (!processedStructure) return '';\n\n // Type guard: ensure processedStructure is a ComponentNode\n if (\n typeof processedStructure === 'string' ||\n typeof processedStructure === 'number' ||\n Array.isArray(processedStructure)\n ) {\n return await renderNode(processedStructure as string | number | ComponentNode[], ctx);\n }\n\n // Merge instance style overrides, className, and attributes\n // processedStructure is typically an HTML node (the component's root element)\n // Handle component nodes, HTML nodes, and Link nodes (Link and HTML share top-level style/attributes)\n const rootNode = processedStructure as ComponentNode & {\n props?: Record<string, unknown>;\n style?: Record<string, unknown>;\n attributes?: Record<string, string | number | boolean>;\n };\n if (isComponentNode(rootNode) || isHtmlNode(rootNode) || isLinkNode(rootNode)) {\n if (!rootNode.props) {\n rootNode.props = {};\n }\n\n // Deep-merge instance styles into the structure root (per-breakpoint for\n // responsive styles), so an instance override of a property actually\n // replaces the structure's value for that property instead of producing a\n // competing utility class on the same element.\n if (propsWithStyleAndAttrs.style) {\n mergeNodeStyles(rootNode, propsWithStyleAndAttrs.style as StyleObject | ResponsiveStyleObject);\n }\n\n // Merge className from component instance (includes responsive utility classes)\n if (propsWithStyleAndAttrs.className) {\n if (isHtmlNode(rootNode) || isLinkNode(rootNode)) {\n // For HTML and Link root nodes, merge into attributes where the renderer reads them\n if (!rootNode.attributes) rootNode.attributes = {};\n const existingClass = (rootNode.attributes.class || '') as string;\n rootNode.attributes.class = existingClass\n ? `${existingClass} ${propsWithStyleAndAttrs.className}`\n : (propsWithStyleAndAttrs.className as string);\n } else {\n const existingClassName = rootNode.props.className || '';\n rootNode.props.className = existingClassName\n ? `${existingClassName} ${propsWithStyleAndAttrs.className}`\n : propsWithStyleAndAttrs.className;\n }\n }\n\n // Merge attributes into props\n Object.assign(rootNode.props as Record<string, unknown>, nodeAttributes);\n\n // Forward nodeAttributes to rootNode.attributes for HTML/Link root nodes\n // so attributes from outer components (e.g. data-component) reach the final HTML element\n if ((isHtmlNode(rootNode) || isLinkNode(rootNode)) && Object.keys(nodeAttributes).length > 0) {\n if (!rootNode.attributes) {\n rootNode.attributes = {};\n }\n for (const [key, value] of Object.entries(nodeAttributes)) {\n if (key !== 'class' && key !== 'className') {\n rootNode.attributes[key] = value as string | number | boolean;\n }\n }\n }\n\n // Add defineVars data attributes for JS prop injection\n const defineVars = structuredComponentDef.defineVars;\n if (defineVars && componentName) {\n const varsToExpose = defineVars === true ? Object.keys(structuredComponentDef.interface || {}) : defineVars;\n\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 // Accumulate data-component (space-separated) and data-props (keyed by name)\n const processedRoot = processedStructure as import('../../shared/types').HtmlNode;\n if (!processedRoot.attributes) {\n processedRoot.attributes = {};\n }\n const existingComponent =\n (processedRoot.attributes?.['data-component'] as string) ||\n (processedRoot.props?.['data-component'] as string) ||\n '';\n processedRoot.attributes['data-component'] = existingComponent\n ? `${existingComponent} ${componentName}`\n : componentName;\n\n let existingPropsMap: Record<string, unknown> = {};\n const existingPropsStr =\n (processedRoot.attributes?.['data-props'] as string) || (processedRoot.props?.['data-props'] as string);\n if (existingPropsStr) {\n try {\n existingPropsMap = JSON.parse(existingPropsStr);\n } catch (e) {\n // Malformed existing data-props \u2014 recover with an empty map, but log it\n // (otherwise a sibling component's hydration props vanish silently).\n logRuntimeError('ssrRenderer.parseExistingDataProps', e);\n }\n }\n existingPropsMap[componentName] = propsForJS;\n processedRoot.attributes['data-props'] = JSON.stringify(existingPropsMap);\n }\n\n // Stamp every component instance with data-meno-component(+ -instance) so\n // tooling can address it by name (e.g. /screenshot pricing PricingSection).\n // Only applies to HTML / Link roots \u2014 nested-component roots inherit via\n // their own outermost element when this recurses.\n if (componentName && (isHtmlNode(rootNode) || isLinkNode(rootNode))) {\n if (!rootNode.attributes) rootNode.attributes = {};\n if (!ctx.componentInstanceCounter) {\n ctx.componentInstanceCounter = new Map<string, number>();\n }\n const instanceIndex = ctx.componentInstanceCounter.get(componentName) ?? 0;\n ctx.componentInstanceCounter.set(componentName, instanceIndex + 1);\n rootNode.attributes['data-meno-component'] = componentName;\n rootNode.attributes['data-meno-component-instance'] = String(instanceIndex);\n }\n }\n\n // Render the processed component structure with component context.\n // elementPath stays page-absolute (matching client ComponentBuilder.ts:874) so\n // data-element-path values match XRay's tree paths. componentRootPath captures\n // the page-level path of this instance so buildNodeElementClass can slice it\n // off to keep class hashes component-relative across instances.\n // At this point the string/number/array branches have already returned\n // (see the type guard above) and processedStructure has been handled as a\n // ComponentNode (rootNode). Cast to narrow the residual\n // `Record<string, unknown>` union member \u2014 purely type-level, no runtime change.\n return await renderNode(processedStructure as ComponentNode, {\n ...ctx,\n // The previously-active component (if any) becomes the parent for editor attrs\n parentComponentName: ctx.componentContext,\n componentContext: componentName,\n componentRootPath: ctx.elementPath,\n componentResolvedProps: resolvedProps,\n });\n } catch (error) {\n return renderNodeFallback(ctx, error, `component ${componentName}`);\n }\n}\n\n/**\n * Render a Link component as anchor tag\n */\nasync function renderLinkNode(\n propsWithStyleAndAttrs: Record<string, unknown>,\n children: unknown,\n ctx: SSRContext,\n): Promise<string> {\n const to = 'to' in propsWithStyleAndAttrs ? propsWithStyleAndAttrs.to : undefined;\n const restProps: Record<string, unknown> = { ...propsWithStyleAndAttrs };\n delete restProps.to;\n const rawHref = (typeof to === 'string' ? to : undefined) || '#';\n const href = localizeHref(rawHref, ctx);\n\n // Build class attribute from utility classes\n const linkClassAttr = restProps.className ? ` class=\"${escapeHtml(String(restProps.className))}\"` : '';\n\n const attrs = buildAttributes(restProps, ['style', 'className', 'to']);\n const childrenHTML = Array.isArray(children)\n ? (\n await Promise.all(\n (children as (ComponentNode | string)[]).map((child, index) => {\n const childPath = ctx.elementPath ? [...ctx.elementPath, index] : [index];\n return renderNode(child, { ...ctx, elementPath: childPath });\n }),\n )\n ).join('')\n : await renderNode(children as ComponentNode, {\n ...ctx,\n elementPath: ctx.elementPath ? [...ctx.elementPath, 0] : [0],\n });\n\n return `<a href=\"${escapeHtml(String(href))}\"${linkClassAttr}${attrs}${editorAttrs(ctx)}>${childrenHTML}</a>`;\n}\n\n/**\n * Render a regular HTML element\n */\nasync function renderHtmlElement(\n tag: string,\n propsWithStyleAndAttrs: Record<string, unknown>,\n children: unknown,\n ctx: SSRContext,\n): Promise<string> {\n // Build class attribute from utility classes\n let classValue = propsWithStyleAndAttrs.className ? String(propsWithStyleAndAttrs.className) : '';\n\n // Localize and check <a> tag hrefs\n if (tag === 'a' && !ctx.templateMode) {\n const href = propsWithStyleAndAttrs.href as string | undefined;\n if (href && typeof href === 'string') {\n const localizedHref = localizeHref(href, ctx);\n if (localizedHref !== href) {\n propsWithStyleAndAttrs = { ...propsWithStyleAndAttrs, href: localizedHref };\n }\n if (ctx.pagePath && isCurrentLink(localizedHref, ctx.pagePath)) {\n classValue = classValue ? `${classValue} is-current` : 'is-current';\n }\n }\n }\n\n const classAttr = classValue ? ` class=\"${escapeHtml(classValue)}\"` : '';\n\n // Build style attribute (for CSS variables and remaining inline styles)\n const styleString = styleToString(propsWithStyleAndAttrs.style as Record<string, string | number> | undefined);\n const styleAttr = styleString ? ` style=\"${styleString}\"` : '';\n\n // For img tags, exclude image-specific props (handled specially in renderImageElement)\n const imageProps = ['src', 'alt', 'loading', 'width', 'height', 'sizes', 'srcset', 'fetchpriority'];\n const excludeProps = tag.toLowerCase() === 'img' ? ['style', 'className', ...imageProps] : ['style', 'className'];\n const attrs = buildAttributes(propsWithStyleAndAttrs, excludeProps);\n // `<style>` and `<script>` are HTML \"raw text\" elements: their content is\n // not parsed for entities or child elements. Running text children through\n // `renderNode` (which calls `escapeHtml`) would convert `\"`, `<`, `>` to\n // entities \u2014 breaking CSS selectors / @font-face URLs and JS code. Emit the\n // string children verbatim instead. This path is used by the chrome-\n // extension import flow to inject `@font-face` rules captured from the\n // source page (`HtmlToMenoConverter.convertHtmlStringToMeno`).\n const isRawTextElement = tag.toLowerCase() === 'style' || tag.toLowerCase() === 'script';\n let childrenHTML: string;\n if (isRawTextElement) {\n const flatten = (node: ComponentNode | ComponentNode[] | string | number | null | undefined): string => {\n if (node == null) return '';\n if (typeof node === 'string') return node;\n if (typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(flatten).join('');\n // Verbatim-code markers ({ _code, expr }) are silent by design \u2014 they\n // render natively in the Astro build and have nothing to emit in\n // meno-core SSR (mirrors the renderNode top-level handling).\n if ((node as { _code?: unknown })._code === true) return '';\n // Raw-text elements can't contain child elements, so any other object\n // child is dropped from the output \u2014 correct per HTML semantics, but\n // authored content vanishing should be visible, so surface the drop.\n logRuntimeError(\n 'ssrRenderer.renderHtmlElement',\n new Error(`Element child dropped inside <${tag}> \u2014 raw-text elements render only string content`),\n { tag, droppedNodeType: String((node as { type?: unknown }).type ?? typeof node) },\n );\n return '';\n };\n childrenHTML = flatten(children as any);\n } else {\n childrenHTML = Array.isArray(children)\n ? (\n await Promise.all(\n (children as (ComponentNode | string)[]).map((child, index) => {\n const childPath = ctx.elementPath ? [...ctx.elementPath, index] : [index];\n return renderNode(child, { ...ctx, elementPath: childPath });\n }),\n )\n ).join('')\n : await renderNode(children as ComponentNode, {\n ...ctx,\n elementPath: ctx.elementPath ? [...ctx.elementPath, 0] : [0],\n });\n }\n\n const ea = editorAttrs(ctx);\n\n // Self-closing tags\n const voidElements = [\n 'img',\n 'input',\n 'br',\n 'hr',\n 'meta',\n 'link',\n 'area',\n 'base',\n 'col',\n 'embed',\n 'source',\n 'track',\n 'wbr',\n ];\n if (voidElements.includes(tag.toLowerCase())) {\n // Special handling for img tags - inject srcset and render as <picture> when AVIF available\n if (tag.toLowerCase() === 'img') {\n return renderImageElement(propsWithStyleAndAttrs, classAttr, styleAttr, attrs + ea, ctx);\n }\n\n return `<${tag}${classAttr}${styleAttr}${attrs}${ea} />`;\n }\n\n return `<${tag}${classAttr}${styleAttr}${attrs}${ea}>${childrenHTML}</${tag}>`;\n}\n\n/**\n * Render an image element with responsive image support\n */\nfunction renderImageElement(\n propsWithStyleAndAttrs: Record<string, unknown>,\n classAttr: string,\n styleAttr: string,\n attrs: string,\n ctx: SSRContext,\n): string {\n const imgProps = propsWithStyleAndAttrs;\n const src = imgProps.src as string | undefined;\n const alt = imgProps.alt as string | undefined;\n const loading = imgProps.loading as string | undefined;\n const sizes = imgProps.sizes as string | undefined;\n const fetchpriority = imgProps.fetchpriority as string | undefined;\n const width = imgProps.width as string | number | undefined;\n const height = imgProps.height as string | number | undefined;\n\n // Get image metadata from manifest\n const metadata = src ? ctx.imageMetadataMap?.get(src) : undefined;\n\n // Note: we intentionally do NOT inject width/height from metadata.\n // CSS classes handle sizing, and injecting intrinsic dimensions breaks layout.\n\n // Determine sizes attribute (prop > default)\n const sizesAttr = sizes || DEFAULT_SIZES;\n\n // Collect high-priority images for preloading in head\n if (fetchpriority === 'high' && metadata && ctx.preloadImages) {\n // Prefer AVIF when format allows, fallback to WebP\n if (metadata.avifSrcset && ctx.imageFormat !== 'webp') {\n ctx.preloadImages.push({\n srcset: metadata.avifSrcset,\n type: 'image/avif',\n sizes: sizesAttr,\n });\n } else if (metadata.srcset) {\n ctx.preloadImages.push({\n srcset: metadata.srcset,\n type: 'image/webp',\n sizes: sizesAttr,\n });\n }\n }\n\n // Build img attributes\n let imgAttrs = '';\n if (src) imgAttrs += ` src=\"${escapeHtml(String(src))}\"`;\n if (alt !== undefined) imgAttrs += ` alt=\"${escapeHtml(String(alt))}\"`;\n if (fetchpriority) imgAttrs += ` fetchpriority=\"${escapeHtml(String(fetchpriority))}\"`;\n if (loading) imgAttrs += ` loading=\"${escapeHtml(String(loading))}\"`;\n\n if (width !== undefined) imgAttrs += ` width=\"${escapeHtml(String(width))}\"`;\n if (height !== undefined) imgAttrs += ` height=\"${escapeHtml(String(height))}\"`;\n\n // Render as <picture> element if AVIF is available and imageFormat is 'avif'\n // Layout classes go on <picture> (block container), image-specific classes on <img>\n if (metadata?.avifSrcset && ctx.imageFormat !== 'webp') {\n // Image-specific class prefixes that should stay on <img>\n const imgClassPrefixes = [\n 'objf-',\n 'objp-',\n 'flt-',\n 'tm-',\n 'bs-',\n 'br-',\n 'bt-',\n 'bb-',\n 'bl-',\n 'border-r-',\n 'bc-',\n 'b-',\n ];\n // Opacity classes (o-NUMBER) go on img, but overflow (o-h, o-a, o-s, o-v) stays on picture\n const opacityPattern = /^o-\\d/;\n\n const classMatch = classAttr.match(/class=\"([^\"]*)\"/);\n const allClasses = classMatch ? (classMatch[1] ?? '').split(/\\s+/).filter(Boolean) : [];\n\n const imgClasses: string[] = [];\n const pictureClasses: string[] = [];\n\n for (const cls of allClasses) {\n if (imgClassPrefixes.some((prefix) => cls.startsWith(prefix)) || opacityPattern.test(cls)) {\n imgClasses.push(cls);\n } else {\n pictureClasses.push(cls);\n }\n }\n\n const pictureClassAttr = pictureClasses.length > 0 ? ` class=\"${escapeHtml(pictureClasses.join(' '))}\"` : '';\n const imgClassAttr = imgClasses.length > 0 ? ` class=\"${escapeHtml(imgClasses.join(' '))}\"` : '';\n\n return (\n `<picture${pictureClassAttr}${styleAttr}>` +\n `<source type=\"image/avif\" srcset=\"${escapeHtml(metadata.avifSrcset)}\" sizes=\"${escapeHtml(sizesAttr)}\" />` +\n `<source type=\"image/webp\" srcset=\"${escapeHtml(metadata.srcset)}\" sizes=\"${escapeHtml(sizesAttr)}\" />` +\n `<img${imgClassAttr}${imgAttrs}${attrs} />` +\n `</picture>`\n );\n }\n\n // Fallback: regular img with WebP srcset\n if (metadata?.srcset) {\n imgAttrs += ` srcset=\"${escapeHtml(metadata.srcset)}\"`;\n imgAttrs += ` sizes=\"${escapeHtml(sizesAttr)}\"`;\n }\n\n return `<img${classAttr}${styleAttr}${imgAttrs}${attrs} />`;\n}\n\n/**\n * Render a locale list node (language switcher)\n */\nfunction renderLocaleList(node: import('../../shared/types').LocaleListNode, ctx: SSRContext): string {\n const { slugMappings, pagePath, i18nConfig, locale } = ctx;\n\n if (slugMappings && pagePath && i18nConfig && locale) {\n const slugIndex = buildSlugIndex(slugMappings);\n const localeLinks = getLocaleLinks(pagePath, locale, i18nConfig, slugIndex);\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 const nodeStyle = node.style;\n\n // Build a map of locale code to icon for quick lookup\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 const localeStyleOpts = {\n fluidActive: ctx.responsiveScales?.enabled === true && ctx.responsiveScales?.mode === 'fluid',\n responsiveScales: ctx.responsiveScales,\n };\n\n // Convert container styles to utility classes\n let containerClasses: string[] = [];\n if (nodeStyle) {\n containerClasses = responsiveStylesToClasses(nodeStyle as ResponsiveStyleObject, localeStyleOpts);\n }\n\n // Handle interactive styles for locale-list wrapper\n const localeListInteractiveStyles = node.interactiveStyles as InteractiveStyles | undefined;\n const localeListGenerateElementClass = node.generateElementClass;\n let localeListCssVariables: Record<string, string> = {};\n let localeListStyleAttr = '';\n\n if ((localeListInteractiveStyles && localeListInteractiveStyles.length > 0) || localeListGenerateElementClass) {\n const elementClass = buildNodeElementClass(ctx, node.label);\n containerClasses.unshift(elementClass);\n\n if (localeListInteractiveStyles && localeListInteractiveStyles.length > 0) {\n localeListCssVariables = registerInteractiveStyles(ctx, elementClass, localeListInteractiveStyles);\n }\n localeListStyleAttr = buildCssVariableStyleAttr(localeListCssVariables);\n }\n\n const containerClassAttr = containerClasses.length > 0 ? ` class=\"${escapeHtml(containerClasses.join(' '))}\"` : '';\n\n // Convert item styles to utility classes\n let itemClasses: string[] = [];\n if (node.itemStyle) {\n itemClasses = responsiveStylesToClasses(node.itemStyle as ResponsiveStyleObject, localeStyleOpts);\n }\n const itemClassAttr = itemClasses.length > 0 ? ` class=\"${escapeHtml(itemClasses.join(' '))}\"` : '';\n\n // Convert active item styles to utility classes\n let activeItemClasses: string[] = [];\n if (node.activeItemStyle) {\n activeItemClasses = responsiveStylesToClasses(node.activeItemStyle as ResponsiveStyleObject, localeStyleOpts);\n }\n\n // Convert separator styles to utility classes\n let separatorClasses: string[] = [];\n if (node.separatorStyle) {\n separatorClasses = responsiveStylesToClasses(node.separatorStyle as ResponsiveStyleObject, localeStyleOpts);\n }\n const separatorClassAttr = separatorClasses.length > 0 ? ` class=\"${escapeHtml(separatorClasses.join(' '))}\"` : '';\n\n // Convert flag styles to utility classes\n let flagClasses: string[] = [];\n if (node.flagStyle) {\n flagClasses = responsiveStylesToClasses(node.flagStyle as ResponsiveStyleObject, localeStyleOpts);\n }\n const flagClassAttr = flagClasses.length > 0 ? ` class=\"${escapeHtml(flagClasses.join(' '))}\"` : '';\n\n // Current item gets both itemStyle + activeItemStyle (additive/override)\n const currentItemClasses = [...itemClasses, ...activeItemClasses];\n const currentItemClassAttr =\n currentItemClasses.length > 0 ? ` class=\"${escapeHtml(currentItemClasses.join(' '))}\"` : '';\n\n // Build links HTML\n const links: string[] = [];\n for (const link of localeLinks) {\n if (!showCurrent && link.isCurrent) continue;\n const currentAttr = link.isCurrent ? ' data-current=\"true\"' : ' data-current=\"false\"';\n const classAttrForLink = link.isCurrent ? currentItemClassAttr : itemClassAttr;\n const hreflangAttr = ` hreflang=\"${escapeHtml(link.langTag)}\"`;\n\n // Build link content with optional flag icon + text in div\n let linkContent = '';\n const localeIcon = localeIconMap.get(link.locale);\n if (showFlag && localeIcon) {\n linkContent += `<img src=\"${escapeHtml(localeIcon)}\" alt=\"${escapeHtml(link.nativeName)} flag\"${flagClassAttr}>`;\n }\n\n // Get display text based on displayType\n let displayText: string;\n switch (displayType) {\n case 'code':\n displayText = link.locale.toUpperCase();\n break;\n case 'name':\n displayText = link.name;\n break;\n default:\n displayText = link.nativeName;\n break;\n }\n linkContent += `<div>${escapeHtml(displayText)}</div>`;\n\n links.push(\n `<a href=\"${escapeHtml(link.path)}\"${hreflangAttr}${currentAttr} data-locale=\"${escapeHtml(link.locale)}\"${classAttrForLink}>${linkContent}</a>`,\n );\n }\n\n // Join links with separator (empty span styled via separatorStyle) or concatenate directly\n const linksHTML = showSeparator ? links.join(`<span${separatorClassAttr}></span>`) : links.join('');\n\n // Extract attributes from node\n const nodeAttributes = resolveI18nAttrs(extractAttributesFromNode(node), locale, i18nConfig);\n const attrsStr = buildAttributes(nodeAttributes);\n\n const localeListResult = `<div data-locale-list=\"true\"${containerClassAttr}${localeListStyleAttr}${attrsStr}${editorAttrs(ctx)}>${linksHTML}</div>`;\n\n // Store SSR fallback for Astro export (locale-list nodes can't be expressed as static Astro components)\n if (ctx.ssrFallbackCollector && ctx.elementPath) {\n ctx.ssrFallbackCollector.set(ctx.elementPath.join('.'), localeListResult);\n }\n\n return localeListResult;\n }\n // If context is missing, return empty div\n return '<div data-locale-list=\"true\"></div>';\n}\n\n/**\n * Main SSR render function - generates complete HTML with pre-rendered content\n */\nexport async function renderPageSSR(\n pageData: JSONPage,\n globalComponents: Record<string, ComponentDefinition> = {},\n pagePath: string = '/',\n baseUrl: string = '',\n locale?: string,\n i18nConfig?: I18nConfig,\n slugMappings?: SlugMap[],\n cmsContext?: CMSContext,\n cmsService?: CMSService,\n isProductionBuild?: boolean,\n injectEditorAttrs?: boolean,\n): Promise<{\n html: string;\n meta: string;\n title: string;\n javascript: string;\n componentCSS?: string;\n locale: string;\n interactiveStylesMap: Map<string, InteractiveStyles>;\n preloadImages: PreloadImage[];\n neededCollections: Set<string>;\n ssrFallbackCollector: Map<string, string>;\n processedRawHtmlCollector: Map<string, string>;\n}> {\n // Extract page content\n const rootNode = pageData?.root || undefined;\n if (!rootNode) {\n throw new Error('Page data must have a root node');\n }\n\n // Load i18n config if not provided\n const config = i18nConfig || (await loadI18nConfig());\n\n // Extract locale from path if not explicitly provided\n const { locale: pathLocale, pathWithoutLocale: _pathWithoutLocale } = extractLocaleFromPath(pagePath, config);\n const effectiveLocale = locale || pathLocale || config.defaultLocale;\n\n // Extract meta information and process CMS templates in meta\n let meta = extractPageMeta(pageData);\n if (cmsContext?.cms) {\n // Process CMS templates in meta fields (with i18n support)\n if (typeof meta.title === 'string') {\n meta = { ...meta, title: processCMSTemplate(meta.title, cmsContext.cms, effectiveLocale, config) };\n }\n if (typeof meta.description === 'string') {\n meta = { ...meta, description: processCMSTemplate(meta.description, cmsContext.cms, effectiveLocale, config) };\n }\n if (typeof meta.ogTitle === 'string') {\n meta = { ...meta, ogTitle: processCMSTemplate(meta.ogTitle, cmsContext.cms, effectiveLocale, config) };\n }\n if (typeof meta.ogDescription === 'string') {\n meta = {\n ...meta,\n ogDescription: processCMSTemplate(meta.ogDescription, cmsContext.cms, effectiveLocale, config),\n };\n }\n if (typeof meta.ogImage === 'string') {\n meta = { ...meta, ogImage: processCMSTemplate(meta.ogImage, cmsContext.cms, effectiveLocale, config) };\n }\n }\n\n const pageComponents = pageData?.components || {};\n\n // Render the component tree to HTML with i18n and CMS support\n // Also collect interactive styles, preload images, and needed collections during render\n // (rootNode is guaranteed non-null \u2014 the guard at the top of this function throws otherwise)\n const {\n html: contentHTML,\n interactiveStylesMap,\n preloadImages,\n neededCollections,\n ssrFallbackCollector,\n processedRawHtmlCollector,\n } = await buildComponentHTML(\n rootNode,\n globalComponents,\n pageComponents,\n effectiveLocale,\n config,\n slugMappings,\n pagePath,\n cmsContext,\n cmsService,\n isProductionBuild,\n injectEditorAttrs,\n );\n\n // Collect JavaScript and CSS from all components\n const javascript = await collectComponentJavaScript(globalComponents, pageComponents);\n const componentCSS = collectComponentCSS(globalComponents, pageComponents);\n\n // Build full URL for meta tags\n const fullUrl = baseUrl ? `${baseUrl}${pagePath}` : pagePath;\n\n // Generate meta tags with i18n resolution and hreflang tags\n const metaTags = generateMetaTags(meta, fullUrl, effectiveLocale, config, {\n slugMappings,\n pagePath,\n baseUrl,\n social: configService.getSocial(),\n });\n\n // Resolve title for use in HTML template\n const resolvedTitle = resolveI18nValue(meta.title, effectiveLocale, config);\n\n // Return pre-rendered HTML (will be injected into template)\n return {\n html: contentHTML,\n meta: metaTags,\n title: typeof resolvedTitle === 'string' ? resolvedTitle : 'UPLO',\n javascript,\n // Component CSS is still included in the final HTML document\n componentCSS,\n locale: effectiveLocale,\n interactiveStylesMap,\n preloadImages,\n neededCollections,\n ssrFallbackCollector,\n processedRawHtmlCollector,\n };\n}\n", "/**\n * Build-time validation tool\n * Scans all rendered HTML and warns about styles that don't generate utility classes\n */\n\nimport type { StyleObject, ResponsiveStyleObject } from '../shared/types';\n\ninterface MissingStyleReport {\n property: string;\n value: string;\n locations: string[];\n count: number;\n}\n\n// Track missing styles\nconst missingStylesMap = new Map<string, MissingStyleReport>();\n\n/**\n * Check if a style property and value can be converted to a utility class\n *\n * All CSS properties now generate utility classes:\n * - Known properties (in propertyMap) use standard prefixes\n * - Unknown properties generate dynamic classes with auto-prefixes\n */\nfunction canGenerateClass(property: string, value: unknown): boolean {\n // Skip internal component properties that shouldn't be styles\n const internalProps = new Set([\n 'type',\n 'tag',\n 'props',\n 'component',\n 'children',\n 'id',\n 'key',\n 'ref',\n 'className',\n 'style',\n 'node',\n ]);\n\n if (internalProps.has(property)) {\n return true; // Skip reporting these - they're not CSS styles\n }\n\n // Skip if value is null, undefined, or empty - these don't need utility classes\n if (value === null || value === undefined || value === '') {\n return true; // Skip reporting - nothing to convert\n }\n\n // Try to convert to string and check\n const strValue = String(value).trim();\n if (!strValue) {\n return false;\n }\n\n // Object values cannot be converted to utility classes\n if (typeof value === 'object') {\n return false;\n }\n\n // All CSS properties (including unknown ones) now generate utility classes:\n // - Known properties use standard prefixes from propertyMap\n // - Unknown properties generate dynamic classes registered in the dynamic registry\n // - CSS var() calls, space-separated values, and functions are all handled\n return true;\n}\n\n/**\n * Validate a style object and report missing utility class coverage\n */\nexport function validateStyleCoverage(styles: StyleObject | ResponsiveStyleObject | undefined, location: string): void {\n if (!styles || typeof styles !== 'object') {\n return;\n }\n\n // Check if it's a responsive style object\n if ('base' in styles || 'tablet' in styles || 'mobile' in styles) {\n // Process each breakpoint\n const responsive = styles as ResponsiveStyleObject;\n for (const [breakpoint, breakpointStyles] of Object.entries(responsive)) {\n if (typeof breakpointStyles === 'object' && breakpointStyles !== null) {\n validateStyleCoverage(breakpointStyles, `${location} (${breakpoint})`);\n }\n }\n return;\n }\n\n // Process regular style object\n const styleObj = styles as StyleObject;\n for (const [property, value] of Object.entries(styleObj)) {\n if (!canGenerateClass(property, value)) {\n const key = `${property}:${String(value)}`;\n const existing = missingStylesMap.get(key);\n\n if (existing) {\n existing.count++;\n existing.locations.push(location);\n } else {\n missingStylesMap.set(key, {\n property,\n value: String(value),\n locations: [location],\n count: 1,\n });\n }\n }\n }\n}\n\n/**\n * Print warnings for all missing utility class mappings found during build\n */\nexport function printMissingStyleWarnings(verbose = false): void {\n if (missingStylesMap.size === 0) {\n return;\n }\n\n const warnings: string[] = [];\n warnings.push('\\n\u26A0\uFE0F WARNING: Found styles that cannot be converted to utility classes\\n');\n warnings.push('These styles use object values which cannot be serialized to class names:\\n');\n\n // Sort by frequency\n const sorted = Array.from(missingStylesMap.values()).sort((a, b) => b.count - a.count);\n\n for (const report of sorted) {\n warnings.push(\n ` \u2022 ${report.property}: \"${report.value}\" (used ${report.count} time${report.count > 1 ? 's' : ''})`,\n );\n\n if (verbose && report.locations.length > 0) {\n for (const location of report.locations.slice(0, 3)) {\n warnings.push(` \u2514\u2500 ${location}`);\n }\n if (report.locations.length > 3) {\n warnings.push(` \u2514\u2500 ... and ${report.locations.length - 3} more locations`);\n }\n }\n }\n\n warnings.push('\\n\uD83D\uDCA1 Note:');\n warnings.push(' \u2022 All string/number values are now converted to utility classes');\n warnings.push(' \u2022 Object values (non-primitive) cannot be converted and will remain as-is');\n warnings.push(' \u2022 This warning only appears for object-type style values\\n');\n\n console.warn(warnings.join('\\n'));\n}\n\n/**\n * Reset the validation state (useful for testing)\n */\nexport function resetValidation(): void {\n missingStylesMap.clear();\n}\n\n/**\n * Get all missing styles found during validation\n */\nexport function getMissingStyles(): MissingStyleReport[] {\n return Array.from(missingStylesMap.values());\n}\n", "/**\n * HTML attribute building utilities for SSR\n * Pure functions with no external dependencies\n */\n\nimport { rewriteViewportUnits } from '../../shared/viewportUnits';\n\n/**\n * Escape HTML special characters to prevent XSS\n */\nexport function escapeHtml(unsafe: string): string {\n // Handle non-string values defensively\n if (typeof unsafe !== 'string') {\n if (unsafe === null || unsafe === undefined) {\n return '';\n }\n // Convert arrays/objects/numbers to string\n unsafe = String(unsafe);\n }\n return unsafe\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\n/** HTML attributes that must NOT be kebab-cased (single-word or special casing) */\nconst NO_KEBAB_ATTRS = new Set([\n 'autoplay',\n 'playsinline',\n 'crossorigin',\n 'novalidate',\n 'readonly',\n 'nomodule',\n 'formnovalidate',\n 'ismap',\n 'usemap',\n 'srcset',\n 'inputmode',\n 'enterkeyhint',\n 'autocomplete',\n 'autofocus',\n 'contenteditable',\n]);\n\n/**\n * Build HTML attributes string from props (excluding style and other special props)\n */\nexport function buildAttributes(props: Record<string, unknown>, exclude: string[] = []): string {\n const attrs: string[] = [];\n // Internal props that should never be rendered as HTML attributes\n // Note: image-specific props (src, alt, loading, width, height, sizes, srcset, fetchpriority)\n // are NOT excluded here - they're only excluded for <img> tags via the exclude parameter\n const internalProps = ['tag', 'component', 'props', 'children'];\n const defaultExclude = [...internalProps, ...exclude];\n\n // Regex to detect unresolved template strings like {{link.target}}\n // But NOT item templates like {{item.field}} or {{post.field}} - those should be preserved for client-side rendering\n const unresolvedTemplatePattern = /^\\{\\{(?!item\\.|[a-z]+Index|[a-z]+First|[a-z]+Last).+\\}\\}$/;\n\n for (const [key, value] of Object.entries(props)) {\n if (defaultExclude.includes(key)) continue;\n if (value === null || value === undefined) continue;\n if (typeof value === 'function') continue; // Skip event handlers in SSR\n if (typeof value === 'object') continue; // Skip objects (prevents [object Object] in attributes)\n // Skip unresolved template strings (e.g., {{link.target}} when link.target is undefined)\n // BUT keep item templates like {{item.field}} for client-side dynamic rendering\n if (typeof value === 'string' && unresolvedTemplatePattern.test(value)) continue;\n\n // Convert camelCase to kebab-case for HTML attributes,\n // but preserve non-kebab HTML attributes (autoplay, playsinline, etc.)\n const attrName = NO_KEBAB_ATTRS.has(key.toLowerCase())\n ? key.toLowerCase()\n : key.replace(/([A-Z])/g, '-$1').toLowerCase();\n const attrValue = typeof value === 'boolean' ? (value ? '' : undefined) : escapeHtml(String(value));\n\n if (attrValue !== undefined) {\n if (typeof value === 'boolean' && value) {\n attrs.push(attrName);\n } else {\n attrs.push(`${attrName}=\"${attrValue}\"`);\n }\n }\n }\n\n return attrs.length > 0 ? ` ${attrs.join(' ')}` : '';\n}\n\n/**\n * Build the editor-only attribute string used by XRay and selection sync.\n * Mirrors what client-side ComponentBuilder.ts writes via ref callbacks.\n * Returns a leading-space-prefixed attribute string, or '' when there's\n * nothing to emit (or no elementPath supplied).\n */\nexport function buildEditorAttrs(opts: {\n elementPath?: number[];\n cmsItemIndexPath?: number[];\n cmsListPaths?: number[][];\n componentContext?: string;\n parentComponentName?: string;\n isComponentRoot?: boolean;\n isSlotContent?: boolean;\n isCMSListContainer?: boolean;\n}): string {\n const { elementPath } = opts;\n if (!elementPath) return '';\n\n const parts: string[] = [`data-element-path=\"${escapeHtml(elementPath.join(','))}\"`];\n\n if (opts.cmsItemIndexPath && opts.cmsItemIndexPath.length > 0) {\n parts.push(`data-cms-item-index=\"${escapeHtml(opts.cmsItemIndexPath.join('.'))}\"`);\n if (opts.cmsListPaths && opts.cmsListPaths.length === opts.cmsItemIndexPath.length) {\n const ctx = JSON.stringify({ itemIndexPath: opts.cmsItemIndexPath, listPaths: opts.cmsListPaths });\n parts.push(`data-cms-context=\"${escapeHtml(ctx)}\"`);\n }\n }\n\n if (opts.isCMSListContainer) parts.push(`data-cms-list=\"true\"`);\n if (opts.isComponentRoot) parts.push(`data-component-root=\"true\"`);\n if (opts.parentComponentName) {\n parts.push(`data-parent-component=\"${escapeHtml(opts.parentComponentName)}\"`);\n }\n if (opts.componentContext && !opts.isSlotContent) {\n parts.push(`data-component-context=\"${escapeHtml(opts.componentContext)}\"`);\n }\n\n return ` ${parts.join(' ')}`;\n}\n\n/**\n * Convert a style object to inline CSS string\n * Handles CSS variables (--is-0: value) and regular properties\n */\nexport function styleToString(style: Record<string, string | number> | undefined): string {\n if (!style || Object.keys(style).length === 0) return '';\n\n const declarations: string[] = [];\n for (const [key, value] of Object.entries(style)) {\n if (value === null || value === undefined) continue;\n\n // Route every value through the viewport-unit rewriter so design-canvas\n // mode can pin vh/vw to a stable px value. See viewportUnits.ts.\n const rewritten = rewriteViewportUnits(String(value));\n\n // Handle CSS variables (already in kebab-case with -- prefix)\n if (key.startsWith('--')) {\n declarations.push(`${key}: ${escapeHtml(rewritten)}`);\n } else {\n // Convert camelCase to kebab-case for regular CSS properties\n const cssProperty = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n declarations.push(`${cssProperty}: ${escapeHtml(rewritten)}`);\n }\n }\n\n return declarations.length > 0 ? declarations.join('; ') : '';\n}\n", "/**\n * Meta tag generation for SSR\n * Handles SEO meta information extraction and HTML generation\n */\n\nimport type { JSONPage } from '../../shared/types';\nimport type { I18nConfig } from '../../shared/types/components';\nimport { DEFAULT_I18N_CONFIG, resolveI18nValue } from '../../shared/i18n';\nimport { escapeHtml } from './attributeBuilder';\nimport { buildSlugIndex, getLocaleLinks, type SlugMap } from '../../shared/slugTranslator';\n\n/**\n * Page meta information for SEO\n * Values can be strings or i18n objects - resolved in generateMetaTags\n */\nexport interface PageMeta {\n title?: unknown;\n description?: unknown;\n keywords?: unknown;\n ogTitle?: unknown;\n ogDescription?: unknown;\n ogImage?: unknown;\n ogType?: unknown;\n}\n\nexport function extractPageMeta(pageData: JSONPage): PageMeta {\n const meta: PageMeta = {};\n\n if (pageData?.meta) {\n meta.title = pageData.meta.title;\n meta.description = pageData.meta.description;\n meta.keywords = pageData.meta.keywords;\n meta.ogTitle = pageData.meta.ogTitle || pageData.meta.title;\n meta.ogDescription = pageData.meta.ogDescription || pageData.meta.description;\n meta.ogImage = pageData.meta.ogImage;\n meta.ogType = pageData.meta.ogType || 'website';\n }\n\n return meta;\n}\n\n/**\n * Site-wide social configuration\n */\nexport interface SocialOptions {\n twitterHandle?: string;\n}\n\n/**\n * Normalize an og:image URL for social-card crawlers:\n * - Swap project-local /images/*.webp|.avif \u2192 .jpg (companion produced at upload time)\n * - Prepend baseUrl when the value is a project-relative path\n */\nfunction normalizeOgImageUrl(value: string, baseUrl?: string): string {\n if (!value) return value;\n let out = value;\n if (/^\\/images\\/[^?#]+\\.(webp|avif)(\\?|#|$)/i.test(out)) {\n out = out.replace(/\\.(webp|avif)(?=\\?|#|$)/i, '.jpg');\n }\n if (baseUrl && out.startsWith('/')) {\n out = `${baseUrl.replace(/\\/$/, '')}${out}`;\n }\n return out;\n}\n\n/**\n * Options for meta tag generation (hreflang + social)\n */\nexport interface MetaTagOptions {\n slugMappings?: SlugMap[];\n pagePath?: string;\n baseUrl?: string;\n social?: SocialOptions;\n}\n\n/**\n * Generate HTML meta tags string\n * Resolves i18n values using the provided locale and config\n * Optionally generates hreflang tags for multilingual pages\n */\nexport function generateMetaTags(\n meta: PageMeta,\n url: string = '',\n locale: string = 'en',\n config: I18nConfig = DEFAULT_I18N_CONFIG,\n options?: MetaTagOptions,\n): string {\n const tags: string[] = [];\n\n // Helper to resolve i18n values and ensure string type\n const resolve = (value: unknown): string => {\n const resolved = resolveI18nValue(value, locale, config);\n return typeof resolved === 'string' ? resolved : '';\n };\n\n const title = resolve(meta.title);\n const description = resolve(meta.description);\n const keywords = resolve(meta.keywords);\n const ogTitle = resolve(meta.ogTitle) || title;\n const ogDescription = resolve(meta.ogDescription) || description;\n const ogImage = resolve(meta.ogImage);\n const ogType = resolve(meta.ogType);\n\n if (title) {\n tags.push(`<title>${escapeHtml(title)}</title>`);\n }\n\n if (description) {\n tags.push(`<meta name=\"description\" content=\"${escapeHtml(description)}\" />`);\n }\n\n if (keywords) {\n tags.push(`<meta name=\"keywords\" content=\"${escapeHtml(keywords)}\" />`);\n }\n\n // Open Graph tags\n if (ogTitle) {\n tags.push(`<meta property=\"og:title\" content=\"${escapeHtml(ogTitle)}\" />`);\n }\n\n if (ogDescription) {\n tags.push(`<meta property=\"og:description\" content=\"${escapeHtml(ogDescription)}\" />`);\n }\n\n if (ogImage) {\n const normalizedOgImage = normalizeOgImageUrl(ogImage, options?.baseUrl);\n tags.push(`<meta property=\"og:image\" content=\"${escapeHtml(normalizedOgImage)}\" />`);\n }\n\n if (ogType) {\n tags.push(`<meta property=\"og:type\" content=\"${escapeHtml(ogType)}\" />`);\n }\n\n if (url) {\n tags.push(`<meta property=\"og:url\" content=\"${escapeHtml(url)}\" />`);\n }\n\n // Twitter Card tags - Twitter falls back to og:image/og:title/og:description when twitter:* is absent\n const hasAnyMeta = title || description || ogImage || ogTitle || ogDescription;\n if (hasAnyMeta) {\n const cardType = ogImage ? 'summary_large_image' : 'summary';\n tags.push(`<meta name=\"twitter:card\" content=\"${cardType}\" />`);\n }\n\n if (ogTitle) {\n tags.push(`<meta name=\"twitter:title\" content=\"${escapeHtml(ogTitle)}\" />`);\n }\n\n if (ogDescription) {\n tags.push(`<meta name=\"twitter:description\" content=\"${escapeHtml(ogDescription)}\" />`);\n }\n\n const rawHandle = options?.social?.twitterHandle?.trim();\n if (rawHandle) {\n const handle = rawHandle.startsWith('@') ? rawHandle : `@${rawHandle}`;\n tags.push(`<meta name=\"twitter:site\" content=\"${escapeHtml(handle)}\" />`);\n tags.push(`<meta name=\"twitter:creator\" content=\"${escapeHtml(handle)}\" />`);\n }\n\n // Canonical URL\n if (url) {\n tags.push(`<link rel=\"canonical\" href=\"${escapeHtml(url)}\" />`);\n }\n\n // Hreflang tags for multilingual pages\n if (options?.slugMappings && options.slugMappings.length > 0 && config.locales.length > 1) {\n const { slugMappings, pagePath = '/', baseUrl = '' } = options;\n const slugIndex = buildSlugIndex(slugMappings);\n const localeLinks = getLocaleLinks(pagePath, locale, config, slugIndex);\n\n for (const link of localeLinks) {\n const hrefUrl = baseUrl ? `${baseUrl}${link.path}` : link.path;\n tags.push(`<link rel=\"alternate\" hreflang=\"${escapeHtml(link.langTag)}\" href=\"${escapeHtml(hrefUrl)}\" />`);\n }\n\n // Add x-default pointing to default locale version\n const defaultLink = localeLinks.find((l) => l.locale === config.defaultLocale);\n if (defaultLink) {\n const xDefaultUrl = baseUrl ? `${baseUrl}${defaultLink.path}` : defaultLink.path;\n tags.push(`<link rel=\"alternate\" hreflang=\"x-default\" href=\"${escapeHtml(xDefaultUrl)}\" />`);\n }\n }\n\n return tags.join('\\n ');\n}\n", "/**\n * CSS collection utilities for SSR\n * Collects CSS from component definitions\n */\n\nimport type { ComponentDefinition } from '../../shared/types';\n\n/**\n * Collect CSS code from all components (global and page-specific)\n */\nexport function collectComponentCSS(\n globalComponents: Record<string, ComponentDefinition> = {},\n pageComponents: Record<string, ComponentDefinition> = {},\n): string {\n const cssBlocks: string[] = [];\n\n // Collect CSS from global components\n for (const [name, component] of Object.entries(globalComponents)) {\n if (component?.component?.css) {\n cssBlocks.push(`/* Component: ${name} */\\n${component.component.css}`);\n }\n }\n\n // Collect CSS from page-specific components\n for (const [name, component] of Object.entries(pageComponents)) {\n // Skip if already collected from global components\n if (!globalComponents[name] && component?.component?.css) {\n cssBlocks.push(`/* Component: ${name} */\\n${component.component.css}`);\n }\n }\n\n return cssBlocks.join('\\n\\n');\n}\n", "/**\n * JavaScript collection utilities for SSR\n * Collects and wraps component JavaScript with defineVars support\n */\n\nimport type { ComponentDefinition } from '../../shared/types';\nimport { validateJS as runtimeValidateJS } from '../runtime';\n\n/**\n * Validate JavaScript syntax using runtime bundler\n * Returns error message if invalid, null if valid\n */\nasync function validateJS(code: string): Promise<string | null> {\n return runtimeValidateJS(code);\n}\n\n/**\n * Runtime helper for defineVars - initializes components with their props\n * Injected once when any component uses defineVars\n */\nconst DEFINE_VARS_RUNTIME = `(function() {\n var __meno = window.__meno || (window.__meno = {});\n __meno.initComponent = function(name, fn) {\n var elements = document.querySelectorAll('[data-component~=\"' + name + '\"]');\n elements.forEach(function(el) {\n var propsStr = el.getAttribute('data-props');\n var allProps = propsStr ? JSON.parse(propsStr) : {};\n var props = allProps[name] || {};\n fn(el, props);\n });\n };\n})();`;\n\n/**\n * Generate destructure statement for defineVars\n */\nfunction generateDestructure(defineVars: true | string[], interfaceDef?: Record<string, unknown>): string {\n const vars = defineVars === true ? Object.keys(interfaceDef || {}) : defineVars;\n if (vars.length === 0) return '';\n return `var {${vars.join(', ')}} = props;`;\n}\n\n/**\n * Callback for component JS validation errors\n */\nexport type JSErrorCallback = (componentName: string, error: string) => void;\n\n/**\n * Cache for validated component JS\n * Maps component name -> validation result (null=valid, string=error)\n * This prevents re-validating the same component for every page\n */\nconst validationCache = new Map<string, string | null>();\n\n/**\n * Collected JS validation errors (componentName -> error message)\n */\nconst collectedErrors = new Map<string, string>();\n\n/**\n * Clear the validation cache and collected errors (call at start of build)\n */\nexport function clearJSValidationCache(): void {\n validationCache.clear();\n collectedErrors.clear();\n}\n\n/**\n * Get all collected JS validation errors\n * Returns array of { component, error } objects\n */\nexport function getJSValidationErrors(): Array<{ component: string; error: string }> {\n return Array.from(collectedErrors.entries()).map(([component, error]) => ({\n component,\n error,\n }));\n}\n\n/**\n * Collect JavaScript code from all components (global and page-specific)\n * Wraps defineVars components with initComponent pattern\n * Validates each component's JS individually and reports errors via callback\n */\nexport async function collectComponentJavaScript(\n globalComponents: Record<string, ComponentDefinition> = {},\n pageComponents: Record<string, ComponentDefinition> = {},\n onError?: JSErrorCallback,\n): Promise<string> {\n const jsCodeBlocks: string[] = [];\n let hasDefineVars = false;\n\n // Helper to process a component's JavaScript\n const processComponent = async (name: string, component: ComponentDefinition) => {\n if (!component?.component?.javascript) return;\n\n const js = component.component.javascript;\n const defineVars = component.component.defineVars;\n\n // Check cache first to avoid re-validating\n let error: string | null;\n if (validationCache.has(name)) {\n error = validationCache.get(name)!;\n } else {\n error = await validateJS(js);\n validationCache.set(name, error);\n }\n\n if (error) {\n // Collect error internally (for build-static.ts to retrieve)\n if (!collectedErrors.has(name)) {\n collectedErrors.set(name, error);\n }\n onError?.(name, error);\n return; // Skip this component's JS\n }\n\n if (defineVars) {\n hasDefineVars = true;\n const destructure = generateDestructure(defineVars, component.component.interface);\n jsCodeBlocks.push(`// Component: ${name}\n__meno.initComponent(\"${name}\", function(el, props) {\n ${destructure}\n ${js}\n});`);\n } else {\n // No defineVars - wrap in IIFE to prevent variable conflicts between components\n jsCodeBlocks.push(`// Component: ${name}\\n(function(){\\n${js}\\n})();`);\n }\n };\n\n // Collect JS from global components\n for (const [name, component] of Object.entries(globalComponents)) {\n await processComponent(name, component);\n }\n\n // Collect JS from page-specific components\n for (const [name, component] of Object.entries(pageComponents)) {\n // Skip if already collected from global components\n if (!globalComponents[name]) {\n await processComponent(name, component);\n }\n }\n\n // Prepend runtime helper if any component uses defineVars\n if (hasDefineVars && jsCodeBlocks.length > 0) {\n jsCodeBlocks.unshift(DEFINE_VARS_RUNTIME);\n }\n\n return jsCodeBlocks.join('\\n\\n');\n}\n", "/**\n * CMS template processing for SSR\n * Handles {{cms.field}} interpolation and CMS context management\n */\n\nimport type { I18nConfig } from '../../shared/types/components';\nimport { DEFAULT_I18N_CONFIG, resolveI18nValue, isI18nValue } from '../../shared/i18n';\nimport type { ValueResolver } from '../../shared/itemTemplateUtils';\nimport { tiptapToHtml } from '../../shared/richtext/tiptapToHtml';\nimport { isTiptapDocument } from '../../shared/richtext/types';\nimport { RAW_HTML_PREFIX } from '../../shared/constants';\n\n// Re-export for backward compatibility\nexport { RAW_HTML_PREFIX };\n\n/**\n * CMS context for template interpolation\n */\nexport interface CMSContext {\n cms?: Record<string, unknown>;\n}\n\n/**\n * Get i18n resolver function for value resolution\n */\nexport function createI18nResolver(locale?: string, i18nConfig?: I18nConfig): ValueResolver | undefined {\n if (!locale || !i18nConfig) return undefined;\n return (value: unknown) => resolveI18nValue(value, locale, i18nConfig);\n}\n\n/**\n * Process CMS template strings like {{cms.title}} or {{cms.author}}\n * Replaces template expressions with values from CMS item\n * Supports i18n values - resolves to locale-specific strings\n */\nexport function processCMSTemplate(\n template: string,\n cmsItem: Record<string, unknown>,\n locale?: string,\n i18nConfig?: I18nConfig,\n): string {\n const config = i18nConfig || DEFAULT_I18N_CONFIG;\n const effectiveLocale = locale || config.defaultLocale;\n\n return template.replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (_match, fieldPath) => {\n // Support nested paths like cms.author.name\n const parts = fieldPath.trim().split('.');\n let value: unknown = cmsItem;\n\n for (const part of parts) {\n if (value && typeof value === 'object' && part in value) {\n value = (value as Record<string, unknown>)[part];\n } else {\n // Field not found, return empty string\n return '';\n }\n }\n\n // Return string representation\n if (value === null || value === undefined) {\n return '';\n }\n // Handle i18n values - resolve to locale-specific value, then continue\n // through rich-text detection (don't early-return, as resolved value may be Tiptap JSON)\n if (isI18nValue(value)) {\n value = resolveI18nValue(value, effectiveLocale, config);\n }\n // Handle rich-text markers - extract HTML content for interpolation\n // Mark with RAW_HTML_PREFIX so renderer knows not to escape\n if (typeof value === 'object' && value !== null && '__richtext__' in value) {\n const richText = value as Record<string, unknown>;\n if (typeof richText.html === 'string') {\n return RAW_HTML_PREFIX + richText.html;\n }\n }\n // Handle raw TipTap documents (fallback if not preprocessed)\n // Mark with RAW_HTML_PREFIX so renderer knows not to escape\n if (isTiptapDocument(value)) {\n return RAW_HTML_PREFIX + tiptapToHtml(value);\n }\n return String(value);\n });\n}\n\n/**\n * Process CMS templates in props object\n * Recursively processes all string values in props\n */\nexport function processCMSPropsTemplate(\n props: Record<string, unknown>,\n cmsItem: Record<string, unknown>,\n locale?: string,\n i18nConfig?: I18nConfig,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === 'string' && value.includes('{{cms.')) {\n result[key] = processCMSTemplate(value, cmsItem, locale, i18nConfig);\n } else if (value && typeof value === 'object' && !Array.isArray(value)) {\n // Recursively process nested objects (but not arrays or null)\n result[key] = processCMSPropsTemplate(value as Record<string, unknown>, cmsItem, locale, i18nConfig);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n", "/**\n * Image metadata handling for SSR\n * Loads image manifest and builds metadata map for responsive images\n */\n\nimport { projectPaths } from '../projectContext';\nimport * as path from 'node:path';\nimport { escapeHtml } from './attributeBuilder';\nimport { readTextFile, fileExists } from '../runtime';\n\n/**\n * Image metadata for SSR rendering\n */\nexport interface ImageMetadata {\n /** WebP srcset string */\n srcset: string;\n /** AVIF srcset string (if available) */\n avifSrcset?: string;\n /** Original image width */\n width?: number;\n /** Original image height */\n height?: number;\n /** Base64 blur placeholder data URL */\n blurHash?: string;\n}\n\n/**\n * Image metadata map - maps image URLs to their metadata\n */\nexport type ImageMetadataMap = Map<string, ImageMetadata>;\n\n/**\n * Responsive image widths for variant detection (optimized for mobile 2x/3x DPR and desktop)\n */\nexport const RESPONSIVE_WIDTHS = [500, 800, 1080, 1600, 2400] as const;\n\n/**\n * Default sizes attribute for responsive images\n */\nexport const DEFAULT_SIZES = '100vw';\n\n/**\n * Build image metadata map from manifest\n * Returns a map of image URL -> metadata (srcset, avifSrcset, dimensions, blurHash)\n */\nexport async function buildImageMetadataMap(): Promise<ImageMetadataMap> {\n const metadataMap = new Map<string, ImageMetadata>();\n\n try {\n const imagesDir = projectPaths.images();\n const manifestPath = path.join(imagesDir, 'manifest.json');\n\n // Try to load manifest\n if (!(await fileExists(manifestPath))) {\n return metadataMap;\n }\n\n const manifestContent = await readTextFile(manifestPath);\n const manifest = JSON.parse(manifestContent) as {\n version: number;\n images: Record<\n string,\n {\n filename: string;\n width: number;\n height: number;\n blurHash: string;\n formats: { avif: boolean; webp: boolean };\n variants: { width: number; webpFilename: string; avifFilename: string }[];\n }\n >;\n };\n\n // Build metadata for each image\n for (const [filename, entry] of Object.entries(manifest.images)) {\n const baseName = path.basename(filename, path.extname(filename));\n\n // Build WebP srcset\n const webpSrcsetParts: string[] = [];\n const avifSrcsetParts: string[] = [];\n\n // Add variants\n for (const variant of entry.variants) {\n webpSrcsetParts.push(`/images/${encodeURIComponent(variant.webpFilename)} ${variant.width}w`);\n if (variant.avifFilename) {\n avifSrcsetParts.push(`/images/${encodeURIComponent(variant.avifFilename)} ${variant.width}w`);\n }\n }\n\n // Add main image as largest option (use original width or 2400 as fallback).\n // Only do this when at least one responsive variant exists \u2014 a single-entry\n // srcset paired with sizes=\"100vw\" makes the browser scale tiny images\n // (e.g. 24\u00D724 icons) up to full viewport width.\n const hasVariants = entry.variants.length > 0;\n if (hasVariants) {\n const mainWidth = entry.width || 2400;\n if (entry.formats.webp) {\n webpSrcsetParts.push(`/images/${encodeURIComponent(`${baseName}.webp`)} ${mainWidth}w`);\n } else {\n webpSrcsetParts.push(`/images/${encodeURIComponent(filename)} ${mainWidth}w`);\n }\n if (entry.formats.avif) {\n avifSrcsetParts.push(`/images/${encodeURIComponent(`${baseName}.avif`)} ${mainWidth}w`);\n }\n }\n\n const metadata: ImageMetadata = {\n srcset: webpSrcsetParts.join(', '),\n width: entry.width,\n height: entry.height,\n blurHash: entry.blurHash,\n };\n\n if (avifSrcsetParts.length > 0) {\n metadata.avifSrcset = avifSrcsetParts.join(', ');\n }\n\n // Map both /images/filename and /images/encoded-filename\n metadataMap.set(`/images/${filename}`, metadata);\n metadataMap.set(`/images/${encodeURIComponent(filename)}`, metadata);\n }\n } catch (error) {\n console.error('Failed to build image metadata map:', error);\n }\n\n return metadataMap;\n}\n\n/**\n * Extract the src attribute value from an <img> tag string.\n * Handles both src=\"...\" and src='...' quoting.\n */\nexport function extractImgSrc(imgTag: string): string | null {\n const match = imgTag.match(/src=[\"']([^\"']+)[\"']/i);\n return match ? (match[1] ?? null) : null;\n}\n\n/**\n * Rewrite <img> tags in rich-text HTML to <picture> elements with responsive variants.\n * Only rewrites images that exist in the metadata map (project images with generated variants).\n * External/unrecognized images are left unchanged.\n */\nexport function rewriteRichTextImages(\n html: string,\n metadataMap: ImageMetadataMap,\n imageFormat?: 'webp' | 'avif',\n): string {\n return html.replace(/<img\\b([^>]*)\\/?>/gi, (fullMatch, innerAttrs: string) => {\n const src = extractImgSrc(fullMatch);\n if (!src) return fullMatch;\n\n const metadata = metadataMap.get(src);\n if (!metadata) return fullMatch;\n\n // Check if width/height already present in original tag\n const hasWidth = /width=/i.test(innerAttrs);\n const hasHeight = /height=/i.test(innerAttrs);\n\n // Inject width/height if missing and available from metadata\n let enhancedTag = fullMatch;\n if (!hasWidth && metadata.width) {\n enhancedTag = enhancedTag.replace(/<img\\b/i, `<img width=\"${escapeHtml(String(metadata.width))}\"`);\n }\n if (!hasHeight && metadata.height) {\n enhancedTag = enhancedTag.replace(/<img\\b/i, `<img height=\"${escapeHtml(String(metadata.height))}\"`);\n }\n\n const sizes = DEFAULT_SIZES;\n\n // Render as <picture> with AVIF + WebP sources when AVIF is available and format allows\n if (metadata.avifSrcset && imageFormat !== 'webp') {\n return (\n `<picture>` +\n `<source type=\"image/avif\" srcset=\"${escapeHtml(metadata.avifSrcset)}\" sizes=\"${escapeHtml(sizes)}\" />` +\n `<source type=\"image/webp\" srcset=\"${escapeHtml(metadata.srcset)}\" sizes=\"${escapeHtml(sizes)}\" />` +\n enhancedTag +\n `</picture>`\n );\n }\n\n // WebP only: add srcset and sizes to existing <img>\n if (metadata.srcset) {\n enhancedTag = enhancedTag.replace(\n /<img\\b/i,\n `<img srcset=\"${escapeHtml(metadata.srcset)}\" sizes=\"${escapeHtml(sizes)}\"`,\n );\n }\n\n return enhancedTag;\n });\n}\n", "/**\n * Client-side Form Handler\n * Handles form submissions via fetch for forms with data-submit-handler=\"fetch\"\n *\n * This script is designed to be included inline in SSR output.\n * It's a self-executing module that attaches to forms automatically.\n */\n\nexport const formHandlerScript = `\n(function() {\n // Find all forms with fetch handler\n const forms = document.querySelectorAll('form[data-submit-handler=\"fetch\"]');\n\n forms.forEach(function(form) {\n form.addEventListener('submit', async function(e) {\n e.preventDefault();\n\n const action = form.getAttribute('action');\n const method = form.getAttribute('method') || 'POST';\n const successMessage = form.getAttribute('data-success-message') || 'Form submitted successfully!';\n const errorMessage = form.getAttribute('data-error-message') || 'Something went wrong. Please try again.';\n\n // Find or create message element\n let messageEl = form.querySelector('[data-form-message]');\n if (!messageEl) {\n messageEl = document.createElement('div');\n messageEl.setAttribute('data-form-message', 'true');\n form.appendChild(messageEl);\n }\n\n // Find submit button and disable it\n const submitBtn = form.querySelector('button[type=\"submit\"], input[type=\"submit\"]');\n const originalBtnText = submitBtn ? submitBtn.textContent || submitBtn.value : '';\n\n if (submitBtn) {\n submitBtn.disabled = true;\n if (submitBtn.tagName === 'BUTTON') {\n submitBtn.textContent = 'Sending...';\n } else {\n submitBtn.value = 'Sending...';\n }\n }\n\n // Hide any previous message\n messageEl.style.display = 'none';\n\n try {\n const formData = new FormData(form);\n\n const response = await fetch(action, {\n method: method.toUpperCase(),\n body: formData,\n });\n\n const data = await response.json();\n\n if (response.ok && data.success) {\n // Success\n messageEl.textContent = data.message || successMessage;\n messageEl.style.display = 'block';\n messageEl.style.backgroundColor = '#d4edda';\n messageEl.style.color = '#155724';\n messageEl.style.border = '1px solid #c3e6cb';\n\n // Optionally reset form\n form.reset();\n } else {\n // Error from server\n messageEl.textContent = data.error || errorMessage;\n messageEl.style.display = 'block';\n messageEl.style.backgroundColor = '#f8d7da';\n messageEl.style.color = '#721c24';\n messageEl.style.border = '1px solid #f5c6cb';\n }\n } catch (error) {\n // Network or other error\n messageEl.textContent = errorMessage;\n messageEl.style.display = 'block';\n messageEl.style.backgroundColor = '#f8d7da';\n messageEl.style.color = '#721c24';\n messageEl.style.border = '1px solid #f5c6cb';\n } finally {\n // Re-enable submit button\n if (submitBtn) {\n submitBtn.disabled = false;\n if (submitBtn.tagName === 'BUTTON') {\n submitBtn.textContent = originalBtnText;\n } else {\n submitBtn.value = originalBtnText;\n }\n }\n }\n });\n });\n})();\n`;\n\n/**\n * Check if page HTML contains forms that need the fetch handler\n */\nexport function needsFormHandler(html: string): boolean {\n return html.includes('data-submit-handler=\"fetch\"');\n}\n", "// AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY\n// Generated from: lib/client/meno-filter/MenoFilter.ts + init.ts\n// Regenerate with: bun scripts/build-meno-filter.ts\n//\n// This file is the production inline script injected into SSR HTML.\n// Edit the source TypeScript files, then run the build script.\n\n/**\n * MenoFilter Inline Script\n *\n * Self-contained script for client-side CMS filtering.\n * Injected into pages that use cms-list or MenoFilter.\n *\n * Features:\n * - Filter by field values with operators ($gt, $lt, $in, etc.)\n * - Search with debounce\n * - Sort ascending/descending\n * - Pagination\n * - Data attribute auto-binding\n * - Facet counts\n * - Lifecycle events\n */\n\nexport const menoFilterScript = `\"use strict\";var MenoFilterBundle=(()=>{var b=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var K=(r,e,t)=>e in r?b(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var X=(r,e)=>{for(var t in e)b(r,t,{get:e[t],enumerable:!0})},V=(r,e,t,n)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let i of Y(e))!Z.call(r,i)&&i!==t&&b(r,i,{get:()=>e[i],enumerable:!(n=J(e,i))||n.enumerable});return r};var ee=r=>V(b({},\"__esModule\",{value:!0}),r);var g=(r,e,t)=>K(r,typeof e!=\"symbol\"?e+\"\":e,t);var we={};X(we,{autoInit:()=>$,default:()=>Pe,destroyAllMenoFilters:()=>Q,destroyMenoFilter:()=>k,getMenoFilterInstance:()=>Re,initMenoFilter:()=>C});var S=class S{constructor(e){g(this,\"collection\");g(this,\"items\",[]);g(this,\"filteredItems\",[]);g(this,\"initialized\",!1);g(this,\"criteria\",{});g(this,\"orCriteria\",[]);g(this,\"searchQuery\",\"\");g(this,\"searchFields\",[]);g(this,\"sortConfig\",null);g(this,\"perPage\");g(this,\"currentPage\",1);g(this,\"visibleCount\",0);g(this,\"filterMatch\");g(this,\"fieldTypes\",{});g(this,\"urlSync\",!1);g(this,\"urlMode\",\"replace\");g(this,\"popstateHandler\",()=>this.syncFromUrl());g(this,\"fuzzySearchEnabled\",!1);g(this,\"fuzzyThreshold\",.3);g(this,\"eventListeners\",new Map);g(this,\"watchers\",new Set);this.collection=e.collection,this.perPage=e.perPage??0,this.filterMatch=e.filterMatch??\"and\",this.fieldTypes=e.fieldTypes??{},this.fuzzySearchEnabled=e.fuzzySearch??!1,this.fuzzyThreshold=e.fuzzyThreshold??.3,S.instances.set(this.collection,this),e.urlSync&&this.enableUrlSync({mode:e.urlMode})}static get(e){return S.instances.get(e)}static getAll(){return new Map(S.instances)}static has(e){return S.instances.has(e)}static destroy(e){let t=S.instances.get(e);t&&(t.destroy(),S.instances.delete(e))}static destroyAll(){for(let e of S.instances.values())e.destroy();S.instances.clear()}async init(){if(this.initialized)return;let e=document.getElementById(\\`meno-cms-\\${this.collection}\\`);if(e?.textContent)try{this.items=JSON.parse(e.textContent),this.filteredItems=[...this.items],this.initialized=!0,this.emit(\"init\",this.items),this.notifyWatchers();return}catch(t){console.error(\\`MenoFilter: Failed to parse inline data for \"\\${this.collection}\"\\`,t)}try{let t=await fetch(\\`/data/\\${this.collection}/index.json\\`);if(t.ok){this.items=await t.json(),this.filteredItems=[...this.items],this.initialized=!0,this.emit(\"init\",this.items),this.notifyWatchers();return}}catch(t){console.error(\\`MenoFilter: Failed to fetch static data for \"\\${this.collection}\"\\`,t)}console.warn(\\`MenoFilter: No data found for collection \"\\${this.collection}\"\\`),this.items=[],this.filteredItems=[],this.initialized=!0,this.emit(\"init\",[]),this.notifyWatchers()}isInitialized(){return this.initialized}destroy(){this.eventListeners.clear(),this.watchers.clear(),this.items=[],this.filteredItems=[],this.criteria={},this.orCriteria=[],this.initialized=!1}filter(e){return this.emit(\"beforeFilter\",e),this.criteria=e,this.orCriteria=[],this.currentPage=1,this.applyAllFilters(),this.emit(\"afterFilter\",this.filteredItems),this.getPageItems()}filterOr(e){return this.emit(\"beforeFilter\",e),this.criteria={},this.orCriteria=e,this.currentPage=1,this.applyAllFilters(),this.emit(\"afterFilter\",this.filteredItems),this.getPageItems()}addFilter(e,t){return this.criteria[e]=t,this.currentPage=1,this.applyAllFilters(),this.emit(\"afterFilter\",this.filteredItems),this.getPageItems()}removeFilter(e){return delete this.criteria[e],this.currentPage=1,this.applyAllFilters(),this.emit(\"afterFilter\",this.filteredItems),this.getPageItems()}clearFilters(){return this.criteria={},this.orCriteria=[],this.currentPage=1,this.applyAllFilters(),this.emit(\"afterFilter\",this.filteredItems),this.getPageItems()}getFilters(){return{...this.criteria}}search(e,t){return this.emit(\"beforeSearch\",{query:e,fields:t}),this.searchQuery=e,this.searchFields=t??[],this.currentPage=1,this.applyAllFilters(),this.emit(\"afterSearch\",this.filteredItems),this.getPageItems()}clearSearch(){return this.searchQuery=\"\",this.searchFields=[],this.applyAllFilters(),this.getPageItems()}getSearch(){return{query:this.searchQuery,fields:[...this.searchFields]}}sort(e,t=\"asc\"){return this.emit(\"beforeSort\",{field:e,order:t}),this.sortConfig={field:e,order:t},this.currentPage=1,this.applyAllFilters(),this.emit(\"afterSort\",this.filteredItems),this.getPageItems()}clearSort(){return this.sortConfig=null,this.applyAllFilters(),this.getPageItems()}getSort(){return this.sortConfig?{...this.sortConfig}:null}setPage(e){let t=this.getTotalPages(),n=Math.max(1,Math.min(e,t||1));return n!==this.currentPage&&(this.currentPage=n,this.emit(\"pageChange\",this.getPageInfo()),this.notifyWatchers()),this.getPageItems()}nextPage(){return this.setPage(this.currentPage+1)}prevPage(){return this.setPage(this.currentPage-1)}setPerPage(e){return this.perPage=e,this.currentPage=1,this.emit(\"pageChange\",this.getPageInfo()),this.notifyWatchers(),this.getPageItems()}getPageInfo(){let e=this.getTotalPages();return{current:this.currentPage,total:e,hasNext:this.currentPage<e,hasPrev:this.currentPage>1,totalItems:this.filteredItems.length,perPage:this.perPage||this.filteredItems.length}}getTotalPages(){return this.perPage===0?1:Math.ceil(this.filteredItems.length/this.perPage)}getPageItems(){if(this.perPage===0)return this.filteredItems;let e=(this.currentPage-1)*this.perPage,t=e+this.perPage;return this.filteredItems.slice(e,t)}loadMore(e){let t=e??(this.perPage||10),n=Math.min(this.visibleCount+t,this.filteredItems.length);return n!==this.visibleCount&&(this.visibleCount=n,this.emit(\"loadMore\",this.getLoadMoreInfo()),this.notifyWatchers()),this.getVisibleItems()}getVisibleItems(){return this.visibleCount===0?this.getPageItems():this.filteredItems.slice(0,this.visibleCount)}getLoadMoreInfo(){let e=this.visibleCount||this.filteredItems.length;return{visible:e,total:this.filteredItems.length,remaining:Math.max(0,this.filteredItems.length-e),hasMore:e<this.filteredItems.length}}resetVisibleCount(){this.visibleCount=this.perPage||0}initLoadMore(e){this.visibleCount=e??(this.perPage||10),this.notifyWatchers()}getAll(){return this.items}getFiltered(){return this.filteredItems}getItems(){return this.getPageItems()}getById(e){return this.items.find(t=>t._id===e||t._filename===e)}getUniqueValues(e){let t=new Set;for(let n of this.items){let i=n[e];i!=null&&(Array.isArray(i)?i.forEach(s=>t.add(s)):t.add(i))}return Array.from(t)}countFacets(e,t){let n={};for(let i of e){let s=i[t];if(s!=null)if(Array.isArray(s))s.forEach(o=>{let a=String(o);n[a]=(n[a]||0)+1});else{let o=String(s);n[o]=(n[o]||0)+1}}return n}getFacets(e){return this.countFacets(this.filteredItems,e)}getAllFacets(e){return this.countFacets(this.items,e)}reset(){return this.criteria={},this.orCriteria=[],this.searchQuery=\"\",this.searchFields=[],this.sortConfig=null,this.currentPage=1,this.filteredItems=[...this.items],this.emit(\"reset\",null),this.notifyWatchers(),this.getPageItems()}setFieldType(e,t){this.fieldTypes[e]=t}setFieldTypes(e){this.fieldTypes={...this.fieldTypes,...e}}getFieldTypes(){return{...this.fieldTypes}}coerceValue(e,t){let n=this.fieldTypes[e];if(!n||n===\"string\"||t===null||t===void 0)return t;switch(n){case\"number\":{if(typeof t==\"number\")return t;let i=parseFloat(String(t));return isNaN(i)?t:i}case\"date\":{if(t instanceof Date)return t.getTime();let i=new Date(String(t)).getTime();return isNaN(i)?t:i}case\"boolean\":return t===!0||t===\"true\"||t===\"1\";default:return t}}filterRange(e,t){let n={};return t.min!==void 0&&t.min!==\"\"&&(n.$gte=t.min),t.max!==void 0&&t.max!==\"\"&&(n.$lte=t.max),Object.keys(n).length===0?this.removeFilter(e):this.addFilter(e,n)}clearRangeFilter(e){return this.removeFilter(e)}enableUrlSync(e){typeof window>\"u\"||(this.urlSync=!0,this.urlMode=e?.mode??\"replace\",window.addEventListener(\"popstate\",this.popstateHandler),this.syncFromUrl())}disableUrlSync(){typeof window>\"u\"||(this.urlSync=!1,window.removeEventListener(\"popstate\",this.popstateHandler))}syncToUrl(){if(typeof window>\"u\")return;let e=new URLSearchParams;for(let[i,s]of Object.entries(this.criteria))if(!(s==null||s===\"\"))if(typeof s==\"object\"&&s!==null&&!Array.isArray(s))for(let[o,a]of Object.entries(s))a!=null&&a!==\"\"&&e.set(\\`filter.\\${i}.\\${o}\\`,String(a));else Array.isArray(s)?e.set(\\`filter.\\${i}\\`,s.join(\",\")):e.set(\\`filter.\\${i}\\`,String(s));this.sortConfig&&e.set(\"sort\",\\`\\${this.sortConfig.field}:\\${this.sortConfig.order}\\`),this.searchQuery&&(e.set(\"search\",this.searchQuery),this.searchFields.length>0&&e.set(\"search.fields\",this.searchFields.join(\",\"))),this.currentPage>1&&e.set(\"page\",String(this.currentPage)),this.perPage>0&&e.set(\"perPage\",String(this.perPage));let t=e.toString(),n=t?\\`\\${window.location.pathname}?\\${t}\\`:window.location.pathname;this.urlMode===\"push\"?history.pushState(null,\"\",n):history.replaceState(null,\"\",n)}syncFromUrl(){if(typeof window>\"u\")return;let e=new URLSearchParams(window.location.search);if(e.size===0)return;let t={};for(let[a,l]of e.entries()){if(!a.startsWith(\"filter.\"))continue;let u=a.split(\".\"),c=u[1],d=u[2];d?((!t[c]||typeof t[c]!=\"object\")&&(t[c]={}),t[c][d]=l):l.includes(\",\")?t[c]=l.split(\",\"):t[c]=l}let n=e.get(\"sort\");if(n){let[a,l=\"asc\"]=n.split(\":\");this.sortConfig={field:a,order:l}}let i=e.get(\"search\");if(i){this.searchQuery=i;let a=e.get(\"search.fields\");a&&(this.searchFields=a.split(\",\"))}let s=e.get(\"page\");if(s){let a=parseInt(s,10);!isNaN(a)&&a>0&&(this.currentPage=a)}let o=e.get(\"perPage\");if(o){let a=parseInt(o,10);!isNaN(a)&&a>0&&(this.perPage=a)}Object.keys(t).length>0&&(this.criteria=t),this.applyAllFilters()}setFuzzySearch(e,t){this.fuzzySearchEnabled=e,t!==void 0&&(this.fuzzyThreshold=Math.max(0,Math.min(1,t)))}isFuzzySearchEnabled(){return this.fuzzySearchEnabled}getTrigrams(e){let t=[],n=\\` \\${e} \\`;for(let i=0;i<n.length-2;i++)t.push(n.slice(i,i+3));return t}fuzzyMatch(e,t){if(t.length<3)return e.toLowerCase().includes(t.toLowerCase());let n=e.toLowerCase(),i=t.toLowerCase();if(n.includes(i))return!0;let s=this.getTrigrams(n),o=this.getTrigrams(i),a=new Set(o),l=new Set(s),u=0;for(let h of a)l.has(h)&&u++;let c=a.size+l.size-u;return c===0?!1:u/c>=this.fuzzyThreshold}on(e,t){return this.eventListeners.has(e)||this.eventListeners.set(e,new Set),this.eventListeners.get(e).add(t),()=>this.off(e,t)}off(e,t){this.eventListeners.get(e)?.delete(t)}emit(e,t){let n=this.eventListeners.get(e);if(n)for(let i of n)try{i(t)}catch(s){console.error(\\`MenoFilter: Error in \\${e} listener\\`,s)}}watch(e){return this.watchers.add(e),e(this.getState()),()=>this.watchers.delete(e)}subscribe(e){let t=n=>e(n.pageItems);return this.watchers.add(t),e(this.getPageItems()),()=>this.watchers.delete(t)}getState(){return{items:this.items,filteredItems:this.filteredItems,pageItems:this.getPageItems(),filters:{...this.criteria},sort:this.sortConfig?{...this.sortConfig}:null,search:{query:this.searchQuery,fields:[...this.searchFields]},page:this.getPageInfo()}}notifyWatchers(){let e=this.getState();for(let t of this.watchers)try{t(e)}catch(n){console.error(\"MenoFilter: Error in watcher\",n)}this.urlSync&&this.syncToUrl()}applyAllFilters(){let e=[...this.items];if(Object.keys(this.criteria).length>0&&(e=e.filter(t=>this.matchesCriteria(t,this.criteria))),this.orCriteria.length>0&&(e=e.filter(t=>this.orCriteria.some(n=>this.matchesCriteria(t,n)))),this.searchQuery){let t=this.searchQuery;e=e.filter(n=>(this.searchFields.length>0?this.searchFields:Object.keys(n)).some(s=>{let o=n[s];return typeof o!=\"string\"?!1:this.fuzzySearchEnabled?this.fuzzyMatch(o,t):o.toLowerCase().includes(t.toLowerCase())}))}if(this.sortConfig){let{field:t,order:n}=this.sortConfig;e.sort((i,s)=>{let o=i[t],a=s[t];if(o==null)return n===\"asc\"?1:-1;if(a==null)return n===\"asc\"?-1:1;let l=0;return typeof o==\"string\"&&typeof a==\"string\"?l=o.localeCompare(a):typeof o==\"number\"&&typeof a==\"number\"?l=o-a:l=String(o).localeCompare(String(a)),n===\"desc\"?-l:l})}this.filteredItems=e,this.visibleCount>0&&(this.visibleCount=Math.min(this.perPage||10,e.length)),this.notifyWatchers()}matchesCriteria(e,t){let n=Object.entries(t);return this.filterMatch===\"or\"?n.some(([i,s])=>this.matchesFieldValue(e,i,s)):n.every(([i,s])=>this.matchesFieldValue(e,i,s))}matchesFieldValue(e,t,n){if(n==null||n===\"\"||n===\"*\")return!0;let i=e[t];if(this.isOperatorObject(n))return this.matchesOperators(i,n,t);if(Array.isArray(i))return i.includes(n);if(Array.isArray(n))return n.includes(i);let s=this.coerceValue(t,i),o=this.coerceValue(t,n);return s===o}isOperatorObject(e){return typeof e!=\"object\"||e===null||Array.isArray(e)?!1:Object.keys(e).some(n=>n.startsWith(\"$\"))}matchesOperators(e,t,n){for(let[i,s]of Object.entries(t))if(!this.matchesOperator(e,i,s,n))return!1;return!0}matchesOperator(e,t,n,i){let s=i?this.coerceValue(i,e):e,o=i?this.coerceValue(i,n):n;switch(t){case\"$eq\":return s===o;case\"$neq\":return s!==o;case\"$gt\":return typeof s==\"number\"&&typeof o==\"number\"?s>o:String(s)>String(o);case\"$gte\":return typeof s==\"number\"&&typeof o==\"number\"?s>=o:String(s)>=String(o);case\"$lt\":return typeof s==\"number\"&&typeof o==\"number\"?s<o:String(s)<String(o);case\"$lte\":return typeof s==\"number\"&&typeof o==\"number\"?s<=o:String(s)<=String(o);case\"$contains\":return Array.isArray(e)?e.includes(n):typeof e==\"string\"&&typeof n==\"string\"?e.toLowerCase().includes(n.toLowerCase()):!1;case\"$notContains\":return Array.isArray(e)?!e.includes(n):typeof e==\"string\"&&typeof n==\"string\"?!e.toLowerCase().includes(n.toLowerCase()):!0;case\"$startsWith\":return typeof e==\"string\"&&typeof n==\"string\"?e.toLowerCase().startsWith(n.toLowerCase()):!1;case\"$endsWith\":return typeof e==\"string\"&&typeof n==\"string\"?e.toLowerCase().endsWith(n.toLowerCase()):!1;case\"$in\":return Array.isArray(n)?n.includes(e):!1;case\"$nin\":return Array.isArray(n)?!n.includes(e):!0;case\"$empty\":let a=e==null||e===\"\"||Array.isArray(e)&&e.length===0;return n?a:!a;default:return console.warn(\\`MenoFilter: Unknown operator \"\\${t}\"\\`),!0}}};g(S,\"instances\",new Map);var F=S;var f={FILTER:\"data-meno-filter\",LIST:\"data-meno-list\",ITEM:\"data-meno-item\",FILTER_FIELD:\"data-meno-filter-field\",FILTER_VALUE:\"data-meno-filter-value\",FILTER_MODE:\"data-meno-filter-mode\",SEARCH:\"data-meno-search\",SEARCH_FIELDS:\"data-meno-search-fields\",SEARCH_FUZZY:\"data-meno-search-fuzzy\",SEARCH_THRESHOLD:\"data-meno-search-threshold\",SORT:\"data-meno-sort\",SORT_ORDER:\"data-meno-sort-order\",CLEAR:\"data-meno-clear\",RESET:\"data-meno-reset\",PER_PAGE:\"data-meno-per-page\",FILTER_MATCH:\"data-meno-filter-match\",DEBOUNCE:\"data-meno-debounce\",PAGE:\"data-meno-page\",PAGE_CURRENT:\"data-meno-page-current\",PAGE_TOTAL:\"data-meno-page-total\",PAGE_BUTTONS:\"data-meno-page-buttons\",PER_PAGE_SELECT:\"data-meno-per-page-select\",LOAD_MORE:\"data-meno-load-more\",REMAINING:\"data-meno-remaining\",COUNT:\"data-meno-count\",FACET:\"data-meno-facet\",EMPTY:\"data-meno-empty\",ACTIVE_FILTERS:\"data-meno-active-filters\",ACTIVE_FILTER_TEMPLATE:\"data-meno-active-filter-template\",FILTER_REMOVE:\"data-meno-filter-remove\",ACTIVE_CLASS:\"data-meno-active-class\",TYPES:\"data-meno-types\",RANGE:\"data-meno-range\",RANGE_BOUND:\"data-meno-range-bound\",URL_SYNC:\"data-meno-url-sync\",URL_MODE:\"data-meno-url-mode\"};function te(r,e){let t;return(...n)=>{clearTimeout(t),t=setTimeout(()=>r(...n),e)}}function x(r){let e=r.closest(\\`[\\${f.FILTER_MODE}]\\`);if(!e)return null;let t=e.getAttribute(f.FILTER_MODE);return t===\"single\"||t===\"multi\"?t:null}function ne(r,e,t,n){let i=[];n!==void 0&&(typeof n==\"object\"&&n!==null&&\"$in\"in n?i=[...n.$in||[]]:typeof n==\"string\"&&(i=[n]));let s=i.indexOf(t);s===-1?i.push(t):i.splice(s,1),i.length===0?r.removeFilter(e):i.length===1?r.addFilter(e,i[0]):r.addFilter(e,{$in:i})}function O(r){let{wrapper:e,filter:t,cleanup:n}=r,i=e.querySelectorAll(\\`[\\${f.FILTER_FIELD}][\\${f.FILTER_VALUE}]\\`);for(let l of i){if(l.tagName===\"INPUT\")continue;let u=l.getAttribute(f.FILTER_FIELD),c=l.getAttribute(f.FILTER_VALUE),d=()=>{let h=x(l),p=t.getFilters()[u];h===\"multi\"?ne(t,u,c,p):h===\"single\"?p!==c&&t.addFilter(u,c):p===c?t.removeFilter(u):t.addFilter(u,c)};l.addEventListener(\"click\",d),n.push(()=>l.removeEventListener(\"click\",d))}let s=e.querySelectorAll(\\`input[type=\"checkbox\"][\\${f.FILTER_FIELD}]\\`);for(let l of s){let u=l.getAttribute(f.FILTER_FIELD),c=()=>{if(x(l)===\"single\"&&l.checked){let h=e.querySelectorAll(\\`input[type=\"checkbox\"][\\${f.FILTER_FIELD}=\"\\${u}\"]\\`);for(let m of h)m!==l&&(m.checked=!1)}re(e,t,u)};l.addEventListener(\"change\",c),n.push(()=>l.removeEventListener(\"change\",c))}let o=e.querySelectorAll(\\`select[\\${f.FILTER_FIELD}]\\`);for(let l of o){let u=l.getAttribute(f.FILTER_FIELD),c=()=>{let d=l.value;d===\"\"||d===\"all\"||d===\"*\"?t.removeFilter(u):t.addFilter(u,d)};l.addEventListener(\"change\",c),n.push(()=>l.removeEventListener(\"change\",c))}let a=e.querySelectorAll(\\`input[type=\"radio\"][\\${f.FILTER_FIELD}]\\`);for(let l of a){let u=l.getAttribute(f.FILTER_FIELD),c=l.getAttribute(f.FILTER_VALUE)||l.value,d=()=>{l.checked&&(c===\"\"||c===\"all\"||c===\"*\"?t.removeFilter(u):t.addFilter(u,c))};l.addEventListener(\"change\",d),n.push(()=>l.removeEventListener(\"change\",d))}}function re(r,e,t){let n=r.querySelectorAll(\\`input[type=\"checkbox\"][\\${f.FILTER_FIELD}=\"\\${t}\"]:checked\\`),i=Array.from(n).map(s=>s.getAttribute(f.FILTER_VALUE)||s.value);i.length===0?e.removeFilter(t):i.length===1?e.addFilter(t,i[0]):e.addFilter(t,{$in:i})}function N(r){let{wrapper:e,filter:t,cleanup:n}=r,i=e.querySelectorAll(\\`[\\${f.SEARCH}]\\`);for(let s of i){let o=s.getAttribute(f.SEARCH_FIELDS),a=o?o.split(\",\").map(d=>d.trim()):void 0,l,u=parseInt(e.getAttribute(f.DEBOUNCE)||\"300\",10),c=()=>{clearTimeout(l),l=setTimeout(()=>{t.search(s.value,a)},u)};s.addEventListener(\"input\",c),n.push(()=>{s.removeEventListener(\"input\",c),clearTimeout(l)})}}function _(r){let{wrapper:e,filter:t,cleanup:n}=r,i=e.querySelectorAll(\\`[\\${f.SORT}]\\`);for(let o of i){if(o.tagName===\"SELECT\")continue;let a=o.getAttribute(f.SORT),l=o.getAttribute(f.SORT_ORDER)||\"asc\",u=()=>{let c=t.getSort();c?.field===a?c.order===l?t.sort(a,l===\"asc\"?\"desc\":\"asc\"):t.clearSort():t.sort(a,l)};o.addEventListener(\"click\",u),n.push(()=>o.removeEventListener(\"click\",u))}let s=e.querySelectorAll(\\`select[\\${f.SORT}]\\`);for(let o of s){let a=()=>{let l=o.value;if(!l){t.clearSort();return}let[u,c=\"asc\"]=l.split(\":\");t.sort(u,c)};o.addEventListener(\"change\",a),n.push(()=>o.removeEventListener(\"change\",a))}}function q(r){let{wrapper:e,filter:t,cleanup:n}=r,i=e.querySelectorAll(\\`[\\${f.CLEAR}]\\`);for(let o of i){let a=()=>{t.clearFilters()};o.addEventListener(\"click\",a),n.push(()=>o.removeEventListener(\"click\",a))}let s=e.querySelectorAll(\\`[\\${f.RESET}]\\`);for(let o of s){let a=()=>{t.reset(),ie(e)};o.addEventListener(\"click\",a),n.push(()=>o.removeEventListener(\"click\",a))}}function ie(r){let e=r.querySelectorAll(\\`input[type=\"checkbox\"][\\${f.FILTER_FIELD}]\\`);for(let s of e)s.checked=!1;let t=r.querySelectorAll(\\`select[\\${f.FILTER_FIELD}]\\`);for(let s of t)s.selectedIndex=0;let n=r.querySelectorAll(\\`[\\${f.SEARCH}]\\`);for(let s of n)s.value=\"\";let i=r.querySelectorAll(\\`select[\\${f.SORT}]\\`);for(let s of i)s.selectedIndex=0}function D(r){let{wrapper:e,filter:t,cleanup:n}=r,i=e.querySelectorAll(\\`[\\${f.PAGE}]\\`);for(let o of i){let a=o.getAttribute(f.PAGE),l=()=>{switch(a){case\"prev\":t.prevPage();break;case\"next\":t.nextPage();break;case\"first\":t.setPage(1);break;case\"last\":t.setPage(t.getPageInfo().total);break;default:let u=parseInt(a||\"1\",10);isNaN(u)||t.setPage(u)}};o.addEventListener(\"click\",l),n.push(()=>o.removeEventListener(\"click\",l))}let s=e.querySelectorAll(\\`[\\${f.PER_PAGE_SELECT}]\\`);for(let o of s){let a=()=>{let l=parseInt(o.value,10);!isNaN(l)&&l>0&&t.setPerPage(l)};o.addEventListener(\"change\",a),n.push(()=>o.removeEventListener(\"change\",a))}}function z(r){let{wrapper:e,filter:t,cleanup:n}=r,i=e.querySelector(\\`[\\${f.LOAD_MORE}]\\`);if(!i)return;r.loadMoreMode=!0,t.initLoadMore();let s=()=>{let o=i.getAttribute(f.LOAD_MORE),a=o&&o!==\"\"?parseInt(o,10):void 0;t.loadMore(a)};i.addEventListener(\"click\",s),n.push(()=>i.removeEventListener(\"click\",s))}function H(r){if(r.value)return r.type===\"date\"?r.valueAsNumber||(r.value?new Date(r.value).getTime():void 0):r.valueAsNumber||(r.value?parseFloat(r.value):void 0)}function U(r){let{wrapper:e,filter:t,cleanup:n}=r,i=e.querySelectorAll(\\`[\\${f.RANGE}]\\`);if(i.length===0)return;let s=parseInt(e.getAttribute(f.DEBOUNCE)||\"300\",10),o=new Map;for(let a of i){let l=a.getAttribute(f.RANGE);if(!l)continue;let u=a.getAttribute(f.RANGE_BOUND);!u||u!==\"min\"&&u!==\"max\"||(o.has(l)||o.set(l,{}),o.get(l)[u]=a)}for(let[a,l]of o){let u=te(()=>{let c=l.min?H(l.min):void 0,d=l.max?H(l.max):void 0;t.filterRange(a,{min:c,max:d})},s);if(l.min){let c=()=>u();l.min.addEventListener(\"input\",c),n.push(()=>l.min.removeEventListener(\"input\",c))}if(l.max){let c=()=>u();l.max.addEventListener(\"input\",c),n.push(()=>l.max.removeEventListener(\"input\",c))}}}function I(r){return r.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#x27;\")}function j(r){return r.endsWith(\"ies\")?r.slice(0,-3)+\"y\":r.endsWith(\"es\")?r.slice(0,-2):r.endsWith(\"s\")?r.slice(0,-1):r}function R(r,e){return e.split(\".\").reduce((t,n)=>t&&typeof t==\"object\"?t[n]:void 0,r)}function G(r,e,t,n,i){let s=r;s=s.replace(new RegExp(\\`\\\\\\\\{\\\\\\\\{\\${t}\\\\\\\\.(\\\\\\\\w+)\\\\\\\\}\\\\\\\\}\\`,\"g\"),(l,u)=>{let c=e[u];return I(c!=null?String(c):\"\")}),s=s.replace(/\\\\{\\\\{item\\\\.(\\\\w+)\\\\}\\\\}/g,(l,u)=>{let c=e[u];return I(c!=null?String(c):\"\")}),s=s.replace(new RegExp(\\`\\\\\\\\{\\\\\\\\{\\${t}Index\\\\\\\\}\\\\\\\\}\\`,\"g\"),String(n)),s=s.replace(new RegExp(\\`\\\\\\\\{\\\\\\\\{\\${t}First\\\\\\\\}\\\\\\\\}\\`,\"g\"),n===0?\"true\":\"false\"),s=s.replace(new RegExp(\\`\\\\\\\\{\\\\\\\\{\\${t}Last\\\\\\\\}\\\\\\\\}\\`,\"g\"),n===i-1?\"true\":\"false\"),s=s.replace(/\\\\{\\\\{itemIndex\\\\}\\\\}/g,String(n)),s=s.replace(/\\\\{\\\\{itemFirst\\\\}\\\\}/g,n===0?\"true\":\"false\"),s=s.replace(/\\\\{\\\\{itemLast\\\\}\\\\}/g,n===i-1?\"true\":\"false\");let o=document.createElement(\"div\");o.innerHTML=s;let a=o.firstElementChild;return W(a,e,t),a}function se(r,e,t,n,i,s,o){let a=r;o!==t&&(a=a.replace(new RegExp(\\`\\\\\\\\{\\\\\\\\{\\${o}\\\\\\\\.(\\\\\\\\w+)\\\\\\\\}\\\\\\\\}\\`,\"g\"),(c,d)=>{let h=s[d];return I(h!=null?String(h):\"\")})),a=a.replace(/\\\\{\\\\{parentItem\\\\.(\\\\w+)\\\\}\\\\}/g,(c,d)=>{let h=s[d];return I(h!=null?String(h):\"\")}),o===\"item\"&&(a=a.replace(/\\\\{\\\\{item\\\\.(\\\\w+)\\\\}\\\\}/g,(c,d)=>{let h=s[d];return I(h!=null?String(h):\"\")})),a=a.replace(new RegExp(\\`\\\\\\\\{\\\\\\\\{\\${t}\\\\\\\\.(\\\\\\\\w+)\\\\\\\\}\\\\\\\\}\\`,\"g\"),(c,d)=>{let h=e[d];return I(h!=null?String(h):\"\")}),t!==\"item\"&&o!==\"item\"&&(a=a.replace(/\\\\{\\\\{item\\\\.(\\\\w+)\\\\}\\\\}/g,(c,d)=>{let h=e[d];return I(h!=null?String(h):\"\")})),a=a.replace(new RegExp(\\`\\\\\\\\{\\\\\\\\{\\${t}Index\\\\\\\\}\\\\\\\\}\\`,\"g\"),String(n)),a=a.replace(new RegExp(\\`\\\\\\\\{\\\\\\\\{\\${t}First\\\\\\\\}\\\\\\\\}\\`,\"g\"),n===0?\"true\":\"false\"),a=a.replace(new RegExp(\\`\\\\\\\\{\\\\\\\\{\\${t}Last\\\\\\\\}\\\\\\\\}\\`,\"g\"),n===i-1?\"true\":\"false\"),a=a.replace(/\\\\{\\\\{itemIndex\\\\}\\\\}/g,String(n)),a=a.replace(/\\\\{\\\\{itemFirst\\\\}\\\\}/g,n===0?\"true\":\"false\"),a=a.replace(/\\\\{\\\\{itemLast\\\\}\\\\}/g,n===i-1?\"true\":\"false\");let l=document.createElement(\"div\");l.innerHTML=a;let u=l.firstElementChild;return W(u,e,t),u}function W(r,e,t){let n=r.querySelectorAll('[data-cms-list-nested=\"true\"]');for(let i of n)oe(i,e,t)}function oe(r,e,t){let n=r.getAttribute(\"data-cms-config\");if(!n)return;let i;try{i=JSON.parse(n)}catch{return}let s=i.collection,o=r.querySelector(\"template[data-nested-template]\");if(!o)return;let a=o.innerHTML.trim(),l=i.itemAs||j(s),u=ae(s);if(!u){console.warn(\\`MenoFilter: No data for nested collection \"\\${s}\". Ensure clientData.enabled is true in schema.\\`);return}let c;i.items?c=le(i.items,e,t).map(p=>u.find(E=>E._id===p||E._filename===p)).filter(p=>p!==void 0):c=ce(u,i.filter,e,t),i.sort&&(c=de(c,i.sort)),i.offset&&(c=c.slice(i.offset)),i.limit&&(c=c.slice(0,i.limit));let d=[];for(let m=0;m<c.length;m++){let p=se(a,c[m],l,m,c.length,e,t);d.push(p)}Array.from(r.children).filter(m=>m.tagName!==\"TEMPLATE\").forEach(m=>m.remove());for(let m of d)r.appendChild(m);r.setAttribute(\"data-cms-list-hydrated\",\"true\")}function ae(r){let e=document.getElementById(\\`meno-cms-\\${r}\\`);if(!e?.textContent)return null;try{return JSON.parse(e.textContent)}catch{return null}}function le(r,e,t){if(Array.isArray(r))return r;if(typeof r!=\"string\"||!r.startsWith(\"{{\"))return[r];let n=r.match(/^\\\\{\\\\{(\\\\w+)\\\\.([^}]+)\\\\}\\\\}$/);if(!n)return[];let[,i,s]=n;if(i!==t&&i!==\"item\")return[];let o=R(e,s);return o==null?[]:Array.isArray(o)?o.map(String):[String(o)]}function ce(r,e,t,n){if(!e)return r;let i=ue(e,t,n);return r.filter(s=>fe(s,i))}function ue(r,e,t){if(Array.isArray(r))return r.map(n=>({...n,value:P(n.value,e,t)}));if(r&&typeof r==\"object\"){if(\"field\"in r&&\"value\"in r)return{...r,value:P(r.value,e,t)};let n={};for(let[i,s]of Object.entries(r))n[i]=P(s,e,t);return n}return r}function P(r,e,t){if(typeof r!=\"string\"||!r.startsWith(\"{{\"))return r;let n=r.match(/^\\\\{\\\\{(\\\\w+)\\\\.([^}]+)\\\\}\\\\}$/);if(!n)return r;let[,i,s]=n;return i!==t&&i!==\"item\"?r:R(e,s)}function fe(r,e){if(!e||typeof e!=\"object\")return!0;if(Array.isArray(e))return e.every(t=>B(r,t));if(\"field\"in e&&\"value\"in e)return B(r,e);for(let[t,n]of Object.entries(e))if(r[t]!==n)return!1;return!0}function B(r,e){let t=r[e.field],n=e.value;return Array.isArray(t)?t.includes(n):t===n}function de(r,e){if(!e)return r;let t=Array.isArray(e)?e[0]:e;if(!t||typeof t!=\"object\")return r;let{field:n,order:i=\"asc\"}=t;return[...r].sort((s,o)=>{let a=s[n],l=o[n],u=0;return typeof a==\"string\"&&typeof l==\"string\"?u=a.localeCompare(l):a!=null&&l!=null&&(u=String(a).localeCompare(String(l))),i===\"desc\"?-u:u})}function w(r){let{wrapper:e,filter:t}=r,n=t.getState();he(r),Ee(e,n),Te(e,t),Se(e,t,r),Le(e,n),ve(e,n),Fe(e,t),Me(e,t),be(e,t)}function he(r){let{wrapper:e,filter:t,itemTemplate:n}=r,i=e.querySelector(\\`[\\${f.LIST}]\\`);if(!i)return;if(t.getAll().length>0&&n){me(r,i);return}ge(r,i)}function me(r,e){let{filter:t,itemTemplate:n,ssrItems:i,itemAs:s,loadMoreMode:o}=r,a=o?t.getVisibleItems():t.getItems(),l=[],u=new Set;if(o)for(let c of Array.from(e.children)){if(c.tagName===\"TEMPLATE\")continue;let d=c.getAttribute(\"data-id\")||c.getAttribute(\"data-_id\");d&&u.add(d)}if(!o)for(let c of Array.from(e.children))c.tagName!==\"TEMPLATE\"&&(c.hasAttribute(\"data-meno-dynamic\")?c.remove():c.style.display=\"none\");for(let c=0;c<a.length;c++){let d=a[c],h=d._id;if(o&&u.has(h))continue;let m=i.get(h);if(m)m.style.display=\"\",e.appendChild(m),l.push(m);else if(n){let p=G(n,d,s,c,a.length);p.setAttribute(\"data-meno-dynamic\",\"true\"),p.setAttribute(\"data-id\",h),e.appendChild(p),l.push(p)}}}function ge(r,e){let{filter:t}=r,n=Array.from(e.children);if(n.length===0)return;let i=t.getFilters(),s=t.getSearch().query.toLowerCase(),o=t.getSearch().fields,a=t.getSort(),l=t.getPageInfo().perPage,u=t.getPageInfo().current,c=n.filter(E=>{for(let[v,y]of Object.entries(i)){let T=A(E,v);if(!ye(T,y))return!1}return!(s&&!pe(E,o).toLowerCase().includes(s))});a&&c.sort((E,v)=>{let y=A(E,a.field),T=A(v,a.field),L=0;return typeof y==\"string\"&&typeof T==\"string\"?L=y.localeCompare(T):y!=null&&T!=null?L=String(y).localeCompare(String(T)):y==null?L=1:L=-1,a.order===\"desc\"?-L:L});let d=c.length,h=l>0?(u-1)*l:0,m=l>0?h+l:d,p=c.slice(h,m);for(let E of n){let v=p.includes(E);E.style.display=v?\"\":\"none\"}if(a)for(let E of c)e.appendChild(E)}function A(r,e){let t=r.getAttribute(\\`data-\\${e}\\`);if(t!==null)return t;let n=r.querySelector(\\`[data-field=\"\\${e}\"]\\`);if(n)return n.textContent?.trim()||null;let i=r.querySelector(\\`[data-\\${e}]\\`);return i?i.getAttribute(\\`data-\\${e}\\`):null}function pe(r,e){return e.length>0?e.map(t=>A(r,t)||\"\").join(\" \"):r.textContent||\"\"}function ye(r,e){if(e==null||e===\"\")return!0;if(r===null)return!1;if(typeof e==\"object\"&&e!==null&&!Array.isArray(e)){let t=e;for(let[n,i]of Object.entries(t))switch(n){case\"$eq\":if(r!==i)return!1;break;case\"$neq\":if(r===i)return!1;break;case\"$contains\":if(!r.toLowerCase().includes(String(i).toLowerCase()))return!1;break;case\"$in\":if(!Array.isArray(i)||!i.includes(r))return!1;break;case\"$nin\":if(Array.isArray(i)&&i.includes(r))return!1;break}return!0}return r===String(e)}function Ee(r,e){let t=r.querySelectorAll(\\`[\\${f.COUNT}]\\`);for(let n of t){let i=n.getAttribute(f.COUNT),s;switch(i){case\"results\":s=e.page.totalItems;break;case\"total\":s=e.items.length;break;case\"visible\":s=e.pageItems.length;break;default:continue}n.textContent=String(s)}}function Te(r,e){let t=r.querySelectorAll(\\`[\\${f.FACET}]\\`);for(let n of t){let i=n.getAttribute(f.FACET);if(!i)continue;let[s,o]=i.split(\":\");if(!s||!o)continue;let l=e.getAllFacets(s)[o]||0;n.textContent=String(l)}}function Se(r,e,t){let n=r.querySelector(\\`[\\${f.ACTIVE_FILTERS}]\\`);if(!n)return;let i=r.querySelector(\\`template[\\${f.ACTIVE_FILTER_TEMPLATE}]\\`),s=e.getFilters(),o=Object.entries(s);if(n.innerHTML=\"\",o.length===0){n.style.display=\"none\";return}n.style.display=\"\";for(let[a,l]of o){let u=typeof l==\"object\"?\"[filter]\":String(l);if(i){let c=i.content.cloneNode(!0),d=c.querySelector(\"[data-meno-filter-label]\"),h=c.querySelector(\"[data-meno-filter-value]\"),m=c.querySelector(\\`[\\${f.FILTER_REMOVE}]\\`);if(d&&(d.textContent=a),h&&(h.textContent=u),m){let p=()=>{e.removeFilter(a)};m.addEventListener(\"click\",p),t.cleanup.push(()=>m.removeEventListener(\"click\",p))}n.appendChild(c)}else{let c=document.createElement(\"span\");c.className=\"meno-filter-tag\",c.innerHTML=\\`\\${a}: \\${u} <button type=\"button\">&times;</button>\\`;let d=c.querySelector(\"button\"),h=()=>{e.removeFilter(a)};d.addEventListener(\"click\",h),t.cleanup.push(()=>d.removeEventListener(\"click\",h)),n.appendChild(c)}}}function Le(r,e){let t=r.querySelector(\\`[\\${f.EMPTY}]\\`);t&&(e.pageItems.length===0?t.style.display=\"\":t.style.display=\"none\")}function ve(r,e){let{page:t}=e,n=r.querySelectorAll(\\`[\\${f.PAGE_CURRENT}]\\`);for(let l of n)l.textContent=String(t.current);let i=r.querySelectorAll(\\`[\\${f.PAGE_TOTAL}]\\`);for(let l of i)l.textContent=String(t.total);let s=r.querySelectorAll(\\`[\\${f.PAGE}=\"prev\"]\\`);for(let l of s)l.disabled=!t.hasPrev,l.style.opacity=t.hasPrev?\"\":\"0.5\";let o=r.querySelectorAll(\\`[\\${f.PAGE}=\"next\"]\\`);for(let l of o)l.disabled=!t.hasNext,l.style.opacity=t.hasNext?\"\":\"0.5\";let a=r.querySelector(\\`[\\${f.PAGE_BUTTONS}]\\`);a&&Ie(a,t,l=>{F.get(r.getAttribute(f.FILTER))?.setPage(l)})}function Ie(r,e,t){if(r.innerHTML=\"\",e.total<=1)return;let n=7,i=[];if(e.total<=n)i=Array.from({length:e.total},(s,o)=>o+1);else{let s=e.current;i=[1],s>3&&i.push(\"...\");for(let o=Math.max(2,s-1);o<=Math.min(e.total-1,s+1);o++)i.includes(o)||i.push(o);s<e.total-2&&i.push(\"...\"),i.includes(e.total)||i.push(e.total)}for(let s of i)if(s===\"...\"){let o=document.createElement(\"span\");o.textContent=\"...\",o.className=\"meno-page-dots\",r.appendChild(o)}else{let o=document.createElement(\"button\");o.type=\"button\",o.textContent=String(s),o.className=s===e.current?\"meno-page-btn active\":\"meno-page-btn\",o.addEventListener(\"click\",()=>t(s)),r.appendChild(o)}}function Fe(r,e){let t=e.getLoadMoreInfo(),n=r.querySelectorAll(\\`[\\${f.REMAINING}]\\`);for(let s of n)s.textContent=String(t.remaining);let i=r.querySelector(\\`[\\${f.LOAD_MORE}]\\`);i&&(i.style.display=t.hasMore?\"\":\"none\")}function Me(r,e){let t=e.getFilters(),n=r.getAttribute(f.ACTIVE_CLASS)||\"active\",i=r.querySelectorAll(\\`[\\${f.FILTER_FIELD}][\\${f.FILTER_VALUE}]\\`);for(let u of i){if(u.tagName===\"INPUT\")continue;let c=u.getAttribute(f.FILTER_FIELD),d=u.getAttribute(f.FILTER_VALUE);if(!c||!d)continue;let h=t[c],m=h!==void 0&&(h===d||Array.isArray(h)&&h.includes(d)||typeof h==\"object\"&&h!==null&&\"$in\"in h&&Array.isArray(h.$in)&&h.$in.includes(d));u.classList.toggle(n,m)}let s=r.querySelectorAll(\\`[\\${f.CLEAR}]\\`),o=Object.keys(t).length>0;for(let u of s)u.classList.toggle(n,!o);let a=e.getSort(),l=r.querySelectorAll(\\`[\\${f.SORT}]\\`);for(let u of l){if(u.tagName===\"SELECT\"){let h=u;a?h.value=\\`\\${a.field}:\\${a.order}\\`:h.value=\"\";continue}let c=u.getAttribute(f.SORT),d=a?.field===c;u.classList.toggle(n,d),d&&a?u.setAttribute(\"data-meno-sort-active\",a.order):u.removeAttribute(\"data-meno-sort-active\")}}function be(r,e){let t=e.getFilters(),n=r.querySelectorAll(\\`[\\${f.RANGE}]\\`);for(let i of n){let s=i.getAttribute(f.RANGE);if(!s)continue;let o=i.getAttribute(f.RANGE_BOUND);if(!o||o!==\"min\"&&o!==\"max\")continue;let a=t[s];if(!a||typeof a!=\"object\"||a===null)continue;let l=a,u=o===\"min\"?l.$gte:l.$lte;if(u!=null)if(i.type===\"date\"){let c=new Date(u);isNaN(c.getTime())||(i.value=c.toISOString().split(\"T\")[0])}else i.value=String(u)}}var M=new Map;async function C(){let r=document.querySelectorAll(\\`[\\${f.FILTER}]\\`);for(let e of r){let t=e.getAttribute(f.FILTER);t&&(M.has(t)||await Ae(e,t))}}async function Ae(r,e){let t=parseInt(r.getAttribute(f.PER_PAGE)||\"0\",10),n=r.getAttribute(f.FILTER_MATCH)||\"and\",i=parseInt(r.getAttribute(f.DEBOUNCE)||\"0\",10),s=r.getAttribute(f.URL_SYNC)===\"true\",o=r.getAttribute(f.URL_MODE)||\"replace\",a,l=r.getAttribute(f.TYPES);if(l)try{a=JSON.parse(l)}catch(T){console.warn(\"MenoFilter: Invalid data-meno-types JSON\",T)}let u=!1,c=.3,d=r.querySelector(\\`[\\${f.SEARCH}]\\`);if(d){u=d.getAttribute(f.SEARCH_FUZZY)===\"true\";let T=d.getAttribute(f.SEARCH_THRESHOLD);if(T){let L=parseFloat(T);isNaN(L)||(c=L)}}let h=new F({collection:e,perPage:t,filterMatch:n,debounce:i,urlSync:s,urlMode:o,fieldTypes:a,fuzzySearch:u,fuzzyThreshold:c}),m=[],{itemTemplate:p,ssrItems:E,itemAs:v}=Ce(r),y={wrapper:r,collection:e,filter:h,cleanup:m,itemTemplate:p,ssrItems:E,itemAs:v,loadMoreMode:!1};M.set(e,y),O(y),N(y),_(y),q(y),D(y),z(y),U(y),await h.init(),w(y),m.push(h.watch(()=>{w(y)}))}function Ce(r){let e=r.querySelector(\\`[\\${f.LIST}]\\`),t=new Map,n=\"item\";if(!e)return{itemTemplate:void 0,ssrItems:t,itemAs:n};let i=e.querySelector(\\`template[\\${f.ITEM}]\\`);if(i){let o=i.innerHTML.trim(),a=o.match(/\\\\{\\\\{(\\\\w+)\\\\./);a&&(n=a[1]);for(let l of Array.from(e.children)){if(l.tagName===\"TEMPLATE\")continue;let u=l.getAttribute(\"data-id\")||l.getAttribute(\"data-_id\");u&&t.set(u,l)}return{itemTemplate:o,ssrItems:t,itemAs:n}}let s=r.querySelector(\\`template[\\${f.ITEM}]\\`);if(s){let o=s.innerHTML.trim(),a=o.match(/\\\\{\\\\{(\\\\w+)\\\\./);return a&&(n=a[1]),{itemTemplate:o,ssrItems:t,itemAs:n}}for(let o=0;o<e.children.length;o++){let a=e.children[o];t.set(\\`__ssr_index_\\${o}\\`,a)}return{itemTemplate:void 0,ssrItems:t,itemAs:n}}function k(r){let e=M.get(r);if(e){for(let t of e.cleanup)t();e.filter.destroy(),M.delete(r),F.destroy(r)}}function Q(){for(let r of M.keys())k(r)}function Re(r){return M.get(r)}function $(){typeof document>\"u\"||(document.readyState===\"loading\"?document.addEventListener(\"DOMContentLoaded\",()=>C()):C())}$();var Pe={initMenoFilter:C,destroyMenoFilter:k,destroyAllMenoFilters:Q,autoInit:$};return ee(we);})();\nwindow.MenoFilter = MenoFilterBundle.MenoFilter;\n`;\n\n/**\n * Check if HTML contains elements that need MenoFilter\n */\nexport function needsMenoFilter(html: string): boolean {\n // Check for inline CMS data scripts\n if (/id=\"meno-cms-[^\"]+\"/i.test(html)) {\n return true;\n }\n // Check for cms-list nodes (static strategy)\n if (/data-cms-list=\"true\"/i.test(html)) {\n return true;\n }\n // Check for data-meno-filter wrappers\n if (/data-meno-filter=\"/i.test(html)) {\n return true;\n }\n return false;\n}\n\n/**\n * Check if any schemas have clientData enabled\n */\nexport function schemasNeedMenoFilter(schemas: Array<{ clientData?: { enabled: boolean } }>): boolean {\n return schemas.some((schema) => schema.clientData?.enabled === true);\n}\n\nexport default menoFilterScript;\n", "/**\n * Client Data Injector\n *\n * Utilities for injecting CMS collection data into HTML for client-side filtering.\n * Generates inline JSON script tags that MenoFilter can read.\n */\n\nimport type { CMSItem, CMSClientDataConfig } from '../../shared/types/cms';\n\n/** System fields that are always included in client data */\nconst SYSTEM_FIELDS = ['_id', '_url', '_filename', '_slug'];\n\n/**\n * Filter CMS items to only include specified fields.\n * System fields (_id, _url, _filename, _slug) are always included.\n *\n * @param items CMS items to filter\n * @param fields Fields to include (undefined or empty = all fields)\n * @returns Filtered items with only specified fields\n */\nexport function filterItemFields(items: CMSItem[], fields: string[] | undefined): CMSItem[] {\n // If no field restriction, return all items as-is\n if (!fields || fields.length === 0) {\n return items;\n }\n\n // Build set of allowed fields (user fields + system fields)\n const allowedFields = new Set([...SYSTEM_FIELDS, ...fields]);\n\n // Filter each item to only include allowed fields\n return items.map((item) => {\n const filtered: CMSItem = { _id: item._id };\n\n for (const [key, value] of Object.entries(item)) {\n if (allowedFields.has(key)) {\n filtered[key] = value;\n }\n }\n\n return filtered;\n });\n}\n\n/**\n * Generate inline JSON script tag for collection data.\n * Uses type=\"application/json\" so it doesn't execute, just stores data.\n *\n * @param collection Collection ID\n * @param items Items to embed\n * @returns HTML script tag string\n */\nexport function generateInlineDataScript(collection: string, items: CMSItem[]): string {\n // Escape HTML entities in JSON to prevent XSS\n const jsonString = JSON.stringify(items).replace(/</g, '\\\\u003c').replace(/>/g, '\\\\u003e').replace(/&/g, '\\\\u0026');\n\n return `<script type=\"application/json\" id=\"meno-cms-${escapeAttr(collection)}\">${jsonString}</script>`;\n}\n\n/**\n * Escape attribute value for safe HTML insertion\n */\nfunction escapeAttr(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n\n/**\n * Determine the effective strategy for a collection based on config and item count.\n *\n * @param config Client data config\n * @param itemCount Number of items in collection\n * @returns Effective strategy ('inline' or 'static')\n */\nexport function determineStrategy(config: CMSClientDataConfig, itemCount: number): 'inline' | 'static' {\n if (config.strategy === 'inline') return 'inline';\n if (config.strategy === 'static') return 'static';\n\n // Auto strategy: use threshold to decide\n const threshold = config.threshold ?? 500;\n return itemCount <= threshold ? 'inline' : 'static';\n}\n\n/**\n * Collection data prepared for client-side injection\n */\nexport interface ClientDataCollection {\n /** Collection ID */\n collection: string;\n /** Filtered items for client */\n items: CMSItem[];\n /** Client data config */\n config: CMSClientDataConfig;\n /** Determined strategy */\n strategy: 'inline' | 'static';\n}\n\n/**\n * Prepare collection data for client-side injection.\n * Filters fields and determines strategy.\n *\n * @param collection Collection ID\n * @param items All items in collection\n * @param config Client data config from schema\n * @returns Prepared collection data, or null if not enabled\n */\nexport function prepareClientData(\n collection: string,\n items: CMSItem[],\n config: CMSClientDataConfig | undefined,\n): ClientDataCollection | null {\n // Skip if not enabled\n if (!config?.enabled) {\n return null;\n }\n\n const strategy = determineStrategy(config, items.length);\n const filteredItems = filterItemFields(items, config.fields);\n\n return {\n collection,\n items: filteredItems,\n config,\n strategy,\n };\n}\n\n/**\n * Generate all inline data scripts for collections using inline strategy.\n *\n * @param collections Map of collection ID to prepared client data\n * @returns Combined HTML string with all data scripts\n */\nexport function generateAllInlineDataScripts(collections: Map<string, ClientDataCollection>): string {\n const scripts: string[] = [];\n\n for (const [collectionId, data] of collections) {\n if (data.strategy === 'inline') {\n scripts.push(generateInlineDataScript(collectionId, data.items));\n }\n }\n\n return scripts.join('\\n ');\n}\n", "/**\n * HTML document generation for SSR\n * Generates complete HTML documents with SSR content\n * Supports CSP-compliant external scripts for static builds\n */\n\nimport type { ComponentDefinition, JSONPage, PageLibrariesConfig, CustomCodeConfig } from '../../shared/types';\nimport type { SlugMap } from '../../shared/slugTranslator';\nimport type { CMSService } from '../services/cmsService';\nimport { configService } from '../services/configService';\nimport { loadBreakpointConfig, loadIconsConfig, loadPrefetchConfig } from '../jsonLoader';\nimport { generateFontCSS, generateFontPreloadTags, loadProjectConfig } from '../../shared/fontLoader';\nimport { colorService } from '../services/ColorService';\nimport { generateThemeColorVariablesCSS, generateVariablesCSS } from '../cssGenerator';\nimport { variableService } from '../services/VariableService';\nimport {\n generateUtilityCSS,\n extractUtilityClassesFromHTML,\n generateAllInteractiveCSS,\n} from '../../shared/cssGeneration';\nimport { rewriteViewportUnits } from '../../shared/viewportUnits';\nimport { printMissingStyleWarnings } from '../validateStyleCoverage';\nimport { formHandlerScript, needsFormHandler } from '../../client/scripts/formHandler';\nimport { menoFilterScript, needsMenoFilter } from '../../client/meno-filter/script.generated';\nimport { generateAllInlineDataScripts, prepareClientData, type ClientDataCollection } from './clientDataInjector';\nimport {\n mergeLibraries,\n generateLibraryTags,\n collectComponentLibraries,\n filterLibrariesByContext,\n} from '../../shared/libraryLoader';\nimport { escapeHtml } from './attributeBuilder';\nimport { renderPageSSR, type PreloadImage } from './ssrRenderer';\nimport type { CMSContext } from './cmsSSRProcessor';\nimport { resolveProjectPath } from '../projectContext';\nimport { readTextFile } from '../runtime/fs';\n\n/**\n * Generate image preload link tags for high-priority images\n * Uses imagesrcset and imagesizes for responsive image preloading\n */\nfunction generateImagePreloadTags(preloadImages: PreloadImage[]): string {\n if (preloadImages.length === 0) return '';\n\n return preloadImages\n .map(\n (img) =>\n `<link rel=\"preload\" as=\"image\" type=\"${img.type}\" imagesrcset=\"${escapeHtml(img.srcset)}\" imagesizes=\"${escapeHtml(img.sizes)}\" fetchpriority=\"high\">`,\n )\n .join('\\n ');\n}\n\n/**\n * Minify CSS code using regex-based minification\n * Removes comments, unnecessary whitespace, and optimizes values\n */\nfunction minifyCSS(code: string): string {\n if (!code.trim()) return code;\n\n return (\n code\n // Remove CSS comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n // Remove whitespace around block / declaration delimiters and selector\n // combinators. We deliberately exclude `+` and `-` from this set: they\n // are selector combinators (e.g. `a + b`, but `~` is also rare; siblings)\n // AND arithmetic operators inside `calc()` / `clamp()` / `min()` / `max()`,\n // where they REQUIRE surrounding spaces. Stripping there produces invalid\n // CSS like `padding-top: clamp(.5*16px,((.5 - .5)/(90 - 20))*16px+(...))`,\n // which the browser silently drops, collapsing paddings/margins to 0.\n // The cost of leaving spaces around `+` selectors is a few extra bytes;\n // the cost of stripping them is broken layout.\n .replace(/\\s*([{};:,>~])\\s*/g, '$1')\n // Collapse multiple spaces/newlines into single space\n .replace(/\\s+/g, ' ')\n // Remove space after opening brace\n .replace(/\\{\\s+/g, '{')\n // Remove space before closing brace\n .replace(/\\s+\\}/g, '}')\n // Remove trailing semicolons before closing braces\n .replace(/;}/g, '}')\n // Remove leading/trailing whitespace\n .trim()\n );\n}\n\n/**\n * Result of SSR HTML generation with separate JS for CSP compliance\n */\nexport interface SSRHTMLResult {\n /** Complete HTML document */\n html: string;\n /** JavaScript code to be written to external file (for CSP compliance) */\n javascript: string | null;\n}\n\n/**\n * Options for SSR HTML generation\n */\nexport interface GenerateSSRHTMLOptions {\n /** Page data to render */\n pageData: JSONPage;\n /** Global component definitions */\n globalComponents?: Record<string, ComponentDefinition>;\n /** URL path for the page */\n pagePath?: string;\n /** Base URL for assets */\n baseUrl?: string;\n /** Use built bundle (production) vs dev server */\n useBuiltBundle?: boolean;\n /** Locale for i18n */\n locale?: string;\n /** Slug mappings for locale switching */\n slugMappings?: SlugMap[];\n /** CMS context for template rendering */\n cmsContext?: CMSContext;\n /** CMS service for CMSList queries */\n cmsService?: CMSService;\n /** When true, draft items are filtered out from CMS lists */\n isProductionBuild?: boolean;\n /**\n * Path to external scripts file (for CSP compliance).\n * When provided, JS is NOT inlined but referenced via this path.\n * Example: \"/_scripts/abc123.js\"\n */\n externalScriptPath?: string;\n /**\n * CMS template path for client-side hydration (dev mode only).\n * When provided, serializes CMS context to window.__MENO_CMS__ so the\n * client Router can load the template instead of the CMS URL.\n * Example: \"/templates/posts\"\n */\n cmsTemplatePath?: string;\n /**\n * Page-level library configuration (merged with global libraries)\n */\n pageLibraries?: PageLibrariesConfig;\n /**\n * Page-level custom code injection (merged with global custom code)\n */\n pageCustomCode?: CustomCodeConfig;\n /**\n * Client-side CMS data for collections with clientData enabled.\n * Used for injecting inline JSON data for MenoFilter.\n */\n clientDataCollections?: Map<string, ClientDataCollection>;\n /**\n * Inject live reload script for on-demand SSR preview mode.\n * When true, adds a WebSocket client that reloads the page on HMR messages.\n */\n injectLiveReload?: boolean;\n /**\n * Emit selection-tracking attributes (data-element-path, data-cms-item-index,\n * data-cms-context, data-component-root, data-parent-component, data-component-context)\n * so XRayOverlay and click-to-select can hook into the SSR DOM.\n * Should ONLY be true when the request originates from the editor preview iframe\n * (the studio's /__static__/ proxy sends an `x-meno-editor` header).\n * Direct browser access to the SSR preview server must produce clean output.\n */\n injectEditorAttrs?: boolean;\n /** Whether this is the visual editor (studio). Affects library filtering. */\n isEditor?: boolean;\n /** Actual bound server port for live reload WS (connects directly to SSR server) */\n serverPort?: number;\n /**\n * Per-request CSP nonce. When set, every inline `<script>` emitted by this\n * generator carries `nonce=\"${nonce}\"`. The HTTP route handler must send\n * the same nonce in the `script-src` directive of the response CSP header\n * (and the Electron main process splices it into the BrowserWindow CSP).\n * When unset, scripts are emitted without a nonce attribute \u2014 callers that\n * still rely on `'unsafe-inline'` (legacy / direct CLI usage) keep working.\n */\n cspNonce?: string;\n}\n\n/**\n * Generate complete HTML document with SSR content (legacy positional args)\n */\nexport async function generateSSRHTML(\n pageData: JSONPage,\n globalComponents?: Record<string, ComponentDefinition>,\n pagePath?: string,\n baseUrl?: string,\n useBuiltBundle?: boolean,\n locale?: string,\n slugMappings?: SlugMap[],\n cmsContext?: CMSContext,\n cmsService?: CMSService,\n externalScriptPath?: string,\n): Promise<string>;\n\n/**\n * Generate complete HTML document with SSR content (options object, returns separate JS for CSP)\n */\nexport async function generateSSRHTML(\n options: GenerateSSRHTMLOptions & { returnSeparateJS: true },\n): Promise<SSRHTMLResult>;\n\n/**\n * Generate complete HTML document with SSR content (options object)\n */\nexport async function generateSSRHTML(options: GenerateSSRHTMLOptions & { returnSeparateJS?: false }): Promise<string>;\n\n/**\n * Generate complete HTML document with SSR content\n */\nexport async function generateSSRHTML(\n pageDataOrOptions: JSONPage | (GenerateSSRHTMLOptions & { returnSeparateJS?: boolean }),\n globalComponents: Record<string, ComponentDefinition> = {},\n pagePath: string = '/',\n baseUrl: string = '',\n useBuiltBundle: boolean = false,\n locale?: string,\n slugMappings?: SlugMap[],\n cmsContext?: CMSContext,\n cmsService?: CMSService,\n externalScriptPath?: string,\n): Promise<string | SSRHTMLResult> {\n // Handle options object vs legacy positional args\n let options: GenerateSSRHTMLOptions & { returnSeparateJS?: boolean };\n\n if ('pageData' in pageDataOrOptions) {\n options = pageDataOrOptions;\n } else {\n options = {\n pageData: pageDataOrOptions,\n globalComponents,\n pagePath,\n baseUrl,\n useBuiltBundle,\n locale,\n slugMappings,\n cmsContext,\n cmsService,\n externalScriptPath,\n };\n }\n\n const {\n pageData,\n globalComponents: components = {},\n pagePath: path = '/',\n baseUrl: base = '',\n useBuiltBundle: useBundled = false,\n locale: loc,\n slugMappings: slugs,\n cmsContext: cms,\n cmsService: cmsServ,\n externalScriptPath: extScriptPath,\n cmsTemplatePath,\n returnSeparateJS = false,\n pageLibraries,\n pageCustomCode,\n clientDataCollections,\n injectLiveReload = false,\n injectEditorAttrs = false,\n isEditor = false,\n isProductionBuild = false,\n serverPort,\n cspNonce,\n } = options;\n\n // Attribute fragment for stamping nonce on inline <script> tags. Empty when\n // no nonce is supplied so legacy ('unsafe-inline') paths keep working.\n const nonceAttr = cspNonce ? ` nonce=\"${cspNonce}\"` : '';\n // Editor selection attributes (data-element-path, data-cms-context, ...) are gated\n // on injectEditorAttrs \u2014 set ONLY when the request comes from the editor preview iframe\n // via the studio's /__static__/ proxy (which sends an `x-meno-editor` header).\n // Direct hits to the SSR preview server (e.g., http://localhost:8082/) get clean output.\n const rendered = await renderPageSSR(\n pageData,\n components,\n path,\n base,\n loc,\n undefined,\n slugs,\n cms,\n cmsServ,\n isProductionBuild,\n injectEditorAttrs,\n );\n\n // Auto-inject data for nested collections (detected during SSR)\n // This enables client-side hydration for nested cms-list placeholders\n let finalClientDataCollections = clientDataCollections;\n if (rendered.neededCollections.size > 0 && cmsServ) {\n // Create a mutable copy if we need to add collections\n finalClientDataCollections = clientDataCollections ? new Map(clientDataCollections) : new Map();\n\n for (const collectionId of rendered.neededCollections) {\n // Skip if already provided\n if (finalClientDataCollections.has(collectionId)) continue;\n\n // Get schema to check if clientData is enabled\n const schema = cmsServ.getSchema(collectionId);\n if (!schema?.clientData?.enabled) {\n console.warn(`[SSR] Nested collection \"${collectionId}\" needs clientData.enabled for client-side hydration`);\n continue;\n }\n\n // Get items and prepare client data (force inline for nested collections)\n const items = await cmsServ.queryItems({\n collection: collectionId,\n excludeDraftLocale: loc,\n });\n const clientData = prepareClientData(collectionId, items, {\n ...schema.clientData,\n strategy: 'inline', // Force inline for nested collections\n });\n\n if (clientData) {\n finalClientDataCollections.set(collectionId, clientData);\n }\n }\n }\n\n // Load and merge external library configuration\n // Merge order: global \u2192 component \u2192 page (page can \"replace\" global+component, or \"extend\" all)\n await configService.load();\n const globalLibraries = configService.getLibraries() || { js: [], css: [] };\n const globalCustomCode = configService.getCustomCode();\n // The Meno badge previously used inline event handlers (onmouseenter /\n // onmouseleave) to drive its opacity hover, which CSP with `'nonce-\u2026'` and\n // no `'unsafe-inline'` rejects. Move the hover to a stylesheet rule using a\n // dedicated class so nonces aren't needed for this purely-presentational\n // effect.\n const menoBadgeHtml = configService.getShowMenoBadge()\n ? `<style${nonceAttr}>.meno-badge{position:fixed;bottom:12px;left:12px;z-index:9999;background:#000;color:#fff;padding:4px 10px;border-radius:6px;font-size:12px;font-family:system-ui,sans-serif;text-decoration:none;opacity:0.8;transition:opacity 0.2s}.meno-badge:hover,.meno-badge:focus{opacity:1}</style><a class=\"meno-badge\" href=\"https://meno.so\" target=\"_blank\" rel=\"noopener\">Made in Meno</a>`\n : '';\n const mergedCustomCode = {\n head: [globalCustomCode.head, pageCustomCode?.head].filter(Boolean).join('\\n'),\n bodyStart: [globalCustomCode.bodyStart, pageCustomCode?.bodyStart].filter(Boolean).join('\\n'),\n bodyEnd: [globalCustomCode.bodyEnd, pageCustomCode?.bodyEnd, menoBadgeHtml].filter(Boolean).join('\\n'),\n };\n const componentLibraries = collectComponentLibraries(components, pageData.components || {});\n // Merge global + component first (component libraries always extend)\n const globalPlusComponent = mergeLibraries(globalLibraries, componentLibraries) || { js: [], css: [] };\n // Then merge with page libraries (page can replace or extend)\n const mergedRaw = mergeLibraries(globalPlusComponent, pageLibraries) || { js: [], css: [] };\n // Deduplicate by URL so the same library isn't loaded twice\n const seenJS = new Set<string>();\n const seenCSS = new Set<string>();\n const mergedLibraries = {\n js: (mergedRaw.js || []).filter((lib) => {\n if (seenJS.has(lib.url)) return false;\n seenJS.add(lib.url);\n return true;\n }),\n css: (mergedRaw.css || []).filter((lib) => {\n if (seenCSS.has(lib.url)) return false;\n seenCSS.add(lib.url);\n return true;\n }),\n };\n const libraryContext = isEditor ? 'editor' : useBundled && !injectLiveReload ? 'build' : 'preview';\n const filteredLibraries = filterLibrariesByContext(mergedLibraries, libraryContext);\n\n // Cache-bust local library URLs in dev/preview to avoid stale browser cache\n const devMode = !useBundled || injectLiveReload;\n const bustCache = devMode ? `?v=${Date.now()}` : '';\n const finalLibraries = bustCache\n ? {\n js: (filteredLibraries.js || []).map((lib) =>\n lib.url.startsWith('/') ? { ...lib, url: lib.url + bustCache } : lib,\n ),\n css: (filteredLibraries.css || []).map((lib) =>\n lib.url.startsWith('/') ? { ...lib, url: lib.url + bustCache } : lib,\n ),\n }\n : filteredLibraries;\n\n // Read local CSS files for inline embedding\n const inlineContents = new Map<string, string>();\n for (const css of finalLibraries.css || []) {\n // Inline by default for local files, unless explicitly set to false\n const shouldInline = css.inline !== false && css.url.startsWith('/');\n if (shouldInline) {\n try {\n const cleanUrl = css.url.split('?')[0] ?? css.url; // Strip cache-bust query param\n const filePath = resolveProjectPath(cleanUrl.slice(1));\n const content = await readTextFile(filePath);\n inlineContents.set(css.url, content);\n } catch {\n // File not found \u2014 fall back to <link> tag\n }\n }\n }\n\n const libraryTags = generateLibraryTags(finalLibraries, inlineContents);\n\n // Use built bundle in production, dev server in development\n const clientScript = useBundled\n ? '' // No client router in static build (true static HTML)\n : '<script type=\"module\" src=\"/client-router.tsx\"></script>'; // Dev server (development)\n\n // Collect all JavaScript (component JS + form handler + meno filter if needed)\n const needsForm = needsFormHandler(rendered.html);\n // Include MenoFilter if: inline clientData exists OR page has cms-list nodes (for static strategy)\n const needsFilter =\n (finalClientDataCollections && finalClientDataCollections.size > 0) || needsMenoFilter(rendered.html);\n const allJavaScript = [\n rendered.javascript || '',\n needsForm ? formHandlerScript : '',\n needsFilter ? menoFilterScript : '',\n ]\n .filter(Boolean)\n .join('\\n\\n');\n\n // Determine script output based on mode\n let componentScript = '';\n let externalJavaScript: string | null = null;\n\n if (allJavaScript) {\n if (extScriptPath) {\n // CSP-compliant: reference external script file (defer to avoid render-blocking)\n componentScript = `\\n <script src=\"${extScriptPath}\" defer></script>`;\n externalJavaScript = allJavaScript;\n } else if (returnSeparateJS) {\n // Return JS separately (for build-static to write to file)\n externalJavaScript = allJavaScript;\n } else {\n // Legacy inline mode (dev server)\n // Escape </script> sequences to prevent premature script tag closure\n const escapedJavaScript = allJavaScript.replace(/<\\/script>/gi, '<\\\\/script>');\n componentScript = `\\n <script${nonceAttr}>\\n${escapedJavaScript}\\n </script>`;\n }\n }\n\n // Ensure project config is loaded (reloads from disk if cache was cleared)\n await loadProjectConfig();\n const fontCSS = generateFontCSS();\n const fontPreloadTags = generateFontPreloadTags();\n\n // Load icons config for favicon and apple touch icon\n const iconsConfig = await loadIconsConfig();\n\n // Load and generate theme color variables CSS\n const themeConfig = await colorService.loadThemeConfig();\n const themeColorVariablesCSS = generateThemeColorVariablesCSS(themeConfig);\n\n // Include component CSS (no longer generating inline style classes)\n const componentCSS = rendered.componentCSS || '';\n\n // Extract and generate utility CSS from rendered HTML\n const usedUtilityClasses = extractUtilityClassesFromHTML(rendered.html);\n const breakpointConfig = await loadBreakpointConfig();\n const responsiveScalesConfig = configService.getResponsiveScales();\n\n // Load and generate CSS custom properties from variables.json\n const variablesConfig = await variableService.loadConfig();\n const variablesCSS = generateVariablesCSS(variablesConfig, breakpointConfig, responsiveScalesConfig);\n const remConversionConfig = configService.getRemConversion();\n const utilityCSS = generateUtilityCSS(\n usedUtilityClasses,\n breakpointConfig,\n responsiveScalesConfig,\n remConversionConfig,\n );\n\n // Generate interactive styles CSS from map collected during render\n const interactiveCSS =\n rendered.interactiveStylesMap.size > 0\n ? generateAllInteractiveCSS(\n rendered.interactiveStylesMap,\n breakpointConfig,\n remConversionConfig,\n responsiveScalesConfig,\n )\n : '';\n\n // Print warnings for any unmapped styles found during build\n printMissingStyleWarnings(false);\n\n // Build base CSS (reset styles)\n const baseCSS = `* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\nbody {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif;\n}\nbutton {\n background: none;\n border: none;\n padding: 0;\n font: inherit;\n cursor: pointer;\n outline: inherit;\n}\nimg {\n max-width: 100%;\n height: auto;\n}\npicture {\n display: block;\n}\n.olink {\n text-decoration: none;\n display: block;\n color: inherit;\n}\n.oem {\n display: inline-block;\n vertical-align: top;\n line-height: 0;\n}\n/* line-height:0 above kills the inline-block descender gap (inline SVG/icon\n embeds), but line-height inherits \u2014 so block rich-text inside an <Embed>\n (CMS content: <p>/<li>/\u2026) would collapse its text lines onto each other.\n Restore a normal line-height on the embed's children. Astro play renders\n rich-text bare (no .oem), which is why it looked correct only there. */\n.oem > * {\n line-height: normal;\n}`;\n\n // Combine all CSS\n const combinedCSS = [fontCSS, themeColorVariablesCSS, variablesCSS, baseCSS, componentCSS, utilityCSS, interactiveCSS]\n .filter(Boolean)\n .join('\\n');\n\n // Rewrite vh/vw to calc(var(--design-vh, 1vh) * N) so the studio's design\n // canvas can pin viewport units to a stable height (avoids the\n // iframe.height \u2194 100vh feedback loop). var() fallback to 1vh means this\n // is a no-op in production / page mode where --design-vh is unset.\n const cssWithStableViewport = rewriteViewportUnits(combinedCSS);\n\n // Minify CSS in production mode\n const finalCSS = useBundled ? minifyCSS(cssWithStableViewport) : cssWithStableViewport;\n\n // Load prefetch config for client-side prefetching\n const prefetchConfig = await loadPrefetchConfig();\n // Only include non-default values to minimize payload\n const menoConfig = prefetchConfig.enabled ? { prefetch: prefetchConfig } : {};\n // Config script - inline for dev, include in external JS for static build\n const hasConfig = Object.keys(menoConfig).length > 0;\n const configInlineScript =\n hasConfig && !extScriptPath && !returnSeparateJS\n ? `<script${nonceAttr}>window.__MENO_CONFIG__=${JSON.stringify(menoConfig)}</script>\\n `\n : '';\n // Add config to external JS if using external scripts\n if (hasConfig && externalJavaScript !== null) {\n externalJavaScript = `window.__MENO_CONFIG__=${JSON.stringify(menoConfig)};\\n\\n${externalJavaScript}`;\n }\n\n // CMS context script - needed when a client-side Router is present (dev mode or studio preview)\n // Production builds are pure HTML with no client routing, so excluded\n const cmsInlineScript =\n cmsTemplatePath && cms && (!useBundled || injectLiveReload)\n ? `<script${nonceAttr}>window.__MENO_CMS__=${JSON.stringify({ item: cms.cms, templatePath: cmsTemplatePath })}</script>\\n `\n : '';\n\n // Client data scripts - inline JSON for MenoFilter (production builds only)\n const clientDataScripts =\n finalClientDataCollections && finalClientDataCollections.size > 0\n ? `${generateAllInlineDataScripts(finalClientDataCollections)}\\n `\n : '';\n\n // Generate favicon and apple touch icon link tags.\n // When a dark-mode favicon is configured alongside the default, scope the\n // default to `(prefers-color-scheme: light)` and emit a second tag scoped to\n // `(prefers-color-scheme: dark)` so the browser swaps automatically.\n // Note: apple-touch-icon does not honor prefers-color-scheme on iOS.\n const hasDarkFavicon = !!(iconsConfig.favicon && iconsConfig.faviconDark);\n const faviconTag = iconsConfig.favicon\n ? `<link rel=\"icon\" href=\"${escapeHtml(iconsConfig.favicon)}\"${hasDarkFavicon ? ' media=\"(prefers-color-scheme: light)\"' : ''} />`\n : '';\n const faviconDarkTag = iconsConfig.faviconDark\n ? `<link rel=\"icon\" href=\"${escapeHtml(iconsConfig.faviconDark)}\" media=\"(prefers-color-scheme: dark)\" />`\n : '';\n const appleTouchIconTag = iconsConfig.appleTouchIcon\n ? `<link rel=\"apple-touch-icon\" href=\"${escapeHtml(iconsConfig.appleTouchIcon)}\" />`\n : '';\n const iconTags = [faviconTag, faviconDarkTag, appleTouchIconTag].filter(Boolean).join('\\n ');\n\n // Script preload tag - eliminates critical request chain by discovering script early\n const scriptPreloadTag = extScriptPath ? `<link rel=\"preload\" href=\"${extScriptPath}\" as=\"script\">` : '';\n\n // Image preload tags for high-priority images (LCP optimization)\n const imagePreloadTags = generateImagePreloadTags(rendered.preloadImages);\n\n // Live reload script for on-demand SSR preview mode (in-place DOM update, no white flash)\n const wsUrl = serverPort ? `'ws://localhost:${serverPort}/hmr'` : `location.origin.replace('http','ws')+'/hmr'`;\n // True hot reload for the studio's static preview iframe.\n //\n // The central question on every edit is: did the EDITOR change page\n // *structure*, or only styles/content? We answer it by comparing the\n // previous server render (lastSrvRoot) against the freshly fetched one via\n // structKey() \u2014 the sorted set of `data-element-path` keys. This is\n // deliberately independent of the LIVE DOM, which user JS routinely mutates\n // at runtime (a slider clones slides, a nav injects a backdrop); those\n // runtime mutations must NOT be mistaken for editor structural changes.\n //\n // * SOFT update (server structure unchanged AND /_scripts hash unchanged):\n // a pure style/content/attribute edit. softSync() patches matching\n // elements in place (attributes, classes, text) WITHOUT replacing #root\n // and WITHOUT re-running component JS. DOM identity, event listeners,\n // JS-built children (slider clones) and runtime state (open menus,\n // carousel position, counters) all survive. `#meno-styles` is updated in\n // place so the new CSS applies live. This is what lets you tweak styles\n // with the navigation open without it snapping shut.\n // * HARD reset (server structure changed \u2014 nodes added/removed/reparented \u2014\n // OR the /_scripts/{hash}.js URL changed because user JS was edited; the\n // URL is content-addressed, see scriptCache.hashContent): #root is\n // wholesale `innerHTML`-replaced from the server markup and the component\n // script is re-run (old `/_scripts` tag removed, cache-busted copy\n // appended, DOMContentLoaded re-dispatched). Interactive state resets,\n // which is expected when structure or behavior actually changed. Because\n // the whole subtree is replaced first there are no surviving listeners to\n // double-bind, so the re-run is clean.\n //\n // softSync() preserves runtime mutations the same way for classes AND\n // attributes: a value that differs from the previous server snapshot but\n // that the new server render left unchanged is treated as a runtime addition\n // (e.g. `nav-dropdown-open`, `aria-expanded=\"true\"`, a JS-set inline `style`)\n // and kept; a value the server itself changed is an editor edit and wins.\n // Element identity relies on `data-element-path`, emitted on every element\n // when the request comes through the studio's `/__static__/` proxy (which\n // sets `x-meno-editor: 1`).\n //\n // CMS list items all share the SAME `data-element-path` \u2014 processList()\n // advances the per-item index in `cmsItemIndexPath`, not in `elementPath` \u2014\n // so keying the diff on path alone collapses every card onto the LAST item\n // sharing that path, and editing one item leaks its data into its siblings'\n // cards. ek() therefore composes the path with `data-cms-item-index` (the\n // disambiguator the SSR already emits per item) so each card patches from\n // its own server counterpart, regardless of any client-side (MenoFilter)\n // reordering of the live list DOM. Non-list elements have no item-index, so\n // their key \u2014 and behavior \u2014 is unchanged.\n //\n // The `#meno-styles` stylesheet is updated IN PLACE (`os.textContent=...`),\n // never by replacing the node. Under the editor preview's hardened CSP,\n // `style-src` is nonce-only and the nonce rotates every request (see\n // pages.ts / cspNonce.ts). Swapping in a `<style>` parsed from the freshly\n // fetched HTML would carry that request's new nonce \u2014 which no longer\n // matches the iframe document's locked-in CSP \u2014 so Chromium would drop the\n // node and ALL CSS would vanish. Mutating the already-approved node's text\n // doesn't re-trigger nonce validation (same trick StyleInjector uses in dev).\n //\n // For the same reason, the `<script id=\"meno-cms-*\">` context scripts (which\n // ARE recreated, since an inline script must be a fresh node to re-execute)\n // are stamped with `docNonce` \u2014 the ORIGINAL page nonce read once from\n // `<meta name=\"csp-nonce\">`, not the rotated nonce in the freshly fetched\n // HTML. Without it, nonce-only `script-src` would drop the recreated script\n // and CMS hot-reload (updated `window.__MENO_CMS__` data) would silently fail.\n const liveReloadScript = injectLiveReload\n ? `<script${nonceAttr}>(function(){var ws,timer,gen=0,lastSrvRoot=null,dn=document.querySelector('meta[name=\"csp-nonce\"]'),docNonce=dn?dn.getAttribute('content'):'';function strip(s){return s?s.replace(/[?&]_r=\\\\d+/,''):''}function classList(el){return (el.getAttribute('class')||'').split(/\\\\s+/).filter(Boolean)}function syncEl(cur,srv,old){var cc=classList(cur),sc=classList(srv),oc=old?new Set(classList(old)):new Set();var rt=cc.filter(function(c){return !oc.has(c)});var seen=new Set(),fin=[];sc.concat(rt).forEach(function(c){if(!seen.has(c)){seen.add(c);fin.push(c)}});var fs=fin.join(' ');if((cur.getAttribute('class')||'')!==fs){if(fs)cur.setAttribute('class',fs);else cur.removeAttribute('class')}for(var i=0;i<srv.attributes.length;i++){var a=srv.attributes[i];if(a.name==='class')continue;var ov=old?old.getAttribute(a.name):null;if(a.value!==ov){if(cur.getAttribute(a.name)!==a.value)cur.setAttribute(a.name,a.value)}}if(old){for(var i=0;i<old.attributes.length;i++){var a=old.attributes[i];if(a.name==='class')continue;if(!srv.hasAttribute(a.name)&&cur.hasAttribute(a.name))cur.removeAttribute(a.name)}}}function syncText(cur,srv){var cc=cur.childNodes,sc=srv.childNodes;for(var i=0;i<sc.length;i++){var s=sc[i],c=cc[i];if(s.nodeType===3&&c&&c.nodeType===3){if(c.textContent!==s.textContent)c.textContent=s.textContent}}}function ek(el){var p=el.getAttribute('data-element-path'),ci=el.getAttribute('data-cms-item-index');return ci?p+'|'+ci:p}function structKey(root){var e=root.querySelectorAll('[data-element-path]'),k=[];for(var i=0;i<e.length;i++)k.push(ek(e[i]));return k.sort().join('~')}function softSync(curR,srvR,oldR){var ce=curR.querySelectorAll('[data-element-path]');var sbp={},se=srvR.querySelectorAll('[data-element-path]');for(var i=0;i<se.length;i++)sbp[ek(se[i])]=se[i];var obp={};if(oldR){var oe=oldR.querySelectorAll('[data-element-path]');for(var i=0;i<oe.length;i++)obp[ek(oe[i])]=oe[i]}for(var i=0;i<ce.length;i++){var c=ce[i],p=ek(c),s=sbp[p];if(!s)continue;syncEl(c,s,obp[p]);syncText(c,s)}syncText(curR,srvR)}function connect(){ws=new WebSocket(${wsUrl});ws.onmessage=function(e){var d=JSON.parse(e.data);if(d.type==='hmr:libraries-update'){location.reload()}else if(d.type==='hmr:update'||d.type==='hmr:cms-update'||d.type==='hmr:colors-update'||d.type==='hmr:variables-update')hotReload()};ws.onclose=function(){clearTimeout(timer);timer=setTimeout(connect,1000)}}function hotReload(){var g=++gen;var sx=window.scrollX,sy=window.scrollY;fetch(location.href,{cache:'no-store'}).then(function(r){return r.text()}).then(function(html){if(g!==gen)return;var p=new DOMParser();var d=p.parseFromString(html,'text/html');var or=document.getElementById('root'),nr=d.getElementById('root');var oscr=document.querySelector('script[src^=\"/_scripts/\"]'),nscr=d.querySelector('script[src^=\"/_scripts/\"]');var oss=oscr?strip(oscr.getAttribute('src')):'',nss=nscr?strip(nscr.getAttribute('src')):'';var hardReset=(oss!==nss)||!lastSrvRoot||!or||!nr||structKey(lastSrvRoot)!==structKey(nr);if(or&&nr){if(hardReset){if(or.innerHTML!==nr.innerHTML)or.innerHTML=nr.innerHTML}else{softSync(or,nr,lastSrvRoot)}}if(nr)lastSrvRoot=nr.cloneNode(true);var os=document.getElementById('meno-styles'),ns=d.getElementById('meno-styles');if(os&&ns&&os.textContent!==ns.textContent)os.textContent=ns.textContent;var nh=d.documentElement;if(nh){var nl=nh.getAttribute('lang')||'en',nt=nh.getAttribute('theme')||'light';if(document.documentElement.getAttribute('lang')!==nl)document.documentElement.setAttribute('lang',nl);if(document.documentElement.getAttribute('theme')!==nt)document.documentElement.setAttribute('theme',nt)}var ocms=document.querySelectorAll('script[id^=\"meno-cms-\"]'),ncms=d.querySelectorAll('script[id^=\"meno-cms-\"]');var ock=JSON.stringify(Array.prototype.map.call(ocms,function(s){return [s.id,s.textContent]}));var nck=JSON.stringify(Array.prototype.map.call(ncms,function(s){return [s.id,s.textContent]}));if(ock!==nck){ocms.forEach(function(s){s.remove()});ncms.forEach(function(s){var c=document.createElement('script');c.type=s.type;c.id=s.id;if(docNonce)c.nonce=docNonce;c.textContent=s.textContent;document.head.appendChild(c)})}window.__menoHotReload=true;var olib=document.querySelectorAll('body > script[src^=\"/libraries/\"]'),nlib=d.querySelectorAll('body > script[src^=\"/libraries/\"]');var olk=JSON.stringify(Array.prototype.map.call(olib,function(s){return strip(s.getAttribute('src'))}).sort());var nlk=JSON.stringify(Array.prototype.map.call(nlib,function(s){return strip(s.getAttribute('src'))}).sort());if(olk!==nlk){olib.forEach(function(o){o.remove()});nlib.forEach(function(n){var src=n.getAttribute('src');var ls=document.createElement('script');ls.src=src+(src.indexOf('?')>-1?'&':'?')+'_r='+Date.now();document.body.appendChild(ls)})}if(!hardReset){window.scrollTo(sx,sy)}else{if(oscr)oscr.remove();if(nscr){var src=nscr.getAttribute('src');var s=document.createElement('script');s.src=src+(src.indexOf('?')>-1?'&':'?')+'_r='+Date.now();s.onload=function(){document.dispatchEvent(new Event('DOMContentLoaded'));window.scrollTo(sx,sy)};s.onerror=function(){window.scrollTo(sx,sy)};document.body.appendChild(s)}else{document.dispatchEvent(new Event('DOMContentLoaded'));window.scrollTo(sx,sy)}}}).catch(function(){location.reload()})}var iR=document.getElementById('root');if(iR)lastSrvRoot=iR.cloneNode(true);connect()})()</script>`\n : '';\n\n // Scroll position handlers for preview mode iframe switching\n const scrollHandlerScript = injectLiveReload\n ? `<script${nonceAttr}>(function(){window.addEventListener('message',function(e){if(e.data.type==='GET_SCROLL_POSITION'){window.parent.postMessage({type:'SCROLL_POSITION_RESPONSE',scrollX:window.scrollX,scrollY:window.scrollY},'*')}else if(e.data.type==='SET_SCROLL_POSITION'){window.scrollTo(e.data.scrollX,e.data.scrollY)}})})()</script>`\n : '';\n\n // In production, output minified CSS on single line; in dev, preserve formatting\n const styleContent = useBundled ? finalCSS : `\\n ${combinedCSS.split('\\n').join('\\n ')}\\n `;\n\n const htmlDocument = `<!DOCTYPE html>\n<html lang=\"${rendered.locale}\" theme=\"${themeConfig.default}\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n ${cspNonce ? `<meta name=\"csp-nonce\" content=\"${cspNonce}\">\\n ` : ''}${iconTags ? `${iconTags}\\n ` : ''}${scriptPreloadTag ? `${scriptPreloadTag}\\n ` : ''}${imagePreloadTags ? `${imagePreloadTags}\\n ` : ''}${fontPreloadTags ? `${fontPreloadTags}\\n ` : ''}${libraryTags.headCSS ? `${libraryTags.headCSS}\\n ` : ''}${libraryTags.headJS ? `${libraryTags.headJS}\\n ` : ''}${rendered.meta}\n ${configInlineScript}${cmsInlineScript}${clientDataScripts}<style id=\"meno-styles\"${nonceAttr}>${styleContent}</style>${mergedCustomCode.head ? `\\n ${mergedCustomCode.head}` : ''}\n</head>\n<body>${mergedCustomCode.bodyStart ? `\\n ${mergedCustomCode.bodyStart}` : ''}\n <div id=\"root\">\n ${rendered.html}\n </div>\n ${clientScript}${componentScript}${libraryTags.bodyEndJS ? `\\n ${libraryTags.bodyEndJS}` : ''}${liveReloadScript ? `\\n ${liveReloadScript}` : ''}${scrollHandlerScript ? `\\n ${scrollHandlerScript}` : ''}${mergedCustomCode.bodyEnd ? `\\n ${mergedCustomCode.bodyEnd}` : ''}\n</body>\n</html>`;\n\n // Return based on mode\n if (returnSeparateJS) {\n return {\n html: htmlDocument,\n javascript: externalJavaScript,\n };\n }\n\n return htmlDocument;\n}\n", "/**\n * MenoFilter - Client-side CMS Filtering Library\n *\n * A declarative filtering library inspired by Finsweet Attributes.\n * Works with data attributes or programmatic JavaScript API.\n *\n * @example Data Attributes (declarative)\n * ```html\n * <div data-meno-filter=\"posts\" data-meno-per-page=\"6\">\n * <button data-meno-filter-field=\"category\" data-meno-filter-value=\"tech\">Tech</button>\n * <div data-meno-list></div>\n * <span data-meno-count=\"results\"></span>\n * </div>\n * ```\n *\n * @example JavaScript API (programmatic)\n * ```javascript\n * const filter = MenoFilter.get('posts');\n * filter.filter({ category: 'tech', price: { $gt: 100 } });\n * filter.on('afterFilter', (items) => console.log(items));\n * ```\n */\n\nimport type {\n CMSItem,\n FilterOperator,\n FilterValue,\n FilterCriteria,\n SortConfig,\n PageInfo,\n LoadMoreInfo,\n FacetCounts,\n FilterState,\n LifecycleEvent,\n EventCallback,\n MenoFilterOptions,\n FieldType,\n} from './types';\n\n// Re-export types for backward compatibility\nexport type {\n CMSItem,\n FilterOperator,\n FilterValue,\n FilterCriteria,\n SortConfig,\n PageInfo,\n LoadMoreInfo,\n FacetCounts,\n FilterState,\n LifecycleEvent,\n EventCallback,\n MenoFilterOptions,\n FieldType,\n} from './types';\n\n// ============================================================================\n// MenoFilter Class\n// ============================================================================\n\nexport class MenoFilter {\n // Static registry of all instances\n private static instances: Map<string, MenoFilter> = new Map();\n\n // Instance state\n private collection: string;\n private items: CMSItem[] = [];\n private filteredItems: CMSItem[] = [];\n private initialized = false;\n\n // Filter state\n private criteria: FilterCriteria = {};\n private orCriteria: FilterCriteria[] = [];\n private searchQuery = '';\n private searchFields: string[] = [];\n private sortConfig: SortConfig | null = null;\n\n // Pagination\n private perPage: number;\n private currentPage = 1;\n\n // Load More\n private visibleCount = 0;\n\n // Options\n private filterMatch: 'and' | 'or';\n\n // Type coercion\n private fieldTypes: Record<string, FieldType> = {};\n\n // URL sync\n private urlSync = false;\n private urlMode: 'push' | 'replace' = 'replace';\n private popstateHandler = () => this.syncFromUrl();\n\n // Fuzzy search\n private fuzzySearchEnabled = false;\n private fuzzyThreshold = 0.3;\n\n // Event system\n private eventListeners: Map<LifecycleEvent, Set<EventCallback>> = new Map();\n private watchers: Set<(state: FilterState) => void> = new Set();\n\n // -------------------------------------------------------------------------\n // Static Methods\n // -------------------------------------------------------------------------\n\n /**\n * Get an existing MenoFilter instance by collection name\n */\n static get(collection: string): MenoFilter | undefined {\n return MenoFilter.instances.get(collection);\n }\n\n /**\n * Get all registered instances\n */\n static getAll(): Map<string, MenoFilter> {\n return new Map(MenoFilter.instances);\n }\n\n /**\n * Check if an instance exists for a collection\n */\n static has(collection: string): boolean {\n return MenoFilter.instances.has(collection);\n }\n\n /**\n * Destroy an instance and remove from registry\n */\n static destroy(collection: string): void {\n const instance = MenoFilter.instances.get(collection);\n if (instance) {\n instance.destroy();\n MenoFilter.instances.delete(collection);\n }\n }\n\n /**\n * Destroy all instances\n */\n static destroyAll(): void {\n for (const instance of MenoFilter.instances.values()) {\n instance.destroy();\n }\n MenoFilter.instances.clear();\n }\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(options: MenoFilterOptions) {\n this.collection = options.collection;\n this.perPage = options.perPage ?? 0; // 0 = no pagination\n this.filterMatch = options.filterMatch ?? 'and';\n this.fieldTypes = options.fieldTypes ?? {};\n this.fuzzySearchEnabled = options.fuzzySearch ?? false;\n this.fuzzyThreshold = options.fuzzyThreshold ?? 0.3;\n\n // Register instance\n MenoFilter.instances.set(this.collection, this);\n\n // Enable URL sync if specified\n if (options.urlSync) {\n this.enableUrlSync({ mode: options.urlMode });\n }\n }\n\n // -------------------------------------------------------------------------\n // Initialization\n // -------------------------------------------------------------------------\n\n /**\n * Initialize by loading data from inline JSON or static file\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n\n // Try inline JSON first\n const inlineEl = document.getElementById(`meno-cms-${this.collection}`);\n if (inlineEl?.textContent) {\n try {\n this.items = JSON.parse(inlineEl.textContent);\n this.filteredItems = [...this.items];\n this.initialized = true;\n this.emit('init', this.items);\n this.notifyWatchers();\n return;\n } catch (e) {\n console.error(`MenoFilter: Failed to parse inline data for \"${this.collection}\"`, e);\n }\n }\n\n // Fallback to static JSON file\n try {\n const response = await fetch(`/data/${this.collection}/index.json`);\n if (response.ok) {\n this.items = await response.json();\n this.filteredItems = [...this.items];\n this.initialized = true;\n this.emit('init', this.items);\n this.notifyWatchers();\n return;\n }\n } catch (e) {\n console.error(`MenoFilter: Failed to fetch static data for \"${this.collection}\"`, e);\n }\n\n console.warn(`MenoFilter: No data found for collection \"${this.collection}\"`);\n this.items = [];\n this.filteredItems = [];\n this.initialized = true;\n this.emit('init', []);\n this.notifyWatchers();\n }\n\n /**\n * Check if initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Destroy this instance\n */\n destroy(): void {\n this.eventListeners.clear();\n this.watchers.clear();\n this.items = [];\n this.filteredItems = [];\n this.criteria = {};\n this.orCriteria = [];\n this.initialized = false;\n }\n\n // -------------------------------------------------------------------------\n // Filtering\n // -------------------------------------------------------------------------\n\n /**\n * Filter items by criteria (AND logic between fields)\n *\n * @example Simple equality\n * filter.filter({ category: 'tech' })\n *\n * @example With operators\n * filter.filter({\n * category: 'tech',\n * price: { $gt: 100, $lt: 500 },\n * tags: { $contains: 'featured' }\n * })\n */\n filter(criteria: FilterCriteria): CMSItem[] {\n this.emit('beforeFilter', criteria);\n this.criteria = criteria;\n this.orCriteria = [];\n this.currentPage = 1;\n this.applyAllFilters();\n this.emit('afterFilter', this.filteredItems);\n return this.getPageItems();\n }\n\n /**\n * Filter with OR logic between criteria objects\n *\n * @example Match items where category is 'tech' OR 'design'\n * filter.filterOr([\n * { category: 'tech' },\n * { category: 'design' }\n * ])\n */\n filterOr(criteriaList: FilterCriteria[]): CMSItem[] {\n this.emit('beforeFilter', criteriaList);\n this.criteria = {};\n this.orCriteria = criteriaList;\n this.currentPage = 1;\n this.applyAllFilters();\n this.emit('afterFilter', this.filteredItems);\n return this.getPageItems();\n }\n\n /**\n * Add a filter condition (merges with existing)\n */\n addFilter(field: string, value: FilterValue): CMSItem[] {\n this.criteria[field] = value;\n this.currentPage = 1;\n this.applyAllFilters();\n this.emit('afterFilter', this.filteredItems);\n return this.getPageItems();\n }\n\n /**\n * Remove a filter condition\n */\n removeFilter(field: string): CMSItem[] {\n delete this.criteria[field];\n this.currentPage = 1;\n this.applyAllFilters();\n this.emit('afterFilter', this.filteredItems);\n return this.getPageItems();\n }\n\n /**\n * Clear all filters (keeps sort and search)\n */\n clearFilters(): CMSItem[] {\n this.criteria = {};\n this.orCriteria = [];\n this.currentPage = 1;\n this.applyAllFilters();\n this.emit('afterFilter', this.filteredItems);\n return this.getPageItems();\n }\n\n /**\n * Get current filter criteria\n */\n getFilters(): FilterCriteria {\n return { ...this.criteria };\n }\n\n // -------------------------------------------------------------------------\n // Searching\n // -------------------------------------------------------------------------\n\n /**\n * Search items by text query (case-insensitive)\n *\n * @param query Search query\n * @param fields Fields to search in (defaults to all string fields)\n */\n search(query: string, fields?: string[]): CMSItem[] {\n this.emit('beforeSearch', { query, fields });\n this.searchQuery = query;\n this.searchFields = fields ?? [];\n this.currentPage = 1;\n this.applyAllFilters();\n this.emit('afterSearch', this.filteredItems);\n return this.getPageItems();\n }\n\n /**\n * Clear search query\n */\n clearSearch(): CMSItem[] {\n this.searchQuery = '';\n this.searchFields = [];\n this.applyAllFilters();\n return this.getPageItems();\n }\n\n /**\n * Get current search state\n */\n getSearch(): { query: string; fields: string[] } {\n return { query: this.searchQuery, fields: [...this.searchFields] };\n }\n\n // -------------------------------------------------------------------------\n // Sorting\n // -------------------------------------------------------------------------\n\n /**\n * Sort items by field\n */\n sort(field: string, order: 'asc' | 'desc' = 'asc'): CMSItem[] {\n this.emit('beforeSort', { field, order });\n this.sortConfig = { field, order };\n this.currentPage = 1;\n this.applyAllFilters();\n this.emit('afterSort', this.filteredItems);\n return this.getPageItems();\n }\n\n /**\n * Clear sorting\n */\n clearSort(): CMSItem[] {\n this.sortConfig = null;\n this.applyAllFilters();\n return this.getPageItems();\n }\n\n /**\n * Get current sort config\n */\n getSort(): SortConfig | null {\n return this.sortConfig ? { ...this.sortConfig } : null;\n }\n\n // -------------------------------------------------------------------------\n // Pagination\n // -------------------------------------------------------------------------\n\n /**\n * Set current page\n */\n setPage(page: number): CMSItem[] {\n const totalPages = this.getTotalPages();\n const newPage = Math.max(1, Math.min(page, totalPages || 1));\n if (newPage !== this.currentPage) {\n this.currentPage = newPage;\n this.emit('pageChange', this.getPageInfo());\n this.notifyWatchers();\n }\n return this.getPageItems();\n }\n\n /**\n * Go to next page\n */\n nextPage(): CMSItem[] {\n return this.setPage(this.currentPage + 1);\n }\n\n /**\n * Go to previous page\n */\n prevPage(): CMSItem[] {\n return this.setPage(this.currentPage - 1);\n }\n\n /**\n * Set items per page\n */\n setPerPage(perPage: number): CMSItem[] {\n this.perPage = perPage;\n this.currentPage = 1;\n this.emit('pageChange', this.getPageInfo());\n this.notifyWatchers();\n return this.getPageItems();\n }\n\n /**\n * Get pagination info\n */\n getPageInfo(): PageInfo {\n const totalPages = this.getTotalPages();\n return {\n current: this.currentPage,\n total: totalPages,\n hasNext: this.currentPage < totalPages,\n hasPrev: this.currentPage > 1,\n totalItems: this.filteredItems.length,\n perPage: this.perPage || this.filteredItems.length,\n };\n }\n\n private getTotalPages(): number {\n if (this.perPage === 0) return 1;\n return Math.ceil(this.filteredItems.length / this.perPage);\n }\n\n private getPageItems(): CMSItem[] {\n if (this.perPage === 0) {\n return this.filteredItems;\n }\n const start = (this.currentPage - 1) * this.perPage;\n const end = start + this.perPage;\n return this.filteredItems.slice(start, end);\n }\n\n // -------------------------------------------------------------------------\n // Load More\n // -------------------------------------------------------------------------\n\n /**\n * Load more items (append mode - alternative to pagination)\n * @param count Number of items to load (defaults to perPage)\n */\n loadMore(count?: number): CMSItem[] {\n const increment = count ?? (this.perPage || 10);\n const newVisible = Math.min(this.visibleCount + increment, this.filteredItems.length);\n if (newVisible !== this.visibleCount) {\n this.visibleCount = newVisible;\n this.emit('loadMore', this.getLoadMoreInfo());\n this.notifyWatchers();\n }\n return this.getVisibleItems();\n }\n\n /**\n * Get items currently visible (for load-more mode)\n */\n getVisibleItems(): CMSItem[] {\n if (this.visibleCount === 0) {\n return this.getPageItems();\n }\n return this.filteredItems.slice(0, this.visibleCount);\n }\n\n /**\n * Get load more info\n */\n getLoadMoreInfo(): LoadMoreInfo {\n const visible = this.visibleCount || this.filteredItems.length;\n return {\n visible,\n total: this.filteredItems.length,\n remaining: Math.max(0, this.filteredItems.length - visible),\n hasMore: visible < this.filteredItems.length,\n };\n }\n\n /**\n * Reset visible count (called when filters change)\n */\n resetVisibleCount(): void {\n this.visibleCount = this.perPage || 0;\n }\n\n /**\n * Initialize visible count for load-more mode\n */\n initLoadMore(initialCount?: number): void {\n this.visibleCount = initialCount ?? (this.perPage || 10);\n this.notifyWatchers();\n }\n\n // -------------------------------------------------------------------------\n // Data Access\n // -------------------------------------------------------------------------\n\n /**\n * Get all items (unfiltered)\n */\n getAll(): CMSItem[] {\n return this.items;\n }\n\n /**\n * Get current filtered items (all, ignoring pagination)\n */\n getFiltered(): CMSItem[] {\n return this.filteredItems;\n }\n\n /**\n * Get items for current page\n */\n getItems(): CMSItem[] {\n return this.getPageItems();\n }\n\n /**\n * Get item by ID or filename\n */\n getById(id: string): CMSItem | undefined {\n return this.items.find((item) => item._id === id || item._filename === id);\n }\n\n /**\n * Get unique values for a field (useful for building filter dropdowns)\n */\n getUniqueValues(field: string): unknown[] {\n const values = new Set<unknown>();\n for (const item of this.items) {\n const value = item[field];\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach((v) => {\n values.add(v);\n });\n } else {\n values.add(value);\n }\n }\n }\n return Array.from(values);\n }\n\n /**\n * Count facet values for a given set of items\n */\n private countFacets(items: CMSItem[], field: string): FacetCounts {\n const counts: FacetCounts = {};\n for (const item of items) {\n const value = item[field];\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach((v) => {\n const key = String(v);\n counts[key] = (counts[key] || 0) + 1;\n });\n } else {\n const key = String(value);\n counts[key] = (counts[key] || 0) + 1;\n }\n }\n }\n return counts;\n }\n\n /**\n * Get facet counts for a field (counts per unique value)\n *\n * @example\n * filter.getFacets('category')\n * // Returns: { tech: 5, design: 3, marketing: 2 }\n */\n getFacets(field: string): FacetCounts {\n return this.countFacets(this.filteredItems, field);\n }\n\n /**\n * Get facet counts from all items (not filtered)\n */\n getAllFacets(field: string): FacetCounts {\n return this.countFacets(this.items, field);\n }\n\n // -------------------------------------------------------------------------\n // Reset\n // -------------------------------------------------------------------------\n\n /**\n * Reset all filters, search, sort, and pagination\n */\n reset(): CMSItem[] {\n this.criteria = {};\n this.orCriteria = [];\n this.searchQuery = '';\n this.searchFields = [];\n this.sortConfig = null;\n this.currentPage = 1;\n this.filteredItems = [...this.items];\n this.emit('reset', null);\n this.notifyWatchers();\n return this.getPageItems();\n }\n\n // -------------------------------------------------------------------------\n // Type Coercion\n // -------------------------------------------------------------------------\n\n /**\n * Set the type for a field (used for comparison coercion)\n */\n setFieldType(field: string, type: FieldType): void {\n this.fieldTypes[field] = type;\n }\n\n /**\n * Set multiple field types at once\n */\n setFieldTypes(types: Record<string, FieldType>): void {\n this.fieldTypes = { ...this.fieldTypes, ...types };\n }\n\n /**\n * Get current field types\n */\n getFieldTypes(): Record<string, FieldType> {\n return { ...this.fieldTypes };\n }\n\n /**\n * Coerce a value based on field type\n */\n private coerceValue(field: string, value: unknown): unknown {\n const type = this.fieldTypes[field];\n if (!type || type === 'string' || value === null || value === undefined) {\n return value;\n }\n\n switch (type) {\n case 'number': {\n if (typeof value === 'number') return value;\n const num = parseFloat(String(value));\n return Number.isNaN(num) ? value : num;\n }\n case 'date': {\n if (value instanceof Date) return value.getTime();\n const time = new Date(String(value)).getTime();\n return Number.isNaN(time) ? value : time;\n }\n case 'boolean':\n return value === true || value === 'true' || value === '1';\n default:\n return value;\n }\n }\n\n // -------------------------------------------------------------------------\n // Range Filters\n // -------------------------------------------------------------------------\n\n /**\n * Filter by a numeric or date range\n *\n * @example\n * filter.filterRange('price', { min: 100, max: 500 });\n * filter.filterRange('price', { min: 100 }); // Only min\n * filter.filterRange('date', { max: '2024-12-31' }); // Only max\n */\n filterRange(field: string, range: { min?: number | string; max?: number | string }): CMSItem[] {\n const ops: FilterOperator = {};\n if (range.min !== undefined && range.min !== '') {\n ops.$gte = range.min;\n }\n if (range.max !== undefined && range.max !== '') {\n ops.$lte = range.max;\n }\n\n if (Object.keys(ops).length === 0) {\n return this.removeFilter(field);\n }\n return this.addFilter(field, ops);\n }\n\n /**\n * Clear a range filter\n */\n clearRangeFilter(field: string): CMSItem[] {\n return this.removeFilter(field);\n }\n\n // -------------------------------------------------------------------------\n // URL Sync\n // -------------------------------------------------------------------------\n\n /**\n * Enable URL query parameter synchronization\n *\n * @example\n * filter.enableUrlSync(); // Uses 'replace' mode\n * filter.enableUrlSync({ mode: 'push' }); // Adds history entries\n */\n enableUrlSync(options?: { mode?: 'push' | 'replace' }): void {\n if (typeof window === 'undefined') return;\n\n this.urlSync = true;\n this.urlMode = options?.mode ?? 'replace';\n window.addEventListener('popstate', this.popstateHandler);\n this.syncFromUrl(); // Restore state on enable\n }\n\n /**\n * Disable URL sync\n */\n disableUrlSync(): void {\n if (typeof window === 'undefined') return;\n\n this.urlSync = false;\n window.removeEventListener('popstate', this.popstateHandler);\n }\n\n /**\n * Sync current filter state to URL query parameters\n */\n syncToUrl(): void {\n if (typeof window === 'undefined') return;\n\n const params = new URLSearchParams();\n\n // Serialize filters\n for (const [field, value] of Object.entries(this.criteria)) {\n if (value === undefined || value === null || value === '') continue;\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Operator object\n for (const [op, opVal] of Object.entries(value as Record<string, unknown>)) {\n if (opVal !== undefined && opVal !== null && opVal !== '') {\n params.set(`filter.${field}.${op}`, String(opVal));\n }\n }\n } else if (Array.isArray(value)) {\n params.set(`filter.${field}`, value.join(','));\n } else {\n params.set(`filter.${field}`, String(value));\n }\n }\n\n // Serialize sort\n if (this.sortConfig) {\n params.set('sort', `${this.sortConfig.field}:${this.sortConfig.order}`);\n }\n\n // Serialize search\n if (this.searchQuery) {\n params.set('search', this.searchQuery);\n if (this.searchFields.length > 0) {\n params.set('search.fields', this.searchFields.join(','));\n }\n }\n\n // Serialize page (only if > 1)\n if (this.currentPage > 1) {\n params.set('page', String(this.currentPage));\n }\n\n // Serialize perPage (only if custom)\n if (this.perPage > 0) {\n params.set('perPage', String(this.perPage));\n }\n\n const queryString = params.toString();\n const url = queryString ? `${window.location.pathname}?${queryString}` : window.location.pathname;\n\n if (this.urlMode === 'push') {\n history.pushState(null, '', url);\n } else {\n history.replaceState(null, '', url);\n }\n }\n\n /**\n * Restore filter state from URL query parameters\n */\n syncFromUrl(): void {\n if (typeof window === 'undefined') return;\n\n const params = new URLSearchParams(window.location.search);\n if (params.size === 0) return;\n\n // Parse filters\n const criteria: FilterCriteria = {};\n for (const [key, value] of params.entries()) {\n if (!key.startsWith('filter.')) continue;\n\n const parts = key.split('.');\n const field = parts[1];\n const op = parts[2]; // Optional operator\n if (field === undefined) continue;\n\n if (op) {\n // Operator: filter.price.$gt=100\n if (!criteria[field] || typeof criteria[field] !== 'object') {\n criteria[field] = {};\n }\n (criteria[field] as Record<string, unknown>)[op] = value;\n } else {\n // Simple value: filter.category=tech or filter.category=a,b,c\n if (value.includes(',')) {\n criteria[field] = value.split(',');\n } else {\n criteria[field] = value;\n }\n }\n }\n\n // Parse sort\n const sortParam = params.get('sort');\n if (sortParam) {\n const [field = '', order = 'asc'] = sortParam.split(':');\n this.sortConfig = { field, order: order as 'asc' | 'desc' };\n }\n\n // Parse search\n const searchParam = params.get('search');\n if (searchParam) {\n this.searchQuery = searchParam;\n const fieldsParam = params.get('search.fields');\n if (fieldsParam) {\n this.searchFields = fieldsParam.split(',');\n }\n }\n\n // Parse page\n const pageParam = params.get('page');\n if (pageParam) {\n const page = parseInt(pageParam, 10);\n if (!Number.isNaN(page) && page > 0) {\n this.currentPage = page;\n }\n }\n\n // Parse perPage\n const perPageParam = params.get('perPage');\n if (perPageParam) {\n const perPage = parseInt(perPageParam, 10);\n if (!Number.isNaN(perPage) && perPage > 0) {\n this.perPage = perPage;\n }\n }\n\n // Apply criteria if any\n if (Object.keys(criteria).length > 0) {\n this.criteria = criteria;\n }\n\n // Re-apply all filters with restored state\n this.applyAllFilters();\n }\n\n // -------------------------------------------------------------------------\n // Fuzzy Search\n // -------------------------------------------------------------------------\n\n /**\n * Enable or disable fuzzy search\n *\n * @param enabled Enable fuzzy matching\n * @param threshold Similarity threshold (0-1, lower = stricter). Default: 0.3\n */\n setFuzzySearch(enabled: boolean, threshold?: number): void {\n this.fuzzySearchEnabled = enabled;\n if (threshold !== undefined) {\n this.fuzzyThreshold = Math.max(0, Math.min(1, threshold));\n }\n }\n\n /**\n * Check if fuzzy search is enabled\n */\n isFuzzySearchEnabled(): boolean {\n return this.fuzzySearchEnabled;\n }\n\n /**\n * Get trigrams for a string (for fuzzy matching)\n */\n private getTrigrams(str: string): string[] {\n const trigrams: string[] = [];\n // Pad with spaces for edge trigrams\n const padded = ` ${str} `;\n for (let i = 0; i < padded.length - 2; i++) {\n trigrams.push(padded.slice(i, i + 3));\n }\n return trigrams;\n }\n\n /**\n * Fuzzy match a text against a query using trigram similarity\n */\n private fuzzyMatch(text: string, query: string): boolean {\n // Short queries: use exact substring match\n if (query.length < 3) {\n return text.toLowerCase().includes(query.toLowerCase());\n }\n\n const textLower = text.toLowerCase();\n const queryLower = query.toLowerCase();\n\n // Quick check: if contains, it's definitely a match\n if (textLower.includes(queryLower)) {\n return true;\n }\n\n // Trigram similarity\n const textTrigrams = this.getTrigrams(textLower);\n const queryTrigrams = this.getTrigrams(queryLower);\n\n // Count matching trigrams using Jaccard coefficient\n const querySet = new Set(queryTrigrams);\n const textSet = new Set(textTrigrams);\n\n let intersection = 0;\n for (const t of querySet) {\n if (textSet.has(t)) intersection++;\n }\n\n const union = querySet.size + textSet.size - intersection;\n if (union === 0) return false;\n\n const similarity = intersection / union;\n return similarity >= this.fuzzyThreshold;\n }\n\n // -------------------------------------------------------------------------\n // Event System\n // -------------------------------------------------------------------------\n\n /**\n * Subscribe to a lifecycle event\n *\n * @example\n * filter.on('afterFilter', (items) => {\n * console.log('Filtered to', items.length, 'items');\n * });\n */\n on<T = unknown>(event: LifecycleEvent, callback: EventCallback<T>): () => void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback as EventCallback);\n // Return unsubscribe function\n return () => this.off(event, callback);\n }\n\n /**\n * Unsubscribe from a lifecycle event\n */\n off<T = unknown>(event: LifecycleEvent, callback: EventCallback<T>): void {\n this.eventListeners.get(event)?.delete(callback as EventCallback);\n }\n\n /**\n * Emit a lifecycle event\n */\n private emit(event: LifecycleEvent, data: unknown): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n for (const callback of listeners) {\n try {\n callback(data);\n } catch (e) {\n console.error(`MenoFilter: Error in ${event} listener`, e);\n }\n }\n }\n }\n\n /**\n * Watch for any state changes\n *\n * @example\n * filter.watch((state) => {\n * console.log(state.pageItems.length, 'items on current page');\n * });\n */\n watch(callback: (state: FilterState) => void): () => void {\n this.watchers.add(callback);\n // Immediately call with current state\n callback(this.getState());\n // Return unsubscribe function\n return () => this.watchers.delete(callback);\n }\n\n /**\n * Subscribe to filter changes (simplified API, receives just items)\n *\n * @example\n * filter.subscribe((items) => {\n * console.log(items.length, 'items');\n * });\n */\n subscribe(callback: (items: CMSItem[]) => void): () => void {\n const wrapper = (state: FilterState) => callback(state.pageItems);\n this.watchers.add(wrapper);\n // Immediately call with current items\n callback(this.getPageItems());\n // Return unsubscribe function\n return () => this.watchers.delete(wrapper);\n }\n\n /**\n * Get current state snapshot\n */\n getState(): FilterState {\n return {\n items: this.items,\n filteredItems: this.filteredItems,\n pageItems: this.getPageItems(),\n filters: { ...this.criteria },\n sort: this.sortConfig ? { ...this.sortConfig } : null,\n search: { query: this.searchQuery, fields: [...this.searchFields] },\n page: this.getPageInfo(),\n };\n }\n\n private notifyWatchers(): void {\n const state = this.getState();\n for (const watcher of this.watchers) {\n try {\n watcher(state);\n } catch (e) {\n console.error('MenoFilter: Error in watcher', e);\n }\n }\n\n // Sync to URL if enabled\n if (this.urlSync) {\n this.syncToUrl();\n }\n }\n\n // -------------------------------------------------------------------------\n // Internal: Apply Filters\n // -------------------------------------------------------------------------\n\n private applyAllFilters(): void {\n let result = [...this.items];\n\n // Apply AND criteria\n if (Object.keys(this.criteria).length > 0) {\n result = result.filter((item) => this.matchesCriteria(item, this.criteria));\n }\n\n // Apply OR criteria\n if (this.orCriteria.length > 0) {\n result = result.filter((item) => this.orCriteria.some((criteria) => this.matchesCriteria(item, criteria)));\n }\n\n // Apply search\n if (this.searchQuery) {\n const query = this.searchQuery;\n result = result.filter((item) => {\n const fieldsToSearch = this.searchFields.length > 0 ? this.searchFields : Object.keys(item);\n return fieldsToSearch.some((field) => {\n const value = item[field];\n if (typeof value !== 'string') return false;\n\n // Use fuzzy match if enabled, otherwise exact substring\n if (this.fuzzySearchEnabled) {\n return this.fuzzyMatch(value, query);\n }\n return value.toLowerCase().includes(query.toLowerCase());\n });\n });\n }\n\n // Apply sorting\n if (this.sortConfig) {\n const { field, order } = this.sortConfig;\n result.sort((a, b) => {\n const aVal = a[field];\n const bVal = b[field];\n\n // Handle nullish values\n if (aVal === undefined || aVal === null) return order === 'asc' ? 1 : -1;\n if (bVal === undefined || bVal === null) return order === 'asc' ? -1 : 1;\n\n // Compare\n let cmp = 0;\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n cmp = aVal.localeCompare(bVal);\n } else if (typeof aVal === 'number' && typeof bVal === 'number') {\n cmp = aVal - bVal;\n } else {\n cmp = String(aVal).localeCompare(String(bVal));\n }\n\n return order === 'desc' ? -cmp : cmp;\n });\n }\n\n this.filteredItems = result;\n\n // Reset visible count when filters change (for load-more mode)\n if (this.visibleCount > 0) {\n this.visibleCount = Math.min(this.perPage || 10, result.length);\n }\n\n this.notifyWatchers();\n }\n\n private matchesCriteria(item: CMSItem, criteria: FilterCriteria): boolean {\n const entries = Object.entries(criteria);\n if (this.filterMatch === 'or') {\n return entries.some(([field, value]) => this.matchesFieldValue(item, field, value));\n }\n return entries.every(([field, value]) => this.matchesFieldValue(item, field, value));\n }\n\n private matchesFieldValue(item: CMSItem, field: string, filterValue: FilterValue): boolean {\n // Skip empty/undefined criteria (including '*' as \"show all\")\n if (filterValue === undefined || filterValue === null || filterValue === '' || filterValue === '*') {\n return true;\n }\n\n const itemValue = item[field];\n\n // Check if filterValue is an operator object\n if (this.isOperatorObject(filterValue)) {\n return this.matchesOperators(itemValue, filterValue, field);\n }\n\n // Array contains check (item has array field)\n if (Array.isArray(itemValue)) {\n return itemValue.includes(filterValue);\n }\n\n // Array value in criteria (value is one of...)\n if (Array.isArray(filterValue)) {\n return filterValue.includes(itemValue);\n }\n\n // Equality check (with type coercion for typed fields)\n const coercedItem = this.coerceValue(field, itemValue);\n const coercedFilter = this.coerceValue(field, filterValue);\n return coercedItem === coercedFilter;\n }\n\n private isOperatorObject(value: unknown): value is FilterOperator {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n const keys = Object.keys(value);\n return keys.some((k) => k.startsWith('$'));\n }\n\n private matchesOperators(itemValue: unknown, operators: FilterOperator, field?: string): boolean {\n for (const [op, opValue] of Object.entries(operators)) {\n if (!this.matchesOperator(itemValue, op, opValue, field)) {\n return false;\n }\n }\n return true;\n }\n\n private matchesOperator(itemValue: unknown, op: string, opValue: unknown, field?: string): boolean {\n // Coerce values if field type is known\n const coercedItem = field ? this.coerceValue(field, itemValue) : itemValue;\n const coercedOp = field ? this.coerceValue(field, opValue) : opValue;\n\n switch (op) {\n case '$eq':\n return coercedItem === coercedOp;\n\n case '$neq':\n return coercedItem !== coercedOp;\n\n case '$gt':\n return typeof coercedItem === 'number' && typeof coercedOp === 'number'\n ? coercedItem > coercedOp\n : String(coercedItem) > String(coercedOp);\n\n case '$gte':\n return typeof coercedItem === 'number' && typeof coercedOp === 'number'\n ? coercedItem >= coercedOp\n : String(coercedItem) >= String(coercedOp);\n\n case '$lt':\n return typeof coercedItem === 'number' && typeof coercedOp === 'number'\n ? coercedItem < coercedOp\n : String(coercedItem) < String(coercedOp);\n\n case '$lte':\n return typeof coercedItem === 'number' && typeof coercedOp === 'number'\n ? coercedItem <= coercedOp\n : String(coercedItem) <= String(coercedOp);\n\n case '$contains':\n if (Array.isArray(itemValue)) {\n return itemValue.includes(opValue);\n }\n return typeof itemValue === 'string' && typeof opValue === 'string'\n ? itemValue.toLowerCase().includes(opValue.toLowerCase())\n : false;\n\n case '$notContains':\n if (Array.isArray(itemValue)) {\n return !itemValue.includes(opValue);\n }\n return typeof itemValue === 'string' && typeof opValue === 'string'\n ? !itemValue.toLowerCase().includes(opValue.toLowerCase())\n : true;\n\n case '$startsWith':\n return typeof itemValue === 'string' && typeof opValue === 'string'\n ? itemValue.toLowerCase().startsWith(opValue.toLowerCase())\n : false;\n\n case '$endsWith':\n return typeof itemValue === 'string' && typeof opValue === 'string'\n ? itemValue.toLowerCase().endsWith(opValue.toLowerCase())\n : false;\n\n case '$in':\n return Array.isArray(opValue) ? opValue.includes(itemValue) : false;\n\n case '$nin':\n return Array.isArray(opValue) ? !opValue.includes(itemValue) : true;\n\n case '$empty': {\n const isEmpty =\n itemValue === undefined ||\n itemValue === null ||\n itemValue === '' ||\n (Array.isArray(itemValue) && itemValue.length === 0);\n return opValue ? isEmpty : !isEmpty;\n }\n\n default:\n console.warn(`MenoFilter: Unknown operator \"${op}\"`);\n return true;\n }\n }\n}\n\n// Type alias for backward compatibility\nexport type CMSItemClient = CMSItem;\n\n// Export for browser global\nexport default MenoFilter;\n", "/**\n * MenoFilter Data Attribute Constants\n *\n * HTML data attributes used for declarative filtering.\n */\n\nexport const ATTR = {\n // Core\n FILTER: 'data-meno-filter', // Wrapper with collection name\n LIST: 'data-meno-list', // List container\n ITEM: 'data-meno-item', // Item template\n\n // Filter controls\n FILTER_FIELD: 'data-meno-filter-field',\n FILTER_VALUE: 'data-meno-filter-value',\n FILTER_MODE: 'data-meno-filter-mode', // 'single' | 'multi'\n\n // Search\n SEARCH: 'data-meno-search',\n SEARCH_FIELDS: 'data-meno-search-fields',\n SEARCH_FUZZY: 'data-meno-search-fuzzy',\n SEARCH_THRESHOLD: 'data-meno-search-threshold',\n\n // Sort\n SORT: 'data-meno-sort',\n SORT_ORDER: 'data-meno-sort-order',\n\n // Actions\n CLEAR: 'data-meno-clear',\n RESET: 'data-meno-reset',\n\n // Configuration\n PER_PAGE: 'data-meno-per-page',\n FILTER_MATCH: 'data-meno-filter-match',\n DEBOUNCE: 'data-meno-debounce',\n\n // Pagination\n PAGE: 'data-meno-page',\n PAGE_CURRENT: 'data-meno-page-current',\n PAGE_TOTAL: 'data-meno-page-total',\n PAGE_BUTTONS: 'data-meno-page-buttons',\n PER_PAGE_SELECT: 'data-meno-per-page-select',\n\n // Load More (alternative to pagination)\n LOAD_MORE: 'data-meno-load-more',\n REMAINING: 'data-meno-remaining',\n\n // UI Elements\n COUNT: 'data-meno-count', // results, total, visible\n FACET: 'data-meno-facet', // field:value\n EMPTY: 'data-meno-empty',\n ACTIVE_FILTERS: 'data-meno-active-filters',\n ACTIVE_FILTER_TEMPLATE: 'data-meno-active-filter-template',\n FILTER_REMOVE: 'data-meno-filter-remove',\n\n // State classes\n ACTIVE_CLASS: 'data-meno-active-class',\n\n // Type coercion\n TYPES: 'data-meno-types',\n\n // Range inputs\n RANGE: 'data-meno-range',\n RANGE_BOUND: 'data-meno-range-bound',\n\n // URL sync\n URL_SYNC: 'data-meno-url-sync',\n URL_MODE: 'data-meno-url-mode',\n} as const;\n\nexport type AttrKey = keyof typeof ATTR;\nexport type AttrValue = (typeof ATTR)[AttrKey];\n", "/**\n * MenoFilter Control Bindings\n *\n * Functions for binding filter controls (buttons, checkboxes, selects)\n * to MenoFilter instances via data attributes.\n */\n\nimport type { MenoFilter } from './MenoFilter';\nimport { ATTR } from './constants';\nimport type { FilterInstance, FilterMode } from './types';\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Simple debounce function\n */\nfunction debounce<T extends (...args: unknown[]) => void>(fn: T, ms: number): T {\n let timer: ReturnType<typeof setTimeout>;\n return ((...args: unknown[]) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n }) as T;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get filter mode from closest ancestor with data-meno-filter-mode attribute\n */\nfunction getFilterMode(element: HTMLElement): FilterMode | null {\n const modeContainer = element.closest(`[${ATTR.FILTER_MODE}]`);\n if (!modeContainer) return null;\n const mode = modeContainer.getAttribute(ATTR.FILTER_MODE);\n return mode === 'single' || mode === 'multi' ? mode : null;\n}\n\n/**\n * Handle button click in multi-select mode\n * Toggles value in $in array\n */\nfunction handleMultiButtonClick(filter: MenoFilter, field: string, value: string, currentValue: unknown): void {\n // Get current values as array\n let values: string[] = [];\n if (currentValue !== undefined) {\n if (typeof currentValue === 'object' && currentValue !== null && '$in' in currentValue) {\n values = [...((currentValue as { $in: string[] }).$in || [])];\n } else if (typeof currentValue === 'string') {\n values = [currentValue];\n }\n }\n\n // Toggle value in array\n const index = values.indexOf(value);\n if (index === -1) {\n values.push(value);\n } else {\n values.splice(index, 1);\n }\n\n // Update filter\n if (values.length === 0) {\n filter.removeFilter(field);\n } else if (values.length === 1) {\n filter.addFilter(field, values[0]);\n } else {\n filter.addFilter(field, { $in: values });\n }\n}\n\n// ============================================================================\n// Filter Bindings\n// ============================================================================\n\n/**\n * Bind filter buttons, checkboxes, and selects\n */\nexport function bindFilterControls(instance: FilterInstance): void {\n const { wrapper, filter, cleanup } = instance;\n\n // Filter buttons\n const filterButtons = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.FILTER_FIELD}][${ATTR.FILTER_VALUE}]`);\n\n for (const btn of filterButtons) {\n if (btn.tagName === 'INPUT') continue; // Handle inputs separately\n\n const field = btn.getAttribute(ATTR.FILTER_FIELD)!;\n const value = btn.getAttribute(ATTR.FILTER_VALUE)!;\n\n const handler = () => {\n const mode = getFilterMode(btn);\n const currentFilters = filter.getFilters();\n const currentValue = currentFilters[field];\n\n if (mode === 'multi') {\n // Multi mode: toggle value in $in array\n handleMultiButtonClick(filter, field, value, currentValue);\n } else if (mode === 'single') {\n // Single mode: set value directly (no toggle off, clicking same value keeps it)\n if (currentValue !== value) {\n filter.addFilter(field, value);\n }\n } else {\n // Default: toggle behavior (click again to deselect)\n if (currentValue === value) {\n filter.removeFilter(field);\n } else {\n filter.addFilter(field, value);\n }\n }\n };\n\n btn.addEventListener('click', handler);\n cleanup.push(() => btn.removeEventListener('click', handler));\n }\n\n // Filter checkboxes (allow multiple selections with OR logic)\n const filterCheckboxes = wrapper.querySelectorAll<HTMLInputElement>(`input[type=\"checkbox\"][${ATTR.FILTER_FIELD}]`);\n\n for (const checkbox of filterCheckboxes) {\n const field = checkbox.getAttribute(ATTR.FILTER_FIELD)!;\n\n const handler = () => {\n const mode = getFilterMode(checkbox);\n\n // Single mode: uncheck other checkboxes in the same field\n if (mode === 'single' && checkbox.checked) {\n const siblings = wrapper.querySelectorAll<HTMLInputElement>(\n `input[type=\"checkbox\"][${ATTR.FILTER_FIELD}=\"${field}\"]`,\n );\n for (const sibling of siblings) {\n if (sibling !== checkbox) {\n sibling.checked = false;\n }\n }\n }\n\n updateCheckboxFilters(wrapper, filter, field);\n };\n\n checkbox.addEventListener('change', handler);\n cleanup.push(() => checkbox.removeEventListener('change', handler));\n }\n\n // Filter selects\n const filterSelects = wrapper.querySelectorAll<HTMLSelectElement>(`select[${ATTR.FILTER_FIELD}]`);\n\n for (const select of filterSelects) {\n const field = select.getAttribute(ATTR.FILTER_FIELD)!;\n\n const handler = () => {\n const value = select.value;\n if (value === '' || value === 'all' || value === '*') {\n filter.removeFilter(field);\n } else {\n filter.addFilter(field, value);\n }\n };\n\n select.addEventListener('change', handler);\n cleanup.push(() => select.removeEventListener('change', handler));\n }\n\n // Filter radio buttons\n const filterRadios = wrapper.querySelectorAll<HTMLInputElement>(`input[type=\"radio\"][${ATTR.FILTER_FIELD}]`);\n\n for (const radio of filterRadios) {\n const field = radio.getAttribute(ATTR.FILTER_FIELD)!;\n const value = radio.getAttribute(ATTR.FILTER_VALUE) || radio.value;\n\n const handler = () => {\n if (radio.checked) {\n if (value === '' || value === 'all' || value === '*') {\n filter.removeFilter(field);\n } else {\n filter.addFilter(field, value);\n }\n }\n };\n\n radio.addEventListener('change', handler);\n cleanup.push(() => radio.removeEventListener('change', handler));\n }\n}\n\n/**\n * Update filters based on checked checkboxes for a field\n */\nfunction updateCheckboxFilters(wrapper: HTMLElement, filter: MenoFilter, field: string): void {\n const checkboxes = wrapper.querySelectorAll<HTMLInputElement>(\n `input[type=\"checkbox\"][${ATTR.FILTER_FIELD}=\"${field}\"]:checked`,\n );\n\n const values = Array.from(checkboxes).map((cb) => cb.getAttribute(ATTR.FILTER_VALUE) || cb.value);\n\n if (values.length === 0) {\n filter.removeFilter(field);\n } else if (values.length === 1) {\n filter.addFilter(field, values[0]);\n } else {\n // Multiple values: use $in operator\n filter.addFilter(field, { $in: values });\n }\n}\n\n// ============================================================================\n// Search Bindings\n// ============================================================================\n\n/**\n * Bind search inputs\n */\nexport function bindSearchControls(instance: FilterInstance): void {\n const { wrapper, filter, cleanup } = instance;\n\n const searchInputs = wrapper.querySelectorAll<HTMLInputElement>(`[${ATTR.SEARCH}]`);\n\n for (const input of searchInputs) {\n const fieldsAttr = input.getAttribute(ATTR.SEARCH_FIELDS);\n const fields = fieldsAttr ? fieldsAttr.split(',').map((f) => f.trim()) : undefined;\n\n let debounceTimer: ReturnType<typeof setTimeout>;\n const debounceMs = parseInt(wrapper.getAttribute(ATTR.DEBOUNCE) || '300', 10);\n\n const handler = () => {\n clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n filter.search(input.value, fields);\n }, debounceMs);\n };\n\n input.addEventListener('input', handler);\n cleanup.push(() => {\n input.removeEventListener('input', handler);\n clearTimeout(debounceTimer);\n });\n }\n}\n\n// ============================================================================\n// Sort Bindings\n// ============================================================================\n\n/**\n * Bind sort triggers\n */\nexport function bindSortControls(instance: FilterInstance): void {\n const { wrapper, filter, cleanup } = instance;\n\n const sortTriggers = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.SORT}]`);\n\n for (const trigger of sortTriggers) {\n if (trigger.tagName === 'SELECT') continue;\n\n const field = trigger.getAttribute(ATTR.SORT)!;\n const order = (trigger.getAttribute(ATTR.SORT_ORDER) as 'asc' | 'desc') || 'asc';\n\n const handler = () => {\n const currentSort = filter.getSort();\n\n // Toggle: if already sorting by this field, toggle order or clear\n if (currentSort?.field === field) {\n if (currentSort.order === order) {\n // Same field and order: toggle direction\n filter.sort(field, order === 'asc' ? 'desc' : 'asc');\n } else {\n // Same field, different order: clear sort\n filter.clearSort();\n }\n } else {\n filter.sort(field, order);\n }\n };\n\n trigger.addEventListener('click', handler);\n cleanup.push(() => trigger.removeEventListener('click', handler));\n }\n\n // Sort selects\n const sortSelects = wrapper.querySelectorAll<HTMLSelectElement>(`select[${ATTR.SORT}]`);\n\n for (const select of sortSelects) {\n const handler = () => {\n const value = select.value;\n if (!value) {\n filter.clearSort();\n return;\n }\n\n // Parse \"field:order\" format\n const [field = '', order = 'asc'] = value.split(':');\n filter.sort(field, order as 'asc' | 'desc');\n };\n\n select.addEventListener('change', handler);\n cleanup.push(() => select.removeEventListener('change', handler));\n }\n}\n\n// ============================================================================\n// Action Bindings\n// ============================================================================\n\n/**\n * Bind clear and reset buttons\n */\nexport function bindActionControls(instance: FilterInstance): void {\n const { wrapper, filter, cleanup } = instance;\n\n // Clear filters button\n const clearButtons = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.CLEAR}]`);\n\n for (const btn of clearButtons) {\n const handler = () => {\n filter.clearFilters();\n };\n\n btn.addEventListener('click', handler);\n cleanup.push(() => btn.removeEventListener('click', handler));\n }\n\n // Reset all button\n const resetButtons = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.RESET}]`);\n\n for (const btn of resetButtons) {\n const handler = () => {\n filter.reset();\n\n // Also reset form controls\n resetFormControls(wrapper);\n };\n\n btn.addEventListener('click', handler);\n cleanup.push(() => btn.removeEventListener('click', handler));\n }\n}\n\n/**\n * Reset all form controls to initial state\n */\nexport function resetFormControls(wrapper: HTMLElement): void {\n // Reset checkboxes\n const checkboxes = wrapper.querySelectorAll<HTMLInputElement>(`input[type=\"checkbox\"][${ATTR.FILTER_FIELD}]`);\n for (const cb of checkboxes) {\n cb.checked = false;\n }\n\n // Reset selects\n const selects = wrapper.querySelectorAll<HTMLSelectElement>(`select[${ATTR.FILTER_FIELD}]`);\n for (const select of selects) {\n select.selectedIndex = 0;\n }\n\n // Reset search inputs\n const searchInputs = wrapper.querySelectorAll<HTMLInputElement>(`[${ATTR.SEARCH}]`);\n for (const input of searchInputs) {\n input.value = '';\n }\n\n // Reset sort selects\n const sortSelects = wrapper.querySelectorAll<HTMLSelectElement>(`select[${ATTR.SORT}]`);\n for (const select of sortSelects) {\n select.selectedIndex = 0;\n }\n}\n\n// ============================================================================\n// Pagination Bindings\n// ============================================================================\n\n/**\n * Bind pagination controls\n */\nexport function bindPaginationControls(instance: FilterInstance): void {\n const { wrapper, filter, cleanup } = instance;\n\n // Page navigation buttons\n const pageButtons = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.PAGE}]`);\n\n for (const btn of pageButtons) {\n const action = btn.getAttribute(ATTR.PAGE);\n\n const handler = () => {\n switch (action) {\n case 'prev':\n filter.prevPage();\n break;\n case 'next':\n filter.nextPage();\n break;\n case 'first':\n filter.setPage(1);\n break;\n case 'last':\n filter.setPage(filter.getPageInfo().total);\n break;\n default: {\n // Numeric page\n const page = parseInt(action || '1', 10);\n if (!Number.isNaN(page)) {\n filter.setPage(page);\n }\n }\n }\n };\n\n btn.addEventListener('click', handler);\n cleanup.push(() => btn.removeEventListener('click', handler));\n }\n\n // Per-page select\n const perPageSelects = wrapper.querySelectorAll<HTMLSelectElement>(`[${ATTR.PER_PAGE_SELECT}]`);\n\n for (const select of perPageSelects) {\n const handler = () => {\n const perPage = parseInt(select.value, 10);\n if (!Number.isNaN(perPage) && perPage > 0) {\n filter.setPerPage(perPage);\n }\n };\n\n select.addEventListener('change', handler);\n cleanup.push(() => select.removeEventListener('change', handler));\n }\n}\n\n// ============================================================================\n// Load More Bindings\n// ============================================================================\n\n/**\n * Bind load more button\n */\nexport function bindLoadMoreControls(instance: FilterInstance): void {\n const { wrapper, filter, cleanup } = instance;\n\n const loadMoreBtn = wrapper.querySelector<HTMLElement>(`[${ATTR.LOAD_MORE}]`);\n if (!loadMoreBtn) return;\n\n // Mark instance as load-more mode\n instance.loadMoreMode = true;\n\n // Initialize visible count\n filter.initLoadMore();\n\n const handler = () => {\n const countAttr = loadMoreBtn.getAttribute(ATTR.LOAD_MORE);\n const count = countAttr && countAttr !== '' ? parseInt(countAttr, 10) : undefined;\n filter.loadMore(count);\n };\n\n loadMoreBtn.addEventListener('click', handler);\n cleanup.push(() => loadMoreBtn.removeEventListener('click', handler));\n}\n\n// ============================================================================\n// Range Input Bindings\n// ============================================================================\n\n/**\n * Parse a numeric value from an input based on its type\n */\nfunction parseInputValue(input: HTMLInputElement): number | undefined {\n if (!input.value) return undefined;\n\n if (input.type === 'date') {\n // For date inputs, use valueAsNumber (ms since epoch) or parse the value\n return input.valueAsNumber || (input.value ? new Date(input.value).getTime() : undefined);\n }\n\n // For number/range inputs\n return input.valueAsNumber || (input.value ? parseFloat(input.value) : undefined);\n}\n\n/**\n * Bind range inputs (min/max for numeric or date fields)\n *\n * @example\n * <input type=\"number\" data-meno-range=\"price\" data-meno-range-bound=\"min\" placeholder=\"Min\">\n * <input type=\"number\" data-meno-range=\"price\" data-meno-range-bound=\"max\" placeholder=\"Max\">\n */\nexport function bindRangeInputs(instance: FilterInstance): void {\n const { wrapper, filter, cleanup } = instance;\n\n const rangeInputs = wrapper.querySelectorAll<HTMLInputElement>(`[${ATTR.RANGE}]`);\n if (rangeInputs.length === 0) return;\n\n const debounceMs = parseInt(wrapper.getAttribute(ATTR.DEBOUNCE) || '300', 10);\n\n // Group inputs by field\n const fieldInputs = new Map<string, { min?: HTMLInputElement; max?: HTMLInputElement }>();\n\n for (const input of rangeInputs) {\n const field = input.getAttribute(ATTR.RANGE);\n if (!field) continue;\n\n const bound = input.getAttribute(ATTR.RANGE_BOUND) as 'min' | 'max' | null;\n if (!bound || (bound !== 'min' && bound !== 'max')) continue;\n\n if (!fieldInputs.has(field)) {\n fieldInputs.set(field, {});\n }\n fieldInputs.get(field)![bound] = input;\n }\n\n // Bind each field's inputs\n for (const [field, inputs] of fieldInputs) {\n const updateRange = debounce(() => {\n const minVal = inputs.min ? parseInputValue(inputs.min) : undefined;\n const maxVal = inputs.max ? parseInputValue(inputs.max) : undefined;\n\n filter.filterRange(field, { min: minVal, max: maxVal });\n }, debounceMs);\n\n if (inputs.min) {\n const handler = () => updateRange();\n inputs.min.addEventListener('input', handler);\n cleanup.push(() => inputs.min!.removeEventListener('input', handler));\n }\n\n if (inputs.max) {\n const handler = () => updateRange();\n inputs.max.addEventListener('input', handler);\n cleanup.push(() => inputs.max!.removeEventListener('input', handler));\n }\n }\n}\n", "/**\n * MenoFilter Utility Functions\n *\n * Shared helper functions used across the meno-filter module.\n */\n\n/**\n * Escape HTML special characters to prevent XSS\n */\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;');\n}\n\n/**\n * Convert a plural collection name to singular form\n *\n * @example\n * singularizeWord('posts') // 'post'\n * singularizeWord('categories') // 'category'\n * singularizeWord('cases') // 'case'\n */\nexport function singularizeWord(word: string): string {\n if (word.endsWith('ies')) return `${word.slice(0, -3)}y`;\n if (word.endsWith('es')) return word.slice(0, -2);\n if (word.endsWith('s')) return word.slice(0, -1);\n return word;\n}\n\n/**\n * Get nested value from object using dot notation path\n *\n * @example\n * getNestedValue({ user: { name: 'John' } }, 'user.name') // 'John'\n */\nexport function getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((current, key) => {\n return current && typeof current === 'object' ? (current as Record<string, unknown>)[key] : undefined;\n }, obj as unknown);\n}\n", "/**\n * MenoFilter Template Rendering\n *\n * Functions for rendering CMS items from templates and hydrating nested CMS lists.\n * These are tightly coupled (circular dependency) so they live in the same module.\n */\n\nimport type { NestedCMSListConfig } from './types';\nimport { escapeHtml, singularizeWord, getNestedValue } from './utils';\n\n// ============================================================================\n// Template Rendering\n// ============================================================================\n\n/**\n * Render an item from template string\n */\nexport function renderItemFromTemplate(\n template: string,\n item: Record<string, unknown>,\n itemAs: string,\n index: number,\n total: number,\n): HTMLElement {\n let html = template;\n\n // Replace {{itemAs.field}} patterns (e.g., {{item.title}}, {{post.category}})\n html = html.replace(new RegExp(`\\\\{\\\\{${itemAs}\\\\.(\\\\w+)\\\\}\\\\}`, 'g'), (_, field) => {\n const value = item[field];\n return escapeHtml(value != null ? String(value) : '');\n });\n\n // Replace {{item.field}} as fallback\n html = html.replace(/\\{\\{item\\.(\\w+)\\}\\}/g, (_, field) => {\n const value = item[field];\n return escapeHtml(value != null ? String(value) : '');\n });\n\n // Replace context variables\n html = html.replace(new RegExp(`\\\\{\\\\{${itemAs}Index\\\\}\\\\}`, 'g'), String(index));\n html = html.replace(new RegExp(`\\\\{\\\\{${itemAs}First\\\\}\\\\}`, 'g'), index === 0 ? 'true' : 'false');\n html = html.replace(new RegExp(`\\\\{\\\\{${itemAs}Last\\\\}\\\\}`, 'g'), index === total - 1 ? 'true' : 'false');\n\n // Legacy context variables\n html = html.replace(/\\{\\{itemIndex\\}\\}/g, String(index));\n html = html.replace(/\\{\\{itemFirst\\}\\}/g, index === 0 ? 'true' : 'false');\n html = html.replace(/\\{\\{itemLast\\}\\}/g, index === total - 1 ? 'true' : 'false');\n\n // Create element\n const container = document.createElement('div');\n container.innerHTML = html;\n const element = container.firstElementChild as HTMLElement;\n\n // Hydrate nested cms-list placeholders\n hydrateNestedCMSLists(element, item, itemAs);\n\n return element;\n}\n\n/**\n * Render a nested item from template, preserving parent context.\n * Parent context templates are replaced FIRST, then nested item templates.\n * This ensures {{item.field}} resolves to parent when parent used default itemAs.\n */\nexport function renderNestedItemFromTemplate(\n template: string,\n item: Record<string, unknown>,\n itemAs: string,\n index: number,\n total: number,\n parentItem: Record<string, unknown>,\n parentItemAs: string,\n): HTMLElement {\n let html = template;\n\n // FIRST: Replace parent context templates\n\n // Replace {{parentItemAs.field}} (e.g., {{caseStudy.title}} if parent used itemAs: \"caseStudy\")\n if (parentItemAs !== itemAs) {\n html = html.replace(new RegExp(`\\\\{\\\\{${parentItemAs}\\\\.(\\\\w+)\\\\}\\\\}`, 'g'), (_, field) => {\n const value = parentItem[field];\n return escapeHtml(value != null ? String(value) : '');\n });\n }\n\n // Replace {{parentItem.field}} for explicit parent access\n html = html.replace(/\\{\\{parentItem\\.(\\w+)\\}\\}/g, (_, field) => {\n const value = parentItem[field];\n return escapeHtml(value != null ? String(value) : '');\n });\n\n // If parent used default 'item' as itemAs, {{item.field}} should resolve to parent\n // This is the key fix: when parent's itemAs is 'item', nested {{item.x}} = parent's x\n if (parentItemAs === 'item') {\n html = html.replace(/\\{\\{item\\.(\\w+)\\}\\}/g, (_, field) => {\n const value = parentItem[field];\n return escapeHtml(value != null ? String(value) : '');\n });\n }\n\n // THEN: Replace nested item context templates\n\n // Replace {{itemAs.field}} (e.g., {{post.title}})\n html = html.replace(new RegExp(`\\\\{\\\\{${itemAs}\\\\.(\\\\w+)\\\\}\\\\}`, 'g'), (_, field) => {\n const value = item[field];\n return escapeHtml(value != null ? String(value) : '');\n });\n\n // If nested itemAs is NOT 'item' AND parent didn't use 'item',\n // then {{item.field}} falls back to nested item (backward compatibility)\n if (itemAs !== 'item' && parentItemAs !== 'item') {\n html = html.replace(/\\{\\{item\\.(\\w+)\\}\\}/g, (_, field) => {\n const value = item[field];\n return escapeHtml(value != null ? String(value) : '');\n });\n }\n\n // Replace context variables for nested item\n html = html.replace(new RegExp(`\\\\{\\\\{${itemAs}Index\\\\}\\\\}`, 'g'), String(index));\n html = html.replace(new RegExp(`\\\\{\\\\{${itemAs}First\\\\}\\\\}`, 'g'), index === 0 ? 'true' : 'false');\n html = html.replace(new RegExp(`\\\\{\\\\{${itemAs}Last\\\\}\\\\}`, 'g'), index === total - 1 ? 'true' : 'false');\n\n // Legacy context variables (always nested item's index)\n html = html.replace(/\\{\\{itemIndex\\}\\}/g, String(index));\n html = html.replace(/\\{\\{itemFirst\\}\\}/g, index === 0 ? 'true' : 'false');\n html = html.replace(/\\{\\{itemLast\\}\\}/g, index === total - 1 ? 'true' : 'false');\n\n // Create element\n const container = document.createElement('div');\n container.innerHTML = html;\n const element = container.firstElementChild as HTMLElement;\n\n // Recursively hydrate any deeper nested cms-lists\n hydrateNestedCMSLists(element, item, itemAs);\n\n return element;\n}\n\n// ============================================================================\n// Nested CMS List Hydration\n// ============================================================================\n\n/**\n * Find and hydrate all nested cms-list placeholders in an element\n */\nexport function hydrateNestedCMSLists(\n element: HTMLElement,\n parentItem: Record<string, unknown>,\n parentItemAs: string,\n): void {\n const placeholders = element.querySelectorAll<HTMLElement>('[data-cms-list-nested=\"true\"]');\n\n for (const placeholder of placeholders) {\n hydrateNestedCMSList(placeholder, parentItem, parentItemAs);\n }\n}\n\n/**\n * Hydrate a single nested cms-list placeholder\n */\nfunction hydrateNestedCMSList(\n placeholder: HTMLElement,\n parentItem: Record<string, unknown>,\n parentItemAs: string,\n): void {\n const configStr = placeholder.getAttribute('data-cms-config');\n if (!configStr) return;\n\n let config: NestedCMSListConfig;\n try {\n config = JSON.parse(configStr);\n } catch {\n return;\n }\n\n const collection = config.collection;\n const templateEl = placeholder.querySelector<HTMLTemplateElement>('template[data-nested-template]');\n if (!templateEl) return;\n\n const childTemplate = templateEl.innerHTML.trim();\n const nestedItemAs = config.itemAs || singularizeWord(collection);\n\n // Get collection data from inline JSON\n const collectionData = getCollectionData(collection);\n if (!collectionData) {\n console.warn(\n `MenoFilter: No data for nested collection \"${collection}\". Ensure clientData.enabled is true in schema.`,\n );\n return;\n }\n\n // Resolve items\n let items: Record<string, unknown>[];\n\n if (config.items) {\n // Reference relationship: resolve IDs from parent\n const itemIds = resolveItemsFromParent(config.items, parentItem, parentItemAs);\n items = itemIds\n .map((id) => collectionData.find((item) => item._id === id || item._filename === id))\n .filter((item): item is Record<string, unknown> => item !== undefined);\n } else {\n // Filter relationship: apply filter with resolved parent values\n items = applyNestedFilter(collectionData, config.filter, parentItem, parentItemAs);\n }\n\n // Apply sorting\n if (config.sort) {\n items = applyNestedSorting(items, config.sort);\n }\n\n // Apply offset/limit\n if (config.offset) items = items.slice(config.offset);\n if (config.limit) items = items.slice(0, config.limit);\n\n // Render items with parent context preserved\n const renderedItems: HTMLElement[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item === undefined) continue;\n const childElement = renderNestedItemFromTemplate(\n childTemplate,\n item,\n nestedItemAs,\n i,\n items.length,\n parentItem,\n parentItemAs,\n );\n renderedItems.push(childElement);\n }\n\n // Replace placeholder content (keep template for potential re-renders)\n const existingChildren = Array.from(placeholder.children).filter((el) => el.tagName !== 'TEMPLATE');\n existingChildren.forEach((el) => {\n el.remove();\n });\n\n for (const item of renderedItems) {\n placeholder.appendChild(item);\n }\n\n placeholder.setAttribute('data-cms-list-hydrated', 'true');\n}\n\n/**\n * Get collection data from inline JSON script element\n */\nfunction getCollectionData(collection: string): Record<string, unknown>[] | null {\n const dataEl = document.getElementById(`meno-cms-${collection}`);\n if (!dataEl?.textContent) return null;\n try {\n return JSON.parse(dataEl.textContent);\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve item IDs from a template expression like {{post.authorId}}\n */\nfunction resolveItemsFromParent(\n template: string | string[],\n parentItem: Record<string, unknown>,\n parentItemAs: string,\n): string[] {\n if (Array.isArray(template)) return template;\n if (typeof template !== 'string' || !template.startsWith('{{')) return [template];\n\n const match = template.match(/^\\{\\{(\\w+)\\.([^}]+)\\}\\}$/);\n if (!match) return [];\n\n const [, varName, fieldPath = ''] = match;\n if (varName !== parentItemAs && varName !== 'item') return [];\n\n const value = getNestedValue(parentItem, fieldPath);\n if (value === null || value === undefined) return [];\n\n return Array.isArray(value) ? value.map(String) : [String(value)];\n}\n\n/**\n * Apply filter to items, resolving any template values from parent context\n */\nfunction applyNestedFilter(\n items: Record<string, unknown>[],\n filter: unknown,\n parentItem: Record<string, unknown>,\n parentItemAs: string,\n): Record<string, unknown>[] {\n if (!filter) return items;\n\n const resolved = resolveNestedFilterTemplates(filter, parentItem, parentItemAs);\n return items.filter((item) => matchesNestedFilter(item, resolved));\n}\n\n/**\n * Resolve template values in filter conditions\n */\nfunction resolveNestedFilterTemplates(\n filter: unknown,\n parentItem: Record<string, unknown>,\n parentItemAs: string,\n): unknown {\n if (Array.isArray(filter)) {\n return filter.map((cond) => ({\n ...cond,\n value: resolveNestedTemplateValue(cond.value, parentItem, parentItemAs),\n }));\n }\n\n if (filter && typeof filter === 'object') {\n if ('field' in filter && 'value' in filter) {\n return {\n ...filter,\n value: resolveNestedTemplateValue((filter as { value: unknown }).value, parentItem, parentItemAs),\n };\n }\n\n // Simple object filter: { fieldName: value }\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(filter)) {\n resolved[key] = resolveNestedTemplateValue(value, parentItem, parentItemAs);\n }\n return resolved;\n }\n\n return filter;\n}\n\n/**\n * Resolve a single template value like {{post.category}}\n */\nfunction resolveNestedTemplateValue(\n value: unknown,\n parentItem: Record<string, unknown>,\n parentItemAs: string,\n): unknown {\n if (typeof value !== 'string' || !value.startsWith('{{')) return value;\n\n const match = value.match(/^\\{\\{(\\w+)\\.([^}]+)\\}\\}$/);\n if (!match) return value;\n\n const [, varName, fieldPath = ''] = match;\n if (varName !== parentItemAs && varName !== 'item') return value;\n\n return getNestedValue(parentItem, fieldPath);\n}\n\n/**\n * Check if an item matches the filter criteria\n */\nfunction matchesNestedFilter(item: Record<string, unknown>, filter: unknown): boolean {\n if (!filter || typeof filter !== 'object') return true;\n\n if (Array.isArray(filter)) {\n return filter.every((cond) => matchesNestedCondition(item, cond));\n }\n\n if ('field' in filter && 'value' in filter) {\n return matchesNestedCondition(item, filter as { field: string; value: unknown });\n }\n\n // Simple object filter: { fieldName: value }\n for (const [field, value] of Object.entries(filter)) {\n if (item[field] !== value) return false;\n }\n return true;\n}\n\n/**\n * Check if an item matches a single filter condition\n */\nfunction matchesNestedCondition(item: Record<string, unknown>, cond: { field: string; value: unknown }): boolean {\n const itemValue = item[cond.field];\n const filterValue = cond.value;\n\n if (Array.isArray(itemValue)) {\n return itemValue.includes(filterValue);\n }\n\n return itemValue === filterValue;\n}\n\n/**\n * Apply sorting to items\n */\nfunction applyNestedSorting(items: Record<string, unknown>[], sort: unknown): Record<string, unknown>[] {\n if (!sort) return items;\n\n const sortConfig = Array.isArray(sort) ? sort[0] : sort;\n if (!sortConfig || typeof sortConfig !== 'object') return items;\n\n const { field, order = 'asc' } = sortConfig as { field: string; order?: 'asc' | 'desc' };\n\n return [...items].sort((a, b) => {\n const aVal = a[field];\n const bVal = b[field];\n\n let cmp = 0;\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n cmp = aVal.localeCompare(bVal);\n } else if (aVal != null && bVal != null) {\n cmp = String(aVal).localeCompare(String(bVal));\n }\n\n return order === 'desc' ? -cmp : cmp;\n });\n}\n", "/**\n * MenoFilter UI Updates\n *\n * Functions for updating UI elements based on filter state:\n * - Count displays\n * - Facet counts\n * - Active filter tags\n * - Empty state\n * - Pagination\n * - Active states on controls\n */\n\nimport { MenoFilter } from './MenoFilter';\nimport { ATTR } from './constants';\nimport type { FilterInstance, FilterState } from './types';\nimport { renderItemFromTemplate } from './renderer';\n\n// ============================================================================\n// Main Update Function\n// ============================================================================\n\n/**\n * Update all UI elements based on current filter state\n */\nexport function updateUI(instance: FilterInstance): void {\n const { wrapper, filter } = instance;\n const state = filter.getState();\n\n // Filter DOM elements (for SSR-rendered content)\n filterDOMItems(instance);\n\n updateCounts(wrapper, state);\n updateFacets(wrapper, filter);\n updateActiveFilters(wrapper, filter, instance);\n updateEmptyState(wrapper, state);\n updatePagination(wrapper, state);\n updateLoadMoreUI(wrapper, filter);\n updateActiveStates(wrapper, filter);\n updateRangeInputs(wrapper, filter);\n}\n\n// ============================================================================\n// DOM Filtering\n// ============================================================================\n\n/**\n * Filter and render items based on current filter criteria.\n * Uses JSON data when available for filtering/pagination, dynamically renders items from template.\n */\nexport function filterDOMItems(instance: FilterInstance): void {\n const { wrapper, filter, itemTemplate } = instance;\n const listEl = wrapper.querySelector<HTMLElement>(`[${ATTR.LIST}]`);\n if (!listEl) return;\n\n const jsonItems = filter.getAll();\n const hasJsonData = jsonItems.length > 0;\n\n // If we have JSON data with template, use JSON-based rendering\n if (hasJsonData && itemTemplate) {\n filterWithJsonData(instance, listEl);\n return;\n }\n\n // Fallback: DOM-only filtering (show/hide existing elements)\n filterDOMOnly(instance, listEl);\n}\n\n/**\n * JSON-based filtering with dynamic rendering.\n * Uses JSON data for filtering/sorting/pagination, renders items from template.\n * Supports both pagination mode (replace) and load-more mode (append).\n */\nfunction filterWithJsonData(instance: FilterInstance, listEl: HTMLElement): void {\n const { filter, itemTemplate, ssrItems, itemAs, loadMoreMode } = instance;\n\n // Get items to render based on mode\n const itemsToRender = loadMoreMode ? filter.getVisibleItems() : filter.getItems();\n\n // Track which elements to show\n const elementsToShow: HTMLElement[] = [];\n\n // In load-more mode, track existing rendered item IDs to avoid re-rendering\n const existingIds = new Set<string>();\n if (loadMoreMode) {\n for (const child of Array.from(listEl.children) as HTMLElement[]) {\n if (child.tagName === 'TEMPLATE') continue;\n const id = child.getAttribute('data-id') || child.getAttribute('data-_id');\n if (id) existingIds.add(id);\n }\n }\n\n // Clear dynamically-created items only in pagination mode (not load-more)\n if (!loadMoreMode) {\n for (const child of Array.from(listEl.children) as HTMLElement[]) {\n // Skip template element\n if (child.tagName === 'TEMPLATE') continue;\n if (child.hasAttribute('data-meno-dynamic')) {\n child.remove();\n } else {\n child.style.display = 'none';\n }\n }\n }\n\n // Render each item\n for (let i = 0; i < itemsToRender.length; i++) {\n const item = itemsToRender[i];\n if (item === undefined) continue;\n const itemId = item._id;\n\n // In load-more mode, skip items already rendered\n if (loadMoreMode && existingIds.has(itemId)) {\n continue;\n }\n\n // Check if we have an SSR'd element for this item\n const ssrElement = ssrItems.get(itemId);\n\n if (ssrElement) {\n // Reuse SSR'd element\n ssrElement.style.display = '';\n listEl.appendChild(ssrElement); // Move to correct position\n elementsToShow.push(ssrElement);\n } else if (itemTemplate) {\n // Dynamically create element from template\n const newElement = renderItemFromTemplate(itemTemplate, item, itemAs, i, itemsToRender.length);\n newElement.setAttribute('data-meno-dynamic', 'true');\n newElement.setAttribute('data-id', itemId); // Track ID for load-more mode\n listEl.appendChild(newElement);\n elementsToShow.push(newElement);\n }\n }\n}\n\n/**\n * DOM-only filtering (fallback when no JSON data available).\n * Shows/hides existing DOM elements based on data attributes.\n */\nfunction filterDOMOnly(instance: FilterInstance, listEl: HTMLElement): void {\n const { filter } = instance;\n\n const items = Array.from(listEl.children) as HTMLElement[];\n if (items.length === 0) return;\n\n const filters = filter.getFilters();\n const searchQuery = filter.getSearch().query.toLowerCase();\n const searchFields = filter.getSearch().fields;\n const sortConfig = filter.getSort();\n const perPage = filter.getPageInfo().perPage;\n const currentPage = filter.getPageInfo().current;\n\n // Build filtered list\n const filteredItems = items.filter((item) => {\n // Check filters\n for (const [field, value] of Object.entries(filters)) {\n const itemValue = getItemFieldValue(item, field);\n if (!matchesFilter(itemValue, value)) {\n return false;\n }\n }\n\n // Check search\n if (searchQuery) {\n const searchableText = getSearchableText(item, searchFields);\n if (!searchableText.toLowerCase().includes(searchQuery)) {\n return false;\n }\n }\n\n return true;\n });\n\n // Sort if configured\n if (sortConfig) {\n filteredItems.sort((a, b) => {\n const aVal = getItemFieldValue(a, sortConfig.field);\n const bVal = getItemFieldValue(b, sortConfig.field);\n\n let cmp = 0;\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n cmp = aVal.localeCompare(bVal);\n } else if (aVal != null && bVal != null) {\n cmp = String(aVal).localeCompare(String(bVal));\n } else if (aVal == null) {\n cmp = 1;\n } else {\n cmp = -1;\n }\n\n return sortConfig.order === 'desc' ? -cmp : cmp;\n });\n }\n\n // Calculate pagination\n const totalFiltered = filteredItems.length;\n const startIndex = perPage > 0 ? (currentPage - 1) * perPage : 0;\n const endIndex = perPage > 0 ? startIndex + perPage : totalFiltered;\n const pageItems = filteredItems.slice(startIndex, endIndex);\n\n // Update visibility\n for (const item of items) {\n const shouldShow = pageItems.includes(item);\n item.style.display = shouldShow ? '' : 'none';\n }\n\n // Reorder DOM to match sort order\n if (sortConfig) {\n for (const item of filteredItems) {\n listEl.appendChild(item);\n }\n }\n}\n\n/**\n * Get a field value from a DOM element via data attributes\n */\nfunction getItemFieldValue(item: HTMLElement, field: string): string | null {\n // Try data-{field} attribute\n const dataAttr = item.getAttribute(`data-${field}`);\n if (dataAttr !== null) return dataAttr;\n\n // Try finding child with data-field=\"{field}\"\n const fieldEl = item.querySelector(`[data-field=\"${field}\"]`);\n if (fieldEl) return fieldEl.textContent?.trim() || null;\n\n // Try finding element with data-{field} attribute\n const childWithAttr = item.querySelector(`[data-${field}]`);\n if (childWithAttr) return childWithAttr.getAttribute(`data-${field}`);\n\n return null;\n}\n\n/**\n * Get searchable text from an element\n */\nfunction getSearchableText(item: HTMLElement, fields: string[]): string {\n if (fields.length > 0) {\n return fields.map((f) => getItemFieldValue(item, f) || '').join(' ');\n }\n return item.textContent || '';\n}\n\n/**\n * Check if a value matches a filter criterion\n */\nfunction matchesFilter(itemValue: string | null, filterValue: unknown): boolean {\n if (filterValue === null || filterValue === undefined || filterValue === '') {\n return true;\n }\n\n if (itemValue === null) {\n return false;\n }\n\n // Handle operator objects\n if (typeof filterValue === 'object' && filterValue !== null && !Array.isArray(filterValue)) {\n const ops = filterValue as Record<string, unknown>;\n\n for (const [op, val] of Object.entries(ops)) {\n switch (op) {\n case '$eq':\n if (itemValue !== val) return false;\n break;\n case '$neq':\n if (itemValue === val) return false;\n break;\n case '$contains':\n if (!itemValue.toLowerCase().includes(String(val).toLowerCase())) return false;\n break;\n case '$in':\n if (!Array.isArray(val) || !val.includes(itemValue)) return false;\n break;\n case '$nin':\n if (Array.isArray(val) && val.includes(itemValue)) return false;\n break;\n }\n }\n return true;\n }\n\n // Direct value comparison\n return itemValue === String(filterValue);\n}\n\n// ============================================================================\n// Count Updates\n// ============================================================================\n\n/**\n * Update count elements\n */\nexport function updateCounts(wrapper: HTMLElement, state: FilterState): void {\n const countElements = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.COUNT}]`);\n\n for (const el of countElements) {\n const type = el.getAttribute(ATTR.COUNT);\n let value: number;\n\n switch (type) {\n case 'results':\n value = state.page.totalItems;\n break;\n case 'total':\n value = state.items.length;\n break;\n case 'visible':\n value = state.pageItems.length;\n break;\n default:\n continue;\n }\n\n el.textContent = String(value);\n }\n}\n\n// ============================================================================\n// Facet Updates\n// ============================================================================\n\n/**\n * Update facet count elements\n */\nexport function updateFacets(wrapper: HTMLElement, filter: MenoFilter): void {\n const facetElements = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.FACET}]`);\n\n for (const el of facetElements) {\n const facetSpec = el.getAttribute(ATTR.FACET);\n if (!facetSpec) continue;\n\n // Parse \"field:value\" format\n const [field, value] = facetSpec.split(':');\n if (!field || !value) continue;\n\n const facets = filter.getAllFacets(field);\n const count = facets[value] || 0;\n\n el.textContent = String(count);\n }\n}\n\n// ============================================================================\n// Active Filters Display\n// ============================================================================\n\n/**\n * Update active filters display\n */\nexport function updateActiveFilters(wrapper: HTMLElement, filter: MenoFilter, instance: FilterInstance): void {\n const container = wrapper.querySelector<HTMLElement>(`[${ATTR.ACTIVE_FILTERS}]`);\n if (!container) return;\n\n const template = wrapper.querySelector<HTMLTemplateElement>(`template[${ATTR.ACTIVE_FILTER_TEMPLATE}]`);\n\n const filters = filter.getFilters();\n const entries = Object.entries(filters);\n\n // Clear existing\n container.innerHTML = '';\n\n if (entries.length === 0) {\n container.style.display = 'none';\n return;\n }\n\n container.style.display = '';\n\n for (const [field, value] of entries) {\n // Skip operator objects for now (show as \"Field: [filter]\")\n const displayValue = typeof value === 'object' ? '[filter]' : String(value);\n\n if (template) {\n // Use template\n const clone = template.content.cloneNode(true) as DocumentFragment;\n const labelEl = clone.querySelector('[data-meno-filter-label]');\n const valueEl = clone.querySelector('[data-meno-filter-value]');\n const removeBtn = clone.querySelector<HTMLElement>(`[${ATTR.FILTER_REMOVE}]`);\n\n if (labelEl) labelEl.textContent = field;\n if (valueEl) valueEl.textContent = displayValue;\n if (removeBtn) {\n const handler = () => {\n filter.removeFilter(field);\n };\n removeBtn.addEventListener('click', handler);\n instance.cleanup.push(() => removeBtn.removeEventListener('click', handler));\n }\n\n container.appendChild(clone);\n } else {\n // Default tag\n const tag = document.createElement('span');\n tag.className = 'meno-filter-tag';\n tag.innerHTML = `${field}: ${displayValue} <button type=\"button\">&times;</button>`;\n\n const removeBtn = tag.querySelector('button')!;\n const handler = () => {\n filter.removeFilter(field);\n };\n removeBtn.addEventListener('click', handler);\n instance.cleanup.push(() => removeBtn.removeEventListener('click', handler));\n\n container.appendChild(tag);\n }\n }\n}\n\n// ============================================================================\n// Empty State\n// ============================================================================\n\n/**\n * Update empty state visibility\n */\nexport function updateEmptyState(wrapper: HTMLElement, state: FilterState): void {\n const emptyEl = wrapper.querySelector<HTMLElement>(`[${ATTR.EMPTY}]`);\n if (!emptyEl) return;\n\n if (state.pageItems.length === 0) {\n emptyEl.style.display = '';\n } else {\n emptyEl.style.display = 'none';\n }\n}\n\n// ============================================================================\n// Pagination Updates\n// ============================================================================\n\n/**\n * Update pagination display\n */\nexport function updatePagination(wrapper: HTMLElement, state: FilterState): void {\n const { page } = state;\n\n // Update current page display\n const currentEls = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.PAGE_CURRENT}]`);\n for (const el of currentEls) {\n el.textContent = String(page.current);\n }\n\n // Update total pages display\n const totalEls = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.PAGE_TOTAL}]`);\n for (const el of totalEls) {\n el.textContent = String(page.total);\n }\n\n // Update prev/next button states\n const prevButtons = wrapper.querySelectorAll<HTMLButtonElement>(`[${ATTR.PAGE}=\"prev\"]`);\n for (const btn of prevButtons) {\n btn.disabled = !page.hasPrev;\n btn.style.opacity = page.hasPrev ? '' : '0.5';\n }\n\n const nextButtons = wrapper.querySelectorAll<HTMLButtonElement>(`[${ATTR.PAGE}=\"next\"]`);\n for (const btn of nextButtons) {\n btn.disabled = !page.hasNext;\n btn.style.opacity = page.hasNext ? '' : '0.5';\n }\n\n // Generate page buttons\n const pageButtonsContainer = wrapper.querySelector<HTMLElement>(`[${ATTR.PAGE_BUTTONS}]`);\n if (pageButtonsContainer) {\n generatePageButtons(pageButtonsContainer, page, (pageNum) => {\n MenoFilter.get(wrapper.getAttribute(ATTR.FILTER)!)?.setPage(pageNum);\n });\n }\n}\n\n/**\n * Generate page number buttons\n */\nexport function generatePageButtons(\n container: HTMLElement,\n page: { current: number; total: number },\n onClick: (page: number) => void,\n): void {\n container.innerHTML = '';\n\n if (page.total <= 1) return;\n\n // Simple pagination: show all pages if <= 7, otherwise show with ellipsis\n const maxButtons = 7;\n let pages: (number | '...')[] = [];\n\n if (page.total <= maxButtons) {\n pages = Array.from({ length: page.total }, (_, i) => i + 1);\n } else {\n // Always show first, last, current, and neighbors\n const current = page.current;\n pages = [1];\n\n if (current > 3) {\n pages.push('...');\n }\n\n for (let i = Math.max(2, current - 1); i <= Math.min(page.total - 1, current + 1); i++) {\n if (!pages.includes(i)) {\n pages.push(i);\n }\n }\n\n if (current < page.total - 2) {\n pages.push('...');\n }\n\n if (!pages.includes(page.total)) {\n pages.push(page.total);\n }\n }\n\n for (const p of pages) {\n if (p === '...') {\n const span = document.createElement('span');\n span.textContent = '...';\n span.className = 'meno-page-dots';\n container.appendChild(span);\n } else {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.textContent = String(p);\n btn.className = p === page.current ? 'meno-page-btn active' : 'meno-page-btn';\n btn.addEventListener('click', () => onClick(p));\n container.appendChild(btn);\n }\n }\n}\n\n// ============================================================================\n// Load More UI\n// ============================================================================\n\n/**\n * Update load more button and remaining count\n */\nexport function updateLoadMoreUI(wrapper: HTMLElement, filter: MenoFilter): void {\n const info = filter.getLoadMoreInfo();\n\n // Update remaining count displays\n const remainingEls = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.REMAINING}]`);\n for (const el of remainingEls) {\n el.textContent = String(info.remaining);\n }\n\n // Show/hide load more button based on hasMore\n const loadMoreBtn = wrapper.querySelector<HTMLElement>(`[${ATTR.LOAD_MORE}]`);\n if (loadMoreBtn) {\n loadMoreBtn.style.display = info.hasMore ? '' : 'none';\n }\n}\n\n// ============================================================================\n// Active States\n// ============================================================================\n\n/**\n * Update active states on filter controls\n */\nexport function updateActiveStates(wrapper: HTMLElement, filter: MenoFilter): void {\n const filters = filter.getFilters();\n const activeClass = wrapper.getAttribute(ATTR.ACTIVE_CLASS) || 'active';\n\n // Update filter buttons\n const filterButtons = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.FILTER_FIELD}][${ATTR.FILTER_VALUE}]`);\n\n for (const btn of filterButtons) {\n if (btn.tagName === 'INPUT') continue;\n\n const field = btn.getAttribute(ATTR.FILTER_FIELD);\n const value = btn.getAttribute(ATTR.FILTER_VALUE);\n\n // Skip buttons with missing/empty filter field or value\n if (!field || !value) continue;\n\n const currentValue = filters[field];\n\n // Only active if filter is explicitly set AND matches this value\n const isActive =\n currentValue !== undefined &&\n (currentValue === value ||\n (Array.isArray(currentValue) && currentValue.includes(value)) ||\n (typeof currentValue === 'object' &&\n currentValue !== null &&\n '$in' in currentValue &&\n Array.isArray((currentValue as { $in: unknown[] }).$in) &&\n (currentValue as { $in: unknown[] }).$in.includes(value)));\n\n btn.classList.toggle(activeClass, isActive);\n }\n\n // Update clear button (active when no filters)\n const clearButtons = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.CLEAR}]`);\n const hasFilters = Object.keys(filters).length > 0;\n\n for (const btn of clearButtons) {\n btn.classList.toggle(activeClass, !hasFilters);\n }\n\n // Update sort triggers\n const sortConfig = filter.getSort();\n const sortTriggers = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.SORT}]`);\n\n for (const trigger of sortTriggers) {\n if (trigger.tagName === 'SELECT') {\n const select = trigger as HTMLSelectElement;\n if (sortConfig) {\n select.value = `${sortConfig.field}:${sortConfig.order}`;\n } else {\n select.value = '';\n }\n continue;\n }\n\n const field = trigger.getAttribute(ATTR.SORT)!;\n const isActive = sortConfig?.field === field;\n trigger.classList.toggle(activeClass, isActive);\n\n // Update sort order indicator if present\n if (isActive && sortConfig) {\n trigger.setAttribute('data-meno-sort-active', sortConfig.order);\n } else {\n trigger.removeAttribute('data-meno-sort-active');\n }\n }\n}\n\n// ============================================================================\n// Range Input Updates\n// ============================================================================\n\n/**\n * Update range inputs from filter state\n * This syncs the input values when filters are changed programmatically\n */\nexport function updateRangeInputs(wrapper: HTMLElement, filter: MenoFilter): void {\n const filters = filter.getFilters();\n const rangeInputs = wrapper.querySelectorAll<HTMLInputElement>(`[${ATTR.RANGE}]`);\n\n for (const input of rangeInputs) {\n const field = input.getAttribute(ATTR.RANGE);\n if (!field) continue;\n\n const bound = input.getAttribute(ATTR.RANGE_BOUND) as 'min' | 'max' | null;\n if (!bound || (bound !== 'min' && bound !== 'max')) continue;\n\n const fieldFilter = filters[field];\n\n // No filter for this field\n if (!fieldFilter || typeof fieldFilter !== 'object' || fieldFilter === null) {\n // Don't clear - let user manage input value\n continue;\n }\n\n const filterObj = fieldFilter as Record<string, unknown>;\n const value = bound === 'min' ? filterObj.$gte : filterObj.$lte;\n\n if (value !== undefined && value !== null) {\n if (input.type === 'date') {\n // Convert timestamp to YYYY-MM-DD format\n const date = new Date(value as number);\n if (!Number.isNaN(date.getTime())) {\n input.value = date.toISOString().split('T')[0] ?? '';\n }\n } else {\n input.value = String(value);\n }\n }\n }\n}\n", "/**\n * MenoFilter Auto-Initialization\n *\n * Discovers [data-meno-filter] wrappers and auto-binds filter controls.\n * Supports declarative filtering without writing JavaScript.\n */\n\nimport { MenoFilter } from './MenoFilter';\nimport { ATTR } from './constants';\nimport type { FilterInstance } from './types';\nimport {\n bindFilterControls,\n bindSearchControls,\n bindSortControls,\n bindActionControls,\n bindPaginationControls,\n bindLoadMoreControls,\n bindRangeInputs,\n} from './bindings';\nimport { updateUI } from './updates';\n\n// ============================================================================\n// State\n// ============================================================================\n\nconst instances: Map<string, FilterInstance> = new Map();\n\n// ============================================================================\n// Initialization\n// ============================================================================\n\n/**\n * Initialize all MenoFilter instances from data attributes\n */\nexport async function initMenoFilter(): Promise<void> {\n const wrappers = document.querySelectorAll<HTMLElement>(`[${ATTR.FILTER}]`);\n\n for (const wrapper of wrappers) {\n const collection = wrapper.getAttribute(ATTR.FILTER);\n if (!collection) continue;\n\n // Skip if already initialized\n if (instances.has(collection)) continue;\n\n await initFilterInstance(wrapper, collection);\n }\n}\n\n/**\n * Initialize a single filter instance\n */\nasync function initFilterInstance(wrapper: HTMLElement, collection: string): Promise<void> {\n // Parse configuration from attributes\n const perPage = parseInt(wrapper.getAttribute(ATTR.PER_PAGE) || '0', 10);\n const filterMatch = (wrapper.getAttribute(ATTR.FILTER_MATCH) as 'and' | 'or') || 'and';\n const debounce = parseInt(wrapper.getAttribute(ATTR.DEBOUNCE) || '0', 10);\n\n // Parse URL sync settings\n const urlSync = wrapper.getAttribute(ATTR.URL_SYNC) === 'true';\n const urlMode = (wrapper.getAttribute(ATTR.URL_MODE) as 'push' | 'replace') || 'replace';\n\n // Parse field types\n let fieldTypes: Record<string, import('./types').FieldType> | undefined;\n const typesAttr = wrapper.getAttribute(ATTR.TYPES);\n if (typesAttr) {\n try {\n fieldTypes = JSON.parse(typesAttr);\n } catch (e) {\n console.warn('MenoFilter: Invalid data-meno-types JSON', e);\n }\n }\n\n // Parse fuzzy search settings from search input\n let fuzzySearch = false;\n let fuzzyThreshold = 0.3;\n const searchInput = wrapper.querySelector<HTMLInputElement>(`[${ATTR.SEARCH}]`);\n if (searchInput) {\n fuzzySearch = searchInput.getAttribute(ATTR.SEARCH_FUZZY) === 'true';\n const thresholdAttr = searchInput.getAttribute(ATTR.SEARCH_THRESHOLD);\n if (thresholdAttr) {\n const parsed = parseFloat(thresholdAttr);\n if (!Number.isNaN(parsed)) {\n fuzzyThreshold = parsed;\n }\n }\n }\n\n // Create MenoFilter instance\n const filter = new MenoFilter({\n collection,\n perPage,\n filterMatch,\n debounce,\n urlSync,\n urlMode,\n fieldTypes,\n fuzzySearch,\n fuzzyThreshold,\n });\n\n // Track cleanup functions\n const cleanup: (() => void)[] = [];\n\n // Extract item template and SSR'd items from DOM\n const { itemTemplate, ssrItems, itemAs } = extractItemTemplate(wrapper);\n\n // Store instance\n const instance: FilterInstance = {\n wrapper,\n collection,\n filter,\n cleanup,\n itemTemplate,\n ssrItems,\n itemAs,\n loadMoreMode: false, // Will be set to true by bindLoadMoreControls if load-more button exists\n };\n instances.set(collection, instance);\n\n // Bind controls\n bindFilterControls(instance);\n bindSearchControls(instance);\n bindSortControls(instance);\n bindActionControls(instance);\n bindPaginationControls(instance);\n bindLoadMoreControls(instance);\n bindRangeInputs(instance);\n\n // Initialize data\n await filter.init();\n\n // Initial UI update\n updateUI(instance);\n\n // Watch for changes\n cleanup.push(\n filter.watch(() => {\n updateUI(instance);\n }),\n );\n}\n\n/**\n * Extract item template from SSR-emitted <template data-meno-item> element.\n * Also tracks SSR'd items by their data-id for potential reuse.\n */\nfunction extractItemTemplate(wrapper: HTMLElement): {\n itemTemplate?: string;\n ssrItems: Map<string, HTMLElement>;\n itemAs: string;\n} {\n const listEl = wrapper.querySelector<HTMLElement>(`[${ATTR.LIST}]`);\n const ssrItems = new Map<string, HTMLElement>();\n\n // Default item context name\n let itemAs = 'item';\n\n if (!listEl) {\n return { itemTemplate: undefined, ssrItems, itemAs };\n }\n\n // Look for SSR-emitted template (from cms-list emitTemplate: true)\n const emittedTemplate = listEl.querySelector<HTMLTemplateElement>(`template[${ATTR.ITEM}]`);\n if (emittedTemplate) {\n const itemTemplate = emittedTemplate.innerHTML.trim();\n // Detect itemAs from template variables (e.g., {{post.title}} \u2192 \"post\")\n const match = itemTemplate.match(/\\{\\{(\\w+)\\./);\n if (match && match[1] !== undefined) itemAs = match[1];\n\n // Store SSR'd items by their data-id for potential reuse\n for (const child of Array.from(listEl.children) as HTMLElement[]) {\n if (child.tagName === 'TEMPLATE') continue; // Skip template element\n const id = child.getAttribute('data-id') || child.getAttribute('data-_id');\n if (id) {\n ssrItems.set(id, child);\n }\n }\n\n return { itemTemplate, ssrItems, itemAs };\n }\n\n // Fallback: Check for user-provided template element\n const userTemplate = wrapper.querySelector<HTMLTemplateElement>(`template[${ATTR.ITEM}]`);\n if (userTemplate) {\n const itemTemplate = userTemplate.innerHTML.trim();\n const match = itemTemplate.match(/\\{\\{(\\w+)\\./);\n if (match && match[1] !== undefined) itemAs = match[1];\n return { itemTemplate, ssrItems, itemAs };\n }\n\n // No template available - dynamic rendering not possible\n // Store SSR'd items by index as fallback for show/hide pagination\n for (let i = 0; i < listEl.children.length; i++) {\n const child = listEl.children[i] as HTMLElement;\n ssrItems.set(`__ssr_index_${i}`, child);\n }\n\n return { itemTemplate: undefined, ssrItems, itemAs };\n}\n\n// ============================================================================\n// Destroy / Cleanup\n// ============================================================================\n\n/**\n * Destroy a filter instance\n */\nexport function destroyMenoFilter(collection: string): void {\n const instance = instances.get(collection);\n if (!instance) return;\n\n // Run cleanup functions\n for (const cleanup of instance.cleanup) {\n cleanup();\n }\n\n // Destroy filter\n instance.filter.destroy();\n\n // Remove from registry\n instances.delete(collection);\n MenoFilter.destroy(collection);\n}\n\n/**\n * Destroy all filter instances\n */\nexport function destroyAllMenoFilters(): void {\n for (const collection of instances.keys()) {\n destroyMenoFilter(collection);\n }\n}\n\n/**\n * Get a filter instance by collection name\n */\nexport function getMenoFilterInstance(collection: string): FilterInstance | undefined {\n return instances.get(collection);\n}\n\n// ============================================================================\n// Auto-initialization on DOM ready\n// ============================================================================\n\nexport function autoInit(): void {\n if (typeof document === 'undefined') return;\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => initMenoFilter());\n } else {\n initMenoFilter();\n }\n}\n\n// Auto-initialize when script loads in browser\n// This ensures the bundled inline script works without manual init\nautoInit();\n\nexport default { initMenoFilter, destroyMenoFilter, destroyAllMenoFilters, autoInit };\n", "/**\n * Shared path utility functions\n * Used by both build system and server router\n */\n\nimport type { Path } from './paths';\nimport {\n stringToPath,\n pathToLegacyString,\n getParentPath as getParentPathArray,\n buildParentPaths as buildParentPathsArray,\n isRootPath as isRootPathArray,\n ROOT_STRING,\n domPathStringToTreePath,\n treePathToDomPathString,\n isAncestorPath,\n} from './paths';\n\n/**\n * Convert a page path to static HTML file path\n *\n * @example\n * getStaticFilePath(\"/\") -> \"./dist/index.html\"\n * getStaticFilePath(\"/about\") -> \"./dist/about.html\"\n * getStaticFilePath(\"/blog/post-1\") -> \"./dist/blog-post-1.html\"\n */\nexport function getStaticFilePath(pagePath: string, distDir: string = './dist'): string {\n if (pagePath === '/') {\n return `${distDir}/index.html`;\n }\n\n // Convert /about -> about.html\n // Convert /blog/post-1 -> blog-post-1.html (flat structure)\n const pathParts = pagePath.substring(1).split('/');\n const fileName = `${pathParts.join('-')}.html`;\n\n return `${distDir}/${fileName}`;\n}\n\n/**\n * Convert a page path to a page name (for file system)\n *\n * @example\n * pathToPageName(\"/\") -> \"index\"\n * pathToPageName(\"/about\") -> \"about\"\n */\nexport function pathToPageName(pagePath: string): string {\n return pagePath === '/' ? 'index' : pagePath.substring(1);\n}\n\n/**\n * Convert a page name to a page path\n *\n * @example\n * pageNameToPath(\"index\") -> \"/\"\n * pageNameToPath(\"about\") -> \"/about\"\n */\nexport function pageNameToPath(pageName: string): string {\n return pageName === 'index' ? '/' : `/${pageName}`;\n}\n\n/**\n * Convert tree path to DOM path\n * The tree adds a synthetic \"root\" container, so \"root_0\" in the tree corresponds to \"root\" in the DOM\n * Also accepts array paths: [0] -> \"root\", [0,0] -> \"root_children_0\"\n *\n * Uses array operations internally for conversion.\n *\n * @example\n * treePathToDomPath(\"root_0\") -> \"root\"\n * treePathToDomPath(\"root_0_children_0\") -> \"root_children_0\"\n * treePathToDomPath([0]) -> \"root\"\n * treePathToDomPath([0,0]) -> \"root_children_0\"\n */\nexport function treePathToDomPath(treePath: Path | string): string {\n // Convert to array if needed, then use array-based conversion\n const pathArray = typeof treePath === 'string' ? stringToPath(treePath) : treePath;\n return treePathToDomPathString(pathArray);\n}\n\n/**\n * Convert DOM path back to tree path\n * The tree adds a synthetic \"root\" container, so \"root\" in the DOM corresponds to \"root_0\" in the tree\n * Returns legacy string format for backward compatibility\n *\n * Uses array operations internally for conversion.\n *\n * @example\n * domPathToTreePath(\"root\") -> \"root_0\"\n * domPathToTreePath(\"root_children_0\") -> \"root_0_children_0\"\n */\nexport function domPathToTreePath(domPath: string): string {\n // Convert DOM path to array, then to legacy tree path string\n const pathArray = domPathStringToTreePath(domPath);\n return pathToLegacyString(pathArray);\n}\n\n/**\n * Build parent paths for expanding tree nodes\n * Returns all parent path segments for a given tree path\n * Also accepts array paths\n *\n * @example\n * buildParentPaths(\"root_0_children_0_children_1\") -> [\"root_0\", \"root_0_children_0\"]\n * buildParentPaths([0,0,1]) -> [\"root_0\", \"root_0_children_0\"]\n */\nexport function buildParentPaths(treePath: Path | string): string[] {\n const pathArray = typeof treePath === 'string' ? stringToPath(treePath) : treePath;\n\n if (isRootPathArray(pathArray)) {\n return [];\n }\n\n const parentArrays = buildParentPathsArray(pathArray);\n return parentArrays.map(pathToLegacyString);\n}\n\n/**\n * Calculate parent path from a child path\n * Also accepts array paths\n * Example: root_0_children_0 -> root_0\n * Example: root_0_children_0_children_1 -> root_0_children_0\n * Example: [0,0] -> \"root_0\"\n * Example: [0,0,1] -> \"root_0_children_0\"\n */\nexport function getParentPathFromChildPath(childPath: Path | string): string {\n const pathArray = typeof childPath === 'string' ? stringToPath(childPath) : childPath;\n const parentArray = getParentPathArray(pathArray);\n return pathToLegacyString(parentArray);\n}\n\n/**\n * Convert component instance path to component structure path\n * When editing a component, elements clicked inside the component instance on the page\n * need to be converted to their paths within the component structure.\n *\n * Uses array operations internally for path manipulation.\n *\n * @example\n * componentInstancePath: \"root_children_0\" (component instance on page)\n * instancePath: \"root_children_0_children_1\" (element inside instance)\n * Returns: \"root_children_1\" (component structure path)\n *\n * @param instancePath - Path of element within component instance on page (DOM path string)\n * @param componentInstancePath - Path of the component instance root on the page (DOM path string)\n * @returns Component structure path (always starts with \"root\")\n */\nexport function componentInstancePathToStructurePath(instancePath: string, componentInstancePath: string): string {\n // Convert DOM paths to arrays for manipulation\n const instancePathArray = domPathStringToTreePath(instancePath);\n const componentInstancePathArray = domPathStringToTreePath(componentInstancePath);\n\n // Check if instancePath is inside componentInstancePath using array operations\n if (!isAncestorPath(componentInstancePathArray, instancePathArray)) {\n // Not inside component instance - return as-is (shouldn't happen, but handle gracefully)\n return instancePath;\n }\n\n // Extract relative path using array operations\n // componentInstancePathArray: [0, 0] -> instancePathArray: [0, 0, 1]\n // relative: [1] -> convert to DOM path: \"root_children_1\"\n const relativePathArray = instancePathArray.slice(componentInstancePathArray.length);\n\n // Convert relative path array back to DOM path string\n // If relative is empty, return root\n if (relativePathArray.length === 0) {\n return ROOT_STRING;\n }\n\n // Build component structure path: root + relative path\n return treePathToDomPathString(relativePathArray);\n}\n\n/**\n * Convert component structure path to component instance path\n * When selecting an element in the component structure tree, convert it to\n * the path within the component instance on the page.\n *\n * Uses array operations internally for path manipulation.\n *\n * @example\n * componentInstancePath: \"root_children_0\" (component instance on page)\n * structurePath: \"root_children_1\" (element in component structure)\n * Returns: \"root_children_0_children_1\" (path within instance on page)\n *\n * @param structurePath - Path within component structure (starts with \"root\", DOM path string)\n * @param componentInstancePath - Path of the component instance root on the page (DOM path string)\n * @returns Path within component instance on page (DOM path string)\n */\nexport function componentStructurePathToInstancePath(structurePath: string, componentInstancePath: string): string {\n // Convert DOM paths to arrays for manipulation\n const structurePathArray = domPathStringToTreePath(structurePath);\n const componentInstancePathArray = domPathStringToTreePath(componentInstancePath);\n\n // Extract relative path from structure path (skip root [0])\n // structurePathArray: [0, 1] -> relative: [1]\n const relativePathArray = structurePathArray.slice(1);\n\n // Combine component instance path with relative path using array operations\n // componentInstancePathArray: [0, 0] + relativePathArray: [1] -> [0, 0, 1]\n const instancePathArray: Path = [...componentInstancePathArray, ...relativePathArray];\n\n // Convert back to DOM path string\n return treePathToDomPathString(instancePathArray);\n}\n\n/**\n * Convert path for component editing context\n * When editing a component, converts component instance paths to component structure paths\n *\n * Uses array operations internally for path manipulation.\n *\n * @param path - Path array from canvas\n * @param isEditingComponent - Whether we're editing a component\n * @param componentInstancePath - Path of component instance on page (if editing component, Path array)\n * @returns Path array for selection/hover (converted for component context if needed)\n */\nexport function convertPathForComponentContext(\n path: Path,\n isEditingComponent: boolean,\n componentInstancePath: Path | null,\n): Path {\n if (isEditingComponent && componentInstancePath) {\n // Check if path is inside componentInstancePath using array operations\n if (isAncestorPath(componentInstancePath, path)) {\n // Extract relative path: componentInstancePath: [0, 0] -> path: [0, 0, 1]\n // relative: [1] -> component structure path: [0, 1]\n const relativePath = path.slice(componentInstancePath.length);\n\n // Build component structure path: [0] + relative path\n return [0, ...relativePath];\n }\n }\n\n // Regular page editing - return path as-is\n return path;\n}\n", "/**\n * Error Overlay Generator for Preview\n * Generates an HTML page with a styled error overlay when SSR fails\n * Also sends error details to parent editor via postMessage\n */\n\nimport { toFriendlyError } from '../../shared/friendlyError';\n\ninterface ErrorInfo {\n message: string;\n stack?: string;\n}\n\n/**\n * Extract useful error information from various error types\n */\nfunction extractErrorInfo(error: unknown): ErrorInfo {\n if (error instanceof Error) {\n return {\n message: error.message,\n stack: error.stack,\n };\n }\n if (typeof error === 'string') {\n return { message: error };\n }\n return { message: String(error) };\n}\n\n/**\n * Escape HTML to prevent XSS in error messages\n */\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\n/**\n * Safely encode data for embedding in a script tag\n * Escapes </script> sequences and other problematic characters\n */\nfunction safeJsonForScript(data: unknown): string {\n return JSON.stringify(data).replace(/</g, '\\\\u003c').replace(/>/g, '\\\\u003e').replace(/&/g, '\\\\u0026');\n}\n\n/**\n * Generate HTML page with error overlay.\n *\n * @param error Error to display\n * @param context Optional context label shown above the error message\n * @param cspNonce Per-request CSP nonce \u2014 when set, stamped on the inline\n * `<script>` so it executes under a strict (nonce-based)\n * script-src policy without `'unsafe-inline'`. Pass through\n * from the route handler that produces this response.\n */\nexport function generateErrorPage(error: unknown, context?: string, cspNonce?: string): string {\n const errorInfo = extractErrorInfo(error);\n const friendly = toFriendlyError(errorInfo.message);\n const errorMessage = escapeHtml(errorInfo.message);\n const errorStack = errorInfo.stack ? escapeHtml(errorInfo.stack) : '';\n // Escape first (XSS-safe), then turn `backtick` spans into <code> for display.\n const renderInline = (s: string) => escapeHtml(s).replace(/`([^`]+)`/g, '<code>$1</code>');\n const friendlyTitle = escapeHtml(friendly.title);\n const friendlyMessage = renderInline(friendly.friendlyMessage);\n const friendlyHint = friendly.hint ? renderInline(friendly.hint) : '';\n const nonceAttr = cspNonce ? ` nonce=\"${cspNonce}\"` : '';\n\n // Safely encode error data for script. Includes friendly fields so the parent\n // editor can show plain-language text without re-mapping, plus the raw message\n // and stack so \"Copy\" still yields the exact original for debugging.\n const errorDataJson = safeJsonForScript({\n type: 'PREVIEW_ERROR',\n error: {\n message: friendly.friendlyMessage,\n title: friendly.title,\n hint: friendly.hint,\n raw: errorInfo.message,\n stack: errorInfo.stack,\n context,\n },\n });\n\n // Full error text for copying\n const fullErrorText = safeJsonForScript(errorInfo.message + (errorInfo.stack ? `\\n\\n${errorInfo.stack}` : ''));\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Preview Error</title>\n <style${nonceAttr}>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #1a1a1a;\n color: #fff;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n }\n .error-container {\n max-width: 800px;\n width: 100%;\n background: #2d2d2d;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n }\n .error-header {\n background: linear-gradient(135deg, #ff4444 0%, #cc0000 100%);\n padding: 20px 24px;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .error-icon { font-size: 24px; }\n .error-title { font-size: 18px; font-weight: 600; }\n .error-body { padding: 24px; }\n .error-context {\n font-size: 12px;\n color: #888;\n margin-bottom: 16px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n .error-friendly {\n font-size: 15px;\n line-height: 1.6;\n color: #e8e8e8;\n margin-bottom: 16px;\n }\n .error-friendly code {\n font-family: 'SF Mono', Menlo, Monaco, 'Courier New', monospace;\n font-size: 13px;\n background: #1a1a1a;\n border: 1px solid #444;\n border-radius: 4px;\n padding: 1px 5px;\n color: #ffb86b;\n }\n .error-message {\n background: #1a1a1a;\n border: 1px solid #444;\n border-radius: 8px;\n padding: 16px;\n font-family: 'SF Mono', Menlo, Monaco, 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.6;\n color: #ff6b6b;\n overflow-x: auto;\n white-space: pre-wrap;\n word-break: break-word;\n }\n .error-stack { margin-top: 16px; }\n .stack-toggle {\n background: none;\n border: 1px solid #444;\n color: #888;\n padding: 8px 16px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.15s;\n }\n .stack-toggle:hover { background: #333; color: #fff; border-color: #555; }\n .stack-toggle svg { width: 14px; height: 14px; transition: transform 0.2s; }\n .stack-toggle.expanded svg { transform: rotate(90deg); }\n .stack-content {\n display: none;\n margin-top: 12px;\n background: #1a1a1a;\n border: 1px solid #444;\n border-radius: 8px;\n padding: 16px;\n font-family: 'SF Mono', Menlo, Monaco, 'Courier New', monospace;\n font-size: 12px;\n line-height: 1.8;\n color: #999;\n overflow-x: auto;\n white-space: pre;\n }\n .stack-content.visible { display: block; }\n .error-footer {\n padding: 16px 24px;\n background: #252525;\n border-top: 1px solid #333;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 12px;\n }\n .error-hint { font-size: 13px; color: #888; }\n .copy-btn {\n background: #333;\n border: 1px solid #444;\n color: #fff;\n padding: 8px 16px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s;\n }\n .copy-btn:hover { background: #444; border-color: #555; }\n .copy-btn svg { width: 14px; height: 14px; }\n </style>\n</head>\n<body>\n <div class=\"error-container\">\n <div class=\"error-header\">\n <span class=\"error-icon\">\u26A0\uFE0F</span>\n <span class=\"error-title\">${friendlyTitle}</span>\n </div>\n <div class=\"error-body\">\n ${context ? `<div class=\"error-context\">${escapeHtml(context)}</div>` : ''}\n <p class=\"error-friendly\">${friendlyMessage}</p>\n <div class=\"error-stack\">\n <button class=\"stack-toggle\" id=\"stackToggle\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"9 18 15 12 9 6\"></polyline>\n </svg>\n <span>Show technical details</span>\n </button>\n <div class=\"stack-content\" id=\"stackContent\"><div class=\"error-message\">${errorMessage}</div>${errorStack ? `\\n${errorStack}` : ''}</div>\n </div>\n </div>\n <div class=\"error-footer\">\n <span class=\"error-hint\">${friendlyHint}</span>\n <button class=\"copy-btn\" id=\"copyBtn\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n </svg>\n <span>Copy Error</span>\n </button>\n </div>\n </div>\n <script${nonceAttr}>\n (function() {\n // Send error to parent editor\n if (window.parent && window.parent !== window) {\n try {\n window.parent.postMessage(${errorDataJson}, '*');\n } catch (e) {\n console.error('Failed to send error to parent:', e);\n }\n }\n\n // Stack trace toggle\n var stackToggle = document.getElementById('stackToggle');\n var stackContent = document.getElementById('stackContent');\n if (stackToggle && stackContent) {\n stackToggle.addEventListener('click', function() {\n var isVisible = stackContent.classList.toggle('visible');\n stackToggle.classList.toggle('expanded', isVisible);\n stackToggle.querySelector('span').textContent = isVisible ? 'Hide technical details' : 'Show technical details';\n });\n }\n\n // Copy button\n var copyBtn = document.getElementById('copyBtn');\n if (copyBtn) {\n copyBtn.addEventListener('click', function() {\n var errorText = ${fullErrorText};\n navigator.clipboard.writeText(errorText).then(function() {\n var span = copyBtn.querySelector('span');\n var original = span.textContent;\n span.textContent = 'Copied!';\n setTimeout(function() { span.textContent = original; }, 2000);\n }).catch(function(err) {\n console.error('Failed to copy:', err);\n });\n });\n }\n })();\n </script>\n</body>\n</html>`;\n}\n", "/**\n * Script Cache\n * In-memory cache for SSR preview scripts (same pattern as static build)\n */\n\nimport { hashContent as runtimeHashContent } from './runtime';\n\nconst scriptCache = new Map<string, string>();\n\n/**\n * Cache script content with given hash key\n */\nexport function cacheScript(hash: string, content: string): void {\n scriptCache.set(hash, content);\n}\n\n/**\n * Get cached script by hash\n */\nexport function getScript(hash: string): string | undefined {\n return scriptCache.get(hash);\n}\n\n/**\n * Hash content to generate cache key (matches static build pattern)\n */\nexport function hashContent(content: string): string {\n return runtimeHashContent(content);\n}\n\n/**\n * Clear script cache (useful for testing or memory management)\n */\nexport function clearScriptCache(): void {\n scriptCache.clear();\n}\n", "/**\n * Static File Route Handler\n * Serves static files and handles TypeScript/TSX file requests\n */\n\nimport {\n resolveProjectPath,\n resolvePackagePath,\n packagePaths,\n getProjectRoot,\n getPackageRoot,\n} from '../projectContext';\nimport { isPathWithinRoot } from '../../shared/pathSecurity';\nimport { fileExists, serveFile, bundleFile } from '../runtime';\n\nexport async function handleStaticRoute(url: URL, _req?: Request): Promise<Response | undefined> {\n // Handle client-router requests (both .js and .tsx)\n if (url.pathname === '/client-router.js' || url.pathname === '/client-router.tsx') {\n // Check for pre-bundled version first (Electron packaged mode)\n const preBundledPath = packagePaths.clientRouter().replace(/\\.tsx$/, '.js');\n if (preBundledPath !== packagePaths.clientRouter() && (await fileExists(preBundledPath))) {\n return serveFile(preBundledPath, {\n 'Content-Type': 'application/javascript',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n });\n }\n\n // Fall back to runtime bundling (dev mode)\n const result = await bundleFile(packagePaths.clientRouter(), {\n target: 'browser',\n format: 'esm',\n minify: false,\n sourcemap: 'inline',\n });\n\n if (result.success) {\n return new Response(result.code, {\n headers: {\n 'Content-Type': 'application/javascript',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n },\n });\n }\n }\n\n // Serve client bundle with HMR enabled (editor TypeScript files)\n if (url.pathname.endsWith('.tsx') || url.pathname.endsWith('.ts')) {\n const entrypoint = resolvePackagePath(url.pathname.slice(1));\n\n // Security: Prevent path traversal attacks\n if (!isPathWithinRoot(entrypoint, getPackageRoot())) {\n return new Response('Forbidden', { status: 403 });\n }\n\n const result = await bundleFile(entrypoint, {\n target: 'browser',\n format: 'esm',\n minify: false,\n sourcemap: 'inline',\n });\n\n if (result.success) {\n return new Response(result.code, {\n headers: {\n 'Content-Type': 'application/javascript',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n },\n });\n }\n }\n\n // Serve static files (including fonts and images)\n const decodedPathname = decodeURIComponent(url.pathname);\n\n // For fonts, images, and icons, resolve relative to project root\n // Other static files (editor assets) resolve relative to package root\n let filePath: string;\n let rootPath: string;\n if (\n decodedPathname.startsWith('/fonts/') ||\n decodedPathname.startsWith('/images/') ||\n decodedPathname.startsWith('/icons/') ||\n decodedPathname.startsWith('/assets/') ||\n decodedPathname.startsWith('/libraries/') ||\n decodedPathname.startsWith('/videos/')\n ) {\n rootPath = getProjectRoot();\n filePath = resolveProjectPath(decodedPathname.slice(1)); // Remove leading /\n } else {\n rootPath = getPackageRoot();\n filePath = resolvePackagePath(decodedPathname.slice(1)); // Remove leading /\n }\n\n // Security: Prevent path traversal attacks\n if (!isPathWithinRoot(filePath, rootPath)) {\n return new Response('Forbidden', { status: 403 });\n }\n\n if (await fileExists(filePath)) {\n const cacheControl = decodedPathname.startsWith('/libraries/')\n ? 'no-cache, no-store, must-revalidate'\n : 'public, max-age=31536000, immutable';\n return serveFile(filePath, { 'Cache-Control': cacheControl });\n }\n\n return undefined;\n}\n", "/**\n * Server Factory\n * Creates a runtime-agnostic server for meno-core\n * Can be extended by @meno/studio for editor functionality\n */\n\nimport type { PageService } from './services/pageService';\nimport type { ComponentService } from './services/componentService';\nimport type { CMSService } from './services/cmsService';\nimport type { CMSProvider } from '../shared/interfaces/contentProvider';\nimport type { DraftPageStore } from './draftPageStore';\nimport { WebSocketManager } from './websocketManager';\nimport { handleRoutes, type RouteContext } from './routes';\nimport { SERVER_PORT, MAX_PORT_ATTEMPTS, HMR_ROUTE } from '../shared/constants';\nimport { createRuntimeServer, type RuntimeServer, type RuntimeWSClient } from './runtime';\n\nconst COLLAB_ROUTE = '/__collab';\n\n// Custom message handler type\nexport type WSMessageHandler = (ws: RuntimeWSClient, data: unknown) => void;\n\n/**\n * Server configuration\n */\nexport interface ServerConfig {\n port?: number;\n pageService: PageService;\n componentService: ComponentService;\n wsManager: WebSocketManager;\n cmsService?: CMSService;\n cmsProvider?: CMSProvider;\n /**\n * Optional in-memory draft page store. When provided, the page route\n * reads a draft (if one exists for the requested path) before falling\n * back to disk. Enables live preview in external browser tabs without\n * persisting unsaved edits.\n */\n draftPageStore?: DraftPageStore;\n additionalRoutes?: AdditionalRouteHandler[];\n onWSMessage?: WSMessageHandler;\n /**\n * Inject live reload script for on-demand SSR preview mode.\n * When true, pages include a WebSocket client that reloads on HMR messages.\n */\n injectLiveReload?: boolean;\n /** Whether this is the visual editor (studio). Affects library filtering. */\n isEditor?: boolean;\n /**\n * Optional handler for collab WebSocket messages on the /__collab path.\n * When provided, enables the /__collab WebSocket endpoint for real-time\n * collaborative editing via Automerge.\n */\n onCollabWSMessage?: WSMessageHandler;\n /** Callback when a collab WebSocket client connects */\n onCollabWSOpen?: (ws: RuntimeWSClient) => void;\n /** Callback when a collab WebSocket client disconnects */\n onCollabWSClose?: (ws: RuntimeWSClient) => void;\n}\n\n/**\n * Additional route handler type\n */\nexport type AdditionalRouteHandler = (req: Request, url: URL, context: RouteContext) => Promise<Response | undefined>;\n\n/**\n * Server factory result\n */\nexport interface ServerResult {\n server: RuntimeServer;\n port: number;\n}\n\n/**\n * Create a server with the given configuration\n */\nexport async function createServer(config: ServerConfig): Promise<ServerResult> {\n const {\n port: requestedPort = SERVER_PORT,\n pageService,\n componentService,\n wsManager,\n cmsService,\n cmsProvider,\n draftPageStore,\n additionalRoutes = [],\n onWSMessage,\n injectLiveReload,\n isEditor,\n onCollabWSMessage,\n onCollabWSOpen,\n onCollabWSClose,\n } = config;\n\n // Track which WS path each client connected from\n const collabClients = new WeakSet<RuntimeWSClient>();\n\n const routeContext: RouteContext = {\n pageService,\n componentService,\n cmsService,\n cmsProvider,\n injectLiveReload,\n isEditor,\n wsManager,\n draftPageStore,\n };\n\n // Will be set after server starts to inject actual bound port into live reload script\n let _boundPort: number | undefined;\n\n // Try to start server, incrementing port if busy\n let lastError: unknown;\n\n for (let portAttempt = 0; portAttempt < MAX_PORT_ATTEMPTS; portAttempt++) {\n const currentPort = requestedPort + portAttempt;\n\n try {\n const server = await createRuntimeServer({\n port: currentPort,\n hostname: 'localhost',\n wsPath: HMR_ROUTE,\n\n async fetch(req: Request, upgradeWebSocket: (req: Request) => boolean) {\n const url = new URL(req.url);\n\n // Check additional routes first (allows studio to inject routes)\n for (const handler of additionalRoutes) {\n const response = await handler(req, url, routeContext);\n if (response) {\n return response;\n }\n }\n\n // WebSocket upgrade for HMR\n if (url.pathname === HMR_ROUTE) {\n const success = upgradeWebSocket(req);\n return success ? undefined : new Response('WebSocket upgrade failed', { status: 500 });\n }\n\n // WebSocket upgrade for collab sync\n if (url.pathname === COLLAB_ROUTE && onCollabWSMessage) {\n const success = upgradeWebSocket(req);\n return success ? undefined : new Response('WebSocket upgrade failed', { status: 500 });\n }\n\n // Handle all routes through centralized router\n const response = await handleRoutes(req, url, null, routeContext);\n return response || new Response('Not Found', { status: 404 });\n },\n\n websocket: {\n open(ws: RuntimeWSClient) {\n // Note: In Bun, we can't distinguish WS paths in open() directly.\n // We use a WeakSet populated during the upgrade request to track collab clients.\n // For now, all WS clients are added to HMR manager; collab routing\n // happens in the message handler based on message type prefix.\n wsManager.addClient(ws);\n onCollabWSOpen?.(ws);\n },\n message(ws: RuntimeWSClient, message: string) {\n try {\n const data = JSON.parse(message);\n\n // Respond to ping with pong (for heartbeat)\n if (data.type === 'ping') {\n ws.send('pong');\n return;\n }\n\n // Route collab messages to collab handler\n if (onCollabWSMessage && typeof data.type === 'string' && data.type.startsWith('collab:')) {\n collabClients.add(ws);\n onCollabWSMessage(ws, data);\n return;\n }\n\n // Allow custom message handlers\n if (onWSMessage) {\n onWSMessage(ws, data);\n }\n } catch (_error) {\n // Ignore non-JSON messages\n }\n },\n close(ws: RuntimeWSClient) {\n wsManager.removeClient(ws);\n if (collabClients.has(ws)) {\n onCollabWSClose?.(ws);\n collabClients.delete(ws);\n }\n },\n },\n });\n\n if (portAttempt > 0) {\n console.log(`Warning: Port ${requestedPort} was busy, using port ${server.port} instead`);\n }\n\n // Set the actual bound port so live reload WS connects directly to this server\n routeContext.serverPort = server.port;\n\n return { server, port: server.port };\n } catch (error: unknown) {\n lastError = error;\n const err = error as { code?: string };\n if (err?.code === 'EADDRINUSE') {\n if (portAttempt >= MAX_PORT_ATTEMPTS - 1) {\n console.error(\n `Failed to start server: All ports from ${requestedPort} to ${requestedPort + MAX_PORT_ATTEMPTS - 1} are busy`,\n );\n throw error;\n }\n continue;\n }\n throw error;\n }\n }\n\n throw lastError || new Error('Failed to start server');\n}\n\n/**\n * Re-export types for convenience\n */\nexport { WebSocketManager };\nexport type { RouteContext };\n", "/**\n * Build Error Overlay Generator\n * Generates an HTML page showing build errors when the static server detects _errors.json\n */\n\nexport interface BuildError {\n file: string; // e.g., \"pages/posts.json\"\n message: string; // Error message\n type: string; // 'minify' | 'render' | 'parse' | 'cms'\n}\n\nexport interface BuildErrorsData {\n errors: BuildError[];\n timestamp: number;\n}\n\n/**\n * Escape HTML to prevent XSS in error messages\n */\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\n/**\n * Safely encode data for embedding in a script tag\n */\nfunction safeJsonForScript(data: unknown): string {\n return JSON.stringify(data).replace(/</g, '\\\\u003c').replace(/>/g, '\\\\u003e').replace(/&/g, '\\\\u0026');\n}\n\n/**\n * Generate HTML page showing build errors.\n *\n * @param data Build errors payload to render\n * @param cspNonce Per-request CSP nonce \u2014 when set, stamped on the inline\n * `<script>` so it executes under a strict (nonce-based)\n * script-src policy without `'unsafe-inline'`. Callers in a\n * plain static-serve context may omit it (no CSP is enforced\n * by the static server itself).\n */\nexport function generateBuildErrorPage(data: BuildErrorsData, cspNonce?: string): string {\n const { errors, timestamp } = data;\n const timeStr = new Date(timestamp).toLocaleTimeString();\n const nonceAttr = cspNonce ? ` nonce=\"${cspNonce}\"` : '';\n\n // Generate plain text for copying to AI\n const plainTextErrors = errors.map((err) => `[${err.type.toUpperCase()}] ${err.file}\\n${err.message}`).join('\\n\\n');\n const copyText = `Build failed with ${errors.length} error(s):\\n\\n${plainTextErrors}`;\n\n const errorListHtml = errors\n .map(\n (err) => `\n <div class=\"error-item\">\n <div class=\"error-item-header\">\n <div class=\"error-type\">${escapeHtml(err.type)}</div>\n <div class=\"error-file\">${escapeHtml(err.file)}</div>\n </div>\n <div class=\"error-message\">${escapeHtml(err.message)}</div>\n </div>\n `,\n )\n .join('');\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Build Failed</title>\n <style${nonceAttr}>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n\n body {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: linear-gradient(135deg, #0f0f1a 0%, #1a1a2e 100%);\n color: #e2e8f0;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n }\n\n .container {\n max-width: 720px;\n width: 100%;\n }\n\n .card {\n background: rgba(30, 30, 50, 0.8);\n backdrop-filter: blur(20px);\n border: 1px solid rgba(255, 255, 255, 0.08);\n border-radius: 16px;\n overflow: hidden;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 20px 50px rgba(0, 0, 0, 0.3),\n inset 0 1px 0 rgba(255, 255, 255, 0.05);\n }\n\n .header {\n background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%);\n padding: 20px 24px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-icon {\n width: 32px;\n height: 32px;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .header-icon svg {\n width: 18px;\n height: 18px;\n stroke: white;\n }\n\n .header-title {\n font-size: 16px;\n font-weight: 600;\n letter-spacing: -0.01em;\n }\n\n .error-count {\n background: rgba(0, 0, 0, 0.25);\n padding: 6px 14px;\n border-radius: 100px;\n font-size: 13px;\n font-weight: 500;\n }\n\n .body {\n padding: 20px;\n max-height: 50vh;\n overflow-y: auto;\n }\n\n .body::-webkit-scrollbar {\n width: 6px;\n }\n\n .body::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .body::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.1);\n border-radius: 3px;\n }\n\n .error-item {\n background: rgba(0, 0, 0, 0.3);\n border: 1px solid rgba(255, 255, 255, 0.06);\n border-radius: 10px;\n padding: 14px 16px;\n margin-bottom: 10px;\n transition: border-color 0.15s;\n }\n\n .error-item:last-child { margin-bottom: 0; }\n\n .error-item:hover {\n border-color: rgba(255, 255, 255, 0.12);\n }\n\n .error-item-header {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n }\n\n .error-type {\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 4px 8px;\n border-radius: 4px;\n background: rgba(239, 68, 68, 0.2);\n color: #fca5a5;\n }\n\n .error-file {\n font-family: 'SF Mono', 'Fira Code', Menlo, Monaco, monospace;\n font-size: 12px;\n color: #94a3b8;\n }\n\n .error-message {\n font-family: 'SF Mono', 'Fira Code', Menlo, Monaco, monospace;\n font-size: 12px;\n line-height: 1.7;\n color: #f87171;\n white-space: pre-wrap;\n word-break: break-word;\n background: rgba(0, 0, 0, 0.2);\n padding: 10px 12px;\n border-radius: 6px;\n border-left: 2px solid #dc2626;\n }\n\n .footer {\n padding: 16px 20px;\n background: rgba(0, 0, 0, 0.2);\n border-top: 1px solid rgba(255, 255, 255, 0.06);\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .footer-info {\n font-size: 12px;\n color: #64748b;\n }\n\n .footer-actions {\n display: flex;\n gap: 8px;\n }\n\n .btn {\n border: none;\n padding: 10px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.15s;\n }\n\n .btn svg {\n width: 14px;\n height: 14px;\n }\n\n .btn-secondary {\n background: rgba(255, 255, 255, 0.08);\n color: #e2e8f0;\n border: 1px solid rgba(255, 255, 255, 0.1);\n }\n\n .btn-secondary:hover {\n background: rgba(255, 255, 255, 0.12);\n border-color: rgba(255, 255, 255, 0.15);\n }\n\n .btn-primary {\n background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);\n color: white;\n }\n\n .btn-primary:hover {\n background: linear-gradient(135deg, #60a5fa 0%, #3b82f6 100%);\n }\n\n .btn-success {\n background: linear-gradient(135deg, #10b981 0%, #059669 100%) !important;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"card\">\n <div class=\"header\">\n <div class=\"header-left\">\n <div class=\"header-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\n </svg>\n </div>\n <span class=\"header-title\">Build Failed</span>\n </div>\n <span class=\"error-count\">${errors.length} error${errors.length === 1 ? '' : 's'}</span>\n </div>\n <div class=\"body\">\n ${errorListHtml}\n </div>\n <div class=\"footer\">\n <div class=\"footer-info\">Failed at ${timeStr}</div>\n <div class=\"footer-actions\">\n <button class=\"btn btn-secondary\" id=\"copyBtn\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n </svg>\n <span>Copy</span>\n </button>\n <button class=\"btn btn-primary\" id=\"refreshBtn\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"23 4 23 10 17 10\"></polyline>\n <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\"></path>\n </svg>\n Refresh\n </button>\n </div>\n </div>\n </div>\n </div>\n <script${nonceAttr}>\n (function() {\n var copyBtn = document.getElementById('copyBtn');\n var copyText = ${safeJsonForScript(copyText)};\n\n copyBtn.addEventListener('click', function() {\n navigator.clipboard.writeText(copyText).then(function() {\n var span = copyBtn.querySelector('span');\n var original = span.textContent;\n span.textContent = 'Copied!';\n copyBtn.classList.add('btn-success');\n setTimeout(function() {\n span.textContent = original;\n copyBtn.classList.remove('btn-success');\n }, 2000);\n }).catch(function(err) {\n console.error('Failed to copy:', err);\n });\n });\n\n // Refresh button \u2014 handler attached here (instead of onclick) so the\n // page works under a strict (nonce-based) script-src CSP that bars\n // inline event-handler attributes.\n var refreshBtn = document.getElementById('refreshBtn');\n if (refreshBtn) {\n refreshBtn.addEventListener('click', function() {\n location.reload();\n });\n }\n })();\n </script>\n</body>\n</html>`;\n}\n", "/**\n * Page Service\n * Handles page loading, caching, and management\n *\n * Provides methods for loading pages from data providers, caching them in memory,\n * and managing page data including saving and deletion.\n */\n\nimport { existsSync, readdirSync, mkdirSync, rmdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { PageCache } from '../pageCache';\nimport { parseJSON } from '../jsonLoader';\nimport { buildLineMap } from '../utils/jsonLineMapper';\nimport { projectPaths } from '../projectContext';\nimport { logRuntimeError } from '../../shared/errorLogger';\nimport { isPathWithinRoot } from '../../shared/pathSecurity';\nimport type { JSONPage } from '../../shared/types';\nimport type { SlugMap } from '../../shared/slugTranslator';\nimport type { PageProvider } from '../../shared/interfaces/contentProvider';\n\nexport class PageService {\n /**\n * Creates a new PageService instance\n *\n * @param pageCache - PageCache instance to use for caching pages\n * @param provider - Optional PageProvider for loading pages (enables DI for testing/CMS)\n */\n constructor(\n private pageCache: PageCache,\n private provider?: PageProvider,\n ) {}\n\n /**\n * Set the page provider\n * Allows setting provider after construction for backward compatibility\n *\n * @param provider - PageProvider implementation\n */\n setProvider(provider: PageProvider): void {\n this.provider = provider;\n }\n\n /**\n * Load all pages from the data provider\n *\n * Uses the provider to load pages. If no provider is set, does nothing.\n * Pages are cached in memory for fast access.\n *\n * @returns Promise that resolves when all pages are loaded\n *\n * @example\n * ```typescript\n * await pageService.loadAllPages();\n * const paths = pageService.getAllPagePaths();\n * ```\n */\n async loadAllPages(): Promise<void> {\n if (!this.provider) {\n return;\n }\n\n const pages = await this.provider.loadAll();\n for (const [path, content] of pages) {\n const lineMap = buildLineMap(content);\n this.pageCache.set(path, content, lineMap);\n }\n }\n\n /**\n * Get page content from cache\n *\n * @param path - Page path (e.g., \"/\" or \"/about\")\n * @returns Raw JSON string content, or undefined if page not found\n *\n * @example\n * ```typescript\n * const content = pageService.getPage('/');\n * if (content) {\n * const data = JSON.parse(content);\n * }\n * ```\n */\n getPage(path: string): string | undefined {\n return this.pageCache.getContent(path);\n }\n\n /**\n * Get parsed page data\n *\n * Retrieves page content from cache and parses it as JSON. Returns null if\n * the page doesn't exist or if parsing fails.\n *\n * @param path - Page path (e.g., \"/\" or \"/about\")\n * @returns Parsed JSONPage object, or null if not found or invalid\n *\n * @example\n * ```typescript\n * const pageData = pageService.getPageData('/');\n * if (pageData) {\n * console.log(pageData.meta.title);\n * }\n * ```\n */\n getPageData(path: string): JSONPage | null {\n const content = this.pageCache.getContent(path);\n if (!content) {\n return null;\n }\n\n try {\n return parseJSON<JSONPage>(content);\n } catch {\n return null;\n }\n }\n\n /**\n * Save page content\n *\n * Saves page data via the provider and updates the cache. The page path\n * is converted to a filename (e.g., \"/\" -> \"index.json\", \"/about\" -> \"about.json\").\n *\n * @param path - Page path (e.g., \"/\" or \"/about\")\n * @param data - JSONPage object to save\n * @returns Promise that resolves when the page is saved\n *\n * @throws {Error} If provider is not set or file write fails\n *\n * @example\n * ```typescript\n * await pageService.savePage('/', {\n * meta: { title: 'Home' },\n * root: { type: 'node', tag: 'div', children: [] }\n * });\n * ```\n */\n async savePage(path: string, data: JSONPage): Promise<void> {\n if (!this.provider) {\n throw new Error('PageProvider not set');\n }\n\n // Strip runtime metadata that shouldn't be persisted\n const { _lineMap, ...dataToSave } = data as JSONPage & { _lineMap?: unknown };\n const content = JSON.stringify(dataToSave, null, 2);\n\n await this.provider.save(path, content);\n\n const lineMap = buildLineMap(content);\n this.pageCache.set(path, content, lineMap);\n }\n\n /**\n * Re-read a single page from disk via the provider and refresh the cache.\n *\n * Used by the file watcher for live reload. Provider-based (not a hardcoded\n * JSON read), so it works for any format \u2014 the FileSystem provider returns the\n * raw JSON and the Astro provider returns the parsed model serialized to JSON.\n *\n * @returns true if the cache changed (page updated or confirmed-deleted) and a\n * reload broadcast is warranted; false if the read failed transiently (e.g. a\n * partial mid-write or parse error), in which case the cache is left intact and\n * the next watcher event retries.\n */\n async reloadPageFromDisk(path: string): Promise<boolean> {\n if (!this.provider) return false;\n\n let content: string | null = null;\n try {\n content = await this.provider.get(path);\n } catch (error) {\n // Transient (mid-write / partial .astro parse error) \u2014 keep the cache as-is.\n // Logged (dev-gated) so a persistent read/parse failure isn't fully invisible.\n logRuntimeError('pageService.reloadPageFromDisk', error, { path });\n return false;\n }\n\n if (content) {\n this.pageCache.set(path, content, buildLineMap(content));\n return true;\n }\n\n // No content: only drop from cache if the page is truly gone, not mid-write.\n try {\n if (!(await this.provider.exists(path))) {\n this.pageCache.delete(path);\n return true;\n }\n } catch {\n /* leave cache intact */\n }\n return false;\n }\n\n /**\n * Delete page from cache and optionally from storage\n *\n * Removes a page from the in-memory cache. If provider is set,\n * also deletes from the underlying storage.\n *\n * @param path - Page path to delete\n * @param deleteFromStorage - If true and provider is set, also delete from storage\n *\n * @example\n * ```typescript\n * pageService.deletePage('/old-page');\n * // Or with storage deletion:\n * await pageService.deletePage('/old-page', true);\n * ```\n */\n async deletePage(path: string, deleteFromStorage = false): Promise<void> {\n this.pageCache.delete(path);\n\n if (deleteFromStorage && this.provider) {\n await this.provider.delete(path);\n }\n }\n\n /**\n * Get all page paths\n *\n * Returns an array of all page paths currently in the cache.\n *\n * @returns Array of page paths (e.g., [\"/\", \"/about\", \"/contact\"])\n *\n * @example\n * ```typescript\n * const paths = pageService.getAllPagePaths();\n * console.log(`Loaded ${paths.length} pages`);\n * ```\n */\n getAllPagePaths(): string[] {\n return this.pageCache.keys();\n }\n\n /**\n * Get all pages with their info (including draft status)\n *\n * Returns an array of page info objects including path and draft status.\n *\n * @returns Array of page info objects\n *\n * @example\n * ```typescript\n * const pages = pageService.getAllPagesWithInfo();\n * // [{ path: \"/\", isDraft: false }, { path: \"/about\", isDraft: true }]\n * ```\n */\n getAllPagesWithInfo(): Array<{ path: string; isDraft: boolean; folder?: string; source?: 'cms' | 'ssr' }> {\n const paths = this.pageCache.keys().filter((p) => !p.startsWith('/_sketch/'));\n return paths.map((path) => {\n const pageData = this.getPageData(path);\n // Extract folder from path: /blog/post -> blog, /templates/blog-post -> templates\n // Root-level pages (e.g., /, /about) have no folder\n const pathWithoutSlash = path === '/' ? 'index' : path.substring(1);\n const slashIndex = pathWithoutSlash.lastIndexOf('/');\n const folder = slashIndex > 0 ? pathWithoutSlash.substring(0, slashIndex) : undefined;\n // Surface a non-static page source (`cms` template / `ssr` live page) so the editor's\n // page picker can group them apart from plain static pages. Static/undefined omitted.\n const metaSource = pageData?.meta?.source;\n const source = metaSource === 'cms' || metaSource === 'ssr' ? metaSource : undefined;\n return {\n path,\n isDraft: pageData?.meta?.draft === true,\n ...(folder ? { folder } : {}),\n ...(source ? { source } : {}),\n };\n });\n }\n\n /**\n * Get line map for a page\n *\n * Returns the line number mapping for elements in the page JSON.\n *\n * @param path - Page path (e.g., \"/\" or \"/about\")\n * @returns LineMap object or undefined if page not found\n */\n getLineMap(path: string): Map<string, { startLine: number; endLine: number }> | undefined {\n return this.pageCache.getLineMap(path);\n }\n\n /**\n * Pages base directory \u2014 provider-aware (e.g. `src/pages` for astro projects),\n * falling back to `projectPaths.pages()` when the provider doesn't expose\n * `baseDir()` (or no provider is set). Used by the folder/move/rename ops that\n * touch the filesystem directly.\n */\n private pagesBaseDir(): string {\n return this.provider?.baseDir?.() ?? projectPaths.pages();\n }\n\n /** Page file extension (e.g. `.astro` for astro projects), defaulting to `.json`. */\n private pageExt(): string {\n return this.provider?.extension?.() ?? '.json';\n }\n\n /**\n * Get all page folders\n *\n * Scans the pages directory for subdirectories.\n *\n * @returns Sorted array of folder names\n */\n getAllFolders(): string[] {\n const pagesDir = this.pagesBaseDir();\n if (!existsSync(pagesDir)) {\n return [];\n }\n\n const collectFolders = (dir: string, prefix: string): string[] => {\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n const result: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n result.push(relativePath);\n result.push(...collectFolders(join(dir, entry.name), relativePath));\n }\n return result;\n } catch {\n return [];\n }\n };\n\n return collectFolders(pagesDir, '').sort();\n }\n\n /**\n * Create a page folder\n *\n * Creates an empty folder in the pages directory.\n *\n * @param folderName - Name of the folder to create\n * @throws {Error} If folder name is invalid or already exists\n */\n async createFolder(folderName: string): Promise<void> {\n if (!folderName || folderName.trim() === '') {\n throw new Error('Folder name cannot be empty');\n }\n\n const trimmed = folderName.trim();\n const segments = trimmed.split('/');\n const segmentRegex = /^[a-z0-9][a-z0-9-_]*$/;\n\n for (const segment of segments) {\n if (!segment) throw new Error('Folder path cannot have empty segments');\n if (!segmentRegex.test(segment)) {\n throw new Error('Each folder segment can only contain lowercase letters, numbers, dashes, and underscores');\n }\n }\n\n const pagesDir = this.pagesBaseDir();\n const folderPath = join(pagesDir, trimmed);\n\n if (existsSync(folderPath)) {\n throw new Error('Folder already exists');\n }\n\n mkdirSync(folderPath, { recursive: true });\n }\n\n /**\n * Move a page to a different folder\n *\n * Moves a page file from its current location to the target folder.\n * If folder is empty string, moves to root pages directory.\n *\n * @param pagePath - Current page path (e.g., \"/blog/post\" or \"/about\")\n * @param newFolder - Target folder name (empty string for root)\n */\n async movePage(pagePath: string, newFolder: string): Promise<void> {\n const { rename } = await import('node:fs/promises');\n const pagesDir = this.pagesBaseDir();\n const ext = this.pageExt();\n\n // Convert page path to file name: \"/blog/post\" -> \"blog/post\", \"/\" -> \"index\"\n const pageName = pagePath === '/' ? 'index' : pagePath.substring(1);\n // Extract just the filename (without folder): \"blog/post\" -> \"post\", \"about\" -> \"about\"\n const slashIndex = pageName.lastIndexOf('/');\n const baseName = slashIndex >= 0 ? pageName.substring(slashIndex + 1) : pageName;\n\n const sourceFile = join(pagesDir, `${pageName}${ext}`);\n const targetFile = newFolder ? join(pagesDir, newFolder, `${baseName}${ext}`) : join(pagesDir, `${baseName}${ext}`);\n\n // Defense-in-depth: a crafted pagePath / newFolder must not move a file out of\n // (or in from) outside the pages dir. Siblings createFolder/renamePage validate;\n // movePage previously did not.\n if (!isPathWithinRoot(sourceFile, pagesDir) || !isPathWithinRoot(targetFile, pagesDir)) {\n throw new Error(`movePage path escapes pages dir: ${pagePath} -> ${newFolder}`);\n }\n\n // Create target directory if needed\n if (newFolder) {\n const targetDir = join(pagesDir, newFolder);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n }\n\n if (!existsSync(sourceFile)) {\n throw new Error(`Page not found: ${pagePath}`);\n }\n\n await rename(sourceFile, targetFile);\n\n // Update cache: remove old path, re-add at new path\n const content = this.pageCache.getContent(pagePath);\n if (content) {\n this.pageCache.delete(pagePath);\n const newPageName = newFolder ? `${newFolder}/${baseName}` : baseName;\n const newPath = newPageName === 'index' ? '/' : `/${newPageName}`;\n const lineMap = buildLineMap(content);\n this.pageCache.set(newPath, content, lineMap);\n }\n\n // Clean up empty source directory\n const sourceDir = slashIndex >= 0 ? join(pagesDir, pageName.substring(0, slashIndex)) : null;\n\n if (sourceDir && sourceDir !== pagesDir) {\n try {\n const remaining = readdirSync(sourceDir);\n if (remaining.length === 0) {\n rmdirSync(sourceDir);\n }\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n\n /**\n * Rename a page (file rename + cache update).\n *\n * Renames the underlying .json file from `oldPath`'s filename to `newPath`'s\n * filename, keeping the same folder. Updates the in-memory cache so the\n * page is now keyed at `newPath`. Folder moves stay with `movePage()` \u2014\n * this is purely \"change the URL slug of an existing page\" for\n * single-locale projects.\n *\n * @param oldPath - Current page path (e.g., \"/about\" or \"/blog/post\")\n * @param newPath - New page path with same folder (e.g., \"/about-us\" or \"/blog/new-slug\")\n * @throws {Error} If oldPath doesn't exist, newPath already exists, or paths\n * reference different folders.\n */\n async renamePage(oldPath: string, newPath: string): Promise<void> {\n if (oldPath === newPath) return;\n if (newPath === '/') {\n throw new Error('Cannot rename a page to the index path');\n }\n if (!newPath.startsWith('/')) {\n throw new Error('newPath must start with \"/\"');\n }\n\n const oldName = oldPath === '/' ? 'index' : oldPath.substring(1);\n const newName = newPath.substring(1);\n\n const oldSlash = oldName.lastIndexOf('/');\n const newSlash = newName.lastIndexOf('/');\n const oldFolder = oldSlash >= 0 ? oldName.substring(0, oldSlash) : '';\n const newFolder = newSlash >= 0 ? newName.substring(0, newSlash) : '';\n if (oldFolder !== newFolder) {\n throw new Error('renamePage only changes the filename; use movePage to change folder');\n }\n\n const baseSegment = newSlash >= 0 ? newName.substring(newSlash + 1) : newName;\n if (!/^[a-z0-9][a-z0-9-_]*$/.test(baseSegment)) {\n throw new Error('Page slug can only contain lowercase letters, numbers, dashes, and underscores');\n }\n\n const { rename } = await import('node:fs/promises');\n const pagesDir = this.pagesBaseDir();\n const ext = this.pageExt();\n const sourceFile = join(pagesDir, `${oldName}${ext}`);\n const targetFile = join(pagesDir, `${newName}${ext}`);\n\n if (!existsSync(sourceFile)) {\n throw new Error(`Page not found: ${oldPath}`);\n }\n if (existsSync(targetFile)) {\n throw new Error(`Page already exists: ${newPath}`);\n }\n\n await rename(sourceFile, targetFile);\n\n const content = this.pageCache.getContent(oldPath);\n if (content) {\n this.pageCache.delete(oldPath);\n const lineMap = buildLineMap(content);\n this.pageCache.set(newPath, content, lineMap);\n }\n }\n\n /**\n * Get slug mappings for all pages\n *\n * Extracts slug translations from all pages' meta.slugs fields.\n * Returns a list of { pageId, slugs } objects for locale-aware routing.\n *\n * @returns Array of SlugMap objects with pageId and translated slugs\n *\n * @example\n * ```typescript\n * const mappings = pageService.getSlugMappings();\n * // [{ pageId: \"about\", slugs: { \"en\": \"about\", \"pl\": \"o-nas\" } }]\n * ```\n */\n getSlugMappings(): SlugMap[] {\n const mappings: SlugMap[] = [];\n const paths = this.pageCache.keys();\n\n for (const path of paths) {\n const pageData = this.getPageData(path);\n if (pageData?.meta?.slugs) {\n // Convert path to pageId (e.g., \"/\" -> \"index\", \"/about\" -> \"about\")\n const pageId = path === '/' ? 'index' : path.substring(1);\n mappings.push({\n pageId,\n slugs: pageData.meta.slugs,\n });\n } else {\n // For pages without explicit slugs, use the path as the slug for all locales\n const pageId = path === '/' ? 'index' : path.substring(1);\n const defaultSlug = path === '/' ? '' : path.substring(1);\n mappings.push({\n pageId,\n slugs: { _default: defaultSlug },\n });\n }\n }\n\n return mappings;\n }\n}\n", "/**\n * JSON Line Mapper\n * Parses JSON while tracking line numbers for each element path\n */\n\nexport interface LineRange {\n startLine: number;\n endLine: number;\n}\n\nexport type LineMap = Map<string, LineRange>;\n\n/**\n * Parse JSON text and build a map of path -> line range\n * Path format: \"0\", \"0.1\", \"1.2.3\" (matching pathToString format)\n */\nexport function buildLineMap(jsonText: string): LineMap {\n const lineMap = new Map<string, LineRange>();\n const _lines = jsonText.split('\\n');\n\n // Build character offset to line number lookup\n const charToLine: number[] = [];\n let currentLine = 1;\n for (let i = 0; i < jsonText.length; i++) {\n charToLine[i] = currentLine;\n if (jsonText[i] === '\\n') {\n currentLine++;\n }\n }\n\n // Parse JSON and track positions\n let pos = 0;\n\n function skipWhitespace(): void {\n while (pos < jsonText.length && /\\s/.test(jsonText[pos] ?? '')) {\n pos++;\n }\n }\n\n function parseString(): string {\n if (jsonText[pos] !== '\"') return '';\n pos++; // skip opening \"\n let result = '';\n while (pos < jsonText.length && jsonText[pos] !== '\"') {\n if (jsonText[pos] === '\\\\') {\n pos++; // skip escape\n if (pos < jsonText.length) {\n result += jsonText[pos];\n pos++;\n }\n } else {\n result += jsonText[pos];\n pos++;\n }\n }\n pos++; // skip closing \"\n return result;\n }\n\n function parseNumber(): void {\n while (pos < jsonText.length && /[\\d.eE\\-+]/.test(jsonText[pos] ?? '')) {\n pos++;\n }\n }\n\n function parseValue(path: number[], trackChildren: boolean): { start: number; end: number } {\n skipWhitespace();\n const startPos = pos;\n\n if (jsonText[pos] === '{') {\n parseObject(path, trackChildren);\n } else if (jsonText[pos] === '[') {\n parseArray(path, trackChildren);\n } else if (jsonText[pos] === '\"') {\n parseString();\n } else if (jsonText[pos] === 't') {\n pos += 4; // true\n } else if (jsonText[pos] === 'f') {\n pos += 5; // false\n } else if (jsonText[pos] === 'n') {\n pos += 4; // null\n } else {\n parseNumber();\n }\n\n return { start: startPos, end: pos };\n }\n\n function recordTrackedRoot(path: number[]): void {\n // Parse the root element of the tracked structure and record its own line range\n // under the empty-string key, so callers can resolve the root selection itself.\n const { start, end } = parseValue(path, true);\n lineMap.set('', {\n startLine: charToLine[start] ?? 0,\n endLine: charToLine[end - 1] || charToLine[start] || 0,\n });\n }\n\n function parseObject(path: number[], trackChildren: boolean): void {\n pos++; // skip {\n skipWhitespace();\n\n while (pos < jsonText.length && jsonText[pos] !== '}') {\n skipWhitespace();\n const key = parseString();\n skipWhitespace();\n pos++; // skip :\n skipWhitespace();\n\n if (key === 'root' && path.length === 0) {\n // Page format: track from `root`.\n recordTrackedRoot(path);\n } else if (key === 'component' && path.length === 0) {\n // Component format: descend into the component object looking for `structure`.\n parseComponentWrapper(path);\n } else if (key === 'children' && trackChildren) {\n // Children array \u2014 track each element with indices\n parseValue(path, true);\n } else {\n // Regular property - don't track individual items\n parseValue(path, false);\n }\n\n skipWhitespace();\n if (jsonText[pos] === ',') pos++;\n skipWhitespace();\n }\n pos++; // skip }\n }\n\n function parseComponentWrapper(path: number[]): void {\n // We expect an object value for the `component` key. If it isn't one, just skip it.\n if (jsonText[pos] !== '{') {\n parseValue(path, false);\n return;\n }\n pos++; // skip {\n skipWhitespace();\n while (pos < jsonText.length && jsonText[pos] !== '}') {\n skipWhitespace();\n const key = parseString();\n skipWhitespace();\n pos++; // skip :\n skipWhitespace();\n if (key === 'structure') {\n // The component's structure is the root of what we track \u2014 same as `root` for pages.\n recordTrackedRoot(path);\n } else {\n parseValue(path, false);\n }\n skipWhitespace();\n if (jsonText[pos] === ',') pos++;\n skipWhitespace();\n }\n pos++; // skip }\n }\n\n function parseArray(path: number[], trackChildren: boolean): void {\n pos++; // skip [\n skipWhitespace();\n\n let index = 0;\n while (pos < jsonText.length && jsonText[pos] !== ']') {\n const childPath = [...path, index];\n const { start, end } = parseValue(childPath, trackChildren);\n\n // Record line mapping for this element if we're tracking children\n // Use comma-separated format to match pathToString: [0,1,2] -> \"0,1,2\"\n if (trackChildren) {\n const pathStr = childPath.join(',');\n lineMap.set(pathStr, {\n startLine: charToLine[start] ?? 0,\n endLine: charToLine[end - 1] || charToLine[start] || 0,\n });\n }\n\n index++;\n skipWhitespace();\n if (jsonText[pos] === ',') pos++;\n skipWhitespace();\n }\n pos++; // skip ]\n }\n\n // Start parsing from the root\n try {\n skipWhitespace();\n parseValue([], false);\n } catch (e) {\n // If parsing fails, return empty map\n console.error('Failed to build line map:', e);\n }\n\n return lineMap;\n}\n\n/**\n * Convert LineMap to plain object for JSON serialization\n */\nexport function lineMapToObject(lineMap: LineMap): Record<string, LineRange> {\n const obj: Record<string, LineRange> = {};\n lineMap.forEach((value, key) => {\n obj[key] = value;\n });\n return obj;\n}\n", "/**\n * Component Service\n * Handles component loading and management\n *\n * Provides methods for loading components from the file system, caching them in memory,\n * and managing component definitions including saving JavaScript and CSS files.\n */\n\nimport { join } from 'node:path';\nimport { existsSync, mkdirSync, readdirSync, rmdirSync } from 'node:fs';\nimport { loadComponentDirectory, loadJSONFile, parseJSON } from '../jsonLoader';\nimport type { ComponentWithCategory, ComponentDirectoryResult, ComponentLoadDiagnostic } from '../jsonLoader';\nimport { projectPaths } from '../projectContext';\nimport type { ComponentDefinition, JSONPage } from '../../shared/types';\nimport { readTextFile, fileExists } from '../runtime';\nimport type { PageService } from './pageService';\nimport { rewriteComponentRefs } from '../../shared/componentRefs';\nimport { isSafePathSegment, isPathWithinRoot } from '../../shared/pathSecurity';\n\n// Re-export for callers that already imported the helper from this module.\nexport { rewriteComponentRefs };\n\n/**\n * File system interface for dependency injection\n * Allows mocking file operations in tests\n */\nexport interface ComponentServiceFs {\n writeFile(path: string, content: string, encoding: string): Promise<void>;\n readFile?(path: string): Promise<string | null>;\n}\n\n/**\n * Component loader interface for dependency injection\n * Allows mocking component loading in tests\n */\nexport interface ComponentLoader {\n loadDirectory(dir: string): Promise<Map<string, ComponentDefinition>>;\n loadFile(path: string): Promise<string | null>;\n}\n\n/**\n * Component writer interface for dependency injection.\n *\n * This is the WRITE-side mirror of {@link ComponentLoader}. By default (no writer\n * injected) ComponentService keeps its exact JSON behavior \u2014 `.json` definition files\n * plus sibling `.js`/`.css` under `<root>/components/`. Injecting a writer lets a\n * different on-disk format own where and how components are persisted. The astro\n * format (`meno-astro`'s `AstroComponentWriter`) emits a single `.astro` file per\n * component under `src/components/` (structure + JS + CSS + meta folded together).\n *\n * The service still owns category resolution, the in-memory cache, ref-rewriting,\n * and validation; the writer only abstracts the directory + the physical file I/O.\n */\nexport interface ComponentWriter {\n /** Base components directory this writer owns (e.g. `<root>/src/components`). */\n componentsDir(): string;\n\n /**\n * Persist a component definition into `dir` under `name`. For single-file formats\n * (astro) `def` carries everything (structure/interface/js/css/meta); for the JSON\n * writer it is the `.json` payload (js/css live in sibling files written separately).\n */\n writeComponent(dir: string, name: string, def: ComponentDefinition): Promise<void>;\n\n /**\n * Persist the component's JavaScript. `currentDef` is the latest in-memory definition\n * so single-file formats can re-emit the whole `.astro` with the new JS folded in.\n * Multi-file formats (JSON) just write a sibling `<name>.js`.\n */\n writeJavaScript(dir: string, name: string, javascript: string, currentDef?: ComponentDefinition): Promise<void>;\n\n /** Persist the component's CSS. Mirrors {@link writeJavaScript}. */\n writeCSS(dir: string, name: string, css: string, currentDef?: ComponentDefinition): Promise<void>;\n\n /** Delete every on-disk file for `name` in `dir` (definition + any JS/CSS). */\n removeComponent(dir: string, name: string): Promise<void>;\n\n /** Whether any on-disk file for `name` already exists in `dir` (collision check). */\n componentExists(dir: string, name: string): Promise<boolean>;\n\n /** Move every file for `name` from `srcDir` to `dstDir` (category change / rename). */\n moveComponent(srcDir: string, dstDir: string, name: string, dstName?: string): Promise<void>;\n}\n\n/**\n * Component info with category metadata\n */\nexport interface ComponentInfo {\n definition: ComponentDefinition;\n category?: string;\n}\n\nexport class ComponentService {\n private components = new Map<string, ComponentDefinition>();\n private componentCategories = new Map<string, string | undefined>();\n private fs?: ComponentServiceFs;\n private loader?: ComponentLoader;\n private writer?: ComponentWriter;\n private loadErrors = new Map<string, ComponentLoadDiagnostic>();\n private loadWarnings: ComponentLoadDiagnostic[] = [];\n\n /**\n * Creates a new ComponentService instance\n *\n * @param options - Optional configuration for dependency injection\n * @param options.fs - Optional file system interface for testing\n * @param options.loader - Optional component loader interface for testing (READ)\n * @param options.writer - Optional component writer for non-JSON on-disk formats\n * (WRITE). When omitted, the service writes JSON exactly as before \u2014 legacy\n * projects are byte-identical. The astro bootstrap injects an AstroComponentWriter\n * so saves emit `.astro` files under `src/components/`.\n */\n constructor(options?: { fs?: ComponentServiceFs; loader?: ComponentLoader; writer?: ComponentWriter }) {\n this.fs = options?.fs;\n this.loader = options?.loader;\n this.writer = options?.writer;\n }\n\n /**\n * Base components directory \u2014 `<root>/components` for JSON, or whatever the\n * injected writer owns (e.g. `<root>/src/components` for astro). All path\n * resolution (categories, folders, save/move/rename targets) routes through\n * here so a single switch covers every write op.\n * @internal\n */\n private componentsBaseDir(): string {\n return this.writer ? this.writer.componentsDir() : projectPaths.components();\n }\n\n /**\n * Load all components from the components directory\n *\n * Scans the ./components directory recursively and loads all component definitions.\n * Subdirectories are treated as category folders. Clears existing components before loading.\n * Components are loaded from .json files, and associated .js and .css files are\n * automatically loaded if they exist.\n *\n * @returns Promise that resolves when all components are loaded\n *\n * @example\n * ```typescript\n * await componentService.loadAllComponents();\n * const count = Object.keys(componentService.getAllComponents()).length;\n * ```\n */\n async loadAllComponents(): Promise<void> {\n // Build new state locally and swap atomically. Concurrent saves\n // (e.g. ensureAcceptsStyles firing while the file watcher reload runs)\n // must never observe an empty `componentCategories` mid-reload \u2014 that\n // gap was what caused fresh component files to be written at root next\n // to the canonical categorized file.\n const nextComponents = new Map<string, ComponentDefinition>();\n const nextCategories = new Map<string, string | undefined>();\n const nextErrors = new Map<string, ComponentLoadDiagnostic>();\n let nextWarnings: ComponentLoadDiagnostic[] = [];\n\n let loadedComponents: Map<string, ComponentWithCategory>;\n\n if (this.loader) {\n // Legacy loader interface returns plain Map\n loadedComponents = (await this.loader.loadDirectory(projectPaths.components())) as Map<\n string,\n ComponentWithCategory\n >;\n } else {\n const result: ComponentDirectoryResult = await loadComponentDirectory(projectPaths.components());\n loadedComponents = result.components;\n\n // Store diagnostics\n nextWarnings = result.warnings;\n for (const error of result.errors) {\n nextErrors.set(error.componentName, error);\n }\n }\n\n loadedComponents.forEach((value, key) => {\n // Extract category from the loaded component (set by recursive loader)\n const componentWithCategory = value as ComponentWithCategory;\n const category = componentWithCategory._category;\n\n nextCategories.set(key, category);\n\n // Remove internal metadata before storing\n const { _category, _relativePath, ...cleanDef } = componentWithCategory;\n nextComponents.set(key, cleanDef as ComponentDefinition);\n });\n\n this.components = nextComponents;\n this.componentCategories = nextCategories;\n this.loadErrors = nextErrors;\n this.loadWarnings = nextWarnings;\n }\n\n /**\n * Get component by name\n *\n * @param name - Component name (without .json extension)\n * @returns ComponentDefinition if found, undefined otherwise\n *\n * @example\n * ```typescript\n * const button = componentService.getComponent('Button');\n * if (button) {\n * console.log(button.component.interface);\n * }\n * ```\n */\n getComponent(name: string): ComponentDefinition | undefined {\n return this.components.get(name);\n }\n\n /**\n * Check if component exists\n *\n * @param name - Component name to check\n * @returns True if component exists in cache, false otherwise\n *\n * @example\n * ```typescript\n * if (componentService.hasComponent('Button')) {\n * // Component is available\n * }\n * ```\n */\n hasComponent(name: string): boolean {\n return this.components.has(name);\n }\n\n /**\n * Get all components as a Record\n *\n * Returns all loaded components as a plain object for easy iteration\n * or serialization.\n *\n * @returns Record mapping component names to ComponentDefinition objects\n *\n * @example\n * ```typescript\n * const allComponents = componentService.getAllComponents();\n * Object.keys(allComponents).forEach(name => {\n * console.log(`Component: ${name}`);\n * });\n * ```\n */\n getAllComponents(): Record<string, ComponentDefinition> {\n const record: Record<string, ComponentDefinition> = {};\n this.components.forEach((value, key) => {\n record[key] = value;\n });\n return record;\n }\n\n /**\n * Get all components with their category information\n *\n * Returns all loaded components with category metadata derived from folder structure.\n *\n * @returns Record mapping component names to ComponentInfo objects (definition + category)\n *\n * @example\n * ```typescript\n * const components = componentService.getAllComponentsWithCategories();\n * Object.entries(components).forEach(([name, info]) => {\n * console.log(`${name}: category=${info.category || 'uncategorized'}`);\n * });\n * ```\n */\n getAllComponentsWithCategories(): Record<string, ComponentInfo> {\n const record: Record<string, ComponentInfo> = {};\n this.components.forEach((value, key) => {\n record[key] = {\n definition: value,\n category: this.componentCategories.get(key),\n };\n });\n return record;\n }\n\n /**\n * Get category for a component\n *\n * @param name - Component name\n * @returns Category string if component is in a category folder, undefined otherwise\n */\n getComponentCategory(name: string): string | undefined {\n return this.componentCategories.get(name);\n }\n\n /**\n * Get load errors keyed by component name\n */\n getLoadErrors(): Map<string, ComponentLoadDiagnostic> {\n return this.loadErrors;\n }\n\n /**\n * Get load warnings\n */\n getLoadWarnings(): ComponentLoadDiagnostic[] {\n return this.loadWarnings;\n }\n\n /**\n * Get all load diagnostics\n */\n getLoadDiagnostics(): { errors: ComponentLoadDiagnostic[]; warnings: ComponentLoadDiagnostic[] } {\n return {\n errors: Array.from(this.loadErrors.values()),\n warnings: this.loadWarnings,\n };\n }\n\n /**\n * Validate that a component has a valid structure\n *\n * @param componentDef - ComponentDefinition to validate\n * @returns true if component has valid structure, false otherwise\n *\n * @example\n * ```typescript\n * const component = componentService.getComponent('Button');\n * if (component && componentService.validateComponentStructure(component)) {\n * // Component has valid structure\n * }\n * ```\n */\n validateComponentStructure(componentDef: ComponentDefinition | undefined): boolean {\n if (!componentDef) {\n return false;\n }\n\n // Handle ComponentDefinition in any format:\n // 1. Legacy: { type: string, component: { structure: {...} } }\n // 2. New: { component: { structure: {...} } }\n // 3. Direct: { component: { structure: {...} } } (already normalized)\n\n // Access component field safely (handle both TypeScript types and runtime data)\n const component = (componentDef as any).component;\n\n if (!component || typeof component !== 'object') {\n return false;\n }\n\n // Check for structure in component\n const structure = component.structure;\n if (!structure) {\n return false;\n }\n\n // Validate structure is a proper object with type property\n if (typeof structure !== 'object' || structure === null || Array.isArray(structure)) {\n return false;\n }\n\n // Structure must have a type property that's a string\n if (!('type' in structure) || typeof structure.type !== 'string') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Get the directory path for a component based on its category\n * @internal\n */\n private getComponentDir(name: string, category?: string): string {\n const componentsDir = this.componentsBaseDir();\n // A component name becomes a filename \u2014 it must be a single safe segment (no\n // `..`/separators). The resolved category dir must stay within the components\n // root (nested categories are allowed, traversal is not). Mirrors the guards\n // renameComponent/createFolder already apply; the save path previously lacked them.\n if (!isSafePathSegment(name)) throw new Error(`unsafe component name: ${name}`);\n const cat = this.resolveComponentCategory(name, category);\n const dir = cat ? join(componentsDir, cat) : componentsDir;\n if (!isPathWithinRoot(dir, componentsDir)) throw new Error(`component category escapes components dir: ${cat}`);\n return dir;\n }\n\n /**\n * Resolve which category a save should land in. Priority:\n * 1. Explicit caller-supplied category (including '' for root)\n * 2. In-memory categories cache\n * 3. Existing file on disk (defense against a stale/empty cache)\n * Falls back to root only when none of the above resolves. The disk\n * scan in step 3 closes the race where a save fires while\n * loadAllComponents has been called but hasn't rebuilt the cache yet.\n * @internal\n */\n private resolveComponentCategory(name: string, category?: string): string | undefined {\n if (category !== undefined) {\n return category || undefined;\n }\n if (this.componentCategories.has(name)) {\n return this.componentCategories.get(name);\n }\n return this.findComponentCategoryOnDisk(name);\n }\n\n /**\n * Look on disk for an existing `<name>.json` and return its category.\n * Returns undefined for \"exists at root\" or \"not found anywhere\" \u2014 both\n * map to writing at root, which is the right default.\n * @internal\n */\n private findComponentCategoryOnDisk(name: string): string | undefined {\n const componentsDir = this.componentsBaseDir();\n if (!existsSync(componentsDir)) return undefined;\n // File extension is format-specific (.json for JSON, .astro for astro). When a\n // writer is injected we don't know its extension here, so use a synchronous\n // directory scan that matches any `<name>.*` definition file.\n const ext = this.writer ? null : '.json';\n const existsAt = (dir: string): boolean => {\n if (ext) return existsSync(join(dir, `${name}${ext}`));\n try {\n return readdirSync(dir, { withFileTypes: true }).some(\n (e) => e.isFile() && (e.name === `${name}.json` || e.name === `${name}.astro`),\n );\n } catch {\n return false;\n }\n };\n if (existsAt(componentsDir)) return undefined;\n try {\n for (const entry of readdirSync(componentsDir, { withFileTypes: true })) {\n if (entry.isDirectory() && existsAt(join(componentsDir, entry.name))) {\n return entry.name;\n }\n }\n } catch {\n // If the components dir is unreadable, fall through to root.\n }\n return undefined;\n }\n\n /**\n * Get component JavaScript from .js file\n *\n * Loads the JavaScript code for a component from its .js file.\n * Returns null if the file doesn't exist.\n *\n * @param name - Component name (without .js extension)\n * @returns JavaScript code as string, or null if file doesn't exist\n *\n * @example\n * ```typescript\n * const js = await componentService.getComponentJavaScript('Button');\n * if (js) {\n * console.log('Component has JavaScript');\n * }\n * ```\n */\n async getComponentJavaScript(name: string): Promise<string | null> {\n const componentDir = this.getComponentDir(name);\n const jsFilePath = join(componentDir, `${name}.js`);\n try {\n if (await fileExists(jsFilePath)) {\n return await readTextFile(jsFilePath);\n }\n return null;\n } catch (_error) {\n return null;\n }\n }\n\n /**\n * Save component definition\n *\n * Saves component definition to a .json file and updates the cache.\n * The javascript field is automatically removed from the saved data\n * (JavaScript should only be in .js files).\n *\n * If category is provided, the component is saved to the category subfolder.\n * If category is undefined and component exists, it stays in its current location.\n * If category is empty string '', component is saved to root (uncategorized).\n *\n * @param name - Component name (without .json extension)\n * @param data - ComponentDefinition object to save\n * @param category - Optional category folder name (empty string for root/uncategorized)\n * @returns Promise that resolves when the component is saved\n *\n * @throws {Error} If file write fails\n *\n * @example\n * ```typescript\n * // Save to root (uncategorized)\n * await componentService.saveComponent('Button', buttonDef);\n *\n * // Save to 'ui' category folder\n * await componentService.saveComponent('Card', cardDef, 'ui');\n * ```\n */\n async saveComponent(name: string, data: ComponentDefinition, category?: string): Promise<void> {\n // The `.json` PAYLOAD never carries javascript (it lives in the sibling `.js`\n // file), so the JSON write below strips it. But the component's JS must NOT be\n // lost in the process:\n // - single-file writers (the astro `.astro` format) re-emit the WHOLE file\n // from the def they're given \u2014 writing a js-less def silently deletes the\n // component's `<script>` from the source of truth;\n // - the in-memory cache previously took the stripped copy too, so even JSON\n // projects lost the component's JS from the live cache (SSR preview renders\n // without it) until a file-watcher reload.\n // Preserve: the incoming def's javascript wins; absent that, the cached one.\n const dataWithoutJS = JSON.parse(JSON.stringify(data));\n if (dataWithoutJS?.component?.javascript !== undefined) {\n delete dataWithoutJS.component.javascript;\n }\n const incomingJs = (data as { component?: { javascript?: string } })?.component?.javascript;\n const cachedJs = this.components.get(name)?.component?.javascript;\n const javascript = incomingJs !== undefined ? incomingJs : cachedJs;\n const dataWithJS: ComponentDefinition =\n javascript !== undefined\n ? { ...dataWithoutJS, component: { ...dataWithoutJS.component, javascript } }\n : dataWithoutJS;\n\n // Determine target directory. Resolver consults the explicit arg, then\n // the in-memory cache, then disk \u2014 so a save during the file-watcher\n // reload window can't accidentally land at root next to a categorized\n // file.\n const targetCategory = this.resolveComponentCategory(name, category);\n const componentsDir = this.componentsBaseDir();\n const componentDir = targetCategory ? join(componentsDir, targetCategory) : componentsDir;\n\n if (this.writer) {\n // Format-aware write (e.g. emit a `.astro` file). The writer owns directory\n // creation + serialization, and for single-file formats the def must carry\n // EVERYTHING \u2014 including javascript (see the ComponentWriter contract).\n await this.writer.writeComponent(componentDir, name, dataWithJS);\n } else {\n // JSON path \u2014 unchanged, byte-identical to legacy behavior (js-less payload;\n // the sibling `.js` file owns the script).\n const writeFile = this.fs ? this.fs.writeFile.bind(this.fs) : (await import('node:fs/promises')).writeFile;\n\n // Create category directory if needed\n if (targetCategory && !existsSync(componentDir)) {\n mkdirSync(componentDir, { recursive: true });\n }\n\n const filePath = join(componentDir, `${name}.json`);\n await writeFile(filePath, JSON.stringify(dataWithoutJS, null, 2), 'utf-8');\n }\n\n // Update in-memory cache with the FULL def (js preserved) so the live preview\n // keeps rendering the component's script between save and watcher reload.\n this.components.set(name, dataWithJS);\n this.componentCategories.set(name, targetCategory);\n }\n\n /**\n * Save component JavaScript to .js file\n *\n * Saves JavaScript code to a component's .js file and reloads the component\n * to update the in-memory cache with the new JavaScript.\n *\n * @param name - Component name (without .js extension)\n * @param javascript - JavaScript code to save\n * @returns Promise that resolves when the JavaScript is saved\n *\n * @throws {Error} If file write fails\n *\n * @example\n * ```typescript\n * await componentService.saveComponentJavaScript('Button', 'console.log(\"clicked\");');\n * ```\n */\n async saveComponentJavaScript(name: string, javascript: string): Promise<void> {\n const componentDir = this.getComponentDir(name);\n\n if (this.writer) {\n // Single-file formats (astro) fold JS into the `.astro` file. Re-emit from\n // the latest in-memory definition with the new JS so structure/CSS survive.\n const current = this.components.get(name);\n await this.writer.writeJavaScript(componentDir, name, javascript || '', current);\n const next: ComponentDefinition = current\n ? { ...current, component: { ...current.component, javascript: javascript || '' } }\n : { component: { javascript: javascript || '' } };\n this.components.set(name, next);\n return;\n }\n\n const writeFile = this.fs ? this.fs.writeFile.bind(this.fs) : (await import('node:fs/promises')).writeFile;\n const jsFilePath = join(componentDir, `${name}.js`);\n await writeFile(jsFilePath, javascript || '', 'utf-8');\n\n // Reload the component to update the registry with the new JS\n const componentPath = join(componentDir, `${name}.json`);\n const componentData = await loadJSONFile(componentPath);\n if (componentData) {\n const parsed = parseJSON<ComponentDefinition>(componentData);\n try {\n if (await fileExists(jsFilePath)) {\n const jsContent = await readTextFile(jsFilePath);\n if (!parsed.component) {\n parsed.component = {};\n }\n parsed.component.javascript = jsContent;\n }\n } catch (_error) {\n // Silently handle JS file read errors\n }\n this.components.set(name, parsed);\n }\n }\n\n /**\n * Save component CSS to .css file\n *\n * Saves CSS code to a component's .css file and reloads the component\n * to update the in-memory cache with the new CSS.\n *\n * @param name - Component name (without .css extension)\n * @param css - CSS code to save\n * @returns Promise that resolves when the CSS is saved\n *\n * @throws {Error} If file write fails\n *\n * @example\n * ```typescript\n * await componentService.saveComponentCSS('Button', '.button { color: blue; }');\n * ```\n */\n async saveComponentCSS(name: string, css: string): Promise<void> {\n const componentDir = this.getComponentDir(name);\n\n if (this.writer) {\n // Single-file formats (astro) fold CSS into the `.astro` file. Re-emit from\n // the latest in-memory definition with the new CSS so structure/JS survive.\n const current = this.components.get(name);\n await this.writer.writeCSS(componentDir, name, css || '', current);\n const next: ComponentDefinition = current\n ? { ...current, component: { ...current.component, css: css || '' } }\n : { component: { css: css || '' } };\n this.components.set(name, next);\n return;\n }\n\n const writeFile = this.fs ? this.fs.writeFile.bind(this.fs) : (await import('node:fs/promises')).writeFile;\n const cssFilePath = join(componentDir, `${name}.css`);\n await writeFile(cssFilePath, css || '', 'utf-8');\n\n // Reload the component to update the registry with the new CSS\n const componentPath = join(componentDir, `${name}.json`);\n const componentData = await loadJSONFile(componentPath);\n if (componentData) {\n const parsed = parseJSON<ComponentDefinition>(componentData);\n try {\n if (await fileExists(cssFilePath)) {\n const cssContent = await readTextFile(cssFilePath);\n if (!parsed.component) {\n parsed.component = {};\n }\n parsed.component.css = cssContent;\n }\n } catch (_error) {\n // Silently handle CSS file read errors\n }\n this.components.set(name, parsed);\n }\n }\n\n /**\n * Get all component folders (including empty ones)\n *\n * Scans the components directory for subdirectories.\n * Returns all folder names, whether they contain components or not.\n *\n * @returns Array of folder names\n *\n * @example\n * ```typescript\n * const folders = componentService.getAllFolders();\n * // ['ui', 'layout', 'content']\n * ```\n */\n getAllFolders(): string[] {\n const componentsDir = this.componentsBaseDir();\n if (!existsSync(componentsDir)) {\n return [];\n }\n\n try {\n const entries = readdirSync(componentsDir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort();\n } catch {\n return [];\n }\n }\n\n /**\n * Create a component folder\n *\n * Creates an empty folder in the components directory.\n * Useful for pre-creating category folders before moving components.\n *\n * @param folderName - Name of the folder to create\n * @returns Promise that resolves when folder is created\n *\n * @throws {Error} If folder creation fails\n *\n * @example\n * ```typescript\n * await componentService.createFolder('ui');\n * ```\n */\n async createFolder(folderName: string): Promise<void> {\n if (!folderName || folderName.trim() === '') {\n throw new Error('Folder name cannot be empty');\n }\n\n // Validate folder name (alphanumeric, dashes, underscores only)\n const sanitized = folderName\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9-_]/g, '-');\n if (sanitized !== folderName.trim()) {\n throw new Error('Folder name can only contain lowercase letters, numbers, dashes, and underscores');\n }\n\n const componentsDir = this.componentsBaseDir();\n const folderPath = join(componentsDir, folderName);\n\n if (existsSync(folderPath)) {\n throw new Error('Folder already exists');\n }\n\n mkdirSync(folderPath, { recursive: true });\n }\n\n /**\n * Move component to a different category folder\n *\n * Moves all component files (.json, .js, .css) from current location to new category folder.\n * If newCategory is empty string or undefined, moves to root (uncategorized).\n *\n * @param name - Component name\n * @param newCategory - Target category folder (empty string or undefined for root)\n * @returns Promise that resolves when move is complete\n *\n * @throws {Error} If component doesn't exist or move fails\n *\n * @example\n * ```typescript\n * // Move Button from root to 'ui' category\n * await componentService.moveComponent('Button', 'ui');\n *\n * // Move Card from 'ui' to root (uncategorized)\n * await componentService.moveComponent('Card', '');\n * ```\n */\n async moveComponent(name: string, newCategory: string | undefined): Promise<void> {\n const currentCategory = this.componentCategories.get(name);\n const targetCategory = newCategory || undefined;\n\n // No-op if category unchanged\n if (currentCategory === targetCategory) {\n return;\n }\n\n const componentsDir = this.componentsBaseDir();\n const sourceDir = currentCategory ? join(componentsDir, currentCategory) : componentsDir;\n const targetDir = targetCategory ? join(componentsDir, targetCategory) : componentsDir;\n\n if (this.writer) {\n // Format-aware move (e.g. relocate the single `.astro` file). The writer\n // owns target-dir creation + which files belong to the component.\n await this.writer.moveComponent(sourceDir, targetDir, name);\n } else {\n // Create target directory if needed\n if (targetCategory && !existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n // Move all component files (.json, .js, .css)\n const extensions = ['.json', '.js', '.css'];\n const { rename } = await import('node:fs/promises');\n\n for (const ext of extensions) {\n const sourcePath = join(sourceDir, `${name}${ext}`);\n const targetPath = join(targetDir, `${name}${ext}`);\n\n if (existsSync(sourcePath)) {\n await rename(sourcePath, targetPath);\n }\n }\n }\n\n // Update category mapping\n this.componentCategories.set(name, targetCategory);\n\n // Clean up empty source directory (only if it's a category folder, not root)\n if (currentCategory) {\n try {\n const remaining = readdirSync(sourceDir);\n if (remaining.length === 0) {\n rmdirSync(sourceDir);\n }\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n\n /**\n * Rename a component across the project.\n *\n * Renames the component's `.json`/`.js`/`.css` files on disk (respecting its\n * category folder), updates the in-memory caches, rewrites every\n * `{ type: \"component\", component: \"<oldName>\" }` reference inside other\n * component structures, and \u2014 if `pageService` is provided \u2014 also walks every\n * page/template and rewrites references there, saving any pages that changed.\n *\n * Matching is structural (only `node.component` string equality), not\n * text-based, so it never touches HTML tags, CSS classes, prop values, or\n * embedded markup that happen to contain the name as a substring.\n *\n * @throws {Error} If old/new name is missing, names are identical, new name\n * isn't a valid JS identifier, the source component doesn't exist, or the\n * new name is already taken.\n */\n async renameComponent(\n oldName: string,\n newName: string,\n pageService?: PageService,\n ): Promise<{\n oldName: string;\n newName: string;\n category: string | undefined;\n componentRefs: number;\n pageRefs: number;\n }> {\n if (!oldName || typeof oldName !== 'string') {\n throw new Error('oldName is required');\n }\n if (!newName || typeof newName !== 'string') {\n throw new Error('newName is required');\n }\n const trimmedNew = newName.trim();\n if (oldName === trimmedNew) {\n throw new Error('newName must differ from oldName');\n }\n if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(trimmedNew)) {\n throw new Error('newName must be a valid JavaScript identifier');\n }\n if (!this.components.has(oldName)) {\n throw new Error(`Component \"${oldName}\" not found`);\n }\n if (this.components.has(trimmedNew)) {\n throw new Error(`Component \"${trimmedNew}\" already exists`);\n }\n\n const category = this.componentCategories.get(oldName);\n const componentsDir = this.componentsBaseDir();\n const dir = category ? join(componentsDir, category) : componentsDir;\n\n if (this.writer) {\n // On-disk collision check (format-aware) + move the component's file(s).\n if (await this.writer.componentExists(dir, trimmedNew)) {\n throw new Error(`Component \"${trimmedNew}\" already exists in components/${category ?? ''}`);\n }\n await this.writer.moveComponent(dir, dir, oldName, trimmedNew);\n } else {\n // On-disk collision check \u2014 defends against a stale cache where the file\n // exists but wasn't loaded (e.g. a parse error masked it).\n for (const ext of ['.json', '.js', '.css'] as const) {\n if (existsSync(join(dir, `${trimmedNew}${ext}`))) {\n throw new Error(`File \"${trimmedNew}${ext}\" already exists in components/${category ?? ''}`);\n }\n }\n\n const { rename } = await import('node:fs/promises');\n for (const ext of ['.json', '.js', '.css'] as const) {\n const src = join(dir, `${oldName}${ext}`);\n const dst = join(dir, `${trimmedNew}${ext}`);\n if (existsSync(src)) {\n await rename(src, dst);\n }\n }\n }\n\n // Move the cache entries to the new key.\n const def = this.components.get(oldName)!;\n this.components.delete(oldName);\n this.componentCategories.delete(oldName);\n this.components.set(trimmedNew, def);\n this.componentCategories.set(trimmedNew, category);\n\n // Rewrite references in every OTHER component's structure and persist\n // each one that actually changed. The owning component's own structure\n // shouldn't reference itself, so we don't bother walking it.\n let componentRefs = 0;\n const writeFile = this.fs ? this.fs.writeFile.bind(this.fs) : (await import('node:fs/promises')).writeFile;\n for (const [name, otherDef] of this.components.entries()) {\n if (name === trimmedNew) continue;\n const structure = otherDef.component?.structure;\n if (!structure) continue;\n if (rewriteComponentRefs(structure, oldName, trimmedNew)) {\n const otherCategory = this.componentCategories.get(name);\n const otherDir = otherCategory ? join(componentsDir, otherCategory) : componentsDir;\n // Strip the runtime-only javascript field on save, matching saveComponent.\n const persisted = JSON.parse(JSON.stringify(otherDef));\n if (persisted?.component?.javascript !== undefined) {\n delete persisted.component.javascript;\n }\n if (this.writer) {\n await this.writer.writeComponent(otherDir, name, persisted);\n } else {\n await writeFile(join(otherDir, `${name}.json`), JSON.stringify(persisted, null, 2), 'utf-8');\n }\n componentRefs++;\n }\n }\n\n // Walk every page (and CMS template \u2014 they're loaded under /templates/*)\n // and rewrite refs. Save pages that actually changed.\n let pageRefs = 0;\n if (pageService) {\n const pagePaths = pageService.getAllPagePaths();\n for (const path of pagePaths) {\n const pageData = pageService.getPageData(path);\n if (!pageData || !('root' in pageData) || !pageData.root) continue;\n if (rewriteComponentRefs(pageData.root, oldName, trimmedNew)) {\n await pageService.savePage(path, pageData as JSONPage);\n pageRefs++;\n }\n }\n }\n\n return {\n oldName,\n newName: trimmedNew,\n category,\n componentRefs,\n pageRefs,\n };\n }\n}\n", "/**\n * CMS Service\n * Handles CMS schema extraction, route matching, and content querying\n */\n\nimport type { CMSProvider, CMSSchemaInfo } from '../../shared/interfaces/contentProvider';\nimport type {\n CMSSchema,\n CMSItem,\n CMSItemVersions,\n CMSRouteMatch,\n CMSListQuery,\n ReferenceLocation,\n} from '../../shared/types';\nimport { isItemDraftForLocale } from '../../shared/types';\nimport { applyCmsFilters, applyCmsSorting } from '../../shared/cmsQuery';\nimport { isI18nValue } from '../../shared/i18n';\nimport { tiptapToHtml } from '../../shared/richtext/tiptapToHtml';\nimport { isTiptapDocument } from '../../shared/richtext/types';\n\ninterface RoutePattern {\n regex: RegExp;\n collection: string;\n slugGroup: number;\n pagePath: string;\n}\n\ninterface CachedItems {\n items: CMSItem[];\n timestamp: number;\n}\n\nexport interface CMSServiceOptions {\n /**\n * When true, the SSR-facing read methods (`queryItems`, `getItemsByIds`,\n * `matchRoute`) merge drafts over published content so the editor preview /\n * dev server reflects unpublished edits. The editor management methods\n * (`getItemVersions`, `listItemsWithDraftFlag`) keep strict published\n * semantics regardless of this flag \u2014 they need to surface both versions\n * separately. Static builds and production runtimes leave this off so\n * deployed sites only ever serve published content.\n */\n previewMode?: boolean;\n}\n\n/**\n * CMS Service\n * Manages CMS schemas, route matching, and content querying\n */\nexport class CMSService {\n private schemaCache = new Map<string, CMSSchemaInfo>();\n private routePatterns: RoutePattern[] = [];\n private provider?: CMSProvider;\n private readonly previewMode: boolean;\n\n /** Item cache with TTL-based expiration */\n private itemsCache = new Map<string, CachedItems>();\n /** Cache TTL in milliseconds (5 seconds) */\n private readonly ITEMS_CACHE_TTL = 5000;\n\n /**\n * Creates a new CMSService instance\n * @param provider - Optional CMSProvider for loading data (enables DI for testing)\n * @param options - Service-level flags (preview mode for dev server)\n */\n constructor(provider?: CMSProvider, options: CMSServiceOptions = {}) {\n this.provider = provider;\n this.previewMode = options.previewMode === true;\n }\n\n /**\n * Set the CMS provider\n * Allows setting provider after construction for backward compatibility\n * @param provider - CMSProvider implementation\n */\n setProvider(provider: CMSProvider): void {\n this.provider = provider;\n }\n\n /**\n * Get items with caching, used by SSR-facing read methods.\n *\n * In preview mode (dev server) drafts are merged over published \u2014 drafts\n * win on a per-`_filename` basis and draft-only items are included \u2014 so\n * the editor preview reflects unpublished edits. Returns published-only\n * otherwise. Rich-text fields are preprocessed to HTML for template\n * interpolation either way.\n *\n * @param collection - Collection ID to fetch items for\n * @returns Array of CMSItems with rich-text fields converted to HTML markers\n */\n private async getCachedItems(collection: string): Promise<CMSItem[]> {\n const cached = this.itemsCache.get(collection);\n const now = Date.now();\n\n // Return cached items if still valid\n if (cached && now - cached.timestamp < this.ITEMS_CACHE_TTL) {\n return cached.items;\n }\n\n // Fetch fresh items\n let rawItems = await this.provider!.getItems(collection);\n\n if (this.previewMode) {\n const drafts = await this.provider!.getAllDrafts(collection);\n if (drafts.length > 0) {\n const byFilename = new Map<string, CMSItem>();\n for (const item of rawItems) {\n if (item._filename) byFilename.set(item._filename, item);\n }\n for (const draft of drafts) {\n if (draft._filename) byFilename.set(draft._filename, draft);\n }\n rawItems = Array.from(byFilename.values());\n }\n }\n\n // Preprocess rich-text fields for template interpolation\n const items = this.preprocessRichTextFields(collection, rawItems);\n\n // Update cache\n this.itemsCache.set(collection, { items, timestamp: now });\n\n return items;\n }\n\n /**\n * Preprocess rich-text fields in CMS items.\n * Converts TipTap JSON to HTML and wraps in __richtext__ marker for template interpolation.\n * @param collection - Collection ID (to get schema)\n * @param items - Raw CMS items\n * @returns Items with rich-text fields converted\n */\n private preprocessRichTextFields(collection: string, items: CMSItem[]): CMSItem[] {\n const schemaInfo = this.schemaCache.get(collection);\n if (!schemaInfo) return items;\n\n // Find rich-text fields in schema\n const richTextFields = Object.entries(schemaInfo.schema.fields)\n .filter(([, def]) => def.type === 'rich-text')\n .map(([name]) => name);\n\n if (richTextFields.length === 0) return items;\n\n // Process each item\n return items.map((item) => {\n const processed = { ...item };\n\n for (const fieldName of richTextFields) {\n const value = item[fieldName];\n\n // Skip if no value or already processed\n if (!value) continue;\n if (typeof value === 'object' && '__richtext__' in value) continue;\n\n // Convert TipTap document to HTML\n if (isTiptapDocument(value)) {\n const html = tiptapToHtml(value);\n processed[fieldName] = { __richtext__: true, html };\n }\n // Already HTML string - wrap it\n else if (typeof value === 'string') {\n processed[fieldName] = { __richtext__: true, html: value };\n }\n }\n\n return processed;\n });\n }\n\n /**\n * Clear items cache for a specific collection or all collections\n * @param collection - Optional collection ID, clears all if not provided\n */\n clearItemsCache(collection?: string): void {\n if (collection) {\n this.itemsCache.delete(collection);\n } else {\n this.itemsCache.clear();\n }\n }\n\n /**\n * Initialize service - extract schemas from pages and build route patterns\n * Builds state in local variables then swaps atomically so concurrent\n * matchRoute() calls see either old OR new state, never empty.\n */\n async initialize(): Promise<void> {\n if (!this.provider) {\n return;\n }\n\n const schemas = await this.provider.getAllSchemas();\n\n // Build new state in locals before swapping\n const newSchemaCache = new Map<string, CMSSchemaInfo>();\n const newRoutePatterns: RoutePattern[] = [];\n\n for (const [id, schemaInfo] of schemas) {\n newSchemaCache.set(id, schemaInfo);\n // A data-only collection (no urlPattern) has no per-item route, so it contributes\n // no route pattern \u2014 matchRoute never resolves it, which is correct (it's list-only).\n if (!schemaInfo.schema.urlPattern) continue;\n newRoutePatterns.push({\n regex: this.patternToRegex(schemaInfo.schema.urlPattern),\n collection: id,\n slugGroup: 1,\n pagePath: schemaInfo.pagePath,\n });\n }\n\n // Atomic swap - concurrent matchRoute sees old OR new, never empty\n this.schemaCache = newSchemaCache;\n this.routePatterns = newRoutePatterns;\n }\n\n /**\n * Convert URL pattern to regex\n * e.g., \"/blog/{{slug}}\" -> /^\\/blog\\/([^\\/]+)$/\n */\n private patternToRegex(pattern: string): RegExp {\n // Escape special regex characters except our placeholder\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n // Replace the escaped placeholder with a capture group\n const withCapture = escaped.replace(/\\\\\\{\\\\\\{slug\\\\\\}\\\\\\}/g, '([^/]+)');\n return new RegExp(`^${withCapture}$`);\n }\n\n /**\n * Match URL against CMS route patterns\n * Supports i18n slugs - matches locale-specific slug values\n * @param path - URL path to match\n * @param locale - Optional locale for i18n slug matching\n * @returns CMSRouteMatch if matched, null otherwise\n */\n async matchRoute(path: string, locale?: string): Promise<CMSRouteMatch | null> {\n if (!this.provider) {\n return null;\n }\n\n for (const route of this.routePatterns) {\n const match = path.match(route.regex);\n if (match) {\n const urlSlug = match[route.slugGroup];\n if (urlSlug === undefined) continue;\n\n // Try to find item by matching its slug field value\n const item = await this.findItemBySlug(route.collection, urlSlug, locale);\n\n if (item) {\n return {\n collection: route.collection,\n slug: urlSlug,\n item,\n pagePath: route.pagePath,\n };\n }\n }\n }\n return null;\n }\n\n /**\n * Find item by simple string slug match\n * @param items - Items to search through\n * @param urlSlug - Slug value from URL\n * @param slugField - Field name containing the slug\n * @returns CMSItem if found, null otherwise\n */\n private findBySimpleSlug(items: CMSItem[], urlSlug: string, slugField: string): CMSItem | null {\n for (const item of items) {\n const slugValue = item[slugField];\n\n if (typeof slugValue === 'string' && slugValue === urlSlug) {\n return item;\n }\n // Also check _filename for backward compatibility\n if (item._filename === urlSlug) {\n return item;\n }\n }\n return null;\n }\n\n /**\n * Find item by i18n slug match\n * @param items - Items to search through\n * @param urlSlug - Slug value from URL\n * @param slugField - Field name containing the slug\n * @param locale - Optional locale for preferential matching\n * @returns CMSItem if found, null otherwise\n */\n private findByI18nSlug(items: CMSItem[], urlSlug: string, slugField: string, locale?: string): CMSItem | null {\n for (const item of items) {\n const slugValue = item[slugField];\n\n if (!isI18nValue(slugValue)) continue;\n\n // If locale provided, try to match that locale's slug first\n if (locale && slugValue[locale] === urlSlug) {\n return item;\n }\n\n // Try to match any locale's slug value\n for (const key of Object.keys(slugValue)) {\n if (key !== '_i18n' && slugValue[key] === urlSlug) {\n return item;\n }\n }\n }\n return null;\n }\n\n /**\n * Find item by slug value (supports i18n slugs)\n * @param collection - Collection ID\n * @param urlSlug - Slug value from URL\n * @param locale - Optional locale for i18n slug matching\n * @returns CMSItem if found, null otherwise\n */\n private async findItemBySlug(collection: string, urlSlug: string, locale?: string): Promise<CMSItem | null> {\n if (!this.provider) {\n return null;\n }\n\n const schemaInfo = this.schemaCache.get(collection);\n if (!schemaInfo) return null;\n\n const slugField = schemaInfo.schema.slugField;\n const items = await this.getCachedItems(collection);\n\n // A data-only collection has no slug field \u2014 only the filename fallback can match.\n if (!slugField) return await this.provider.getItemByFilename(collection, urlSlug);\n\n // Try simple string slug match first\n const simpleMatch = this.findBySimpleSlug(items, urlSlug, slugField);\n if (simpleMatch) return simpleMatch;\n\n // Try i18n slug match\n const i18nMatch = this.findByI18nSlug(items, urlSlug, slugField, locale);\n if (i18nMatch) return i18nMatch;\n\n // Fallback: try direct filename lookup for backward compatibility\n return await this.provider.getItemByFilename(collection, urlSlug);\n }\n\n /**\n * Get all URLs for a collection (for static generation)\n * Supports i18n slugs - generates URLs for all locales when slug is i18n\n * @param collection - Collection ID\n * @param locales - Optional array of locale codes for i18n URL generation\n * @param defaultLocale - Optional default locale (URLs without prefix)\n * @returns Array of URLs\n */\n async getCollectionURLs(\n collection: string,\n locales?: string[],\n defaultLocale?: string,\n options?: { excludeDrafts?: boolean },\n ): Promise<string[]> {\n if (!this.provider) {\n return [];\n }\n\n const schemaInfo = this.schemaCache.get(collection);\n if (!schemaInfo) return [];\n // A data-only collection (no urlPattern/slugField) contributes no sitemap URLs.\n const { urlPattern, slugField } = schemaInfo.schema;\n if (!urlPattern || !slugField) return [];\n\n const items = await this.getCachedItems(collection);\n const urls: string[] = [];\n\n for (const item of items) {\n const slugValue = item[slugField];\n\n // Case 1: Simple string slug - one URL\n if (typeof slugValue === 'string') {\n // Skip if item is draft for the default locale (non-i18n case)\n if (options?.excludeDrafts && defaultLocale && isItemDraftForLocale(item, defaultLocale)) continue;\n urls.push(urlPattern.replace('{{slug}}', slugValue));\n }\n // Case 2: i18n slug - one URL per locale\n else if (isI18nValue(slugValue) && locales) {\n for (const locale of locales) {\n if (options?.excludeDrafts && isItemDraftForLocale(item, locale)) continue;\n const localizedSlug = slugValue[locale] as string;\n if (localizedSlug) {\n const path = urlPattern.replace('{{slug}}', localizedSlug);\n // For default locale, no prefix; for others, add locale prefix\n if (locale === defaultLocale) {\n urls.push(path);\n } else {\n urls.push(`/${locale}${path}`);\n }\n }\n }\n }\n // Case 3: i18n slug but no locales provided - use first available slug\n else if (isI18nValue(slugValue)) {\n for (const key of Object.keys(slugValue)) {\n if (key !== '_i18n' && typeof slugValue[key] === 'string') {\n urls.push(urlPattern.replace('{{slug}}', slugValue[key] as string));\n break; // Only use first available\n }\n }\n }\n }\n\n return urls;\n }\n\n /**\n * Get schema for collection\n * @param collection - Collection ID\n * @returns CMSSchema or undefined\n */\n getSchema(collection: string): CMSSchema | undefined {\n return this.schemaCache.get(collection)?.schema;\n }\n\n /**\n * Get all schemas\n * @returns Map of collection ID to CMSSchemaInfo\n */\n getAllSchemas(): Map<string, CMSSchemaInfo> {\n return this.schemaCache;\n }\n\n /**\n * Refresh schemas from provider\n * Call this after adding/removing collections to update the cache.\n * Only clears items cache and provider cache before re-initializing.\n * Schema/route caches are swapped atomically inside initialize().\n */\n // ----------------------------------------------------------------------\n // Draft-version methods (Studio-only \u2014 never used by SSR / static export)\n // ----------------------------------------------------------------------\n\n /**\n * Load both published and draft versions of an item, used by the editor.\n * Returns `{}` when neither version exists.\n */\n async getItemVersions(collection: string, filename: string): Promise<CMSItemVersions> {\n if (!this.provider) return {};\n const [published, draft] = await Promise.all([\n this.provider.getItemByFilename(collection, filename),\n this.provider.getDraft(collection, filename),\n ]);\n const result: CMSItemVersions = {};\n if (published) result.published = published;\n if (draft) result.draft = draft;\n return result;\n }\n\n /**\n * List all items in a collection for the Studio item list:\n * - Published items annotated with `_hasDraft: true` when a draft sibling exists.\n * - Draft-only items (no published file yet) returned with `_isDraft: true`.\n */\n async listItemsWithDraftFlag(collection: string): Promise<CMSItem[]> {\n if (!this.provider) return [];\n\n const [published, drafts] = await Promise.all([\n this.provider.getItems(collection),\n this.provider.getAllDrafts(collection),\n ]);\n\n const draftFilenames = new Set(drafts.map((d) => d._filename).filter(Boolean) as string[]);\n\n const annotatedPublished: CMSItem[] = published.map((item) => {\n if (item._filename && draftFilenames.has(item._filename)) {\n return { ...item, _hasDraft: true };\n }\n return item;\n });\n\n const publishedFilenames = new Set(published.map((i) => i._filename).filter(Boolean) as string[]);\n const draftOnly = drafts.filter((d) => d._filename && !publishedFilenames.has(d._filename));\n\n return [...annotatedPublished, ...draftOnly];\n }\n\n /** Pass-through to provider; no caching (drafts are read fresh in the editor). */\n async getDraft(collection: string, filename: string): Promise<CMSItem | null> {\n if (!this.provider) return null;\n return this.provider.getDraft(collection, filename);\n }\n\n async hasDraft(collection: string, filename: string): Promise<boolean> {\n if (!this.provider) return false;\n return this.provider.hasDraft(collection, filename);\n }\n\n async saveDraft(collection: string, item: CMSItem): Promise<void> {\n if (!this.provider) throw new Error('CMS provider not configured');\n await this.provider.saveDraft(collection, item);\n // Drafts don't enter the published items cache, but we invalidate it anyway\n // so listItemsWithDraftFlag reflects the new draft on the next read.\n this.itemsCache.delete(collection);\n }\n\n /**\n * Save a published item. Wraps the provider so the items cache is invalidated\n * immediately \u2014 without this, the editor's post-save refetch could hit a\n * stale snapshot inside the 5s TTL window and overwrite an optimistic preview.\n */\n async saveItem(collection: string, item: CMSItem): Promise<void> {\n if (!this.provider) throw new Error('CMS provider not configured');\n await this.provider.saveItem(collection, item);\n this.itemsCache.delete(collection);\n }\n\n /**\n * Delete an item (and its draft sibling). Cache invalidation, same rationale\n * as `saveItem`.\n */\n async deleteItem(collection: string, filename: string): Promise<void> {\n if (!this.provider) throw new Error('CMS provider not configured');\n await this.provider.deleteItem(collection, filename);\n this.itemsCache.delete(collection);\n }\n\n async discardDraft(collection: string, filename: string): Promise<void> {\n if (!this.provider) throw new Error('CMS provider not configured');\n await this.provider.discardDraft(collection, filename);\n this.itemsCache.delete(collection);\n }\n\n async publishDraft(collection: string, filename: string): Promise<CMSItem> {\n if (!this.provider) throw new Error('CMS provider not configured');\n const item = await this.provider.publishDraft(collection, filename);\n // Promotion changes the published file \u2192 invalidate cached items.\n this.itemsCache.delete(collection);\n return item;\n }\n\n async refreshSchemas(): Promise<void> {\n if (!this.provider) {\n return;\n }\n\n // Clear items cache so stale content isn't served\n this.itemsCache.clear();\n\n // Clear provider cache if available\n if ('clearSchemaCache' in this.provider && typeof this.provider.clearSchemaCache === 'function') {\n this.provider.clearSchemaCache();\n }\n\n // Re-initialize - atomically swaps schemaCache and routePatterns\n await this.initialize();\n }\n\n /**\n * Query items with filter/sort/limit\n * @param query - CMSListQuery with collection, filter, sort, limit, offset\n * @returns Filtered and sorted array of CMSItems\n */\n async queryItems(query: CMSListQuery): Promise<CMSItem[]> {\n if (!this.provider) {\n return [];\n }\n\n let items = await this.getCachedItems(query.collection);\n\n // Exclude draft items for the specified locale\n if (query.excludeDraftLocale) {\n items = items.filter((item) => !isItemDraftForLocale(item, query.excludeDraftLocale!));\n }\n\n // Apply filters\n if (query.filter) {\n items = applyCmsFilters(items, query.filter);\n }\n\n // Apply sorting\n if (query.sort) {\n items = applyCmsSorting(items, query.sort);\n }\n\n // Apply offset\n if (query.offset !== undefined && query.offset > 0) {\n items = items.slice(query.offset);\n }\n\n // Apply limit\n if (query.limit !== undefined && query.limit > 0) {\n items = items.slice(0, query.limit);\n }\n\n return items;\n }\n\n /**\n * Get items by their IDs from a collection.\n * Used for resolving reference fields in CMS List templates.\n * Missing IDs are silently skipped. Order is preserved based on input ids array.\n *\n * @param collection - Collection ID to fetch from\n * @param ids - Array of item IDs or filenames to fetch\n * @returns Array of CMSItems matching the IDs\n */\n async getItemsByIds(collection: string, ids: string[]): Promise<CMSItem[]> {\n if (!this.provider) {\n return [];\n }\n\n const allItems = await this.getCachedItems(collection);\n\n // Build lookup maps for both _id and _filename\n const itemMap = new Map(allItems.map((item) => [item._id, item]));\n const filenameMap = new Map(allItems.filter((item) => item._filename).map((item) => [item._filename!, item]));\n\n // Filter to matching items, preserving input order\n return ids\n .filter(Boolean)\n .map((id) => itemMap.get(id) || filenameMap.get(id))\n .filter((item): item is CMSItem => item !== undefined);\n }\n\n /**\n * Find all references to a specific item across all collections.\n * Used to warn users before deleting an item that is referenced elsewhere.\n *\n * @param targetCollection - Collection ID of the item being referenced\n * @param targetId - ID or filename of the target item\n * @returns Array of ReferenceLocation objects describing where the item is referenced\n */\n async findReferencesTo(targetCollection: string, targetId: string): Promise<ReferenceLocation[]> {\n if (!this.provider) {\n return [];\n }\n\n const references: ReferenceLocation[] = [];\n const allSchemas = this.getAllSchemas();\n\n for (const [collectionId, schemaInfo] of allSchemas) {\n const { schema } = schemaInfo;\n\n // Find reference fields pointing to targetCollection\n const refFields = Object.entries(schema.fields).filter(\n ([_, def]) => def.type === 'reference' && def.collection === targetCollection,\n );\n\n if (refFields.length === 0) continue;\n\n // Check all items in this collection\n const items = await this.getCachedItems(collectionId);\n for (const item of items) {\n for (const [fieldName] of refFields) {\n const value = item[fieldName];\n if (!value) continue;\n\n const ids = Array.isArray(value) ? value : [value];\n if (ids.includes(targetId)) {\n references.push({\n collection: collectionId,\n itemId: item._id,\n itemSlug: item._slug,\n itemFilename: item._filename,\n fieldName,\n });\n }\n }\n }\n }\n\n return references;\n }\n\n /**\n * Remove all references to a target item.\n * For single-reference fields: sets to null\n * For multi-reference fields: filters out the target ID\n * @returns Number of items updated\n */\n async removeReferencesTo(targetCollection: string, targetId: string): Promise<number> {\n if (!this.provider) {\n return 0;\n }\n\n const references = await this.findReferencesTo(targetCollection, targetId);\n let removedCount = 0;\n\n for (const ref of references) {\n if (!ref.itemFilename) continue;\n\n const item = await this.provider.getItemByFilename(ref.collection, ref.itemFilename);\n if (!item) continue;\n\n const schemaInfo = this.getAllSchemas().get(ref.collection);\n const fieldDef = schemaInfo?.schema.fields[ref.fieldName];\n const currentValue = item[ref.fieldName];\n\n let newValue: string | string[] | null;\n if (fieldDef?.multiple && Array.isArray(currentValue)) {\n // Multi-reference: filter out target\n newValue = currentValue.filter((id) => id !== targetId);\n if (newValue.length === 0) newValue = null;\n } else {\n // Single reference: clear it\n newValue = null;\n }\n\n // Update the item\n await this.provider.saveItem(ref.collection, {\n ...item,\n [ref.fieldName]: newValue,\n });\n removedCount++;\n }\n\n return removedCount;\n }\n}\n\n// Re-export ReferenceLocation from shared types for backward compatibility\nexport type { ReferenceLocation } from '../../shared/types';\n", "/**\n * File System CMS Provider\n * Implements CMSProvider for loading CMS data from the file system\n */\n\nimport { existsSync, readdirSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CMSProvider, CMSSchemaInfo } from '../../shared/interfaces/contentProvider';\nimport type { CMSSchema, CMSItem } from '../../shared/types';\nimport { validateCMSItem, validateCMSDraftItem } from '../../shared/validation/validators';\nimport {\n isSafePathSegment,\n isValidIdentifier,\n isReservedDraftFilename,\n CMS_DRAFT_SUFFIX,\n} from '../../shared/pathSecurity';\nimport { readJsonFile, fileExists } from '../runtime';\nimport { createLogger } from '../../shared/logger';\n\nconst log = createLogger('FileSystemCMSProvider');\n\nconst DRAFT_FILE_SUFFIX = `${CMS_DRAFT_SUFFIX}.json`;\n\n/**\n * Load JSON file content from disk\n * Logs a warning if JSON parsing fails (helps debug malformed files)\n */\nasync function loadJSONFile(filePath: string): Promise<unknown | null> {\n try {\n if (await fileExists(filePath)) {\n return await readJsonFile(filePath);\n }\n return null;\n } catch (error) {\n log.warn(`Failed to parse JSON at ${filePath}:`, error instanceof Error ? error.message : error);\n return null;\n }\n}\n\n/**\n * Normalize a raw CMS item by adding _slug, _filename, and _id (backfilled\n * from filename for items written without one \u2014 the editor stopped writing\n * a separate random _id once _filename became the canonical identifier).\n * If `isDraft` is true, also sets the transient `_isDraft` flag.\n */\nfunction normalizeItem(content: unknown, filename: string, isDraft = false): CMSItem {\n const raw = content as CMSItem;\n const base: CMSItem = {\n ...raw,\n _id: raw._id || filename,\n _slug: filename,\n _filename: filename,\n };\n if (isDraft) base._isDraft = true;\n return base;\n}\n\n/**\n * Strip transient fields that must never be persisted to disk.\n * Also drops `_filename` when it equals `_id` (the canonical case for new\n * items) so the field stops accumulating in storage. Legacy items where\n * `_filename` differs from `_id` keep the field on disk so the on-disk\n * file-routing path can still find them.\n */\nfunction stripTransient<T extends Record<string, unknown>>(\n item: T,\n): Omit<T, '_slug' | '_isDraft' | '_hasDraft' | '_url'> {\n const { _slug, _isDraft, _hasDraft, _url, _filename, ...rest } = item;\n const out = rest as Omit<T, '_slug' | '_isDraft' | '_hasDraft' | '_url'>;\n if (typeof _filename === 'string' && _filename !== (out as Record<string, unknown>)._id) {\n (out as Record<string, unknown>)._filename = _filename;\n }\n return out;\n}\n\n/**\n * FileSystemCMSProvider\n * Loads CMS schemas from template files in root templates/ dir and CMS items from cms/<collection>/<slug>.json\n */\nexport class FileSystemCMSProvider implements CMSProvider {\n private schemaCache: Map<string, CMSSchemaInfo> | null = null;\n\n constructor(\n private templatesDir: string, // e.g., './templates' - CMS template pages\n private cmsDir: string, // e.g., './cms' - items stored here\n ) {}\n\n /**\n * Validate collection name to prevent path traversal attacks\n * @throws Error if collection name is invalid\n */\n private validateCollection(collection: string): void {\n if (!isValidIdentifier(collection)) {\n throw new Error(\n `Invalid collection name: \"${collection}\". Collection names must contain only letters, numbers, hyphens, and underscores.`,\n );\n }\n }\n\n /**\n * Validate filename to prevent path traversal attacks and reserved-suffix collisions.\n * @throws Error if filename is invalid\n */\n private validateFilename(filename: string): void {\n if (!isSafePathSegment(filename)) {\n throw new Error(\n `Invalid filename: \"${filename}\". Filenames cannot contain path separators or traversal sequences.`,\n );\n }\n if (isReservedDraftFilename(filename)) {\n throw new Error(`Invalid filename: \"${filename}\". The \"${CMS_DRAFT_SUFFIX}\" suffix is reserved for draft files.`);\n }\n }\n\n /**\n * Load all CMS schemas from page files with source: 'cms' in templates/\n */\n async getAllSchemas(): Promise<Map<string, CMSSchemaInfo>> {\n // Return cached if available\n if (this.schemaCache) {\n return this.schemaCache;\n }\n\n const schemas = new Map<string, CMSSchemaInfo>();\n\n if (!existsSync(this.templatesDir)) {\n return schemas;\n }\n\n const files = readdirSync(this.templatesDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n const results = await Promise.all(\n jsonFiles.map(async (file) => {\n const filePath = join(this.templatesDir, file);\n const content = await loadJSONFile(filePath);\n return { filePath, content };\n }),\n );\n\n for (const { filePath, content } of results) {\n if (\n content &&\n typeof content === 'object' &&\n 'meta' in content &&\n typeof (content as Record<string, unknown>).meta === 'object'\n ) {\n const meta = (content as Record<string, unknown>).meta as Record<string, unknown>;\n\n if (meta.source === 'cms' && meta.cms) {\n const schema = meta.cms as CMSSchema;\n schemas.set(schema.id, {\n schema,\n pagePath: filePath,\n });\n }\n }\n }\n\n this.schemaCache = schemas;\n return schemas;\n }\n\n /**\n * Load all items for a collection\n */\n async getItems(collection: string): Promise<CMSItem[]> {\n this.validateCollection(collection);\n const collectionDir = join(this.cmsDir, collection);\n\n if (!existsSync(collectionDir)) {\n return [];\n }\n\n const files = readdirSync(collectionDir);\n // Published items only \u2014 exclude `*.draft.json` files (draft-version siblings)\n const jsonFiles = files.filter((f) => f.endsWith('.json') && !f.endsWith(DRAFT_FILE_SUFFIX));\n\n const results = await Promise.all(\n jsonFiles.map(async (file) => {\n const filePath = join(collectionDir, file);\n const content = await loadJSONFile(filePath);\n return { file, filePath, content };\n }),\n );\n\n const items: CMSItem[] = [];\n for (const { file, filePath, content } of results) {\n if (content && typeof content === 'object') {\n const filename = file.replace('.json', '');\n const item = normalizeItem(content, filename);\n\n const validation = validateCMSItem(item);\n if (validation.valid) {\n items.push(validation.data);\n } else {\n log.warn(`Invalid CMS item at ${filePath}:`, validation.errors);\n }\n }\n }\n\n return items;\n }\n\n /**\n * Get single item by slug (backward compat - slug is actually filename)\n * @deprecated Use getItemByFilename instead\n */\n async getItemBySlug(collection: string, slug: string): Promise<CMSItem | null> {\n return this.getItemByFilename(collection, slug);\n }\n\n /**\n * Get single item by filename\n */\n async getItemByFilename(collection: string, filename: string): Promise<CMSItem | null> {\n this.validateCollection(collection);\n this.validateFilename(filename);\n const filePath = join(this.cmsDir, collection, `${filename}.json`);\n const content = await loadJSONFile(filePath);\n\n if (!content || typeof content !== 'object') {\n return null;\n }\n\n const item = normalizeItem(content, filename);\n const validation = validateCMSItem(item);\n\n if (validation.valid) {\n return validation.data;\n }\n\n log.warn(`Invalid CMS item at ${filePath}:`, validation.errors);\n return null;\n }\n\n /**\n * Get single item by ID\n */\n async getItemById(collection: string, id: string): Promise<CMSItem | null> {\n const items = await this.getItems(collection);\n return items.find((item) => item._id === id) || null;\n }\n\n /**\n * Save item to file system.\n * The on-disk filename is derived from `_filename` (legacy alias) when set,\n * otherwise from `_id` (canonical identifier; equals the filename for new\n * items). Falls back to the slugField value as a last resort.\n */\n async saveItem(collection: string, item: CMSItem): Promise<void> {\n this.validateCollection(collection);\n const { writeFile } = await import('node:fs/promises');\n\n // Get schema\n const schemas = await this.getAllSchemas();\n const schemaInfo = schemas.get(collection);\n\n if (!schemaInfo) {\n throw new Error(`Unknown collection: ${collection}`);\n }\n\n // Filename derivation precedence:\n // 1. `_filename` \u2014 explicit on-disk filename. Used by the editor (preserves\n // legacy items where `_filename` differs from `_id`).\n // 2. slug-field value \u2014 back-compat for external API callers who build\n // items from raw input with a slug field.\n // 3. `_id` \u2014 last resort. For new items written by the editor `_id`\n // equals the filename, so this path also produces the correct name.\n let filename: string;\n\n if (item._filename) {\n filename = item._filename;\n } else {\n const slugField = schemaInfo.schema.slugField;\n const slugValue = slugField ? item[slugField] : undefined;\n if (typeof slugValue === 'string' && slugValue) {\n filename = slugValue;\n } else if (typeof item._id === 'string' && item._id) {\n filename = item._id;\n } else {\n filename = String(slugValue);\n }\n }\n\n if (!filename || filename === '[object Object]') {\n throw new Error('Cannot derive filename: item is missing _id, _filename, and a usable slug-field value.');\n }\n\n // Validate filename to prevent path traversal\n this.validateFilename(filename);\n\n // Ensure collection directory exists\n const collectionDir = join(this.cmsDir, collection);\n if (!existsSync(collectionDir)) {\n mkdirSync(collectionDir, { recursive: true });\n }\n\n // Strip transient fields (_slug, _isDraft, _hasDraft, _url) before persisting\n const itemData = stripTransient(item as Record<string, unknown>);\n\n const filePath = join(collectionDir, `${filename}.json`);\n await writeFile(filePath, JSON.stringify(itemData, null, 2), 'utf-8');\n }\n\n /**\n * Delete item by filename. Removes the published file AND any draft sibling.\n */\n async deleteItem(collection: string, filename: string): Promise<void> {\n this.validateCollection(collection);\n this.validateFilename(filename);\n const { unlink } = await import('node:fs/promises');\n\n const publishedPath = join(this.cmsDir, collection, `${filename}.json`);\n if (existsSync(publishedPath)) {\n await unlink(publishedPath);\n }\n\n const draftPath = this.draftPath(collection, filename);\n if (existsSync(draftPath)) {\n await unlink(draftPath);\n }\n }\n\n // ---- Draft helpers ----------------------------------------------------\n\n private draftPath(collection: string, filename: string): string {\n return join(this.cmsDir, collection, `${filename}${DRAFT_FILE_SUFFIX}`);\n }\n\n /**\n * Get the draft version of an item, or null if no draft file exists.\n * Drafts skip strict validation \u2014 they may be partial / WIP.\n */\n async getDraft(collection: string, filename: string): Promise<CMSItem | null> {\n this.validateCollection(collection);\n this.validateFilename(filename);\n const filePath = this.draftPath(collection, filename);\n const content = await loadJSONFile(filePath);\n\n if (!content || typeof content !== 'object') {\n return null;\n }\n\n return normalizeItem(content, filename, /*isDraft*/ true);\n }\n\n /**\n * List all drafts in a collection. Used by the Studio item list to mark\n * items that have an outstanding draft sibling (or are draft-only).\n */\n async getAllDrafts(collection: string): Promise<CMSItem[]> {\n this.validateCollection(collection);\n const collectionDir = join(this.cmsDir, collection);\n if (!existsSync(collectionDir)) return [];\n\n const files = readdirSync(collectionDir).filter((f) => f.endsWith(DRAFT_FILE_SUFFIX));\n\n const results = await Promise.all(\n files.map(async (file) => {\n const filePath = join(collectionDir, file);\n const content = await loadJSONFile(filePath);\n return { file, content };\n }),\n );\n\n const drafts: CMSItem[] = [];\n for (const { file, content } of results) {\n if (content && typeof content === 'object') {\n const filename = file.slice(0, -DRAFT_FILE_SUFFIX.length);\n drafts.push(normalizeItem(content, filename, /*isDraft*/ true));\n }\n }\n return drafts;\n }\n\n async hasDraft(collection: string, filename: string): Promise<boolean> {\n this.validateCollection(collection);\n this.validateFilename(filename);\n return existsSync(this.draftPath(collection, filename));\n }\n\n /**\n * Save the draft version of an item. Loose validation \u2014 drafts may have\n * missing required fields or partial data. Strict validation only runs at\n * publish time. The on-disk filename is derived the same way as for\n * `saveItem` (prefer `_filename`, fall back to `_id`).\n */\n async saveDraft(collection: string, item: CMSItem): Promise<void> {\n this.validateCollection(collection);\n const { writeFile } = await import('node:fs/promises');\n\n const schemas = await this.getAllSchemas();\n const schemaInfo = schemas.get(collection);\n if (!schemaInfo) {\n throw new Error(`Unknown collection: ${collection}`);\n }\n\n // Filename derivation: same precedence as saveItem.\n let filename: string;\n if (item._filename) {\n filename = item._filename;\n } else {\n const slugField = schemaInfo.schema.slugField;\n const slugValue = slugField ? item[slugField] : undefined;\n if (typeof slugValue === 'string' && slugValue) {\n filename = slugValue;\n } else if (typeof item._id === 'string' && item._id) {\n filename = item._id;\n } else {\n filename = String(slugValue);\n }\n }\n\n if (!filename || filename === '[object Object]') {\n throw new Error('Cannot derive draft filename: item is missing _id, _filename, and a usable slug-field value.');\n }\n\n this.validateFilename(filename);\n\n const collectionDir = join(this.cmsDir, collection);\n if (!existsSync(collectionDir)) {\n mkdirSync(collectionDir, { recursive: true });\n }\n\n const itemData = stripTransient(item as Record<string, unknown>);\n\n // Loose validation \u2014 drafts may be partial WIP. Strict validation\n // (validateCMSItem) runs on Publish.\n const validation = validateCMSDraftItem(itemData);\n if (!validation.valid) {\n const messages = validation.errors.map((e) => `${e.path}: ${e.message}`).join(', ');\n throw new Error(`Invalid draft: ${messages}`);\n }\n\n const filePath = this.draftPath(collection, filename);\n await writeFile(filePath, JSON.stringify(itemData, null, 2), 'utf-8');\n }\n\n /**\n * Discard the draft version of an item. No-op if no draft exists.\n */\n async discardDraft(collection: string, filename: string): Promise<void> {\n this.validateCollection(collection);\n this.validateFilename(filename);\n const { unlink } = await import('node:fs/promises');\n const filePath = this.draftPath(collection, filename);\n if (existsSync(filePath)) {\n await unlink(filePath);\n }\n }\n\n /**\n * Promote a draft to published. Reads `{filename}.draft.json`, writes the\n * content to `{filename}.json`, then unlinks the draft. The published write\n * happens first so a crash mid-operation leaves a valid published file plus\n * an orphan draft (recoverable via the editor's Discard button) \u2014 never a\n * gap with no published content.\n *\n * Throws if no draft exists.\n */\n async publishDraft(collection: string, filename: string): Promise<CMSItem> {\n this.validateCollection(collection);\n this.validateFilename(filename);\n const { writeFile, unlink } = await import('node:fs/promises');\n\n const draftFilePath = this.draftPath(collection, filename);\n const content = await loadJSONFile(draftFilePath);\n if (!content || typeof content !== 'object') {\n throw new Error(`No draft to publish for ${collection}/${filename}`);\n }\n\n // Strict validation when going live\n const item = normalizeItem(content, filename);\n const validation = validateCMSItem(item);\n if (!validation.valid) {\n const messages = validation.errors.map((e) => `${e.path}: ${e.message}`).join(', ');\n throw new Error(`Cannot publish invalid draft: ${messages}`);\n }\n\n const collectionDir = join(this.cmsDir, collection);\n if (!existsSync(collectionDir)) {\n mkdirSync(collectionDir, { recursive: true });\n }\n\n const itemData = stripTransient(validation.data as unknown as Record<string, unknown>);\n const publishedPath = join(collectionDir, `${filename}.json`);\n await writeFile(publishedPath, JSON.stringify(itemData, null, 2), 'utf-8');\n\n // Published written successfully \u2014 now retire the draft. If unlink fails,\n // the published copy is already in place; an orphan draft can be cleared\n // via the editor's Discard action.\n if (existsSync(draftFilePath)) {\n await unlink(draftFilePath);\n }\n\n return normalizeItem(itemData, filename);\n }\n\n /**\n * Clear schema cache (useful when pages are modified)\n */\n clearSchemaCache(): void {\n this.schemaCache = null;\n }\n\n /**\n * Save a new collection schema by creating a page file in templates/\n */\n async saveSchema(collectionId: string, pageData: unknown): Promise<void> {\n if (!isValidIdentifier(collectionId)) {\n throw new Error(\n `Invalid collection ID: \"${collectionId}\". Collection IDs must contain only letters, numbers, hyphens, and underscores.`,\n );\n }\n const { writeFile, mkdir } = await import('node:fs/promises');\n\n // Ensure templates directory exists\n if (!existsSync(this.templatesDir)) {\n await mkdir(this.templatesDir, { recursive: true });\n }\n\n // Create page file path in templates/ subdirectory\n const pageFilePath = join(this.templatesDir, `${collectionId}.json`);\n\n // Check if file already exists\n if (existsSync(pageFilePath)) {\n throw new Error(`Page file already exists: templates/${collectionId}.json`);\n }\n\n // Write the page file\n await writeFile(pageFilePath, JSON.stringify(pageData, null, 2), 'utf-8');\n\n // Create the CMS collection directory \u2014 but NOT for a Sanity-backed collection: its items\n // live in Sanity (read-only), never on disk, so it must have no `cms/<id>/` dir. An empty\n // dir would make `writeContentConfig` register a phantom content collection and the converter\n // copy nothing into `src/content/<id>/` (the Sanity template fetches via getSanityData instead).\n const schemaSource = (pageData as { meta?: { cms?: { source?: string } } })?.meta?.cms?.source;\n if (schemaSource !== 'sanity') {\n const collectionDir = join(this.cmsDir, collectionId);\n if (!existsSync(collectionDir)) {\n await mkdir(collectionDir, { recursive: true });\n }\n }\n\n // Clear the schema cache so the new collection is detected\n this.clearSchemaCache();\n }\n\n /**\n * Update an existing collection schema\n * Preserves the root component tree, only updates meta.cms\n */\n async updateSchema(collectionId: string, updates: Partial<CMSSchema>): Promise<void> {\n if (!isValidIdentifier(collectionId)) {\n throw new Error(\n `Invalid collection ID: \"${collectionId}\". Collection IDs must contain only letters, numbers, hyphens, and underscores.`,\n );\n }\n const { readFile, writeFile } = await import('node:fs/promises');\n\n const pageFilePath = join(this.templatesDir, `${collectionId}.json`);\n\n if (!existsSync(pageFilePath)) {\n throw new Error(`Collection not found: ${collectionId}`);\n }\n\n // Read existing page data\n const content = await readFile(pageFilePath, 'utf-8');\n const pageData = JSON.parse(content) as {\n meta: { cms: CMSSchema; [key: string]: unknown };\n [key: string]: unknown;\n };\n\n // Update only the cms schema in meta, preserving id\n pageData.meta.cms = {\n ...pageData.meta.cms,\n ...updates,\n id: collectionId, // ID cannot be changed\n };\n\n await writeFile(pageFilePath, JSON.stringify(pageData, null, 2), 'utf-8');\n this.clearSchemaCache();\n }\n}\n", "/**\n * Page Cache\n * Manages caching of page JSON content with line number tracking\n */\n\nimport type { LineMap, LineRange } from './utils/jsonLineMapper';\n\nexport interface CachedPage {\n content: string;\n lineMap: LineMap;\n}\n\nexport class PageCache {\n private cache = new Map<string, CachedPage>();\n\n /**\n * Store page content and line map in cache\n */\n set(path: string, content: string, lineMap: LineMap): void {\n this.cache.set(path, { content, lineMap });\n }\n\n /**\n * Get cached page data\n */\n get(path: string): CachedPage | undefined {\n return this.cache.get(path);\n }\n\n /**\n * Get page content from cache\n */\n getContent(path: string): string | undefined {\n return this.cache.get(path)?.content;\n }\n\n /**\n * Get line map from cache\n */\n getLineMap(path: string): LineMap | undefined {\n return this.cache.get(path)?.lineMap;\n }\n\n /**\n * Get line range for a specific element path\n */\n getLineRange(pagePath: string, elementPath: string): LineRange | undefined {\n return this.cache.get(pagePath)?.lineMap.get(elementPath);\n }\n\n /**\n * Delete page from cache\n */\n delete(path: string): void {\n this.cache.delete(path);\n }\n\n /**\n * Check if page exists in cache\n */\n has(path: string): boolean {\n return this.cache.has(path);\n }\n\n /**\n * Get all page paths\n */\n keys(): string[] {\n return Array.from(this.cache.keys());\n }\n\n /**\n * Clear all cached pages\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache size\n */\n size(): number {\n return this.cache.size;\n }\n\n /**\n * Get all pages content as object (without line maps)\n */\n toObject(): Record<string, string> {\n const obj: Record<string, string> = {};\n this.cache.forEach((value, key) => {\n obj[key] = value.content;\n });\n return obj;\n }\n}\n", "/**\n * DraftPageStore\n *\n * Holds ephemeral, unsaved versions of pages that the studio is currently\n * editing. The SSR page route consults this store before falling back to\n * the on-disk content, which lets external browser tabs see the editor's\n * in-flight edits without anything being persisted.\n *\n * Drafts are cleared when the user saves the page to disk (so the next\n * request reads the fresh disk version), and otherwise live only as long\n * as the dev-server process.\n */\nexport class DraftPageStore {\n private drafts = new Map<string, string>();\n\n /**\n * Store a draft for a page path. The value is the raw JSON string the\n * SSR pipeline expects, matching PageService.getPage()'s contract.\n */\n set(path: string, content: string): void {\n this.drafts.set(path, content);\n }\n\n /**\n * Get the current draft string for a page path, if any.\n */\n get(path: string): string | undefined {\n return this.drafts.get(path);\n }\n\n /**\n * Drop the draft for a specific path. Called when the page is saved to\n * disk so subsequent renders read the persisted version.\n */\n clear(path: string): void {\n this.drafts.delete(path);\n }\n\n /**\n * Drop every draft. Used on shutdown / project switch.\n */\n clearAll(): void {\n this.drafts.clear();\n }\n\n has(path: string): boolean {\n return this.drafts.has(path);\n }\n}\n", "/**\n * File Watcher\n * Watches for changes in JSON files and triggers callbacks\n */\n\nimport { watch, existsSync, statSync, readdirSync } from 'node:fs';\nimport { basename, dirname, join, relative } from 'node:path';\nimport type { FSWatcher } from 'node:fs';\nimport { mapPageNameToPath } from './jsonLoader';\nimport { projectPaths, getProjectRoot } from './projectContext';\n\n/**\n * Recursive directory watcher that also covers subdirectories created AFTER the\n * watch began. Node's `fs.watch({recursive:true})` does this natively, but Bun's\n * does NOT \u2014 it reports the new subdir's creation event yet never the files\n * created inside it (verified on Bun 1.3). Since the studio server can run under\n * Bun, relying on the native behavior silently breaks live-reload / cache\n * invalidation for any collection or page added at runtime (e.g. a new\n * `src/pages/<col>/[slug].astro` or `src/content/<col>/*.json`).\n *\n * We attach the native recursive watcher (covering the depth present at start),\n * then, whenever a directory appears, attach a nested watcher to it AND replay\n * its current contents as synthetic `rename` events \u2014 closing the\n * mkdir-then-write race where a file lands before the nested watcher is live.\n * The listener receives paths relative to `root` (matching `fs.watch`'s relative\n * `filename`). Idempotent callbacks tolerate the occasional duplicate event this\n * can produce under Node (where the native watcher already recurses).\n */\nexport function watchRecursive(root: string, listener: (event: string, relPath: string) => void): FSWatcher {\n const nested: FSWatcher[] = [];\n const watchedDirs = new Set<string>();\n let rootWatcher: FSWatcher | null = null;\n\n const coverNewDir = (abs: string): void => {\n let isDir = false;\n try {\n isDir = statSync(abs).isDirectory();\n } catch {\n return; // vanished (or unreadable) between event and stat \u2014 nothing to do\n }\n if (!isDir || watchedDirs.has(abs)) return;\n attachDir(abs);\n // Replay what's already inside (created before the nested watcher went live).\n try {\n for (const e of readdirSync(abs, { withFileTypes: true })) {\n const child = join(abs, e.name);\n if (e.isDirectory()) coverNewDir(child);\n else listener('rename', relative(root, child));\n }\n } catch {\n /* dir vanished / unreadable \u2014 nothing to replay */\n }\n };\n\n function attachDir(absDir: string): void {\n if (watchedDirs.has(absDir)) return;\n watchedDirs.add(absDir);\n let w: FSWatcher;\n try {\n w = watch(absDir, { recursive: true }, (event, filename) => {\n if (!filename) return;\n const abs = join(absDir, filename);\n listener(event, relative(root, abs));\n coverNewDir(abs); // a newly-created subdir \u2014 Bun won't recurse into it on its own\n });\n } catch {\n return; // dir vanished mid-attach\n }\n if (absDir === root) rootWatcher = w;\n else nested.push(w);\n }\n\n attachDir(root);\n\n // Composite handle: closing it tears down the root + every nested watcher.\n const handle = (rootWatcher ?? { close() {} }) as FSWatcher;\n const baseClose = handle.close.bind(handle);\n handle.close = () => {\n baseClose();\n for (const w of nested) {\n try {\n w.close();\n } catch {\n /* already closed */\n }\n }\n };\n return handle;\n}\n\n/**\n * Attach a recursive watcher to `dirPath`. If the directory doesn't exist\n * yet, watch the parent directory and defer the attach until the target is\n * created (e.g. a blank project that doesn't ship with `templates/` or `cms/`\n * gets one added later by an external tool).\n *\n * Returns the currently active FSWatcher (which may be the deferred parent\n * watcher until the target appears, then the proper recursive watcher).\n */\nfunction attachWhenDirExists(\n dirPath: string,\n attach: () => FSWatcher | null,\n setWatcher: (w: FSWatcher | null) => void,\n): void {\n if (existsSync(dirPath)) {\n setWatcher(attach());\n return;\n }\n\n const parentDir = dirname(dirPath);\n const targetName = basename(dirPath);\n if (!existsSync(parentDir)) {\n // Parent doesn't exist either \u2014 give up; nothing reasonable to watch.\n return;\n }\n\n let parentWatcher: FSWatcher | null = null;\n parentWatcher = watch(parentDir, (_event, filename) => {\n if (filename !== targetName) return;\n if (!existsSync(dirPath)) return;\n // Target exists now \u2014 tear down the parent watcher and attach the real one.\n parentWatcher?.close();\n parentWatcher = null;\n setWatcher(attach());\n });\n setWatcher(parentWatcher);\n}\n\nexport interface FileWatchCallbacks {\n onComponentChange?: () => Promise<void>;\n onPageChange?: (pagePath: string) => Promise<void>;\n /**\n * Fires when an astro CMS template page (`src/pages/<col>/[slug].astro`) is\n * added, edited, or removed. Distinct from onPageChange because this changes\n * the set of collections (not just one page's content), so the handler must\n * refresh the CMS schema cache + the `/templates/<id>` page-cache entries.\n */\n onCMSTemplateChange?: () => Promise<void>;\n onColorsChange?: () => Promise<void>;\n onVariablesChange?: () => Promise<void>;\n onEnumsChange?: () => Promise<void>;\n onCMSChange?: (collection: string) => Promise<void>;\n onImageAdded?: (filename: string) => Promise<void>;\n onLibraryChange?: () => Promise<void>;\n onProjectConfigChange?: () => Promise<void>;\n}\n\nexport class FileWatcher {\n private componentsWatcher: FSWatcher | null = null;\n private pagesWatcher: FSWatcher | null = null;\n private templatesWatcher: FSWatcher | null = null;\n private colorsWatcher: FSWatcher | null = null;\n private variablesWatcher: FSWatcher | null = null;\n private enumsWatcher: FSWatcher | null = null;\n private cmsWatcher: FSWatcher | null = null;\n private imagesWatcher: FSWatcher | null = null;\n private librariesWatcher: FSWatcher | null = null;\n private projectConfigWatcher: FSWatcher | null = null;\n // Astro-format projects keep pages/components/CMS under src/ as .astro/.json.\n private astroPagesWatcher: FSWatcher | null = null;\n private astroComponentsWatcher: FSWatcher | null = null;\n private astroContentWatcher: FSWatcher | null = null;\n\n constructor(private callbacks: FileWatchCallbacks) {}\n\n /**\n * Start watching components directory\n * Watches both .json and .js files to detect component definition and JavaScript changes\n */\n watchComponents(dirPath: string = projectPaths.components()): void {\n if (!existsSync(dirPath)) {\n return;\n }\n\n this.componentsWatcher = watchRecursive(dirPath, async (_event, filename) => {\n // Watch .json (component definitions), .js (component JavaScript), and .css (component CSS) files\n if (filename && (filename.endsWith('.json') || filename.endsWith('.js') || filename.endsWith('.css'))) {\n const _fileType = filename.endsWith('.js') ? 'JavaScript' : filename.endsWith('.css') ? 'CSS' : 'component';\n\n if (this.callbacks.onComponentChange) {\n await this.callbacks.onComponentChange();\n }\n }\n });\n }\n\n /**\n * Start watching pages directory\n */\n watchPages(dirPath: string = projectPaths.pages()): void {\n if (!existsSync(dirPath)) {\n return;\n }\n\n this.pagesWatcher = watchRecursive(dirPath, async (_event, filename) => {\n if (filename?.endsWith('.json')) {\n const pageName = filename.replace('.json', '');\n const pagePath = mapPageNameToPath(pageName);\n\n if (this.callbacks.onPageChange) {\n await this.callbacks.onPageChange(pagePath);\n }\n }\n });\n }\n\n /**\n * Start watching root templates directory for CMS template changes.\n * Falls back to a deferred-attach watcher on the project root when\n * `templates/` doesn't exist yet (blank projects, projects that have never\n * had a CMS collection).\n */\n watchTemplates(dirPath: string = projectPaths.templates()): void {\n attachWhenDirExists(\n dirPath,\n () =>\n watchRecursive(dirPath, async (_event, filename) => {\n if (filename?.endsWith('.json')) {\n // Prefix with templates/ so the path is /templates/...\n const pageName = `templates/${filename.replace('.json', '')}`;\n const pagePath = mapPageNameToPath(pageName);\n\n if (this.callbacks.onPageChange) {\n await this.callbacks.onPageChange(pagePath);\n }\n }\n }),\n (w) => {\n this.templatesWatcher = w;\n },\n );\n }\n\n /**\n * Start watching colors.json file\n */\n watchColors(filePath: string = projectPaths.colors()): void {\n if (!existsSync(filePath)) {\n return;\n }\n\n // Watch the file's directory for changes\n const dirPath = getProjectRoot();\n this.colorsWatcher = watch(dirPath, { recursive: false }, async (_event, filename) => {\n if (filename === 'colors.json' && this.callbacks.onColorsChange) {\n await this.callbacks.onColorsChange();\n }\n });\n }\n\n /**\n * Start watching variables.json file\n */\n watchVariables(): void {\n const dirPath = getProjectRoot();\n this.variablesWatcher = watch(dirPath, { recursive: false }, async (_event, filename) => {\n if (filename === 'variables.json' && this.callbacks.onVariablesChange) {\n await this.callbacks.onVariablesChange();\n }\n });\n }\n\n /**\n * Start watching enums.json file\n */\n watchEnums(): void {\n const dirPath = getProjectRoot();\n this.enumsWatcher = watch(dirPath, { recursive: false }, async (_event, filename) => {\n if (filename === 'enums.json' && this.callbacks.onEnumsChange) {\n await this.callbacks.onEnumsChange();\n }\n });\n }\n\n /**\n * Start watching CMS directory.\n * Watches for changes in CMS content files (cms/{collection}/*.json).\n * Falls back to a deferred-attach watcher when `cms/` doesn't exist yet.\n */\n watchCMS(dirPath: string = projectPaths.cms()): void {\n attachWhenDirExists(\n dirPath,\n () =>\n watchRecursive(dirPath, async (_event, filename) => {\n if (filename?.endsWith('.json')) {\n // Extract collection from path: \"blog/my-post.json\" -> \"blog\"\n const collection = filename.split('/')[0] ?? filename;\n if (this.callbacks.onCMSChange) {\n await this.callbacks.onCMSChange(collection);\n }\n }\n }),\n (w) => {\n this.cmsWatcher = w;\n },\n );\n }\n\n /**\n * Start watching images directory for new source images\n */\n watchImages(dirPath: string = projectPaths.images()): void {\n if (!existsSync(dirPath)) {\n return;\n }\n\n this.imagesWatcher = watch(dirPath, { recursive: false }, async (event, filename) => {\n if (event === 'rename' && filename && this.callbacks.onImageAdded) {\n await this.callbacks.onImageAdded(filename);\n }\n });\n }\n\n /**\n * Start watching project.config.json for changes.\n * Picks up edits to i18n locales, breakpoints, libraries, icons, etc. so the\n * studio reflects external writes (e.g. an AI tool adding a new locale) without\n * a dev-server restart.\n */\n watchProjectConfig(): void {\n const dirPath = getProjectRoot();\n this.projectConfigWatcher = watch(dirPath, { recursive: false }, async (_event, filename) => {\n if (filename === 'project.config.json' && this.callbacks.onProjectConfigChange) {\n await this.callbacks.onProjectConfigChange();\n }\n });\n }\n\n /**\n * Start watching libraries directory for CSS/JS changes\n */\n watchLibraries(dirPath: string = projectPaths.libraries()): void {\n if (!existsSync(dirPath)) {\n return;\n }\n\n this.librariesWatcher = watchRecursive(dirPath, async (_event, filename) => {\n if (filename && (filename.endsWith('.css') || filename.endsWith('.js'))) {\n if (this.callbacks.onLibraryChange) {\n await this.callbacks.onLibraryChange();\n }\n }\n });\n }\n\n /**\n * Astro-format projects keep pages/components/CMS under src/ as .astro/.json.\n * The onPageChange/onComponentChange/onCMSChange callbacks are format-agnostic\n * (reload goes through the active provider), so file\u2192editor live reload works\n * for `.astro` the same way it does for JSON. These are no-ops in JSON projects\n * (the src/ dirs don't exist).\n *\n * All three use deferred attach (like watchTemplates/watchCMS): `src/content`\n * (and occasionally `src/components`) may not exist at startup \u2014 e.g. a project\n * with no CMS collections yet. Without deferral the watcher would silently\n * early-out and the first collection's item edits wouldn't live-reload until a\n * dev-server restart.\n */\n watchAstroPages(dirPath: string = join(getProjectRoot(), 'src', 'pages')): void {\n attachWhenDirExists(\n dirPath,\n () =>\n watchRecursive(dirPath, async (_event, filename) => {\n if (!filename?.endsWith('.astro')) return;\n // Dynamic CMS routes ([slug].astro) are CMS template pages, not regular pages.\n // A change there means a collection was added/edited/removed \u2014 route it to the\n // CMS-template refresh (schema cache + /templates/<id> page cache). Mapping its\n // on-disk name ([slug]) as a page path would be wrong, and skipping it (as before)\n // left new collections + their template pages invisible until a dev-server restart.\n if (filename.includes('[')) {\n if (this.callbacks.onCMSTemplateChange) await this.callbacks.onCMSTemplateChange();\n return;\n }\n const pagePath = mapPageNameToPath(filename.replace(/\\.astro$/, ''));\n if (this.callbacks.onPageChange) await this.callbacks.onPageChange(pagePath);\n }),\n (w) => {\n this.astroPagesWatcher = w;\n },\n );\n }\n\n watchAstroComponents(dirPath: string = join(getProjectRoot(), 'src', 'components')): void {\n attachWhenDirExists(\n dirPath,\n () =>\n watchRecursive(dirPath, async (_event, filename) => {\n if (filename?.endsWith('.astro') && this.callbacks.onComponentChange) {\n await this.callbacks.onComponentChange();\n }\n }),\n (w) => {\n this.astroComponentsWatcher = w;\n },\n );\n }\n\n watchAstroContent(dirPath: string = join(getProjectRoot(), 'src', 'content')): void {\n attachWhenDirExists(\n dirPath,\n () =>\n watchRecursive(dirPath, async (_event, filename) => {\n if (filename?.endsWith('.json') && this.callbacks.onCMSChange) {\n const collection = filename.split('/')[0] ?? filename;\n await this.callbacks.onCMSChange(collection);\n }\n }),\n (w) => {\n this.astroContentWatcher = w;\n },\n );\n }\n\n /**\n * Start watching all directories\n */\n watchAll(): void {\n this.watchComponents();\n this.watchPages();\n this.watchTemplates();\n this.watchColors();\n this.watchVariables();\n this.watchEnums();\n this.watchCMS();\n this.watchImages();\n this.watchLibraries();\n this.watchProjectConfig();\n // Astro-format dirs (no-ops in JSON projects).\n this.watchAstroPages();\n this.watchAstroComponents();\n this.watchAstroContent();\n }\n\n /**\n * Stop watching all directories\n */\n stopAll(): void {\n if (this.componentsWatcher) {\n this.componentsWatcher.close();\n this.componentsWatcher = null;\n }\n\n if (this.pagesWatcher) {\n this.pagesWatcher.close();\n this.pagesWatcher = null;\n }\n\n if (this.templatesWatcher) {\n this.templatesWatcher.close();\n this.templatesWatcher = null;\n }\n\n if (this.colorsWatcher) {\n this.colorsWatcher.close();\n this.colorsWatcher = null;\n }\n\n if (this.variablesWatcher) {\n this.variablesWatcher.close();\n this.variablesWatcher = null;\n }\n\n if (this.enumsWatcher) {\n this.enumsWatcher.close();\n this.enumsWatcher = null;\n }\n\n if (this.cmsWatcher) {\n this.cmsWatcher.close();\n this.cmsWatcher = null;\n }\n\n if (this.imagesWatcher) {\n this.imagesWatcher.close();\n this.imagesWatcher = null;\n }\n\n if (this.librariesWatcher) {\n this.librariesWatcher.close();\n this.librariesWatcher = null;\n }\n\n if (this.projectConfigWatcher) {\n this.projectConfigWatcher.close();\n this.projectConfigWatcher = null;\n }\n\n if (this.astroPagesWatcher) {\n this.astroPagesWatcher.close();\n this.astroPagesWatcher = null;\n }\n\n if (this.astroComponentsWatcher) {\n this.astroComponentsWatcher.close();\n this.astroComponentsWatcher = null;\n }\n\n if (this.astroContentWatcher) {\n this.astroContentWatcher.close();\n this.astroContentWatcher = null;\n }\n }\n\n /**\n * Check if watchers are active\n */\n isWatching(): boolean {\n return (\n this.componentsWatcher !== null ||\n this.pagesWatcher !== null ||\n this.cmsWatcher !== null ||\n this.imagesWatcher !== null\n );\n }\n}\n", "/**\n * File Watcher Service\n * Manages file watching for pages and components\n */\n\nimport { FileWatcher } from '../fileWatcher';\nimport type { WebSocketManager } from '../websocketManager';\nimport type { ComponentService } from './componentService';\nimport type { PageService } from './pageService';\nimport type { CMSService } from './cmsService';\nimport type { PageCache } from '../pageCache';\nimport { colorService } from './ColorService';\nimport { variableService } from './VariableService';\nimport { enumService } from './EnumService';\nimport { configService } from './configService';\n\nexport class FileWatcherService {\n private fileWatcher: FileWatcher | null = null;\n /** Timer for debouncing refreshSchemas calls from burst fs.watch events */\n private refreshSchemasTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private componentService: ComponentService,\n private pageService: PageService,\n _pageCache: PageCache,\n private wsManager: WebSocketManager,\n private cmsService?: CMSService,\n private onImageAdded?: (filename: string) => Promise<void>,\n ) {}\n\n /**\n * Initialize file watchers\n */\n initialize(): void {\n this.fileWatcher = new FileWatcher({\n onComponentChange: async () => {\n await this.componentService.loadAllComponents();\n this.wsManager.broadcastUpdate('all');\n },\n onPageChange: async (pagePath: string) => {\n // Provider-based reload so .astro and JSON projects both live-reload. The\n // provider re-reads (and, for astro, re-parses) the file; a transient\n // mid-write returns false and is left for the next watcher event.\n if (await this.pageService.reloadPageFromDisk(pagePath)) {\n this.wsManager.broadcastUpdate(pagePath);\n }\n\n // Refresh CMS schemas when template files change\n // Debounced to coalesce burst fs.watch events (multiple events per write)\n if (pagePath.startsWith('/templates/') && this.cmsService) {\n if (this.refreshSchemasTimer !== null) {\n clearTimeout(this.refreshSchemasTimer);\n }\n const cmsService = this.cmsService;\n const wsManager = this.wsManager;\n this.refreshSchemasTimer = setTimeout(async () => {\n this.refreshSchemasTimer = null;\n await cmsService.refreshSchemas();\n // Tell connected studio clients to re-fetch the collections list.\n // Without this, the CMS panel only refreshes after a dev-server\n // restart even though the server cache is now correct.\n wsManager.broadcastCollectionsUpdate();\n }, 50);\n }\n },\n onCMSTemplateChange: async () => {\n // An astro CMS template page (src/pages/<col>/[slug].astro) was added,\n // edited, or removed. Unlike a regular page edit this changes the set of\n // collections, so refresh the CMS schema cache AND reconcile the page\n // cache's /templates/<id> entries \u2014 otherwise the new collection and its\n // template page only appear after a dev-server restart. Debounced (shares\n // refreshSchemasTimer) to coalesce burst fs.watch events from one write.\n if (!this.cmsService) return;\n if (this.refreshSchemasTimer !== null) {\n clearTimeout(this.refreshSchemasTimer);\n }\n const cmsService = this.cmsService;\n const pageService = this.pageService;\n const wsManager = this.wsManager;\n this.refreshSchemasTimer = setTimeout(async () => {\n this.refreshSchemasTimer = null;\n await cmsService.refreshSchemas();\n // In astro projects every /templates/<id> page-cache entry is a CMS\n // template (regular pages keep their real path), so reconcile them 1:1\n // with the fresh schema set: drop entries for removed collections,\n // (re)load entries for current ones.\n const ids = new Set(cmsService.getAllSchemas().keys());\n for (const path of pageService.getAllPagePaths()) {\n if (path.startsWith('/templates/') && !ids.has(path.slice('/templates/'.length))) {\n await pageService.deletePage(path);\n }\n }\n for (const id of ids) {\n await pageService.reloadPageFromDisk(`/templates/${id}`);\n }\n // Refresh the studio's collections list (CMS panel) and page list (dropdown).\n wsManager.broadcastCollectionsUpdate();\n wsManager.broadcastUpdate();\n }, 50);\n },\n onColorsChange: async () => {\n // Clear the color service cache so it reloads on next request\n colorService.clearCache();\n // Broadcast to all clients to refresh their color data\n this.wsManager.broadcastColorsUpdate();\n },\n onVariablesChange: async () => {\n // Clear the variable service cache so it reloads on next request\n variableService.clearCache();\n // Broadcast to all clients to refresh their variables data\n this.wsManager.broadcastVariablesUpdate();\n },\n onEnumsChange: async () => {\n // Clear the enum service cache so it reloads on next request\n enumService.clearCache();\n // Broadcast to all clients to refresh their enums data\n this.wsManager.broadcastEnumsUpdate();\n },\n onCMSChange: async (collection: string) => {\n // Drop the items cache for this collection so the next read returns\n // fresh data immediately, not the previous TTL-cached snapshot.\n this.cmsService?.clearItemsCache(collection);\n // Broadcast to all clients to refresh CMS content\n this.wsManager.broadcastCMSUpdate(collection);\n },\n onImageAdded: this.onImageAdded,\n onLibraryChange: async () => {\n this.wsManager.broadcastLibrariesUpdate();\n },\n onProjectConfigChange: async () => {\n // Reset the singleton config cache so the next read pulls the new\n // i18n locales / breakpoints / icons from disk. Without this, the\n // config API would keep serving the stale snapshot.\n configService.reset();\n await configService.load();\n this.wsManager.broadcastConfigUpdate();\n },\n });\n\n this.fileWatcher.watchAll();\n }\n\n /**\n * Stop file watchers\n */\n stop(): void {\n if (this.refreshSchemasTimer !== null) {\n clearTimeout(this.refreshSchemasTimer);\n this.refreshSchemasTimer = null;\n }\n if (this.fileWatcher) {\n this.fileWatcher.stopAll();\n this.fileWatcher = null;\n }\n }\n}\n", "import { existsSync } from 'node:fs';\nimport { rename } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { projectPaths } from './projectContext';\n\n/**\n * Auto-migrate CMS templates from pages/templates/ to root templates/\n * Only runs if pages/templates/ exists and root templates/ does not\n */\nexport async function migrateTemplatesDirectory(): Promise<void> {\n const oldDir = join(projectPaths.pages(), 'templates');\n const newDir = projectPaths.templates();\n\n // Nothing to migrate\n if (!existsSync(oldDir)) return;\n\n // Don't clobber existing root templates/\n if (existsSync(newDir)) return;\n\n await rename(oldDir, newDir);\n console.log('Migrated CMS templates: pages/templates/ \u2192 templates/');\n}\n", "/**\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 'node:fs';\nimport { writeFile, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { createHash } from 'node:crypto';\nimport {\n loadJSONFile,\n loadComponentDirectory,\n mapPageNameToPath,\n parseJSON,\n loadI18nConfig,\n} from './lib/server/jsonLoader';\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 { syncNetlifyLocale404Block } from './lib/shared/netlifyLocale404';\nimport { tiptapToHtml } from './lib/shared/richtext/tiptapToHtml';\nimport { isTiptapDocument } from './lib/shared/richtext/types';\nimport type { ComponentDefinition, JSONPage, CMSSchema, CMSItem, I18nConfig } from './lib/shared/types';\nimport type { CMSFieldDefinition } from './lib/shared/types/cms';\nimport { CMS_DRAFT_SUFFIX } from './lib/shared/pathSecurity';\nimport type { SlugMap } from './lib/shared/slugTranslator';\nimport { type PreloadImage, 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 {\n collectComponentLibraries,\n filterLibrariesByContext,\n mergeLibraries,\n generateLibraryTags,\n} 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 { normalizeOrphanTemplateProps } from './lib/server/astro/normalizeOrphanTemplateProps';\nimport { emitCMSPage, CMS_SLUG_PLACEHOLDER } 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// 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(src: string, dest: string, filter?: (filename: string) => boolean): 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(`-(${RESPONSIVE_WIDTHS.join('|')})\\\\.(webp|avif)$`);\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(slugs: Record<string, string>, i18nConfig: I18nConfig): 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 // Rich-text is serialized to an HTML string at item-copy time (see the\n // CMS collection emission below), so by the time Astro validates it the\n // value is a string (or an i18n object of strings). Support both.\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 * Serialize a single rich-text field value to an HTML string. Handles plain\n * Tiptap doc objects, the `{ html: \"...\" }` marker shape, i18n-wrapped values\n * ({ _i18n: true, en: <doc|string>, ... }), and already-serialized strings.\n */\nfunction serializeRichTextValue(value: unknown): unknown {\n const one = (v: unknown): unknown => {\n if (v == null || typeof v === 'string') return v ?? '';\n if (isTiptapDocument(v)) return tiptapToHtml(v);\n if (typeof v === 'object' && v !== null && typeof (v as { html?: unknown }).html === 'string') {\n return (v as { html: string }).html;\n }\n return v;\n };\n\n if (isI18nValue(value)) {\n const out: Record<string, unknown> = { _i18n: true };\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (k === '_i18n') continue;\n out[k] = one(v);\n }\n return out;\n }\n return one(value);\n}\n\n/**\n * Walk a component structure and collect the names of every component instance\n * it references (`{ type: 'component', component: 'X' }`).\n */\nfunction collectComponentRefs(node: unknown, acc: Set<string>): void {\n if (Array.isArray(node)) {\n for (const child of node) collectComponentRefs(child, acc);\n return;\n }\n if (!node || typeof node !== 'object') return;\n const n = node as Record<string, unknown>;\n if (n.type === 'component' && typeof n.component === 'string') {\n acc.add(n.component);\n }\n for (const value of Object.values(n)) {\n if (value && typeof value === 'object') collectComponentRefs(value, acc);\n }\n}\n\n/**\n * Compute the set of components that consume the CMS entry (`{{cms.*}}`),\n * transitively including any component that renders a consumer in its own\n * structure (it must forward the `cms` prop down). Astro components have\n * isolated scopes, so each consumer needs the entry threaded in explicitly.\n */\nfunction computeCmsConsumerComponents(components: Record<string, ComponentDefinition>): Set<string> {\n const consumers = new Set<string>();\n const refsByComponent = new Map<string, Set<string>>();\n\n for (const [name, def] of Object.entries(components)) {\n const structure = def.component?.structure;\n if (structure && JSON.stringify(structure).includes('{{cms.')) {\n consumers.add(name);\n }\n const refs = new Set<string>();\n collectComponentRefs(structure, refs);\n refsByComponent.set(name, refs);\n }\n\n // Fixpoint: a component that renders a consumer is itself a consumer/forwarder.\n let changed = true;\n while (changed) {\n changed = false;\n for (const [name, refs] of refsByComponent) {\n if (consumers.has(name)) continue;\n for (const ref of refs) {\n if (consumers.has(ref)) {\n consumers.add(name);\n changed = true;\n break;\n }\n }\n }\n }\n return consumers;\n}\n\n/**\n * Build the `_url` expression (a JS template literal over the `e` collection\n * entry) for a CMS collection, so flattened list items expose a usable link.\n * E.g. urlPattern \"/blog/{{slug}}\" + slugField \"slug\" \u2192 `/blog/${e.data.slug ?? e.id}`.\n */\nfunction buildCollectionUrlExpr(schema: CMSSchema): string {\n const slugField = schema.slugField || 'slug';\n const pattern = schema.urlPattern || `/${schema.id}/{{slug}}`;\n const body = pattern.replace(/\\{\\{[^}]+\\}\\}/, `\\${e.data.${slugField} ?? e.id}`);\n return `\\`${body}\\``;\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 ? `[${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 '${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(_projectRoot?: string, outputDir?: string): 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) => {\n globalComponents[key] = value;\n });\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 {\n /* ignore parse errors in first pass */\n }\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: {\n html: string;\n meta: string;\n title: string;\n javascript: string;\n componentCSS?: string;\n locale: string;\n interactiveStylesMap: Map<string, InteractiveStyles>;\n preloadImages: PreloadImage[];\n neededCollections: Set<string>;\n ssrFallbackCollector?: Map<string, string>;\n processedRawHtmlCollector?: Map<string, string>;\n },\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?.[locale]) {\n // Slugs may be authored with a leading slash (e.g. \"/blog\" from the\n // page-rename flow). Normalize to the bare form the rest of the\n // pipeline expects \u2014 matches buildPageUrlForLocale(). A leading slash\n // here would otherwise inflate fileDepth (\".../blog.astro\".split('/'))\n // and produce a wrong \"../../layouts\" import.\n slug = slugs[locale].replace(/^\\/+/, '');\n } else if (basePath === '/') {\n slug = '';\n } else {\n slug = basePath.substring(1);\n }\n\n const urlPath = isDefault\n ? slug === ''\n ? '/'\n : `/${slug}`\n : slug === ''\n ? `/${locale}`\n : `/${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) {\n console.error(` Error rendering ${basePath}:`, error instanceof Error ? 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 // Pre-pass: components that consume the CMS entry (so the page/component\n // emitters know which instances to thread `cms={...}` into), plus per-\n // collection `_url` expressions (for flattened collection lists). Built\n // before the template loop so the very first emitted CMS page sees the\n // full picture even when it lists items from another collection.\n const cmsConsumerComponents = computeCmsConsumerComponents(globalComponents);\n const collectionUrlExpr = new Map<string, string>();\n const mergedRichTextFields = new Set<string>();\n if (existsSync(templatesDir)) {\n for (const file of readdirSync(templatesDir).filter((f) => f.endsWith('.json'))) {\n const tc = await loadJSONFile(join(templatesDir, file));\n if (!tc) continue;\n try {\n const pd = parseJSON<JSONPage>(tc);\n const schema = pd.meta?.cms as CMSSchema | undefined;\n if (!schema?.id) continue;\n collectionUrlExpr.set(schema.id, buildCollectionUrlExpr(schema));\n for (const [fn, fd] of Object.entries(schema.fields || {})) {\n if (fd.type === 'rich-text') mergedRichTextFields.add(fn);\n }\n } catch {\n /* ignore parse errors; handled in main loop */\n }\n }\n }\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 // A data-only collection (no urlPattern) has no per-item route \u2014 skip page/route\n // generation. It is still a content collection usable in list bindings.\n if (!cmsSchema.urlPattern) continue;\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}}', CMS_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 ? `${pathPrefix}[slug].astro` : `${localeCode}/${pathPrefix}[slug].astro`;\n } else {\n astroFilePath = isDefault ? '[slug].astro' : `${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 cmsConsumers: cmsConsumerComponents,\n collectionUrlExpr,\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) {\n console.error(` Error processing template ${file}:`, error instanceof Error ? 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.map((c) => `@source inline(\"${c}\");`).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.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').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 <script is:inline>\\n${formHandlerScript}\\n </script>` : '';\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 // SSR/Next.js resolve orphan `{{x}}` refs in a component's structure via\n // the parentProps cascade in templateEngine. Astro can't fall back at\n // runtime (each .astro file is its own scope), so we lift orphan refs\n // onto each component's interface and forward them from hosts that\n // declare the same prop. See `normalizeOrphanTemplateProps` for details.\n const emittableComponents = normalizeOrphanTemplateProps(globalComponents);\n let _componentFileCount = 0;\n for (const [compName, compDef] of Object.entries(emittableComponents)) {\n try {\n const astroContent = emitAstroComponent(\n compName,\n compDef,\n emittableComponents,\n breakpoints,\n i18nConfig.defaultLocale,\n responsiveScales,\n remConversionConfig,\n {\n cmsConsumers: cmsConsumerComponents,\n cmsRichTextFields: mergedRichTextFields,\n collectionUrlExpr,\n },\n );\n await writeFile(join(componentsOutDir, `${compName}.astro`), astroContent, 'utf-8');\n _componentFileCount++;\n } catch (error) {\n console.warn(\n ` Warning: could not generate component ${compName}: ${error instanceof Error ? error.message : String(error)}`,\n );\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 = 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: emittableComponents,\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) {\n // Fallback to SSR HTML if component emission fails \u2014 needs page-level script\n console.warn(\n ` Warning: component emission failed for ${result.urlPath}, using SSR fallback: ${error instanceof Error ? error.message : String(error)}`,\n );\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 // Rich-text fields are stored as Tiptap doc objects; Astro's content\n // schema (and `<Fragment set:html>`) expects HTML strings. Mirror the\n // live SSR (cmsSSRProcessor) by serializing them to HTML at copy time.\n const richTextFieldNames = Object.entries(schema.fields || {})\n .filter(([, fd]) => fd.type === 'rich-text')\n .map(([fn]) => fn);\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 // Skip `*.draft.json` siblings in production builds \u2014 they mirror the\n // published item-list filter and may hold partial/invalid WIP data.\n const isDevBuild = process.env.MENO_DEV_BUILD === 'true';\n const itemFiles = readdirSync(cmsItemsDir).filter(\n (f) => f.endsWith('.json') && (isDevBuild || !f.endsWith(`${CMS_DRAFT_SUFFIX}.json`)),\n );\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 // Serialize rich-text fields (Tiptap doc \u2192 HTML string), handling\n // i18n-wrapped values ({ _i18n: true, en: <doc>, ... }) per-locale.\n for (const fieldName of richTextFieldNames) {\n resolved[fieldName] = serializeRichTextValue(resolved[fieldName]);\n }\n\n await writeFile(join(collectionDir, itemFile), JSON.stringify(resolved, null, 2), 'utf-8');\n } catch (err) {\n console.warn(\n ` Warning: could not process CMS item ${itemFile}: ${err instanceof Error ? err.message : String(err)}`,\n );\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 5 (stable Vite), NOT 6 \u2014 Astro 6's rolldown-vite breaks\n // @tailwindcss/vite at build time (\"Missing field `tsconfigPaths`\").\n astro: '^5.0.0',\n '@astrojs/sitemap': '^3.0.0',\n '@tailwindcss/vite': '^4.0.0',\n tailwindcss: '^4.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 =\n 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 // netlify.toml \u2014 makes the exported project deployable on Netlify out of the\n // box. `astro` is a real dependency here (see package.json above), so once\n // Netlify runs `npm install`, `astro build` is on PATH and writes to dist/.\n // Harmless on other hosts (Cloudflare Pages / Vercel ignore this file).\n //\n // Multi-locale projects WITH a 404 page (pages/404.json) also get the managed\n // locale-404 redirects block (lib/shared/netlifyLocale404.ts): the regular-pages\n // loop above emits src/pages/<locale>/404.astro per non-default locale, which\n // Astro builds to dist/<locale>/404/index.html \u2014 exactly the rules' rewrite\n // target \u2014 while the root 404.astro becomes Netlify's default catch-all 404.html.\n const baseNetlifyToml = `# Generated by Meno's Astro build.\n[build]\n command = \"npm run build\"\n publish = \"dist\"\n\n[build.environment]\n NODE_VERSION = \"22\"\n`;\n const netlifyToml = syncNetlifyLocale404Block(baseNetlifyToml, i18nConfig, pageFiles.includes('404.json'));\n await writeFile(join(outDir, 'netlify.toml'), netlifyToml, '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 { StyleObject, ResponsiveStyleObject, StyleMapping } 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' && value !== null && '_mapping' in value && (value as StyleMapping)._mapping === true\n );\n}\n\nfunction hasTemplateExpression(value: string): boolean {\n return /\\{\\{.+?\\}\\}/.test(value);\n}\n\nfunction isResponsiveStyle(style: StyleObject | ResponsiveStyleObject): 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(property: string, value: string | number): 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 (\n property === 'border' ||\n property === 'borderTop' ||\n property === 'borderRight' ||\n property === 'borderBottom' ||\n property === 'borderLeft'\n ) {\n if (\n strValue.includes('solid') ||\n strValue.includes('dashed') ||\n strValue.includes('dotted') ||\n strValue.includes('none')\n ) {\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(style: StyleObject | Record<string, string | number>): {\n classes: string[];\n dynamicStyles: Record<string, string>;\n} {\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(['border', 'borderTop', 'borderRight', 'borderBottom', 'borderLeft']);\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) =>\n /^(solid|dashed|dotted|double|groove|ridge|inset|outset|none|hidden)$/.test(p),\n );\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 } => typeof bp.value === 'number' && bp.value > 0)\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(responsiveScales, property as CSSPropertyType, bpName);\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 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 } from '../../shared/elementClassName';\nimport { isVoidElement, hasIf } from '../../shared/nodeUtils';\nimport { deepMergeStyles } from '../../shared/styleNodeUtils';\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 {\n transformCMSTemplate,\n isTemplateExpression,\n transformItemTemplate,\n replaceItemMetaVars,\n rewriteItemVar,\n} 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 /**\n * Names of components that consume the CMS entry. When emitting an instance\n * of one of these inside a CMS context, thread `cms={<entry binding>}` so the\n * component (which has an isolated Astro scope) can resolve `{{cms.*}}`.\n */\n cmsConsumers?: Set<string>;\n /**\n * collectionId \u2192 JS template literal (over entry `e`) for an item's `_url`,\n * used when flattening `sourceType: 'collection'` lists so list items expose\n * a usable link (`{{item._url}}`).\n */\n collectionUrlExpr?: Map<string, 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\n/**\n * Build the runtime href expression for a link-typed value. A link value may be\n * an object `{ href, target? }` or a bare string URL \u2014 the prop validator\n * coerces strings to `{ href }`, so collection lists and CMS fields legitimately\n * pass a string (e.g. `post._url`). Mirror that coercion at render time.\n */\nfunction linkHrefExpr(expr: string): string {\n return `(typeof ${expr} === 'string' ? ${expr} : ${expr}?.href) ?? \"#\"`;\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' && value !== null && '_mapping' in value && (value as StyleMapping)._mapping === true\n );\n}\n\nfunction isLinkMapping(value: unknown): value is LinkMapping {\n return typeof value === 'object' && value !== null && '_mapping' in value && (value as LinkMapping)._mapping === true;\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) => `\\${${w(`${b}.data.${fp.trim()}`)}}`);\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 typeof value === 'object' && value !== null && '_mapping' in value && (value as HtmlMapping)._mapping === true;\n}\n\nfunction isResponsiveStyle(style: StyleObject | ResponsiveStyleObject): 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 // Mappings reference component props by bare identifier. Those identifiers\n // only exist inside a component definition \u2014 on a page the reference would\n // be an undefined variable (an Astro build error). Mirror the runtime, where\n // resolveStyleMapping() receives no props at page scope and drops the\n // property: emit no conditional entries outside a component def.\n if (!ctx.isComponentDef) return entries;\n\n // Generate utility class for each possible value\n const propRef = mapping.prop;\n\n if (values.length === 2) {\n const entry1 = values[0];\n const entry2 = values[1];\n if (entry1 === undefined || entry2 === undefined) return entries;\n const [val1, css1] = entry1;\n const [, css2] = entry2;\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(property: string, value: string | number, breakpointPrefix: string): 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 =\n 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 // 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 (\n interactiveStyles &&\n interactiveStyles.length > 0 &&\n ctx.isComponentDef &&\n hasInteractiveStyleMappings(interactiveStyles)\n ) {\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 const entry1 = entries[0];\n const entry2 = entries[1];\n if (entries.length === 2 && entry1 && entry2) {\n const [val1, css1] = entry1;\n const [_val2, css2] = entry2;\n varParts.push(\n `'${varName}': ${mapping.prop} === ${JSON.stringify(coerceValue(val1))} ? '${css1}' : '${css2}'`,\n );\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 ? styleAttr.replace(/^ style=\\{`/, '').replace(/`\\}$/, '') : '';\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(ctx: AstroEmitContext, label: string | undefined): string {\n return generateElementClassName({\n fileType: ctx.fileType,\n fileName: ctx.fileName,\n label,\n path: ctx.elementPath,\n });\n}\n\nfunction isResponsiveStyleObject(style: StyleObject | ResponsiveStyleObject): style is ResponsiveStyleObject {\n return 'base' in style || 'tablet' in style || 'mobile' in style;\n}\n\n/**\n * The style on a component's root element \u2014 `node.style` for HTML/embed/list/\n * link roots, or `props.style` for a component/link-instance root. Used to\n * replicate SSR's per-breakpoint merge of an instance override into the root.\n */\nfunction getComponentRootStyle(def: ComponentDefinition | undefined): StyleObject | ResponsiveStyleObject | undefined {\n const root = def?.component?.structure as { style?: unknown; props?: { style?: unknown } } | undefined;\n if (!root || typeof root !== 'object') return undefined;\n const s = root.style ?? root.props?.style;\n return s && typeof s === 'object' ? (s as StyleObject | ResponsiveStyleObject) : undefined;\n}\n\n/**\n * True when a flat style has any property, or any responsive branch\n * (base/tablet/mobile/custom breakpoint) is non-empty. Guards against emitting\n * an empty `.class {}` rule / dangling `class=\"\"` for the common empty override\n * shape `{ base:{}, tablet:{}, mobile:{} }`.\n */\nfunction hasNonEmptyStyle(style: StyleObject | ResponsiveStyleObject): boolean {\n if (isResponsiveStyleObject(style)) {\n return Object.values(style).some(\n (branch) => !!branch && typeof branch === 'object' && Object.keys(branch as object).length > 0,\n );\n }\n return Object.keys(style).length > 0;\n}\n\n/**\n * Drop properties whose value is a `{{...}}` template expression \u2014 these can't\n * be serialized to static CSS. Recurses into responsive branches. Template-\n * expression instance overrides are a pre-existing unsupported case; this just\n * avoids emitting invalid CSS like `padding: {{x}}`.\n */\nfunction stripTemplateExpressionStyle<T extends StyleObject | ResponsiveStyleObject>(style: T): T {\n const cleanFlat = (s: Record<string, unknown>): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(s)) {\n if (typeof v === 'string' && hasTemplates(v)) continue;\n out[k] = v;\n }\n return out;\n };\n if (isResponsiveStyleObject(style)) {\n const out: Record<string, unknown> = {};\n for (const [bp, branch] of Object.entries(style as Record<string, unknown>)) {\n out[bp] = branch && typeof branch === 'object' ? cleanFlat(branch as Record<string, unknown>) : branch;\n }\n return out as T;\n }\n return cleanFlat(style as Record<string, unknown>) as T;\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}={${linkHrefExpr(expr)}}`);\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' ? `\\${${linkHrefExpr(trimmed)}}` : `\\${${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 // Page context without a locale: resolve through the default locale\n // (resolveTranslation falls back exact \u2192 default \u2192 first available \u2192\n // empty) instead of stringifying the i18n object to \"[object Object]\".\n if (isI18nValue(resolved)) {\n const config = ctx.i18nConfig ?? DEFAULT_I18N_CONFIG;\n const fallbackLocale = ctx.defaultLocale ?? config.defaultLocale;\n const fallbackResolved = resolveI18nValue(resolved, fallbackLocale, config);\n if (typeof fallbackResolved === 'string') {\n return nodeToAstro(fallbackResolved, ctx);\n }\n return `${ind(ctx)}${String(fallbackResolved ?? '')}\\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(\n node,\n ctx.cmsEntryBinding || 'entry',\n ctx.cmsRichTextFields,\n ctx.cmsWrapFn,\n );\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((a, b) => a[1].breakpoint - b[1].breakpoint);\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 a static one. Handles all\n * three attr shapes the emitter produces: static `style=\"...\"`, dynamic\n * template-literal `style={\\`...\\`}`, and dynamic expression `style={...}`.\n * The inputs are raw CSS 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\n // Dynamic template-literal style attr (` style={`...`}`): append the extra\n // declarations inside the template literal so they survive the merge.\n const dynLiteralMatch = styleAttr.match(/^ style=\\{`([\\s\\S]*)`\\}$/);\n if (dynLiteralMatch) {\n const existing = dynLiteralMatch[1] ?? '';\n const trimmed = existing.trimEnd();\n const sep = trimmed.length > 0 && !trimmed.endsWith(';') ? ';' : '';\n return ` style={\\`${existing}${sep}${extraCss}\\`}`;\n }\n\n // Dynamic expression style attr (` style={expr}`, e.g. the Object.entries()\n // form for interactive style mappings): wrap the expression in a template\n // literal and append the extra declarations after it.\n const dynExprMatch = styleAttr.match(/^ style=\\{([\\s\\S]*)\\}$/);\n if (dynExprMatch) {\n return ` style={\\`\\${${dynExprMatch[1]}};${extraCss}\\`}`;\n }\n\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\n .replace(/^\\/+/, '')\n .replace(/^images\\//, '')\n .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(classExpr: string): { 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(classValue: string, styleAttr: string): 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 ? ` class=\"${split.innerClasses.join(' ')}\"` : '';\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 ((node.interactiveStyles && node.interactiveStyles.length > 0) || node.generateElementClass) {\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 ? `background-image:url(${escapeJSX(metadata!.blurHash!)});background-size:cover` : '';\n const blurOnload = hasBlur ? ` onload=\"this.parentElement.style.backgroundImage=''\"` : '';\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 ((node.interactiveStyles && node.interactiveStyles.length > 0) || node.generateElementClass) {\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(\n style,\n node.interactiveStyles as InteractiveStyles | undefined,\n elementClass,\n ctx,\n );\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 // Thread the CMS entry into consumer components. Astro components have\n // isolated scopes, so a component referencing `{{cms.*}}` can't see the\n // page's `entry`/`cms` binding unless we pass it explicitly. The binding is\n // `entry` at the CMS page level and `cms` inside a consumer component, so\n // this also forwards correctly through nested consumers.\n if (ctx.cmsMode && ctx.cmsConsumers?.has(node.component) && !('cms' in (node.props ?? {}))) {\n propParts.push(`cms={${ctx.cmsEntryBinding || 'entry'}}`);\n }\n\n // Instance-level style overrides (+ interactive styles) via element-class CSS.\n // Route them through the same machinery the export uses for hover styles: an\n // UNLAYERED `<style is:global>` rule, which beats Tailwind v4's `@layer\n // utilities` deterministically \u2014 so the instance override wins over the\n // component's base utilities. This mirrors live SSR, which deep-merges the\n // instance style into the component root. (The previous approach appended the\n // override as more utility classes at equal specificity, so CSS output order\n // decided the winner and the override frequently lost.)\n {\n const instanceStyle = node.style as StyleObject | ResponsiveStyleObject | undefined;\n const instanceInteractive = node.interactiveStyles as InteractiveStyles | undefined;\n const hasStyle = !!instanceStyle && hasNonEmptyStyle(instanceStyle);\n const hasInteractive = Array.isArray(instanceInteractive) && instanceInteractive.length > 0;\n\n if ((hasStyle || hasInteractive) && ctx.collectedInteractiveStyles) {\n const elementClass = buildElementClass(ctx, node.label);\n const rules: InteractiveStyles = [];\n if (hasStyle) {\n // Per-breakpoint merge the component's root style UNDER the instance\n // override (mirrors SSR's mergeNodeStyles). This keeps the component's\n // own responsive breakpoint values for properties the instance only sets\n // at `base`, so a base override doesn't leak past tablet/mobile. The\n // merged rule is unlayered, so it fully shadows the component's own\n // (layered) root utilities. `_mapping`/`{{\u2026}}` values carried in from the\n // root are dropped downstream (styleObjectToCSS skips mappings) /\n // stripped here, falling back to the component's own emission.\n const rootStyle = getComponentRootStyle(ctx.globalComponents[node.component]);\n const merged = (rootStyle ? deepMergeStyles(rootStyle, instanceStyle!) : instanceStyle!) as\n | StyleObject\n | ResponsiveStyleObject;\n const cssSafe = stripTemplateExpressionStyle(merged);\n if (hasNonEmptyStyle(cssSafe)) rules.push({ style: cssSafe }); // no prefix/postfix \u2192 `.cls {\u2026}`\n }\n if (hasInteractive) rules.push(...instanceInteractive!); // fold hover/etc. into the same class\n if (rules.length > 0) {\n const existing = ctx.collectedInteractiveStyles.get(elementClass);\n ctx.collectedInteractiveStyles.set(elementClass, existing ? [...existing, ...rules] : rules);\n propParts.push(`class=\"${elementClass}\"`);\n }\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 `${ifExpr}${ind(ctx)}<${name}${propsStr}>\\n${children}${ind(ctx)}</${name}>\\n${emitIfClose(node, ctx)}`;\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 `${ind(ctx)}<slot>\\n${defaultContent}${ind(ctx)}</slot>\\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 ((node.interactiveStyles && node.interactiveStyles.length > 0) || node.generateElementClass) {\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: _styleAttr } = buildClassAndStyleExpression(\n style,\n node.interactiveStyles as InteractiveStyles | undefined,\n elementClass,\n ctx,\n );\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 ((node.interactiveStyles && node.interactiveStyles.length > 0) || node.generateElementClass) {\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(\n style,\n node.interactiveStyles as InteractiveStyles | undefined,\n elementClass,\n ctx,\n );\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?} \u2014 or a coerced string URL\n hrefAttr = ` href={${linkHrefExpr(propRef)}}`;\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={${linkHrefExpr(expr)}}`;\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' ? `\\${${linkHrefExpr(trimmed)}}` : `\\${${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 ((node.interactiveStyles && node.interactiveStyles.length > 0) || node.generateElementClass) {\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 ? `background-image:url(${escapeJSX(metadata.blurHash!)});background-size:cover` : '';\n const blurOnload = hasBlur ? ` onload=\"this.parentElement.style.backgroundImage=''\"` : '';\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)[])\n .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 })\n .join('')\n : '';\n\n return `${ind(ctx)}{${mapSource}.map((${itemAs}, ${indexVar}) => (\\n${children}${ind(ctx)}))}\\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 // Flatten content-collection entries ({ id, data: {...} }) into the flat item\n // shape the templates expect ({{item.field}} \u2192 item.field), and synthesize the\n // `_url`/`_id` meta the CMS data model exposes. Filter/sort above operate on the\n // raw entries (e.data.*); this map runs last so it sees the final set.\n const urlExpr = ctx.collectionUrlExpr?.get(source) ?? `\\`/${source}/\\${e.data.slug ?? e.id}\\``;\n queryChain += `.then(items => items.map((e) => ({ ...e.data, _id: e.id, _url: ${urlExpr} })))`;\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)[])\n .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 })\n .join('')\n : '';\n\n return `${ind(ctx)}{${collectionVar}.map((${itemAs}, ${indexVar}) => (\\n${children}${ind(ctx)}))}\\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 (\n (node.interactiveStyles && (node.interactiveStyles as InteractiveStyles).length > 0) ||\n node.generateElementClass\n ) {\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\n ? responsiveStylesToTailwind(itemStyle, ctx.breakpoints, ctx.responsiveScales)\n : { 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\n ? responsiveStylesToTailwind(activeItemStyle, ctx.breakpoints, ctx.responsiveScales)\n : { 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\n ? responsiveStylesToTailwind(separatorStyle, ctx.breakpoints, ctx.responsiveScales)\n : { 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\n ? responsiveStylesToTailwind(flagStyle, ctx.breakpoints, ctx.responsiveScales)\n : { 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':\n displayText = code.toUpperCase();\n break;\n case 'name':\n displayText = localeConfig.name;\n break;\n default:\n displayText = localeConfig.nativeName;\n 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(\n `${ind(ctx)} <a href=\"${escapeJSX(path)}\"${hreflangAttr}${currentAttr} data-locale=\"${escapeJSX(code)}\"${classAttr}>${linkContent}</a>`,\n );\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' +\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 // Degenerate mapping (no true values): emitIfOpen emitted only a\n // `{/* hidden */}` comment, not a `{cond && (` opener \u2014 close nothing.\n const hasTrueValue = Object.values(ifValue.values).some((v) => v === true);\n if (!hasTrueValue) return '';\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\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 // Construct the regex locally per call: a module-level /g regex carries mutable\n // lastIndex state across calls (the \"every-other-call\" .test() footgun).\n const cmsPattern = /\\{\\{cms\\.([^}]+)\\}\\}/g;\n if (cmsPattern.test(text)) {\n const replaced = text.replace(cmsPattern, (_, 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 ? `(${indexVar} === ${sourceVar}.length - 1)` : `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 // Construct the regex locally per call: a module-level /g regex carries mutable\n // lastIndex state across calls (the \"every-other-call\" .test() footgun).\n const itemPattern = /\\{\\{([^}]+)\\}\\}/g;\n if (itemPattern.test(text)) {\n const replaced = text.replace(itemPattern, (_, 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 { ComponentDefinition, StructuredComponentDefinition, PropDefinition } from '../../shared/types';\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 = tagMatch[0];\n const prefix = tagMatch[1] ?? '';\n const tagName = tagMatch[2] ?? '';\n const attrs = tagMatch[3] ?? '';\n const close = tagMatch[4] ?? '';\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 */\n/** CMS-aware emission options threaded from build-astro. */\nexport interface ComponentCmsOptions {\n /** Names of components that consume the CMS entry (transitive). */\n cmsConsumers?: Set<string>;\n /** Rich-text field names across all collections (for `set:html`). */\n cmsRichTextFields?: Set<string>;\n /** collectionId \u2192 `_url` template expression for flattened lists. */\n collectionUrlExpr?: Map<string, string>;\n}\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 cmsOptions?: ComponentCmsOptions,\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 // A \"CMS consumer\" references {{cms.*}} (transitively). It receives the CMS\n // entry via a `cms` prop and resolves field refs against it (binding 'cms'),\n // mirroring how the CMS template page resolves them against `entry`.\n const isCmsConsumer = cmsOptions?.cmsConsumers?.has(name) ?? false;\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 // Frontmatter sink for collection queries (getCollection) emitted by lists.\n frontmatterLines: [],\n astroImports: new Set<string>(),\n cmsConsumers: cmsOptions?.cmsConsumers,\n collectionUrlExpr: cmsOptions?.collectionUrlExpr,\n ...(isCmsConsumer\n ? {\n cmsMode: true,\n cmsEntryBinding: 'cms',\n cmsWrapFn: 'r',\n cmsRichTextFields: cmsOptions?.cmsRichTextFields,\n }\n : {}),\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 // Consumers always get the `r` resolver (the cms wrap fn) and a `cms` prop.\n const frontmatter = buildFrontmatter(\n name,\n propDefs,\n ctx.imports,\n ctx.dynamicTags,\n ctx.needsI18nResolver || isCmsConsumer ? defaultLocale : undefined,\n ctx.imageImports,\n ctx.astroImports,\n ctx.frontmatterLines,\n isCmsConsumer,\n );\n\n // Build style/script sections\n const styleSection = comp.css ? `\\n<style>\\n${comp.css}\\n</style>\\n` : '';\n const interactiveStyleSection =\n 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 ? buildScriptSection(comp.javascript, comp, propDefs) : '';\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 astroImports?: Set<string>,\n frontmatterLines?: string[],\n isCmsConsumer?: boolean,\n): string {\n const lines: string[] = [];\n\n // Astro API imports (e.g., getCollection) needed by collection-sourced lists\n if (astroImports && astroImports.size > 0) {\n lines.push(`import { ${Array.from(astroImports).sort().join(', ')} } from 'astro:content';`);\n }\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 // CMS consumers receive the current entry as a `cms` prop\n if (isCmsConsumer) {\n lines.push(' cms?: any;');\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 // CMS consumers destructure the entry prop\n if (isCmsConsumer) {\n destructParts.push('cms');\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(\n ` return v[locale] ?? v['${i18nDefaultLocale}'] ?? Object.values(v).find((s: any) => typeof s === 'string' && s !== '') ?? '';`,\n );\n lines.push(` }`);\n lines.push(` return v ?? '';`);\n lines.push(`};`);\n }\n\n // Collection queries emitted by collection-sourced list nodes\n // (e.g. `const blogList = await getCollection('blog')...`).\n if (frontmatterLines && frontmatterLines.length > 0) {\n lines.push('');\n for (const line of frontmatterLines) lines.push(line);\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(_name: string, comp: StructuredComponentDefinition): 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(/^\\s*(const|let|var)\\s+\\{([^}]+)\\}\\s*=\\s*props\\s*;?\\s*$/gm, (match, _keyword, inner) => {\n const names = inner\n .split(',')\n .map((s: string) => s.trim())\n .filter(Boolean);\n if (names.every((n: string) => varNames.includes(n))) return '';\n return match;\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(new RegExp(`^\\\\s*(var|let|const)\\\\s+${name}\\\\s*=[^;]*;?\\\\s*$`, 'gm'), '');\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 ? Object.keys(propDefs).filter((k) => k !== 'children') : 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 ? `[${scriptPaths.map((s) => `\"${s}\"`).join(', ')}]` : '[]';\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 =\n ctx.frontmatterLines && ctx.frontmatterLines.length > 0 ? `\\n${ctx.frontmatterLines.join('\\n')}` : '';\n\n // Generate interactive style block for page-level interactive styles\n const interactiveStyleSection =\n 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 ? `[${scriptPaths.map((s) => `\"${s}\"`).join(', ')}]` : '[]';\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 * Normalize orphan template props for Astro emission.\n *\n * Each Meno component becomes its own `.astro` file. Templates like\n * `{{ctaText}}` are emitted as `{ctaText}` \u2014 a JSX reference to a destructured\n * `Astro.props` variable. If the component's `interface` doesn't declare the\n * prop, the variable isn't in scope and Astro errors at build time.\n *\n * SSR/Next.js handles this at runtime via `processStructure`'s `parentProps`\n * fallback (see templateEngine.ts). Astro can't fall back at runtime \u2014 each\n * .astro file is its own scope \u2014 so we normalize the component graph before\n * emission:\n *\n * 1. For each component, find orphan `{{x}}` refs in its structure (not\n * declared in the interface, not item/cms/page namespaced, not a list\n * loop var) and add them as optional string props with `default: \"\"`.\n *\n * 2. For each component-instance ref `<X />` inside any host's structure,\n * forward each of X's auto-lifted props by writing\n * `props.x = \"{{x}}\"` on the instance \u2014 but ONLY when the host itself\n * already declares `x`. This mirrors the SSR cascade's one-level scope:\n * the cascade fixes the single-step host\u2192child case, never the leap to\n * a grandparent.\n *\n * Multi-level chains (host doesn't have the prop either) gracefully degrade\n * to the lifted default (\"\") instead of failing the build \u2014 same outcome as\n * the SSR cascade for that shape.\n */\n\nimport type { ComponentDefinition, PropDefinition } from '../../shared/types';\n\n// Bare or dotted identifier inside `{{...}}`, with whitespace allowed around\n// the body. Skips anything containing operators, calls, ternaries, etc. \u2014\n// liftable refs are *only* simple prop reads.\nconst BARE_IDENT_BODY = /^\\s*([a-zA-Z_$][a-zA-Z0-9_$]*)(?:\\s*\\.\\s*[a-zA-Z_$][a-zA-Z0-9_$]*)*\\s*$/;\n\n// Namespaces and meta-vars that are never component-instance props.\nconst RESERVED_BASES = new Set(['cms', 'item', 'page', 'itemIndex', 'itemFirst', 'itemLast']);\n\nfunction recordRef(base: string, declared: Set<string>, listVars: Set<string>, out: Set<string>): void {\n if (RESERVED_BASES.has(base)) return;\n if (listVars.has(base)) return;\n if (declared.has(base)) return;\n out.add(base);\n}\n\nfunction findOrphanRefs(value: unknown, declared: Set<string>, listVars: Set<string>, out: Set<string>): void {\n if (value == null) return;\n if (typeof value === 'string') {\n const re = /\\{\\{([^}]+)\\}\\}/g;\n let m: RegExpExecArray | null = re.exec(value);\n while (m !== null) {\n const body = m[1] ?? '';\n m = re.exec(value);\n const idMatch = body.match(BARE_IDENT_BODY);\n if (!idMatch) continue; // expressions, operators, calls \u2014 skip\n recordRef(idMatch[1] ?? '', declared, listVars, out);\n }\n return;\n }\n if (Array.isArray(value)) {\n for (const v of value) findOrphanRefs(v, declared, listVars, out);\n return;\n }\n if (typeof value !== 'object') return;\n const obj = value as Record<string, unknown>;\n\n // Mapping objects (`{ _mapping: true, prop: \"variant\", values: {...} }`)\n // reference a component prop by name. The Astro emitter turns these into\n // bare identifier references like `String(variant) === \"default\"`, so the\n // `prop` field is just as much a binding site as a `{{variant}}` template.\n // Used for style mappings, link mappings, HTML mappings, and `if` boolean\n // mappings \u2014 all share the same shape.\n if (obj._mapping === true && typeof obj.prop === 'string') {\n recordRef(obj.prop, declared, listVars, out);\n // Keep walking \u2014 `values` may contain nested templates too (rare, but\n // not impossible).\n }\n\n // A `list` node introduces a new loop variable into the scope of its\n // children (the template instance). Default name is `item` when\n // `itemAs` is omitted.\n let nextListVars = listVars;\n if (obj.type === 'list') {\n const itemAs = typeof obj.itemAs === 'string' && obj.itemAs ? obj.itemAs : 'item';\n nextListVars = new Set(listVars);\n nextListVars.add(itemAs);\n }\n\n for (const key of Object.keys(obj)) {\n // Don't peek into a nested component instance's `props` \u2014 those refs\n // are resolved in the host's scope, not the target's. We handle them\n // when walking the host itself.\n if (obj.type === 'component' && key === 'props') continue;\n findOrphanRefs(obj[key], declared, nextListVars, out);\n }\n}\n\n/**\n * Walk a host's structure and forward each target component's lifted props\n * from the host's scope. Only forwards props the host itself declares \u2014 see\n * the module docstring for why.\n */\nfunction forwardLiftedPropsOnInstances(\n structure: unknown,\n hostProps: Set<string>,\n liftedByComp: ReadonlyMap<string, ReadonlySet<string>>,\n): void {\n if (structure == null || typeof structure !== 'object') return;\n if (Array.isArray(structure)) {\n for (const s of structure) forwardLiftedPropsOnInstances(s, hostProps, liftedByComp);\n return;\n }\n const obj = structure as Record<string, unknown>;\n if (obj.type === 'component' && typeof obj.component === 'string') {\n const lifted = liftedByComp.get(obj.component);\n if (lifted && lifted.size > 0) {\n const props = (obj.props as Record<string, unknown> | undefined) ?? {};\n let changed = false;\n for (const propName of lifted) {\n if (propName in props) continue;\n if (!hostProps.has(propName)) continue;\n props[propName] = `{{${propName}}}`;\n changed = true;\n }\n if (changed) obj.props = props;\n }\n }\n for (const key of Object.keys(obj)) {\n forwardLiftedPropsOnInstances(obj[key], hostProps, liftedByComp);\n }\n}\n\n/**\n * Produce a normalized copy of the component map suitable for Astro emission.\n * The input map is not mutated.\n */\nexport function normalizeOrphanTemplateProps(\n components: Record<string, ComponentDefinition>,\n): Record<string, ComponentDefinition> {\n const next: Record<string, ComponentDefinition> = {};\n const liftedByComp = new Map<string, Set<string>>();\n\n // Pass 1: clone every component and lift orphan refs onto its interface.\n for (const [name, def] of Object.entries(components)) {\n // structuredClone preserves Map/Set/Date but plain JSON deep-clone is\n // enough here \u2014 component defs are JSON-serializable by construction.\n const cloned = structuredClone(def) as ComponentDefinition;\n next[name] = cloned;\n\n const comp = cloned.component;\n if (!comp?.structure) continue;\n const iface = (comp.interface ?? {}) as Record<string, PropDefinition>;\n const declared = new Set(Object.keys(iface));\n const orphans = new Set<string>();\n findOrphanRefs(comp.structure, declared, new Set(), orphans);\n if (orphans.size === 0) continue;\n\n const augmented: Record<string, PropDefinition> = { ...iface };\n for (const propName of orphans) {\n augmented[propName] = { type: 'string', default: '' } as PropDefinition;\n }\n comp.interface = augmented;\n liftedByComp.set(name, orphans);\n }\n\n // Pass 2: forward lifted props from each host where the host declares the\n // same prop. Mutates the cloned structures in `next`.\n for (const [, hostDef] of Object.entries(next)) {\n const comp = hostDef.component;\n if (!comp?.structure) continue;\n const hostProps = new Set(Object.keys(comp.interface ?? {}));\n forwardLiftedPropsOnInstances(comp.structure, hostProps, liftedByComp);\n }\n\n return next;\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 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 * Slug token baked into the SSR metadata pass's dummy URL (build-astro renders\n * each CMS template once with this stand-in slug to collect meta). The emitter\n * swaps it for the per-entry slug expression so canonical/og:url are correct.\n */\nexport const CMS_SLUG_PLACEHOLDER = '__placeholder__';\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 /** Components that consume the CMS entry (thread `cms={entry}` into them) */\n cmsConsumers?: Set<string>;\n /** collectionId \u2192 `_url` template expression for flattened collection lists */\n collectionUrlExpr?: Map<string, string>;\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 =\n 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(` }`, ` return paths;`, `}`, ``, `const { entry, locale = '${defaultLocale}' } = Astro.props;`);\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 // Frontmatter sink for any page-level collection-sourced lists.\n frontmatterLines: [],\n astroImports: new Set<string>(),\n cmsConsumers: options.cmsConsumers,\n collectionUrlExpr: options.collectionUrlExpr,\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 ? `[${scriptPaths.map((s) => `\"${s}\"`).join(', ')}]` : '[]';\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 slugField = cmsSchema.slugField || 'slug';\n const escapedMeta = escapeTemplateLiteral(meta)\n .replace(/\\{\\{cms\\.([^}]+)\\}\\}/g, (_, fieldPath) => `\\${${wrapFn}(${binding}.data.${fieldPath.trim()})}`)\n // Replace the metadata-pass stand-in slug with the per-entry slug so\n // canonical/og:url point at the real page instead of \"__placeholder__\".\n .replace(new RegExp(CMS_SLUG_PLACEHOLDER, 'g'), `\\${${wrapFn}(${binding}.data.${slugField}) || ${binding}.id}`);\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 // Page-level collection queries emitted by collection-sourced list nodes\n // (getCollection import is already present in importLines above).\n const extraFrontmatter =\n ctx.frontmatterLines && ctx.frontmatterLines.length > 0 ? `\\n${ctx.frontmatterLines.join('\\n')}` : '';\n\n // Generate interactive style block for page-level interactive styles\n const interactiveStyleSection =\n 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}${extraFrontmatter}\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 ? `[${scriptPaths.map((s) => `\"${s}\"`).join(', ')}]` : '[]';\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 { StyleObject, ResponsiveStyleObject, StyleMapping } 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' && value !== null && '_mapping' in value && (value as StyleMapping)._mapping === true\n );\n}\n\nfunction isResponsiveStyle(style: StyleObject | ResponsiveStyleObject): 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 = 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 } => typeof bp.value === 'number' && bp.value > 0)\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(responsiveScales, property as CSSPropertyType, bpName);\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 * 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 {\n ComponentService,\n type ComponentInfo,\n type ComponentLoader,\n type ComponentWriter,\n type ComponentServiceFs,\n} 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\n// FileSystemPageProvider was retired with the bespoke JSON renderer (the editor is\n// meno-astro-only; AstroPageProvider is the live page provider). FileSystemCMSProvider\n// remains: the JSON\u2192astro export (build-astro.ts) still reads JSON CMS items through it.\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 {\n handleCollectionsRoute,\n handleCollectionSchemaRoute,\n handleItemsRoute,\n handleItemRoute,\n} from './routes/api/cms';\n\n// Route utilities\nexport { jsonResponse, errorResponse } from './routes/api/shared';\nexport { createCorsHeaders, handleCorsPreflight } from './middleware/cors';\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// Draft page store (in-memory unsaved page versions for live preview)\nexport { DraftPageStore } from './draftPageStore';\n\n// Project context\nexport * from './projectContext';\n\n// File watcher\nexport { FileWatcherService } from './services/fileWatcherService';\n// Recursive watch shim that also covers subdirs created AFTER the watch began (Bun's native\n// `fs.watch({recursive:true})` does not \u2014 see fileWatcher.ts). Reused by the studio Astro\n// dev-server's workdir mirror so a new collection/page dir live-syncs under Bun.\nexport { watchRecursive } from './fileWatcher';\n\n// Migration\nexport { migrateTemplatesDirectory } from './migrateTemplates';\n\n// Astro export\nexport { buildAstroProject } from '../../build-astro';\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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,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA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",
6
+ "names": ["path", "DEFAULT_OPTIONS", "log", "writeFile", "join", "inspect", "isBun", "fetch", "server", "isBun", "path", "log", "log", "log", "schema", "validateJS", "path", "path", "isSlotContent", "templateCtx", "nodeAttributes", "utilityClasses", "elementClass", "attrClassName", "attrs", "classAttr", "path", "escapeHtml", "getNestedValue", "path", "escapeHtml", "getNestedValue", "debounce", "escapeHtml", "hashContent", "hashContent", "response", "response", "escapeHtml", "safeJsonForScript", "existsSync", "readdirSync", "join", "path", "path", "existsSync", "readdirSync", "join", "rename", "join", "existsSync", "mkdirSync", "readdirSync", "rmdirSync", "join", "existsSync", "readdirSync", "writeFile", "mkdirSync", "rename", "rmdirSync", "path", "path", "existsSync", "readdirSync", "mkdirSync", "join", "log", "loadJSONFile", "existsSync", "readdirSync", "join", "writeFile", "mkdirSync", "readFile", "path", "path", "existsSync", "readdirSync", "basename", "dirname", "join", "readdirSync", "join", "existsSync", "dirname", "basename", "path", "existsSync", "join", "join", "existsSync", "existsSync", "readdirSync", "mkdirSync", "statSync", "writeFile", "join", "isResponsiveStyle", "sanitized", "localizeHref", "isStyleMapping", "isHtmlMapping", "isResponsiveStyle", "mappings", "DEFAULT_SIZES", "path", "out", "escapeTemplateLiteral", "escapeJSX", "layoutImportPath", "path", "escapeTemplateLiteral", "escapeJSX", "componentImportPath", "locale", "layoutImportPath", "path", "isStyleMapping", "isResponsiveStyle", "hashContent", "existsSync", "mkdirSync", "join", "readdirSync", "statSync", "existsSync", "readdirSync", "join", "escapeTemplateLiteral", "mkdirSync", "isCMSPage", "hashContent", "writeFile"]
7
7
  }