testaro 78.0.6 → 78.4.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 (361) hide show
  1. package/.gitattributes +94 -0
  2. package/.github/workflows/ci.yml +58 -0
  3. package/.github/workflows/publish.yml +49 -0
  4. package/.github/workflows/typescript.yml +35 -0
  5. package/AGENTS.md +2 -2
  6. package/CLAUDE.md +25 -19
  7. package/CONTAINERS.md +10 -6
  8. package/CONTRIBUTING.md +29 -3
  9. package/Dockerfile +1 -1
  10. package/README.md +75 -20
  11. package/UPGRADES.md +4 -0
  12. package/actSpecs-doc.md +13 -1
  13. package/actSpecs.js +29 -5
  14. package/call.js +6 -5
  15. package/docker-compose.yml +8 -2
  16. package/docs/checkpoint-scanning.md +199 -0
  17. package/docs/standard-result-outcome.md +165 -0
  18. package/env.example +44 -10
  19. package/eslint.config.mjs +101 -0
  20. package/netWatch.js +373 -222
  21. package/package.json +46 -31
  22. package/pour/README.md +47 -0
  23. package/pour/pour.min.js +8 -0
  24. package/procs/actDo.js +808 -0
  25. package/procs/catalog.d.ts +17 -0
  26. package/procs/catalog.js +313 -221
  27. package/procs/catalog.ts +398 -0
  28. package/procs/checkpoint.js +110 -0
  29. package/procs/config.d.ts +35 -0
  30. package/procs/config.js +63 -0
  31. package/procs/dateTime.js +2 -1
  32. package/procs/doActs.js +442 -849
  33. package/procs/doTestAct.js +27 -121
  34. package/procs/flow.js +221 -0
  35. package/procs/generateRuleRegistry.js +94 -0
  36. package/procs/getSource.d.ts +26 -0
  37. package/procs/getSource.js +1 -0
  38. package/procs/job.js +116 -1
  39. package/procs/launch.d.ts +40 -0
  40. package/procs/launch.js +239 -108
  41. package/procs/nu.d.ts +48 -0
  42. package/procs/nu.js +1 -0
  43. package/procs/scope.js +196 -0
  44. package/procs/shoot.d.ts +33 -0
  45. package/procs/shoot.js +3 -1
  46. package/procs/standard.d.ts +18 -0
  47. package/procs/standard.js +83 -0
  48. package/procs/standard.ts +126 -0
  49. package/procs/testAct.js +145 -0
  50. package/procs/testaro.d.ts +20 -0
  51. package/procs/testaro.js +237 -189
  52. package/procs/testaro.ts +321 -0
  53. package/procs/userPath.js +126 -0
  54. package/procs/xPath.d.ts +4 -0
  55. package/procs/xPath.js +82 -64
  56. package/procs/xPath.ts +106 -0
  57. package/procs/xPathScript.d.ts +6 -0
  58. package/procs/xPathScript.js +70 -0
  59. package/run.js +3 -2
  60. package/surea11y/README.md +44 -0
  61. package/surea11y/surea11y.browser.js +14 -0
  62. package/testaro/adbID.d.ts +3 -0
  63. package/testaro/adbID.js +39 -41
  64. package/testaro/adbID.ts +66 -0
  65. package/testaro/allCapStyle.d.ts +3 -0
  66. package/testaro/allCapStyle.js +32 -34
  67. package/testaro/allCapStyle.ts +55 -0
  68. package/testaro/allCaps.d.ts +16 -0
  69. package/testaro/allCaps.js +179 -151
  70. package/testaro/allCaps.ts +228 -0
  71. package/testaro/allHidden.d.ts +13 -0
  72. package/testaro/allHidden.js +30 -30
  73. package/testaro/allHidden.ts +50 -0
  74. package/testaro/allSlanted.d.ts +3 -0
  75. package/testaro/allSlanted.js +31 -33
  76. package/testaro/allSlanted.ts +54 -0
  77. package/testaro/altScheme.d.ts +3 -0
  78. package/testaro/altScheme.js +28 -30
  79. package/testaro/altScheme.ts +50 -0
  80. package/testaro/attVal.d.ts +3 -0
  81. package/testaro/attVal.js +21 -21
  82. package/testaro/attVal.ts +52 -0
  83. package/testaro/autocomplete.d.ts +3 -0
  84. package/testaro/autocomplete.js +60 -75
  85. package/testaro/autocomplete.ts +101 -0
  86. package/testaro/bulk.d.ts +13 -0
  87. package/testaro/bulk.js +33 -33
  88. package/testaro/bulk.ts +55 -0
  89. package/testaro/buttonMenu.d.ts +9 -0
  90. package/testaro/buttonMenu.js +318 -319
  91. package/testaro/buttonMenu.ts +391 -0
  92. package/testaro/captionLoc.d.ts +3 -0
  93. package/testaro/captionLoc.js +18 -20
  94. package/testaro/captionLoc.ts +40 -0
  95. package/testaro/datalistRef.d.ts +3 -0
  96. package/testaro/datalistRef.js +34 -36
  97. package/testaro/datalistRef.ts +55 -0
  98. package/testaro/distortion.d.ts +3 -0
  99. package/testaro/distortion.js +58 -26
  100. package/testaro/distortion.ts +81 -0
  101. package/testaro/docType.d.ts +15 -0
  102. package/testaro/docType.js +26 -25
  103. package/testaro/docType.ts +45 -0
  104. package/testaro/dupAtt.d.ts +16 -0
  105. package/testaro/dupAtt.js +114 -104
  106. package/testaro/dupAtt.ts +144 -0
  107. package/testaro/elements.d.ts +6 -0
  108. package/testaro/elements.js +153 -153
  109. package/testaro/elements.ts +215 -0
  110. package/testaro/embAc.d.ts +3 -0
  111. package/testaro/embAc.js +20 -20
  112. package/testaro/embAc.ts +40 -0
  113. package/testaro/focAll.d.ts +13 -0
  114. package/testaro/focAll.js +186 -191
  115. package/testaro/focAll.ts +217 -0
  116. package/testaro/focAndOp.d.ts +3 -0
  117. package/testaro/focAndOp.js +101 -104
  118. package/testaro/focAndOp.ts +128 -0
  119. package/testaro/focInd.d.ts +3 -0
  120. package/testaro/focInd.js +65 -66
  121. package/testaro/focInd.ts +96 -0
  122. package/testaro/focVis.d.ts +3 -0
  123. package/testaro/focVis.js +29 -30
  124. package/testaro/focVis.ts +52 -0
  125. package/testaro/headEl.d.ts +10 -0
  126. package/testaro/headEl.js +62 -62
  127. package/testaro/headEl.ts +82 -0
  128. package/testaro/headingAmb.d.ts +3 -0
  129. package/testaro/headingAmb.js +55 -63
  130. package/testaro/headingAmb.ts +72 -0
  131. package/testaro/hovInd.d.ts +12 -0
  132. package/testaro/hovInd.js +164 -130
  133. package/testaro/hovInd.ts +199 -0
  134. package/testaro/hover.d.ts +3 -0
  135. package/testaro/hover.js +156 -126
  136. package/testaro/hover.ts +154 -0
  137. package/testaro/hr.d.ts +3 -0
  138. package/testaro/hr.js +15 -17
  139. package/testaro/hr.ts +36 -0
  140. package/testaro/imageLink.d.ts +3 -0
  141. package/testaro/imageLink.js +18 -20
  142. package/testaro/imageLink.ts +42 -0
  143. package/testaro/labClash.d.ts +3 -0
  144. package/testaro/labClash.js +32 -33
  145. package/testaro/labClash.ts +54 -0
  146. package/testaro/legendLoc.d.ts +3 -0
  147. package/testaro/legendLoc.js +18 -20
  148. package/testaro/legendLoc.ts +42 -0
  149. package/testaro/lineHeight.d.ts +3 -0
  150. package/testaro/lineHeight.js +44 -48
  151. package/testaro/lineHeight.ts +70 -0
  152. package/testaro/linkAmb.d.ts +7 -0
  153. package/testaro/linkAmb.js +80 -80
  154. package/testaro/linkAmb.ts +105 -0
  155. package/testaro/linkExt.d.ts +3 -0
  156. package/testaro/linkExt.js +14 -16
  157. package/testaro/linkExt.ts +35 -0
  158. package/testaro/linkOldAtt.d.ts +3 -0
  159. package/testaro/linkOldAtt.js +26 -28
  160. package/testaro/linkOldAtt.ts +48 -0
  161. package/testaro/linkTo.d.ts +3 -0
  162. package/testaro/linkTo.js +23 -22
  163. package/testaro/linkTo.ts +43 -0
  164. package/testaro/linkUl.d.ts +3 -0
  165. package/testaro/linkUl.js +31 -34
  166. package/testaro/linkUl.ts +54 -0
  167. package/testaro/miniText.d.ts +3 -0
  168. package/testaro/miniText.js +42 -44
  169. package/testaro/miniText.ts +68 -0
  170. package/testaro/motion.d.ts +10 -0
  171. package/testaro/motion.js +93 -96
  172. package/testaro/motion.ts +125 -0
  173. package/testaro/nonTable.d.ts +3 -0
  174. package/testaro/nonTable.js +40 -45
  175. package/testaro/nonTable.ts +66 -0
  176. package/testaro/optRoleSel.d.ts +3 -0
  177. package/testaro/optRoleSel.js +17 -19
  178. package/testaro/optRoleSel.ts +41 -0
  179. package/testaro/phOnly.d.ts +3 -0
  180. package/testaro/phOnly.js +19 -21
  181. package/testaro/phOnly.ts +43 -0
  182. package/testaro/pseudoP.d.ts +3 -0
  183. package/testaro/pseudoP.js +37 -38
  184. package/testaro/pseudoP.ts +59 -0
  185. package/testaro/radioSet.d.ts +3 -0
  186. package/testaro/radioSet.js +58 -59
  187. package/testaro/radioSet.ts +79 -0
  188. package/testaro/registry.d.ts +63 -0
  189. package/testaro/registry.js +67 -0
  190. package/testaro/registry.ts +141 -0
  191. package/testaro/role.d.ts +3 -0
  192. package/testaro/role.js +28 -29
  193. package/testaro/role.ts +53 -0
  194. package/testaro/secHeading.d.ts +3 -0
  195. package/testaro/secHeading.js +31 -33
  196. package/testaro/secHeading.ts +53 -0
  197. package/testaro/styleDiff.d.ts +25 -0
  198. package/testaro/styleDiff.js +249 -252
  199. package/testaro/styleDiff.ts +303 -0
  200. package/testaro/tabNav.d.ts +33 -0
  201. package/testaro/tabNav.js +273 -342
  202. package/testaro/tabNav.ts +454 -0
  203. package/testaro/targetsNear.d.ts +9 -0
  204. package/testaro/targetsNear.js +131 -132
  205. package/testaro/targetsNear.ts +160 -0
  206. package/testaro/textNodes.d.ts +6 -0
  207. package/testaro/textNodes.js +139 -135
  208. package/testaro/textNodes.ts +185 -0
  209. package/testaro/textSem.d.ts +3 -0
  210. package/testaro/textSem.js +26 -28
  211. package/testaro/textSem.ts +47 -0
  212. package/testaro/title.d.ts +9 -0
  213. package/testaro/title.js +16 -13
  214. package/testaro/title.ts +31 -0
  215. package/testaro/titledEl.d.ts +3 -0
  216. package/testaro/titledEl.js +16 -18
  217. package/testaro/titledEl.ts +38 -0
  218. package/testaro/zIndex.d.ts +3 -0
  219. package/testaro/zIndex.js +20 -22
  220. package/testaro/zIndex.ts +42 -0
  221. package/tests/alfa.d.ts +45 -0
  222. package/tests/alfa.js +139 -141
  223. package/tests/alfa.ts +214 -0
  224. package/tests/aslint.d.ts +33 -0
  225. package/tests/aslint.js +273 -249
  226. package/tests/aslint.ts +301 -0
  227. package/tests/axe.d.ts +27 -0
  228. package/tests/axe.js +200 -200
  229. package/tests/axe.ts +277 -0
  230. package/tests/ed11y.d.ts +28 -0
  231. package/tests/ed11y.js +142 -99
  232. package/tests/ed11y.ts +178 -0
  233. package/tests/htmlcs.d.ts +21 -0
  234. package/tests/htmlcs.js +175 -140
  235. package/tests/htmlcs.ts +181 -0
  236. package/tests/ibm.d.ts +52 -0
  237. package/tests/ibm.js +165 -166
  238. package/tests/ibm.ts +251 -0
  239. package/tests/nuVal.d.ts +13 -0
  240. package/tests/nuVal.js +107 -112
  241. package/tests/nuVal.ts +145 -0
  242. package/tests/nuVnu.d.ts +15 -0
  243. package/tests/nuVnu.js +142 -111
  244. package/tests/nuVnu.ts +144 -0
  245. package/tests/pour.d.ts +31 -0
  246. package/tests/pour.js +242 -0
  247. package/tests/pour.ts +273 -0
  248. package/tests/qualWeb.d.ts +39 -0
  249. package/tests/qualWeb.js +303 -272
  250. package/tests/qualWeb.ts +415 -0
  251. package/tests/surea11y.d.ts +33 -0
  252. package/tests/surea11y.js +288 -0
  253. package/tests/surea11y.ts +334 -0
  254. package/tests/testaro.d.ts +25 -0
  255. package/tests/testaro.js +746 -652
  256. package/tests/testaro.ts +862 -0
  257. package/tests/wave.d.ts +46 -0
  258. package/tests/wave.js +167 -177
  259. package/tests/wave.ts +252 -0
  260. package/tsconfig.json +17 -0
  261. package/types.d.ts +243 -0
  262. package/types.js +10 -0
  263. package/types.ts +376 -0
  264. package/validation/act/README.md +46 -0
  265. package/validation/act/capture.js +424 -0
  266. package/validation/act/chromium-issue-draft.md +66 -0
  267. package/validation/act/fp-triage-2026-08-22.md +86 -0
  268. package/validation/act/isolation-notes.md +159 -0
  269. package/validation/act/playwright-issue-draft.md +73 -0
  270. package/validation/act/propose-mappings.js +0 -0
  271. package/validation/act/repro-cdp-raw.js +105 -0
  272. package/validation/act/repro-metarefresh.js +65 -0
  273. package/validation/act/score.js +184 -0
  274. package/validation/act/stage3a-stress-report.md +69 -0
  275. package/validation/act/stage3b-mapping-proposals.md +94 -0
  276. package/validation/act/stage3b-triage-draft.md +138 -0
  277. package/validation/act/surea11y-track-a-2026-09-01.md +50 -0
  278. package/validation/executors/netWatch.js +180 -90
  279. package/validation/executors/test.js +17 -2
  280. package/validation/executors/tests.js +118 -10
  281. package/validation/jobs/reports/raw/260901T1000-surea11y-validation.json +964 -0
  282. package/validation/jobs/todo/240101T1200-simple-example.json +14 -6
  283. package/validation/jobs/todo/240101T1300-shoot-example.json +2 -1
  284. package/validation/jobs/todo/260821T1900-pour-validation.json +45 -0
  285. package/validation/jobs/todo/260901T1000-surea11y-validation.json +45 -0
  286. package/validation/knownFailures.json +1 -0
  287. package/validation/tests/jobProperties/adbID.json +27 -2
  288. package/validation/tests/jobProperties/{focOp.json → allCapStyle.json} +56 -53
  289. package/validation/tests/jobProperties/allCaps.json +25 -0
  290. package/validation/tests/jobProperties/allHidden.json +133 -13
  291. package/validation/tests/jobProperties/allSlanted.json +3 -3
  292. package/validation/tests/jobProperties/altScheme.json +23 -8
  293. package/validation/tests/jobProperties/attVal.json +57 -57
  294. package/validation/tests/jobProperties/autocomplete.json +11 -1
  295. package/validation/tests/jobProperties/bulk.json +6 -1
  296. package/validation/tests/jobProperties/buttonMenu.json +63 -42
  297. package/validation/tests/jobProperties/captionLoc.json +1 -6
  298. package/validation/tests/jobProperties/checkpoint-browser.json +401 -0
  299. package/validation/tests/jobProperties/checkpoint-page.json +397 -0
  300. package/validation/tests/jobProperties/checkpoint.json +395 -0
  301. package/validation/tests/jobProperties/datalistRef.json +20 -5
  302. package/validation/tests/jobProperties/distortion.json +28 -3
  303. package/validation/tests/jobProperties/docType.json +2 -2
  304. package/validation/tests/jobProperties/dupAtt.json +48 -33
  305. package/validation/tests/jobProperties/elements.json +28 -28
  306. package/validation/tests/jobProperties/embAc.json +36 -31
  307. package/validation/tests/jobProperties/focAndOp.json +284 -0
  308. package/validation/tests/jobProperties/focInd.json +34 -34
  309. package/validation/tests/jobProperties/focVis.json +1 -1
  310. package/validation/tests/jobProperties/hover.json +39 -37
  311. package/validation/tests/jobProperties/hr.json +13 -3
  312. package/validation/tests/jobProperties/imageLink.json +0 -5
  313. package/validation/tests/jobProperties/labClash.json +68 -33
  314. package/validation/tests/jobProperties/legendLoc.json +1 -6
  315. package/validation/tests/jobProperties/lineHeight.json +2 -2
  316. package/validation/tests/jobProperties/linkAmb.json +13 -18
  317. package/validation/tests/jobProperties/linkExt.json +1 -1
  318. package/validation/tests/jobProperties/linkOldAtt.json +12 -2
  319. package/validation/tests/jobProperties/linkTo.json +1 -1
  320. package/validation/tests/jobProperties/linkUl.json +65 -65
  321. package/validation/tests/jobProperties/miniText.json +7 -2
  322. package/validation/tests/jobProperties/motion.json +4 -50
  323. package/validation/tests/jobProperties/nonTable.json +48 -3
  324. package/validation/tests/jobProperties/optRoleSel.json +12 -2
  325. package/validation/tests/jobProperties/phOnly.json +6 -16
  326. package/validation/tests/jobProperties/pseudoP.json +17 -2
  327. package/validation/tests/jobProperties/radioSet.json +30 -30
  328. package/validation/tests/jobProperties/role.json +25 -5
  329. package/validation/tests/jobProperties/secHeading.json +26 -21
  330. package/validation/tests/jobProperties/styleDiff.json +35 -5
  331. package/validation/tests/jobProperties/tabNav.json +3 -1
  332. package/validation/tests/jobProperties/targetsNear.json +237 -0
  333. package/validation/tests/jobProperties/textNodes.json +29 -29
  334. package/validation/tests/jobProperties/textSem.json +26 -1
  335. package/validation/tests/jobProperties/title.json +12 -2
  336. package/validation/tests/jobProperties/titledEl.json +39 -9
  337. package/validation/tests/jobProperties/userPath.json +317 -0
  338. package/validation/tests/jobProperties/zIndex.json +40 -35
  339. package/validation/tests/targets/allCapStyle/index.html +26 -0
  340. package/validation/tests/targets/checkpoint/index.html +38 -0
  341. package/validation/tests/targets/datalistRef/index.html +1 -1
  342. package/validation/tests/targets/focAndOp/bad.html +29 -0
  343. package/validation/tests/targets/{focOp → focAndOp}/good.html +3 -1
  344. package/validation/tests/targets/focInd/bad.html +2 -1
  345. package/validation/tests/targets/headEl/index.html +10 -1
  346. package/validation/tests/targets/{targetSmall → targetsNear}/index.html +15 -1
  347. package/validation/tests/targets/userPath/index.html +42 -0
  348. package/validation/validateTest.js +62 -10
  349. package/.claude/settings.local.json +0 -11
  350. package/.eslintrc.json +0 -41
  351. package/htmlcs/.eslintrc.json +0 -67
  352. package/memory/MEMORY.md +0 -3
  353. package/memory/project_validation_pause.md +0 -10
  354. package/validation/tests/jobProperties/linkTitle.json +0 -127
  355. package/validation/tests/jobProperties/opFoc.json +0 -164
  356. package/validation/tests/jobProperties/targetSmall.json +0 -152
  357. package/validation/tests/jobProperties/targetTiny.json +0 -142
  358. package/validation/tests/targets/focOp/bad.html +0 -25
  359. package/validation/tests/targets/linkTitle/index.html +0 -24
  360. package/validation/tests/targets/opFoc/bad.html +0 -26
  361. package/validation/tests/targets/opFoc/good.html +0 -23
