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
@@ -6,40 +6,162 @@
6
6
 
7
7
  export const CSS_NAMED_COLORS: ReadonlySet<string> = new Set([
8
8
  // CSS Level 4 named colors
9
- 'aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure',
10
- 'beige', 'bisque', 'black', 'blanchedalmond', 'blue', 'blueviolet', 'brown', 'burlywood',
11
- 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan',
12
- 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki',
13
- 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon',
14
- 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet',
15
- 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue',
16
- 'firebrick', 'floralwhite', 'forestgreen', 'fuchsia',
17
- 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'gray', 'green', 'greenyellow', 'grey',
18
- 'honeydew', 'hotpink',
19
- 'indianred', 'indigo', 'ivory',
9
+ 'aliceblue',
10
+ 'antiquewhite',
11
+ 'aqua',
12
+ 'aquamarine',
13
+ 'azure',
14
+ 'beige',
15
+ 'bisque',
16
+ 'black',
17
+ 'blanchedalmond',
18
+ 'blue',
19
+ 'blueviolet',
20
+ 'brown',
21
+ 'burlywood',
22
+ 'cadetblue',
23
+ 'chartreuse',
24
+ 'chocolate',
25
+ 'coral',
26
+ 'cornflowerblue',
27
+ 'cornsilk',
28
+ 'crimson',
29
+ 'cyan',
30
+ 'darkblue',
31
+ 'darkcyan',
32
+ 'darkgoldenrod',
33
+ 'darkgray',
34
+ 'darkgreen',
35
+ 'darkgrey',
36
+ 'darkkhaki',
37
+ 'darkmagenta',
38
+ 'darkolivegreen',
39
+ 'darkorange',
40
+ 'darkorchid',
41
+ 'darkred',
42
+ 'darksalmon',
43
+ 'darkseagreen',
44
+ 'darkslateblue',
45
+ 'darkslategray',
46
+ 'darkslategrey',
47
+ 'darkturquoise',
48
+ 'darkviolet',
49
+ 'deeppink',
50
+ 'deepskyblue',
51
+ 'dimgray',
52
+ 'dimgrey',
53
+ 'dodgerblue',
54
+ 'firebrick',
55
+ 'floralwhite',
56
+ 'forestgreen',
57
+ 'fuchsia',
58
+ 'gainsboro',
59
+ 'ghostwhite',
60
+ 'gold',
61
+ 'goldenrod',
62
+ 'gray',
63
+ 'green',
64
+ 'greenyellow',
65
+ 'grey',
66
+ 'honeydew',
67
+ 'hotpink',
68
+ 'indianred',
69
+ 'indigo',
70
+ 'ivory',
20
71
  'khaki',
21
- 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan',
22
- 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon',
23
- 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow',
24
- 'lime', 'limegreen', 'linen',
25
- 'magenta', 'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple',
26
- 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred',
27
- 'midnightblue', 'mintcream', 'mistyrose', 'moccasin',
28
- 'navajowhite', 'navy',
29
- 'oldlace', 'olive', 'olivedrab', 'orange', 'orangered', 'orchid',
30
- 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff',
31
- 'peru', 'pink', 'plum', 'powderblue', 'purple',
32
- 'rebeccapurple', 'red', 'rosybrown', 'royalblue',
33
- 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'silver', 'skyblue',
34
- 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue',
35
- 'tan', 'teal', 'thistle', 'tomato', 'turquoise',
72
+ 'lavender',
73
+ 'lavenderblush',
74
+ 'lawngreen',
75
+ 'lemonchiffon',
76
+ 'lightblue',
77
+ 'lightcoral',
78
+ 'lightcyan',
79
+ 'lightgoldenrodyellow',
80
+ 'lightgray',
81
+ 'lightgreen',
82
+ 'lightgrey',
83
+ 'lightpink',
84
+ 'lightsalmon',
85
+ 'lightseagreen',
86
+ 'lightskyblue',
87
+ 'lightslategray',
88
+ 'lightslategrey',
89
+ 'lightsteelblue',
90
+ 'lightyellow',
91
+ 'lime',
92
+ 'limegreen',
93
+ 'linen',
94
+ 'magenta',
95
+ 'maroon',
96
+ 'mediumaquamarine',
97
+ 'mediumblue',
98
+ 'mediumorchid',
99
+ 'mediumpurple',
100
+ 'mediumseagreen',
101
+ 'mediumslateblue',
102
+ 'mediumspringgreen',
103
+ 'mediumturquoise',
104
+ 'mediumvioletred',
105
+ 'midnightblue',
106
+ 'mintcream',
107
+ 'mistyrose',
108
+ 'moccasin',
109
+ 'navajowhite',
110
+ 'navy',
111
+ 'oldlace',
112
+ 'olive',
113
+ 'olivedrab',
114
+ 'orange',
115
+ 'orangered',
116
+ 'orchid',
117
+ 'palegoldenrod',
118
+ 'palegreen',
119
+ 'paleturquoise',
120
+ 'palevioletred',
121
+ 'papayawhip',
122
+ 'peachpuff',
123
+ 'peru',
124
+ 'pink',
125
+ 'plum',
126
+ 'powderblue',
127
+ 'purple',
128
+ 'rebeccapurple',
129
+ 'red',
130
+ 'rosybrown',
131
+ 'royalblue',
132
+ 'saddlebrown',
133
+ 'salmon',
134
+ 'sandybrown',
135
+ 'seagreen',
136
+ 'seashell',
137
+ 'sienna',
138
+ 'silver',
139
+ 'skyblue',
140
+ 'slateblue',
141
+ 'slategray',
142
+ 'slategrey',
143
+ 'snow',
144
+ 'springgreen',
145
+ 'steelblue',
146
+ 'tan',
147
+ 'teal',
148
+ 'thistle',
149
+ 'tomato',
150
+ 'turquoise',
36
151
  'violet',
37
- 'wheat', 'white', 'whitesmoke',
38
- 'yellow', 'yellowgreen',
152
+ 'wheat',
153
+ 'white',
154
+ 'whitesmoke',
155
+ 'yellow',
156
+ 'yellowgreen',
39
157
  // CSS color keywords
40
- 'transparent', 'currentcolor',
158
+ 'transparent',
159
+ 'currentcolor',
41
160
  // CSS-wide keywords (should never be wrapped in var())
42
- 'inherit', 'initial', 'unset', 'revert',
161
+ 'inherit',
162
+ 'initial',
163
+ 'unset',
164
+ 'revert',
43
165
  ]);
