PageSourceSearch

https://accessibility-guidelines-app.onrender.com/_next/static/chunks/app/page-c9f75f0c79fee9e9.js

js accessibility-guidelines-app.onrender.com collected 2026-10-03 11:38:53 UTC 274,250 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{43828:(e,n,t)=>{Promise.resolve().then(t.bind(t,88180))},88180:(e,n,t)=>{"use strict";t.r(n),t.d(n,{default:()=>em});var a=t(95155),i=t(12115),r=t(32467),o=t(83101),s=t(2821),l=t(75889);function c(){for(var e=arguments.length,n=Array(e),t=0;t<e;t++)n[t]=arguments[t];return(0,l.QP)((0,s.$)(n))}let d=(0,o.F)("inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",secondary:"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",destructive:"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"}},defaultVariants:{variant:"default"}});function m(e){let{className:n,variant:t,asChild:i=!1,...o}=e,s=i?r.DX:"span";return(0,a.jsx)(s,{"data-slot":"badge",className:c(d({variant:t}),n),...o})}var u=t(47937);let h=(0,o.F)("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}});function p(e){let{className:n,variant:t,size:i,asChild:o=!1,...s}=e,l=o?r.DX:"button";return(0,a.jsx)(l,{"data-slot":"button",className:c(h({variant:t,size:i,className:n})),...s})}var g=t(93499);let b=()=>(0,a.jsx)("header",{className:"bg-card border-b border-border",children:(0,a.jsx)("div",{className:"container mx-auto px-4 py-6",children:(0,a.jsx)("div",{className:"flex flex-col gap-4",children:(0,a.jsxs)("div",{className:"flex flex-wrap gap-3",children:[(0,a.jsx)(p,{variant:"outline",size:"sm",asChild:!0,children:(0,a.jsxs)("a",{href:"https://www.section508.gov/",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2",children:["Official Section 508",(0,a.jsx)(g.A,{className:"h-3 w-3"})]})}),(0,a.jsx)(p,{variant:"outline",size:"sm",asChild:!0,children:(0,a.jsxs)("a",{href:"https://www.w3.org/WAI/WCAG22/quickref/",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2",children:["WCAG Overview",(0,a.jsx)(g.A,{className:"h-3 w-3"})]})}),(0,a.jsx)(p,{variant:"outline",size:"sm",asChild:!0,children:(0,a.jsxs)("a",{href:"https://www.w3.org/TR/WCAG22/",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2",children:["WCAG 2.2 Specs",(0,a.jsx)(g.A,{className:"h-3 w-3"})]})})]})})})});function y(e){let{className:n,...t}=e;return(0,a.jsx)("div",{"data-slot":"card",className:c("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",n
1),...t})}var f=t(17666),v=t(86651),w=t(37586),x=t(65229);let A=()=>{let[e,n]=(0,i.useState)(!0);return e?(0,a.jsx)(y,{className:"mb-6 p-4 bg-primary/5 border-primary/20",children:(0,a.jsxs)("div",{className:"flex items-start gap-3",children:[(0,a.jsx)(f.A,{className:"h-5 w-5 text-primary mt-0.5 flex-shrink-0"}),(0,a.jsxs)("div",{className:"flex-1 space-y-2",children:[(0,a.jsx)("h3",{className:"font-medium text-sm",children:"Getting Started"}),(0,a.jsxs)("div",{className:"text-sm text-muted-foreground space-y-1",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(v.A,{className:"h-3 w-3"}),(0,a.jsx)("span",{children:"Type to search across all accessibility guidelines"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(w.A,{className:"h-3 w-3"}),(0,a.jsx)("span",{children:"Click any row to see details and ask the AI assistant questions"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(g.A,{className:"h-3 w-3"}),(0,a.jsx)("span",{children:"Need help? Chat with our AI assistant for personalized guidance"})]})]}),(0,a.jsx)("div",{className:"pt-2",children:(0,a.jsx)(p,{variant:"outline",size:"sm",asChild:!0,className:"text-primary border-primary hover:bg-primary hover:text-primary-foreground",children:(0,a.jsxs)("a",{href:"https://bot.revelosolutions.com",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2",children:[(0,a.jsx)(w.A,{className:"h-3 w-3"}),"Open AI Assistant",(0,a.jsx)(g.A,{className:"h-3 w-3"})]})})})]}),(0,a.jsx)(p,{variant:"ghost",size:"sm",onClick:()=>n(!1),className:"text-muted-foreground hover:text-foreground",children:(0,a.jsx)(x.A,{className:"h-4 w-4"})})]})}):null};function T(e){let{className:n,type:t,...i}=e;return(0,a.jsx)("input",{type:t,"data-slot":"input",className:c("file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",n),...i})}let k=e=>{let{data:n,onResultClick:t}=e,[r,o]=(0,i.useState)(""),[s,l]=(0,i.useState)([]),[c,d]=(0,i.useState)(!1),u=(0,i.useCallback)(e=>{if(!e.trim())return[];let t=new Map,a=e.toLowerCase().trim(),i={columnName:10,id:9,wcagSC:8,pdfuaCode:8,pdfuaClause:7,waveType:6,readabilityMetric:6,internalFieldName:7,internalSystem:5,variable:5,explanation:4,remediationGuidelines:3,pdfuaClauseDescription:2,pdfuaFixingSuggestions:2};return n.forEach(e=>{e.rows.forEach(n=>{let r=[{field:"columnName",value:n.columnName,priority:i.columnName||0},{field:"id",value:n.id,priority:i.id||0},{field:"explanation",value:n.explanation,priority:i.explanation||0},{field:"wcagSC",value:n.wcagSC||"",priority:i.wcagSC||0},{field:"pdfuaCode",value:n.pdfuaCode||"",priority:i.pdfuaCode||0},{field:"pdfuaClause",value:n.pdfuaClause||"",priority:i.pdfuaClause||0},{field:"variable",value:n.variable||"",priority:i.variable||0},{field:"remediationGuidelines",value:n.remediationGuidelines||"",priority:i.remediationGuidelines||0},{field:"waveType",value:n.waveType||"",priority:i.waveType||0},{field:"readabilityMetric",value:n.readabilityMetric||"",priority:i.readabilityMetric||0},{field:"internalFieldName",value:n.internalFieldName||"",priority:i.internalFieldName||0},{field:"internalSystem",value:n.internalSystem||"",priority:i.internalSystem||0},{field:"pdfuaClauseDescription",value:n.pdfuaClauseDescription||"",priority:i.pdfuaClauseDescription||0},{field:"pdfuaFixingSuggestions",value:n.pdfuaFixingSuggestions||"",priority:i.pdfuaFixingSuggestions||0}],o=null,s=-1;if(r.forEach(e=>{let{field:n,value:t,priority:i}=e;if(!t)return;let r=t.toLowerCase(),l=r.indexOf(a);if(-1!==l){let e=i+100*(t.toLowerCase()===a)+10*(0===l)+5*!!(0===l||!/[a-z0-9]/.test(r[l-1]));if(e>s){let i=l+a.length,r=t.length>100?"".concat(t.substring(Math.max(0,l-30),l)).concat(t.substring(l,i)).concat(t.substring(i,Math.min(t.length,i+30))):t;o={field:n,value:t,priority:e,snippet:r},s=e}}}),null!==o){let a=n.id,i=o;t.set(a,{row:n,tabName:e.name,matchedField:i.field,snippet:i.snippet})}})}),Array.from(t.values()).sort((e,n)=>{let t=i[e.matchedField]||0,a=i[n.matchedField]||0;return a!==t?a-t:e.row.columnName.localeCompare(n.row.columnName)}).slice(0,20)},[n]);(0,i.useEffect)(()=>{let e=setTimeout(()=>{let e=u(r);l(e),d(e.length>0&&""!==r.trim())},250);return()=>clearTimeout(e)},[r,u]);let h=()=>{o(""),d(!1)},g=s.reduce((e,n)=>(e[n.tabName]||(e[n.tabName]=[]),e[n.tabName].push(n),e),{});return(0,a.jsxs)("div",{className:"relative w-full max-w-2xl",children:[(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)(v.A,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground h-4 w-4"}),(0,a.jsx)(T,{value:r,onChange:e=>o(e.target.value),placeholder:"Search all tables (e.g., 'alt text', '1.4.3', 'contrast_low')",className:"pl-10 pr-10",onKeyDown:e=>{"Escape"===e.key&&h()}}),r&&(0,a.jsx)(p,{variant:"ghost",size:"sm",onClick:h,className:"absolute right-2 top-1/2 transform -translate-y-1/2 h-6 w-6 p-0",children:(0,a.jsx)(x.A,{className:"h-3 w-3"})})]}),c&&(0,a.jsx)(y,{className:"absolute top-full mt-2 w-full max-h-96 overflow-y-auto z-50 p-4",children:(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("h3",{className:"font-semibold text-sm",children:[s.length," results across ",Object.keys(g).length," tables"]}),(0,a.jsx)(p,{variant:"ghost",size:"sm",onClick:h,children:(0,a.jsx)(x.A,{className:"h-3 w-3"})})]}),Object.entries(g).map(e=>{let[n,i]=e;return(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(m,{variant:"outline",children:n}),(0,a.jsxs)("span",{className:"text-sm text-muted-foreground",children:[i.length," results"]})]}),(0,a.jsx)("div",{className:"space-y-1",children:i.map(e=>(0,a.jsxs)("button",{onClick:()=>(e=>{let n=e.row.category;"wave"===e.row.category?n="wave":"readability"===e.row.category&&(n="readability"),t(n,e.row.id
1),d(!1),o("")})(e),className:"w-full text-left p-2 rounded hover:bg-muted transition-colors",children:[(0,a.jsx)("div",{className:"font-medium text-sm",children:e.row.columnName}),(0,a.jsx)("div",{className:"text-xs text-muted-foreground line-clamp-2",children:e.snippet})]},"".concat(e.tabName,"-").concat(e.row.id,"-").concat(e.matchedField)))})]},n)})]})})]})};var C=t(50887);function I(e){let{className:n,...t}=e;return(0,a.jsx)(C.bL,{"data-slot":"tabs",className:c("flex flex-col gap-2",n),...t})}function S(e){let{className:n,...t}=e;return(0,a.jsx)(C.B8,{"data-slot":"tabs-list",className:c("bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]",n),...t})}function N(e){let{className:n,...t}=e;return(0,a.jsx)(C.l9,{"data-slot":"tabs-trigger",className:c("data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",n),...t})}function _(e){let{className:n,...t}=e;return(0,a.jsx)(C.UC,{"data-slot":"tabs-content",className:c("flex-1 outline-none",n),...t})}var L=t(75426),W=t(70856),P=t(78352),M=t(98397);function R(e){if(!e)return"";let n=e;return(n=(n=(n=(n=n.replace(/(\S)\s*-\s/g,"$1\n- ")).replace(/([^\n])(- )/g,"$1\n- ")).replace(/(<[a-z][\s\S]*?>[\s\S]*?<\/[a-z]+>)/gi,"\n```\n$1\n```\n")).replace(/\n{3,}/g,"\n\n")).trim()}function j(e){switch(e){case"Critical":case"Error":return"destructive";case"High":case"Warning":return"secondary";case"Moderate":case"Low":case"Need Check Manual":case"Alert":default:return"outline";case"Feature":return"default"}}function U(e){switch(e){case"A":return"default";case"AA":return"secondary";default:return"outline"}}function G(e){switch(e){case"A":return"badge-level-a";case"AA":return"badge-level-aa";case"AAA":return"badge-level-aaa";default:return""}}function E(e){let{row:n,copyToClipboard:t}=e;return(0,a.jsx)(y,{className:"m-4 p-6",children:(0,a.jsxs)("div",{className:"space-y-4",children:["wave"===n.category?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{children:(0,a.jsx)("h3",{className:"font-semibold text-lg mb-2",children:n.columnName})}),n.remediationGuidelines&&(0,a.jsxs)("div",{children:[(0,a.jsx)("h4",{className:"font-medium text-sm mb-1",children:"Remediation Guidelines"}),(0,a.jsx)("div",{className:"prose prose-sm w-full max-w-none text-foreground bg-muted p-3 rounded overflow-x-auto",children:(0,a.jsx)(W.oz,{components:{h2(e){let{children:n,...t}=e;return(0,a.jsx)("h2",{className:"text-lg font-semibold mt-6 mb-3 text-foreground border-b border-border pb-2",...t,children:n})},h3(e){let{children:n,...t}=e,r=i.Children.toArray(n).join("");return r.includes("What It Means")||r.includes("Why It Matters")||r.includes("What To Do")||r.includes("Examples")||r.includes("Best Practices")||r.includes("The Algorithm")||r.includes("Relevant WCAG")||r.includes("Terms to Avoid")||r.includes("Requirements")||r.includes("Using Adobe Acrobat Pro")||r.includes("Using Command Line Tools")||r.includes("Verification")||r.includes("Fix")||r.includes("Adding")||r.includes("Correct")||r.includes("Modern Approach")||r.includes("CSS")||r.includes("Language Code Format")||r.includes("Contrast Requirements")||r.includes("Tools")||r.includes("Title Structure")||r.includes("Key areas to address")||r.includes("Testing checklist")||r.includes("Remediation")?(0,a.jsxs)("h3",{className:"text-base font-semibold mt-5 mb-2 text-primary flex items-center gap-2",...t,children:[(0,a.jsx)("span",{className:"w-1 h-5 bg-primary rounded-full flex-shrink-0"}),n]}
1):(0,a.jsx)("h3",{className:"text-sm font-medium mt-4 mb-2 text-foreground",...t,children:n})},ul(e){let{children:n,...t}=e;return(0,a.jsx)("ul",{className:"list-disc list-inside space-y-1 my-3 ml-4",...t,children:n})},ol(e){let{children:n,...t}=e;return(0,a.jsx)("ol",{className:"list-decimal list-inside space-y-1 my-3 ml-4",...t,children:n})},li(e){let{children:n,...t}=e;return(0,a.jsx)("li",{className:"text-sm leading-relaxed",...t,children:n})},strong(e){let{children:n,...t}=e;return(0,a.jsx)("strong",{className:"font-semibold text-foreground",...t,children:n})},p(e){let{children:n,...t}=e;return i.Children.toArray(n).some(e=>{var n,t,a,r;if(!i.isValidElement(e))return!1;if("div"===e.type||"pre"===e.type)return!0;let o=e.props,s=e.type,l=String(s);return!!(("code"===s||l.toLowerCase().includes("code")||"function"==typeof s&&(null==(n=s.name)?void 0:n.toLowerCase().includes("code"))||(null==(t=o.className)?void 0:t.includes("language-")))&&(null==o?void 0:o.inline)!==!0||(null==o||null==(a=o.className)?void 0:a.includes("language-"))||(null==o||null==(r=o.className)?void 0:r.includes("relative")))})?(0,a.jsx)(a.Fragment,{children:n}):(0,a.jsx)("p",{className:"text-sm leading-relaxed mb-3 text-foreground/90",...t,children:n})},pre(e){let{children:n,...t}=e;return(0,a.jsx)(a.Fragment,{children:n})},code(e){let{inline:n,className:t,children:i,...r}=e,o=/language-(\w+)/.exec(t||""),s=String(i).replace(/\n$/,"");return n?(0,a.jsx)("code",{className:"bg-gray-200 px-1 rounded text-xs",...r,children:i}):(0,a.jsxs)("div",{className:"relative my-2",children:[(0,a.jsxs)("button",{type:"button",className:"absolute top-2 right-2 z-10 bg-gray-100 hover:bg-gray-200 text-xs px-2 py-1 rounded border border-gray-300",onClick:()=>{navigator.clipboard.writeText(s),window.toast&&window.toast({title:"Copied to clipboard",description:"Code snippet has been copied to your clipboard."})},"aria-label":"Copy code",children:[(0,a.jsx)(L.A,{className:"inline h-3 w-3 mr-1"}),"Copy"]}),(0,a.jsx)(P.A,{style:M.A,language:o?o[1]:void 0,PreTag:"div",customStyle:{margin:0,borderRadius:"0.375rem",fontSize:"0.85em"},...r,children:s})]})}},children:n.remediationGuidelines})})]}),(0,a.jsx)("div",{className:"flex flex-wrap gap-2",children:n.waveType&&(0,a.jsx)(m,{variant:"outline",className:"font-medium",role:"status","aria-label":"WAVE type: ".concat(n.waveType),children:n.waveType})}),n.helpLink&&(0,a.jsx)(p,{variant:"outline",size:"sm",asChild:!0,children:(0,a.jsxs)("a",{href:n.helpLink,target:"_blank",rel:"noopener noreferrer",children:[(0,a.jsx)(g.A,{className:"h-3 w-3 mr-2"}),"View Documentation"]})})]}):"readability"===n.category?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{children:(0,a.jsx)("h3",{className:"font-semibold text-lg mb-2",children:n.readabilityMetric})}),n.remediationGuidelines&&(0,a.jsxs)("div",{children:[(0,a.jsx)("h4",{className:"font-medium text-sm mb-1",children:"Remediation Guidelines"}),(0,a.jsx)("div",{className:"prose prose-sm w-full max-w-none text-foreground bg-muted p-3 rounded overflow-x-auto",children:(0,a.jsx)(W.oz,{components:{h2(e){let{children:n,...t}=e;return(0,a.jsx)("h2",{className:"text-lg font-semibold mt-6 mb-3 text-foreground border-b border-border pb-2",...t,children:n})},h3(e){let{children:n,...t}=e,r=i.Children.toArray(n).join("");return r.includes("What It Means")||r.includes("Why It Matters")||r.includes("What To Do")||r.includes("Examples")||r.includes("Best Practices")||r.includes("The Algorithm")||r.includes("Relevant WCAG")||r.includes("Terms to Avoid")||r.includes("Requirements")||r.includes("Using Adobe Acrobat Pro")||r.includes("Using Command Line Tools")||r.includes("Verification")||r.includes("Fix")||r.includes("Adding")||r.includes("Correct")||r.includes("Modern Approach")||r.includes("CSS")||r.includes("Language Code Format")||r.includes("Contrast Requirements")||r.includes("Tools")||r.includes("Title Structure")||r.includes("Key areas to address")||r.includes("Testing checklist")||r.includes("Remediation")?(0,a.jsxs)("h3",{className:"text-base font-semibold mt-5 mb-2 text-primary flex items-center gap-2",...t,children:[(0,a.jsx)("span",{className:"w-1 h-5 bg-primary rounded-full flex-shrink-0"}),n]}
1):(0,a.jsx)("h3",{className:"text-sm font-medium mt-4 mb-2 text-foreground",...t,children:n})},ul(e){let{children:n,...t}=e;return(0,a.jsx)("ul",{className:"list-disc list-inside space-y-1 my-3 ml-4",...t,children:n})},ol(e){let{children:n,...t}=e;return(0,a.jsx)("ol",{className:"list-decimal list-inside space-y-1 my-3 ml-4",...t,children:n})},li(e){let{children:n,...t}=e;return(0,a.jsx)("li",{className:"text-sm leading-relaxed",...t,children:n})},strong(e){let{children:n,...t}=e;return(0,a.jsx)("strong",{className:"font-semibold text-foreground",...t,children:n})},p(e){let{children:n,...t}=e;return i.Children.toArray(n).some(e=>{var n,t,a,r;if(!i.isValidElement(e))return!1;if("div"===e.type||"pre"===e.type)return!0;let o=e.props,s=e.type,l=String(s);return!!(("code"===s||l.toLowerCase().includes("code")||"function"==typeof s&&(null==(n=s.name)?void 0:n.toLowerCase().includes("code"))||(null==(t=o.className)?void 0:t.includes("language-")))&&(null==o?void 0:o.inline)!==!0||(null==o||null==(a=o.className)?void 0:a.includes("language-"))||(null==o||null==(r=o.className)?void 0:r.includes("relative")))})?(0,a.jsx)(a.Fragment,{children:n}):(0,a.jsx)("p",{className:"text-sm leading-relaxed mb-3 text-foreground/90",...t,children:n})},pre(e){let{children:n,...t}=e;return(0,a.jsx)(a.Fragment,{children:n})},code(e){let{inline:n,className:t,children:i,...r}=e,o=/language-(\w+)/.exec(t||""),s=String(i).replace(/\n$/,"");return n?(0,a.jsx)("code",{className:"bg-gray-200 px-1 rounded text-xs",...r,children:i}):(0,a.jsxs)("div",{className:"relative my-2",children:[(0,a.jsxs)("button",{type:"button",className:"absolute top-2 right-2 z-10 bg-gray-100 hover:bg-gray-200 text-xs px-2 py-1 rounded border border-gray-300",onClick:()=>{navigator.clipboard.writeText(s),window.toast&&window.toast({title:"Copied to clipboard",description:"Code snippet has been copied to your clipboard."})},"aria-label":"Copy code",children:[(0,a.jsx)(L.A,{className:"inline h-3 w-3 mr-1"}),"Copy"]}),(0,a.jsx)(P.A,{style:M.A,language:o?o[1]:void 0,PreTag:"div",customStyle:{margin:0,borderRadius:"0.375rem",fontSize:"0.85em"},...r,children:s})]})}},children:R(n.remediationGuidelines)})})]}),(0,a.jsx)("div",{className:"flex flex-wrap gap-2",children:n.readabilityScoreType&&(0,a.jsx)(m,{variant:function(e){switch(e){case"grade_level":case"level":return"destructive";case"score":case"score_0_100":return"default";case"count":case"percent":case"ratio":default:return"secondary";case"duration":case"category":return"outline"}}(n.readabilityScoreType),className:"font-medium",role:"status","aria-label":"Score type: ".concat(n.readabilityScoreType),children:n.readabilityScoreType})})]}):"pdfua"===n.category?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{children:(0,a.jsx)("h3",{className:"font-semibold text-lg mb-2",children:n.columnName})}),n.pdfuaClauseDescription&&(0,a.jsxs)("div",{children:[(0,a.jsx)("h4",{className:"font-medium text-sm mb-1",children:"PDF/UA Clause Description"}),(0,a.jsx)("div",{className:"prose prose-sm w-full max-w-none text-foreground bg-muted p-3 rounded overflow-x-auto",children:(0,a.jsx)(W.oz,{components:{h2(e){let{children:n,...t}=e;return(0,a.jsx)("h2",{className:"text-lg font-semibold mt-6 mb-3 text-foreground border-b border-border pb-2",...t,children:n})},h3(e){let{children:n,...t}=e,r=i.Children.toArray(n).join("");return r.includes("What It Means")||r.includes("Why It Matters")||r.includes("What To Do")||r.includes("Examples")||r.includes("Best Practices")||r.includes("The Algorithm")||r.includes("Relevant WCAG")||r.includes("Terms to Avoid")||r.includes("Requirements")||r.includes("Using Adobe Acrobat Pro")||r.includes("Using Command Line Tools")||r.includes("Verification")||r.includes("Fix")||r.includes("Adding")||r.includes("Correct")||r.includes("Modern Approach")||r.includes("CSS")||r.includes("Language Code Format")||r.includes("Contrast Requirements")||r.includes("Tools")||r.includes("Title Structure")||r.includes("Key areas to address")||r.includes("Testing checklist")||r.includes("Remediation")?(0,a.jsxs)("h3",{className:"text-base font-semibold mt-5 mb-2 text-primary flex items-center gap-2",...t,children:[(0,a.jsx)("span",{className:"w-1 h-5 bg-primary rounded-full flex-shrink-0"}),n]}
1):(0,a.jsx)("h3",{className:"text-sm font-medium mt-4 mb-2 text-foreground",...t,children:n})},ul(e){let{children:n,...t}=e;return(0,a.jsx)("ul",{className:"list-disc list-inside space-y-1 my-3 ml-4",...t,children:n})},ol(e){let{children:n,...t}=e;return(0,a.jsx)("ol",{className:"list-decimal list-inside space-y-1 my-3 ml-4",...t,children:n})},li(e){let{children:n,...t}=e;return(0,a.jsx)("li",{className:"text-sm leading-relaxed",...t,children:n})},strong(e){let{children:n,...t}=e;return(0,a.jsx)("strong",{className:"font-semibold text-foreground",...t,children:n})},p(e){let{children:n,...t}=e;return i.Children.toArray(n).some(e=>{var n,t,a,r;if(!i.isValidElement(e))return!1;if("div"===e.type||"pre"===e.type)return!0;let o=e.props,s=e.type,l=String(s);return!!(("code"===s||l.toLowerCase().includes("code")||"function"==typeof s&&(null==(n=s.name)?void 0:n.toLowerCase().includes("code"))||(null==(t=o.className)?void 0:t.includes("language-")))&&(null==o?void 0:o.inline)!==!0||(null==o||null==(a=o.className)?void 0:a.includes("language-"))||(null==o||null==(r=o.className)?void 0:r.includes("relative")))})?(0,a.jsx)(a.Fragment,{children:n}):(0,a.jsx)("p",{className:"text-sm leading-relaxed mb-3 text-foreground/90",...t,children:n})},pre(e){let{children:n,...t}=e;return(0,a.jsx)(a.Fragment,{children:n})},code(e){let{inline:n,className:t,children:i,...r}=e,o=/language-(\w+)/.exec(t||""),s=String(i).replace(/\n$/,"");return n?(0,a.jsx)("code",{className:"bg-gray-200 px-1 rounded text-xs",...r,children:i}):(0,a.jsxs)("div",{className:"relative my-2",children:[(0,a.jsxs)("button",{type:"button",className:"absolute top-2 right-2 z-10 bg-gray-100 hover:bg-gray-200 text-xs px-2 py-1 rounded border border-gray-300",onClick:()=>{navigator.clipboard.writeText(s),window.toast&&window.toast({title:"Copied to clipboard",description:"Code snippet has been copied to your clipboard."})},"aria-label":"Copy code",children:[(0,a.jsx)(L.A,{className:"inline h-3 w-3 mr-1"}),"Copy"]}),(0,a.jsx)(P.A,{style:M.A,language:o?o[1]:void 0,PreTag:"div",customStyle:{margin:0,borderRadius:"0.375rem",fontSize:"0.85em"},...r,children:s})]})}},children:R(n.pdfuaClauseDescription)})})]}),n.pdfuaFixingSuggestions&&(0,a.jsxs)("div",{children:[(0,a.jsx)("h4",{className:"font-medium text-sm mb-1",children:"Fixing Suggestions"}),(0,a.jsx)("div",{className:"prose prose-sm w-full max-w-none text-foreground bg-muted p-3 rounded overflow-x-auto",children:(0,a.jsx)(W.oz,{components:{h2(e){let{children:n,...t}=e;return(0,a.jsx)("h2",{className:"text-lg font-semibold mt-6 mb-3 text-foreground border-b border-border pb-2",...t,children:n})},h3(e){let{children:n,...t}=e,r=i.Children.toArray(n).join("");return r.includes("What It Means")||r.includes("Why It Matters")||r.includes("What To Do")||r.includes("Examples")||r.includes("Best Practices")||r.includes("The Algorithm")||r.includes("Relevant WCAG")||r.includes("Terms to Avoid")||r.includes("Requirements")||r.includes("Using Adobe Acrobat Pro")||r.includes("Using Command Line Tools")||r.includes("Verification")||r.includes("Fix")||r.includes("Adding")||r.includes("Correct")||r.includes("Modern Approach")||r.includes("CSS")||r.includes("Language Code Format")||r.includes("Contrast Requirements")||r.includes("Tools")||r.includes("Title Structure")||r.includes("Key areas to address")||r.includes("Testing checklist")||r.includes("Remediation")?(0,a.jsxs)("h3",{className:"text-base font-semibold mt-5 mb-2 text-primary flex items-center gap-2",...t,children:[(0,a.jsx)("span",{className:"w-1 h-5 bg-primary rounded-full flex-shrink-0"}),n]}):(0,a.jsx)("h3",{className:"text-sm font-medium mt-4 mb-2 text-foreground",...t,children:n})},ul(e){let{children:n,...t}=e;return(0,a.jsx)("ul",{className:"list-disc list-inside space-y-1 my-3 ml-4",...t,children:n})},ol(e){let{children:n,...t}=e;return(0,a.jsx)("ol",{className:"list-decimal list-inside space-y-1 my-3 ml-4",...t,children:n})},li(e){let{children:n,...t}=e;return(0,a.jsx)("li",{className:"text-sm leading-relaxed",...t,children:n})},strong(e){let{children:n,...t}=e;return(0,a.jsx)("strong",{className:"font-semibold text-foreground",...t,children:n})},p(e){let{children:n,...t}=e;return i.Children.toArray(n).some(e=>{var n,t,a,r;if(!i.isValidElement(e))return!1;if("div"===e.type||"pre"===e.type)return!0;let o=e.props,s=e.type,l=String(s);return!!(("code"===s||l.toLowerCase().includes("code")||"function"==typeof s&&(null==(n=s.name)?void 0:n.toLowerCase().includes("code"))||(null==(t=o.className)?void 0:t.includes("language-")))&&(null==o?void 0:o.inline)!==!0||(null==o||null==(a=o.className)?void 0:a.includes("language-"))||(null==o||null==(r=o.className)?void 0:r.includes("relative")))})?(0,a.jsx)(a.Fragment,{children:n}):(0,a.jsx)("p",{className:"text-sm leading-relaxed mb-3 text-foreground
1/90",...t,children:n})},pre(e){let{children:n,...t}=e;return(0,a.jsx)(a.Fragment,{children:n})},code(e){let{inline:n,className:t,children:i,...r}=e,o=/language-(\w+)/.exec(t||""),s=String(i).replace(/\n$/,"");return n?(0,a.jsx)("code",{className:"bg-gray-200 px-1 rounded text-xs",...r,children:i}):(0,a.jsxs)("div",{className:"relative my-2",children:[(0,a.jsxs)("button",{type:"button",className:"absolute top-2 right-2 z-10 bg-gray-100 hover:bg-gray-200 text-xs px-2 py-1 rounded border border-gray-300",onClick:()=>{navigator.clipboard.writeText(s),window.toast&&window.toast({title:"Copied to clipboard",description:"Code snippet has been copied to your clipboard."})},"aria-label":"Copy code",children:[(0,a.jsx)(L.A,{className:"inline h-3 w-3 mr-1"}),"Copy"]}),(0,a.jsx)(P.A,{style:M.A,language:o?o[1]:void 0,PreTag:"div",customStyle:{margin:0,borderRadius:"0.375rem",fontSize:"0.85em"},...r,children:s})]})}},children:R(n.pdfuaFixingSuggestions)})})]}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2",children:[n.pdfuaSeverity&&(0,a.jsx)(m,{variant:"Error"===n.pdfuaSeverity?"destructive":"Warning"===n.pdfuaSeverity?"secondary":"outline",className:"font-medium",role:"status","aria-label":"Severity: ".concat(n.pdfuaSeverity),children:n.pdfuaSeverity}),n.pdfuaClause&&(0,a.jsx)(m,{variant:"outline",className:"font-medium",role:"status","aria-label":"Clause: ".concat(n.pdfuaClause),children:n.pdfuaClause})]})]}):"internal"===n.category?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-semibold text-lg mb-2",children:n.columnName}),(0,a.jsx)("p",{className:"text-sm leading-relaxed",children:n.explanation})]}),(0,a.jsxs)("div",{className:"grid gap-2 text-sm",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"font-medium",children:"Internal column name: "}),(0,a.jsx)("code",{className:"text-xs bg-muted px-1 rounded text-muted-foreground",children:n.internalFieldName})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"font-medium",children:"Source system: "}),n.internalSystem]})]}),(0,a.jsx)("div",{className:"flex flex-wrap gap-2",children:n.internalSystem&&(0,a.jsx)(m,{variant:"outline",className:"font-medium",role:"status","aria-label":"Source system: ".concat(n.internalSystem),children:n.internalSystem})})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"font-semibold text-lg mb-2",children:n.wcagTitle}),(0,a.jsx)("p",{className:"text-sm leading-relaxed",children:n.wcagFullCriterionText})]}),n.remediationGuidelines&&(0,a.jsxs)("div",{children:[(0,a.jsx)("h4",{className:"font-medium text-sm mb-1",children:"Remediation Guidelines"}),(0,a.jsx)("div",{className:"prose prose-sm w-full max-w-none text-foreground bg-muted p-3 rounded overflow-x-auto",children:(0,a.jsx)(W.oz,{components:{h2(e){let{children:n,...t}=e;return(0,a.jsx)("h2",{className:"text-lg font-semibold mt-6 mb-3 text-foreground border-b border-border pb-2",...t,children:n})},h3(e){let{children:n,...t}=e,r=i.Children.toArray(n).join("");return r.includes("What It Means")||r.includes("Why It Matters")||r.includes("What To Do")||r.includes("Examples")||r.includes("Best Practices")||r.includes("The Algorithm")||r.includes("Relevant WCAG")||r.includes("Terms to Avoid")||r.includes("Requirements")||r.includes("Using Adobe Acrobat Pro")||r.includes("Using Command Line Tools")||r.includes("Verification")||r.includes("Fix")||r.includes("Adding")||r.includes("Correct")||r.includes("Modern Approach")||r.includes("CSS")||r.includes("Language Code Format")||r.includes("Contrast Requirements")||r.includes("Tools")||r.includes("Title Structure")||r.includes("Key areas to address")||r.includes("Testing checklist")||r.includes("Remediation")?(0,a.jsxs)("h3",{className:"text-base font-semibold mt-5 mb-2 text-primary flex items-center gap-2",...t,children:[(0,a.jsx)("span",{className:"w-1 h-5 bg-primary rounded-full flex-shrink-0"}),n]}):(0,a.jsx)("h3",{className:"text-sm font-medium mt-4 mb-2 text-foreground",...t,children:n})},ul(e){let{children:n,...t}=e;return(0,a.jsx)("ul",{className:"list-disc list-inside space-y-1 my-3 ml-4",...t,children:n})},ol(e){let{children:n,...t}=e;return(0,a.jsx)("ol",{className:"list-decimal list-inside space-y-1 my-3 ml-4",...t,children:n})},li(e){let{children:n,...t}=e;return(0,a.jsx)("li",{className:"text-sm leading-relaxed",...t,children:n})},strong(e){let{children:n,...t}=e;return(0,a.jsx)("strong",{className:"font-semibold text-foreground",...t,children:n})},p(e){let{children:n,...t}=e;return i.Children.toArray(n).some(e=>{var n,t,a,r;if(!i.isValidElement(e))return!1;if("div"===e.type||"pre"===e.type)return!0;let o=e.props,s=e.type,l=String(s);return!!(("code"===s||l.toLowerCase().includes("code")||"function"==typeof s&&(null==(n=s.name)?void 0:n.toLowerCase().includes("code"))||(null==(t=o.className)?void 0:t.includes("language-")))&&(null==o?void 0:o.inline)!==!0||(null==o||null==(a=o.className)?void 0:a.includes("language-"))||(null==o||null==(r=o.className)?void 0:r.includes("relative")))})?(0,a.jsx)(a.Fragment,{children:n}):(0,a.jsx)("p",{className:"text-sm leading-relaxed mb-3 text-foreground
1/90",...t,children:n})},pre(e){let{children:n,...t}=e;return(0,a.jsx)(a.Fragment,{children:n})},code(e){let{inline:n,className:t,children:i,...r}=e,o=/language-(\w+)/.exec(t||""),s=String(i).replace(/\n$/,"");return n?(0,a.jsx)("code",{className:"bg-gray-200 px-1 rounded text-xs",...r,children:i}):(0,a.jsxs)("div",{className:"relative my-2",children:[(0,a.jsxs)("button",{type:"button",className:"absolute top-2 right-2 z-10 bg-gray-100 hover:bg-gray-200 text-xs px-2 py-1 rounded border border-gray-300",onClick:()=>{navigator.clipboard.writeText(s),window.toast&&window.toast({title:"Copied to clipboard",description:"Code snippet has been copied to your clipboard."})},"aria-label":"Copy code",children:[(0,a.jsx)(L.A,{className:"inline h-3 w-3 mr-1"}),"Copy"]}),(0,a.jsx)(P.A,{style:M.A,language:o?o[1]:void 0,PreTag:"div",customStyle:{margin:0,borderRadius:"0.375rem",fontSize:"0.85em"},...r,children:s})]})}},children:R(n.remediationGuidelines)})})]}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2",children:[n.wcagLevel&&(0,a.jsxs)(m,{variant:U(n.wcagLevel),className:"font-medium ".concat(G(n.wcagLevel)),role:"status","aria-label":"WCAG Level: ".concat(n.wcagLevel),children:["Level ",n.wcagLevel]}),n.tags&&n.tags.map((e,n)=>(0,a.jsx)(m,{variant:"secondary",className:"font-medium",role:"status","aria-label":"Tag: ".concat(e),children:e},n))]}),n.helpLink&&(0,a.jsx)(p,{variant:"outline",size:"sm",asChild:!0,children:(0,a.jsxs)("a",{href:n.helpLink,target:"_blank",rel:"noopener noreferrer",children:[(0,a.jsx)(g.A,{className:"h-3 w-3 mr-2"}),"View Documentation"]})})]}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2 pt-2 border-t",children:[(0,a.jsxs)(p,{variant:"outline",size:"sm",onClick:()=>t(n.explanation,"Guideline description"),children:[(0,a.jsx)(L.A,{className:"h-3 w-3 mr-2"}),"Copy Guideline Description"]}),(0,a.jsxs)(p,{variant:"outline",size:"sm",onClick:()=>t(n.remediationGuidelines||n.pdfuaFixingSuggestions||"","Remediation recommendations"),children:[(0,a.jsx)(L.A,{className:"h-3 w-3 mr-2"}),"Copy Remediation Recommendations"]})]})]})})}let F=i.forwardRef((e,n)=>{let{className:t,...i}=e;return(0,a.jsx)("div",{className:"relative w-full overflow-auto",children:(0,a.jsx)("table",{ref:n,className:c("w-full caption-bottom text-sm",t),...i})})});F.displayName="Table";let D=i.forwardRef((e,n)=>{let{className:t,...i}=e;return(0,a.jsx)("thead",{ref:n,className:c("[&_tr]:border-b",t),...i})});D.displayName="TableHeader";let B=i.forwardRef((e,n)=>{let{className:t,...i}=e;return(0,a.jsx)("tbody",{ref:n,className:c("[&_tr:last-child]:border-0",t),...i})});B.displayName="TableBody",i.forwardRef((e,n)=>{let{className:t,...i}=e;return(0,a.jsx)("tfoot",{ref:n,className:c("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",t),...i})}).displayName="TableFooter";let V=i.forwardRef((e,n)=>{let{className:t,...i}=e;return(0,a.jsx)("tr",{ref:n,className:c("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",t),...i})});V.displayName="TableRow";let H=i.forwardRef((e,n)=>{let{className:t,...i}=e;return(0,a.jsx)("th",{ref:n,className:c("h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",t),...i})});H.displayName="TableHead";let z=i.forwardRef((e,n)=>{let{className:t,...i}=e;return(0,a.jsx)("td",{ref:n,className:c("p-4 align-middle [&:has([role=checkbox])]:pr-0",t),...i})});z.displayName="TableCell",i.forwardRef((e,n)=>{let{className:t,...i}=e;return(0,a.jsx)("caption",{ref:n,className:c("mt-4 text-sm text-muted-foreground",t),...i})}).displayName="TableCaption";var q=t(12108),O=t(24033);function K(e){let{row:n,columns:t,highlightedRowId:i,expandedRowId:r,onRowExpand:o}=e;return(0,a.jsxs)(V,{id:"row-".concat(n.id),className:"cursor-pointer transition-colors ".concat(i===n.id?"bg-accent/50":""," hover:bg-muted/50"),onClick:()=>o(n.id),children:["wave"===n.category?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(z,{className:"font-medium",children:n.naturalLanguageName||n.columnName}),(0,a.jsx)(z,{children:(0,a.jsx)("div",{className:"text-sm",children:String(n.explanation||"").length>100?"".concat(String(n.explanation||"").substring(0,100),"..."):String(n.explanation||"")})}),(0,a.jsx)(z,{children:(0,a.jsx)("code",{className:"text-xs bg-muted px-1 rounded text-muted-foreground",children:n.waveFieldName||n.columnName})}),(0,a.jsx)(z,{children:n.waveType&&(0,a.jsx)(m,{variant:j(n.waveType),className:"text-xs",children:n.waveType})})]}):"readability"===n.category?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(z,{className:"font-medium",children:n.columnName}),(0,a.jsx)(z,{children:(0,a.jsx)("div",{className:"text-sm",children:String(n.explanation||"").length>100?"".concat(String(n.explanation||"").substring(0,100),"..."):String(n.explanation||"")})}),(0,a.jsx)(z,{children:(0,a.jsx)("div",{className:"text-sm",children:String(n.readabilityThreshold||"")})}),(0,a.jsx)(z,{children:(0,a.jsx)("div",{className:"text-sm",children:String(n.readabilityFieldName||"")})})]}):"pdfua"===n.category?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(z,{className:"font-medium",children:n.columnName}),(0,a.jsx)(z,{children:(0,a.jsx)("code",{className:"text-xs bg-muted px-1 rounded text-muted-foreground",children:String(n.pdfuaClause||"")})}),(0,a.jsx)(z,{children:(0,a.jsx)("div",{className:"text-sm",children:String(n.pdfuaCode||"")})}),(0,a.jsx)(z,{children:(0,a.jsx)("div",{className:"text-sm",children:String(n.explanation||"").length>100?"".concat(String(n.explanation||"").substring(0,100),"..."):String(n.explanation||"")})})]}):"internal"===n.category?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(z,{className:"font-medium",children:n.columnName}),(0,a.jsx)(z,{children:(0,a.jsx)("code",{className:"text-xs bg-muted px-1 rounded text-muted-foreground",children:String(n.internalFieldName||"")})}),(0,a.jsx)(z,{children:n.internalSystem&&(0,a.jsx)(m,{variant:"outline",className:"text-xs",children:n.internalSystem})}),(0,a.jsx)(z,{children:(0,a.jsx)("div",{className:"text-sm",children:String(n.explanation||"")})})]}):t.map(e=>{let t=n[e];return(0,a.jsx)(z,{className:"columnName"===e?"font-medium":"",children:"explanation"===e||"wcagSC"===e?(0,a.jsx)("div",{className:"text-sm",children:String(t||"").length>100?"".concat(String(t||"").substring(0,100),"..."):String(t||"")}):"severity"===e?t&&(0,a.jsx)(m,{variant:j(String(t)),className:"text-xs",children:String(t)}):"wcagLevel"===e?t&&(0,a.jsx)(m,{variant:U(String(t)),className:"text-xs ".concat(G(String(t))),children:String(t)}):"type"===e?t&&(0,a.jsx)(m,{variant:"outline",className:"text-xs",children:String(t)}):"variable"===e?t&&(0,a.jsx)("code",{className:"text-xs bg-muted px-1 rounded text-muted-foreground",children:String(t)}):(0,a.jsx)("div",{className:"text-sm",children:String(t||"")})},e)}),(0,a.jsx)(z,{children:(0,a.jsx)(p,{variant:"ghost",size:"sm","aria-label":"Expand row details",children:r===n.id?(0,a.jsx)(q.A,{className:"h-4 w-4"}):(0,a.jsx)(O.A,{className:"h-4 w-4"})})})]},n.id)}var Q=t(93341);
1function $(e){let{columns:n,sortField:t,sortOrder:i,handleSort:r,formatColumnHeader:o,category:s}=e;return(0,a.jsxs)(V,{children:["wave"===s?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(H,{className:"min-w-[150px] cursor-pointer",onClick:()=>r("columnName"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:["WAVE Variable",(0,a.jsx)(Q.A,{className:"h-4 w-4 opacity-50"}),"columnName"===t&&(0,a.jsx)("span",{className:"text-xs opacity-70",children:"asc"===i?"↑":"↓"})]})}),(0,a.jsx)(H,{className:"min-w-[500px] cursor-pointer",onClick:()=>r("explanation"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:["WAVE Summary",(0,a.jsx)(Q.A,{className:"h-4 w-4 opacity-50"}),"explanation"===t&&(0,a.jsx)("span",{className:"text-xs opacity-70",children:"asc"===i?"↑":"↓"})]})}),(0,a.jsx)(H,{className:"min-w-[150px] cursor-pointer",onClick:()=>r("waveType"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:["WAVE Type",(0,a.jsx)(Q.A,{className:"h-4 w-4 opacity-50"}),"waveType"===t&&(0,a.jsx)("span",{className:"text-xs opacity-70",children:"asc"===i?"↑":"↓"})]})})]}):"readability"===s?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(H,{className:"min-w-[200px] cursor-pointer",onClick:()=>r("columnName"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:["Readability Metric",(0,a.jsx)(Q.A,{className:"h-4 w-4 opacity-50"}),"columnName"===t&&(0,a.jsx)("span",{className:"text-xs opacity-70",children:"asc"===i?"↑":"↓"})]})}),(0,a.jsx)(H,{className:"min-w-[400px] cursor-pointer",onClick:()=>r("explanation"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:["Readability Description",(0,a.jsx)(Q.A,{className:"h-4 w-4 opacity-50"}),"explanation"===t&&(0,a.jsx)("span",{className:"text-xs opacity-70",children:"asc"===i?"↑":"↓"})]})}),(0,a.jsx)(H,{className:"min-w-[150px] cursor-pointer",onClick:()=>r("readabilityThreshold"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:["Readability Threshold",(0,a.jsx)(Q.A,{className:"h-4 w-4 opacity-50"}),"readabilityThreshold"===t&&(0,a.jsx)("span",{className:"text-xs opacity-70",children:"asc"===i?"↑":"↓"})]})}),(0,a.jsx)(H,{className:"min-w-[200px] cursor-pointer",onClick:()=>r("readabilityFieldName"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:["Readability Field Name(s)",(0,a.jsx)(Q.A,{className:"h-4 w-4 opacity-50"}),"readabilityFieldName"===t&&(0,a.jsx)("span",{className:"text-xs opacity-70",children:"asc"===i?"↑":"↓"})]})})]}):"pdfua"===s?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(H,{className:"min-w-[200px] cursor-pointer",onClick:()=>r("columnName"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:["PDF/UA Rule",(0,a.jsx)(Q.A,{className:"h-4 w-4 opacity-50"}),"columnName"===t&&(0,a.jsx)("span",{className:"text-xs opacity-70",children:"asc"===i?"↑":"↓"})]})}),(0,a.jsx)(H,{className:"min-w-[150px] cursor-pointer",onClick:()=>r("pdfuaClause"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:["PDF/UA Clause",(0,a.jsx)(Q.A,{className:"h-4 w-4 opacity-50"}),"pdfuaClause"===t&&(0,a.jsx)("span",{className:"text-xs opacity-70",children:"asc"===i?"↑":"↓"})]})}),(0,a.jsx)(H,{className:"min-w-[200px] cursor-pointer",onClick:()=>r("pdfuaCode"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:["PDF/UA Code",(0,a.jsx)(Q.A,{className:"h-4 w-4 opacity-50"}),"pdfuaCode"===t&&(0,a.jsx)("span",{className:"text-xs opacity-70",children:"asc"===i?"↑":"↓"})]})}),(0,a.jsx)(H,{className:"min-w-[100px] cursor-pointer",onClick:()=>r("pdfuaSeverity"),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:["Severity",(0,a.jsx)(Q.A,{className:"h-4 w-4 opacity-50"}),"pdfuaSeverity"===t&&(0,a.jsx)("span",{className:"text-xs opacity-70",children:"asc"===i?"↑":"↓"})]})})]}):n.map(e=>(0,a.jsx)(H,{className:"cursor-pointer hover:bg-muted/50 transition-colors ".concat("explanation"===e?"min-w-[500px]":"columnName"===e||"wcagTitle"===e||"wcagLevel"===e?"min-w-[150px]":"min-w-[120px]"),onClick:()=>r(e),children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[o(e),(0,a.jsx)(Q.A,{className:"h-4 w-4 opacity-50"}),t===e&&(0,a.jsx)("span",{className:"text-xs opacity-70",children:"asc"===i?"↑":"↓"})]})},e)),(0,a.jsx)(H,{className:"w-[50px]","aria-label":"Expand row"})]})}var J=t(89715),X=t(24722);
1function Y(e){return e?(e=(e=(e=(e=(e=(e=(e=(e=e.replace(/```[\s\S]*?```/g,"")).replace(/`([^`]+)`/g,"$1")).replace(/^#{1,6}\s+(.+)$/gm,"$1")).replace(/\*\*([^*]+)\*\*/g,"$1")).replace(/\*([^*]+)\*/g,"$1")).replace(/\[([^\]]+)\]\([^\)]+\)/g,"$1")).replace(/<[^>]+>/g,"")).replace(/\n{3,}/g,"\n\n")).trim():""}function Z(e,n){let t={columnName:"readability"===e?"Readability Metric":"wave"===e?"WAVE Rule":"pdfua"===e?"PDF/UA Rule":"WCAG Success Criteria",explanation:"readability"===e?"Readability Description":"wave"===e?"WAVE Summary":"pdfua"===e?"PDF/UA Description":"WCAG Description",wcagSC:"WCAG Principle",wcagLevel:"WCAG Level",wcagTitle:"WCAG Title",readabilityThreshold:"Readability Threshold",readabilityFieldName:"Readability Field Name(s)",waveType:"Issue Type",waveFieldName:"WAVE Field Name(s)",pdfuaClause:"PDF/UA Clause",pdfuaCode:"PDF/UA Code",pdfuaSeverity:"Severity"};return n.map(e=>t[e]||e)}function ee(e,n){if("columnName"===n&&"wave"===e.category&&e.naturalLanguageName)return e.naturalLanguageName;let t=e[n];return null==t?"":"object"==typeof t?JSON.stringify(t):String(t)}async function en(e,n,a,i,r,o){let s,[{default:l},c]=await Promise.all([Promise.all([t.e(33),t.e(930),t.e(146)]).then(t.bind(t,55172)),t.e(941).then(t.bind(t,36941))]),d=new l;if(d.autoTable&&"function"==typeof d.autoTable)s=d.autoTable;else if(c.default&&"function"==typeof c.default)s=c.default;else if("function"==typeof c)s=c;else throw Error("Could not load autoTable from jspdf-autotable. Please ensure it is properly installed.");let m=s;d.setFontSize(16),d.text(i,14,20),o?(d.setFontSize(10),d.setTextColor(100,100,100),d.text('Filtered by: "'.concat(o,'"'),14,28),d.text("".concat(e.length," result(s)"),14,33)):(d.setFontSize(10),d.setTextColor(100,100,100),d.text("".concat(e.length," total item(s)"),14,28)),d.setTextColor(0,0,0),d.setFontSize(8),d.setTextColor(150,150,150),d.text("Exported on: ".concat(new Date().toLocaleDateString()),14,d.internal.pageSize.height-10),d.setTextColor(0,0,0);let u=Z(a,n),h=e.map(e=>n.map(n=>ee(e,n)));if("function"==typeof m)m(d,{head:[u],body:h,startY:o?38:33,styles:{fontSize:8,cellPadding:3,overflow:"linebreak",cellWidth:"wrap"},headStyles:{fillColor:[66,139,202],textColor:255,fontStyle:"bold",fontSize:9},alternateRowStyles:{fillColor:[245,245,245]},margin:{top:o?38:33,left:14,right:14},didParseCell:e=>{e.cell.text&&e.cell.text.length>0&&(e.cell.styles.cellWidth="auto")}});else throw Error("autoTable function is not available");if(r.size>0){let n=d.lastAutoTable.finalY+15;r.forEach((t,a)=>{let i=e.find(e=>e.id===a);if(!i)return;n>d.internal.pageSize.height-40&&(d.addPage(),n=20),d.setDrawColor(200,200,200),d.line(14,n,d.internal.pageSize.width-14,n),n+=10,d.setFontSize(12),d.setFont("helvetica","bold");let r=i.wcagTitle||i.columnName||i.readabilityMetric||"";if(d.text(r,14,n),n+=8,t.remediationGuidelines){d.setFontSize(10),d.setFont("helvetica","bold"),d.text("Remediation Guidelines:",14,n),n+=6,d.setFont("helvetica","normal");let e=Y(t.remediationGuidelines);d.splitTextToSize(e,d.internal.pageSize.width-28).forEach(e=>{n>d.internal.pageSize.height-20&&(d.addPage(),n=20),d.text(e,14,n),n+=5}),n+=5}if(t.pdfuaClauseDescription){d.setFontSize(10),d.setFont("helvetica","bold"),d.text("PDF/UA Clause Description:",14,n),n+=6,d.setFont("helvetica","normal");let e=Y(t.pdfuaClauseDescription);d.splitTextToSize(e,d.internal.pageSize.width-28).forEach(e=>{n>d.internal.pageSize.height-20&&(d.addPage(),n=20),d.text(e,14,n),n+=5}),n+=5}if(t.pdfuaFixingSuggestions){d.setFontSize(10),d.setFont("helvetica","bold"),d.text("Fixing Suggestions:",14,n),n+=6,d.setFont("helvetica","normal");let e=Y(t.pdfuaFixingSuggestions);d.splitTextToSize(e,d.internal.pageSize.width-28).forEach(e=>{n>d.internal.pageSize.height-20&&(d.addPage(),n=20),d.text(e,14,n),n+=5}),n+=5}n+=10})}let p=i.replace(/[^a-z0-9]/gi,"_").toLowerCase(),g=new Date().toISOString().split("T")[0];d.save("".concat(p,"_export_").concat(g,".pdf"))}let et=e=>{var n;let{rows:t,highlightedRowId:r,onRowExpand:o,expandedRowId:s,tableName:l,category:c}=e,[d,m]=(0,i.useState)(""),[u,h]=(0,i.useState)("columnName"),[g,b]=(0,i.useState)("asc"),[y,f]=(0,i.useState)(1);(0,i.useEffect)(()=>{f(1)},[d]);let w=[...t.filter(e=>{var n,t,a,i;let r=e.columnName.toLowerCase().includes(d.toLowerCase()),o=e.explanation.toLowerCase().includes(d.toLowerCase()),s=(null==(n=e.readabilityMetric)?void 0:n.toLowerCase().includes(d.toLowerCase()))||!1,l=(null==(t=e.readabilityDescription)?void 0:t.toLowerCase().includes(d.toLowerCase()))||!1,c=(null==(a=e.internalFieldName)?void 0:a.toLowerCase().includes(d.toLowerCase()))||!1,m=(null==(i=e.internalSystem)?void 0:i.toLowerCase().includes(d.toLowerCase()))||!1;return r||o||s||l||c||m})].sort((e,n)=>{let t=e[u]||"",a=n[u]||"",i=String(t).localeCompare(String(a));return"asc"===g?i:-i}),A=Math.ceil(w.length/10),k=w.slice((y-1)*10,10*y),C=(()=>{var e;if(0===t.length)return[];let n=null==(e=t[0])?void 0:e.category;if("readability"===n)return["columnName","explanation","readabilityThreshold","readabilityFieldName"];if("wave"===n)return["columnName","explanation","waveFieldName","waveType"];if("pdfua"===n)return["columnName","pdfuaClause","pdfuaCode","explanation"];if("internal"===n)return["columnName","internalFieldName","internalSystem","explanation"];let a=["columnName","wcagTitle","wcagLevel","wcagSC","explanation"],i=new Set;
1t.forEach(e=>{Object.keys(e).forEach(e=>{a.includes(e)&&i.add(e)})}),i.has("explanation")||i.add("explanation");let r=[];return a.forEach(e=>{i.has(e)&&r.push(e)}),r})(),[I,S]=(0,i.useState)(null),N=async(e,n)=>{if(!navigator.clipboard||!navigator.clipboard.writeText)return void alert("Unable to copy ".concat(n,". Clipboard API not available."));try{await navigator.clipboard.writeText(e),S({message:"".concat(n," copied to clipboard"),timestamp:Date.now()}),setTimeout(()=>S(null),2e3)}catch(e){S({message:"Failed to copy ".concat(n),timestamp:Date.now()}),setTimeout(()=>S(null),2e3),console.error("Failed to copy to clipboard:",e)}},_=(0,i.useMemo)(()=>{let e=new Map;if(s){let n=w.find(e=>e.id===s);n&&e.set(s,n)}return e},[s,w]),L=async()=>{try{await en(w,C,c,l,_,d||void 0)}catch(e){console.error("Error exporting PDF:",e),alert("Failed to export PDF. Please try again.")}};return(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-4 flex-wrap",children:[(0,a.jsxs)("div",{className:"relative flex-1 max-w-sm",children:[(0,a.jsx)(v.A,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground h-4 w-4"}),(0,a.jsx)(T,{value:d,onChange:e=>m(e.target.value),placeholder:"Filter this table...",className:"pl-10 pr-10",onKeyDown:e=>{"Escape"===e.key&&m("")}}),d&&(0,a.jsx)(p,{variant:"ghost",size:"sm",onClick:()=>m(""),className:"absolute right-2 top-1/2 transform -translate-y-1/2 h-6 w-6 p-0",children:(0,a.jsx)(x.A,{className:"h-3 w-3"})})]}),(0,a.jsxs)("div",{className:"text-sm text-muted-foreground",children:[w.length," of ",t.length," items"]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)(p,{variant:"outline",size:"sm",onClick:L,className:"gap-2",children:[(0,a.jsx)(J.A,{className:"h-4 w-4"}),"Export PDF"]}),(0,a.jsxs)(p,{variant:"outline",size:"sm",onClick:()=>{!function(e,n,t,a,i){let r=Z(t,n),o=i.size>0,s=o?[...r,"Expanded Details"]:r,l=[];l.push(s.map(e=>'"'.concat(e.replace(/"/g,'""'),'"')).join(",")),e.forEach(e=>{let t=n.map(n=>{let t=ee(e,n);return'"'.concat(t.replace(/"/g,'""'),'"')});if(o&&i.has(e.id)){let n=i.get(e.id),a="";n.remediationGuidelines&&(a+="Remediation Guidelines:\n"+Y(n.remediationGuidelines)),n.pdfuaClauseDescription&&(a+=(a?"\n\n":"")+"PDF/UA Clause Description:\n"+Y(n.pdfuaClauseDescription)),n.pdfuaFixingSuggestions&&(a+=(a?"\n\n":"")+"Fixing Suggestions:\n"+Y(n.pdfuaFixingSuggestions)),a=a.replace(/\n/g," | ").replace(/\s+/g," ").trim(),t.push('"'.concat(a.replace(/"/g,'""'),'"'))}else o&&t.push('""');l.push(t.join(","))});let c=l.join("\n"),d=a.replace(/[^a-z0-9]/gi,"_").toLowerCase(),m=new Date().toISOString().split("T")[0],u=new Blob([c],{type:"text/csv;charset=utf-8;"}),h=document.createElement("a"),p=URL.createObjectURL(u);h.setAttribute("href",p),h.setAttribute("download","".concat(d,"_export_").concat(m,".csv")),h.style.visibility="hidden",document.body.appendChild(h),h.click(),document.body.removeChild(h),URL.revokeObjectURL(p)}(w,C,c,l,_)},className:"gap-2",children:[(0,a.jsx)(X.A,{className:"h-4 w-4"}),"Export CSV"]})]})]}),I&&(0,a.jsx)("div",{className:"text-sm text-muted-foreground animate-in fade-in-0 slide-in-from-top-2",children:I.message}),(0,a.jsxs)("div",{className:"rounded-md border",children:[(0,a.jsxs)(F,{children:[(0,a.jsx)(D,{children:(0,a.jsx)($,{columns:C,sortField:u,sortOrder:g,handleSort:e=>{u===e?b("asc"===g?"desc":"asc"):(h(e),b("asc"))},formatColumnHeader:e=>{var n,a,i,r;if("columnName"===e){let e=null==(n=t[0])?void 0:n.category;return"readability"===e?"Readability Metric":"wave"===e?"WAVE Variable":"pdfua"===e?"PDF/UA Rule":"internal"===e?"Natural Language Term":"WCAG Success Criteria"}if("explanation"===e){let e=null==(a=t[0])?void 0:a.category;return"readability"===e?"Readability Description":"wave"===e?"WAVE Summary":"pdfua"===e?"PDF/UA Description":"internal"===e?"Notes":"WCAG Description"}return"wcagSC"===e?"WCAG Principle":"readabilityThreshold"===e?"Readability Threshold":"readabilityFieldName"===e?"Readability Field Name(s)":"waveType"===e?"Issue Type":"waveFieldName"===e?"WAVE Field Name(s)":"pdfuaClause"===e?(null==(i=t[0])?void 0:i.category)==="pdfua"?"Internal Column Name":"PDF/UA Clause":"pdfuaCode"===e?(null==(r=t[0])?void 0:r.category)==="pdfua"?"Category":"PDF/UA Code":"pdfuaSeverity"===e?"Severity":"internalFieldName"===e?"Internal Column Name":"internalSystem"===e?"Source System":"severity"===e?"":e.replace(/([A-Z])/g," $1").replace(/^./,e=>e.toUpperCase()).replace(/^Wcag/,"WCAG")},category:null==(n=t[0])?void 0:n.category})}),(0,a.jsx)(B,{children:k.map(e=>(0,a.jsxs)(i.Fragment,{children:[(0,a.jsx)(K,{row:e,columns:C,highlightedRowId:r,expandedRowId:s,onRowExpand:o}),s===e.id&&(0,a.jsx)(V,{children:(0,a.jsx)(z,{colSpan:C.length+1,className:"p-0",children:(0,a.jsx)(E,{row:e,copyToClipboard:N})})})]},e.id))})]}),0===w.length&&(0,a.jsx)("div",{className:"text-center py-8 text-muted-foreground",children:"No matches found. Try different search terms."})]}),(0,a.jsxs)("div",{className:"flex justify-center items-center gap-2 mt-4",children:[(0,a.jsx)(p,{variant:"outline",size:"sm",onClick:()=>f(e=>Math.max(1,e-1)),disabled:1===y,children:"Previous"}),(0,a.jsxs)("span",{className:"text-sm",children:["Page ",y," of ",A]}
1),(0,a.jsx)(p,{variant:"outline",size:"sm",onClick:()=>f(e=>Math.min(A,e+1)),disabled:y===A,children:"Next"})]})]})},ea=e=>{let{data:n,activeTab:t,onTabChange:i,highlightedRowId:r,onRowExpand:o,expandedRowId:s}=e;return(0,a.jsxs)(I,{value:t,onValueChange:i,className:"w-full",children:[(0,a.jsx)(S,{className:"h-auto p-2 bg-muted/30 rounded-lg grid w-full grid-cols-2 md:grid-cols-3 lg:grid-cols-5 lg:w-auto lg:flex lg:gap-2",children:n.map(e=>(0,a.jsx)(N,{value:e.id,className:"\n              text-xs lg:text-sm font-medium transition-all duration-200 \n              px-3 py-2.5 lg:px-4 lg:py-3 rounded-md\n              border-2 border-transparent\n              hover:bg-background/80 hover:shadow-sm\n              data-[state=active]:bg-background \n              data-[state=active]:shadow-md\n              data-[state=active]:border-current\n              focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\n              ".concat({wcag:"data-[state=active]:text-tab-wcag data-[state=active]:border-tab-wcag hover:text-tab-wcag/80",wave:"data-[state=active]:text-tab-wave data-[state=active]:border-tab-wave hover:text-tab-wave/80",readability:"data-[state=active]:text-tab-readability data-[state=active]:border-tab-readability hover:text-tab-readability/80",pdfua:"data-[state=active]:text-tab-pdfua data-[state=active]:border-tab-pdfua hover:text-tab-pdfua/80",internal:"data-[state=active]:text-primary data-[state=active]:border-primary hover:text-primary/80"}[e.id]||"","\n            "),children:e.name},e.id))}),n.map(e=>(0,a.jsx)(_,{value:e.id,className:"mt-6",children:(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold",children:e.name}),(0,a.jsx)("p",{className:"text-muted-foreground",children:e.description}),(0,a.jsxs)("p",{className:"text-sm text-muted-foreground mt-1",children:["EDR Table: ",(0,a.jsx)("span",{className:"font-medium",children:{wcag:"Ed508",wave:"Ed508",readability:"Ed508",pdfua:"EdAspose",internal:"Ed508 / EdCrawler / EdReadable / EdAspose"}[e.id]||""})," (For internal application purpose)"]})]}),(0,a.jsx)(et,{rows:e.rows,highlightedRowId:r,onRowExpand:o,expandedRowId:s,tableName:e.name,category:e.id})]})},e.id))]})},ei=JSON.parse('{"Ed508":[{"column":"Url_ID","term":"URL ID"},{"column":"Job_ID","term":"Job ID"},{"column":"Agency","term":"Agency Name"},{"column":"Domain","term":"Domain - Website"},{"column":"Webpage","term":"Webpage URL"},{"column":"DateScanned","term":"Date Scanned"},{"column":"Year","term":"Year"},{"column":"Month","term":"Month"},{"column":"Day","term":"Day"},{"column":"WDR400","term":"Summary of Total Elements"},{"column":"WDR500","term":"Summary of Errors"},{"column":"WDR600","term":"Summary of Contrast Errors"},{"column":"WDR700","term":"Summary of Alert Errors"},{"column":"WDR800","term":"Summary of Feature Errors"},{"column":"WDR900","term":"Summary of Structure Errors"},{"column":"WDR1000","term":"Summary of HTML Errors"},{"column":"alt_missing","term":"Missing Alternative Text"},{"column":"alt_link_missing","term":"Linked Image Missing Alternative Text"},{"column":"alt_spacer_missing","term":"Spacer Image Missing Alternative Text"},{"column":"alt_input_missing","term":"Image Button Missing Alternative Text"},{"column":"alt_area_missing","term":"Image Map Area Missing Alternative Text"},{"column":"alt_map_missing","term":"Image Map Missing Alternative Text"},{"column":"longdesc_invalid","term":"Invalid Long Description"},{"column":"label_missing","term":"Missing Label"},{"column":"label_empty","term":"Empty Label"},{"column":"label_multiple","term":"Multiple Labels"},{"column":"title_invalid","term":"Invalid Title"},{"column":"language_missing","term":"Missing or Invalid Page Language"},{"column":"meta_refresh","term":"Page refreshes or redirects"},{"column":"heading_empty","term":"Empty Heading"},{"column":"button_empty","term":"Empty Button"},{"column":"link_empty","term":"Empty Link"},{"column":"link_skip_broken","term":"Broken Skip Link"},{"column":"th_empty","term":"Empty Table Header"}
1,{"column":"blink","term":"Blinking Content"},{"column":"marquee","term":"Marquee"},{"column":"alt_suspicious","term":"Suspicious Alternative Text"},{"column":"alt_redundant","term":"Redundant Alternative Text"},{"column":"alt_duplicate","term":"Duplicate Alternative Text"},{"column":"alt_long","term":"Long Alternative Text"},{"column":"label_orphaned","term":"Orphaned Label"},{"column":"fieldset_missing","term":"Missing Fieldset"},{"column":"legend_missing","term":"Missing Legend"},{"column":"label_title","term":"Label as Title"},{"column":"heading_missing","term":"Missing Heading"},{"column":"h1_missing","term":"Missing H1 Heading"},{"column":"heading_skipped","term":"Skipped Heading"},{"column":"heading_possible","term":"Possible Heading"},{"column":"table_caption_possible","term":"Possible Table Caption"},{"column":"link_internal_broken","term":"Broken Internal Link"},{"column":"link_suspicious","term":"Suspicious Link"},{"column":"link_redundant","term":"Redundant Link"},{"column":"link_word","term":"Word Link"},{"column":"link_excel","term":"Excel Link"},{"column":"link_powerpoint","term":"PowerPoint Link"},{"column":"link_pdf","term":"PDF Link"},{"column":"link_document","term":"Document Link"},{"column":"audio_video","term":"Audio/Video Element"},{"column":"flash","term":"Flash Element"},{"column":"applet","term":"Applet Element"},{"column":"plugin","term":"Plugin Element"},{"column":"noscript","term":"NoScript Element"},{"column":"event_handler","term":"Event Handler"},{"column":"javascript_jumpmenu","term":"JavaScript Jump Menu"},{"column":"accesskey","term":"Access Key"},{"column":"tabindex","term":"Tab Index"},{"column":"text_small","term":"Small Text"},{"column":"underline","term":"Underline"},{"column":"title_redundant","term":"Redundant Title"},{"column":"text_justified","term":"Justified Text"},{"column":"alt","term":"Alternative Text"},{"column":"alt_null","term":"Null Alternative Text"},{"column":"alt_spacer","term":"Alternative Text for Spacer"},{"column":"alt_link","term":"Alternative Text for Link"},{"column":"alt_input","term":"Alternative Text for Input"},{"column":"alt_map","term":"Alternative Text for Map"},{"column":"alt_area","term":"Alternative Text for Area"},{"column":"longdesc","term":"Long Description"},{"column":"label","term":"Label"},{"column":"fieldset","term":"Fieldset"},{"column":"link_skip","term":"Skip Link"},{"column":"link_skip_target","term":"Skip Link Target"},{"column":"lang","term":"Language"},{"column":"table_layout","term":"Table Layout"},{"column":"table_data","term":"Table Data"},{"column":"table_caption","term":"Table Caption"},{"column":"th","term":"Table Header"},{"column":"th_col","term":"Table Column Header"},{"column":"th_row","term":"Table Row Header"},{"column":"h1","term":"H1 Heading"},{"column":"h2","term":"H2 Heading"},{"column":"h3","term":"H3 Heading"},{"column":"h4","term":"H4 Heading"},{"column":"h5","term":"H5 Heading"},{"column":"h6","term":"H6 Heading"},{"column":"ol","term":"Ordered List"},{"column":"ul","term":"Unordered List"},{"column":"dl","term":"Definition List"},{"column":"iframe","term":"iFrame"},{"column":"nav","term":"Navigation"},{"column":"main","term":"Main Content"},{"column":"header","term":"Header"},{"column":"aside","term":"Aside"},{"column":"html5_video_audio","term":"HTML5 Video/Audio Element"},{"column":"aria","term":"ARIA Element"},{"column":"aria_label","term":"ARIA Label"},{"column":"aria_tabindex","term":"ARIA Tab Index"},{"column":"search","term":"Search Element"},{"column":"aria_reference_broken","term":"Broken ARIA Reference"},{"column":"contrast","term":"Low contrast"},{"column":"footer","term":"Footer"},{"column":"aria_menu_broken","term":"Broken ARIA Menu"},{"column":"region_missing","term":"Missing Region"},{"column":"aria_describedby","term":"ARIA Described By"},{"column":"aria_button","term":"ARIA Button"},{"column":"aria_live_region","term":"ARIA Live Region"},{"column":"aria_menu","term":"ARIA Menu"},{"column":"aria_hidden","term":"ARIA Hidden"},{"column":"aria_expanded","term":"ARIA Expanded"},{"column":"aria_haspopup","term":"ARIA Has Popup"},{"column":"select_missing_label","term":"Missing Label in Select Element"},{"column":"figure","term":"Figure"},{"column":"region","term":"Region"},{"column":"list_possible","term":"Possible List"},{"column":"youtube_video","term":"YouTube Video"},{"column":"image_title","term":"Image Title"},{"column":"h1_missing_xpaths_location","term":"H1 Missing Location"},{"column":"heading_possible_xpaths_location","term":"Heading Possible Location"},{"column":"link_redundant_xpaths_location","term":"Link Redundant Location"},{"column":"table_layout_xpaths_location","term":"Table Layout Location"},{"column":"alt_null_xpaths_location","term":"Alt Null Location"},{"column":"alt_link_xpaths_location","term":"Alt Link Location"},{"column":"label_xpaths_location","term":"Label Location"}
1,{"column":"link_skip_xpaths_location","term":"Link Skip Location"},{"column":"link_skip_target_xpaths_location","term":"Link Skip Target Location"},{"column":"lang_xpaths_location","term":"Lang Location"},{"column":"h2_xpaths_location","term":"H2 Location"},{"column":"ul_xpaths_location","term":"Ul Location"},{"column":"nav_xpaths_location","term":"Nav Location"},{"column":"search_xpaths_location","term":"Search Location"},{"column":"aria_xpaths_location","term":"Aria Location"},{"column":"aria_label_xpaths_location","term":"Aria Label Location"},{"column":"aria_tabindex_xpaths_location","term":"Aria Tabindex Location"},{"column":"aria_live_region_xpaths_location","term":"Aria Live Region Location"},{"column":"aria_button_xpaths_location","term":"Aria Button Location"},{"column":"aria_expanded_xpaths_location","term":"Aria Expanded Location"},{"column":"aria_haspopup_xpaths_location","term":"Aria Haspopup Location"},{"column":"button_empty_xpaths_location","term":"Button Empty Location"},{"column":"link_suspicious_xpaths_location","term":"Link Suspicious Location"},{"column":"title_redundant_xpaths_location","term":"Title Redundant Location"},{"column":"h1_xpaths_location","term":"H1 Location"},{"column":"header_xpaths_location","term":"Header Location"},{"column":"footer_xpaths_location","term":"Footer Location"},{"column":"label_multiple_xpaths_location","term":"Label Multiple Location"},{"column":"text_small_xpaths_location","term":"Text Small Location"}],"EdCrawler":[{"column":"Url_ID","term":"URL ID"},{"column":"Job_ID","term":"Job ID"},{"column":"Agency","term":"Agency Name"},{"column":"Domain","term":"Domain - Website"},{"column":"Webpage","term":"Webpage URL"},{"column":"Parent","term":"Parent URL"},{"column":"DateScanned","term":"Date Scanned"},{"column":"Year","term":"Year"},{"column":"Month","term":"Month"},{"column":"Day","term":"Day"},{"column":"Status","term":"Hyperlink Status"},{"column":"Internal/External","term":"Internal or External"},{"column":"PDF","term":"PDF Present in Page"},{"column":"UrlType","term":"Type of URL"},{"column":"MetaTitle","term":"Meta Title"},{"column":"MetaDescription","term":"Meta Description"},{"column":"Emails","term":"Email Present in Page"},{"column":"Comments","term":"Comments"},{"column":"StatusDescription","term":"Status Description"}],"EdReadable":[{"column":"Url_ID","term":"URL ID"},{"column":"Job_ID","term":"Job ID"},{"column":"Agency","term":"Agency Name"},{"column":"Domain","term":"Domain - Website"},{"column":"Webpage","term":"Webpage URL"},{"column":"Parent","term":"Parent URL"},{"column":"DateScanned","term":"Date Scanned"},{"column":"Year","term":"Year"},{"column":"Month","term":"Month"},{"column":"Day","term":"Day"},{"column":"Status","term":"Hyperlink Status"},{"column":"Internal/External","term":"Internal or External"},{"column":"PDF","term":"PDF Present in Page"},{"column":"sentence_and_misspelling","term":"Sentences with Mispellings"},{"column":"paragraph_count","term":"Number of Paragraphs"},{"column":"sentence_count","term":"Total Number of Sentences"},{"column":"sentence_count_flesch","term":"Sentence Count by Flesch Readability Formula"},{"column":"letter_count","term":"Total Number of Letters"},{"column":"word_count","term":"Total Number of Words"},{"column":"lensear_word_count","term":"Word Count by Lensear Readability Formula"},{"column":"syllable_count","term":"Total Number of Syllables"},{"column":"unique_word_count","term":"Number of Unique Words"},{"column":"word_with_three_syllables","term":"Number of Words with Three Syllables"},{"column":"word_with_three_syllables_common_only","term":"Number of Common Words with Three Syllables"},{"column":"dale_chall_difficult_words","term":"Number of Difficult Words by Dale-Chall Formula"},{"column":"spache_difficult_words","term":"Number of Difficult Words by Spache Formula"},{"column":"cefr_level","term":"CEFR Level"},{"column":"ielts_level","term":"IELTS Level"},{"column":"composition_adjective_count","term":"Number of Adjectives"},{"column":"composition_adverb_count","term":"Number of Adverbs"},{"column":"composition_conjunction_count","term":"Number of Conjunctions"},{"column":"composition_determiner_count","term":"Number of Determiners"},{"column":"composition_interjection_count","term":"Number of Interjections"},{"column":"composition_noun_count","term":"Number of Nouns"},{"column":"composition_preposition_count","term":"Number of Prepositions"},{"column":"composition_pronoun_count","term":"Number of Pronouns"},{"column":"composition_proper_noun_count","term":"Number of Proper Nouns"},{"column":"composition_qualifier_count","term":"Number of Qualifiers"},{"column":"composition_verb_count","term":"Number of Verbs"},{"column":"composition_unknown_count","term":"Number of Unknown Words"},{"column":"composition_nonword_count","term":"Number of Non-Words"},{"column":"flesch_reading_ease","term":"Flesch Reading Ease Score"},{"column":"flesch_kincaid_grade_level","term":"Flesch-Kincaid Grade Level"},{"column":"gunning_fog_score","term":"Gunning Fog Index Score"},{"column":"powers_sumner_kearl_score","term":"Powers Sumner Kearl Readability Score"},{"column":"coleman_liau_index","term":"Coleman-Liau Index"},{"column":"automated_readability_index","term":"Automated Readability Index"},{"column":"smog_index","term":"SMOG Index"},{"column":"dale_chall_readability_score","term":"Dale-Chall Readability Score"},{"column":"spache_readability_score","term":"Spache Readability Score"},{"column":"forcast_grade","term":"Grade Level by FORCAST Formula"}
1,{"column":"lix_score","term":"Lix Readability Formula Score"},{"column":"rix_score","term":"Rix Readability Formula Score"},{"column":"lensear_write","term":"Lensear Write Formula Score"},{"column":"raygor_grade","term":"Raygor Estimate Grade Level"},{"column":"fry_grade","term":"Fry Readability Graph Score"},{"column":"longest_word_syllables","term":"Syllables in Longest Word"},{"column":"longest_word_letters","term":"Letters in Longest Word"},{"column":"longest_sentence_words","term":"Words in Longest Sentence"},{"column":"tone_number","term":"Tone Number"},{"column":"sentiment","term":"Sentiment"},{"column":"sentiment_number","term":"Sentiment Number"},{"column":"personal_number","term":"Personal Information Number"},{"column":"gender_number","term":"Gender Information Number"},{"column":"rating","term":"Rating"},{"column":"sentences_per_paragraph","term":"Sentences per Paragraph"},{"column":"words_per_paragraph","term":"Words per Paragraph"},{"column":"words_per_sentence","term":"Words per Sentence"},{"column":"words_per_sentence_flesch","term":"Words per Sentence by Flesch Readability Formula"},{"column":"syllables_per_word","term":"Syllables per Word"},{"column":"letters_per_word","term":"Letters per Word"},{"column":"average_grade_level","term":"Average Grade Level"},{"column":"reading_time","term":"Reading Time (in Minutes)"},{"column":"speaking_time","term":"Speaking Time (in Minutes)"},{"column":"gender","term":"Gender"},{"column":"tone","term":"Tone"},{"column":"personal","term":"Personal Information"},{"column":"keyword_density","term":"Keyword Density"},{"column":"reach","term":"Reach"},{"column":"reach_public","term":"Public Reach"},{"column":"flesch_kincaid_reading_ease","term":"Flesch-Kincaid Reading Ease Score"},{"column":"score_id","term":"Readability Score ID"},{"column":"server_reference","term":"Server Reference"},{"column":"result","term":"Readability Analysis Result"},{"column":"response_timestamp","term":"Response Timestamp"},{"column":"highlighted_text","term":"Highlighted Text"},{"column":"result_note","term":"Result Note"},{"column":"current_time","term":"Analysis Timestamp"}],"EdAspose":[{"column":"Url_ID","term":"URL ID"},{"column":"Job_ID","term":"Job ID"},{"column":"Agency","term":"Agency Name"},{"column":"Domain","term":"Domain - Website"},{"column":"Webpage","term":"Webpage URL"},{"column":"DateScanned","term":"Date Scanned"},{"column":"Year","term":"Year"},{"column":"Month","term":"Month"},{"column":"Day","term":"Day"},{"column":"Internal/External","term":"Internal or External"},{"column":"PageCount","term":"Page Count"},{"column":"WordCount","term":"Word Count"},{"column":"CharacterCount","term":"Character Count"},{"column":"ImageCount","term":"Image Count"},{"column":"TableCount","term":"Table Count"},{"column":"LinkCount","term":"Link Count"},{"column":"ExceptionCount","term":"Exception Count"},{"column":"No of Errors","term":"No of Errors"},{"column":"No of Need manual check","term":"No of Need manual check"},{"column":"No of Warnings","term":"No of Warnings"},{"column":"Category","term":"Category"},{"column":"Code","term":"Code"},{"column":"Problem Clause","term":"Problem Clause"},{"column":"Problem Definition","term":"Problem Definition"},{"column":"Pdf_Processing_Error","term":"PDF processing error encountered"},{"column":"Title","term":"Document title"},{"column":"Author","term":"Document author"},{"column":"Subject","term":"Document subject"},{"column":"Keywords","term":"Document keywords"},{"column":"CreationDate","term":"Date the document was created"},{"column":"ModDate","term":"Date the document was last modified"},{"column":"PDFVersion","term":"PDF format version"},{"column":"Producer","term":"Software used to generate the PDF"},{"column":"Creator","term":"Application that created the document content"},{"column":"IsEncrypted","term":"Whether the PDF is encrypted"},{"column":"EncryptionAlgorithm","term":"Encryption method used"},{"column":"KeyLength","term":"Encryption key length"},{"column":"Perm_Print","term":"Printing permission allowed"},{"column":"Perm_Copy","term":"Copying content permission allowed"},{"column":"Perm_Modify","term":"Modification permission allowed"},{"column":"Perm_Extract","term":"Content extraction permission allowed"},{"column":"Perm_Annotate","term":"Annotation permission allowed"},{"column":"Perm_Fill","term":"Form filling permission allowed"},{"column":"Perm_Sign","term":"Digital signing permission allowed"},{"column":"SignatureCount","term":"Total number of digital signatures"},{"column":"ValidSignatureCount","term":"Number of valid digital signatures"},{"column":"Signers","term":"Names of document signers"},{"column":"FormFieldCountTotal","term":"Total number of form fields"},{"column":"Form_TextBox","term":"Number of text box form fields"},{"column":"Form_CheckBox","term":"Number of checkbox form fields"},{"column":"Form_RadioButton","term":"Number of radio button form fields"},{"column":"Form_ComboBox","term":"Number of dropdown (combo box) form fields"},{"column":"Form_ListBox","term":"Number of list box form fields"},{"column":"Form_Signature","term":"Number of signature form fields"},{"column":"Form_Button","term":"Number of button form fields"},{"column":"AnnotationCountTotal","term":"Total number of annotations"},{"column":"Annot_Link","term":"Number of link annotations"},{"column":"Annot_Text","term":"Number of text annotations"},{"column":"Annot_Highlight","term":"Number of highlight annotations"},{"column":"Annot_Underline","term":"Number of underline annotations"},{"column":"Annot_StrikeOut","term":"Number of strikeout annotations"},{"column":"Annot_Stamp","term":"Number of stamp annotations"},{"column":"Annot_FileAttachment","term":"Number of file attachment annotations"},{"column":"Annot_Widget","term":"Number of widget annotations"},{"column":"Annot_Popup","term":"Number of popup annotations"},{"column":"Annot_Other","term":"Number of other annotation types"},{"column":"EmbeddedFileCount","term":"Number of embedded files"},{"column":"FontCountDistinct","term":"Number of distinct fonts used"},{"column":"FontNames","term":"Names of fonts used in the document"},{"column":"IsTaggedPDF","term":"Whether the PDF is tagged for accessibility"},{"column":"DocumentLanguage","term":"Declared document language"},{"column":"HasDocumentLanguage","term":"Whether a document language is specified"},{"column":"Heading_H1","term":"Number of level 1 headings"},{"column":"Heading_H2","term":"Number of level 2 headings"},{"column":"Heading_H3","term":"Number of level 3 headings"},{"column":"Heading_H4","term":"Number of level 4 headings"},{"column":"Heading_H5","term":"Number of level 5 headings"},{"column":"Heading_H6","term":"Number of level 6 headings"},{"column":"Tagged_ListCount","term":"Number of tagged lists"},{"column":"Tagged_TableCount","term":"Number of tagged tables"},{"column":"AltText_Figure_Coverage","term":"Coverage of alternative text for figures"},{"column":"ActualText_Coverage","term":"Coverage of actual text for content"},{"column":"ErrorDensity","term":"Accessibility error density"},{"column":"FleschKincaidGradeLevel","term":"Flesch-Kincaid grade level"}]}'),er=JSON.parse('{"Z":[{"column":"Category","term":"Category","category":"Error Classification","tooltip":"Category assigned to the scanned PDF based on its content"},{"column":"Perm_Print","term":"Printing permission allowed","category":"PDF Security & Permissions","tooltip":""},{"column":"Perm_Fill","term":"Form filling permission allowed","category":"PDF Security & Permissions","tooltip":""},{"column":"Heading_H5","term":"Number of level 5 headings","category":"PDF Accessibility Structure","tooltip":""},{"column":"Url_ID","term":"URL ID","category":"Mandatory Columns","tooltip":"Unique identifier assigned to each scanned PDF document."},{"column":"EncryptionAlgorithm","term":"Encryption method used","category":"PDF Security & Permissions","tooltip":""},{"column":"Form_ListBox","term":"Number of list box form fields","category":"PDF Forms","tooltip":""},{"column":"Signers","term":"Names of document signers","category":"Digital Signatures","tooltip":""},{"column":"Perm_Sign","term":"Digital signing permission allowed","category":"PDF Security & Permissions","tooltip":""}
1,{"column":"Code","term":"Code PDF UA code","category":"Error Classification","tooltip":"Identifier code related to the PDF/UA standards"},{"column":"Heading_H2","term":"Number of level 2 headings","category":"PDF Accessibility Structure","tooltip":""},{"column":"Year","term":"Year","category":"Mandatory Columns","tooltip":"Extracted year from the Date Scanned."},{"column":"Annot_Widget","term":"Number of widget annotations","category":"PDF Annotations","tooltip":""},{"column":"Perm_Modify","term":"Modification permission allowed","category":"PDF Security & Permissions","tooltip":""},{"column":"LinkCount","term":"Link Count","category":"PDF Attributes","tooltip":"Number of hyperlinks identified within the scanned PDF"},{"column":"HasDocumentLanguage","term":"Whether a document language is specified","category":"PDF Accessibility Structure","tooltip":""},{"column":"Author","term":"Document author","category":"PDF Metadata","tooltip":""},{"column":"ImageCount","term":"Image Count","category":"PDF Attributes","tooltip":"Number of images found within the scanned PDF."},{"column":"ExceptionCount","term":"Exception Count","category":"PDF Attributes","tooltip":"Number of errors encountered during the scan that prevented complete accessibility analysis."},{"column":"DocumentLanguage","term":"Declared document language","category":"PDF Accessibility Structure","tooltip":""},{"column":"Title","term":"Document title","category":"PDF Metadata","tooltip":""},{"column":"Tagged_ListCount","term":"Number of tagged lists","category":"PDF Accessibility Structure","tooltip":""},{"column":"Form_TextBox","term":"Number of text box form fields","category":"PDF Forms","tooltip":""},{"column":"Heading_H6","term":"Number of level 6 headings","category":"PDF Accessibility Structure","tooltip":""},{"column":"Day","term":"Day","category":"Mandatory Columns","tooltip":"Extracted day from the Date Scanned."},{"column":"Annot_StrikeOut","term":"Number of strikeout annotations","category":"PDF Annotations","tooltip":""},{"column":"Keywords","term":"Document keywords","category":"PDF Metadata","tooltip":""},{"column":"Form_Button","term":"Number of button form fields","category":"PDF Forms","tooltip":""},{"column":"Webpage","term":"Webpage URL","category":"Mandatory Columns","tooltip":"The original source webpage URL from where the PDF was extracted"},{"column":"AltText_Figure_Coverage","term":"Coverage of alternative text for figures","category":"PDF Accessibility Structure","tooltip":""},{"column":"PDFVersion","term":"PDF format version","category":"PDF Metadata","tooltip":""},{"column":"Form_ComboBox","term":"Number of dropdown (combo box) form fields","category":"PDF Forms","tooltip":""},{"column":"Creator","term":"Application that created the document content","category":"PDF Metadata","tooltip":""},{"column":"Annot_Popup","term":"Number of popup annotations","category":"PDF Annotations","tooltip":""},{"column":"Month","term":"Month","category":"Mandatory Columns","tooltip":"Extracted month from the Date Scanned."},{"column":"Agency","term":"Agency/contractor or company Name","category":"Mandatory Columns","tooltip":"Name of the organization responsible for the scanned website PDFs"},{"column":"Internal/External","term":"Internal or External page. If within domain or not","category":"Mandatory Columns","tooltip":"Indicates whether the scanned PDF resides within the same domain or links externally."},{"column":"Subject","term":"Document subject","category":"PDF Metadata","tooltip":""},{"column":"Problem Definition","term":"Problem Definition","category":"Error Classification","tooltip":"A more detailed description of the identified accessibility problems within the scanned PDF."},{"column":"Perm_Extract","term":"Content extraction permission allowed","category":"PDF Security & Permissions","tooltip":""},{"column":"EmbeddedFileCount","term":"Number of embedded files","category":"Embedded Content & Fonts","tooltip":""},{"column":"Perm_Copy","term":"Copying content permission allowed","category":"PDF Security & Permissions","tooltip":""},{"column":"Form_CheckBox","term":"Number of checkbox form fields","category":"PDF Forms","tooltip":""},{"column":"No of Warnings","term":"No of Warnings","category":"Issue Type","tooltip":"Number of accessibility warnings or potential issues identified within the scanned PDF."},{"column":"TableCount","term":"Table Count","category":"PDF Attributes","tooltip":"Number of tables found within the scanned PDF."},{"column":"FontCountDistinct","term":"Number of distinct fonts used","category":"Embedded Content & Fonts","tooltip":""},{"column":"PageCount","term":"Page Count","category":"PDF Attributes","tooltip":"Number of pages identified within the scanned PDF."},{"column":"Heading_H4","term":"Number of level 4 headings","category":"PDF Accessibility Structure","tooltip":""},{"column":"Producer","term":"Software used to generate the PDF","category":"PDF Metadata","tooltip":""},{"column":"Annot_Other","term":"Number of other annotation types","category":"PDF Annotations","tooltip":""},{"column":"WordCount","term":"Word Count","category":"PDF Attributes","tooltip":"Total number of words foun
1d within the scanned PDF document."},{"column":"No of Errors","term":"No of Errors","category":"Issue Type","tooltip":"Number of specific accessibility errors identified within the scanned PDF."},{"column":"Domain","term":"Domain - Website","category":"Mandatory Columns","tooltip":"Specific domain that was scanned."},{"column":"Annot_Stamp","term":"Number of stamp annotations","category":"PDF Annotations","tooltip":""},{"column":"AnnotationCountTotal","term":"Total number of annotations","category":"PDF Annotations","tooltip":""},{"column":"KeyLength","term":"Encryption key length","category":"PDF Security & Permissions","tooltip":""},{"column":"FleschKincaidGradeLevel","term":"Flesch-Kincaid grade level","category":"Readability Scores","tooltip":""},{"column":"Form_RadioButton","term":"Number of radio button form fields","category":"PDF Forms","tooltip":""},{"column":"DateScanned","term":"Date Scanned, date when the scan started","category":"Mandatory Columns","tooltip":"Date and time the PDF accessibility scan was initiated."},{"column":"Pdf_Processing_Error","term":"PDF processing error encountered","category":"PDF Processing Status","tooltip":""},{"column":"IsEncrypted","term":"Whether the PDF is encrypted","category":"PDF Security & Permissions","tooltip":""},{"column":"Problem Clause","term":"Problem Clause","category":"Error Classification","tooltip":"Sections of the scanned content that contain issues."},{"column":"Heading_H1","term":"Number of level 1 headings","category":"PDF Accessibility Structure","tooltip":""},{"column":"ErrorDensity","term":"Accessibility error density","category":"Acce
1ssibility Metrics","tooltip":""},{"column":"Annot_Highlight","term":"Number of highlight annotations","category":"PDF Annotations","tooltip":""},{"column":"CharacterCount","term":"Character Count","category":"PDF Attributes","tooltip":"Total number of characters identified within the scanned PDF document."},{"column":"SignatureCount","term":"Total number of digital signatures","category":"Digital Signatures","tooltip":""},{"column":"ModDate","term":"Date the document was last modified","category":"PDF Metadata","tooltip":""},{"column":"Form_Signature","term":"Number of signature form fields","category":"PDF Forms","tooltip":""},{"column":"CreationDate","term":"Date the document was created","category":"PDF Metadata","tooltip":""},{"column":"ValidSignatureCount","term":"Number of valid digital signatures","category":"Digital Signatures","tooltip":""},{"column":"Perm_Annotate","term":"Annotation permission allowed","category":"PDF Security & Permissions","tooltip":""},{"column":"Job_ID","term":"Job ID","category":"Mandatory Columns","tooltip":"Reference to a specific PDF accessibility analysis job or campaign."},{"column":"Annot_Text","term":"Number of text annotations","category":"PDF Annotations","tooltip":""},{"column":"Annot_Link","term":"Number of link annotations","category":"PDF Annotations","tooltip":""},{"column":"ActualText_Coverage","term":"Coverage of actual text for content","category":"PDF Accessibility Structure","tooltip":""},{"column":"Annot_Underline","term":"Number of underline annotations","category":"PDF Annotations","tooltip":""},{"column":"FormFieldCountTotal","term":"Total number of form fields","category":"PDF Forms","tooltip":""},{"column":"No of Need manual check","term":"No of Need manual check","category":"Issue Type","tooltip":"Number of instances where manual review of the scanned PDF for accessibility is recommended."},{"column":"Tagged_TableCount","term":"Number of tagged tables","category":"PDF Accessibility Structure","tooltip":""},{"column":"FontNames","term":"Names of fonts used in the document","category":"Embedded Content & Fonts","tooltip":""},{"column":"Heading_H3","term":"Number of level 3 headings","category":"PDF Accessibility Structure","tooltip":""},{"column":"Annot_FileAttachment","term":"Number of file attachment annotations","category":"PDF Annotations","tooltip":""},{"column":"IsTaggedPDF","term":"Whether the PDF is tagged for accessibility","category":"PDF Accessibility Structure","tooltip":""}]}'),eo=[{wcagId:"1.1.1",title:"Non-text Content",level:"A",principle:"Perceivable",howToTest:"Check that all non-text content has appropriate alternative text that serves the same purpose. For images, verify alt attributes are present and meaningful. For decorative images, ensure they have empty alt attributes or are marked as presentational.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html",wcagVersion:"2.0"},{wcagId:"1.2.1",title:"Audio-only and Video-only (Prerecorded)",level:"A",principle:"Perceivable",howToTest:"For prerecorded audio-only content, check that a text transcript is provided. For prerecorded video-only content, verify that either an audio track or text transcript describes the visual content.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html",wcagVersion:"2.0"},{wcagId:"1.2.2",title:"Captions (Prerecorded)",level:"A",principle:"Perceivable",howToTest:"Check that synchronized captions are provided for all prerecorded audio content in video. Verify captions are accurate, synchronized, and include speaker identification and sound effects.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html",wcagVersion:"2.0"},{wcagId:"1.2.3",title:"Audio Description or Media Alternative (Prerecorded)",level:"A",principle:"Perceivable",howToTest:"For prerecorded video content, verify that either audio description or a media alternative is provided. Audio description should describe important visual details not conveyed through audio.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html",wcagVersion:"2.0"},{wcagId:"1.2.4",title:"Captions (Live)",level:"AA",principle:"Perceivable",howToTest:"For live audio content, verify that synchronized captions are provided. Captions should be accurate, synchronized, and include speaker identification and sound effects.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html",wcagVersion:"2.0"},{wcagId:"1.2.5",title:"Audio Description (Prerecorded)",level:"AA",principle:"Perceivable",howToTest:"For prerecorded video content, verify that audio description is provided for all important visual information not conveyed through audio.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html",wcagVersion:"2.0"},{wcagId:"1.3.1",title:"Info and Relationships",level:"A",principle:"Perceivable",howToTest:"Check that information, structure, and relationships conveyed through presentation can be programmatically determined. Use semantic HTML elements and proper heading hierarchy.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html",wcagVersion:"2.0"},{wcagId:"1.3.2",title:"Meaningful Sequence",level:"A",principle:"Perceivable",howToTest:"Verify that when the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html",wcagVersion:"2.0"},{wcagId:"1.3.3",title:"Sensory Characteristics",level:"A",principle:"Perceivable",howToTest:"Check that instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, color, size, visual location, orientation, or sound.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html",wcagVersion:"2.0"},{wcagId:"1.4.1",title:"Use of Color",level:"A",principle:"Perceivable",howToTest:"Verify that color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html",wcagVersion:"2.0"},{wcagId:"1.4.2",title:"Audio Control",level:"A",principle:"Perceivable",howToTest:"Check that any audio that plays automatically for more than 3 seconds can be paused or stopped, or the audio control mechanism is identified before the audio starts.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html",wcagVersion:"2.0"},{wcagId:"1.4.3",title:"Contrast (Minimum)",level:"AA",principle:"Perceivable",howToTest:"Verify that the visual presentation of text and images of text has a contrast ratio of at least 4.5:1 for normal text and 3:1 for large text.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html",wcagVersion:"2.0"},{wcagId:"1.4.4",title:"Resize text",level:"AA",principle:"Perceivable",howToTest:"Check that text can be resized 
1without assistive technology up to 200 percent without loss of content or functionality.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html",wcagVersion:"2.0"},{wcagId:"1.4.5",title:"Images of Text",level:"AA",principle:"Perceivable",howToTest:"Verify that images of text are only used for pure decoration or where a particular presentation of text is essential to the information being conveyed.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html",wcagVersion:"2.0"},{wcagId:"1.4.6",title:"Contrast (Enhanced)",level:"AAA",principle:"Perceivable",howToTest:"Verify that the visual presentation of text and images of text has a contrast ratio of at least 7:1 for normal text and 4.5:1 for large text.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html",wcagVersion:"2.0"},{wcagId:"1.4.7",title:"Low or No Background Audio",level:"AAA",principle:"Perceivable",howToTest:"Check that for prerecorded audio-only content that contains primarily speech in the foreground, the background sounds are at least 20 decibels lower than the foreground speech content.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html",wcagVersion:"2.0"},{wcagId:"1.4.8",title:"Visual Presentation",level:"AAA",principle:"Perceivable",howToTest:"Verify that text can be presented without loss of content or functionality, and without requiring scrolling in two dimensions for vertical scrolling content at a width equivalent to 320 CSS pixels and horizontal scrolling content at a height equivalent to 256 CSS pixels.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html",wcagVersion:"2.0"},{wcagId:"1.4.9",title:"Images of Text (No Exception)",level:"AAA",principle:"Perceivable",howToTest:"Verify that images of text are only used for pure decoration or where a particular presentation of text is essential to the information being conveyed.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html",wcagVersion:"2.0"},{wcagId:"2.1.1",title:"Keyboard",level:"A",principle:"Operable",howToTest:"Check that all functionality of the content is available from a keyboard. Test tab navigation, focus indicators, and keyboard shortcuts.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html",wcagVersion:"2.0"},{wcagId:"2.1.2",title:"No Keyboard Trap",level:"A",principle:"Operable",howToTest:"Verify that if keyboard focus can be moved to a component using a keyboard interface, focus can be moved away from that component using only a keyboard interface.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html",wcagVersion:"2.0"},{wcagId:"2.2.1",title:"Timing Adjustable",level:"A",principle:"Operable",howToTest:"Check that for each time limit that is set by the content, at least one of the following is true: the user can turn off the time limit, adjust it, or extend it.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html",wcagVersion:"2.0"},{wcagId:"2.2.2",title:"Pause, Stop, Hide",level:"A",principle:"Operable",howToTest:"Verify that for moving, blinking, scrolling, or auto-updating information, users can pause, stop, or hide it, or control the frequency of the update.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html",wcagVersion:"2.0"},{wcagId:"2.2.3",title:"No Timing",level:"AAA",principle:"Operable",howToTest:"Check that timing is not an essential part of the event or activity presented by the content.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html",wcagVersion:"2.0"},{wcagId:"2.2.4",title:"Interruptions",level:"AAA",principle:"Operable",howToTest:"Verify that interruptions can be postponed or suppressed by the user.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html",wcagVersion:"2.0"},{wcagId:"2.2.5",title:"Re-authenticating",level:"AAA",principle:"Operable",howToTest:"Check that when an authenticated session expires, the user can continue the activity without loss of data after re-authenticating.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html",wcagVersion:"2.0"},{wcagId:"2.3.1",title:"Three Flashes or Below Threshold",level:"A",principle:"Operable",howToTest:"Check that web pages do not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html",wcagVersion:"2.0"},{wcagId:"2.3.2",title:"Three Flashes",level:"AAA",principle:"Operable",howToTest:"Check that web pages do not contain anything that flashes more than three times in any one second period.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html",wcagVersion:"2.0"}
1,{wcagId:"2.4.1",title:"Bypass Blocks",level:"A",principle:"Operable",howToTest:"Verify that a mechanism is available to bypass blocks of content that are repeated on multiple Web pages. Check for skip links, landmarks, or heading structure.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html",wcagVersion:"2.0"},{wcagId:"2.4.2",title:"Page Titled",level:"A",principle:"Operable",howToTest:"Check that web pages have titles that describe topic or purpose. Verify the title element is present and descriptive.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html",wcagVersion:"2.0"},{wcagId:"2.4.3",title:"Focus Order",level:"A",principle:"Operable",howToTest:"Verify that if a Web page can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html",wcagVersion:"2.0"},{wcagId:"2.4.4",title:"Link Purpose (In Context)",level:"A",principle:"Operable",howToTest:"Check that the purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link context.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html",wcagVersion:"2.0"},{wcagId:"2.4.5",title:"Multiple Ways",level:"AA",principle:"Operable",howToTest:"Verify that more than one way is available to locate a Web page within a set of Web pages. Check for site maps, search functionality, or consistent navigation.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html",wcagVersion:"2.0"},{wcagId:"2.4.6",title:"Headings and Labels",level:"AA",principle:"Operable",howToTest:"Check that headings and labels describe topic or purpose. Verify heading hierarchy is logical and labels are descriptive.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html",wcagVersion:"2.0"},{wcagId:"2.4.7",title:"Focus Visible",level:"AA",principle:"Operable",howToTest:"Verify that any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html",wcagVersion:"2.0"},{wcagId:"2.4.8",title:"Location",level:"AAA",principle:"Operable",howToTest:"Check that information about the user's location within a set of Web pages is available.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/location.html",wcagVersion:"2.0"},{wcagId:"2.4.9",title:"Link Purpose (Link Only)",level:"AAA",principle:"Operable",howToTest:"Verify that the purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link context.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html",wcagVersion:"2.0"},{wcagId:"2.4.10",title:"Section Headings",level:"AAA",principle:"Operable",howToTest:"Check that section headings are used to organize the content.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html",wcagVersion:"2.0"},{wcagId:"3.1.1",title:"Language of Page",level:"A",principle:"Understandable",howToTest:"Check that the default human language of each Web page can be programmatically determined. Verify the lang attribute is set on the html element.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html",wcagVersion:"2.0"},{wcagId:"3.1.2",title:"Language of Parts",level:"AA",principle:"Understandable",howToTest:"Verify that the human language of each passage or phrase in the content can be programmatically determined except for proper names, technical terms, and words of indeterminate language.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html",wcagVersion:"2.0"},{wcagId:"3.1.3",title:"Unusual Words",level:"AAA",principle:"Understandable",howToTest:"Check that a mechanism is available for identifying specific definitions of words or phrases used in an unusual or restricted way.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/u
1nusual-words.html",wcagVersion:"2.0"},{wcagId:"3.1.4",title:"Abbreviations",level:"AAA",principle:"Understandable",howToTest:"Verify that a mechanism for identifying the expanded form or meaning of abbreviations is available.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html",wcagVersion:"2.0"},{wcagId:"3.1.5",title:"Reading Level",level:"AAA",principle:"Understandable",howToTest:"Check that when text requires reading ability more advanced than the lower secondary education level, supplemental content or a version that does not require such advanced reading ability is available.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html",wcagVersion:"2.0"},{wcagId:"3.1.6",title:"Pronunciation",level:"AAA",principle:"Understandable",howToTest:"Verify that a mechanism for identifying specific pronunciation of words is available when the meaning of the words, in context, is ambiguous without knowing the pronunciation.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html",wcagVersion:"2.0"},{wcagId:"3.2.1",title:"On Focus",level:"A",principle:"Understandable",howToTest:"Check that when any component receives focus, it does not initiate a change of context. Verify that focus changes do not trigger unexpected navigation or form submission.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html",wcagVersion:"2.0"},{wcagId:"3.2.2",title:"On Input",level:"A",principle:"Understandable",howToTest:"Verify that changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html",wcagVersion:"2.0"},{wcagId:"3.2.3",title:"Consistent Navigation",level:"AA",principle:"Understandable",howToTest:"Check that navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are presented.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html",wcagVersion:"2.0"},{wcagId:"3.2.4",title:"Consistent Identification",level:"AA",principle:"Understandable",howToTest:"Verify that components that have the same functionality within a set of Web pages are identified consistently.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html",wcagVersion:"2.0"},{wcagId:"3.3.1",title:"Error Identification",level:"A",principle:"Understandable",howToTest:"Check that if an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html",wcagVersion:"2.0"},{wcagId:"3.3.2",title:"Labels or Instructions",level:"A",principle:"Understandable",howToTest:"Verify that labels or instructions are provided when content requires user input. Check that form controls have associated labels.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html",wcagVersion:"2.0"},{wcagId:"3.3.3",title:"Error Suggestion",level:"AA",principle:"Understandable",howToTest:"Check that if an input error is automatically detected and suggestions for correction are known, the suggestions are provided to the user.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html",wcagVersion:"2.0"},{wcagId:"3.3.4",title:"Error Prevention (Legal, Financial, Data)",level:"AA",principle:"Understandable",howToTest:"Verify that for Web pages that cause legal commitments or financial transactions, or that modify or delete user-controllable data, at least one of the following is true: submissions are reversible, data is checked for input errors, or users can review and correct information.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html",wcagVersion:"2.0"},{wcagId:"3.3.5",title:"Help",level:"AAA",principle:"Understandable",howToTest:"Check that context-sensitive help is available.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/help.html",wcagVersion:"2.0"},{wcagId:"3.3.6",title:"Error Prevention (All)",level:"AAA",principle:"Understandable",howToTest:"Verify that for Web pages that require user input, at least one of the following is true: submissions are reversible, data is checked for input errors, or users can review and correct information.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html",wcagVersion:"2.0"},{wcagId:"4.1.2",title:"Name, Role, Value",level:"A",principle:"Robust",howToTest:"Verify that for all user interface components, the name and role can be programmatically determined, and that states, properties, and values that can be set by the user can be programmatically set.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html",wcagVersion:"2.0"},{wcagId:"1.3.4",title:"Orientation",level:"AA",principle:"Perceivable",howToTest:"Check that content does not restrict its view and operation to a single display orientation, such as portrait or landscape, unless a specific display orientation is essential.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html",wcagVersion:"2.1"},{wcagId:"1.3.5",title:"Identify Input Purpose",level:"AA",principle:"Perceivable",howToTest:"Verify that the purpose of each input field collecting information about the user can be programmatically determined when the input field serves a purpose identified in the Input Purposes for User Interface Components section.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html",wcagVersion:"2.1"},{wcagId:"1.3.6",title:"Identify Purpose",level:"AAA",principle:"Perceivable",howToTest:"Check that in content implemented using markup languages, the purpose of User Interface Components, icons, and regions can be programmatically determined.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html",wcagVersion:"2.1"},{wcagId:"1.4.10",title:"Reflow",level:"AA",principle:"Perceivable",howToTest:"Verify that content can be presented without loss of information or functionality, and without requiring scrolling in two dimensions for vertical scrolling content at a width equivalent to 320 CSS pixels and horizontal scrolling content at a height equivalent to 256 CSS pixels.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html",wcagVersion:"2.1"},{wcagId:"1.4.11",title:"Non-text Contrast",level:"AA",principle:"Perceivable",howToTest:"Verify that the visual presentation of user interface components and graphical objects has a contrast ratio of at least 3:1 against adjacent colors.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html",wcagVersion:"2.1"},{wcagId:"1.4.12",title:"Text Spacing",level:"AA",principle:"Perceivable",howToTest:"Check that no loss of content or functionality occurs when text spacing is set to 150% line height, 2% character spacing, 0.16em word spacing, and 0.12em paragraph spacing.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html",wcagVersion:"2.1"},{wcagId:"1.4.13",title:"Content on Hover or Focus",level:"AA",principle:"Perceivable",howToTest:"Verify that where receiving and then removing pointer hover or keyboard focus triggers additional content to become visible and then hidden, the content is dismissible, hoverable, and persistent.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html",wcagVersion:"2.1"},{wcagId:"2.1.4",title:"Character Key Shortcuts",level:"A",principle:"Operable",howToTest:"Check that if a keyboard shortcut is implemented in content using only letter, punctuation, number, or symbol characters, then at least one of the following is true: a mechanism is available to turn the shortcut off, a mechanism is available to remap the shortcut, or the shortcut is only active when that component has focus.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html",wcagVersion:"2.1"},{wcagId:"2.2.6",title:"Timeouts",level:"AAA",principle:"Operable",howToTest:"Verify that users are warned of the duration of any user inactivity that could cause data loss, unless the data is preserved for more than 20 hours when the user does not take any actions.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html",wcagVersion:"2.1"},{wcagId:"2.3.3",title:"Animation from Interactions",level:"AAA",principle:"Operable",howToTest:"Check that motion animation triggered by interaction can be disabled, unless the animation is essential to the functionality or the information being conveyed.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html",wcagVersion:"2.1"},{wcagId:"2.5.1",title:"Pointer Gestures",level:"A",principle:"Operable",howToTest:"Verify that all functionality that uses multipoint or path-based gestures for operation can be operated 
1with a single pointer without a path-based gesture, unless a multipoint or path-based gesture is essential.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html",wcagVersion:"2.1"},{wcagId:"2.5.2",title:"Pointer Cancellation",level:"A",principle:"Operable",howToTest:"Verify that for functionality that can be operated using a single pointer, at least one of the following is true: no down-event of the pointer is executed, the up-event reverses any outcome of the preceding down-event, or the up-event is essential to the function.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html",wcagVersion:"2.1"},{wcagId:"2.5.3",title:"Label in Name",level:"A",principle:"Operable",howToTest:"Check that for user interface components with labels that include text or images of text, the name contains the text that is presented visually.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html",wcagVersion:"2.1"},{wcagId:"2.5.4",title:"Motion Actuation",level:"A",principle:"Operable",howToTest:"Verify that functionality that can be operated by device motion or user motion can also be operated by user interface components and responding to the motion can be disabled to prevent accidental actuation.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html",wcagVersion:"2.1"},{wcagId:"2.5.5",title:"Target Size (Enhanced)",level:"AAA",principle:"Operable",howToTest:"Check that target size is at least 44 by 44 CSS pixels except when the target is in a sentence or block of text, the target is available on a page or viewport that provides an equivalent target at least 44 by 44 CSS pixels, or the target is controlled by the user agent and is not modified by the author.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/target-size-enhanced.html",wcagVersion:"2.1"},{wcagId:"2.5.6",title:"Concurrent Input Mechanisms",level:"AAA",principle:"Operable",howToTest:"Verify that web content does not restrict use of input modalities available on a platform except where the restriction is essential, required to ensure the security of the content, or required to respect user settings.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html",wcagVersion:"2.1"},{wcagId:"3.2.5",title:"Change on Request",level:"AAA",principle:"Understandable",howToTest:"Verify that changes of context are initiated only by user request or a mechanism is available to turn off such changes.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html",wcagVersion:"2.1"},{wcagId:"4.1.3",title:"Status Messages",level:"AA",principle:"Robust",howToTest:"Verify that status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html",wcagVersion:"2.1"},{wcagId:"4.1.4",title:"Status Messages",level:"AAA",principle:"Robust",howToTest:"Verify that status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html",wcagVersion:"2.2"},{wcagId:"2.4.11",title:"Focus Not Obscured (Minimum)",level:"AA",principle:"Operable",howToTest:"Verify that when a user interface component receives keyboard focus, the component is not entirely hidden due to author-created content.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html",wcagVersion:"2.2"},{wcagId:"2.4.12",title:"Focus Not Obscured (Enhanced)",level:"AAA",principle:"Operable",howToTest:"Verify that when a user interface component receives keyboard focus, no part of the focused component is hidden by author-created content.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html",wcagVersion:"2.2"},{wcagId:"2.4.13",title:"Focus Appearance",level:"AAA",principle:"Operable",howToTest:"Verify that when a user interface component receives keyboard focus, the focus indicator is fully visible and meets specific size and contrast requirements.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html",wcagVersion:"2.2"},{wcagId:"2.5.7",title:"Dragging Movements",level:"AA",principle:"Operable",howToTest:"Verify that all functionality that uses a dragging movement can be operated by a single pointer without dragging, unless dragging is essential.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html",wcagVersion:"2.2"},{wcagId:"2.5.8",title:"Target Size (Minimum)",level:"AA",principle:"Operable",howToTest:"Check that target size is at least 24 by 24 CSS pixels except when the target is 
1in a sentence or block of text, the target is available on a page or viewport that provides an equivalent target at least 24 by 24 CSS pixels, or the target is controlled by the user agent and is not modified by the author.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html",wcagVersion:"2.2"},{wcagId:"2.5.9",title:"Target Size (Enhanced)",level:"AAA",principle:"Operable",howToTest:"Check that target size is at least 44 by 44 CSS pixels except when the target is in a sentence or block of text, the target is available on a page or viewport that provides an equivalent target at least 44 by 44 CSS pixels, or the target is controlled by the user agent and is not modified by the author.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/target-size-enhanced.html",wcagVersion:"2.2"},{wcagId:"3.2.6",title:"Consistent Help",level:"A",principle:"Understandable",howToTest:"Check that if a page contains help mechanisms, they are in the same relative order across pages.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html",wcagVersion:"2.2"},{wcagId:"3.3.7",title:"Redundant Entry",level:"A",principle:"Understandable",howToTest:"Check that information previously entered by or provided to the user that is required to be entered again in the same process is either auto-populated or available for the user to select.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html",wcagVersion:"2.2"},{wcagId:"3.3.8",title:"Accessible Authentication (Minimum)",level:"AA",principle:"Understandable",howToTest:"Verify that a cognitive function test is not required for any step in an authentication process unless that step provides at least one of the following: alternative authentication methods, a mechanism is available to assist the user in completing the cognitive function test, or the cognitive function test is designed to recognize the user's identity.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html",wcagVersion:"2.2"},{wcagId:"3.3.9",title:"Accessible Authentication (Enhanced)",level:"AAA",principle:"Understandable",howToTest:"Verify that a cognitive function test is not required for any step in an authentication process unless that step provides at least one of the following: alternative authentication methods, a mechanism is available to assist the user in completing the cognitive function test, or the cognitive function test is designed to recognize the user's identity.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html",wcagVersion:"2.2"},{wcagId:"3.3.10",title:"Error Prevention (All)",level:"AAA",principle:"Understandable",howToTest:"Verify that for Web pages that require user input, at least one of the following is true: submissions are reversible, data is checked for input errors, or users can review and correct information.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html",wcagVersion:"2.2"},{wcagId:"3.3.11",title:"Help",level:"AAA",principle:"Understandable",howToTest:"Check that context-sensitive help is available.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/help.html",wcagVersion:"2.2"},{wcagId:"3.3.12",title:"Error Prevention (All)",level:"AAA",principle:"Understandable",howToTest:"Verify that for Web pages that require user input, at least one of the following is true: submissions are reversible, data is checked for input errors, or users can review and correct information.",understandingUrl:"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html",wcagVersion:"2.2"}].map(e=>({id:"wcag-".concat(e.wcagId),category:"wcag",columnName:e.wcagId,wcagTitle:e.title,wcagSC:e.principle,wcagLevel:e.level,explanation:e.howToTest,wcagFullCriterionText:"".concat(e.title,": ").concat(e.howToTest),remediationGuidelines:function(e){return({"1.1.1":'## Non-text Content Remediation\n\n- **Images**: Add meaningful alt text that describes the image\'s purpose\n- **Decorative images**: Use empty alt="" or mark as presentational\n- **Charts/graphs**: Provide data tables or text descriptions\n- **Icons**: Use descriptive alt text or aria-label\n\n```html\n\x3c!-- Good: Meaningful alt text --\x3e\n<img src="chart.png" alt="Sales increased 25% from Q1 to Q2">\n\n\x3c!-- Good: Decorative image --\x3e\n<img src="decoration.png" alt="">\n\n\x3c!-- Good: Complex image --\x3e\n<img src="flowchart.png" alt="Process flowchart" longdesc="flowchart-description.html">\n```',"1.2.1":'## Audio/Video Content Remediation\n\n- **Audio-only**: Provide text transcript\n- **Video-only**: Provide audio track or text description\n- **Transcripts**: Include speaker identification and sound effects\n\n```html\n\x3c!-- Audio with transcript --\x3e\n<audio controls>\n  <source src="speech.mp3" type="audio/mpeg">\n</audio>\n<a href="transcript.txt">Transcript available</a>\n```',"1.3.1":'## Information Structure Remediation\n\n- **Headings**: Use proper heading hierarchy (h1 → h2 → h3)\n- **Lists**: Use semantic list elements (ul, ol, dl)\n- **Tables**: Include proper headers and scope attributes\n- **Forms**: Associate labels with form controls\n\n```html\n\x3c!-- Proper heading structure --\x3e\n<h1>Main Topic</h1>\n  <h2>Subtopic</h2>\n    <h3>
1Details</h3>\n\n\x3c!-- Proper table structure --\x3e\n<table>\n  <thead>\n    <tr>\n      <th scope="col">Name</th>\n      <th scope="col">Email</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>John Doe</td>\n      <td>[email protected]</td>\n    </tr>\n  </tbody>\n</table>\n```',"1.4.3":"## Color Contrast Remediation\n\n- **Text**: Ensure 4.5:1 contrast ratio for normal text\n- **Large text**: Ensure 3:1 contrast ratio for large text (18pt+)\n- **Tools**: Use color contrast analyzers\n- **Testing**: Test with color blindness simulators\n\n```css\n/* Good contrast ratios */\n.text-normal { color: #000000; background: #ffffff; } /* 21:1 */\n.text-large { color: #333333; background: #ffffff; } /* 12.6:1 */\n```","2.1.1":'## Keyboard Accessibility Remediation\n\n- **Focus management**: Ensure all interactive elements are keyboard accessible\n- **Tab order**: Logical tab sequence\n- **Skip links**: Provide skip navigation links\n- **Focus indicators**: Visible focus indicators\n\n```html\n\x3c!-- Skip link --\x3e\n<a href="#main" class="skip-link">Skip to main content</a>\n\n\x3c!-- Proper tab order --\x3e\n<button tabindex="1">First</button>\n<input tabindex="2" type="text">\n<button tabindex="3">Last</button>\n```',"2.4.1":'## Bypass Blocks Remediation\n\n- **Skip links**: Provide skip navigation links\n- **Landmarks**: Use semantic HTML5 landmarks\n- **Headings**: Proper heading structure for navigation\n- **ARIA**: Use ARIA landmarks when needed\n\n```html\n\x3c!-- Skip link --\x3e\n<a href="#main" class="skip-link">Skip to main content</a>\n\n\x3c!-- Landmarks --\x3e\n<nav aria-label="Main navigation">\n<main id="main">\n<aside aria-label="Sidebar">\n```',"3.1.1":'## Language Identification Remediation\n\n- **Page language**: Set lang attribute on html element\n- **Content language**: Set lang for content in different languages\n- **Screen readers**: Helps with pronunciation\n- **Translation tools**: Enables proper translation\n\n```html\n\x3c!-- Page language --\x3e\n<html lang="en">\n\n\x3c!-- Content in different language --\x3e\n<p lang="es">Hola, \xbfc\xf3mo est\xe1s?</p>\n```',"4.1.1":"## Parsing Remediation\n\n- **Valid HTML**: Ensure valid, well-formed markup\n- **Nested elements**: Proper nesting of elements\n- **Duplicate IDs**: No duplicate id attributes\n- **Closing tags**: All elements properly closed\n\n```html\n\x3c!-- Valid HTML structure --\x3e\n<div>\n  <p>Valid paragraph</p>\n  <ul>\n    <li>List item</li>\n  </ul>\n</div>\n```","4.1.2":'## Name, Role, Value Remediation\n\n- **Custom controls**: Ensure proper name, role, and value\n- **ARIA attributes**: Use appropriate ARIA attributes\n- **State changes**: Communicate state changes to assistive technology\n- **Testing**: Test with screen readers\n\n```html\n\x3c!-- Custom button with proper ARIA --\x3e\n<button \n  role="button" \n  aria-label="Close dialog"\n  aria-expanded="false"\n  aria-controls="dialog">\n  \xd7\n</button>\n```'})[e.wcagId]||"## ".concat(e.title," Remediation\n\nThis criterion requires attention to ensure accessibility compliance. Please refer to the official WCAG documentation for detailed remediation guidance.\n\n**Key areas to address:**\n- Review the specific requirements for ").concat(e.title,"\n- Test with assistive technologies\n- Implement proper semantic markup\n- Ensure programmatic access to all functionality\n\n**Testing checklist:**\n- [ ] Manual testing with screen reader\n- [ ] Keyboard-only navigation\n- [ ] Color contrast verification\n- [ ] Semantic markup validation")}(e),helpLink:e.understandingUrl,tags:[e.principle,e.wcagVersion]})),es={alt_missing:"Missing Alternative Text",alt_link_missing:"Linked Image Missing Alternative Text",alt_spacer_missing:"Spacer Image Missing Alternative Text",alt_input_missing:"Image Button Missing Alternative Text",alt_area_missing:"Image Map Area Missing Alternative Text",alt_map_missing:"Image Map Missing Alternative Text",longdesc_invalid:"Invalid Long Description",label_missing:"Missing Label",label_empty:"Empty Label",label_multiple:"Multiple Labels",title_invalid:"Invalid Title",language_missing:"Missing or Invalid Page Language",meta_refresh:"Page refreshes or redirects",heading_empty:"Empty Heading",button_empty:"Empty Button",link_empty:"Empty Link",link_skip_broken:"Broken Skip Link",th_empty:"Empty Table Header",blink:"Blinking Content",marquee:"Marquee",alt_suspicious:"Suspicious Alternative Text",alt_redundant:"Redundant Alternative Text",alt_duplicate:"Duplicate Alternative Text",alt_long:"Long Alternative Text",label_orphaned:"Orphaned Label",fieldset_missing:"Missing Fieldset",legend_missing:"Missing Legend",label_title:"Label as Title",heading_missing:"Missing Heading",h1_missing:"Missing H1 Heading",heading_skipped:"Skipped Heading",heading_possible:"Possible Heading",table_caption_possible:"Possible Table Caption",link_internal_broken:"Broken Internal Link",link_suspicious:"Suspicious Link",link_redundant:"Redundant Link",link_word:"Word Link",link_excel:"Excel Link",link_powerpoint:"PowerPoint Link",link_pdf:"PDF Link",link_document:"Document Link",audio_video:"Audio/Video Element",flash:"Flash Element",applet:"Applet Element",plugin:"Plugin Element",n
1oscript:"NoScript Element",event_handler:"Event Handler",javascript_jumpmenu:"JavaScript Jump Menu",accesskey:"Access Key",tabindex:"Tab Index",text_small:"Small Text",underline:"Underline",title_redundant:"Redundant Title",text_justified:"Justified Text",alt:"Alternative Text",alt_null:"Null Alternative Text",alt_spacer:"Alternative Text for Spacer",alt_link:"Alternative Text for Link",alt_input:"Alternative Text for Input",alt_map:"Alternative Text for Map",alt_area:"Alternative Text for Area",longdesc:"Long Description",label:"Label",fieldset:"Fieldset",link_skip:"Skip Link",link_skip_target:"Skip Link Target",lang:"Language",table_layout:"Table Layout",table_data:"Table Data",table_caption:"Table Caption",th:"Table Header",th_col:"Table Column Header",th_row:"Table Row Header",h1:"H1 Heading",h2:"H2 Heading",h3:"H3 Heading",h4:"H4 Heading",h5:"H5 Heading",h6:"H6 Heading",ol:"Ordered List",ul:"Unordered List",dl:"Definition List",iframe:"iFrame",nav:"Navigation",main:"Main Content",header:"Header",aside:"Aside",html5_video_audio:"HTML5 Video/Audio Element",aria:"ARIA Element",aria_label:"ARIA Label",aria_tabindex:"ARIA Tab Index",search:"Search Element",aria_reference_broken:"Broken ARIA Reference",contrast:"Low contrast",footer:"Footer",aria_menu_broken:"Broken ARIA Menu",region_missing:"Missing Region",aria_describedby:"ARIA Described By",aria_button:"ARIA Button",aria_live_region:"ARIA Live Region",aria_menu:"ARIA Menu",aria_hidden:"ARIA Hidden",aria_expanded:"ARIA Expanded",aria_haspopup:"ARIA Has Popup",select_missing_label:"Missing Label in Select Element",figure:"Figure",region:"Region",list_possible:"Possible List",youtube_video:"YouTube Video",image_title:"Image Title"},el={Ed508:"Ed508",EdCrawler:"EdCrawler",EdReadable:"EdReadable",EdAspose:"EdAspose"},ec=Object.entries(ei).flatMap(e=>{let[n,t]=e;return t.filter(e=>e.column&&e.term).map(e=>({id:"internal-".concat(n.toLowerCase(),"-").concat(e.column.toLowerCase().replace(/[^a-z0-9]+/g,"-")),category:"internal",columnName:e.term,explanation:"Internal glossary mapping from ".concat(el[n],"."),internalFieldName:e.column,internalSystem:n,remediationGuidelines:"## ".concat(e.term,"\n\n- **Source system**: ").concat(el[n],"\n- **Internal column name**: `").concat(e.column,"`\n- **Natural language term**: ").concat(e.term)}))}),ed=[{id:"wcag",name:"WCAG 2.2",description:"Web Content Accessibility Guidelines 2.2 success criteria for web accessibility compliance",rows:eo},{id:"pdfua",name:"PDF/UA",description:"PDF/UA glossary using EdAspose natural language terms, internal column names, categories, and tooltips",rows:(er.Z||[]).filter(e=>e.column&&e.term).map(e=>({id:"pdfua-catalog-".concat(e.column.toLowerCase().replace(/[^a-z0-9]+/g,"-")),category:"pdfua",columnName:e.term,pdfuaClause:e.column,pdfuaCode:e.category||"Uncategorized",explanation:e.tooltip||"Internal PDF/UA glossary term from EdAspose: ".concat(e.column,"."),remediationGuidelines:"## ".concat(e.term,"\n\n- **Internal column name**: `").concat(e.column,"`\n- **Category**: ").concat(e.category||"Uncategorized","\n- **Tooltip**: ").concat(e.tooltip||"Not provided"),helpLink:"https://www.iso.org/standard/64599.html"}))},{id:"wave",name:"WAVE",description:"WebAIM WAVE tool evaluation categories for web accessibility testing",rows:[{id:"wave-alt-missing",category:"wave",columnName:"alt_missing",waveType:"Error",explanation:"Image alternative text is not present. Each image must have an alt attribute.",remediationGuidelines:'## Missing Alternative Text (alt_missing)\n\n### What It Means\n\nImage alternative text is not present.\n\n### Why It Matters\n\nEach image must have an alt attribute. Without alternative text, the content of an image will not be available to screen reader users or when the image is unavailable.\n\n### What To Do\n\nAdd an alt attribute to the image. The attribute value should accurately and succinctly present the content and function of the image. If the content of the image is conveyed in the context or surroundings of the image, or if the image does not convey content or have a function, it should be given empty/null alternative text (`alt=""`).\n\n### Examples\n\n```html\n\x3c!-- Informative image with descriptive alt text --\x3e\n<img src="chart.png" alt="Sales increased 25% from Q1 to Q2">\n<img src="logo.png" alt="Accessible Solutions Inc. Logo">\n\n\x3c!-- Decorative image with empty alt --\x3e\n<img src="decoration.png" alt="" role="presentation">\n\n\x3c!-- Complex image with extended description --\x3e\n<img src="flowchart.png" alt="Process flowchart showing user registration steps">\n```\n\n### Best Practices\n\n- **Informative images**: Provide descriptive alt text that conveys content and purpose\n- **Decorative images**: Use `alt=""` and optionally `role="presentation"`\n- **Functional images** (buttons, links): Describe the function (e.g., "Submit form" not "Submit button")\n- **Complex images**: Provide detailed description; consider longdesc or nearby text\n\n### The Algorithm\n\nAn image does not have an alt attribute.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-alt-link-missing",category:"wave",columnName:"alt_link_missing",waveType:"Error",explanation:"An image without alternative text results in an empty link.",remediationGuidelines:'## Linked Image Missing Alternative Text (alt_link_missing)\n\n### What It Means\n\nAn image without alternative text results in an empty link.\n\n### Why It Matters\n\nImages that are the only thing within a link must have descriptive alternative text. If an image is within a link that contains 
1no text and that image does not provide alternative text, a screen reader has no content to present to the user regarding the function of the link.\n\n### What To Do\n\nAdd appropriate alternative text that presents the content of the image and/or the function of the link.\n\n### Examples\n\n```html\n\x3c!-- Good: Image with descriptive alt text in link --\x3e\n<a href="/products">\n  <img src="product-thumb.jpg" alt="View our product catalog">\n</a>\n\n\x3c!-- Good: Image and text in same link (image can have empty alt) --\x3e\n<a href="/contact">\n  <img src="envelope-icon.png" alt="">\n  Contact Us\n</a>\n\n\x3c!-- Good: Descriptive alt describing link function --\x3e\n<a href="/download">\n  <img src="download-icon.png" alt="Download accessibility guidelines PDF">\n</a>\n```\n\n### Best Practices\n\n- Describe the **link destination or function**, not just the image\n- If link contains both image and text, image can have `alt=""`\n- Alt text for linked images should include link purpose\n- Avoid generic text like "link" or "click here"\n\n### The Algorithm\n\nAn image without alternative text (missing alt attribute or an alt value that is null/empty or only space characters) or that is hidden is within a link that does not contain text or an image with alternative text.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)\n- **2.4.4 Link Purpose (In Context)** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-alt-spacer-missing",category:"wave",columnName:"alt_spacer_missing",waveType:"Error",explanation:"A layout spacer image (which should have null/empty alternative text) does not have an alt attribute.",remediationGuidelines:'## Spacer Image Missing Alternative Text (alt_spacer_missing)\n\n### What It Means\n\nA layout spacer image (which should have null/empty alternative text) does not have an alt attribute.\n\n### Why It Matters\n\nSpacer images are used to maintain layout. They do not convey content and should be given null/empty alternative text (`alt=""`) so they are not presented to users and are ignored by screen readers.\n\n### What To Do\n\nIf the image is a spacer image, give the image null/empty alternative text (`alt=""`). Alternatively, consider using CSS instead of spacer images to control positioning and layout.\n\n### Examples\n\n```html\n\x3c!-- Spacer image with empty alt --\x3e\n<img src="spacer.gif" alt="" width="1" height="1">\n\n\x3c!-- Better: Use CSS instead --\x3e\n<div class="spacer" style="width: 1px; height: 1px;"></div>\n\n/* CSS approach */\n.spacer {\n  width: 10px;\n  height: 10px;\n  display: inline-block;\n}\n```\n\n### Modern Approach\n\n```css\n/* Replace spacer images with CSS */\n.layout-spacing {\n  margin: 10px;\n  padding: 10px;\n}\n\n/* Use flexbox or grid instead */\n.container {\n  display: flex;\n  gap: 20px;\n}\n```\n\n### The Algorithm\n\nAn image is missing an alt attribute and has a width or height of 3 pixels or less or has a file name starting with "spacer.*", "space.*", or "blank.*".\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-alt-input-missing",category:"wave",columnName:"alt_input_missing",waveType:"Error",explanation:"Alternative text is not present for a form image button.",remediationGuidelines:'## Image Button Missing Alternative Text (alt_input_missing)\n\n### What It Means\n\nAlternative text is not present for a form image button.\n\n### Why It Matters\n\nImage buttons provide important functionality that must be presented in alternative text. Without alternative text, the function of an image button is not made available to screen reader users or when images are disabled or unavailable.\n\n### What To Do\n\nAdd appropriate alternative text that presents the function of the image button.\n\n### Examples\n\n```html\n\x3c!-- Image button with descriptive alt --\x3e\n<input type="image" src="search-button.gif" alt="Search">\n\n\x3c!-- Image button with function description --\x3e\n<input type="image" src="submit-icon.png" alt="Submit form">\n\n\x3c!-- Image button with clear action --\x3e\n<input type="image" src="save-button.jpg" alt="Save document">\n```\n\n### Best Practices\n\n- Describe the **button function**, not appearance\n- Use action verbs (Submit, Search, Save, Delete)\n- Be specific about what action occurs\n- Example: "Search products" not "Search button image"\n\n### The Algorithm\n\nAn image button (`<input type="image">`) does not have an alt attribute or has an alt value that is null/empty (`alt=""`) or only space characters.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)\n- **2.4.4 Link Purpose (In Context)** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-alt-area-missing",category:"wave",columnName:"alt_area_missing",waveType:"Error",explanation:"Alternative text is not present for an image map area (hot spot).",remediationGuidelines:'## Image Map Area Missing Alternative Text (alt_area_missing)\n\n### What It Means\n\nAlternative text is not present for an image map area (hot spot).\n\n### Why It Matters\n\nImage map areas or clickable hot spots provide important functionality that must be provided in alternative text. Without alternative text, the function of the area is not made available to screen reader users or when images are unavailable.\n\n### What To Do\n\nAdd a descriptive alt attribute value to each area element. Additionally, ensure that the area elements are listed in the code in a logical, intuitive order (e.g., matching the visual order, alphabetically, etc.).\n\n### Examples\n\n```html\n\x3c!-- Image map with properly labeled areas --\x3e\n<img src="us-map.jpg" alt="United States map" usemap="#usamap">\n<map name="usamap">\n  <area shape="rect" coords="0,0,100,50" href="/northeast" alt="Northeast region">\n  <area shape="rect" coords="100,0,200,50" href="/south" alt="South region">\n  <area shape="rect" coords="0,50,100,100" href="/west" alt="West region">\n</map>\n\n\x3c!-- Ensure logical order matches visual order --\x3e\n```\n\n### Best Practices\n\n- Describe the **function or destination** of each hot spot\n- List areas in logical order (visual order, left-to-right, top-to-bottom)\n- Ensure main image has appropriate alt (usually empty if areas convey all content)\n\n### The Algorithm\n\nAn area element does not have the alt attribute or has an alt value that is null/empty (`alt=""`) or only space characters.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)\n- **2.4.4 Link Purpose (In Context)** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-alt-map-missing",category:"wave",columnName:"alt_map_missing",waveType:"Error",explanation:"An image that has hot spots does not have an alt attribute.",remediationGuidelines:'## Image Map Missing Alternative Text (alt_map_missing)\n\n### What It Means\n\nAn image that has hot spots does not have an alt attribute.\n\n### Why It Matters\n\nAny content or function of an image that uses an image map (hot spots) and does not have an alt attribute will not be available to screen reader users or if the image is unavailable.\n\n### What To Do\n\nAdd an alt attribute to the image. Ensure the alt attribute value for the image map image is appropriate. The alternative text is typically null/empty (`alt=""`), unless the image conveys content not conveyed in the hot spot areas.\n\n### Examples\n\n```html\n\x3c!-- Image map with empty alt (content in areas) --\x3e\n<img src="navigation-map.jpg" alt="" usemap="#navmap">\n<map name="navmap">\n  <area shape="rect" coords="0,0,100,50" href="/home" alt="Go to homepage">\n  <area shape="rect" coords="100,0,200,50" href="/about" alt="About us">\n</map>\n\n\x3c!-- Image map with descriptive alt (additional content) --\x3e\n<img src="us-map.jpg" alt="Map of the United States" usemap="#usamap">\n<map name="usamap">\n  <area shape="rect" coords="0,0,100,50" href="/state/ny" alt="New York">\n</map>
1\n```\n\n### Best Practices\n\n- Use `alt=""` if all content is in area elements\n- Provide descriptive alt if image conveys additional information\n- Example: "Map of the United States" for a geographic map\n\n### The Algorithm\n\nAn image element has the usemap attribute and no alt attribute.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-link-empty",category:"wave",columnName:"link_empty",waveType:"Error",explanation:"A link contains no text.",remediationGuidelines:'## Empty Link (link_empty)\n\n### What It Means\n\nA link contains no text.\n\n### Why It Matters\n\nIf a link contains no text, the function or purpose of the link will not be presented to the user. This can introduce confusion for keyboard and screen reader users.\n\n### What To Do\n\nRemove the empty link or provide text within the link that describes the functionality and/or target of that link.\n\n### Examples\n\n```html\n\x3c!-- Add descriptive text content --\x3e\n<a href="/contact">Contact Us</a>\n<a href="/help">Help and Support</a>\n\n\x3c!-- Icon-only link with aria-label --\x3e\n<a href="/help" aria-label="Help and Support">\n  <span class="icon-help" aria-hidden="true"></span>\n</a>\n\n\x3c!-- Image link with alt text --\x3e\n<a href="/products">\n  <img src="products-icon.png" alt="View our products">\n</a>\n\n\x3c!-- Link with visible and accessible text --\x3e\n<a href="/download">\n  <span class="icon-download" aria-hidden="true"></span>\n  Download PDF\n</a>\n```\n\n### Best Practices\n\n- Provide visible text when possible\n- Use `aria-label` for icon-only links\n- Ensure alt text for linked images describes link purpose\n- Avoid links with only decorative images\n\n### The Algorithm\n\nAn anchor element has an href attribute, but contains 
1no text (or only spaces) and no images with alternative text.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **2.4.4 Link Purpose (In Context)** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-label-missing",category:"wave",columnName:"label_missing",waveType:"Error",explanation:"A form control does not have a corresponding label.",remediationGuidelines:'## Missing Form Label (label_missing)\n\n### What It Means\n\nA form control does not have a corresponding label.\n\n### Why It Matters\n\nIf a form control does not have a properly associated text label, the function or purpose of that form control may not be presented to screen reader users. Form labels also provide visible descriptions and larger clickable targets for form controls.\n\n### What To Do\n\nIf a text label for a form control is visible, use the `<label>` element to associate it with its respective form control. If there is no visible label, either provide an associated label, add a descriptive title attribute to the form control, or reference the label(s) using `aria-labelledby`. Labels are not required for image, submit, reset, button, or hidden form controls.\n\n### Examples\n\n```html\n\x3c!-- Proper label association with \'for\' attribute --\x3e\n<label for="email">Email Address</label>\n<input type="email" id="email" name="email">\n\n\x3c!-- Label wrapping form control --\x3e\n<label>\n  Email Address\n  <input type="email" name="email">\n</label>\n\n\x3c!-- Using aria-label --\x3e\n<input type="text" aria-label="Search products" placeholder="Search...">\n\n\x3c!-- Using aria-labelledby --\x3e\n<span id="email-label">Email Address</span>\n<input type="email" aria-labelledby="email-label" name="email">\n\n\x3c!-- Using title (less preferred) --\x3e\n<input type="text" title="Enter your email address" name="email">\n```\n\n### Best Practices\n\n- **Preferred**: Use `<label>` with `for` attribute or wrapping\n- **Fallback**: Use `aria-label` or `aria-labelledby`\n- **Avoid**: Relying only on `placeholder` or `title`\n- Ensure label text is descriptive and matches input purpose\n\n### The Algorithm\n\nAn `<input>` (except types of image, submit, reset, button, or hidden), `<select>`, or `<textarea>` does not have a properly associated label. A properly associated label is:\n- a non-hidden `<label>` element with a for attribute value that is equal to the id of a unique form control\n- a `<label>` element that surrounds the form control\n- a non-empty title attribute, or\n- a non-empty `aria-labelledby` attribute\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)\n- **3.3.2 Labels or Instructions** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-heading-missing",category:"wave",columnName:"heading_missing",waveType:"Alert",explanation:"The page has no headings.",remediationGuidelines:"## No Heading Structure (heading_missing)\n\n### What It Means\n\nThe page has no headings.\n\n### Why It Matters\n\nHeadings (`<h1>`-`<h6>`) provide important document structure, outlines, and navigation functionality to assistive technology users.\n\n### What To Do\n\nProvide a clear, consistent heading structure, generally one `<h1>` and sub-headings as appropriate. Except for very simple pages, most web pages should have a heading structure.\n\n### Examples\n\n```html\n\x3c!-- Proper heading hierarchy --\x3e\n<h1>Main Page Title</h1>\n  <h2>Section Title</h2>\n    <h3>Subsection Title</h3>\n      <h4>Details</h4>\n    <h3>Another Subsection</h3>\n  <h2>Another Section</h2>\n\n\x3c!-- Logical document outline --\x3e\n<h1>Accessibility Guidelines</h1>\n  <h2>Introduction</h2>\n  <h2>WCAG Requirements</h2>\n    <h3>Level A</h3>\n    <h3>Level AA</h3>\n  <h2>Implementation</h2>\n```\n\n### Best Practices\n\n- Use one `<h1>` per page (main title)\n- Maintain logical hierarchy (don't skip levels)\n- Use headings to structure content, not for styling\n- Headings should describe the content that follows\n\n### The Algorithm\n\nNo `<h1>`-`<h6>` elements are present in the page.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)",helpLink:"https://wave.webaim.org/"},{id:"wave-h1-missing",category:"wave",columnName:"h1_missing",waveType:"Alert",explanation:"A page does not have a first level heading.",remediationGuidelines:"## Missing First Level Heading (h1_missing)\n\n### What It Means\n\nA page does not have a first level heading.\n\n### Why It Matters\n\nHeadings facilitate page navigation for users of many assistive technologies. They also provide semantic and visual meaning and structure to the document. A first level heading (`<h1>`) should be present on nearly all pages. It should contain the most important heading on the page (generally the document title).\n\n### What To Do\n\nIf the page presents a main heading, place it within an `<h1>` element. Add other sub-headings as necessary.\n\n### Examples\n\n```html\n\x3c!-- Single main heading --\x3e\n<h1>Welcome to Our Website</h1>\n  <h2>About Us</h2>\n  <h2>Our Services</h2>\n\n\x3c!-- Multiple h1s can be used per sectioning elements --\x3e\n<article>\n  <h1>Main Article Title</h1>\n</article>\n<aside>\n  <h1>Related Content</h1>\n</aside>\n```\n\n### Best Practices\n\n- Use `<h1>` for the most important heading (page title)\n- Only one `<h1>` per page (unless using HTML5 sectioning)\n- `<h1>` should describe the page purpose\n- Follow with `<h2>`, `<h3>`, etc. for subsections\n\n### The Algorithm\n\nA page does not have an `<h1>` element.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)",helpLink:"https://wave.webaim.org/"},{id:"wave-contrast",category:"wave",columnName:"contrast",waveType:"Error",explanation:"Very low contrast between text and background colors.",remediationGuidelines:"## Very Low Contrast (contrast)\n\n### What It Means\n\nVery low contrast between text and background colors.\n\n### Why It Matters\n\nAdequate contrast of text is necessary for all users, especially users with low vision.\n\n### What To Do\n\nIncrease the contrast between the foreground (text) color and the background color. Large text (larger than 18 point or 14 point bold) does not require as much contrast as smaller text.\n\n### Examples\n\n```css\n/* Good contrast ratios - Normal text (4.5:1 minimum) */\n.good-contrast {\n  color: #000000;        /* Black */\n  background: #ffffff;   /* White - Ratio: 21:1 */\n}
1\n\n.good-contrast-alt {\n  color: #333333;        /* Dark gray */\n  background: #ffffff;   /* White - Ratio: 12.6:1 */\n}\n\n/* Large text (3:1 minimum) */\n.large-text {\n  color: #666666;        /* Medium gray */\n  background: #ffffff;   /* White - Ratio: 5.74:1 */\n  font-size: 18pt;       /* or 14pt bold */\n}\n\n/* Avoid low contrast */\n.bad-contrast {\n  color: #cccccc;        /* Light gray */\n  background: #ffffff;   /* White - Ratio: 1.6:1 ❌ */\n}\n```\n\n### Contrast Requirements\n\n- **Normal text**: Minimum 4.5:1 contrast ratio\n- **Large text** (18pt+ or 14pt+ bold): Minimum 3:1 contrast ratio\n- **WCAG AAA**: 7:1 for normal text, 4.5:1 for large text\n\n### Tools\n\n- WebAIM Contrast Checker\n- Colour Contrast Analyser\n- Browser DevTools Accessibility panel\n\n### The Algorithm\n\nText is present that has a contrast ratio less than 4.5:1, or large text (larger than 18 point or 14 point bold) has a contrast ratio less than 3:1.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.4.3 Contrast (Minimum)** (Level AA)",helpLink:"https://wave.webaim.org/"},{id:"wave-language-missing",category:"wave",columnName:"language_missing",waveType:"Error",explanation:"The language of the document is not identified or a lang attribute value is invalid.",remediationGuidelines:'## Language Missing or Invalid (language_missing)\n\n### What It Means\n\nThe language of the document is not identified or a lang attribute value is invalid.\n\n### Why It Matters\n\nIdentifying the language of the page or page elements allows screen readers to read the content in the appropriate language. It also facilitates automatic translation of content.\n\n### What To Do\n\nIdentify the document language using the `<html lang>` attribute with a valid value. Ensure that all lang attribute values are valid.\n\n### Examples\n\n```html\n\x3c!-- Document language --\x3e\n<html lang="en">\n<head>\n  <title>My Page</title>\n</head>\n<body>\n  \x3c!-- Content in different language --\x3e\n  <p lang="es">Hola, \xbfc\xf3mo est\xe1s?</p>\n  \n  \x3c!-- Back to main language --\x3e\n  <p>This is English text again.</p>\n</body>\n</html>\n\n\x3c!-- Valid language codes --\x3e\n<html lang="en">      \x3c!-- English --\x3e\n<html lang="en-US">   \x3c!-- US English --\x3e\n<html lang="es">      \x3c!-- Spanish --\x3e\n<html lang="fr">      \x3c!-- French --\x3e\n<html lang="de">      \x3c!-- German --\x3e\n```\n\n### Language Code Format\n\n- Use ISO 639-1 two-letter codes (e.g., "en", "es", "fr")\n- Can include region code (e.g., "en-US", "en-GB", "es-MX")\n- Must be valid BCP 47 language tag\n\n### Best Practices\n\n- Always set `lang` on `<html>` element\n- Use `lang` attribute on elements with different languages\n- Use proper ISO language codes\n- Update lang when language changes\n\n### The Algorithm\n\nThe `<html lang>` attribute is missing or is empty, or a lang attribute value is not a valid language identifier.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **3.1.1 Language of Page** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-title-invalid",category:"wave",columnName:"title_invalid",waveType:"Error",explanation:"The page title is missing or not descriptive.",remediationGuidelines:'## Missing or Uninformative Page Title (title_invalid)\n\n### What It Means\n\nThe page title is missing or not descriptive.\n\n### Why It Matters\n\nA descriptive title helps users understand a page\'s purpose or content. Without a proper title, many users (especially those using screen readers or other assistive technology) may have difficulty orienting themselves to the page.\n\n### What To Do\n\nAdd a brief, descriptive page title.\n\n### Examples\n\n```html\n\x3c!-- Descriptive page title --\x3e\n<title>Accessibility Guidelines - WCAG 2.2 Compliance Guide</title>\n\n\x3c!-- Good: Includes site and page context --\x3e\n<title>About Us - Accessible Solutions Inc.</title>\n\n\x3c!-- Good: Specific and descriptive --\x3e\n<title>Contact Us - Customer Support | OurCompany</title>\n\n\x3c!-- Bad: Generic or missing --\x3e\n<title>Untitled Document</title>\n<title>Page 1</title>\n<title></title>\n```\n\n### Best Practices\n\n- **Be specific**: Describe the page content\n- **Be concise**: 50-60 characters recommended\n- **Include context**: Site name and page name\n- **Use title hierarchy**: Consistent format across site\n- **Avoid generic**: No "Untitled" or "Page 1"\n\n### Title Structure Examples\n\n```\n✅ Good: "Products - Electronics | TechStore"\n✅ Good: "Contact Us - Accessible Solutions"\n✅ Bad: "Untitled"\n✅ Bad: "Home"\n```\n\n### The Algorithm\n\nThe page title is missing, empty, contains only whitespace characters, or begins with "untitled".\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **2.4.2 Page Titled** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-label-empty",category:"wave",columnName:"label_empty",waveType:"Error",explanation:"A form label is present, but does not contain any content.",remediationGuidelines:'## Empty Form Label (label_empty)\n\n### What It Means\n\nA form label is present, but does not contain any content.\n\n### Why It Matters\n\nA `<label>` element that is associated to a form control but does not contain text will not present any information about the form control to the user.\n\n### What To Do\n\nEnsure that the form label contains text that describes the function of the associated form control. Labels are not required for image, submit, reset, button, or hidden form controls. If a label is not necessary visually, a descriptive title attribute may be added to the form control.\n\n### Examples\n\n```html\n\x3c!-- Good: Label with text --\x3e\n<label for="email">Email Address</label>\n<input type="email" id="email" name="email">\n\n\x3c!-- Bad: Empty label --\x3e\n<label for="email"></label>\n<input type="email" id="email" name="email">\n\n\x3c!-- Fix: Add text to label --\x3e\n<label for="email">Email Address</label>\n<input type="email" id="email" name="email">\n\n\x3c!-- Alternative: Use aria-label if no visible label --\x3e\n<input type="email" aria-label="Email Address" name="email">\n```\n\n### Best Practices\n\n- Labels must contain descriptive text\n- Text should clearly describe the input purpose\n- If label text isn\'t visible, use aria-label instead\n- Remove empty labels that aren\'t needed\n\n### The Algorithm\n\nA form label is present and associated with an existing form control (using for/id or surrounds the form control), but does not contain any text or images with alternative text.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)\n- **3.3.2 Labels or Instructions** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-label-multiple",category:"wave",columnName:"label_multiple",waveType:"Error",explanation:"A form control has more than one label associated with it.",remediationGuidelines:'## Multiple Form Labels (label_multiple)\n\n### What It Means\n\nA form control has more than one label associated with it.\n\n### Why It Matters\n\nA form control should have at most one associated label element. If more than one label element is associated to the control, assistive technology may not read the appropriate label.\n\n### What To Do\n\nEnsure that at most one label element is associated to the form control. If multiple form labels are necessary, use `aria-labelledby`.\n\n### Examples\n\n```html\n\x3c!-- Bad: Multiple labels for same control --\x3e\n<label for="email">Email</label>\n<label for="email">Email Address</label>\n<input type="email" id="email" name="email">\n\n\x3c!-- Good: Single label --\x3e\n<label for="email">Email Address</label>\n<input type="email" id="email" name="email">\n\n\x3c!-- Good: Multiple labels using aria-labelledby --\x3e\n<span id="email-label">Email</span>\n<span id="email-required">(Required)</span>\n<input type="email" aria-labelledby="email-label email-required" name="email">\n\n\x3c!-- Good: Single wrapping label --\x3e\n<label>\n  Email Address\n  <input type="email" name="email">\n</label>\n```\n\n### Best Practices\n\n- Use only one `<label>` element per form control\n- Use `aria-labelledby` to reference multiple text elements\n- Combine label text when multiple labels exist\n- Remove duplicate labels\n\n### The Algorithm\n\nTwo or more `<label>`s are associated to a single `<input>` (except types of image, submit, reset, button, or hidden), `<select>`, or `<textarea>`.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)\n- **3.3.2 Labels or Instructions** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-alt-suspicious",category:"wave",columnName:"alt_suspicious",waveType:"Warning",explanation:"Alternative text is likely insufficient or contains extraneous information.",remediationGuidelines:'## Suspicious Alternative Text (alt_suspicious)\n\n### What It Means\n\nAlternative text is likely insufficient or contains extraneous information.\n\n### Why It Matters\n\nIf the alternative text for an image does not provide the same content or information conveyed by the image, that c
1ontent will not be available to screen reader users and when images are unavailable.\n\n### What To Do\n\nEnsure that the alternative text for the image or image input provides a succinct, yet equivalent alternative to the content and function of the image. Screen readers and browser presentation inform the user that the object is an image, so alternative text of "image of..." (and similar) should be avoided. If the image does not convey content or if the content is presented in nearby text (e.g., a caption), null/empty alternative text (`alt=""`) is appropriate.\n\n### Examples\n\n```html\n\x3c!-- Bad: Contains "image of" or file name --\x3e\n<img src="chart.png" alt="image of chart">\n<img src="photo.jpg" alt="photo.gif">\n<img src="logo.png" alt="graphic">\n\n\x3c!-- Bad: Generic terms --\x3e\n<img src="chart.png" alt="image">\n<img src="logo.png" alt="logo">\n\n\x3c!-- Good: Descriptive without redundant words --\x3e\n<img src="chart.png" alt="Quarterly sales chart showing 25% growth">\n<img src="logo.png" alt="Accessible Solutions Inc.">\n<img src="photo.jpg" alt="Team members working at conference table">\n\n\x3c!-- Good: Empty alt for decorative images --\x3e\n<img src="decoration.png" alt="">\n```\n\n### Terms to Avoid\n\n```\n❌ "image of", "graphic of", "bullet"\n❌ "image", "graphic", "photo", "photograph"\n❌ "drawing", "painting", "artwork"\n❌ "logo", "button", "arrow"\n❌ "more", "spacer", "blank"\n❌ "chart", "table", "diagram", "graph"\n❌ File names (e.g., "photo.gif")\n```\n\n### The Algorithm\n\nThe alt text value of an image or image button begins with "graphic of", "bullet", or "image of"; ends with "image" or "graphic"; contains only space characters (`alt=" "`); is an image file name; or is one of the prohibited generic terms.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-alt-redundant",category:"wave",columnName:"alt_redundant",waveType:"Warning",explanation:"The alternative text for an image is the same as nearby or adjacent text.",remediationGuidelines:'## Redundant Alternative Text (alt_redundant)\n\n### What It Means\n\nThe alternative text for an image is the same as nearby or adjacent text.\n\n### Why It Matters\n\nAlternative text that is the same as nearby or adjacent text will be presented multiple times to screen readers or when images are unavailable.\n\n### What To Do\n\nChange either the alternative text or the adjacent text to eliminate the redundancy. In most cases, you can give the image empty/null alternative text (`alt=""`) because the content of the image is already provided in context through text. Linked images may often be combined with the adjacent text into one link, in which case the image may be given null/empty alternative text (`alt=""`).\n\n### Examples\n\n```html\n\x3c!-- Bad: Redundant alt and text --\x3e\n<img src="logo.png" alt="Company Logo">\n<h1>Company Logo</h1>\n\n\x3c!-- Good: Empty alt when text provides context --\x3e\n<img src="logo.png" alt="">\n<h1>Company Logo</h1>\n\n\x3c!-- Bad: Alt same as caption --\x3e\n<img src="chart.png" alt="Sales increased 25%">\n<p>Sales increased 25%</p>\n\n\x3c!-- Good: Image with empty alt, caption provides description --\x3e\n<img src="chart.png" alt="">\n<figcaption>Sales increased 25% from Q1 to Q2</figcaption>\n\n\x3c!-- Bad: Linked image with redundant text --\x3e\n<a href="/products">\n  <img src="product.jpg" alt="View Products">\n  View Products\n</a>\n\n\x3c!-- Good: Combine into one link, image has empty alt --\x3e\n<a href="/products">\n  <img src="product.jpg" alt="">\n  View Products\n</a>\n```\n\n### Best Practices\n\n- If adjacent text describes the image, use `alt=""`\n- For captions or nearby text, empty alt is appropriate\n- Linked images with text can have empty alt\n- Remove redundancy to avoid duplicate announcements\n\n### The Algorithm\n\nThe alternative text is the same as text that is within 15 characters of the image.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-heading-empty",category:"wave",columnName:"heading_empty",waveType:"Error",explanation:"A heading contains 
1no content.",remediationGuidelines:'## Empty Heading (heading_empty)\n\n### What It Means\n\nA heading contains no content.\n\n### Why It Matters\n\nSome users, especially keyboard and screen reader users, often navigate by heading elements. An empty heading will present no information and may introduce confusion.\n\n### What To Do\n\nEnsure that all headings contain informative content.\n\n### Examples\n\n```html\n\x3c!-- Bad: Empty heading --\x3e\n<h2></h2>\n<h3>   </h3> \x3c!-- Only spaces --\x3e\n\n\x3c!-- Good: Heading with content --\x3e\n<h2>Introduction to Accessibility</h2>\n<h3>WCAG Guidelines</h3>\n\n\x3c!-- Good: Heading with text and image --\x3e\n<h2>\n  <img src="icon.png" alt="">\n  Section Title\n</h2>\n\n\x3c!-- If heading not needed, remove it --\x3e\n\x3c!-- Don\'t use headings for spacing --\x3e\n```\n\n### Best Practices\n\n- All headings must contain text or images with alt text\n- Remove headings used only for spacing\n- Use CSS for visual spacing, not empty headings\n- Headings should describe the content section\n\n### The Algorithm\n\nA heading element is present that contains no text (or only spaces) and no images with alternative text.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.1 Bypass Blocks** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)',helpLink:"https://wave.webaim.org/"},{id:"wave-button-empty",category:"wave",columnName:"button_empty",waveType:"Error",explanation:"A button is empty or has no value text.",remediationGuidelines:'## Empty Button (button_empty)\n\n### What It Means\n\nA button is empty or has no value text.\n\n### Why It Matters\n\nWhen navigating to a button, descriptive text must be presented to screen reader users to indicate the function of the button.\n\n### What To Do\n\nPlace text content within the `<button>` element or give the `<input>` element a value attribute.\n\n### Examples\n\n```html\n\x3c!-- Good: Button with text content --\x3e\n<button>Submit</button>\n<button>Save Changes</button>\n<button>Cancel</button>\n\n\x3c!-- Good: Button with icon and text --\x3e\n<button>\n  <span class="icon-save" aria-hidden="true"></span>\n  Save Document\n</button>\n\n\x3c!-- Good: Icon-only button with aria-label --\x3e\n<button aria-label="Close dialog">\n  <span class="icon-close" aria-hidden="true"></span>\n</button>\n\n\x3c!-- Good: Input button with value --\x3e\n<input type="button" value="Submit">\n<input type="submit" value="Send Form">\n<input type="reset" value="Clear Form">\n\n\x3c!-- Bad: Empty button --\x3e\n<button></button>\n\n\x3c!-- Bad: Input without value --\x3e\n<input type="submit">\n<input type="button">\n```\n\n### Best Practices\n\n- Always provide visible text or aria-label\n- Use descriptive action words (Submit, Save, Delete)\n- For icon-only buttons, use aria-label\n- Ensure button text is clear and specific\n\n### The Algorithm\n\nA `<button>` element is present that contains no text content (or alternative text), or an `<input type="submit">`, `<input type="button">`, or `<input type="reset">` has an empty or missing value attribute.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)\n- **2.4.4 Link Purpose (In Context)** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-heading-skipped",category:"wave",columnName:"heading_skipped",waveType:"Alert",explanation:"A heading level is skipped.",remediationGuidelines:"## Skipped Heading Level (heading_skipped)\n\n### What It Means\n\nA heading level is skipped.\n\n### Why It Matters\n\nHeadings provide document structure and facilitate keyboard navigation by users of assistive technology. These users may be confused or experience difficulty navigating when heading levels are skipped.\n\n### What To Do\n\nRestructure the document headings to ensure that heading levels are not skipped.\n\n### Examples\n\n```html\n\x3c!-- Bad: Skipped heading level --\x3e\n<h1>Main Title</h1>\n<h3>Section Title</h3> \x3c!-- ERROR: Skipped h2 --\x3e\n  <h4>Subsection</h4>\n\n\x3c!-- Good: Sequential heading levels --\x3e\n<h1>Main Title</h1>\n  <h2>Section Title</h2>\n    <h3>Subsection</h3>\n      <h4>Details</h4>\n\n\x3c!-- Good: Proper hierarchy --\x3e\n<h1>Accessibility Guidelines</h1>\n  <h2>WCAG Requirements</h2>\n    <h3>Level A Criteria</h3>\n    <h3>Level AA Criteria</h3>\n  <h2>Implementation</h2>\n    <h3>HTML Structure</h3>\n```\n\n### Best Practices\n\n- Start with `<h1>` for main title\n- Follow sequential order: H1 → H2 → H3 (no skipping)\n- Maintain logical hierarchy\n- Don't use headings for styling - use CSS\n\n### The Algorithm\n\nA heading level is skipped (e.g., an `<h1>` is followed by an `<h3>`, with no intermediate `<h2>`). Note that an `<h1>` is not required to be the first heading within the document.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.1 Bypass Blocks** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)",helpLink:"https://wave.webaim.org/"},{id:"wave-aria",category:"wave",columnName:"aria",waveType:"Feature",explanation:"An ARIA role, state, or property is present.",remediationGuidelines:'## ARIA Landmark or Region (aria
1)\n\n### What It Means\n\nAn ARIA role, state, or property is present.\n\n### Why It Matters\n\nARIA provides enhanced semantics and accessibility for web content.\n\n### What To Do\n\nEnsure the ARIA role, state, or property is used correctly. Use standard HTML accessibility features when possible. Be aware that support for ARIA is limited in older browsers and assistive technologies.\n\n### Examples\n\n```html\n\x3c!-- ARIA landmarks --\x3e\n<header role="banner">Site Header</header>\n<nav role="navigation">Main Navigation</nav>\n<main role="main">Main Content</main>\n<aside role="complementary">Sidebar</aside>\n<footer role="contentinfo">Footer</footer>\n\n\x3c!-- ARIA regions --\x3e\n<div role="region" aria-labelledby="section-heading">\n  <h2 id="section-heading">Features</h2>\n  <p>Content here...</p>\n</div>\n\n\x3c!-- ARIA states and properties --\x3e\n<button aria-expanded="false" aria-controls="menu">Menu</button>\n<div id="menu" aria-hidden="true">Menu content</div>\n\n\x3c!-- Prefer semantic HTML when possible --\x3e\n<nav aria-label="Main navigation">...</nav>\n<main>...</main>\n```\n\n### Best Practices\n\n- Use semantic HTML5 elements when possible\n- Reserve ARIA for cases where HTML semantics are insufficient\n- Ensure ARIA is properly implemented and tested\n- Test with multiple screen readers\n\n### The Algorithm\n\nAn ARIA role, state, or property is present, excluding landmark roles, aria-labelledby, or aria-describedby which are distinct WAVE items.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **4.1.2 Name, Role, Value** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-language",category:"wave",columnName:"language",waveType:"Feature",explanation:"The language of the document or a page element is identified.",remediationGuidelines:'## Language Specification (language)\n\n### What It Means\n\nThe language of the document or a page element is identified.\n\n### Why It Matters\n\nIdentifying the language of the page or portion of page (if different from the page itself) allows screen readers to read the content appropriately.\n\n### What To Do\n\nEnsure the language is properly identified for the page (e.g., `<html lang="en">`). If content within the page is in a language different than the page\'s language, identify it using a valid lang attribute value.\n\n### Examples\n\n```html\n\x3c!-- Document language --\x3e\n<html lang="en">\n<head>\n  <title>My Page</title>\n</head>\n<body>\n  \x3c!-- Content in different language --\x3e\n  <p lang="es">Hola, \xbfc\xf3mo est\xe1s?</p>\n  \n  \x3c!-- Back to main language (inherits from html) --\x3e\n  <p>This is English text again.</p>\n  \n  \x3c!-- Another language --\x3e\n  <blockquote lang="fr">Je ne sais pas</blockquote>\n</body>\n</html>\n\n\x3c!-- Valid language codes --\x3e\n<html lang="en">      \x3c!-- English --\x3e\n<html lang="en-US">   \x3c!-- US English --\x3e\n<html lang="es-MX">   \x3c!-- Mexican Spanish --\x3e\n<html lang="fr">      \x3c!-- French --\x3e\n```\n\n### Best Practices\n\n- Always set `lang` on `<html>` element\n- Mark language changes within content\n- Use valid ISO 639-1 language codes\n- Include region code when relevant (e.g., "en-US", "en-GB")\n\n### The Algorithm\n\nA document or an element has a valid lang attribute value.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **3.1.2 Language of Parts** (Level AA)',helpLink:"https://wave.webaim.org/"},{id:"wave-link-suspicious",category:"wave",columnName:"link_suspicious",waveType:"Warning",explanation:"Link text contains extraneous text or may not make sense out of context.",remediationGuidelines:'## Suspicious Link Text (link_suspicious)\n\n### What It Means\n\nLink text contains extraneous text or may not make sense out of context.\n\n### Why It Matters\n\nLinks, which are often read out of context, should clearly describe the destination or function of the link. Ambiguous text, text that does not make sense out of context, and extraneous text (such as "click here") can cause confusion and should be avoided.\n\n### What To Do\n\nWhere appropriate, reword the link text so that it is more descriptive of its destination when read out of context. Remove any extraneous text (such as "click here").\n\n### Examples\n\n```html\n\x3c!-- Bad: Generic or ambiguous text --\x3e\n<a href="/contact">click here</a>\n<a href="/help">here</a>\n<a href="/products">more</a>\n<a href="/details">more details</a>\n<a href="/link">link</a>\n<a href="/button">button</a>\n\n\x3c!-- Good: Descriptive link text --\x3e\n<a href="/contact">Contact Us</a>\n<a href="/help">
1Help and Support</a>\n<a href="/products">View Our Products</a>\n<a href="/details">Product Details</a>\n<a href="/documentation">View Documentation</a>\n\n\x3c!-- Good: Link text describes destination --\x3e\n<a href="/privacy-policy.pdf">Privacy Policy (PDF)</a>\n<a href="/contact">Email customer support</a>\n```\n\n### Terms to Avoid\n\n```\n❌ "click here", "click"\n❌ "here", "more", "more...", "details"\n❌ "more details", "link", "button"\n❌ "this page", "continue", "continue reading"\n❌ "read more"\n```\n\n### Best Practices\n\n- Make link text descriptive and self-contained\n- Link text should make sense when read alone\n- Describe destination or action, not appearance\n- Include file type information when relevant\n\n### The Algorithm\n\nA link (including alt text of linked images) contains the phrase "click here" or "click", or the link text is one of the prohibited generic terms.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **2.4.4 Link Purpose (In Context)** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-link-redundant",category:"wave",columnName:"link_redundant",waveType:"Warning",explanation:"Adjacent links go to the same URL.",remediationGuidelines:'## Redundant Link (link_redundant)\n\n### What It Means\n\nAdjacent links go to the same URL.\n\n### Why It Matters\n\nWhen adjacent links go to the same location (such as a linked product image and an adjacent linked product name that go to the same product page) this results in additional navigation and repetition for keyboard and screen reader users.\n\n### What To Do\n\nIf possible, combine the redundant links into one link and remove any redundant text or alternative text (for example, if a product image and product name are in the same link, the image can usually be given `alt=""`).\n\n### Examples\n\n```html\n\x3c!-- Bad: Redundant adjacent links --\x3e\n<a href="/products">\n  <img src="product.jpg" alt="View Product">\n</a>\n<a href="/products">Product Name</a>\n\n\x3c!-- Good: Combined into one link --\x3e\n<a href="/products">\n  <img src="product.jpg" alt="">\n  Product Name\n</a>\n\n\x3c!-- Bad: Multiple links to same page --\x3e\n<a href="/about">About</a>\n<a href="/about">Learn More</a>\n\n\x3c!-- Good: Single descriptive link --\x3e\n<a href="/about">About Us</a>\n```\n\n### Best Practices\n\n- Combine redundant links into one\n- Use empty alt for images in combined links\n- Reduce navigation overhead\n- Improve screen reader experience\n\n### The Algorithm\n\nTwo adjacent links go to the same URL.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **2.4.4 Link Purpose (In Context)** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-longdesc-invalid",category:"wave",columnName:"longdesc_invalid",waveType:"Error",explanation:"The longdesc attribute is not a URL.",remediationGuidelines:'## Invalid Longdesc (longdesc_invalid)\n\n### What It Means\n\nThe longdesc attribute is not a URL.\n\n### Why It Matters\n\nThe longdesc attribute of an image must be a valid URL of a page that contains a description of the image content. A longdesc value that contains image description text will not provide any accessibility information. Due to poor support, a link to the long description content should be used instead of longdesc.\n\n### What To Do\n\nRemove the longdesc attribute and provide a link to the long description content. If the longdesc attribute is maintained, ensure the attribute value is a valid URL/filename.\n\n### Examples\n\n```html\n\x3c!-- Bad: Invalid longdesc --\x3e\n<img src="complex-chart.png" longdesc="This is a complex chart showing...">\n\n\x3c!-- Better: Remove longdesc and use a link --\x3e\n<figure>\n  <img src="complex-chart.png" alt="Quarterly sales data chart">\n  <figcaption>\n    <a href="/chart-description.html">View detailed chart description</a>\n  </figcaption>\n</figure>\n\n\x3c!-- If using longdesc, ensure it\'s a valid URL --\x3e\n<img src="chart.png" longdesc="/chart-description.html" alt="Sales chart">\n```\n\n### Best Practices\n\n- **Avoid longdesc**: Poor browser support; use links instead\n- **Provide alternatives**: Include description in caption or nearby text\n- **Use links**: Create separate page with detailed description\n- **If using longdesc**: Ensure val
1id URL/filename\n\n### The Algorithm\n\nThe longdesc attribute value is empty, is not a URL or filename, or is a URL or filename with an extension of .jpg, .gif, or .png.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-label-orphaned",category:"wave",columnName:"label_orphaned",waveType:"Error",explanation:"A form label is present, but it is not correctly associated with a form control.",remediationGuidelines:'## Orphaned Form Label (label_orphaned)\n\n### What It Means\n\nA form label is present, but it is not correctly associated with a form control.\n\n### Why It Matters\n\nAn incorrectly associated label does not provide functionality or information about the form control to the user. It usually indicates a coding or other form labeling issues.\n\n### What To Do\n\nProperly associate the label with its corresponding form control. If there is no corresponding form control, remove the label. Labels are not appropriate for image, submit, reset, button, or hidden form controls.\n\n### Examples\n\n```html\n\x3c!-- Bad: Label with no \'for\' attribute and doesn\'t wrap control --\x3e\n<label>Email Address</label>\n<input type="email" name="email">\n\n\x3c!-- Bad: Label references non-existent element --\x3e\n<label for="nonexistent">Email</label>\n<input type="email" id="email" name="email">\n\n\x3c!-- Good: Proper association with \'for\' attribute --\x3e\n<label for="email">Email Address</label>\n<input type="email" id="email" name="email">\n\n\x3c!-- Good: Label wrapping the control --\x3e\n<label>\n  Email Address\n  <input type="email" name="email">\n</label>\n```\n\n### Best Practices\n\n- Always associate labels with form controls\n- Use `for` attribute matching input `id`\n- Or wrap the control with the label\n- Remove labels that can\'t be associated\n- Don\'t label image, submit, reset, button, or hidden inputs\n\n### The Algorithm\n\nA `<label>` element does not surround a form control and the for attribute is missing/empty; references an element that is not present in the page; references an element that is not an `<input>`, `<select>` or `<textarea>` element; or references an `<input>` element with image, submit, reset, button, or hidden type.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)\n- **3.3.2 Labels or Instructions** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-label-title",category:"wave",columnName:"label_title",waveType:"Warning",explanation:"A form control does not have a label, but has a title.",remediationGuidelines:'## Unlabeled Form Control with Title (label_title)\n\n### What It Means\n\nA form control does not have a label, but has a title.\n\n### Why It Matters\n\nThe title attribute value for unlabeled form controls will be presented to screen reader users. However, a properly associated text label provides better usability and accessibility and should be used unless the purpose of the form control is intuitive without the label.\n\n### What To Do\n\nIf a visible text label is available for the form control, associate the text label to the form control using the label element. This provides additional functionality for end users because if the label is clicked it will set focus to the form control. If the form control is intuitive without a `<label>`, the title attribute value may be used.\n\n### Examples\n\n```html\n\x3c!-- Bad: Only title attribute, no label --\x3e\n<input type="text" title="Enter your email address" name="email">\n\n\x3c!-- Good: Add proper label --\x3e\n<label for="email">Email Address</label>\n<input type="email" id="email" name="email">\n\n\x3c!-- Good: Label wrapping control --\x3e\n<label>\n  Email Address\n  <input type="email" name="email">\n</label>\n\n\x3c!-- Acceptable: Intuitive control with title --\x3e\n<input type="search" title="Search products" aria-label="Search products">\n```\n\n### Best Practices\n\n- Prefer `<label>` over `title` attribute\n- Labels provide clickable target and better UX\n- Use `aria-label` if label isn\'t visible\n- Title may be acceptable for intuitive controls\n- Test with screen readers\n\n### The Algorithm\n\nAn `<input>` (except types of image, submit, reset, button, or hidden), `<textarea>`, or `<select>` element has a non-empty title attribute value and is missing a label or val
1id aria-labelledby reference.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)\n- **3.3.2 Labels or Instructions** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-select-missing-label",category:"wave",columnName:"select_missing_label",waveType:"Error",explanation:"A select element does not have an associated label",remediationGuidelines:'## Select Missing Label (select_missing_label)\n\n### What It Means\n\nA select element does not have an associated label\n\n### Why It Matters\n\n`<select>` elements must provide descriptive text about their function. This is typically provided via associated label text. If visual label text is not present and if the default select option adequately presents the purpose of the select menu, then an associated label is not necessary.\n\n### What To Do\n\nEnsure that the default option of the select menu presents the purpose of the select menu. If visible label text is present, it is best to associate this text to the select menu.\n\n### Examples\n\n```html\n\x3c!-- Bad: Select without label --\x3e\n<select name="country">\n  <option value="">Select a country</option>\n  <option value="us">United States</option>\n</select>\n\n\x3c!-- Good: Select with label --\x3e\n<label for="country">Country</label>\n<select id="country" name="country">\n  <option value="">Select a country</option>\n  <option value="us">United States</option>\n</select>\n\n\x3c!-- Acceptable: First option describes purpose --\x3e\n<select name="country">\n  <option value="">Select a country</option>\n  <option value="us">United States</option>\n</select>\n```\n\n### Best Practices\n\n- Associate label with select when visible label exists\n- First option can describe purpose if no visible label\n- Use descriptive option text\n- Test with screen readers\n\n### The Algorithm\n\nA `<select>` element is present that does not have an associated label or ARIA label.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)\n- **3.3.2 Labels or Instructions** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-fieldset-missing",category:"wave",columnName:"fieldset_missing",waveType:"Error",explanation:"A group of check boxes or radio buttons is not enclosed in a fieldset.",remediationGuidelines:'## Missing Fieldset (fieldset_missing)\n\n### What It Means\n\nA group of check boxes or radio buttons is not enclosed in a fieldset.\n\n### Why It Matters\n\nA fieldset provides a visual and structural grouping of related form elements. It is typically necessary for groups of check boxes or radio buttons where a higher level description (called a legend) is necessary to understand the function of the check boxes or radio buttons. The description will be identified by a screen reader only if provided in a fieldset legend.\n\n### What To Do\n\nDetermine whether the grouping of check boxes or radio buttons has or needs text that explains the purpose of the check boxes or radio button grouping. If so, mark up the group within a fieldset and put the group description in a legend element.\n\n### Examples\n\n```html\n\x3c!-- Bad: Radio buttons without fieldset --\x3e\n<input type="radio" name="gender" value="male" id="male">\n<label for="male">Male</label>\n<input type="radio" name="gender" value="female" id="female">\n<label for="female">Female</label>\n\n\x3c!-- Good: Radio buttons with fieldset and legend --\x3e\n<fieldset>\n  <legend>Gender</legend>\n  <input type="radio" name="gender" value="male" id="male">\n  <label for="male">Male</label>\n  <input type="radio" name="gender" value="female" id="female">\n  <label for="female">Female</label>\n</fieldset>\n\n\x3c!-- Good: Checkboxes with fieldset --\x3e\n<fieldset>\n  <legend>Interests (select all that apply)</legend>\n  <input type="checkbox" id="sports" name="interests" value="sports">\n  <label for="sports">Sports</label>\n  <input type="checkbox" id="music" name="interests" value="music">\n  <label for="music">Music</label>\n</fieldset>\n```\n\n### Best Practices\n\n- Use fieldset for related radio buttons/checkboxes\n- Add legend to describe the group\n- Fieldset provides visual and programmatic grouping\n- Screen readers announce legend with each control\n\n### The Algorithm\n\nTwo or more checkbox or radio input elements within a form have the same name value, but are not enclosed in a fieldset.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)\n- **3.3.2 Labels or Instructions** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-legend-missing",category:"wave",columnName:"legend_missing",waveType:"Error",explanation:"A fieldset does not have a legend.",remediationGuidelines:'## Fieldset Missing Legend (legend_missing)\n\n### What It Means\n\nA fieldset does not have a legend.\n\n### Why It Matters\n\nA fieldset legend presents a description of the form elements within a fieldset and is especially useful to screen reader users. A legend should be provided when a higher level description is necessary for groups of check boxes, radio buttons, or other form controls.\n\n### What To Do\n\nIf a higher level description is necessary for the user to understand the function or purpose of the controls within the fieldset, provide this description within the `<legend>`. If this description or grouping is not necessary, the fieldset should probably be removed. Note that the legend is repeated to screen reader users for each form control within the fieldset.\n\n### Examples\n\n```html\n\x3c!-- Bad: Fieldset without legend --\x3e\n<fieldset>\n  <input type="radio" name="size" value="small" id="small">\n  <label for="small">Small</label>\n  <input type="radio" name="size" value="large" id="large">\n  <label for="large">Large</label>\n</fieldset>\n\n\x3c!-- Good: Fieldset with legend --\x3e\n<fieldset>\n  <legend>Choose a size</legend>\n  <input type="radio" name="size" value="small" id="small">\n  <label for="small">Small</label>\n  <input type="radio" name="size" value="large" id="large">\n  <label for="large">Large</label>\n</fieldset>\n```\n\n### Best Practices\n\n- Always include legend when fieldset is used\n- Legend should describe the group purpose\n- Keep legend text concise\n- Remove fieldset if legend not needed\n\n### The Algorithm\n\nA fieldset does not have a legend or the legend is empty.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)\n- **3.3.2 Labels or Instructions** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-region-missing",category:"wave",columnName:"region_missing",waveType:"Alert",explanation:"No page regions or ARIA landmarks were found.",remediationGuidelines:'## No Page Regions (region_missing)\n\n### What It Means\n\nNo page regions or ARIA landmarks were found.\n\n### Why It Matters\n\nRegions and ARIA landmarks identify significant page areas. Most web pages should have regions defined, particularly for the main content area.\n\n### What To Do\n\nIf the page has visual regions or significant page areas, ensure the regions are defined with header, nav, main, footer, etc. elements.\n\n### Examples\n\n```html\n\x3c!-- Good: Semantic HTML5 regions --\x3e\n<header>\n  <h1>Site Title</h1>\n  <nav>\n    <ul>\n      <li><a href="/">Home</a></li>\n    </ul>\n  </nav>\n</header>\n<main>\n  <h1>Page Title</h1>\n  <p>Main content...</p>\n</main>\n<aside>\n  <h2>Sidebar</h2>\n  <p>Related content...</p>\n</aside>\n<footer>\n  <p>Copyright information</p>\n</footer>\n```\n\n### Best Practices\n\n- Use semantic HTML5 elements (`<header>`, `<nav>`, `<main>`, `<footer>`)\n- Add ARIA landmarks if HTML5 not available\n- Ensure main content area is identified\n- Regions aid screen reader navigation\n\n### The Algorithm\n\nNo header, nav, main, footer, or aside HTML regions, or banner, navigation, main, or contentinfo landmark roles were present in the page.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.1 Bypass Blocks** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-heading-possible",category:"wave",columnName:"heading_possible",waveType:"Alert",explanation:"Text appears to be a heading but is not a heading element.",remediationGuidelines:'## Possible Heading (heading_possible)\n\n### What It Means\n\nText appears to be a heading but is not a heading element.\n\n### Why It Matters\n\nHeading elements (`<h1>`-`<h6>`) provide important document structure, outlines, and navigation functionality to assistive technology users. If heading text is not a true heading, this information and functionality will not be available for that text.\n\n### What To Do\n\nIf the paragraph is a section heading, use a heading element instead (`<h1>`-`<h6>`).\n\n### Examples\n\n```html\n\x3c!-- Bad: Styled as heading but not a heading element --\x3e\n<p style="font-size: 24px; font-weight: bold;">Section Title</p>\n\n\x3c!-- Good: Use actual heading element --\x3e\n<h2>Section Title</h2>\n\n\x3c!-- Bad: Large bold text that should be a heading --\x3e\n<p style="font-size: 20px; font-weight: bold;">Subsection</p>\n\n\x3c!-- Good: Proper heading --\x3e\n<h3>Subsection</h3>\n```\n\n### Best Practices\n\n- Use semantic heading elements, not styled paragraphs\n- Headings provide document structure and navigation\n- Don\'t skip heading levels\n- Style headings with CSS, not by making paragraphs look like headings\n\n### The Algorithm\n\nA `<p>` element contains less than 50 characters and is either 20 pixels or bigger, or 16 pixels or bigger and bold and/or italicized.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.3.1 Info and Relationships** (Level A)\n- **2.4.1 Bypass Blocks** (Level A)\n- **2.4.6 Headings and Labels** (Level AA)',helpLink:"https://wave.webaim.org/"},{id:"wave-table-layout",category:"wave",columnName:"table_layout",waveType:"Alert",explanation:"A layout table is present.",remediationGuidelines:'## Layout Table (table_layout)\n\n### What It Means\n\nA layout table is present.\n\n### Why It Matters\n\nLayout tables exist merely to position content visually - to create columns, insert spacing, or align content neatly for sighted users. Their content is not at all tabular in nature. Layout tables should not be used in HTML5. They can introduce reading and navigation order issues. Screen readers may interpret them as data tables (i.e., announcing column and row numbers), especially if they contain table header (`<th>`) cells. This introduces significant overhead on screen reader users.\n\n### What To Do\n\nIn almost every case, layout tables can be replaced with other HTML elements and styled with CSS to achieve the desired visual presentation. If the table contains tabular data, provide appropriate header (`<th>`) cells. If the layout table remains, verify that the reading and navigation order of table content (based on underlying source code order) is logical and g
1ive it `role="presentation"` to ensure it is not identified as a table to screen reader users.\n\n### Examples\n\n```html\n\x3c!-- Bad: Layout table for positioning --\x3e\n<table>\n  <tr>\n    <td>Left column</td>\n    <td>Right column</td>\n  </tr>\n</table>\n\n\x3c!-- Good: Use CSS for layout --\x3e\n<div style="display: flex; gap: 20px;">\n  <div>Left column</div>\n  <div>Right column</div>\n</div>\n\n\x3c!-- If layout table must remain, mark as presentation --\x3e\n<table role="presentation">\n  <tr>\n    <td>Header</td>\n  </tr>\n  <tr>\n    <td>Content</td>\n  </tr>\n</table>\n```\n\n### CSS Layout Alternatives\n\n```css\n/* Flexbox layout */\n.container {\n  display: flex;\n  gap: 20px;\n}\n\n/* Grid layout */\n.container {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 20px;\n}\n```\n\n### Best Practices\n\n- Use CSS Flexbox or Grid instead of layout tables\n- Only use tables for actual tabular data\n- If layout table necessary, use `role="presentation"`\n- Test reading order with screen reader\n\n### The Algorithm\n\nA `<table>` element is present that does not contain any header (`<th>`) cells.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.3.1 Info and Relationships** (Level A)\n- **1.3.2 Meaningful Sequence** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-table-caption-possible",category:"wave",columnName:"table_caption_possible",waveType:"Alert",explanation:"Text appears to be a table caption, but is not a caption element.",remediationGuidelines:"## Possible Table Caption (table_caption_possible)\n\n### What It Means\n\nText appears to be a table caption, but is not a caption element.\n\n### Why It Matters\n\nA table caption should be associated with a table using the `<caption>` element so it will be read by a screen reader with the table content.\n\n### What To Do\n\nIf the text is a description of the table, associate the text with the table using the `<caption>` element (`<caption>` should be the first element within the `<table>`).\n\n### Examples\n\n```html\n\x3c!-- Bad: Caption outside table --\x3e\n<p><strong>Monthly Sales Report</strong></p>\n<table>\n  <tr>\n    <th>Month</th>\n    <th>Sales</th>\n  </tr>\n</table>\n\n\x3c!-- Good: Caption inside table --\x3e\n<table>\n  <caption>Monthly Sales Report</caption>\n  <tr>\n    <th>Month</th>\n    <th>Sales</th>\n  </tr>\n</table>\n```\n\n### Best Practices\n\n- Use `<caption>` for table descriptions\n- Place caption as first element in table\n- Keep caption text concise and descriptive\n- Caption is read with table content by screen readers\n\n### The Algorithm\n\nA data table (has at least one table header) that does not already have a caption has a colspan attribute value of 3 or greater on the first cell of the table, or a `<p>` element immediately before the table that contains less than 50 characters or contains less than 100 characters and is bold and/or centered.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.3.1 Info and Relationships** (Level A)",helpLink:"https://wave.webaim.org/"},{id:"wave-list-possible",category:"wave",columnName:"list_possible",waveType:"Alert",explanation:"Text is structured like a list but lacks proper list semantics.",remediationGuidelines:"## Possible List (list_possible)\n\n### What It Means\n\nText is structured like a list but lacks proper list semantics.\n\n### Why It Matters\n\nOrdered and unordered lists, when properly defined, provide useful information to users, such as an indication of the list type and number of list items. When text alone is used to present list structures and content, these benefits are lost.\n\n### What To Do\n\nIf list content is presented, use `<ul>` or `<ol>` markup to semantically define the list.\n\n### Examples\n\n```html\n\x3c!-- Bad: List-like text without list markup --\x3e\n<p>* Item one</p>\n<p>* Item two</p>\n<p>* Item three</p>\n\n\x3c!-- Bad: Numbered text without list --\x3e\n<p>1. First item</p>\n<p>2. Second item</p>\n\n\x3c!-- Good: Unordered list --\x3e\n<ul>\n  <li>Item one</li>\n  <li>Item two</li>\n  <li>Item three</li>\n</ul>\n\n\x3c!-- Good: Ordered list --\x3e\n<ol>\n  <li>First item</li>\n  <li>Second item</li>\n</ol>\n```\n\n### Best Practices\n\n- Use semantic list elements for list content\n- Choose `<ul>` for unordered lists\n- Choose `<ol>` for ordered/sequential lists\n- Screen readers announce list structure\n\n### The Algorithm\n\nText is used to present list-type content, such as:\n- `*` text\n- `1.` text\n- `a.` text\n- `1)` text\n- `a)` text\n- `-` text\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.3.1 Info and Relationships** (Level A)",helpLink:"https://wave.webaim.org/"},{id:"wave-link-internal-broken",category:"wave",columnName:"link_internal_broken",waveType:"Error",explanation:"A link to another location within the page is present but does not have a corresponding target.",remediationGuidelines:'## Broken Same-Page Link (link_internal_broken)\n\n### What It Means\n\nA link to another location within the page is present but does not have a corresponding target.\n\n### Why It Matters\n\nA link to jump to another position within the page assists users in navigating the web page, but only if the link target exists.\n\n### What To Do\n\nEnsure that the target for the link exists or remove the same-page link.\n\n### Examples\n\n```html\n\x3c!-- Bad: Link to non-existent target --\x3e\n<a href="#nonexistent">Jump to section</a>\n\n\x3c!-- Good: Link to existing target --\x3e\n<a href="#section1">Jump to section</a>\n<div id="section1">\n  <h2>Section 1</h2>\n</div>\n\n\x3c!-- Good: Ensure id matches href --\x3e\n<a href="#main-content">Skip to main content</a>\n<main id="main-content">\n  <h1>Main Content</h1>\n</main>\n```\n\n### Best Practices\n\n- Ensure anchor targets exist with matching id\n- Test all same-page links\n- Use descriptive link text\n- Verify targets are accessible\n\n### The Algorithm\n\nAn in-page link has an href attribute (starting with a #), but does not match either the id value of another element or the name attribute value of an anchor element within the page.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **2.1.1 Keyboard** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-link-skip-broken",category:"wave",columnName:"link_skip_broken",waveType:"Error",explanation:"A skip navigation link exists, but the target for the link does not exist or the link is not keyboard accessible.",remediationGuidelines:'## Broken Skip Link (link_skip_broken)\n\n### What It Means\n\nA skip navigation link exists, but the target for the link does not exist or the link is not keyboard accessible.\n\n### Why It Matters\n\nA link to jump over navigation or jump to the main content of the page assists keyboard users only if the link is properly functioning and is keyboard accessible.\n\n### What To Do\n\nEnsure that the target for the link exists and that the link is not hidden with CSS display:none or visibility:hidden.\n\n### Examples\n\n```html\n\x3c!-- Bad: Ski
1p link with broken target --\x3e\n<a href="#main" class="skip-link">Skip to main content</a>\n\x3c!-- No element with id="main" --\x3e\n\n\x3c!-- Bad: Hidden skip link --\x3e\n<a href="#main" class="skip-link" style="display: none;">Skip to main content</a>\n\n\x3c!-- Good: Working skip link --\x3e\n<a href="#main-content" class="skip-link">Skip to main content</a>\n<main id="main-content">\n  <h1>Main Content</h1>\n</main>\n\n\x3c!-- Good: Visually hidden but keyboard accessible --\x3e\n<a href="#main-content" class="sr-only focus:not-sr-only">\n  Skip to main content\n</a>\n```\n\n### CSS for Skip Links\n\n```css\n.skip-link {\n  position: absolute;\n  left: -9999px;\n}\n.skip-link:focus {\n  left: 0;\n  top: 0;\n}\n```\n\n### Best Practices\n\n- Ensure skip link target exists\n- Don\'t hide skip link with display:none\n- Make skip link visible on keyboard focus\n- Test keyboard navigation\n\n### The Algorithm\n\nAn in-page link contains the words "skip" or "jump" and is hidden with CSS display:none or visibility:hidden, or the link has an href attribute that does not match the id value of another element within the page or the name attribute value of an anchor element within the page.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **2.1.1 Keyboard** (Level A)\n- **2.4.1 Bypass Blocks** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-th-empty",category:"wave",columnName:"th_empty",waveType:"Error",explanation:"A <th> (table header) contains no text.",remediationGuidelines:"## Empty Table Header (th_empty)\n\n### What It Means\n\nA `<th>` (table header) contains no text.\n\n### Why It Matters\n\nThe `<th>` element helps associate table cells with the correct row/column headers. A `<th>` that contains no text may result in cells with missing or incorrect header information.\n\n### What To Do\n\nIf the table cell is a header, provide text within the cell that describes the column or row. If the cell is not a header or must remain empty (such as the top-left cell in a data table), make the cell a `<td>` rather than a `<th>`.\n\n### Examples\n\n```html\n\x3c!-- Bad: Empty header cell --\x3e\n<table>\n  <tr>\n    <th></th>\n    <th>Column 1</th>\n  </tr>\n</table>\n\n\x3c!-- Good: Header with text --\x3e\n<table>\n  <tr>\n    <th>Category</th>\n    <th>Value</th>\n  </tr>\n</table>\n\n\x3c!-- Good: Empty corner cell uses td --\x3e\n<table>\n  <tr>\n    <td></td>\n    <th>Q1</th>\n    <th>Q2</th>\n  </tr>\n</table>\n```\n\n### Best Practices\n\n- All header cells should have descriptive text\n- Use `<td>` for empty cells that aren't headers\n- Headers should clearly describe column/row content\n- Test with screen readers\n\n### The Algorithm\n\nA `<th>` element does not contain any text (or contains only spaces) and no images with alternative text.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.3.1 Info and Relationships** (Level A)",helpLink:"https://wave.webaim.org/"},{id:"wave-blink",category:"wave",columnName:"blink",waveType:"Error",explanation:"Blinking content is present.",remediationGuidelines:'## Blinking Content (blink)\n\n### What It Means\n\nBlinking content is present.\n\n### Why It Matters\n\nBlinking content can be distracting and confusing to users, particularly those with certain cognitive disabilities.\n\n### What To Do\n\nRemove the blinking effect (`<blink>` element or text-decoration:blink style). Important text can be styled in other ways.\n\n### Examples\n\n```html\n\x3c!-- Bad: Blink element (deprecated) --\x3e\n<blink>Important Notice</blink>\n\n\x3c!-- Bad: CSS blinking --\x3e\n<p style="text-decoration: blink;">New Alert</p>\n\n\x3c!-- Good: Alternative styling --\x3e\n<p style="color: red; font-weight: bold;">Important Notice</p>\n<p class="highlight">New Alert</p>\n```\n\n### CSS Alternatives\n\n```css\n/* Instead of blinking */\n.highlight {\n  background-color: yellow;\n  font-weight: bold;\n}\n\n.alert {\n  border: 2px solid red;\n  padding: 10px;\n}\n```\n\n### Best Practices\n\n- Never use blinking effects\n- Use color, borders, or other visual cues\n- Avoid any rapid flashing (can trigger seizures)\n- Make important content accessible\n\n### The Algorithm\n\nA non-empty `<blink>` element or other text has CSS text-decoration:blink styling.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **2.2.2 Pause, Stop, Hide** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-marquee",category:"wave",columnName:"marquee",waveType:"Error",explanation:"A <marquee> element is present.",remediationGuidelines:'## Marquee (marquee)\n\n### What It Means\n\nA `<marquee>` element is present.\n\n### Why It Matters\n\nA marquee element presents scrolling text that the user cannot stop. Scrolling animated content can be distracting and confusing to users, particularly for those with certain cognitive disabilities.\n\n### What To Do\n\nRemove the marquee element. If content must scroll, use an alternative scrolling mechanism that allows the user to pause or stop the animation.\n\n### Examples\n\n```html\n\x3c!-- Bad: Marquee element (deprecated) --\x3e\n<marquee>Scrolling text that cannot be stopped</marquee>\n\n\x3c!-- Good: CSS animation with pause control --\x3e\n<div class="scrollable" aria-live="polite">\n  <button onclick="pauseAnimation()">Pause</button>\n  <p>Important information that can be paused</p>\n</div>\n\n\x3c!-- Better: Static content --\x3e\n<p>Important information</p>\n```\n\n### Modern Alternatives\n\n```css\n.scrollable {\n  animation: scroll 10s linear infinite;\n}\n\n.scrollable.paused {\n  animation-play-state: paused;\n}\n```\n\n### Best Practices\n\n- Never use marquee elements\n- Provide pause/stop controls for animations\n- Consider static content when possible\n- Ensure content is accessible\n\n### The Algorithm\n\nA `<marquee>` element is present.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **2.2.2 Pause, Stop, Hide** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-meta-refresh",category:"wave",columnName:"meta_refresh",waveType:"Error",explanation:"The page is set to automatically change location or refresh using a <meta> tag.",remediationGuidelines:'## Page Refreshes or Redirects (meta_refresh)\n\n### What It Means\n\nThe page is set to automatically change location or refresh using a `<meta>` tag.\n\n### Why It Matters\n\nPages that automatically change location or refresh pose significant usability issues, particularly for screen reader and keyboard users.\n\n### What To Do\n\nRemove the `<meta>` refresh and give the user control over time-sensitive content changes.\n\n### Examples\n\n```html\n\x3c!-- Bad: Auto-refresh meta tag --\x3e\n<meta http-equiv="refresh" content="5">\n\n\x3c!-- Bad: Auto-redirect --\x3e\n<meta http-equiv="refresh" content="0;url=/new-page.html">\n\n\x3c!-- Good: User-controlled refresh --\x3e\n<button onclick="location.reload()">Refresh Page</button>\n\n\x3c!-- Good: Manual navigation --\x3e\n<a href="/new-page.html">Go to new page</a>\n```\n\n### Best Practices\n\n- Never use meta refresh\n- Give users control over page navigation\n- Don\'t auto-redirect without user action\n- Provide clear navigation options\n\n### The Algorithm\n\nA `<meta http-equiv="refresh">` tag is present.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **2.2.1 Timing Adjustable** (Level A)\n- **2.2.2 Pause, Stop, Hide** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-aria-reference-broken",category:"wave",columnName:"aria_reference_broken",waveType:"Error",explanation:"An aria-labelledby or aria-describedby reference exists, but the target for the reference does not exist.",remediationGuidelines:'## Broken ARIA Reference (aria_reference_broken)\n\n### What It Means\n\nAn aria-labelledby or aria-describedby reference exists, but the target for the reference does not exist.\n\n### Why It Matters\n\nARIA labels and descriptions will not be presented if the element referenced does not exist in the page.\n\n### What To Do\n\nEnsure the element referenced in the aria-labelledby or aria-describedby attribute value is present within the page and presents a proper label or description.\n\n### Examples\n\n```html\n\x3c!-- Bad: References non-existent element --\x3e\n<input type="text" aria-labelledby="nonexistent-label" name="email">\n\n\x3c!-- Bad: Broken reference --\x3e\n<button aria-describedby="missing-desc">Submit</button>\n\n\x3c!-- Good: Valid reference --\x3e\n<span id="email-label">Email Address</span>\n<input type="email" aria-labelledby="email-label" name="email">\n\n\x3c!-- Good: Multiple valid references --\x3e\n<span id="username-label">Username</span>\n<span id="username-help">Must be at least 6 characters</span>\n<input type="text" aria-labelledby="username-label" aria-describedby="username-help" name="username">\n```\n\n### Best Practices\n\n- Ensure referenced elements exist\n- IDs must match exactly (case-sensitive)\n- Test ARIA references with screen readers\n- Use proper IDs for referenced elements\n\n### The Algorithm\n\nAn element has an aria-labelledby or aria-describedby value that does not match the id attribute value of another element in the page.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.3.1 Info and Relationships** (Level A)\n- **4.1.2 Name, Role, Value** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-aria-menu-broken",category:"wave",columnName:"aria_menu_broken",waveType:"Error",explanation:"An ARIA menu does not contain required menu items.",remediationGuidelines:'## Broken ARIA Menu (aria_menu_broken)\n\n### What It Means\n\nAn ARIA menu does not contain required menu items.\n\n### Why It Matters\n\nARIA menus are application menus (like those used in software menu) with a specific keyboard interactions. They are NOT for navigation links on a web site and must contain at least one menuitem, menuitemcheckbox, or menuitemradio element.\n\n### What To Do\n\nEnsure that the menu is an application menu and has the appropriate keyboard interactions (menu items are navigated via the arrow keys, not via the Tab key) and internal menu items, otherwise remove the menu role.\n\n### Examples\n\n```html\n\x3c!-- Bad: Menu without menu items --\x3e\n<div role="menu">\n  <a href="/home">Home</a>\n  <a href="/about">About</a>\n</div>\n\n\x3c!-- Bad: Empty menu --\x3e\n<ul role="menu"></ul>\n\n\x3c!-- Good: Menu with proper menu items --\x3e\n<ul role="menu">\n  <li role="menuitem">Cut</li>\n  <li role="menuitem">Copy</li>\n  <li role="menuitem">Paste</li>\n</ul>\n\n\x3c!-- Better: Navigation should use nav, not menu --\x3e\n<nav>\n  <ul>\n    <li><a href="/home">Home</a></li>\n    <li><a href="/about">About</a></li>\n  </ul>\n</nav>\n```\n\n### Best Practices\n\n- ARIA menus are for application menus, not navigation\n- Menus must contain menuitem elements\n- Use `<nav>` for site navigation\n- Implement proper keyboard interactions\n\n### The Algorithm\n\nAn element with role="menu" does not contain at least one element with role="menuitem", role="menuitemcheckbox", or role="menuitemradio".\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **2.1.1 Keyboard** (Level A)\n- **4.1.2 Name, Role, Value** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-alt-duplicate",category:"wave",columnName:"alt_duplicate",waveType:"Warning",explanation:"Two images near each other have the same alternative text.",remediationGuidelines:'## Nearby Image Has Same Alternative Text (alt_duplicate)\n\n### What It Means\n\nTwo images near each other have the same alternative text.\n\n### Why It Matters\n\nWhen two images have the same alternative text, this often causes redundancy or indicates incorrect alternative text.\n\n### What To Do\n\nEnsure that the alternative text for each image or image button is appropriate while removing unnecessary redundancy. If the content of the image is already conveyed elsewhere (through text or the alternative text of a nearby image) or if the image does not convey content, the image may generally be given empty/null alternative text (`alt=""`). Image buttons always convey a specific function, and thus cannot be given null alternative text.\n\n### Examples\n\n```html\n\x3c!-- Bad: Same alt text for different images --\x3e\n<img src="icon1.png" alt="icon">\n<img src="icon2.png" alt="icon">\n\n\x3c!-- Good: Unique alt text --\x3e\n<img src="email-icon.png" alt="Email icon">\n<img src="phone-icon.png" alt="Phone icon">\n\n\x3c!-- Good: Decorative images use empty alt --\x3e\n<img src="decoration1.png" alt="">\n<img src="decoration2.png" alt="">\n\n\x3c!-- If images are redundant, use empty alt for one --\x3e\n<img src="product-image.jpg" alt="Product photo">\n<p>Beautiful product photo showing all features</p>\n<img src="product-thumb.jpg" alt=""> \x3c!-- Content in nearby text --\x3e\n```\n\n### Best Practices\n\n- Each image should have unique, descriptive alt text\n- If images are decorative or redundant, use empty alt\n- Image buttons cannot have empty alt\n- Review alt text for uniqueness and accuracy\n\n### The Algorithm\n\nThe same alternative text (case insensitive, but not null/empty) is present for two images or image buttons (`<input type=\'image\'>`) near each other (no more than 2 other images separate them).\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)',helpLink:"https://wave.webaim.org/"}
1,{id:"wave-alt-long",category:"wave",columnName:"alt_long",waveType:"Warning",explanation:"An image has very long alternative text.",remediationGuidelines:'## Long Alternative Text (alt_long)\n\n### What It Means\n\nAn image has very long alternative text.\n\n### Why It Matters\n\nAlternative text should be succinct, yet descriptive of the content and function of an image. Lengthy alternative text (more than around 100 characters) often indicates that extraneous content or content that is not available to sighted users is being presented.\n\n### What To Do\n\nEnsure the alternative text is succinct, yet descriptive. Ensure that no content is being presented in alternative text that is not available to sighted users viewing the image. When possible, either shorten the alternative text or provide the text alternative via another method (e.g., in text near the image, through a separate description page, etc.).\n\n### Examples\n\n```html\n\x3c!-- Bad: Very long alt text --\x3e\n<img src="chart.png" alt="This chart shows quarterly sales data for the years 2020, 2021, and 2022. In Q1 2020, sales were $100k, in Q2 they were $120k, in Q3 $110k, and Q4 $130k. In 2021, Q1 was $140k, Q2 $150k, Q3 $145k, Q4 $160k. And in 2022, Q1 $170k, Q2 $180k, Q3 $175k, and Q4 $190k.">\n\n\x3c!-- Good: Succinct alt text --\x3e\n<img src="chart.png" alt="Quarterly sales increased from $100k in Q1 2020 to $190k in Q4 2022">\n\n\x3c!-- Good: Brief alt with extended description elsewhere --\x3e\n<img src="chart.png" alt="Quarterly sales growth chart">\n<figcaption>\n  Sales increased consistently each quarter from Q1 2020 ($100k) through Q4 2022 ($190k).\n</figcaption>\n```\n\n### Best Practices\n\n- Keep alt text under 100 characters when possible\n- Use nearby text or captions for detailed descriptions\n- Alt text should summarize, not duplicate content\n- For complex images, provide description in context\n\n### The Algorithm\n\nThe image\'s alt attribute value is more than 100 characters.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-longdesc",category:"wave",columnName:"longdesc",waveType:"Warning",explanation:"The longdesc attribute is present.",remediationGuidelines:'## Long Description (longdesc)\n\n### What It Means\n\nThe longdesc attribute is present.\n\n### Why It Matters\n\nBecause of poor support, the longdesc attribute should not be used.\n\n### What To Do\n\nBecause of poor browser support for longdesc, it should not be used to provide the description of complex images. The description may be provided in the alt attribute (if possible - alt text should be succinct, generally no more than ~100 characters), in nearby text (e.g., a caption, data table, etc.), or via a link to a separate description page that contains an accurate and equivalent description.\n\n### Examples\n\n```html\n\x3c!-- Bad: Using longdesc --\x3e\n<img src="complex-diagram.png" alt="System architecture" longdesc="diagram-description.html">\n\n\x3c!-- Good: Remove longdesc, use caption or link --\x3e\n<figure>\n  <img src="complex-diagram.png" alt="System architecture diagram">\n  <figcaption>\n    <a href="/diagram-description.html">View detailed description</a>\n  </figcaption>\n</figure>\n\n\x3c!-- Good: Description in nearby text --\x3e\n<img src="chart.png" alt="Quarterly sales chart">\n<p>This chart shows sales data from Q1 2020 ($100k) through Q4 2022 ($190k), with consistent growth each quarter.</p>\n```\n\n### Best Practices\n\n- Avoid longdesc due to poor support\n- Use captions, nearby text, or links for descriptions\n- Keep alt text succinct (under 100 characters)\n- Provide detailed descriptions in accessible formats\n\n### The Algorithm\n\nAn image has a longdesc attribute containing a valid URL.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-image-title",category:"wave",columnName:"image_title",waveType:"Warning",explanation:"An image has a title attribute value but no alt value.",remediationGuidelines:'## Image with Title (image_title)\n\n### What It Means\n\nAn image has a title attribute value but no alt value.\n\n### Why It Matters\n\nThe title attribute value for images that lack an alt attribute value will be presented to screen reader users. However, providing image content in the alt attribute typically provides better accessibility, and should be used in most cases. The title attribute will generate a mouse hover tooltip which may or may not be desired - this tooltip will not be presented to touch screen or keyboard users.\n\n### What To Do\n\nEnsure the title attribute value presents the content and function of the image. For better accessibility, the alt attribute should be used when possible.\n\n### Examples\n\n```html\n\x3c!-- Bad: Title but no alt --\x3e\n<img src="chart.png" title="Quarterly sales chart">\n\n\x3c!-- Good: Use alt attribute instead --\x3e\n<img src="chart.png" alt="Quarterly sales chart">\n\n\x3c!-- Good: Both alt and title (title as additional info) --\x3e\n<img src="logo.png" alt="Company logo" title="Company logo - established 1995">\n```\n\n### Best Practices\n\n- Use `alt` attribute for image descriptions\n- `title` creates hover tooltip (not accessible to keyboard users)\n- `alt` is read by screen readers;
1 prefer over title\n- Title can complement alt for additional context\n\n### The Algorithm\n\nAn image is present that does not have an alt attribute or alt attribute value, but does have a title attribute value.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-text-small",category:"wave",columnName:"text_small",waveType:"Alert",explanation:"Text is very small.",remediationGuidelines:"## Very Small Text (text_small)\n\n### What It Means\n\nText is very small.\n\n### Why It Matters\n\nText which is very small is difficult to read, particularly for those with low vision.\n\n### What To Do\n\nIncrease the text to a more readable size.\n\n### Examples\n\n```css\n/* Bad: Very small text */\n.tiny-text {\n  font-size: 8px;\n}\n\n.small-text {\n  font-size: 10px;\n}\n\n/* Good: Readable text sizes */\n.readable-text {\n  font-size: 16px; /* Minimum recommended */\n}\n\n.large-text {\n  font-size: 18px;\n}\n```\n\n### Best Practices\n\n- Use at least 12px (16px recommended) for body text\n- Small text (under 10px) is difficult to read\n- Consider users with low vision\n- Allow text scaling in user preferences\n\n### The Algorithm\n\nText is present that is sized 10 pixels or smaller.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.4.4 Resize Text** (Level AA)",helpLink:"https://wave.webaim.org/"},{id:"wave-text-justified",category:"wave",columnName:"text_justified",waveType:"Alert",explanation:"Fully justified text is present.",remediationGuidelines:"## Justified Text (text_justified)\n\n### What It Means\n\nFully justified text is present.\n\n### Why It Matters\n\nLarge blocks of justified text can negatively impact readability due to varying word/letter spacing and 'rivers of white' that flow through the text.\n\n### What To Do\n\nRemove the full justification from the text.\n\n### Examples\n\n```css\n/* Bad: Justified text */\n.justified {\n  text-align: justify;\n}\n\n/* Good: Left-aligned or other alignment */\n.readable {\n  text-align: left;\n}\n\n.centered {\n  text-align: center;\n}\n```\n\n### Best Practices\n\n- Avoid justify for body text\n- Use left-align for better readability\n- Justify can create spacing issues\n- Consider readability over appearance\n\n### The Algorithm\n\nA `<p>`, `<div>`, or `<td>` element has more than 500 characters and is styled with text-align:justify.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.4.8 Visual Presentation** (Level AAA)",helpLink:"https://wave.webaim.org/"},{id:"wave-underline",category:"wave",columnName:"underline",waveType:"Alert",explanation:"Underlined text is present.",remediationGuidelines:'## Underlined Text (underline)\n\n### What It Means\n\nUnderlined text is present.\n\n### Why It Matters\n\nUnderlines almost universally indicates linked text. Consider removing the underline from the non-link text. Other styling (e.g., bold or italics) can be used to differentiate the text.\n\n### What To Do\n\nUnless there is a distinct need for the underlined text, remove the underline from it.\n\n### Examples\n\n```html\n\x3c!-- Bad: Underlined non-link text --\x3e\n<p style="text-decoration: underline;">Important notice</p>\n<u>Important text</u>\n\n\x3c!-- Good: Use other styling --\x3e\n<p style="font-weight: bold;">Important notice</p>\n<strong>Important text</strong>\n\n\x3c!-- Good: Underlines only for links --\x3e\n<a href="/page">Link text</a>\n```\n\n### CSS Best Practices\n\n```css\n/* Underlines only for links */\na {\n  text-decoration: underline;\n}\n\n/* Remove underline from other elements */\n.important {\n  font-weight: bold;\n  /* NOT text-decoration: underline; */\n}\n```\n\n### Best Practices\n\n- Reserve underlines for links\n- Use bold, italic, or color for emphasis\n- Avoid confusing non-link underlined text\n- Maintain visual consistency\n\n### The Algorithm\n\nA `<u>` element or element with text-decoration:underline styles is present.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.4.1 Use of Color** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-title-redundant",category:"wave",columnName:"title_redundant",waveType:"Warning",explanation:"Title attribute text is the same as text or alternative text.",remediationGuidelines:'## Redundant Title Text (title_redundant)\n\n### What It Means\n\nTitle attribute text is the same as text or alternative text.\n\n### Why It Matters\n\nThe title attribute value is used to provide advisory information. It typically appears when the users hovers the mouse over an element. The advisory information presented should not be identical to or very similar to the element text or alternative text.\n\n### What To Do\n\nIn most cases the title attribute can be removed, otherwise modify it to provide advisory, but not redundant information. Note that the title text may or may not be read by a screen reader and is typically inaccessible to sighted keyboard users.\n\n### Examples\n\n```html\n\x3c!-- Bad: Redundant title --\x3e\n<a href="/contact" title="Contact Us">Contact Us</a>\n<img src="logo.png" alt="Company Logo" title="Company Logo">\n\n\x3c!-- Good: Remove redundant title --\x3e\n<a href="/contact">Contact Us</a>\n<img src="logo.png" alt="Company Logo">\n\n\x3c!-- Good: Title provides additional info --\x3e\n<a href="/contact" title="Contact our support team">Contact</a>\n<img src="logo.png" alt="Company Logo" title="Company logo - established 1995">\n```\n\n### Best Practices\n\n- Remove title if it duplicates visible text/alt\n- Title should provide additional context if used\n- Remember title tooltips aren\'t accessible to keyboard users\n- Prefer visible labels over title attributes\n\n### The Algorithm\n\nA title attribute value is identical to element text or image alternative text.\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)',helpLink:"https://wave.webaim.org/"},{id:"wave-alt-longdesc",category:"wave",columnName:"alt_longdesc",waveType:"Warning",explanation:"An image has alternative text and a longdesc attribute.",remediationGuidelines:'## Image with Longdesc and Alt (alt_longdesc)\n\n### What It Means\n\nAn image has both alternative text and a longdesc attribute. While both may be present, longdesc has poor browser support and should generally be avoided.\n\n### Why It Matters\n\nThe longdesc attribute has poor support and should be avoided. Alternative descriptions should be provided in the alt attribute (for brief descriptions) or via other methods like captions or links.\n\n### What To Do\n\nRemove the longdesc attribute. Provide the description in the alt attribute if brief, or use a caption, nearby text, or a link to a detailed description page.\n\n### Examples\n\n```html\n\x3c!-- Bad: Using longdesc --\x3e\n<img src="diagram.png" alt="System diagram" longdesc="description.html">\n\n\x3c!-- Good: Remove longdesc, use caption/link --\x3e\n<figure>\n  <img src="diagram.png" alt="System architecture diagram">\n  <figcaption>\n    <a href="/description.html">View detailed description</a>\n  </figcaption>\n</figure>\n```\n\n### Best Practices\n\n- Avoid longdesc due to poor browser support\n- Use alt for brief descriptions\n- Use captions, nearby text, or links for detailed descriptions\n- Test with multiple browsers and screen readers\n\n### Relevant WCAG 2.2 Success Criteria\n\n- **1.1.1 Non-text Content** (Level A)',helpLink:"https://wave.webaim.org/"}].map(function(e){let n=es[e.columnName]||e.columnName;return{...e,naturalLanguageName:n,waveFieldName:e.columnName}})},{id:"readability",name:"Readability",description:"Readability metrics and plain language guidelines for accessible content",rows:[{id:"readability-rating",category:"readability",columnName:"Readability Rating",readabilityMetric:"Rating",readabilityDescription:"Proprietary readability score from A to E, where A is most readable and E is least readable",readabilityThreshold:"A-B (Highly Readable)",readabilityFieldName:"rating",readabilityScoreType:"rating",explanation:"Proprietary readability rating system. A = highly readable, B = readable, C = average, D = difficult, E = very difficult.",remediationGuidelines:'## Readability Rating Improvement\n\n### What It Means\n\nA proprietary readability score from A (most readable) to E (least readable).\n\n### Why It Matters\n\nThe rating provides a quick overall assessment of text readability. Higher ratings (A-B) indicate content that is accessible to a wider audience.\n\n### Target Rating\n\n**Target:** A-B (Highly Readable)\n\n### How to Improve\n\n- **Aim for shorter sentences** (15-20 words average)\n- **Use simpler vocabulary** (common words over complex terms)\n- **Write in active voice** for clarity\n- **Break up long paragraphs** into shorter sections\n- **Avoid jargon** or explain technical terms\n- **Use lists and headings** to organize content\n\n### Examples\n\n```\n✅ A Rating: "This guide helps you understand accessibility."\n✅ B Rating: "This comprehensive guide provides detailed information."\n❌ D Rating: "The implementation of comprehensive methodologies..."\n```\n\n### Best Practices\n\n- Keep sentences under 20 words\n- Use everyday language\n- Test with your target audience\n- Review and simplify complex passages',helpLink:"https://readable.com/"},{id:"readability-flesch",category:"readability",columnName:"Flesch Reading Ease",readabilityMetric:"Flesch Reading Ease",readabilityDescription:"Measures readability based on sentence length and syllable count",readabilityThreshold:"60-70 (Plain English)",readabilityFieldName:"flesch_reading_ease",readabilityScoreType:"score_0_100",explanation:"Score from 0-100 where higher scores indicate easier reading. Target range is 60-70 for plain English.",remediationGuidelines:'## Flesch Reading Ease Improvement\n\n### What It Means\n\nMeasures readability based on sentence length and syllable count. Scores range from 0-100, with higher scores indicating easier reading.\n\n### Why It Matters\n\nFlesch Reading Ease provides a quick asse
1ssment of text accessibility. Higher scores (60-100) indicate content that is easier to read and understand.\n\n### Target Score\n\n**Target Range:** 60-70 (Plain English)\n\n### How to Improve\n\n- Use shorter sentences (15-20 words average)\n- Use simpler words (fewer syllables)\n- Write in active voice\n- Avoid jargon and technical terms\n\n### Examples\n\n```\n✅ Good (65): "This method helps users understand the process."\n❌ Poor (35): "The implementation of the aforementioned methodology will facilitate enhanced user engagement."\n```\n\n### Score Interpretation\n\n- **90-100**: Very Easy (5th grade level)\n- **80-89**: Easy (6th grade level)\n- **70-79**: Fairly Easy (7th grade level)\n- **60-69**: Plain English (8th-9th grade level) ⭐ **Target**\n- **50-59**: Fairly Difficult (10th-12th grade)\n- **30-49**: Difficult (College level)\n- **0-29**: Very Difficult (College graduate level)',helpLink:"https://readabilityformulas.com/flesch-reading-ease-readability-formula.php"},{id:"readability-flesch-kincaid",category:"readability",columnName:"Flesch-Kincaid Grade Level",readabilityMetric:"Flesch-Kincaid Grade Level",readabilityDescription:"Indicates the U.S. grade level needed to understand the text",readabilityThreshold:"6-8 (Middle School)",readabilityFieldName:"flesch_kincaid_grade_level",readabilityScoreType:"grade_level",explanation:"Grade level score where 6-8 is ideal for general audiences. Higher numbers indicate more complex text.",remediationGuidelines:'## Flesch-Kincaid Grade Level Improvement\n\n### What It Means\n\nIndicates the U.S. grade level needed to understand the text. Based on sentence length and syllable complexity.\n\n### Why It Matters\n\nLower grade levels (6-8) mean your content is accessible to a wider audience. Higher grade levels require more education to understand.\n\n### Target Grade Level\n\n**Target:** 6-8 (Middle School level)\n\n### How to Improve\n\n- Use shorter sentences\n- Choose simpler words\n- Avoid complex sentence structures\n- Write for your audience\'s reading level\n\n### Word Complexity Examples\n\n```\nComplex → Simple:\n- "utilize" → "use"\n- "facilitate" → "help"\n- "implement" → "do"\n- "approximately" → "about"\n- "demonstrate" → "show"\n```\n\n### Best Practices\n\n- Aim for 15-20 words per sentence\n- Prefer common words over technical terms\n- Break complex ideas into multiple sentences\n- Test readability after writing',helpLink:"https://readabilityformulas.com/flesch-kincaid-grade-level-readability-formula.php"},{id:"readability-gunning-fog",category:"readability",columnName:"Gunning Fog Score",readabilityMetric:"Gunning Fog Score",readabilityDescription:"Measures readability based on sentence length and complex words (3+ syllables)",readabilityThreshold:"6-8 (Middle School)",readabilityFieldName:"gunning_fog_score",readabilityScoreType:"grade_level",explanation:"Grade level based on sentence length and percentage of complex words. Target is 6-8 for general audiences.",remediationGuidelines:'## Gunning Fog Score Improvement\n\n### What It Means\n\nMeasures readability based on sentence length and the percentage of complex words (words with 3 or more syllables).\n\n### Why It Matters\n\nThe Gunning Fog Index estimates the years of formal education needed to understand a text. Lower scores indicate more accessible content.\n\n### Target Score\n\n**Target:** 6-8 (Middle School level)\n\n### How to Improve\n\n- **Reduce sentence length** (aim for 15-20 words)\n- **Minimize complex words** (words with 3+ syllables)\n- **Use everyday vocabulary** instead of technical terms\n- **Break long sentences** into shorter ones\n\n### Examples\n\n```\n❌ Complex: "The implementation of comprehensive methodologies facilitates optimization."\n✅ Simple: "This method improves results."\n```\n\n### Best Practices\n\n- Count syllables in key words\n- Replace 3+ syllable words when possible\n- Use shorter sentences\n- Test with readability tools',helpLink:"https://readabilityformulas.com/gunning-fog-readability-formula.php"},{id:"readability-smog",category:"readability",columnName:"SMOG Index",readabilityMetric:"SMOG Index",readabilityDescription:"Simple Measure of Gobbledygook - estimates years of education needed",readabilityThreshold:"6-8 (Middle School)",readabilityFieldName:"smog_index",readabilityScoreType:"grade_level",explanation:"Estimates years of education needed to understand text. Target is 6-8 years (middle school level).",remediationGuidelines:'## SMOG Index Improvement\n\n### What It Means\n\nSimple Measure of Gobbledygook - estimates the years of education needed to understand a piece of writing.\n\n### Why It Matters\n\nThe SMOG Index predicts readability by anal
1yzing polysyllabic words (words with 3+ syllables). Lower scores mean more accessible content.\n\n### Target Level\n\n**Target:** 6-8 years of education\n\n### How to Improve\n\n- Use shorter sentences\n- Avoid polysyllabic words when possible\n- Write in simple, clear language\n- Test with readability tools\n\n### Sentence Length Examples\n\n```\n❌ Too long: "The comprehensive analysis of the multifaceted aspects of the organizational structure reveals significant opportunities for optimization."\n\n✅ Better: "The analysis shows ways to improve the organization."\n```\n\n### Best Practices\n\n- Replace complex words with simpler alternatives\n- Keep sentences under 20 words\n- Avoid unnecessary technical jargon\n- Test readability regularly',helpLink:"https://readabilityformulas.com/smog-readability-formula.php"},{id:"readability-coleman-liau",category:"readability",columnName:"Coleman-Liau Index",readabilityMetric:"Coleman-Liau Index",readabilityDescription:"Based on characters per word and sentences per 100 words",readabilityThreshold:"6-8 (Middle School)",readabilityFieldName:"coleman_liau_index",readabilityScoreType:"grade_level",explanation:"Grade level based on character count and sentence structure. Target is 6-8 grade level.",remediationGuidelines:'## Coleman-Liau Index Improvement\n\n### What It Means\n\nMeasures readability based on average characters per word and average sentences per 100 words. It doesn\'t rely on syllable counting.\n\n### Why It Matters\n\nThe Coleman-Liau Index provides a grade level estimate using character and sentence counts. This makes it useful for automated analysis.\n\n### Target Grade Level\n\n**Target:** 6-8 grade level\n\n### How to Improve\n\n- Use shorter words (fewer characters)\n- Write shorter sentences\n- Avoid complex punctuation\n- Use common vocabulary\n\n### Word Length Examples\n\n```\nLong → Short:\n- "characteristics" (14 chars) → "traits" (6 chars)\n- "approximately" (12 chars) → "about" (5 chars)\n- "demonstration" (13 chars) → "proof" (4 chars)\n```\n\n### Best Practices\n\n- Prefer shorter, common words\n- Keep sentences under 20 words\n- Use simple sentence structures\n- Review word choices for length',helpLink:"https://readabilityformulas.com/coleman-liau-readability-formula.php"},{id:"readability-ari",category:"readability",columnName:"Automated Readability Index",readabilityMetric:"ARI",readabilityDescription:"Uses characters per word and words per sentence",readabilityThreshold:"6-8 (Middle School)",readabilityFieldName:"automated_readability_index",readabilityScoreType:"grade_level",explanation:"Grade level based on character and word counts. Target is 6-8 grade level for general audiences.",remediationGuidelines:'## Automated Readability Index (ARI) Improvement\n\n### What It Means\n\nCalculates readability based on average number of characters per word and average number of words per sentence.\n\n### Why It Matters\n\nARI provides a quick grade level estimate without requiring syllable counting, making it ideal for automated analysis.\n\n### Target Grade Level\n\n**Target:** 6-8 grade level\n\n### How to Improve\n\n- Reduce average word length\n- Use shorter sentences\n- Avoid technical jargon\n- Write in active voice\n\n### Sentence Structure Examples\n\n```\n❌ Complex: "The methodology that was implemented by the team has resulted in improved outcomes."\n\n✅ Simple: "The team\'s method improved results."\n```\n\n### Best Practices\n\n- Aim for shorter words (4-5 characters average)\n- Keep sentences to 15-20 words\n- Replace complex words with simpler ones\n- Use active voice',helpLink:"https://readabilityformulas.com/automated-readability-index.php"},{id:"readability-dale-chall",category:"readability",columnName:"Dale-Chall Readability Score",readabilityMetric:"Dale-Chall Readability Score",readabilityDescription:"Based on vocabulary familiarity using the Dale-Chall word list",readabilityThreshold:"4.9 or below (4th-9th grade)",readabilityFieldName:"dale_chall_readability_score",readabilityScoreType:"grade_level",explanation:"Measures readability based on familiar vs. unfamiliar words. Score of 4.9 or below indicates 4th-9th grade level.",remediationGuidelines:'## Dale-Chall Readability Score Improvement\n\n### What It Means\n\nMeasures readability based on vocabulary familiarity. Uses the Dale-Chall word list to identify difficult words that are not familiar to average readers.\n\n### Why It Matters\n\nThe Dale-Chall score predicts whether readers will understand the vocabulary. Lower scores indicate more accessible vocabulary choices.\n\n### Target Score\n\n**Target:** 4.9 or below (4th-9th grade level)\n\n### How to Improve\n\n- Use familiar, everyday words\n- Avoid words not on the Dale-Chall familiar word list\n- Replace complex vocabulary with simpler alternatives\n- Explain technical terms when necessary\n\n### Vocabulary Examples\n\n```\nUnfamiliar → Familiar:\n- "utilize" → "use"\n- "commence" → "start"\n- "facilitate" → "help"\n- "terminate" → "end"\n```\n\n### Best Practices\n\n- Prefer words from everyday vocabulary\n- Avoid uncommon or technical terms\n- Define specialized terms when used\n- Test vocabulary choices with target audience',helpLink:"https://readabilityformulas.com/dale-chall-readability-formula.php"},{id:"readability-spache",category:"readability",columnName:"Spache Readability Score",readabilityMetric:"Spache Readability Score",readabilityDescription:"Measures readability for elementary school texts using the Spache word list",readabilityThreshold:"3.0-5.0 (Elementary)",readabilityFieldName:"spache_readability_score",readabilityScoreType:"grade_level",explanation:"Grade level estimate for elementary school texts. Uses the Spache word list to identify familiar words.",remediationGuidelines:"## Spache Readability Score Improvement\n\n### What It Means\n\nMeasures readability specifically for elementary school level texts. Based on the Spache word list of familiar words.\n\n### Why It Matters\n\nThe Spache formula 
1is designed for younger readers (up to 4th grade). It helps ensure content is appropriate for elementary-level audiences.\n\n### Target Score\n\n**Target:** 3.0-5.0 (Elementary school level)\n\n### How to Improve\n\n- Use words from the Spache familiar word list\n- Avoid complex vocabulary\n- Keep sentences very short (10-15 words)\n- Use simple sentence structures\n\n### Best Practices\n\n- Write for young readers when targeting elementary audience\n- Use familiar, everyday words\n- Short, simple sentences\n- Avoid abstract concepts",helpLink:"https://readabilityformulas.com/spache-readability-formula.php"},{id:"readability-forcast",category:"readability",columnName:"FORCAST Grade",readabilityMetric:"FORCAST Grade",readabilityDescription:"Forced-choice readability assessment - measures readability using single-syllable word percentage",readabilityThreshold:"6-8 (Middle School)",readabilityFieldName:"forcast_grade",readabilityScoreType:"grade_level",explanation:"Grade level estimate based on percentage of single-syllable words. Target is 6-8 grade level.",remediationGuidelines:'## FORCAST Grade Improvement\n\n### What It Means\n\nFORCAST (Forced-choice readability assessment) estimates grade level based on the percentage of single-syllable words in text.\n\n### Why It Matters\n\nHigher percentages of single-syllable words indicate simpler, more accessible text. This method is useful for te
1chnical or scientific content.\n\n### Target Grade Level\n\n**Target:** 6-8 grade level\n\n### How to Improve\n\n- Increase percentage of single-syllable words\n- Replace multi-syllable words with shorter alternatives\n- Use simpler vocabulary\n- Break complex words into simpler phrases\n\n### Examples\n\n```\nMulti-syllable → Single-syllable:\n- "approximately" → "about"\n- "demonstrate" → "show"\n- "utilize" → "use"\n- "approximately" → "near"\n```\n\n### Best Practices\n\n- Prefer one-syllable words when possible\n- Replace complex words with simpler alternatives\n- Test syllable distribution\n- Aim for 60%+ single-syllable words',helpLink:"https://readabilityformulas.com/forcast-readability-formula.php"},{id:"readability-lix",category:"readability",columnName:"LIX Score",readabilityMetric:"LIX Score",readabilityDescription:"Readability measure developed for Swedish text, based on sentence and word length",readabilityThreshold:"25-35 (Easy)",readabilityFieldName:"lix_score",readabilityScoreType:"score",explanation:"LIX score ranges from 0-100+. Lower scores (25-35) indicate easier reading. Scores over 50 are difficult.",remediationGuidelines:"## LIX Score Improvement\n\n### What It Means\n\nLIX (L\xe4sbarhetsindex) is a readability measure based on average sentence length and percentage of long words (6+ letters).\n\n### Why It Matters\n\nLower LIX scores indicate easier reading. The formula is language-independent and works well for automated analysis.\n\n### Target Score\n\n**Target:** 25-35 (Easy reading)\n\n### Score Interpretation\n\n- **0-25**: Very Easy\n- **25-35**: Easy ⭐ **Target**\n- **35-45**: Medium\n- **45-55**: Difficult\n- **55+**: Very Difficult\n\n### How to Improve\n\n- Reduce sentence length\n- Minimize long words (6+ letters)\n- Use shorter, common words\n- Break up complex sentences\n\n### Best Practices\n\n- Aim for sentences under 20 words\n- Prefer words under 6 letters when possible\n- Use simple sentence structures\n- Test LIX score regularly",helpLink:"https://readable.com/blog/the-lix-formula/"},{id:"readability-rix",category:"readability",columnName:"RIX Score",readabilityMetric:"RIX Score",readabilityDescription:"Readability index using percentage of long words and sentence length",readabilityThreshold:"Low (Under 5)",readabilityFieldName:"rix_score",readabilityScoreType:"score",explanation:"RIX score is based on average sentence length and percentage of long words (7+ letters). Lower scores are better.",remediationGuidelines:'## RIX Score Improvement\n\n### What It Means\n\nRIX (Readability Index) measures readability using the percentage of long words (7+ letters) and average sentence length.\n\n### Why It Matters\n\nLower RIX scores indicate easier reading. The formula is simple and effective for automated readability assessment.\n\n### Target Score\n\n**Target:** Under 5 (Easy reading)\n\n### How to Improve\n\n- **Reduce long words**: Replace 7+ letter words with shorter alternatives\n- **Shorten sentences**: Aim for 15-20 words average\n- **Use common vocabulary**: Prefer everyday words\n- **Simplify structure**: Use straightforward sentence patterns\n\n### Examples\n\n```\nLong words → Short words:\n- "approximately" (12 letters) → "about" (5 letters)\n- "demonstration" (13 letters) → "proof" (4 letters)\n- "characteristics" (14 letters) → "traits" (6 letters)\n```\n\n### Best Practices\n\n- Minimize words with 7+ letters\n- Keep sentences concise\n- Use familiar vocabulary\n- Test RIX score regularly',helpLink:"https://readable.com/blog/the-rix-formula/"},{id:"readability-linsear-write",category:"readability",columnName:"Linsear Write Score",readabilityMetric:"Linsear Write Score",readabilityDescription:"Readability measure based on easy words vs. hard words and sentence length",readabilityThreshold:"70-80 (Easy Reading)",readabilityFieldName:"lensear_write",readabilityScoreType:"score_0_100",explanation:"Score from 0-100 where higher scores indicate easier reading. Uses easy word list to categorize vocabulary.",remediationGuidelines:"## Linsear Write Score Improvement\n\n### What It Means\n\nMeasures readability based on the ratio of easy words (from a predefined list) to hard words, plus sentence length.\n\n### Why It Matters\n\nHigher Linsear Write scores indicate easier reading. The formula uses a word list to identify familiar, easy words.\n\n### Target Score\n\n**Target:** 70-80 (Easy reading)\n\n### How to Improve\n\n- Use words from the easy word list\n- Reduce sentence length\n- Avoid complex vocabulary\n- Prefer familiar, everyday words\n\n### Best Practices\n\n- Consult easy word lists when writing\n- Keep sentences under 20 words\n- Replace hard 
1words with easy alternatives\n- Test readability with target audience",helpLink:"https://readabilityformulas.com/linsear-write-formula.php"},{id:"readability-fry",category:"readability",columnName:"Fry Grade",readabilityMetric:"Fry Grade",readabilityDescription:"Readability measure using sentence length and syllable count per 100 words",readabilityThreshold:"6-8 (Middle School)",readabilityFieldName:"fry_grade",readabilityScoreType:"grade_level",explanation:"Grade level estimate based on average sentence length and average number of syllables per 100 words.",remediationGuidelines:'## Fry Grade Improvement\n\n### What It Means\n\nEstimates grade level using average sentence length and average syllables per 100 words. Uses a graph for calculation.\n\n### Why It Matters\n\nLower Fry grades indicate more accessible content. The formula works well for a wide range of reading levels.\n\n### Target Grade Level\n\n**Target:** 6-8 grade level\n\n### How to Improve\n\n- Reduce sentence length (15-20 words)\n- Minimize multi-syllable words\n- Use simpler vocabulary\n- Break up long sentences\n\n### Examples\n\n```\nMulti-syllable → Fewer syllables:\n- "approximately" (5 syllables) → "about" (2 syllables)\n- "demonstration" (4 syllables) → "proof" (1 syllable)\n- "implementation" (5 syllables) → "use" (1 syllable)\n```\n\n### Best Practices\n\n- Aim for shorter words (fewer syllables)\n- Keep sentences concise\n- Use everyday language\n- Test with Fry graph',helpLink:"https://readabilityformulas.com/fry-readability-graph.php"},{id:"readability-raygor",category:"readability",columnName:"Raygor Grade",readabilityMetric:"Raygor Grade",readabilityDescription:"Readability estimate using sentence length and percentage of long words (6+ letters)",readabilityThreshold:"6-8 (Middle School)",readabilityFieldName:"raygor_grade",readabilityScoreType:"grade_level",explanation:"Grade level estimate based on average sentence length and percentage of long words (6 or more letters).",remediationGuidelines:'## Raygor Grade Improvement\n\n### What It Means\n\nEstimates grade level using average sentence length and percentage of long words (6 or more letters).\n\n### Why It Matters\n\nLower Raygor grades indicate easier reading. The formula uses word length as an indicator of complexity.\n\n### Target Grade Level\n\n**Target:** 6-8 grade level\n\n### How to Improve\n\n- Reduce percentage of long words (6+ letters)\n- Shorten sentences (15-20 words)\n- Use shorter, common words\n- Replace long words with shorter alternatives\n\n### Examples\n\n```\nLong words → Short words:\n- "characteristics" (14 letters) → "traits" (6 letters)\n- "approximately" (12 letters) → "about" (5 letters)\n- "demonstration" (13 letters) → "proof" (4 letters)\n```\n\n### Best Practices\n\n- Prefer words under 6 letters\n- Keep sentences under 20 words\n- Use common vocabulary\n- Test readability regularly',helpLink:"https://readabilityformulas.com/raygor-readability-estimate.php"},{id:"readability-powers-sumner-kearl",category:"readability",columnName:"Powers-Sumner-Kearl Score",readabilityMetric:"Powers-Sumner-Kearl Score",readabilityDescription:"Readability measure for elementary school texts using sentence and word length",readabilityThreshold:"3-6 (Elementary)",readabilityFieldName:"powers_sumner_kearl_score",readabilityScoreType:"grade_level",explanation:"Grade level estimate for elementary school texts. Based on sentence length and word length.",remediationGuidelines:"## Powers-Sumner-Kearl Score Improvement\n\n### What It Means\n\nReadability measure specifically designed for elementary school texts (grades 3-6). Based on sentence and word length.\n\n### Why It Matters\n\nThe Powers-Sumner-Kearl formula helps ensure content is appropriate for young readers in elementary school.\n\n### Target Score\n\n**Target:** 3-6 grade level\n\n### How to Improve\n\n- Use very short sentences (10-15 words)\n- Use simple, short words\n- Avoid complex vocabulary\n- Write for young readers\n\n### Best Practices\n\n- Keep sentences very short\n- Use familiar, everyday words\n- Avoid abstract concepts\n- Test with elementary-age readers",helpLink:"https://readabilityformulas.com/powers-sumner-kearl-formula.php"},{id:"readability-cefr",category:"readability",columnName:"CEFR Level",readabilityMetric:"CEFR Level",readabilityDescription:"Common European Framework of Reference for Languages - indicates language proficiency level",readabilityThreshold:"A2-B1 (Elementary-Intermediate)",readabilityFieldName:"
1cefr_level",readabilityScoreType:"level",explanation:"CEFR levels range from A1 (Beginner) to C2 (Proficient). A2-B1 indicates elementary to intermediate level suitable for general audiences.",remediationGuidelines:"## CEFR Level Guidelines\n\n### What It Means\n\nCommon European Framework of Reference (CEFR) indicates the language proficiency level needed to understand the text.\n\n### Why It Matters\n\nCEFR levels help ensure content is accessible to readers with different language proficiency levels. Lower levels indicate easier content.\n\n### Target Level\n\n**Target:** A2-B1 (Elementary to Intermediate)\n\n### CEFR Level Guide\n\n- **A1**: Beginner (Basic phrases)\n- **A2**: Elementary ⭐ **Target lower range**\n- **B1**: Intermediate ⭐ **Target upper range**\n- **B2**: Upper Intermediate\n- **C1**: Advanced\n- **C2**: Proficient\n\n### How to Improve\n\n- Use simple sentence structures\n- Employ everyday vocabulary\n- Avoid complex grammatical structures\n- Write for A2-B1 level proficiency\n\n### Best Practices\n\n- Test content at target CEFR level\n- Use simple grammar structures\n- Prefer common vocabulary\n- Consider language learners' needs",helpLink:"https://www.coe.int/en/web/common-european-framework-reference-languages"},{id:"readability-ielts",category:"readability",columnName:"IELTS Level",readabilityMetric:"IELTS Level",readabilityDescription:"International English Language Testing System - indicates English language proficiency level",readabilityThreshold:"4-5 (Moderate)",readabilityFieldName:"ielts_level",readabilityScoreType:"level",explanation:"IELTS band scores range from 0-9. Band 4-5 indicates moderate user level suitable for general audiences.",remediationGuidelines:"## IELTS Level Guidelines\n\n### What It Means\n\nInternational English Language Testing System (IELTS) band score indicating the English proficiency level needed.\n\n### Why It Matters\n\nIELTS levels help writers target appropriate language complexity for their audience, especially for international or multilingual readers.\n\n### Target Level\n\n**Target:** 4-5 (Moderate User level)\n\n### IELTS Band Guide\n\n- **0-3**: Non-user to Extremely Limited\n- **4**: Limited User (can understand basic situations)\n- **5**: Modest User ⭐ **Target**\n- **6**: Competent User\n- **7-9**: Good to Expert User\n\n### How to Improve\n\n- Simplify sentence structure\n- Use common vocabulary\n- Avoid complex grammatical patterns\n- Write for band 4-5 level\n\n### Best Practices\n\n- Test readability for target IELTS level\n- Use straightforward grammar\n- Prefer common words\n- Consider international audience",helpLink:"https://www.ielts.org/"},{id:"readability-average-grade",category:"readability",columnName:"Average Grade Level",readabilityMetric:"Average Grade Level",readabilityDescription:"Average of multiple grade-level readability scores",readabilityThreshold:"6-8 (Middle School)",readabilityFieldName:"average_grade_level",readabilityScoreType:"grade_level",explanation:"Average of multiple grade-level readability algorithms. Target is 6-8 for general audiences. Note: This is a deprecated measure.",remediationGuidelines:"## Average Grade Level Improvement\n\n### What It Means\n\nAn average measure of grade scores from multiple readability algorithms. **Note:** This is a deprecated measure and not recommended for new implementations.\n\n### Why It Matters\n\nWhile this measure is deprecated, it provides a general overview of text complexity across multiple readability formulas.\n\n### Target Grade Level\n\n**Target:** 6-8 (Middle School level)\n\n### Recommendation\n\nUse specific readability scores (Flesch-Kincaid, SMOG, etc.) rather than relying on this average measure.\n\n### How to Improve\n\n- Use shorter sentences (15-20 words)\n- Use simpler vocabulary\n- Write in active voice\n- Avoid complex sentence structures\n\n### Best Practices\n\n- Focus on individual readability scores\n- Don't rely solely on average grade level\n- Test with target audience\n- Use multiple readability measures",helpLink:"https://readable.com/"},{id:"readability-sentiment",category:"readability",columnName:"Sentiment",readabilityMetric:"Sentiment",readabilityDescription:"Emotional tone of the text - positive, negative, or neutral",readabilityThreshold:"Context-dependent",readabilityFieldName:"sentiment",readabilityScoreType:"sentiment",explanation:"Sentiment analysis measures the emotional tone (positive, negative, neutral) with a score from 0-100, where 0 is very negative and 100 is very positive.",remediationGuidelines:"## Sentiment Analysis\n\n### What It Means\n\nMeasures the emotional tone of the text - whether it's positive, negative, or neutral. Sentiment score ranges from 0 (very negative) to 100 (very positive).\n\n### Why It Matters\n\nSentiment affects how readers perceive and respond to content. Consider your content goals when evaluating sentiment.\n\n### Sentiment Scores\n\n- **0-30**: Very Negative\n- **31-45*
1*: Negative\n- **46-54**: Neutral\n- **55-69**: Positive\n- **70-100**: Very Positive\n\n### How to Adjust\n\n- **Increase positive sentiment**: Use positive words, focus on benefits\n- **Decrease negative sentiment**: Avoid negative language, frame constructively\n- **Maintain neutral**: Use objective, balanced language\n\n### Best Practices\n\n- Match sentiment to content purpose\n- Be authentic in tone\n- Consider audience expectations\n- Balance positive and constructive feedback",helpLink:"https://readable.com/blog/sentiment-analysis/"},{id:"readability-tone",category:"readability",columnName:"Tone",readabilityMetric:"Tone",readabilityDescription:"Formality level of the text - formal to informal",readabilityThreshold:"Context-dependent",readabilityFieldName:"tone",readabilityScoreType:"tone",explanation:"Tone analysis measures formality from 0 (very formal) to 100 (very informal). Appropriate tone depends on context and audience.",remediationGuidelines:"## Tone (Formality) Guidelines\n\n### What It Means\n\nMeasures the formality level of writing. Scores range from 0 (very formal) to 100 (very informal).\n\n### Why It Matters\n\nAppropriate tone depends on your audience and purpose. Match tone to context and reader expectations.\n\n### Tone Scale\n\n- **0-30**: Very Formal (Academic, Legal)\n- **31-50**: Formal (Professional)\n- **51-70**: Neutral ⭐ **General purpose**\n- **71-85**: Informal (Conversational)\n- **86-100**: Very Informal (Casual)\n\n### How to Adjust\n\n- **More formal**: Use complete sentences, avoid contractions, formal vocabulary\n- **More informal**: Use contractions, conversational language, simpler structure\n- **Neutral**: Balance formal and informal elements\n\n### Best Practices\n\n- Match tone to audience expectations\n- Be consistent throughout document\n- Consider content purpose\n- Test with target audience",helpLink:"https://readable.com/blog/writing-tone/"},{id:"readability-personal",category:"readability",columnName:"Personalism",readabilityMetric:"Personalism",readabilityDescription:"How personal or impersonal the writing is",readabilityThreshold:"Context-dependent",readabilityFieldName:"personal",readabilityScoreType:"personal",explanation:"Measures personalism from 0 (very impersonal) to 100 (very personal). Higher scores indicate use of personal pronouns and direct address.",remediationGuidelines:'## Personalism Guidelines\n\n### What It Means\n\nMeasures how personal or impersonal the writing is. Scores from 0 (very impersonal) to 100 (very personal).\n\n### Why It Matters\n\nPer
1sonalism affects reader connection and engagement. Choose based on content purpose and audience.\n\n### Personalism Scale\n\n- **0-30**: Very Impersonal (Technical, Academic)\n- **31-50**: Impersonal (Formal Business)\n- **51-70**: Neutral ⭐ **Balanced**\n- **71-85**: Personal (Conversational)\n- **86-100**: Very Personal (Intimate, Direct)\n\n### How to Adjust\n\n- **More personal**: Use "you", "we", personal pronouns, direct address\n- **More impersonal**: Avoid personal pronouns, use passive voice, objective language\n\n### Examples\n\n```\nImpersonal: "It is recommended that users follow the guidelines."\nPersonal: "We recommend that you follow these guidelines."\n\nImpersonal: "The document should be reviewed."\nPersonal: "You should review the document."\n```\n\n### Best Practices\n\n- Match personalism to content type\n- Consider audience preferences\n- Be consistent in approach\n- Test with target readers',helpLink:"https://readable.com/"},{id:"readability-gender",category:"readability",columnName:"Gender",readabilityMetric:"Gender",readabilityDescription:"Gender bias analysis of the text",readabilityThreshold:"Balanced (40-60)",readabilityFieldName:"gender",readabilityScoreType:"gender",explanation:"Measures gender bias from 0 (very female-oriented) to 100 (very male-oriented). Balanced scores (40-60) indicate neutral gender representation.",remediationGuidelines:'## Gender Analysis Guidelines\n\n### What It Means\n\nAnalyzes gender representation and bias in text. Scores from 0 (very female-oriented) to 100 (very male-oriented).\n\n### Why It Matters\n\nGender-neutral content is more inclusive and accessible to all readers. Balanced representation is generally preferred.\n\n### Target Score\n\n**Target:** 40-60 (Balanced, gender-neutral)\n\n### Gender Score Range\n\n- **0-30**: Very Female-Oriented\n- **31-45**: Female-Oriented\n- **46-54**: Balanced ⭐ **Target**\n- **55-69**: Male-Oriented\n- **70-100**: Very Male-Oriented\n\n### How to Improve Balance\n\n- Use gender-neutral language\n- Include diverse examples\n- Avoid gender stereotypes\n- Use inclusive pronouns\n\n### Examples\n\n```\n✅ Gender-neutral: "Users can access their accounts."\n✅ Inclusive: "People" instead of "men and women"\n✅ Diverse examples: Mix of names and pronouns\n```\n\n### Best Practices\n\n- Aim for balanced representation\n- Use inclusive language\n- Avoid gender assumptions\n- Review for bias',helpLink:"https://readable.com/"},{id:"readability-word-count",category:"readability",columnName:"Word Count",readabilityMetric:"Word Count",readabilityDescription:"Total number of words in the text",readabilityThreshold:"Context-dependent",readabilityFieldName:"word_count",readabilityScoreType:"count",explanation:"Total number of words in the analyzed text. Useful for understanding document length and complexity.",remediationGuidelines:"## Word Count Guidelines\n\n### What It Means\n\nTotal number of words in your text.\n\n### Why It Matters\n\nWord count helps assess document length and complexity. Appropriate length depends on content purpose and audience.\n\n### Considerations\n\n- **Short content** (< 300 words): Concise, focused messages\n- **Medium content** (300-1000 words): Standard articles, blog posts\n- **Long content** (1000+ words): Comprehensive guides, documentation\n\n### Best Practices\n\n- Keep introductions brief (50-100 words)\n- Break long documents into sections\n- Use headings for longer content\n- Consider reader attention span\n- Remove unnecessary words\n\n### Tips\n\n- Write first, edit later\n- Cut redundant phrases\n- Use active voice to reduce word count\n- Review for wordiness",helpLink:"https://readable.com/"},{id:"readability-sentence-count",category:"readability",columnName:"Sentence Count",readabilityMetric:"Sentence Count",readabilityDescription:"Total number of sentences in the text",readabilityThreshold:"Context-dependent",readabilityFieldName:"sentence_count",readabilityScoreType:"count",explanation:"Total number of sentences. Combined with word count, helps calculate average words per sentence.",remediationGuidelines:"## Sentence Count Guidelines\n\n### What It Means\n\nTotal number of sentences in your text.\n\n### Why It Matters\n\nSentence count, combined with word count, helps calculate average sentence length - a key readability factor.\n\n### Average Sentence Length\n\nCalculate: Word Count \xf7 Sentence Count\n\n- **10-15 words**: Easy to read ⭐ **Target**\n- **15-20 words**: Readable\n- **20-25 words**: Moderate difficulty\n- **25+ words**: Difficult to read\n\n### How to Improve\n\n- Break long sentences into shorter ones\n- Aim for 15-20 words per sentence average\n- Use punctuation effectively\n- Vary sentence length for rhythm\n\n### Best Practices\n\n- Review sentence length distribution\n- Mix short and medium sentences\n- Avoid too many very short sentences\n- Keep most sentences under 20 words",helpLink:"https://readable.com/"},{id:"readability-paragraph-count",category:"readability",columnName:"Paragraph Count",readabilityMetric:"Paragraph Count",readabilityDescription:"Total number of paragraphs in the text",readabilityThreshold:"Context-dependent",readabilityFieldName:"paragraph_count",readabilityScoreType:"count",explanation:"Total number of paragraphs. Combined with sentence count, helps calculate average sentences per paragraph.",remediationGuidelines:"## Paragraph Count Guidelines\n\n### What It Means\n\nTotal number of paragraphs in your text.\n\n### Why It Matters\n\nParagraph structure affects readability and organization. Well-structured paragraphs improve c
1omprehension.\n\n### Average Paragraph Length\n\nCalculate: Sentence Count \xf7 Paragraph Count\n\n- **3-5 sentences**: Ideal paragraph length ⭐ **Target**\n- **5-7 sentences**: Acceptable\n- **7+ sentences**: Too long - break up\n\n### How to Improve\n\n- Keep paragraphs to 3-5 sentences\n- One main idea per paragraph\n- Use shorter paragraphs for web content\n- Break long paragraphs into multiple paragraphs\n\n### Best Practices\n\n- Start new paragraph for new ideas\n- Keep paragraphs focused and concise\n- Use white space effectively\n- Test paragraph length visually",helpLink:"https://readable.com/"},{id:"readability-words-per-sentence",category:"readability",columnName:"Words Per Sentence",readabilityMetric:"Words Per Sentence",readabilityDescription:"Average number of words per sentence",readabilityThreshold:"15-20 (Ideal)",readabilityFieldName:"words_per_sentence",readabilityScoreType:"average",explanation:"Average number of words per sentence. Target is 15-20 words for optimal readability.",remediationGuidelines:'## Words Per Sentence Improvement\n\n### What It Means\n\nAverage number of words per sentence in your text.\n\n### Why It Matters\n\nShorter sentences are easier to read and understand. This is one of the most important readability factors.\n\n### Target Average\n\n**Target:** 15-20 words per sentence\n\n### Guidelines\n\n- **10-15 words**: Very easy to read ⭐ **Excellent**\n- **15-20 words**: Easy to read ⭐ **Target**\n- **20-25 words**: Moderate difficulty\n- **25-30 words**: Difficult to read\n- **30+ words**: Very difficult\n\n### How to Improve\n\n- Break long sentences into shorter ones\n- Remove unnecessary words\n- Use punctuation effectively (commas, semicolons)\n- Split complex sentences into multiple sentences\n\n### Examples\n\n```\n❌ Too long (35 words): "The comprehensive implementation of the new accessibility framework that we have developed over the past several months will facilitate improved user experiences for all visitors to our website."\n\n✅ Better (18 words): "Our new accessibility framework improves user experiences. We developed it over several months."\n```\n\n### Best Practices\n\n- Aim for most sentences to be 15-20 words\n- Occasional longer sentences are okay for variety\n- Review and shorten sentences during editing\n- Test readability regularly',helpLink:"https://readable.com/blog/how-many-words-per-sentence/"},{id:"readability-sentences-per-paragraph",category:"readability",columnName:"Sentences Per Paragraph",readabilityMetric:"Sentences Per Paragraph",readabilityDescription:"Average number of sentences per paragraph",readabilityThreshold:"3-5 (Ideal)",readabilityFieldName:"sentences_per_paragraph",readabilityScoreType:"average",explanation:"Average number of sentences per paragraph. Target is 3-5 sentences for optimal readability.",remediationGuidelines:'## Sentences Per Paragraph Improvement\n\n### What It Means\n\nAverage number of sentences per paragraph.\n\n### Why It Matters\n\nShorter paragraphs are easier to scan and understand. This is especially important for web content and digital reading.\n\n### Target Average\n\n**Target:** 3-5 sentences per paragraph\n\n### Guidelines\n\n- **3-5 sentences**: Ideal length ⭐ **Target**\n- **5-7 sentences**: Acceptable\n- **7+ sentences**: Too long - break up\n\n### How to Improve\n\n- Break long paragraphs into shorter ones\n- One main idea per paragraph\n- Use shorter paragraphs for web content\n- Create visual breaks for readability\n\n### Examples\n\n```\n❌ Too long (8 sentences):\n"The accessibility framework provides numerous benefits. It improves user experience. It ensures compliance with standards. It reduces legal risk. It increases user engagement. It supports diverse user needs. It enhances brand reputation. It demonstrates social responsibility."\n\n✅ Better (split into 2 paragraphs):\n"The accessibility framework provides numerous benefits. It improves user experience and ensures compliance with standards. It also reduces legal risk and increases user engagement.\n\nThe framework supports diverse user needs and enhances brand reputation. It demonstrates social responsibility."\n```\n\n### Best Practices\n\n- Keep most paragraphs to 3-5 sentences\n- Break up dense content\n- Use white space effectively\n- Test visual appearance',helpLink:"https://readable.com/"},{id:"readability-reading-time",category:"readability",columnName:"Reading Time",readabilityMetric:"Reading Time",readabilityDescription:"Estimated time to read the text",readabilityThreshold:"Context-dependent",readabilityFieldName:"reading_time",readabilityScoreType:"time",explanation:'Estimated reading time in format M:SS (e.g., "2:05" = 2 minutes 5 seconds). Based on average reading speed.',remediationGuidelines:"## Reading Time Guidelines\n\n### What It Means\n\nEstimated time for an average reader to read your text (based on ~200 words per minute reading speed).\n\n### Why It Matters\n\nReading time helps readers understand content length and plan their time. It's useful for setting expectations.\n\n### Considerations\n\n- **Short**: < 1 minute (quick reads, summaries)\n- **Medium**: 1-5 minutes (articles, blog posts)\n- **Long**: 5+ minutes (comprehe
1nsive guides)\n\n### How to Reduce Reading Time\n\n- Write more concisely\n- Remove redundant content\n- Use bullet points and lists\n- Break content into scannable sections\n\n### Best Practices\n\n- Display reading time for longer content\n- Consider reader attention span\n- Break long content into sections\n- Provide summaries for longer pieces",helpLink:"https://readable.com/"},{id:"readability-speaking-time",category:"readability",columnName:"Speaking Time",readabilityMetric:"Speaking Time",readabilityDescription:"Estimated time to speak the text aloud",readabilityThreshold:"Context-dependent",readabilityFieldName:"speaking_time",readabilityScoreType:"time",explanation:"Estimated speaking time in format M:SS. Useful for presentations, videos, and audio content planning.",remediationGuidelines:"## Speaking Time Guidelines\n\n### What It Means\n\nEstimated time to speak your text aloud at average speaking pace (typically ~150 words per minute).\n\n### Why It Matters\n\nSpeaking time helps plan presentations, videos, podcasts, and other spoken content.\n\n### Use Cases\n\n- **Presentations**: Plan slide timing\n- **Videos**: Estimate video length\n- **Audio content**: Plan podcast episodes\n- **Accessibility**: Create audio versions\n\n### Best Practices\n\n- Plan content around speaking time limits\n- Practice reading aloud for accurate timing\n- Adjust pace for different audiences\n- Consider pauses and emphasis",helpLink:"https://readable.com/"},{id:"readability-reach",category:"readability",columnName:"Reach",readabilityMetric:"Reach",readabilityDescription:"Percentage of addressable audience that can understand the content",readabilityThreshold:"High (70%+)",readabilityFieldName:"reach",readabilityScoreType:"percentage",explanation:"Reach indicates the percentage of your addressable audience that can understand the content. Higher reach means more accessible content.",remediationGuidelines:"## Reach Improvement\n\n### What It Means\n\nPercentage of your addressable audience that can understand the content.\n\n### Why It Matters\n\nHigher reach means your content is accessible to a larger portion of your audience. This improves engagement and effectiveness.\n\n### Target Reach\n\n**Target:** 70%+ (High reach)\n\n### How to Improve Reach\n\n- Simplify sentence structure\n- Use common vocabulary\n- Lower readability grade levels\n- Test with target audience\n- Remove complex jargon\n\n### Best Practices\n\n- Aim for high reach (70%+)\n- Consider your audience's reading level\n- Test content accessibility\n- Monitor reach over time",helpLink:"https://readable.com/"},{id:"readability-reach-public",category:"readability",columnName:"Reach (General Public)",readabilityMetric:"Reach (General Public)",readabilityDescription:"Percentage of general public that can understand the content",readabilityThreshold:"High (60%+)",readabilityFieldName:"reach_public",readabilityScoreType:"percentage",explanation:"Reach indicates the percentage of the general public that can understand the content. Higher reach means broader accessibility.",remediationGuidelines:"## Public Reach Improvement\n\n### What It Means\n\nPercentage of the general public (not just your specific audience) that can understand the content.\n\n### Why It Matters\n\nHigher public reach ensures your content is accessible to a broader population, including those with different education levels.\n\n### Target Reach\n\n**Target:** 60%+ (Good public reach)\n\n### How to Improve Public Reach\n\n- Use simpler language\n- Write at lower grade levels (6-8)\n- Avoid specialized terminology\n- Test with general public\n- Focus on common vocabulary\n\n### Best Practices\n\n- Aim for broader accessibility\n- Consider diverse audiences\n- Test with general readers\n- Simplify when possible",helpLink:"https://readable.com/"},{id:"readability-plain-language",category:"readability",columnName:"Plain Language Guidelines",readabilityMetric:"Plain Language",readabilityDescription:"Guidelines for clear, accessible communication",readabilityThreshold:"Follow all guidelines",readabilityFieldName:"plain_language_score",readabilityScoreType:"score",explanation:"Comprehensive guidelines for writing in plain language that everyone can understand.",remediationGuidelines:'## Plain 
1Language Guidelines\n\n### What It Means\n\nWriting principles for clear, accessible communication that everyone can understand.\n\n### Why It Matters\n\nPlain language improves comprehension, accessibility, and user experience. It ensures content is accessible to diverse audiences.\n\n### Core Principles\n\n1. **Use simple words** - Choose common words over complex ones\n2. **Write short sentences** - Aim for 15-20 words average\n3. **Use active voice** - "The team completed the task" not "The task was completed by the team"\n4. **Avoid jargon** - Explain technical terms\n5. **Use lists** - Break up complex information\n6. **Test with users** - Get feedback from your audience\n\n### Examples\n\n```\n❌ Complex: "Utilize the aforementioned methodology to facilitate enhanced user engagement."\n\n✅ Plain: "Use this method to help users engage more."\n```\n\n### Best Practices\n\n- Write for your audience\'s reading level\n- Test content clarity\n- Get user feedback\n- Review and simplify regularly',helpLink:"https://www.plainlanguage.gov/guidelines/"}]},{id:"internal",name:"Internal Glossary",description:"Natural language terms mapped to internal column names across Ed508, EdCrawler, EdReadable, and EdAspose",rows:ec}];function em(){let[e,n]=(0,i.useState)("wcag"),[t,r]=(0,i.useState)(),[o,s]=(0,i.useState)();return(0,i.useEffect)(()=>{let e=()=>{if(window.self!==window.top){let e=document.documentElement.scrollHeight;window.parent.postMessage({type:"resize",height:e},"*")}};e();let n=new ResizeObserver(()=>{e()});return n.observe(document.body),window.addEventListener("resize",e),()=>{n.disconnect(),window.removeEventListener("resize",e)}},[e,o]),(0,a.jsxs)("div",{className:"bg-background",children:[(0,a.jsx)("div",{className:"border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:(0,a.jsx)("div",{className:"container flex h-16 items-center justify-between px-4",children:(0,a.jsxs)("div",{className:"flex items-center space-x-4",children:[(0,a.jsx)("h1",{className:"text-2xl font-bold",children:"Guidelines & Resources"}),(0,a.jsxs)(m,{variant:"outline",className:"text-sm",children:[(0,a.jsx)(u.A,{className:"h-3 w-3 mr-1"}),"Knowledge Base"]})]})})}),(0,a.jsx)(b,{}),(0,a.jsxs)("main",{className:"container mx-auto px-4 py-6",children:[(0,a.jsx)(A,{}),(0,a.jsx)("div",{className:"mb-6",children:(0,a.jsx)(k,{data:ed,onResultClick:(e,t)=>{n(e),r(t),s(t),setTimeout(()=>{let e=document.getElementById("row-".concat(t));e&&e.scrollIntoView({behavior:"smooth",block:"center"})},100)}})}),(0,a.jsx)(ea,{data:ed,activeTab:e,onTabChange:e=>{n(e),r(void 0),s(void 0)},highlightedRowId:t,onRowExpand:e=>{o===e?s(void 0):s(e)},expandedRowId:o})]})]})}}},e=>{e.O(0,[226,441,255,358],()=>e(e.s=43828)),_N_E=e.O()}]);

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.