@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,429 @@
1
+ // ─────────────────────────────────────────────────────────────────────────────
2
+ // Variant Expander
3
+ // Generates a full set of component variants by taking a cartesian product of
4
+ // the requested dimension values, cloning the base component for each
5
+ // combination, applying per-dimension token overrides, and grouping everything
6
+ // into a Figma Component Set.
7
+ // ─────────────────────────────────────────────────────────────────────────────
8
+
9
+ import { getBridge } from "../../../shared/figma-bridge.js";
10
+ import { decisionLog } from "../../../shared/decision-log.js";
11
+ import { FontConfig, resolveFontConfig, generateFontLoadScript } from "../../../shared/font-config.js";
12
+ import { DIMENSION_OVERRIDES } from "./token-override-maps.js";
13
+
14
+ // ─── Public types ─────────────────────────────────────────────────────────────
15
+
16
+ export interface VariantDimensions {
17
+ state?: string[]; // e.g. ["default","hover","pressed","disabled","loading"]
18
+ size?: string[];
19
+ theme?: string[];
20
+ type?: string[];
21
+ }
22
+
23
+ export interface VariantExpanderArgs {
24
+ nodeId: string;
25
+ dimensions: VariantDimensions;
26
+ namingConvention: "figma" | "storybook";
27
+ autoApplyTokens: boolean;
28
+ arrangeInGrid?: boolean;
29
+ fonts?: Partial<FontConfig>;
30
+ }
31
+
32
+ export interface VariantCombination {
33
+ key: string; // rendered name
34
+ props: Record<string, string>; // e.g. { state: "hover", size: "md" }
35
+ clonedNodeId?: string;
36
+ tokenOverrides: TokenOverride[];
37
+ }
38
+
39
+ export interface TokenOverride {
40
+ property: string;
41
+ value: string | number;
42
+ description: string;
43
+ }
44
+
45
+ export interface CoverageReport {
46
+ totalCombinations: number;
47
+ created: number;
48
+ failed: number;
49
+ componentSetId: string | null;
50
+ combinations: VariantCombination[];
51
+ logEntryId: string;
52
+ }
53
+
54
+ // ─── Naming helpers ───────────────────────────────────────────────────────────
55
+
56
+ function toFigmaName(props: Record<string, string>): string {
57
+ // Figma convention: "Property=Value, Property2=Value2"
58
+ return Object.entries(props)
59
+ .map(([k, v]) => `${capitalize(k)}=${capitalize(v)}`)
60
+ .join(", ");
61
+ }
62
+
63
+ function toStorybookName(props: Record<string, string>): string {
64
+ // Storybook convention: "componentName--size-state-theme-type"
65
+ return Object.values(props)
66
+ .map((v) => v.toLowerCase().replace(/\s+/g, "-"))
67
+ .join("--");
68
+ }
69
+
70
+ function capitalize(s: string): string {
71
+ return s.charAt(0).toUpperCase() + s.slice(1);
72
+ }
73
+
74
+ // ─── Cartesian product ────────────────────────────────────────────────────────
75
+
76
+ function cartesian(dimensions: VariantDimensions): Array<Record<string, string>> {
77
+ const entries = Object.entries(dimensions).filter(
78
+ ([, values]) => values && values.length > 0
79
+ ) as Array<[string, string[]]>;
80
+
81
+ if (entries.length === 0) return [{}];
82
+
83
+ return entries.reduce<Array<Record<string, string>>>(
84
+ (acc, [key, values]) => {
85
+ const expanded: Array<Record<string, string>> = [];
86
+ for (const existing of acc) {
87
+ for (const value of values) {
88
+ expanded.push({ ...existing, [key]: value });
89
+ }
90
+ }
91
+ return expanded;
92
+ },
93
+ [{}]
94
+ );
95
+ }
96
+
97
+ // ─── Per-dimension token overrides ───────────────────────────────────────────
98
+
99
+ /**
100
+ * Resolve token overrides from the unified DIMENSION_OVERRIDES maps.
101
+ * This replaces the previous inline logic with a single source of truth.
102
+ */
103
+ function resolveTokenOverrides(props: Record<string, string>): TokenOverride[] {
104
+ const overrides: TokenOverride[] = [];
105
+
106
+ for (const [dimension, dimValue] of Object.entries(props)) {
107
+ const dimKey = dimension.toLowerCase() as keyof typeof DIMENSION_OVERRIDES;
108
+ const overrideMap = DIMENSION_OVERRIDES[dimKey];
109
+ if (!overrideMap) continue;
110
+
111
+ const valueKey = dimValue.toLowerCase();
112
+ const mapOverrides = overrideMap[valueKey];
113
+ if (!mapOverrides) continue;
114
+
115
+ for (const mo of mapOverrides) {
116
+ // Convert override map entries to the TokenOverride format used by the expander
117
+ if (mo.property === "background") {
118
+ overrides.push({
119
+ property: "fills[0]",
120
+ value: mo.token,
121
+ description: `${dimension}:${dimValue} — background: ${mo.token}`,
122
+ });
123
+ } else if (mo.property === "textColor") {
124
+ overrides.push({
125
+ property: "textFill",
126
+ value: mo.token,
127
+ description: `${dimension}:${dimValue} — text color: ${mo.token}`,
128
+ });
129
+ } else if (mo.property === "borderColor") {
130
+ overrides.push({
131
+ property: "strokes[0]",
132
+ value: mo.token,
133
+ description: `${dimension}:${dimValue} — border: ${mo.token}`,
134
+ });
135
+ } else if (mo.property === "opacity") {
136
+ overrides.push({
137
+ property: "opacity",
138
+ value: mo.rawValue ?? 1,
139
+ description: `${dimension}:${dimValue} — opacity: ${mo.rawValue}`,
140
+ });
141
+ } else if (mo.property === "fontSize") {
142
+ overrides.push({
143
+ property: "style.fontSize",
144
+ value: mo.rawValue ?? 16,
145
+ description: `${dimension}:${dimValue} — fontSize: ${mo.rawValue}px`,
146
+ });
147
+ } else if (mo.property === "paddingX") {
148
+ overrides.push(
149
+ { property: "paddingLeft", value: mo.rawValue ?? 16, description: `${dimension}:${dimValue} — paddingX: ${mo.rawValue}px` },
150
+ { property: "paddingRight", value: mo.rawValue ?? 16, description: `${dimension}:${dimValue} — paddingX: ${mo.rawValue}px` }
151
+ );
152
+ } else if (mo.property === "paddingY") {
153
+ overrides.push(
154
+ { property: "paddingTop", value: mo.rawValue ?? 8, description: `${dimension}:${dimValue} — paddingY: ${mo.rawValue}px` },
155
+ { property: "paddingBottom", value: mo.rawValue ?? 8, description: `${dimension}:${dimValue} — paddingY: ${mo.rawValue}px` }
156
+ );
157
+ } else if (mo.property === "height") {
158
+ overrides.push({
159
+ property: "height",
160
+ value: mo.rawValue ?? 40,
161
+ description: `${dimension}:${dimValue} — height: ${mo.rawValue}px`,
162
+ });
163
+ } else if (mo.property === "borderWidth") {
164
+ overrides.push({
165
+ property: "strokeWeight",
166
+ value: mo.rawValue ?? 1,
167
+ description: `${dimension}:${dimValue} — borderWidth: ${mo.rawValue}`,
168
+ });
169
+ } else if (mo.property === "text") {
170
+ overrides.push({
171
+ property: "characters",
172
+ value: mo.rawValue ?? "",
173
+ description: `${dimension}:${dimValue} — text: ${mo.rawValue}`,
174
+ });
175
+ }
176
+ }
177
+ }
178
+
179
+ return overrides;
180
+ }
181
+
182
+ // ─── Figma script builders ────────────────────────────────────────────────────
183
+
184
+ function buildCloneScript(
185
+ baseNodeId: string,
186
+ variantName: string,
187
+ overrides: TokenOverride[]
188
+ ): string {
189
+ const overrideLines: string[] = [];
190
+
191
+ for (const o of overrides) {
192
+ if (o.property === "opacity") {
193
+ overrideLines.push(` clone.opacity = ${o.value};`);
194
+ } else if (o.property === "characters") {
195
+ overrideLines.push(
196
+ ` const textNodes = clone.findAll ? clone.findAll(n => n.type === 'TEXT') : [];`,
197
+ ` for (const t of textNodes) { t.characters = ${JSON.stringify(o.value)}; }`
198
+ );
199
+ } else if (o.property.startsWith("padding")) {
200
+ const field = o.property; // e.g. "paddingLeft"
201
+ overrideLines.push(` if ('${field}' in clone) clone.${field} = ${o.value};`);
202
+ } else if (o.property === "variableMode") {
203
+ // Dark mode is set on the collection; we record it as a variant property here
204
+ overrideLines.push(` /* variableMode:${o.value} — handled by component set variant */`);
205
+ }
206
+ // fills and style overrides require variable binding; we annotate for now
207
+ }
208
+
209
+ const overrideBlock = overrideLines.join("\n") || " /* no overrides */";
210
+
211
+ return `
212
+ (async () => {
213
+ const base = await figma.getNodeByIdAsync(${JSON.stringify(baseNodeId)});
214
+ if (!base) throw new Error('Base node not found: ${baseNodeId}');
215
+ const clone = base.clone();
216
+ clone.name = ${JSON.stringify(variantName)};
217
+ ${overrideBlock}
218
+ // Place clone next to base temporarily
219
+ base.parent.appendChild(clone);
220
+ return clone.id;
221
+ })()
222
+ `.trim();
223
+ }
224
+
225
+ function buildComponentSetScript(componentIds: string[]): string {
226
+ return `
227
+ (async () => {
228
+ const components = [];
229
+ for (const id of ${JSON.stringify(componentIds)}) {
230
+ const n = await figma.getNodeByIdAsync(id);
231
+ if (n) components.push(n);
232
+ }
233
+ if (components.length === 0) throw new Error('No components found to group');
234
+ const set = figma.combineAsVariants(components, figma.currentPage);
235
+ return set.id;
236
+ })()
237
+ `.trim();
238
+ }
239
+
240
+ function buildGridArrangeScript(componentSetId: string, columnCount: number): string {
241
+ const COL_WIDTH = 200;
242
+ const ROW_HEIGHT = 150;
243
+ const GAP = 24;
244
+
245
+ return `
246
+ (async () => {
247
+ const set = await figma.getNodeByIdAsync(${JSON.stringify(componentSetId)});
248
+ if (!set || !set.children) throw new Error('Component set not found');
249
+ const children = [...set.children];
250
+ children.forEach((child, i) => {
251
+ const col = i % ${columnCount};
252
+ const row = Math.floor(i / ${columnCount});
253
+ child.x = col * (${COL_WIDTH} + ${GAP});
254
+ child.y = row * (${ROW_HEIGHT} + ${GAP});
255
+ });
256
+ return { arranged: children.length };
257
+ })()
258
+ `.trim();
259
+ }
260
+
261
+ // ─── Main handler ─────────────────────────────────────────────────────────────
262
+
263
+ export async function variantExpanderHandler(
264
+ args: VariantExpanderArgs
265
+ ): Promise<CoverageReport> {
266
+ const {
267
+ nodeId,
268
+ dimensions,
269
+ namingConvention,
270
+ autoApplyTokens,
271
+ arrangeInGrid = false,
272
+ } = args;
273
+
274
+ if (!nodeId) throw new Error("variantExpander: `nodeId` is required.");
275
+
276
+ const bridge = await getBridge();
277
+
278
+ // 1. Verify the base component node exists
279
+ const baseNode = await bridge.getNode(nodeId);
280
+ if (!baseNode) throw new Error(`variantExpander: Node "${nodeId}" not found.`);
281
+
282
+ // 2. Generate all combinations
283
+ const combinations: VariantCombination[] = cartesian(dimensions).map((props) => {
284
+ const key =
285
+ namingConvention === "figma"
286
+ ? toFigmaName(props)
287
+ : toStorybookName(props);
288
+
289
+ const tokenOverrides = autoApplyTokens ? resolveTokenOverrides(props) : [];
290
+
291
+ return { key, props, tokenOverrides };
292
+ });
293
+
294
+ if (combinations.length === 0) {
295
+ throw new Error("variantExpander: No combinations generated. Check `dimensions` input.");
296
+ }
297
+
298
+ // 3. Clone and apply overrides for each combination (batched in a single execute)
299
+ let created = 0;
300
+ let failed = 0;
301
+ const clonedIds: string[] = [];
302
+
303
+ // Build a single script that creates ALL clones at once
304
+ const BATCH_SIZE = 25;
305
+ for (let batchStart = 0; batchStart < combinations.length; batchStart += BATCH_SIZE) {
306
+ const batch = combinations.slice(batchStart, batchStart + BATCH_SIZE);
307
+ const cloneLines: string[] = [];
308
+ for (const combo of batch) {
309
+ const overrideLines: string[] = [];
310
+ for (const o of combo.tokenOverrides) {
311
+ if (o.property === "opacity") {
312
+ overrideLines.push(`clone.opacity = ${o.value};`);
313
+ } else if (o.property === "characters") {
314
+ overrideLines.push(`var textNodes = clone.findAll(function(n) { return n.type === 'TEXT'; }); for (var ti = 0; ti < textNodes.length; ti++) { textNodes[ti].characters = ${JSON.stringify(o.value)}; }`);
315
+ } else if (o.property.startsWith("padding") || o.property === "strokeWeight") {
316
+ overrideLines.push(`if ('${o.property}' in clone) clone.${o.property} = ${o.value};`);
317
+ } else if (o.property === "height") {
318
+ overrideLines.push(`try { clone.resize(clone.width, ${o.value}); } catch(e) {}`);
319
+ } else if (o.property === "style.fontSize") {
320
+ overrideLines.push(`var textNodes = clone.findAll(function(n) { return n.type === 'TEXT'; }); for (var ti = 0; ti < textNodes.length; ti++) { textNodes[ti].fontSize = ${o.value}; }`);
321
+ }
322
+ }
323
+ cloneLines.push(`
324
+ try {
325
+ var clone = base.clone();
326
+ clone.name = ${JSON.stringify(combo.key)};
327
+ ${overrideLines.join("\n ")}
328
+ base.parent.appendChild(clone);
329
+ ids.push(clone.id);
330
+ } catch(e) { errors++; }
331
+ `);
332
+ }
333
+
334
+ const fontConfig = resolveFontConfig(args.fonts);
335
+ const fontLoads = generateFontLoadScript(fontConfig);
336
+
337
+ const batchScript = `
338
+ (async () => {
339
+ ${fontLoads}
340
+ var base = await figma.getNodeByIdAsync(${JSON.stringify(nodeId)});
341
+ if (!base) throw new Error('Base node not found');
342
+ var ids = [];
343
+ var errors = 0;
344
+ ${cloneLines.join("\n")}
345
+ return { ids: ids, errors: errors };
346
+ })()
347
+ `.trim();
348
+
349
+ try {
350
+ const batchResult = await bridge.execute(batchScript);
351
+ if (batchResult.success && batchResult.result) {
352
+ const { ids, errors } = batchResult.result as { ids: string[]; errors: number };
353
+ clonedIds.push(...ids);
354
+ created += ids.length;
355
+ failed += errors;
356
+ // Assign clonedNodeId back to each combo
357
+ for (let i = 0; i < batch.length && i < ids.length; i++) {
358
+ batch[i].clonedNodeId = ids[i];
359
+ }
360
+ } else {
361
+ failed += batch.length;
362
+ }
363
+ } catch {
364
+ failed += batch.length;
365
+ }
366
+ }
367
+
368
+ // 4. Group into a Component Set
369
+ let componentSetId: string | null = null;
370
+
371
+ if (clonedIds.length > 0) {
372
+ try {
373
+ const setScript = buildComponentSetScript(clonedIds);
374
+ const setResult = await bridge.execute(setScript);
375
+
376
+ if (setResult.success && setResult.result) {
377
+ componentSetId = setResult.result as string;
378
+ } else {
379
+ console.error(`variantExpander: combineAsVariants failed: ${setResult.error}`);
380
+ }
381
+ } catch (err) {
382
+ console.error("variantExpander: Exception creating component set:", err);
383
+ }
384
+ }
385
+
386
+ // 5. Arrange in grid if requested
387
+ if (arrangeInGrid && componentSetId) {
388
+ try {
389
+ // Determine a sensible column count (square-ish grid)
390
+ const cols = Math.ceil(Math.sqrt(clonedIds.length));
391
+ const gridScript = buildGridArrangeScript(componentSetId, cols);
392
+ await bridge.execute(gridScript);
393
+ } catch (err) {
394
+ console.error("variantExpander: Grid arrangement failed:", err);
395
+ }
396
+ }
397
+
398
+ // 6. Log the decision
399
+ const allTokenNames = combinations
400
+ .flatMap((c) => c.tokenOverrides.map((o) => o.property))
401
+ .filter((v, i, arr) => arr.indexOf(v) === i);
402
+
403
+ const logEntry = await decisionLog.log({
404
+ tool: "variant-expander",
405
+ nodeIds: [nodeId, ...(componentSetId ? [componentSetId] : [])],
406
+ rationale: `Expanded "${baseNode.name}" into ${combinations.length} variants (${Object.keys(dimensions).join(", ")}). Created ${created}, failed ${failed}. ComponentSet: ${componentSetId ?? "none"}.`,
407
+ tokens: allTokenNames,
408
+ reversible: true,
409
+ metadata: {
410
+ baseNodeId: nodeId,
411
+ namingConvention,
412
+ autoApplyTokens,
413
+ arrangeInGrid,
414
+ totalCombinations: combinations.length,
415
+ created,
416
+ failed,
417
+ componentSetId,
418
+ },
419
+ });
420
+
421
+ return {
422
+ totalCombinations: combinations.length,
423
+ created,
424
+ failed,
425
+ componentSetId,
426
+ combinations,
427
+ logEntryId: logEntry.id,
428
+ };
429
+ }
@@ -0,0 +1,226 @@
1
+ // ─────────────────────────────────────────────────────────────────────────────
2
+ // Token Override Maps
3
+ // Defines how token values change across variant dimensions (state, size,
4
+ // theme, type). Used by the variant-expander to apply token overrides
5
+ // when generating variant matrices.
6
+ //
7
+ // Heights on 8px grid: xs(24h), sm(32h), md(40h), lg(48h), xl(56h)
8
+ // ─────────────────────────────────────────────────────────────────────────────
9
+
10
+ export interface TokenOverride {
11
+ property: string; // e.g. "background", "opacity", "fontSize"
12
+ token: string; // design token name
13
+ rawValue?: string | number;
14
+ }
15
+
16
+ export type OverrideMap = Record<string, TokenOverride[]>;
17
+
18
+ /**
19
+ * State dimension overrides.
20
+ */
21
+ export const STATE_OVERRIDES: OverrideMap = {
22
+ default: [],
23
+ hover: [
24
+ { property: "background", token: "color/semantic/actions/primary/bg/hover" },
25
+ ],
26
+ pressed: [
27
+ { property: "background", token: "color/semantic/actions/primary/bg/pressed" },
28
+ ],
29
+ focused: [
30
+ { property: "borderColor", token: "color/semantic/border/focus" },
31
+ { property: "borderWidth", token: "border/width/strong", rawValue: 2 },
32
+ ],
33
+ disabled: [
34
+ { property: "opacity", token: "opacity/disabled", rawValue: 0.4 },
35
+ ],
36
+ loading: [
37
+ { property: "icon", token: "Spinner" },
38
+ { property: "text", token: "", rawValue: "Loading…" },
39
+ ],
40
+ error: [
41
+ { property: "borderColor", token: "color/semantic/feedback/danger/text" },
42
+ { property: "background", token: "color/semantic/feedback/danger/bg" },
43
+ ],
44
+ success: [
45
+ { property: "borderColor", token: "color/semantic/feedback/success/text" },
46
+ { property: "background", token: "color/semantic/feedback/success/bg" },
47
+ ],
48
+ warning: [
49
+ { property: "borderColor", token: "color/semantic/feedback/warning/text" },
50
+ { property: "background", token: "color/semantic/feedback/warning/bg" },
51
+ ],
52
+ active: [
53
+ { property: "background", token: "color/semantic/actions/primary/bg/pressed" },
54
+ { property: "borderColor", token: "color/semantic/border/focus" },
55
+ ],
56
+ };
57
+
58
+ /**
59
+ * Size dimension overrides.
60
+ * All heights on 8px grid: xs=24, sm=32, md=40, lg=48, xl=56
61
+ */
62
+ export const SIZE_OVERRIDES: OverrideMap = {
63
+ xs: [
64
+ { property: "paddingY", token: "space/0.5", rawValue: 2 },
65
+ { property: "paddingX", token: "space/1", rawValue: 4 },
66
+ { property: "fontSize", token: "typography/size/xs", rawValue: 12 },
67
+ { property: "height", token: "", rawValue: 24 },
68
+ ],
69
+ sm: [
70
+ { property: "paddingY", token: "space/1", rawValue: 4 },
71
+ { property: "paddingX", token: "space/2", rawValue: 8 },
72
+ { property: "fontSize", token: "typography/size/sm", rawValue: 14 },
73
+ { property: "height", token: "", rawValue: 32 },
74
+ ],
75
+ md: [
76
+ { property: "paddingY", token: "space/2", rawValue: 8 },
77
+ { property: "paddingX", token: "space/4", rawValue: 16 },
78
+ { property: "fontSize", token: "typography/size/md", rawValue: 16 },
79
+ { property: "height", token: "", rawValue: 40 },
80
+ ],
81
+ lg: [
82
+ { property: "paddingY", token: "space/4", rawValue: 16 },
83
+ { property: "paddingX", token: "space/6", rawValue: 24 },
84
+ { property: "fontSize", token: "typography/size/lg", rawValue: 18 },
85
+ { property: "height", token: "", rawValue: 48 },
86
+ ],
87
+ xl: [
88
+ { property: "paddingY", token: "space/6", rawValue: 24 },
89
+ { property: "paddingX", token: "space/8", rawValue: 32 },
90
+ { property: "fontSize", token: "typography/size/xl", rawValue: 20 },
91
+ { property: "height", token: "", rawValue: 56 },
92
+ ],
93
+ };
94
+
95
+ /**
96
+ * Theme dimension overrides.
97
+ */
98
+ export const THEME_OVERRIDES: OverrideMap = {
99
+ light: [],
100
+ dark: [
101
+ { property: "background", token: "color/semantic/surface/default" },
102
+ { property: "textColor", token: "color/semantic/text/primary" },
103
+ { property: "borderColor", token: "color/semantic/border/default" },
104
+ ],
105
+ "high-contrast": [
106
+ { property: "background", token: "color/semantic/surface/default" },
107
+ { property: "textColor", token: "color/semantic/text/primary" },
108
+ { property: "borderColor", token: "color/semantic/border/strong" },
109
+ ],
110
+ };
111
+
112
+ /**
113
+ * Type / variant-purpose dimension overrides.
114
+ */
115
+ export const TYPE_OVERRIDES: OverrideMap = {
116
+ primary: [
117
+ { property: "background", token: "color/semantic/actions/primary/bg/default" },
118
+ { property: "textColor", token: "color/semantic/text/on-color" },
119
+ ],
120
+ secondary: [
121
+ { property: "background", token: "color/semantic/actions/secondary/bg/default" },
122
+ { property: "textColor", token: "color/semantic/text/primary" },
123
+ { property: "borderColor", token: "color/semantic/actions/secondary/border/default" },
124
+ ],
125
+ ghost: [
126
+ { property: "background", token: "transparent" },
127
+ { property: "textColor", token: "color/semantic/actions/primary/bg/default" },
128
+ ],
129
+ destructive: [
130
+ { property: "background", token: "color/semantic/actions/destructive/bg/default" },
131
+ { property: "textColor", token: "color/semantic/text/on-color" },
132
+ ],
133
+ outline: [
134
+ { property: "background", token: "transparent" },
135
+ { property: "textColor", token: "color/semantic/actions/primary/bg/default" },
136
+ { property: "borderColor", token: "color/semantic/actions/primary/bg/default" },
137
+ { property: "borderWidth", token: "border/width/default", rawValue: 1.5 },
138
+ ],
139
+ link: [
140
+ { property: "background", token: "transparent" },
141
+ { property: "textColor", token: "color/semantic/actions/primary/bg/default" },
142
+ { property: "textDecoration", token: "", rawValue: "underline" },
143
+ ],
144
+ };
145
+
146
+ // ─── Concept-Aware State Overrides ──────────────────────────────────────────
147
+ // When the concept taxonomy provides additional state context, use these
148
+ // concept-specific overrides instead of the generic STATE_OVERRIDES.
149
+
150
+ import { getConceptForComponent, type ConceptDefinition } from "../../../shared/concept-taxonomy.js";
151
+
152
+ /**
153
+ * Concept-specific state overrides that supplement the generic STATE_OVERRIDES.
154
+ * Keys are concept IDs, values are state → overrides maps.
155
+ */
156
+ const CONCEPT_STATE_OVERRIDES: Record<string, OverrideMap> = {
157
+ navigation: {
158
+ visited: [
159
+ { property: "textColor", token: "color/semantic/text/secondary" },
160
+ ],
161
+ active: [
162
+ { property: "background", token: "color/semantic/actions/primary/bg/default" },
163
+ { property: "textColor", token: "color/semantic/text/on-color" },
164
+ { property: "borderColor", token: "color/semantic/border/focus" },
165
+ ],
166
+ },
167
+ field: {
168
+ error: [
169
+ { property: "borderColor", token: "color/semantic/feedback/danger/text" },
170
+ { property: "background", token: "color/semantic/field/bg/default" },
171
+ { property: "helperColor", token: "color/semantic/feedback/danger/text" },
172
+ ],
173
+ success: [
174
+ { property: "borderColor", token: "color/semantic/feedback/success/text" },
175
+ { property: "background", token: "color/semantic/field/bg/default" },
176
+ ],
177
+ },
178
+ selection: {
179
+ checked: [
180
+ { property: "background", token: "color/semantic/actions/primary/bg/default" },
181
+ { property: "iconColor", token: "color/semantic/text/on-color" },
182
+ ],
183
+ indeterminate: [
184
+ { property: "background", token: "color/semantic/actions/primary/bg/default" },
185
+ { property: "iconColor", token: "color/semantic/text/on-color" },
186
+ ],
187
+ },
188
+ toggles: {
189
+ on: [
190
+ { property: "background", token: "color/semantic/actions/primary/bg/default" },
191
+ ],
192
+ off: [
193
+ { property: "background", token: "color/semantic/surface/subtle" },
194
+ ],
195
+ },
196
+ };
197
+
198
+ /**
199
+ * Get state overrides for a component, merging concept-specific overrides
200
+ * with the generic STATE_OVERRIDES. Concept overrides take priority.
201
+ */
202
+ export function getStateOverridesForComponent(
203
+ componentType: string,
204
+ stateName: string,
205
+ ): TokenOverride[] {
206
+ const concept = getConceptForComponent(componentType);
207
+
208
+ // Check concept-specific overrides first
209
+ if (concept) {
210
+ const conceptOverrides = CONCEPT_STATE_OVERRIDES[concept.id];
211
+ if (conceptOverrides?.[stateName]) {
212
+ return conceptOverrides[stateName];
213
+ }
214
+ }
215
+
216
+ // Fall back to generic state overrides
217
+ return STATE_OVERRIDES[stateName] ?? [];
218
+ }
219
+
220
+ /** All dimension maps for convenient iteration. */
221
+ export const DIMENSION_OVERRIDES = {
222
+ state: STATE_OVERRIDES,
223
+ size: SIZE_OVERRIDES,
224
+ theme: THEME_OVERRIDES,
225
+ type: TYPE_OVERRIDES,
226
+ } as const;