@sarjallab09/figma-intelligence 1.1.0 → 1.2.1

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 (297) hide show
  1. package/README.md +69 -36
  2. package/dist/bin/cli.js +2 -0
  3. package/dist/design-bridge/bridge.js +2 -0
  4. package/dist/figma-bridge-plugin/bridge-relay.js +2 -0
  5. package/dist/figma-bridge-plugin/code.js +1 -0
  6. package/{figma-bridge-plugin → dist/figma-bridge-plugin}/package-lock.json +0 -3
  7. package/dist/figma-bridge-plugin/ui.html +4970 -0
  8. package/dist/figma-intelligence-layer/dist/index.js +2 -0
  9. package/dist/scripts/clean-existing-chunks.js +2 -0
  10. package/dist/scripts/connect-ai-tool.js +2 -0
  11. package/dist/scripts/convert-hub-pdfs.js +2 -0
  12. package/dist/scripts/figma-mcp-status.js +2 -0
  13. package/dist/scripts/register-codex-mcp.js +2 -0
  14. package/dist/scripts/test-copilot-chat.js +2 -0
  15. package/package.json +11 -8
  16. package/bin/cli.js +0 -859
  17. package/design-bridge/bridge.js +0 -196
  18. package/design-bridge/lib/assets.js +0 -367
  19. package/design-bridge/lib/prompt.js +0 -85
  20. package/design-bridge/lib/server.js +0 -66
  21. package/design-bridge/lib/stitch.js +0 -37
  22. package/design-bridge/lib/tokens.js +0 -82
  23. package/design-bridge/package-lock.json +0 -579
  24. package/figma-bridge-plugin/README.md +0 -97
  25. package/figma-bridge-plugin/anthropic-chat-runner.js +0 -192
  26. package/figma-bridge-plugin/bridge-relay.js +0 -2505
  27. package/figma-bridge-plugin/chat-runner.js +0 -485
  28. package/figma-bridge-plugin/code.js +0 -1534
  29. package/figma-bridge-plugin/codex-runner.js +0 -505
  30. package/figma-bridge-plugin/component-schemas.js +0 -110
  31. package/figma-bridge-plugin/content-context.js +0 -869
  32. package/figma-bridge-plugin/create-button.js +0 -216
  33. package/figma-bridge-plugin/gemini-cli-runner.js +0 -291
  34. package/figma-bridge-plugin/gemini-runner.js +0 -187
  35. package/figma-bridge-plugin/html-to-figma.js +0 -927
  36. package/figma-bridge-plugin/knowledge-hub/.gitkeep +0 -0
  37. package/figma-bridge-plugin/knowledge-hub/uspec-references/anatomy-spec.md +0 -159
  38. package/figma-bridge-plugin/knowledge-hub/uspec-references/api-spec.md +0 -162
  39. package/figma-bridge-plugin/knowledge-hub/uspec-references/color-spec.md +0 -148
  40. package/figma-bridge-plugin/knowledge-hub/uspec-references/full-spec-template.md +0 -314
  41. package/figma-bridge-plugin/knowledge-hub/uspec-references/property-spec.md +0 -175
  42. package/figma-bridge-plugin/knowledge-hub/uspec-references/screen-reader-spec.md +0 -180
  43. package/figma-bridge-plugin/knowledge-hub/uspec-references/structure-spec.md +0 -165
  44. package/figma-bridge-plugin/perplexity-runner.js +0 -188
  45. package/figma-bridge-plugin/references/SKILL.md +0 -178
  46. package/figma-bridge-plugin/references/anatomy-spec.md +0 -159
  47. package/figma-bridge-plugin/references/api-spec.md +0 -162
  48. package/figma-bridge-plugin/references/color-spec.md +0 -148
  49. package/figma-bridge-plugin/references/full-spec-template.md +0 -314
  50. package/figma-bridge-plugin/references/property-spec.md +0 -175
  51. package/figma-bridge-plugin/references/screen-reader-spec.md +0 -180
  52. package/figma-bridge-plugin/references/structure-spec.md +0 -165
  53. package/figma-bridge-plugin/shared-prompt-config.js +0 -645
  54. package/figma-bridge-plugin/spec-helpers/build-table.js +0 -269
  55. package/figma-bridge-plugin/spec-helpers/classify-elements.js +0 -189
  56. package/figma-bridge-plugin/spec-helpers/index.js +0 -35
  57. package/figma-bridge-plugin/spec-helpers/parse-figma-link.js +0 -49
  58. package/figma-bridge-plugin/spec-helpers/position-markers.js +0 -158
  59. package/figma-bridge-plugin/stitch-auth.js +0 -322
  60. package/figma-bridge-plugin/stitch-runner.js +0 -1427
  61. package/figma-bridge-plugin/token-resolver.js +0 -107
  62. package/figma-bridge-plugin/ui.html +0 -4542
  63. package/figma-intelligence-layer/.env.example +0 -39
  64. package/figma-intelligence-layer/docs/local-image-generation.md +0 -60
  65. package/figma-intelligence-layer/examples/comfyui-workflow-template.example.json +0 -101
  66. package/figma-intelligence-layer/jest.config.js +0 -14
  67. package/figma-intelligence-layer/mcp-config.json +0 -19
  68. package/figma-intelligence-layer/package-lock.json +0 -5892
  69. package/figma-intelligence-layer/scripts/setup-comfyui-local.sh +0 -67
  70. package/figma-intelligence-layer/scripts/start-comfyui.sh +0 -33
  71. package/figma-intelligence-layer/src/index.ts +0 -2233
  72. package/figma-intelligence-layer/src/shared/auto-layout-validator.ts +0 -404
  73. package/figma-intelligence-layer/src/shared/cache.ts +0 -187
  74. package/figma-intelligence-layer/src/shared/color-operations.ts +0 -533
  75. package/figma-intelligence-layer/src/shared/color-utils.ts +0 -138
  76. package/figma-intelligence-layer/src/shared/component-script-builder.ts +0 -413
  77. package/figma-intelligence-layer/src/shared/component-templates.ts +0 -2767
  78. package/figma-intelligence-layer/src/shared/concept-taxonomy.ts +0 -694
  79. package/figma-intelligence-layer/src/shared/decision-log.ts +0 -128
  80. package/figma-intelligence-layer/src/shared/design-system-context.ts +0 -568
  81. package/figma-intelligence-layer/src/shared/design-system-intelligence.ts +0 -131
  82. package/figma-intelligence-layer/src/shared/design-system-matcher.ts +0 -184
  83. package/figma-intelligence-layer/src/shared/design-system-normalizers.ts +0 -196
  84. package/figma-intelligence-layer/src/shared/design-system-tokens.ts +0 -295
  85. package/figma-intelligence-layer/src/shared/dtcg-validator.ts +0 -530
  86. package/figma-intelligence-layer/src/shared/enrichment-pipeline.ts +0 -671
  87. package/figma-intelligence-layer/src/shared/figma-bridge.ts +0 -1418
  88. package/figma-intelligence-layer/src/shared/font-config.ts +0 -126
  89. package/figma-intelligence-layer/src/shared/icon-catalog.ts +0 -360
  90. package/figma-intelligence-layer/src/shared/icon-fetch.ts +0 -80
  91. package/figma-intelligence-layer/src/shared/prototype-script-builder.ts +0 -162
  92. package/figma-intelligence-layer/src/shared/response-compression.ts +0 -440
  93. package/figma-intelligence-layer/src/shared/semantic-token-catalog.ts +0 -324
  94. package/figma-intelligence-layer/src/shared/token-binder.ts +0 -505
  95. package/figma-intelligence-layer/src/shared/token-math.ts +0 -427
  96. package/figma-intelligence-layer/src/shared/token-naming.ts +0 -468
  97. package/figma-intelligence-layer/src/shared/token-utils.ts +0 -420
  98. package/figma-intelligence-layer/src/shared/types.ts +0 -346
  99. package/figma-intelligence-layer/src/shared/typography-presets.ts +0 -94
  100. package/figma-intelligence-layer/src/shared/unsplash.ts +0 -165
  101. package/figma-intelligence-layer/src/shared/vision-client.ts +0 -607
  102. package/figma-intelligence-layer/src/shared/vision-provider-anthropic.ts +0 -334
  103. package/figma-intelligence-layer/src/shared/vision-provider-openai.ts +0 -446
  104. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotate-handler.ts +0 -782
  105. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotate-renderer.ts +0 -496
  106. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotation-kit.ts +0 -230
  107. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/colorblind-sim.ts +0 -66
  108. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/index.ts +0 -810
  109. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-analyzer.ts +0 -1191
  110. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-figma-page.ts +0 -1346
  111. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-handler.ts +0 -148
  112. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/vpat-figma-page.ts +0 -499
  113. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/vpat-report.ts +0 -910
  114. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/wcag-checker.ts +0 -989
  115. package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/wcag-criteria.ts +0 -1160
  116. package/figma-intelligence-layer/src/tools/phase1-vision/design-from-ref/index.ts +0 -424
  117. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/component-recognizer.ts +0 -38
  118. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/ds-matcher.ts +0 -111
  119. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/font-matcher.ts +0 -114
  120. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/icon-resolver.ts +0 -103
  121. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/index.ts +0 -1060
  122. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/layout-segmenter.ts +0 -18
  123. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/token-inferencer.ts +0 -39
  124. package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/vision-pipeline.ts +0 -58
  125. package/figma-intelligence-layer/src/tools/phase1-vision/sketch-to-design/index.ts +0 -298
  126. package/figma-intelligence-layer/src/tools/phase1-vision/visual-audit/index.ts +0 -197
  127. package/figma-intelligence-layer/src/tools/phase2-accuracy/component-audit/index.ts +0 -494
  128. package/figma-intelligence-layer/src/tools/phase2-accuracy/intent-translator/index.ts +0 -356
  129. package/figma-intelligence-layer/src/tools/phase2-accuracy/layout-intelligence/container-patterns.ts +0 -123
  130. package/figma-intelligence-layer/src/tools/phase2-accuracy/layout-intelligence/index.ts +0 -663
  131. package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/built-in-rules.yaml +0 -56
  132. package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/index.ts +0 -614
  133. package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/rule-engine.ts +0 -113
  134. package/figma-intelligence-layer/src/tools/phase2-accuracy/theme-generator/color-theory.ts +0 -178
  135. package/figma-intelligence-layer/src/tools/phase2-accuracy/theme-generator/index.ts +0 -470
  136. package/figma-intelligence-layer/src/tools/phase2-accuracy/variant-expander/index.ts +0 -429
  137. package/figma-intelligence-layer/src/tools/phase2-accuracy/variant-expander/token-override-maps.ts +0 -226
  138. package/figma-intelligence-layer/src/tools/phase3-generation/ai-image-insert/index.ts +0 -535
  139. package/figma-intelligence-layer/src/tools/phase3-generation/component-archaeologist/index.ts +0 -660
  140. package/figma-intelligence-layer/src/tools/phase3-generation/component-archaeologist/pattern-fingerprints.ts +0 -209
  141. package/figma-intelligence-layer/src/tools/phase3-generation/composition-builder/index.ts +0 -540
  142. package/figma-intelligence-layer/src/tools/phase3-generation/figma-animated-build.ts +0 -391
  143. package/figma-intelligence-layer/src/tools/phase3-generation/page-architect/index.ts +0 -2019
  144. package/figma-intelligence-layer/src/tools/phase3-generation/page-architect/screen-templates.ts +0 -131
  145. package/figma-intelligence-layer/src/tools/phase3-generation/prototype-map/index.ts +0 -381
  146. package/figma-intelligence-layer/src/tools/phase3-generation/prototype-wire/index.ts +0 -565
  147. package/figma-intelligence-layer/src/tools/phase3-generation/swarm-build/index.ts +0 -764
  148. package/figma-intelligence-layer/src/tools/phase3-generation/system-drift/index.ts +0 -535
  149. package/figma-intelligence-layer/src/tools/phase3-generation/unsplash-search/index.ts +0 -84
  150. package/figma-intelligence-layer/src/tools/phase3-generation/url-to-frame/index.ts +0 -401
  151. package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/css-animations.ts +0 -68
  152. package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/framer-motion.ts +0 -78
  153. package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/swift-animations.ts +0 -93
  154. package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/index.ts +0 -596
  155. package/figma-intelligence-layer/src/tools/phase4-sync/ci-check/index.ts +0 -462
  156. package/figma-intelligence-layer/src/tools/phase4-sync/export-tokens/index.ts +0 -1470
  157. package/figma-intelligence-layer/src/tools/phase4-sync/generate-component-code/index.ts +0 -829
  158. package/figma-intelligence-layer/src/tools/phase4-sync/handoff-spec/index.ts +0 -702
  159. package/figma-intelligence-layer/src/tools/phase4-sync/icon-library-sync/index.ts +0 -483
  160. package/figma-intelligence-layer/src/tools/phase4-sync/sync-from-code/index.ts +0 -501
  161. package/figma-intelligence-layer/src/tools/phase4-sync/sync-from-code/storybook-parser.ts +0 -106
  162. package/figma-intelligence-layer/src/tools/phase4-sync/watch-docs/index.ts +0 -676
  163. package/figma-intelligence-layer/src/tools/phase4-sync/webhook-listener/index.ts +0 -560
  164. package/figma-intelligence-layer/src/tools/phase5-governance/apg-doc/index.ts +0 -1043
  165. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/component-detection.ts +0 -620
  166. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/anatomy.ts +0 -331
  167. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/color-tokens.ts +0 -77
  168. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/properties.ts +0 -54
  169. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/snapshot.ts +0 -287
  170. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/spacing.ts +0 -71
  171. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/states.ts +0 -43
  172. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/typography.ts +0 -71
  173. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/index.ts +0 -221
  174. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/_default.ts +0 -166
  175. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/accordion.ts +0 -232
  176. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/alert.ts +0 -234
  177. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/avatar-group.ts +0 -270
  178. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/avatar.ts +0 -249
  179. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/badge.ts +0 -231
  180. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/banner.ts +0 -293
  181. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/breadcrumb.ts +0 -240
  182. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/button.ts +0 -243
  183. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/calendar.ts +0 -307
  184. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/card.ts +0 -143
  185. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/checkbox.ts +0 -227
  186. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/chip.ts +0 -233
  187. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/combobox.ts +0 -282
  188. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/datepicker.ts +0 -276
  189. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/divider.ts +0 -223
  190. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/drawer.ts +0 -255
  191. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/dropdown-menu.ts +0 -289
  192. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/empty-state.ts +0 -261
  193. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/file-uploader.ts +0 -290
  194. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/form.ts +0 -265
  195. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/grid.ts +0 -238
  196. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/icon.ts +0 -255
  197. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/index.ts +0 -128
  198. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/inline-edit.ts +0 -286
  199. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/inline-message.ts +0 -255
  200. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/input.ts +0 -330
  201. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/link.ts +0 -247
  202. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/list.ts +0 -250
  203. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/menu.ts +0 -247
  204. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/modal.ts +0 -144
  205. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/navbar.ts +0 -264
  206. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/navigation.ts +0 -251
  207. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/number-input.ts +0 -261
  208. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/pagination.ts +0 -248
  209. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/popover.ts +0 -270
  210. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/progress.ts +0 -251
  211. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/radio.ts +0 -142
  212. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/range-slider.ts +0 -282
  213. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/rating.ts +0 -250
  214. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/search.ts +0 -258
  215. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/segmented-control.ts +0 -265
  216. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/select.ts +0 -319
  217. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/skeleton.ts +0 -256
  218. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/slider.ts +0 -232
  219. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/spinner.ts +0 -239
  220. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/status-dot.ts +0 -252
  221. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/stepper.ts +0 -270
  222. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/table.ts +0 -244
  223. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tabs.ts +0 -143
  224. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tag.ts +0 -243
  225. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/textarea.ts +0 -259
  226. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/time-picker.ts +0 -293
  227. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toast.ts +0 -144
  228. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toggle.ts +0 -289
  229. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toolbar.ts +0 -267
  230. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tooltip.ts +0 -232
  231. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/treeview.ts +0 -257
  232. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/typography.ts +0 -319
  233. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/legacy-compat.ts +0 -121
  234. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/anatomy-diagram.ts +0 -430
  235. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/figma-page.ts +0 -312
  236. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/json.ts +0 -129
  237. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/markdown.ts +0 -78
  238. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/visual-doc.ts +0 -2333
  239. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/accessibility.ts +0 -100
  240. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/anatomy.ts +0 -32
  241. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/color-tokens.ts +0 -59
  242. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/content-guidance.ts +0 -18
  243. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/design-tokens.ts +0 -53
  244. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/interaction-rules.ts +0 -19
  245. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/overview.ts +0 -91
  246. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/properties-api.ts +0 -71
  247. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/qa-criteria.ts +0 -19
  248. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/related-components.ts +0 -110
  249. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/responsive.ts +0 -19
  250. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/size-specs.ts +0 -67
  251. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/spacing-structure.ts +0 -58
  252. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/state-specs.ts +0 -79
  253. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/states.ts +0 -50
  254. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/type-hierarchy.ts +0 -33
  255. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/typography.ts +0 -55
  256. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/usage-guidelines.ts +0 -73
  257. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/variants.ts +0 -81
  258. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/types.ts +0 -409
  259. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/index.ts +0 -198
  260. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/renderer.ts +0 -701
  261. package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/types.ts +0 -88
  262. package/figma-intelligence-layer/src/tools/phase5-governance/decision-log/index.ts +0 -135
  263. package/figma-intelligence-layer/src/tools/phase5-governance/design-decision-log/index.ts +0 -491
  264. package/figma-intelligence-layer/src/tools/phase5-governance/ds-primitives/index.ts +0 -416
  265. package/figma-intelligence-layer/src/tools/phase5-governance/ds-scaffolder/index.ts +0 -722
  266. package/figma-intelligence-layer/src/tools/phase5-governance/ds-variables/index.ts +0 -449
  267. package/figma-intelligence-layer/src/tools/phase5-governance/health-report/index.ts +0 -393
  268. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/index.ts +0 -406
  269. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/figma-page.ts +0 -292
  270. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/json.ts +0 -24
  271. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/markdown.ts +0 -172
  272. package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/naming-guide.ts +0 -409
  273. package/figma-intelligence-layer/src/tools/phase5-governance/token-analytics/index.ts +0 -594
  274. package/figma-intelligence-layer/src/tools/phase5-governance/token-docs/index.ts +0 -710
  275. package/figma-intelligence-layer/src/tools/phase5-governance/token-migrate/index.ts +0 -458
  276. package/figma-intelligence-layer/src/tools/phase5-governance/token-naming/index.ts +0 -134
  277. package/figma-intelligence-layer/tests/apg-doc.test.ts +0 -101
  278. package/figma-intelligence-layer/tests/design-system-context.test.ts +0 -152
  279. package/figma-intelligence-layer/tests/design-system-matcher.test.ts +0 -144
  280. package/figma-intelligence-layer/tests/figma-bridge.test.ts +0 -83
  281. package/figma-intelligence-layer/tests/generate-image-and-insert.test.ts +0 -56
  282. package/figma-intelligence-layer/tests/screen-cloner-regression.test.ts +0 -69
  283. package/figma-intelligence-layer/tests/smoke.test.ts +0 -174
  284. package/figma-intelligence-layer/tests/spec-generator.test.ts +0 -127
  285. package/figma-intelligence-layer/tests/token-migrate.test.ts +0 -21
  286. package/figma-intelligence-layer/tests/token-naming.test.ts +0 -30
  287. package/figma-intelligence-layer/tsconfig.json +0 -19
  288. package/scripts/clean-existing-chunks.js +0 -179
  289. package/scripts/connect-ai-tool.js +0 -490
  290. package/scripts/convert-hub-pdfs.js +0 -425
  291. package/scripts/figma-mcp-status.js +0 -349
  292. package/scripts/register-codex-mcp.js +0 -96
  293. /package/{design-bridge → dist/design-bridge}/.env.example +0 -0
  294. /package/{design-bridge → dist/design-bridge}/package.json +0 -0
  295. /package/{figma-bridge-plugin → dist/figma-bridge-plugin}/manifest.json +0 -0
  296. /package/{figma-bridge-plugin → dist/figma-bridge-plugin}/package.json +0 -0
  297. /package/{figma-intelligence-layer → dist/figma-intelligence-layer}/package.json +0 -0
