meno-core 1.0.53 → 1.0.54

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 (387) hide show
  1. package/.claude/settings.local.json +1 -3
  2. package/bin/cli.ts +48 -57
  3. package/build-astro.ts +131 -113
  4. package/build-next.ts +109 -96
  5. package/build-static.test.ts +39 -10
  6. package/build-static.ts +120 -122
  7. package/dist/bin/cli.js +34 -38
  8. package/dist/bin/cli.js.map +2 -2
  9. package/dist/build-static.js +12 -11
  10. package/dist/chunks/chunk-2AR55GYH.js +42 -0
  11. package/dist/chunks/chunk-2AR55GYH.js.map +7 -0
  12. package/dist/chunks/{chunk-IGYR22T6.js → chunk-2FN4UOVO.js} +512 -239
  13. package/dist/chunks/chunk-2FN4UOVO.js.map +7 -0
  14. package/dist/chunks/chunk-3XER4E5W.js +168 -0
  15. package/dist/chunks/chunk-3XER4E5W.js.map +7 -0
  16. package/dist/chunks/{chunk-X754AHS5.js → chunk-5ETZFREW.js} +9 -12
  17. package/dist/chunks/chunk-5ETZFREW.js.map +7 -0
  18. package/dist/chunks/{chunk-2MHDV5BF.js → chunk-7E4IF5L7.js} +15 -21
  19. package/dist/chunks/chunk-7E4IF5L7.js.map +7 -0
  20. package/dist/chunks/{chunk-JGWFTO6P.js → chunk-7HWQUVTU.js} +1578 -1349
  21. package/dist/chunks/chunk-7HWQUVTU.js.map +7 -0
  22. package/dist/chunks/{chunk-O3NAGJP4.js → chunk-AE3QK5QW.js} +110 -21
  23. package/dist/chunks/chunk-AE3QK5QW.js.map +7 -0
  24. package/dist/chunks/{chunk-GZHGVVW3.js → chunk-F6KTJYGV.js} +7 -7
  25. package/dist/chunks/chunk-F6KTJYGV.js.map +7 -0
  26. package/dist/chunks/{chunk-WQFG7PAH.js → chunk-FZITJSSS.js} +2 -6
  27. package/dist/chunks/chunk-FZITJSSS.js.map +7 -0
  28. package/dist/chunks/{chunk-QB2LNO4W.js → chunk-GSYYA5GX.js} +2 -2
  29. package/dist/chunks/chunk-GSYYA5GX.js.map +7 -0
  30. package/dist/chunks/{chunk-YBLHKYFF.js → chunk-HIZMY3EP.js} +1 -1
  31. package/dist/chunks/chunk-HIZMY3EP.js.map +7 -0
  32. package/dist/chunks/{chunk-AZQYF6KE.js → chunk-I2WEGYA7.js} +41 -176
  33. package/dist/chunks/chunk-I2WEGYA7.js.map +7 -0
  34. package/dist/chunks/{chunk-I7YIGZXT.js → chunk-JNO3CNLJ.js} +6 -9
  35. package/dist/chunks/chunk-JNO3CNLJ.js.map +7 -0
  36. package/dist/chunks/{chunk-UB44F4Z2.js → chunk-NVRBTSQG.js} +2 -4
  37. package/dist/chunks/chunk-NVRBTSQG.js.map +7 -0
  38. package/dist/chunks/{chunk-JGP5A3Y5.js → chunk-Q4OBWKXG.js} +40 -33
  39. package/dist/chunks/chunk-Q4OBWKXG.js.map +7 -0
  40. package/dist/chunks/{chunk-R6XHAFBF.js → chunk-QTE32Y53.js} +250 -242
  41. package/dist/chunks/chunk-QTE32Y53.js.map +7 -0
  42. package/dist/chunks/{chunk-H3GJ4H2U.js → chunk-STDY3OVM.js} +214 -85
  43. package/dist/chunks/chunk-STDY3OVM.js.map +7 -0
  44. package/dist/chunks/configService-PRJZF7Y6.js +14 -0
  45. package/dist/chunks/{constants-STK2YBIW.js → constants-KIQEYMAM.js} +2 -2
  46. package/dist/chunks/{fs-JGINUXGL.js → fs-ZI5JEU7V.js} +2 -2
  47. package/dist/entries/server-router.js +14 -19
  48. package/dist/entries/server-router.js.map +2 -2
  49. package/dist/lib/client/index.js +638 -332
  50. package/dist/lib/client/index.js.map +2 -2
  51. package/dist/lib/server/index.js +177 -235
  52. package/dist/lib/server/index.js.map +2 -2
  53. package/dist/lib/shared/index.js +80 -44
  54. package/dist/lib/shared/index.js.map +2 -2
  55. package/dist/lib/shared/richtext/index.js +1 -1
  56. package/dist/lib/test-utils/index.js +38 -60
  57. package/dist/lib/test-utils/index.js.map +2 -2
  58. package/entries/client-router.tsx +10 -8
  59. package/entries/server-router.tsx +1 -7
  60. package/lib/client/ClientInitializer.ts +8 -8
  61. package/lib/client/ErrorBoundary.test.tsx +146 -143
  62. package/lib/client/ErrorBoundary.tsx +175 -127
  63. package/lib/client/componentRegistry.test.ts +96 -108
  64. package/lib/client/componentRegistry.ts +1 -2
  65. package/lib/client/contexts/ThemeContext.tsx +3 -2
  66. package/lib/client/core/ComponentBuilder.test.ts +513 -560
  67. package/lib/client/core/ComponentBuilder.ts +318 -146
  68. package/lib/client/core/ComponentRenderer.test.tsx +1 -2
  69. package/lib/client/core/ComponentRenderer.tsx +46 -33
  70. package/lib/client/core/builders/embedBuilder.ts +241 -53
  71. package/lib/client/core/builders/linkBuilder.ts +71 -44
  72. package/lib/client/core/builders/linkNodeBuilder.ts +78 -53
  73. package/lib/client/core/builders/listBuilder.ts +115 -86
  74. package/lib/client/core/builders/localeListBuilder.ts +95 -60
  75. package/lib/client/core/builders/types.ts +5 -5
  76. package/lib/client/core/cmsTemplateProcessor.ts +7 -7
  77. package/lib/client/elementRegistry.ts +3 -3
  78. package/lib/client/fontFamiliesService.test.ts +2 -10
  79. package/lib/client/fontFamiliesService.ts +3 -3
  80. package/lib/client/hmr/HMRManager.tsx +8 -0
  81. package/lib/client/hmrCssReload.ts +14 -8
  82. package/lib/client/hmrWebSocket.ts +9 -14
  83. package/lib/client/hooks/useColorVariables.test.ts +21 -21
  84. package/lib/client/hooks/useColorVariables.ts +12 -10
  85. package/lib/client/hooks/usePropertyAutocomplete.ts +3 -5
  86. package/lib/client/hooks/useVariables.ts +4 -4
  87. package/lib/client/hydration/HydrationUtils.test.ts +24 -25
  88. package/lib/client/hydration/HydrationUtils.ts +3 -4
  89. package/lib/client/i18nConfigService.test.ts +2 -7
  90. package/lib/client/i18nConfigService.ts +2 -2
  91. package/lib/client/meno-filter/MenoFilter.test.ts +19 -21
  92. package/lib/client/meno-filter/MenoFilter.ts +5 -9
  93. package/lib/client/meno-filter/bindings.ts +15 -40
  94. package/lib/client/meno-filter/init.ts +1 -1
  95. package/lib/client/meno-filter/renderer.ts +23 -29
  96. package/lib/client/meno-filter/script.generated.ts +1 -3
  97. package/lib/client/meno-filter/ui.ts +3 -5
  98. package/lib/client/meno-filter/updates.ts +15 -21
  99. package/lib/client/navigation.test.ts +159 -159
  100. package/lib/client/navigation.ts +0 -1
  101. package/lib/client/responsiveStyleResolver.test.ts +230 -228
  102. package/lib/client/responsiveStyleResolver.ts +13 -16
  103. package/lib/client/routing/RouteLoader.test.ts +23 -24
  104. package/lib/client/routing/RouteLoader.ts +22 -35
  105. package/lib/client/routing/Router.tsx +31 -3
  106. package/lib/client/scripts/ScriptExecutor.test.ts +157 -158
  107. package/lib/client/scripts/ScriptExecutor.ts +15 -33
  108. package/lib/client/services/PrefetchService.test.ts +2 -2
  109. package/lib/client/services/PrefetchService.ts +10 -24
  110. package/lib/client/styleProcessor.test.ts +9 -9
  111. package/lib/client/styleProcessor.ts +18 -15
  112. package/lib/client/styles/StyleInjector.test.ts +122 -115
  113. package/lib/client/styles/StyleInjector.ts +9 -6
  114. package/lib/client/styles/UtilityClassCollector.ts +19 -26
  115. package/lib/client/styles/cspNonce.test.ts +2 -5
  116. package/lib/client/templateEngine.test.ts +554 -482
  117. package/lib/client/templateEngine.ts +200 -64
  118. package/lib/client/theme.ts +0 -1
  119. package/lib/client/utils/toast.ts +0 -1
  120. package/lib/server/__integration__/api-routes.test.ts +8 -4
  121. package/lib/server/__integration__/cms-integration.test.ts +1 -4
  122. package/lib/server/__integration__/server-lifecycle.test.ts +2 -5
  123. package/lib/server/__integration__/ssr-rendering.test.ts +47 -37
  124. package/lib/server/__integration__/static-assets.test.ts +1 -1
  125. package/lib/server/__integration__/test-helpers.ts +84 -70
  126. package/lib/server/ab/generateFunctions.ts +12 -10
  127. package/lib/server/astro/cmsPageEmitter.ts +23 -38
  128. package/lib/server/astro/componentEmitter.ts +25 -36
  129. package/lib/server/astro/cssCollector.ts +10 -26
  130. package/lib/server/astro/nodeToAstro.test.ts +1750 -30
  131. package/lib/server/astro/nodeToAstro.ts +198 -187
  132. package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +105 -109
  133. package/lib/server/astro/normalizeOrphanTemplateProps.ts +4 -12
  134. package/lib/server/astro/pageEmitter.ts +9 -13
  135. package/lib/server/astro/tailwindMapper.test.ts +10 -37
  136. package/lib/server/astro/tailwindMapper.ts +33 -40
  137. package/lib/server/astro/templateTransformer.ts +14 -17
  138. package/lib/server/createServer.ts +5 -17
  139. package/lib/server/cssGenerator.test.ts +35 -44
  140. package/lib/server/cssGenerator.ts +6 -17
  141. package/lib/server/fileWatcher.test.ts +124 -10
  142. package/lib/server/fileWatcher.ts +124 -118
  143. package/lib/server/index.ts +7 -1
  144. package/lib/server/jsonLoader.test.ts +39 -2
  145. package/lib/server/jsonLoader.ts +33 -31
  146. package/lib/server/middleware/cors.test.ts +20 -20
  147. package/lib/server/middleware/cors.ts +28 -4
  148. package/lib/server/middleware/errorHandler.test.ts +5 -3
  149. package/lib/server/middleware/errorHandler.ts +3 -8
  150. package/lib/server/middleware/index.ts +0 -1
  151. package/lib/server/middleware/logger.test.ts +7 -5
  152. package/lib/server/middleware/logger.ts +10 -22
  153. package/lib/server/pageCache.test.ts +76 -77
  154. package/lib/server/pageCache.ts +0 -1
  155. package/lib/server/projectContext.ts +4 -3
  156. package/lib/server/providers/fileSystemCMSProvider.test.ts +124 -95
  157. package/lib/server/providers/fileSystemCMSProvider.ts +35 -20
  158. package/lib/server/providers/fileSystemPageProvider.test.ts +84 -0
  159. package/lib/server/providers/fileSystemPageProvider.ts +31 -12
  160. package/lib/server/routes/api/cms.test.ts +26 -14
  161. package/lib/server/routes/api/cms.ts +9 -14
  162. package/lib/server/routes/api/components.ts +30 -34
  163. package/lib/server/routes/api/config.ts +0 -1
  164. package/lib/server/routes/api/core-routes.ts +47 -74
  165. package/lib/server/routes/api/functions.ts +8 -16
  166. package/lib/server/routes/api/index.ts +3 -6
  167. package/lib/server/routes/api/pages.ts +8 -11
  168. package/lib/server/routes/api/shared.test.ts +1 -1
  169. package/lib/server/routes/api/shared.ts +12 -9
  170. package/lib/server/routes/api/variables.test.ts +1 -3
  171. package/lib/server/routes/api/variables.ts +1 -1
  172. package/lib/server/routes/index.ts +23 -26
  173. package/lib/server/routes/pages.ts +34 -29
  174. package/lib/server/routes/static.ts +16 -4
  175. package/lib/server/runtime/bundler.ts +47 -32
  176. package/lib/server/runtime/fs.ts +3 -13
  177. package/lib/server/runtime/httpServer.ts +5 -9
  178. package/lib/server/services/ColorService.ts +32 -27
  179. package/lib/server/services/EnumService.test.ts +2 -6
  180. package/lib/server/services/EnumService.ts +7 -2
  181. package/lib/server/services/VariableService.test.ts +1 -5
  182. package/lib/server/services/VariableService.ts +6 -1
  183. package/lib/server/services/cmsService.test.ts +116 -78
  184. package/lib/server/services/cmsService.ts +24 -54
  185. package/lib/server/services/componentService.test.ts +122 -36
  186. package/lib/server/services/componentService.ts +54 -38
  187. package/lib/server/services/configService.test.ts +9 -31
  188. package/lib/server/services/configService.ts +20 -27
  189. package/lib/server/services/fileWatcherService.ts +40 -6
  190. package/lib/server/services/index.ts +0 -1
  191. package/lib/server/services/pageService.test.ts +1 -3
  192. package/lib/server/services/pageService.ts +14 -13
  193. package/lib/server/ssr/attributeBuilder.ts +16 -6
  194. package/lib/server/ssr/buildErrorOverlay.ts +11 -12
  195. package/lib/server/ssr/clientDataInjector.ts +7 -21
  196. package/lib/server/ssr/cmsSSRProcessor.ts +3 -6
  197. package/lib/server/ssr/cssCollector.ts +1 -1
  198. package/lib/server/ssr/errorOverlay.test.ts +1 -1
  199. package/lib/server/ssr/errorOverlay.ts +3 -9
  200. package/lib/server/ssr/htmlGenerator.nonce.test.ts +3 -9
  201. package/lib/server/ssr/htmlGenerator.test.ts +120 -43
  202. package/lib/server/ssr/htmlGenerator.ts +120 -85
  203. package/lib/server/ssr/imageMetadata.test.ts +3 -1
  204. package/lib/server/ssr/imageMetadata.ts +25 -19
  205. package/lib/server/ssr/jsCollector.test.ts +3 -13
  206. package/lib/server/ssr/jsCollector.ts +3 -8
  207. package/lib/server/ssr/liveReloadIntegration.test.ts +69 -28
  208. package/lib/server/ssr/metaTagGenerator.ts +2 -2
  209. package/lib/server/ssr/ssrRenderer.branches.test.ts +1103 -0
  210. package/lib/server/ssr/ssrRenderer.test.ts +196 -246
  211. package/lib/server/ssr/ssrRenderer.ts +609 -225
  212. package/lib/server/ssrRenderer.test.ts +1044 -950
  213. package/lib/server/utils/jsonLineMapper.test.ts +28 -28
  214. package/lib/server/utils/jsonLineMapper.ts +1 -1
  215. package/lib/server/validateStyleCoverage.ts +18 -20
  216. package/lib/server/webflow/buildWebflow.ts +41 -53
  217. package/lib/server/webflow/nodeToWebflow.test.ts +150 -218
  218. package/lib/server/webflow/nodeToWebflow.ts +195 -258
  219. package/lib/server/webflow/styleMapper.test.ts +15 -56
  220. package/lib/server/webflow/styleMapper.ts +33 -41
  221. package/lib/server/webflow/types.ts +1 -8
  222. package/lib/server/websocketManager.ts +16 -19
  223. package/lib/shared/attributeNodeUtils.test.ts +15 -15
  224. package/lib/shared/attributeNodeUtils.ts +5 -12
  225. package/lib/shared/breakpoints.ts +4 -11
  226. package/lib/shared/cmsQueryParser.test.ts +50 -42
  227. package/lib/shared/cmsQueryParser.ts +49 -31
  228. package/lib/shared/colorVariableUtils.test.ts +5 -5
  229. package/lib/shared/colorVariableUtils.ts +3 -8
  230. package/lib/shared/componentRefs.ts +1 -5
  231. package/lib/shared/constants.test.ts +3 -3
  232. package/lib/shared/constants.ts +4 -8
  233. package/lib/shared/cssGeneration.test.ts +262 -144
  234. package/lib/shared/cssGeneration.ts +189 -516
  235. package/lib/shared/cssNamedColors.ts +152 -30
  236. package/lib/shared/cssProperties.test.ts +5 -6
  237. package/lib/shared/cssProperties.ts +296 -112
  238. package/lib/shared/elementClassName.test.ts +109 -109
  239. package/lib/shared/elementClassName.ts +1 -1
  240. package/lib/shared/elementUtils.ts +12 -16
  241. package/lib/shared/errorLogger.ts +2 -10
  242. package/lib/shared/errors.test.ts +2 -13
  243. package/lib/shared/errors.ts +2 -8
  244. package/lib/shared/expressionEvaluator.test.ts +119 -0
  245. package/lib/shared/expressionEvaluator.ts +43 -24
  246. package/lib/shared/fontLoader.test.ts +19 -5
  247. package/lib/shared/friendlyError.ts +2 -3
  248. package/lib/shared/gradientUtils.test.ts +1 -5
  249. package/lib/shared/gradientUtils.ts +2 -6
  250. package/lib/shared/hrefRefs.ts +2 -10
  251. package/lib/shared/i18n.test.ts +1 -1
  252. package/lib/shared/i18n.ts +13 -34
  253. package/lib/shared/index.ts +4 -0
  254. package/lib/shared/inlineSvgStyleRules.ts +2 -4
  255. package/lib/shared/interactiveStyleMappings.test.ts +11 -33
  256. package/lib/shared/interactiveStyleMappings.ts +9 -16
  257. package/lib/shared/interactiveStyles.test.ts +165 -188
  258. package/lib/shared/interfaces/contentProvider.ts +1 -1
  259. package/lib/shared/itemTemplateUtils.test.ts +6 -12
  260. package/lib/shared/itemTemplateUtils.ts +19 -35
  261. package/lib/shared/jsonRepair.ts +8 -2
  262. package/lib/shared/libraryLoader.test.ts +15 -49
  263. package/lib/shared/libraryLoader.ts +7 -22
  264. package/lib/shared/netlifyLocale404.test.ts +179 -0
  265. package/lib/shared/netlifyLocale404.ts +110 -0
  266. package/lib/shared/nodeUtils.test.ts +24 -16
  267. package/lib/shared/nodeUtils.ts +49 -19
  268. package/lib/shared/pathArrayUtils.test.ts +1 -2
  269. package/lib/shared/pathArrayUtils.ts +1 -1
  270. package/lib/shared/pathSecurity.ts +1 -1
  271. package/lib/shared/pathUtils.test.ts +4 -6
  272. package/lib/shared/pathUtils.ts +42 -48
  273. package/lib/shared/paths/Path.test.ts +2 -2
  274. package/lib/shared/paths/Path.ts +0 -1
  275. package/lib/shared/paths/PathConverter.test.ts +1 -1
  276. package/lib/shared/paths/PathConverter.ts +14 -17
  277. package/lib/shared/paths/PathUtils.ts +9 -10
  278. package/lib/shared/paths/PathValidator.test.ts +2 -15
  279. package/lib/shared/paths/PathValidator.ts +11 -9
  280. package/lib/shared/paths/index.ts +1 -2
  281. package/lib/shared/propResolver.test.ts +240 -244
  282. package/lib/shared/propResolver.ts +14 -25
  283. package/lib/shared/pxToRem.test.ts +7 -6
  284. package/lib/shared/pxToRem.ts +2 -5
  285. package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +9 -5
  286. package/lib/shared/registry/ClientRegistry.ts +0 -1
  287. package/lib/shared/registry/ComponentRegistry.test.ts +43 -29
  288. package/lib/shared/registry/ComponentRegistry.ts +9 -11
  289. package/lib/shared/registry/NodeTypeDefinition.ts +15 -8
  290. package/lib/shared/registry/RegistryManager.ts +1 -2
  291. package/lib/shared/registry/SSRRegistry.ts +0 -1
  292. package/lib/shared/registry/createNodeType.ts +7 -9
  293. package/lib/shared/registry/defineNodeType.ts +2 -6
  294. package/lib/shared/registry/index.ts +0 -1
  295. package/lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts +14 -15
  296. package/lib/shared/registry/nodeTypes/EmbedNodeType.ts +18 -11
  297. package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +47 -18
  298. package/lib/shared/registry/nodeTypes/LinkNodeType.ts +21 -19
  299. package/lib/shared/registry/nodeTypes/ListNodeType.ts +78 -74
  300. package/lib/shared/registry/nodeTypes/LocaleListNodeType.ts +27 -21
  301. package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +6 -7
  302. package/lib/shared/registry/nodeTypes/index.ts +10 -2
  303. package/lib/shared/responsiveScaling.test.ts +15 -31
  304. package/lib/shared/responsiveScaling.ts +55 -37
  305. package/lib/shared/responsiveStyleUtils.ts +11 -13
  306. package/lib/shared/richtext/htmlToTiptap.test.ts +23 -14
  307. package/lib/shared/richtext/htmlToTiptap.ts +1 -3
  308. package/lib/shared/richtext/tiptapToHtml.test.ts +5 -6
  309. package/lib/shared/richtext/types.ts +1 -8
  310. package/lib/shared/slugTranslator.test.ts +13 -13
  311. package/lib/shared/slugTranslator.ts +12 -16
  312. package/lib/shared/slugify.ts +9 -15
  313. package/lib/shared/styleNodeUtils.test.ts +8 -8
  314. package/lib/shared/styleNodeUtils.ts +5 -10
  315. package/lib/shared/styleUtils.test.ts +87 -61
  316. package/lib/shared/styleUtils.ts +5 -6
  317. package/lib/shared/themeDefaults.test.ts +11 -11
  318. package/lib/shared/themeDefaults.ts +3 -4
  319. package/lib/shared/tree/PathBuilder.test.ts +62 -138
  320. package/lib/shared/tree/PathBuilder.ts +49 -39
  321. package/lib/shared/treePathUtils.test.ts +2 -10
  322. package/lib/shared/treePathUtils.ts +54 -59
  323. package/lib/shared/types/api.ts +1 -2
  324. package/lib/shared/types/cms.ts +25 -21
  325. package/lib/shared/types/comment.ts +49 -16
  326. package/lib/shared/types/components.ts +27 -25
  327. package/lib/shared/types/errors.test.ts +1 -6
  328. package/lib/shared/types/errors.ts +3 -7
  329. package/lib/shared/types/experiments.ts +28 -28
  330. package/lib/shared/types/index.ts +2 -2
  331. package/lib/shared/types/styles.ts +0 -1
  332. package/lib/shared/types/variables.test.ts +4 -13
  333. package/lib/shared/types/variables.ts +48 -27
  334. package/lib/shared/types.ts +1 -2
  335. package/lib/shared/utilityClassConfig.ts +648 -321
  336. package/lib/shared/utilityClassMapper.test.ts +203 -92
  337. package/lib/shared/utilityClassMapper.ts +188 -246
  338. package/lib/shared/utilityClassNames.ts +326 -0
  339. package/lib/shared/utils.test.ts +2 -10
  340. package/lib/shared/utils.ts +19 -10
  341. package/lib/shared/validation/cmsValidators.ts +2 -1
  342. package/lib/shared/validation/commentValidators.test.ts +53 -0
  343. package/lib/shared/validation/commentValidators.ts +12 -1
  344. package/lib/shared/validation/propValidator.test.ts +18 -20
  345. package/lib/shared/validation/propValidator.ts +12 -17
  346. package/lib/shared/validation/schemas.test.ts +24 -33
  347. package/lib/shared/validation/schemas.ts +469 -344
  348. package/lib/shared/validation/validators.test.ts +1 -6
  349. package/lib/shared/validation/validators.ts +89 -68
  350. package/lib/shared/viewportUnits.integration.test.ts +14 -10
  351. package/lib/shared/viewportUnits.test.ts +11 -23
  352. package/lib/test-utils/dom-setup.ts +1 -1
  353. package/lib/test-utils/factories/ConsoleMockFactory.ts +3 -7
  354. package/lib/test-utils/factories/DomMockFactory.ts +7 -19
  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 +5 -9
  358. package/lib/test-utils/factories/StoreMockFactory.ts +14 -25
  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 +12 -18
  365. package/lib/test-utils/mocks.ts +4 -2
  366. package/package.json +1 -1
  367. package/scripts/build-meno-filter.ts +1 -4
  368. package/vite.config.ts +4 -4
  369. package/dist/chunks/chunk-2MHDV5BF.js.map +0 -7
  370. package/dist/chunks/chunk-AZQYF6KE.js.map +0 -7
  371. package/dist/chunks/chunk-GZHGVVW3.js.map +0 -7
  372. package/dist/chunks/chunk-H3GJ4H2U.js.map +0 -7
  373. package/dist/chunks/chunk-I7YIGZXT.js.map +0 -7
  374. package/dist/chunks/chunk-IGYR22T6.js.map +0 -7
  375. package/dist/chunks/chunk-JGP5A3Y5.js.map +0 -7
  376. package/dist/chunks/chunk-JGWFTO6P.js.map +0 -7
  377. package/dist/chunks/chunk-O3NAGJP4.js.map +0 -7
  378. package/dist/chunks/chunk-QB2LNO4W.js.map +0 -7
  379. package/dist/chunks/chunk-R6XHAFBF.js.map +0 -7
  380. package/dist/chunks/chunk-UB44F4Z2.js.map +0 -7
  381. package/dist/chunks/chunk-WQFG7PAH.js.map +0 -7
  382. package/dist/chunks/chunk-X754AHS5.js.map +0 -7
  383. package/dist/chunks/chunk-YBLHKYFF.js.map +0 -7
  384. package/dist/chunks/configService-R3OGU2UD.js +0 -13
  385. /package/dist/chunks/{configService-R3OGU2UD.js.map → configService-PRJZF7Y6.js.map} +0 -0
  386. /package/dist/chunks/{constants-STK2YBIW.js.map → constants-KIQEYMAM.js.map} +0 -0
  387. /package/dist/chunks/{fs-JGINUXGL.js.map → fs-ZI5JEU7V.js.map} +0 -0
