@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.
- package/README.md +69 -36
- package/dist/bin/cli.js +2 -0
- package/dist/design-bridge/bridge.js +2 -0
- package/dist/figma-bridge-plugin/bridge-relay.js +2 -0
- package/dist/figma-bridge-plugin/code.js +1 -0
- package/{figma-bridge-plugin → dist/figma-bridge-plugin}/package-lock.json +0 -3
- package/dist/figma-bridge-plugin/ui.html +4970 -0
- package/dist/figma-intelligence-layer/dist/index.js +2 -0
- package/dist/scripts/clean-existing-chunks.js +2 -0
- package/dist/scripts/connect-ai-tool.js +2 -0
- package/dist/scripts/convert-hub-pdfs.js +2 -0
- package/dist/scripts/figma-mcp-status.js +2 -0
- package/dist/scripts/register-codex-mcp.js +2 -0
- package/dist/scripts/test-copilot-chat.js +2 -0
- package/package.json +11 -8
- package/bin/cli.js +0 -859
- package/design-bridge/bridge.js +0 -196
- package/design-bridge/lib/assets.js +0 -367
- package/design-bridge/lib/prompt.js +0 -85
- package/design-bridge/lib/server.js +0 -66
- package/design-bridge/lib/stitch.js +0 -37
- package/design-bridge/lib/tokens.js +0 -82
- package/design-bridge/package-lock.json +0 -579
- package/figma-bridge-plugin/README.md +0 -97
- package/figma-bridge-plugin/anthropic-chat-runner.js +0 -192
- package/figma-bridge-plugin/bridge-relay.js +0 -2505
- package/figma-bridge-plugin/chat-runner.js +0 -485
- package/figma-bridge-plugin/code.js +0 -1534
- package/figma-bridge-plugin/codex-runner.js +0 -505
- package/figma-bridge-plugin/component-schemas.js +0 -110
- package/figma-bridge-plugin/content-context.js +0 -869
- package/figma-bridge-plugin/create-button.js +0 -216
- package/figma-bridge-plugin/gemini-cli-runner.js +0 -291
- package/figma-bridge-plugin/gemini-runner.js +0 -187
- package/figma-bridge-plugin/html-to-figma.js +0 -927
- package/figma-bridge-plugin/knowledge-hub/.gitkeep +0 -0
- package/figma-bridge-plugin/knowledge-hub/uspec-references/anatomy-spec.md +0 -159
- package/figma-bridge-plugin/knowledge-hub/uspec-references/api-spec.md +0 -162
- package/figma-bridge-plugin/knowledge-hub/uspec-references/color-spec.md +0 -148
- package/figma-bridge-plugin/knowledge-hub/uspec-references/full-spec-template.md +0 -314
- package/figma-bridge-plugin/knowledge-hub/uspec-references/property-spec.md +0 -175
- package/figma-bridge-plugin/knowledge-hub/uspec-references/screen-reader-spec.md +0 -180
- package/figma-bridge-plugin/knowledge-hub/uspec-references/structure-spec.md +0 -165
- package/figma-bridge-plugin/perplexity-runner.js +0 -188
- package/figma-bridge-plugin/references/SKILL.md +0 -178
- package/figma-bridge-plugin/references/anatomy-spec.md +0 -159
- package/figma-bridge-plugin/references/api-spec.md +0 -162
- package/figma-bridge-plugin/references/color-spec.md +0 -148
- package/figma-bridge-plugin/references/full-spec-template.md +0 -314
- package/figma-bridge-plugin/references/property-spec.md +0 -175
- package/figma-bridge-plugin/references/screen-reader-spec.md +0 -180
- package/figma-bridge-plugin/references/structure-spec.md +0 -165
- package/figma-bridge-plugin/shared-prompt-config.js +0 -645
- package/figma-bridge-plugin/spec-helpers/build-table.js +0 -269
- package/figma-bridge-plugin/spec-helpers/classify-elements.js +0 -189
- package/figma-bridge-plugin/spec-helpers/index.js +0 -35
- package/figma-bridge-plugin/spec-helpers/parse-figma-link.js +0 -49
- package/figma-bridge-plugin/spec-helpers/position-markers.js +0 -158
- package/figma-bridge-plugin/stitch-auth.js +0 -322
- package/figma-bridge-plugin/stitch-runner.js +0 -1427
- package/figma-bridge-plugin/token-resolver.js +0 -107
- package/figma-bridge-plugin/ui.html +0 -4542
- package/figma-intelligence-layer/.env.example +0 -39
- package/figma-intelligence-layer/docs/local-image-generation.md +0 -60
- package/figma-intelligence-layer/examples/comfyui-workflow-template.example.json +0 -101
- package/figma-intelligence-layer/jest.config.js +0 -14
- package/figma-intelligence-layer/mcp-config.json +0 -19
- package/figma-intelligence-layer/package-lock.json +0 -5892
- package/figma-intelligence-layer/scripts/setup-comfyui-local.sh +0 -67
- package/figma-intelligence-layer/scripts/start-comfyui.sh +0 -33
- package/figma-intelligence-layer/src/index.ts +0 -2233
- package/figma-intelligence-layer/src/shared/auto-layout-validator.ts +0 -404
- package/figma-intelligence-layer/src/shared/cache.ts +0 -187
- package/figma-intelligence-layer/src/shared/color-operations.ts +0 -533
- package/figma-intelligence-layer/src/shared/color-utils.ts +0 -138
- package/figma-intelligence-layer/src/shared/component-script-builder.ts +0 -413
- package/figma-intelligence-layer/src/shared/component-templates.ts +0 -2767
- package/figma-intelligence-layer/src/shared/concept-taxonomy.ts +0 -694
- package/figma-intelligence-layer/src/shared/decision-log.ts +0 -128
- package/figma-intelligence-layer/src/shared/design-system-context.ts +0 -568
- package/figma-intelligence-layer/src/shared/design-system-intelligence.ts +0 -131
- package/figma-intelligence-layer/src/shared/design-system-matcher.ts +0 -184
- package/figma-intelligence-layer/src/shared/design-system-normalizers.ts +0 -196
- package/figma-intelligence-layer/src/shared/design-system-tokens.ts +0 -295
- package/figma-intelligence-layer/src/shared/dtcg-validator.ts +0 -530
- package/figma-intelligence-layer/src/shared/enrichment-pipeline.ts +0 -671
- package/figma-intelligence-layer/src/shared/figma-bridge.ts +0 -1418
- package/figma-intelligence-layer/src/shared/font-config.ts +0 -126
- package/figma-intelligence-layer/src/shared/icon-catalog.ts +0 -360
- package/figma-intelligence-layer/src/shared/icon-fetch.ts +0 -80
- package/figma-intelligence-layer/src/shared/prototype-script-builder.ts +0 -162
- package/figma-intelligence-layer/src/shared/response-compression.ts +0 -440
- package/figma-intelligence-layer/src/shared/semantic-token-catalog.ts +0 -324
- package/figma-intelligence-layer/src/shared/token-binder.ts +0 -505
- package/figma-intelligence-layer/src/shared/token-math.ts +0 -427
- package/figma-intelligence-layer/src/shared/token-naming.ts +0 -468
- package/figma-intelligence-layer/src/shared/token-utils.ts +0 -420
- package/figma-intelligence-layer/src/shared/types.ts +0 -346
- package/figma-intelligence-layer/src/shared/typography-presets.ts +0 -94
- package/figma-intelligence-layer/src/shared/unsplash.ts +0 -165
- package/figma-intelligence-layer/src/shared/vision-client.ts +0 -607
- package/figma-intelligence-layer/src/shared/vision-provider-anthropic.ts +0 -334
- package/figma-intelligence-layer/src/shared/vision-provider-openai.ts +0 -446
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotate-handler.ts +0 -782
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotate-renderer.ts +0 -496
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotation-kit.ts +0 -230
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/colorblind-sim.ts +0 -66
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/index.ts +0 -810
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-analyzer.ts +0 -1191
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-figma-page.ts +0 -1346
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-handler.ts +0 -148
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/vpat-figma-page.ts +0 -499
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/vpat-report.ts +0 -910
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/wcag-checker.ts +0 -989
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/wcag-criteria.ts +0 -1160
- package/figma-intelligence-layer/src/tools/phase1-vision/design-from-ref/index.ts +0 -424
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/component-recognizer.ts +0 -38
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/ds-matcher.ts +0 -111
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/font-matcher.ts +0 -114
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/icon-resolver.ts +0 -103
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/index.ts +0 -1060
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/layout-segmenter.ts +0 -18
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/token-inferencer.ts +0 -39
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/vision-pipeline.ts +0 -58
- package/figma-intelligence-layer/src/tools/phase1-vision/sketch-to-design/index.ts +0 -298
- package/figma-intelligence-layer/src/tools/phase1-vision/visual-audit/index.ts +0 -197
- package/figma-intelligence-layer/src/tools/phase2-accuracy/component-audit/index.ts +0 -494
- package/figma-intelligence-layer/src/tools/phase2-accuracy/intent-translator/index.ts +0 -356
- package/figma-intelligence-layer/src/tools/phase2-accuracy/layout-intelligence/container-patterns.ts +0 -123
- package/figma-intelligence-layer/src/tools/phase2-accuracy/layout-intelligence/index.ts +0 -663
- package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/built-in-rules.yaml +0 -56
- package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/index.ts +0 -614
- package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/rule-engine.ts +0 -113
- package/figma-intelligence-layer/src/tools/phase2-accuracy/theme-generator/color-theory.ts +0 -178
- package/figma-intelligence-layer/src/tools/phase2-accuracy/theme-generator/index.ts +0 -470
- package/figma-intelligence-layer/src/tools/phase2-accuracy/variant-expander/index.ts +0 -429
- package/figma-intelligence-layer/src/tools/phase2-accuracy/variant-expander/token-override-maps.ts +0 -226
- package/figma-intelligence-layer/src/tools/phase3-generation/ai-image-insert/index.ts +0 -535
- package/figma-intelligence-layer/src/tools/phase3-generation/component-archaeologist/index.ts +0 -660
- package/figma-intelligence-layer/src/tools/phase3-generation/component-archaeologist/pattern-fingerprints.ts +0 -209
- package/figma-intelligence-layer/src/tools/phase3-generation/composition-builder/index.ts +0 -540
- package/figma-intelligence-layer/src/tools/phase3-generation/figma-animated-build.ts +0 -391
- package/figma-intelligence-layer/src/tools/phase3-generation/page-architect/index.ts +0 -2019
- package/figma-intelligence-layer/src/tools/phase3-generation/page-architect/screen-templates.ts +0 -131
- package/figma-intelligence-layer/src/tools/phase3-generation/prototype-map/index.ts +0 -381
- package/figma-intelligence-layer/src/tools/phase3-generation/prototype-wire/index.ts +0 -565
- package/figma-intelligence-layer/src/tools/phase3-generation/swarm-build/index.ts +0 -764
- package/figma-intelligence-layer/src/tools/phase3-generation/system-drift/index.ts +0 -535
- package/figma-intelligence-layer/src/tools/phase3-generation/unsplash-search/index.ts +0 -84
- package/figma-intelligence-layer/src/tools/phase3-generation/url-to-frame/index.ts +0 -401
- package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/css-animations.ts +0 -68
- package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/framer-motion.ts +0 -78
- package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/swift-animations.ts +0 -93
- package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/index.ts +0 -596
- package/figma-intelligence-layer/src/tools/phase4-sync/ci-check/index.ts +0 -462
- package/figma-intelligence-layer/src/tools/phase4-sync/export-tokens/index.ts +0 -1470
- package/figma-intelligence-layer/src/tools/phase4-sync/generate-component-code/index.ts +0 -829
- package/figma-intelligence-layer/src/tools/phase4-sync/handoff-spec/index.ts +0 -702
- package/figma-intelligence-layer/src/tools/phase4-sync/icon-library-sync/index.ts +0 -483
- package/figma-intelligence-layer/src/tools/phase4-sync/sync-from-code/index.ts +0 -501
- package/figma-intelligence-layer/src/tools/phase4-sync/sync-from-code/storybook-parser.ts +0 -106
- package/figma-intelligence-layer/src/tools/phase4-sync/watch-docs/index.ts +0 -676
- package/figma-intelligence-layer/src/tools/phase4-sync/webhook-listener/index.ts +0 -560
- package/figma-intelligence-layer/src/tools/phase5-governance/apg-doc/index.ts +0 -1043
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/component-detection.ts +0 -620
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/anatomy.ts +0 -331
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/color-tokens.ts +0 -77
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/properties.ts +0 -54
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/snapshot.ts +0 -287
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/spacing.ts +0 -71
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/states.ts +0 -43
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/typography.ts +0 -71
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/index.ts +0 -221
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/_default.ts +0 -166
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/accordion.ts +0 -232
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/alert.ts +0 -234
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/avatar-group.ts +0 -270
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/avatar.ts +0 -249
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/badge.ts +0 -231
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/banner.ts +0 -293
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/breadcrumb.ts +0 -240
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/button.ts +0 -243
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/calendar.ts +0 -307
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/card.ts +0 -143
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/checkbox.ts +0 -227
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/chip.ts +0 -233
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/combobox.ts +0 -282
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/datepicker.ts +0 -276
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/divider.ts +0 -223
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/drawer.ts +0 -255
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/dropdown-menu.ts +0 -289
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/empty-state.ts +0 -261
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/file-uploader.ts +0 -290
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/form.ts +0 -265
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/grid.ts +0 -238
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/icon.ts +0 -255
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/index.ts +0 -128
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/inline-edit.ts +0 -286
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/inline-message.ts +0 -255
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/input.ts +0 -330
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/link.ts +0 -247
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/list.ts +0 -250
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/menu.ts +0 -247
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/modal.ts +0 -144
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/navbar.ts +0 -264
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/navigation.ts +0 -251
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/number-input.ts +0 -261
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/pagination.ts +0 -248
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/popover.ts +0 -270
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/progress.ts +0 -251
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/radio.ts +0 -142
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/range-slider.ts +0 -282
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/rating.ts +0 -250
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/search.ts +0 -258
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/segmented-control.ts +0 -265
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/select.ts +0 -319
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/skeleton.ts +0 -256
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/slider.ts +0 -232
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/spinner.ts +0 -239
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/status-dot.ts +0 -252
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/stepper.ts +0 -270
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/table.ts +0 -244
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tabs.ts +0 -143
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tag.ts +0 -243
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/textarea.ts +0 -259
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/time-picker.ts +0 -293
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toast.ts +0 -144
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toggle.ts +0 -289
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toolbar.ts +0 -267
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tooltip.ts +0 -232
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/treeview.ts +0 -257
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/typography.ts +0 -319
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/legacy-compat.ts +0 -121
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/anatomy-diagram.ts +0 -430
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/figma-page.ts +0 -312
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/json.ts +0 -129
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/markdown.ts +0 -78
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/visual-doc.ts +0 -2333
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/accessibility.ts +0 -100
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/anatomy.ts +0 -32
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/color-tokens.ts +0 -59
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/content-guidance.ts +0 -18
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/design-tokens.ts +0 -53
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/interaction-rules.ts +0 -19
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/overview.ts +0 -91
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/properties-api.ts +0 -71
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/qa-criteria.ts +0 -19
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/related-components.ts +0 -110
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/responsive.ts +0 -19
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/size-specs.ts +0 -67
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/spacing-structure.ts +0 -58
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/state-specs.ts +0 -79
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/states.ts +0 -50
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/type-hierarchy.ts +0 -33
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/typography.ts +0 -55
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/usage-guidelines.ts +0 -73
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/variants.ts +0 -81
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/types.ts +0 -409
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/index.ts +0 -198
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/renderer.ts +0 -701
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/types.ts +0 -88
- package/figma-intelligence-layer/src/tools/phase5-governance/decision-log/index.ts +0 -135
- package/figma-intelligence-layer/src/tools/phase5-governance/design-decision-log/index.ts +0 -491
- package/figma-intelligence-layer/src/tools/phase5-governance/ds-primitives/index.ts +0 -416
- package/figma-intelligence-layer/src/tools/phase5-governance/ds-scaffolder/index.ts +0 -722
- package/figma-intelligence-layer/src/tools/phase5-governance/ds-variables/index.ts +0 -449
- package/figma-intelligence-layer/src/tools/phase5-governance/health-report/index.ts +0 -393
- package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/index.ts +0 -406
- package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/figma-page.ts +0 -292
- package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/json.ts +0 -24
- package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/markdown.ts +0 -172
- package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/naming-guide.ts +0 -409
- package/figma-intelligence-layer/src/tools/phase5-governance/token-analytics/index.ts +0 -594
- package/figma-intelligence-layer/src/tools/phase5-governance/token-docs/index.ts +0 -710
- package/figma-intelligence-layer/src/tools/phase5-governance/token-migrate/index.ts +0 -458
- package/figma-intelligence-layer/src/tools/phase5-governance/token-naming/index.ts +0 -134
- package/figma-intelligence-layer/tests/apg-doc.test.ts +0 -101
- package/figma-intelligence-layer/tests/design-system-context.test.ts +0 -152
- package/figma-intelligence-layer/tests/design-system-matcher.test.ts +0 -144
- package/figma-intelligence-layer/tests/figma-bridge.test.ts +0 -83
- package/figma-intelligence-layer/tests/generate-image-and-insert.test.ts +0 -56
- package/figma-intelligence-layer/tests/screen-cloner-regression.test.ts +0 -69
- package/figma-intelligence-layer/tests/smoke.test.ts +0 -174
- package/figma-intelligence-layer/tests/spec-generator.test.ts +0 -127
- package/figma-intelligence-layer/tests/token-migrate.test.ts +0 -21
- package/figma-intelligence-layer/tests/token-naming.test.ts +0 -30
- package/figma-intelligence-layer/tsconfig.json +0 -19
- package/scripts/clean-existing-chunks.js +0 -179
- package/scripts/connect-ai-tool.js +0 -490
- package/scripts/convert-hub-pdfs.js +0 -425
- package/scripts/figma-mcp-status.js +0 -349
- package/scripts/register-codex-mcp.js +0 -96
- /package/{design-bridge → dist/design-bridge}/.env.example +0 -0
- /package/{design-bridge → dist/design-bridge}/package.json +0 -0
- /package/{figma-bridge-plugin → dist/figma-bridge-plugin}/manifest.json +0 -0
- /package/{figma-bridge-plugin → dist/figma-bridge-plugin}/package.json +0 -0
- /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
|
-
}
|