govuk_publishing_components 21.22.1 → 21.22.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -3
  3. data/app/assets/stylesheets/govuk_publishing_components/components/_breadcrumbs.scss +34 -0
  4. data/app/assets/stylesheets/govuk_publishing_components/components/_document-list.scss +2 -2
  5. data/app/views/govuk_publishing_components/components/_breadcrumbs.html.erb +0 -3
  6. data/app/views/govuk_publishing_components/components/_contextual_breadcrumbs.html.erb +0 -2
  7. data/lib/govuk_publishing_components/version.rb +1 -1
  8. data/node_modules/axe-core/CHANGELOG.md +70 -10
  9. data/node_modules/axe-core/axe.js +1295 -632
  10. data/node_modules/axe-core/axe.min.js +2 -2
  11. data/node_modules/axe-core/bower.json +1 -1
  12. data/node_modules/axe-core/doc/API.md +1 -0
  13. data/node_modules/axe-core/doc/aria-supported.md +0 -1
  14. data/node_modules/axe-core/doc/developer-guide.md +2 -2
  15. data/node_modules/axe-core/doc/rule-descriptions.md +91 -87
  16. data/node_modules/axe-core/lib/checks/aria/abstractrole.js +10 -1
  17. data/node_modules/axe-core/lib/checks/aria/abstractrole.json +4 -1
  18. data/node_modules/axe-core/lib/checks/aria/fallbackrole.js +1 -0
  19. data/node_modules/axe-core/lib/checks/aria/fallbackrole.json +11 -0
  20. data/node_modules/axe-core/lib/checks/aria/invalidrole.js +14 -3
  21. data/node_modules/axe-core/lib/checks/aria/invalidrole.json +4 -1
  22. data/node_modules/axe-core/lib/checks/aria/required-children.js +41 -30
  23. data/node_modules/axe-core/lib/checks/aria/valid-attr-value.js +24 -9
  24. data/node_modules/axe-core/lib/checks/aria/valid-attr-value.json +2 -2
  25. data/node_modules/axe-core/lib/checks/color/color-contrast.js +23 -7
  26. data/node_modules/axe-core/lib/checks/color/color-contrast.json +7 -1
  27. data/node_modules/axe-core/lib/checks/keyboard/focusable-disabled.js +5 -0
  28. data/node_modules/axe-core/lib/checks/keyboard/focusable-modal-open.js +14 -0
  29. data/node_modules/axe-core/lib/checks/keyboard/focusable-modal-open.json +11 -0
  30. data/node_modules/axe-core/lib/checks/keyboard/focusable-not-tabbable.js +5 -0
  31. data/node_modules/axe-core/lib/checks/keyboard/page-has-elm.js +5 -1
  32. data/node_modules/axe-core/lib/checks/keyboard/page-no-duplicate-after.js +2 -0
  33. data/node_modules/axe-core/lib/checks/keyboard/page-no-duplicate-banner.json +1 -0
  34. data/node_modules/axe-core/lib/checks/keyboard/page-no-duplicate-contentinfo.json +1 -0
  35. data/node_modules/axe-core/lib/checks/keyboard/page-no-duplicate-main.json +1 -0
  36. data/node_modules/axe-core/lib/checks/keyboard/page-no-duplicate.js +14 -2
  37. data/node_modules/axe-core/lib/checks/lists/only-listitems.js +43 -49
  38. data/node_modules/axe-core/lib/checks/lists/only-listitems.json +4 -1
  39. data/node_modules/axe-core/lib/checks/media/no-autoplay-audio.js +93 -0
  40. data/node_modules/axe-core/lib/checks/media/no-autoplay-audio.json +15 -0
  41. data/node_modules/axe-core/lib/checks/navigation/identical-links-same-purpose-after.js +100 -0
  42. data/node_modules/axe-core/lib/checks/navigation/identical-links-same-purpose.js +31 -0
  43. data/node_modules/axe-core/lib/checks/navigation/identical-links-same-purpose.json +12 -0
  44. data/node_modules/axe-core/lib/checks/navigation/region.js +42 -8
  45. data/node_modules/axe-core/lib/checks/navigation/region.json +0 -1
  46. data/node_modules/axe-core/lib/checks/shared/svg-non-empty-title.js +4 -0
  47. data/node_modules/axe-core/lib/checks/shared/svg-non-empty-title.json +11 -0
  48. data/node_modules/axe-core/lib/commons/aria/index.js +12 -4
  49. data/node_modules/axe-core/lib/commons/color/get-background-color.js +5 -157
  50. data/node_modules/axe-core/lib/commons/dom/get-element-stack.js +272 -174
  51. data/node_modules/axe-core/lib/commons/dom/is-focusable.js +3 -1
  52. data/node_modules/axe-core/lib/commons/dom/is-hidden-with-css.js +2 -2
  53. data/node_modules/axe-core/lib/commons/dom/is-modal-open.js +98 -0
  54. data/node_modules/axe-core/lib/commons/dom/is-visible.js +57 -2
  55. data/node_modules/axe-core/lib/commons/dom/url-props-from-attribute.js +143 -0
  56. data/node_modules/axe-core/lib/commons/dom/visually-contains.js +62 -12
  57. data/node_modules/axe-core/lib/commons/matches/attributes.js +12 -8
  58. data/node_modules/axe-core/lib/commons/matches/from-definition.js +15 -10
  59. data/node_modules/axe-core/lib/commons/matches/index.js +11 -9
  60. data/node_modules/axe-core/lib/commons/matches/node-name.js +11 -21
  61. data/node_modules/axe-core/lib/commons/matches/properties.js +12 -9
  62. data/node_modules/axe-core/lib/commons/text/unicode.js +27 -24
  63. data/node_modules/axe-core/lib/core/base/virtual-node/virtual-node.js +11 -3
  64. data/node_modules/axe-core/lib/core/constants.js +1 -1
  65. data/node_modules/axe-core/lib/core/reporters/v1.js +6 -3
  66. data/node_modules/axe-core/lib/core/utils/contains.js +1 -1
  67. data/node_modules/axe-core/lib/core/utils/is-hidden.js +6 -6
  68. data/node_modules/axe-core/lib/core/utils/matches.js +263 -0
  69. data/node_modules/axe-core/lib/core/utils/preload-media.js +65 -0
  70. data/node_modules/axe-core/lib/core/utils/preload.js +33 -24
  71. data/node_modules/axe-core/lib/core/utils/qsa.js +7 -208
  72. data/node_modules/axe-core/lib/rules/aria-hidden-focus.json +5 -1
  73. data/node_modules/axe-core/lib/rules/aria-roles.json +1 -1
  74. data/node_modules/axe-core/lib/rules/button-name.json +1 -1
  75. data/node_modules/axe-core/lib/rules/color-contrast-matches.js +1 -1
  76. data/node_modules/axe-core/lib/rules/color-contrast.json +0 -3
  77. data/node_modules/axe-core/lib/rules/html-namespace-matches.js +1 -0
  78. data/node_modules/axe-core/lib/rules/identical-links-same-purpose-matches.js +13 -0
  79. data/node_modules/axe-core/lib/rules/identical-links-same-purpose.json +14 -0
  80. data/node_modules/axe-core/lib/rules/landmark-no-duplicate-banner.json +1 -1
  81. data/node_modules/axe-core/lib/rules/landmark-no-duplicate-contentinfo.json +1 -1
  82. data/node_modules/axe-core/lib/rules/landmark-no-duplicate-main.json +12 -0
  83. data/node_modules/axe-core/lib/rules/landmark-one-main.json +2 -2
  84. data/node_modules/axe-core/lib/rules/link-name.json +2 -4
  85. data/node_modules/axe-core/lib/rules/meta-viewport.json +1 -1
  86. data/node_modules/axe-core/lib/rules/no-autoplay-audio-matches.js +18 -0
  87. data/node_modules/axe-core/lib/rules/no-autoplay-audio.json +15 -0
  88. data/node_modules/axe-core/lib/rules/region.json +1 -2
  89. data/node_modules/axe-core/lib/rules/role-img-alt.json +2 -1
  90. data/node_modules/axe-core/lib/rules/svg-img-alt.json +24 -0
  91. data/node_modules/axe-core/lib/rules/svg-namespace-matches.js +1 -0
  92. data/node_modules/axe-core/locales/da.json +782 -0
  93. data/node_modules/axe-core/locales/fr.json +221 -42
  94. data/node_modules/axe-core/locales/ja.json +124 -24
  95. data/node_modules/axe-core/package.json +29 -26
  96. data/node_modules/axe-core/sri-history.json +26 -10
  97. metadata +27 -9
  98. data/node_modules/axe-core/doc/examples/jasmine/package-lock.json +0 -1489
  99. data/node_modules/axe-core/doc/examples/jest_react/package-lock.json +0 -7525
  100. data/node_modules/axe-core/doc/examples/mocha/package-lock.json +0 -1671
  101. data/node_modules/axe-core/doc/examples/phantomjs/package-lock.json +0 -862
  102. data/node_modules/axe-core/doc/examples/qunit/package-lock.json +0 -2951
  103. data/node_modules/axe-core/lib/checks/navigation/region-after.js +0 -1
  104. data/node_modules/axe-core/typings/axe-core/axe-core-tests.js +0 -151