@@ -1,9 +1,175 @@
1
1
  /**
2
2
  * Centralized configuration for utility class mappings
3
- * Single source of truth for property-to-prefix and CSS generation
3
+ * Single source of truth for property-to-class-root and CSS generation.
4
+ *
5
+ * Naming follows Tailwind CSS conventions:
6
+ * - Static utilities reuse Tailwind's names: `flex`, `hidden`, `justify-center`,
7
+ * `items-center`, `uppercase`, `whitespace-nowrap`, …
8
+ * - Arbitrary values use Tailwind's bracket syntax with spaces encoded as
9
+ * underscores: `p-[40px]`, `w-[50%]`, `m-[92px_0]`, `grid-cols-[repeat(3,1fr)]`.
10
+ * - CSS variables use Tailwind v4's parenthesis shorthand: `bg-(--primary)`,
11
+ * `text-(--primary)`; font-size variables carry a type hint:
12
+ * `text-(length:--font-size-lg)`.
13
+ * - Responsive overrides use breakpoint-name variants: `tablet:p-[24px]`,
14
+ * `mobile:text-[24px]`.
4
15
  */
5
16
 
6
- // Mapping of CSS properties to utility class prefixes
17
+ /**
18
+ * Canonical property emission/sort order. Shorthands (border, background) come
19
+ * before their longhands (borderColor, backgroundColor stays before backgroundImage)
20
+ * so generated CSS cascades correctly. Includes ALL known properties — also the
21
+ * ones without a value-carrying class root (statics-only / arbitrary-property).
22
+ */
23
+ export const propertyOrder: string[] = [
24
+ // Padding
25
+ 'padding',
26
+ 'paddingTop',
27
+ 'paddingRight',
28
+ 'paddingBottom',
29
+ 'paddingLeft',
30
+ 'paddingInline',
31
+ 'paddingBlock',
32
+ // Margin
33
+ 'margin',
34
+ 'marginTop',
35
+ 'marginRight',
36
+ 'marginBottom',
37
+ 'marginLeft',
38
+ 'marginInline',
39
+ 'marginBlock',
40
+ // Display & Layout
41
+ 'display',
42
+ 'flexDirection',
43
+ 'justifyContent',
44
+ 'alignItems',
45
+ 'alignContent',
46
+ 'flex',
47
+ 'flexWrap',
48
+ 'gap',
49
+ 'rowGap',
50
+ 'columnGap',
51
+ // Sizing
52
+ 'width',
53
+ 'height',
54
+ 'maxWidth',
55
+ 'maxHeight',
56
+ 'minWidth',
57
+ 'minHeight',
58
+ 'aspectRatio',
59
+ // Colors & Background
60
+ 'backgroundColor',
61
+ 'background',
62
+ 'backgroundImage',
63
+ 'color',
64
+ // Borders & Radius
65
+ 'border',
66
+ 'borderRadius',
67
+ 'borderTop',
68
+ 'borderRight',
69
+ 'borderBottom',
70
+ 'borderLeft',
71
+ 'borderTopLeftRadius',
72
+ 'borderTopRightRadius',
73
+ 'borderBottomLeftRadius',
74
+ 'borderBottomRightRadius',
75
+ 'borderColor',
76
+ // Text
77
+ 'fontSize',
78
+ 'fontWeight',
79
+ 'fontFamily',
80
+ 'textAlign',
81
+ 'textDecoration',
82
+ 'textTransform',
83
+ 'lineHeight',
84
+ 'letterSpacing',
85
+ 'wordBreak',
86
+ 'overflowWrap',
87
+ 'textIndent',
88
+ 'verticalAlign',
89
+ 'whiteSpace',
90
+ // Lists
91
+ 'listStyle',
92
+ 'listStyleType',
93
+ 'listStylePosition',
94
+ // Transform & Effects
95
+ 'opacity',
96
+ 'transform',
97
+ 'transformOrigin',
98
+ 'boxShadow',
99
+ 'textShadow',
100
+ 'filter',
101
+ 'backdropFilter',
102
+ 'backfaceVisibility',
103
+ 'mixBlendMode',
104
+ 'clipPath',
105
+ // Positioning
106
+ 'position',
107
+ 'top',
108
+ 'right',
109
+ 'bottom',
110
+ 'left',
111
+ 'inset',
112
+ 'zIndex',
113
+ // Grid Layout
114
+ 'gridTemplateColumns',
115
+ 'gridTemplateRows',
116
+ 'gridTemplateAreas',
117
+ 'gridGap',
118
+ 'gridAutoFlow',
119
+ 'gridColumn',
120
+ 'gridRow',
121
+ 'gridArea',
122
+ 'gridAutoRows',
123
+ 'gridAutoColumns',
124
+ 'justifyItems',
125
+ 'justifySelf',
126
+ 'placeContent',
127
+ 'placeItems',
128
+ 'placeSelf',
129
+ // Flexbox extras
130
+ 'flexGrow',
131
+ 'flexShrink',
132
+ 'flexBasis',
133
+ 'order',
134
+ 'alignSelf',
135
+ // Outline
136
+ 'outline',
137
+ 'outlineWidth',
138
+ 'outlineStyle',
139
+ 'outlineColor',
140
+ 'outlineOffset',
141
+ // Other
142
+ 'overflow',
143
+ 'overflowX',
144
+ 'overflowY',
145
+ 'cursor',
146
+ 'pointerEvents',
147
+ 'userSelect',
148
+ 'transition',
149
+ 'objectFit',
150
+ 'objectPosition',
151
+ 'boxSizing',
152
+ 'visibility',
153
+ 'resize',
154
+ 'scrollBehavior',
155
+ 'accentColor',
156
+ ];
157
+
158
+ /**
159
+ * Mapping of CSS properties to Tailwind class roots — only for properties that
160
+ * can carry a value (`root-[value]`, `root-(--var)`, `root-keyword`).
161
+ * Properties whose values are always keywords (display, position, textAlign, …)
162
+ * live in `staticUtilities` instead; properties with no Tailwind root fall back
163
+ * to arbitrary-property syntax `[clip-path:circle(50%)]`.
164
+ *
165
+ * Several properties intentionally SHARE a root (Tailwind semantics) and are
166
+ * disambiguated by value type at parse time:
167
+ * - `text` → color | fontSize
168
+ * - `font` → fontWeight (numeric) | fontFamily
169
+ * - `bg` → backgroundColor | backgroundImage (url()/gradients)
170
+ * - `border` → border shorthand | borderColor
171
+ * - `outline`→ outline shorthand | outlineWidth | outlineColor
172
+ */
7
173
  export const propertyMap: Record<string, string> = {
8
174
  // Padding
9
175
  padding: 'p',
@@ -23,136 +189,102 @@ export const propertyMap: Record<string, string> = {
23
189
  marginInline: 'mx',
24
190
  marginBlock: 'my',
25
191
 
26
- // Display & Layout
27
- display: 'd',
28
- flexDirection: 'fd',
29
- justifyContent: 'jc',
30
- alignItems: 'ai',
31
- alignContent: 'ac',
192
+ // Flexbox
32
193
  flex: 'flex',
33
- flexWrap: 'fw',
34
- gap: 'g',
35
- rowGap: 'rg',
36
- columnGap: 'cg',
194
+ gap: 'gap',
195
+ rowGap: 'gap-y',
196
+ columnGap: 'gap-x',
197
+ flexGrow: 'grow',
198
+ flexShrink: 'shrink',
199
+ flexBasis: 'basis',
200
+ order: 'order',
37
201
 
38
202
  // Sizing
39
203
  width: 'w',
40
204
  height: 'h',
41
- maxWidth: 'mw',
42
- maxHeight: 'mh',
43
- minWidth: 'miw',
44
- minHeight: 'mih',
45
- aspectRatio: 'ar',
205
+ maxWidth: 'max-w',
206
+ maxHeight: 'max-h',
207
+ minWidth: 'min-w',
208
+ minHeight: 'min-h',
209
+ aspectRatio: 'aspect',
46
210
 
47
211
  // Colors & Background
48
- backgroundColor: 'bgc',
49
- background: 'bg',
50
- backgroundImage: 'bgi',
51
- color: 'c',
212
+ backgroundColor: 'bg',
213
+ backgroundImage: 'bg',
214
+ color: 'text',
52
215
 
53
216
  // Borders & Radius
54
- border: 'b',
55
- borderRadius: 'br',
56
- borderTop: 'bt',
217
+ border: 'border',
218
+ borderColor: 'border',
219
+ borderTop: 'border-t',
57
220
  borderRight: 'border-r',
58
- borderBottom: 'bb',
59
- borderLeft: 'bl',
60
- borderTopLeftRadius: 'brtl',
61
- borderTopRightRadius: 'brtr',
62
- borderBottomLeftRadius: 'brbl',
63
- borderBottomRightRadius: 'brbr',
64
- borderColor: 'bc',
221
+ borderBottom: 'border-b',
222
+ borderLeft: 'border-l',
223
+ borderRadius: 'rounded',
224
+ borderTopLeftRadius: 'rounded-tl',
225
+ borderTopRightRadius: 'rounded-tr',
226
+ borderBottomLeftRadius: 'rounded-bl',
227
+ borderBottomRightRadius: 'rounded-br',
65
228
 
66
229
  // Text
67
- fontSize: 'fs',
68
- fontWeight: 'fe',
69
- fontFamily: 'ff',
70
- textAlign: 'ta',
71
- textDecoration: 'td',
72
- textTransform: 'tt',
73
- lineHeight: 'lh',
74
- letterSpacing: 'ls',
75
- wordBreak: 'wb',
76
- overflowWrap: 'ow',
77
- textIndent: 'ti',
78
- verticalAlign: 'va',
79
- whiteSpace: 'whs',
230
+ fontSize: 'text',
231
+ fontWeight: 'font',
232
+ fontFamily: 'font',
233
+ lineHeight: 'leading',
234
+ letterSpacing: 'tracking',
235
+ textIndent: 'indent',
236
+ verticalAlign: 'align',
80
237
 
81
238
  // Lists
82
- listStyle: 'lst',
83
- listStyleType: 'lstt',
84
- listStylePosition: 'lstp',
239
+ listStyleType: 'list',
85
240
 
86
241
  // Transform & Effects
87
- opacity: 'o',
88
- transform: 'tm',
89
- transformOrigin: 'tmo',
90
- boxShadow: 'bsh',
91
- textShadow: 'ts',
92
- filter: 'flt',
93
- backdropFilter: 'bdf',
94
- backfaceVisibility: 'bfv',
95
- mixBlendMode: 'mbm',
96
- clipPath: 'cp',
242
+ opacity: 'opacity',
243
+ transform: 'transform',
244
+ transformOrigin: 'origin',
245
+ boxShadow: 'shadow',
246
+ textShadow: 'text-shadow',
247
+ filter: 'filter',
248
+ backdropFilter: 'backdrop-filter',
97
249
 
98
250
  // Positioning
99
- position: 'pos',
100
251
  top: 'top',
101
- right: 'r',
102
- bottom: 'bo',
103
- left: 'l',
104
- inset: 'ins',
252
+ right: 'right',
253
+ bottom: 'bottom',
254
+ left: 'left',
255
+ inset: 'inset',
105
256
  zIndex: 'z',
106
257
 
107
258
  // Grid Layout
108
- gridTemplateColumns: 'gtc',
109
- gridTemplateRows: 'gtr',
110
- gridTemplateAreas: 'gta',
111
- gridGap: 'gg',
112
- gridAutoFlow: 'gaf',
113
- gridColumn: 'gc',
114
- gridRow: 'gr',
115
- gridArea: 'ga',
116
- gridAutoRows: 'gar',
117
- gridAutoColumns: 'gac',
118
- justifyItems: 'ji',
119
- justifySelf: 'jse',
120
- placeContent: 'plc',
121
- placeItems: 'pli',
122
- placeSelf: 'pls',
123
-
124
- // Flexbox extras
125
- flexGrow: 'fg',
126
- flexShrink: 'fsh',
127
- flexBasis: 'fb',
128
- order: 'ord',
129
- alignSelf: 'as',
259
+ gridTemplateColumns: 'grid-cols',
260
+ gridTemplateRows: 'grid-rows',
261
+ gridColumn: 'col',
262
+ gridRow: 'row',
263
+ gridAutoRows: 'auto-rows',
264
+ gridAutoColumns: 'auto-cols',
130
265
 
131
266
  // Outline
132
- outline: 'ol',
133
- outlineWidth: 'olw',
134
- outlineStyle: 'ols',
135
- outlineColor: 'olc',
136
- outlineOffset: 'olo',
267
+ outline: 'outline',
268
+ outlineWidth: 'outline',
269
+ outlineColor: 'outline',
270
+ outlineOffset: 'outline-offset',
137
271
 
138
272
  // Other
139
- overflow: 'ov',
140
- overflowX: 'ovx',
141
- overflowY: 'ovy',
142
- cursor: 'cu',
143
- pointerEvents: 'pe',
144
- userSelect: 'us',
145
- transition: 'tn',
146
- objectFit: 'objf',
147
- objectPosition: 'objp',
148
- boxSizing: 'bsz',
149
- visibility: 'vis',
150
- resize: 'rsz',
151
- scrollBehavior: 'scb',
152
- accentColor: 'acc',
273
+ overflow: 'overflow',
274
+ overflowX: 'overflow-x',
275
+ overflowY: 'overflow-y',
276
+ cursor: 'cursor',
277
+ transition: 'transition',
278
+ objectPosition: 'object',
279
+ accentColor: 'accent',
153
280
  };
154
281
 
155
- // Mapping of prefixes to CSS property names for dynamic rule generation
282
+ /**
283
+ * Mapping of class roots to their DEFAULT CSS property (kebab-case).
284
+ * Roots shared by several properties (text, font, bg, border, outline, object)
285
+ * map to their most common property here; value-type disambiguation happens in
286
+ * `resolveRootProperty` (utilityClassNames.ts).
287
+ */
156
288
  export const prefixToCSSProperty: Record<string, string> = {
157
289
  // Spacing
158
290
  p: 'padding',
@@ -169,275 +301,455 @@ export const prefixToCSSProperty: Record<string, string> = {
169
301
  ml: 'margin-left',
170
302
  mx: 'margin',
171
303
  my: 'margin',
172
- g: 'gap',
173
- rg: 'row-gap',
174
- cg: 'column-gap',
304
+ gap: 'gap',
305
+ 'gap-y': 'row-gap',
306
+ 'gap-x': 'column-gap',
175
307
 
176
308
  // Sizing
177
309
  w: 'width',
178
310
  h: 'height',
179
- mw: 'max-width',
180
- mh: 'max-height',
181
- miw: 'min-width',
182
- mih: 'min-height',
183
- ar: 'aspect-ratio',
311
+ 'max-w': 'max-width',
312
+ 'max-h': 'max-height',
313
+ 'min-w': 'min-width',
314
+ 'min-h': 'min-height',
315
+ aspect: 'aspect-ratio',
184
316
 
185
317
  // Colors & Background
186
- bgc: 'background-color',
187
- bg: 'background',
188
- bgi: 'background-image',
189
- c: 'color',
190
- bc: 'border-color',
318
+ bg: 'background-color',
319
+ text: 'color',
320
+ accent: 'accent-color',
191
321
 
192
322
  // Borders
193
- b: 'border',
194
- br: 'border-radius',
195
- brtl: 'border-top-left-radius',
196
- brtr: 'border-top-right-radius',
197
- brbl: 'border-bottom-left-radius',
198
- brbr: 'border-bottom-right-radius',
199
- bt: 'border-top',
200
- bb: 'border-bottom',
201
- bl: 'border-left',
323
+ border: 'border',
324
+ 'border-t': 'border-top',
202
325
  'border-r': 'border-right',
326
+ 'border-b': 'border-bottom',
327
+ 'border-l': 'border-left',
328
+ rounded: 'border-radius',
329
+ 'rounded-tl': 'border-top-left-radius',
330
+ 'rounded-tr': 'border-top-right-radius',
331
+ 'rounded-bl': 'border-bottom-left-radius',
332
+ 'rounded-br': 'border-bottom-right-radius',
203
333
 
204
334
  // Text
205
- fs: 'font-size',
206
- fe: 'font-weight',
207
- ff: 'font-family',
208
- ta: 'text-align',
209
- td: 'text-decoration',
210
- tt: 'text-transform',
211
- lh: 'line-height',
212
- ls: 'letter-spacing',
213
- wb: 'word-break',
214
- ow: 'overflow-wrap',
215
- ti: 'text-indent',
216
- va: 'vertical-align',
217
- whs: 'white-space',
335
+ font: 'font-weight',
336
+ leading: 'line-height',
337
+ tracking: 'letter-spacing',
338
+ indent: 'text-indent',
339
+ align: 'vertical-align',
218
340
 
219
341
  // Lists
220
- lst: 'list-style',
221
- lstt: 'list-style-type',
222
- lstp: 'list-style-position',
223
-
224
- // Display
225
- d: 'display',
342
+ list: 'list-style-type',
226
343
 
227
344
  // Flexbox
228
- fd: 'flex-direction',
229
- jc: 'justify-content',
230
- ai: 'align-items',
231
- ac: 'align-content',
232
- as: 'align-self',
233
345
  flex: 'flex',
234
- fw: 'flex-wrap',
235
- fg: 'flex-grow',
236
- fsh: 'flex-shrink',
237
- fb: 'flex-basis',
238
- ord: 'order',
346
+ grow: 'flex-grow',
347
+ shrink: 'flex-shrink',
348
+ basis: 'flex-basis',
349
+ order: 'order',
239
350
 
240
351
  // Grid
241
- gtc: 'grid-template-columns',
242
- gtr: 'grid-template-rows',
243
- gta: 'grid-template-areas',
244
- gg: 'grid-gap',
245
- gaf: 'grid-auto-flow',
246
- gc: 'grid-column',
247
- gr: 'grid-row',
248
- ga: 'grid-area',
249
- gar: 'grid-auto-rows',
250
- gac: 'grid-auto-columns',
251
- ji: 'justify-items',
252
- jse: 'justify-self',
253
- plc: 'place-content',
254
- pli: 'place-items',
255
- pls: 'place-self',
352
+ 'grid-cols': 'grid-template-columns',
353
+ 'grid-rows': 'grid-template-rows',
354
+ col: 'grid-column',
355
+ row: 'grid-row',
356
+ 'auto-rows': 'grid-auto-rows',
357
+ 'auto-cols': 'grid-auto-columns',
256
358
 
257
359
  // Effects
258
- o: 'opacity',
259
- tm: 'transform',
260
- tmo: 'transform-origin',
261
- bsh: 'box-shadow',
262
- ts: 'text-shadow',
263
- flt: 'filter',
264
- bdf: 'backdrop-filter',
265
- bfv: 'backface-visibility',
266
- mbm: 'mix-blend-mode',
267
- cp: 'clip-path',
360
+ opacity: 'opacity',
361
+ transform: 'transform',
362
+ origin: 'transform-origin',
363
+ shadow: 'box-shadow',
364
+ 'text-shadow': 'text-shadow',
365
+ filter: 'filter',
366
+ 'backdrop-filter': 'backdrop-filter',
268
367
 
269
368
  // Positioning
270
- pos: 'position',
271
369
  top: 'top',
272
- r: 'right',
273
- bo: 'bottom',
274
- l: 'left',
275
- ins: 'inset',
370
+ right: 'right',
371
+ bottom: 'bottom',
372
+ left: 'left',
373
+ inset: 'inset',
276
374
  z: 'z-index',
277
375
 
278
376
  // Outline
279
- ol: 'outline',
280
- olw: 'outline-width',
281
- ols: 'outline-style',
282
- olc: 'outline-color',
283
- olo: 'outline-offset',
377
+ outline: 'outline',
378
+ 'outline-offset': 'outline-offset',
284
379
 
285
380
  // Other
286
- ov: 'overflow',
287
- ovx: 'overflow-x',
288
- ovy: 'overflow-y',
289
- cu: 'cursor',
290
- pe: 'pointer-events',
291
- us: 'user-select',
292
- tn: 'transition',
293
- objf: 'object-fit',
294
- objp: 'object-position',
295
- bsz: 'box-sizing',
296
- vis: 'visibility',
297
- rsz: 'resize',
298
- scb: 'scroll-behavior',
299
- acc: 'accent-color',
381
+ overflow: 'overflow',
382
+ 'overflow-x': 'overflow-x',
383
+ 'overflow-y': 'overflow-y',
384
+ cursor: 'cursor',
385
+ transition: 'transition',
386
+ object: 'object-position',
300
387
  };
301
388
 
302
- // Special value mappings for specific properties
303
- export const specialValueMappings: Record<string, Record<string, string>> = {
389
+ /**
390
+ * Static utilities: property value Tailwind class name.
391
+ * These are emitted as-is (no brackets) and have fixed reverse mappings.
392
+ * When two values map to the same class (e.g. 'flex-start' and 'start' →
393
+ * `justify-start`), the FIRST entry is the canonical reverse value.
394
+ */
395
+ export const staticUtilities: Record<string, Record<string, string>> = {
304
396
  display: {
305
- flex: 'f',
306
- grid: 'g',
307
- block: 'b',
308
- inline: 'i',
309
- 'inline-block': 'ib',
310
- none: 'h',
311
- 'inline-flex': 'if',
312
- 'inline-grid': 'ig',
397
+ flex: 'flex',
398
+ grid: 'grid',
399
+ block: 'block',
400
+ inline: 'inline',
401
+ 'inline-block': 'inline-block',
402
+ none: 'hidden',
403
+ 'inline-flex': 'inline-flex',
404
+ 'inline-grid': 'inline-grid',
405
+ table: 'table',
406
+ contents: 'contents',
407
+ 'flow-root': 'flow-root',
408
+ 'list-item': 'list-item',
313
409
  },
314
410
  flexDirection: {
315
- column: 'fd-col',
316
- row: 'fd-row',
411
+ column: 'flex-col',
412
+ row: 'flex-row',
413
+ 'column-reverse': 'flex-col-reverse',
414
+ 'row-reverse': 'flex-row-reverse',
415
+ },
416
+ flexWrap: {
417
+ wrap: 'flex-wrap',
418
+ nowrap: 'flex-nowrap',
419
+ 'wrap-reverse': 'flex-wrap-reverse',
420
+ },
421
+ flex: {
422
+ '1': 'flex-1',
423
+ auto: 'flex-auto',
424
+ none: 'flex-none',
425
+ initial: 'flex-initial',
426
+ },
427
+ flexGrow: {
428
+ '1': 'grow',
429
+ '0': 'grow-0',
430
+ },
431
+ flexShrink: {
432
+ '1': 'shrink',
433
+ '0': 'shrink-0',
317
434
  },
318
435
  justifyContent: {
319
- center: 'jc-c',
320
- 'flex-start': 'jc-s',
321
- 'flex-end': 'jc-e',
322
- 'space-between': 'jc-b',
323
- 'space-around': 'jc-a',
324
- 'space-evenly': 'jc-ev',
436
+ center: 'justify-center',
437
+ 'flex-start': 'justify-start',
438
+ start: 'justify-start',
439
+ 'flex-end': 'justify-end',
440
+ end: 'justify-end',
441
+ 'space-between': 'justify-between',
442
+ 'space-around': 'justify-around',
443
+ 'space-evenly': 'justify-evenly',
444
+ stretch: 'justify-stretch',
445
+ normal: 'justify-normal',
325
446
  },
326
447
  alignItems: {
327
- center: 'ai-c',
328
- 'flex-start': 'ai-s',
329
- 'flex-end': 'ai-e',
330
- stretch: 'ai-st',
331
- baseline: 'ai-b',
448
+ center: 'items-center',
449
+ 'flex-start': 'items-start',
450
+ start: 'items-start',
451
+ 'flex-end': 'items-end',
452
+ end: 'items-end',
453
+ stretch: 'items-stretch',
454
+ baseline: 'items-baseline',
455
+ },
456
+ alignContent: {
457
+ center: 'content-center',
458
+ 'flex-start': 'content-start',
459
+ start: 'content-start',
460
+ 'flex-end': 'content-end',
461
+ end: 'content-end',
462
+ 'space-between': 'content-between',
463
+ 'space-around': 'content-around',
464
+ 'space-evenly': 'content-evenly',
465
+ stretch: 'content-stretch',
466
+ normal: 'content-normal',
467
+ },
468
+ alignSelf: {
469
+ auto: 'self-auto',
470
+ center: 'self-center',
471
+ 'flex-start': 'self-start',
472
+ start: 'self-start',
473
+ 'flex-end': 'self-end',
474
+ end: 'self-end',
475
+ stretch: 'self-stretch',
476
+ baseline: 'self-baseline',
477
+ },
478
+ justifyItems: {
479
+ center: 'justify-items-center',
480
+ start: 'justify-items-start',
481
+ end: 'justify-items-end',
482
+ stretch: 'justify-items-stretch',
483
+ },
484
+ justifySelf: {
485
+ auto: 'justify-self-auto',
486
+ center: 'justify-self-center',
487
+ start: 'justify-self-start',
488
+ end: 'justify-self-end',
489
+ stretch: 'justify-self-stretch',
490
+ },
491
+ placeContent: {
492
+ center: 'place-content-center',
493
+ start: 'place-content-start',
494
+ end: 'place-content-end',
495
+ 'space-between': 'place-content-between',
496
+ 'space-around': 'place-content-around',
497
+ 'space-evenly': 'place-content-evenly',
498
+ stretch: 'place-content-stretch',
499
+ },
500
+ placeItems: {
501
+ center: 'place-items-center',
502
+ start: 'place-items-start',
503
+ end: 'place-items-end',
504
+ stretch: 'place-items-stretch',
505
+ },
506
+ placeSelf: {
507
+ auto: 'place-self-auto',
508
+ center: 'place-self-center',
509
+ start: 'place-self-start',
510
+ end: 'place-self-end',
511
+ stretch: 'place-self-stretch',
512
+ },
513
+ position: {
514
+ static: 'static',
515
+ fixed: 'fixed',
516
+ absolute: 'absolute',
517
+ relative: 'relative',
518
+ sticky: 'sticky',
332
519
  },
333
520
  overflow: {
334
- hidden: 'o-h',
335
- auto: 'o-a',
336
- scroll: 'o-s',
337
- visible: 'o-v',
521
+ hidden: 'overflow-hidden',
522
+ auto: 'overflow-auto',
523
+ scroll: 'overflow-scroll',
524
+ visible: 'overflow-visible',
525
+ clip: 'overflow-clip',
338
526
  },
339
- cursor: {
340
- pointer: 'cursor-pointer',
341
- default: 'cursor-default',
527
+ overflowX: {
528
+ hidden: 'overflow-x-hidden',
529
+ auto: 'overflow-x-auto',
530
+ scroll: 'overflow-x-scroll',
531
+ visible: 'overflow-x-visible',
532
+ clip: 'overflow-x-clip',
533
+ },
534
+ overflowY: {
535
+ hidden: 'overflow-y-hidden',
536
+ auto: 'overflow-y-auto',
537
+ scroll: 'overflow-y-scroll',
538
+ visible: 'overflow-y-visible',
539
+ clip: 'overflow-y-clip',
540
+ },
541
+ textAlign: {
542
+ left: 'text-left',
543
+ center: 'text-center',
544
+ right: 'text-right',
545
+ justify: 'text-justify',
546
+ start: 'text-start',
547
+ end: 'text-end',
548
+ },
549
+ textDecoration: {
550
+ underline: 'underline',
551
+ overline: 'overline',
552
+ 'line-through': 'line-through',
553
+ none: 'no-underline',
554
+ },
555
+ textTransform: {
556
+ uppercase: 'uppercase',
557
+ lowercase: 'lowercase',
558
+ capitalize: 'capitalize',
559
+ none: 'normal-case',
560
+ },
561
+ whiteSpace: {
562
+ normal: 'whitespace-normal',
563
+ nowrap: 'whitespace-nowrap',
564
+ pre: 'whitespace-pre',
565
+ 'pre-wrap': 'whitespace-pre-wrap',
566
+ 'pre-line': 'whitespace-pre-line',
567
+ 'break-spaces': 'whitespace-break-spaces',
568
+ },
569
+ wordBreak: {
570
+ normal: 'break-normal',
571
+ 'break-all': 'break-all',
572
+ 'keep-all': 'break-keep',
573
+ 'break-word': 'break-word',
574
+ },
575
+ overflowWrap: {
576
+ normal: 'wrap-normal',
577
+ 'break-word': 'wrap-break-word',
578
+ anywhere: 'wrap-anywhere',
579
+ },
580
+ fontWeight: {
581
+ normal: 'font-normal',
582
+ bold: 'font-bold',
583
+ bolder: 'font-bolder',
584
+ lighter: 'font-lighter',
585
+ },
586
+ color: {
587
+ transparent: 'text-transparent',
588
+ currentColor: 'text-current',
589
+ inherit: 'text-inherit',
590
+ },
591
+ backgroundColor: {
592
+ transparent: 'bg-transparent',
593
+ currentColor: 'bg-current',
594
+ inherit: 'bg-inherit',
595
+ },
596
+ backgroundImage: {
597
+ none: 'bg-none',
598
+ },
599
+ borderColor: {
600
+ transparent: 'border-transparent',
601
+ currentColor: 'border-current',
602
+ inherit: 'border-inherit',
342
603
  },
343
604
  pointerEvents: {
344
- none: 'pe-none',
345
- auto: 'pe-auto',
605
+ none: 'pointer-events-none',
606
+ auto: 'pointer-events-auto',
346
607
  },
347
608
  userSelect: {
348
- none: 'us-none',
349
- auto: 'us-auto',
350
- text: 'us-text',
351
- all: 'us-all',
609
+ none: 'select-none',
610
+ auto: 'select-auto',
611
+ text: 'select-text',
612
+ all: 'select-all',
613
+ },
614
+ objectFit: {
615
+ contain: 'object-contain',
616
+ cover: 'object-cover',
617
+ fill: 'object-fill',
618
+ none: 'object-none',
619
+ 'scale-down': 'object-scale-down',
620
+ },
621
+ boxSizing: {
622
+ 'border-box': 'box-border',
623
+ 'content-box': 'box-content',
624
+ },
625
+ visibility: {
626
+ visible: 'visible',
627
+ hidden: 'invisible',
628
+ collapse: 'collapse',
629
+ },
630
+ resize: {
631
+ both: 'resize',
632
+ horizontal: 'resize-x',
633
+ vertical: 'resize-y',
634
+ none: 'resize-none',
635
+ },
636
+ scrollBehavior: {
637
+ smooth: 'scroll-smooth',
638
+ auto: 'scroll-auto',
639
+ },
640
+ gridAutoFlow: {
641
+ row: 'grid-flow-row',
642
+ column: 'grid-flow-col',
643
+ dense: 'grid-flow-dense',
644
+ 'row dense': 'grid-flow-row-dense',
645
+ 'column dense': 'grid-flow-col-dense',
646
+ },
647
+ listStyleType: {
648
+ none: 'list-none',
649
+ disc: 'list-disc',
650
+ decimal: 'list-decimal',
651
+ },
652
+ listStylePosition: {
653
+ inside: 'list-inside',
654
+ outside: 'list-outside',
655
+ },
656
+ backfaceVisibility: {
657
+ visible: 'backface-visible',
658
+ hidden: 'backface-hidden',
659
+ },
660
+ transition: {
661
+ none: 'transition-none',
662
+ },
663
+ transform: {
664
+ none: 'transform-none',
665
+ },
666
+ boxShadow: {
667
+ none: 'shadow-none',
668
+ },
669
+ outline: {
670
+ none: 'outline-none',
352
671
  },
353
- whiteSpace: {
354
- normal: 'whs-normal',
355
- nowrap: 'whs-nowrap',
356
- pre: 'whs-pre',
357
- 'pre-wrap': 'whs-pre-wrap',
358
- 'pre-line': 'whs-pre-line',
359
- },
360
- // Note: CSS functions (blur, translateY, scale, rotate, repeat) are now handled
361
- // dynamically in utilityClassMapper.ts - no need to hardcode specific values here
362
672
  };
363
673
 
364
- // Reverse mapping for class-to-style conversion
365
- export const classToStyleSpecialCases: Record<string, { prop: string; value: string }> = {
366
- f: { prop: 'display', value: 'flex' },
367
- 'fd-col': { prop: 'flexDirection', value: 'column' },
368
- 'fd-row': { prop: 'flexDirection', value: 'row' },
369
- g: { prop: 'display', value: 'grid' },
370
- b: { prop: 'display', value: 'block' },
371
- i: { prop: 'display', value: 'inline' },
372
- ib: { prop: 'display', value: 'inline-block' },
373
- h: { prop: 'display', value: 'none' },
374
- 'if': { prop: 'display', value: 'inline-flex' },
375
- ig: { prop: 'display', value: 'inline-grid' },
376
- 'jc-c': { prop: 'justifyContent', value: 'center' },
377
- 'jc-s': { prop: 'justifyContent', value: 'flex-start' },
378
- 'jc-e': { prop: 'justifyContent', value: 'flex-end' },
379
- 'jc-b': { prop: 'justifyContent', value: 'space-between' },
380
- 'jc-a': { prop: 'justifyContent', value: 'space-around' },
381
- 'jc-ev': { prop: 'justifyContent', value: 'space-evenly' },
382
- 'ai-c': { prop: 'alignItems', value: 'center' },
383
- 'ai-s': { prop: 'alignItems', value: 'flex-start' },
384
- 'ai-e': { prop: 'alignItems', value: 'flex-end' },
385
- 'ai-st': { prop: 'alignItems', value: 'stretch' },
386
- 'ai-b': { prop: 'alignItems', value: 'baseline' },
387
- 'o-h': { prop: 'overflow', value: 'hidden' },
388
- 'o-a': { prop: 'overflow', value: 'auto' },
389
- 'o-s': { prop: 'overflow', value: 'scroll' },
390
- 'o-v': { prop: 'overflow', value: 'visible' },
391
- 'cursor-pointer': { prop: 'cursor', value: 'pointer' },
392
- 'cursor-default': { prop: 'cursor', value: 'default' },
393
- 'pe-none': { prop: 'pointerEvents', value: 'none' },
394
- 'pe-auto': { prop: 'pointerEvents', value: 'auto' },
395
- 'us-none': { prop: 'userSelect', value: 'none' },
396
- 'us-auto': { prop: 'userSelect', value: 'auto' },
397
- 'us-text': { prop: 'userSelect', value: 'text' },
398
- 'us-all': { prop: 'userSelect', value: 'all' },
399
- 'whs-normal': { prop: 'whiteSpace', value: 'normal' },
400
- 'whs-nowrap': { prop: 'whiteSpace', value: 'nowrap' },
401
- 'whs-pre': { prop: 'whiteSpace', value: 'pre' },
402
- 'whs-pre-wrap': { prop: 'whiteSpace', value: 'pre-wrap' },
403
- 'whs-pre-line': { prop: 'whiteSpace', value: 'pre-line' },
404
- // Grid template columns
405
- 'gtc-2': { prop: 'gridTemplateColumns', value: 'repeat(2, 1fr)' },
406
- 'gtc-3': { prop: 'gridTemplateColumns', value: 'repeat(3, 1fr)' },
407
- 'gtc-4': { prop: 'gridTemplateColumns', value: 'repeat(4, 1fr)' },
408
- 'gtc-5': { prop: 'gridTemplateColumns', value: 'repeat(5, 1fr)' },
409
- 'gtc-6': { prop: 'gridTemplateColumns', value: 'repeat(6, 1fr)' },
410
- // Backdrop filter
411
- 'bdf-blur-4': { prop: 'backdropFilter', value: 'blur(4px)' },
412
- 'bdf-blur-8': { prop: 'backdropFilter', value: 'blur(8px)' },
413
- 'bdf-blur-10': { prop: 'backdropFilter', value: 'blur(10px)' },
414
- // Transform
415
- 'tm-ty-0': { prop: 'transform', value: 'translateY(0)' },
416
- 'tm-ty-n10': { prop: 'transform', value: 'translateY(-10px)' },
417
- 'tm-ty-n50p': { prop: 'transform', value: 'translateY(-50%)' },
418
- // Filter
419
- 'flt-blur-1': { prop: 'filter', value: 'blur(1px)' },
420
- // Shadow presets (reverse mapping)
421
- 'sh-0': { prop: 'boxShadow', value: 'none' },
422
- 'sh-1': { prop: 'boxShadow', value: '0 1px 2px rgba(0, 0, 0, 0.05)' },
423
- 'sh-2': { prop: 'boxShadow', value: '0 4px 12px rgba(0, 0, 0, 0.1)' },
424
- 'sh-3': { prop: 'boxShadow', value: '0 8px 24px rgba(0, 0, 0, 0.15)' },
425
- 'sh-4': { prop: 'boxShadow', value: '0 12px 32px rgba(0, 0, 0, 0.2)' },
426
- // Gradient presets (reverse mapping)
427
- 'gr-1': { prop: 'background', value: 'linear-gradient(90deg, rgba(10,22,40,0.85) 0%, rgba(10,22,40,0.2) 100%)' },
428
- 'gr-2': { prop: 'background', value: 'linear-gradient(0deg, #a9e8fd, #00aee8 25%, #0f1335 72%)' },
429
- // Border presets (reverse mapping)
430
- 'bd-0': { prop: 'border', value: '1px solid var(--border)' },
431
- 'bd-1': { prop: 'border', value: '1px solid var(--border-light)' },
674
+ /** Reverse mapping for static utilities: class → { prop, value } (canonical value). */
675
+ export const staticUtilityReverse: Record<string, { prop: string; value: string }> = (() => {
676
+ const reverse: Record<string, { prop: string; value: string }> = {};
677
+ for (const [prop, values] of Object.entries(staticUtilities)) {
678
+ for (const [value, className] of Object.entries(values)) {
679
+ if (!reverse[className]) {
680
+ reverse[className] = { prop, value };
681
+ }
682
+ }
683
+ }
684
+ return reverse;
685
+ })();
686
+
687
+ /**
688
+ * Named keyword values per class root: `root-keyword` → CSS value.
689
+ * Mirrors Tailwind's named sizes (`w-full`, `h-screen`, `m-auto`, `rounded-full`).
690
+ */
691
+ export const keywordValues: Record<string, Record<string, string>> = {
692
+ w: { auto: 'auto', full: '100%', screen: '100vw', fit: 'fit-content', min: 'min-content', max: 'max-content' },
693
+ h: { auto: 'auto', full: '100%', screen: '100vh', fit: 'fit-content', min: 'min-content', max: 'max-content' },
694
+ 'max-w': { full: '100%', none: 'none', screen: '100vw', fit: 'fit-content', min: 'min-content', max: 'max-content' },
695
+ 'max-h': { full: '100%', none: 'none', screen: '100vh', fit: 'fit-content', min: 'min-content', max: 'max-content' },
696
+ 'min-w': { auto: 'auto', full: '100%', fit: 'fit-content', min: 'min-content', max: 'max-content' },
697
+ 'min-h': { auto: 'auto', full: '100%', screen: '100vh', fit: 'fit-content', min: 'min-content', max: 'max-content' },
698
+ m: { auto: 'auto' },
699
+ mt: { auto: 'auto' },
700
+ mr: { auto: 'auto' },
701
+ mb: { auto: 'auto' },
702
+ ml: { auto: 'auto' },
703
+ mx: { auto: 'auto' },
704
+ my: { auto: 'auto' },
705
+ top: { auto: 'auto', full: '100%' },
706
+ right: { auto: 'auto', full: '100%' },
707
+ bottom: { auto: 'auto', full: '100%' },
708
+ left: { auto: 'auto', full: '100%' },
709
+ inset: { auto: 'auto', full: '100%' },
710
+ basis: { auto: 'auto', full: '100%' },
711
+ rounded: { none: '0', full: '9999px' },
712
+ 'rounded-tl': { none: '0', full: '9999px' },
713
+ 'rounded-tr': { none: '0', full: '9999px' },
714
+ 'rounded-bl': { none: '0', full: '9999px' },
715
+ 'rounded-br': { none: '0', full: '9999px' },
716
+ z: { auto: 'auto' },
717
+ leading: { normal: 'normal' },
718
+ tracking: { normal: 'normal' },
432
719
  };
433
720
 
721
+ /**
722
+ * Roots whose plain lowercase keyword values pass through verbatim:
723
+ * `cursor-pointer`, `align-middle`, `origin-center`, `object-center`, …
724
+ */
725
+ export const genericKeywordRoots: Set<string> = new Set(['cursor', 'align', 'origin', 'object', 'list']);
726
+
727
+ /**
728
+ * Roots that accept bare numeric values Tailwind-style: `z-10`, `order-2`,
729
+ * `flex-2`, `grow-2`. (`opacity` is handled separately — Tailwind's 0–100 scale.)
730
+ */
731
+ export const integerValueRoots: Set<string> = new Set(['z', 'order', 'flex', 'grow', 'shrink']);
732
+
733
+ /**
734
+ * Properties whose values are color tokens by Meno convention: a bare token
735
+ * (e.g. `primary`) refers to the CSS variable `--primary`. Forward: token →
736
+ * `root-(--token)`. Reverse: `root-(--token)` → bare token.
737
+ */
738
+ export const colorTokenProps: Set<string> = new Set([
739
+ 'color',
740
+ 'backgroundColor',
741
+ 'borderColor',
742
+ 'accentColor',
743
+ 'outlineColor',
744
+ ]);
745
+
434
746
  // ============================================================================
435
747
  // STYLE PRESETS
436
748
  // Predefined values for complex CSS properties (shadows, gradients, borders)
437
- // Usage: boxShadow: "2" → class "sh-2" → "box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1)"
749
+ // Usage: boxShadow: "2" → class "shadow-2" → "box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1)"
438
750
  // ============================================================================
439
751
 
440
- // Shadow presets: sh-0, sh-1, sh-2, sh-3, sh-4
752
+ // Shadow presets: shadow-0, shadow-1, shadow-2, shadow-3, shadow-4
441
753
  export const shadowPresets: Record<string, string> = {
442
754
  '0': 'none',
443
755
  '1': '0 1px 2px rgba(0, 0, 0, 0.05)',
@@ -446,14 +758,29 @@ export const shadowPresets: Record<string, string> = {
446
758
  '4': '0 12px 32px rgba(0, 0, 0, 0.2)',
447
759
  };
448
760
 
449
- // Gradient presets: gr-1, gr-2
761
+ // Gradient presets: bg-gradient-1, bg-gradient-2
450
762
  export const gradientPresets: Record<string, string> = {
451
763
  '1': 'linear-gradient(90deg, rgba(10,22,40,0.85) 0%, rgba(10,22,40,0.2) 100%)',
452
764
  '2': 'linear-gradient(0deg, #a9e8fd, #00aee8 25%, #0f1335 72%)',
453
765
  };
454
766
 
455
- // Border presets: bd-0, bd-1
767
+ // Border presets: border-preset-0, border-preset-1
456
768
  export const borderPresets: Record<string, string> = {
457
769
  '0': '1px solid var(--border)',
458
770
  '1': '1px solid var(--border-light)',
459
771
  };
772
+
773
+ /** Reverse mapping for preset classes: class → { prop, value } (expanded value). */
774
+ export const presetClassReverse: Record<string, { prop: string; value: string }> = (() => {
775
+ const reverse: Record<string, { prop: string; value: string }> = {};
776
+ for (const [key, value] of Object.entries(shadowPresets)) {
777
+ reverse[`shadow-${key}`] = { prop: 'boxShadow', value };
778
+ }
779
+ for (const [key, value] of Object.entries(gradientPresets)) {
780
+ reverse[`bg-gradient-${key}`] = { prop: 'background', value };
781
+ }
782
+ for (const [key, value] of Object.entries(borderPresets)) {
783
+ reverse[`border-preset-${key}`] = { prop: 'border', value };
784
+ }
785
+ return reverse;
786
+ })();