@@ -1,1160 +0,0 @@
1
- // ─────────────────────────────────────────────────────────────────────────────
2
- // WCAG 2.2 Success Criteria Registry
3
- // Pure data module – every SC with metadata for audit classification.
4
- // ─────────────────────────────────────────────────────────────────────────────
5
-
6
- export type WCAGLevel = "A" | "AA" | "AAA";
7
-
8
- export type CheckCapability =
9
- | "automated" // Tool can fully check from Figma node data
10
- | "heuristic" // Tool can partially check / flag likely issues
11
- | "manual"; // Cannot be checked; provide guidance only
12
-
13
- export type ConformanceStatus =
14
- | "Supports"
15
- | "Partially Supports"
16
- | "Does Not Support"
17
- | "Not Applicable"
18
- | "Not Evaluated";
19
-
20
- export type WCAGPrinciple =
21
- | "Perceivable"
22
- | "Operable"
23
- | "Understandable"
24
- | "Robust";
25
-
26
- export interface WCAGCriterionDef {
27
- id: string;
28
- name: string;
29
- level: WCAGLevel;
30
- principle: WCAGPrinciple;
31
- guideline: string;
32
- checkCapability: CheckCapability;
33
- figmaRelevance: string;
34
- manualGuidance: string;
35
- checkerFnName?: string;
36
- }
37
-
38
- // ─────────────────────────────────────────────────────────────────────────────
39
- // Full registry – WCAG 2.2 (4.1.1 Parsing removed per WCAG 2.2)
40
- // ─────────────────────────────────────────────────────────────────────────────
41
-
42
- export const WCAG_CRITERIA: WCAGCriterionDef[] = [
43
- // ═══════════════════════════════════════════════════════════════════════════
44
- // PRINCIPLE 1 – PERCEIVABLE
45
- // ═══════════════════════════════════════════════════════════════════════════
46
-
47
- // ── 1.1 Text Alternatives ──────────────────────────────────────────────────
48
- {
49
- id: "1.1.1",
50
- name: "Non-text Content",
51
- level: "A",
52
- principle: "Perceivable",
53
- guideline: "1.1 Text Alternatives",
54
- checkCapability: "heuristic",
55
- figmaRelevance:
56
- "Can detect IMAGE/VECTOR nodes without description property or nearby text label",
57
- manualGuidance:
58
- "Verify all non-text content (images, icons, charts) has text alternatives that serve the equivalent purpose. Decorative images should be marked as such.",
59
- checkerFnName: "checkNonTextContent",
60
- },
61
-
62
- // ── 1.2 Time-based Media ──────────────────────────────────────────────────
63
- {
64
- id: "1.2.1",
65
- name: "Audio-only and Video-only (Prerecorded)",
66
- level: "A",
67
- principle: "Perceivable",
68
- guideline: "1.2 Time-based Media",
69
- checkCapability: "manual",
70
- figmaRelevance:
71
- "Static Figma designs do not contain time-based media",
72
- manualGuidance:
73
- "If the final product includes prerecorded audio-only or video-only content, provide an alternative such as a transcript or audio description.",
74
- },
75
- {
76
- id: "1.2.2",
77
- name: "Captions (Prerecorded)",
78
- level: "A",
79
- principle: "Perceivable",
80
- guideline: "1.2 Time-based Media",
81
- checkCapability: "manual",
82
- figmaRelevance:
83
- "Static Figma designs do not contain time-based media",
84
- manualGuidance:
85
- "Ensure all prerecorded video with audio includes synchronised captions.",
86
- },
87
- {
88
- id: "1.2.3",
89
- name: "Audio Description or Media Alternative (Prerecorded)",
90
- level: "A",
91
- principle: "Perceivable",
92
- guideline: "1.2 Time-based Media",
93
- checkCapability: "manual",
94
- figmaRelevance:
95
- "Static Figma designs do not contain time-based media",
96
- manualGuidance:
97
- "Provide audio description or a full text alternative for prerecorded video content.",
98
- },
99
- {
100
- id: "1.2.4",
101
- name: "Captions (Live)",
102
- level: "AA",
103
- principle: "Perceivable",
104
- guideline: "1.2 Time-based Media",
105
- checkCapability: "manual",
106
- figmaRelevance:
107
- "Static Figma designs do not contain live media",
108
- manualGuidance:
109
- "Ensure live video with audio has real-time captions.",
110
- },
111
- {
112
- id: "1.2.5",
113
- name: "Audio Description (Prerecorded)",
114
- level: "AA",
115
- principle: "Perceivable",
116
- guideline: "1.2 Time-based Media",
117
- checkCapability: "manual",
118
- figmaRelevance:
119
- "Static Figma designs do not contain time-based media",
120
- manualGuidance:
121
- "Provide audio description for all prerecorded video content.",
122
- },
123
- {
124
- id: "1.2.6",
125
- name: "Sign Language (Prerecorded)",
126
- level: "AAA",
127
- principle: "Perceivable",
128
- guideline: "1.2 Time-based Media",
129
- checkCapability: "manual",
130
- figmaRelevance:
131
- "Static Figma designs do not contain time-based media",
132
- manualGuidance:
133
- "Provide sign language interpretation for all prerecorded audio content.",
134
- },
135
- {
136
- id: "1.2.7",
137
- name: "Extended Audio Description (Prerecorded)",
138
- level: "AAA",
139
- principle: "Perceivable",
140
- guideline: "1.2 Time-based Media",
141
- checkCapability: "manual",
142
- figmaRelevance:
143
- "Static Figma designs do not contain time-based media",
144
- manualGuidance:
145
- "Where pauses in foreground audio are insufficient, provide extended audio description for prerecorded video.",
146
- },
147
- {
148
- id: "1.2.8",
149
- name: "Media Alternative (Prerecorded)",
150
- level: "AAA",
151
- principle: "Perceivable",
152
- guideline: "1.2 Time-based Media",
153
- checkCapability: "manual",
154
- figmaRelevance:
155
- "Static Figma designs do not contain time-based media",
156
- manualGuidance:
157
- "Provide a full text alternative for all prerecorded synchronised media and video-only content.",
158
- },
159
- {
160
- id: "1.2.9",
161
- name: "Audio-only (Live)",
162
- level: "AAA",
163
- principle: "Perceivable",
164
- guideline: "1.2 Time-based Media",
165
- checkCapability: "manual",
166
- figmaRelevance:
167
- "Static Figma designs do not contain live media",
168
- manualGuidance:
169
- "Provide a text alternative for live audio-only content.",
170
- },
171
-
172
- // ── 1.3 Adaptable ─────────────────────────────────────────────────────────
173
- {
174
- id: "1.3.1",
175
- name: "Info and Relationships",
176
- level: "A",
177
- principle: "Perceivable",
178
- guideline: "1.3 Adaptable",
179
- checkCapability: "heuristic",
180
- figmaRelevance:
181
- "Can infer heading hierarchy from font size/weight and auto-layout grouping",
182
- manualGuidance:
183
- "Ensure information, structure, and relationships conveyed through presentation can be programmatically determined. Use proper heading levels, lists, and table markup.",
184
- checkerFnName: "checkInfoAndRelationships",
185
- },
186
- {
187
- id: "1.3.2",
188
- name: "Meaningful Sequence",
189
- level: "A",
190
- principle: "Perceivable",
191
- guideline: "1.3 Adaptable",
192
- checkCapability: "heuristic",
193
- figmaRelevance:
194
- "Can compare Figma node tree order against visual layout position",
195
- manualGuidance:
196
- "Ensure the reading and navigation order is logical and intuitive. The DOM order should match the visual presentation order.",
197
- checkerFnName: "checkMeaningfulSequence",
198
- },
199
- {
200
- id: "1.3.3",
201
- name: "Sensory Characteristics",
202
- level: "A",
203
- principle: "Perceivable",
204
- guideline: "1.3 Adaptable",
205
- checkCapability: "manual",
206
- figmaRelevance:
207
- "Would require NLP on text content to detect shape/location-only references",
208
- manualGuidance:
209
- "Instructions must not rely solely on sensory characteristics like shape, colour, size, visual location, orientation, or sound. Provide text labels alongside visual cues.",
210
- },
211
- {
212
- id: "1.3.4",
213
- name: "Orientation",
214
- level: "AA",
215
- principle: "Perceivable",
216
- guideline: "1.3 Adaptable",
217
- checkCapability: "heuristic",
218
- figmaRelevance:
219
- "Can check if designs include both portrait and landscape variants",
220
- manualGuidance:
221
- "Content must not restrict its view and operation to a single display orientation unless essential.",
222
- checkerFnName: "checkOrientation",
223
- },
224
- {
225
- id: "1.3.5",
226
- name: "Identify Input Purpose",
227
- level: "AA",
228
- principle: "Perceivable",
229
- guideline: "1.3 Adaptable",
230
- checkCapability: "heuristic",
231
- figmaRelevance:
232
- "Can check input component names for autocomplete-purpose hints (name, email, tel)",
233
- manualGuidance:
234
- "The purpose of each input field collecting user information can be programmatically determined using autocomplete attributes.",
235
- checkerFnName: "checkIdentifyInputPurpose",
236
- },
237
- {
238
- id: "1.3.6",
239
- name: "Identify Purpose",
240
- level: "AAA",
241
- principle: "Perceivable",
242
- guideline: "1.3 Adaptable",
243
- checkCapability: "manual",
244
- figmaRelevance:
245
- "Requires semantic role mapping beyond Figma's data model",
246
- manualGuidance:
247
- "The purpose of UI components, icons, and regions can be programmatically determined through ARIA landmarks and roles.",
248
- },
249
-
250
- // ── 1.4 Distinguishable ───────────────────────────────────────────────────
251
- {
252
- id: "1.4.1",
253
- name: "Use of Color",
254
- level: "A",
255
- principle: "Perceivable",
256
- guideline: "1.4 Distinguishable",
257
- checkCapability: "heuristic",
258
- figmaRelevance:
259
- "Can detect component variants where the only difference is fill color (no icon/text/shape change)",
260
- manualGuidance:
261
- "Colour must not be the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Add icons, text, or patterns.",
262
- checkerFnName: "checkUseOfColor",
263
- },
264
- {
265
- id: "1.4.2",
266
- name: "Audio Control",
267
- level: "A",
268
- principle: "Perceivable",
269
- guideline: "1.4 Distinguishable",
270
- checkCapability: "manual",
271
- figmaRelevance:
272
- "Static designs do not contain audio; not applicable in Figma context",
273
- manualGuidance:
274
- "If any audio plays automatically for more than 3 seconds, provide a mechanism to pause, stop, or control the volume.",
275
- },
276
- {
277
- id: "1.4.3",
278
- name: "Contrast (Minimum)",
279
- level: "AA",
280
- principle: "Perceivable",
281
- guideline: "1.4 Distinguishable",
282
- checkCapability: "automated",
283
- figmaRelevance:
284
- "Computes foreground/background contrast ratio for all text nodes",
285
- manualGuidance:
286
- "Text must have a contrast ratio of at least 4.5:1 (normal text) or 3:1 (large text, 18px+ or 14px bold+).",
287
- checkerFnName: "checkTextContrast",
288
- },
289
- {
290
- id: "1.4.4",
291
- name: "Resize Text",
292
- level: "AA",
293
- principle: "Perceivable",
294
- guideline: "1.4 Distinguishable",
295
- checkCapability: "automated",
296
- figmaRelevance:
297
- "Detects frames with fixed height containing text children that may clip on resize",
298
- manualGuidance:
299
- "Text can be resized up to 200% without loss of content or functionality. Avoid fixed-height containers for text.",
300
- checkerFnName: "checkFixedHeightTextContainer",
301
- },
302
- {
303
- id: "1.4.5",
304
- name: "Images of Text",
305
- level: "AA",
306
- principle: "Perceivable",
307
- guideline: "1.4 Distinguishable",
308
- checkCapability: "heuristic",
309
- figmaRelevance:
310
- "Can detect rasterised text by finding IMAGE fills on nodes with text-like names",
311
- manualGuidance:
312
- "Use real text instead of images of text. If images of text are used, they should be customisable or essential.",
313
- checkerFnName: "checkImagesOfText",
314
- },
315
- {
316
- id: "1.4.6",
317
- name: "Contrast (Enhanced)",
318
- level: "AAA",
319
- principle: "Perceivable",
320
- guideline: "1.4 Distinguishable",
321
- checkCapability: "automated",
322
- figmaRelevance:
323
- "Same as 1.4.3 but with 7:1 normal / 4.5:1 large thresholds",
324
- manualGuidance:
325
- "Text must have a contrast ratio of at least 7:1 (normal text) or 4.5:1 (large text).",
326
- checkerFnName: "checkTextContrast",
327
- },
328
- {
329
- id: "1.4.7",
330
- name: "Low or No Background Audio",
331
- level: "AAA",
332
- principle: "Perceivable",
333
- guideline: "1.4 Distinguishable",
334
- checkCapability: "manual",
335
- figmaRelevance:
336
- "Static designs do not contain audio",
337
- manualGuidance:
338
- "Prerecorded audio-only content that primarily contains speech has no or very low background sounds.",
339
- },
340
- {
341
- id: "1.4.8",
342
- name: "Visual Presentation",
343
- level: "AAA",
344
- principle: "Perceivable",
345
- guideline: "1.4 Distinguishable",
346
- checkCapability: "heuristic",
347
- figmaRelevance:
348
- "Can check text width, line spacing, and foreground/background colour selection",
349
- manualGuidance:
350
- "For blocks of text: foreground and background colours can be selected; width is no more than 80 characters; text is not justified; line spacing is at least 1.5x; paragraphs have at least 2x spacing.",
351
- checkerFnName: "checkTextSpacing",
352
- },
353
- {
354
- id: "1.4.9",
355
- name: "Images of Text (No Exception)",
356
- level: "AAA",
357
- principle: "Perceivable",
358
- guideline: "1.4 Distinguishable",
359
- checkCapability: "heuristic",
360
- figmaRelevance:
361
- "Same heuristic as 1.4.5 but stricter (no exceptions)",
362
- manualGuidance:
363
- "Images of text are only used for pure decoration or where a particular presentation of text is essential.",
364
- checkerFnName: "checkImagesOfText",
365
- },
366
- {
367
- id: "1.4.10",
368
- name: "Reflow",
369
- level: "AA",
370
- principle: "Perceivable",
371
- guideline: "1.4 Distinguishable",
372
- checkCapability: "heuristic",
373
- figmaRelevance:
374
- "Can check auto-layout usage and constraint-based responsiveness on frames",
375
- manualGuidance:
376
- "Content can be presented without loss of information or functionality, and without scrolling in two dimensions, at 320 CSS px wide (for vertical scrolling) or 256 CSS px tall (for horizontal).",
377
- checkerFnName: "checkReflow",
378
- },
379
- {
380
- id: "1.4.11",
381
- name: "Non-text Contrast",
382
- level: "AA",
383
- principle: "Perceivable",
384
- guideline: "1.4 Distinguishable",
385
- checkCapability: "automated",
386
- figmaRelevance:
387
- "Can check stroke/border and icon fill contrast against background at 3:1 minimum",
388
- manualGuidance:
389
- "UI components and graphical objects must have a contrast ratio of at least 3:1 against adjacent colours.",
390
- checkerFnName: "checkNonTextContrast",
391
- },
392
- {
393
- id: "1.4.12",
394
- name: "Text Spacing",
395
- level: "AA",
396
- principle: "Perceivable",
397
- guideline: "1.4 Distinguishable",
398
- checkCapability: "automated",
399
- figmaRelevance:
400
- "Can check lineHeight, letterSpacing, and paragraphSpacing on text nodes",
401
- manualGuidance:
402
- "No loss of content when: line height >= 1.5x font size; paragraph spacing >= 2x font size; letter spacing >= 0.12x font size; word spacing >= 0.16x font size.",
403
- checkerFnName: "checkTextSpacing",
404
- },
405
- {
406
- id: "1.4.13",
407
- name: "Content on Hover or Focus",
408
- level: "AA",
409
- principle: "Perceivable",
410
- guideline: "1.4 Distinguishable",
411
- checkCapability: "heuristic",
412
- figmaRelevance:
413
- "Can detect hover/tooltip variant patterns and check for dismissability cues",
414
- manualGuidance:
415
- "Additional content that appears on hover or focus must be dismissable, hoverable, and persistent.",
416
- checkerFnName: "checkContentOnHover",
417
- },
418
-
419
- // ═══════════════════════════════════════════════════════════════════════════
420
- // PRINCIPLE 2 – OPERABLE
421
- // ═══════════════════════════════════════════════════════════════════════════
422
-
423
- // ── 2.1 Keyboard Accessible ───────────────────────────────────────────────
424
- {
425
- id: "2.1.1",
426
- name: "Keyboard",
427
- level: "A",
428
- principle: "Operable",
429
- guideline: "2.1 Keyboard Accessible",
430
- checkCapability: "manual",
431
- figmaRelevance:
432
- "Cannot determine keyboard operability from static design; requires runtime testing",
433
- manualGuidance:
434
- "All functionality must be operable through a keyboard interface without requiring specific timings for individual keystrokes.",
435
- },
436
- {
437
- id: "2.1.2",
438
- name: "No Keyboard Trap",
439
- level: "A",
440
- principle: "Operable",
441
- guideline: "2.1 Keyboard Accessible",
442
- checkCapability: "manual",
443
- figmaRelevance:
444
- "Cannot determine keyboard traps from static design; requires runtime testing",
445
- manualGuidance:
446
- "If keyboard focus can be moved to a component, focus can also be moved away using only a keyboard. If non-standard exit method is needed, the user is advised.",
447
- },
448
- {
449
- id: "2.1.3",
450
- name: "Keyboard (No Exception)",
451
- level: "AAA",
452
- principle: "Operable",
453
- guideline: "2.1 Keyboard Accessible",
454
- checkCapability: "manual",
455
- figmaRelevance:
456
- "Cannot determine keyboard operability from static design",
457
- manualGuidance:
458
- "All functionality is operable through a keyboard interface without exception.",
459
- },
460
- {
461
- id: "2.1.4",
462
- name: "Character Key Shortcuts",
463
- level: "A",
464
- principle: "Operable",
465
- guideline: "2.1 Keyboard Accessible",
466
- checkCapability: "manual",
467
- figmaRelevance:
468
- "Keyboard shortcuts are a runtime concern, not visible in Figma designs",
469
- manualGuidance:
470
- "If single character key shortcuts exist, provide a way to turn them off, remap them, or make them active only on focus.",
471
- },
472
-
473
- // ── 2.2 Enough Time ──────────────────────────────────────────────────────
474
- {
475
- id: "2.2.1",
476
- name: "Timing Adjustable",
477
- level: "A",
478
- principle: "Operable",
479
- guideline: "2.2 Enough Time",
480
- checkCapability: "manual",
481
- figmaRelevance:
482
- "Time limits are a runtime behaviour, not detectable from static design",
483
- manualGuidance:
484
- "For each time limit, the user can turn off, adjust, or extend the time limit (with at least 10x the default).",
485
- },
486
- {
487
- id: "2.2.2",
488
- name: "Pause, Stop, Hide",
489
- level: "A",
490
- principle: "Operable",
491
- guideline: "2.2 Enough Time",
492
- checkCapability: "manual",
493
- figmaRelevance:
494
- "Animation/auto-updating behaviour is a runtime concern",
495
- manualGuidance:
496
- "For moving, blinking, scrolling, or auto-updating information, provide a mechanism to pause, stop, or hide it.",
497
- },
498
- {
499
- id: "2.2.3",
500
- name: "No Timing",
501
- level: "AAA",
502
- principle: "Operable",
503
- guideline: "2.2 Enough Time",
504
- checkCapability: "manual",
505
- figmaRelevance:
506
- "Timing is a runtime concern",
507
- manualGuidance:
508
- "Timing is not an essential part of the event or activity (except for synchronised media and real-time events).",
509
- },
510
- {
511
- id: "2.2.4",
512
- name: "Interruptions",
513
- level: "AAA",
514
- principle: "Operable",
515
- guideline: "2.2 Enough Time",
516
- checkCapability: "manual",
517
- figmaRelevance:
518
- "Interruption behaviour is a runtime concern",
519
- manualGuidance:
520
- "Interruptions can be postponed or suppressed by the user, except for emergencies.",
521
- },
522
- {
523
- id: "2.2.5",
524
- name: "Re-authenticating",
525
- level: "AAA",
526
- principle: "Operable",
527
- guideline: "2.2 Enough Time",
528
- checkCapability: "manual",
529
- figmaRelevance:
530
- "Authentication flows are a runtime concern",
531
- manualGuidance:
532
- "When an authenticated session expires, the user can continue without losing data after re-authenticating.",
533
- },
534
- {
535
- id: "2.2.6",
536
- name: "Timeouts",
537
- level: "AAA",
538
- principle: "Operable",
539
- guideline: "2.2 Enough Time",
540
- checkCapability: "manual",
541
- figmaRelevance:
542
- "Timeout behaviour is a runtime concern",
543
- manualGuidance:
544
- "Users are warned of the duration of any user inactivity that could cause data loss, unless data is preserved for more than 20 hours.",
545
- },
546
-
547
- // ── 2.3 Seizures and Physical Reactions ───────────────────────────────────
548
- {
549
- id: "2.3.1",
550
- name: "Three Flashes or Below Threshold",
551
- level: "A",
552
- principle: "Operable",
553
- guideline: "2.3 Seizures and Physical Reactions",
554
- checkCapability: "manual",
555
- figmaRelevance:
556
- "Flashing content is a runtime/animation concern, not in static designs",
557
- manualGuidance:
558
- "Content must not flash more than three times per second, or the flash is below the general flash and red flash thresholds.",
559
- },
560
- {
561
- id: "2.3.2",
562
- name: "Three Flashes",
563
- level: "AAA",
564
- principle: "Operable",
565
- guideline: "2.3 Seizures and Physical Reactions",
566
- checkCapability: "manual",
567
- figmaRelevance:
568
- "Flashing is a runtime concern",
569
- manualGuidance:
570
- "Content must not flash more than three times per second.",
571
- },
572
- {
573
- id: "2.3.3",
574
- name: "Animation from Interactions",
575
- level: "AAA",
576
- principle: "Operable",
577
- guideline: "2.3 Seizures and Physical Reactions",
578
- checkCapability: "manual",
579
- figmaRelevance:
580
- "Interaction animations are a runtime concern",
581
- manualGuidance:
582
- "Motion animation triggered by interaction can be disabled, unless essential to the functionality.",
583
- },
584
-
585
- // ── 2.4 Navigable ────────────────────────────────────────────────────────
586
- {
587
- id: "2.4.1",
588
- name: "Bypass Blocks",
589
- level: "A",
590
- principle: "Operable",
591
- guideline: "2.4 Navigable",
592
- checkCapability: "manual",
593
- figmaRelevance:
594
- "Skip navigation links are an implementation detail, not visible in most Figma designs",
595
- manualGuidance:
596
- "A mechanism is available to bypass blocks of content that are repeated on multiple pages (e.g., skip navigation links).",
597
- },
598
- {
599
- id: "2.4.2",
600
- name: "Page Titled",
601
- level: "A",
602
- principle: "Operable",
603
- guideline: "2.4 Navigable",
604
- checkCapability: "manual",
605
- figmaRelevance:
606
- "Page titles are HTML metadata; Figma page names may not reflect final titles",
607
- manualGuidance:
608
- "Pages have titles that describe topic or purpose.",
609
- },
610
- {
611
- id: "2.4.3",
612
- name: "Focus Order",
613
- level: "A",
614
- principle: "Operable",
615
- guideline: "2.4 Navigable",
616
- checkCapability: "heuristic",
617
- figmaRelevance:
618
- "Can compare node tree order with visual position to flag potential focus-order mismatches",
619
- manualGuidance:
620
- "If a page can be navigated sequentially, components receive focus in an order that preserves meaning and operability.",
621
- checkerFnName: "checkFocusOrder",
622
- },
623
- {
624
- id: "2.4.4",
625
- name: "Link Purpose (In Context)",
626
- level: "A",
627
- principle: "Operable",
628
- guideline: "2.4 Navigable",
629
- checkCapability: "heuristic",
630
- figmaRelevance:
631
- "Can detect link-like elements with vague text like 'click here' or 'read more'",
632
- manualGuidance:
633
- "The purpose of each link can be determined from the link text alone, or from the link text together with its programmatically determined link context.",
634
- checkerFnName: "checkLinkPurpose",
635
- },
636
- {
637
- id: "2.4.5",
638
- name: "Multiple Ways",
639
- level: "AA",
640
- principle: "Operable",
641
- guideline: "2.4 Navigable",
642
- checkCapability: "manual",
643
- figmaRelevance:
644
- "Navigation structure is an implementation concern spanning multiple pages",
645
- manualGuidance:
646
- "More than one way is available to locate a page within a set of pages (e.g., site map, search, table of contents).",
647
- },
648
- {
649
- id: "2.4.6",
650
- name: "Headings and Labels",
651
- level: "AA",
652
- principle: "Operable",
653
- guideline: "2.4 Navigable",
654
- checkCapability: "heuristic",
655
- figmaRelevance:
656
- "Can detect sections/frames without heading text children",
657
- manualGuidance:
658
- "Headings and labels describe topic or purpose.",
659
- checkerFnName: "checkHeadingsAndLabels",
660
- },
661
- {
662
- id: "2.4.7",
663
- name: "Focus Visible",
664
- level: "AA",
665
- principle: "Operable",
666
- guideline: "2.4 Navigable",
667
- checkCapability: "automated",
668
- figmaRelevance:
669
- "Can check component sets for a visible focus-state variant",
670
- manualGuidance:
671
- "Any keyboard-operable user interface has a mode of operation where the keyboard focus indicator is visible.",
672
- checkerFnName: "checkFocusState",
673
- },
674
- {
675
- id: "2.4.8",
676
- name: "Location",
677
- level: "AAA",
678
- principle: "Operable",
679
- guideline: "2.4 Navigable",
680
- checkCapability: "manual",
681
- figmaRelevance:
682
- "Breadcrumbs/location indicators require cross-page context",
683
- manualGuidance:
684
- "Information about the user's location within a set of pages is available (e.g., breadcrumbs).",
685
- },
686
- {
687
- id: "2.4.9",
688
- name: "Link Purpose (Link Only)",
689
- level: "AAA",
690
- principle: "Operable",
691
- guideline: "2.4 Navigable",
692
- checkCapability: "heuristic",
693
- figmaRelevance:
694
- "Same as 2.4.4 but stricter — link text alone must convey purpose",
695
- manualGuidance:
696
- "The purpose of each link can be identified from the link text alone.",
697
- checkerFnName: "checkLinkPurpose",
698
- },
699
- {
700
- id: "2.4.10",
701
- name: "Section Headings",
702
- level: "AAA",
703
- principle: "Operable",
704
- guideline: "2.4 Navigable",
705
- checkCapability: "heuristic",
706
- figmaRelevance:
707
- "Can check that content sections have heading nodes",
708
- manualGuidance:
709
- "Section headings are used to organise content.",
710
- checkerFnName: "checkHeadingsAndLabels",
711
- },
712
- {
713
- id: "2.4.11",
714
- name: "Focus Not Obscured (Minimum)",
715
- level: "AA",
716
- principle: "Operable",
717
- guideline: "2.4 Navigable",
718
- checkCapability: "heuristic",
719
- figmaRelevance:
720
- "Can check if focus-state variants have overlapping elements that obscure the focused component",
721
- manualGuidance:
722
- "When a user interface component receives keyboard focus, the component is not entirely hidden due to author-created content.",
723
- checkerFnName: "checkFocusNotObscured",
724
- },
725
- {
726
- id: "2.4.12",
727
- name: "Focus Not Obscured (Enhanced)",
728
- level: "AAA",
729
- principle: "Operable",
730
- guideline: "2.4 Navigable",
731
- checkCapability: "heuristic",
732
- figmaRelevance:
733
- "Same as 2.4.11 but no part of the focus indicator may be hidden",
734
- manualGuidance:
735
- "When a component receives keyboard focus, no part of the focus indicator is hidden by author-created content.",
736
- checkerFnName: "checkFocusNotObscured",
737
- },
738
- {
739
- id: "2.4.13",
740
- name: "Focus Appearance",
741
- level: "AAA",
742
- principle: "Operable",
743
- guideline: "2.4 Navigable",
744
- checkCapability: "heuristic",
745
- figmaRelevance:
746
- "Can check focus ring size and contrast in focus-state variants",
747
- manualGuidance:
748
- "Focus indicators have sufficient size (at least 2px perimeter) and contrast (at least 3:1 against adjacent colours).",
749
- checkerFnName: "checkFocusState",
750
- },
751
-
752
- // ── 2.5 Input Modalities ──────────────────────────────────────────────────
753
- {
754
- id: "2.5.1",
755
- name: "Pointer Gestures",
756
- level: "A",
757
- principle: "Operable",
758
- guideline: "2.5 Input Modalities",
759
- checkCapability: "manual",
760
- figmaRelevance:
761
- "Gesture requirements are runtime behaviour, not detectable from static design",
762
- manualGuidance:
763
- "All functionality that uses multipoint or path-based gestures can also be operated with a single pointer without a path-based gesture.",
764
- },
765
- {
766
- id: "2.5.2",
767
- name: "Pointer Cancellation",
768
- level: "A",
769
- principle: "Operable",
770
- guideline: "2.5 Input Modalities",
771
- checkCapability: "manual",
772
- figmaRelevance:
773
- "Pointer event handling is a runtime concern",
774
- manualGuidance:
775
- "For single-pointer functionality: the down-event is not used to execute; or completion is on the up-event with ability to abort; or the up-event reverses the down-event outcome.",
776
- },
777
- {
778
- id: "2.5.3",
779
- name: "Label in Name",
780
- level: "A",
781
- principle: "Operable",
782
- guideline: "2.5 Input Modalities",
783
- checkCapability: "heuristic",
784
- figmaRelevance:
785
- "Can check that interactive component visible text matches or is contained in the component name",
786
- manualGuidance:
787
- "For components with visible text labels, the accessible name contains the visible text.",
788
- checkerFnName: "checkNameRoleValue",
789
- },
790
- {
791
- id: "2.5.4",
792
- name: "Motion Actuation",
793
- level: "A",
794
- principle: "Operable",
795
- guideline: "2.5 Input Modalities",
796
- checkCapability: "manual",
797
- figmaRelevance:
798
- "Device motion is a runtime concern",
799
- manualGuidance:
800
- "Functionality triggered by device motion or user motion can also be operated through UI components, and motion triggering can be disabled.",
801
- },
802
- {
803
- id: "2.5.5",
804
- name: "Target Size (Enhanced)",
805
- level: "AAA",
806
- principle: "Operable",
807
- guideline: "2.5 Input Modalities",
808
- checkCapability: "automated",
809
- figmaRelevance:
810
- "Checks interactive element bounding boxes against 44x44px minimum",
811
- manualGuidance:
812
- "The size of the target for pointer inputs is at least 44 by 44 CSS pixels.",
813
- checkerFnName: "checkTouchTarget",
814
- },
815
- {
816
- id: "2.5.7",
817
- name: "Dragging Movements",
818
- level: "AA",
819
- principle: "Operable",
820
- guideline: "2.5 Input Modalities",
821
- checkCapability: "manual",
822
- figmaRelevance:
823
- "Drag interactions are runtime behaviour",
824
- manualGuidance:
825
- "All functionality that uses a dragging movement can be achieved with a single pointer without dragging.",
826
- },
827
- {
828
- id: "2.5.8",
829
- name: "Target Size (Minimum)",
830
- level: "AA",
831
- principle: "Operable",
832
- guideline: "2.5 Input Modalities",
833
- checkCapability: "automated",
834
- figmaRelevance:
835
- "Checks interactive element bounding boxes against 24x24px minimum",
836
- manualGuidance:
837
- "The size of the target for pointer inputs is at least 24 by 24 CSS pixels (with allowed exceptions for inline, spacing, equivalent, or user-agent-determined targets).",
838
- checkerFnName: "checkTargetSizeMinimum",
839
- },
840
-
841
- // ═══════════════════════════════════════════════════════════════════════════
842
- // PRINCIPLE 3 – UNDERSTANDABLE
843
- // ═══════════════════════════════════════════════════════════════════════════
844
-
845
- // ── 3.1 Readable ──────────────────────────────────────────────────────────
846
- {
847
- id: "3.1.1",
848
- name: "Language of Page",
849
- level: "A",
850
- principle: "Understandable",
851
- guideline: "3.1 Readable",
852
- checkCapability: "manual",
853
- figmaRelevance:
854
- "HTML lang attribute is an implementation detail, not in Figma",
855
- manualGuidance:
856
- "The default human language of each page can be programmatically determined (e.g., lang attribute on <html>).",
857
- },
858
- {
859
- id: "3.1.2",
860
- name: "Language of Parts",
861
- level: "AA",
862
- principle: "Understandable",
863
- guideline: "3.1 Readable",
864
- checkCapability: "manual",
865
- figmaRelevance:
866
- "Language attributes are an implementation detail",
867
- manualGuidance:
868
- "The human language of each passage or phrase in the content can be programmatically determined.",
869
- },
870
- {
871
- id: "3.1.3",
872
- name: "Unusual Words",
873
- level: "AAA",
874
- principle: "Understandable",
875
- guideline: "3.1 Readable",
876
- checkCapability: "manual",
877
- figmaRelevance:
878
- "Requires content analysis beyond Figma's scope",
879
- manualGuidance:
880
- "A mechanism is available for identifying specific definitions of words or phrases used in an unusual or restricted way.",
881
- },
882
- {
883
- id: "3.1.4",
884
- name: "Abbreviations",
885
- level: "AAA",
886
- principle: "Understandable",
887
- guideline: "3.1 Readable",
888
- checkCapability: "manual",
889
- figmaRelevance:
890
- "Requires content analysis beyond Figma's scope",
891
- manualGuidance:
892
- "A mechanism for identifying the expanded form or meaning of abbreviations is available.",
893
- },
894
- {
895
- id: "3.1.5",
896
- name: "Reading Level",
897
- level: "AAA",
898
- principle: "Understandable",
899
- guideline: "3.1 Readable",
900
- checkCapability: "manual",
901
- figmaRelevance:
902
- "Requires readability scoring of content",
903
- manualGuidance:
904
- "When text requires more than a lower secondary education reading level, supplemental content or a simpler version is available.",
905
- },
906
- {
907
- id: "3.1.6",
908
- name: "Pronunciation",
909
- level: "AAA",
910
- principle: "Understandable",
911
- guideline: "3.1 Readable",
912
- checkCapability: "manual",
913
- figmaRelevance:
914
- "Pronunciation is a runtime/content concern",
915
- manualGuidance:
916
- "A mechanism is available for identifying the specific pronunciation of words where meaning is ambiguous without knowing the pronunciation.",
917
- },
918
-
919
- // ── 3.2 Predictable ──────────────────────────────────────────────────────
920
- {
921
- id: "3.2.1",
922
- name: "On Focus",
923
- level: "A",
924
- principle: "Understandable",
925
- guideline: "3.2 Predictable",
926
- checkCapability: "manual",
927
- figmaRelevance:
928
- "Focus behaviour is a runtime concern",
929
- manualGuidance:
930
- "When any UI component receives focus, it does not initiate a change of context.",
931
- },
932
- {
933
- id: "3.2.2",
934
- name: "On Input",
935
- level: "A",
936
- principle: "Understandable",
937
- guideline: "3.2 Predictable",
938
- checkCapability: "manual",
939
- figmaRelevance:
940
- "Input behaviour is a runtime concern",
941
- manualGuidance:
942
- "Changing the setting of any UI component does not automatically cause a change of context unless the user has been advised beforehand.",
943
- },
944
- {
945
- id: "3.2.3",
946
- name: "Consistent Navigation",
947
- level: "AA",
948
- principle: "Understandable",
949
- guideline: "3.2 Predictable",
950
- checkCapability: "manual",
951
- figmaRelevance:
952
- "Navigation consistency requires cross-page comparison beyond single-node audit scope",
953
- manualGuidance:
954
- "Navigational mechanisms that are repeated on multiple pages occur in the same relative order each time.",
955
- },
956
- {
957
- id: "3.2.4",
958
- name: "Consistent Identification",
959
- level: "AA",
960
- principle: "Understandable",
961
- guideline: "3.2 Predictable",
962
- checkCapability: "manual",
963
- figmaRelevance:
964
- "Consistency requires cross-page comparison",
965
- manualGuidance:
966
- "Components with the same functionality are identified consistently across pages.",
967
- },
968
- {
969
- id: "3.2.5",
970
- name: "Change on Request",
971
- level: "AAA",
972
- principle: "Understandable",
973
- guideline: "3.2 Predictable",
974
- checkCapability: "manual",
975
- figmaRelevance:
976
- "Context changes are a runtime concern",
977
- manualGuidance:
978
- "Changes of context are initiated only by user request, or a mechanism is available to turn off such changes.",
979
- },
980
- {
981
- id: "3.2.6",
982
- name: "Consistent Help",
983
- level: "A",
984
- principle: "Understandable",
985
- guideline: "3.2 Predictable",
986
- checkCapability: "manual",
987
- figmaRelevance:
988
- "Help mechanism consistency requires cross-page comparison",
989
- manualGuidance:
990
- "If a page contains help mechanisms (contact info, self-help options), they are in the same relative order on each page.",
991
- },
992
-
993
- // ── 3.3 Input Assistance ─────────────────────────────────────────────────
994
- {
995
- id: "3.3.1",
996
- name: "Error Identification",
997
- level: "A",
998
- principle: "Understandable",
999
- guideline: "3.3 Input Assistance",
1000
- checkCapability: "heuristic",
1001
- figmaRelevance:
1002
- "Can check error-state variants for descriptive text (not colour-only indicators)",
1003
- manualGuidance:
1004
- "If an input error is automatically detected, the error is identified and described to the user in text.",
1005
- checkerFnName: "checkErrorIdentification",
1006
- },
1007
- {
1008
- id: "3.3.2",
1009
- name: "Labels or Instructions",
1010
- level: "A",
1011
- principle: "Understandable",
1012
- guideline: "3.3 Input Assistance",
1013
- checkCapability: "heuristic",
1014
- figmaRelevance:
1015
- "Can check that input components have visible label text siblings",
1016
- manualGuidance:
1017
- "Labels or instructions are provided when content requires user input.",
1018
- checkerFnName: "checkLabelsOrInstructions",
1019
- },
1020
- {
1021
- id: "3.3.3",
1022
- name: "Error Suggestion",
1023
- level: "AA",
1024
- principle: "Understandable",
1025
- guideline: "3.3 Input Assistance",
1026
- checkCapability: "heuristic",
1027
- figmaRelevance:
1028
- "Can check error-state variants for suggestion/help text",
1029
- manualGuidance:
1030
- "If an input error is detected and suggestions for correction are known, the suggestions are provided to the user.",
1031
- checkerFnName: "checkErrorIdentification",
1032
- },
1033
- {
1034
- id: "3.3.4",
1035
- name: "Error Prevention (Legal, Financial, Data)",
1036
- level: "AA",
1037
- principle: "Understandable",
1038
- guideline: "3.3 Input Assistance",
1039
- checkCapability: "manual",
1040
- figmaRelevance:
1041
- "Error prevention mechanisms are implementation details",
1042
- manualGuidance:
1043
- "For pages involving legal commitments, financial transactions, or user data: submissions are reversible, data is checked and confirmed, or a review step is provided.",
1044
- },
1045
- {
1046
- id: "3.3.5",
1047
- name: "Help",
1048
- level: "AAA",
1049
- principle: "Understandable",
1050
- guideline: "3.3 Input Assistance",
1051
- checkCapability: "manual",
1052
- figmaRelevance:
1053
- "Contextual help is an implementation detail",
1054
- manualGuidance:
1055
- "Context-sensitive help is available.",
1056
- },
1057
- {
1058
- id: "3.3.6",
1059
- name: "Error Prevention (All)",
1060
- level: "AAA",
1061
- principle: "Understandable",
1062
- guideline: "3.3 Input Assistance",
1063
- checkCapability: "manual",
1064
- figmaRelevance:
1065
- "Error prevention mechanisms are implementation details",
1066
- manualGuidance:
1067
- "For all pages requiring user submissions: submissions are reversible, data is checked, or a review step is provided.",
1068
- },
1069
- {
1070
- id: "3.3.7",
1071
- name: "Redundant Entry",
1072
- level: "A",
1073
- principle: "Understandable",
1074
- guideline: "3.3 Input Assistance",
1075
- checkCapability: "manual",
1076
- figmaRelevance:
1077
- "Redundant entry detection requires cross-step flow analysis beyond single-node scope",
1078
- manualGuidance:
1079
- "Information previously entered by or provided to the user that is required to be entered again is either auto-populated or available for selection.",
1080
- },
1081
- {
1082
- id: "3.3.8",
1083
- name: "Accessible Authentication (Minimum)",
1084
- level: "AA",
1085
- principle: "Understandable",
1086
- guideline: "3.3 Input Assistance",
1087
- checkCapability: "manual",
1088
- figmaRelevance:
1089
- "Authentication mechanisms are implementation details",
1090
- manualGuidance:
1091
- "A cognitive function test is not required for any step in an authentication process unless the test provides an alternative or is assisted.",
1092
- },
1093
- {
1094
- id: "3.3.9",
1095
- name: "Accessible Authentication (Enhanced)",
1096
- level: "AAA",
1097
- principle: "Understandable",
1098
- guideline: "3.3 Input Assistance",
1099
- checkCapability: "manual",
1100
- figmaRelevance:
1101
- "Authentication mechanisms are implementation details",
1102
- manualGuidance:
1103
- "A cognitive function test is not required for any step in an authentication process.",
1104
- },
1105
-
1106
- // ═══════════════════════════════════════════════════════════════════════════
1107
- // PRINCIPLE 4 – ROBUST
1108
- // ═══════════════════════════════════════════════════════════════════════════
1109
-
1110
- // ── 4.1 Compatible ────────────────────────────────────────────────────────
1111
- // Note: 4.1.1 Parsing was removed in WCAG 2.2
1112
- {
1113
- id: "4.1.2",
1114
- name: "Name, Role, Value",
1115
- level: "A",
1116
- principle: "Robust",
1117
- guideline: "4.1 Compatible",
1118
- checkCapability: "heuristic",
1119
- figmaRelevance:
1120
- "Can check interactive components for name/description properties and visible labels",
1121
- manualGuidance:
1122
- "For all UI components, the name and role can be programmatically determined; states, properties, and values can be programmatically set; and notification of changes is available to user agents.",
1123
- checkerFnName: "checkNameRoleValue",
1124
- },
1125
- {
1126
- id: "4.1.3",
1127
- name: "Status Messages",
1128
- level: "AA",
1129
- principle: "Robust",
1130
- guideline: "4.1 Compatible",
1131
- checkCapability: "manual",
1132
- figmaRelevance:
1133
- "Status messages and ARIA live regions are an implementation concern",
1134
- manualGuidance:
1135
- "Status messages can be programmatically determined through role or properties so they are presented to the user by assistive technologies without receiving focus.",
1136
- },
1137
- ];
1138
-
1139
- // ─────────────────────────────────────────────────────────────────────────────
1140
- // Helpers
1141
- // ─────────────────────────────────────────────────────────────────────────────
1142
-
1143
- const LEVEL_HIERARCHY: Record<WCAGLevel, WCAGLevel[]> = {
1144
- A: ["A"],
1145
- AA: ["A", "AA"],
1146
- AAA: ["A", "AA", "AAA"],
1147
- };
1148
-
1149
- /** Return all criteria at or below the given conformance level. */
1150
- export function getCriteriaForLevel(level: WCAGLevel): WCAGCriterionDef[] {
1151
- const included = LEVEL_HIERARCHY[level];
1152
- return WCAG_CRITERIA.filter((c) => included.includes(c.level));
1153
- }
1154
-
1155
- /** Return a single criterion definition by ID, or undefined. */
1156
- export function getCriterionById(
1157
- id: string
1158
- ): WCAGCriterionDef | undefined {
1159
- return WCAG_CRITERIA.find((c) => c.id === id);
1160
- }