@calibrate-ds/core 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 (529) hide show
  1. package/dist/__tests__/check-component.test.d.ts +2 -0
  2. package/dist/__tests__/check-component.test.d.ts.map +1 -0
  3. package/dist/__tests__/check-component.test.js +103 -0
  4. package/dist/__tests__/check-component.test.js.map +1 -0
  5. package/dist/__tests__/compare-components.test.d.ts +2 -0
  6. package/dist/__tests__/compare-components.test.d.ts.map +1 -0
  7. package/dist/__tests__/compare-components.test.js +145 -0
  8. package/dist/__tests__/compare-components.test.js.map +1 -0
  9. package/dist/__tests__/naming-strategy.test.d.ts +2 -0
  10. package/dist/__tests__/naming-strategy.test.d.ts.map +1 -0
  11. package/dist/__tests__/naming-strategy.test.js +71 -0
  12. package/dist/__tests__/naming-strategy.test.js.map +1 -0
  13. package/dist/ai/index.d.ts +3 -0
  14. package/dist/ai/index.d.ts.map +1 -0
  15. package/dist/ai/index.js +3 -0
  16. package/dist/ai/index.js.map +1 -0
  17. package/dist/ai/provider.d.ts +14 -0
  18. package/dist/ai/provider.d.ts.map +1 -0
  19. package/dist/ai/provider.js +63 -0
  20. package/dist/ai/provider.js.map +1 -0
  21. package/dist/ai/resolve-provider.d.ts +3 -0
  22. package/dist/ai/resolve-provider.d.ts.map +1 -0
  23. package/dist/ai/resolve-provider.js +61 -0
  24. package/dist/ai/resolve-provider.js.map +1 -0
  25. package/dist/bootstrap/generate-library-files.d.ts +7 -0
  26. package/dist/bootstrap/generate-library-files.d.ts.map +1 -0
  27. package/dist/bootstrap/generate-library-files.js +97 -0
  28. package/dist/bootstrap/generate-library-files.js.map +1 -0
  29. package/dist/bootstrap/index.d.ts +4 -0
  30. package/dist/bootstrap/index.d.ts.map +1 -0
  31. package/dist/bootstrap/index.js +4 -0
  32. package/dist/bootstrap/index.js.map +1 -0
  33. package/dist/bootstrap/types.d.ts +27 -0
  34. package/dist/bootstrap/types.d.ts.map +1 -0
  35. package/dist/bootstrap/types.js +2 -0
  36. package/dist/bootstrap/types.js.map +1 -0
  37. package/dist/bootstrap/write-library-bootstrap.d.ts +7 -0
  38. package/dist/bootstrap/write-library-bootstrap.d.ts.map +1 -0
  39. package/dist/bootstrap/write-library-bootstrap.js +35 -0
  40. package/dist/bootstrap/write-library-bootstrap.js.map +1 -0
  41. package/dist/config/config-schema.d.ts +131 -0
  42. package/dist/config/config-schema.d.ts.map +1 -0
  43. package/dist/config/config-schema.js +93 -0
  44. package/dist/config/config-schema.js.map +1 -0
  45. package/dist/config/index.d.ts +3 -0
  46. package/dist/config/index.d.ts.map +1 -0
  47. package/dist/config/index.js +3 -0
  48. package/dist/config/index.js.map +1 -0
  49. package/dist/config/load-config.d.ts +7 -0
  50. package/dist/config/load-config.d.ts.map +1 -0
  51. package/dist/config/load-config.js +63 -0
  52. package/dist/config/load-config.js.map +1 -0
  53. package/dist/context/compressed-context.d.ts +3 -0
  54. package/dist/context/compressed-context.d.ts.map +1 -0
  55. package/dist/context/compressed-context.js +145 -0
  56. package/dist/context/compressed-context.js.map +1 -0
  57. package/dist/context/context-index.d.ts +18 -0
  58. package/dist/context/context-index.d.ts.map +1 -0
  59. package/dist/context/context-index.js +59 -0
  60. package/dist/context/context-index.js.map +1 -0
  61. package/dist/context/export-context.d.ts +61 -0
  62. package/dist/context/export-context.d.ts.map +1 -0
  63. package/dist/context/export-context.js +191 -0
  64. package/dist/context/export-context.js.map +1 -0
  65. package/dist/context/get-component-context.d.ts +3 -0
  66. package/dist/context/get-component-context.d.ts.map +1 -0
  67. package/dist/context/get-component-context.js +898 -0
  68. package/dist/context/get-component-context.js.map +1 -0
  69. package/dist/context/hashing.d.ts +14 -0
  70. package/dist/context/hashing.d.ts.map +1 -0
  71. package/dist/context/hashing.js +53 -0
  72. package/dist/context/hashing.js.map +1 -0
  73. package/dist/context/metadata-extraction.d.ts +15 -0
  74. package/dist/context/metadata-extraction.d.ts.map +1 -0
  75. package/dist/context/metadata-extraction.js +47 -0
  76. package/dist/context/metadata-extraction.js.map +1 -0
  77. package/dist/design-tool/figma-adapter.d.ts +20 -0
  78. package/dist/design-tool/figma-adapter.d.ts.map +1 -0
  79. package/dist/design-tool/figma-adapter.js +46 -0
  80. package/dist/design-tool/figma-adapter.js.map +1 -0
  81. package/dist/design-tool/index.d.ts +4 -0
  82. package/dist/design-tool/index.d.ts.map +1 -0
  83. package/dist/design-tool/index.js +3 -0
  84. package/dist/design-tool/index.js.map +1 -0
  85. package/dist/design-tool/registry.d.ts +12 -0
  86. package/dist/design-tool/registry.d.ts.map +1 -0
  87. package/dist/design-tool/registry.js +23 -0
  88. package/dist/design-tool/registry.js.map +1 -0
  89. package/dist/design-tool/types.d.ts +28 -0
  90. package/dist/design-tool/types.d.ts.map +1 -0
  91. package/dist/design-tool/types.js +2 -0
  92. package/dist/design-tool/types.js.map +1 -0
  93. package/dist/diff/compare-components.d.ts +3 -0
  94. package/dist/diff/compare-components.d.ts.map +1 -0
  95. package/dist/diff/compare-components.js +198 -0
  96. package/dist/diff/compare-components.js.map +1 -0
  97. package/dist/diff/compare-dependencies.d.ts +3 -0
  98. package/dist/diff/compare-dependencies.d.ts.map +1 -0
  99. package/dist/diff/compare-dependencies.js +30 -0
  100. package/dist/diff/compare-dependencies.js.map +1 -0
  101. package/dist/diff/compare-tokens.d.ts +3 -0
  102. package/dist/diff/compare-tokens.d.ts.map +1 -0
  103. package/dist/diff/compare-tokens.js +52 -0
  104. package/dist/diff/compare-tokens.js.map +1 -0
  105. package/dist/diff/compute-design-diff.d.ts +3 -0
  106. package/dist/diff/compute-design-diff.d.ts.map +1 -0
  107. package/dist/diff/compute-design-diff.js +27 -0
  108. package/dist/diff/compute-design-diff.js.map +1 -0
  109. package/dist/diff/format-diff-summary.d.ts +3 -0
  110. package/dist/diff/format-diff-summary.d.ts.map +1 -0
  111. package/dist/diff/format-diff-summary.js +59 -0
  112. package/dist/diff/format-diff-summary.js.map +1 -0
  113. package/dist/diff/index.d.ts +6 -0
  114. package/dist/diff/index.d.ts.map +1 -0
  115. package/dist/diff/index.js +6 -0
  116. package/dist/diff/index.js.map +1 -0
  117. package/dist/docs/generate-component-doc.d.ts +34 -0
  118. package/dist/docs/generate-component-doc.d.ts.map +1 -0
  119. package/dist/docs/generate-component-doc.js +269 -0
  120. package/dist/docs/generate-component-doc.js.map +1 -0
  121. package/dist/docs/generate-component-stories.d.ts +3 -0
  122. package/dist/docs/generate-component-stories.d.ts.map +1 -0
  123. package/dist/docs/generate-component-stories.js +116 -0
  124. package/dist/docs/generate-component-stories.js.map +1 -0
  125. package/dist/docs/generate-system-doc.d.ts +23 -0
  126. package/dist/docs/generate-system-doc.d.ts.map +1 -0
  127. package/dist/docs/generate-system-doc.js +337 -0
  128. package/dist/docs/generate-system-doc.js.map +1 -0
  129. package/dist/docs/index.d.ts +5 -0
  130. package/dist/docs/index.d.ts.map +1 -0
  131. package/dist/docs/index.js +5 -0
  132. package/dist/docs/index.js.map +1 -0
  133. package/dist/docs/setup-storybook.d.ts +26 -0
  134. package/dist/docs/setup-storybook.d.ts.map +1 -0
  135. package/dist/docs/setup-storybook.js +216 -0
  136. package/dist/docs/setup-storybook.js.map +1 -0
  137. package/dist/doctor/check-component.d.ts +5 -0
  138. package/dist/doctor/check-component.d.ts.map +1 -0
  139. package/dist/doctor/check-component.js +120 -0
  140. package/dist/doctor/check-component.js.map +1 -0
  141. package/dist/doctor/check-config.d.ts +4 -0
  142. package/dist/doctor/check-config.d.ts.map +1 -0
  143. package/dist/doctor/check-config.js +65 -0
  144. package/dist/doctor/check-config.js.map +1 -0
  145. package/dist/doctor/check-tokens.d.ts +4 -0
  146. package/dist/doctor/check-tokens.d.ts.map +1 -0
  147. package/dist/doctor/check-tokens.js +17 -0
  148. package/dist/doctor/check-tokens.js.map +1 -0
  149. package/dist/doctor/index.d.ts +5 -0
  150. package/dist/doctor/index.d.ts.map +1 -0
  151. package/dist/doctor/index.js +5 -0
  152. package/dist/doctor/index.js.map +1 -0
  153. package/dist/doctor/types.d.ts +30 -0
  154. package/dist/doctor/types.d.ts.map +1 -0
  155. package/dist/doctor/types.js +2 -0
  156. package/dist/doctor/types.js.map +1 -0
  157. package/dist/filesystem/ensure-dir.d.ts +5 -0
  158. package/dist/filesystem/ensure-dir.d.ts.map +1 -0
  159. package/dist/filesystem/ensure-dir.js +17 -0
  160. package/dist/filesystem/ensure-dir.js.map +1 -0
  161. package/dist/filesystem/index.d.ts +6 -0
  162. package/dist/filesystem/index.d.ts.map +1 -0
  163. package/dist/filesystem/index.js +6 -0
  164. package/dist/filesystem/index.js.map +1 -0
  165. package/dist/filesystem/resolve-component-path.d.ts +10 -0
  166. package/dist/filesystem/resolve-component-path.d.ts.map +1 -0
  167. package/dist/filesystem/resolve-component-path.js +32 -0
  168. package/dist/filesystem/resolve-component-path.js.map +1 -0
  169. package/dist/filesystem/resolve-ds-paths.d.ts +15 -0
  170. package/dist/filesystem/resolve-ds-paths.d.ts.map +1 -0
  171. package/dist/filesystem/resolve-ds-paths.js +51 -0
  172. package/dist/filesystem/resolve-ds-paths.js.map +1 -0
  173. package/dist/filesystem/workspace-root.d.ts +6 -0
  174. package/dist/filesystem/workspace-root.d.ts.map +1 -0
  175. package/dist/filesystem/workspace-root.js +21 -0
  176. package/dist/filesystem/workspace-root.js.map +1 -0
  177. package/dist/filesystem/write-json.d.ts +6 -0
  178. package/dist/filesystem/write-json.d.ts.map +1 -0
  179. package/dist/filesystem/write-json.js +10 -0
  180. package/dist/filesystem/write-json.js.map +1 -0
  181. package/dist/filesystem/write-text.d.ts +10 -0
  182. package/dist/filesystem/write-text.d.ts.map +1 -0
  183. package/dist/filesystem/write-text.js +22 -0
  184. package/dist/filesystem/write-text.js.map +1 -0
  185. package/dist/generators/components/generate-component-css.d.ts +6 -0
  186. package/dist/generators/components/generate-component-css.d.ts.map +1 -0
  187. package/dist/generators/components/generate-component-css.js +92 -0
  188. package/dist/generators/components/generate-component-css.js.map +1 -0
  189. package/dist/generators/components/generate-component-file.d.ts +8 -0
  190. package/dist/generators/components/generate-component-file.d.ts.map +1 -0
  191. package/dist/generators/components/generate-component-file.js +209 -0
  192. package/dist/generators/components/generate-component-file.js.map +1 -0
  193. package/dist/generators/components/generate-composite-file.d.ts +3 -0
  194. package/dist/generators/components/generate-composite-file.d.ts.map +1 -0
  195. package/dist/generators/components/generate-composite-file.js +77 -0
  196. package/dist/generators/components/generate-composite-file.js.map +1 -0
  197. package/dist/generators/components/generate-composite-types.d.ts +7 -0
  198. package/dist/generators/components/generate-composite-types.d.ts.map +1 -0
  199. package/dist/generators/components/generate-composite-types.js +43 -0
  200. package/dist/generators/components/generate-composite-types.js.map +1 -0
  201. package/dist/generators/components/generate-types-file.d.ts +8 -0
  202. package/dist/generators/components/generate-types-file.d.ts.map +1 -0
  203. package/dist/generators/components/generate-types-file.js +64 -0
  204. package/dist/generators/components/generate-types-file.js.map +1 -0
  205. package/dist/generators/components/helpers.d.ts +33 -0
  206. package/dist/generators/components/helpers.d.ts.map +1 -0
  207. package/dist/generators/components/helpers.js +124 -0
  208. package/dist/generators/components/helpers.js.map +1 -0
  209. package/dist/generators/components/index.d.ts +9 -0
  210. package/dist/generators/components/index.d.ts.map +1 -0
  211. package/dist/generators/components/index.js +10 -0
  212. package/dist/generators/components/index.js.map +1 -0
  213. package/dist/generators/components/layout-jsx.d.ts +14 -0
  214. package/dist/generators/components/layout-jsx.d.ts.map +1 -0
  215. package/dist/generators/components/layout-jsx.js +271 -0
  216. package/dist/generators/components/layout-jsx.js.map +1 -0
  217. package/dist/generators/components/prune-components.d.ts +15 -0
  218. package/dist/generators/components/prune-components.d.ts.map +1 -0
  219. package/dist/generators/components/prune-components.js +88 -0
  220. package/dist/generators/components/prune-components.js.map +1 -0
  221. package/dist/generators/components/token-helpers.d.ts +32 -0
  222. package/dist/generators/components/token-helpers.d.ts.map +1 -0
  223. package/dist/generators/components/token-helpers.js +188 -0
  224. package/dist/generators/components/token-helpers.js.map +1 -0
  225. package/dist/generators/components/write-components.d.ts +17 -0
  226. package/dist/generators/components/write-components.d.ts.map +1 -0
  227. package/dist/generators/components/write-components.js +212 -0
  228. package/dist/generators/components/write-components.js.map +1 -0
  229. package/dist/generators/components/write-composites.d.ts +4 -0
  230. package/dist/generators/components/write-composites.d.ts.map +1 -0
  231. package/dist/generators/components/write-composites.js +116 -0
  232. package/dist/generators/components/write-composites.js.map +1 -0
  233. package/dist/generators/composites/generate-composite-file.d.ts +3 -0
  234. package/dist/generators/composites/generate-composite-file.d.ts.map +1 -0
  235. package/dist/generators/composites/generate-composite-file.js +101 -0
  236. package/dist/generators/composites/generate-composite-file.js.map +1 -0
  237. package/dist/generators/composites/generate-composite-types.d.ts +7 -0
  238. package/dist/generators/composites/generate-composite-types.d.ts.map +1 -0
  239. package/dist/generators/composites/generate-composite-types.js +43 -0
  240. package/dist/generators/composites/generate-composite-types.js.map +1 -0
  241. package/dist/generators/composites/index.d.ts +4 -0
  242. package/dist/generators/composites/index.d.ts.map +1 -0
  243. package/dist/generators/composites/index.js +4 -0
  244. package/dist/generators/composites/index.js.map +1 -0
  245. package/dist/generators/composites/write-composites.d.ts +4 -0
  246. package/dist/generators/composites/write-composites.d.ts.map +1 -0
  247. package/dist/generators/composites/write-composites.js +116 -0
  248. package/dist/generators/composites/write-composites.js.map +1 -0
  249. package/dist/generators/registry.d.ts +9 -0
  250. package/dist/generators/registry.d.ts.map +1 -0
  251. package/dist/generators/registry.js +11 -0
  252. package/dist/generators/registry.js.map +1 -0
  253. package/dist/generators/scaffold/generate-placeholder-component-content.d.ts +9 -0
  254. package/dist/generators/scaffold/generate-placeholder-component-content.d.ts.map +1 -0
  255. package/dist/generators/scaffold/generate-placeholder-component-content.js +68 -0
  256. package/dist/generators/scaffold/generate-placeholder-component-content.js.map +1 -0
  257. package/dist/generators/scaffold/index.d.ts +3 -0
  258. package/dist/generators/scaffold/index.d.ts.map +1 -0
  259. package/dist/generators/scaffold/index.js +3 -0
  260. package/dist/generators/scaffold/index.js.map +1 -0
  261. package/dist/generators/scaffold/write-scaffold.d.ts +14 -0
  262. package/dist/generators/scaffold/write-scaffold.d.ts.map +1 -0
  263. package/dist/generators/scaffold/write-scaffold.js +87 -0
  264. package/dist/generators/scaffold/write-scaffold.js.map +1 -0
  265. package/dist/generators/tokens/generate-token-css.d.ts +6 -0
  266. package/dist/generators/tokens/generate-token-css.d.ts.map +1 -0
  267. package/dist/generators/tokens/generate-token-css.js +31 -0
  268. package/dist/generators/tokens/generate-token-css.js.map +1 -0
  269. package/dist/generators/tokens/generate-token-file-content.d.ts +6 -0
  270. package/dist/generators/tokens/generate-token-file-content.d.ts.map +1 -0
  271. package/dist/generators/tokens/generate-token-file-content.js +27 -0
  272. package/dist/generators/tokens/generate-token-file-content.js.map +1 -0
  273. package/dist/generators/tokens/index.d.ts +3 -0
  274. package/dist/generators/tokens/index.d.ts.map +1 -0
  275. package/dist/generators/tokens/index.js +3 -0
  276. package/dist/generators/tokens/index.js.map +1 -0
  277. package/dist/generators/tokens/write-tokens.d.ts +14 -0
  278. package/dist/generators/tokens/write-tokens.d.ts.map +1 -0
  279. package/dist/generators/tokens/write-tokens.js +96 -0
  280. package/dist/generators/tokens/write-tokens.js.map +1 -0
  281. package/dist/generators/types.d.ts +11 -0
  282. package/dist/generators/types.d.ts.map +1 -0
  283. package/dist/generators/types.js +2 -0
  284. package/dist/generators/types.js.map +1 -0
  285. package/dist/icons/enrich-icon-svgs.d.ts +10 -0
  286. package/dist/icons/enrich-icon-svgs.d.ts.map +1 -0
  287. package/dist/icons/enrich-icon-svgs.js +88 -0
  288. package/dist/icons/enrich-icon-svgs.js.map +1 -0
  289. package/dist/index.d.ts +31 -0
  290. package/dist/index.d.ts.map +1 -0
  291. package/dist/index.js +31 -0
  292. package/dist/index.js.map +1 -0
  293. package/dist/manifest/index.d.ts +8 -0
  294. package/dist/manifest/index.d.ts.map +1 -0
  295. package/dist/manifest/index.js +80 -0
  296. package/dist/manifest/index.js.map +1 -0
  297. package/dist/mappings/build-file-mappings.d.ts +6 -0
  298. package/dist/mappings/build-file-mappings.d.ts.map +1 -0
  299. package/dist/mappings/build-file-mappings.js +37 -0
  300. package/dist/mappings/build-file-mappings.js.map +1 -0
  301. package/dist/mappings/index.d.ts +3 -0
  302. package/dist/mappings/index.d.ts.map +1 -0
  303. package/dist/mappings/index.js +3 -0
  304. package/dist/mappings/index.js.map +1 -0
  305. package/dist/mappings/naming-strategy.d.ts +20 -0
  306. package/dist/mappings/naming-strategy.d.ts.map +1 -0
  307. package/dist/mappings/naming-strategy.js +78 -0
  308. package/dist/mappings/naming-strategy.js.map +1 -0
  309. package/dist/model/build-design-system-model.d.ts +7 -0
  310. package/dist/model/build-design-system-model.d.ts.map +1 -0
  311. package/dist/model/build-design-system-model.js +78 -0
  312. package/dist/model/build-design-system-model.js.map +1 -0
  313. package/dist/model/index.d.ts +2 -0
  314. package/dist/model/index.d.ts.map +1 -0
  315. package/dist/model/index.js +2 -0
  316. package/dist/model/index.js.map +1 -0
  317. package/dist/model/resolve-component.d.ts +11 -0
  318. package/dist/model/resolve-component.d.ts.map +1 -0
  319. package/dist/model/resolve-component.js +110 -0
  320. package/dist/model/resolve-component.js.map +1 -0
  321. package/dist/normalizer/classify-entities.d.ts +12 -0
  322. package/dist/normalizer/classify-entities.d.ts.map +1 -0
  323. package/dist/normalizer/classify-entities.js +62 -0
  324. package/dist/normalizer/classify-entities.js.map +1 -0
  325. package/dist/normalizer/helpers.d.ts +13 -0
  326. package/dist/normalizer/helpers.d.ts.map +1 -0
  327. package/dist/normalizer/helpers.js +27 -0
  328. package/dist/normalizer/helpers.js.map +1 -0
  329. package/dist/normalizer/index.d.ts +7 -0
  330. package/dist/normalizer/index.d.ts.map +1 -0
  331. package/dist/normalizer/index.js +7 -0
  332. package/dist/normalizer/index.js.map +1 -0
  333. package/dist/normalizer/instance-resolver.d.ts +13 -0
  334. package/dist/normalizer/instance-resolver.d.ts.map +1 -0
  335. package/dist/normalizer/instance-resolver.js +747 -0
  336. package/dist/normalizer/instance-resolver.js.map +1 -0
  337. package/dist/normalizer/layout-tree.d.ts +12 -0
  338. package/dist/normalizer/layout-tree.d.ts.map +1 -0
  339. package/dist/normalizer/layout-tree.js +312 -0
  340. package/dist/normalizer/layout-tree.js.map +1 -0
  341. package/dist/normalizer/naming.d.ts +11 -0
  342. package/dist/normalizer/naming.d.ts.map +1 -0
  343. package/dist/normalizer/naming.js +44 -0
  344. package/dist/normalizer/naming.js.map +1 -0
  345. package/dist/normalizer/normalize-components.d.ts +13 -0
  346. package/dist/normalizer/normalize-components.d.ts.map +1 -0
  347. package/dist/normalizer/normalize-components.js +520 -0
  348. package/dist/normalizer/normalize-components.js.map +1 -0
  349. package/dist/normalizer/normalize-composites.d.ts +8 -0
  350. package/dist/normalizer/normalize-composites.d.ts.map +1 -0
  351. package/dist/normalizer/normalize-composites.js +22 -0
  352. package/dist/normalizer/normalize-composites.js.map +1 -0
  353. package/dist/normalizer/normalize-instances.d.ts +9 -0
  354. package/dist/normalizer/normalize-instances.d.ts.map +1 -0
  355. package/dist/normalizer/normalize-instances.js +32 -0
  356. package/dist/normalizer/normalize-instances.js.map +1 -0
  357. package/dist/normalizer/types.d.ts +22 -0
  358. package/dist/normalizer/types.d.ts.map +1 -0
  359. package/dist/normalizer/types.js +2 -0
  360. package/dist/normalizer/types.js.map +1 -0
  361. package/dist/normalizer/variant-diff.d.ts +101 -0
  362. package/dist/normalizer/variant-diff.d.ts.map +1 -0
  363. package/dist/normalizer/variant-diff.js +307 -0
  364. package/dist/normalizer/variant-diff.js.map +1 -0
  365. package/dist/plan/implementation-plan.d.ts +28 -0
  366. package/dist/plan/implementation-plan.d.ts.map +1 -0
  367. package/dist/plan/implementation-plan.js +60 -0
  368. package/dist/plan/implementation-plan.js.map +1 -0
  369. package/dist/plan/index.d.ts +3 -0
  370. package/dist/plan/index.d.ts.map +1 -0
  371. package/dist/plan/index.js +3 -0
  372. package/dist/plan/index.js.map +1 -0
  373. package/dist/plan/resolve-affected-files.d.ts +11 -0
  374. package/dist/plan/resolve-affected-files.d.ts.map +1 -0
  375. package/dist/plan/resolve-affected-files.js +73 -0
  376. package/dist/plan/resolve-affected-files.js.map +1 -0
  377. package/dist/prompt/generate-component-prompt.d.ts +6 -0
  378. package/dist/prompt/generate-component-prompt.d.ts.map +1 -0
  379. package/dist/prompt/generate-component-prompt.js +1644 -0
  380. package/dist/prompt/generate-component-prompt.js.map +1 -0
  381. package/dist/registry/ai-provider-registry.d.ts +7 -0
  382. package/dist/registry/ai-provider-registry.d.ts.map +1 -0
  383. package/dist/registry/ai-provider-registry.js +21 -0
  384. package/dist/registry/ai-provider-registry.js.map +1 -0
  385. package/dist/registry/build-component-registry.d.ts +6 -0
  386. package/dist/registry/build-component-registry.d.ts.map +1 -0
  387. package/dist/registry/build-component-registry.js +43 -0
  388. package/dist/registry/build-component-registry.js.map +1 -0
  389. package/dist/registry/build-dependency-graph.d.ts +7 -0
  390. package/dist/registry/build-dependency-graph.d.ts.map +1 -0
  391. package/dist/registry/build-dependency-graph.js +36 -0
  392. package/dist/registry/build-dependency-graph.js.map +1 -0
  393. package/dist/registry/generator-registry.d.ts +12 -0
  394. package/dist/registry/generator-registry.d.ts.map +1 -0
  395. package/dist/registry/generator-registry.js +22 -0
  396. package/dist/registry/generator-registry.js.map +1 -0
  397. package/dist/registry/index.d.ts +3 -0
  398. package/dist/registry/index.d.ts.map +1 -0
  399. package/dist/registry/index.js +3 -0
  400. package/dist/registry/index.js.map +1 -0
  401. package/dist/scaffold-plan/build-scaffold-plan.d.ts +16 -0
  402. package/dist/scaffold-plan/build-scaffold-plan.d.ts.map +1 -0
  403. package/dist/scaffold-plan/build-scaffold-plan.js +91 -0
  404. package/dist/scaffold-plan/build-scaffold-plan.js.map +1 -0
  405. package/dist/scaffold-plan/index.d.ts +2 -0
  406. package/dist/scaffold-plan/index.d.ts.map +1 -0
  407. package/dist/scaffold-plan/index.js +2 -0
  408. package/dist/scaffold-plan/index.js.map +1 -0
  409. package/dist/scanner/collect-components.d.ts +10 -0
  410. package/dist/scanner/collect-components.d.ts.map +1 -0
  411. package/dist/scanner/collect-components.js +103 -0
  412. package/dist/scanner/collect-components.js.map +1 -0
  413. package/dist/scanner/collect-instances.d.ts +6 -0
  414. package/dist/scanner/collect-instances.d.ts.map +1 -0
  415. package/dist/scanner/collect-instances.js +31 -0
  416. package/dist/scanner/collect-instances.js.map +1 -0
  417. package/dist/scanner/index.d.ts +6 -0
  418. package/dist/scanner/index.d.ts.map +1 -0
  419. package/dist/scanner/index.js +6 -0
  420. package/dist/scanner/index.js.map +1 -0
  421. package/dist/scanner/scan-file.d.ts +6 -0
  422. package/dist/scanner/scan-file.d.ts.map +1 -0
  423. package/dist/scanner/scan-file.js +28 -0
  424. package/dist/scanner/scan-file.js.map +1 -0
  425. package/dist/scanner/traverse-nodes.d.ts +15 -0
  426. package/dist/scanner/traverse-nodes.d.ts.map +1 -0
  427. package/dist/scanner/traverse-nodes.js +18 -0
  428. package/dist/scanner/traverse-nodes.js.map +1 -0
  429. package/dist/scanner/types.d.ts +89 -0
  430. package/dist/scanner/types.d.ts.map +1 -0
  431. package/dist/scanner/types.js +2 -0
  432. package/dist/scanner/types.js.map +1 -0
  433. package/dist/snapshots/index.d.ts +6 -0
  434. package/dist/snapshots/index.d.ts.map +1 -0
  435. package/dist/snapshots/index.js +6 -0
  436. package/dist/snapshots/index.js.map +1 -0
  437. package/dist/snapshots/load-imported-tokens.d.ts +8 -0
  438. package/dist/snapshots/load-imported-tokens.d.ts.map +1 -0
  439. package/dist/snapshots/load-imported-tokens.js +27 -0
  440. package/dist/snapshots/load-imported-tokens.js.map +1 -0
  441. package/dist/snapshots/load-latest-snapshot.d.ts +3 -0
  442. package/dist/snapshots/load-latest-snapshot.d.ts.map +1 -0
  443. package/dist/snapshots/load-latest-snapshot.js +16 -0
  444. package/dist/snapshots/load-latest-snapshot.js.map +1 -0
  445. package/dist/snapshots/load-previous-snapshot.d.ts +7 -0
  446. package/dist/snapshots/load-previous-snapshot.d.ts.map +1 -0
  447. package/dist/snapshots/load-previous-snapshot.js +39 -0
  448. package/dist/snapshots/load-previous-snapshot.js.map +1 -0
  449. package/dist/snapshots/save-imported-tokens.d.ts +4 -0
  450. package/dist/snapshots/save-imported-tokens.d.ts.map +1 -0
  451. package/dist/snapshots/save-imported-tokens.js +16 -0
  452. package/dist/snapshots/save-imported-tokens.js.map +1 -0
  453. package/dist/snapshots/save-snapshot.d.ts +3 -0
  454. package/dist/snapshots/save-snapshot.d.ts.map +1 -0
  455. package/dist/snapshots/save-snapshot.js +49 -0
  456. package/dist/snapshots/save-snapshot.js.map +1 -0
  457. package/dist/test-null-safety.d.ts +2 -0
  458. package/dist/test-null-safety.d.ts.map +1 -0
  459. package/dist/test-null-safety.js +67 -0
  460. package/dist/test-null-safety.js.map +1 -0
  461. package/dist/test-regex.d.ts +2 -0
  462. package/dist/test-regex.d.ts.map +1 -0
  463. package/dist/test-regex.js +25 -0
  464. package/dist/test-regex.js.map +1 -0
  465. package/dist/test-token-resolution.d.ts +2 -0
  466. package/dist/test-token-resolution.d.ts.map +1 -0
  467. package/dist/test-token-resolution.js +54 -0
  468. package/dist/test-token-resolution.js.map +1 -0
  469. package/dist/test-typography.d.ts +2 -0
  470. package/dist/test-typography.d.ts.map +1 -0
  471. package/dist/test-typography.js +69 -0
  472. package/dist/test-typography.js.map +1 -0
  473. package/dist/tokens/adapters/generic-adapter.d.ts +13 -0
  474. package/dist/tokens/adapters/generic-adapter.d.ts.map +1 -0
  475. package/dist/tokens/adapters/generic-adapter.js +74 -0
  476. package/dist/tokens/adapters/generic-adapter.js.map +1 -0
  477. package/dist/tokens/adapters/index.d.ts +3 -0
  478. package/dist/tokens/adapters/index.d.ts.map +1 -0
  479. package/dist/tokens/adapters/index.js +3 -0
  480. package/dist/tokens/adapters/index.js.map +1 -0
  481. package/dist/tokens/adapters/ptb-adapter.d.ts +13 -0
  482. package/dist/tokens/adapters/ptb-adapter.d.ts.map +1 -0
  483. package/dist/tokens/adapters/ptb-adapter.js +13 -0
  484. package/dist/tokens/adapters/ptb-adapter.js.map +1 -0
  485. package/dist/tokens/build-token-model.d.ts +12 -0
  486. package/dist/tokens/build-token-model.d.ts.map +1 -0
  487. package/dist/tokens/build-token-model.js +50 -0
  488. package/dist/tokens/build-token-model.js.map +1 -0
  489. package/dist/tokens/classify-token-kind.d.ts +7 -0
  490. package/dist/tokens/classify-token-kind.d.ts.map +1 -0
  491. package/dist/tokens/classify-token-kind.js +24 -0
  492. package/dist/tokens/classify-token-kind.js.map +1 -0
  493. package/dist/tokens/detect-format.d.ts +6 -0
  494. package/dist/tokens/detect-format.d.ts.map +1 -0
  495. package/dist/tokens/detect-format.js +23 -0
  496. package/dist/tokens/detect-format.js.map +1 -0
  497. package/dist/tokens/import-schema.d.ts +111 -0
  498. package/dist/tokens/import-schema.d.ts.map +1 -0
  499. package/dist/tokens/import-schema.js +45 -0
  500. package/dist/tokens/import-schema.js.map +1 -0
  501. package/dist/tokens/import-tokens.d.ts +16 -0
  502. package/dist/tokens/import-tokens.d.ts.map +1 -0
  503. package/dist/tokens/import-tokens.js +40 -0
  504. package/dist/tokens/import-tokens.js.map +1 -0
  505. package/dist/tokens/index.d.ts +12 -0
  506. package/dist/tokens/index.d.ts.map +1 -0
  507. package/dist/tokens/index.js +12 -0
  508. package/dist/tokens/index.js.map +1 -0
  509. package/dist/tokens/naming.d.ts +19 -0
  510. package/dist/tokens/naming.d.ts.map +1 -0
  511. package/dist/tokens/naming.js +27 -0
  512. package/dist/tokens/naming.js.map +1 -0
  513. package/dist/tokens/normalize-token-collections.d.ts +7 -0
  514. package/dist/tokens/normalize-token-collections.d.ts.map +1 -0
  515. package/dist/tokens/normalize-token-collections.js +68 -0
  516. package/dist/tokens/normalize-token-collections.js.map +1 -0
  517. package/dist/tokens/resolution.d.ts +7 -0
  518. package/dist/tokens/resolution.d.ts.map +1 -0
  519. package/dist/tokens/resolution.js +223 -0
  520. package/dist/tokens/resolution.js.map +1 -0
  521. package/dist/tokens/resolve-token-source.d.ts +12 -0
  522. package/dist/tokens/resolve-token-source.d.ts.map +1 -0
  523. package/dist/tokens/resolve-token-source.js +37 -0
  524. package/dist/tokens/resolve-token-source.js.map +1 -0
  525. package/dist/tokens/types.d.ts +40 -0
  526. package/dist/tokens/types.d.ts.map +1 -0
  527. package/dist/tokens/types.js +2 -0
  528. package/dist/tokens/types.js.map +1 -0
  529. package/package.json +34 -0