44
166
 
45
167
  export function isCssNamedColor(value: string): boolean {
@@ -25,8 +25,7 @@ const baseCtx: VisualModeRuleContext = {
25
25
  hasMarginLonghand: false,
26
26
  hasBackgroundImage: false,
27
27
  };
28
- const ctx = (overrides: Partial<VisualModeRuleContext> = {}): VisualModeRuleContext =>
29
- ({ ...baseCtx, ...overrides });
28
+ const ctx = (overrides: Partial<VisualModeRuleContext> = {}): VisualModeRuleContext => ({ ...baseCtx, ...overrides });
30
29
 
31
30
  describe('cssProperties', () => {
32
31
  describe('CSS_PROPERTIES', () => {
@@ -46,13 +45,13 @@ describe('cssProperties', () => {
46
45
  describe('CSS_PROPERTIES_DEFINITION', () => {
47
46
  test('contains display property with values', () => {
48
47
  expect(CSS_PROPERTIES_DEFINITION.display).toBeDefined();
49
- expect(CSS_PROPERTIES_DEFINITION.display.values).toContain('flex');
50
- expect(CSS_PROPERTIES_DEFINITION.display.type).toBe('select');
48
+ expect(CSS_PROPERTIES_DEFINITION.display!.values).toContain('flex');
49
+ expect(CSS_PROPERTIES_DEFINITION.display!.type).toBe('select');
51
50
  });
52
51
 
53
52
  test('contains position property', () => {
54
53
  expect(CSS_PROPERTIES_DEFINITION.position).toBeDefined();
55
- expect(CSS_PROPERTIES_DEFINITION.position.values).toContain('relative');
54
+ expect(CSS_PROPERTIES_DEFINITION.position!.values).toContain('relative');
56
55
  });
57
56
 
58
57
  test('contains flexbox properties', () => {
@@ -64,12 +63,12 @@ describe('cssProperties', () => {
64
63
  test('contains dimension properties', () => {
65
64
  expect(CSS_PROPERTIES_DEFINITION.width).toBeDefined();
66
65
  expect(CSS_PROPERTIES_DEFINITION.height).toBeDefined();
67
- expect(CSS_PROPERTIES_DEFINITION.width.type).toBe('string');
66
+ expect(CSS_PROPERTIES_DEFINITION.width!.type).toBe('string');
68
67
  });
69
68
 
70
69
  test('contains cursor property with values', () => {
71
- expect(CSS_PROPERTIES_DEFINITION.cursor.values).toContain('pointer');
72
- expect(CSS_PROPERTIES_DEFINITION.cursor.values).toContain('default');
70
+ expect(CSS_PROPERTIES_DEFINITION.cursor!.values).toContain('pointer');
71
+ expect(CSS_PROPERTIES_DEFINITION.cursor!.values).toContain('default');
73
72
  });
74
73
  });
75
74
 
@@ -81,13 +80,13 @@ describe('cssProperties', () => {
81
80
 
82
81
  test('filters properties by exact prefix match', () => {
83
82
  const result = filterCSSProperties('flex');
84
- expect(result.every(prop => prop.toLowerCase().startsWith('flex'))).toBe(true);
83
+ expect(result.every((prop) => prop.toLowerCase().startsWith('flex'))).toBe(true);
85
84
  });
86
85
 
87
86
  test('filters properties case-insensitively', () => {
88
87
  const result = filterCSSProperties('FLEX');
89
88
  expect(result.length).toBeGreaterThan(0);
90
- expect(result.every(prop => prop.toLowerCase().startsWith('flex'))).toBe(true);
89
+ expect(result.every((prop) => prop.toLowerCase().startsWith('flex'))).toBe(true);
91
90
  });
92
91
 
93
92
  test('supports camelCase abbreviation matching', () => {
@@ -98,7 +97,7 @@ describe('cssProperties', () => {
98
97
 
99
98
  test('prioritizes startsWith matches over abbreviation matches', () => {
100
99
  const result = filterCSSProperties('b');
101
- const startsWithB = result.filter(p => p.toLowerCase().startsWith('b'));
100
+ const startsWithB = result.filter((p) => p.toLowerCase().startsWith('b'));
102
101
  expect(startsWithB.length).toBeGreaterThan(0);
103
102
  // startsWith matches should come first
104
103
  expect(result.indexOf('border')).toBeLessThan(result.indexOf('backgroundColor') || Infinity);
@@ -111,7 +110,7 @@ describe('cssProperties', () => {
111
110
 
112
111
  test('handles single character input', () => {
113
112
  const result = filterCSSProperties('p');
114
- expect(result.some(prop => prop.toLowerCase().startsWith('p'))).toBe(true);
113
+ expect(result.some((prop) => prop.toLowerCase().startsWith('p'))).toBe(true);
115
114
  });
116
115
 
117
116
  test('trims whitespace from input', () => {
@@ -300,9 +299,9 @@ describe('cssProperties', () => {
300
299
 
301
300
  describe('VISUAL_MODE_PROPERTIES', () => {
302
301
  test('contains common Webflow-style groups', () => {
303
- expect(VISUAL_MODE_PROPERTIES['Layout']).toContain('display');
304
- expect(VISUAL_MODE_PROPERTIES['Spacing']).toContain('padding');
305
- expect(VISUAL_MODE_PROPERTIES['Typography']).toContain('fontSize');
302
+ expect(VISUAL_MODE_PROPERTIES.Layout).toContain('display');
303
+ expect(VISUAL_MODE_PROPERTIES.Spacing).toContain('padding');
304
+ expect(VISUAL_MODE_PROPERTIES.Typography).toContain('fontSize');
306
305
  });
307
306
 
308
307
  test('every group name maps to a known CSS_PROPERTY_GROUPS group', () => {
@@ -336,121 +335,121 @@ describe('cssProperties', () => {
336
335
 
337
336
  describe('VISUAL_MODE_RULES — flex/grid container props', () => {
338
337
  test('flexDirection visible only when display is flex/inline-flex', () => {
339
- expect(VISUAL_MODE_RULES.flexDirection(ctx({ display: 'flex' }))).toBe(true);
340
- expect(VISUAL_MODE_RULES.flexDirection(ctx({ display: 'inline-flex' }))).toBe(true);
341
- expect(VISUAL_MODE_RULES.flexDirection(ctx({ display: 'block' }))).toBe(false);
342
- expect(VISUAL_MODE_RULES.flexDirection(ctx({ display: 'grid' }))).toBe(false);
338
+ expect(VISUAL_MODE_RULES.flexDirection!(ctx({ display: 'flex' }))).toBe(true);
339
+ expect(VISUAL_MODE_RULES.flexDirection!(ctx({ display: 'inline-flex' }))).toBe(true);
340
+ expect(VISUAL_MODE_RULES.flexDirection!(ctx({ display: 'block' }))).toBe(false);
341
+ expect(VISUAL_MODE_RULES.flexDirection!(ctx({ display: 'grid' }))).toBe(false);
343
342
  });
344
343
 
345
344
  test('justifyContent visible for flex AND grid', () => {
346
- expect(VISUAL_MODE_RULES.justifyContent(ctx({ display: 'flex' }))).toBe(true);
347
- expect(VISUAL_MODE_RULES.justifyContent(ctx({ display: 'grid' }))).toBe(true);
348
- expect(VISUAL_MODE_RULES.justifyContent(ctx({ display: 'block' }))).toBe(false);
345
+ expect(VISUAL_MODE_RULES.justifyContent!(ctx({ display: 'flex' }))).toBe(true);
346
+ expect(VISUAL_MODE_RULES.justifyContent!(ctx({ display: 'grid' }))).toBe(true);
347
+ expect(VISUAL_MODE_RULES.justifyContent!(ctx({ display: 'block' }))).toBe(false);
349
348
  });
350
349
 
351
350
  test('gridTemplateColumns visible only for grid/inline-grid', () => {
352
- expect(VISUAL_MODE_RULES.gridTemplateColumns(ctx({ display: 'grid' }))).toBe(true);
353
- expect(VISUAL_MODE_RULES.gridTemplateColumns(ctx({ display: 'inline-grid' }))).toBe(true);
354
- expect(VISUAL_MODE_RULES.gridTemplateColumns(ctx({ display: 'flex' }))).toBe(false);
355
- expect(VISUAL_MODE_RULES.gridTemplateColumns(ctx({ display: 'block' }))).toBe(false);
351
+ expect(VISUAL_MODE_RULES.gridTemplateColumns!(ctx({ display: 'grid' }))).toBe(true);
352
+ expect(VISUAL_MODE_RULES.gridTemplateColumns!(ctx({ display: 'inline-grid' }))).toBe(true);
353
+ expect(VISUAL_MODE_RULES.gridTemplateColumns!(ctx({ display: 'flex' }))).toBe(false);
354
+ expect(VISUAL_MODE_RULES.gridTemplateColumns!(ctx({ display: 'block' }))).toBe(false);
356
355
  });
357
356
 
358
357
  test('gap visible for both flex and grid containers', () => {
359
- expect(VISUAL_MODE_RULES.gap(ctx({ display: 'flex' }))).toBe(true);
360
- expect(VISUAL_MODE_RULES.gap(ctx({ display: 'grid' }))).toBe(true);
361
- expect(VISUAL_MODE_RULES.gap(ctx({ display: 'block' }))).toBe(false);
358
+ expect(VISUAL_MODE_RULES.gap!(ctx({ display: 'flex' }))).toBe(true);
359
+ expect(VISUAL_MODE_RULES.gap!(ctx({ display: 'grid' }))).toBe(true);
360
+ expect(VISUAL_MODE_RULES.gap!(ctx({ display: 'block' }))).toBe(false);
362
361
  });
363
362
  });
364
363
 
365
364
  describe('VISUAL_MODE_RULES — flex/grid item props (parent display)', () => {
366
365
  test('flexGrow visible only when parent is flex', () => {
367
- expect(VISUAL_MODE_RULES.flexGrow(ctx({ parentDisplay: 'flex' }))).toBe(true);
368
- expect(VISUAL_MODE_RULES.flexGrow(ctx({ parentDisplay: 'inline-flex' }))).toBe(true);
369
- expect(VISUAL_MODE_RULES.flexGrow(ctx({ parentDisplay: 'block' }))).toBe(false);
370
- expect(VISUAL_MODE_RULES.flexGrow(ctx({ parentDisplay: 'grid' }))).toBe(false);
366
+ expect(VISUAL_MODE_RULES.flexGrow!(ctx({ parentDisplay: 'flex' }))).toBe(true);
367
+ expect(VISUAL_MODE_RULES.flexGrow!(ctx({ parentDisplay: 'inline-flex' }))).toBe(true);
368
+ expect(VISUAL_MODE_RULES.flexGrow!(ctx({ parentDisplay: 'block' }))).toBe(false);
369
+ expect(VISUAL_MODE_RULES.flexGrow!(ctx({ parentDisplay: 'grid' }))).toBe(false);
371
370
  });
372
371
 
373
372
  test('gridArea visible only when parent is grid', () => {
374
- expect(VISUAL_MODE_RULES.gridArea(ctx({ parentDisplay: 'grid' }))).toBe(true);
375
- expect(VISUAL_MODE_RULES.gridArea(ctx({ parentDisplay: 'inline-grid' }))).toBe(true);
376
- expect(VISUAL_MODE_RULES.gridArea(ctx({ parentDisplay: 'flex' }))).toBe(false);
377
- expect(VISUAL_MODE_RULES.gridArea(ctx({ parentDisplay: 'block' }))).toBe(false);
373
+ expect(VISUAL_MODE_RULES.gridArea!(ctx({ parentDisplay: 'grid' }))).toBe(true);
374
+ expect(VISUAL_MODE_RULES.gridArea!(ctx({ parentDisplay: 'inline-grid' }))).toBe(true);
375
+ expect(VISUAL_MODE_RULES.gridArea!(ctx({ parentDisplay: 'flex' }))).toBe(false);
376
+ expect(VISUAL_MODE_RULES.gridArea!(ctx({ parentDisplay: 'block' }))).toBe(false);
378
377
  });
379
378
 
380
379
  test('alignSelf visible when parent is flex OR grid', () => {
381
- expect(VISUAL_MODE_RULES.alignSelf(ctx({ parentDisplay: 'flex' }))).toBe(true);
382
- expect(VISUAL_MODE_RULES.alignSelf(ctx({ parentDisplay: 'grid' }))).toBe(true);
383
- expect(VISUAL_MODE_RULES.alignSelf(ctx({ parentDisplay: 'block' }))).toBe(false);
380
+ expect(VISUAL_MODE_RULES.alignSelf!(ctx({ parentDisplay: 'flex' }))).toBe(true);
381
+ expect(VISUAL_MODE_RULES.alignSelf!(ctx({ parentDisplay: 'grid' }))).toBe(true);
382
+ expect(VISUAL_MODE_RULES.alignSelf!(ctx({ parentDisplay: 'block' }))).toBe(false);
384
383
  });
385
384
 
386
385
  test('item rules ignore own display — only parent display matters', () => {
387
386
  // Element has display:block but parent is flex → flexGrow still visible.
388
- expect(VISUAL_MODE_RULES.flexGrow(ctx({ display: 'block', parentDisplay: 'flex' }))).toBe(true);
387
+ expect(VISUAL_MODE_RULES.flexGrow!(ctx({ display: 'block', parentDisplay: 'flex' }))).toBe(true);
389
388
  // Element has display:flex but parent is block → flexGrow hidden.
390
- expect(VISUAL_MODE_RULES.flexGrow(ctx({ display: 'flex', parentDisplay: 'block' }))).toBe(false);
389
+ expect(VISUAL_MODE_RULES.flexGrow!(ctx({ display: 'flex', parentDisplay: 'block' }))).toBe(false);
391
390
  });
392
391
  });
393
392
 
394
393
  describe('VISUAL_MODE_RULES — position-dependent', () => {
395
394
  test('top/right/bottom/left/zIndex hidden when position is static', () => {
396
395
  const c = ctx({ position: 'static' });
397
- expect(VISUAL_MODE_RULES.top(c)).toBe(false);
398
- expect(VISUAL_MODE_RULES.right(c)).toBe(false);
399
- expect(VISUAL_MODE_RULES.bottom(c)).toBe(false);
400
- expect(VISUAL_MODE_RULES.left(c)).toBe(false);
401
- expect(VISUAL_MODE_RULES.zIndex(c)).toBe(false);
396
+ expect(VISUAL_MODE_RULES.top!(c)).toBe(false);
397
+ expect(VISUAL_MODE_RULES.right!(c)).toBe(false);
398
+ expect(VISUAL_MODE_RULES.bottom!(c)).toBe(false);
399
+ expect(VISUAL_MODE_RULES.left!(c)).toBe(false);
400
+ expect(VISUAL_MODE_RULES.zIndex!(c)).toBe(false);
402
401
  });
403
402
 
404
403
  test('top/right/bottom/left/zIndex visible when position is non-static', () => {
405
404
  for (const position of ['relative', 'absolute', 'fixed', 'sticky']) {
406
405
  const c = ctx({ position });
407
- expect(VISUAL_MODE_RULES.top(c)).toBe(true);
408
- expect(VISUAL_MODE_RULES.zIndex(c)).toBe(true);
406
+ expect(VISUAL_MODE_RULES.top!(c)).toBe(true);
407
+ expect(VISUAL_MODE_RULES.zIndex!(c)).toBe(true);
409
408
  }
410
409
  });
411
410
  });
412
411
 
413
412
  describe('VISUAL_MODE_RULES — tag-based', () => {
414
413
  test('objectFit visible only for img/video', () => {
415
- expect(VISUAL_MODE_RULES.objectFit(ctx({ tagName: 'img' }))).toBe(true);
416
- expect(VISUAL_MODE_RULES.objectFit(ctx({ tagName: 'video' }))).toBe(true);
417
- expect(VISUAL_MODE_RULES.objectFit(ctx({ tagName: 'div' }))).toBe(false);
414
+ expect(VISUAL_MODE_RULES.objectFit!(ctx({ tagName: 'img' }))).toBe(true);
415
+ expect(VISUAL_MODE_RULES.objectFit!(ctx({ tagName: 'video' }))).toBe(true);
416
+ expect(VISUAL_MODE_RULES.objectFit!(ctx({ tagName: 'div' }))).toBe(false);
418
417
  });
419
418
 
420
419
  test('listStyle visible only for ul/ol/li', () => {
421
- expect(VISUAL_MODE_RULES.listStyle(ctx({ tagName: 'ul' }))).toBe(true);
422
- expect(VISUAL_MODE_RULES.listStyle(ctx({ tagName: 'ol' }))).toBe(true);
423
- expect(VISUAL_MODE_RULES.listStyle(ctx({ tagName: 'li' }))).toBe(true);
424
- expect(VISUAL_MODE_RULES.listStyle(ctx({ tagName: 'div' }))).toBe(false);
420
+ expect(VISUAL_MODE_RULES.listStyle!(ctx({ tagName: 'ul' }))).toBe(true);
421
+ expect(VISUAL_MODE_RULES.listStyle!(ctx({ tagName: 'ol' }))).toBe(true);
422
+ expect(VISUAL_MODE_RULES.listStyle!(ctx({ tagName: 'li' }))).toBe(true);
423
+ expect(VISUAL_MODE_RULES.listStyle!(ctx({ tagName: 'div' }))).toBe(false);
425
424
  });
426
425
  });
427
426
 
428
427
  describe('VISUAL_MODE_RULES — padding/margin shorthand-vs-longhand toggle', () => {
429
428
  test('padding shown when no longhand set; longhands hidden', () => {
430
429
  const c = ctx({ hasPaddingLonghand: false });
431
- expect(VISUAL_MODE_RULES.padding(c)).toBe(true);
432
- expect(VISUAL_MODE_RULES.paddingTop(c)).toBe(false);
433
- expect(VISUAL_MODE_RULES.paddingRight(c)).toBe(false);
434
- expect(VISUAL_MODE_RULES.paddingBottom(c)).toBe(false);
435
- expect(VISUAL_MODE_RULES.paddingLeft(c)).toBe(false);
430
+ expect(VISUAL_MODE_RULES.padding!(c)).toBe(true);
431
+ expect(VISUAL_MODE_RULES.paddingTop!(c)).toBe(false);
432
+ expect(VISUAL_MODE_RULES.paddingRight!(c)).toBe(false);
433
+ expect(VISUAL_MODE_RULES.paddingBottom!(c)).toBe(false);
434
+ expect(VISUAL_MODE_RULES.paddingLeft!(c)).toBe(false);
436
435
  });
437
436
 
438
437
  test('padding hidden when any longhand set; longhands shown', () => {
439
438
  const c = ctx({ hasPaddingLonghand: true });
440
- expect(VISUAL_MODE_RULES.padding(c)).toBe(false);
441
- expect(VISUAL_MODE_RULES.paddingTop(c)).toBe(true);
442
- expect(VISUAL_MODE_RULES.paddingRight(c)).toBe(true);
443
- expect(VISUAL_MODE_RULES.paddingBottom(c)).toBe(true);
444
- expect(VISUAL_MODE_RULES.paddingLeft(c)).toBe(true);
439
+ expect(VISUAL_MODE_RULES.padding!(c)).toBe(false);
440
+ expect(VISUAL_MODE_RULES.paddingTop!(c)).toBe(true);
441
+ expect(VISUAL_MODE_RULES.paddingRight!(c)).toBe(true);
442
+ expect(VISUAL_MODE_RULES.paddingBottom!(c)).toBe(true);
443
+ expect(VISUAL_MODE_RULES.paddingLeft!(c)).toBe(true);
445
444
  });
446
445
 
447
446
  test('margin mirrors padding behavior', () => {
448
447
  const noLong = ctx({ hasMarginLonghand: false });
449
- expect(VISUAL_MODE_RULES.margin(noLong)).toBe(true);
450
- expect(VISUAL_MODE_RULES.marginTop(noLong)).toBe(false);
448
+ expect(VISUAL_MODE_RULES.margin!(noLong)).toBe(true);
449
+ expect(VISUAL_MODE_RULES.marginTop!(noLong)).toBe(false);
451
450
  const withLong = ctx({ hasMarginLonghand: true });
452
- expect(VISUAL_MODE_RULES.margin(withLong)).toBe(false);
453
- expect(VISUAL_MODE_RULES.marginTop(withLong)).toBe(true);
451
+ expect(VISUAL_MODE_RULES.margin!(withLong)).toBe(false);
452
+ expect(VISUAL_MODE_RULES.marginTop!(withLong)).toBe(true);
454
453
  });
455
454
  });
456
455