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
@@ -4,31 +4,28 @@
4
4
  * Covers both page and component contexts
5
5
  */
6
6
 
7
- import { test, expect, describe } from "bun:test";
8
- import {
9
- generateInteractiveCSS,
10
- generateAllInteractiveCSS,
11
- } from "./cssGeneration";
12
- import { generateElementClassName, type ElementClassContext } from "./elementClassName";
13
- import type { InteractiveStyles, ResponsiveStyleObject } from "./types/styles";
14
- import { DEFAULT_BREAKPOINTS } from "./breakpoints";
15
-
16
- describe("generateInteractiveCSS", () => {
17
- describe("Page element styles", () => {
18
- test("should generate hover styles for page element", () => {
7
+ import { test, expect, describe } from 'bun:test';
8
+ import { generateInteractiveCSS, generateAllInteractiveCSS } from './cssGeneration';
9
+ import { generateElementClassName, type ElementClassContext } from './elementClassName';
10
+ import type { InteractiveStyles, ResponsiveStyleObject } from './types/styles';
11
+ import { DEFAULT_BREAKPOINTS } from './breakpoints';
12
+
13
+ describe('generateInteractiveCSS', () => {
14
+ describe('Page element styles', () => {
15
+ test('should generate hover styles for page element', () => {
19
16
  const ctx: ElementClassContext = {
20
- fileType: "page",
21
- fileName: "about",
22
- label: "button",
17
+ fileType: 'page',
18
+ fileName: 'about',
19
+ label: 'button',
23
20
  path: [0],
24
21
  };
25
22
  const elementClass = generateElementClassName(ctx);
26
23
  const interactiveStyles: InteractiveStyles = [
27
24
  {
28
- postfix: ":hover",
25
+ postfix: ':hover',
29
26
  style: {
30
- backgroundColor: "primary",
31
- color: "white",
27
+ backgroundColor: 'primary',
28
+ color: 'white',
32
29
  },
33
30
  },
34
31
  ];
@@ -36,22 +33,22 @@ describe("generateInteractiveCSS", () => {
36
33
  const css = generateInteractiveCSS(elementClass, interactiveStyles);
37
34
 
38
35
  expect(css).toContain(`.${elementClass}:hover`);
39
- expect(css).toContain("background-color: var(--primary)");
40
- expect(css).toContain("color: var(--white)");
36
+ expect(css).toContain('background-color: var(--primary)');
37
+ expect(css).toContain('color: var(--white)');
41
38
  });
42
39
 
43
- test("should generate active styles for page element", () => {
40
+ test('should generate active styles for page element', () => {
44
41
  const ctx: ElementClassContext = {
45
- fileType: "page",
46
- fileName: "index",
42
+ fileType: 'page',
43
+ fileName: 'index',
47
44
  path: [0, 1],
48
45
  };
49
46
  const elementClass = generateElementClassName(ctx);
50
47
  const interactiveStyles: InteractiveStyles = [
51
48
  {
52
- postfix: ":active",
49
+ postfix: ':active',
53
50
  style: {
54
- transform: "scale(0.98)",
51
+ transform: 'scale(0.98)',
55
52
  },
56
53
  },
57
54
  ];
@@ -59,23 +56,23 @@ describe("generateInteractiveCSS", () => {
59
56
  const css = generateInteractiveCSS(elementClass, interactiveStyles);
60
57
 
61
58
  expect(css).toContain(`.${elementClass}:active`);
62
- expect(css).toContain("transform: scale(0.98)");
59
+ expect(css).toContain('transform: scale(0.98)');
63
60
  });
64
61
 
65
- test("should generate focus styles for page element", () => {
62
+ test('should generate focus styles for page element', () => {
66
63
  const ctx: ElementClassContext = {
67
- fileType: "page",
68
- fileName: "contact",
69
- label: "input",
64
+ fileType: 'page',
65
+ fileName: 'contact',
66
+ label: 'input',
70
67
  path: [0, 2],
71
68
  };
72
69
  const elementClass = generateElementClassName(ctx);
73
70
  const interactiveStyles: InteractiveStyles = [
74
71
  {
75
- postfix: ":focus",
72
+ postfix: ':focus',
76
73
  style: {
77
- outline: "2px solid var(--primary)",
78
- outlineOffset: "2px",
74
+ outline: '2px solid var(--primary)',
75
+ outlineOffset: '2px',
79
76
  },
80
77
  },
81
78
  ];
@@ -83,23 +80,23 @@ describe("generateInteractiveCSS", () => {
83
80
  const css = generateInteractiveCSS(elementClass, interactiveStyles);
84
81
 
85
82
  expect(css).toContain(`.${elementClass}:focus`);
86
- expect(css).toContain("outline: 2px solid var(--primary)");
83
+ expect(css).toContain('outline: 2px solid var(--primary)');
87
84
  });
88
85
  });
89
86
 
90
- describe("Component element styles", () => {
91
- test("should generate hover styles for component element", () => {
87
+ describe('Component element styles', () => {
88
+ test('should generate hover styles for component element', () => {
92
89
  const ctx: ElementClassContext = {
93
- fileType: "component",
94
- fileName: "Button",
90
+ fileType: 'component',
91
+ fileName: 'Button',
95
92
  path: [0],
96
93
  };
97
94
  const elementClass = generateElementClassName(ctx);
98
95
  const interactiveStyles: InteractiveStyles = [
99
96
  {
100
- postfix: ":hover",
97
+ postfix: ':hover',
101
98
  style: {
102
- backgroundColor: "primary-dark",
99
+ backgroundColor: 'primary-dark',
103
100
  },
104
101
  },
105
102
  ];
@@ -109,22 +106,22 @@ describe("generateInteractiveCSS", () => {
109
106
  // Component class should have c_ prefix
110
107
  expect(elementClass).toMatch(/^c_button_/);
111
108
  expect(css).toContain(`.${elementClass}:hover`);
112
- expect(css).toContain("background-color: var(--primary-dark)");
109
+ expect(css).toContain('background-color: var(--primary-dark)');
113
110
  });
114
111
 
115
- test("should generate interactive styles for named component element", () => {
112
+ test('should generate interactive styles for named component element', () => {
116
113
  const ctx: ElementClassContext = {
117
- fileType: "component",
118
- fileName: "Navigation",
119
- label: "hamburger",
114
+ fileType: 'component',
115
+ fileName: 'Navigation',
116
+ label: 'hamburger',
120
117
  path: [0, 0],
121
118
  };
122
119
  const elementClass = generateElementClassName(ctx);
123
120
  const interactiveStyles: InteractiveStyles = [
124
121
  {
125
- postfix: ":hover",
122
+ postfix: ':hover',
126
123
  style: {
127
- opacity: "0.8",
124
+ opacity: '0.8',
128
125
  },
129
126
  },
130
127
  ];
@@ -132,57 +129,57 @@ describe("generateInteractiveCSS", () => {
132
129
  const css = generateInteractiveCSS(elementClass, interactiveStyles);
133
130
 
134
131
  // Named element should have predictable class
135
- expect(elementClass).toBe("c_navigation_hamburger");
136
- expect(css).toContain(".c_navigation_hamburger:hover");
137
- expect(css).toContain("opacity: 0.8");
132
+ expect(elementClass).toBe('c_navigation_hamburger');
133
+ expect(css).toContain('.c_navigation_hamburger:hover');
134
+ expect(css).toContain('opacity: 0.8');
138
135
  });
139
136
 
140
- test("should generate multiple interactive states for component", () => {
137
+ test('should generate multiple interactive states for component', () => {
141
138
  const ctx: ElementClassContext = {
142
- fileType: "component",
143
- fileName: "Card",
144
- label: "link",
139
+ fileType: 'component',
140
+ fileName: 'Card',
141
+ label: 'link',
145
142
  path: [0, 1],
146
143
  };
147
144
  const elementClass = generateElementClassName(ctx);
148
145
  const interactiveStyles: InteractiveStyles = [
149
146
  {
150
- postfix: ":hover",
151
- style: { color: "primary" },
147
+ postfix: ':hover',
148
+ style: { color: 'primary' },
152
149
  },
153
150
  {
154
- postfix: ":active",
155
- style: { color: "primary-dark" },
151
+ postfix: ':active',
152
+ style: { color: 'primary-dark' },
156
153
  },
157
154
  {
158
- postfix: ":focus",
159
- style: { outline: "none", boxShadow: "0 0 0 2px var(--primary)" },
155
+ postfix: ':focus',
156
+ style: { outline: 'none', boxShadow: '0 0 0 2px var(--primary)' },
160
157
  },
161
158
  ];
162
159
 
163
160
  const css = generateInteractiveCSS(elementClass, interactiveStyles);
164
161
 
165
- expect(css).toContain(".c_card_link:hover");
166
- expect(css).toContain(".c_card_link:active");
167
- expect(css).toContain(".c_card_link:focus");
162
+ expect(css).toContain('.c_card_link:hover');
163
+ expect(css).toContain('.c_card_link:active');
164
+ expect(css).toContain('.c_card_link:focus');
168
165
  });
169
166
  });
170
167
 
171
- describe("Prefix selectors (checkbox/sibling patterns)", () => {
172
- test("should handle prefix selector for toggle pattern", () => {
168
+ describe('Prefix selectors (checkbox/sibling patterns)', () => {
169
+ test('should handle prefix selector for toggle pattern', () => {
173
170
  const ctx: ElementClassContext = {
174
- fileType: "component",
175
- fileName: "Navigation",
176
- label: "menu",
171
+ fileType: 'component',
172
+ fileName: 'Navigation',
173
+ label: 'menu',
177
174
  path: [0, 1],
178
175
  };
179
176
  const elementClass = generateElementClassName(ctx);
180
177
  const interactiveStyles: InteractiveStyles = [
181
178
  {
182
- prefix: "#menu-toggle:checked ~ ",
183
- postfix: "",
179
+ prefix: '#menu-toggle:checked ~ ',
180
+ postfix: '',
184
181
  style: {
185
- display: "block",
182
+ display: 'block',
186
183
  },
187
184
  },
188
185
  ];
@@ -190,239 +187,219 @@ describe("generateInteractiveCSS", () => {
190
187
  const css = generateInteractiveCSS(elementClass, interactiveStyles);
191
188
 
192
189
  // Prefix selectors should come before the class
193
- expect(css).toContain("#menu-toggle:checked ~ .c_navigation_menu");
194
- expect(css).toContain("display: block");
190
+ expect(css).toContain('#menu-toggle:checked ~ .c_navigation_menu');
191
+ expect(css).toContain('display: block');
195
192
  });
196
193
 
197
- test("should handle prefix selector with complex sibling", () => {
194
+ test('should handle prefix selector with complex sibling', () => {
198
195
  const ctx: ElementClassContext = {
199
- fileType: "component",
200
- fileName: "Accordion",
201
- label: "content",
196
+ fileType: 'component',
197
+ fileName: 'Accordion',
198
+ label: 'content',
202
199
  path: [0, 0, 1],
203
200
  };
204
201
  const elementClass = generateElementClassName(ctx);
205
202
  const interactiveStyles: InteractiveStyles = [
206
203
  {
207
- prefix: "input:checked + label + ",
208
- postfix: "",
204
+ prefix: 'input:checked + label + ',
205
+ postfix: '',
209
206
  style: {
210
- maxHeight: "500px",
211
- opacity: "1",
207
+ maxHeight: '500px',
208
+ opacity: '1',
212
209
  },
213
210
  },
214
211
  ];
215
212
 
216
213
  const css = generateInteractiveCSS(elementClass, interactiveStyles);
217
214
 
218
- expect(css).toContain("input:checked + label + .c_accordion_content");
215
+ expect(css).toContain('input:checked + label + .c_accordion_content');
219
216
  });
220
217
  });
221
218
 
222
- describe("Responsive interactive styles", () => {
223
- test("should generate responsive hover styles with breakpoints", () => {
219
+ describe('Responsive interactive styles', () => {
220
+ test('should generate responsive hover styles with breakpoints', () => {
224
221
  const ctx: ElementClassContext = {
225
- fileType: "page",
226
- fileName: "index",
227
- label: "hero-button",
222
+ fileType: 'page',
223
+ fileName: 'index',
224
+ label: 'hero-button',
228
225
  path: [0, 0],
229
226
  };
230
227
  const elementClass = generateElementClassName(ctx);
231
228
  const interactiveStyles: InteractiveStyles = [
232
229
  {
233
- postfix: ":hover",
230
+ postfix: ':hover',
234
231
  style: {
235
232
  base: {
236
- padding: "20px 40px",
233
+ padding: '20px 40px',
237
234
  },
238
235
  tablet: {
239
- padding: "16px 32px",
236
+ padding: '16px 32px',
240
237
  },
241
238
  mobile: {
242
- padding: "12px 24px",
239
+ padding: '12px 24px',
243
240
  },
244
241
  } as ResponsiveStyleObject,
245
242
  },
246
243
  ];
247
244
 
248
- const css = generateInteractiveCSS(
249
- elementClass,
250
- interactiveStyles,
251
- DEFAULT_BREAKPOINTS
252
- );
245
+ const css = generateInteractiveCSS(elementClass, interactiveStyles, DEFAULT_BREAKPOINTS);
253
246
 
254
247
  // Base styles
255
- expect(css).toContain(".p_index_hero-button:hover");
256
- expect(css).toContain("padding: 20px 40px");
248
+ expect(css).toContain('.p_index_hero-button:hover');
249
+ expect(css).toContain('padding: 20px 40px');
257
250
 
258
251
  // Tablet breakpoint
259
- expect(css).toContain("@media (max-width: 1024px)");
260
- expect(css).toContain("padding: 16px 32px");
252
+ expect(css).toContain('@media (max-width: 1024px)');
253
+ expect(css).toContain('padding: 16px 32px');
261
254
 
262
255
  // Mobile breakpoint
263
- expect(css).toContain("@media (max-width: 540px)");
264
- expect(css).toContain("padding: 12px 24px");
256
+ expect(css).toContain('@media (max-width: 540px)');
257
+ expect(css).toContain('padding: 12px 24px');
265
258
  });
266
259
 
267
- test("should generate responsive styles for component element", () => {
260
+ test('should generate responsive styles for component element', () => {
268
261
  const ctx: ElementClassContext = {
269
- fileType: "component",
270
- fileName: "Card",
271
- label: "container",
262
+ fileType: 'component',
263
+ fileName: 'Card',
264
+ label: 'container',
272
265
  path: [0],
273
266
  };
274
267
  const elementClass = generateElementClassName(ctx);
275
268
  const interactiveStyles: InteractiveStyles = [
276
269
  {
277
- postfix: ":hover",
270
+ postfix: ':hover',
278
271
  style: {
279
272
  base: {
280
- boxShadow: "0 8px 24px rgba(0,0,0,0.15)",
273
+ boxShadow: '0 8px 24px rgba(0,0,0,0.15)',
281
274
  },
282
275
  tablet: {
283
- boxShadow: "0 4px 12px rgba(0,0,0,0.1)",
276
+ boxShadow: '0 4px 12px rgba(0,0,0,0.1)',
284
277
  },
285
278
  } as ResponsiveStyleObject,
286
279
  },
287
280
  ];
288
281
 
289
- const css = generateInteractiveCSS(
290
- elementClass,
291
- interactiveStyles,
292
- DEFAULT_BREAKPOINTS
293
- );
282
+ const css = generateInteractiveCSS(elementClass, interactiveStyles, DEFAULT_BREAKPOINTS);
294
283
 
295
- expect(css).toContain(".c_card_container:hover");
296
- expect(css).toContain("box-shadow: 0 8px 24px rgba(0,0,0,0.15)");
297
- expect(css).toContain("@media (max-width: 1024px)");
284
+ expect(css).toContain('.c_card_container:hover');
285
+ expect(css).toContain('box-shadow: 0 8px 24px rgba(0,0,0,0.15)');
286
+ expect(css).toContain('@media (max-width: 1024px)');
298
287
  });
299
288
  });
300
289
  });
301
290
 
302
- describe("generateAllInteractiveCSS", () => {
303
- test("should generate CSS for multiple page elements", () => {
291
+ describe('generateAllInteractiveCSS', () => {
292
+ test('should generate CSS for multiple page elements', () => {
304
293
  const stylesMap = new Map<string, InteractiveStyles>();
305
294
 
306
295
  // First element
307
296
  const ctx1: ElementClassContext = {
308
- fileType: "page",
309
- fileName: "index",
310
- label: "button1",
297
+ fileType: 'page',
298
+ fileName: 'index',
299
+ label: 'button1',
311
300
  path: [0],
312
301
  };
313
- stylesMap.set(generateElementClassName(ctx1), [
314
- { postfix: ":hover", style: { backgroundColor: "primary" } },
315
- ]);
302
+ stylesMap.set(generateElementClassName(ctx1), [{ postfix: ':hover', style: { backgroundColor: 'primary' } }]);
316
303
 
317
304
  // Second element
318
305
  const ctx2: ElementClassContext = {
319
- fileType: "page",
320
- fileName: "index",
321
- label: "button2",
306
+ fileType: 'page',
307
+ fileName: 'index',
308
+ label: 'button2',
322
309
  path: [1],
323
310
  };
324
- stylesMap.set(generateElementClassName(ctx2), [
325
- { postfix: ":hover", style: { backgroundColor: "secondary" } },
326
- ]);
311
+ stylesMap.set(generateElementClassName(ctx2), [{ postfix: ':hover', style: { backgroundColor: 'secondary' } }]);
327
312
 
328
313
  const css = generateAllInteractiveCSS(stylesMap, DEFAULT_BREAKPOINTS);
329
314
 
330
- expect(css).toContain(".p_index_button1:hover");
331
- expect(css).toContain(".p_index_button2:hover");
332
- expect(css).toContain("background-color: var(--primary)");
333
- expect(css).toContain("background-color: var(--secondary)");
315
+ expect(css).toContain('.p_index_button1:hover');
316
+ expect(css).toContain('.p_index_button2:hover');
317
+ expect(css).toContain('background-color: var(--primary)');
318
+ expect(css).toContain('background-color: var(--secondary)');
334
319
  });
335
320
 
336
- test("should generate CSS for multiple component elements", () => {
321
+ test('should generate CSS for multiple component elements', () => {
337
322
  const stylesMap = new Map<string, InteractiveStyles>();
338
323
 
339
324
  // Component element 1
340
325
  const ctx1: ElementClassContext = {
341
- fileType: "component",
342
- fileName: "Button",
326
+ fileType: 'component',
327
+ fileName: 'Button',
343
328
  path: [0],
344
329
  };
345
- stylesMap.set(generateElementClassName(ctx1), [
346
- { postfix: ":hover", style: { opacity: "0.9" } },
347
- ]);
330
+ stylesMap.set(generateElementClassName(ctx1), [{ postfix: ':hover', style: { opacity: '0.9' } }]);
348
331
 
349
332
  // Component element 2
350
333
  const ctx2: ElementClassContext = {
351
- fileType: "component",
352
- fileName: "Card",
353
- label: "header",
334
+ fileType: 'component',
335
+ fileName: 'Card',
336
+ label: 'header',
354
337
  path: [0, 0],
355
338
  };
356
- stylesMap.set(generateElementClassName(ctx2), [
357
- { postfix: ":hover", style: { color: "primary" } },
358
- ]);
339
+ stylesMap.set(generateElementClassName(ctx2), [{ postfix: ':hover', style: { color: 'primary' } }]);
359
340
 
360
341
  const css = generateAllInteractiveCSS(stylesMap, DEFAULT_BREAKPOINTS);
361
342
 
362
343
  expect(css).toMatch(/\.c_button_\w+:hover/);
363
- expect(css).toContain(".c_card_header:hover");
344
+ expect(css).toContain('.c_card_header:hover');
364
345
  });
365
346
 
366
- test("should generate CSS for mixed page and component elements", () => {
347
+ test('should generate CSS for mixed page and component elements', () => {
367
348
  const stylesMap = new Map<string, InteractiveStyles>();
368
349
 
369
350
  // Page element
370
351
  const pageCtx: ElementClassContext = {
371
- fileType: "page",
372
- fileName: "about",
373
- label: "cta",
352
+ fileType: 'page',
353
+ fileName: 'about',
354
+ label: 'cta',
374
355
  path: [0, 2],
375
356
  };
376
- stylesMap.set(generateElementClassName(pageCtx), [
377
- { postfix: ":hover", style: { transform: "scale(1.05)" } },
378
- ]);
357
+ stylesMap.set(generateElementClassName(pageCtx), [{ postfix: ':hover', style: { transform: 'scale(1.05)' } }]);
379
358
 
380
359
  // Component element
381
360
  const compCtx: ElementClassContext = {
382
- fileType: "component",
383
- fileName: "Navigation",
384
- label: "link",
361
+ fileType: 'component',
362
+ fileName: 'Navigation',
363
+ label: 'link',
385
364
  path: [0, 1],
386
365
  };
387
- stylesMap.set(generateElementClassName(compCtx), [
388
- { postfix: ":hover", style: { color: "primary" } },
389
- ]);
366
+ stylesMap.set(generateElementClassName(compCtx), [{ postfix: ':hover', style: { color: 'primary' } }]);
390
367
 
391
368
  const css = generateAllInteractiveCSS(stylesMap, DEFAULT_BREAKPOINTS);
392
369
 
393
370
  // Should contain both page and component styles
394
- expect(css).toContain(".p_about_cta:hover");
395
- expect(css).toContain(".c_navigation_link:hover");
371
+ expect(css).toContain('.p_about_cta:hover');
372
+ expect(css).toContain('.c_navigation_link:hover');
396
373
  });
397
374
 
398
- test("should return empty string for empty map", () => {
375
+ test('should return empty string for empty map', () => {
399
376
  const stylesMap = new Map<string, InteractiveStyles>();
400
377
 
401
378
  const css = generateAllInteractiveCSS(stylesMap, DEFAULT_BREAKPOINTS);
402
379
 
403
- expect(css).toBe("");
380
+ expect(css).toBe('');
404
381
  });
405
382
  });
406
383
 
407
- describe("Interactive styles class consistency", () => {
384
+ describe('Interactive styles class consistency', () => {
408
385
  /**
409
386
  * These tests verify that the same element class is generated
410
387
  * for the same component element regardless of where the component
411
388
  * is placed on a page.
412
389
  */
413
- describe("Component path independence", () => {
414
- test("same relative path produces same class for same component", () => {
390
+ describe('Component path independence', () => {
391
+ test('same relative path produces same class for same component', () => {
415
392
  // When a Button component is on a page, the root element
416
393
  // should always get the same class regardless of page position
417
394
  const ctx1: ElementClassContext = {
418
- fileType: "component",
419
- fileName: "Button",
395
+ fileType: 'component',
396
+ fileName: 'Button',
420
397
  path: [0], // Relative to component root
421
398
  };
422
399
 
423
400
  const ctx2: ElementClassContext = {
424
- fileType: "component",
425
- fileName: "Button",
401
+ fileType: 'component',
402
+ fileName: 'Button',
426
403
  path: [0], // Same relative path
427
404
  };
428
405
 
@@ -432,45 +409,45 @@ describe("Interactive styles class consistency", () => {
432
409
  expect(class1).toBe(class2);
433
410
  });
434
411
 
435
- test("CSS can be generated once and reused for component instances", () => {
412
+ test('CSS can be generated once and reused for component instances', () => {
436
413
  // Generate CSS for a component's interactive styles once
437
414
  const ctx: ElementClassContext = {
438
- fileType: "component",
439
- fileName: "Button",
440
- label: "root",
415
+ fileType: 'component',
416
+ fileName: 'Button',
417
+ label: 'root',
441
418
  path: [0],
442
419
  };
443
420
  const elementClass = generateElementClassName(ctx);
444
421
 
445
422
  const interactiveStyles: InteractiveStyles = [
446
- { postfix: ":hover", style: { backgroundColor: "primary" } },
447
- { postfix: ":active", style: { backgroundColor: "primary-dark" } },
423
+ { postfix: ':hover', style: { backgroundColor: 'primary' } },
424
+ { postfix: ':active', style: { backgroundColor: 'primary-dark' } },
448
425
  ];
449
426
 
450
427
  const css = generateInteractiveCSS(elementClass, interactiveStyles);
451
428
 
452
429
  // The CSS uses the component class, not page-specific classes
453
- expect(css).toContain(".c_button_root:hover");
454
- expect(css).toContain(".c_button_root:active");
430
+ expect(css).toContain('.c_button_root:hover');
431
+ expect(css).toContain('.c_button_root:active');
455
432
 
456
433
  // This CSS can be applied to any instance of the Button component
457
434
  // because all instances will have the same element class
458
435
  });
459
436
  });
460
437
 
461
- describe("Page vs Component class differentiation", () => {
462
- test("page and component elements with same name have different classes", () => {
438
+ describe('Page vs Component class differentiation', () => {
439
+ test('page and component elements with same name have different classes', () => {
463
440
  const pageCtx: ElementClassContext = {
464
- fileType: "page",
465
- fileName: "button", // Page named "button"
466
- label: "root",
441
+ fileType: 'page',
442
+ fileName: 'button', // Page named "button"
443
+ label: 'root',
467
444
  path: [0],
468
445
  };
469
446
 
470
447
  const compCtx: ElementClassContext = {
471
- fileType: "component",
472
- fileName: "button", // Component named "button"
473
- label: "root",
448
+ fileType: 'component',
449
+ fileName: 'button', // Component named "button"
450
+ label: 'root',
474
451
  path: [0],
475
452
  };
476
453
 
@@ -105,7 +105,7 @@ export interface ComponentProvider {
105
105
  /** Schema info extracted from a page file */
106
106
  export interface CMSSchemaInfo {
107
107
  schema: CMSSchema;
108
- pagePath: string; // Path to the page file containing this schema
108
+ pagePath: string; // Path to the page file containing this schema
109
109
  }
110
110
 
111
111
  /**