@sarjallab09/figma-intelligence 1.0.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 (286) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +327 -0
  3. package/bin/cli.js +859 -0
  4. package/design-bridge/.env.example +5 -0
  5. package/design-bridge/bridge.js +196 -0
  6. package/design-bridge/lib/assets.js +367 -0
  7. package/design-bridge/lib/prompt.js +85 -0
  8. package/design-bridge/lib/server.js +66 -0
  9. package/design-bridge/lib/stitch.js +37 -0
  10. package/design-bridge/lib/tokens.js +82 -0
  11. package/design-bridge/package-lock.json +579 -0
  12. package/design-bridge/package.json +19 -0
  13. package/figma-bridge-plugin/README.md +97 -0
  14. package/figma-bridge-plugin/anthropic-chat-runner.js +192 -0
  15. package/figma-bridge-plugin/bridge-relay.js +2363 -0
  16. package/figma-bridge-plugin/chat-runner.js +459 -0
  17. package/figma-bridge-plugin/code.js +1528 -0
  18. package/figma-bridge-plugin/codex-runner.js +505 -0
  19. package/figma-bridge-plugin/component-schemas.js +110 -0
  20. package/figma-bridge-plugin/content-context.js +869 -0
  21. package/figma-bridge-plugin/create-button.js +216 -0
  22. package/figma-bridge-plugin/gemini-cli-runner.js +291 -0
  23. package/figma-bridge-plugin/gemini-runner.js +187 -0
  24. package/figma-bridge-plugin/html-to-figma.js +927 -0
  25. package/figma-bridge-plugin/knowledge-hub/.gitkeep +0 -0
  26. package/figma-bridge-plugin/knowledge-hub/uspec-references/anatomy-spec.md +159 -0
  27. package/figma-bridge-plugin/knowledge-hub/uspec-references/api-spec.md +162 -0
  28. package/figma-bridge-plugin/knowledge-hub/uspec-references/color-spec.md +148 -0
  29. package/figma-bridge-plugin/knowledge-hub/uspec-references/full-spec-template.md +314 -0
  30. package/figma-bridge-plugin/knowledge-hub/uspec-references/property-spec.md +175 -0
  31. package/figma-bridge-plugin/knowledge-hub/uspec-references/screen-reader-spec.md +180 -0
  32. package/figma-bridge-plugin/knowledge-hub/uspec-references/structure-spec.md +165 -0
  33. package/figma-bridge-plugin/manifest.json +21 -0
  34. package/figma-bridge-plugin/package-lock.json +1936 -0
  35. package/figma-bridge-plugin/package.json +20 -0
  36. package/figma-bridge-plugin/perplexity-runner.js +188 -0
  37. package/figma-bridge-plugin/references/SKILL.md +178 -0
  38. package/figma-bridge-plugin/references/anatomy-spec.md +159 -0
  39. package/figma-bridge-plugin/references/api-spec.md +162 -0
  40. package/figma-bridge-plugin/references/color-spec.md +148 -0
  41. package/figma-bridge-plugin/references/full-spec-template.md +314 -0
  42. package/figma-bridge-plugin/references/property-spec.md +175 -0
  43. package/figma-bridge-plugin/references/screen-reader-spec.md +180 -0
  44. package/figma-bridge-plugin/references/structure-spec.md +165 -0
  45. package/figma-bridge-plugin/shared-prompt-config.js +604 -0
  46. package/figma-bridge-plugin/spec-helpers/build-table.js +269 -0
  47. package/figma-bridge-plugin/spec-helpers/classify-elements.js +189 -0
  48. package/figma-bridge-plugin/spec-helpers/index.js +35 -0
  49. package/figma-bridge-plugin/spec-helpers/parse-figma-link.js +49 -0
  50. package/figma-bridge-plugin/spec-helpers/position-markers.js +158 -0
  51. package/figma-bridge-plugin/stitch-auth.js +322 -0
  52. package/figma-bridge-plugin/stitch-runner.js +1427 -0
  53. package/figma-bridge-plugin/token-resolver.js +107 -0
  54. package/figma-bridge-plugin/ui.html +4467 -0
  55. package/figma-intelligence-layer/.env.example +39 -0
  56. package/figma-intelligence-layer/docs/local-image-generation.md +60 -0
  57. package/figma-intelligence-layer/examples/comfyui-workflow-template.example.json +101 -0
  58. package/figma-intelligence-layer/jest.config.js +14 -0
  59. package/figma-intelligence-layer/mcp-config.json +19 -0
  60. package/figma-intelligence-layer/package-lock.json +5892 -0
  61. package/figma-intelligence-layer/package.json +48 -0
  62. package/figma-intelligence-layer/scripts/setup-comfyui-local.sh +67 -0
  63. package/figma-intelligence-layer/scripts/start-comfyui.sh +33 -0
  64. package/figma-intelligence-layer/src/index.ts +2233 -0
  65. package/figma-intelligence-layer/src/shared/auto-layout-validator.ts +404 -0
  66. package/figma-intelligence-layer/src/shared/cache.ts +187 -0
  67. package/figma-intelligence-layer/src/shared/color-operations.ts +533 -0
  68. package/figma-intelligence-layer/src/shared/color-utils.ts +138 -0
  69. package/figma-intelligence-layer/src/shared/component-script-builder.ts +413 -0
  70. package/figma-intelligence-layer/src/shared/component-templates.ts +2767 -0
  71. package/figma-intelligence-layer/src/shared/concept-taxonomy.ts +694 -0
  72. package/figma-intelligence-layer/src/shared/decision-log.ts +128 -0
  73. package/figma-intelligence-layer/src/shared/design-system-context.ts +568 -0
  74. package/figma-intelligence-layer/src/shared/design-system-intelligence.ts +131 -0
  75. package/figma-intelligence-layer/src/shared/design-system-matcher.ts +184 -0
  76. package/figma-intelligence-layer/src/shared/design-system-normalizers.ts +196 -0
  77. package/figma-intelligence-layer/src/shared/design-system-tokens.ts +295 -0
  78. package/figma-intelligence-layer/src/shared/dtcg-validator.ts +530 -0
  79. package/figma-intelligence-layer/src/shared/enrichment-pipeline.ts +671 -0
  80. package/figma-intelligence-layer/src/shared/figma-bridge.ts +1408 -0
  81. package/figma-intelligence-layer/src/shared/font-config.ts +126 -0
  82. package/figma-intelligence-layer/src/shared/icon-catalog.ts +360 -0
  83. package/figma-intelligence-layer/src/shared/icon-fetch.ts +80 -0
  84. package/figma-intelligence-layer/src/shared/prototype-script-builder.ts +162 -0
  85. package/figma-intelligence-layer/src/shared/response-compression.ts +440 -0
  86. package/figma-intelligence-layer/src/shared/semantic-token-catalog.ts +324 -0
  87. package/figma-intelligence-layer/src/shared/token-binder.ts +505 -0
  88. package/figma-intelligence-layer/src/shared/token-math.ts +427 -0
  89. package/figma-intelligence-layer/src/shared/token-naming.ts +468 -0
  90. package/figma-intelligence-layer/src/shared/token-utils.ts +420 -0
  91. package/figma-intelligence-layer/src/shared/types.ts +346 -0
  92. package/figma-intelligence-layer/src/shared/typography-presets.ts +94 -0
  93. package/figma-intelligence-layer/src/shared/unsplash.ts +165 -0
  94. package/figma-intelligence-layer/src/shared/vision-client.ts +607 -0
  95. package/figma-intelligence-layer/src/shared/vision-provider-anthropic.ts +334 -0
  96. package/figma-intelligence-layer/src/shared/vision-provider-openai.ts +446 -0
  97. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotate-handler.ts +782 -0
  98. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotate-renderer.ts +496 -0
  99. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotation-kit.ts +230 -0
  100. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/colorblind-sim.ts +66 -0
  101. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/index.ts +810 -0
  102. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-analyzer.ts +1191 -0
  103. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-figma-page.ts +1346 -0
  104. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-handler.ts +148 -0
  105. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/vpat-figma-page.ts +499 -0
  106. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/vpat-report.ts +910 -0
  107. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/wcag-checker.ts +989 -0
  108. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/wcag-criteria.ts +1160 -0
  109. package/figma-intelligence-layer/src/tools/phase1-vision/design-from-ref/index.ts +424 -0
  110. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/component-recognizer.ts +38 -0
  111. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/ds-matcher.ts +111 -0
  112. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/font-matcher.ts +114 -0
  113. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/icon-resolver.ts +103 -0
  114. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/index.ts +1060 -0
  115. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/layout-segmenter.ts +18 -0
  116. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/token-inferencer.ts +39 -0
  117. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/vision-pipeline.ts +58 -0
  118. package/figma-intelligence-layer/src/tools/phase1-vision/sketch-to-design/index.ts +298 -0
  119. package/figma-intelligence-layer/src/tools/phase1-vision/visual-audit/index.ts +197 -0
  120. package/figma-intelligence-layer/src/tools/phase2-accuracy/component-audit/index.ts +494 -0
  121. package/figma-intelligence-layer/src/tools/phase2-accuracy/intent-translator/index.ts +356 -0
  122. package/figma-intelligence-layer/src/tools/phase2-accuracy/layout-intelligence/container-patterns.ts +123 -0
  123. package/figma-intelligence-layer/src/tools/phase2-accuracy/layout-intelligence/index.ts +663 -0
  124. package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/built-in-rules.yaml +56 -0
  125. package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/index.ts +614 -0
  126. package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/rule-engine.ts +113 -0
  127. package/figma-intelligence-layer/src/tools/phase2-accuracy/theme-generator/color-theory.ts +178 -0
  128. package/figma-intelligence-layer/src/tools/phase2-accuracy/theme-generator/index.ts +470 -0
  129. package/figma-intelligence-layer/src/tools/phase2-accuracy/variant-expander/index.ts +429 -0
  130. package/figma-intelligence-layer/src/tools/phase2-accuracy/variant-expander/token-override-maps.ts +226 -0
  131. package/figma-intelligence-layer/src/tools/phase3-generation/ai-image-insert/index.ts +535 -0
  132. package/figma-intelligence-layer/src/tools/phase3-generation/component-archaeologist/index.ts +660 -0
  133. package/figma-intelligence-layer/src/tools/phase3-generation/component-archaeologist/pattern-fingerprints.ts +209 -0
  134. package/figma-intelligence-layer/src/tools/phase3-generation/composition-builder/index.ts +540 -0
  135. package/figma-intelligence-layer/src/tools/phase3-generation/figma-animated-build.ts +391 -0
  136. package/figma-intelligence-layer/src/tools/phase3-generation/page-architect/index.ts +2019 -0
  137. package/figma-intelligence-layer/src/tools/phase3-generation/page-architect/screen-templates.ts +131 -0
  138. package/figma-intelligence-layer/src/tools/phase3-generation/prototype-map/index.ts +381 -0
  139. package/figma-intelligence-layer/src/tools/phase3-generation/prototype-wire/index.ts +565 -0
  140. package/figma-intelligence-layer/src/tools/phase3-generation/swarm-build/index.ts +764 -0
  141. package/figma-intelligence-layer/src/tools/phase3-generation/system-drift/index.ts +535 -0
  142. package/figma-intelligence-layer/src/tools/phase3-generation/unsplash-search/index.ts +84 -0
  143. package/figma-intelligence-layer/src/tools/phase3-generation/url-to-frame/index.ts +401 -0
  144. package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/css-animations.ts +68 -0
  145. package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/framer-motion.ts +78 -0
  146. package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/swift-animations.ts +93 -0
  147. package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/index.ts +596 -0
  148. package/figma-intelligence-layer/src/tools/phase4-sync/ci-check/index.ts +462 -0
  149. package/figma-intelligence-layer/src/tools/phase4-sync/export-tokens/index.ts +1470 -0
  150. package/figma-intelligence-layer/src/tools/phase4-sync/generate-component-code/index.ts +829 -0
  151. package/figma-intelligence-layer/src/tools/phase4-sync/handoff-spec/index.ts +702 -0
  152. package/figma-intelligence-layer/src/tools/phase4-sync/icon-library-sync/index.ts +483 -0
  153. package/figma-intelligence-layer/src/tools/phase4-sync/sync-from-code/index.ts +501 -0
  154. package/figma-intelligence-layer/src/tools/phase4-sync/sync-from-code/storybook-parser.ts +106 -0
  155. package/figma-intelligence-layer/src/tools/phase4-sync/watch-docs/index.ts +676 -0
  156. package/figma-intelligence-layer/src/tools/phase4-sync/webhook-listener/index.ts +560 -0
  157. package/figma-intelligence-layer/src/tools/phase5-governance/apg-doc/index.ts +1043 -0
  158. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/component-detection.ts +620 -0
  159. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/anatomy.ts +331 -0
  160. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/color-tokens.ts +77 -0
  161. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/properties.ts +54 -0
  162. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/snapshot.ts +287 -0
  163. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/spacing.ts +71 -0
  164. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/states.ts +43 -0
  165. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/typography.ts +71 -0
  166. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/index.ts +221 -0
  167. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/_default.ts +166 -0
  168. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/accordion.ts +232 -0
  169. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/alert.ts +234 -0
  170. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/avatar-group.ts +270 -0
  171. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/avatar.ts +249 -0
  172. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/badge.ts +231 -0
  173. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/banner.ts +293 -0
  174. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/breadcrumb.ts +240 -0
  175. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/button.ts +243 -0
  176. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/calendar.ts +307 -0
  177. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/card.ts +143 -0
  178. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/checkbox.ts +227 -0
  179. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/chip.ts +233 -0
  180. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/combobox.ts +282 -0
  181. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/datepicker.ts +276 -0
  182. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/divider.ts +223 -0
  183. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/drawer.ts +255 -0
  184. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/dropdown-menu.ts +289 -0
  185. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/empty-state.ts +261 -0
  186. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/file-uploader.ts +290 -0
  187. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/form.ts +265 -0
  188. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/grid.ts +238 -0
  189. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/icon.ts +255 -0
  190. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/index.ts +128 -0
  191. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/inline-edit.ts +286 -0
  192. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/inline-message.ts +255 -0
  193. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/input.ts +330 -0
  194. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/link.ts +247 -0
  195. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/list.ts +250 -0
  196. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/menu.ts +247 -0
  197. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/modal.ts +144 -0
  198. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/navbar.ts +264 -0
  199. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/navigation.ts +251 -0
  200. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/number-input.ts +261 -0
  201. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/pagination.ts +248 -0
  202. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/popover.ts +270 -0
  203. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/progress.ts +251 -0
  204. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/radio.ts +142 -0
  205. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/range-slider.ts +282 -0
  206. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/rating.ts +250 -0
  207. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/search.ts +258 -0
  208. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/segmented-control.ts +265 -0
  209. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/select.ts +319 -0
  210. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/skeleton.ts +256 -0
  211. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/slider.ts +232 -0
  212. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/spinner.ts +239 -0
  213. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/status-dot.ts +252 -0
  214. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/stepper.ts +270 -0
  215. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/table.ts +244 -0
  216. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tabs.ts +143 -0
  217. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tag.ts +243 -0
  218. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/textarea.ts +259 -0
  219. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/time-picker.ts +293 -0
  220. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toast.ts +144 -0
  221. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toggle.ts +289 -0
  222. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toolbar.ts +267 -0
  223. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tooltip.ts +232 -0
  224. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/treeview.ts +257 -0
  225. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/typography.ts +319 -0
  226. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/legacy-compat.ts +121 -0
  227. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/anatomy-diagram.ts +430 -0
  228. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/figma-page.ts +312 -0
  229. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/json.ts +129 -0
  230. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/markdown.ts +78 -0
  231. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/visual-doc.ts +2333 -0
  232. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/accessibility.ts +100 -0
  233. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/anatomy.ts +32 -0
  234. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/color-tokens.ts +59 -0
  235. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/content-guidance.ts +18 -0
  236. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/design-tokens.ts +53 -0
  237. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/interaction-rules.ts +19 -0
  238. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/overview.ts +91 -0
  239. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/properties-api.ts +71 -0
  240. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/qa-criteria.ts +19 -0
  241. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/related-components.ts +110 -0
  242. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/responsive.ts +19 -0
  243. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/size-specs.ts +67 -0
  244. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/spacing-structure.ts +58 -0
  245. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/state-specs.ts +79 -0
  246. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/states.ts +50 -0
  247. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/type-hierarchy.ts +33 -0
  248. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/typography.ts +55 -0
  249. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/usage-guidelines.ts +73 -0
  250. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/variants.ts +81 -0
  251. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/types.ts +409 -0
  252. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/index.ts +198 -0
  253. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/renderer.ts +701 -0
  254. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/types.ts +88 -0
  255. package/figma-intelligence-layer/src/tools/phase5-governance/decision-log/index.ts +135 -0
  256. package/figma-intelligence-layer/src/tools/phase5-governance/design-decision-log/index.ts +491 -0
  257. package/figma-intelligence-layer/src/tools/phase5-governance/ds-primitives/index.ts +416 -0
  258. package/figma-intelligence-layer/src/tools/phase5-governance/ds-scaffolder/index.ts +722 -0
  259. package/figma-intelligence-layer/src/tools/phase5-governance/ds-variables/index.ts +449 -0
  260. package/figma-intelligence-layer/src/tools/phase5-governance/health-report/index.ts +393 -0
  261. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/index.ts +406 -0
  262. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/figma-page.ts +292 -0
  263. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/json.ts +24 -0
  264. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/markdown.ts +172 -0
  265. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/naming-guide.ts +409 -0
  266. package/figma-intelligence-layer/src/tools/phase5-governance/token-analytics/index.ts +594 -0
  267. package/figma-intelligence-layer/src/tools/phase5-governance/token-docs/index.ts +710 -0
  268. package/figma-intelligence-layer/src/tools/phase5-governance/token-migrate/index.ts +458 -0
  269. package/figma-intelligence-layer/src/tools/phase5-governance/token-naming/index.ts +134 -0
  270. package/figma-intelligence-layer/tests/apg-doc.test.ts +101 -0
  271. package/figma-intelligence-layer/tests/design-system-context.test.ts +152 -0
  272. package/figma-intelligence-layer/tests/design-system-matcher.test.ts +144 -0
  273. package/figma-intelligence-layer/tests/figma-bridge.test.ts +83 -0
  274. package/figma-intelligence-layer/tests/generate-image-and-insert.test.ts +56 -0
  275. package/figma-intelligence-layer/tests/screen-cloner-regression.test.ts +69 -0
  276. package/figma-intelligence-layer/tests/smoke.test.ts +174 -0
  277. package/figma-intelligence-layer/tests/spec-generator.test.ts +127 -0
  278. package/figma-intelligence-layer/tests/token-migrate.test.ts +21 -0
  279. package/figma-intelligence-layer/tests/token-naming.test.ts +30 -0
  280. package/figma-intelligence-layer/tsconfig.json +19 -0
  281. package/package.json +35 -0
  282. package/scripts/clean-existing-chunks.js +179 -0
  283. package/scripts/connect-ai-tool.js +490 -0
  284. package/scripts/convert-hub-pdfs.js +425 -0
  285. package/scripts/figma-mcp-status.js +349 -0
  286. package/scripts/register-codex-mcp.js +96 -0
