===== FILE HASHES ===== 88422ce140ee30ffa1c972ff306e2595a7dff6408be0b64cf9567148b4230b60 /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js bb62d2c9e747507641b676c5faf26b9794905acb39129d736356c4b5501d9958 /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js a63abfcdc28fab7516d895933e0f2457411d0d922d9eb942a06d2e71fad039f9 /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js ===== SPACING RULE REFERENCES ===== /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1051-const A11Y_AXE_BASE = /^https?:$/.test(location.protocol) ? location.origin + '/a11y-axe/' : 'https://aiwebpageseo.com/a11y-axe/'; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1052- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1053-function a11yAxeSources() { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1054- if (window.__a11yAxeSrc && window.__a11yAxeSrc.axe && window.__a11yAxeSrc.run && window.__a11yAxeSrc.spacing) return Promise.resolve(window.__a11yAxeSrc); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1055- if (!window.__a11yAxeSrcP) { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1056- // Sent with this site's cookies, so the server's firewall knows the visitor has already passed its check; anything /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1057- // that is not a script (a firewall check page, an error page) counts as not loaded. /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1058- const get = f => fetch(A11Y_AXE_BASE + f, { credentials: 'same-origin' }).then(r => r.ok && /javascript/i.test(r.headers.get('content-type') || '') ? r.text() : Promise.reject(new Error('HTTP ' + r.status))); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js:1059: window.__a11yAxeSrcP = Promise.all([get('axe.min.js'), get('run.js'), get('text-spacing.js')]).then(([axe, run, spacing]) => ({ axe, run, spacing })).catch(() => { window.__a11yAxeSrcP = null; return null; }); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1060- } /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1061- return window.__a11yAxeSrcP; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1062-} /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1063- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1064-function a11yAxeDoc(html, baseUrl, srcs) { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1065- const d = new DOMParser().parseFromString(html, 'text/html'); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1066- d.querySelectorAll('script, noscript, meta[http-equiv], object, embed, applet, frame, frameset, portal, animate, set, animateMotion, animateTransform, base').forEach(n => n.remove()); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1067- d.querySelectorAll('iframe').forEach(f => { f.removeAttribute('src'); f.removeAttribute('srcdoc'); }); -- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1071- if (n.startsWith('on') || (/^(href|src|action|formaction|xlink:href|data|poster|background)$/.test(n) && /^\s*(javascript|vbscript|data:text\/html)/i.test(a.value))) el.removeAttribute(a.name); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1072- } /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1073- } /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1074- const head = d.head || d.documentElement.insertBefore(d.createElement('head'), d.body); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1075- if (baseUrl) { const b = d.createElement('base'); b.setAttribute('href', baseUrl); head.insertBefore(b, head.firstChild); } /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1076- const st = d.createElement('style'); st.textContent = '*,*::before,*::after{animation:none!important;transition:none!important;content-visibility:visible!important}'; head.appendChild(st); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1077- const body = d.body || d.documentElement.appendChild(d.createElement('body')); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1078- // A literal "' + d.documentElement.outerHTML; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1081-} /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1082- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1083-// cssOk: false when the page's stylesheets could not all be fetched; the checks that depend on how the page /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1084-// looks (link colours, scroll areas) are then left out rather than judged without the CSS. /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1085-function a11yAxe(html, baseUrl, cssOk) { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1086- return new Promise(resolve => { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1087- let done = false; -- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1090- let started = false; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1091- const onMsg = e => { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1092- if (!fr.contentWindow || e.source !== fr.contentWindow || !e.data) return; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1093- if (e.data.a11yAxe === 2) { started = true; return; } /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1094- if (e.data.a11yAxe !== 1) return; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1095- const r = { ok: !!e.data.ok, error: e.data.error, version: e.data.version, violations: Array.isArray(e.data.violations) ? e.data.violations : [], actResults: Array.isArray(e.data.actResults) ? e.data.actResults : [] }; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1096- if (!cssOk) { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1097- r.violations = r.violations.filter(v => /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js:1098: !/^(link-in-text-block|scrollable-region-focusable|avoid-inline-spacing|act-9e45ec|act-24afc2)$/.test(v.id) /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1099- ); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1100- r.actResults = r.actResults.map(v => /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1101- v.outcome === 'error' /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1102- ? v /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1103- : { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1104- id: v.id, /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1105- outcome: 'unavailable', /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1106- error: 'Stylesheet retrieval was incomplete' -- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1839- const wcagOf = tags => (tags || []).map(t => { const m = /^wcag(\d)(\d)(\d+)$/.exec(t); return m ? m[1] + '.' + m[2] + '.' + m[3] : ''; }).filter(Boolean); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1840- // ACT spacing outcomes are preserved separately from axe-core. /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1841- // When axe already reports spacing, retain the ACT evidence /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1842- // without adding duplicate scored issues. /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1843- const actSpacing = Array.isArray(a11yAx.actResults) /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1844- ? a11yAx.actResults : []; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1845- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1846- for (const result of actSpacing) { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js:1847: const name = result.id === '9e45ec' /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1848- ? 'word spacing' /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js:1849: : result.id === '24afc2' /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1850- ? 'letter spacing' /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1851- : 'text spacing'; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1852- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1853- if (result.outcome === 'error' || result.outcome === 'unavailable') { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1854- notes.push('ACT ' + name + /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1855- ' check could not complete: ' + /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1856- String(result.error || 'unknown error')); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1857- } /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1858- } /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1859- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1860- const axeHasSpacing = a11yAx.violations.some(v => /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1861- v.id === 'avoid-inline-spacing' /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1862- ); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1863- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1864- const a11yAxWcag = a11yAx.violations.filter(v => /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1865- !v.bp && /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js:1866: !(axeHasSpacing && /^act-(9e45ec|24afc2)$/.test(v.id)) /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1867- ); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1868- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1869- if (axeHasSpacing) { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1870- for (const result of actSpacing) { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1871- if (result.outcome === 'failed') { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1872- notes.push( /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1873- 'Additional ACT evidence: ' + result.id + /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1874- ' detected restrictive ' + /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js:1875: (result.id === '9e45ec' /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1876- ? 'word spacing' /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1877- : 'letter spacing') + /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1878- '. Included under the existing axe spacing issue.' /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1879- ); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1880- } /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1881- } /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1882- } /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-1883- // Best-practice failures (not WCAG requirements) are listed as notes and never lower the score. -- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2043- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2044-
/var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2045-

Our Products

/var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2046- Blue running shoes with white soles /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2047-

Check out our full product range.

/var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2048-
/var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2049-
/var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2050-
/var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js:2051:

About aiwebpageseo

/var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2052-

aiwebpageseo.com is a data-driven SEO and AEO (Answer Engine Optimisation) platform providing a free suite of technical SEO tools. Rather than relying on AI-theorised assumptions, the platform analyses live URL performance, delivering objective diagnostics, page speed metrics, CLS debugging, and site crawl data alongside actionable technical tutorials.

/var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2053-
/var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2054-`; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2055-} /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2056- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2057-// ── SEO GATE — PAYG Credit System ───────────────────────────────────────────── /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2058-const SEOGate = (() => { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-2059- const BACKEND_URL = ''; -- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-45- }; /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-46- }) /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-47- }; /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-48- }); /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-49- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-50- var actResults = []; /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-51- var actRules = [ /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-52- { /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js:53: id: '9e45ec', /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js:54: property: 'word-spacing', /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-55- threshold: '0.16em', /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-56- help: 'Word spacing restricted below 0.16em' /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-57- }, /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-58- { /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js:59: id: '24afc2', /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js:60: property: 'letter-spacing', /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-61- threshold: '0.12em', /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-62- help: 'Letter spacing restricted below 0.12em' /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-63- } /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-64- ]; /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-65- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-66- actRules.forEach(function (rule) { /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-67- try { /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js:68: if (!window.a11yTextSpacing || /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js:69: typeof window.a11yTextSpacing.validateTextSpacing !== 'function') { /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js:70: throw Error('ACT text-spacing validator not loaded'); /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-71- } /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-72- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-73- var result = /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js:74: window.a11yTextSpacing.validateTextSpacing(rule.id); /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-75- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-76- actResults.push({ /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-77- id: rule.id, /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-78- outcome: result.outcome, /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-79- count: result.findings.length /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-80- }); /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-81- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-82- if (result.outcome !== 'failed') return; /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-83- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-84- violations.push({ /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-85- id: 'act-' + rule.id, /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-86- impact: 'serious', /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-87- help: rule.help, /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-88- description: /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-89- 'W3C ACT rule ' + rule.id + /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js:90: ': restrictive CSS text-spacing declaration detected.', /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-91- tags: ['wcag1412'], /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-92- n: result.findings.length, /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-93- bp: false, /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-94- ex: result.findings.slice(0, 3).map(function (f) { /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-95- return { /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-96- html: String(f.selector || '').slice(0, 200), /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-97- fix: String(f.message || '').slice(0, 300) /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/run.js-98- }; -- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-1-'use strict'; /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-2- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-3-const RULES = { /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js:4: '9e45ec': { property: 'word-spacing', threshold: 0.16 }, /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js:5: '24afc2': { property: 'letter-spacing', threshold: 0.12 } /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-6-}; /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-7- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js:8:function validateTextSpacing(ruleId) { /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-9- const rule = RULES[ruleId]; /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-10- if (!rule) throw new Error('Unsupported ACT rule: ' + ruleId); /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-11- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-12- // ACT applicability is restricted to HTML documents. /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-13- if (document.documentElement.namespaceURI !== /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-14- 'http://www.w3.org/1999/xhtml') { /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-15- return { outcome: 'inapplicable', findings: [] }; /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-16- } -- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-145- return { /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-146- outcome: findings.length /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-147- ? 'failed' /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-148- : applicable ? 'passed' : 'inapplicable', /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-149- findings /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-150- }; /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-151-} /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js-152- /var/www/vhosts/aiwebpageseo.com/site-audit/public/a11y-axe/text-spacing.js:153:module.exports = { validateTextSpacing }; ===== REPORT AND OUTCOME REFERENCES ===== /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-351-const A11Y_LABELLED = ['a', 'button', 'summary', ...['button', 'link', 'tab', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'checkbox', 'radio', 'switch', 'treeitem'].map(r => '[role="' + r + '"]')] /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-352- .flatMap(sel => [sel + '[aria-label]', sel + '[aria-labelledby]']).join(', '); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-353- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-354-// The name an aria-labelledby gives: the text of the elements it points to (their aria-label, else their text). /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-355-// null when there is no aria-labelledby; '' when it points to nothing or to empty elements, which gives no name /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js:356:// (axe-core checks the same), so a control whose aria-labelledby leads nowhere is not counted as named. /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-357-function a11yRefText(el) { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-358- const ids = (el.getAttribute('aria-labelledby') || '').trim(); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-359- if (!ids) return null; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-360- const d = el.ownerDocument; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-361- return ids.split(/\s+/).map(id => { const t = d.getElementById(id); return t ? ((t.getAttribute('aria-label') || '').trim() || (t.textContent || '').replace(/\s+/g, ' ').trim()) : ''; }).filter(Boolean).join(' ').trim(); -- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-391- // An open modal dialog (aria-modal="true") hides the rest of the page from screen readers with aria-hidden while /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-392- // it keeps keyboard focus inside itself: that is the standard pattern (WAI-ARIA dialog), not this failure. So /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-393- // aria-hidden on a block beside the dialog's branch of the page (Chase, WP Astra: the cookie dialog hides the /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-394- // page behind it), or aria-hidden set by a dialog library (data-aria-hidden), is left out, as are the invisible /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-395- // focus-trap guards such libraries add. Frames are left out too: the frame itself is not a tab stop and what is /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js:396: // inside another site's frame cannot be read (axe-core does not count them either). /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-397- const modals = [...doc.querySelectorAll('[aria-modal="true" i]')].filter(d => !d.closest('[aria-hidden="true" i]') && (!win || (d.getClientRects().length && win.getComputedStyle(d).visibility === 'visible'))); /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-398- const backdrop = el => { for (let a = el.closest('[aria-hidden="true" i]'); a; a = a.parentElement && a.parentElement.closest('[aria-hidden="true" i]')) { /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-399- if (a.hasAttribute('data-aria-hidden')) return true; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-400- if (modals.some(d => a.parentElement && a.parentElement.contains(d) && !a.contains(d))) return true; } return false; }; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-401- for (const el of doc.querySelectorAll(A11Y_FOCUSABLE)) { -- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-447- return { shown: shown.length, unnamed: unnamed }; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-448-} /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-449- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-450-// Which elements a visitor or a screen reader can meet: those drawn on the page. An element the CSS does not draw /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-451-// (display:none, visibility:hidden - a closed menu, a hidden pop-up, an unused placeholder, a tracking pixel) /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js:452:// is skipped by screen readers and keyboards too (WCAG; axe-core does the same), so the element checks count /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-453-// only drawn ones. The drawn copy records this per element, in page order; the report matches it by position. /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-454-const A11Y_DRAWN_SETS = { img: 'img', a: 'a', button: 'button', field: 'input, textarea, select', h: 'h1, h2, h3, h4, h5, h6', tab: '[tabindex]', svg: 'svg', modal: '[aria-modal="true" i]' }; /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-455- /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-456-// Content a site's own components build in their shadow roots (MDN's ad notice, Lloyds Pharmacy's banner close /var/www/vhosts/aiwebpageseo.com/site-audit/public/accessibility-audit.js-457-// buttons, Morrisons' tab checkboxes) is part of the page visitors use. The copy keeps it (as