@muloka/figma-console-mcp 0.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 (443) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +898 -0
  3. package/dist/apps/design-system-dashboard/scoring/accessibility.d.ts +14 -0
  4. package/dist/apps/design-system-dashboard/scoring/accessibility.d.ts.map +1 -0
  5. package/dist/apps/design-system-dashboard/scoring/accessibility.js +278 -0
  6. package/dist/apps/design-system-dashboard/scoring/accessibility.js.map +1 -0
  7. package/dist/apps/design-system-dashboard/scoring/component-metadata.d.ts +29 -0
  8. package/dist/apps/design-system-dashboard/scoring/component-metadata.d.ts.map +1 -0
  9. package/dist/apps/design-system-dashboard/scoring/component-metadata.js +358 -0
  10. package/dist/apps/design-system-dashboard/scoring/component-metadata.js.map +1 -0
  11. package/dist/apps/design-system-dashboard/scoring/consistency.d.ts +14 -0
  12. package/dist/apps/design-system-dashboard/scoring/consistency.d.ts.map +1 -0
  13. package/dist/apps/design-system-dashboard/scoring/consistency.js +342 -0
  14. package/dist/apps/design-system-dashboard/scoring/consistency.js.map +1 -0
  15. package/dist/apps/design-system-dashboard/scoring/coverage.d.ts +14 -0
  16. package/dist/apps/design-system-dashboard/scoring/coverage.d.ts.map +1 -0
  17. package/dist/apps/design-system-dashboard/scoring/coverage.js +231 -0
  18. package/dist/apps/design-system-dashboard/scoring/coverage.js.map +1 -0
  19. package/dist/apps/design-system-dashboard/scoring/engine.d.ts +27 -0
  20. package/dist/apps/design-system-dashboard/scoring/engine.d.ts.map +1 -0
  21. package/dist/apps/design-system-dashboard/scoring/engine.js +93 -0
  22. package/dist/apps/design-system-dashboard/scoring/engine.js.map +1 -0
  23. package/dist/apps/design-system-dashboard/scoring/naming-semantics.d.ts +14 -0
  24. package/dist/apps/design-system-dashboard/scoring/naming-semantics.d.ts.map +1 -0
  25. package/dist/apps/design-system-dashboard/scoring/naming-semantics.js +309 -0
  26. package/dist/apps/design-system-dashboard/scoring/naming-semantics.js.map +1 -0
  27. package/dist/apps/design-system-dashboard/scoring/token-architecture.d.ts +14 -0
  28. package/dist/apps/design-system-dashboard/scoring/token-architecture.d.ts.map +1 -0
  29. package/dist/apps/design-system-dashboard/scoring/token-architecture.js +350 -0
  30. package/dist/apps/design-system-dashboard/scoring/token-architecture.js.map +1 -0
  31. package/dist/apps/design-system-dashboard/scoring/types.d.ts +89 -0
  32. package/dist/apps/design-system-dashboard/scoring/types.d.ts.map +1 -0
  33. package/dist/apps/design-system-dashboard/scoring/types.js +41 -0
  34. package/dist/apps/design-system-dashboard/scoring/types.js.map +1 -0
  35. package/dist/apps/design-system-dashboard/server.d.ts +24 -0
  36. package/dist/apps/design-system-dashboard/server.d.ts.map +1 -0
  37. package/dist/apps/design-system-dashboard/server.js +160 -0
  38. package/dist/apps/design-system-dashboard/server.js.map +1 -0
  39. package/dist/apps/token-browser/server.d.ts +26 -0
  40. package/dist/apps/token-browser/server.d.ts.map +1 -0
  41. package/dist/apps/token-browser/server.js +137 -0
  42. package/dist/apps/token-browser/server.js.map +1 -0
  43. package/dist/browser/base.d.ts +58 -0
  44. package/dist/browser/base.d.ts.map +1 -0
  45. package/dist/browser/base.js +6 -0
  46. package/dist/browser/base.js.map +1 -0
  47. package/dist/browser/local.d.ts +87 -0
  48. package/dist/browser/local.d.ts.map +1 -0
  49. package/dist/browser/local.js +318 -0
  50. package/dist/browser/local.js.map +1 -0
  51. package/dist/cloudflare/apps/design-system-dashboard/scoring/accessibility.js +277 -0
  52. package/dist/cloudflare/apps/design-system-dashboard/scoring/component-metadata.js +357 -0
  53. package/dist/cloudflare/apps/design-system-dashboard/scoring/consistency.js +341 -0
  54. package/dist/cloudflare/apps/design-system-dashboard/scoring/coverage.js +230 -0
  55. package/dist/cloudflare/apps/design-system-dashboard/scoring/engine.js +92 -0
  56. package/dist/cloudflare/apps/design-system-dashboard/scoring/naming-semantics.js +308 -0
  57. package/dist/cloudflare/apps/design-system-dashboard/scoring/token-architecture.js +349 -0
  58. package/dist/cloudflare/apps/design-system-dashboard/scoring/types.js +40 -0
  59. package/dist/cloudflare/apps/design-system-dashboard/server.js +159 -0
  60. package/dist/cloudflare/apps/token-browser/server.js +136 -0
  61. package/dist/cloudflare/browser-manager.js +157 -0
  62. package/dist/cloudflare/core/accessibility-tools.js +361 -0
  63. package/dist/cloudflare/core/annotation-tools.js +230 -0
  64. package/dist/cloudflare/core/cloud-websocket-connector.js +419 -0
  65. package/dist/cloudflare/core/cloud-websocket-relay.js +198 -0
  66. package/dist/cloudflare/core/comment-tools.js +292 -0
  67. package/dist/cloudflare/core/config.js +153 -0
  68. package/dist/cloudflare/core/console-monitor.js +427 -0
  69. package/dist/cloudflare/core/deep-component-tools.js +128 -0
  70. package/dist/cloudflare/core/design-code-tools.js +2793 -0
  71. package/dist/cloudflare/core/design-system-manifest.js +265 -0
  72. package/dist/cloudflare/core/design-system-tools.js +882 -0
  73. package/dist/cloudflare/core/diagnose-tool.js +100 -0
  74. package/dist/cloudflare/core/diff/changelog-formatter.js +275 -0
  75. package/dist/cloudflare/core/diff/diff-engine.js +334 -0
  76. package/dist/cloudflare/core/diff/property-compare.js +36 -0
  77. package/dist/cloudflare/core/diff/version-cache.js +74 -0
  78. package/dist/cloudflare/core/enrichment/enrichment-service.js +374 -0
  79. package/dist/cloudflare/core/enrichment/index.js +7 -0
  80. package/dist/cloudflare/core/enrichment/relationship-mapper.js +351 -0
  81. package/dist/cloudflare/core/enrichment/style-resolver.js +346 -0
  82. package/dist/cloudflare/core/figjam-tools.js +547 -0
  83. package/dist/cloudflare/core/figma-api.js +509 -0
  84. package/dist/cloudflare/core/figma-connector.js +7 -0
  85. package/dist/cloudflare/core/figma-reconstruction-spec.js +402 -0
  86. package/dist/cloudflare/core/figma-style-extractor.js +311 -0
  87. package/dist/cloudflare/core/figma-tools.js +3302 -0
  88. package/dist/cloudflare/core/identity.js +96 -0
  89. package/dist/cloudflare/core/library-tools.js +580 -0
  90. package/dist/cloudflare/core/logger.js +53 -0
  91. package/dist/cloudflare/core/port-discovery.js +935 -0
  92. package/dist/cloudflare/core/resolve-package-root.js +11 -0
  93. package/dist/cloudflare/core/slides-tools.js +714 -0
  94. package/dist/cloudflare/core/slot-tools.js +334 -0
  95. package/dist/cloudflare/core/snippet-injector.js +96 -0
  96. package/dist/cloudflare/core/tokens/alias-resolver.js +205 -0
  97. package/dist/cloudflare/core/tokens/config.js +294 -0
  98. package/dist/cloudflare/core/tokens/dialect.js +232 -0
  99. package/dist/cloudflare/core/tokens/figma-converter.js +323 -0
  100. package/dist/cloudflare/core/tokens/formatters/css-vars.js +338 -0
  101. package/dist/cloudflare/core/tokens/formatters/dtcg.js +376 -0
  102. package/dist/cloudflare/core/tokens/formatters/index.js +45 -0
  103. package/dist/cloudflare/core/tokens/formatters/json.js +205 -0
  104. package/dist/cloudflare/core/tokens/formatters/less.js +4 -0
  105. package/dist/cloudflare/core/tokens/formatters/scss.js +258 -0
  106. package/dist/cloudflare/core/tokens/formatters/stubs.js +13 -0
  107. package/dist/cloudflare/core/tokens/formatters/style-dictionary-v3.js +213 -0
  108. package/dist/cloudflare/core/tokens/formatters/tailwind-v3.js +237 -0
  109. package/dist/cloudflare/core/tokens/formatters/tailwind-v4.js +335 -0
  110. package/dist/cloudflare/core/tokens/formatters/tokens-studio.js +256 -0
  111. package/dist/cloudflare/core/tokens/formatters/ts-module.js +198 -0
  112. package/dist/cloudflare/core/tokens/index.js +16 -0
  113. package/dist/cloudflare/core/tokens/parsers/css-vars.js +4 -0
  114. package/dist/cloudflare/core/tokens/parsers/dtcg.js +280 -0
  115. package/dist/cloudflare/core/tokens/parsers/index.js +138 -0
  116. package/dist/cloudflare/core/tokens/parsers/json.js +7 -0
  117. package/dist/cloudflare/core/tokens/parsers/scss.js +4 -0
  118. package/dist/cloudflare/core/tokens/parsers/stubs.js +20 -0
  119. package/dist/cloudflare/core/tokens/parsers/style-dictionary-v3.js +4 -0
  120. package/dist/cloudflare/core/tokens/parsers/tailwind-v3.js +4 -0
  121. package/dist/cloudflare/core/tokens/parsers/tailwind-v4.js +4 -0
  122. package/dist/cloudflare/core/tokens/parsers/tokens-studio.js +4 -0
  123. package/dist/cloudflare/core/tokens/schemas.js +152 -0
  124. package/dist/cloudflare/core/tokens/transforms/color.js +12 -0
  125. package/dist/cloudflare/core/tokens/transforms/index.js +29 -0
  126. package/dist/cloudflare/core/tokens/transforms/size.js +7 -0
  127. package/dist/cloudflare/core/tokens/types.js +18 -0
  128. package/dist/cloudflare/core/tokens-tools.js +1788 -0
  129. package/dist/cloudflare/core/types/design-code.js +4 -0
  130. package/dist/cloudflare/core/types/enriched.js +5 -0
  131. package/dist/cloudflare/core/types/index.js +4 -0
  132. package/dist/cloudflare/core/variable-resolver.js +85 -0
  133. package/dist/cloudflare/core/version-tools.js +1199 -0
  134. package/dist/cloudflare/core/websocket-connector.js +436 -0
  135. package/dist/cloudflare/core/websocket-server.js +956 -0
  136. package/dist/cloudflare/core/write-tools.js +2506 -0
  137. package/dist/cloudflare/index.js +3010 -0
  138. package/dist/core/accessibility-tools.d.ts +21 -0
  139. package/dist/core/accessibility-tools.d.ts.map +1 -0
  140. package/dist/core/accessibility-tools.js +362 -0
  141. package/dist/core/accessibility-tools.js.map +1 -0
  142. package/dist/core/annotation-tools.d.ts +14 -0
  143. package/dist/core/annotation-tools.d.ts.map +1 -0
  144. package/dist/core/annotation-tools.js +231 -0
  145. package/dist/core/annotation-tools.js.map +1 -0
  146. package/dist/core/comment-tools.d.ts +11 -0
  147. package/dist/core/comment-tools.d.ts.map +1 -0
  148. package/dist/core/comment-tools.js +293 -0
  149. package/dist/core/comment-tools.js.map +1 -0
  150. package/dist/core/config.d.ts +17 -0
  151. package/dist/core/config.d.ts.map +1 -0
  152. package/dist/core/config.js +154 -0
  153. package/dist/core/config.js.map +1 -0
  154. package/dist/core/console-monitor.d.ts +82 -0
  155. package/dist/core/console-monitor.d.ts.map +1 -0
  156. package/dist/core/console-monitor.js +428 -0
  157. package/dist/core/console-monitor.js.map +1 -0
  158. package/dist/core/deep-component-tools.d.ts +14 -0
  159. package/dist/core/deep-component-tools.d.ts.map +1 -0
  160. package/dist/core/deep-component-tools.js +129 -0
  161. package/dist/core/deep-component-tools.js.map +1 -0
  162. package/dist/core/design-code-tools.d.ts +116 -0
  163. package/dist/core/design-code-tools.d.ts.map +1 -0
  164. package/dist/core/design-code-tools.js +2794 -0
  165. package/dist/core/design-code-tools.js.map +1 -0
  166. package/dist/core/design-system-manifest.d.ts +273 -0
  167. package/dist/core/design-system-manifest.d.ts.map +1 -0
  168. package/dist/core/design-system-manifest.js +266 -0
  169. package/dist/core/design-system-manifest.js.map +1 -0
  170. package/dist/core/design-system-tools.d.ts +67 -0
  171. package/dist/core/design-system-tools.d.ts.map +1 -0
  172. package/dist/core/design-system-tools.js +883 -0
  173. package/dist/core/design-system-tools.js.map +1 -0
  174. package/dist/core/diagnose-tool.d.ts +41 -0
  175. package/dist/core/diagnose-tool.d.ts.map +1 -0
  176. package/dist/core/diagnose-tool.js +101 -0
  177. package/dist/core/diagnose-tool.js.map +1 -0
  178. package/dist/core/diff/changelog-formatter.d.ts +35 -0
  179. package/dist/core/diff/changelog-formatter.d.ts.map +1 -0
  180. package/dist/core/diff/changelog-formatter.js +276 -0
  181. package/dist/core/diff/changelog-formatter.js.map +1 -0
  182. package/dist/core/diff/diff-engine.d.ts +127 -0
  183. package/dist/core/diff/diff-engine.d.ts.map +1 -0
  184. package/dist/core/diff/diff-engine.js +335 -0
  185. package/dist/core/diff/diff-engine.js.map +1 -0
  186. package/dist/core/diff/property-compare.d.ts +19 -0
  187. package/dist/core/diff/property-compare.d.ts.map +1 -0
  188. package/dist/core/diff/property-compare.js +37 -0
  189. package/dist/core/diff/property-compare.js.map +1 -0
  190. package/dist/core/diff/version-cache.d.ts +40 -0
  191. package/dist/core/diff/version-cache.d.ts.map +1 -0
  192. package/dist/core/diff/version-cache.js +75 -0
  193. package/dist/core/diff/version-cache.js.map +1 -0
  194. package/dist/core/enrichment/enrichment-service.d.ts +52 -0
  195. package/dist/core/enrichment/enrichment-service.d.ts.map +1 -0
  196. package/dist/core/enrichment/enrichment-service.js +375 -0
  197. package/dist/core/enrichment/enrichment-service.js.map +1 -0
  198. package/dist/core/enrichment/index.d.ts +8 -0
  199. package/dist/core/enrichment/index.d.ts.map +1 -0
  200. package/dist/core/enrichment/index.js +8 -0
  201. package/dist/core/enrichment/index.js.map +1 -0
  202. package/dist/core/enrichment/relationship-mapper.d.ts +106 -0
  203. package/dist/core/enrichment/relationship-mapper.d.ts.map +1 -0
  204. package/dist/core/enrichment/relationship-mapper.js +352 -0
  205. package/dist/core/enrichment/relationship-mapper.js.map +1 -0
  206. package/dist/core/enrichment/style-resolver.d.ts +85 -0
  207. package/dist/core/enrichment/style-resolver.d.ts.map +1 -0
  208. package/dist/core/enrichment/style-resolver.js +347 -0
  209. package/dist/core/enrichment/style-resolver.js.map +1 -0
  210. package/dist/core/figjam-tools.d.ts +8 -0
  211. package/dist/core/figjam-tools.d.ts.map +1 -0
  212. package/dist/core/figjam-tools.js +548 -0
  213. package/dist/core/figjam-tools.js.map +1 -0
  214. package/dist/core/figma-api.d.ts +254 -0
  215. package/dist/core/figma-api.d.ts.map +1 -0
  216. package/dist/core/figma-api.js +510 -0
  217. package/dist/core/figma-api.js.map +1 -0
  218. package/dist/core/figma-connector.d.ts +214 -0
  219. package/dist/core/figma-connector.d.ts.map +1 -0
  220. package/dist/core/figma-connector.js +8 -0
  221. package/dist/core/figma-connector.js.map +1 -0
  222. package/dist/core/figma-desktop-connector.d.ts +312 -0
  223. package/dist/core/figma-desktop-connector.d.ts.map +1 -0
  224. package/dist/core/figma-desktop-connector.js +1298 -0
  225. package/dist/core/figma-desktop-connector.js.map +1 -0
  226. package/dist/core/figma-reconstruction-spec.d.ts +166 -0
  227. package/dist/core/figma-reconstruction-spec.d.ts.map +1 -0
  228. package/dist/core/figma-reconstruction-spec.js +403 -0
  229. package/dist/core/figma-reconstruction-spec.js.map +1 -0
  230. package/dist/core/figma-style-extractor.d.ts +76 -0
  231. package/dist/core/figma-style-extractor.d.ts.map +1 -0
  232. package/dist/core/figma-style-extractor.js +312 -0
  233. package/dist/core/figma-style-extractor.js.map +1 -0
  234. package/dist/core/figma-tools.d.ts +22 -0
  235. package/dist/core/figma-tools.d.ts.map +1 -0
  236. package/dist/core/figma-tools.js +3303 -0
  237. package/dist/core/figma-tools.js.map +1 -0
  238. package/dist/core/identity.d.ts +41 -0
  239. package/dist/core/identity.d.ts.map +1 -0
  240. package/dist/core/identity.js +97 -0
  241. package/dist/core/identity.js.map +1 -0
  242. package/dist/core/library-tools.d.ts +17 -0
  243. package/dist/core/library-tools.d.ts.map +1 -0
  244. package/dist/core/library-tools.js +581 -0
  245. package/dist/core/library-tools.js.map +1 -0
  246. package/dist/core/logger.d.ts +22 -0
  247. package/dist/core/logger.d.ts.map +1 -0
  248. package/dist/core/logger.js +54 -0
  249. package/dist/core/logger.js.map +1 -0
  250. package/dist/core/port-discovery.d.ts +211 -0
  251. package/dist/core/port-discovery.d.ts.map +1 -0
  252. package/dist/core/port-discovery.js +936 -0
  253. package/dist/core/port-discovery.js.map +1 -0
  254. package/dist/core/resolve-package-root.d.ts +2 -0
  255. package/dist/core/resolve-package-root.d.ts.map +1 -0
  256. package/dist/core/resolve-package-root.js +12 -0
  257. package/dist/core/resolve-package-root.js.map +1 -0
  258. package/dist/core/slides-tools.d.ts +8 -0
  259. package/dist/core/slides-tools.d.ts.map +1 -0
  260. package/dist/core/slides-tools.js +715 -0
  261. package/dist/core/slides-tools.js.map +1 -0
  262. package/dist/core/slot-tools.d.ts +7 -0
  263. package/dist/core/slot-tools.d.ts.map +1 -0
  264. package/dist/core/slot-tools.js +335 -0
  265. package/dist/core/slot-tools.js.map +1 -0
  266. package/dist/core/snippet-injector.d.ts +24 -0
  267. package/dist/core/snippet-injector.d.ts.map +1 -0
  268. package/dist/core/snippet-injector.js +97 -0
  269. package/dist/core/snippet-injector.js.map +1 -0
  270. package/dist/core/tokens/alias-resolver.d.ts +97 -0
  271. package/dist/core/tokens/alias-resolver.d.ts.map +1 -0
  272. package/dist/core/tokens/alias-resolver.js +206 -0
  273. package/dist/core/tokens/alias-resolver.js.map +1 -0
  274. package/dist/core/tokens/config.d.ts +380 -0
  275. package/dist/core/tokens/config.d.ts.map +1 -0
  276. package/dist/core/tokens/config.js +295 -0
  277. package/dist/core/tokens/config.js.map +1 -0
  278. package/dist/core/tokens/dialect.d.ts +107 -0
  279. package/dist/core/tokens/dialect.d.ts.map +1 -0
  280. package/dist/core/tokens/dialect.js +233 -0
  281. package/dist/core/tokens/dialect.js.map +1 -0
  282. package/dist/core/tokens/figma-converter.d.ts +102 -0
  283. package/dist/core/tokens/figma-converter.d.ts.map +1 -0
  284. package/dist/core/tokens/figma-converter.js +324 -0
  285. package/dist/core/tokens/figma-converter.js.map +1 -0
  286. package/dist/core/tokens/formatters/css-vars.d.ts +24 -0
  287. package/dist/core/tokens/formatters/css-vars.d.ts.map +1 -0
  288. package/dist/core/tokens/formatters/css-vars.js +339 -0
  289. package/dist/core/tokens/formatters/css-vars.js.map +1 -0
  290. package/dist/core/tokens/formatters/dtcg.d.ts +28 -0
  291. package/dist/core/tokens/formatters/dtcg.d.ts.map +1 -0
  292. package/dist/core/tokens/formatters/dtcg.js +377 -0
  293. package/dist/core/tokens/formatters/dtcg.js.map +1 -0
  294. package/dist/core/tokens/formatters/index.d.ts +30 -0
  295. package/dist/core/tokens/formatters/index.d.ts.map +1 -0
  296. package/dist/core/tokens/formatters/index.js +46 -0
  297. package/dist/core/tokens/formatters/index.js.map +1 -0
  298. package/dist/core/tokens/formatters/json.d.ts +37 -0
  299. package/dist/core/tokens/formatters/json.d.ts.map +1 -0
  300. package/dist/core/tokens/formatters/json.js +206 -0
  301. package/dist/core/tokens/formatters/json.js.map +1 -0
  302. package/dist/core/tokens/formatters/less.d.ts +4 -0
  303. package/dist/core/tokens/formatters/less.d.ts.map +1 -0
  304. package/dist/core/tokens/formatters/less.js +5 -0
  305. package/dist/core/tokens/formatters/less.js.map +1 -0
  306. package/dist/core/tokens/formatters/scss.d.ts +26 -0
  307. package/dist/core/tokens/formatters/scss.d.ts.map +1 -0
  308. package/dist/core/tokens/formatters/scss.js +259 -0
  309. package/dist/core/tokens/formatters/scss.js.map +1 -0
  310. package/dist/core/tokens/formatters/stubs.d.ts +9 -0
  311. package/dist/core/tokens/formatters/stubs.d.ts.map +1 -0
  312. package/dist/core/tokens/formatters/stubs.js +14 -0
  313. package/dist/core/tokens/formatters/stubs.js.map +1 -0
  314. package/dist/core/tokens/formatters/style-dictionary-v3.d.ts +45 -0
  315. package/dist/core/tokens/formatters/style-dictionary-v3.d.ts.map +1 -0
  316. package/dist/core/tokens/formatters/style-dictionary-v3.js +214 -0
  317. package/dist/core/tokens/formatters/style-dictionary-v3.js.map +1 -0
  318. package/dist/core/tokens/formatters/tailwind-v3.d.ts +37 -0
  319. package/dist/core/tokens/formatters/tailwind-v3.d.ts.map +1 -0
  320. package/dist/core/tokens/formatters/tailwind-v3.js +238 -0
  321. package/dist/core/tokens/formatters/tailwind-v3.js.map +1 -0
  322. package/dist/core/tokens/formatters/tailwind-v4.d.ts +41 -0
  323. package/dist/core/tokens/formatters/tailwind-v4.d.ts.map +1 -0
  324. package/dist/core/tokens/formatters/tailwind-v4.js +336 -0
  325. package/dist/core/tokens/formatters/tailwind-v4.js.map +1 -0
  326. package/dist/core/tokens/formatters/tokens-studio.d.ts +44 -0
  327. package/dist/core/tokens/formatters/tokens-studio.d.ts.map +1 -0
  328. package/dist/core/tokens/formatters/tokens-studio.js +257 -0
  329. package/dist/core/tokens/formatters/tokens-studio.js.map +1 -0
  330. package/dist/core/tokens/formatters/ts-module.d.ts +35 -0
  331. package/dist/core/tokens/formatters/ts-module.d.ts.map +1 -0
  332. package/dist/core/tokens/formatters/ts-module.js +199 -0
  333. package/dist/core/tokens/formatters/ts-module.js.map +1 -0
  334. package/dist/core/tokens/index.d.ts +18 -0
  335. package/dist/core/tokens/index.d.ts.map +1 -0
  336. package/dist/core/tokens/index.js +17 -0
  337. package/dist/core/tokens/index.js.map +1 -0
  338. package/dist/core/tokens/parsers/css-vars.d.ts +3 -0
  339. package/dist/core/tokens/parsers/css-vars.d.ts.map +1 -0
  340. package/dist/core/tokens/parsers/css-vars.js +5 -0
  341. package/dist/core/tokens/parsers/css-vars.js.map +1 -0
  342. package/dist/core/tokens/parsers/dtcg.d.ts +21 -0
  343. package/dist/core/tokens/parsers/dtcg.d.ts.map +1 -0
  344. package/dist/core/tokens/parsers/dtcg.js +281 -0
  345. package/dist/core/tokens/parsers/dtcg.js.map +1 -0
  346. package/dist/core/tokens/parsers/index.d.ts +37 -0
  347. package/dist/core/tokens/parsers/index.d.ts.map +1 -0
  348. package/dist/core/tokens/parsers/index.js +139 -0
  349. package/dist/core/tokens/parsers/index.js.map +1 -0
  350. package/dist/core/tokens/parsers/json.d.ts +4 -0
  351. package/dist/core/tokens/parsers/json.d.ts.map +1 -0
  352. package/dist/core/tokens/parsers/json.js +8 -0
  353. package/dist/core/tokens/parsers/json.js.map +1 -0
  354. package/dist/core/tokens/parsers/scss.d.ts +3 -0
  355. package/dist/core/tokens/parsers/scss.d.ts.map +1 -0
  356. package/dist/core/tokens/parsers/scss.js +5 -0
  357. package/dist/core/tokens/parsers/scss.js.map +1 -0
  358. package/dist/core/tokens/parsers/stubs.d.ts +15 -0
  359. package/dist/core/tokens/parsers/stubs.d.ts.map +1 -0
  360. package/dist/core/tokens/parsers/stubs.js +21 -0
  361. package/dist/core/tokens/parsers/stubs.js.map +1 -0
  362. package/dist/core/tokens/parsers/style-dictionary-v3.d.ts +3 -0
  363. package/dist/core/tokens/parsers/style-dictionary-v3.d.ts.map +1 -0
  364. package/dist/core/tokens/parsers/style-dictionary-v3.js +5 -0
  365. package/dist/core/tokens/parsers/style-dictionary-v3.js.map +1 -0
  366. package/dist/core/tokens/parsers/tailwind-v3.d.ts +3 -0
  367. package/dist/core/tokens/parsers/tailwind-v3.d.ts.map +1 -0
  368. package/dist/core/tokens/parsers/tailwind-v3.js +5 -0
  369. package/dist/core/tokens/parsers/tailwind-v3.js.map +1 -0
  370. package/dist/core/tokens/parsers/tailwind-v4.d.ts +3 -0
  371. package/dist/core/tokens/parsers/tailwind-v4.d.ts.map +1 -0
  372. package/dist/core/tokens/parsers/tailwind-v4.js +5 -0
  373. package/dist/core/tokens/parsers/tailwind-v4.js.map +1 -0
  374. package/dist/core/tokens/parsers/tokens-studio.d.ts +3 -0
  375. package/dist/core/tokens/parsers/tokens-studio.d.ts.map +1 -0
  376. package/dist/core/tokens/parsers/tokens-studio.js +5 -0
  377. package/dist/core/tokens/parsers/tokens-studio.js.map +1 -0
  378. package/dist/core/tokens/schemas.d.ts +155 -0
  379. package/dist/core/tokens/schemas.d.ts.map +1 -0
  380. package/dist/core/tokens/schemas.js +153 -0
  381. package/dist/core/tokens/schemas.js.map +1 -0
  382. package/dist/core/tokens/transforms/color.d.ts +9 -0
  383. package/dist/core/tokens/transforms/color.d.ts.map +1 -0
  384. package/dist/core/tokens/transforms/color.js +13 -0
  385. package/dist/core/tokens/transforms/color.js.map +1 -0
  386. package/dist/core/tokens/transforms/index.d.ts +36 -0
  387. package/dist/core/tokens/transforms/index.d.ts.map +1 -0
  388. package/dist/core/tokens/transforms/index.js +30 -0
  389. package/dist/core/tokens/transforms/index.js.map +1 -0
  390. package/dist/core/tokens/transforms/size.d.ts +7 -0
  391. package/dist/core/tokens/transforms/size.d.ts.map +1 -0
  392. package/dist/core/tokens/transforms/size.js +8 -0
  393. package/dist/core/tokens/transforms/size.js.map +1 -0
  394. package/dist/core/tokens/types.d.ts +284 -0
  395. package/dist/core/tokens/types.d.ts.map +1 -0
  396. package/dist/core/tokens/types.js +19 -0
  397. package/dist/core/tokens/types.js.map +1 -0
  398. package/dist/core/tokens-tools.d.ts +285 -0
  399. package/dist/core/tokens-tools.d.ts.map +1 -0
  400. package/dist/core/tokens-tools.js +1789 -0
  401. package/dist/core/tokens-tools.js.map +1 -0
  402. package/dist/core/types/design-code.d.ts +271 -0
  403. package/dist/core/types/design-code.d.ts.map +1 -0
  404. package/dist/core/types/design-code.js +5 -0
  405. package/dist/core/types/design-code.js.map +1 -0
  406. package/dist/core/types/enriched.d.ts +213 -0
  407. package/dist/core/types/enriched.d.ts.map +1 -0
  408. package/dist/core/types/enriched.js +6 -0
  409. package/dist/core/types/enriched.js.map +1 -0
  410. package/dist/core/types/index.d.ts +104 -0
  411. package/dist/core/types/index.d.ts.map +1 -0
  412. package/dist/core/types/index.js +5 -0
  413. package/dist/core/types/index.js.map +1 -0
  414. package/dist/core/variable-resolver.d.ts +45 -0
  415. package/dist/core/variable-resolver.d.ts.map +1 -0
  416. package/dist/core/variable-resolver.js +86 -0
  417. package/dist/core/variable-resolver.js.map +1 -0
  418. package/dist/core/version-tools.d.ts +59 -0
  419. package/dist/core/version-tools.d.ts.map +1 -0
  420. package/dist/core/version-tools.js +1200 -0
  421. package/dist/core/version-tools.js.map +1 -0
  422. package/dist/core/websocket-connector.d.ts +247 -0
  423. package/dist/core/websocket-connector.d.ts.map +1 -0
  424. package/dist/core/websocket-connector.js +437 -0
  425. package/dist/core/websocket-connector.js.map +1 -0
  426. package/dist/core/websocket-server.d.ts +290 -0
  427. package/dist/core/websocket-server.d.ts.map +1 -0
  428. package/dist/core/websocket-server.js +957 -0
  429. package/dist/core/websocket-server.js.map +1 -0
  430. package/dist/core/write-tools.d.ts +7 -0
  431. package/dist/core/write-tools.d.ts.map +1 -0
  432. package/dist/core/write-tools.js +2507 -0
  433. package/dist/core/write-tools.js.map +1 -0
  434. package/dist/local.d.ts +105 -0
  435. package/dist/local.d.ts.map +1 -0
  436. package/dist/local.js +3314 -0
  437. package/dist/local.js.map +1 -0
  438. package/figma-desktop-bridge/README.md +365 -0
  439. package/figma-desktop-bridge/code.js +7359 -0
  440. package/figma-desktop-bridge/icon.png +0 -0
  441. package/figma-desktop-bridge/manifest.json +67 -0
  442. package/figma-desktop-bridge/ui.html +2783 -0
  443. package/package.json +103 -0
