PageSourceSearch

https://complaudax.com/assets/FreeCheck-Dhn9Z0S9.js

js complaudax.com collected 2026-10-02 01:26:43 UTC 20,902 bytes, 3 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/lottie_light-XmJYfmQs.js","assets/app-SD9CNApw.js","assets/app-mruhoP1r.css"])))=>i.map(i=>d[i]);
2import{r as c,j as e,C as R,L as x,_ as S,u as W,a as $,S as L,d as k,R as E}from"./app-SD9CNApw.js";import{e as q,r as G,T as F}from"./scanner-PTLolWCU.js";import{t as y}from"./analytics-BxcIpsLI.js";import{E as I}from"./EmailCapture-COWvgNAd.js";const _='button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])',D=({open:s,onClose:a,title:n,children:i,actions:r,variant:o="info"})=>{const l=c.useRef(null),t=c.useRef(null);return c.useEffect(()=>{if(!s)return;t.current=document.activeElement;const d=l.current;(d.querySelector(_)||d).focus();const b=h=>{if(h.key==="Escape"){h.preventDefault(),h.stopPropagation(),a();return}if(h.key!=="Tab")return;const p=[...d.querySelectorAll(_)].filter(m=>!m.disabled);if(p.length===0)return;const j=p[0],f=p[p.length-1];h.shiftKey&&document.activeElement===j?(h.preventDefault(),f.focus()):!h.shiftKey&&document.activeElement===f&&(h.preventDefault(),j.focus())};document.addEventListener("keydown",b,!0);const A=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.removeEventListener("keydown",b,!0),document.body.style.overflow=A,t.current&&t.current.focus&&t.current.focus()}},[s,a]),s?e.jsx("div",{className:"modal-overlay",onClick:d=>{d.target===d.currentTarget&&a()},"data-testid":"modal-overlay",children:e.jsxs("div",{ref:l,role:"dialog","aria-modal":"true","aria-labelledby":"cx-modal-title","aria-describedby":"cx-modal-body",className:`modal modal-${o}`,tabIndex:-1,"data-testid":"modal-dialog",children:[e.jsx("h2",{id:"cx-modal-title",className:"modal-title",children:n}),e.jsx("div",{id:"cx-modal-body",className:"modal-body",children:i}),e.jsx("div",{className:"modal-actions",children:r||e.jsx("button",{type:"button",className:"btn btn-secondary",onClick:a,"data-testid":"modal-close-btn",children:"Close"})})]})}):null},M=["critical","serious","moderate","minor"],P=s=>{const a=new Map;return s.forEach(n=>{const i=n.criteria[0]||{id:"other",name:"Other automated checks"},r=i.id;a.has(r)||a.set(r,{criterion:i,rules:[]}),a.get(r).rules.push(n)}),[...a.values()]},O=({totals:s,host:a})=>s.total===0?e.jsxs("div",{className:"scan-verdict scan-verdict-pass","data-testid":"scan-verdict",children:[e.jsx("p",{className:"scan-verdict-number num-pass mono",children:"0"}),e.jsxs("div",{className:"scan-verdict-copy",children:[e.jsx("h3",{children:"No automated WCAG 2.1 AA violations detected on this page."}),e.jsxs("p",{children:["Automated testing covers only part of WCAG, so manual review is still needed before drawing any conclusion about ",a,". This is not a statement of conformance."]})]})]}):e.jsxs("div",{className:"scan-verdict","data-testid":"scan-verdict",children:[e.jsx("p",{className:"scan-verdict-number num-fail mono",children:s.total}),e.jsxs("div",{className:"scan-verdict-copy",children:[e.jsxs("h3",{children:[s.total===1?"1 automated WCAG 2.1 AA violation":`${s.total} automated WCAG 2.1 AA violations`," detected on this page."]}),e.jsx("p",{children:"Each finding below names the success criterion it fails, in plain language, with the number of affected elements."})]})]}),U=({totals:s})=>e.jsx("div",{className:"impact-strip",role:"group","aria-label":"Violations by impact",children:M.map(a=>{const n=s[a];return e.jsxs("div",{className:`impact-cell impact-${a}${n===0?" is-zero":""}`,children:[e.jsx("span",{className:"num mono","data-testid":`impact-count-${a}`,children:n}),e.jsx("span",{className:"lbl",children:a})]},a)})}),H=()=>e.jsxs("div",{className:"scan-cta","data-testid":"scan-bridge",children:[e.jsxs("div",{className:"scan-cta-copy",children:[e.jsx("h3",{children:"This scan covered one public page. Here is what it cannot do."}),e.jsxs("ul",{className:"scan-cta-points",children:[e.jsx("li",{children:"Audit pages behind a login or in staging"}),e.jsx("li",{children:"Track fixes across audits over time"}),e.jsx("li",{children:"Group pages by client, the way an agency works"}),e.jsx("li",{children:"Export conformance reports and statements"})]}),e.jsx("p",{className:"scan-cta-note",children:"The Complaudax extension does all four, in your own browser."})]}),e.jsxs("div",{className:"scan-cta-actions",children:[e.jsxs("a",{className:"btn",href:R,target:"_blank",rel:"noopener noreferrer",onClick:()=>y("public_scan_install_clicked"),"data-testid":"bridge-add-to-chrome",children:["Add to Chrome, free",e.jsx("span",{className:"visually-hidden",children:" (opens in a new tab)"})]}),e.jsx(x,{className:"btn btn-secondary",to:"/product","data-testid":"bridge-see-how",children:"See how it works"})]})]}),B=({scanId:s})=>e.jsx("div",{className:"scan-action-row scan-email",children:e.jsx(I,{idPrefix:"email-report",heading:"Email me this report",note:"Optional. The full result stays visible on this page either way. One email with this report and occasional product notes; every email has a one-click unsubscribe.",buttonLabel:"Email me this report",btnClassName:"btn btn-forest btn-glow",onSubmit:async a=>{const n=await q(a,s);return y("public_scan_email_submitted"),n.status==="sent"?`Report sent to ${a}. Check your inbox.`:"Saved. Email delivery is not switched on in this environment yet, but your result stays fully visible on this page."}})}),Q=({result:s})=>{const[a,n]=c.useState(!1),[i,r]=c.useState(""),o=s.violations.slice(0,3),l=async()=>{const t=s.totals,d=[`Accessibility scan: ${s.host}`,`Scanned ${s.scanned_at.slice(0,10)}, one public page, WCAG 2.1 AA automated checks.`,t.total===0?"No automated violations detected. Manual review is still needed; automated testing covers only part of WCAG.":`${t.total} automated violation${t.total!==1?"s":""}: ${t.critical} critical, ${t.serious} serious, ${t.moderate} moderate, ${t.minor} minor.`,...s.violations.slice(0,5).map(u=>`- ${u.help} (${u.impact}, ${u.elements}
2 elements)`),"","Audited with Complaudax: https://complaudax.com/free-accessibility-check"];try{await navigator.clipboard.writeText(d.join(`
3`)),r("Summary copied to your clipboard.")}catch{r("Copying failed. Select and copy the result manually.")}};return e.jsxs("div",{className:"scan-action-row scan-quick",children:[e.jsxs("div",{className:"scan-quick-buttons",children:[o.length>0&&e.jsx("button",{type:"button",className:"btn","aria-expanded":a,onClick:()=>n(t=>!t),"data-testid":"top-fixes-toggle",children:a?"Hide my top 3 priority fixes":"Show my top 3 priority fixes"}),e.jsx("button",{type:"button",className:"btn btn-forest",onClick:l,"data-testid":"share-copy-btn",children:"Copy shareable summary"})]}),a&&e.jsx("ol",{className:"scan-topfixes-list","data-testid":"top-fixes-list",children:o.map(t=>e.jsxs("li",{children:[e.jsx("strong",{children:t.help})," (",t.impact,", ",t.elements," element",t.elements!==1?"s":"",")."," ",t.description," ",e.jsxs("a",{href:t.help_url,target:"_blank",rel:"noopener noreferrer",children:["How to fix this",e.jsx("span",{className:"visually-hidden",children:" (opens in a new tab)"})]})]},t.rule_id))}),e.jsx("p",{role:"status",className:"scan-inline-ok","data-testid":"share-copy-status",children:i})]})},z=({result:s})=>{const a=P(s.violations);return e.jsxs("div",{className:"scan-result","data-testid":"scan-result","aria-labelledby":"scan-result-heading",children:[e.jsxs("h2",{id:"scan-result-heading",children:["Result for ",e.jsx("span",{className:"mono",children:s.host})]}),e.jsxs("div",{className:"scan-summary","data-testid":"scan-summary",children:[e.jsx(O,{totals:s.totals,host:s.host}),e.jsx(U,{totals:s.totals})]}),e.jsx(H,{}),a.length>0&&e.jsx("div",{className:"scan-groups","data-testid":"scan-groups",children:a.map(n=>e.jsxs("section",{className:"crit-group",children:[e.jsx("h3",{children:n.criterion.id!=="other"?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"mono crit-id",children:n.criterion.id})," ",n.criterion.name]}):n.criterion.name}),n.rules.map(i=>e.jsxs("div",{className:"finding-row","data-testid":`rule-${i.rule_id}`,children:[e.jsxs("div",{className:"finding-main",children:[e.jsx("p",{className:"finding-help",children:i.help}),e.jsxs("p",{className:"finding-desc",children:[i.description,i.targets.length>0&&e.jsxs("span",{className:"finding-target mono",children:[" e.g. ",i.targets[0]]})]})]}),e.jsxs("div",{className:"finding-meta",children:[e.jsx("span",{className:`pill pill-sm rule-impact-${i.impact}`,children:i.impact}),e.jsxs("span",{className:"mono finding-count",children:[i.elements," element",i.elements!==1?"s":""]}),e.jsxs("a",{href:i.help_url,target:"_blank",rel:"noopener noreferrer",children:["How to fix",e.jsxs("span",{className:"visually-hidden",children:[" ",i.help," (opens in a new tab)"]})]})]})]},i.rule_id))]},n.criterion.id))}),e.jsx("p",{className:"scan-honesty",children:"Note: automated scanning verifies roughly half of the WCAG 2.1 AA success criteria; the rest, like whether focus order makes sense, needs a human. This scan also covers exactly one public page, not a site. A clean result here is a good sign, never a conformance claim."}),e.jsxs("div",{className:"scan-actions","data-testid":"scan-actions",children:[e.jsx("h3",{children:"Do more with this result"}),e.jsx(Q,{result:s}),e.jsx(B,{scanId:s.scan_id})]}),e.jsxs("div",{className:"scan-cta-quiet","data-testid":"scan-cta-quiet",children:[e.jsx("p",{children:"Ready to check the pages a public scan cannot reach?"}),e.jsxs("a",{className:"btn",href:R,target:"_blank",rel:"noopener noreferrer",onClick:()=>y("public_scan_install_clicked"),"data-testid":"bottom-add-to-chrome",children:["Add to Chrome, free",e.jsx("span",{className:"visually-hidden",children:" (opens in a new tab)"})]})]}),e.jsxs("p",{className:"meta-line scan-attribution",children:["Audited with Complaudax. Automated detection powered by axe-core (Deque Systems, MPL 2.0), engine ",s.engine_version,"."]})]})},w=[{label:"Fetching the page",holdMs:1800},{label:"Running WCAG checks",holdMs:4200},{label:"Compiling results",holdMs:null}];let N=null,C=null;const K=()=>N?Promise.resolve(N):(C||(C=Promise.all([S(()=>import("./lottie_light-XmJYfmQs.js").then(s=>s.l),__vite__mapDeps([0,1,2])),S(()=>import("./scan-loader-ChQSfIwb.js"),[])]).then(([s,a])=>(N={lottie:s.default,data:a.default},N))),C),V=()=>{const[s,a]=c.useState(0),[n,i]=c.useState(!1),r=c.useRef(null),[o]=c.useState(()=>typeof window<"u"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches);return c.useEffect(()=>{if(o)return;let l=!0,t=null;return K().then(({lottie:d,data:u})=>{!l||!r.current||(t=d.loadAnimation({container:r.current,renderer:"svg",loop:!0,autoplay:!0,animationData:u}),t.addEventListener("DOMLoaded",()=>{l&&i(!0)}))}).catch(()=>{}),()=>{l=!1,t&&t.destroy()}},[o]),c.useEffect(()=>{if(o)return;const l=w[s].holdMs;if(l===null)return;const t=setTimeout(()=>a(d=>Math.min(d+1,w.length-1)),l);return()=>clearTimeout(t)},[o,s]),o?e.jsx("div",{className:"scan-loading scan-loading-static-only","data-testid":"scan-progress",children:e.jsxs("div",{children:[e.jsx("p",{className:"scan-loading-static",children:"Scanning..."}),e.jsx("p",{className:"scan-loading-note",children:"Loading the page in a browser and running the checks. This usually takes five to fifteen seconds."})]})}):e.jsxs("div",{className:"scan-loading","data-testid":"scan-progress",children:[e.jsxs("div",{className:"scan-loading-anim","aria-hidden":"true","data-testid":"scan-lottie-mount",children:[e.jsx("div",{ref:r,className:"scan-lottie","data-loaded":n?"true":"false"}),!n&&e.jsxs("div",{className:"scan-loader-fallback",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]})]}),e.jsx("ol",{className:"scan-stage-list","aria-hidden":"true",children:w.map((l,t)=>e.jsx("li",{className:t<s?"is-done":t===s?"is-active":"",children:l.label},l.label))}),e.jsx("p",{className:"visually-hidden",children:w[s].label})]})},T=[{q:"Is this really free?",a:"Yes. Scanning a public page is free and unlimited: no account, no scan counter, no trial clock. The paid product is the Chrome extension workflow for agencies, which audits pages behind a login, tracks fixes over time, and exports conformance documentation."},{q:"Do I need to sign up?",a:"No. Enter a URL and scan. The full result is visible without giving an email address. Emailing yourself the report is optional and never required to see anything."},{q:"Can it check a page behind a login?",a:"No. This scanner runs on our servers, so it can only reach public pages. The Complaudax extension runs inside your own browser session, which is how it audits logged-in areas, staging environments, and checkout flows."},{q:"Does a passing scan mean my site is compliant?",a:"No. A passing result means no automated WCAG 2.1 AA violations were detected on this one page, nothing more. Automated testing can verify roughly half of the AA success criteria; the rest need human review, and a site is more than one page."},{q:"How is this different from the Complaudax extension?",a:"The free scanner checks one public page at a time and keeps nothing but aggregate counts. The extension audits any page you can open in your browser, including authenticated ones, keeps a per-client issue history across audits, and generates conformance reports and accessibility statements."}],Y=[{"@context":"https://schema.org","@type":"WebApplication",name:"Complaudax free accessibility checker",url:`${L}/free-accessibility-check`,applicationCategory:"DeveloperApplication",operatingSystem:"Any",offers:{"@type":"Offer",price:"0",priceCurrency:"USD"},description:"Check any public web page against WCAG 2.1 AA in seconds. Free, no signup, unlimited scans, with plain-language explanations for every violation."},{"@context":"https://schema.org","@type":"FAQPage",mainEntity:T.map(s=>
3({"@type":"Question",name:s.q,acceptedAnswer:{"@type":"Answer",text:s.a}}))}],J=()=>{const s=c.useRef(null),a=c.useRef(null),n=c.useRef("");return c.useEffect(()=>{if(typeof window>"u")return;const r=()=>{window.turnstile&&s.current&&a.current===null&&(a.current=window.turnstile.render(s.current,{sitekey:F,size:window.matchMedia("(max-width: 420px)").matches?"compact":"normal",callback:o=>{n.current=o},"expired-callback":()=>{n.current=""},"error-callback":()=>{n.current=""}}))};if(window.turnstile){r();return}if(window.cxTurnstileReady=r,!document.querySelector('script[src^="https://challenges.cloudflare.com/turnstile"]')){const o=document.createElement("script");o.src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=cxTurnstileReady",o.async=!0,document.head.appendChild(o)}},[]),{containerRef:s,tokenRef:n,reset:()=>{n.current="",window.turnstile&&a.current!==null&&window.turnstile.reset(a.current)}}};function te(){var f;const s=W(),[a,n]=c.useState(((f=s.state)==null?void 0:f.url)||""),[i,r]=c.useState("idle"),[o,l]=c.useState(""),[t,d]=c.useState(null),u=c.useRef(null),{containerRef:b,tokenRef:A,reset:h}=J(),p=()=>{r("idle"),u.current&&u.current.focus()},j=async m=>{m.preventDefault();let g=a.trim();g&&!/^https?:\/\//i.test(g)&&(g=`https://${g}`),r("scanning"),l(""),d(null),y("public_scan_started");try{const v=await G(g,A.current);d(v),r("done"),y("public_scan_completed",{violation_total:v.totals.total})}catch(v){l(v.message),r("error")}finally{h()}};return e.jsxs(e.Fragment,{children:[e.jsx($,{title:"Free WCAG accessibility checker for any page",description:"Check any public web page against WCAG 2.1 AA in seconds. Free, no signup, unlimited scans. See every violation with a plain-language explanation.",path:"/free-accessibility-check",jsonLd:Y}),e.jsxs("div",{className:"container page-head",children:[e.jsx("p",{className:"kicker",children:"Free tool"}),e.jsx("h1",{children:"Free website accessibility checker."}),e.jsx("p",{className:"lead",children:"Check any public page against WCAG 2.1 AA in seconds. Free, no signup, and no scan limit. You get every automated violation explained in plain language."})]}),e.jsx(k,{tight:!0,children:e.jsxs("div",{className:"container",children:[e.jsxs("div",{className:"scan-stage",children:[e.jsxs("div",{className:"scan-panel",children:[e.jsxs("form",{className:"scan-form",onSubmit:j,"aria-label":"Accessibility scan",children:[e.jsxs("div",{className:"scan-field",children:[e.jsx("label",{htmlFor:"scan-url",children:"Page URL to check"}),e.jsx("input",{id:"scan-url",ref:u,className:"scan-input",type:"text",inputMode:"url",autoComplete:"url",spellCheck:"false",required:!0,placeholder:"https://example.com/page",value:a,onChange:m=>n(m.target.value),"data-testid":"scan-url-input"})]}),e.jsx("button",{type:"submit",className:i==="scanning"?"btn is-scanning":"btn",disabled:i==="scanning","data-testid":"scan-submit-btn",children:i==="scanning"?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"btn-spinner","aria-hidden":"true"}),"Scanning"]}):"Check this page"})]}),e.jsx("div",{ref:b,className:"scan-turnstile","data-testid":"scan-turnstile"}),e.jsx("p",{className:"meta-line scan-privacy",children:"Privacy: we fetch the single public URL you provide, run the checks, and keep only the host name and aggregate issue counts. Page content, screenshots, and full URLs are never stored."})]}),e.jsxs("div",{className:"scan-stage-live","aria-live":"polite",children:[i==="scanning"&&e.jsx(V,{}),i==="done"&&t&&e.jsx("p",{className:"visually-hidden","data-testid":"scan-done-status",children:t.totals.total===0?`Scan finished. No automated WCAG 2.1 AA violations detected on ${t.host}. Full result follows.`:`Scan finished. ${t.totals.total} automated WCAG 2.1 AA violation${t.totals.total===1?"":"s"} detected on ${t.host}. Full result follows.`})]})]}),e.jsx(D,{open:i==="error",onClose:p,title:"The scan could not run",variant:"error",children:e.jsx("p",{"data-testid":"scan-error",children:o})}),t&&e.jsx(z,{result:t})]})}),e.jsx(k,{variant:"slate-soft",children:e.jsx("div",{className:"container prose",children:e.jsxs(E,{children:[e.jsx("h2",{children:"What this tool actually checks"}),e.jsxs("p",{children:["When you submit a URL, our server loads the page in a real headless browser, waits for it to render, and runs axe-core, the same detection engine used by the ",e.jsx(x,{to:"/product",children:"Complaudax extension"}),", against the live DOM. The rules cover the automatable portion of WCAG 2.1 at levels A and AA: missing text alternatives, insufficient colour contrast, form fields without labels, broken ARIA usage, document structure problems, and dozens of similar checks. Each finding is reported against the success criterion it fails, with the number of affected elements, so a developer can go 
3straight to the fix."]}),e.jsx("h2",{children:"What WCAG 2.1 AA means"}),e.jsxs("p",{children:["The Web Content Accessibility Guidelines organize accessibility into testable success criteria at three levels. Level AA is the bar referenced by the"," ",e.jsx(x,{to:"/regulations/eaa",children:"European Accessibility Act"}),", EN 301 549, US legal practice, and most procurement requirements, which makes it the sensible default target for commercial sites. If the terminology is new, our plain-language ",e.jsx(x,{to:"/regulations/wcag",children:"explainer on WCAG 2.1 and 2.2"})," ","covers the four principles and what changed between versions."]}),e.jsx("h2",{children:"Why one page is not a full audit"}),e.jsx("p",{children:"Two limits matter here, and hiding them would be dishonest. First, automated rules can verify roughly half of the AA criteria; judgements like whether the focus order makes sense or an error message genuinely helps still need a person. Second, this scanner only reaches pages a stranger can reach. The places accessibility problems actually concentrate, such as checkout steps, account dashboards, and staging builds awaiting release, sit behind logins that a server-side tool cannot cross. Auditing those requires running in your own browser session, which is exactly what the extension does."}),e.jsx("h2",{children:"What to do next"}),e.jsxs("p",{children:["Fix the critical and serious findings first, re-scan to confirm, then repeat on your other key templates: home, product, forms, checkout. When you need the parts a free page checker cannot give you, per-client tracking, audits behind a login, and conformance documentation, ",e.jsx(x,{to:"/product",children:"see how the full workflow fits together"})," or install the extension and keep working in the same engine you just used here."]})]})})}),e.jsx(k,{variant:"teal-soft",children:e.jsx("div",{className:"container",children:e.jsxs(E,{children:[e.jsx("h2",{children:"Questions about the free checker"}),e.jsx("div",{className:"prose","data-testid":"scanner-faq",children:T.map(m=>e.jsxs("div",{style:{marginBottom:20},children:[e.jsx("h3",{style:{marginBottom:4},children:m.q}),e.jsx("p",{style:{marginTop:0,color:"var(--ink-muted)"},children:m.a})]},m.q))})]})})})]})}export{te as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.