@verndale/accessibility-standards 1.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.
- package/OPERATING.md +3 -1
- package/README.md +4 -0
- package/bin/accessibility-standards.mjs +1 -1
- package/dist/manifest.json +159 -101
- package/dist/profiles/ai-orchestration/coverage-manifest.json +724 -68
- package/dist/profiles/ai-orchestration/implementation/accessibility.md +825 -10
- package/dist/profiles/ai-orchestration/pattern-contracts.json +1015 -343
- package/dist/profiles/ai-orchestration/patterns/accordion.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/alert.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/carousel.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/checkbox.md +27 -0
- package/dist/profiles/ai-orchestration/patterns/combobox.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/consequential-submission.md +15 -1
- package/dist/profiles/ai-orchestration/patterns/dialog.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/disclosure.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/dynamic-status.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/field.md +15 -0
- package/dist/profiles/ai-orchestration/patterns/image.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/listbox.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/media-player.md +17 -0
- package/dist/profiles/ai-orchestration/patterns/menu-button.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/menu.md +30 -0
- package/dist/profiles/ai-orchestration/patterns/pagination.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/popover.md +15 -0
- package/dist/profiles/ai-orchestration/patterns/progress.md +15 -0
- package/dist/profiles/ai-orchestration/patterns/radio-group.md +27 -0
- package/dist/profiles/ai-orchestration/patterns/slider.md +31 -0
- package/dist/profiles/ai-orchestration/patterns/spinbutton.md +28 -0
- package/dist/profiles/ai-orchestration/patterns/tabs.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/tooltip.md +14 -0
- package/dist/profiles/ai-orchestration/patterns/tree-view.md +31 -0
- package/dist/profiles/ai-orchestration/patterns/validation.md +15 -0
- package/dist/profiles/ai-orchestration/review/accessibility.md +21 -6
- package/dist/profiles/ai-orchestration/semantics/accessible-authentication.md +13 -0
- package/dist/profiles/ai-orchestration/semantics/accessible-name.md +8 -1
- package/dist/profiles/ai-orchestration/semantics/alert.md +7 -0
- package/dist/profiles/ai-orchestration/semantics/consequential-action.md +6 -1
- package/dist/profiles/ai-orchestration/semantics/consistent-help.md +13 -0
- package/dist/profiles/ai-orchestration/semantics/data-table.md +7 -1
- package/dist/profiles/ai-orchestration/semantics/dragging-alternative.md +13 -0
- package/dist/profiles/ai-orchestration/semantics/expanded-state.md +6 -0
- package/dist/profiles/ai-orchestration/semantics/focus.initial.md +4 -0
- package/dist/profiles/ai-orchestration/semantics/focus.return.md +4 -0
- package/dist/profiles/ai-orchestration/semantics/focus.visible.md +8 -1
- package/dist/profiles/ai-orchestration/semantics/form-error.md +8 -1
- package/dist/profiles/ai-orchestration/semantics/form-label.md +7 -0
- package/dist/profiles/ai-orchestration/semantics/form-required.md +7 -0
- package/dist/profiles/ai-orchestration/semantics/headings.md +7 -0
- package/dist/profiles/ai-orchestration/semantics/keyboard.escape.md +4 -0
- package/dist/profiles/ai-orchestration/semantics/keyboard.md +7 -0
- package/dist/profiles/ai-orchestration/semantics/landmarks.md +6 -0
- package/dist/profiles/ai-orchestration/semantics/live-status.md +7 -1
- package/dist/profiles/ai-orchestration/semantics/media-alternatives.md +11 -0
- package/dist/profiles/ai-orchestration/semantics/motion-control.md +8 -1
- package/dist/profiles/ai-orchestration/semantics/name-role-value.md +6 -1
- package/dist/profiles/ai-orchestration/semantics/native-dialog.md +7 -0
- package/dist/profiles/ai-orchestration/semantics/native-elements.md +5 -0
- package/dist/profiles/ai-orchestration/semantics/non-text-alternative.md +5 -0
- package/dist/profiles/ai-orchestration/semantics/redundant-entry.md +13 -0
- package/dist/profiles/ai-orchestration/semantics/roles-states-properties.md +6 -0
- package/dist/profiles/ai-orchestration/semantics/selected-state.md +6 -0
- package/dist/profiles/ai-orchestration/semantics/target-size.md +6 -1
- package/dist/profiles/ai-orchestration/semantics.json +843 -100
- package/dist/profiles/ai-orchestration/testing/accessibility.md +33 -3
- package/dist/profiles/ai-orchestration/ui-design-brain-bindings.json +836 -0
- package/dist/profiles/conductor/a11y-semantics.md +270 -10
- package/dist/profiles/conductor/accessibility-quality.md +557 -1
- package/dist/profiles/conductor/applicability-matrix.json +270 -230
- package/dist/profiles/conductor/coverage-manifest.json +724 -68
- package/dist/profiles/conductor/pattern-contracts.json +1015 -343
- package/dist/profiles/conductor/patterns/accordion.json +42 -24
- package/dist/profiles/conductor/patterns/alert.json +36 -18
- package/dist/profiles/conductor/patterns/carousel.json +43 -25
- package/dist/profiles/conductor/patterns/checkbox.json +67 -0
- package/dist/profiles/conductor/patterns/combobox.json +44 -26
- package/dist/profiles/conductor/patterns/consequential-submission.json +41 -22
- package/dist/profiles/conductor/patterns/dialog.json +44 -26
- package/dist/profiles/conductor/patterns/disclosure.json +40 -22
- package/dist/profiles/conductor/patterns/dynamic-status.json +38 -19
- package/dist/profiles/conductor/patterns/field.json +58 -22
- package/dist/profiles/conductor/patterns/image.json +48 -19
- package/dist/profiles/conductor/patterns/listbox.json +42 -24
- package/dist/profiles/conductor/patterns/media-player.json +76 -26
- package/dist/profiles/conductor/patterns/menu-button.json +41 -23
- package/dist/profiles/conductor/patterns/menu.json +78 -0
- package/dist/profiles/conductor/patterns/pagination.json +41 -22
- package/dist/profiles/conductor/patterns/popover.json +49 -23
- package/dist/profiles/conductor/patterns/progress.json +45 -20
- package/dist/profiles/conductor/patterns/radio-group.json +69 -0
- package/dist/profiles/conductor/patterns/slider.json +84 -0
- package/dist/profiles/conductor/patterns/spinbutton.json +74 -0
- package/dist/profiles/conductor/patterns/tabs.json +41 -23
- package/dist/profiles/conductor/patterns/tooltip.json +38 -20
- package/dist/profiles/conductor/patterns/tree-view.json +77 -0
- package/dist/profiles/conductor/patterns/validation.json +59 -23
- package/dist/profiles/conductor/semantics.json +843 -100
- package/dist/profiles/conductor/ui-design-brain-bindings.json +836 -0
- package/dist/projection-manifest.json +123 -82
- package/dist/requirements-to-implementation.md +8 -0
- package/lib/build-manifest.mjs +12 -6
- package/lib/build.mjs +21 -7
- package/lib/compile-applicability.mjs +131 -10
- package/lib/coverage.mjs +20 -0
- package/lib/digest.mjs +8 -0
- package/lib/index.mjs +1 -1
- package/lib/load.mjs +44 -1
- package/lib/provenance.mjs +51 -0
- package/lib/render.mjs +115 -31
- package/lib/sync.mjs +242 -28
- package/lib/validate.mjs +557 -24
- package/package.json +27 -10
- package/profiles/ai-orchestration/profile.json +1 -1
- package/profiles/ai-orchestration/templates/patterns/README.md +1 -1
- package/profiles/ai-orchestration/templates/review/README.md +1 -1
- package/profiles/ai-orchestration/templates/semantics/README.md +1 -1
- package/profiles/ai-orchestration/templates/testing/README.md +1 -1
- package/profiles/conductor/profile.json +1 -1
- package/profiles/conductor/templates/evidence/README.md +1 -1
- package/profiles/conductor/templates/patterns/README.md +1 -1
- package/profiles/conductor/templates/semantics/README.md +1 -1
- package/schemas/consumer-config.schema.json +1 -1
- package/schemas/contract.schema.json +1 -0
- package/schemas/manifest.schema.json +1 -1
- package/schemas/pattern.schema.json +98 -1
- package/schemas/profile.schema.json +1 -1
- package/schemas/projection-manifest.schema.json +84 -1
- package/schemas/semantic.schema.json +26 -1
- package/schemas/standards-reference.schema.json +105 -0
- package/schemas/ui-design-brain-bindings.schema.json +86 -0
- package/schemas/wcag-coverage.schema.json +93 -0
- package/src/applicability/facts.yml +27 -1
- package/src/applicability/matrix.yml +8 -9
- package/src/applicability/ui-design-brain-bindings.yml +196 -0
- package/src/contract.yml +1 -0
- package/src/coverage/wcag-2.2.yml +68 -0
- package/src/patterns/disclosure/accordion.yml +1 -1
- package/src/patterns/disclosure/disclosure.yml +1 -1
- package/src/patterns/feedback/alert.yml +1 -1
- package/src/patterns/feedback/dynamic-status.yml +1 -1
- package/src/patterns/feedback/progress.yml +1 -1
- package/src/patterns/forms/consequential-submission.yml +1 -1
- package/src/patterns/forms/field.yml +1 -1
- package/src/patterns/forms/spinbutton.yml +1 -0
- package/src/patterns/forms/validation.yml +1 -1
- package/src/patterns/media/carousel.yml +1 -1
- package/src/patterns/media/image.yml +1 -1
- package/src/patterns/media/media-player.yml +1 -1
- package/src/patterns/navigation/menu-button.yml +1 -1
- package/src/patterns/navigation/menu.yml +1 -0
- package/src/patterns/navigation/pagination.yml +1 -1
- package/src/patterns/navigation/tabs.yml +1 -1
- package/src/patterns/navigation/tree-view.yml +1 -0
- package/src/patterns/overlays/dialog.yml +1 -1
- package/src/patterns/overlays/popover.yml +1 -1
- package/src/patterns/overlays/tooltip.yml +1 -1
- package/src/patterns/selection/checkbox.yml +1 -0
- package/src/patterns/selection/combobox.yml +1 -1
- package/src/patterns/selection/listbox.yml +1 -1
- package/src/patterns/selection/radio-group.yml +1 -0
- package/src/patterns/selection/slider.yml +1 -0
- package/src/semantics/accessible-names.yml +1 -1
- package/src/semantics/forms.yml +1 -1
- package/src/semantics/headings-landmarks.yml +1 -1
- package/src/semantics/keyboard-focus.yml +1 -1
- package/src/semantics/live-regions.yml +1 -1
- package/src/semantics/media.yml +1 -1
- package/src/semantics/native-elements.yml +1 -1
- package/src/semantics/roles-states-properties.yml +1 -1
- package/src/semantics/tables.yml +1 -1
- package/src/semantics/wcag-2.2.yml +1 -0
- package/src/sources.yml +1 -1
|
@@ -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
|
+
}
|
|
@@ -1 +1,27 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"facts": {
|
|
4
|
+
"artifact.page_context": { "type": "boolean" },
|
|
5
|
+
"content.has_non_text": { "type": "boolean" },
|
|
6
|
+
"content.has_media": { "type": "boolean" },
|
|
7
|
+
"component.ui_pattern_ids": { "type": "array", "items": "string", "source": "ui-design-brain" },
|
|
8
|
+
"component.accessibility_pattern_ids": { "type": "array", "items": "string", "derived": true },
|
|
9
|
+
"component.command_menu_trigger": { "type": "boolean" },
|
|
10
|
+
"component.has_form_fields": { "type": "boolean" },
|
|
11
|
+
"component.has_validation": { "type": "boolean" },
|
|
12
|
+
"component.submission_consequence": { "type": "array", "items": "string" },
|
|
13
|
+
"component.has_dynamic_status": { "type": "boolean" },
|
|
14
|
+
"component.message_urgency": { "type": "string" },
|
|
15
|
+
"component.overlay_model": { "type": "string" },
|
|
16
|
+
"component.selection_model": { "type": "string" },
|
|
17
|
+
"interaction.has_motion_or_timing": { "type": "boolean" },
|
|
18
|
+
"interaction.has_complex_pointer": { "type": "boolean" },
|
|
19
|
+
"interaction.has_dragging": { "type": "boolean" },
|
|
20
|
+
"interaction.has_pointer_targets": { "type": "boolean" },
|
|
21
|
+
"interaction.can_obscure_focus": { "type": "boolean" },
|
|
22
|
+
"flow.has_authentication": { "type": "boolean" },
|
|
23
|
+
"flow.repeats_entry": { "type": "boolean" },
|
|
24
|
+
"artifact.has_repeated_help_across_page_set": { "type": "boolean" },
|
|
25
|
+
"component.has_data_table": { "type": "boolean" }
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -2,19 +2,18 @@
|
|
|
2
2
|
{"id":"applicability.page-context","when":{"equals":{"fact":"artifact.page_context","value":true}},"outcomes":["semantics.headings","semantics.landmarks"],"evidence":["axe","human"]},
|
|
3
3
|
{"id":"applicability.non-text-content","when":{"equals":{"fact":"content.has_non_text","value":true}},"outcomes":["pattern.image"],"evidence":["axe","human"]},
|
|
4
4
|
{"id":"applicability.media","when":{"equals":{"fact":"content.has_media","value":true}},"outcomes":["pattern.media-player"],"evidence":["e2e","human"]},
|
|
5
|
-
{"id":"applicability.forms","when":{"equals":{"fact":"component.has_form_fields","value":true}},"outcomes":["pattern.field"
|
|
5
|
+
{"id":"applicability.forms","when":{"equals":{"fact":"component.has_form_fields","value":true}},"outcomes":["pattern.field"],"evidence":["unit","axe"]},
|
|
6
|
+
{"id":"applicability.validation","when":{"equals":{"fact":"component.has_validation","value":true}},"outcomes":["pattern.validation"],"evidence":["unit","axe","e2e","human"]},
|
|
6
7
|
{"id":"applicability.consequential-submission","when":{"contains":{"fact":"component.submission_consequence","value":"consequential"}},"outcomes":["pattern.consequential-submission"],"evidence":["e2e","human"]},
|
|
7
8
|
{"id":"applicability.dynamic-status","when":{"equals":{"fact":"component.has_dynamic_status","value":true}},"outcomes":["pattern.dynamic-status"],"evidence":["unit","e2e","human"]},
|
|
8
|
-
{"id":"applicability.overlays","when":{"contains":{"fact":"component.
|
|
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"]},
|
|
9
10
|
{"id":"applicability.motion-timing","when":{"equals":{"fact":"interaction.has_motion_or_timing","value":true}},"outcomes":["semantics.motion-control"],"evidence":["e2e","human"]},
|
|
10
11
|
{"id":"applicability.complex-pointer","when":{"equals":{"fact":"interaction.has_complex_pointer","value":true}},"outcomes":["semantics.keyboard"],"evidence":["e2e","human"]},
|
|
11
|
-
{"id":"applicability.
|
|
12
|
-
{"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"]},
|
|
13
13
|
{"id":"applicability.target-size","when":{"equals":{"fact":"interaction.has_pointer_targets","value":true}},"outcomes":["semantics.target-size"],"evidence":["e2e","human"]},
|
|
14
14
|
{"id":"applicability.focus-obstruction","when":{"equals":{"fact":"interaction.can_obscure_focus","value":true}},"outcomes":["semantics.focus.visible"],"evidence":["e2e","human"]},
|
|
15
|
-
{"id":"applicability.authentication
|
|
16
|
-
{"id":"applicability.redundant-entry","when":{"equals":{"fact":"flow.repeats_entry","value":true}},"outcomes":["semantics.form-label"],"evidence":["e2e","human"]},
|
|
17
|
-
{"id":"applicability.consistent-help","when":{"equals":{"fact":"artifact.
|
|
18
|
-
{"id":"applicability.
|
|
19
|
-
{"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"]}
|
|
20
19
|
]}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"source": {
|
|
4
|
+
"package": "@verndale/ui-design-brain",
|
|
5
|
+
"package_version": "1.16.0",
|
|
6
|
+
"catalog_authority_version": "1.15.1",
|
|
7
|
+
"repository": "https://github.com/verndale/ui-design-brain",
|
|
8
|
+
"manifest_path": "skills/ui-design-brain/catalog-manifest.json",
|
|
9
|
+
"source_digest": "sha256:1eda596fe341786b5ada25742b6487bc06685fff17cbd582bc1b58302097e3ff",
|
|
10
|
+
"manifest_digest": "sha256:63a0bc8d9537d6d4c0aef8fd8a539bf4a9181a50d0761bd63eae6fe59b4eddc9",
|
|
11
|
+
"pattern_count": 80,
|
|
12
|
+
"tracking_issue": "https://github.com/verndale/ui-design-brain/issues/47"
|
|
13
|
+
},
|
|
14
|
+
"bindings": [
|
|
15
|
+
{ "ui_pattern_id": "accordion", "classification": "direct", "pattern_ids": ["pattern.accordion"] },
|
|
16
|
+
{
|
|
17
|
+
"ui_pattern_id": "alert",
|
|
18
|
+
"classification": "candidate",
|
|
19
|
+
"discriminator_facts": ["component.has_dynamic_status", "component.message_urgency"],
|
|
20
|
+
"candidates": [
|
|
21
|
+
{ "pattern_id": "pattern.alert", "when": { "equals": { "fact": "component.message_urgency", "value": "urgent" } } },
|
|
22
|
+
{ "pattern_id": "pattern.dynamic-status", "when": { "equals": { "fact": "component.has_dynamic_status", "value": true } } }
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
{ "ui_pattern_id": "avatar", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.non-text-alternative"] },
|
|
26
|
+
{
|
|
27
|
+
"ui_pattern_id": "badge",
|
|
28
|
+
"classification": "candidate",
|
|
29
|
+
"discriminator_facts": ["component.has_dynamic_status"],
|
|
30
|
+
"candidates": [
|
|
31
|
+
{ "pattern_id": "pattern.dynamic-status", "when": { "equals": { "fact": "component.has_dynamic_status", "value": true } } }
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{ "ui_pattern_id": "breadcrumbs", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.landmarks", "semantics.native-elements"] },
|
|
35
|
+
{ "ui_pattern_id": "button", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.accessible-name", "semantics.focus.visible", "semantics.keyboard", "semantics.name-role-value", "semantics.native-elements", "semantics.target-size"] },
|
|
36
|
+
{ "ui_pattern_id": "button-group", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.accessible-name", "semantics.focus.visible", "semantics.keyboard", "semantics.native-elements"] },
|
|
37
|
+
{ "ui_pattern_id": "card", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
|
|
38
|
+
{ "ui_pattern_id": "carousel", "classification": "direct", "pattern_ids": ["pattern.carousel"] },
|
|
39
|
+
{ "ui_pattern_id": "checkbox", "classification": "direct", "pattern_ids": ["pattern.checkbox", "pattern.field"] },
|
|
40
|
+
{ "ui_pattern_id": "color-picker", "classification": "direct", "pattern_ids": ["pattern.field"] },
|
|
41
|
+
{ "ui_pattern_id": "combobox", "classification": "direct", "pattern_ids": ["pattern.combobox", "pattern.field"] },
|
|
42
|
+
{ "ui_pattern_id": "comparison-table", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.data-table"] },
|
|
43
|
+
{ "ui_pattern_id": "context-menu", "classification": "direct", "pattern_ids": ["pattern.menu"] },
|
|
44
|
+
{ "ui_pattern_id": "date-input", "classification": "direct", "pattern_ids": ["pattern.field"] },
|
|
45
|
+
{
|
|
46
|
+
"ui_pattern_id": "datepicker",
|
|
47
|
+
"classification": "candidate",
|
|
48
|
+
"pattern_ids": ["pattern.field"],
|
|
49
|
+
"discriminator_facts": ["component.overlay_model"],
|
|
50
|
+
"candidates": [
|
|
51
|
+
{ "pattern_id": "pattern.dialog", "when": { "equals": { "fact": "component.overlay_model", "value": "modal" } } },
|
|
52
|
+
{ "pattern_id": "pattern.popover", "when": { "equals": { "fact": "component.overlay_model", "value": "non-modal" } } }
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"ui_pattern_id": "drawer",
|
|
57
|
+
"classification": "candidate",
|
|
58
|
+
"discriminator_facts": ["component.overlay_model"],
|
|
59
|
+
"candidates": [
|
|
60
|
+
{ "pattern_id": "pattern.dialog", "when": { "equals": { "fact": "component.overlay_model", "value": "modal" } } },
|
|
61
|
+
{ "pattern_id": "pattern.disclosure", "when": { "equals": { "fact": "component.overlay_model", "value": "inline" } } },
|
|
62
|
+
{ "pattern_id": "pattern.popover", "when": { "equals": { "fact": "component.overlay_model", "value": "non-modal" } } }
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
{ "ui_pattern_id": "dropdown-menu", "classification": "direct", "pattern_ids": ["pattern.menu", "pattern.menu-button"] },
|
|
66
|
+
{
|
|
67
|
+
"ui_pattern_id": "empty-state",
|
|
68
|
+
"classification": "candidate",
|
|
69
|
+
"discriminator_facts": ["component.has_dynamic_status"],
|
|
70
|
+
"candidates": [
|
|
71
|
+
{ "pattern_id": "pattern.dynamic-status", "when": { "equals": { "fact": "component.has_dynamic_status", "value": true } } }
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{ "ui_pattern_id": "error-message", "classification": "direct", "pattern_ids": ["pattern.validation"] },
|
|
75
|
+
{ "ui_pattern_id": "eyebrow", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
|
|
76
|
+
{ "ui_pattern_id": "fieldset", "classification": "direct", "pattern_ids": ["pattern.field"] },
|
|
77
|
+
{ "ui_pattern_id": "file", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
|
|
78
|
+
{ "ui_pattern_id": "file-upload", "classification": "direct", "pattern_ids": ["pattern.field"] },
|
|
79
|
+
{
|
|
80
|
+
"ui_pattern_id": "filter",
|
|
81
|
+
"classification": "candidate",
|
|
82
|
+
"discriminator_facts": ["component.has_form_fields"],
|
|
83
|
+
"candidates": [
|
|
84
|
+
{ "pattern_id": "pattern.field", "when": { "equals": { "fact": "component.has_form_fields", "value": true } } }
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
{ "ui_pattern_id": "footer", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.landmarks"] },
|
|
88
|
+
{ "ui_pattern_id": "form", "classification": "direct", "pattern_ids": ["pattern.field"] },
|
|
89
|
+
{ "ui_pattern_id": "header", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.landmarks"] },
|
|
90
|
+
{ "ui_pattern_id": "heading", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.headings"] },
|
|
91
|
+
{ "ui_pattern_id": "helper-text", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
|
|
92
|
+
{ "ui_pattern_id": "hero", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.headings"] },
|
|
93
|
+
{ "ui_pattern_id": "icon", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.non-text-alternative"] },
|
|
94
|
+
{ "ui_pattern_id": "image", "classification": "direct", "pattern_ids": ["pattern.image"] },
|
|
95
|
+
{ "ui_pattern_id": "in-page-navigation", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.accessible-name", "semantics.focus.visible", "semantics.keyboard", "semantics.landmarks", "semantics.native-elements"] },
|
|
96
|
+
{ "ui_pattern_id": "label", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.form-label"] },
|
|
97
|
+
{ "ui_pattern_id": "link", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.accessible-name", "semantics.focus.visible", "semantics.keyboard", "semantics.native-elements", "semantics.target-size"] },
|
|
98
|
+
{ "ui_pattern_id": "list", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
|
|
99
|
+
{ "ui_pattern_id": "logo-bar", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.non-text-alternative"] },
|
|
100
|
+
{ "ui_pattern_id": "marquee", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.motion-control"] },
|
|
101
|
+
{ "ui_pattern_id": "masthead", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.headings", "semantics.landmarks"] },
|
|
102
|
+
{ "ui_pattern_id": "media-object", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.non-text-alternative"] },
|
|
103
|
+
{
|
|
104
|
+
"ui_pattern_id": "mega-menu",
|
|
105
|
+
"classification": "candidate",
|
|
106
|
+
"discriminator_facts": ["component.command_menu_trigger"],
|
|
107
|
+
"candidates": [
|
|
108
|
+
{ "pattern_id": "pattern.menu-button", "when": { "equals": { "fact": "component.command_menu_trigger", "value": true } } }
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
{ "ui_pattern_id": "modal", "classification": "direct", "pattern_ids": ["pattern.dialog"] },
|
|
112
|
+
{
|
|
113
|
+
"ui_pattern_id": "navigation",
|
|
114
|
+
"classification": "candidate",
|
|
115
|
+
"discriminator_facts": ["component.command_menu_trigger"],
|
|
116
|
+
"candidates": [
|
|
117
|
+
{ "pattern_id": "pattern.menu-button", "when": { "equals": { "fact": "component.command_menu_trigger", "value": true } } }
|
|
118
|
+
]
|
|
119
|
+
},
|
|
120
|
+
{ "ui_pattern_id": "number-input", "classification": "direct", "pattern_ids": ["pattern.field", "pattern.spinbutton"] },
|
|
121
|
+
{ "ui_pattern_id": "pagination", "classification": "direct", "pattern_ids": ["pattern.pagination"] },
|
|
122
|
+
{ "ui_pattern_id": "popover", "classification": "direct", "pattern_ids": ["pattern.popover"] },
|
|
123
|
+
{ "ui_pattern_id": "progress-bar", "classification": "direct", "pattern_ids": ["pattern.progress"] },
|
|
124
|
+
{ "ui_pattern_id": "progress-indicator", "classification": "direct", "pattern_ids": ["pattern.progress"] },
|
|
125
|
+
{ "ui_pattern_id": "quote", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
|
|
126
|
+
{ "ui_pattern_id": "radio-button", "classification": "direct", "pattern_ids": ["pattern.field", "pattern.radio-group"] },
|
|
127
|
+
{ "ui_pattern_id": "rating", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.name-role-value"] },
|
|
128
|
+
{ "ui_pattern_id": "rich-text", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.headings", "semantics.native-elements"] },
|
|
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"] },
|
|
130
|
+
{ "ui_pattern_id": "search-input", "classification": "direct", "pattern_ids": ["pattern.field"] },
|
|
131
|
+
{
|
|
132
|
+
"ui_pattern_id": "search-overlay",
|
|
133
|
+
"classification": "candidate",
|
|
134
|
+
"discriminator_facts": ["component.overlay_model"],
|
|
135
|
+
"candidates": [
|
|
136
|
+
{ "pattern_id": "pattern.dialog", "when": { "equals": { "fact": "component.overlay_model", "value": "modal" } } },
|
|
137
|
+
{ "pattern_id": "pattern.popover", "when": { "equals": { "fact": "component.overlay_model", "value": "non-modal" } } }
|
|
138
|
+
]
|
|
139
|
+
},
|
|
140
|
+
{ "ui_pattern_id": "section-header", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.headings"] },
|
|
141
|
+
{ "ui_pattern_id": "segmented-control", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.accessible-name", "semantics.focus.visible", "semantics.keyboard", "semantics.selected-state"] },
|
|
142
|
+
{
|
|
143
|
+
"ui_pattern_id": "select",
|
|
144
|
+
"classification": "candidate",
|
|
145
|
+
"pattern_ids": ["pattern.field"],
|
|
146
|
+
"discriminator_facts": ["component.selection_model"],
|
|
147
|
+
"candidates": [
|
|
148
|
+
{ "pattern_id": "pattern.combobox", "when": { "equals": { "fact": "component.selection_model", "value": "combobox" } } },
|
|
149
|
+
{ "pattern_id": "pattern.listbox", "when": { "equals": { "fact": "component.selection_model", "value": "listbox" } } }
|
|
150
|
+
]
|
|
151
|
+
},
|
|
152
|
+
{ "ui_pattern_id": "separator", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
|
|
153
|
+
{
|
|
154
|
+
"ui_pattern_id": "sidebar",
|
|
155
|
+
"classification": "candidate",
|
|
156
|
+
"discriminator_facts": ["component.command_menu_trigger"],
|
|
157
|
+
"candidates": [
|
|
158
|
+
{ "pattern_id": "pattern.menu-button", "when": { "equals": { "fact": "component.command_menu_trigger", "value": true } } }
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"ui_pattern_id": "skeleton",
|
|
163
|
+
"classification": "candidate",
|
|
164
|
+
"discriminator_facts": ["component.has_dynamic_status"],
|
|
165
|
+
"candidates": [
|
|
166
|
+
{ "pattern_id": "pattern.dynamic-status", "when": { "equals": { "fact": "component.has_dynamic_status", "value": true } } }
|
|
167
|
+
]
|
|
168
|
+
},
|
|
169
|
+
{ "ui_pattern_id": "skip-link", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.accessible-name", "semantics.focus.visible", "semantics.keyboard", "semantics.native-elements"] },
|
|
170
|
+
{ "ui_pattern_id": "slider", "classification": "direct", "pattern_ids": ["pattern.field", "pattern.slider"] },
|
|
171
|
+
{ "ui_pattern_id": "spinner", "classification": "direct", "pattern_ids": ["pattern.progress"] },
|
|
172
|
+
{ "ui_pattern_id": "stack", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
|
|
173
|
+
{ "ui_pattern_id": "stat", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
|
|
174
|
+
{ "ui_pattern_id": "stepper", "classification": "direct", "pattern_ids": ["pattern.field", "pattern.spinbutton"] },
|
|
175
|
+
{ "ui_pattern_id": "table", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.data-table"] },
|
|
176
|
+
{ "ui_pattern_id": "tabs", "classification": "direct", "pattern_ids": ["pattern.tabs"] },
|
|
177
|
+
{ "ui_pattern_id": "text-input", "classification": "direct", "pattern_ids": ["pattern.field"] },
|
|
178
|
+
{ "ui_pattern_id": "textarea", "classification": "direct", "pattern_ids": ["pattern.field"] },
|
|
179
|
+
{
|
|
180
|
+
"ui_pattern_id": "toast",
|
|
181
|
+
"classification": "candidate",
|
|
182
|
+
"discriminator_facts": ["component.has_dynamic_status", "component.message_urgency"],
|
|
183
|
+
"candidates": [
|
|
184
|
+
{ "pattern_id": "pattern.alert", "when": { "equals": { "fact": "component.message_urgency", "value": "urgent" } } },
|
|
185
|
+
{ "pattern_id": "pattern.dynamic-status", "when": { "equals": { "fact": "component.has_dynamic_status", "value": true } } }
|
|
186
|
+
]
|
|
187
|
+
},
|
|
188
|
+
{ "ui_pattern_id": "toggle", "classification": "direct", "pattern_ids": ["pattern.field"] },
|
|
189
|
+
{ "ui_pattern_id": "tooltip", "classification": "direct", "pattern_ids": ["pattern.tooltip"] },
|
|
190
|
+
{ "ui_pattern_id": "tree-view", "classification": "direct", "pattern_ids": ["pattern.tree-view"] },
|
|
191
|
+
{ "ui_pattern_id": "utility-bar", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.landmarks"] },
|
|
192
|
+
{ "ui_pattern_id": "video", "classification": "direct", "pattern_ids": ["pattern.media-player"] },
|
|
193
|
+
{ "ui_pattern_id": "visually-hidden", "classification": "baseline-only", "baseline_semantic_ids": ["semantics.native-elements"] },
|
|
194
|
+
{ "ui_pattern_id": "wizard", "classification": "direct", "pattern_ids": ["pattern.field"] }
|
|
195
|
+
]
|
|
196
|
+
}
|
package/src/contract.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
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":{"fact":"component.
|
|
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":{"fact":"component.
|
|
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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"pattern.alert","version":"1.0.0","title":"Alert","kind":"pattern","requires":["semantics.alert"],"activation":{"fact":"component.
|
|
1
|
+
{"id":"pattern.alert","version":"1.0.0","title":"Alert","kind":"pattern","standards_refs":[{"authority":"aria-apg","identifier":"alert","url":"https://www.w3.org/WAI/ARIA/apg/patterns/alert/","normative":false}],"requires":["semantics.alert"],"activation":{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.alert"}},"scope":"Urgent message","behavior":["Announce once without moving focus"],"product_decisions":["urgency"],"functional_spec_bindings":["messaging"],"implementation_outcomes":["alert-announcement"],"evidence_routes":["unit","human"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"pattern.dynamic-status","version":"1.0.0","title":"Dynamic status","kind":"pattern","requires":["semantics.live-status"],"activation":{"fact":"component.has_dynamic_status","
|
|
1
|
+
{"id":"pattern.dynamic-status","version":"1.0.0","title":"Dynamic status","kind":"pattern","standards_refs":[{"authority":"wcag-2.2","identifier":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","normative":true,"level":"AA"}],"requires":["semantics.live-status"],"activation":{"equals":{"fact":"component.has_dynamic_status","value":true}},"scope":"Asynchronous status message","behavior":["Announce meaningful changes once"],"product_decisions":["announcement_copy"],"functional_spec_bindings":["messaging","states"],"implementation_outcomes":["status-live-region"],"evidence_routes":["unit","e2e","human"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"pattern.progress","version":"1.0.0","title":"Progress","kind":"pattern","requires":["semantics.name-role-value","semantics.live-status"],"activation":{"fact":"component.
|
|
1
|
+
{"id":"pattern.progress","version":"1.0.0","title":"Progress","kind":"pattern","standards_refs":[{"authority":"wai-aria-1.2","identifier":"progressbar","url":"https://www.w3.org/TR/wai-aria-1.2/#progressbar","normative":true},{"authority":"wcag-2.2","identifier":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","normative":true,"level":"A"}],"requires":["semantics.name-role-value","semantics.live-status"],"activation":{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.progress"}},"scope":"Determinate or indeterminate progress","behavior":["Expose value and completion changes without announcement noise"],"product_decisions":["determinate"],"functional_spec_bindings":["states","messaging"],"implementation_outcomes":["progress-value"],"evidence_routes":["unit","axe","human"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"pattern.consequential-submission","version":"1.0.0","title":"Consequential submission","kind":"pattern","requires":["semantics.consequential-action","semantics.form-error","semantics.keyboard"],"activation":{"fact":"component.submission_consequence","
|
|
1
|
+
{"id":"pattern.consequential-submission","version":"1.0.0","title":"Consequential submission","kind":"pattern","standards_refs":[{"authority":"wcag-2.2","identifier":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","normative":true,"level":"AA"}],"requires":["semantics.consequential-action","semantics.form-error","semantics.keyboard"],"activation":{"contains":{"fact":"component.submission_consequence","value":"consequential"}},"scope":"Legal commitments, financial transactions, stored user-controllable data changes, or user test-response submissions","behavior":["Provide at least one declared safeguard: make the submission reversible; check user-entered data for errors and let the user correct them; or let the user review, confirm, and correct information before finalizing"],"product_decisions":["safeguard","reversal_window"],"functional_spec_bindings":["submission","confirmation"],"implementation_outcomes":["submission-safeguard"],"evidence_routes":["e2e","human"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"pattern.field","version":"1.0.0","title":"Form field","kind":"pattern","requires":["semantics.form-label","semantics.form-required","semantics.focus.visible"],"activation":{"fact":"component.
|
|
1
|
+
{"id":"pattern.field","version":"1.0.0","title":"Form field","kind":"pattern","standards_refs":[{"authority":"wcag-2.2","identifier":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","normative":true,"level":"A"},{"authority":"wcag-2.2","identifier":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","normative":true,"level":"A"}],"requires":["semantics.form-label","semantics.form-required","semantics.focus.visible"],"activation":{"any":[{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.field"}},{"equals":{"fact":"component.has_form_fields","value":true}}]},"scope":"Labeled form input","behavior":["Expose label, instructions, and requiredness before interaction"],"product_decisions":["required","instructions"],"functional_spec_bindings":["fields","requiredness"],"implementation_outcomes":["field-associations"],"evidence_routes":["unit","axe","human"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"id":"pattern.spinbutton","version":"1.0.0","title":"Spinbutton","kind":"pattern","standards_refs":[{"authority":"aria-apg","identifier":"spinbutton","url":"https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/","normative":false}],"requires":["semantics.accessible-name","semantics.focus.visible","semantics.form-label","semantics.keyboard","semantics.name-role-value","semantics.native-elements","semantics.roles-states-properties"],"activation":{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.spinbutton"}},"scope":"Value input constrained to a discrete set or range, with optional direct text editing","behavior":["Use a native number input when it supplies the required range, step, editing, labeling, and validation behavior; otherwise expose a named spinbutton with synchronized current, minimum, maximum, user-friendly value text, and invalid state when a value is outside the allowed range","Keep focus on the spinbutton while Up and Down change its value, Home and End apply known bounds, and optional Page Up and Page Down apply the declared larger step","Treat the editable decision as permission for direct text entry, not as whether the spinbutton is adjustable; when direct editing is disabled, the declared increment and decrement controls still change the value and the spinbutton is not exposed as read-only","When direct editing is allowed, preserve platform text editing commands and do not intercept keys needed to enter, navigate, select, or modify text"],"product_decisions":["editable","large_step","native_or_custom","range_bounds","step","value_text"],"functional_spec_bindings":["fields","states","keyboard","validation"],"implementation_outcomes":["spinbutton-keyboard-model","spinbutton-native-control-selection","spinbutton-range-state","spinbutton-validation"],"evidence_routes":["unit","axe","e2e","human"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"pattern.validation","version":"1.0.0","title":"Form validation","kind":"pattern","requires":["semantics.form-error","semantics.live-status","semantics.focus.initial"],"activation":{"fact":"component.
|
|
1
|
+
{"id":"pattern.validation","version":"1.0.0","title":"Form validation","kind":"pattern","standards_refs":[{"authority":"wcag-2.2","identifier":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","normative":true,"level":"A"},{"authority":"wcag-2.2","identifier":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","normative":true,"level":"AA"}],"requires":["semantics.form-error","semantics.live-status","semantics.focus.initial"],"activation":{"any":[{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.validation"}},{"equals":{"fact":"component.has_validation","value":true}}]},"scope":"Client or server validation","behavior":["Identify, associate, summarize, and focus errors deterministically"],"product_decisions":["validation_timing","error_summary"],"functional_spec_bindings":["validation","messaging","focus"],"implementation_outcomes":["validation-associations","error-summary"],"evidence_routes":["unit","axe","e2e","human"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"pattern.carousel","version":"1.0.0","title":"Carousel","kind":"pattern","requires":["semantics.accessible-name","semantics.keyboard","semantics.focus.visible","semantics.motion-control","semantics.live-status"],"activation":{"fact":"component.
|
|
1
|
+
{"id":"pattern.carousel","version":"1.0.0","title":"Carousel","kind":"pattern","standards_refs":[{"authority":"aria-apg","identifier":"carousel","url":"https://www.w3.org/WAI/ARIA/apg/patterns/carousel/","normative":false}],"requires":["semantics.accessible-name","semantics.keyboard","semantics.focus.visible","semantics.motion-control","semantics.live-status"],"activation":{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.carousel"}},"scope":"Rotating content set","behavior":["Pause rotation on interaction","Provide named controls and current position"],"product_decisions":["auto_rotation","looping"],"functional_spec_bindings":["behavior","states","controls"],"implementation_outcomes":["carousel-controls","carousel-rotation"],"evidence_routes":["unit","axe","e2e","human"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"pattern.image","version":"1.0.0","title":"Image","kind":"pattern","requires":["semantics.non-text-alternative"],"activation":{"fact":"content.has_non_text","
|
|
1
|
+
{"id":"pattern.image","version":"1.0.0","title":"Image","kind":"pattern","standards_refs":[{"authority":"wcag-2.2","identifier":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","normative":true,"level":"A"}],"requires":["semantics.non-text-alternative"],"activation":{"any":[{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.image"}},{"equals":{"fact":"content.has_non_text","value":true}}]},"scope":"Informative, functional, complex, or decorative image","behavior":["Alternative follows image purpose"],"product_decisions":["purpose","long_description"],"functional_spec_bindings":["content"],"implementation_outcomes":["image-alternative"],"evidence_routes":["axe","human"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"pattern.media-player","version":"1.0.0","title":"Media player","kind":"pattern","requires":["semantics.media-alternatives","semantics.accessible-name","semantics.keyboard","semantics.focus.visible","semantics.motion-control"],"activation":{"fact":"content.has_media","
|
|
1
|
+
{"id":"pattern.media-player","version":"1.0.0","title":"Media player","kind":"pattern","standards_refs":[{"authority":"wcag-2.2","identifier":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","normative":true,"level":"A"},{"authority":"wcag-2.2","identifier":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","normative":true,"level":"A"},{"authority":"wcag-2.2","identifier":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","normative":true,"level":"A"},{"authority":"wcag-2.2","identifier":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","normative":true,"level":"AA"}],"requires":["semantics.media-alternatives","semantics.accessible-name","semantics.keyboard","semantics.focus.visible","semantics.motion-control"],"activation":{"any":[{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.media-player"}},{"equals":{"fact":"content.has_media","value":true}}]},"scope":"Audio or video playback","behavior":["Provide keyboard-operable named controls and required alternatives"],"product_decisions":["captions","transcript","audio_description","autoplay"],"functional_spec_bindings":["content","controls","behavior"],"implementation_outcomes":["media-alternatives","media-controls"],"evidence_routes":["axe","e2e","human"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"pattern.menu-button","version":"1.0.0","title":"Menu button","kind":"pattern","requires":["semantics.accessible-name","semantics.expanded-state","semantics.keyboard","semantics.focus.initial","semantics.focus.return"],"activation":{"fact":"component.
|
|
1
|
+
{"id":"pattern.menu-button","version":"1.0.0","title":"Menu button","kind":"pattern","standards_refs":[{"authority":"aria-apg","identifier":"menu-button","url":"https://www.w3.org/WAI/ARIA/apg/patterns/menu-button/","normative":false}],"requires":["semantics.accessible-name","semantics.expanded-state","semantics.keyboard","semantics.focus.initial","semantics.focus.return"],"activation":{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.menu-button"}},"scope":"Button opening a command menu","behavior":["Open and navigate menu by keyboard"],"product_decisions":["focus_strategy"],"functional_spec_bindings":["behavior","keyboard","focus"],"implementation_outcomes":["menu-button-keyboard"],"evidence_routes":["unit","e2e","human"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"id":"pattern.menu","version":"1.0.0","title":"Menu and menubar","kind":"pattern","standards_refs":[{"authority":"aria-apg","identifier":"menubar","url":"https://www.w3.org/WAI/ARIA/apg/patterns/menubar/","normative":false}],"requires":["semantics.accessible-name","semantics.expanded-state","semantics.focus.initial","semantics.focus.return","semantics.focus.visible","semantics.keyboard","semantics.keyboard.escape","semantics.roles-states-properties"],"activation":{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.menu"}},"scope":"Command menus, submenus, and persistent menubars","behavior":["Expose menu or menubar containers with menuitem, menuitemcheckbox, or menuitemradio children; synchronize submenu expanded state, checkable-item checked state, orientation, and disabled state","When a popup menu opens, move focus to its first item; when a persistent menubar receives focus through Tab or Shift+Tab, restore its declared last-focused item or use its first enabled item; Tab and Shift+Tab do not move among items and, from an item, exit the composite and close all open menus","For the default horizontal menubar with vertical popup menus, Right and Left move among menubar items, Down opens a submenu and focuses its first item, Up may open it and focus its last item, Down and Up move among popup items, Right opens a child submenu, and Left closes a child submenu and returns focus to its parent item; reverse the declared axes for alternate orientations","Enter opens an item's submenu and focuses its first item, or otherwise activates the item and closes the menu; declare whether Space mirrors Enter on plain items, toggles menuitemcheckbox without closing, and checks a menuitemradio while unchecking its group peers without closing","Keep disabled menu items focusable but non-activatable, keep separators non-focusable, and apply Home, End, optional type-ahead, and the declared wrapping policy within the current menu or menubar","Escape closes the menu containing focus and restores focus to its parent item, menu button, or invoking context"],"product_decisions":["entry_focus","focus_strategy","menu_or_menubar","orientation","space_behavior","submenu_model","typeahead","wrap_navigation"],"functional_spec_bindings":["behavior","states","keyboard","focus"],"implementation_outcomes":["menu-composite-focus","menu-keyboard-model","menu-state-model"],"evidence_routes":["unit","axe","e2e","human"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"pattern.pagination","version":"1.0.0","title":"Pagination","kind":"pattern","requires":["semantics.native-elements","semantics.accessible-name","semantics.landmarks","semantics.focus.visible"],"activation":{"fact":"component.
|
|
1
|
+
{"id":"pattern.pagination","version":"1.0.0","title":"Pagination","kind":"pattern","standards_refs":[{"authority":"wcag-2.2","identifier":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","normative":true,"level":"A"}],"requires":["semantics.native-elements","semantics.accessible-name","semantics.landmarks","semantics.focus.visible"],"activation":{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.pagination"}},"scope":"Paged result navigation","behavior":["Expose current page and named navigation"],"product_decisions":["url_behavior"],"functional_spec_bindings":["states","navigation"],"implementation_outcomes":["pagination-current-page"],"evidence_routes":["unit","axe","human"]}
|