@@ -0,0 +1,409 @@
1
+ /**
2
+ * component-spec/types.ts — All interfaces for the unified component spec tool
3
+ */
4
+
5
+ // ─── Spec Sections ──────────────────────────────────────────────────────────
6
+
7
+ export type SpecSection =
8
+ | "overview"
9
+ | "anatomy"
10
+ | "variants"
11
+ | "states"
12
+ | "properties"
13
+ | "spacing"
14
+ | "color-tokens"
15
+ | "typography"
16
+ | "accessibility"
17
+ | "usage"
18
+ | "related"
19
+ | "size-specs"
20
+ | "state-specs"
21
+ | "design-tokens"
22
+ | "interaction-rules"
23
+ | "content-guidance"
24
+ | "responsive"
25
+ | "qa-criteria"
26
+ | "type-hierarchy";
27
+
28
+ export const ALL_SECTIONS: SpecSection[] = [
29
+ "overview",
30
+ "variants",
31
+ "anatomy",
32
+ "states",
33
+ "state-specs",
34
+ "properties",
35
+ "size-specs",
36
+ "spacing",
37
+ "color-tokens",
38
+ "design-tokens",
39
+ "typography",
40
+ "type-hierarchy",
41
+ "interaction-rules",
42
+ "content-guidance",
43
+ "responsive",
44
+ "accessibility",
45
+ "qa-criteria",
46
+ "usage",
47
+ "related",
48
+ ];
49
+
50
+ // ─── Tool Input/Output ──────────────────────────────────────────────────────
51
+
52
+ export interface ComponentSpecArgs {
53
+ nodeId?: string;
54
+ outputFormat: "json" | "markdown" | "figma-page" | "all";
55
+ sections?: SpecSection[];
56
+ pageName?: string;
57
+ }
58
+
59
+ export interface ComponentSpecResult {
60
+ spec: ComponentSpec;
61
+ markdown?: string;
62
+ figmaPageId?: string;
63
+ logEntryId: string;
64
+ warnings?: string[];
65
+ }
66
+
67
+ // ─── Node Snapshot (from Figma Plugin API) ──────────────────────────────────
68
+
69
+ export interface NodeSnapshot {
70
+ id: string;
71
+ name: string;
72
+ type: string;
73
+ description: string;
74
+ width: number;
75
+ height: number;
76
+ layoutMode: string;
77
+ itemSpacing: number;
78
+ paddingTop: number;
79
+ paddingRight: number;
80
+ paddingBottom: number;
81
+ paddingLeft: number;
82
+ childCount: number;
83
+ childNames: string[];
84
+ textLayers: Array<{
85
+ name: string;
86
+ characters: string;
87
+ fontFamily: string;
88
+ fontStyle: string;
89
+ fontSize: number;
90
+ lineHeightPx: number | null;
91
+ }>;
92
+ fills: Array<{ type: string; label: string }>;
93
+ strokes: Array<{ type: string; label: string }>;
94
+ effects: Array<{ type: string; radius?: number; visible?: boolean }>;
95
+ tokenAliases: string[];
96
+ componentProperties: Array<{
97
+ name: string;
98
+ type: string;
99
+ value: string;
100
+ options: string[];
101
+ }>;
102
+ variantProperties: Record<string, string>;
103
+ variantGroupProperties: Record<string, string[]>;
104
+ variants: Array<{
105
+ id: string;
106
+ name: string;
107
+ description: string;
108
+ properties: Record<string, string>;
109
+ }>;
110
+ scanNodes?: SnapshotNode[];
111
+ }
112
+
113
+ export interface SnapshotNode {
114
+ id: string;
115
+ parentId: string | null;
116
+ parentName: string | null;
117
+ name: string;
118
+ type: string;
119
+ depth: number;
120
+ visible: boolean;
121
+ childCount: number;
122
+ layoutMode: string;
123
+ text: string;
124
+ componentPropertyNames: string[];
125
+ variantPropertyKeys: string[];
126
+ variantPropertyValues: string[];
127
+ }
128
+
129
+ // ─── Anatomy Extraction ─────────────────────────────────────────────────────
130
+
131
+ export type ElementRole =
132
+ | "content-element"
133
+ | "optional-slot"
134
+ | "fixed-sub-component"
135
+ | "structural"
136
+ | "decorative";
137
+
138
+ export interface ClassifiedElement {
139
+ index: number;
140
+ name: string;
141
+ nodeType: string;
142
+ role: ElementRole;
143
+ visible: boolean;
144
+ controlledByBoolean?: string;
145
+ depth?: number;
146
+ position: { x: number; y: number; w: number; h: number };
147
+ absolutePosition?: { x: number; y: number; w: number; h: number };
148
+
149
+ // TEXT nodes
150
+ fontFamily?: string;
151
+ fontStyle?: string;
152
+ fontSize?: number;
153
+ lineHeightPx?: number;
154
+ tokenName?: string;
155
+ characters?: string;
156
+
157
+ // INSTANCE nodes
158
+ componentName?: string;
159
+ instanceOf?: string;
160
+ variantProperties?: Record<string, string>;
161
+
162
+ // FRAME/COMPONENT nodes
163
+ layoutMode?: string;
164
+ itemSpacing?: number;
165
+ paddingTop?: number;
166
+ paddingRight?: number;
167
+ paddingBottom?: number;
168
+ paddingLeft?: number;
169
+ layoutSizingH?: string;
170
+ layoutSizingV?: string;
171
+
172
+ // All nodes
173
+ fills?: string[];
174
+ strokes?: string[];
175
+ cornerRadius?: number;
176
+ }
177
+
178
+ export interface AnatomyExtraction {
179
+ elements: ClassifiedElement[];
180
+ componentBounds?: { x: number; y: number; w: number; h: number };
181
+ }
182
+
183
+ // ─── Properties Extraction ──────────────────────────────────────────────────
184
+
185
+ export interface VariantAxis {
186
+ name: string;
187
+ values: string[];
188
+ defaultValue: string;
189
+ }
190
+
191
+ export interface BooleanToggle {
192
+ name: string;
193
+ defaultValue: boolean;
194
+ controlsElement?: string;
195
+ }
196
+
197
+ export interface InstanceSwap {
198
+ name: string;
199
+ currentComponentName: string;
200
+ }
201
+
202
+ export interface PropertyExtraction {
203
+ variantAxes: VariantAxis[];
204
+ booleanToggles: BooleanToggle[];
205
+ instanceSwaps: InstanceSwap[];
206
+ textProperties: Array<{ name: string; value: string }>;
207
+ }
208
+
209
+ // ─── States Extraction ──────────────────────────────────────────────────────
210
+
211
+ export interface DetectedState {
212
+ name: string;
213
+ source: "variant-axis" | "component-property";
214
+ axisName: string;
215
+ }
216
+
217
+ export interface StatesExtraction {
218
+ states: DetectedState[];
219
+ stateAxisName: string | null;
220
+ }
221
+
222
+ // ─── Spacing Extraction ─────────────────────────────────────────────────────
223
+
224
+ export interface SpacingChildEntry {
225
+ name: string;
226
+ x: number;
227
+ y: number;
228
+ w: number;
229
+ h: number;
230
+ }
231
+
232
+ export interface SpacingEntry {
233
+ element: string;
234
+ paddingTop: number;
235
+ paddingRight: number;
236
+ paddingBottom: number;
237
+ paddingLeft: number;
238
+ itemSpacing: number;
239
+ width: number;
240
+ height: number;
241
+ layoutMode: string;
242
+ layoutSizingH: string;
243
+ layoutSizingV: string;
244
+ children?: SpacingChildEntry[];
245
+ }
246
+
247
+ // ─── Color Token Extraction ─────────────────────────────────────────────────
248
+
249
+ export interface ColorTokenEntry {
250
+ element: string;
251
+ property: "fill" | "stroke";
252
+ colorHex: string;
253
+ tokenName: string;
254
+ tokenId: string;
255
+ }
256
+
257
+ // ─── Typography Extraction ──────────────────────────────────────────────────
258
+
259
+ export interface TypographyEntry {
260
+ element: string;
261
+ characters: string;
262
+ fontFamily: string;
263
+ fontStyle: string;
264
+ fontSize: number;
265
+ lineHeightPx: number | null;
266
+ letterSpacing: number;
267
+ tokenName: string;
268
+ }
269
+
270
+ // ─── Extraction Result (all data combined) ──────────────────────────────────
271
+
272
+ export interface ExtractionResult {
273
+ snapshot: NodeSnapshot;
274
+ anatomy: AnatomyExtraction;
275
+ properties: PropertyExtraction;
276
+ states: StatesExtraction;
277
+ spacing: SpacingEntry[];
278
+ colorTokens: ColorTokenEntry[];
279
+ typography: TypographyEntry[];
280
+ componentType?: string;
281
+ typeGuidance?: ComponentTypeGuidance;
282
+ knowledge?: ComponentKnowledge;
283
+ }
284
+
285
+ // ─── Component Knowledge (design intelligence) ────────────────────────────
286
+
287
+ export interface ComponentKnowledge {
288
+ description: string;
289
+
290
+ stateSpecifications: Array<{
291
+ state: string;
292
+ visualChange: string;
293
+ opacity: string;
294
+ cursorWeb: string;
295
+ usage: string;
296
+ }>;
297
+
298
+ propertyDescriptions: Record<string, string>;
299
+
300
+ sizeSpecifications: Array<{
301
+ size: string;
302
+ height: string;
303
+ paddingLR: string;
304
+ fontSize: string;
305
+ iconSize: string;
306
+ borderRadius: string;
307
+ }>;
308
+
309
+ designTokenBindings: Array<{
310
+ property: string;
311
+ tokenName: string;
312
+ role: string;
313
+ fallback: string;
314
+ }>;
315
+
316
+ structureRules: string[];
317
+ typeHierarchyRules: string[];
318
+
319
+ interactionRules: Array<{
320
+ event: string;
321
+ trigger: string;
322
+ action: string;
323
+ }>;
324
+
325
+ contentGuidance: string[];
326
+
327
+ responsiveBehaviour: Array<{
328
+ breakpoint: string;
329
+ behavior: string;
330
+ }>;
331
+
332
+ accessibilitySpec: {
333
+ intro: string;
334
+ requirements: Array<{
335
+ requirement: string;
336
+ level: "A" | "AA" | "AAA";
337
+ notes: string;
338
+ }>;
339
+ outro: string[];
340
+ };
341
+
342
+ qaAcceptanceCriteria: Array<{
343
+ check: string;
344
+ platform: string;
345
+ expectedResult: string;
346
+ }>;
347
+
348
+ dos: string[];
349
+ donts: string[];
350
+ }
351
+
352
+ // ─── Component Type Guidance ────────────────────────────────────────────────
353
+
354
+ export interface ComponentTypeGuidance {
355
+ expectedElements: string[];
356
+ expectedVariantAxes: string[];
357
+ expectedStates: string[];
358
+ semanticRole: string;
359
+ wcagPattern: string;
360
+ minTouchTarget: number;
361
+ contrastRequirement: string;
362
+ }
363
+
364
+ // ─── Section Output ─────────────────────────────────────────────────────────
365
+
366
+ export interface SpecSectionOutput {
367
+ id: SpecSection;
368
+ title: string;
369
+ content: SpecSectionContent;
370
+ }
371
+
372
+ export type SpecSectionContent =
373
+ | { kind: "key-value"; entries: Array<{ label: string; value: string }> }
374
+ | { kind: "table"; headers: string[]; rows: string[][] }
375
+ | { kind: "list"; items: string[] }
376
+ | { kind: "do-dont"; dos: string[]; donts: string[] }
377
+ | { kind: "paragraph"; text: string }
378
+ | { kind: "mixed"; blocks: SpecSectionContent[] }
379
+ | { kind: "structured-data"; columns: string[]; rows: Record<string, string>[] }
380
+ | { kind: "rules"; items: string[] };
381
+
382
+ // ─── Full Component Spec ────────────────────────────────────────────────────
383
+
384
+ export interface ComponentSpec {
385
+ componentName: string;
386
+ description?: string;
387
+ nodeId: string;
388
+ nodeType: string;
389
+ componentType?: string;
390
+ sections: SpecSectionOutput[];
391
+ extraction: ExtractionResult;
392
+ }
393
+
394
+ // ─── Legacy re-exports needed by apg-doc ────────────────────────────────────
395
+
396
+ export type DocumentationSectionStyle = "bullets" | "paragraph" | "checklist";
397
+
398
+ export interface GeneratedDocumentSection {
399
+ title: string;
400
+ style: DocumentationSectionStyle;
401
+ items: string[];
402
+ }
403
+
404
+ export interface GeneratedDocument {
405
+ type: "anatomy-usage" | "accessibility" | "accessibility-annotation";
406
+ title: string;
407
+ summary: string;
408
+ sections: GeneratedDocumentSection[];
409
+ }
@@ -0,0 +1,198 @@
1
+ /**
2
+ * component-spec-sheet/index.ts
3
+ *
4
+ * Visual spec sheet generator — creates an on-canvas anatomy + properties
5
+ * + spacing spec sheet in 3-5 seconds, similar to EightShapes Specs plugin.
6
+ *
7
+ * Pipeline: Extract (parallel) → Plan (CPU) → Render (1 execute call)
8
+ */
9
+ import { getBridge } from "../../../shared/figma-bridge.js";
10
+ import { resolveTargetNodeId, captureSnapshot } from "../component-spec/extractors/snapshot.js";
11
+ import { extractAnatomy } from "../component-spec/extractors/anatomy.js";
12
+ import { extractSpacing } from "../component-spec/extractors/spacing.js";
13
+ import { computeMarkerPositions } from "../component-spec/renderers/anatomy-diagram.js";
14
+ import { buildSpecSheetScript } from "./renderer.js";
15
+ import type {
16
+ SpecSheetArgs,
17
+ SpecSheetResult,
18
+ SpecSheetPlan,
19
+ SpecSheetSection,
20
+ PropertyAxisPlan,
21
+ BooleanTogglePlan,
22
+ } from "./types.js";
23
+ import type { NodeSnapshot, AnatomyExtraction, SpacingEntry } from "../component-spec/types.js";
24
+
25
+ const DEFAULT_SECTIONS: SpecSheetSection[] = ["header", "anatomy", "properties", "spacing"];
26
+ const MAX_VARIANTS_DEFAULT = 6;
27
+ const MARKER_MARGIN = 60;
28
+
29
+ // ── Main handler ────────────────────────────────────────────────────────
30
+
31
+ export async function componentSpecSheetHandler(
32
+ args: SpecSheetArgs,
33
+ ): Promise<SpecSheetResult> {
34
+ const bridge = await getBridge();
35
+
36
+ // Phase 1: Extract (parallel)
37
+ const nodeId = await resolveTargetNodeId(args);
38
+
39
+ const [snapshot, anatomy, spacing] = await Promise.all([
40
+ captureSnapshot(nodeId),
41
+ extractAnatomy(nodeId),
42
+ extractSpacing(nodeId),
43
+ ]);
44
+
45
+ // Phase 2: Plan
46
+ const plan = buildPlan(nodeId, snapshot, anatomy, spacing, args);
47
+
48
+ // Phase 3: Render
49
+ const script = buildSpecSheetScript(plan);
50
+ const result = await bridge.execute(script);
51
+
52
+ if (!result.success) {
53
+ throw new Error(`Spec sheet render failed: ${result.error}`);
54
+ }
55
+
56
+ const frameId = (result.result as { frameId: string })?.frameId || "";
57
+
58
+ return {
59
+ frameId,
60
+ componentName: plan.componentName,
61
+ sections: plan.sections,
62
+ variantCount: plan.propertyAxes.reduce((sum, ax) => sum + ax.samples.length, 0),
63
+ anatomyElementCount: plan.markers.length,
64
+ };
65
+ }
66
+
67
+ // ── Plan builder ────────────────────────────────────────────────────────
68
+
69
+ function buildPlan(
70
+ nodeId: string,
71
+ snapshot: NodeSnapshot,
72
+ anatomy: AnatomyExtraction,
73
+ spacing: SpacingEntry[],
74
+ args: SpecSheetArgs,
75
+ ): SpecSheetPlan {
76
+ const sections = args.sections ?? DEFAULT_SECTIONS;
77
+ const maxVariants = args.maxVariantsPerAxis ?? MAX_VARIANTS_DEFAULT;
78
+ const placement = args.placement ?? "right";
79
+
80
+ const compW = anatomy.componentBounds?.w || snapshot.width || 200;
81
+ const compH = anatomy.componentBounds?.h || snapshot.height || 60;
82
+
83
+ // Variant label for header
84
+ const variantLabel = Object.entries(snapshot.variantProperties || {})
85
+ .map(([k, v]) => `${k}=${v}`)
86
+ .join(", ");
87
+
88
+ // Anatomy: scale up small components (cap at 3x to avoid oversized previews)
89
+ const MIN_DISPLAY = 120;
90
+ const scale = Math.min(3, Math.max(1, MIN_DISPLAY / Math.min(compW, compH)));
91
+ const displayW = Math.round(compW * scale);
92
+ const displayH = Math.round(compH * scale);
93
+
94
+ // Filter anatomy to direct children only (depth 1) for clean spec sheet
95
+ const directChildren = anatomy.elements.filter(
96
+ el => el.visible && el.position.w > 0 && el.position.h > 0 && (el.depth === undefined || el.depth === 1),
97
+ );
98
+
99
+ // Compute marker positions using scaled element positions
100
+ const scaledElements = directChildren.map(el => ({
101
+ ...el,
102
+ position: {
103
+ x: Math.round(el.position.x * scale),
104
+ y: Math.round(el.position.y * scale),
105
+ w: Math.round(el.position.w * scale),
106
+ h: Math.round(el.position.h * scale),
107
+ },
108
+ }));
109
+
110
+ // For the spec sheet, markers are placed OUTSIDE the component with leader lines.
111
+ // Pass MARKER_MARGIN as offset so markers sit in the margin area around the clone.
112
+ const markers = computeMarkerPositions(displayW, displayH, MARKER_MARGIN, MARKER_MARGIN, scaledElements);
113
+
114
+ // Property axes from variantGroupProperties
115
+ const propertyAxes: PropertyAxisPlan[] = [];
116
+ const variantGroupProps = snapshot.variantGroupProperties || {};
117
+ const defaultProps = snapshot.variants?.[0]?.properties || {};
118
+
119
+ for (const [axisName, values] of Object.entries(variantGroupProps)) {
120
+ const capped = values.slice(0, maxVariants);
121
+ const samples = capped.map(val => {
122
+ // Find the variant that matches this value (use defaults for other axes)
123
+ const props = { ...defaultProps, [axisName]: val };
124
+ const matchedVariant = snapshot.variants.find(v => {
125
+ for (const [pk, pv] of Object.entries(props)) {
126
+ if (v.properties[pk] !== pv) return false;
127
+ }
128
+ return true;
129
+ });
130
+ return {
131
+ variantId: matchedVariant?.id || "",
132
+ label: val,
133
+ props,
134
+ };
135
+ });
136
+ propertyAxes.push({ axisName, samples });
137
+ }
138
+
139
+ // Boolean toggles from componentProperties
140
+ const booleanToggles: BooleanTogglePlan[] = [];
141
+ for (const cp of snapshot.componentProperties || []) {
142
+ if (cp.type === "BOOLEAN") {
143
+ const cleanName = cp.name.replace(/#.*$/, "").trim();
144
+ booleanToggles.push({
145
+ name: cleanName,
146
+ trueVariantId: null,
147
+ falseVariantId: null,
148
+ });
149
+ }
150
+ }
151
+
152
+ // Placement coordinates
153
+ const placementCoords = computePlacement(
154
+ placement,
155
+ snapshot.width || 200,
156
+ snapshot.height || 200,
157
+ );
158
+
159
+ return {
160
+ componentName: snapshot.name,
161
+ variantLabel,
162
+ sourceNodeId: nodeId,
163
+ sourceType: snapshot.type,
164
+ placement: placementCoords,
165
+ componentBounds: { w: compW, h: compH },
166
+ sections,
167
+ anatomyElements: anatomy.elements,
168
+ markers: markers.map(m => ({
169
+ letter: m.letter,
170
+ markerX: m.markerX,
171
+ markerY: m.markerY,
172
+ targetX: m.targetX,
173
+ targetY: m.targetY,
174
+ name: m.name,
175
+ role: m.role,
176
+ })),
177
+ anatomyScale: scale,
178
+ anatomyDisplayW: displayW,
179
+ anatomyDisplayH: displayH,
180
+ propertyAxes,
181
+ booleanToggles,
182
+ spacingEntries: spacing,
183
+ };
184
+ }
185
+
186
+ function computePlacement(
187
+ placement: string,
188
+ sourceW: number,
189
+ sourceH: number,
190
+ ): { x: number; y: number } {
191
+ switch (placement) {
192
+ case "below":
193
+ return { x: 0, y: sourceH + 100 };
194
+ case "right":
195
+ default:
196
+ return { x: sourceW + 200, y: 0 };
197
+ }
198
+ }