@adobe/design-data-spec 4.8.1 → 4.9.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 (87) hide show
  1. package/conformance/README.md +32 -9
  2. package/conformance/invalid/SPEC-051/dataset.json +9 -3
  3. package/conformance/invalid/SPEC-052/dataset.json +14 -4
  4. package/conformance/invalid/SPEC-053/dataset.json +16 -4
  5. package/conformance/invalid/SPEC-054/dataset.json +18 -5
  6. package/conformance/invalid/SPEC-055/dataset.json +9 -3
  7. package/conformance/invalid/SPEC-057/dataset.json +5 -2
  8. package/conformance/invalid/SPEC-058/dataset.json +8 -3
  9. package/conformance/invalid/SPEC-059/dataset.json +28 -0
  10. package/conformance/invalid/SPEC-059/expected-errors.json +10 -0
  11. package/conformance/invalid/SPEC-060/dataset.json +44 -0
  12. package/conformance/invalid/SPEC-060/expected-errors.json +10 -0
  13. package/conformance/invalid/SPEC-061/dataset.json +63 -0
  14. package/conformance/invalid/SPEC-061/expected-errors.json +15 -0
  15. package/conformance/invalid/SPEC-062/dataset.json +50 -0
  16. package/conformance/invalid/SPEC-062/expected-errors.json +10 -0
  17. package/conformance/invalid/SPEC-063/dataset.json +57 -0
  18. package/conformance/invalid/SPEC-063/expected-errors.json +10 -0
  19. package/conformance/invalid/SPEC-064/dataset.json +53 -0
  20. package/conformance/invalid/SPEC-064/expected-errors.json +15 -0
  21. package/conformance/invalid/SPEC-065/dataset.json +78 -0
  22. package/conformance/invalid/SPEC-065/expected-errors.json +10 -0
  23. package/conformance/invalid/SPEC-066/dataset.json +37 -0
  24. package/conformance/invalid/SPEC-066/expected-errors.json +10 -0
  25. package/conformance/invalid/SPEC-067/dataset.json +60 -0
  26. package/conformance/invalid/SPEC-067/expected-errors.json +10 -0
  27. package/conformance/invalid/SPEC-068/dataset.json +37 -0
  28. package/conformance/invalid/SPEC-068/expected-errors.json +10 -0
  29. package/conformance/invalid/SPEC-069/dataset.json +63 -0
  30. package/conformance/invalid/SPEC-069/expected-errors.json +10 -0
  31. package/conformance/invalid/SPEC-070/dataset.json +71 -0
  32. package/conformance/invalid/SPEC-070/expected-errors.json +15 -0
  33. package/conformance/invalid/SPEC-071/dataset.json +77 -0
  34. package/conformance/invalid/SPEC-071/expected-errors.json +10 -0
  35. package/conformance/invalid/SPEC-072/dataset.json +4 -2
  36. package/conformance/invalid/SPEC-073/dataset.json +59 -0
  37. package/conformance/invalid/SPEC-073/expected-errors.json +10 -0
  38. package/conformance/invalid/SPEC-074/dataset.json +36 -0
  39. package/conformance/invalid/SPEC-074/expected-errors.json +10 -0
  40. package/conformance/invalid/SPEC-075/dataset.json +53 -0
  41. package/conformance/invalid/SPEC-075/expected-errors.json +10 -0
  42. package/conformance/invalid/SPEC-076/dataset.json +62 -0
  43. package/conformance/invalid/SPEC-076/expected-errors.json +10 -0
  44. package/conformance/invalid/SPEC-076/manifest.json +6 -0
  45. package/conformance/invalid/SPEC-079/dataset.json +62 -0
  46. package/conformance/invalid/SPEC-079/expected-errors.json +10 -0
  47. package/conformance/invalid/SPEC-079/manifest.json +58 -0
  48. package/conformance/invalid/SPEC-080/dataset.json +62 -0
  49. package/conformance/invalid/SPEC-080/expected-errors.json +10 -0
  50. package/conformance/invalid/SPEC-080/manifest.json +32 -0
  51. package/conformance/invalid/SPEC-081/dataset.json +62 -0
  52. package/conformance/invalid/SPEC-081/expected-errors.json +10 -0
  53. package/conformance/invalid/SPEC-081/manifest.json +7 -0
  54. package/conformance/invalid/SPEC-082/dataset.json +62 -0
  55. package/conformance/invalid/SPEC-082/expected-errors.json +10 -0
  56. package/conformance/invalid/SPEC-082/manifest.json +14 -0
  57. package/conformance/invalid/SPEC-083/dataset.json +47 -0
  58. package/conformance/invalid/SPEC-083/expected-errors.json +10 -0
  59. package/conformance/invalid/SPEC-084/dataset.json +16 -0
  60. package/conformance/invalid/SPEC-084/expected-errors.json +10 -0
  61. package/conformance/valid/SPEC-025/dataset.json +1 -1
  62. package/conformance/valid/SPEC-049/dataset.json +1 -1
  63. package/conformance/valid/SPEC-051/dataset.json +40 -9
  64. package/conformance/valid/SPEC-064/dataset.json +64 -0
  65. package/conformance/valid/SPEC-064/expected-errors.json +4 -0
  66. package/conformance/valid/SPEC-065/dataset.json +89 -0
  67. package/conformance/valid/SPEC-065/expected-errors.json +4 -0
  68. package/conformance/valid/SPEC-079/dataset.json +62 -0
  69. package/conformance/valid/SPEC-079/manifest.json +58 -0
  70. package/package.json +1 -1
  71. package/rules/rules.yaml +358 -0
  72. package/schemas/anatomy-part.schema.json +11 -0
  73. package/schemas/component-changelog.schema.json +306 -0
  74. package/schemas/component-spec-sheet.schema.json +215 -0
  75. package/schemas/component-visual.schema.json +287 -0
  76. package/schemas/component.schema.json +80 -0
  77. package/schemas/manifest.schema.json +5 -0
  78. package/schemas/relationship.schema.json +8 -6
  79. package/spec/anatomy-format.md +97 -10
  80. package/spec/artifact-moves.md +157 -0
  81. package/spec/component-changelog.md +49 -0
  82. package/spec/component-format.md +4 -0
  83. package/spec/component-visuals.md +210 -0
  84. package/spec/index.md +5 -0
  85. package/spec/manifest.md +37 -21
  86. package/spec/option-constraints.md +87 -0
  87. package/spec/relationship-format.md +14 -11
