@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,223 @@
1
+ /**
2
+ * divider.ts — Gold-standard design knowledge for Divider components
3
+ */
4
+ import type { ComponentKnowledge } from "../types.js";
5
+
6
+ export const dividerKnowledge: ComponentKnowledge = {
7
+ description:
8
+ "Horizontal or vertical separator line | Visually divides content sections | Supports solid, dashed, and labeled variants",
9
+
10
+ stateSpecifications: [
11
+ {
12
+ state: "Default",
13
+ visualChange: "A thin line rendered in the divider color token; no interactive feedback",
14
+ opacity: "1",
15
+ cursorWeb: "default",
16
+ usage: "Standard resting state — divider is a non-interactive decorative or semantic separator",
17
+ },
18
+ {
19
+ state: "With Label",
20
+ visualChange: "Line is split into two segments with centered text label between them; label has a background fill matching the surface",
21
+ opacity: "1",
22
+ cursorWeb: "default",
23
+ usage: "Divider carries a textual label such as 'OR', 'Section Title', or a date grouping",
24
+ },
25
+ {
26
+ state: "Decorative",
27
+ visualChange: "Identical to default visually; marked as aria-hidden for assistive technologies",
28
+ opacity: "1",
29
+ cursorWeb: "default",
30
+ usage: "Divider is purely visual — it does not represent a semantic content boundary",
31
+ },
32
+ ],
33
+
34
+ propertyDescriptions: {
35
+ orientation: "Direction of the divider line — 'horizontal' (default, full-width) or 'vertical' (full-height, used in toolbars and inline layouts)",
36
+ type: "Line style — 'solid' (continuous line) or 'dashed' (dashed/dotted pattern)",
37
+ spacing: "Vertical margin (horizontal divider) or horizontal margin (vertical divider) applied above and below/left and right; uses spacing tokens",
38
+ label: "Optional centered text rendered in the middle of the divider line; splits the line into two segments",
39
+ inset: "When true, the divider is indented from the start edge (e.g. aligned with content in a list, not full-width)",
40
+ decorative: "When true, the divider has aria-hidden='true' and is not announced by screen readers; when false, uses role='separator'",
41
+ color: "Override token for the divider line color; defaults to $divider-color",
42
+ thickness: "Line thickness in pixels; defaults to 1px; 2px for emphasis dividers",
43
+ },
44
+
45
+ sizeSpecifications: [
46
+ {
47
+ size: "Default",
48
+ height: "1px (horizontal) / 100% (vertical)",
49
+ paddingLR: "0px",
50
+ fontSize: "12px (label only)",
51
+ iconSize: "N/A",
52
+ borderRadius: "0px",
53
+ },
54
+ {
55
+ size: "Thick",
56
+ height: "2px (horizontal) / 100% (vertical)",
57
+ paddingLR: "0px",
58
+ fontSize: "12px (label only)",
59
+ iconSize: "N/A",
60
+ borderRadius: "0px",
61
+ },
62
+ {
63
+ size: "Inset",
64
+ height: "1px",
65
+ paddingLR: "16px start inset",
66
+ fontSize: "12px (label only)",
67
+ iconSize: "N/A",
68
+ borderRadius: "0px",
69
+ },
70
+ ],
71
+
72
+ designTokenBindings: [
73
+ {
74
+ property: "Line Color",
75
+ tokenName: "$divider-color",
76
+ role: "Default color for the divider line",
77
+ fallback: "#E4E7EC",
78
+ },
79
+ {
80
+ property: "Line Color Subtle",
81
+ tokenName: "$divider-color-subtle",
82
+ role: "Lighter divider for less prominent separation",
83
+ fallback: "#F2F4F7",
84
+ },
85
+ {
86
+ property: "Line Color Strong",
87
+ tokenName: "$divider-color-strong",
88
+ role: "Darker divider for high-emphasis separation",
89
+ fallback: "#D0D5DD",
90
+ },
91
+ {
92
+ property: "Label Text Color",
93
+ tokenName: "$divider-label-text",
94
+ role: "Text color for the optional centered label",
95
+ fallback: "#667085",
96
+ },
97
+ {
98
+ property: "Label Background",
99
+ tokenName: "$divider-label-bg",
100
+ role: "Background behind the label to mask the line; should match the surface color",
101
+ fallback: "#FFFFFF",
102
+ },
103
+ {
104
+ property: "Label Font Family",
105
+ tokenName: "$font-family-sans",
106
+ role: "Typeface for the optional label text",
107
+ fallback: "Inter, system-ui, sans-serif",
108
+ },
109
+ {
110
+ property: "Spacing Default",
111
+ tokenName: "$spacing-md",
112
+ role: "Default margin above and below a horizontal divider",
113
+ fallback: "16px",
114
+ },
115
+ {
116
+ property: "Spacing Compact",
117
+ tokenName: "$spacing-sm",
118
+ role: "Reduced spacing for compact layouts",
119
+ fallback: "8px",
120
+ },
121
+ {
122
+ property: "Spacing Spacious",
123
+ tokenName: "$spacing-lg",
124
+ role: "Increased spacing for major section breaks",
125
+ fallback: "24px",
126
+ },
127
+ ],
128
+
129
+ structureRules: [
130
+ "Horizontal divider is a full-width block element with a fixed height (1px or 2px) and background-color fill",
131
+ "Vertical divider is an inline or flex-item element with a fixed width (1px or 2px) and auto height matching its container",
132
+ "Label variant uses a horizontal Auto Layout with the line as two flex-grow segments and the label centered between them",
133
+ "Label text has horizontal padding ($spacing-sm) and a background fill matching the surface to create the visual gap effect",
134
+ "Inset divider has a start margin (margin-left in LTR) matching the content indentation of adjacent list items",
135
+ "Divider does not have any interactive areas — it is a purely visual or semantic element",
136
+ "In Figma, divider is a 1px-height frame with fill-container width; vertical variant is a 1px-width frame with fill-container height",
137
+ "Dashed variant uses CSS border-style:dashed or SVG stroke-dasharray for the line pattern",
138
+ ],
139
+
140
+ typeHierarchyRules: [
141
+ "Label text uses Caption size (12px) with Regular (400) weight for subtlety",
142
+ "Label text uses uppercase or sentence case depending on context — uppercase for 'OR' separators, sentence case for section titles",
143
+ "Label text color should be de-emphasized (secondary/muted) to avoid competing with surrounding content",
144
+ "Label text should never wrap — keep labels short (1-3 words maximum)",
145
+ ],
146
+
147
+ interactionRules: [
148
+ { event: "None", trigger: "N/A", action: "Dividers are non-interactive — no hover, click, focus, or keyboard events apply" },
149
+ { event: "Resize", trigger: "Parent container width/height changes", action: "Horizontal divider stretches to fill container width; vertical divider stretches to fill container height" },
150
+ { event: "Theme Change", trigger: "Light/dark mode toggle", action: "Divider color updates to the resolved value of the $divider-color token for the new theme" },
151
+ ],
152
+
153
+ contentGuidance: [
154
+ "Use dividers sparingly — whitespace alone is often sufficient to separate content sections",
155
+ "Horizontal dividers are ideal between list items, form groups, or major content sections",
156
+ "Vertical dividers work well in toolbars, header navigation, and inline element groups",
157
+ "Labeled dividers are useful for 'OR' separators in forms (e.g. between sign-in methods), date groupings in feeds, or section headers in settings",
158
+ "Inset dividers should align with the start of text content in lists, not the leading icon/avatar",
159
+ "Do not use dividers inside cards — the card boundary itself provides sufficient separation",
160
+ "Use the subtle color variant when the divider should be barely visible (e.g. within dense data tables)",
161
+ ],
162
+
163
+ responsiveBehaviour: [
164
+ { breakpoint: "Mobile (<768px)", behavior: "Full-width horizontal dividers; inset value may reduce; vertical dividers in toolbars remain" },
165
+ { breakpoint: "Tablet (768-1023px)", behavior: "Standard behavior; spacing tokens apply as specified" },
166
+ { breakpoint: "Desktop (1024-1439px)", behavior: "Standard behavior; dividers respect container max-width constraints" },
167
+ { breakpoint: "Ultra-wide (>=1440px)", behavior: "Dividers remain within content max-width; do not stretch to full viewport width" },
168
+ ],
169
+
170
+ accessibilitySpec: {
171
+ intro:
172
+ "Dividers can be semantic (representing a thematic content break) or decorative (purely visual). The correct ARIA treatment depends on the divider's purpose in context.",
173
+ requirements: [
174
+ { requirement: "Semantic Role", level: "A", notes: "Semantic dividers must use <hr> element or role='separator' to announce a content boundary to screen readers" },
175
+ { requirement: "Decorative Hiding", level: "A", notes: "Decorative dividers must have aria-hidden='true' so they are invisible to assistive technologies" },
176
+ { requirement: "Orientation", level: "A", notes: "Vertical separators must have aria-orientation='vertical' when using role='separator'" },
177
+ { requirement: "Label Accessibility", level: "A", notes: "Labeled dividers should associate the label text with the separator via aria-label or visible text" },
178
+ { requirement: "Contrast Ratio", level: "AA", notes: "Divider line must have at least 3:1 contrast against the adjacent surface (WCAG 1.4.11 non-text contrast)" },
179
+ { requirement: "Not Focusable", level: "A", notes: "Dividers must not be in the tab order — they are not interactive elements" },
180
+ ],
181
+ outro: [
182
+ "When a divider is used between sections of a page, the <hr> element is preferred as it provides native semantics without ARIA",
183
+ "Decorative dividers within a list should be treated as presentational and excluded from the list item count",
184
+ "Test with screen readers to ensure decorative dividers are truly invisible and semantic ones are announced as 'separator'",
185
+ ],
186
+ },
187
+
188
+ qaAcceptanceCriteria: [
189
+ { check: "Visual Regression", platform: "All", expectedResult: "Divider renders at correct thickness, color, and spacing for each variant" },
190
+ { check: "Horizontal Full-width", platform: "All", expectedResult: "Line spans the full container width; no gaps or overflow" },
191
+ { check: "Vertical Full-height", platform: "All", expectedResult: "Line spans the full container height in flex layouts; no collapse to 0px" },
192
+ { check: "Inset Alignment", platform: "All", expectedResult: "Inset divider aligns with text content, not leading icon/avatar" },
193
+ { check: "Label Rendering", platform: "All", expectedResult: "Label centered between two line segments; background masks the line behind the text" },
194
+ { check: "Dashed Style", platform: "All", expectedResult: "Dashed pattern renders consistently across browsers; dash length and gap are uniform" },
195
+ { check: "Spacing Tokens", platform: "All", expectedResult: "Margin above and below matches the specified spacing token value" },
196
+ { check: "Theme Switching", platform: "Web", expectedResult: "Divider color updates correctly when switching between light and dark themes" },
197
+ { check: "Semantic Role", platform: "Web", expectedResult: "Semantic dividers have <hr> or role='separator'; decorative ones have aria-hidden='true'" },
198
+ { check: "Screen Reader", platform: "Web", expectedResult: "Semantic dividers announced as 'separator'; decorative dividers not announced" },
199
+ { check: "Not Focusable", platform: "Web", expectedResult: "Divider is not reachable via Tab key navigation" },
200
+ { check: "Contrast", platform: "All", expectedResult: "Divider line passes 3:1 non-text contrast against adjacent surfaces" },
201
+ { check: "RTL Support", platform: "Web", expectedResult: "Inset direction mirrors; label position remains centered; no layout issues" },
202
+ ],
203
+
204
+ dos: [
205
+ "Use horizontal dividers to create clear visual separation between major content sections",
206
+ "Use the semantic <hr> element when the divider represents a thematic break in content",
207
+ "Use aria-hidden='true' for purely decorative dividers that have no semantic meaning",
208
+ "Match the inset value to the text indentation of adjacent content (e.g. list items with leading icons)",
209
+ "Use consistent spacing tokens above and below dividers throughout the application",
210
+ "Use the subtle color variant for dividers within dense or information-heavy layouts",
211
+ "Keep labeled dividers concise — one to three words maximum",
212
+ ],
213
+
214
+ donts: [
215
+ "Do not overuse dividers — whitespace and grouping often provide sufficient visual separation",
216
+ "Do not use dividers inside card components — the card border already provides a boundary",
217
+ "Do not use thick (2px+) dividers as a styling device — they should be used sparingly for emphasis only",
218
+ "Do not make dividers focusable or interactive — they are display-only elements",
219
+ "Do not use dividers as the sole means of grouping content — pair with headings or spacing for clarity",
220
+ "Do not change divider colors to brand colors unless the design system explicitly defines such tokens",
221
+ "Do not use full-width dividers when inset dividers would better align with the content structure",
222
+ ],
223
+ };
@@ -0,0 +1,255 @@
1
+ /**
2
+ * drawer.ts — Gold-standard design knowledge for Drawer (slide-in panel) components
3
+ */
4
+ import type { ComponentKnowledge } from "../types.js";
5
+
6
+ export const drawerKnowledge: ComponentKnowledge = {
7
+ description:
8
+ "Slide-in surface panel | Anchored to viewport edge | Secondary content or navigation container",
9
+
10
+ stateSpecifications: [
11
+ {
12
+ state: "Closed",
13
+ visualChange: "Drawer is fully off-screen; overlay is removed from the DOM or set to display:none",
14
+ opacity: "0",
15
+ cursorWeb: "default",
16
+ usage: "Default resting state — drawer content is not visible and does not block interaction",
17
+ },
18
+ {
19
+ state: "Opening",
20
+ visualChange: "Drawer slides in from the anchored edge with eased transition; overlay fades in simultaneously",
21
+ opacity: "0 → 1 (animated)",
22
+ cursorWeb: "default",
23
+ usage: "Transition state triggered by programmatic open call or user action",
24
+ },
25
+ {
26
+ state: "Open",
27
+ visualChange: "Drawer is fully visible at its target width/height; overlay covers remaining viewport area",
28
+ opacity: "1",
29
+ cursorWeb: "default",
30
+ usage: "Content is accessible and interactive; focus is trapped within the drawer",
31
+ },
32
+ {
33
+ state: "Closing",
34
+ visualChange: "Drawer slides out toward its anchored edge; overlay fades out simultaneously",
35
+ opacity: "1 → 0 (animated)",
36
+ cursorWeb: "default",
37
+ usage: "Transition state triggered by close button, Escape key, or overlay click",
38
+ },
39
+ {
40
+ state: "Focus-Within",
41
+ visualChange: "No visual change on the drawer itself; focus ring appears on the focused interactive element inside",
42
+ opacity: "1",
43
+ cursorWeb: "default",
44
+ usage: "An element inside the drawer receives keyboard focus via Tab navigation",
45
+ },
46
+ ],
47
+
48
+ propertyDescriptions: {
49
+ side: "Edge from which the drawer slides in — 'left', 'right', or 'bottom'; determines translate direction and anchor position",
50
+ size: "Width (for left/right) or height (for bottom) of the drawer panel — accepts 'small' (320px), 'medium' (480px), 'large' (640px), or custom pixel value",
51
+ title: "Heading text rendered in the drawer header; provides context for the panel content and is used as the accessible label",
52
+ showOverlay: "When true, a semi-transparent backdrop covers the viewport behind the drawer to indicate modal behavior",
53
+ closeOnOverlayClick: "When true, clicking the overlay backdrop closes the drawer; should be false for critical flows requiring explicit dismissal",
54
+ closeOnEscape: "When true, pressing the Escape key closes the drawer; standard UX expectation for modal-like surfaces",
55
+ open: "Controlled boolean that determines whether the drawer is visible; parent component manages this state",
56
+ onClose: "Callback invoked when the drawer requests closure via close button, Escape, or overlay click",
57
+ children: "React node or slot content rendered inside the drawer body area below the header",
58
+ footer: "Optional slot for action buttons (e.g. Save, Cancel) pinned to the bottom of the drawer",
59
+ },
60
+
61
+ sizeSpecifications: [
62
+ {
63
+ size: "Small",
64
+ height: "100vh",
65
+ paddingLR: "16px",
66
+ fontSize: "14px",
67
+ iconSize: "20px",
68
+ borderRadius: "0px",
69
+ },
70
+ {
71
+ size: "Medium",
72
+ height: "100vh",
73
+ paddingLR: "24px",
74
+ fontSize: "14px",
75
+ iconSize: "20px",
76
+ borderRadius: "0px",
77
+ },
78
+ {
79
+ size: "Large",
80
+ height: "100vh",
81
+ paddingLR: "32px",
82
+ fontSize: "14px",
83
+ iconSize: "20px",
84
+ borderRadius: "0px",
85
+ },
86
+ {
87
+ size: "Bottom Sheet",
88
+ height: "auto (max 80vh)",
89
+ paddingLR: "24px",
90
+ fontSize: "14px",
91
+ iconSize: "20px",
92
+ borderRadius: "12px 12px 0 0",
93
+ },
94
+ ],
95
+
96
+ designTokenBindings: [
97
+ {
98
+ property: "Background",
99
+ tokenName: "$drawer-surface-bg",
100
+ role: "Drawer panel background color",
101
+ fallback: "#FFFFFF",
102
+ },
103
+ {
104
+ property: "Overlay",
105
+ tokenName: "$overlay-bg",
106
+ role: "Semi-transparent backdrop behind the drawer",
107
+ fallback: "rgba(0, 0, 0, 0.5)",
108
+ },
109
+ {
110
+ property: "Header Text",
111
+ tokenName: "$drawer-title-color",
112
+ role: "Title text color in the drawer header",
113
+ fallback: "#101828",
114
+ },
115
+ {
116
+ property: "Border",
117
+ tokenName: "$drawer-border",
118
+ role: "Subtle border on the leading edge opposite to the anchor side",
119
+ fallback: "#E4E7EC",
120
+ },
121
+ {
122
+ property: "Shadow",
123
+ tokenName: "$shadow-drawer",
124
+ role: "Elevation shadow cast by the drawer panel onto the page content",
125
+ fallback: "-4px 0 24px rgba(0, 0, 0, 0.12)",
126
+ },
127
+ {
128
+ property: "Close Icon",
129
+ tokenName: "$icon-secondary",
130
+ role: "Color of the close (X) button icon in the header",
131
+ fallback: "#667085",
132
+ },
133
+ {
134
+ property: "Transition Duration",
135
+ tokenName: "$transition-drawer",
136
+ role: "Slide animation duration for open and close",
137
+ fallback: "300ms ease-in-out",
138
+ },
139
+ {
140
+ property: "Focus Ring",
141
+ tokenName: "$focus-ring",
142
+ role: "Keyboard focus indicator for interactive elements inside the drawer",
143
+ fallback: "0 0 0 2px #FFFFFF, 0 0 0 4px #2E90FA",
144
+ },
145
+ {
146
+ property: "Z-Index",
147
+ tokenName: "$z-drawer",
148
+ role: "Stacking order to ensure drawer sits above page content but below alerts",
149
+ fallback: "1000",
150
+ },
151
+ ],
152
+
153
+ structureRules: [
154
+ "Drawer is rendered as a fixed-position element anchored to the specified viewport edge",
155
+ "Container uses vertical Auto Layout: Header → Body (scrollable) → Footer (optional, pinned)",
156
+ "Header contains title text (left-aligned) and close button (right-aligned) in a horizontal row",
157
+ "Body area has overflow-y: auto to handle content taller than the viewport",
158
+ "Footer is sticky to the bottom and separated from the body by a subtle top border",
159
+ "Overlay is a sibling element rendered behind the drawer with position: fixed covering the full viewport",
160
+ "When side is 'bottom', the drawer anchors to the bottom edge and uses border-radius on top corners only",
161
+ "Drawer width for left/right should never exceed 90vw to prevent fully covering the trigger page",
162
+ "Scroll lock is applied to the document body when the drawer is open to prevent background scrolling",
163
+ ],
164
+
165
+ typeHierarchyRules: [
166
+ "Title uses heading level appropriate to page context (typically h2) with font-weight 600 (SemiBold)",
167
+ "Body text follows standard body typography — 14px/20px regular weight",
168
+ "Footer action buttons follow the standard button typography rules",
169
+ "Section headings within the drawer body use 12px uppercase labels or 14px SemiBold depending on DS",
170
+ ],
171
+
172
+ interactionRules: [
173
+ { event: "Open", trigger: "Programmatic call or trigger button click", action: "Drawer slides in from the anchored edge; overlay fades in; focus moves to the first focusable element or close button" },
174
+ { event: "Close (Button)", trigger: "Click/tap on close (X) button in header", action: "Drawer slides out; overlay fades out; focus returns to the element that triggered the drawer" },
175
+ { event: "Close (Escape)", trigger: "Escape key pressed while drawer is open", action: "If closeOnEscape is true, drawer closes and focus returns to trigger element" },
176
+ { event: "Close (Overlay)", trigger: "Click/tap on the overlay backdrop", action: "If closeOnOverlayClick is true, drawer closes and focus returns to trigger element" },
177
+ { event: "Tab Navigation", trigger: "Tab key while drawer is open", action: "Focus cycles through interactive elements inside the drawer — focus trap prevents escape to background" },
178
+ { event: "Swipe (Mobile)", trigger: "Horizontal swipe in the direction of the anchor edge", action: "Drawer begins closing if swipe distance exceeds threshold (50% of drawer width)" },
179
+ { event: "Scroll", trigger: "Scroll inside the drawer body", action: "Body content scrolls vertically; header and footer remain fixed" },
180
+ ],
181
+
182
+ contentGuidance: [
183
+ "Use drawers for secondary tasks that relate to the main page content — filters, settings, details panels",
184
+ "Title should clearly describe the drawer purpose: 'Filter Results', 'User Details', 'Settings'",
185
+ "Keep drawer content focused — if it requires extensive interaction, consider a full page instead",
186
+ "Footer actions should follow the button hierarchy: primary action on the right, secondary on the left",
187
+ "Avoid nesting drawers — if the content requires a sub-panel, use an accordion or inline expansion",
188
+ "Provide a visible close mechanism (X button) in addition to Escape and overlay click",
189
+ "For forms inside drawers, warn users about unsaved changes before allowing close",
190
+ ],
191
+
192
+ responsiveBehaviour: [
193
+ { breakpoint: "Mobile (<768px)", behavior: "Left/right drawers expand to full viewport width (100vw); bottom drawers remain partial height with drag handle" },
194
+ { breakpoint: "Tablet (768-1023px)", behavior: "Drawers use their configured size up to 80vw maximum; overlay is always shown" },
195
+ { breakpoint: "Desktop (1024-1439px)", behavior: "Standard drawer sizes apply; overlay can be optional for persistent/pinned drawers" },
196
+ { breakpoint: "Ultra-wide (>=1440px)", behavior: "Drawer sizes remain fixed — do not scale with viewport; consider persistent sidebar pattern instead" },
197
+ ],
198
+
199
+ accessibilitySpec: {
200
+ intro:
201
+ "Drawers function as modal dialogs anchored to viewport edges. Proper ARIA roles, focus management, and keyboard interaction are essential for screen reader and keyboard-only users.",
202
+ requirements: [
203
+ { requirement: "Role", level: "A", notes: "Drawer container must have role='dialog' and aria-modal='true' when overlay is shown" },
204
+ { requirement: "Accessible Name", level: "A", notes: "Use aria-labelledby pointing to the title element, or aria-label if no visible title" },
205
+ { requirement: "Focus Trap", level: "A", notes: "Tab and Shift+Tab must cycle within the drawer; focus must not escape to background content" },
206
+ { requirement: "Focus on Open", level: "A", notes: "On open, move focus to the first focusable element or the close button" },
207
+ { requirement: "Focus on Close", level: "A", notes: "On close, return focus to the element that triggered the drawer" },
208
+ { requirement: "Escape to Close", level: "A", notes: "Pressing Escape must close the drawer when closeOnEscape is true" },
209
+ { requirement: "Scroll Lock", level: "AA", notes: "Background content must not scroll while the drawer is open; use aria-hidden='true' on main content" },
210
+ { requirement: "Contrast", level: "AA", notes: "All text inside the drawer must meet 4.5:1 contrast ratio; close icon must meet 3:1 non-text contrast" },
211
+ { requirement: "Reduced Motion", level: "AAA", notes: "Respect prefers-reduced-motion by disabling slide animation and showing/hiding instantly" },
212
+ ],
213
+ outro: [
214
+ "Announce drawer open/close to screen readers using aria-live or by managing focus",
215
+ "Ensure the overlay is not focusable — it should only be a click target for dismissal",
216
+ "Test with VoiceOver, NVDA, and JAWS to verify focus trap and announcement behavior",
217
+ ],
218
+ },
219
+
220
+ qaAcceptanceCriteria: [
221
+ { check: "Open Animation", platform: "Web", expectedResult: "Drawer slides in from the correct edge with smooth eased transition" },
222
+ { check: "Close Animation", platform: "Web", expectedResult: "Drawer slides out toward its anchor edge; overlay fades out simultaneously" },
223
+ { check: "Overlay Click", platform: "Web", expectedResult: "Clicking overlay closes drawer when closeOnOverlayClick is true; does nothing when false" },
224
+ { check: "Escape Key", platform: "Web", expectedResult: "Pressing Escape closes drawer when closeOnEscape is true" },
225
+ { check: "Focus Trap", platform: "Web", expectedResult: "Tab cycling stays within drawer boundaries; Shift+Tab wraps to last element" },
226
+ { check: "Focus Restoration", platform: "Web", expectedResult: "Focus returns to trigger element after drawer closes" },
227
+ { check: "Scroll Lock", platform: "Web", expectedResult: "Background page does not scroll while drawer is open" },
228
+ { check: "Body Scroll", platform: "Web", expectedResult: "Long content inside drawer scrolls vertically; header/footer remain fixed" },
229
+ { check: "Side Variants", platform: "All", expectedResult: "Drawer renders correctly from left, right, and bottom edges" },
230
+ { check: "Screen Reader", platform: "Web", expectedResult: "Announces 'dialog' role, title, and interactive elements in reading order" },
231
+ { check: "Responsive Width", platform: "Mobile", expectedResult: "Drawer expands to full width on mobile viewports" },
232
+ { check: "Reduced Motion", platform: "Web", expectedResult: "Animation is disabled when prefers-reduced-motion is set" },
233
+ { check: "RTL Support", platform: "Web", expectedResult: "Left drawer becomes right drawer and vice versa in RTL locales" },
234
+ ],
235
+
236
+ dos: [
237
+ "Use drawers for contextual secondary content that relates to the current page",
238
+ "Always provide a visible close button in the drawer header",
239
+ "Return focus to the trigger element when the drawer closes",
240
+ "Implement a proper focus trap to prevent keyboard users from reaching background content",
241
+ "Use the overlay to communicate modality and provide a click-to-dismiss affordance",
242
+ "Apply scroll lock on the document body to prevent background scrolling",
243
+ "Use consistent drawer sizes across the application for visual predictability",
244
+ ],
245
+
246
+ donts: [
247
+ "Do not use drawers for primary content that should be on the main page",
248
+ "Do not nest drawers inside other drawers — use in-panel navigation instead",
249
+ "Do not omit the close button — relying solely on Escape or overlay click is insufficient",
250
+ "Do not allow background content to be interactive while the drawer is open",
251
+ "Do not use drawers for simple confirmations — use a modal dialog instead",
252
+ "Do not make drawers wider than 90% of the viewport width",
253
+ "Do not skip focus management — failing to trap focus breaks keyboard accessibility",
254
+ ],
255
+ };