meno-core 1.0.53 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/.claude/settings.local.json +1 -3
  2. package/bin/cli.ts +66 -261
  3. package/build-astro.ts +150 -128
  4. package/dist/bin/cli.js +42 -185
  5. package/dist/bin/cli.js.map +2 -2
  6. package/dist/chunks/chunk-2AR55GYH.js +42 -0
  7. package/dist/chunks/chunk-2AR55GYH.js.map +7 -0
  8. package/dist/chunks/{chunk-JGWFTO6P.js → chunk-2IIQK7T3.js} +2624 -1389
  9. package/dist/chunks/chunk-2IIQK7T3.js.map +7 -0
  10. package/dist/chunks/chunk-4ZRU52J2.js +169 -0
  11. package/dist/chunks/chunk-4ZRU52J2.js.map +7 -0
  12. package/dist/chunks/{chunk-UB44F4Z2.js → chunk-5X4HCN7J.js} +5 -7
  13. package/dist/chunks/chunk-5X4HCN7J.js.map +7 -0
  14. package/dist/chunks/{chunk-WQFG7PAH.js → chunk-7CCVOL5M.js} +15 -19
  15. package/dist/chunks/chunk-7CCVOL5M.js.map +7 -0
  16. package/dist/chunks/{chunk-YBLHKYFF.js → chunk-AR7LHIFY.js} +8 -2
  17. package/dist/chunks/chunk-AR7LHIFY.js.map +7 -0
  18. package/dist/chunks/{chunk-O3NAGJP4.js → chunk-NUP7H7D3.js} +135 -41
  19. package/dist/chunks/chunk-NUP7H7D3.js.map +7 -0
  20. package/dist/chunks/{chunk-X754AHS5.js → chunk-QWTQZHG3.js} +194 -90
  21. package/dist/chunks/chunk-QWTQZHG3.js.map +7 -0
  22. package/dist/chunks/{chunk-H3GJ4H2U.js → chunk-XTKNX4FW.js} +216 -87
  23. package/dist/chunks/chunk-XTKNX4FW.js.map +7 -0
  24. package/dist/chunks/{fs-JGINUXGL.js → fs-G3ANWEFP.js} +2 -2
  25. package/dist/lib/client/index.js +1003 -475
  26. package/dist/lib/client/index.js.map +3 -3
  27. package/dist/lib/server/index.js +14393 -6371
  28. package/dist/lib/server/index.js.map +4 -4
  29. package/dist/lib/shared/index.js +342 -101
  30. package/dist/lib/shared/index.js.map +4 -4
  31. package/dist/lib/shared/richtext/index.js +1 -1
  32. package/dist/lib/test-utils/index.js +64 -80
  33. package/dist/lib/test-utils/index.js.map +2 -2
  34. package/entries/client-router.tsx +10 -8
  35. package/lib/client/ClientInitializer.ts +8 -8
  36. package/lib/client/ErrorBoundary.test.tsx +246 -186
  37. package/lib/client/ErrorBoundary.tsx +183 -132
  38. package/lib/client/componentRegistry.test.ts +96 -108
  39. package/lib/client/componentRegistry.ts +1 -3
  40. package/lib/client/contexts/ThemeContext.tsx +3 -2
  41. package/lib/client/core/ComponentBuilder.test.ts +663 -560
  42. package/lib/client/core/ComponentBuilder.ts +427 -155
  43. package/lib/client/core/ComponentRenderer.test.tsx +2 -4
  44. package/lib/client/core/ComponentRenderer.tsx +46 -33
  45. package/lib/client/core/builders/embedBuilder.ts +242 -54
  46. package/lib/client/core/builders/linkBuilder.ts +72 -45
  47. package/lib/client/core/builders/linkNodeBuilder.ts +79 -54
  48. package/lib/client/core/builders/listBuilder.ts +155 -89
  49. package/lib/client/core/builders/localeListBuilder.ts +97 -62
  50. package/lib/client/core/builders/types.ts +5 -5
  51. package/lib/client/core/cmsTemplateProcessor.ts +8 -9
  52. package/lib/client/elementRegistry.ts +3 -3
  53. package/lib/client/fontFamiliesService.test.ts +2 -10
  54. package/lib/client/fontFamiliesService.ts +3 -3
  55. package/lib/client/hmr/HMRManager.tsx +47 -30
  56. package/lib/client/hmrCssReload.ts +49 -14
  57. package/lib/client/hmrWebSocket.ts +14 -19
  58. package/lib/client/hooks/useColorVariables.test.ts +21 -21
  59. package/lib/client/hooks/useColorVariables.ts +23 -18
  60. package/lib/client/hooks/usePropertyAutocomplete.ts +4 -6
  61. package/lib/client/hooks/useVariables.ts +6 -4
  62. package/lib/client/hydration/HydrationUtils.test.ts +24 -25
  63. package/lib/client/hydration/HydrationUtils.ts +3 -4
  64. package/lib/client/i18nConfigService.test.ts +2 -7
  65. package/lib/client/i18nConfigService.ts +2 -2
  66. package/lib/client/meno-filter/MenoFilter.test.ts +47 -49
  67. package/lib/client/meno-filter/MenoFilter.ts +14 -15
  68. package/lib/client/meno-filter/bindings.ts +18 -43
  69. package/lib/client/meno-filter/init.ts +4 -4
  70. package/lib/client/meno-filter/renderer.ts +30 -32
  71. package/lib/client/meno-filter/script.generated.ts +1 -3
  72. package/lib/client/meno-filter/ui.ts +4 -6
  73. package/lib/client/meno-filter/updates.ts +18 -23
  74. package/lib/client/meno-filter/utils.ts +1 -1
  75. package/lib/client/navigation.test.ts +174 -178
  76. package/lib/client/navigation.ts +0 -1
  77. package/lib/client/responsiveStyleResolver.knownTokens.test.ts +71 -0
  78. package/lib/client/responsiveStyleResolver.test.ts +234 -232
  79. package/lib/client/responsiveStyleResolver.ts +74 -20
  80. package/lib/client/routing/RouteLoader.test.ts +24 -25
  81. package/lib/client/routing/RouteLoader.ts +27 -35
  82. package/lib/client/routing/Router.tsx +210 -153
  83. package/lib/client/scripts/ScriptExecutor.test.ts +157 -158
  84. package/lib/client/scripts/ScriptExecutor.ts +18 -36
  85. package/lib/client/services/PrefetchService.test.ts +3 -3
  86. package/lib/client/services/PrefetchService.ts +23 -29
  87. package/lib/client/styleProcessor.test.ts +9 -9
  88. package/lib/client/styleProcessor.ts +24 -15
  89. package/lib/client/styles/StyleInjector.test.ts +122 -115
  90. package/lib/client/styles/StyleInjector.ts +10 -7
  91. package/lib/client/styles/UtilityClassCollector.ts +62 -28
  92. package/lib/client/styles/cspNonce.test.ts +2 -5
  93. package/lib/client/templateEngine.test.ts +554 -488
  94. package/lib/client/templateEngine.ts +203 -73
  95. package/lib/client/theme.test.ts +1 -1
  96. package/lib/client/theme.ts +0 -1
  97. package/lib/client/utils/toast.ts +0 -1
  98. package/lib/server/__integration__/api-routes.test.ts +8 -4
  99. package/lib/server/__integration__/cms-integration.test.ts +1 -4
  100. package/lib/server/__integration__/server-lifecycle.test.ts +4 -5
  101. package/lib/server/__integration__/ssr-rendering.test.ts +47 -37
  102. package/lib/server/__integration__/static-assets.test.ts +3 -3
  103. package/lib/server/__integration__/test-helpers.ts +87 -74
  104. package/lib/server/ab/generateFunctions.ts +12 -10
  105. package/lib/server/astro/cmsPageEmitter.ts +26 -42
  106. package/lib/server/astro/componentEmitter.ts +35 -43
  107. package/lib/server/astro/cssCollector.ts +10 -26
  108. package/lib/server/astro/nodeToAstro.test.ts +1754 -34
  109. package/lib/server/astro/nodeToAstro.ts +232 -216
  110. package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +115 -119
  111. package/lib/server/astro/normalizeOrphanTemplateProps.ts +11 -18
  112. package/lib/server/astro/pageEmitter.ts +9 -13
  113. package/lib/server/astro/tailwindMapper.test.ts +10 -37
  114. package/lib/server/astro/tailwindMapper.ts +33 -40
  115. package/lib/server/astro/templateTransformer.ts +17 -20
  116. package/lib/server/createServer.ts +7 -19
  117. package/lib/server/cssGenerator.test.ts +35 -44
  118. package/lib/server/cssGenerator.ts +8 -19
  119. package/lib/server/fileWatcher.test.ts +164 -13
  120. package/lib/server/fileWatcher.ts +209 -124
  121. package/lib/server/index.ts +14 -17
  122. package/lib/server/jsonLoader.test.ts +39 -2
  123. package/lib/server/jsonLoader.ts +39 -34
  124. package/lib/server/middleware/cors.test.ts +21 -21
  125. package/lib/server/middleware/cors.ts +28 -4
  126. package/lib/server/middleware/errorHandler.test.ts +7 -5
  127. package/lib/server/middleware/errorHandler.ts +3 -8
  128. package/lib/server/middleware/index.ts +0 -1
  129. package/lib/server/middleware/logger.test.ts +10 -8
  130. package/lib/server/middleware/logger.ts +17 -29
  131. package/lib/server/migrateTemplates.ts +3 -3
  132. package/lib/server/pageCache.test.ts +76 -77
  133. package/lib/server/pageCache.ts +0 -1
  134. package/lib/server/projectContext.ts +5 -4
  135. package/lib/server/providers/fileSystemCMSProvider.test.ts +142 -99
  136. package/lib/server/providers/fileSystemCMSProvider.ts +62 -38
  137. package/lib/server/routes/api/cms.test.ts +26 -14
  138. package/lib/server/routes/api/cms.ts +9 -14
  139. package/lib/server/routes/api/colors.test.ts +2 -2
  140. package/lib/server/routes/api/components.ts +31 -35
  141. package/lib/server/routes/api/config.ts +3 -4
  142. package/lib/server/routes/api/core-routes.ts +49 -76
  143. package/lib/server/routes/api/enums.test.ts +2 -2
  144. package/lib/server/routes/api/functions.ts +9 -17
  145. package/lib/server/routes/api/index.ts +3 -6
  146. package/lib/server/routes/api/pages.ts +8 -11
  147. package/lib/server/routes/api/shared.test.ts +1 -1
  148. package/lib/server/routes/api/shared.ts +12 -9
  149. package/lib/server/routes/api/variables.test.ts +3 -5
  150. package/lib/server/routes/api/variables.ts +1 -1
  151. package/lib/server/routes/index.ts +25 -28
  152. package/lib/server/routes/pages.ts +35 -31
  153. package/lib/server/routes/static.ts +17 -6
  154. package/lib/server/runtime/bundler.ts +98 -61
  155. package/lib/server/runtime/fs.ts +16 -26
  156. package/lib/server/runtime/httpServer.ts +8 -12
  157. package/lib/server/services/ColorService.test.ts +3 -3
  158. package/lib/server/services/ColorService.ts +37 -29
  159. package/lib/server/services/EnumService.test.ts +4 -8
  160. package/lib/server/services/EnumService.ts +11 -3
  161. package/lib/server/services/VariableService.test.ts +8 -12
  162. package/lib/server/services/VariableService.ts +11 -3
  163. package/lib/server/services/cmsService.test.ts +158 -120
  164. package/lib/server/services/cmsService.ts +36 -146
  165. package/lib/server/services/componentService.test.ts +125 -45
  166. package/lib/server/services/componentService.ts +70 -46
  167. package/lib/server/services/configService.test.ts +22 -45
  168. package/lib/server/services/configService.ts +50 -27
  169. package/lib/server/services/fileWatcherService.ts +42 -8
  170. package/lib/server/services/index.ts +0 -1
  171. package/lib/server/services/pageService.test.ts +8 -10
  172. package/lib/server/services/pageService.ts +32 -18
  173. package/lib/server/ssr/attributeBuilder.ts +18 -8
  174. package/lib/server/ssr/buildErrorOverlay.ts +11 -12
  175. package/lib/server/ssr/clientDataInjector.ts +7 -21
  176. package/lib/server/ssr/cmsSSRProcessor.ts +4 -8
  177. package/lib/server/ssr/cssCollector.ts +1 -1
  178. package/lib/server/ssr/errorOverlay.test.ts +1 -1
  179. package/lib/server/ssr/errorOverlay.ts +3 -9
  180. package/lib/server/ssr/htmlGenerator.nonce.test.ts +9 -14
  181. package/lib/server/ssr/htmlGenerator.test.ts +120 -44
  182. package/lib/server/ssr/htmlGenerator.ts +126 -91
  183. package/lib/server/ssr/imageMetadata.test.ts +3 -1
  184. package/lib/server/ssr/imageMetadata.ts +27 -21
  185. package/lib/server/ssr/jsCollector.test.ts +8 -18
  186. package/lib/server/ssr/jsCollector.ts +3 -8
  187. package/lib/server/ssr/liveReloadIntegration.test.ts +76 -36
  188. package/lib/server/ssr/metaTagGenerator.ts +2 -2
  189. package/lib/server/ssr/ssrRenderer.branches.test.ts +1103 -0
  190. package/lib/server/ssr/ssrRenderer.test.ts +316 -256
  191. package/lib/server/ssr/ssrRenderer.ts +795 -243
  192. package/lib/server/ssrRenderer.test.ts +1048 -954
  193. package/lib/server/utils/jsonLineMapper.test.ts +28 -28
  194. package/lib/server/utils/jsonLineMapper.ts +7 -7
  195. package/lib/server/validateStyleCoverage.ts +18 -21
  196. package/lib/server/websocketManager.ts +28 -19
  197. package/lib/shared/attributeNodeUtils.test.ts +15 -15
  198. package/lib/shared/attributeNodeUtils.ts +5 -12
  199. package/lib/shared/breakpoints.test.ts +5 -5
  200. package/lib/shared/breakpoints.ts +4 -11
  201. package/lib/shared/cmsQuery.test.ts +81 -0
  202. package/lib/shared/cmsQuery.ts +92 -0
  203. package/lib/shared/cmsQueryParser.test.ts +50 -42
  204. package/lib/shared/cmsQueryParser.ts +60 -38
  205. package/lib/shared/colorConversions.ts +9 -9
  206. package/lib/shared/colorVariableUtils.test.ts +27 -5
  207. package/lib/shared/colorVariableUtils.ts +21 -12
  208. package/lib/shared/componentRefs.ts +1 -5
  209. package/lib/shared/constants.test.ts +3 -3
  210. package/lib/shared/constants.ts +8 -8
  211. package/lib/shared/cssGeneration.test.ts +285 -144
  212. package/lib/shared/cssGeneration.ts +217 -531
  213. package/lib/shared/cssNamedColors.ts +152 -30
  214. package/lib/shared/cssProperties.test.ts +69 -70
  215. package/lib/shared/cssProperties.ts +298 -114
  216. package/lib/shared/elementClassName.test.ts +109 -109
  217. package/lib/shared/elementClassName.ts +3 -3
  218. package/lib/shared/elementUtils.ts +12 -16
  219. package/lib/shared/errorLogger.test.ts +12 -12
  220. package/lib/shared/errorLogger.ts +2 -10
  221. package/lib/shared/errors.test.ts +2 -13
  222. package/lib/shared/errors.ts +2 -8
  223. package/lib/shared/expressionEvaluator.test.ts +145 -0
  224. package/lib/shared/expressionEvaluator.ts +52 -24
  225. package/lib/shared/fontLoader.test.ts +32 -18
  226. package/lib/shared/fontLoader.ts +2 -2
  227. package/lib/shared/friendlyError.ts +2 -3
  228. package/lib/shared/gradientUtils.test.ts +3 -7
  229. package/lib/shared/gradientUtils.ts +17 -14
  230. package/lib/shared/hrefRefs.test.ts +2 -2
  231. package/lib/shared/hrefRefs.ts +2 -10
  232. package/lib/shared/i18n.test.ts +4 -4
  233. package/lib/shared/i18n.ts +18 -38
  234. package/lib/shared/index.ts +27 -0
  235. package/lib/shared/inlineSvgStyleRules.ts +14 -13
  236. package/lib/shared/interactiveStyleMappings.test.ts +32 -54
  237. package/lib/shared/interactiveStyleMappings.ts +11 -24
  238. package/lib/shared/interactiveStyles.test.ts +165 -188
  239. package/lib/shared/interfaces/contentProvider.ts +1 -1
  240. package/lib/shared/itemTemplateUtils.test.ts +11 -17
  241. package/lib/shared/itemTemplateUtils.ts +27 -39
  242. package/lib/shared/jsonRepair.ts +16 -10
  243. package/lib/shared/libraryLoader.test.ts +21 -55
  244. package/lib/shared/libraryLoader.ts +7 -22
  245. package/lib/shared/linkUtils.ts +1 -1
  246. package/lib/shared/logger.test.ts +66 -0
  247. package/lib/shared/logger.ts +94 -0
  248. package/lib/shared/markdown.ts +25 -0
  249. package/lib/shared/netlifyLocale404.test.ts +179 -0
  250. package/lib/shared/netlifyLocale404.ts +110 -0
  251. package/lib/shared/nodeUtils.test.ts +28 -16
  252. package/lib/shared/nodeUtils.ts +76 -23
  253. package/lib/shared/pathArrayUtils.test.ts +1 -2
  254. package/lib/shared/pathArrayUtils.ts +1 -1
  255. package/lib/shared/pathSecurity.ts +2 -2
  256. package/lib/shared/pathUtils.test.ts +4 -6
  257. package/lib/shared/pathUtils.ts +42 -49
  258. package/lib/shared/paths/Path.test.ts +2 -2
  259. package/lib/shared/paths/Path.ts +0 -1
  260. package/lib/shared/paths/PathConverter.test.ts +1 -1
  261. package/lib/shared/paths/PathConverter.ts +17 -20
  262. package/lib/shared/paths/PathUtils.ts +13 -13
  263. package/lib/shared/paths/PathValidator.test.ts +2 -15
  264. package/lib/shared/paths/PathValidator.ts +12 -10
  265. package/lib/shared/paths/index.ts +1 -2
  266. package/lib/shared/permissions.test.ts +168 -0
  267. package/lib/shared/permissions.ts +162 -0
  268. package/lib/shared/propResolver.test.ts +240 -244
  269. package/lib/shared/propResolver.ts +15 -26
  270. package/lib/shared/pxToRem.test.ts +7 -6
  271. package/lib/shared/pxToRem.ts +2 -5
  272. package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +12 -6
  273. package/lib/shared/registry/ClientRegistry.ts +0 -2
  274. package/lib/shared/registry/ComponentRegistry.test.ts +46 -32
  275. package/lib/shared/registry/ComponentRegistry.ts +12 -9
  276. package/lib/shared/registry/NodeTypeDefinition.ts +16 -9
  277. package/lib/shared/registry/RegistryManager.ts +1 -2
  278. package/lib/shared/registry/SSRRegistry.ts +0 -2
  279. package/lib/shared/registry/createNodeType.ts +7 -9
  280. package/lib/shared/registry/defineNodeType.ts +2 -6
  281. package/lib/shared/registry/fieldPresets.ts +3 -1
  282. package/lib/shared/registry/index.ts +0 -1
  283. package/lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts +14 -15
  284. package/lib/shared/registry/nodeTypes/CustomNodeType.ts +103 -0
  285. package/lib/shared/registry/nodeTypes/EmbedNodeType.ts +18 -11
  286. package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +48 -19
  287. package/lib/shared/registry/nodeTypes/IslandNodeType.ts +129 -0
  288. package/lib/shared/registry/nodeTypes/LinkNodeType.ts +21 -19
  289. package/lib/shared/registry/nodeTypes/ListNodeType.ts +117 -77
  290. package/lib/shared/registry/nodeTypes/LocaleListNodeType.ts +27 -21
  291. package/lib/shared/registry/nodeTypes/MarkdownNodeType.ts +78 -0
  292. package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +12 -8
  293. package/lib/shared/registry/nodeTypes/index.ts +26 -3
  294. package/lib/shared/responsiveScaling.test.ts +16 -34
  295. package/lib/shared/responsiveScaling.ts +61 -42
  296. package/lib/shared/responsiveStyleUtils.test.ts +0 -1
  297. package/lib/shared/responsiveStyleUtils.ts +11 -13
  298. package/lib/shared/richtext/htmlToTiptap.test.ts +139 -130
  299. package/lib/shared/richtext/htmlToTiptap.ts +2 -4
  300. package/lib/shared/richtext/tiptapToHtml.test.ts +5 -6
  301. package/lib/shared/richtext/types.ts +1 -8
  302. package/lib/shared/slugTranslator.test.ts +13 -13
  303. package/lib/shared/slugTranslator.ts +12 -16
  304. package/lib/shared/slugify.ts +9 -15
  305. package/lib/shared/styleNodeUtils.test.ts +8 -8
  306. package/lib/shared/styleNodeUtils.ts +18 -20
  307. package/lib/shared/styleUtils.test.ts +87 -61
  308. package/lib/shared/styleUtils.ts +5 -6
  309. package/lib/shared/themeDefaults.test.ts +11 -14
  310. package/lib/shared/themeDefaults.ts +3 -4
  311. package/lib/shared/tree/PathBuilder.test.ts +63 -145
  312. package/lib/shared/tree/PathBuilder.ts +59 -47
  313. package/lib/shared/treePathUtils.test.ts +51 -12
  314. package/lib/shared/treePathUtils.ts +91 -60
  315. package/lib/shared/types/api.ts +105 -8
  316. package/lib/shared/types/cms.test.ts +34 -0
  317. package/lib/shared/types/cms.ts +90 -34
  318. package/lib/shared/types/comment.ts +49 -16
  319. package/lib/shared/types/components.ts +51 -25
  320. package/lib/shared/types/errors.test.ts +1 -6
  321. package/lib/shared/types/errors.ts +3 -7
  322. package/lib/shared/types/experiments.ts +28 -28
  323. package/lib/shared/types/index.ts +25 -2
  324. package/lib/shared/types/permissions.ts +139 -0
  325. package/lib/shared/types/styles.ts +0 -1
  326. package/lib/shared/types/variables.test.ts +4 -13
  327. package/lib/shared/types/variables.ts +51 -30
  328. package/lib/shared/types.ts +1 -2
  329. package/lib/shared/utilityClassConfig.ts +751 -321
  330. package/lib/shared/utilityClassMapper.durability.test.ts +117 -0
  331. package/lib/shared/utilityClassMapper.test.ts +433 -95
  332. package/lib/shared/utilityClassMapper.ts +322 -249
  333. package/lib/shared/utilityClassNames.test.ts +38 -0
  334. package/lib/shared/utilityClassNames.ts +458 -0
  335. package/lib/shared/utils.test.ts +2 -10
  336. package/lib/shared/utils.ts +19 -10
  337. package/lib/shared/validation/cmsValidators.ts +2 -1
  338. package/lib/shared/validation/commentValidators.test.ts +53 -0
  339. package/lib/shared/validation/commentValidators.ts +12 -1
  340. package/lib/shared/validation/index.ts +1 -0
  341. package/lib/shared/validation/permissionsValidators.test.ts +49 -0
  342. package/lib/shared/validation/permissionsValidators.ts +49 -0
  343. package/lib/shared/validation/propValidator.test.ts +19 -21
  344. package/lib/shared/validation/propValidator.ts +13 -18
  345. package/lib/shared/validation/schemas.test.ts +64 -32
  346. package/lib/shared/validation/schemas.ts +616 -345
  347. package/lib/shared/validation/validators.test.ts +3 -8
  348. package/lib/shared/validation/validators.ts +89 -68
  349. package/lib/shared/viewportUnits.integration.test.ts +14 -10
  350. package/lib/shared/viewportUnits.test.ts +24 -23
  351. package/lib/shared/viewportUnits.ts +12 -5
  352. package/lib/test-utils/dom-setup.ts +1 -1
  353. package/lib/test-utils/factories/ConsoleMockFactory.ts +10 -14
  354. package/lib/test-utils/factories/DomMockFactory.ts +17 -23
  355. package/lib/test-utils/factories/EventMockFactory.ts +7 -13
  356. package/lib/test-utils/factories/FetchMockFactory.ts +39 -57
  357. package/lib/test-utils/factories/ServerMockFactory.ts +6 -10
  358. package/lib/test-utils/factories/StoreMockFactory.ts +18 -29
  359. package/lib/test-utils/fixtures.ts +45 -45
  360. package/lib/test-utils/helpers/asyncHelpers.test.ts +15 -18
  361. package/lib/test-utils/helpers/asyncHelpers.ts +11 -20
  362. package/lib/test-utils/helpers.ts +1 -5
  363. package/lib/test-utils/index.ts +0 -4
  364. package/lib/test-utils/mockFactories.ts +13 -19
  365. package/lib/test-utils/mocks.ts +6 -4
  366. package/package.json +3 -5
  367. package/scripts/build-for-publish.mjs +2 -4
  368. package/scripts/build-meno-filter.ts +4 -7
  369. package/tsconfig.json +1 -0
  370. package/vite.config.ts +4 -4
  371. package/build-next.ts +0 -1361
  372. package/build-static.test.ts +0 -424
  373. package/build-static.ts +0 -1074
  374. package/dist/build-static.js +0 -36
  375. package/dist/chunks/chunk-2MHDV5BF.js +0 -251
  376. package/dist/chunks/chunk-2MHDV5BF.js.map +0 -7
  377. package/dist/chunks/chunk-AZQYF6KE.js +0 -559
  378. package/dist/chunks/chunk-AZQYF6KE.js.map +0 -7
  379. package/dist/chunks/chunk-GZHGVVW3.js +0 -322
  380. package/dist/chunks/chunk-GZHGVVW3.js.map +0 -7
  381. package/dist/chunks/chunk-H3GJ4H2U.js.map +0 -7
  382. package/dist/chunks/chunk-I7YIGZXT.js +0 -467
  383. package/dist/chunks/chunk-I7YIGZXT.js.map +0 -7
  384. package/dist/chunks/chunk-IGYR22T6.js +0 -6192
  385. package/dist/chunks/chunk-IGYR22T6.js.map +0 -7
  386. package/dist/chunks/chunk-JGP5A3Y5.js +0 -1136
  387. package/dist/chunks/chunk-JGP5A3Y5.js.map +0 -7
  388. package/dist/chunks/chunk-JGWFTO6P.js.map +0 -7
  389. package/dist/chunks/chunk-O3NAGJP4.js.map +0 -7
  390. package/dist/chunks/chunk-QB2LNO4W.js +0 -77
  391. package/dist/chunks/chunk-QB2LNO4W.js.map +0 -7
  392. package/dist/chunks/chunk-R6XHAFBF.js +0 -3821
  393. package/dist/chunks/chunk-R6XHAFBF.js.map +0 -7
  394. package/dist/chunks/chunk-UB44F4Z2.js.map +0 -7
  395. package/dist/chunks/chunk-WQFG7PAH.js.map +0 -7
  396. package/dist/chunks/chunk-X754AHS5.js.map +0 -7
  397. package/dist/chunks/chunk-YBLHKYFF.js.map +0 -7
  398. package/dist/chunks/configService-R3OGU2UD.js +0 -13
  399. package/dist/chunks/configService-R3OGU2UD.js.map +0 -7
  400. package/dist/chunks/constants-STK2YBIW.js +0 -46
  401. package/dist/chunks/constants-STK2YBIW.js.map +0 -7
  402. package/dist/chunks/fs-JGINUXGL.js.map +0 -7
  403. package/dist/entries/server-router.js +0 -67
  404. package/dist/entries/server-router.js.map +0 -7
  405. package/entries/server-router.tsx +0 -81
  406. package/lib/server/providers/fileSystemPageProvider.ts +0 -160
  407. package/lib/server/webflow/buildWebflow.ts +0 -635
  408. package/lib/server/webflow/index.ts +0 -23
  409. package/lib/server/webflow/nodeToWebflow.test.ts +0 -3170
  410. package/lib/server/webflow/nodeToWebflow.ts +0 -2435
  411. package/lib/server/webflow/styleMapper.test.ts +0 -389
  412. package/lib/server/webflow/styleMapper.ts +0 -695
  413. package/lib/server/webflow/templateWrapper.ts +0 -49
  414. package/lib/server/webflow/types.ts +0 -396
  415. /package/dist/{build-static.js.map → chunks/fs-G3ANWEFP.js.map} +0 -0
