@verndale/accessibility-standards 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/OPERATING.md +1 -1
  2. package/README.md +1 -1
  3. package/dist/manifest.json +156 -116
  4. package/dist/profiles/ai-orchestration/coverage-manifest.json +702 -153
  5. package/dist/profiles/ai-orchestration/implementation/accessibility.md +523 -42
  6. package/dist/profiles/ai-orchestration/pattern-contracts.json +892 -306
  7. package/dist/profiles/ai-orchestration/patterns/accordion.md +6 -1
  8. package/dist/profiles/ai-orchestration/patterns/alert.md +6 -1
  9. package/dist/profiles/ai-orchestration/patterns/carousel.md +6 -1
  10. package/dist/profiles/ai-orchestration/patterns/checkbox.md +27 -0
  11. package/dist/profiles/ai-orchestration/patterns/combobox.md +6 -1
  12. package/dist/profiles/ai-orchestration/patterns/consequential-submission.md +8 -3
  13. package/dist/profiles/ai-orchestration/patterns/dialog.md +6 -1
  14. package/dist/profiles/ai-orchestration/patterns/disclosure.md +6 -1
  15. package/dist/profiles/ai-orchestration/patterns/dynamic-status.md +6 -1
  16. package/dist/profiles/ai-orchestration/patterns/field.md +7 -1
  17. package/dist/profiles/ai-orchestration/patterns/image.md +6 -1
  18. package/dist/profiles/ai-orchestration/patterns/listbox.md +6 -1
  19. package/dist/profiles/ai-orchestration/patterns/media-player.md +9 -1
  20. package/dist/profiles/ai-orchestration/patterns/menu-button.md +6 -1
  21. package/dist/profiles/ai-orchestration/patterns/menu.md +30 -0
  22. package/dist/profiles/ai-orchestration/patterns/pagination.md +6 -1
  23. package/dist/profiles/ai-orchestration/patterns/popover.md +7 -1
  24. package/dist/profiles/ai-orchestration/patterns/progress.md +7 -1
  25. package/dist/profiles/ai-orchestration/patterns/radio-group.md +27 -0
  26. package/dist/profiles/ai-orchestration/patterns/slider.md +31 -0
  27. package/dist/profiles/ai-orchestration/patterns/spinbutton.md +28 -0
  28. package/dist/profiles/ai-orchestration/patterns/tabs.md +6 -1
  29. package/dist/profiles/ai-orchestration/patterns/tooltip.md +6 -1
  30. package/dist/profiles/ai-orchestration/patterns/tree-view.md +31 -0
  31. package/dist/profiles/ai-orchestration/patterns/validation.md +7 -1
  32. package/dist/profiles/ai-orchestration/review/accessibility.md +14 -6
  33. package/dist/profiles/ai-orchestration/semantics/accessible-authentication.md +13 -0
  34. package/dist/profiles/ai-orchestration/semantics/accessible-name.md +8 -2
  35. package/dist/profiles/ai-orchestration/semantics/alert.md +7 -1
  36. package/dist/profiles/ai-orchestration/semantics/consequential-action.md +6 -2
  37. package/dist/profiles/ai-orchestration/semantics/consistent-help.md +13 -0
  38. package/dist/profiles/ai-orchestration/semantics/data-table.md +7 -2
  39. package/dist/profiles/ai-orchestration/semantics/dragging-alternative.md +13 -0
  40. package/dist/profiles/ai-orchestration/semantics/expanded-state.md +6 -1
  41. package/dist/profiles/ai-orchestration/semantics/focus.initial.md +4 -1
  42. package/dist/profiles/ai-orchestration/semantics/focus.return.md +4 -1
  43. package/dist/profiles/ai-orchestration/semantics/focus.visible.md +8 -2
  44. package/dist/profiles/ai-orchestration/semantics/form-error.md +8 -2
  45. package/dist/profiles/ai-orchestration/semantics/form-label.md +7 -1
  46. package/dist/profiles/ai-orchestration/semantics/form-required.md +7 -1
  47. package/dist/profiles/ai-orchestration/semantics/headings.md +7 -1
  48. package/dist/profiles/ai-orchestration/semantics/keyboard.escape.md +4 -1
  49. package/dist/profiles/ai-orchestration/semantics/keyboard.md +7 -1
  50. package/dist/profiles/ai-orchestration/semantics/landmarks.md +6 -1
  51. package/dist/profiles/ai-orchestration/semantics/live-status.md +7 -2
  52. package/dist/profiles/ai-orchestration/semantics/media-alternatives.md +11 -1
  53. package/dist/profiles/ai-orchestration/semantics/motion-control.md +8 -2
  54. package/dist/profiles/ai-orchestration/semantics/name-role-value.md +6 -2
  55. package/dist/profiles/ai-orchestration/semantics/native-dialog.md +7 -1
  56. package/dist/profiles/ai-orchestration/semantics/native-elements.md +5 -1
  57. package/dist/profiles/ai-orchestration/semantics/non-text-alternative.md +5 -1
  58. package/dist/profiles/ai-orchestration/semantics/redundant-entry.md +13 -0
  59. package/dist/profiles/ai-orchestration/semantics/roles-states-properties.md +6 -1
  60. package/dist/profiles/ai-orchestration/semantics/selected-state.md +6 -1
  61. package/dist/profiles/ai-orchestration/semantics/target-size.md +6 -2
  62. package/dist/profiles/ai-orchestration/semantics.json +826 -130
  63. package/dist/profiles/ai-orchestration/testing/accessibility.md +33 -3
  64. package/dist/profiles/ai-orchestration/ui-design-brain-bindings.json +287 -307
  65. package/dist/profiles/conductor/a11y-semantics.md +249 -10
  66. package/dist/profiles/conductor/accessibility-quality.md +275 -33
  67. package/dist/profiles/conductor/applicability-matrix.json +226 -269
  68. package/dist/profiles/conductor/coverage-manifest.json +702 -153
  69. package/dist/profiles/conductor/pattern-contracts.json +892 -306
  70. package/dist/profiles/conductor/patterns/accordion.json +35 -27
  71. package/dist/profiles/conductor/patterns/alert.json +29 -21
  72. package/dist/profiles/conductor/patterns/carousel.json +36 -28
  73. package/dist/profiles/conductor/patterns/checkbox.json +67 -0
  74. package/dist/profiles/conductor/patterns/combobox.json +37 -29
  75. package/dist/profiles/conductor/patterns/consequential-submission.json +34 -25
  76. package/dist/profiles/conductor/patterns/dialog.json +37 -29
  77. package/dist/profiles/conductor/patterns/disclosure.json +33 -25
  78. package/dist/profiles/conductor/patterns/dynamic-status.json +31 -22
  79. package/dist/profiles/conductor/patterns/field.json +41 -25
  80. package/dist/profiles/conductor/patterns/image.json +31 -22
  81. package/dist/profiles/conductor/patterns/listbox.json +35 -27
  82. package/dist/profiles/conductor/patterns/media-player.json +59 -29
  83. package/dist/profiles/conductor/patterns/menu-button.json +34 -26
  84. package/dist/profiles/conductor/patterns/menu.json +78 -0
  85. package/dist/profiles/conductor/patterns/pagination.json +34 -25
  86. package/dist/profiles/conductor/patterns/popover.json +42 -26
  87. package/dist/profiles/conductor/patterns/progress.json +38 -23
  88. package/dist/profiles/conductor/patterns/radio-group.json +69 -0
  89. package/dist/profiles/conductor/patterns/slider.json +84 -0
  90. package/dist/profiles/conductor/patterns/spinbutton.json +74 -0
  91. package/dist/profiles/conductor/patterns/tabs.json +34 -26
  92. package/dist/profiles/conductor/patterns/tooltip.json +31 -23
  93. package/dist/profiles/conductor/patterns/tree-view.json +77 -0
  94. package/dist/profiles/conductor/patterns/validation.json +42 -26
  95. package/dist/profiles/conductor/semantics.json +826 -130
  96. package/dist/profiles/conductor/ui-design-brain-bindings.json +287 -307
  97. package/dist/projection-manifest.json +120 -104
  98. package/dist/requirements-to-implementation.md +7 -1
  99. package/lib/build.mjs +3 -3
  100. package/lib/digest.mjs +8 -0
  101. package/lib/load.mjs +13 -0
  102. package/lib/provenance.mjs +2 -0
  103. package/lib/render.mjs +51 -7
  104. package/lib/sync.mjs +2 -2
  105. package/lib/validate.mjs +335 -33
  106. package/package.json +6 -2
  107. package/profiles/ai-orchestration/profile.json +1 -1
  108. package/profiles/ai-orchestration/templates/patterns/README.md +1 -1
  109. package/profiles/ai-orchestration/templates/review/README.md +1 -1
  110. package/profiles/ai-orchestration/templates/semantics/README.md +1 -1
  111. package/profiles/ai-orchestration/templates/testing/README.md +1 -1
  112. package/profiles/conductor/profile.json +1 -1
  113. package/profiles/conductor/templates/evidence/README.md +1 -1
  114. package/profiles/conductor/templates/patterns/README.md +1 -1
  115. package/profiles/conductor/templates/semantics/README.md +1 -1
  116. package/schemas/consumer-config.schema.json +1 -1
  117. package/schemas/contract.schema.json +1 -1
  118. package/schemas/manifest.schema.json +1 -1
  119. package/schemas/pattern.schema.json +98 -1
  120. package/schemas/profile.schema.json +1 -1
  121. package/schemas/projection-manifest.schema.json +6 -6
  122. package/schemas/semantic.schema.json +26 -1
  123. package/schemas/standards-reference.schema.json +105 -0
  124. package/schemas/wcag-coverage.schema.json +93 -0
  125. package/src/applicability/facts.yml +3 -5
  126. package/src/applicability/matrix.yml +5 -7
  127. package/src/applicability/ui-design-brain-bindings.yml +8 -22
  128. package/src/contract.yml +1 -1
  129. package/src/coverage/wcag-2.2.yml +68 -0
  130. package/src/patterns/disclosure/accordion.yml +1 -1
  131. package/src/patterns/disclosure/disclosure.yml +1 -1
  132. package/src/patterns/feedback/alert.yml +1 -1
  133. package/src/patterns/feedback/dynamic-status.yml +1 -1
  134. package/src/patterns/feedback/progress.yml +1 -1
  135. package/src/patterns/forms/consequential-submission.yml +1 -1
  136. package/src/patterns/forms/field.yml +1 -1
  137. package/src/patterns/forms/spinbutton.yml +1 -0
  138. package/src/patterns/forms/validation.yml +1 -1
  139. package/src/patterns/media/carousel.yml +1 -1
  140. package/src/patterns/media/image.yml +1 -1
  141. package/src/patterns/media/media-player.yml +1 -1
  142. package/src/patterns/navigation/menu-button.yml +1 -1
  143. package/src/patterns/navigation/menu.yml +1 -0
  144. package/src/patterns/navigation/pagination.yml +1 -1
  145. package/src/patterns/navigation/tabs.yml +1 -1
  146. package/src/patterns/navigation/tree-view.yml +1 -0
  147. package/src/patterns/overlays/dialog.yml +1 -1
  148. package/src/patterns/overlays/popover.yml +1 -1
  149. package/src/patterns/overlays/tooltip.yml +1 -1
  150. package/src/patterns/selection/checkbox.yml +1 -0
  151. package/src/patterns/selection/combobox.yml +1 -1
  152. package/src/patterns/selection/listbox.yml +1 -1
  153. package/src/patterns/selection/radio-group.yml +1 -0
  154. package/src/patterns/selection/slider.yml +1 -0
  155. package/src/semantics/accessible-names.yml +1 -1
  156. package/src/semantics/forms.yml +1 -1
  157. package/src/semantics/headings-landmarks.yml +1 -1
  158. package/src/semantics/keyboard-focus.yml +1 -1
  159. package/src/semantics/live-regions.yml +1 -1
  160. package/src/semantics/media.yml +1 -1
  161. package/src/semantics/native-elements.yml +1 -1
  162. package/src/semantics/roles-states-properties.yml +1 -1
  163. package/src/semantics/tables.yml +1 -1
  164. package/src/semantics/wcag-2.2.yml +1 -0
  165. package/src/sources.yml +1 -1