@@ -0,0 +1,964 @@
1
+ {
2
+ "id": "260901T1000-surea11y-validation",
3
+ "what": "Validate surea11y tool on webaim.org",
4
+ "strict": true,
5
+ "timeLimit": 60,
6
+ "acts": [
7
+ {
8
+ "type": "launch",
9
+ "which": "chromium",
10
+ "url": "https://webaim.org/",
11
+ "what": "Chromium browser",
12
+ "actualURL": "https://webaim.org/",
13
+ "endTime": 1788270100183
14
+ },
15
+ {
16
+ "type": "test",
17
+ "which": "surea11y",
18
+ "what": "SureA11y",
19
+ "startTime": 1788270100183,
20
+ "actualURL": "https://webaim.org/",
21
+ "data": {
22
+ "passRuleCount": 18,
23
+ "inapplicableRuleCount": 57,
24
+ "manualRuleCount": 54,
25
+ "manualOccurrenceCount": 8
26
+ },
27
+ "result": {
28
+ "nativeResult": {
29
+ "engine": {
30
+ "tag": "a11ycore",
31
+ "schemaVersion": "1.0.0",
32
+ "locale": {
33
+ "requested": "en",
34
+ "resolved": "en",
35
+ "reason": "ok"
36
+ },
37
+ "wcagVersion": "2.2"
38
+ },
39
+ "violations": [
40
+ {
41
+ "ruleID": "contrast-enhanced",
42
+ "what": "Element has insufficient color contrast (AAA) of 6.25:1 (foreground: #ffffff, background: #bf1722, font size: 16px, font weight: normal). Expected contrast ratio of 7:1 (normal text).",
43
+ "wcag": "1.4.6",
44
+ "severity": "serious",
45
+ "html": "<a href=\"#maincontent\">skip to main content</a>",
46
+ "cssPath": "#skiptocontent > a",
47
+ "xPath": "/html/body/div[1]/header[1]/div[1]/a[1]"
48
+ },
49
+ {
50
+ "ruleID": "contrast-enhanced",
51
+ "what": "Element has insufficient color contrast (AAA) of 5.74:1 (foreground: #666666, background: #ffffff, font size: 19.8px, font weight: normal). Expected contrast ratio of 7:1 (normal text).",
52
+ "wcag": "1.4.6",
53
+ "severity": "serious",
54
+ "html": "<p id=\"mission\">Expanding the potential of the web for people with disabilities by empowering individuals and organizations to create accessible content.</p>",
55
+ "cssPath": "#mission",
56
+ "xPath": "/html/body/main[1]/article[1]/p[1]"
57
+ },
58
+ {
59
+ "ruleID": "contrast-enhanced",
60
+ "what": "Element has insufficient color contrast (AAA) of 5.74:1 (foreground: #666666, background: #ffffff, font size: 13.3333px, font weight: normal). Expected contrast ratio of 7:1 (normal text).",
61
+ "wcag": "1.4.6",
62
+ "severity": "serious",
63
+ "html": "<input type=\"submit\" value=\"WAVE\">",
64
+ "cssPath": "#checkpage > form > input:nth-of-type(2)",
65
+ "xPath": "/html/body/footer[1]/div[1]/div[1]/div[1]/form[1]/input[2]"
66
+ }
67
+ ],
68
+ "incomplete": [
69
+ {
70
+ "ruleID": "contrast-computable",
71
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_logo.png\")).",
72
+ "wcag": "1.4.3",
73
+ "severity": "serious",
74
+ "html": "<h2 class=\"hidden\">Main Navigation</h2>",
75
+ "cssPath": "#headcontainer > header > nav > h2",
76
+ "xPath": "/html/body/div[1]/header[1]/nav[1]/h2[1]"
77
+ },
78
+ {
79
+ "ruleID": "contrast-computable",
80
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/banners/home.jpg\")).",
81
+ "wcag": "1.4.3",
82
+ "severity": "serious",
83
+ "html": "<a href=\"/services/\">Services</a>",
84
+ "cssPath": "#headcontainer > header > nav > ul > li:nth-of-type(1) > a",
85
+ "xPath": "/html/body/div[1]/header[1]/nav[1]/ul[1]/li[1]/a[1]"
86
+ },
87
+ {
88
+ "ruleID": "contrast-computable",
89
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/banners/home.jpg\")).",
90
+ "wcag": "1.4.3",
91
+ "severity": "serious",
92
+ "html": "<a href=\"/articles/\">Articles</a>",
93
+ "cssPath": "#headcontainer > header > nav > ul > li:nth-of-type(2) > a",
94
+ "xPath": "/html/body/div[1]/header[1]/nav[1]/ul[1]/li[2]/a[1]"
95
+ },
96
+ {
97
+ "ruleID": "contrast-computable",
98
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/banners/home.jpg\")).",
99
+ "wcag": "1.4.3",
100
+ "severity": "serious",
101
+ "html": "<a href=\"/resources/\">Resources</a>",
102
+ "cssPath": "#headcontainer > header > nav > ul > li:nth-of-type(3) > a",
103
+ "xPath": "/html/body/div[1]/header[1]/nav[1]/ul[1]/li[3]/a[1]"
104
+ },
105
+ {
106
+ "ruleID": "contrast-computable",
107
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/banners/home.jpg\")).",
108
+ "wcag": "1.4.3",
109
+ "severity": "serious",
110
+ "html": "<a href=\"/projects/\">Projects</a>",
111
+ "cssPath": "#headcontainer > header > nav > ul > li:nth-of-type(4) > a",
112
+ "xPath": "/html/body/div[1]/header[1]/nav[1]/ul[1]/li[4]/a[1]"
113
+ },
114
+ {
115
+ "ruleID": "contrast-computable",
116
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/banners/home.jpg\")).",
117
+ "wcag": "1.4.3",
118
+ "severity": "serious",
119
+ "html": "<a href=\"/community/\">Community</a>",
120
+ "cssPath": "#headcontainer > header > nav > ul > li:nth-of-type(5) > a",
121
+ "xPath": "/html/body/div[1]/header[1]/nav[1]/ul[1]/li[5]/a[1]"
122
+ },
123
+ {
124
+ "ruleID": "contrast-computable",
125
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://conference.webaim.org/media/banner.jpg\")).",
126
+ "wcag": "1.4.3",
127
+ "severity": "serious",
128
+ "html": "<div id=\"bannerheader\">Web Accessibility in Mind Conference</div>",
129
+ "cssPath": "#bannerheader",
130
+ "xPath": "/html/body/main[1]/article[1]/div[1]/div[1]/div[1]/div[1]"
131
+ },
132
+ {
133
+ "ruleID": "contrast-computable",
134
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://conference.webaim.org/media/banner.jpg\")).",
135
+ "wcag": "1.4.3",
136
+ "severity": "serious",
137
+ "html": "<div id=\"subbanner\">September 15-16<br>In partnership with <img src=\"https://conference.webaim.org/media/popetechSmall.svg\" width=\"160\" alt=\"PopeTech\"></div>",
138
+ "cssPath": "#subbanner",
139
+ "xPath": "/html/body/main[1]/article[1]/div[1]/div[1]/div[1]/div[2]"
140
+ },
141
+ {
142
+ "ruleID": "contrast-computable",
143
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_training.svg\")).",
144
+ "wcag": "1.4.3",
145
+ "severity": "serious",
146
+ "html": "<a href=\"/services/training/\">Accessibility Training</a>",
147
+ "cssPath": "#training > h2 > a",
148
+ "xPath": "/html/body/main[1]/article[1]/div[2]/div[1]/h2[1]/a[1]"
149
+ },
150
+ {
151
+ "ruleID": "contrast-computable",
152
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_training.svg\")).",
153
+ "wcag": "1.4.3",
154
+ "severity": "serious",
155
+ "html": "<p>WebAIM can provide web, document, Zoom, and strategic accessibility training to fit your needs.</p>",
156
+ "cssPath": "#training > p",
157
+ "xPath": "/html/body/main[1]/article[1]/div[2]/div[1]/p[1]"
158
+ },
159
+ {
160
+ "ruleID": "contrast-computable",
161
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/home/consultingicon.svg\")).",
162
+ "wcag": "1.4.3",
163
+ "severity": "serious",
164
+ "html": "<a href=\"/services/consulting/\">Technical Assistance</a>",
165
+ "cssPath": "#consulting > h2 > a",
166
+ "xPath": "/html/body/main[1]/article[1]/div[2]/div[2]/h2[1]/a[1]"
167
+ },
168
+ {
169
+ "ruleID": "contrast-computable",
170
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/home/consultingicon.svg\")).",
171
+ "wcag": "1.4.3",
172
+ "severity": "serious",
173
+ "html": "<p>Need assistance implementing accessibility? WebAIM's expert staff can provide the assistance you need.</p>",
174
+ "cssPath": "#consulting > p",
175
+ "xPath": "/html/body/main[1]/article[1]/div[2]/div[2]/p[1]"
176
+ },
177
+ {
178
+ "ruleID": "contrast-computable",
179
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/home/strategica11yicon.svg\")).",
180
+ "wcag": "1.4.3",
181
+ "severity": "serious",
182
+ "html": "<a href=\"/training/procurement/\">Accessibility in Procurement</a>",
183
+ "cssPath": "#strategica11y > h2 > a",
184
+ "xPath": "/html/body/main[1]/article[1]/div[2]/div[3]/h2[1]/a[1]"
185
+ },
186
+ {
187
+ "ruleID": "contrast-computable",
188
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/home/strategica11yicon.svg\")).",
189
+ "wcag": "1.4.3",
190
+ "severity": "serious",
191
+ "html": "<p>Tools and processes to help organizations account for accessibility in purchasing or using technology.</p>",
192
+ "cssPath": "#strategica11y > p",
193
+ "xPath": "/html/body/main[1]/article[1]/div[2]/div[3]/p[1]"
194
+ },
195
+ {
196
+ "ruleID": "contrast-computable",
197
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/home/evalicon.svg\")).",
198
+ "wcag": "1.4.3",
199
+ "severity": "serious",
200
+ "html": "<a href=\"/services/monitoring/\">Evaluation and Reporting</a>",
201
+ "cssPath": "#monitoring > h2 > a",
202
+ "xPath": "/html/body/main[1]/article[1]/div[2]/div[4]/h2[1]/a[1]"
203
+ },
204
+ {
205
+ "ruleID": "contrast-computable",
206
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/home/evalicon.svg\")).",
207
+ "wcag": "1.4.3",
208
+ "severity": "serious",
209
+ "html": "<p>We can provide reports to help you know how accessible your site is and how to make it better.</p>",
210
+ "cssPath": "#monitoring > p",
211
+ "xPath": "/html/body/main[1]/article[1]/div[2]/div[4]/p[1]"
212
+ },
213
+ {
214
+ "ruleID": "contrast-computable",
215
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_copyright.svg\")).",
216
+ "wcag": "1.4.3",
217
+ "severity": "serious",
218
+ "html": "<h2 id=\"copyright\">©2026 WebAIM</h2>",
219
+ "cssPath": "#copyright",
220
+ "xPath": "/html/body/footer[1]/div[1]/div[1]/h2[1]"
221
+ },
222
+ {
223
+ "ruleID": "contrast-computable",
224
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_phone.svg\")).",
225
+ "wcag": "1.4.3",
226
+ "severity": "serious",
227
+ "html": "<a class=\"phone\" href=\"tel:4357977024\">435.797.7024</a>",
228
+ "cssPath": "#contact > a",
229
+ "xPath": "/html/body/footer[1]/div[1]/div[1]/p[1]/a[1]"
230
+ },
231
+ {
232
+ "ruleID": "contrast-computable",
233
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_wave.svg\")).",
234
+ "wcag": "1.4.3",
235
+ "severity": "serious",
236
+ "html": "<h2>Check Your Accessibility</h2>",
237
+ "cssPath": "#checkpage > h2",
238
+ "xPath": "/html/body/footer[1]/div[1]/div[1]/div[1]/h2[1]"
239
+ },
240
+ {
241
+ "ruleID": "contrast-computable",
242
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_blog.svg\")).",
243
+ "wcag": "1.4.3",
244
+ "severity": "serious",
245
+ "html": "<h2 id=\"blog\">From the Blog</h2>",
246
+ "cssPath": "#blog",
247
+ "xPath": "/html/body/footer[1]/div[1]/div[2]/h2[1]"
248
+ },
249
+ {
250
+ "ruleID": "contrast-computable",
251
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_popular.svg\")).",
252
+ "wcag": "1.4.3",
253
+ "severity": "serious",
254
+ "html": "<h2 id=\"popular\">Popular Resources</h2>",
255
+ "cssPath": "#popular",
256
+ "xPath": "/html/body/footer[1]/div[1]/div[3]/h2[1]"
257
+ },
258
+ {
259
+ "ruleID": "contrast-computable",
260
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_contact.svg\")).",
261
+ "wcag": "1.4.3",
262
+ "severity": "serious",
263
+ "html": "<a id=\"footercontact\" href=\"/contact\">Contact</a>",
264
+ "cssPath": "#footercontact",
265
+ "xPath": "/html/body/footer[1]/div[1]/div[4]/ul[1]/li[1]/a[1]"
266
+ },
267
+ {
268
+ "ruleID": "contrast-computable",
269
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_about.svg\")).",
270
+ "wcag": "1.4.3",
271
+ "severity": "serious",
272
+ "html": "<a id=\"footerabout\" href=\"/about\">About</a>",
273
+ "cssPath": "#footerabout",
274
+ "xPath": "/html/body/footer[1]/div[1]/div[4]/ul[1]/li[2]/a[1]"
275
+ },
276
+ {
277
+ "ruleID": "contrast-computable",
278
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_rss.svg\")).",
279
+ "wcag": "1.4.3",
280
+ "severity": "serious",
281
+ "html": "<a id=\"footerrss\" href=\"/community/rss\">RSS Feeds</a>",
282
+ "cssPath": "#footerrss",
283
+ "xPath": "/html/body/footer[1]/div[1]/div[4]/ul[1]/li[3]/a[1]"
284
+ },
285
+ {
286
+ "ruleID": "contrast-computable",
287
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_li.svg\")).",
288
+ "wcag": "1.4.3",
289
+ "severity": "serious",
290
+ "html": "<a id=\"footerli\" href=\"https://www.linkedin.com/company/webaim/\">LinkedIn</a>",
291
+ "cssPath": "#footerli",
292
+ "xPath": "/html/body/footer[1]/div[1]/div[4]/ul[1]/li[4]/a[1]"
293
+ },
294
+ {
295
+ "ruleID": "contrast-computable",
296
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_terms.svg\")).",
297
+ "wcag": "1.4.3",
298
+ "severity": "serious",
299
+ "html": "<a id=\"footercopyright\" href=\"/copyright\">Copyright &amp; Terms of Use</a>",
300
+ "cssPath": "#footercopyright",
301
+ "xPath": "/html/body/footer[1]/div[1]/div[4]/ul[1]/li[5]/a[1]"
302
+ },
303
+ {
304
+ "ruleID": "css-orientation-lock",
305
+ "what": "3 stylesheet(s) could not be read, so whether this page locks its orientation could not be determined.",
306
+ "wcag": "1.3.4",
307
+ "severity": "serious",
308
+ "html": "<html lang=\"en\"><head>\n\t<meta charset=\"utf-8\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\t\t<title>WebAIM: Web Accessibility In Mind</title>\n\t<link rel=\"shortcut icon\" href=\"/media/favicon.ico\">\n\t<link rel=\"home\" href=\"/\">\n\t<link rel=\"search\" href=\"/search/\">\n\t<link rel=\"alternate\" href=\"https://webaim.org/blog/feed\" type=\"application/rss+xml\" title=\"WebAIM Blog\">\n\n\t<script async=\"\" src=\"https://www.googletagmanager.com/gtag/js?id=G-Y41PF8WV9X\"></script>\n\t<script>\n \tw",
309
+ "cssPath": "html",
310
+ "xPath": "/html"
311
+ },
312
+ {
313
+ "ruleID": "link-in-text-block",
314
+ "what": "Whether this link is distinguishable from the surrounding text by non-color means could not be determined.",
315
+ "wcag": "1.4.1",
316
+ "severity": "serious",
317
+ "html": "<a class=\"phone\" href=\"tel:4357977024\">435.797.7024</a>",
318
+ "cssPath": "#contact > a",
319
+ "xPath": "/html/body/footer[1]/div[1]/div[1]/p[1]/a[1]"
320
+ }
321
+ ],
322
+ "passRuleCount": 18,
323
+ "inapplicableRuleCount": 57,
324
+ "manualRuleCount": 54,
325
+ "manualOccurrenceCount": 8
326
+ },
327
+ "standardResult": {
328
+ "prevented": false,
329
+ "totals": [
330
+ 0,
331
+ 28,
332
+ 0,
333
+ 3
334
+ ],
335
+ "instances": [
336
+ {
337
+ "ruleID": "contrast-computable",
338
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_logo.png\")).",
339
+ "ordinalSeverity": 1,
340
+ "count": 1,
341
+ "catalogIndex": "30"
342
+ },
343
+ {
344
+ "ruleID": "contrast-computable",
345
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/banners/home.jpg\")).",
346
+ "ordinalSeverity": 1,
347
+ "count": 1,
348
+ "catalogIndex": "33"
349
+ },
350
+ {
351
+ "ruleID": "contrast-computable",
352
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/banners/home.jpg\")).",
353
+ "ordinalSeverity": 1,
354
+ "count": 1,
355
+ "catalogIndex": "35"
356
+ },
357
+ {
358
+ "ruleID": "contrast-computable",
359
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/banners/home.jpg\")).",
360
+ "ordinalSeverity": 1,
361
+ "count": 1,
362
+ "catalogIndex": "37"
363
+ },
364
+ {
365
+ "ruleID": "contrast-computable",
366
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/banners/home.jpg\")).",
367
+ "ordinalSeverity": 1,
368
+ "count": 1,
369
+ "catalogIndex": "39"
370
+ },
371
+ {
372
+ "ruleID": "contrast-computable",
373
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/banners/home.jpg\")).",
374
+ "ordinalSeverity": 1,
375
+ "count": 1,
376
+ "catalogIndex": "41"
377
+ },
378
+ {
379
+ "ruleID": "contrast-computable",
380
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://conference.webaim.org/media/banner.jpg\")).",
381
+ "ordinalSeverity": 1,
382
+ "count": 1,
383
+ "catalogIndex": "60"
384
+ },
385
+ {
386
+ "ruleID": "contrast-computable",
387
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://conference.webaim.org/media/banner.jpg\")).",
388
+ "ordinalSeverity": 1,
389
+ "count": 1,
390
+ "catalogIndex": "61"
391
+ },
392
+ {
393
+ "ruleID": "contrast-computable",
394
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_training.svg\")).",
395
+ "ordinalSeverity": 1,
396
+ "count": 1,
397
+ "catalogIndex": "69"
398
+ },
399
+ {
400
+ "ruleID": "contrast-computable",
401
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_training.svg\")).",
402
+ "ordinalSeverity": 1,
403
+ "count": 1,
404
+ "catalogIndex": "70"
405
+ },
406
+ {
407
+ "ruleID": "contrast-computable",
408
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/home/consultingicon.svg\")).",
409
+ "ordinalSeverity": 1,
410
+ "count": 1,
411
+ "catalogIndex": "73"
412
+ },
413
+ {
414
+ "ruleID": "contrast-computable",
415
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/home/consultingicon.svg\")).",
416
+ "ordinalSeverity": 1,
417
+ "count": 1,
418
+ "catalogIndex": "74"
419
+ },
420
+ {
421
+ "ruleID": "contrast-computable",
422
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/home/strategica11yicon.svg\")).",
423
+ "ordinalSeverity": 1,
424
+ "count": 1,
425
+ "catalogIndex": "77"
426
+ },
427
+ {
428
+ "ruleID": "contrast-computable",
429
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/home/strategica11yicon.svg\")).",
430
+ "ordinalSeverity": 1,
431
+ "count": 1,
432
+ "catalogIndex": "78"
433
+ },
434
+ {
435
+ "ruleID": "contrast-computable",
436
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/home/evalicon.svg\")).",
437
+ "ordinalSeverity": 1,
438
+ "count": 1,
439
+ "catalogIndex": "81"
440
+ },
441
+ {
442
+ "ruleID": "contrast-computable",
443
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/home/evalicon.svg\")).",
444
+ "ordinalSeverity": 1,
445
+ "count": 1,
446
+ "catalogIndex": "82"
447
+ },
448
+ {
449
+ "ruleID": "contrast-computable",
450
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_copyright.svg\")).",
451
+ "ordinalSeverity": 1,
452
+ "count": 1,
453
+ "catalogIndex": "148"
454
+ },
455
+ {
456
+ "ruleID": "contrast-computable",
457
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_phone.svg\")).",
458
+ "ordinalSeverity": 1,
459
+ "count": 1,
460
+ "catalogIndex": "153"
461
+ },
462
+ {
463
+ "ruleID": "contrast-computable",
464
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_wave.svg\")).",
465
+ "ordinalSeverity": 1,
466
+ "count": 1,
467
+ "catalogIndex": "155"
468
+ },
469
+ {
470
+ "ruleID": "contrast-computable",
471
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_blog.svg\")).",
472
+ "ordinalSeverity": 1,
473
+ "count": 1,
474
+ "catalogIndex": "161"
475
+ },
476
+ {
477
+ "ruleID": "contrast-computable",
478
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_popular.svg\")).",
479
+ "ordinalSeverity": 1,
480
+ "count": 1,
481
+ "catalogIndex": "172"
482
+ },
483
+ {
484
+ "ruleID": "contrast-computable",
485
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_contact.svg\")).",
486
+ "ordinalSeverity": 1,
487
+ "count": 1,
488
+ "catalogIndex": "189"
489
+ },
490
+ {
491
+ "ruleID": "contrast-computable",
492
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_about.svg\")).",
493
+ "ordinalSeverity": 1,
494
+ "count": 1,
495
+ "catalogIndex": "191"
496
+ },
497
+ {
498
+ "ruleID": "contrast-computable",
499
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_rss.svg\")).",
500
+ "ordinalSeverity": 1,
501
+ "count": 1,
502
+ "catalogIndex": "193"
503
+ },
504
+ {
505
+ "ruleID": "contrast-computable",
506
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_li.svg\")).",
507
+ "ordinalSeverity": 1,
508
+ "count": 1,
509
+ "catalogIndex": "195"
510
+ },
511
+ {
512
+ "ruleID": "contrast-computable",
513
+ "what": "Contrast is not computable because the background uses an image (background-image=url(\"https://webaim.org/media/template/bg_terms.svg\")).",
514
+ "ordinalSeverity": 1,
515
+ "count": 1,
516
+ "catalogIndex": "197"
517
+ },
518
+ {
519
+ "ruleID": "css-orientation-lock",
520
+ "what": "3 stylesheet(s) could not be read, so whether this page locks its orientation could not be determined.",
521
+ "ordinalSeverity": 1,
522
+ "count": 1,
523
+ "catalogIndex": "0"
524
+ },
525
+ {
526
+ "ruleID": "link-in-text-block",
527
+ "what": "Whether this link is distinguishable from the surrounding text by non-color means could not be determined.",
528
+ "ordinalSeverity": 1,
529
+ "count": 1,
530
+ "catalogIndex": "153"
531
+ },
532
+ {
533
+ "ruleID": "contrast-enhanced",
534
+ "what": "Element has insufficient color contrast (AAA) of 6.25:1 (foreground: #ffffff, background: #bf1722, font size: 16px, font weight: normal). Expected contrast ratio of 7:1 (normal text).",
535
+ "ordinalSeverity": 3,
536
+ "count": 1,
537
+ "catalogIndex": "25"
538
+ },
539
+ {
540
+ "ruleID": "contrast-enhanced",
541
+ "what": "Element has insufficient color contrast (AAA) of 5.74:1 (foreground: #666666, background: #ffffff, font size: 19.8px, font weight: normal). Expected contrast ratio of 7:1 (normal text).",
542
+ "ordinalSeverity": 3,
543
+ "count": 1,
544
+ "catalogIndex": "56"
545
+ },
546
+ {
547
+ "ruleID": "contrast-enhanced",
548
+ "what": "Element has insufficient color contrast (AAA) of 5.74:1 (foreground: #666666, background: #ffffff, font size: 13.3333px, font weight: normal). Expected contrast ratio of 7:1 (normal text).",
549
+ "ordinalSeverity": 3,
550
+ "count": 1,
551
+ "catalogIndex": "159"
552
+ }
553
+ ]
554
+ }
555
+ },
556
+ "endTime": 1788270102388
557
+ }
558
+ ],
559
+ "sources": {},
560
+ "standard": "also",
561
+ "target": {
562
+ "url": "https://webaim.org/",
563
+ "what": "WebAIM home page"
564
+ },
565
+ "device": {
566
+ "id": "default",
567
+ "windowOptions": {}
568
+ },
569
+ "browserID": "chromium",
570
+ "timeStamp": "260901T1000",
571
+ "creationTimeStamp": "260901T1000",
572
+ "jobData": {
573
+ "tmpDir": "/home/witt/code/testaro/tmp/260901T1000-surea11y-validation",
574
+ "startTime": "26-09-01T13:41",
575
+ "endTime": "26-09-01T13:41",
576
+ "elapsedSeconds": 4,
577
+ "visitLatency": 2,
578
+ "logCount": 24,
579
+ "logSize": 4040,
580
+ "errorLogCount": 34,
581
+ "errorLogSize": 480,
582
+ "prohibitedCount": 0,
583
+ "visitRejectionCount": 0,
584
+ "aborted": false,
585
+ "abortedAct": null,
586
+ "abortTime": "",
587
+ "abortMessage": "",
588
+ "presses": 0,
589
+ "amountRead": 0,
590
+ "toolTimes": {
591
+ "surea11y": 2
592
+ },
593
+ "preventions": {},
594
+ "catalogData": {
595
+ "elementCount": 200,
596
+ "entryCount": 35,
597
+ "text": {
598
+ "count": 34,
599
+ "countPercent": 97,
600
+ "linkableCount": 30,
601
+ "linkablePercent": 88
602
+ },
603
+ "tools": {
604
+ "surea11y": {
605
+ "instanceCount": 31,
606
+ "catalogCount": 31,
607
+ "catalogPercent": 100
608
+ }
609
+ }
610
+ }
611
+ },
612
+ "catalog": {
613
+ "0": {
614
+ "tagName": "HTML",
615
+ "id": "",
616
+ "startTag": "<html lang=\"en\">",
617
+ "text": "",
618
+ "textLinkable": false,
619
+ "boxID": "0:0:1920:1971",
620
+ "pathID": "/html",
621
+ "headingIndex": ""
622
+ },
623
+ "25": {
624
+ "tagName": "A",
625
+ "id": "",
626
+ "startTag": "<a href=\"#maincontent\">",
627
+ "text": "skip to main content",
628
+ "textLinkable": true,
629
+ "boxID": "0:-40:155:31",
630
+ "pathID": "/html/body/div[1]/header[1]/div[1]/a[1]",
631
+ "headingIndex": ""
632
+ },
633
+ "30": {
634
+ "tagName": "H2",
635
+ "id": "",
636
+ "startTag": "<h2 class=\"hidden\">",
637
+ "text": "Main Navigation",
638
+ "textLinkable": true,
639
+ "boxID": "922:-450:1:1",
640
+ "pathID": "/html/body/div[1]/header[1]/nav[1]/h2[1]",
641
+ "headingIndex": ""
642
+ },
643
+ "33": {
644
+ "tagName": "A",
645
+ "id": "",
646
+ "startTag": "<a href=\"/services/\">",
647
+ "text": "services",
648
+ "textLinkable": true,
649
+ "boxID": "925:40:96:27",
650
+ "pathID": "/html/body/div[1]/header[1]/nav[1]/ul[1]/li[1]/a[1]",
651
+ "headingIndex": "30"
652
+ },
653
+ "35": {
654
+ "tagName": "A",
655
+ "id": "",
656
+ "startTag": "<a href=\"/articles/\">",
657
+ "text": "articles",
658
+ "textLinkable": true,
659
+ "boxID": "1021:40:87:27",
660
+ "pathID": "/html/body/div[1]/header[1]/nav[1]/ul[1]/li[2]/a[1]",
661
+ "headingIndex": "30"
662
+ },
663
+ "37": {
664
+ "tagName": "A",
665
+ "id": "",
666
+ "startTag": "<a href=\"/resources/\">",
667
+ "text": "resources",
668
+ "textLinkable": true,
669
+ "boxID": "1108:40:110:27",
670
+ "pathID": "/html/body/div[1]/header[1]/nav[1]/ul[1]/li[3]/a[1]",
671
+ "headingIndex": "30"
672
+ },
673
+ "39": {
674
+ "tagName": "A",
675
+ "id": "",
676
+ "startTag": "<a href=\"/projects/\">",
677
+ "text": "projects",
678
+ "textLinkable": true,
679
+ "boxID": "1218:40:93:27",
680
+ "pathID": "/html/body/div[1]/header[1]/nav[1]/ul[1]/li[4]/a[1]",
681
+ "headingIndex": "30"
682
+ },
683
+ "41": {
684
+ "tagName": "A",
685
+ "id": "",
686
+ "startTag": "<a href=\"/community/\">",
687
+ "text": "community",
688
+ "textLinkable": true,
689
+ "boxID": "1311:40:119:27",
690
+ "pathID": "/html/body/div[1]/header[1]/nav[1]/ul[1]/li[5]/a[1]",
691
+ "headingIndex": "30"
692
+ },
693
+ "55": {
694
+ "tagName": "H1",
695
+ "id": "",
696
+ "startTag": "<h1>",
697
+ "text": "We have web accessibility in mind",
698
+ "textLinkable": true,
699
+ "boxID": "490:363:920:38",
700
+ "pathID": "/html/body/main[1]/article[1]/h1[1]",
701
+ "headingIndex": ""
702
+ },
703
+ "56": {
704
+ "tagName": "P",
705
+ "id": "mission",
706
+ "startTag": "<p id=\"mission\">",
707
+ "text": "Expanding the potential of the web for people with disabilities by empowering individuals and organizations to create accessible content.",
708
+ "textLinkable": true,
709
+ "boxID": "490:408:920:46",
710
+ "pathID": "/html/body/main[1]/article[1]/p[1]",
711
+ "headingIndex": "55"
712
+ },
713
+ "60": {
714
+ "tagName": "DIV",
715
+ "id": "bannerheader",
716
+ "startTag": "<div id=\"bannerheader\">",
717
+ "text": "Web Accessibility in Mind Conference",
718
+ "textLinkable": false,
719
+ "boxID": "510:489:600:104",
720
+ "pathID": "/html/body/main[1]/article[1]/div[1]/div[1]/div[1]/div[1]",
721
+ "headingIndex": "55"
722
+ },
723
+ "61": {
724
+ "tagName": "DIV",
725
+ "id": "subbanner",
726
+ "startTag": "<div id=\"subbanner\">",
727
+ "text": "September 15-16\nIn partnership with",
728
+ "textLinkable": false,
729
+ "boxID": "510:593:600:82",
730
+ "pathID": "/html/body/main[1]/article[1]/div[1]/div[1]/div[1]/div[2]",
731
+ "headingIndex": "55"
732
+ },
733
+ "68": {
734
+ "tagName": "H2",
735
+ "id": "",
736
+ "startTag": "<h2>",
737
+ "text": "Accessibility Training",
738
+ "textLinkable": true,
739
+ "boxID": "500:797:328:30",
740
+ "pathID": "/html/body/main[1]/article[1]/div[2]/div[1]/h2[1]",
741
+ "headingIndex": "55"
742
+ },
743
+ "69": {
744
+ "tagName": "A",
745
+ "id": "",
746
+ "startTag": "<a href=\"/services/training/\">",
747
+ "text": "Accessibility Training",
748
+ "textLinkable": true,
749
+ "boxID": "502:799:199:25",
750
+ "pathID": "/html/body/main[1]/article[1]/div[2]/div[1]/h2[1]/a[1]",
751
+ "headingIndex": "68"
752
+ },
753
+ "70": {
754
+ "tagName": "P",
755
+ "id": "",
756
+ "startTag": "<p>",
757
+ "text": "WebAIM can provide web, document, Zoom, and strategic accessibility training to fit your needs.",
758
+ "textLinkable": true,
759
+ "boxID": "500:837:328:63",
760
+ "pathID": "/html/body/main[1]/article[1]/div[2]/div[1]/p[1]",
761
+ "headingIndex": "68"
762
+ },
763
+ "72": {
764
+ "tagName": "H2",
765
+ "id": "",
766
+ "startTag": "<h2>",
767
+ "text": "Technical Assistance",
768
+ "textLinkable": true,
769
+ "boxID": "858:797:328:30",
770
+ "pathID": "/html/body/main[1]/article[1]/div[2]/div[2]/h2[1]",
771
+ "headingIndex": ""
772
+ },
773
+ "73": {
774
+ "tagName": "A",
775
+ "id": "",
776
+ "startTag": "<a href=\"/services/consulting/\">",
777
+ "text": "Technical Assistance",
778
+ "textLinkable": true,
779
+ "boxID": "860:799:188:25",
780
+ "pathID": "/html/body/main[1]/article[1]/div[2]/div[2]/h2[1]/a[1]",
781
+ "headingIndex": "72"
782
+ },
783
+ "74": {
784
+ "tagName": "P",
785
+ "id": "",
786
+ "startTag": "<p>",
787
+ "text": "Need assistance implementing accessibility? WebAIM's expert staff can provide the assistance you need.",
788
+ "textLinkable": true,
789
+ "boxID": "858:837:328:63",
790
+ "pathID": "/html/body/main[1]/article[1]/div[2]/div[2]/p[1]",
791
+ "headingIndex": "72"
792
+ },
793
+ "76": {
794
+ "tagName": "H2",
795
+ "id": "",
796
+ "startTag": "<h2>",
797
+ "text": "Accessibility in Procurement",
798
+ "textLinkable": true,
799
+ "boxID": "500:937:328:30",
800
+ "pathID": "/html/body/main[1]/article[1]/div[2]/div[3]/h2[1]",
801
+ "headingIndex": ""
802
+ },
803
+ "77": {
804
+ "tagName": "A",
805
+ "id": "",
806
+ "startTag": "<a href=\"/training/procurement/\">",
807
+ "text": "Accessibility in Procurement",
808
+ "textLinkable": true,
809
+ "boxID": "502:939:261:25",
810
+ "pathID": "/html/body/main[1]/article[1]/div[2]/div[3]/h2[1]/a[1]",
811
+ "headingIndex": "76"
812
+ },
813
+ "78": {
814
+ "tagName": "P",
815
+ "id": "",
816
+ "startTag": "<p>",
817
+ "text": "Tools and processes to help organizations account for accessibility in purchasing or using technology.",
818
+ "textLinkable": true,
819
+ "boxID": "500:977:328:63",
820
+ "pathID": "/html/body/main[1]/article[1]/div[2]/div[3]/p[1]",
821
+ "headingIndex": "76"
822
+ },
823
+ "80": {
824
+ "tagName": "H2",
825
+ "id": "",
826
+ "startTag": "<h2>",
827
+ "text": "Evaluation and Reporting",
828
+ "textLinkable": true,
829
+ "boxID": "858:937:328:30",
830
+ "pathID": "/html/body/main[1]/article[1]/div[2]/div[4]/h2[1]",
831
+ "headingIndex": ""
832
+ },
833
+ "81": {
834
+ "tagName": "A",
835
+ "id": "",
836
+ "startTag": "<a href=\"/services/monitoring/\">",
837
+ "text": "Evaluation and Reporting",
838
+ "textLinkable": true,
839
+ "boxID": "860:939:231:25",
840
+ "pathID": "/html/body/main[1]/article[1]/div[2]/div[4]/h2[1]/a[1]",
841
+ "headingIndex": "80"
842
+ },
843
+ "82": {
844
+ "tagName": "P",
845
+ "id": "",
846
+ "startTag": "<p>",
847
+ "text": "We can provide reports to help you know how accessible your site is and how to make it better.",
848
+ "textLinkable": true,
849
+ "boxID": "858:977:328:63",
850
+ "pathID": "/html/body/main[1]/article[1]/div[2]/div[4]/p[1]",
851
+ "headingIndex": "80"
852
+ },
853
+ "148": {
854
+ "tagName": "H2",
855
+ "id": "copyright",
856
+ "startTag": "<h2 id=\"copyright\">",
857
+ "text": "©2026 WebAIM",
858
+ "textLinkable": true,
859
+ "boxID": "480:1692:310:42",
860
+ "pathID": "/html/body/footer[1]/div[1]/div[1]/h2[1]",
861
+ "headingIndex": ""
862
+ },
863
+ "153": {
864
+ "tagName": "A",
865
+ "id": "",
866
+ "startTag": "<a class=\"phone\" href=\"tel:4357977024\">",
867
+ "text": "435.797.7024",
868
+ "textLinkable": true,
869
+ "boxID": "480:1782:108:16",
870
+ "pathID": "/html/body/footer[1]/div[1]/div[1]/p[1]/a[1]",
871
+ "headingIndex": "148"
872
+ },
873
+ "155": {
874
+ "tagName": "H2",
875
+ "id": "",
876
+ "startTag": "<h2>",
877
+ "text": "Check Your Accessibility",
878
+ "textLinkable": true,
879
+ "boxID": "480:1828:310:42",
880
+ "pathID": "/html/body/footer[1]/div[1]/div[1]/div[1]/h2[1]",
881
+ "headingIndex": ""
882
+ },
883
+ "159": {
884
+ "tagName": "INPUT",
885
+ "id": "",
886
+ "startTag": "<input type=\"submit\" value=\"WAVE\">",
887
+ "text": "Web site address:",
888
+ "textLinkable": false,
889
+ "boxID": "691:1886:48:25",
890
+ "pathID": "/html/body/footer[1]/div[1]/div[1]/div[1]/form[1]/input[2]",
891
+ "headingIndex": "155"
892
+ },
893
+ "161": {
894
+ "tagName": "H2",
895
+ "id": "blog",
896
+ "startTag": "<h2 id=\"blog\">",
897
+ "text": "From the Blog",
898
+ "textLinkable": true,
899
+ "boxID": "790:1692:310:42",
900
+ "pathID": "/html/body/footer[1]/div[1]/div[2]/h2[1]",
901
+ "headingIndex": ""
902
+ },
903
+ "172": {
904
+ "tagName": "H2",
905
+ "id": "popular",
906
+ "startTag": "<h2 id=\"popular\">",
907
+ "text": "Popular Resources",
908
+ "textLinkable": true,
909
+ "boxID": "1100:1692:310:42",
910
+ "pathID": "/html/body/footer[1]/div[1]/div[3]/h2[1]",
911
+ "headingIndex": ""
912
+ },
913
+ "189": {
914
+ "tagName": "A",
915
+ "id": "footercontact",
916
+ "startTag": "<a id=\"footercontact\" href=\"/contact\">",
917
+ "text": "Contact",
918
+ "textLinkable": true,
919
+ "boxID": "807:1940:72:18",
920
+ "pathID": "/html/body/footer[1]/div[1]/div[4]/ul[1]/li[1]/a[1]",
921
+ "headingIndex": "172"
922
+ },
923
+ "191": {
924
+ "tagName": "A",
925
+ "id": "footerabout",
926
+ "startTag": "<a id=\"footerabout\" href=\"/about\">",
927
+ "text": "About",
928
+ "textLinkable": true,
929
+ "boxID": "897:1940:60:18",
930
+ "pathID": "/html/body/footer[1]/div[1]/div[4]/ul[1]/li[2]/a[1]",
931
+ "headingIndex": "172"
932
+ },
933
+ "193": {
934
+ "tagName": "A",
935
+ "id": "footerrss",
936
+ "startTag": "<a id=\"footerrss\" href=\"/community/rss\">",
937
+ "text": "RSS Feeds",
938
+ "textLinkable": true,
939
+ "boxID": "974:1940:96:18",
940
+ "pathID": "/html/body/footer[1]/div[1]/div[4]/ul[1]/li[3]/a[1]",
941
+ "headingIndex": "172"
942
+ },
943
+ "195": {
944
+ "tagName": "A",
945
+ "id": "footerli",
946
+ "startTag": "<a id=\"footerli\" href=\"https://www.linkedin.com/company/webaim/\">",
947
+ "text": "LinkedIn",
948
+ "textLinkable": false,
949
+ "boxID": "1088:1940:76:18",
950
+ "pathID": "/html/body/footer[1]/div[1]/div[4]/ul[1]/li[4]/a[1]",
951
+ "headingIndex": "172"
952
+ },
953
+ "197": {
954
+ "tagName": "A",
955
+ "id": "footercopyright",
956
+ "startTag": "<a id=\"footercopyright\" href=\"/copyright\">",
957
+ "text": "Copyright & Terms of Use",
958
+ "textLinkable": true,
959
+ "boxID": "1182:1940:186:18",
960
+ "pathID": "/html/body/footer[1]/div[1]/div[4]/ul[1]/li[5]/a[1]",
961
+ "headingIndex": "172"
962
+ }
963
+ }
964
+ }