@@ -0,0 +1,295 @@
1
+ /**
2
+ * tokens.config.json schema, loader, and autodiscovery for the figma-console-mcp
3
+ * token sync engine.
4
+ *
5
+ * Both figma_export_tokens and figma_import_tokens read this single config so
6
+ * follow-up calls in a project are zero-arg. Autodiscovery walks up from the
7
+ * current working directory looking for `tokens.config.json` at each level
8
+ * — same convention as `tsconfig.json`, `package.json`, `.eslintrc`, etc.
9
+ */
10
+ import { existsSync, readFileSync } from "node:fs";
11
+ import { dirname, join, resolve } from "node:path";
12
+ import { z } from "zod";
13
+ /**
14
+ * Schema for a single output target in `tokens.config.json`. Each entry
15
+ * produces one or more files when figma_export_tokens runs.
16
+ */
17
+ const OutputTargetSchema = z.object({
18
+ format: z.enum([
19
+ "dtcg",
20
+ "tokens-studio",
21
+ "css-vars",
22
+ "tailwind-v4",
23
+ "tailwind-v3",
24
+ "scss",
25
+ "less",
26
+ "ts-module",
27
+ "json-flat",
28
+ "json-nested",
29
+ "style-dictionary-v3",
30
+ ]),
31
+ /** Optional filename override. Default is derived from format + scope. */
32
+ filename: z.string().optional(),
33
+ /** Output prefix applied to every token name (e.g. "ds-", "al-"). */
34
+ prefix: z.string().optional(),
35
+ /** Emit one file per mode (e.g. tokens-light.css, tokens-dark.css). */
36
+ splitByMode: z.boolean().optional(),
37
+ /** Emit one file per token set / Figma collection. */
38
+ splitByCollection: z.boolean().optional(),
39
+ /**
40
+ * If true, alias references are resolved to literal values in the output.
41
+ * If false, aliases are preserved (default for JSON formats, forced true
42
+ * for CSS/SCSS/Tailwind/etc. since they can't natively express aliases).
43
+ */
44
+ resolveAliases: z.boolean().optional(),
45
+ /**
46
+ * DTCG dialect for dtcg/json outputs. 'legacy' (default): hex-string
47
+ * colors and bare-number dimensions, maximum compatibility (Style
48
+ * Dictionary v4, Tokens Studio). '2025': DTCG 2025.10 object colors
49
+ * ({ colorSpace, components, alpha?, hex }) and dimensions
50
+ * ({ value, unit }) for Style Dictionary v5+ and other 2025.10-aware
51
+ * tooling. Ignored by css/scss/tailwind/ts formatters, which render
52
+ * final code.
53
+ */
54
+ dtcgDialect: z.enum(["legacy", "2025"]).optional(),
55
+ /** Per-target transform options. Override the global defaults. */
56
+ transforms: z
57
+ .object({
58
+ colorFormat: z.enum(["hex", "hex8", "rgba", "oklch", "hsl"]).optional(),
59
+ sizeUnit: z.enum(["px", "rem", "pt", "dp"]).optional(),
60
+ remBase: z.number().positive().optional(),
61
+ })
62
+ .optional(),
63
+ });
64
+ /**
65
+ * Full schema for `tokens.config.json`. Every field is optional so the
66
+ * minimum-viable config is `{ "figmaFile": "..." }` — the rest gets sensible
67
+ * defaults.
68
+ */
69
+ export const TokensConfigSchema = z
70
+ .object({
71
+ /** Optional JSON Schema URL for editor autocompletion. */
72
+ $schema: z.string().optional(),
73
+ /**
74
+ * Figma file URL or fileKey. When omitted, tools fall back to the
75
+ * currently-connected Desktop Bridge plugin's file (Local Mode) or the
76
+ * file context bound by figma_pair_plugin (Cloud Mode).
77
+ */
78
+ figmaFile: z.string().optional(),
79
+ /** Where the canonical (committed) token sources live. */
80
+ source: z
81
+ .object({
82
+ /** Directory holding the canonical token files. */
83
+ dir: z.string(),
84
+ /** Glob pattern within dir. Default: "*.tokens.json" */
85
+ pattern: z.string().optional(),
86
+ /**
87
+ * Canonical format for source files. DTCG is the recommended default;
88
+ * Tokens Studio is supported for users who already have a `$themes.json`
89
+ * setup (e.g. Altitude).
90
+ */
91
+ canonical: z.enum(["dtcg", "tokens-studio"]).default("dtcg"),
92
+ })
93
+ .default({ dir: "src/styles/tokens", canonical: "dtcg" }),
94
+ /** Where build outputs (CSS, Tailwind, etc.) get written. */
95
+ generated: z
96
+ .object({
97
+ dir: z.string().default("src/styles/generated"),
98
+ formats: z.array(OutputTargetSchema).default([]),
99
+ })
100
+ .optional(),
101
+ /** Mode name mappings (Figma mode name → output mode name). */
102
+ modes: z
103
+ .object({
104
+ /** e.g. { "Light": "light", "Dark": "dark" } */
105
+ map: z.record(z.string()).optional(),
106
+ /** Default mode if a token has no explicit mode (e.g. "Light"). */
107
+ default: z.string().optional(),
108
+ })
109
+ .optional(),
110
+ /** Default conflict-resolution strategy when not specified per-call. */
111
+ conflictResolution: z
112
+ .enum(["ask", "figma-wins", "code-wins", "skip"])
113
+ .default("ask"),
114
+ /** Behavior for tokens that exist on one side but not the other. */
115
+ sync: z
116
+ .object({
117
+ onMissingInCode: z
118
+ .enum(["preserve", "delete", "warn"])
119
+ .default("preserve"),
120
+ onMissingInFigma: z
121
+ .enum(["preserve", "delete", "warn"])
122
+ .default("preserve"),
123
+ })
124
+ .optional(),
125
+ })
126
+ .strict();
127
+ /**
128
+ * Walk up from `startDir` looking for `tokens.config.json`. Returns the first
129
+ * match, or `null` if none found by the filesystem root.
130
+ */
131
+ export function findTokensConfig(startDir) {
132
+ let dir = resolve(startDir);
133
+ // Hard cap on directory traversal so a misconfigured startDir can't loop
134
+ // forever (defense against symlinks/weird filesystems).
135
+ const maxDepth = 32;
136
+ for (let i = 0; i < maxDepth; i++) {
137
+ const candidate = join(dir, "tokens.config.json");
138
+ if (existsSync(candidate)) {
139
+ return candidate;
140
+ }
141
+ const parent = dirname(dir);
142
+ if (parent === dir) {
143
+ // Hit filesystem root, no config found.
144
+ return null;
145
+ }
146
+ dir = parent;
147
+ }
148
+ return null;
149
+ }
150
+ /**
151
+ * Load and validate `tokens.config.json`. If `explicitPath` is provided, uses
152
+ * that; otherwise autodiscovers by walking up from `cwd` (default
153
+ * `process.cwd()`).
154
+ *
155
+ * Returns `null` if no config is found AND no explicit path was given. Throws
156
+ * if an explicit path doesn't exist, or if the discovered file fails schema
157
+ * validation.
158
+ */
159
+ export function loadTokensConfig(opts = {}) {
160
+ const cwd = opts.cwd ?? process.cwd();
161
+ const configPath = opts.explicitPath
162
+ ? resolve(opts.explicitPath)
163
+ : findTokensConfig(cwd);
164
+ if (!configPath)
165
+ return null;
166
+ if (!existsSync(configPath)) {
167
+ throw new Error(`[figma-console-mcp] tokens.config.json not found at ${configPath}`);
168
+ }
169
+ const raw = readFileSync(configPath, "utf-8");
170
+ let parsed;
171
+ try {
172
+ parsed = JSON.parse(raw);
173
+ }
174
+ catch (err) {
175
+ throw new Error(`[figma-console-mcp] tokens.config.json at ${configPath} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
176
+ }
177
+ const result = TokensConfigSchema.safeParse(parsed);
178
+ if (!result.success) {
179
+ const issues = result.error.issues
180
+ .map((i) => ` • ${i.path.join(".")}: ${i.message}`)
181
+ .join("\n");
182
+ throw new Error(`[figma-console-mcp] tokens.config.json at ${configPath} failed validation:\n${issues}`);
183
+ }
184
+ return {
185
+ config: result.data,
186
+ configPath,
187
+ projectRoot: dirname(configPath),
188
+ };
189
+ }
190
+ /**
191
+ * Default config used when none is found. Drives the "no-config detected"
192
+ * response shape from figma_export_tokens — the AI uses this to propose a
193
+ * scaffold to the user.
194
+ */
195
+ export const DEFAULT_TOKENS_CONFIG = {
196
+ source: { dir: "src/styles/tokens", canonical: "dtcg" },
197
+ generated: {
198
+ dir: "src/styles/generated",
199
+ formats: [
200
+ { format: "css-vars", splitByMode: true },
201
+ ],
202
+ },
203
+ conflictResolution: "ask",
204
+ };
205
+ /**
206
+ * Build a `suggestedScaffold` payload returned when a tool is called and no
207
+ * `tokens.config.json` exists. The AI presents this scaffold to the user,
208
+ * writes the files via its native edit/write tools, then calls the original
209
+ * tool again.
210
+ */
211
+ export function buildSuggestedScaffold(opts) {
212
+ const config = {
213
+ $schema: "https://figma-console-mcp.southleft.com/schemas/tokens.config.v1.json",
214
+ source: { dir: "src/styles/tokens", canonical: "dtcg" },
215
+ generated: {
216
+ dir: "src/styles/generated",
217
+ formats: pickStartingFormats(opts.detectedFramework),
218
+ },
219
+ conflictResolution: "ask",
220
+ };
221
+ const stylesheetImport = pickStylesheetImport(opts.detectedFramework);
222
+ return {
223
+ configContent: JSON.stringify(config, null, 2),
224
+ directories: [config.source.dir, config.generated?.dir ?? "src/styles/generated"],
225
+ stylesheetImport,
226
+ nextSteps: [
227
+ "1. Write `tokens.config.json` at the project root using `configContent`.",
228
+ `2. Create the directories: ${config.source.dir} and ${config.generated?.dir}.`,
229
+ `3. Add this line to your main stylesheet:\n ${stylesheetImport}`,
230
+ "4. Run `figma_export_tokens` again — it'll pick up the new config and populate the source dir.",
231
+ ].join("\n"),
232
+ };
233
+ }
234
+ function pickStartingFormats(framework) {
235
+ // Always emit DTCG as the canonical committed source; layer the
236
+ // framework-appropriate runtime format on top.
237
+ const base = [];
238
+ switch (framework) {
239
+ case "tailwind-v4":
240
+ base.push({ format: "tailwind-v4", splitByMode: true });
241
+ break;
242
+ case "tailwind-v3":
243
+ base.push({ format: "tailwind-v3" });
244
+ break;
245
+ case "scss":
246
+ base.push({ format: "scss", splitByMode: true });
247
+ break;
248
+ case "ts":
249
+ base.push({ format: "ts-module" });
250
+ base.push({ format: "css-vars", splitByMode: true });
251
+ break;
252
+ case "css":
253
+ default:
254
+ base.push({ format: "css-vars", splitByMode: true });
255
+ break;
256
+ }
257
+ return base;
258
+ }
259
+ function pickStylesheetImport(framework) {
260
+ switch (framework) {
261
+ case "tailwind-v4":
262
+ return "@import './styles/generated/tailwind.theme.css';";
263
+ case "scss":
264
+ return "@use './styles/generated/tokens.scss' as *;";
265
+ case "ts":
266
+ case "css":
267
+ default:
268
+ return "@import './styles/generated/tokens.css';";
269
+ }
270
+ }
271
+ /**
272
+ * Pick the export formats from a loaded config that map to a given runtime
273
+ * format. Used by figma_export_tokens to decide which generated files to
274
+ * write. Returns the list verbatim if the caller passed an explicit format.
275
+ */
276
+ export function resolveOutputTargets(config, explicitFormat) {
277
+ if (explicitFormat) {
278
+ // Caller specified a format directly; ignore config's generated list.
279
+ return [{ format: explicitFormat }];
280
+ }
281
+ if (!config?.generated?.formats?.length) {
282
+ // No formats configured. Default to DTCG only — produces the canonical
283
+ // source files but no derived runtime outputs.
284
+ return [{ format: "dtcg" }];
285
+ }
286
+ return config.generated.formats;
287
+ }
288
+ /**
289
+ * Resolve the conflict-resolution strategy. Per-call argument wins over config
290
+ * default, which wins over the global default ("ask").
291
+ */
292
+ export function resolveConflictStrategy(config, perCall) {
293
+ return perCall ?? config?.conflictResolution ?? "ask";
294
+ }
295
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/tokens/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * DTCG dialect helpers — legacy vs 2025.10 value encodings.
3
+ *
4
+ * The token pipeline historically speaks the "legacy" DTCG dialect: colors
5
+ * as hex strings ("#4085F2"), FLOAT dimensions as bare numbers. The DTCG
6
+ * 2025.10 spec (https://tr.designtokens.org/format/) switched to object
7
+ * forms:
8
+ *
9
+ * color = { colorSpace: "srgb", components: [r, g, b], alpha?, hex? }
10
+ * dimension = { value: number, unit: "px" | "rem" }
11
+ * duration = { value: number, unit: "ms" | "s" } (we already emit this)
12
+ *
13
+ * Export stays legacy by default (downstream consumers depend on it) and
14
+ * opts into 2025 via the `dtcgDialect` option. Import accepts BOTH dialects
15
+ * unconditionally. This module centralizes:
16
+ *
17
+ * - 2025 encoding helpers used by the dtcg/json formatters at render time
18
+ * - dialect-agnostic canonicalization used by the import diff so a 2025
19
+ * color object compares equal to the same color's legacy hex string
20
+ * (both are quantized to 1/255 per channel, tolerating the 8-bit
21
+ * precision loss inherent to hex)
22
+ * - stripping of the transient `rawColor` field the converter carries on
23
+ * COLOR TokenValues (full-precision floats for 2025 components) so it
24
+ * never leaks into serialized output
25
+ */
26
+ /** Export dialect selector. `legacy` is the default everywhere. */
27
+ export type DtcgDialect = "legacy" | "2025";
28
+ /** Raw Figma color floats, 0–1 range. */
29
+ export interface RawRgba {
30
+ r: number;
31
+ g: number;
32
+ b: number;
33
+ a: number;
34
+ }
35
+ export declare function clamp01(n: number): number;
36
+ /**
37
+ * Canonicalize any color-like literal to a lowercase 8-digit hex string
38
+ * (`#rrggbbaa`), or return null when the literal isn't recognizably a color.
39
+ *
40
+ * Accepts:
41
+ * - hex strings: #rgb, #rrggbb, #rrggbbaa
42
+ * - 2025.10 color objects with srgb (or unspecified) colorSpace +
43
+ * 3 numeric components (+ optional alpha)
44
+ * - color objects with a hex fallback field (any colorSpace) + optional alpha
45
+ *
46
+ * Both the components form and the hex form quantize to 1 / 255 per channel,
47
+ * so a full-precision components array compares equal to the hex string the
48
+ * legacy pipeline derived from the same Figma floats.
49
+ */
50
+ export declare function colorLiteralToCanonicalHex(literal: unknown): string | null;
51
+ /**
52
+ * Parse a hex color string to raw rgba floats (0–1). Returns null on
53
+ * anything that isn't a valid 3/6/8-digit hex string.
54
+ */
55
+ export declare function hexToRawRgba(hex: string): RawRgba | null;
56
+ /**
57
+ * Encode a color TokenValue in the DTCG 2025.10 object form.
58
+ *
59
+ * Prefers the converter's transient `rawColor` floats (full precision — NOT
60
+ * round-tripped through 8-bit hex); falls back to parsing a hex-string
61
+ * literal. Literals already in object form pass through verbatim. Returns
62
+ * null when the value can't be encoded (caller keeps the legacy rendering).
63
+ *
64
+ * `alpha` is emitted only when < 1; `hex` is always included as the interop
65
+ * courtesy field (#RRGGBB, alpha carried separately).
66
+ */
67
+ export declare function colorValueTo2025(value: {
68
+ literal?: unknown;
69
+ rawColor?: RawRgba;
70
+ }): Record<string, unknown> | null;
71
+ /**
72
+ * Encode a dimension literal in the DTCG 2025.10 object form. The converter
73
+ * emits Figma FLOAT dimensions as bare unitless numbers conventionally
74
+ * interpreted as px (the same convention the css/json formatters use), so
75
+ * only bare finite numbers are converted; everything else (unit strings,
76
+ * pre-encoded objects) keeps its current rendering.
77
+ */
78
+ export declare function dimensionLiteralTo2025(literal: unknown): {
79
+ value: number;
80
+ unit: "px";
81
+ } | null;
82
+ /**
83
+ * Normalize a TokenValue to a dialect-agnostic comparable form for diffing:
84
+ *
85
+ * - the transient `rawColor` field is dropped (Figma-side values carry it;
86
+ * parsed code-side values never do)
87
+ * - color-like literals (hex strings OR 2025 color objects) normalize to a
88
+ * lowercase 8-digit hex string, quantized to 1/255 per channel
89
+ * - `{ value, unit }` objects with px/ms normalize to the bare number
90
+ * ("s" converts to ms first), so `{value: 16, unit: "px"}` equals 16 and
91
+ * `{value: 0.3, unit: "s"}` equals `{value: 300, unit: "ms"}`
92
+ * - "16px"-style strings normalize to the bare number
93
+ *
94
+ * Conservative by design: anything not confidently recognized is returned
95
+ * unchanged (minus rawColor), falling back to the existing deep comparison.
96
+ */
97
+ export declare function canonicalizeTokenValueForComparison(v: unknown): unknown;
98
+ /**
99
+ * Return a copy of a mode-keyed TokenValue map with the transient `rawColor`
100
+ * field removed from every entry. Used wherever values get serialized
101
+ * (lastSyncedValue snapshots, diff-plan samples) so the transient field never
102
+ * appears in output — keeping legacy output byte-identical.
103
+ */
104
+ export declare function stripRawColorFromValues<V extends {
105
+ rawColor?: unknown;
106
+ }>(values: Record<string, V>): Record<string, Omit<V, "rawColor">>;
107
+ //# sourceMappingURL=dialect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../../src/core/tokens/dialect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,mEAAmE;AACnE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5C,yCAAyC;AACzC,MAAM,WAAW,OAAO;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGzC;AAQD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAyC1E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAUxD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAoBjC;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG,IAAI,CAKtC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mCAAmC,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAYvE;AA8BD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,EACtE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GACxB,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAWrC"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * DTCG dialect helpers — legacy vs 2025.10 value encodings.
3
+ *
4
+ * The token pipeline historically speaks the "legacy" DTCG dialect: colors
5
+ * as hex strings ("#4085F2"), FLOAT dimensions as bare numbers. The DTCG
6
+ * 2025.10 spec (https://tr.designtokens.org/format/) switched to object
7
+ * forms:
8
+ *
9
+ * color = { colorSpace: "srgb", components: [r, g, b], alpha?, hex? }
10
+ * dimension = { value: number, unit: "px" | "rem" }
11
+ * duration = { value: number, unit: "ms" | "s" } (we already emit this)
12
+ *
13
+ * Export stays legacy by default (downstream consumers depend on it) and
14
+ * opts into 2025 via the `dtcgDialect` option. Import accepts BOTH dialects
15
+ * unconditionally. This module centralizes:
16
+ *
17
+ * - 2025 encoding helpers used by the dtcg/json formatters at render time
18
+ * - dialect-agnostic canonicalization used by the import diff so a 2025
19
+ * color object compares equal to the same color's legacy hex string
20
+ * (both are quantized to 1/255 per channel, tolerating the 8-bit
21
+ * precision loss inherent to hex)
22
+ * - stripping of the transient `rawColor` field the converter carries on
23
+ * COLOR TokenValues (full-precision floats for 2025 components) so it
24
+ * never leaks into serialized output
25
+ */
26
+ export function clamp01(n) {
27
+ if (Number.isNaN(n))
28
+ return 0;
29
+ return Math.max(0, Math.min(1, n));
30
+ }
31
+ function byteHex(f) {
32
+ return Math.round(clamp01(f) * 255)
33
+ .toString(16)
34
+ .padStart(2, "0");
35
+ }
36
+ /**
37
+ * Canonicalize any color-like literal to a lowercase 8-digit hex string
38
+ * (`#rrggbbaa`), or return null when the literal isn't recognizably a color.
39
+ *
40
+ * Accepts:
41
+ * - hex strings: #rgb, #rrggbb, #rrggbbaa
42
+ * - 2025.10 color objects with srgb (or unspecified) colorSpace +
43
+ * 3 numeric components (+ optional alpha)
44
+ * - color objects with a hex fallback field (any colorSpace) + optional alpha
45
+ *
46
+ * Both the components form and the hex form quantize to 1 / 255 per channel,
47
+ * so a full-precision components array compares equal to the hex string the
48
+ * legacy pipeline derived from the same Figma floats.
49
+ */
50
+ export function colorLiteralToCanonicalHex(literal) {
51
+ if (typeof literal === "string") {
52
+ const m = literal
53
+ .trim()
54
+ .match(/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i);
55
+ if (!m)
56
+ return null;
57
+ let digits = m[1].toLowerCase();
58
+ if (digits.length === 3) {
59
+ digits = digits
60
+ .split("")
61
+ .map((c) => c + c)
62
+ .join("");
63
+ }
64
+ if (digits.length === 6)
65
+ digits += "ff";
66
+ return `#${digits}`;
67
+ }
68
+ if (literal && typeof literal === "object" && !Array.isArray(literal)) {
69
+ const o = literal;
70
+ const colorSpace = typeof o.colorSpace === "string" ? o.colorSpace : undefined;
71
+ const comps = o.components;
72
+ if ((colorSpace === undefined || colorSpace === "srgb") &&
73
+ Array.isArray(comps) &&
74
+ comps.length === 3 &&
75
+ comps.every((c) => typeof c === "number")) {
76
+ const [r, g, b] = comps;
77
+ const a = typeof o.alpha === "number" ? o.alpha : 1;
78
+ return `#${byteHex(r)}${byteHex(g)}${byteHex(b)}${byteHex(a)}`;
79
+ }
80
+ if (typeof o.hex === "string") {
81
+ const base = colorLiteralToCanonicalHex(o.hex);
82
+ if (!base)
83
+ return null;
84
+ if (typeof o.alpha === "number") {
85
+ return base.slice(0, 7) + byteHex(o.alpha);
86
+ }
87
+ return base;
88
+ }
89
+ }
90
+ return null;
91
+ }
92
+ /**
93
+ * Parse a hex color string to raw rgba floats (0–1). Returns null on
94
+ * anything that isn't a valid 3/6/8-digit hex string.
95
+ */
96
+ export function hexToRawRgba(hex) {
97
+ const canonical = colorLiteralToCanonicalHex(hex);
98
+ if (!canonical)
99
+ return null;
100
+ const d = canonical.slice(1);
101
+ return {
102
+ r: parseInt(d.slice(0, 2), 16) / 255,
103
+ g: parseInt(d.slice(2, 4), 16) / 255,
104
+ b: parseInt(d.slice(4, 6), 16) / 255,
105
+ a: parseInt(d.slice(6, 8), 16) / 255,
106
+ };
107
+ }
108
+ /**
109
+ * Encode a color TokenValue in the DTCG 2025.10 object form.
110
+ *
111
+ * Prefers the converter's transient `rawColor` floats (full precision — NOT
112
+ * round-tripped through 8-bit hex); falls back to parsing a hex-string
113
+ * literal. Literals already in object form pass through verbatim. Returns
114
+ * null when the value can't be encoded (caller keeps the legacy rendering).
115
+ *
116
+ * `alpha` is emitted only when < 1; `hex` is always included as the interop
117
+ * courtesy field (#RRGGBB, alpha carried separately).
118
+ */
119
+ export function colorValueTo2025(value) {
120
+ const lit = value.literal;
121
+ if (lit && typeof lit === "object" && !Array.isArray(lit)) {
122
+ // Already object-form (e.g. a re-exported 2025 document) — pass through.
123
+ const o = lit;
124
+ if ("colorSpace" in o || "components" in o || "hex" in o)
125
+ return o;
126
+ return null;
127
+ }
128
+ let floats = value.rawColor ?? null;
129
+ if (!floats && typeof lit === "string") {
130
+ floats = hexToRawRgba(lit);
131
+ }
132
+ if (!floats)
133
+ return null;
134
+ const { r, g, b, a } = floats;
135
+ return {
136
+ colorSpace: "srgb",
137
+ components: [r, g, b],
138
+ ...(a < 1 ? { alpha: a } : {}),
139
+ hex: `#${byteHex(r)}${byteHex(g)}${byteHex(b)}`.toUpperCase(),
140
+ };
141
+ }
142
+ /**
143
+ * Encode a dimension literal in the DTCG 2025.10 object form. The converter
144
+ * emits Figma FLOAT dimensions as bare unitless numbers conventionally
145
+ * interpreted as px (the same convention the css/json formatters use), so
146
+ * only bare finite numbers are converted; everything else (unit strings,
147
+ * pre-encoded objects) keeps its current rendering.
148
+ */
149
+ export function dimensionLiteralTo2025(literal) {
150
+ if (typeof literal === "number" && Number.isFinite(literal)) {
151
+ return { value: literal, unit: "px" };
152
+ }
153
+ return null;
154
+ }
155
+ /**
156
+ * Normalize a TokenValue to a dialect-agnostic comparable form for diffing:
157
+ *
158
+ * - the transient `rawColor` field is dropped (Figma-side values carry it;
159
+ * parsed code-side values never do)
160
+ * - color-like literals (hex strings OR 2025 color objects) normalize to a
161
+ * lowercase 8-digit hex string, quantized to 1/255 per channel
162
+ * - `{ value, unit }` objects with px/ms normalize to the bare number
163
+ * ("s" converts to ms first), so `{value: 16, unit: "px"}` equals 16 and
164
+ * `{value: 0.3, unit: "s"}` equals `{value: 300, unit: "ms"}`
165
+ * - "16px"-style strings normalize to the bare number
166
+ *
167
+ * Conservative by design: anything not confidently recognized is returned
168
+ * unchanged (minus rawColor), falling back to the existing deep comparison.
169
+ */
170
+ export function canonicalizeTokenValueForComparison(v) {
171
+ if (v === null || typeof v !== "object" || Array.isArray(v))
172
+ return v;
173
+ const obj = v;
174
+ if (!("literal" in obj) && !("reference" in obj))
175
+ return v;
176
+ const { rawColor: _rawColor, ...rest } = obj;
177
+ if (rest.literal !== undefined) {
178
+ const hex = colorLiteralToCanonicalHex(rest.literal);
179
+ if (hex !== null)
180
+ return { ...rest, literal: hex };
181
+ const num = numericLiteralToCanonical(rest.literal);
182
+ if (num !== null)
183
+ return { ...rest, literal: num };
184
+ }
185
+ return rest;
186
+ }
187
+ /**
188
+ * Normalize dimension/duration-shaped literals to a bare comparable number:
189
+ * - `{ value: n, unit: "px" | "ms" }` → n
190
+ * - `{ value: n, unit: "s" }` → n * 1000 (canonical ms)
191
+ * - `"16px"` strings → 16
192
+ * Returns null for everything else (including rem/em/% and objects with
193
+ * extra fields — those keep structural comparison).
194
+ */
195
+ function numericLiteralToCanonical(literal) {
196
+ if (typeof literal === "string") {
197
+ const m = literal.trim().match(/^(-?(?:\d+\.?\d*|\.\d+))px$/i);
198
+ return m ? Number(m[1]) : null;
199
+ }
200
+ if (literal &&
201
+ typeof literal === "object" &&
202
+ !Array.isArray(literal) &&
203
+ Object.keys(literal).length === 2) {
204
+ const o = literal;
205
+ if (typeof o.value === "number" && typeof o.unit === "string") {
206
+ if (o.unit === "px" || o.unit === "ms")
207
+ return o.value;
208
+ if (o.unit === "s")
209
+ return o.value * 1000;
210
+ }
211
+ }
212
+ return null;
213
+ }
214
+ /**
215
+ * Return a copy of a mode-keyed TokenValue map with the transient `rawColor`
216
+ * field removed from every entry. Used wherever values get serialized
217
+ * (lastSyncedValue snapshots, diff-plan samples) so the transient field never
218
+ * appears in output — keeping legacy output byte-identical.
219
+ */
220
+ export function stripRawColorFromValues(values) {
221
+ const out = {};
222
+ for (const [k, v] of Object.entries(values)) {
223
+ if (v && typeof v === "object" && "rawColor" in v) {
224
+ const { rawColor: _rawColor, ...rest } = v;
225
+ out[k] = rest;
226
+ }
227
+ else {
228
+ out[k] = v;
229
+ }
230
+ }
231
+ return out;
232
+ }
233
+ //# sourceMappingURL=dialect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect.js","sourceRoot":"","sources":["../../../src/core/tokens/dialect.ts"],"names":[],"mappings":"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"}