@@ -1 +1,98 @@
1
- {"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"pattern.schema.json","allOf":[{"$ref":"record.schema.json"},{"type":"object","required":["kind","requires","activation","scope","behavior","product_decisions","functional_spec_bindings","implementation_outcomes","evidence_routes"],"properties":{"kind":{"const":"pattern"},"requires":{"type":"array","items":{"type":"string","pattern":"^semantics\\."},"minItems":1,"uniqueItems":true}}}]}
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "pattern.schema.json",
4
+ "$defs": {
5
+ "fact": { "type": "string", "pattern": "^[a-z][a-z0-9_-]*(?:\\.[a-z][a-z0-9_-]*)+$" },
6
+ "operand": {
7
+ "type": "object",
8
+ "required": ["fact", "value"],
9
+ "additionalProperties": false,
10
+ "properties": { "fact": { "$ref": "#/$defs/fact" }, "value": {} }
11
+ },
12
+ "existsOperand": {
13
+ "type": "object",
14
+ "required": ["fact"],
15
+ "additionalProperties": false,
16
+ "properties": { "fact": { "$ref": "#/$defs/fact" } }
17
+ },
18
+ "expression": {
19
+ "oneOf": [
20
+ {
21
+ "type": "object",
22
+ "required": ["all"],
23
+ "additionalProperties": false,
24
+ "properties": { "all": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/expression" } } }
25
+ },
26
+ {
27
+ "type": "object",
28
+ "required": ["any"],
29
+ "additionalProperties": false,
30
+ "properties": { "any": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/expression" } } }
31
+ },
32
+ {
33
+ "type": "object",
34
+ "required": ["not"],
35
+ "additionalProperties": false,
36
+ "properties": { "not": { "$ref": "#/$defs/expression" } }
37
+ },
38
+ {
39
+ "type": "object",
40
+ "required": ["equals"],
41
+ "additionalProperties": false,
42
+ "properties": { "equals": { "$ref": "#/$defs/operand" } }
43
+ },
44
+ {
45
+ "type": "object",
46
+ "required": ["contains"],
47
+ "additionalProperties": false,
48
+ "properties": { "contains": { "$ref": "#/$defs/operand" } }
49
+ },
50
+ {
51
+ "type": "object",
52
+ "required": ["exists"],
53
+ "additionalProperties": false,
54
+ "properties": { "exists": { "$ref": "#/$defs/existsOperand" } }
55
+ }
56
+ ]
57
+ },
58
+ "nonBlankStrings": {
59
+ "type": "array",
60
+ "items": { "type": "string", "pattern": "\\S" },
61
+ "minItems": 1,
62
+ "uniqueItems": true
63
+ }
64
+ },
65
+ "type": "object",
66
+ "required": ["id", "version", "title", "kind", "standards_refs", "requires", "activation", "scope", "behavior", "product_decisions", "functional_spec_bindings", "implementation_outcomes", "evidence_routes"],
67
+ "additionalProperties": false,
68
+ "properties": {
69
+ "id": { "type": "string", "pattern": "^pattern\\.[a-z0-9]+(?:[.-][a-z0-9]+)*$" },
70
+ "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
71
+ "title": { "type": "string", "pattern": "\\S" },
72
+ "kind": { "const": "pattern" },
73
+ "standards_refs": {
74
+ "type": "array",
75
+ "items": { "$ref": "standards-reference.schema.json" },
76
+ "minItems": 1,
77
+ "uniqueItems": true
78
+ },
79
+ "requires": {
80
+ "type": "array",
81
+ "items": { "type": "string", "pattern": "^semantics\\.[a-z0-9]+(?:[.-][a-z0-9]+)*$" },
82
+ "minItems": 1,
83
+ "uniqueItems": true
84
+ },
85
+ "activation": { "$ref": "#/$defs/expression" },
86
+ "scope": { "type": "string", "pattern": "\\S" },
87
+ "behavior": { "$ref": "#/$defs/nonBlankStrings" },
88
+ "product_decisions": { "$ref": "#/$defs/nonBlankStrings" },
89
+ "functional_spec_bindings": { "$ref": "#/$defs/nonBlankStrings" },
90
+ "implementation_outcomes": { "$ref": "#/$defs/nonBlankStrings" },
91
+ "evidence_routes": {
92
+ "type": "array",
93
+ "items": { "enum": ["unit", "axe", "e2e", "human"] },
94
+ "minItems": 1,
95
+ "uniqueItems": true
96
+ }
97
+ }
98
+ }
@@ -1 +1 @@
1
- {"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"profile.schema.json","type":"object","required":["name","version","channels"],"properties":{"name":{"enum":["conductor","ai-orchestration"]},"version":{"type":"string"},"channels":{"type":"array","items":{"type":"string"},"uniqueItems":true}},"additionalProperties":false}
1
+ {"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"profile.schema.json","type":"object","required":["name","version","channels"],"properties":{"name":{"enum":["conductor","ai-orchestration"]},"version":{"const":"3.0.0"},"channels":{"type":"array","items":{"type":"string"},"uniqueItems":true}},"additionalProperties":false}
@@ -26,10 +26,10 @@
26
26
  ],
27
27
  "properties": {
28
28
  "_generated": { "type": "string" },
29
- "package": { "type": "string" },
29
+ "package": { "const": "@verndale/accessibility-standards@3.0.0" },
30
30
  "profile": { "enum": ["conductor", "ai-orchestration"] },
31
- "profile_version": { "type": "string" },
32
- "schema_version": { "type": "integer" },
31
+ "profile_version": { "const": "3.0.0" },
32
+ "schema_version": { "const": 3 },
33
33
  "digests": {
34
34
  "type": "object",
35
35
  "required": ["source", "profile", "ui_design_brain_bindings", "config", "routes"],
@@ -50,8 +50,8 @@
50
50
  "required": ["_generated", "package", "schema_version", "source_digest", "profile_digests", "ui_design_brain", "profiles"],
51
51
  "properties": {
52
52
  "_generated": { "type": "string" },
53
- "package": { "type": "string" },
54
- "schema_version": { "type": "integer" },
53
+ "package": { "const": "@verndale/accessibility-standards@3.0.0" },
54
+ "schema_version": { "const": 3 },
55
55
  "source_digest": { "$ref": "#/$defs/digest" },
56
56
  "profile_digests": {
57
57
  "type": "object",
@@ -66,7 +66,7 @@
66
66
  "type": "object",
67
67
  "required": ["version", "profile_digest", "source_digest", "outputs"],
68
68
  "properties": {
69
- "version": { "type": "string" },
69
+ "version": { "const": "3.0.0" },
70
70
  "profile_digest": { "$ref": "#/$defs/digest" },
71
71
  "source_digest": { "$ref": "#/$defs/digest" },
72
72
  "outputs": { "type": "object", "additionalProperties": { "$ref": "#/$defs/digest" } }
@@ -1 +1,26 @@
1
- {"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"semantic.schema.json","allOf":[{"$ref":"record.schema.json"},{"type":"object","required":["kind","requirement","proof"],"properties":{"kind":{"const":"semantic"},"requirement":{"type":"string"},"proof":{"type":"array","items":{"enum":["unit","axe","e2e","human"]},"minItems":1,"uniqueItems":true}}}]}
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "semantic.schema.json",
4
+ "type": "object",
5
+ "required": ["id", "version", "title", "kind", "requirement", "proof", "standards_refs"],
6
+ "additionalProperties": false,
7
+ "properties": {
8
+ "id": { "type": "string", "pattern": "^semantics\\.[a-z0-9]+(?:[.-][a-z0-9]+)*$" },
9
+ "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
10
+ "title": { "type": "string", "pattern": "\\S" },
11
+ "kind": { "const": "semantic" },
12
+ "requirement": { "type": "string", "pattern": "\\S" },
13
+ "proof": {
14
+ "type": "array",
15
+ "items": { "enum": ["unit", "axe", "e2e", "human"] },
16
+ "minItems": 1,
17
+ "uniqueItems": true
18
+ },
19
+ "standards_refs": {
20
+ "type": "array",
21
+ "items": { "$ref": "standards-reference.schema.json" },
22
+ "minItems": 1,
23
+ "uniqueItems": true
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,105 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "standards-reference.schema.json",
4
+ "$defs": {
5
+ "criterionId": {
6
+ "enum": [
7
+ "1.1.1", "1.2.1", "1.2.2", "1.2.3", "1.2.4", "1.2.5", "1.2.6", "1.2.7", "1.2.8", "1.2.9",
8
+ "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6",
9
+ "1.4.1", "1.4.2", "1.4.3", "1.4.4", "1.4.5", "1.4.6", "1.4.7", "1.4.8", "1.4.9", "1.4.10", "1.4.11", "1.4.12", "1.4.13",
10
+ "2.1.1", "2.1.2", "2.1.3", "2.1.4",
11
+ "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.5", "2.2.6",
12
+ "2.3.1", "2.3.2", "2.3.3",
13
+ "2.4.1", "2.4.2", "2.4.3", "2.4.4", "2.4.5", "2.4.6", "2.4.7", "2.4.8", "2.4.9", "2.4.10", "2.4.11", "2.4.12", "2.4.13",
14
+ "2.5.1", "2.5.2", "2.5.3", "2.5.4", "2.5.5", "2.5.6", "2.5.7", "2.5.8",
15
+ "3.1.1", "3.1.2", "3.1.3", "3.1.4", "3.1.5", "3.1.6",
16
+ "3.2.1", "3.2.2", "3.2.3", "3.2.4", "3.2.5", "3.2.6",
17
+ "3.3.1", "3.3.2", "3.3.3", "3.3.4", "3.3.5", "3.3.6", "3.3.7", "3.3.8", "3.3.9",
18
+ "4.1.2", "4.1.3"
19
+ ]
20
+ },
21
+ "levelAIds": {
22
+ "enum": [
23
+ "1.1.1", "1.2.1", "1.2.2", "1.2.3", "1.3.1", "1.3.2", "1.3.3", "1.4.1", "1.4.2",
24
+ "2.1.1", "2.1.2", "2.1.4", "2.2.1", "2.2.2", "2.3.1", "2.4.1", "2.4.2", "2.4.3", "2.4.4",
25
+ "2.5.1", "2.5.2", "2.5.3", "2.5.4", "3.1.1", "3.2.1", "3.2.2", "3.2.6", "3.3.1", "3.3.2", "3.3.7", "4.1.2"
26
+ ]
27
+ },
28
+ "levelAAIds": {
29
+ "enum": [
30
+ "1.2.4", "1.2.5", "1.3.4", "1.3.5", "1.4.3", "1.4.4", "1.4.5", "1.4.10", "1.4.11", "1.4.12", "1.4.13",
31
+ "2.4.5", "2.4.6", "2.4.7", "2.4.11", "2.5.7", "2.5.8", "3.1.2", "3.2.3", "3.2.4", "3.3.3", "3.3.4", "3.3.8", "4.1.3"
32
+ ]
33
+ },
34
+ "levelAAAIds": {
35
+ "enum": [
36
+ "1.2.6", "1.2.7", "1.2.8", "1.2.9", "1.3.6", "1.4.6", "1.4.7", "1.4.8", "1.4.9",
37
+ "2.1.3", "2.2.3", "2.2.4", "2.2.5", "2.2.6", "2.3.2", "2.3.3", "2.4.8", "2.4.9", "2.4.10", "2.4.12", "2.4.13", "2.5.5", "2.5.6",
38
+ "3.1.3", "3.1.4", "3.1.5", "3.1.6", "3.2.5", "3.3.5", "3.3.6", "3.3.9"
39
+ ]
40
+ },
41
+ "levelMatch": {
42
+ "oneOf": [
43
+ { "properties": { "identifier": { "$ref": "#/$defs/levelAIds" }, "level": { "const": "A" } }, "required": ["identifier", "level"] },
44
+ { "properties": { "identifier": { "$ref": "#/$defs/levelAAIds" }, "level": { "const": "AA" } }, "required": ["identifier", "level"] },
45
+ { "properties": { "identifier": { "$ref": "#/$defs/levelAAAIds" }, "level": { "const": "AAA" } }, "required": ["identifier", "level"] }
46
+ ]
47
+ },
48
+ "wcagUrl": {
49
+ "type": "string",
50
+ "pattern": "^https://www\\.w3\\.org/TR/WCAG22/#(?:non-text-content|audio-only-and-video-only-prerecorded|captions-prerecorded|audio-description-or-media-alternative-prerecorded|captions-live|audio-description-prerecorded|sign-language-prerecorded|extended-audio-description-prerecorded|media-alternative-prerecorded|audio-only-live|info-and-relationships|meaningful-sequence|sensory-characteristics|orientation|identify-input-purpose|identify-purpose|use-of-color|audio-control|contrast-minimum|resize-text|images-of-text|contrast-enhanced|low-or-no-background-audio|visual-presentation|images-of-text-no-exception|reflow|non-text-contrast|text-spacing|content-on-hover-or-focus|keyboard|no-keyboard-trap|keyboard-no-exception|character-key-shortcuts|timing-adjustable|pause-stop-hide|no-timing|interruptions|re-authenticating|timeouts|three-flashes-or-below-threshold|three-flashes|animation-from-interactions|bypass-blocks|page-titled|focus-order|link-purpose-in-context|multiple-ways|headings-and-labels|focus-visible|location|link-purpose-link-only|section-headings|focus-not-obscured-minimum|focus-not-obscured-enhanced|focus-appearance|pointer-gestures|pointer-cancellation|label-in-name|motion-actuation|target-size-enhanced|concurrent-input-mechanisms|dragging-movements|target-size-minimum|language-of-page|language-of-parts|unusual-words|abbreviations|reading-level|pronunciation|on-focus|on-input|consistent-navigation|consistent-identification|change-on-request|consistent-help|error-identification|labels-or-instructions|error-suggestion|error-prevention-legal-financial-data|help|error-prevention-all|redundant-entry|accessible-authentication-minimum|accessible-authentication-enhanced|name-role-value|status-messages)$"
51
+ },
52
+ "understandingUrl": {
53
+ "type": "string",
54
+ "pattern": "^https://www\\.w3\\.org/WAI/WCAG22/Understanding/(?:non-text-content|audio-only-and-video-only-prerecorded|captions-prerecorded|audio-description-or-media-alternative-prerecorded|captions-live|audio-description-prerecorded|sign-language-prerecorded|extended-audio-description-prerecorded|media-alternative-prerecorded|audio-only-live|info-and-relationships|meaningful-sequence|sensory-characteristics|orientation|identify-input-purpose|identify-purpose|use-of-color|audio-control|contrast-minimum|resize-text|images-of-text|contrast-enhanced|low-or-no-background-audio|visual-presentation|images-of-text-no-exception|reflow|non-text-contrast|text-spacing|content-on-hover-or-focus|keyboard|no-keyboard-trap|keyboard-no-exception|character-key-shortcuts|timing-adjustable|pause-stop-hide|no-timing|interruptions|re-authenticating|timeouts|three-flashes-or-below-threshold|three-flashes|animation-from-interactions|bypass-blocks|page-titled|focus-order|link-purpose-in-context|multiple-ways|headings-and-labels|focus-visible|location|link-purpose-link-only|section-headings|focus-not-obscured-minimum|focus-not-obscured-enhanced|focus-appearance|pointer-gestures|pointer-cancellation|label-in-name|motion-actuation|target-size-enhanced|concurrent-input-mechanisms|dragging-movements|target-size-minimum|language-of-page|language-of-parts|unusual-words|abbreviations|reading-level|pronunciation|on-focus|on-input|consistent-navigation|consistent-identification|change-on-request|consistent-help|error-identification|labels-or-instructions|error-suggestion|error-prevention-legal-financial-data|help|error-prevention-all|redundant-entry|accessible-authentication-minimum|accessible-authentication-enhanced|name-role-value|status-messages)\\.html$"
55
+ }
56
+ },
57
+ "type": "object",
58
+ "required": ["authority", "identifier", "url", "normative"],
59
+ "additionalProperties": false,
60
+ "properties": {
61
+ "authority": { "enum": ["wcag-2.2", "wcag-2.2-understanding", "wai-aria-1.2", "aria-apg"] },
62
+ "identifier": { "type": "string", "pattern": "\\S" },
63
+ "url": { "type": "string", "pattern": "^https://" },
64
+ "normative": { "type": "boolean" },
65
+ "level": { "enum": ["A", "AA", "AAA"] }
66
+ },
67
+ "oneOf": [
68
+ {
69
+ "properties": {
70
+ "authority": { "const": "wcag-2.2" },
71
+ "identifier": { "$ref": "#/$defs/criterionId" },
72
+ "url": { "$ref": "#/$defs/wcagUrl" },
73
+ "normative": { "const": true }
74
+ },
75
+ "required": ["level"],
76
+ "allOf": [{ "$ref": "#/$defs/levelMatch" }]
77
+ },
78
+ {
79
+ "properties": {
80
+ "authority": { "const": "wcag-2.2-understanding" },
81
+ "identifier": { "$ref": "#/$defs/criterionId" },
82
+ "url": { "$ref": "#/$defs/understandingUrl" },
83
+ "normative": { "const": false }
84
+ },
85
+ "required": ["level"],
86
+ "allOf": [{ "$ref": "#/$defs/levelMatch" }]
87
+ },
88
+ {
89
+ "properties": {
90
+ "authority": { "const": "wai-aria-1.2" },
91
+ "url": { "type": "string", "pattern": "^https://www\\.w3\\.org/TR/wai-aria-1\\.2/" },
92
+ "normative": { "const": true }
93
+ },
94
+ "not": { "required": ["level"] }
95
+ },
96
+ {
97
+ "properties": {
98
+ "authority": { "const": "aria-apg" },
99
+ "url": { "type": "string", "pattern": "^https://www\\.w3\\.org/WAI/ARIA/apg/" },
100
+ "normative": { "const": false }
101
+ },
102
+ "not": { "required": ["level"] }
103
+ }
104
+ ]
105
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "wcag-coverage.schema.json",
4
+ "$defs": {
5
+ "levelAIds": {
6
+ "enum": [
7
+ "1.1.1", "1.2.1", "1.2.2", "1.2.3", "1.3.1", "1.3.2", "1.3.3", "1.4.1", "1.4.2",
8
+ "2.1.1", "2.1.2", "2.1.4", "2.2.1", "2.2.2", "2.3.1", "2.4.1", "2.4.2", "2.4.3", "2.4.4",
9
+ "2.5.1", "2.5.2", "2.5.3", "2.5.4", "3.1.1", "3.2.1", "3.2.2", "3.2.6", "3.3.1", "3.3.2", "3.3.7", "4.1.2"
10
+ ]
11
+ },
12
+ "levelAAIds": {
13
+ "enum": [
14
+ "1.2.4", "1.2.5", "1.3.4", "1.3.5", "1.4.3", "1.4.4", "1.4.5", "1.4.10", "1.4.11", "1.4.12", "1.4.13",
15
+ "2.4.5", "2.4.6", "2.4.7", "2.4.11", "2.5.7", "2.5.8", "3.1.2", "3.2.3", "3.2.4", "3.3.3", "3.3.4", "3.3.8", "4.1.3"
16
+ ]
17
+ },
18
+ "criterion": {
19
+ "type": "object",
20
+ "required": ["id", "title", "level", "status", "semantic_ids"],
21
+ "additionalProperties": false,
22
+ "properties": {
23
+ "id": {
24
+ "anyOf": [
25
+ { "$ref": "#/$defs/levelAIds" },
26
+ { "$ref": "#/$defs/levelAAIds" }
27
+ ]
28
+ },
29
+ "title": { "type": "string", "pattern": "\\S" },
30
+ "level": { "enum": ["A", "AA"] },
31
+ "status": { "enum": ["covered", "partial", "gap"] },
32
+ "semantic_ids": {
33
+ "type": "array",
34
+ "items": { "type": "string", "pattern": "^semantics\\.[a-z0-9]+(?:[.-][a-z0-9]+)*$" },
35
+ "uniqueItems": true
36
+ },
37
+ "note": { "type": "string", "pattern": "\\S" }
38
+ },
39
+ "allOf": [
40
+ {
41
+ "oneOf": [
42
+ { "properties": { "id": { "$ref": "#/$defs/levelAIds" }, "level": { "const": "A" } }, "required": ["id", "level"] },
43
+ { "properties": { "id": { "$ref": "#/$defs/levelAAIds" }, "level": { "const": "AA" } }, "required": ["id", "level"] }
44
+ ]
45
+ },
46
+ {
47
+ "if": { "properties": { "status": { "const": "gap" } }, "required": ["status"] },
48
+ "then": { "properties": { "semantic_ids": { "maxItems": 0 } } },
49
+ "else": { "properties": { "semantic_ids": { "minItems": 1 } } }
50
+ },
51
+ {
52
+ "if": { "properties": { "status": { "enum": ["partial", "gap"] } }, "required": ["status"] },
53
+ "then": { "required": ["note"] }
54
+ }
55
+ ]
56
+ }
57
+ },
58
+ "type": "object",
59
+ "required": ["version", "authority", "deferred_patterns", "criteria"],
60
+ "additionalProperties": false,
61
+ "properties": {
62
+ "version": { "const": 1 },
63
+ "authority": { "const": "wcag-2.2" },
64
+ "deferred_patterns": {
65
+ "type": "array",
66
+ "minItems": 5,
67
+ "uniqueItems": true,
68
+ "items": {
69
+ "type": "object",
70
+ "required": ["id", "reason"],
71
+ "additionalProperties": false,
72
+ "properties": {
73
+ "id": { "type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$" },
74
+ "reason": { "type": "string", "pattern": "\\S" }
75
+ }
76
+ },
77
+ "allOf": [
78
+ { "contains": { "properties": { "id": { "const": "alert-dialog" } }, "required": ["id"] } },
79
+ { "contains": { "properties": { "id": { "const": "grid" } }, "required": ["id"] } },
80
+ { "contains": { "properties": { "id": { "const": "switch" } }, "required": ["id"] } },
81
+ { "contains": { "properties": { "id": { "const": "toolbar" } }, "required": ["id"] } },
82
+ { "contains": { "properties": { "id": { "const": "treegrid" } }, "required": ["id"] } }
83
+ ]
84
+ },
85
+ "criteria": {
86
+ "type": "array",
87
+ "minItems": 55,
88
+ "maxItems": 55,
89
+ "uniqueItems": true,
90
+ "items": { "$ref": "#/$defs/criterion" }
91
+ }
92
+ }
93
+ }
@@ -16,14 +16,12 @@
16
16
  "component.selection_model": { "type": "string" },
17
17
  "interaction.has_motion_or_timing": { "type": "boolean" },
18
18
  "interaction.has_complex_pointer": { "type": "boolean" },
19
- "interaction.has_character_shortcuts": { "type": "boolean" },
20
- "content.uses_orientation_or_sensory_cues": { "type": "boolean" },
19
+ "interaction.has_dragging": { "type": "boolean" },
21
20
  "interaction.has_pointer_targets": { "type": "boolean" },
22
21
  "interaction.can_obscure_focus": { "type": "boolean" },
23
22
  "flow.has_authentication": { "type": "boolean" },
24
23
  "flow.repeats_entry": { "type": "boolean" },
25
- "artifact.has_help": { "type": "boolean" },
26
- "content.has_locale_or_bidi": { "type": "boolean" },
27
- "component.has_data_table_or_grid": { "type": "boolean" }
24
+ "artifact.has_repeated_help_across_page_set": { "type": "boolean" },
25
+ "component.has_data_table": { "type": "boolean" }
28
26
  }
29
27
  }
@@ -9,13 +9,11 @@
9
9
  {"id":"applicability.overlays","when":{"any":[{"contains":{"fact":"component.ui_pattern_ids","value":"modal"}},{"contains":{"fact":"component.ui_pattern_ids","value":"popover"}},{"contains":{"fact":"component.ui_pattern_ids","value":"tooltip"}}]},"outcomes":["semantics.keyboard.escape","semantics.focus.return"],"evidence":["e2e"]},
10
10
  {"id":"applicability.motion-timing","when":{"equals":{"fact":"interaction.has_motion_or_timing","value":true}},"outcomes":["semantics.motion-control"],"evidence":["e2e","human"]},
11
11
  {"id":"applicability.complex-pointer","when":{"equals":{"fact":"interaction.has_complex_pointer","value":true}},"outcomes":["semantics.keyboard"],"evidence":["e2e","human"]},
12
- {"id":"applicability.character-shortcuts","when":{"equals":{"fact":"interaction.has_character_shortcuts","value":true}},"outcomes":["semantics.keyboard"],"evidence":["unit","e2e"]},
13
- {"id":"applicability.orientation-sensory","when":{"equals":{"fact":"content.uses_orientation_or_sensory_cues","value":true}},"outcomes":["semantics.name-role-value"],"evidence":["human"]},
12
+ {"id":"applicability.dragging-alternative","when":{"equals":{"fact":"interaction.has_dragging","value":true}},"outcomes":["semantics.dragging-alternative"],"evidence":["e2e","human"]},
14
13
  {"id":"applicability.target-size","when":{"equals":{"fact":"interaction.has_pointer_targets","value":true}},"outcomes":["semantics.target-size"],"evidence":["e2e","human"]},
15
14
  {"id":"applicability.focus-obstruction","when":{"equals":{"fact":"interaction.can_obscure_focus","value":true}},"outcomes":["semantics.focus.visible"],"evidence":["e2e","human"]},
16
- {"id":"applicability.authentication-captcha","when":{"equals":{"fact":"flow.has_authentication","value":true}},"outcomes":["semantics.form-label","semantics.form-error"],"evidence":["axe","e2e","human"]},
17
- {"id":"applicability.redundant-entry","when":{"equals":{"fact":"flow.repeats_entry","value":true}},"outcomes":["semantics.form-label"],"evidence":["e2e","human"]},
18
- {"id":"applicability.consistent-help","when":{"equals":{"fact":"artifact.has_help","value":true}},"outcomes":["semantics.landmarks"],"evidence":["human"]},
19
- {"id":"applicability.locale-bidi","when":{"equals":{"fact":"content.has_locale_or_bidi","value":true}},"outcomes":["semantics.native-elements"],"evidence":["unit","human"]},
20
- {"id":"applicability.data-table-grid","when":{"equals":{"fact":"component.has_data_table_or_grid","value":true}},"outcomes":["semantics.data-table"],"evidence":["axe","e2e","human"]}
15
+ {"id":"applicability.accessible-authentication","when":{"equals":{"fact":"flow.has_authentication","value":true}},"outcomes":["semantics.accessible-authentication"],"evidence":["e2e","human"]},
16
+ {"id":"applicability.redundant-entry","when":{"equals":{"fact":"flow.repeats_entry","value":true}},"outcomes":["semantics.form-label","semantics.redundant-entry"],"evidence":["e2e","human"]},
17
+ {"id":"applicability.consistent-help","when":{"equals":{"fact":"artifact.has_repeated_help_across_page_set","value":true}},"outcomes":["semantics.consistent-help"],"evidence":["e2e","human"]},
18
+ {"id":"applicability.data-table","when":{"equals":{"fact":"component.has_data_table","value":true}},"outcomes":["semantics.data-table"],"evidence":["axe","e2e","human"]}
21
19
  ]}
@@ -36,18 +36,11 @@
36
36
  { "ui_pattern_id": "button-group", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.accessible-name", "semantics.focus.visible", "semantics.keyboard", "semantics.native-elements"] },
37
37
  { "ui_pattern_id": "card", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
38
38
  { "ui_pattern_id": "carousel", "classification": "direct", "pattern_ids": ["pattern.carousel"] },
39
- { "ui_pattern_id": "checkbox", "classification": "direct", "pattern_ids": ["pattern.field"] },
39
+ { "ui_pattern_id": "checkbox", "classification": "direct", "pattern_ids": ["pattern.checkbox", "pattern.field"] },
40
40
  { "ui_pattern_id": "color-picker", "classification": "direct", "pattern_ids": ["pattern.field"] },
41
41
  { "ui_pattern_id": "combobox", "classification": "direct", "pattern_ids": ["pattern.combobox", "pattern.field"] },
42
42
  { "ui_pattern_id": "comparison-table", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.data-table"] },
43
- {
44
- "ui_pattern_id": "context-menu",
45
- "classification": "candidate",
46
- "discriminator_facts": ["component.command_menu_trigger"],
47
- "candidates": [
48
- { "pattern_id": "pattern.menu-button", "when": { "equals": { "fact": "component.command_menu_trigger", "value": true } } }
49
- ]
50
- },
43
+ { "ui_pattern_id": "context-menu", "classification": "direct", "pattern_ids": ["pattern.menu"] },
51
44
  { "ui_pattern_id": "date-input", "classification": "direct", "pattern_ids": ["pattern.field"] },
52
45
  {
53
46
  "ui_pattern_id": "datepicker",
@@ -69,14 +62,7 @@
69
62
  { "pattern_id": "pattern.popover", "when": { "equals": { "fact": "component.overlay_model", "value": "non-modal" } } }
70
63
  ]
71
64
  },
72
- {
73
- "ui_pattern_id": "dropdown-menu",
74
- "classification": "candidate",
75
- "discriminator_facts": ["component.command_menu_trigger"],
76
- "candidates": [
77
- { "pattern_id": "pattern.menu-button", "when": { "equals": { "fact": "component.command_menu_trigger", "value": true } } }
78
- ]
79
- },
65
+ { "ui_pattern_id": "dropdown-menu", "classification": "direct", "pattern_ids": ["pattern.menu", "pattern.menu-button"] },
80
66
  {
81
67
  "ui_pattern_id": "empty-state",
82
68
  "classification": "candidate",
@@ -131,13 +117,13 @@
131
117
  { "pattern_id": "pattern.menu-button", "when": { "equals": { "fact": "component.command_menu_trigger", "value": true } } }
132
118
  ]
133
119
  },
134
- { "ui_pattern_id": "number-input", "classification": "direct", "pattern_ids": ["pattern.field"] },
120
+ { "ui_pattern_id": "number-input", "classification": "direct", "pattern_ids": ["pattern.field", "pattern.spinbutton"] },
135
121
  { "ui_pattern_id": "pagination", "classification": "direct", "pattern_ids": ["pattern.pagination"] },
136
122
  { "ui_pattern_id": "popover", "classification": "direct", "pattern_ids": ["pattern.popover"] },
137
123
  { "ui_pattern_id": "progress-bar", "classification": "direct", "pattern_ids": ["pattern.progress"] },
138
124
  { "ui_pattern_id": "progress-indicator", "classification": "direct", "pattern_ids": ["pattern.progress"] },
139
125
  { "ui_pattern_id": "quote", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
140
- { "ui_pattern_id": "radio-button", "classification": "direct", "pattern_ids": ["pattern.field"] },
126
+ { "ui_pattern_id": "radio-button", "classification": "direct", "pattern_ids": ["pattern.field", "pattern.radio-group"] },
141
127
  { "ui_pattern_id": "rating", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.name-role-value"] },
142
128
  { "ui_pattern_id": "rich-text", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.headings", "semantics.native-elements"] },
143
129
  { "ui_pattern_id": "rich-text-editor", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.accessible-name", "semantics.focus.visible", "semantics.keyboard", "semantics.name-role-value"] },
@@ -181,11 +167,11 @@
181
167
  ]
182
168
  },
183
169
  { "ui_pattern_id": "skip-link", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.accessible-name", "semantics.focus.visible", "semantics.keyboard", "semantics.native-elements"] },
184
- { "ui_pattern_id": "slider", "classification": "direct", "pattern_ids": ["pattern.field"] },
170
+ { "ui_pattern_id": "slider", "classification": "direct", "pattern_ids": ["pattern.field", "pattern.slider"] },
185
171
  { "ui_pattern_id": "spinner", "classification": "direct", "pattern_ids": ["pattern.progress"] },
186
172
  { "ui_pattern_id": "stack", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
187
173
  { "ui_pattern_id": "stat", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
188
- { "ui_pattern_id": "stepper", "classification": "direct", "pattern_ids": ["pattern.field"] },
174
+ { "ui_pattern_id": "stepper", "classification": "direct", "pattern_ids": ["pattern.field", "pattern.spinbutton"] },
189
175
  { "ui_pattern_id": "table", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.data-table"] },
190
176
  { "ui_pattern_id": "tabs", "classification": "direct", "pattern_ids": ["pattern.tabs"] },
191
177
  { "ui_pattern_id": "text-input", "classification": "direct", "pattern_ids": ["pattern.field"] },
@@ -201,7 +187,7 @@
201
187
  },
202
188
  { "ui_pattern_id": "toggle", "classification": "direct", "pattern_ids": ["pattern.field"] },
203
189
  { "ui_pattern_id": "tooltip", "classification": "direct", "pattern_ids": ["pattern.tooltip"] },
204
- { "ui_pattern_id": "tree-view", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.accessible-name", "semantics.focus.visible", "semantics.keyboard", "semantics.roles-states-properties", "semantics.selected-state"] },
190
+ { "ui_pattern_id": "tree-view", "classification": "direct", "pattern_ids": ["pattern.tree-view"] },
205
191
  { "ui_pattern_id": "utility-bar", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.landmarks"] },
206
192
  { "ui_pattern_id": "video", "classification": "direct", "pattern_ids": ["pattern.media-player"] },
207
193
  { "ui_pattern_id": "visually-hidden", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
package/src/contract.yml CHANGED
@@ -1 +1 @@
1
- {"schema_version":2,"package_version":"2.0.0"}
1
+ {"schema_version":3,"package_version":"3.0.0"}
@@ -0,0 +1,68 @@
1
+ {
2
+ "version": 1,
3
+ "authority": "wcag-2.2",
4
+ "deferred_patterns": [
5
+ {"id":"alert-dialog","reason":"Deferred until dialog purpose distinguishes urgent confirmation or attention from a general modal dialog."},
6
+ {"id":"grid","reason":"Deferred until a static-versus-interactive grid discriminator and keyboard interaction model are defined."},
7
+ {"id":"switch","reason":"Deferred until a binary toggle model distinguishes switch behavior from a generic form field."},
8
+ {"id":"toolbar","reason":"Deferred until control-group behavior and its focus-management model are defined."},
9
+ {"id":"treegrid","reason":"Deferred until static-versus-interactive grid selection and the hierarchical tree interaction model are defined."}
10
+ ],
11
+ "criteria": [
12
+ {"id":"1.1.1","title":"Non-text Content","level":"A","status":"partial","semantic_ids":["semantics.non-text-alternative"],"note":"Meaningful and decorative non-text content are covered, but dedicated obligations for controls and input, time-based media identification, tests, sensory experiences, and CAPTCHA alternatives are not all represented."},
13
+ {"id":"1.2.1","title":"Audio-only and Video-only (Prerecorded)","level":"A","status":"partial","semantic_ids":["semantics.media-alternatives"],"note":"The shared media rule does not distinguish every audio-only and video-only alternative."},
14
+ {"id":"1.2.2","title":"Captions (Prerecorded)","level":"A","status":"partial","semantic_ids":["semantics.media-alternatives"],"note":"Captions are required broadly, without a criterion-specific prerecorded contract."},
15
+ {"id":"1.2.3","title":"Audio Description or Media Alternative (Prerecorded)","level":"A","status":"partial","semantic_ids":["semantics.media-alternatives"],"note":"The shared media rule covers both alternatives but does not encode the criterion's conditional choice."},
16
+ {"id":"1.2.4","title":"Captions (Live)","level":"AA","status":"gap","semantic_ids":[],"note":"No semantic rule requires live captions."},
17
+ {"id":"1.2.5","title":"Audio Description (Prerecorded)","level":"AA","status":"partial","semantic_ids":["semantics.media-alternatives"],"note":"Audio description is named, but prerecorded applicability is not represented independently."},
18
+ {"id":"1.3.1","title":"Info and Relationships","level":"A","status":"partial","semantic_ids":["semantics.data-table","semantics.form-label","semantics.form-required","semantics.headings","semantics.landmarks"],"note":"Several structural cases are covered, but the general criterion is broader than the current rules."},
19
+ {"id":"1.3.2","title":"Meaningful Sequence","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule explicitly preserves meaningful reading sequence."},
20
+ {"id":"1.3.3","title":"Sensory Characteristics","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule prevents instructions from relying only on sensory characteristics."},
21
+ {"id":"1.3.4","title":"Orientation","level":"AA","status":"gap","semantic_ids":[],"note":"No semantic rule prevents unnecessary orientation restrictions."},
22
+ {"id":"1.3.5","title":"Identify Input Purpose","level":"AA","status":"gap","semantic_ids":[],"note":"No semantic rule requires programmatic input-purpose tokens."},
23
+ {"id":"1.4.1","title":"Use of Color","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule prohibits color-only communication."},
24
+ {"id":"1.4.2","title":"Audio Control","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule requires independent control of automatically playing audio."},
25
+ {"id":"1.4.3","title":"Contrast (Minimum)","level":"AA","status":"gap","semantic_ids":[],"note":"No semantic rule defines minimum text contrast."},
26
+ {"id":"1.4.4","title":"Resize Text","level":"AA","status":"gap","semantic_ids":[],"note":"No semantic rule defines text resizing behavior."},
27
+ {"id":"1.4.5","title":"Images of Text","level":"AA","status":"gap","semantic_ids":[],"note":"Text alternatives do not replace a rule limiting images of text."},
28
+ {"id":"1.4.10","title":"Reflow","level":"AA","status":"gap","semantic_ids":[],"note":"No semantic rule defines responsive reflow requirements."},
29
+ {"id":"1.4.11","title":"Non-text Contrast","level":"AA","status":"gap","semantic_ids":[],"note":"No semantic rule defines contrast for controls, states, or graphical objects."},
30
+ {"id":"1.4.12","title":"Text Spacing","level":"AA","status":"gap","semantic_ids":[],"note":"No semantic rule protects content under user-adjusted text spacing."},
31
+ {"id":"1.4.13","title":"Content on Hover or Focus","level":"AA","status":"gap","semantic_ids":[],"note":"Pattern behavior exists for tooltips, but no semantic rule covers dismissibility, hoverability, and persistence together."},
32
+ {"id":"2.1.1","title":"Keyboard","level":"A","status":"covered","semantic_ids":["semantics.keyboard"]},
33
+ {"id":"2.1.2","title":"No Keyboard Trap","level":"A","status":"covered","semantic_ids":["semantics.keyboard"]},
34
+ {"id":"2.1.4","title":"Character Key Shortcuts","level":"A","status":"gap","semantic_ids":[],"note":"Keyboard operability does not define shortcut remapping or deactivation."},
35
+ {"id":"2.2.1","title":"Timing Adjustable","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule encodes timing adjustment and its exceptions."},
36
+ {"id":"2.2.2","title":"Pause, Stop, Hide","level":"A","status":"covered","semantic_ids":["semantics.motion-control"]},
37
+ {"id":"2.3.1","title":"Three Flashes or Below Threshold","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule limits flashing content."},
38
+ {"id":"2.4.1","title":"Bypass Blocks","level":"A","status":"gap","semantic_ids":[],"note":"Landmarks alone do not establish a required bypass mechanism."},
39
+ {"id":"2.4.2","title":"Page Titled","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule requires descriptive page titles."},
40
+ {"id":"2.4.3","title":"Focus Order","level":"A","status":"gap","semantic_ids":[],"note":"Pattern focus lifecycles do not establish document-wide focus order."},
41
+ {"id":"2.4.4","title":"Link Purpose (In Context)","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule explicitly defines contextual link purpose."},
42
+ {"id":"2.4.5","title":"Multiple Ways","level":"AA","status":"gap","semantic_ids":[],"note":"No semantic rule requires multiple ways to locate pages."},
43
+ {"id":"2.4.6","title":"Headings and Labels","level":"AA","status":"partial","semantic_ids":["semantics.headings"],"note":"Heading structure is covered, but a unified descriptive-purpose rule for all headings and labels is absent."},
44
+ {"id":"2.4.7","title":"Focus Visible","level":"AA","status":"covered","semantic_ids":["semantics.focus.visible"]},
45
+ {"id":"2.4.11","title":"Focus Not Obscured (Minimum)","level":"AA","status":"covered","semantic_ids":["semantics.focus.visible"]},
46
+ {"id":"2.5.1","title":"Pointer Gestures","level":"A","status":"gap","semantic_ids":[],"note":"Keyboard operation does not guarantee a single-pointer alternative to multipoint or path-based gestures."},
47
+ {"id":"2.5.2","title":"Pointer Cancellation","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule defines down-event cancellation behavior."},
48
+ {"id":"2.5.3","title":"Label in Name","level":"A","status":"covered","semantic_ids":["semantics.accessible-name"]},
49
+ {"id":"2.5.4","title":"Motion Actuation","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule addresses device or user motion actuation."},
50
+ {"id":"2.5.7","title":"Dragging Movements","level":"AA","status":"covered","semantic_ids":["semantics.dragging-alternative"]},
51
+ {"id":"2.5.8","title":"Target Size (Minimum)","level":"AA","status":"covered","semantic_ids":["semantics.target-size"]},
52
+ {"id":"3.1.1","title":"Language of Page","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule explicitly requires the default page language."},
53
+ {"id":"3.1.2","title":"Language of Parts","level":"AA","status":"gap","semantic_ids":[],"note":"No semantic rule explicitly identifies changes in human language."},
54
+ {"id":"3.2.1","title":"On Focus","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule prohibits unexpected context changes on focus."},
55
+ {"id":"3.2.2","title":"On Input","level":"A","status":"gap","semantic_ids":[],"note":"No semantic rule prohibits unexpected context changes on input."},
56
+ {"id":"3.2.3","title":"Consistent Navigation","level":"AA","status":"gap","semantic_ids":[],"note":"Landmarks do not establish consistent repeated navigation order."},
57
+ {"id":"3.2.4","title":"Consistent Identification","level":"AA","status":"gap","semantic_ids":[],"note":"No semantic rule requires consistent identification of repeated components."},
58
+ {"id":"3.2.6","title":"Consistent Help","level":"A","status":"covered","semantic_ids":["semantics.consistent-help"]},
59
+ {"id":"3.3.1","title":"Error Identification","level":"A","status":"covered","semantic_ids":["semantics.form-error"]},
60
+ {"id":"3.3.2","title":"Labels or Instructions","level":"A","status":"partial","semantic_ids":["semantics.form-label","semantics.form-required"],"note":"Labels and requiredness are covered, but a dedicated rule for format and task-specific input instructions is absent."},
61
+ {"id":"3.3.3","title":"Error Suggestion","level":"AA","status":"covered","semantic_ids":["semantics.form-error"]},
62
+ {"id":"3.3.4","title":"Error Prevention (Legal, Financial, Data)","level":"AA","status":"covered","semantic_ids":["semantics.consequential-action"]},
63
+ {"id":"3.3.7","title":"Redundant Entry","level":"A","status":"covered","semantic_ids":["semantics.redundant-entry"]},
64
+ {"id":"3.3.8","title":"Accessible Authentication (Minimum)","level":"AA","status":"covered","semantic_ids":["semantics.accessible-authentication"]},
65
+ {"id":"4.1.2","title":"Name, Role, Value","level":"A","status":"covered","semantic_ids":["semantics.accessible-name","semantics.expanded-state","semantics.name-role-value","semantics.native-dialog","semantics.roles-states-properties","semantics.selected-state"]},
66
+ {"id":"4.1.3","title":"Status Messages","level":"AA","status":"covered","semantic_ids":["semantics.alert","semantics.live-status"]}
67
+ ]
68
+ }
@@ -1 +1 @@
1
- {"id":"pattern.accordion","version":"1.0.0","title":"Accordion","kind":"pattern","requires":["semantics.native-elements","semantics.accessible-name","semantics.expanded-state","semantics.keyboard","semantics.focus.visible"],"activation":{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.accordion"}},"scope":"Grouped disclosure sections","behavior":["Toggle only the controlled panel","Preserve DOM and focus order"],"product_decisions":["single_or_multiple_open"],"functional_spec_bindings":["behavior","states","keyboard"],"implementation_outcomes":["accordion-control","accordion-panel"],"evidence_routes":["unit","axe","e2e","human"]}
1
+ {"id":"pattern.accordion","version":"1.0.0","title":"Accordion","kind":"pattern","standards_refs":[{"authority":"aria-apg","identifier":"accordion","url":"https://www.w3.org/WAI/ARIA/apg/patterns/accordion/","normative":false}],"requires":["semantics.native-elements","semantics.accessible-name","semantics.expanded-state","semantics.keyboard","semantics.focus.visible"],"activation":{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.accordion"}},"scope":"Grouped disclosure sections","behavior":["Toggle only the controlled panel","Preserve DOM and focus order"],"product_decisions":["single_or_multiple_open"],"functional_spec_bindings":["behavior","states","keyboard"],"implementation_outcomes":["accordion-control","accordion-panel"],"evidence_routes":["unit","axe","e2e","human"]}
@@ -1 +1 @@
1
- {"id":"pattern.disclosure","version":"1.0.0","title":"Disclosure","kind":"pattern","requires":["semantics.native-elements","semantics.accessible-name","semantics.expanded-state","semantics.keyboard"],"activation":{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.disclosure"}},"scope":"Show and hide supplementary content","behavior":["Control toggles one region"],"product_decisions":["initial_state"],"functional_spec_bindings":["behavior","states"],"implementation_outcomes":["disclosure-control"],"evidence_routes":["unit","axe","e2e"]}
1
+ {"id":"pattern.disclosure","version":"1.0.0","title":"Disclosure","kind":"pattern","standards_refs":[{"authority":"aria-apg","identifier":"disclosure","url":"https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/","normative":false}],"requires":["semantics.native-elements","semantics.accessible-name","semantics.expanded-state","semantics.keyboard"],"activation":{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.disclosure"}},"scope":"Show and hide supplementary content","behavior":["Control toggles one region"],"product_decisions":["initial_state"],"functional_spec_bindings":["behavior","states"],"implementation_outcomes":["disclosure-control"],"evidence_routes":["unit","axe","e2e"]}