@@ -0,0 +1 @@
1
+ return node.namespaceURI === 'http://www.w3.org/1999/xhtml';
@@ -0,0 +1,13 @@
1
+ const { aria, text } = axe.commons;
2
+
3
+ const hasAccName = !!text.accessibleTextVirtual(virtualNode);
4
+ if (!hasAccName) {
5
+ return false;
6
+ }
7
+
8
+ const role = aria.getRole(node);
9
+ if (role && role !== 'link') {
10
+ return false;
11
+ }
12
+
13
+ return true;
@@ -0,0 +1,14 @@
1
+ {
2
+ "id": "identical-links-same-purpose",
3
+ "selector": "a[href], area[href], [role=\"link\"]",
4
+ "excludeHidden": false,
5
+ "matches": "identical-links-same-purpose-matches.js",
6
+ "tags": ["wcag2aaa", "wcag249", "best-practice"],
7
+ "metadata": {
8
+ "description": "Ensure that links with the same accessible name serve a similar purpose",
9
+ "help": "Links with the same name have a similar purpose"
10
+ },
11
+ "all": ["identical-links-same-purpose"],
12
+ "any": [],
13
+ "none": []
14
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "landmark-no-duplicate-banner",
3
- "selector": "html",
3
+ "selector": "header:not([role]), [role=banner]",
4
4
  "tags": ["cat.semantics", "best-practice"],
5
5
  "metadata": {
6
6
  "description": "Ensures the document has at most one banner landmark",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "landmark-no-duplicate-contentinfo",
3
- "selector": "html",
3
+ "selector": "footer:not([role]), [role=contentinfo]",
4
4
  "tags": ["cat.semantics", "best-practice"],
5
5
  "metadata": {
6
6
  "description": "Ensures the document has at most one contentinfo landmark",
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "landmark-no-duplicate-main",
3
+ "selector": "main:not([role]), [role=main]",
4
+ "tags": ["cat.semantics", "best-practice"],
5
+ "metadata": {
6
+ "description": "Ensures the document has at most one main landmark",
7
+ "help": "Document must not have more than one main landmark"
8
+ },
9
+ "all": [],
10
+ "any": ["page-no-duplicate-main"],
11
+ "none": []
12
+ }
@@ -3,10 +3,10 @@
3
3
  "selector": "html",
4
4
  "tags": ["cat.semantics", "best-practice"],
5
5
  "metadata": {
6
- "description": "Ensures the document has only one main landmark and each iframe in the page has at most one main landmark",
6
+ "description": "Ensures the document has a main landmark",
7
7
  "help": "Document must have one main landmark"
8
8
  },
9
- "all": ["page-has-main", "page-no-duplicate-main"],
9
+ "all": ["page-has-main"],
10
10
  "any": [],
11
11
  "none": []
12
12
  }
@@ -21,7 +21,5 @@
21
21
  "role-presentation",
22
22
  "role-none"
23
23
  ],
24
- "none": [
25
- "focusable-no-name"
26
- ]
27
- }
24
+ "none": ["focusable-no-name"]
25
+ }
@@ -2,7 +2,7 @@
2
2
  "id": "meta-viewport",
3
3
  "selector": "meta[name=\"viewport\"]",
4
4
  "excludeHidden": false,