@@ -0,0 +1,78 @@
1
+ {
2
+ "components": [
3
+ {
4
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/button.json",
5
+ "name": "button",
6
+ "displayName": "Button",
7
+ "meta": {
8
+ "category": "actions"
9
+ },
10
+ "options": {
11
+ "variant": {
12
+ "type": "string",
13
+ "values": [
14
+ {
15
+ "value": "primary"
16
+ },
17
+ {
18
+ "value": "accent"
19
+ }
20
+ ]
21
+ },
22
+ "style": {
23
+ "type": "string",
24
+ "values": [
25
+ {
26
+ "value": "fill"
27
+ },
28
+ {
29
+ "value": "outline"
30
+ }
31
+ ]
32
+ },
33
+ "isLabelHidden": {
34
+ "type": "boolean"
35
+ },
36
+ "icon": {
37
+ "type": "string"
38
+ }
39
+ },
40
+ "constraints": [
41
+ {
42
+ "when": {
43
+ "style": "outline"
44
+ },
45
+ "require": {
46
+ "variant": ["primary"]
47
+ },
48
+ "severity": "error"
49
+ },
50
+ {
51
+ "when": {
52
+ "isLabelHidden": true
53
+ },
54
+ "require": {
55
+ "icon": {
56
+ "present": true
57
+ }
58
+ },
59
+ "severity": "error"
60
+ }
61
+ ]
62
+ }
63
+ ],
64
+ "relationships": [
65
+ {
66
+ "scope": {
67
+ "component": "button",
68
+ "property": "background-color",
69
+ "options": {
70
+ "style": "outline",
71
+ "variant": "accent"
72
+ }
73
+ },
74
+ "value": "#ff0000",
75
+ "uuid": "9565360b-0157-5218-af40-4d66c36d7fbd"
76
+ }
77
+ ]
78
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-065",
6
+ "severity": "warning",
7
+ "message_pattern": ".*excluded by an error constraint.*"
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "components": [
3
+ {
4
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/switch.json",
5
+ "name": "switch",
6
+ "displayName": "Switch",
7
+ "meta": {
8
+ "category": "actions",
9
+ "documentationUrl": "https://spectrum.adobe.com/page/switch/"
10
+ },
11
+ "anatomy": [
12
+ {
13
+ "name": "track",
14
+ "description": "Background.",
15
+ "required": true
16
+ }
17
+ ],
18
+ "options": {
19
+ "isReadOnly": {
20
+ "type": "boolean"
21
+ }
22
+ }
23
+ }
24
+ ],
25
+ "visuals": [
26
+ {
27
+ "component": "switch",
28
+ "root": "track",
29
+ "parts": {
30
+ "track": {
31
+ "kind": "box"
32
+ }
33
+ }
34
+ }
35
+ ],
36
+ "tokens": []
37
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-066",
6
+ "severity": "warning",
7
+ "message_pattern": ".*'isReadOnly'.*"
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "tokens": [
3
+ {
4
+ "name": {
5
+ "property": "color",
6
+ "variant": "neutral"
7
+ },
8
+ "value": "#292929",
9
+ "uuid": "aaaaaaaa-0067-4000-8000-000000000001"
10
+ }
11
+ ],
12
+ "components": [
13
+ {
14
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/switch.json",
15
+ "name": "switch",
16
+ "displayName": "Switch",
17
+ "meta": {
18
+ "category": "actions",
19
+ "documentationUrl": "https://spectrum.adobe.com/page/switch/"
20
+ },
21
+ "anatomy": [
22
+ {
23
+ "name": "track",
24
+ "description": "Background.",
25
+ "required": true
26
+ }
27
+ ]
28
+ }
29
+ ],
30
+ "relationships": [
31
+ {
32
+ "scope": {
33
+ "component": "switch",
34
+ "property": "color"
35
+ },
36
+ "context": "Control",
37
+ "$ref": "aaaaaaaa-0067-4000-8000-000000000001",
38
+ "uuid": "df5f5b9a-7e8a-5970-b6a2-846e2aa15ad9"
39
+ }
40
+ ],
41
+ "visuals": [
42
+ {
43
+ "component": "switch",
44
+ "root": "track",
45
+ "parts": {
46
+ "track": {
47
+ "kind": "box",
48
+ "props": {
49
+ "fill": {
50
+ "token": {
51
+ "property": "color",
52
+ "variant": "neutral"
53
+ }
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
59
+ ]
60
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-067",
6
+ "severity": "warning",
7
+ "message_pattern": ".*'color' / 'Control'.*"
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "components": [
3
+ {
4
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/switch.json",
5
+ "name": "switch",
6
+ "displayName": "Switch",
7
+ "meta": {
8
+ "category": "actions",
9
+ "documentationUrl": "https://spectrum.adobe.com/page/switch/"
10
+ },
11
+ "anatomy": [
12
+ {
13
+ "name": "track",
14
+ "description": "Background.",
15
+ "required": true
16
+ }
17
+ ]
18
+ }
19
+ ],
20
+ "visuals": [
21
+ {
22
+ "component": "switch",
23
+ "root": "track",
24
+ "parts": {
25
+ "track": {
26
+ "kind": "box",
27
+ "props": {
28
+ "width": {
29
+ "value": 10
30
+ }
31
+ }
32
+ }
33
+ }
34
+ }
35
+ ],
36
+ "tokens": []
37
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-068",
6
+ "severity": "warning",
7
+ "message_pattern": "^Literal 10 for 'width' on part 'track'; bind a token or relationship instead$"
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "tokens": [
3
+ {
4
+ "name": {
5
+ "property": "size",
6
+ "anatomy": "track"
7
+ },
8
+ "value": "16px",
9
+ "uuid": "aaaaaaaa-0069-4000-8000-000000000001",
10
+ "lifecycle": {
11
+ "deprecatedIn": "14.5.0"
12
+ }
13
+ }
14
+ ],
15
+ "components": [
16
+ {
17
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/switch.json",
18
+ "name": "switch",
19
+ "displayName": "Switch",
20
+ "meta": {
21
+ "category": "actions",
22
+ "documentationUrl": "https://spectrum.adobe.com/page/switch/"
23
+ },
24
+ "anatomy": [
25
+ {
26
+ "name": "track",
27
+ "description": "Background.",
28
+ "required": true
29
+ }
30
+ ]
31
+ }
32
+ ],
33
+ "relationships": [
34
+ {
35
+ "scope": {
36
+ "component": "switch",
37
+ "property": "size"
38
+ },
39
+ "context": "Track",
40
+ "$ref": "aaaaaaaa-0069-4000-8000-000000000001",
41
+ "uuid": "ab0e5462-1534-5ff0-a18a-753954541aa3"
42
+ }
43
+ ],
44
+ "visuals": [
45
+ {
46
+ "component": "switch",
47
+ "root": "track",
48
+ "parts": {
49
+ "track": {
50
+ "kind": "box",
51
+ "props": {
52
+ "width": {
53
+ "relationship": {
54
+ "property": "size",
55
+ "context": "Track"
56
+ }
57
+ }
58
+ }
59
+ }
60
+ }
61
+ }
62
+ ]
63
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-069",
6
+ "severity": "warning",
7
+ "message_pattern": ".*14\\.5\\.0.*"
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,71 @@
1
+ {
2
+ "components": [
3
+ {
4
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/button.json",
5
+ "name": "button",
6
+ "displayName": "Button",
7
+ "meta": {
8
+ "category": "actions",
9
+ "documentationUrl": "https://spectrum.adobe.com/page/button/"
10
+ },
11
+ "anatomy": [
12
+ {
13
+ "name": "container",
14
+ "description": "Background.",
15
+ "required": true
16
+ },
17
+ {
18
+ "name": "focus-ring",
19
+ "description": "Outline for keyboard focus."
20
+ }
21
+ ]
22
+ },
23
+ {
24
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/switch.json",
25
+ "name": "switch",
26
+ "displayName": "Switch",
27
+ "meta": {
28
+ "category": "actions",
29
+ "documentationUrl": "https://spectrum.adobe.com/page/switch/"
30
+ },
31
+ "anatomy": [
32
+ {
33
+ "name": "track",
34
+ "description": "Background.",
35
+ "required": true
36
+ },
37
+ {
38
+ "name": "focus-indicator",
39
+ "description": "Outline for keyboard focus."
40
+ }
41
+ ]
42
+ }
43
+ ],
44
+ "visuals": [
45
+ {
46
+ "component": "button",
47
+ "root": "container",
48
+ "parts": {
49
+ "container": {
50
+ "kind": "box"
51
+ },
52
+ "focus-ring": {
53
+ "kind": "ring"
54
+ }
55
+ }
56
+ },
57
+ {
58
+ "component": "switch",
59
+ "root": "track",
60
+ "parts": {
61
+ "track": {
62
+ "kind": "box"
63
+ },
64
+ "focus-indicator": {
65
+ "kind": "ring"
66
+ }
67
+ }
68
+ }
69
+ ],
70
+ "tokens": []
71
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-070",
6
+ "severity": "warning",
7
+ "message_pattern": "^Focus ring part is named 'focus-ring' here but 'focus-indicator' in other recipes.*"
8
+ },
9
+ {
10
+ "rule_id": "SPEC-070",
11
+ "severity": "warning",
12
+ "message_pattern": "^Focus ring part is named 'focus-indicator' here but 'focus-ring' in other recipes.*"
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,77 @@
1
+ {
2
+ "tokens": [
3
+ {
4
+ "name": {
5
+ "property": "color",
6
+ "variant": "neutral"
7
+ },
8
+ "value": "#292929",
9
+ "uuid": "aaaaaaaa-0071-4000-8000-000000000001"
10
+ },
11
+ {
12
+ "name": {
13
+ "property": "size",
14
+ "anatomy": "track"
15
+ },
16
+ "value": "16px",
17
+ "uuid": "aaaaaaaa-0071-4000-8000-000000000002"
18
+ }
19
+ ],
20
+ "components": [
21
+ {
22
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/switch.json",
23
+ "name": "switch",
24
+ "displayName": "Switch",
25
+ "meta": {
26
+ "category": "actions",
27
+ "documentationUrl": "https://spectrum.adobe.com/page/switch/"
28
+ },
29
+ "anatomy": [
30
+ {
31
+ "name": "track",
32
+ "description": "Background.",
33
+ "required": true
34
+ }
35
+ ]
36
+ }
37
+ ],
38
+ "relationships": [
39
+ {
40
+ "scope": {
41
+ "component": "switch",
42
+ "property": "color"
43
+ },
44
+ "context": "Control",
45
+ "$ref": "aaaaaaaa-0071-4000-8000-000000000001",
46
+ "uuid": "019a8d9c-05b2-5271-b34a-529177a2d212"
47
+ },
48
+ {
49
+ "scope": {
50
+ "component": "switch",
51
+ "property": "size"
52
+ },
53
+ "context": "Track",
54
+ "$ref": "aaaaaaaa-0071-4000-8000-000000000002",
55
+ "uuid": "88936f8a-6479-5db6-bd63-13edcc6ae0f6"
56
+ }
57
+ ],
58
+ "visuals": [
59
+ {
60
+ "component": "switch",
61
+ "root": "track",
62
+ "parts": {
63
+ "track": {
64
+ "kind": "box",
65
+ "props": {
66
+ "fill": {
67
+ "relationship": {
68
+ "property": "color",
69
+ "context": "Control"
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
75
+ }
76
+ ]
77
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-071",
6
+ "severity": "info",
7
+ "message_pattern": "^1 of 2 relationship contexts of 'switch' have no binding in this recipe.*"
8
+ }
9
+ ]
10
+ }
@@ -26,7 +26,8 @@
26
26
  "property": "gap"
27
27
  },
28
28
  "context": "Spacing",
29
- "$ref": "aaaaaaaa-0072-4000-8000-000000000001"
29
+ "$ref": "aaaaaaaa-0072-4000-8000-000000000001",
30
+ "uuid": "27da813d-2876-592c-a6e2-a241d05cb5e8"
30
31
  },
31
32
  {
32
33
  "scope": {
@@ -34,7 +35,8 @@
34
35
  "property": "gap"
35
36
  },
36
37
  "context": "Spacing",
37
- "$ref": "aaaaaaaa-0072-4000-8000-000000000001"
38
+ "$ref": "aaaaaaaa-0072-4000-8000-000000000001",
39
+ "uuid": "c0c499ff-3a31-59d8-bf82-2a105834c1f4"
38
40
  }
39
41
  ],
40
42
  "components": [
@@ -0,0 +1,59 @@
1
+ {
2
+ "tokens": [],
3
+ "components": [
4
+ {
5
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/accordion.json",
6
+ "name": "accordion",
7
+ "displayName": "Accordion",
8
+ "meta": {
9
+ "category": "navigation",
10
+ "documentationUrl": "https://spectrum.adobe.com/page/accordion/"
11
+ }
12
+ },
13
+ {
14
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/switch.json",
15
+ "name": "switch",
16
+ "displayName": "Switch",
17
+ "meta": {
18
+ "category": "inputs",
19
+ "documentationUrl": "https://spectrum.adobe.com/page/switch/"
20
+ },
21
+ "anatomy": [
22
+ {
23
+ "name": "track",
24
+ "description": "Pill-shaped background."
25
+ }
26
+ ]
27
+ },
28
+ {
29
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/button.json",
30
+ "name": "button",
31
+ "displayName": "Button",
32
+ "meta": {
33
+ "category": "actions",
34
+ "documentationUrl": "https://spectrum.adobe.com/page/button/"
35
+ },
36
+ "anatomy": [
37
+ {
38
+ "name": "container",
39
+ "description": "Background."
40
+ }
41
+ ],
42
+ "anatomyReview": {
43
+ "status": "reviewed",
44
+ "reviewedIn": "1.0.0-draft"
45
+ }
46
+ }
47
+ ],
48
+ "relationships": [
49
+ {
50
+ "scope": {
51
+ "component": "accordion",
52
+ "property": "gap"
53
+ },
54
+ "context": "Spacing",
55
+ "$ref": "aaaaaaaa-0073-4000-8000-000000000001",
56
+ "uuid": "32216357-370c-5bf5-baf1-a8ace41fd70b"
57
+ }
58
+ ]
59
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-073",
6
+ "severity": "info",
7
+ "message_pattern": "^Components without reviewed anatomy: 1 with relationships but no anatomy \\(accordion\\); 1 with draft anatomy \\(switch\\)$"
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "tokens": [],
3
+ "components": [
4
+ {
5
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/button.json",
6
+ "name": "button",
7
+ "displayName": "Button",
8
+ "meta": {
9
+ "category": "actions",
10
+ "documentationUrl": "https://spectrum.adobe.com/page/button/"
11
+ },
12
+ "states": [
13
+ {
14
+ "name": "hover",
15
+ "trigger": "interaction"
16
+ },
17
+ {
18
+ "name": "down",
19
+ "trigger": "interaction"
20
+ }
21
+ ],
22
+ "anatomy": [
23
+ {
24
+ "name": "container",
25
+ "description": "Background.",
26
+ "required": true
27
+ },
28
+ {
29
+ "name": "focus-indicator",
30
+ "description": "Outline drawn outside the container for keyboard focus.",
31
+ "presentIn": ["focus"]
32
+ }
33
+ ]
34
+ }
35
+ ]
36
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-074",
6
+ "severity": "error",
7
+ "message_pattern": ".*focus-indicator.*button.*present in state 'focus'.*not a declared state.*"
8
+ }
9
+ ]
10
+ }