@@ -1,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,558 @@ 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',
526
+ },
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',
338
560
  },
339
- cursor: {
340
- pointer: 'cursor-pointer',
341
- default: 'cursor-default',
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
+ /**
675
+ * Tailwind's default spacing scale: step name CSS length (px). The forward
676
+ * mapper emits the named step on an EXACT match (`padding: 16px` → `p-4`); any
677
+ * off-scale value falls back to the arbitrary form (`p-[13px]`). The reverse map
678
+ * (length step) drives that lookup and the inverse parser.
679
+ *
680
+ * Values are px because Meno stores px, so `p-4` ⇄ `16px` round-trips exactly;
681
+ * rem output (when enabled) is applied downstream by the CSS generator (pxToRem),
682
+ * never baked into the token.
683
+ */
684
+ export const SPACING_SCALE: Record<string, string> = {
685
+ '0': '0px',
686
+ px: '1px',
687
+ '0.5': '2px',
688
+ '1': '4px',
689
+ '1.5': '6px',
690
+ '2': '8px',
691
+ '2.5': '10px',
692
+ '3': '12px',
693
+ '3.5': '14px',
694
+ '4': '16px',
695
+ '5': '20px',
696
+ '6': '24px',
697
+ '7': '28px',
698
+ '8': '32px',
699
+ '9': '36px',
700
+ '10': '40px',
701
+ '11': '44px',
702
+ '12': '48px',
703
+ '14': '56px',
704
+ '16': '64px',
705
+ '20': '80px',
706
+ '24': '96px',
707
+ '28': '112px',
708
+ '32': '128px',
709
+ '36': '144px',
710
+ '40': '160px',
711
+ '44': '176px',
712
+ '48': '192px',
713
+ '52': '208px',
714
+ '56': '224px',
715
+ '60': '240px',
716
+ '64': '256px',
717
+ '72': '288px',
718
+ '80': '320px',
719
+ '96': '384px',
720
+ };
721
+
722
+ /** Reverse of SPACING_SCALE: CSS length (px) → step name (`16px` → `4`). */
723
+ export const SPACING_SCALE_REVERSE: Record<string, string> = (() => {
724
+ const reverse: Record<string, string> = {};
725
+ for (const [step, length] of Object.entries(SPACING_SCALE)) {
726
+ reverse[length] = step;
727
+ }
728
+ return reverse;
729
+ })();
730
+
731
+ /**
732
+ * Class roots that use the spacing scale. Tailwind shares one numeric scale
733
+ * across padding, margin, gap, inset and sizing `p-4`, `gap-6`, `mt-2`,
734
+ * `top-4`, `w-64`, Only roots listed here resolve a bare step name; keyword
735
+ * values (`w-full`, `m-auto`) still win first, and negatives stay arbitrary.
736
+ */
737
+ export const SPACING_SCALE_ROOTS: Set<string> = new Set([
738
+ 'p',
739
+ 'pt',
740
+ 'pr',
741
+ 'pb',
742
+ 'pl',
743
+ 'px',
744
+ 'py',
745
+ 'm',
746
+ 'mt',
747
+ 'mr',
748
+ 'mb',
749
+ 'ml',
750
+ 'mx',
751
+ 'my',
752
+ 'gap',
753
+ 'gap-x',
754
+ 'gap-y',
755
+ 'top',
756
+ 'right',
757
+ 'bottom',
758
+ 'left',
759
+ 'inset',
760
+ 'w',
761
+ 'h',
762
+ 'min-w',
763
+ 'min-h',
764
+ 'max-w',
765
+ 'max-h',
766
+ 'basis',
767
+ ]);
768
+
769
+ /**
770
+ * Class roots whose bare-token value is a Meno color token (`bg-primary` →
771
+ * `var(--primary)`). The class-name counterpart of `colorTokenProps` (which is
772
+ * keyed by camelCase CSS property). Used by the inverse parser to recognize
773
+ * `bg-primary` / `text-text` / `border-border` etc.
774
+ */
775
+ export const COLOR_TOKEN_ROOTS: Set<string> = new Set(['text', 'bg', 'border', 'accent', 'outline']);
776
+
777
+ /** Reverse mapping for static utilities: class → { prop, value } (canonical value). */
778
+ export const staticUtilityReverse: Record<string, { prop: string; value: string }> = (() => {
779
+ const reverse: Record<string, { prop: string; value: string }> = {};
780
+ for (const [prop, values] of Object.entries(staticUtilities)) {
781
+ for (const [value, className] of Object.entries(values)) {
782
+ if (!reverse[className]) {
783
+ reverse[className] = { prop, value };
784
+ }
785
+ }
786
+ }
787
+ return reverse;
788
+ })();
789
+
790
+ /**
791
+ * Named keyword values per class root: `root-keyword` → CSS value.
792
+ * Mirrors Tailwind's named sizes (`w-full`, `h-screen`, `m-auto`, `rounded-full`).
793
+ */
794
+ export const keywordValues: Record<string, Record<string, string>> = {
795
+ w: { auto: 'auto', full: '100%', screen: '100vw', fit: 'fit-content', min: 'min-content', max: 'max-content' },
796
+ h: { auto: 'auto', full: '100%', screen: '100vh', fit: 'fit-content', min: 'min-content', max: 'max-content' },
797
+ 'max-w': { full: '100%', none: 'none', screen: '100vw', fit: 'fit-content', min: 'min-content', max: 'max-content' },
798
+ 'max-h': { full: '100%', none: 'none', screen: '100vh', fit: 'fit-content', min: 'min-content', max: 'max-content' },
799
+ 'min-w': { auto: 'auto', full: '100%', fit: 'fit-content', min: 'min-content', max: 'max-content' },
800
+ 'min-h': { auto: 'auto', full: '100%', screen: '100vh', fit: 'fit-content', min: 'min-content', max: 'max-content' },
801
+ m: { auto: 'auto' },
802
+ mt: { auto: 'auto' },
803
+ mr: { auto: 'auto' },
804
+ mb: { auto: 'auto' },
805
+ ml: { auto: 'auto' },
806
+ mx: { auto: 'auto' },
807
+ my: { auto: 'auto' },
808
+ top: { auto: 'auto', full: '100%' },
809
+ right: { auto: 'auto', full: '100%' },
810
+ bottom: { auto: 'auto', full: '100%' },
811
+ left: { auto: 'auto', full: '100%' },
812
+ inset: { auto: 'auto', full: '100%' },
813
+ basis: { auto: 'auto', full: '100%' },
814
+ rounded: { none: '0', full: '9999px' },
815
+ 'rounded-tl': { none: '0', full: '9999px' },
816
+ 'rounded-tr': { none: '0', full: '9999px' },
817
+ 'rounded-bl': { none: '0', full: '9999px' },
818
+ 'rounded-br': { none: '0', full: '9999px' },
819
+ z: { auto: 'auto' },
820
+ leading: { normal: 'normal' },
821
+ tracking: { normal: 'normal' },
432
822
  };
433
823
 
824
+ /**
825
+ * Roots whose plain lowercase keyword values pass through verbatim:
826
+ * `cursor-pointer`, `align-middle`, `origin-center`, `object-center`, …
827
+ */
828
+ export const genericKeywordRoots: Set<string> = new Set(['cursor', 'align', 'origin', 'object', 'list']);
829
+
830
+ /**
831
+ * Roots that accept bare numeric values Tailwind-style: `z-10`, `order-2`,
832
+ * `flex-2`, `grow-2`. (`opacity` is handled separately — Tailwind's 0–100 scale.)
833
+ */
834
+ export const integerValueRoots: Set<string> = new Set(['z', 'order', 'flex', 'grow', 'shrink']);
835
+
836
+ /**
837
+ * Properties whose values are color tokens by Meno convention: a bare token
838
+ * (e.g. `primary`) refers to the CSS variable `--primary`. Forward: token →
839
+ * `root-(--token)`. Reverse: `root-(--token)` → bare token.
840
+ */
841
+ export const colorTokenProps: Set<string> = new Set([
842
+ 'color',
843
+ 'backgroundColor',
844
+ 'borderColor',
845
+ 'accentColor',
846
+ 'outlineColor',
847
+ ]);
848
+
434
849
  // ============================================================================
435
850
  // STYLE PRESETS
436
851
  // 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)"
852
+ // Usage: boxShadow: "2" → class "shadow-2" → "box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1)"
438
853
  // ============================================================================
439
854
 
440
- // Shadow presets: sh-0, sh-1, sh-2, sh-3, sh-4
855
+ // Shadow presets: shadow-0, shadow-1, shadow-2, shadow-3, shadow-4
441
856
  export const shadowPresets: Record<string, string> = {
442
857
  '0': 'none',
443
858
  '1': '0 1px 2px rgba(0, 0, 0, 0.05)',
@@ -446,14 +861,29 @@ export const shadowPresets: Record<string, string> = {
446
861
  '4': '0 12px 32px rgba(0, 0, 0, 0.2)',
447
862
  };
448
863
 
449
- // Gradient presets: gr-1, gr-2
864
+ // Gradient presets: bg-gradient-1, bg-gradient-2
450
865
  export const gradientPresets: Record<string, string> = {
451
866
  '1': 'linear-gradient(90deg, rgba(10,22,40,0.85) 0%, rgba(10,22,40,0.2) 100%)',
452
867
  '2': 'linear-gradient(0deg, #a9e8fd, #00aee8 25%, #0f1335 72%)',
453
868
  };
454
869
 
455
- // Border presets: bd-0, bd-1
870
+ // Border presets: border-preset-0, border-preset-1
456
871
  export const borderPresets: Record<string, string> = {
457
872
  '0': '1px solid var(--border)',
458
873
  '1': '1px solid var(--border-light)',
459
874
  };
875
+
876
+ /** Reverse mapping for preset classes: class → { prop, value } (expanded value). */
877
+ export const presetClassReverse: Record<string, { prop: string; value: string }> = (() => {
878
+ const reverse: Record<string, { prop: string; value: string }> = {};
879
+ for (const [key, value] of Object.entries(shadowPresets)) {
880
+ reverse[`shadow-${key}`] = { prop: 'boxShadow', value };
881
+ }
882
+ for (const [key, value] of Object.entries(gradientPresets)) {
883
+ reverse[`bg-gradient-${key}`] = { prop: 'background', value };
884
+ }
885
+ for (const [key, value] of Object.entries(borderPresets)) {
886
+ reverse[`border-preset-${key}`] = { prop: 'border', value };
887
+ }
888
+ return reverse;
889
+ })();