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
@@ -2,7 +2,6 @@ import { test, expect, describe, beforeEach } from 'bun:test';
2
2
  import { renderPage } from './ComponentRenderer';
3
3
  import { ComponentBuilder } from './ComponentBuilder';
4
4
  import { ComponentRegistry } from '../componentRegistry';
5
- import { ElementRegistry } from '../elementRegistry';
6
5
  import { createMockHighlightManager, createMockElementRegistry, createMockComponentNode } from '../../test-utils';
7
6
  import type { ComponentNode } from '../../shared/types';
8
7
  import { NODE_TYPE } from '../../shared/constants';
@@ -14,9 +13,9 @@ describe('ComponentRenderer', () => {
14
13
 
15
14
  beforeEach(() => {
16
15
  componentRegistry = new ComponentRegistry();
17
- const highlightManager = createMockHighlightManager();
16
+ const _highlightManager = createMockHighlightManager();
18
17
  const elementRegistry = createMockElementRegistry();
19
-
18
+
20
19
  componentBuilder = new ComponentBuilder({
21
20
  componentRegistry,
22
21
  elementRegistry,
@@ -172,4 +171,3 @@ describe('ComponentRenderer', () => {
172
171
  });
173
172
  });
174
173
  });
175
-
@@ -3,12 +3,12 @@
3
3
  * Provides rendering utilities for pages including error boundaries.
4
4
  */
5
5
 
6
- import { createElement as h } from "react";
7
- import type { ReactElement } from "react";
8
- import { ComponentBuilder } from "./ComponentBuilder";
9
- import { ErrorBoundary } from "../ErrorBoundary";
10
- import type { ComponentNode, I18nConfig, CMSItem } from "../../shared/types";
11
- import type { TemplateContext } from "../../shared/types/cms";
6
+ import { createElement as h } from 'react';
7
+ import type { ReactElement } from 'react';
8
+ import type { ComponentBuilder } from './ComponentBuilder';
9
+ import { ErrorBoundary } from '../ErrorBoundary';
10
+ import type { ComponentNode, I18nConfig, CMSItem } from '../../shared/types';
11
+ import type { TemplateContext } from '../../shared/types/cms';
12
12
 
13
13
  /**
14
14
  * Options for rendering a page
@@ -38,13 +38,13 @@ export interface RenderPageOptions {
38
38
 
39
39
  /**
40
40
  * Renders a page with ErrorBoundary
41
- *
41
+ *
42
42
  * This function wraps the component tree in an ErrorBoundary to catch and handle
43
43
  * rendering errors gracefully. It also handles null/empty trees by returning null.
44
- *
44
+ *
45
45
  * @param options - Rendering options including tree, path, viewport width, and builder
46
46
  * @returns ReactElement representing the rendered page, or null if tree is null
47
- *
47
+ *
48
48
  * @example
49
49
  * ```typescript
50
50
  * const result = renderPage({
@@ -56,35 +56,48 @@ export interface RenderPageOptions {
56
56
  * ```
57
57
  */
58
58
  export function renderPage(options: RenderPageOptions): ReactElement | null {
59
- const { tree, currentPath, viewportWidth, componentBuilder, locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap, templateContext } = options;
60
-
61
- if (!tree) return null;
62
-
63
- return h(ErrorBoundary, {
64
- level: 'page',
65
- onError: (error, errorInfo) => {
66
- console.error('Page rendering error:', {
67
- path: currentPath,
68
- error: error.message,
69
- stack: error.stack,
70
- componentStack: errorInfo?.componentStack,
71
- });
72
- },
73
- }, componentBuilder.buildComponent({
74
- node: tree,
75
- key: 0,
76
- customProps: {},
77
- elementPath: [0],
78
- parentComponentName: null,
59
+ const {
60
+ tree,
61
+ currentPath,
79
62
  viewportWidth,
80
- componentContext: null,
63
+ componentBuilder,
81
64
  locale,
82
65
  i18nConfig,
83
66
  cmsContext,
84
67
  cmsLocale,
85
68
  collectionItemsMap,
86
- templateContext: templateContext ?? null
87
- }));
88
- }
69
+ templateContext,
70
+ } = options;
89
71
 
72
+ if (!tree) return null;
90
73
 
74
+ return h(
75
+ ErrorBoundary,
76
+ {
77
+ level: 'page',
78
+ onError: (error, errorInfo) => {
79
+ console.error('Page rendering error:', {
80
+ path: currentPath,
81
+ error: error.message,
82
+ stack: error.stack,
83
+ componentStack: errorInfo?.componentStack,
84
+ });
85
+ },
86
+ },
87
+ componentBuilder.buildComponent({
88
+ node: tree,
89
+ key: 0,
90
+ customProps: {},
91
+ elementPath: [0],
92
+ parentComponentName: null,
93
+ viewportWidth,
94
+ componentContext: null,
95
+ locale,
96
+ i18nConfig,
97
+ cmsContext,
98
+ cmsLocale,
99
+ collectionItemsMap,
100
+ templateContext: templateContext ?? null,
101
+ }),
102
+ );
103
+ }
@@ -3,30 +3,39 @@
3
3
  * Handles rendering of embed nodes (HTML content like SVGs, rich text, etc.)
4
4
  */
5
5
 
6
- import { createElement as h } from "react";
7
- import type { ReactElement } from "react";
8
- import type { EmbedNode, StyleObject, ResponsiveStyleObject, InteractiveStyles } from "../../../shared/types";
9
- import { extractAttributesFromNode } from "../../../shared/attributeNodeUtils";
10
- import { responsiveStylesToClasses } from "../../../shared/utilityClassMapper";
11
- import { getCachedResponsiveScalesConfig } from "../../responsiveStyleResolver";
12
- import { pathToString } from "../../../shared/pathArrayUtils";
13
- import { generateElementClassName, type ElementClassContext } from "../../../shared/elementClassName";
14
- import { InteractiveStylesRegistry } from "../../InteractiveStylesRegistry";
15
- import { hasInteractiveStyleMappings, extractInteractiveStyleMappings, resolveExtractedMappings } from "../../../shared/interactiveStyleMappings";
16
- import { UtilityClassCollector } from "../../styles/UtilityClassCollector";
17
- import DOMPurify from "isomorphic-dompurify";
18
- import { inlineSvgStyleRules } from "../../../shared/inlineSvgStyleRules";
19
- import type { ElementRegistry } from "../../elementRegistry";
20
- import type { BuilderContext } from "./types";
21
- import { hasItemTemplates, processItemTemplate, processItemPropsTemplate, type ValueResolver } from "../../../shared/itemTemplateUtils";
22
- import { resolveI18nValue, DEFAULT_I18N_CONFIG } from "../../../shared/i18n";
23
- import { processCMSTemplate } from "../cmsTemplateProcessor";
6
+ import { createElement as h } from 'react';
7
+ import type { ReactElement } from 'react';
8
+ import type { EmbedNode, StyleObject, ResponsiveStyleObject, InteractiveStyles } from '../../../shared/types';
9
+ import { extractAttributesFromNode } from '../../../shared/attributeNodeUtils';
10
+ import { responsiveStylesToClasses } from '../../../shared/utilityClassMapper';
11
+ import { getCachedResponsiveScalesConfig } from '../../responsiveStyleResolver';
12
+ import { pathToString } from '../../../shared/pathArrayUtils';
13
+ import { generateElementClassName, type ElementClassContext } from '../../../shared/elementClassName';
14
+ import { InteractiveStylesRegistry } from '../../InteractiveStylesRegistry';
15
+ import {
16
+ hasInteractiveStyleMappings,
17
+ extractInteractiveStyleMappings,
18
+ resolveExtractedMappings,
19
+ } from '../../../shared/interactiveStyleMappings';
20
+ import { UtilityClassCollector } from '../../styles/UtilityClassCollector';
21
+ import DOMPurify from 'isomorphic-dompurify';
22
+ import { inlineSvgStyleRules } from '../../../shared/inlineSvgStyleRules';
23
+ import type { ElementRegistry } from '../../elementRegistry';
24
+ import type { BuilderContext } from './types';
25
+ import {
26
+ hasItemTemplates,
27
+ processItemTemplate,
28
+ processItemPropsTemplate,
29
+ type ValueResolver,
30
+ } from '../../../shared/itemTemplateUtils';
31
+ import { resolveI18nValue, DEFAULT_I18N_CONFIG } from '../../../shared/i18n';
32
+ import { processCMSTemplate } from '../cmsTemplateProcessor';
24
33
 
25
34
  export interface EmbedBuilderDeps {
26
35
  elementRegistry: ElementRegistry;
27
36
  getEffectiveParentComponentName: (
28
37
  componentContext: string | null,
29
- parentComponentName: string | null
38
+ parentComponentName: string | null,
30
39
  ) => string | null;
31
40
  /** Optional getter for current page name (for interactive styles class generation) */
32
41
  getCurrentPageName?: () => string;
@@ -40,19 +49,200 @@ export interface EmbedBuilderDeps {
40
49
  * Script tags and event handlers are still removed for security
41
50
  */
42
51
  const SANITIZE_CONFIG = {
43
- ALLOWED_TAGS: ['svg', 'path', 'circle', 'rect', 'line', 'polyline', 'polygon', 'g', 'text', 'tspan', 'image', 'defs', 'use', 'linearGradient', 'radialGradient', 'stop', 'clipPath', 'mask', 'pattern', 'marker', 'symbol', 'a', 'div', 'span', 'p', 'br', 'button', 'img', 'iframe', 'video', 'audio', 'source', 'canvas', 'b', 'i', 'u', 'strong', 'em', 'sub', 'sup', 'mark', 's', 'small', 'del', 'ins', 'q', 'abbr', 'code', 'pre', 'blockquote', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'style', 'animate', 'animateTransform', 'animateMotion', 'set', 'filter', 'feGaussianBlur', 'feOffset', 'feMerge', 'feMergeNode', 'feColorMatrix', 'feComposite', 'feFlood', 'feMorphology', 'feBlend', 'feDropShadow', 'feTurbulence', 'feDisplacementMap', 'foreignObject'],
44
- ALLOWED_ATTR: ['class', 'id', 'style', 'width', 'height', 'viewBox', 'xmlns', 'xmlns:xlink', 'xlink:href', 'fill', 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin', 'stroke-dasharray', 'stroke-dashoffset', 'd', 'cx', 'cy', 'r', 'x', 'y', 'x1', 'y1', 'x2', 'y2', 'points', 'href', 'src', 'alt', 'target', 'rel', 'data-*', 'aria-*', 'transform', 'opacity', 'fill-opacity', 'fill-rule', 'clip-rule', 'clip-path', 'clipPathUnits', 'mask', 'mask-type', 'maskUnits', 'maskContentUnits', 'patternUnits', 'patternContentUnits', 'patternTransform', 'gradientUnits', 'gradientTransform', 'spreadMethod', 'preserveAspectRatio', 'marker-start', 'marker-mid', 'marker-end', 'markerUnits', 'markerWidth', 'markerHeight', 'refX', 'refY', 'orient', 'paint-order', 'vector-effect', 'filter', 'filterUnits', 'primitiveUnits', 'in', 'in2', 'result', 'stdDeviation', 'flood-color', 'flood-opacity', 'stroke-opacity', 'font-size', 'font-family', 'font-weight', 'font-style', 'text-anchor', 'dominant-baseline', 'offset', 'stop-color', 'stop-opacity', 'frameborder', 'allowfullscreen', 'allow', 'title', 'attributeName', 'values', 'dur', 'begin', 'end', 'repeatCount', 'repeatDur', 'keyTimes', 'keySplines', 'calcMode', 'from', 'to', 'by', 'additive', 'accumulate', 'type', 'rotate', 'keyPoints', 'path'],
45
- KEEP_CONTENT: true
52
+ ALLOWED_TAGS: [
53
+ 'svg',
54
+ 'path',
55
+ 'circle',
56
+ 'rect',
57
+ 'line',
58
+ 'polyline',
59
+ 'polygon',
60
+ 'g',
61
+ 'text',
62
+ 'tspan',
63
+ 'image',
64
+ 'defs',
65
+ 'use',
66
+ 'linearGradient',
67
+ 'radialGradient',
68
+ 'stop',
69
+ 'clipPath',
70
+ 'mask',
71
+ 'pattern',
72
+ 'marker',
73
+ 'symbol',
74
+ 'a',
75
+ 'div',
76
+ 'span',
77
+ 'p',
78
+ 'br',
79
+ 'button',
80
+ 'img',
81
+ 'iframe',
82
+ 'video',
83
+ 'audio',
84
+ 'source',
85
+ 'canvas',
86
+ 'b',
87
+ 'i',
88
+ 'u',
89
+ 'strong',
90
+ 'em',
91
+ 'sub',
92
+ 'sup',
93
+ 'mark',
94
+ 's',
95
+ 'small',
96
+ 'del',
97
+ 'ins',
98
+ 'q',
99
+ 'abbr',
100
+ 'code',
101
+ 'pre',
102
+ 'blockquote',
103
+ 'ul',
104
+ 'ol',
105
+ 'li',
106
+ 'h1',
107
+ 'h2',
108
+ 'h3',
109
+ 'h4',
110
+ 'h5',
111
+ 'h6',
112
+ 'style',
113
+ 'animate',
114
+ 'animateTransform',
115
+ 'animateMotion',
116
+ 'set',
117
+ 'filter',
118
+ 'feGaussianBlur',
119
+ 'feOffset',
120
+ 'feMerge',
121
+ 'feMergeNode',
122
+ 'feColorMatrix',
123
+ 'feComposite',
124
+ 'feFlood',
125
+ 'feMorphology',
126
+ 'feBlend',
127
+ 'feDropShadow',
128
+ 'feTurbulence',
129
+ 'feDisplacementMap',
130
+ 'foreignObject',
131
+ ],
132
+ ALLOWED_ATTR: [
133
+ 'class',
134
+ 'id',
135
+ 'style',
136
+ 'width',
137
+ 'height',
138
+ 'viewBox',
139
+ 'xmlns',
140
+ 'xmlns:xlink',
141
+ 'xlink:href',
142
+ 'fill',
143
+ 'stroke',
144
+ 'stroke-width',
145
+ 'stroke-linecap',
146
+ 'stroke-linejoin',
147
+ 'stroke-dasharray',
148
+ 'stroke-dashoffset',
149
+ 'd',
150
+ 'cx',
151
+ 'cy',
152
+ 'r',
153
+ 'x',
154
+ 'y',
155
+ 'x1',
156
+ 'y1',
157
+ 'x2',
158
+ 'y2',
159
+ 'points',
160
+ 'href',
161
+ 'src',
162
+ 'alt',
163
+ 'target',
164
+ 'rel',
165
+ 'data-*',
166
+ 'aria-*',
167
+ 'transform',
168
+ 'opacity',
169
+ 'fill-opacity',
170
+ 'fill-rule',
171
+ 'clip-rule',
172
+ 'clip-path',
173
+ 'clipPathUnits',
174
+ 'mask',
175
+ 'mask-type',
176
+ 'maskUnits',
177
+ 'maskContentUnits',
178
+ 'patternUnits',
179
+ 'patternContentUnits',
180
+ 'patternTransform',
181
+ 'gradientUnits',
182
+ 'gradientTransform',
183
+ 'spreadMethod',
184
+ 'preserveAspectRatio',
185
+ 'marker-start',
186
+ 'marker-mid',
187
+ 'marker-end',
188
+ 'markerUnits',
189
+ 'markerWidth',
190
+ 'markerHeight',
191
+ 'refX',
192
+ 'refY',
193
+ 'orient',
194
+ 'paint-order',
195
+ 'vector-effect',
196
+ 'filter',
197
+ 'filterUnits',
198
+ 'primitiveUnits',
199
+ 'in',
200
+ 'in2',
201
+ 'result',
202
+ 'stdDeviation',
203
+ 'flood-color',
204
+ 'flood-opacity',
205
+ 'stroke-opacity',
206
+ 'font-size',
207
+ 'font-family',
208
+ 'font-weight',
209
+ 'font-style',
210
+ 'text-anchor',
211
+ 'dominant-baseline',
212
+ 'offset',
213
+ 'stop-color',
214
+ 'stop-opacity',
215
+ 'frameborder',
216
+ 'allowfullscreen',
217
+ 'allow',
218
+ 'title',
219
+ 'attributeName',
220
+ 'values',
221
+ 'dur',
222
+ 'begin',
223
+ 'end',
224
+ 'repeatCount',
225
+ 'repeatDur',
226
+ 'keyTimes',
227
+ 'keySplines',
228
+ 'calcMode',
229
+ 'from',
230
+ 'to',
231
+ 'by',
232
+ 'additive',
233
+ 'accumulate',
234
+ 'type',
235
+ 'rotate',
236
+ 'keyPoints',
237
+ 'path',
238
+ ],
239
+ KEEP_CONTENT: true,
46
240
  };
47
241
 
48
242
  /**
49
243
  * Build an embed node
50
244
  */
51
- export function buildEmbed(
52
- node: EmbedNode,
53
- ctx: BuilderContext,
54
- deps: EmbedBuilderDeps
55
- ): ReactElement {
245
+ export function buildEmbed(node: EmbedNode, ctx: BuilderContext, deps: EmbedBuilderDeps): ReactElement {
56
246
  const { key, elementPath, parentComponentName, componentContext, componentRootPath, cmsItemIndexPath } = ctx;
57
247
 
58
248
  // Process templates in html property before sanitization (matching SSR behavior)
@@ -87,7 +277,7 @@ export function buildEmbed(
87
277
  const extractedAttributes = extractAttributesFromNode(node as any);
88
278
 
89
279
  // Build embed node props with all features
90
- const embedProps: Record<string, any> = {
280
+ const embedProps: Record<string, unknown> = {
91
281
  key,
92
282
  'data-element-path': pathToString(elementPath),
93
283
  'data-embed-node': 'true',
@@ -103,7 +293,7 @@ export function buildEmbed(
103
293
  }
104
294
  }
105
295
  },
106
- dangerouslySetInnerHTML: { __html: sanitizedHtml }
296
+ dangerouslySetInnerHTML: { __html: sanitizedHtml },
107
297
  };
108
298
 
109
299
  // Add CMS item index path for elements inside CMS lists
@@ -112,7 +302,7 @@ export function buildEmbed(
112
302
  }
113
303
 
114
304
  // Start building className
115
- let classNames: string[] = ['oem'];
305
+ const classNames: string[] = ['oem'];
116
306
 
117
307
  // Convert embed styles to utility classes
118
308
  if (node.style) {
@@ -128,16 +318,15 @@ export function buildEmbed(
128
318
  processedStyle = processItemPropsTemplate(
129
319
  node.style as Record<string, unknown>,
130
320
  ctx.templateContext,
131
- i18nResolver
321
+ i18nResolver,
132
322
  ) as StyleObject | ResponsiveStyleObject;
133
323
  }
134
324
  const scales = getCachedResponsiveScalesConfig();
135
- const fluidActive =
136
- scales?.enabled === true && scales?.mode === 'fluid';
137
- const utilityClasses = responsiveStylesToClasses(
138
- processedStyle as StyleObject | ResponsiveStyleObject,
139
- { fluidActive, responsiveScales: scales ?? undefined }
140
- );
325
+ const fluidActive = scales?.enabled === true && scales?.mode === 'fluid';
326
+ const utilityClasses = responsiveStylesToClasses(processedStyle as StyleObject | ResponsiveStyleObject, {
327
+ fluidActive,
328
+ responsiveScales: scales ?? undefined,
329
+ });
141
330
  UtilityClassCollector.collect(utilityClasses);
142
331
  classNames.push(...utilityClasses);
143
332
  }
@@ -150,11 +339,10 @@ export function buildEmbed(
150
339
  if ((nodeInteractiveStyles && nodeInteractiveStyles.length > 0) || nodeGenerateElementClass) {
151
340
  // Determine file type and name for element class generation
152
341
  const useComponentContext = Boolean(componentContext);
153
- const fileType = useComponentContext ? 'component' : (deps.getCurrentFileType?.() || 'page');
154
- const fileName = useComponentContext ? componentContext! : (deps.getCurrentPageName?.() || 'page');
155
- const pathForClass = useComponentContext && componentRootPath
156
- ? elementPath.slice(componentRootPath.length)
157
- : elementPath;
342
+ const fileType = useComponentContext ? 'component' : deps.getCurrentFileType?.() || 'page';
343
+ const fileName = useComponentContext ? componentContext! : deps.getCurrentPageName?.() || 'page';
344
+ const pathForClass =
345
+ useComponentContext && componentRootPath ? elementPath.slice(componentRootPath.length) : elementPath;
158
346
 
159
347
  const elementClassCtx: ElementClassContext = {
160
348
  fileType,
@@ -186,12 +374,11 @@ export function buildEmbed(
186
374
  for (const rule of nodeInteractiveStyles) {
187
375
  if (rule.previewProp && ctx.componentResolvedProps[rule.previewProp] === true) {
188
376
  const previewScales = getCachedResponsiveScalesConfig();
189
- const previewFluidActive =
190
- previewScales?.enabled === true && previewScales?.mode === 'fluid';
191
- const styleClasses = responsiveStylesToClasses(
192
- rule.style as StyleObject | ResponsiveStyleObject,
193
- { fluidActive: previewFluidActive, responsiveScales: previewScales ?? undefined }
194
- );
377
+ const previewFluidActive = previewScales?.enabled === true && previewScales?.mode === 'fluid';
378
+ const styleClasses = responsiveStylesToClasses(rule.style as StyleObject | ResponsiveStyleObject, {
379
+ fluidActive: previewFluidActive,
380
+ responsiveScales: previewScales ?? undefined,
381
+ });
195
382
  UtilityClassCollector.collect(styleClasses);
196
383
  previewClasses.push(...styleClasses);
197
384
  }
@@ -208,9 +395,9 @@ export function buildEmbed(
208
395
  // would be spread onto the React element below and override the className that
209
396
  // holds the utility classes derived from node.style.
210
397
  if ('class' in extractedAttributes || 'className' in extractedAttributes) {
211
- const attrClass = ((extractedAttributes as Record<string, unknown>).class
212
- ?? (extractedAttributes as Record<string, unknown>).className
213
- ?? '') as string;
398
+ const attrClass = ((extractedAttributes as Record<string, unknown>).class ??
399
+ (extractedAttributes as Record<string, unknown>).className ??
400
+ '') as string;
214
401
  if (attrClass) {
215
402
  classNames.push(...attrClass.split(/\s+/));
216
403
  }
@@ -231,9 +418,10 @@ export function buildEmbed(
231
418
  const i18nResolver: ValueResolver | undefined = effectiveLocale
232
419
  ? (value: unknown) => resolveI18nValue(value, effectiveLocale, config)
233
420
  : undefined;
234
- processedAttributes = processItemPropsTemplate(
235
- extractedAttributes, ctx.templateContext, i18nResolver
236
- ) as Record<string, string | number | boolean>;
421
+ processedAttributes = processItemPropsTemplate(extractedAttributes, ctx.templateContext, i18nResolver) as Record<
422
+ string,
423
+ string | number | boolean
424
+ >;
237
425
  }
238
426
 
239
427
  // Add extracted attributes (like class, id, data-*, aria-*, etc.)
@@ -3,25 +3,22 @@
3
3
  * Handles rendering of Link components with navigation and prefetching
4
4
  */
5
5
 
6
- import { createElement as h } from "react";
7
- import type { ReactElement } from "react";
8
- import { navigateTo } from "../../navigation";
9
- import { pathToString } from "../../../shared/pathArrayUtils";
10
- import type { ElementRegistry } from "../../elementRegistry";
11
- import type { PrefetchService } from "../../services/PrefetchService";
12
- import type { PrefetchStrategy } from "../../../shared/types/prefetch";
13
- import type { BuilderContext, BuildResult, BuildChildrenContext } from "./types";
6
+ import { createElement as h } from 'react';
7
+ import type { ReactElement } from 'react';
8
+ import { navigateTo } from '../../navigation';
9
+ import { pathToString } from '../../../shared/pathArrayUtils';
10
+ import type { ElementRegistry } from '../../elementRegistry';
11
+ import type { PrefetchService } from '../../services/PrefetchService';
12
+ import type { PrefetchStrategy } from '../../../shared/types/prefetch';
13
+ import type { BuilderContext, BuildResult, BuildChildrenContext } from './types';
14
14
 
15
15
  export interface LinkBuilderDeps {
16
16
  elementRegistry: ElementRegistry;
17
17
  prefetchService?: PrefetchService;
18
- buildChildren: (
19
- children: unknown,
20
- ctx: BuildChildrenContext
21
- ) => BuildResult;
18
+ buildChildren: (children: unknown, ctx: BuildChildrenContext) => BuildResult;
22
19
  getEffectiveParentComponentName: (
23
20
  componentContext: string | null,
24
- parentComponentName: string | null
21
+ parentComponentName: string | null,
25
22
  ) => string | null;
26
23
  }
27
24
 
@@ -32,12 +29,25 @@ export function buildLink(
32
29
  props: Record<string, unknown>,
33
30
  children: unknown,
34
31
  ctx: BuilderContext,
35
- deps: LinkBuilderDeps
32
+ deps: LinkBuilderDeps,
36
33
  ): ReactElement {
37
34
  const {
38
- key, elementPath, parentComponentName, viewportWidth, componentContext, componentRootPath,
39
- locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap,
40
- itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps
35
+ key,
36
+ elementPath,
37
+ parentComponentName,
38
+ viewportWidth,
39
+ componentContext,
40
+ componentRootPath,
41
+ locale,
42
+ i18nConfig,
43
+ cmsContext,
44
+ cmsLocale,
45
+ collectionItemsMap,
46
+ itemContext,
47
+ cmsItemIndexPath,
48
+ cmsListPaths,
49
+ templateContext,
50
+ componentResolvedProps,
41
51
  } = ctx;
42
52
 
43
53
  const { to, prefetch: prefetchAttr, ...restProps } = props;
@@ -47,7 +57,7 @@ export function buildLink(
47
57
  const effectiveParentComponentName = deps.getEffectiveParentComponentName(componentContext, parentComponentName);
48
58
 
49
59
  // Navigation click handler
50
- const navigationOnClick = (e: any) => {
60
+ const navigationOnClick = (e: { preventDefault: () => void }) => {
51
61
  e.preventDefault();
52
62
  if (typeof to === 'string' && to) {
53
63
  navigateTo(to);
@@ -101,36 +111,53 @@ export function buildLink(
101
111
  }
102
112
  }
103
113
 
104
- return h('a', {
105
- ...linkProps as Record<string, any>,
106
- ref: (el: HTMLElement | null): void => {
107
- const pathKey = pathToString(elementPath);
114
+ return h(
115
+ 'a',
116
+ {
117
+ ...(linkProps as Record<string, unknown>),
118
+ ref: (el: HTMLElement | null): void => {
119
+ const pathKey = pathToString(elementPath);
108
120
 
109
- // Cleanup when element is removed from DOM
110
- if (!el) {
111
- deps.prefetchService?.unobserveLinkByPath(pathKey);
112
- }
121
+ // Cleanup when element is removed from DOM
122
+ if (!el) {
123
+ deps.prefetchService?.unobserveLinkByPath(pathKey);
124
+ }
113
125
 
114
- deps.elementRegistry.register(elementPath, el, effectiveParentComponentName, false);
126
+ deps.elementRegistry.register(elementPath, el, effectiveParentComponentName, false);
115
127
 
116
- // Handle viewport strategy - observe link when it enters DOM
117
- if (el && deps.prefetchService?.isEnabled() && isInternalLink) {
118
- const strategy = (prefetchAttr as PrefetchStrategy) || deps.prefetchService.getDefaultStrategy();
119
- if (strategy === 'viewport') {
120
- deps.prefetchService.observeLink(el as HTMLAnchorElement, pathKey);
128
+ // Handle viewport strategy - observe link when it enters DOM
129
+ if (el && deps.prefetchService?.isEnabled() && isInternalLink) {
130
+ const strategy = (prefetchAttr as PrefetchStrategy) || deps.prefetchService.getDefaultStrategy();
131
+ if (strategy === 'viewport') {
132
+ deps.prefetchService.observeLink(el as HTMLAnchorElement, pathKey);
133
+ }
121
134
  }
122
- }
135
+ },
136
+ onClick: navigationOnClick,
137
+ ...prefetchHandlers,
138
+ style: {
139
+ textDecoration: 'none',
140
+ color: '#0070f3',
141
+ cursor: 'pointer',
142
+ ...(props.style && typeof props.style === 'object' ? props.style : {}),
143
+ },
123
144
  },
124
- onClick: navigationOnClick,
125
- ...prefetchHandlers,
126
- style: {
127
- textDecoration: 'none',
128
- color: '#0070f3',
129
- cursor: 'pointer',
130
- ...(props.style && typeof props.style === 'object' ? props.style : {}),
131
- }
132
- }, deps.buildChildren(children, {
133
- elementPath, parentComponentName: effectiveParentComponentName, viewportWidth, componentContext, componentRootPath,
134
- locale, i18nConfig, cmsContext, cmsLocale, collectionItemsMap, itemContext, cmsItemIndexPath, cmsListPaths, templateContext, componentResolvedProps
135
- }));
145
+ deps.buildChildren(children, {
146
+ elementPath,
147
+ parentComponentName: effectiveParentComponentName,
148
+ viewportWidth,
149
+ componentContext,
150
+ componentRootPath,
151
+ locale,
152
+ i18nConfig,
153
+ cmsContext,
154
+ cmsLocale,
155
+ collectionItemsMap,
156
+ itemContext,
157
+ cmsItemIndexPath,
158
+ cmsListPaths,
159
+ templateContext,
160
+ componentResolvedProps,
161
+ }),
162
+ );
136
163
  }