5
- "tags": ["cat.sensory-and-visual-cues", "wcag2aa", "wcag144"],
5
+ "tags": ["cat.sensory-and-visual-cues", "best-practice"],
6
6
  "metadata": {
7
7
  "description": "Ensures <meta name=\"viewport\"> does not disable text scaling and zooming",
8
8
  "help": "Zooming and scaling must not be disabled"
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Ignore media nodes without `currenSrc`
3
+ * Notes:
4
+ * - https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/currentSrc
5
+ * - https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/src
6
+ */
7
+ if (!node.currentSrc) {
8
+ return false;
9
+ }
10
+
11
+ /**
12
+ * Ignore media nodes which are `paused` or `muted`
13
+ */
14
+ if (node.hasAttribute('paused') || node.hasAttribute('muted')) {
15
+ return false;
16
+ }
17
+
18
+ return true;
@@ -0,0 +1,15 @@
1
+ {
2
+ "id": "no-autoplay-audio",
3
+ "excludeHidden": false,
4
+ "selector": "audio[autoplay], video[autoplay]",
5
+ "matches": "no-autoplay-audio-matches.js",
6
+ "tags": ["wcag2a", "wcag142", "experimental"],
7
+ "metadata": {
8
+ "description": "Ensures <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
9
+ "help": "<video> or <audio> elements do not autoplay audio"
10
+ },
11
+ "preload": true,
12
+ "all": ["no-autoplay-audio"],
13
+ "any": [],
14
+ "none": []
15
+ }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "id": "region",
3
- "selector": "html",
4
- "pageLevel": true,
3
+ "selector": "body *",
5
4
  "tags": ["cat.keyboard", "best-practice"],
6
5
  "metadata": {
7
6
  "description": "Ensures all page content is contained by landmarks",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "id": "role-img-alt",
3
- "selector": "[role='img']:not(svg):not(img):not(area):not(input):not(object)",
3
+ "selector": "[role='img']:not(img):not(area):not(input):not(object)",
4
+ "matches": "html-namespace-matches.js",
4
5
  "tags": [
5
6
  "cat.text-alternatives",
6
7
  "wcag2a",
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "svg-img-alt",
3
+ "selector": "[role=\"img\"], [role=\"graphics-symbol\"], svg[role=\"graphics-document\"]",
4
+ "matches": "svg-namespace-matches.js",
5
+ "tags": [
6
+ "cat.text-alternatives",
7
+ "wcag2a",
8
+ "wcag111",
9
+ "section508",
10
+ "section508.22.a"
11
+ ],
12
+ "metadata": {
13
+ "description": "Ensures svg elements with an img, graphics-document or graphics-symbol role have an accessible text",
14
+ "help": "svg elements with an img role have an alternative text"
15
+ },
16
+ "all": [],
17
+ "any": [
18
+ "svg-non-empty-title",
19
+ "aria-label",
20
+ "aria-labelledby",
21
+ "non-empty-title"
22
+ ],
23
+ "none": []
24
+ }
@@ -0,0 +1 @@
1
+ return node.namespaceURI === 'http://www.w3.org/2000/svg';
@@ -0,0 +1,782 @@
1
+ {
2
+ "lang": "da",
3
+ "rules": {
4
+ "accesskeys": {
5
+ "description": "",
6
+ "help": "Værdien for attributten 'accesskey' skal være unik"
7
+ },
8
+ "area-alt": {
9
+ "description": "",
10
+ "help": "Aktive <area> elementer skal have alternativ tekst"
11
+ },
12
+ "aria-allowed-attr": {
13
+ "description": "",
14
+ "help": "Elementer må kun bruge tilladte ARIA-attributter"
15
+ },
16
+ "aria-allowed-role": {
17
+ "description": "",
18
+ "help": "ARIA-attributten 'role' skal være passende for elementet"
19
+ },
20
+ "aria-dpub-role-fallback": {
21
+ "description": "",
22
+ "help": "Ikke-understøttede DPUB ARIA-roller bør kun bruges på elementer med implicitte fallback-roller"
23
+ },
24
+ "aria-hidden-body": {
25
+ "description": "",
26
+ "help": "aria-hidden='true' må ikke bruges på dokumentets <body> element"
27
+ },
28
+ "aria-hidden-focus": {
29
+ "description": "",
30
+ "help": "Elementer med ARIA-'hidden' må ikke indeholde fokuserbare elementer"
31
+ },
32
+ "aria-input-field-name": {
33
+ "description": "",
34
+ "help": "ARIA-input-felter skal have et tilgængeligt navn"
35
+ },
36
+ "aria-required-attr": {
37
+ "description": "",
38
+ "help": "Krævede ARIA-attributter skal være angivet"
39
+ },
40
+ "aria-required-children": {
41
+ "description": "",
42
+ "help": "Bestemte ARIA-roller skal indeholde specifikke under-elementer"
43
+ },
44
+ "aria-required-parent": {
45
+ "description": "",
46
+ "help": "Bestemte ARIA-roller skal være under-element til specifikke over-elementer"
47
+ },
48
+ "aria-roledescription": {
49
+ "description": "",
50
+ "help": "Brug 'aria-roledescription' på elementer med en semantisk rolle"
51
+ },
52
+ "aria-roles": {
53
+ "description": "",
54
+ "help": "ARIA-roller skal have en korrekt værdi"
55
+ },
56
+ "aria-toggle-field-name": {
57
+ "description": "",
58
+ "help": "ARIA afkrydsningsfelter skal have et tilgængeligt navn"
59
+ },
60
+ "aria-valid-attr-value": {
61
+ "description": "",
62
+ "help": "ARIA-attributter skal have en korrekt værdi"
63
+ },
64
+ "aria-valid-attr": {
65
+ "description": "",
66
+ "help": "ARIA-attributter skal have et korrekt navn"
67
+ },
68
+ "audio-caption": {
69
+ "description": "",
70
+ "help": "<audio> elementer skal have en transskription ('captions track')"
71
+ },
72
+ "autocomplete-valid": {
73
+ "description": "",
74
+ "help": "Attributten 'autocomplete' skal benyttes korrekt"
75
+ },
76
+ "avoid-inline-spacing": {
77
+ "description": "",
78
+ "help": "Inline tekst-afstande skal være justerbare med brugerdefinerede stylesheets"
79
+ },
80
+ "blink": {
81
+ "description": "",
82
+ "help": "Elementet <blink> er udfaset og må ikke bruges"
83
+ },
84
+ "button-name": {
85
+ "description": "",
86
+ "help": "Knapper skal have forståelig (dvs. detekterbar) tekst"
87
+ },
88
+ "bypass": {
89
+ "description": "",
90
+ "help": "Sider skal have en metode til at springe over gentaget indhold"
91
+ },
92
+ "checkboxgroup": {
93
+ "description": "",
94
+ "help": "Afkrydsningsfelter med den samme 'name' attributværdi skal være del af en gruppe"
95
+ },
96
+ "color-contrast": {
97
+ "description": "",
98
+ "help": "Elementer skal have tilstrækkelig farvekontrast"
99
+ },
100
+ "css-orientation-lock": {
101
+ "description": "",
102
+ "help": "'CSS Media queries' bør ikke bruges til at låse skærmretningen ('orientation')"
103
+ },
104
+ "definition-list": {
105
+ "description": "",
106
+ "help": "<dl> elementer må kun direkte indeholde velsorterede <dt> og <dd> grupper, <script> eller <template> elementer"
107
+ },
108
+ "dlitem": {
109
+ "description": "",
110
+ "help": "<dt> og <dd> elementer skal være under-element til et <dl> element"
111
+ },
112
+ "document-title": {
113
+ "description": "",
114
+ "help": "Dokumenter skal have et <title> element for at bidrage til nemmere navigation"
115
+ },
116
+ "duplicate-id-active": {
117
+ "description": "",
118
+ "help": "'id'-attributten for aktive elementer skal være unik"
119
+ },
120
+ "duplicate-id-aria": {
121
+ "description": "",
122
+ "help": "'id'-attributten brugt på ARIA-elementer og -labels skal være unik"
123
+ },
124
+ "duplicate-id": {
125
+ "description": "",
126
+ "help": "Værdien for 'id'-attributen skal være unik"
127
+ },
128
+ "empty-heading": {
129
+ "description": "",
130
+ "help": "Overskrifter må ikke være tomme"
131
+ },
132
+ "focus-order-semantics": {
133
+ "description": "",
134
+ "help": "Elementer i fokus-rækkefølgen bør have en 'role'-attribut, som er passende for det interaktive indhold"
135
+ },
136
+ "form-field-multiple-labels": {
137
+ "description": "",
138
+ "help": "Form-feltet bør ikke have flere label-elementer"
139
+ },
140
+ "frame-tested": {
141
+ "description": "",
142
+ "help": "Frame-elementer skal være testet med axe-core"
143
+ },
144
+ "frame-title-unique": {
145
+ "description": "",
146
+ "help": "Frame-elementer skal have en unik 'title'-attribut"
147
+ },
148
+ "frame-title": {
149
+ "description": "",
150
+ "help": "Frame-elementer skal have 'title'-attribut"
151
+ },
152
+ "heading-order": {
153
+ "description": "",
154
+ "help": "Overskriftsniveauer bør kun ændres sekventielt"
155
+ },
156
+ "hidden-content": {
157
+ "description": "",
158
+ "help": "Skjult indhold på siden kan ikke analyseres"
159
+ },
160
+ "html-has-lang": {
161
+ "description": "",
162
+ "help": "<html> elementet skal have en 'lang'-attribut"
163
+ },
164
+ "html-lang-valid": {
165
+ "description": "",
166
+ "help": "<html> elementet skal have en korrekt værdi for 'lang'-attributten"
167
+ },
168
+ "html-xml-lang-mismatch": {
169
+ "description": "",
170
+ "help": "<html> elementer med 'lang' og 'xml:lang' skal have det samme basesprog"
171
+ },
172
+ "image-alt": {
173
+ "description": "",
174
+ "help": "Billeder skal have en alternativ tekst"
175
+ },
176
+ "image-redundant-alt": {
177
+ "description": "",
178
+ "help": "Alternativ tekst til billeder (alt-tekst) bør ikke gentages som brødtekst"
179
+ },
180
+ "input-button-name": {
181
+ "description": "",
182
+ "help": "Input-knapper skal have en forståelig tekst"
183
+ },
184
+ "input-image-alt": {
185
+ "description": "",
186
+ "help": "Billed-knapper skal have en alternativ tekst"
187
+ },
188
+ "label-content-name-mismatch": {
189
+ "description": "",
190
+ "help": "Elementers synlige tekst skal være del af deres tilgængelige navn"
191
+ },
192
+ "label-title-only": {
193
+ "description": "",
194
+ "help": "Form-elementer bør have en synlig label"
195
+ },
196
+ "label": {
197
+ "description": "",
198
+ "help": "Form-elementer skal have labels"
199
+ },
200
+ "landmark-banner-is-top-level": {
201
+ "description": "",
202
+ "help": "Et 'banner'-landmark må ikke være indeholdt i et andet landmark"
203
+ },
204
+ "landmark-complementary-is-top-level": {
205
+ "description": "",
206
+ "help": "Et 'aside'- eller 'complimentary'-landmark må ikke være indeholdt i et andet landmark"
207
+ },
208
+ "landmark-contentinfo-is-top-level": {
209
+ "description": "",
210
+ "help": "Et 'contentinfo'-landmark må ikke være indeholdt i et andet landmark"
211
+ },
212
+ "landmark-main-is-top-level": {
213
+ "description": "",
214
+ "help": "Et 'main'-landmark må ikke være indeholdt i et andet landmark"
215
+ },
216
+ "landmark-no-duplicate-banner": {
217
+ "description": "",
218
+ "help": "Dokumentet må ikke have mere end ét 'banner'-landmark"
219
+ },
220
+ "landmark-no-duplicate-contentinfo": {
221
+ "description": "",
222
+ "help": "Dokumentet må ikke have mere end ét 'contentinfo'-landmark"
223
+ },
224
+ "landmark-one-main": {
225
+ "description": "",
226
+ "help": "Dokumentet skal have ét 'main'-landmark"
227
+ },
228
+ "landmark-unique": {
229
+ "description": "",
230
+ "help": "Sikrer at landmarks er unikke"
231
+ },
232
+ "layout-table": {
233
+ "description": "",
234
+ "help": "Tabeller brugt til layout må ikke bruge beskrivende elementer (så som <th> og <caption>)"
235
+ },
236
+ "link-in-text-block": {
237
+ "description": "",
238
+ "help": "Links skal være fremtrædende fra den omkringliggende tekst på en måde, som ikke afhænger af farve"
239
+ },
240
+ "link-name": {
241
+ "description": "",
242
+ "help": "Links skal have forståelig (detekterbar) tekst"
243
+ },
244
+ "list": {
245
+ "description": "",
246
+ "help": "<ul> og <ol> må kun direkte indeholde <li>, <script> eller <template> elementer"
247
+ },
248
+ "listitem": {
249
+ "description": "",
250
+ "help": "<li> elementer skal være indeholdt i et <ul> eller <ol> element"
251
+ },
252
+ "marquee": {
253
+ "description": "",
254
+ "help": "<marquee> elementer er udfaset og må ikke bruges"
255
+ },
256
+ "meta-refresh": {
257
+ "description": "",
258
+ "help": "Tidsindstillet 'refresh' må ikke bruges"
259
+ },
260
+ "meta-viewport-large": {
261
+ "description": "",
262
+ "help": "Brugere bør kunne zoome og skalere tekst op til 500%"
263
+ },
264
+ "meta-viewport": {
265
+ "description": "",
266
+ "help": "Zoom og skalering må ikke være slået fra"
267
+ },
268
+ "object-alt": {
269
+ "description": "",
270
+ "help": "<object> elementer skal have en alternativ tekst"
271
+ },
272
+ "p-as-heading": {
273
+ "description": "",
274
+ "help": "Fremhævelse med fed, kursiv og skriftstørrelse (font-size) må ikke bruges til at style <p> elementer som en overskrift"
275
+ },
276
+ "page-has-heading-one": {
277
+ "description": "",
278
+ "help": "Siden skal indeholde en overskrift på øverste niveau"
279
+ },
280
+ "radiogroup": {
281
+ "description": "",
282
+ "help": "Radioknapper med identiske 'name' attributværdier skal være del af samme gruppe"
283
+ },
284
+ "region": {
285
+ "description": "",
286
+ "help": "Alt indhold på siden skal være indeholdt i landmarks"
287
+ },
288
+ "role-img-alt": {
289
+ "description": "",
290
+ "help": "Elementer med 'role' attributværdien 'img' skal have en alternativ tekst"
291
+ },
292
+ "scope-attr-valid": {
293
+ "description": "",
294
+ "help": "'scope'-attributten skal bruges korrekt i tabeller"
295
+ },
296
+ "scrollable-region-focusable": {
297
+ "description": "",
298
+ "help": "Sørg for, at en scrollbar region er tilgængeligt via keyboard"
299
+ },
300
+ "server-side-image-map": {
301
+ "description": "",
302
+ "help": "Såkaldte 'server-side image-maps' må ikke bruges"
303
+ },
304
+ "skip-link": {
305
+ "description": "",
306
+ "help": "Et 'skip-link' skal pege på et eksisterende og fokuserbart element"
307
+ },
308
+ "tabindex": {
309
+ "description": "",
310
+ "help": "Elementer bør ikke have et 'tabindex' højere end 0"
311
+ },
312
+ "table-duplicate-name": {
313
+ "description": "",
314
+ "help": "Elementet <caption> bør ikke indeholde samme tekst som 'summary'-attributten"
315
+ },
316
+ "table-fake-caption": {
317
+ "description": "",
318
+ "help": "Data- eller overskrifts-celler bør ikke bruges til at beskrive indholdet af en data-tabel"
319
+ },
320
+ "td-has-header": {
321
+ "description": "",
322
+ "help": "Alle ikke-tomme <td> elementer i en tabel større end 3x3 bør have en tabeloverskrift (<th>)"
323
+ },
324
+ "td-headers-attr": {
325
+ "description": "",
326
+ "help": "Alle celler i en tabel, som bruger 'header'-attributten må kun referere til andre celler i samme tabel"
327
+ },
328
+ "th-has-data-cells": {
329
+ "description": "",
330
+ "help": "Alle <th> elementer og elementer med 'role=columnheader/rowheader' skal referere til de data-celler, som de beskriver"
331
+ },
332
+ "valid-lang": {
333
+ "description": "",
334
+ "help": "'lang'-attributten skal have en korrekt værdi"
335
+ },
336
+ "video-caption": {
337
+ "description": "",
338
+ "help": "<video> elementer skal have undertekster ('captions')"
339
+ },
340
+ "video-description": {
341
+ "description": "",
342
+ "help": "<video> elementer skal have et 'description' track"
343
+ }
344
+ },
345
+ "checks": {
346
+ "abstractrole": {
347
+ "pass": "Abstrakte roller er ikke brugt",
348
+ "fail": "Abstrakte roller bør ikke bruges"
349
+ },
350
+ "aria-allowed-attr": {
351
+ "pass": "ARIA-attribut er brugt korrekt for den angivede rolle",
352
+ "fail": "ARIA-attribut{{=it.data && it.data.length > 1 ? 'terne' : ''}} er ikke tilladt:{{~it.data:value}} {{=value}}{{~}}"
353
+ },
354
+ "aria-allowed-role": {
355
+ "pass": "ARIA-rollen er tilladt for det givne element",
356
+ "fail": "ARIA-rolle{{=it.data && it.data.length > 1 ? 'rne' : 'n'}} {{=it.data.join(', ')}} er ikke tilladt for det givne element",
357
+ "incomplete": "ARIA-rolle{{=it.data && it.data.length > 1 ? 'rne' : 'n'}} {{=it.data.join(', ')}} skal være fjernet, når elementet er synligt, da {{=it.data && it.data.length > 1 ? 'de' : 'det'}} ikke er tilladt for elementet"
358
+ },
359
+ "aria-hidden-body": {
360
+ "pass": "Ingen 'aria-hidden'-attribut er at finde i dokumentets <body> element",
361
+ "fail": "'aria-hidden=true' bør ikke bruges på dokumentets <body> element"
362
+ },
363
+ "aria-roledescription": {
364
+ "pass": "'aria-roledescription' bruges på en understøttet semantisk rolle",
365
+ "incomplete": "Tjek at 'aria-roledescription' bliver læst op af understøttet skærmlæser",
366
+ "fail": "Giv elementet en rolle, som understøtter 'aria-roledescription'"
367
+ },
368
+ "aria-errormessage": {
369
+ "pass": "Bruger en understøttet 'aria-errormessage'-teknik",
370
+ "fail": "'aria-errormessage'-værdi{{=it.data && it.data.length > 1 ? 'er' : ''}} {{~it.data:value}} `{{=value}}{{~}}` bør bruge en teknik til at annoncere beskeden (fx 'aria-live', 'aria-describedby', 'role=alert', osv.)"
371
+ },
372
+ "has-widget-role": {
373
+ "pass": "Elementet har en 'widget'-rolle.",
374
+ "fail": "Elementet har ikke en 'widget'-rolle."
375
+ },
376
+ "implicit-role-fallback": {
377
+ "pass": "Elementets implicitte ARIA-rolle er en passende fallback",
378
+ "fail": "Elementets implicitte ARIA-rolle er ikke en god fallback for den (ikke-supporterede) rolle"
379
+ },
380
+ "invalidrole": {
381
+ "pass": "ARIA-rollen er korrekt",
382
+ "fail": "Rollen skal være en af de mulige ARIA-roller"
383
+ },
384
+ "no-implicit-explicit-label": {
385
+ "pass": "Der er uoverensstemmelse mellem <label> og det tilgængelige navn",
386
+ "incomplete": "Tjek at <label> elementet ikke behøver være en del af {{=it.data}}-feltets navn"
387
+ },
388
+ "aria-required-attr": {
389
+ "pass": "Alle krævede ARIA-attributter er tilstede",
390
+ "fail": "Krævet ARIA-attribut{{=it.data && it.data.length > 1 ? 'ter' : ''}} er ikke til stede:{{~it.data:value}} {{=value}}{{~}}"
391
+ },
392
+ "aria-required-children": {
393
+ "pass": "Krævet ARIA-under-elementer er til stede",
394
+ "fail": "Krævet ARIA-under-element{{=it.data && it.data.length > 1 ? 'er' : ''}}s rolle er ikke til stede:{{~it.data:value}} {{=value}}{{~}}",
395
+ "incomplete": "Forventer at ARIA under-element{{=it.data && it.data.length > 1 ? 'er' : ''}}s rolle bliver tilføjet:{{~it.data:value}} {{=value}}{{~}}"
396
+ },
397
+ "aria-required-parent": {
398
+ "pass": "Krævet ARIA-over-elements rolle er til stede",
399
+ "fail": "Krævet ARIA-over-element{{=it.data && it.data.length > 1 ? 'er' : ''}}s rolle er ikke til stede:{{~it.data:value}} {{=value}}{{~}}"
400
+ },
401
+ "aria-unsupported-attr": {
402
+ "pass": "ARIA-attribut er understøttet",
403
+ "fail": "ARIA-attribut er ikke bredt understøttet i skærmlæsere og tilgængelighedsteknologier: {{~it.data:value}} {{=value}}{{~}}"
404
+ },
405
+ "unsupportedrole": {
406
+ "pass": "ARIA rollen er understøttet",
407
+ "fail": "Den brugte rolle er ikke bredt understøttet i skærmlæsere og tilgængelighedsteknologier: {{~it.data:value}} {{=value}}{{~}}"
408
+ },
409
+ "aria-valid-attr-value": {
410
+ "pass": "ARIA-attributværdien er valid",
411
+ "fail": "Ikke-korrekt ARIA-attributværdi{{=it.data && it.data.length > 1 ? 'er' : ''}}:{{~it.data:value}} {{=value}}{{~}}",
412
+ "incomplete": "ARIA-attribut{{=it.data && it.data.length > 1 ? 'ternes' : 'tens'}} element 'id' er ikke at finde på siden:{{~it.data:value}} {{=value}}{{~}}"
413
+ },
414
+ "aria-valid-attr": {
415
+ "pass": "ARIA-attributnavn{{=it.data && it.data.length > 1 ? 'ene' : 'et'}} er korrekt",
416
+ "fail": "Ikke-korrekt ARIA-attributnavn{{=it.data && it.data.length > 1 ? 'e' : ''}}:{{~it.data:value}} {{=value}}{{~}}"
417
+ },
418
+ "valid-scrollable-semantics": {
419
+ "pass": "Elementet har korrekt semantik for et element i fokus-rækkefølgen.",
420
+ "fail": "Elementet har ikke korrekt semantik for et element i fokus-rækkefølgen."
421
+ },
422
+ "color-contrast": {
423
+ "pass": "Elementet har stor farvekontrast, den er {{=it.data.contrastRatio}}",
424
+ "fail": "Elementet har ikke nok farvekontrast, den er {{=it.data.contrastRatio}} (forgrundsfarve: {{=it.data.fgColor}}, baggrundsfarve: {{=it.data.bgColor}}, tekststørrelse: {{=it.data.fontSize}}, teksttykkelse: {{=it.data.fontWeight}}). Forventet kontrastforhold er {{=it.data.expectedContrastRatio}}",
425
+ "incomplete": {
426
+ "bgImage": "Elementets baggrundsfarve kunne ikke detekteres på grund af et baggrundsbillede",
427
+ "bgGradient": "Elementets baggrundsfarve kunne ikke detekteres på grund af en baggrundsgradient",
428
+ "imgNode": "Elementets baggrundsfarve kunne ikke detekteres, fordi elementet indeholder et billedelement",
429
+ "bgOverlap": "Elementets baggrundsfarve kunne ikke detekteres, fordi det er overlappet af et andet element",
430
+ "fgAlpha": "Elementets forgrundsfarve kunne ikke detekteres på grund af dets gennemsigtighed",
431
+ "elmPartiallyObscured": "Elementets baggrundsfarve kunne ikke detekteres, fordi det er delvist dækket af et andet element",
432
+ "elmPartiallyObscuring": "Elementets baggrundsfarve kunne ikke detekteres, fordi det delvist dækker et andet element",
433
+ "outsideViewport": "Elementets baggrundsfarve kunne ikke detekteres, fordi det er udenfor sidens 'viewport'",
434
+ "equalRatio": "Elementet har et 1:1-kontrastforhold med baggrunden",
435
+ "shortTextContent": "Elementets indhold er for kort til at kunne afgøre, om indholdet ren faktisk ER tekst",
436
+ "default": "Kan ikke udregne kontrastforhold"
437
+ }
438
+ },
439
+ "link-in-text-block": {
440
+ "pass": "Links kan adskilles fra den omkringliggende tekst på anden måde end med farve",
441
+ "fail": "Links bør skille sig ud fra den omkringliggende tekst på anden måde end med farve",
442
+ "incomplete": {
443
+ "bgContrast": "Elementets kontrastforhold kunne ikke detekteres. Tjek for specifik 'hover'/'focus' styling",
444
+ "bgImage": "Elementets kontrastforhold kunne ikke detekteres på grund af et baggrundsbillede",
445
+ "bgGradient": "Elementets kontrastforhold kunne ikke detekteres på grund af en baggrundsgradient",
446
+ "imgNode": "Elementets kontrastforhold kunne ikke detekteres, fordi elementet indeholder et billedelement",
447
+ "bgOverlap": "Elementets kontrastforhold kunne ikke detekteres på grund af overlappende elementer",
448
+ "default": "Kan ikke udregne kontrastforhold"
449
+ }
450
+ },
451
+ "autocomplete-appropriate": {
452
+ "pass": "'autocomplete'-værdien er brugt på et passende element",
453
+ "fail": "'autocomplete'-værdien er ikke passende for denne type input"
454
+ },
455
+ "autocomplete-valid": {
456
+ "pass": "'autocomplete'-attributten er korrekt formateret",
457
+ "fail": "'autocomplete'-attributten er forkert formateret"
458
+ },
459
+ "fieldset": {
460
+ "pass": "Elementet er indhold i en gruppe af form-felter",
461
+ "fail": "{{var code = it.data && it.data.failureCode;}}{{? code === 'no-legend'}}Gruppen af form-felter ('fieldset') mangler et 'legend'-element som sit første under-element{{?? code === 'empty-legend'}}'Legend'-elementet har ikke tekst, som er synlig for skærmlæsere{{?? code === 'mixed-inputs'}}Gruppen af form-felter ('fieldset') indeholder ikke-relaterede input-elementer{{?? code === 'no-group-label'}}ARIA-gruppen mangler en 'aria-label' eller 'aria-labelledby'{{?? code === 'group-mixed-inputs'}}ARIA-gruppen indeholder ikke-relateret indhold{{??}}Elementet mangler en omkringliggende grupperingselement ('fieldset') eller ARIA-gruppe{{?}}"
462
+ },
463
+ "group-labelledby": {
464
+ "pass": "Elementer med navnet \"{{=it.data.name}}\" har både en delt og en unik label via 'aria-labelledby'-referencer",
465
+ "fail": "{{var code = it.data && it.data.failureCode;}}elementer med navnet \"{{=it.data.name}}\" har ikke alle {{? code === 'no-shared-label' }}en delt label{{?? code === 'no-unik-label' }}en unik label{{??}}både en delt og unik label{{?}}, via 'aria-labelledby'-referencer"
466
+ },
467
+ "accesskeys": {
468
+ "pass": "'Accesskey' attributværdien er unik",
469
+ "fail": "Dokumentet har flere elementer med den samme 'accesskey'-attribut"
470
+ },
471
+ "focusable-content": {
472
+ "pass": "Elementet indeholder fokuserbare elementer",
473
+ "fail": "Elementet bør have fokuserbart indhold"
474
+ },
475
+ "focusable-disabled": {
476
+ "pass": "Ingen fokuserbare elementer indeholdt i elementet",
477
+ "fail": "Fokuserbart indhold bør slås fra eller fjernes fra sidens DOM"
478
+ },
479
+ "focusable-element": {
480
+ "pass": "Elementet er fokuserbart",
481
+ "fail": "Elementet bør være fokuserbart"
482
+ },
483
+ "focusable-no-name": {
484
+ "pass": "Elementet er ikke i sidens tabulerings-rækkefølge ('tab order') eller har tilgængelig tekst",
485
+ "fail": "Elementet er i sidens tabulerings-rækkefølge ('tab order') og har ikke tilgængelig tekst"
486
+ },
487
+ "focusable-not-tabbable": {
488
+ "pass": "Ingen fokuserbare elementer indeholdt i element",
489
+ "fail": "Fokuserbart indhold bør have tabindex='-1' eller fjernes fra sidens DOM"
490
+ },
491
+ "landmark-is-top-level": {
492
+ "pass": "{{=it.data.role }} landmark er på det øverste niveau.",
493
+ "fail": "{{=it.data.role }} landmark er indhold i et andet landmark."
494
+ },
495
+ "page-has-heading-one": {
496
+ "pass": "Siden har mindst én overskrift på niveau 1",
497
+ "fail": "Siden skal have mindst én overskrift på niveau 1"
498
+ },
499
+ "page-has-main": {
500
+ "pass": "Dokumentet har mindst ét 'main'-landmark",
501
+ "fail": "Dokumentet har ikke et 'main'-landmark"
502
+ },
503
+ "page-no-duplicate-banner": {
504
+ "pass": "Dokumentet har ikke mere end ét 'banner'-landmark",
505
+ "fail": "Dokumentet har mere end ét 'banner-'landmark"
506
+ },
507
+ "page-no-duplicate-contentinfo": {
508
+ "pass": "Dokumentet har ikke mere end ét 'contentinfo'-landmark",
509
+ "fail": "Dokumentet har mere end ét 'contentinfo'-landmark"
510
+ },
511
+ "page-no-duplicate-main": {
512
+ "pass": "Dokumentet har ikke mere end ét 'main'-landmark",
513
+ "fail": "Dokumentet har mere end ét 'main'-landmark"
514
+ },
515
+ "tabindex": {
516
+ "pass": "Elementet har ikke et 'tabindex' større end 0",
517
+ "fail": "Elementet har et 'tabindex' større end 0"
518
+ },
519
+ "alt-space-value": {
520
+ "pass": "Elementet har en alt-attribut med valid værdi",
521
+ "fail": "Elementet har en alt-attribut, som kun indeholder et mellemrum, hvilket ikke ignoreres af alle skærmlæsere"
522
+ },
523
+ "duplicate-img-label": {
524
+ "pass": "Elementet duplikerer ikke den eksisterende tekst fra <img> elementets alt-tekst",
525
+ "fail": "Elementet indeholder et <img> element med alt-tekst, som duplikerer den eksisterende tekst"
526
+ },
527
+ "explicit-label": {
528
+ "pass": "Form-elementet har en eksplicit <label>",
529
+ "fail": "Form-elementet har ikke en eksplicit <label>"
530
+ },
531
+ "help-same-as-label": {
532
+ "pass": "Hjælpeteksten ('title' eller 'aria-describedby') duplikerer ikke label-teksten",
533
+ "fail": "Hjælpeteksten ('title' eller 'aria-describedby') er den samme som label-teksten"
534
+ },
535
+ "hidden-explicit-label": {
536
+ "pass": "Form-elementet har en synlig og eksplicit <label>",
537
+ "fail": "Form-elementet har en eksplicit <label>, som er skjult"
538
+ },
539
+ "implicit-label": {
540
+ "pass": "Form-elementet har en implicit (indeholdt i en) <label>",
541
+ "fail": "Form-elementet har ikke en implicit (indeholdt i en) <label>"
542
+ },
543
+ "label-content-name-mismatch": {
544
+ "pass": "Elementet indeholder synlig tekst som del af dets tilgængelige navn",
545
+ "fail": "Tekst i elementet er ikke inkluderet i det tilgængelige navn"
546
+ },
547
+ "multiple-label": {
548
+ "pass": "Form-feltet har ikke flere label-elementer",
549
+ "incomplete": "Flere label-elementer er ikke bredt understøttet i tilgængelighedsteknologier. Sørg for, at det første label-element indeholder alle de nødvendige informationer."
550
+ },
551
+ "title-only": {
552
+ "pass": "Form-elementet bruger ikke udelukkende 'title'-attributten som label",
553
+ "fail": "Kun 'title'-attributten er brugt som label for form-elementet"
554
+ },
555
+ "landmark-is-unique": {
556
+ "pass": "Landmarks skal have en unik rolle eller 'role'/'label'/'title'-attribut-kombination (som tilgængeligt navn)",
557
+ "fail": "Et landmark skal have en unik 'aria-label', 'aria-labelledby', eller 'title' for at gøre landmarks adskillelige"
558
+ },
559
+ "has-lang": {
560
+ "pass": "<html> elementet har en 'lang'-attribut",
561
+ "fail": "<html> elementet har ikke en 'lang'-attribut"
562
+ },
563
+ "valid-lang": {
564
+ "pass": "'lang'-attributtens værdi er inkluderet i listen over godkendte sprog",
565
+ "fail": "'lang'-attributtens værdi er ikke inkluderet i listen over godkendte sprog"
566
+ },
567
+ "xml-lang-mismatch": {
568
+ "pass": "Attributterne 'lang' og 'xml:lang' har samme basissprog",
569
+ "fail": "Attributterne 'lang' og 'xml:lang' har ikke samme basissprog"
570
+ },
571
+ "dlitem": {
572
+ "pass": "Beskrivelsesliste-elementet har et <dl>-over-element",
573
+ "fail": "Beskrivelsesliste-elementet har ikke et <dl>-over-element"
574
+ },
575
+ "listitem": {
576
+ "pass": "Elementet i listen har et <ul>, <ol> eller 'role=\"list\"'-over-element",
577
+ "fail": "Elementet i listen har ikke et <ul>, <ol> eller 'role=\"list\"'-over-element"
578
+ },
579
+ "only-dlitems": {
580
+ "pass": "Elementet i listen har kun direkte under-elementer, som er tilladt i <dt> eller <dd> elementer",
581
+ "fail": "Elementet i listen har direkte under-elementer, som ikke er tilladt inde i <dt> eller <dd> elementer"
582
+ },
583
+ "only-listitems": {
584
+ "pass": "Elementet i listen har kun direkte under-elementer, som er tilladt i <li> elementer",
585
+ "fail": "Elementet i listen har direkte under-elementer, som ikke er tilladt inde i <li> elementer"
586
+ },
587
+ "structured-dlitems": {
588
+ "pass": "Det ikke-tomme element har både <dt> og <dd> elementer",
589
+ "fail": "Det ikke-tomme element har ikke mindst ét <dt> element efterfulgt af mindst ét <dd> element"
590
+ },
591
+ "caption": {
592
+ "pass": "Multimedia-elementet har et track med undertekster",
593
+ "incomplete": "Tjek at undertekster er tilgængelige for elementet"
594
+ },
595
+ "description": {
596
+ "pass": "Multimedia-elementet har et lydbeskrivende ('audio-description') track",
597
+ "incomplete": "Tjek at elementet har et lydbeskrivende ('audio-description') track"
598
+ },
599
+ "frame-tested": {
600
+ "pass": "Denne <iframe> blev testet af axe-core",
601
+ "fail": "Denne <iframe> kunne ikke testes af axe-core",
602
+ "incomplete": "Denne <iframe> er endnu ikke blevet testet af axe-core"
603
+ },
604
+ "css-orientation-lock": {
605
+ "pass": "Skærmen kan styres, og sidens skærmretning er ikke låst med med 'css-orientation-lock'",
606
+ "fail": "Skærmretningen ('css-orientation-lock') er låst, hvilket gør sidevisning svær at styre på skærmen",
607
+ "incomplete": "Det kan ikke detekteres om skærmretning er låst (med 'css-orientation-lock')"
608
+ },
609
+ "meta-viewport-large": {
610
+ "pass": "<meta>-tagget begrænser ikke høj zoom på mobile enheder",
611
+ "fail": "<meta>-tagget begrænser zoom på mobile enheder"
612
+ },
613
+ "meta-viewport": {
614
+ "pass": "<meta>-tagget slår ikke zoom fra på mobile enheder",
615
+ "fail": "{{=it.data}} på <meta>-tagget slår zoom fra på mobile enheder"
616
+ },
617
+ "header-present": {
618
+ "pass": "Siden har en overskrift (header)",
619
+ "fail": "Siden har ikke en overskrift (header)"
620
+ },
621
+ "heading-order": {
622
+ "pass": "Rækkefølgen af overskiftsniveauer er korrekt",
623
+ "fail": "Rækkefølgen af overskiftsniveauer er ikke korrekt"
624
+ },
625
+ "internal-link-present": {
626
+ "pass": "Passende 'skip link' fundet",
627
+ "fail": "Intet passende 'skip link' fundet"
628
+ },
629
+ "landmark": {
630
+ "pass": "Siden har en 'landmark' region",
631
+ "fail": "Siden har ikke en 'landmark' region"
632
+ },
633
+ "meta-refresh": {
634
+ "pass": "<meta>-tagget genindlæser ikke siden med det samme",
635
+ "fail": "<meta>-tagget genindlæser siden med det samme"
636
+ },
637
+ "p-as-heading": {
638
+ "pass": "<p> elementer er ikke stylet som en overskrift",
639
+ "fail": "Overskrifts-elementer (<h1>, <h2>, osv.) bør bruges i stedet for stylet <p> elementer"
640
+ },
641
+ "region": {
642
+ "pass": "Al indhold på siden er lagt ind under landmarks",
643
+ "fail": "Dele af sidens indhold er ikke lagt under et landmark"
644
+ },
645
+ "skip-link": {
646
+ "pass": "Det element, som 'skip link' refererer til, eksisterer",
647
+ "incomplete": "Det element, som 'skip link' refererer til, bør blive synligt ved aktivering",
648
+ "fail": "Manglende 'skip link' 'target'-attribut"
649
+ },
650
+ "unique-frame-title": {
651
+ "pass": "Elementets 'title'-attribut er unik",
652
+ "fail": "Elementets 'title'-attribut er ikke unik"
653
+ },
654
+ "duplicate-id-active": {
655
+ "pass": "Dokumentet har ingen aktive elementer, der deler den samme 'id'-attribut",
656
+ "fail": "Dokumentet har aktive elementer, der deler den samme 'id'-attribut: {{=it.data}}"
657
+ },
658
+ "duplicate-id-aria": {
659
+ "pass": "Dokumentet har ingen elementer refereret med ARIA eller labels, der deler den samme 'id'-attribut",
660
+ "fail": "Dokumentet har flere elementer refereret med ARIA med den samme 'id'-attribut: {{=it.data}}"
661
+ },
662
+ "duplicate-id": {
663
+ "pass": "Dokumentet har ingen statiske elementer, der deler den samme 'id'-attribut",
664
+ "fail": "Dokumentet har flere statiske elementer med den samme 'id'-attribut"
665
+ },
666
+ "aria-label": {
667
+ "pass": "'aria-label'-attribut er til stede og er ikke tom",
668
+ "fail": "'aria-label'-attribut eksisterer ikke eller er tom"
669
+ },
670
+ "aria-labelledby": {
671
+ "pass": "'aria-labelledby'-attribut eksisterer og refererer elementer, der er synlige for skærmlæsere",
672
+ "fail": "'aria-labelledby'-attribut eksisterer ikke, eller refererer elementer, som ikke eksisterer - eller refererer til elementer, der er tomme"
673
+ },
674
+ "avoid-inline-spacing": {
675
+ "pass": "Ingen inline styling med '!important', som påvirker tekst-mellemrums-afstand er specificeret",
676
+ "fail": "Fjern '!important' fra inline styling{{=it.data && it.data.length > 1 ? 's' : ''}} {{=it.data.join(', ')}}, da overskrivning af dette, ikke er understøttet i de fleste browsere"
677
+ },
678
+ "button-has-visible-text": {
679
+ "pass": "Elementet har indre tekst, som er synlig for skærmlæsere",
680
+ "fail": "Elementet har ingen indre tekst, som er synlig for skærmlæsere"
681
+ },
682
+ "doc-has-title": {
683
+ "pass": "Dokumentet har et <title> element, der ikke er tomt",
684
+ "fail": "Dokumentet mangler et <title> element med indhold"
685
+ },
686
+ "exists": {
687
+ "pass": "Elementet eksisterer ikke",
688
+ "fail": "Elementet eksisterer"
689
+ },
690
+ "has-alt": {
691
+ "pass": "Elementet har en 'alt'-attribut",
692
+ "fail": "Elementet har ikke en 'alt'-attribut"
693
+ },
694
+ "has-visible-text": {
695
+ "pass": "Elementet har tekst, der er synligt for skærmlæsere",
696
+ "fail": "Elementet har ikke tekst, der er synligt for skærmlæsere"
697
+ },
698
+ "is-on-screen": {
699
+ "pass": "Elementet er ikke synligt",
700
+ "fail": "Elementet er synligt"
701
+ },
702
+ "non-empty-alt": {
703
+ "pass": "Elementet har 'alt'-attribut med indhold",
704
+ "fail": "Elementet har ingen 'alt'-attribut, eller 'alt'-attributten er tom"
705
+ },
706
+ "non-empty-if-present": {
707
+ "pass": "Elementet {{?it.data}} har en 'værdi'-attribut med indhold{{??}} har ikke en 'value'-attribut{{?}}",
708
+ "fail": "Elementet har en 'value'-attribut, og 'værdi'-attributten er tom"
709
+ },
710
+ "non-empty-title": {
711
+ "pass": "Elementet har en 'title'-attribut",
712
+ "fail": "Elementet har ingen 'title'-attribut, eller 'title'-attributten er tom"
713
+ },
714
+ "non-empty-value": {
715
+ "pass": "Elementet har 'value'-attribut med indhold",
716
+ "fail": "Elementet har ingen 'value'-attribut, eller 'value'-attributten er tom"
717
+ },
718
+ "role-none": {
719
+ "pass": "Elementets standard semantik blev overskrevet med attributten 'role=\"none\"'",
720
+ "fail": "Elementets standard semantik blev ikke overskrevet med attributten 'role=\"none\"'"
721
+ },
722
+ "role-presentation": {
723
+ "pass": "Elementets standard semantik blev overskrevet med attributten 'role=\"presentation\"'",
724
+ "fail": "Elementets standard semantik blev ikke overskrevet med attributten 'role=\"presentation\"'"
725
+ },
726
+ "caption-faked": {
727
+ "pass": "Den første række i tabellen er ikke brugt som en beskrivelse ('caption')",
728
+ "fail": "Det første element i tabellen bør være en beskrivelse (<caption>) i stedet for en celle"
729
+ },
730
+ "has-caption": {
731
+ "pass": "Layouttabellen bruger ikke et <caption> element",
732
+ "fail": "Layouttabellen bruger <caption> element"
733
+ },
734
+ "has-summary": {
735
+ "pass": "Layouttabellen bruger ikke 'summary'-attribut",
736
+ "fail": "Layouttabellen bruger 'summary'-attribut"
737
+ },
738
+ "has-th": {
739
+ "pass": "Layouttabellen bruger ikke <th> elementer",
740
+ "fail": "Layouttabellen bruger <th> elementer"
741
+ },
742
+ "html5-scope": {
743
+ "pass": "'Scope'-attributten bør kun bruges på tabellens header-elementer (<th>)",
744
+ "fail": "'Scope'-attributten bør kun bruges på tabellens header-elementer (<th>)"
745
+ },
746
+ "same-caption-summary": {
747
+ "pass": "Indholdet af 'summary'-attributten og <caption> elementet er ikke identisk",
748
+ "fail": "Indholdet af 'summary'-attributten og <caption> elementet er identisk"
749
+ },
750
+ "scope-value": {
751
+ "pass": "'scope'-attributten bruges korrekt",
752
+ "fail": "Værdien af 'scope'-attributten må kun være 'row' eller 'col'"
753
+ },
754
+ "td-has-header": {
755
+ "pass": "Alle data-celler med indhold har en tabel-header",
756
+ "fail": "Nogle data-celler med indhold har ikke tabel-headers"
757
+ },
758
+ "td-headers-attr": {
759
+ "pass": "Header-attributten bruges kun til at referere til andre celler i den samme tabel",
760
+ "fail": "Header-attributten bruges ikke kun til at referere til andre celler i den samme tabel"
761
+ },
762
+ "th-has-data-cells": {
763
+ "pass": "Alle tabellens header-celler refererer til data-celler",
764
+ "fail": "Ikke alle tabellens header-celler refererer til data-celler",
765
+ "incomplete": "Nogle af tabellens data-celler mangler eller er tomme"
766
+ },
767
+ "hidden-content": {
768
+ "pass": "Alt indhold på siden er blevet analyseret.",
769
+ "fail": "Der var problemer med at analysere dele af indholdet på denne side.",
770
+ "incomplete": "Der er skjult indhold på siden, som ikke blev analyseret. Du skal gøre dette indhold synligt for at kunne analysere det."
771
+ }
772
+ },
773
+ "failureSummaries": {
774
+ "any": {
775
+ "failureMessage": "Ret en af følgende:{{~it:value}}\n {{=value.split('\\n').join('\\n ')}}{{~}}"
776
+ },
777
+ "none": {
778
+ "failureMessage": "Ret alle de følgende:{{~it:value}}\n {{=value.split('\\n').join('\\n ')}}{{~}}"
779
+ }
780
+ },
781
+ "incompleteFallbackMessage": "axe kunne ikke give en årsag. Tid til at finde dit udviklingsværktøj frem!"
782
+ }