@@ -0,0 +1,747 @@
1
+ import { rgbToHex } from "./helpers.js";
2
+ import { resolveTokenBindingFromIndex } from "../tokens/resolution.js";
3
+ /** Converts any Figma display name to a valid PascalCase React component identifier.
4
+ * "nav-arrow-down" → "NavArrowDown", "homeFilled" → "HomeFilled", "Text field mobile" → "TextFieldMobile"
5
+ */
6
+ function toPascalCase(name) {
7
+ return name
8
+ .split(/[\s\-_]+/)
9
+ .filter(Boolean)
10
+ .map(p => p.charAt(0).toUpperCase() + p.slice(1))
11
+ .join("");
12
+ }
13
+ /** Figma variant axis names that exist only in the design tool and have no React equivalent.
14
+ * `weight` controls icon stroke thickness in Figma but React SVG icons are static.
15
+ * `theme` / `platform` / `appearance` are Figma presentation-layer concerns only.
16
+ */
17
+ const FIGMA_ONLY_PROP_NAMES = new Set(["weight", "theme", "platform", "appearance"]);
18
+ /** Figma interaction-state values for the `state` axis that represent hover/focus/press
19
+ * states handled in CSS/event handlers — never passed as static React props.
20
+ */
21
+ const FIGMA_INTERACTION_STATE_VALUES = new Set([
22
+ "default", "hover", "hovered", "pressed", "focused", "active", "visited",
23
+ ]);
24
+ /**
25
+ * Deterministically resolves a usage "recipe" for a nested dependency instance.
26
+ * This helps downstream AI implementation avoid guessing about slot visibility
27
+ * and intended visual configuration.
28
+ */
29
+ export function resolveInstanceRecipe(node, components = [], tokenIndex) {
30
+ if (!node.componentId)
31
+ return undefined;
32
+ try {
33
+ return doResolveInstanceRecipe(node, components, tokenIndex);
34
+ }
35
+ catch (e) {
36
+ console.warn(`Failed to enrich recipe for node ${node.name || "unknown"}: ${e.message}`);
37
+ const componentName = (node?.name || "").split('/')[0].trim();
38
+ return {
39
+ standardType: "generic",
40
+ visibleSlots: [],
41
+ hiddenSlots: [],
42
+ textVisible: true,
43
+ leadingIconVisible: false,
44
+ trailingIconVisible: false,
45
+ summary: "Generic fallback component",
46
+ resolvedProps: {},
47
+ implementationMode: "invoke-dependency",
48
+ classification: {
49
+ representable: [],
50
+ derivedButRepresentable: [],
51
+ nonRepresentable: [],
52
+ warnings: [`Enrichment crashed: ${e.message}`]
53
+ },
54
+ invocationHint: `<${toPascalCase(componentName || "Unknown")} />`,
55
+ invocationContract: {
56
+ componentName: toPascalCase(componentName || "Unknown"),
57
+ importName: toPascalCase(componentName || "Unknown"),
58
+ resolvedProps: {},
59
+ propSourceMap: {},
60
+ omitProps: [],
61
+ slotContract: {},
62
+ childrenPolicy: "generic",
63
+ iconBindingPolicy: {},
64
+ renderHint: ""
65
+ }
66
+ };
67
+ }
68
+ }
69
+ function doResolveInstanceRecipe(node, components = [], tokenIndex) {
70
+ // Only resolve recipes for instances (which have componentId)
71
+ if (!node.componentId)
72
+ return undefined;
73
+ // Resolves a Figma node ID (raw "136:594" or PTB "comp_136_594") to a ComponentDefinition.
74
+ // Layout tree nodes already store PTB IDs, but propertyOverrides (INSTANCE_SWAP values) keep raw Figma IDs.
75
+ const findComp = (id, name) => {
76
+ // Phase 1a: exact PTB ID match
77
+ let comp = components.find(c => c.id === id);
78
+ // Phase 1b: designToolNodeId match (catches raw variant IDs stored on the model)
79
+ if (!comp)
80
+ comp = components.find(c => c.designToolNodeId === id);
81
+ // Phase 1c: raw Figma ID → PTB format conversion ("106:390" → "comp_106_390")
82
+ if (!comp && /^\d+:\d+$/.test(id)) {
83
+ comp = components.find(c => c.id === `comp_${id.replace(/:/g, "_")}`);
84
+ }
85
+ // Phase 2: name-based fallback — when IDs diverge (variant ID vs set ID)
86
+ if (!comp && name) {
87
+ const baseName = name.split("/")[0].trim();
88
+ const baseLower = baseName.toLowerCase().replace(/\s+/g, "");
89
+ comp = components.find(c => c.name === baseName ||
90
+ c.name.toLowerCase().replace(/\s+/g, "") === baseLower);
91
+ }
92
+ return comp;
93
+ };
94
+ const dependency = findComp(node.componentId, node.name);
95
+ const visibleSlots = [];
96
+ const hiddenSlots = [];
97
+ const childNodes = [];
98
+ const traverse = (n) => {
99
+ childNodes.push(n);
100
+ if (n.children)
101
+ n.children.forEach(traverse);
102
+ };
103
+ if (node.children)
104
+ node.children.forEach(traverse);
105
+ // 1. Text / Label Analysis
106
+ let textContent = node.textContent;
107
+ let textVisible = node.visible !== false;
108
+ // 2. Props Aggregation
109
+ const resolvedProps = {};
110
+ const propSourceMap = {};
111
+ // Helper to clean property names for implementation-like usage
112
+ const cleanPropName = (name) => {
113
+ return name.trim()
114
+ .replace(/[-_\s]+(.)?/g, (_, c) => c ? c.toUpperCase() : '')
115
+ .replace(/^./, (str) => str.toLowerCase());
116
+ };
117
+ if (node.variantSelection && typeof node.variantSelection === 'object') {
118
+ for (const [key, value] of Object.entries(node.variantSelection)) {
119
+ const cleanKey = cleanPropName(key);
120
+ resolvedProps[cleanKey] = value;
121
+ propSourceMap[key] = cleanKey;
122
+ }
123
+ }
124
+ if (node.propertyOverrides && typeof node.propertyOverrides === 'object') {
125
+ for (const [key, value] of Object.entries(node.propertyOverrides)) {
126
+ const cleanKey = cleanPropName(key);
127
+ resolvedProps[cleanKey] = value;
128
+ propSourceMap[key] = cleanKey;
129
+ const k = key.toLowerCase();
130
+ // Common Figma property names for text
131
+ if (k === "label" || k === "text" || k === "value" || k === "title") {
132
+ if (typeof value === "string") {
133
+ textContent = value;
134
+ }
135
+ // Booleans often control visibility of text slots
136
+ if (value === false || value === "") {
137
+ textVisible = false;
138
+ }
139
+ if (value === true)
140
+ textVisible = true;
141
+ }
142
+ }
143
+ }
144
+ // Resolve instance IDs into dependency contracts
145
+ for (const [key, value] of Object.entries(resolvedProps)) {
146
+ if (typeof value === "string" && /^(\d+:\d+|I\d+:\d+.*)$/.test(value)) {
147
+ const dep = findComp(value);
148
+ if (dep) {
149
+ resolvedProps[key] = {
150
+ kind: "dependency",
151
+ componentId: dep.id,
152
+ componentName: dep.name,
153
+ importName: dep.name
154
+ };
155
+ }
156
+ else {
157
+ resolvedProps[key] = {
158
+ kind: "unknown",
159
+ componentId: value
160
+ };
161
+ }
162
+ }
163
+ }
164
+ // 3. Icon Analysis (Heuristics based on common Figma naming and variant patterns)
165
+ let leadingIconVisible = false;
166
+ let trailingIconVisible = false;
167
+ // Check variant selection (e.g. "Icon=Both", "Leading Icon=On")
168
+ if (node.variantSelection) {
169
+ for (const [key, value] of Object.entries(node.variantSelection)) {
170
+ const k = key.toLowerCase();
171
+ const v = String(value).toLowerCase();
172
+ const isPositive = v === "true" || v === "on" || v === "visible" || v === "yes" || (v !== "none" && v !== "false" && v !== "off");
173
+ if (k.includes("icon")) {
174
+ if (isPositive) {
175
+ if (k.includes("leading") || k.includes("start") || k.includes("left") || k.includes("before")) {
176
+ leadingIconVisible = true;
177
+ }
178
+ else if (k.includes("trailing") || k.includes("end") || k.includes("right") || k.includes("after")) {
179
+ trailingIconVisible = true;
180
+ }
181
+ else {
182
+ leadingIconVisible = true;
183
+ }
184
+ }
185
+ if (v === "both") {
186
+ leadingIconVisible = true;
187
+ trailingIconVisible = true;
188
+ }
189
+ if (v === "leading" || v === "start" || v === "left")
190
+ leadingIconVisible = true;
191
+ if (v === "trailing" || v === "end" || v === "right")
192
+ trailingIconVisible = true;
193
+ }
194
+ }
195
+ }
196
+ // Check boolean property overrides (e.g. "showIcon": true, "showButtonText": false)
197
+ if (node.propertyOverrides) {
198
+ for (const [key, value] of Object.entries(node.propertyOverrides)) {
199
+ const k = key.toLowerCase();
200
+ if (typeof value === "boolean") {
201
+ if (k.includes("text") || k.includes("label") || k === "show") {
202
+ if (k.includes("show") || k.includes("visible") || k.includes("enabled")) {
203
+ textVisible = value;
204
+ }
205
+ }
206
+ if (k.includes("icon")) {
207
+ if (k.includes("leading") || k.includes("start") || k.includes("left")) {
208
+ leadingIconVisible = value;
209
+ }
210
+ else if (k.includes("trailing") || k.includes("end") || k.includes("right")) {
211
+ trailingIconVisible = value;
212
+ }
213
+ else if (k.includes("show") || k.includes("visible") || !k.includes("name")) {
214
+ leadingIconVisible = value;
215
+ }
216
+ }
217
+ }
218
+ if (typeof value === "boolean") {
219
+ if (value)
220
+ visibleSlots.push(key);
221
+ else
222
+ hiddenSlots.push(key);
223
+ }
224
+ }
225
+ }
226
+ // 4. Override Classification
227
+ const classification = {
228
+ representable: [],
229
+ derivedButRepresentable: [],
230
+ nonRepresentable: [],
231
+ warnings: []
232
+ };
233
+ if (dependency) {
234
+ const depProps = new Set((dependency.properties || []).map(p => p.name.toLowerCase()));
235
+ const depVariants = new Set((dependency.variantAxes || []).map(v => v.name.toLowerCase()));
236
+ // Check variant selection
237
+ if (node.variantSelection && typeof node.variantSelection === 'object') {
238
+ for (const key of Object.keys(node.variantSelection)) {
239
+ if (depVariants.has(key.toLowerCase())) {
240
+ classification.representable.push(key);
241
+ }
242
+ else {
243
+ classification.nonRepresentable.push(key);
244
+ classification.warnings.push(`Variant axis "${key}" not found on dependency "${dependency.name}".`);
245
+ }
246
+ }
247
+ }
248
+ // Check property overrides
249
+ if (node.propertyOverrides && typeof node.propertyOverrides === 'object') {
250
+ for (const key of Object.keys(node.propertyOverrides)) {
251
+ if (depProps.has(key.toLowerCase())) {
252
+ classification.representable.push(key);
253
+ }
254
+ else {
255
+ // Heuristics for derived representable
256
+ const k = key.toLowerCase();
257
+ const v = node.propertyOverrides[key];
258
+ if (typeof v === "object" && v !== null && v.kind === "dependency") {
259
+ classification.derivedButRepresentable.push(key);
260
+ }
261
+ else if (k.includes("label") || k.includes("text") || k.includes("icon") || k.includes("show") || k.includes("visible")) {
262
+ classification.derivedButRepresentable.push(key);
263
+ }
264
+ else {
265
+ classification.nonRepresentable.push(key);
266
+ classification.warnings.push(`Override "${key}" doesn't map to a public prop on "${dependency.name}".`);
267
+ }
268
+ }
269
+ }
270
+ }
271
+ }
272
+ else {
273
+ classification.warnings.push(`Dependency "${node.componentId}" not found in model.`);
274
+ }
275
+ // 4.5 Style Override Detection
276
+ const styleOverrides = {};
277
+ if (node.rawStyles && dependency && dependency.styleMetadata) {
278
+ if (node.rawStyles.fills && dependency.styleMetadata.fills) {
279
+ const instanceFills = JSON.stringify(node.rawStyles.fills);
280
+ const depFills = dependency.styleMetadata.fills;
281
+ if (instanceFills !== depFills) {
282
+ const diff = resolveStyleDiff(String(depFills), instanceFills, tokenIndex);
283
+ if (diff) {
284
+ styleOverrides["fill"] = diff;
285
+ classification.nonRepresentable.push("style:fill");
286
+ classification.warnings.push(`Nested instance has a local fill override not covered by dependency API.`);
287
+ }
288
+ }
289
+ }
290
+ if (node.rawStyles.strokes && dependency.styleMetadata.strokes) {
291
+ const instanceStrokes = JSON.stringify(node.rawStyles.strokes);
292
+ const depStrokes = dependency.styleMetadata.strokes;
293
+ if (instanceStrokes !== depStrokes) {
294
+ const diff = resolveStyleDiff(String(depStrokes), instanceStrokes, tokenIndex);
295
+ if (diff) {
296
+ styleOverrides["stroke"] = diff;
297
+ classification.nonRepresentable.push("style:stroke");
298
+ classification.warnings.push(`Nested instance has a local stroke override not covered by dependency API.`);
299
+ }
300
+ }
301
+ }
302
+ }
303
+ // 5. Determine Implementation Mode
304
+ let implementationMode = "invoke-dependency";
305
+ if (classification.nonRepresentable.length > 0) {
306
+ implementationMode = "invoke-dependency-with-local-patch";
307
+ if (classification.nonRepresentable.length > 3) {
308
+ implementationMode = "recommend-variant-promotion";
309
+ }
310
+ }
311
+ else if (classification.representable.length > 0 || classification.derivedButRepresentable.length > 0) {
312
+ implementationMode = "invoke-dependency-with-overrides";
313
+ }
314
+ // 7. Determine Standard Functional Type
315
+ let standardType = "generic";
316
+ if (textVisible) {
317
+ if (!leadingIconVisible && !trailingIconVisible)
318
+ standardType = "text-only";
319
+ else if (leadingIconVisible && !trailingIconVisible)
320
+ standardType = "text-with-leading-icon";
321
+ else if (!leadingIconVisible && trailingIconVisible)
322
+ standardType = "text-with-trailing-icon";
323
+ else if (leadingIconVisible && trailingIconVisible)
324
+ standardType = "text-with-both-icons";
325
+ }
326
+ else {
327
+ if (leadingIconVisible || trailingIconVisible)
328
+ standardType = "icon-only";
329
+ }
330
+ // 8. Build Concise Summary
331
+ let summaryParts = [];
332
+ const typeLabels = {
333
+ "text-only": "Text-only",
334
+ "icon-only": "Icon-only",
335
+ "text-with-leading-icon": "Text with leading icon",
336
+ "text-with-trailing-icon": "Text with trailing icon",
337
+ "text-with-both-icons": "Text with both icons",
338
+ "generic": "Generic"
339
+ };
340
+ summaryParts.push(typeLabels[standardType] || "Generic instance");
341
+ if (textVisible && textContent)
342
+ summaryParts.push(`displaying "${textContent}"`);
343
+ else if (textVisible)
344
+ summaryParts.push("displaying default text");
345
+ if (!textVisible && (leadingIconVisible || trailingIconVisible))
346
+ summaryParts.push("as a standalone icon action");
347
+ const summary = summaryParts.join(" ");
348
+ // 9. Generate Invocation Hint & Slot Contracts
349
+ // Build a set of valid prop names from the resolved dep component.
350
+ // When the dep is known, props that don't match any of its variant axes or
351
+ // Figma component properties are stale overrides (renamed/removed in the source)
352
+ // and must not appear in the invocationHint.
353
+ const validDepPropKeys = new Set();
354
+ if (dependency) {
355
+ for (const ax of (dependency.variantAxes || [])) {
356
+ validDepPropKeys.add(cleanPropName(ax.name));
357
+ }
358
+ for (const prop of (dependency.properties || [])) {
359
+ validDepPropKeys.add(cleanPropName(prop.name));
360
+ }
361
+ }
362
+ const componentName = (node.name || "").split('/')[0].trim();
363
+ const propParts = [];
364
+ for (const [k, v] of Object.entries(resolvedProps)) {
365
+ // Always keep dependency-kind values (INSTANCE_SWAP overrides); only validate scalar props.
366
+ const isDep = v && typeof v === "object" && v.kind === "dependency";
367
+ if (!isDep) {
368
+ // Drop Figma-design-only axes (no React equivalent)
369
+ if (FIGMA_ONLY_PROP_NAMES.has(k))
370
+ continue;
371
+ // Drop `state` when its value is a Figma interaction state (hover/pressed/default…)
372
+ if (k === "state" && typeof v === "string" && FIGMA_INTERACTION_STATE_VALUES.has(v.toLowerCase()))
373
+ continue;
374
+ // Drop props that don't exist on the resolved dep's variant axes or component properties
375
+ if (dependency && validDepPropKeys.size > 0 && !validDepPropKeys.has(k))
376
+ continue;
377
+ }
378
+ if (isDep) {
379
+ propParts.push(`${k}={<${toPascalCase(v.importName)} />}`);
380
+ }
381
+ else if (typeof v === "string") {
382
+ propParts.push(`${k}="${v}"`);
383
+ }
384
+ else if (v === true) {
385
+ propParts.push(k);
386
+ }
387
+ else if (v === false) {
388
+ propParts.push(`${k}={false}`);
389
+ }
390
+ else {
391
+ propParts.push(`${k}={${JSON.stringify(v)}}`);
392
+ }
393
+ }
394
+ const safeCompName = toPascalCase(componentName);
395
+ const invocationHint = propParts.length > 0
396
+ ? `<${safeCompName} ${propParts.join(" ")} />`
397
+ : `<${safeCompName} />`;
398
+ // Strict Slot Contract Generation
399
+ const slotContract = {};
400
+ const resolveSlotDep = (slotNode) => {
401
+ if (slotNode?.componentId) {
402
+ const dep = findComp(slotNode.componentId, slotNode.name);
403
+ if (dep) {
404
+ return {
405
+ componentName: dep.name,
406
+ importName: dep.name,
407
+ componentId: dep.id
408
+ };
409
+ }
410
+ }
411
+ return null;
412
+ };
413
+ // Identified slots based on common roles and node types
414
+ const textNodes = childNodes.filter(c => (c.role === "text" || c.type === "TEXT" || c.textContent !== undefined || c.rawStyles?.nodeType === "TEXT"));
415
+ const instanceNodes = childNodes.filter(c => (c.role === "instance" || c.type === "INSTANCE"));
416
+ const overrideNames = (node.childOverrides || []).map((o) => o.name);
417
+ // Map content slots (text)
418
+ const processedNames = new Set();
419
+ const computeSlotRender = (kind, visible, prop, textContent, dependency) => {
420
+ const depName = dependency
421
+ ? toPascalCase(dependency.componentName || dependency.importName)
422
+ : null;
423
+ if (!visible) {
424
+ return {
425
+ visibilityBehavior: "hidden-by-default",
426
+ renderPattern: prop ? `{${prop} ?? null}` : "null"
427
+ };
428
+ }
429
+ if (kind === "text") {
430
+ return {
431
+ visibilityBehavior: prop ? "caller-controlled" : "always",
432
+ renderPattern: prop ? `{${prop}}` : (textContent ? `"${textContent}"` : "null")
433
+ };
434
+ }
435
+ if (kind === "child") {
436
+ return {
437
+ visibilityBehavior: prop ? "caller-controlled" : "always",
438
+ renderPattern: prop ? `{${prop}}` : (depName ? `<${depName} />` : "null")
439
+ };
440
+ }
441
+ if (kind === "icon" || kind === "asset") {
442
+ if (prop) {
443
+ return {
444
+ visibilityBehavior: "caller-overrideable",
445
+ renderPattern: depName ? `{${prop} ?? <${depName} />}` : `{${prop} ?? null}`
446
+ };
447
+ }
448
+ return { visibilityBehavior: "always", renderPattern: depName ? `<${depName} />` : "null" };
449
+ }
450
+ // unknown kind
451
+ if (prop)
452
+ return { visibilityBehavior: "caller-controlled", renderPattern: `{${prop}}` };
453
+ return { visibilityBehavior: "always", renderPattern: depName ? `<${depName} />` : "null" };
454
+ };
455
+ const addSlot = (name, kind, visible, prop, textContent, dependency) => {
456
+ const cleanName = cleanPropName(name);
457
+ if (processedNames.has(cleanName))
458
+ return;
459
+ processedNames.add(cleanName);
460
+ const { renderPattern, visibilityBehavior } = computeSlotRender(kind, visible, prop, textContent, dependency);
461
+ slotContract[cleanName] = {
462
+ kind,
463
+ visible,
464
+ prop,
465
+ textContent,
466
+ dependency,
467
+ renderPattern,
468
+ visibilityBehavior
469
+ };
470
+ };
471
+ textNodes.forEach(tn => {
472
+ addSlot(tn.name, "text", tn.visible !== false, Object.entries(propSourceMap).find(([r, n]) => n === cleanPropName(tn.name) || r === tn.name)?.[1], tn.textContent);
473
+ });
474
+ // Also look at overrides for text slots that might not be in the tree
475
+ (node.childOverrides || []).forEach((o) => {
476
+ if (o.textContent !== undefined) {
477
+ addSlot(o.name, "text", o.visible !== false, Object.entries(propSourceMap).find(([r, n]) => n === cleanPropName(o.name) || r === o.name)?.[1], o.textContent);
478
+ }
479
+ });
480
+ instanceNodes.forEach(inode => {
481
+ let kind = "unknown";
482
+ const lowerName = inode.name.toLowerCase();
483
+ const ICON_KEYWORDS = ["icon", "chevron", "arrow", "close", "menu", "more", "check", "plus", "minus",
484
+ "search", "add", "delete", "edit", "clear", "back", "forward", "info",
485
+ "warning", "alert", "error", "star", "heart", "bolt", "flag", "dot"];
486
+ const hasDimension = /\d+x\d+/.test(inode.name);
487
+ const hasIconKeyword = ICON_KEYWORDS.some(k => lowerName.includes(k));
488
+ if (hasDimension || hasIconKeyword)
489
+ kind = "icon";
490
+ else if (lowerName.includes("asset") || lowerName.includes("img") || lowerName.includes("avatar"))
491
+ kind = "asset";
492
+ else if (inode.componentId)
493
+ kind = "child";
494
+ addSlot(inode.name, kind, inode.visible !== false, Object.entries(propSourceMap).find(([r, n]) => n === cleanPropName(inode.name) || r === inode.name)?.[1], undefined, resolveSlotDep(inode));
495
+ });
496
+ // Also look at overrides for instance slots
497
+ (node.childOverrides || []).forEach((o) => {
498
+ if (o.componentId) {
499
+ let kind = "child";
500
+ if (o.name.toLowerCase().includes("icon"))
501
+ kind = "icon";
502
+ addSlot(o.name, kind, o.visible !== false, Object.entries(propSourceMap).find(([r, n]) => n === cleanPropName(o.name) || r === o.name)?.[1], undefined, resolveSlotDep(o));
503
+ }
504
+ });
505
+ const overrideContract = compileOverrideContract(node.childOverrides || [], components, tokenIndex);
506
+ const instanceSummary = {
507
+ baseComponent: componentName,
508
+ variantSelection: node.variantSelection || {},
509
+ divergenceSummary: {
510
+ contentOverrides: Object.keys(overrideContract.content),
511
+ slotVisibilityOverrides: Object.keys(overrideContract.slotVisibility),
512
+ styleOverrides: Object.keys(overrideContract.style),
513
+ dependencyOverrides: Object.keys(overrideContract.dependency)
514
+ }
515
+ };
516
+ const designRules = { notes: [] };
517
+ if (dependency) {
518
+ // Intentional border policy
519
+ const baseHasBorder = dependency.styleMetadata && (dependency.styleMetadata.strokes || dependency.styleMetadata.border);
520
+ const instanceHasBorder = node.rawStyles && (node.rawStyles.strokes || node.rawStyles.border);
521
+ if (baseHasBorder && !instanceHasBorder) {
522
+ designRules.border = { policy: "none", reason: "intentional border removal in this instance" };
523
+ designRules.notes?.push("Border intentionally removed; do not re-add from base component defaults.");
524
+ }
525
+ // Slot visibility policy
526
+ if (hiddenSlots.length > 0) {
527
+ designRules.slotVisibilityPolicy = "strict";
528
+ designRules.notes?.push(`Slots [${hiddenSlots.join(", ")}] are intentionally hidden.`);
529
+ }
530
+ }
531
+ const implementationHints = {
532
+ preferInvocationContract: true,
533
+ preferOverrideContract: true,
534
+ preferSlotContract: true,
535
+ avoidDeepTreeInference: true,
536
+ notes: [
537
+ "Use slotContract to identify icon identities instead of inspecting child nodes.",
538
+ "Follow divergenceSummary for intentional local overrides."
539
+ ]
540
+ };
541
+ const recipe = {
542
+ standardType,
543
+ instanceSummary,
544
+ visibleSlots,
545
+ hiddenSlots,
546
+ textVisible,
547
+ textContent,
548
+ leadingIconVisible,
549
+ trailingIconVisible,
550
+ summary,
551
+ resolvedProps,
552
+ styleOverrides: Object.keys(styleOverrides).length > 0 ? styleOverrides : undefined,
553
+ invocationHint,
554
+ implementationMode,
555
+ classification,
556
+ slotContract,
557
+ designRules,
558
+ implementationHints,
559
+ overrideContract
560
+ };
561
+ recipe.invocationContract = resolveInvocationContract(node, recipe);
562
+ return recipe;
563
+ }
564
+ /**
565
+ * Re-resolves all instance recipes in a tree once all component definitions are available.
566
+ */
567
+ export function relinkTreeRecipes(node, components, tokenIndex) {
568
+ if (node.componentId) {
569
+ node.recipe = resolveInstanceRecipe(node, components, tokenIndex);
570
+ }
571
+ if (node.children) {
572
+ for (const child of node.children) {
573
+ relinkTreeRecipes(child, components, tokenIndex);
574
+ }
575
+ }
576
+ if (node.childOverrides) {
577
+ for (const override of node.childOverrides) {
578
+ // Mock a node for recipe resolution
579
+ const mockNode = {
580
+ type: "leaf",
581
+ name: override.name,
582
+ componentId: override.componentId,
583
+ variantSelection: override.variantSelection,
584
+ propertyOverrides: override.propertyOverrides,
585
+ rawStyles: override.rawStyles,
586
+ visible: override.visible !== false
587
+ };
588
+ override.recipe = resolveInstanceRecipe(mockNode, components, tokenIndex);
589
+ }
590
+ }
591
+ }
592
+ /**
593
+ * Resolves a visual style diff between two Figma paint JSON blocks.
594
+ */
595
+ function resolveStyleDiff(fromRaw, toRaw, tokenIndex) {
596
+ try {
597
+ const from = JSON.parse(fromRaw);
598
+ const to = JSON.parse(toRaw);
599
+ // Only handle simple solid fills for now
600
+ const fromSolid = Array.isArray(from) ? from.find((f) => f.type === "SOLID") : undefined;
601
+ const toSolid = Array.isArray(to) ? to.find((f) => f.type === "SOLID") : undefined;
602
+ if (!toSolid)
603
+ return undefined;
604
+ const res = { resolution: "literal" };
605
+ if (toSolid.color) {
606
+ res.toColor = rgbToHex(toSolid.color.r, toSolid.color.g, toSolid.color.b);
607
+ }
608
+ if (toSolid.boundVariables?.color && tokenIndex) {
609
+ const binding = resolveTokenBindingFromIndex(toSolid.boundVariables.color.id, tokenIndex);
610
+ if (binding) {
611
+ res.toToken = binding.sourceTokenName;
612
+ res.toCssVar = binding.canonicalCssVar;
613
+ res.resolution = "token";
614
+ res.toBinding = binding;
615
+ }
616
+ }
617
+ if (fromSolid) {
618
+ if (fromSolid.color) {
619
+ res.fromColor = rgbToHex(fromSolid.color.r, fromSolid.color.g, fromSolid.color.b);
620
+ }
621
+ if (fromSolid.boundVariables?.color && tokenIndex) {
622
+ const binding = resolveTokenBindingFromIndex(fromSolid.boundVariables.color.id, tokenIndex);
623
+ if (binding) {
624
+ res.fromToken = binding.sourceTokenName;
625
+ res.fromCssVar = binding.canonicalCssVar;
626
+ res.fromBinding = binding;
627
+ }
628
+ }
629
+ }
630
+ return res;
631
+ }
632
+ catch {
633
+ return undefined;
634
+ }
635
+ }
636
+ /**
637
+ * Derives a code-facing invocation contract from design-time usage.
638
+ */
639
+ function resolveInvocationContract(node, recipe) {
640
+ const componentName = toPascalCase((node?.name || "").split('/')[0].trim());
641
+ const resolvedProps = recipe?.resolvedProps ? { ...recipe.resolvedProps } : {};
642
+ const omitProps = [];
643
+ const iconBindingPolicy = {};
644
+ // Determine children policy
645
+ let childrenPolicy = "generic";
646
+ if (recipe?.standardType === "icon-only")
647
+ childrenPolicy = "none";
648
+ else if (recipe?.standardType === "text-only" || recipe?.textContent)
649
+ childrenPolicy = "text";
650
+ // Handle prop omission (e.g. if text is hidden, omit 'label' prop if it exists)
651
+ if (recipe && !recipe.textVisible) {
652
+ omitProps.push("label", "text", "value", "title");
653
+ }
654
+ // Icon bindings from overrides
655
+ if (node?.propertyOverrides && typeof node.propertyOverrides === 'object') {
656
+ for (const [key, value] of Object.entries(node.propertyOverrides)) {
657
+ const k = (key || "").toLowerCase();
658
+ if (k.includes("icon") && typeof value === "string") {
659
+ iconBindingPolicy[k] = value;
660
+ }
661
+ }
662
+ }
663
+ return {
664
+ componentName,
665
+ importName: componentName,
666
+ resolvedProps,
667
+ propSourceMap: recipe?.propSourceMap || {},
668
+ omitProps,
669
+ slotContract: recipe?.slotContract || {},
670
+ childrenPolicy,
671
+ iconBindingPolicy,
672
+ renderHint: recipe?.invocationHint || "",
673
+ overrideContract: recipe?.overrideContract
674
+ };
675
+ }
676
+ /**
677
+ * Compiles low-level child overrides into a code-facing contract.
678
+ */
679
+ function compileOverrideContract(childOverrides, components, tokenIndex) {
680
+ const contract = {
681
+ slotVisibility: {},
682
+ content: {},
683
+ dependency: {},
684
+ style: {},
685
+ classification: {
686
+ representable: [],
687
+ derivedButRepresentable: [],
688
+ nonRepresentable: [],
689
+ warnings: []
690
+ }
691
+ };
692
+ const safeArray = (val) => Array.isArray(val) ? val : [];
693
+ for (const override of safeArray(childOverrides)) {
694
+ const name = override.name || "unknown";
695
+ // 1. Visibility Overrides
696
+ if (override.visible === false) {
697
+ contract.slotVisibility[name] = false;
698
+ }
699
+ else if (override.visible === true) {
700
+ contract.slotVisibility[name] = true;
701
+ }
702
+ // 2. Content Overrides
703
+ if (override.textContent !== undefined) {
704
+ contract.content[name] = override.textContent;
705
+ }
706
+ // 3. Dependency Overrides (Swaps)
707
+ if (override.componentId) {
708
+ let dep = components.find(c => c.id === override.componentId);
709
+ if (!dep && /^\d+:\d+$/.test(override.componentId)) {
710
+ dep = components.find(c => c.id === `comp_${override.componentId.replace(/:/g, "_")}`);
711
+ }
712
+ if (dep) {
713
+ contract.dependency[name] = {
714
+ kind: "dependency",
715
+ componentName: dep.name,
716
+ importName: dep.name,
717
+ componentId: dep.id
718
+ };
719
+ }
720
+ }
721
+ // 4. Style Overrides (Simplistic for now, matches resolveStyleDiff logic)
722
+ if (override.rawStyles && (override.rawStyles.fills || override.rawStyles.strokes)) {
723
+ const styles = {};
724
+ if (override.rawStyles.fills) {
725
+ const fill = resolveStyleDiff("[]", JSON.stringify(override.rawStyles.fills), tokenIndex);
726
+ if (fill)
727
+ styles.fill = fill;
728
+ }
729
+ if (override.rawStyles.strokes) {
730
+ const stroke = resolveStyleDiff("[]", JSON.stringify(override.rawStyles.strokes), tokenIndex);
731
+ if (stroke)
732
+ styles.stroke = stroke;
733
+ }
734
+ if (Object.keys(styles).length > 0) {
735
+ contract.style[name] = styles;
736
+ }
737
+ }
738
+ }
739
+ // Basic classification
740
+ contract.classification.representable = [
741
+ ...Object.keys(contract.slotVisibility),
742
+ ...Object.keys(contract.content),
743
+ ...Object.keys(contract.dependency)
744
+ ];
745
+ return contract;
746
+ }
747
+ //# sourceMappingURL=instance-resolver.js.map