@wcag-checkr/ci 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{ErrorBoundary-BR92Lj44.js → ErrorBoundary-DhN8776C.js} +29 -29
- package/dist/assets/{copy-ai-fixer-prompt-C1_vIDjJ.js → copy-ai-fixer-prompt-mjxuJP2G.js} +2 -2
- package/dist/assets/{devtools-panel-BLRs10mv.js → devtools-panel-C_c7LXYL.js} +1 -1
- package/dist/assets/{parallel-tab-flow-CUZjStzy.js → parallel-tab-flow-COfe3iDM.js} +1 -1
- package/dist/assets/{rubric-config-client-CwStR9EG.js → rubric-config-client-CPb-FmVE.js} +1 -1
- package/dist/assets/{scheduled-audit-runner-J6cea_BZ.js → scheduled-audit-runner-RmvVHep6.js} +265 -262
- package/dist/assets/{service-worker.ts-D7lljTTB.js → service-worker.ts-DdLq9xdh.js} +2 -2
- package/dist/assets/side-panel-KIdHzfJr.js +4 -0
- package/dist/assets/{site-report-renderer-xmbCubzM.js → site-report-renderer-D00rATiF.js} +51 -50
- package/dist/devtools/panel.html +3 -3
- package/dist/manifest.json +1 -1
- package/dist/service-worker-loader.js +1 -1
- package/dist/side-panel/side-panel.html +5 -5
- package/package.json +1 -1
- package/dist/assets/side-panel-CINviz_y.js +0 -4
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{aW as C,a1 as y,aX as M,aY as R,G as F,aZ as G,a_ as I,a$ as D}from"./scheduled-audit-runner-RmvVHep6.js";import"./preload-helper-D7HrI6pR.js";import"./crash-reporter-KD5f4utB.js";import"./diff-Dc5xUcCG.js";import"./ai-usage-log-CYuyLsU4.js";const x={A:"#15803d",B:"#4d7c0f",C:"#a16207",D:"#dc2626",F:"#7f1d1d"},O={low:"#15803d",moderate:"#a16207",high:"#dc2626",critical:"#7f1d1d"},f={critical:"#7f1d1d",serious:"#dc2626",moderate:"#a16207",minor:"#4d7c0f"},$={critical:"#fca5a5",serious:"#fdba74",moderate:"#fcd34d",minor:"#bef264"};function n(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function v(e){if(e<1e3)return`${e}ms`;const t=Math.round(e/100)/10;if(t<60)return`${t}s`;const a=Math.floor(t/60),s=Math.round(t-a*60);return`${a}m ${s}s`}function L(e){return`<span style="display:inline-block;background:${x[e]};color:#fff;font-weight:700;padding:2px 10px;border-radius:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;">${e}</span>`}const u={A:"#047857",C:"#a16207",D:"#c2410c",F:"#be123c"};function T(e){return`<span style="display:inline-block;background:${u[e]};color:#fff;font-weight:700;padding:2px 10px;border-radius:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;">${e}</span>`}function _(e){return y(e.findingGroups??[]).map(t=>{const a=[...new Set(t.pages.map(s=>s.url))];return{ruleId:t.ruleId,description:t.axeDescription,impact:t.impact,urlsAffected:a.length,totalOccurrences:t.totalOccurrences,sampleUrls:a.slice(0,5)}}).sort((t,a)=>a.urlsAffected-t.urlsAffected||a.totalOccurrences-t.totalOccurrences)}function h(e){return`<span style="display:inline-block;background:${O[e]};color:#fff;font-weight:600;padding:2px 10px;border-radius:12px;font-size:11px;text-transform:uppercase;letter-spacing:0.05em;">${e}</span>`}function E(e){return`<span style="display:inline-block;background:${f[e]};color:#fff;font-weight:600;padding:1px 8px;border-radius:10px;font-size:11px;">${e}</span>`}function U(e,t){var s;const a=`
|
|
2
2
|
${e.pagesAudited} page${e.pagesAudited===1?"":"s"} audited
|
|
3
3
|
${e.pagesFailed>0?`· <span style="color:#fca5a5;">${e.pagesFailed} failed</span>`:""}
|
|
4
4
|
· ${v(e.totalDurationMs)}
|
|
5
|
-
· started ${new Date(e.startedAt).toLocaleString()}`;if(t){const
|
|
5
|
+
· started ${new Date(e.startedAt).toLocaleString()}`;if(t){const i=y(e.findingGroups??[]),p={critical:0,serious:0,moderate:0,minor:0};for(const o of i)p[o.impact]+=1;return`
|
|
6
6
|
<section style="background:#0f172a;color:#fff;padding:32px 40px;border-radius:8px;margin-bottom:24px;">
|
|
7
7
|
<div style="display:flex;align-items:flex-start;justify-content:space-between;gap:24px;flex-wrap:wrap;">
|
|
8
8
|
<div>
|
|
9
9
|
<p style="margin:0 0 8px;font-size:13px;color:#94a3b8;text-transform:uppercase;letter-spacing:0.08em;">Lawsuit-target risk · whole site</p>
|
|
10
|
-
<h1 style="margin:0 0 6px;font-size:24px;">${
|
|
10
|
+
<h1 style="margin:0 0 6px;font-size:24px;">${n(e.startUrl)}</h1>
|
|
11
11
|
<p style="margin:0;font-size:13px;color:#cbd5e1;">${a}</p>
|
|
12
12
|
</div>
|
|
13
13
|
<div style="text-align:right;">
|
|
@@ -24,11 +24,11 @@ import{aT as C,_ as y,aU as R,aV as S,G as F,aW as I,aX as G}from"./scheduled-au
|
|
|
24
24
|
`).join("")}
|
|
25
25
|
<div style="background:#1e293b;padding:10px 14px;border-radius:6px;">
|
|
26
26
|
<div style="font-size:11px;color:#94a3b8;text-transform:uppercase;letter-spacing:0.06em;">Lawsuit-target findings</div>
|
|
27
|
-
<div style="font-size:24px;font-weight:700;color:${
|
|
27
|
+
<div style="font-size:24px;font-weight:700;color:${i.length>0?"#fca5a5":"#fff"};">${i.length}</div>
|
|
28
28
|
</div>
|
|
29
29
|
</div>
|
|
30
30
|
<p style="margin:18px 0 0;font-size:12px;color:#cbd5e1;line-height:1.5;">
|
|
31
|
-
<strong>${
|
|
31
|
+
<strong>${n(t.tier)} risk.</strong> ${n(t.headline)}<br/>
|
|
32
32
|
This is a <strong>lawsuit-target exposure</strong> grade — how easily automated demand-letter scanners flag this site — <strong>not</strong> a WCAG conformance grade. For a full WCAG 2.1 AA assessment across every criterion, switch to Power or Dev mode in the extension.
|
|
33
33
|
</p>
|
|
34
34
|
</section>
|
|
@@ -37,7 +37,7 @@ import{aT as C,_ as y,aU as R,aV as S,G as F,aW as I,aX as G}from"./scheduled-au
|
|
|
37
37
|
<div style="display:flex;align-items:flex-start;justify-content:space-between;gap:24px;flex-wrap:wrap;">
|
|
38
38
|
<div>
|
|
39
39
|
<p style="margin:0 0 8px;font-size:13px;color:#94a3b8;text-transform:uppercase;letter-spacing:0.08em;">Site-wide audit</p>
|
|
40
|
-
<h1 style="margin:0 0 6px;font-size:24px;">${
|
|
40
|
+
<h1 style="margin:0 0 6px;font-size:24px;">${n(e.startUrl)}</h1>
|
|
41
41
|
<p style="margin:0;font-size:13px;color:#cbd5e1;">${a}</p>
|
|
42
42
|
</div>
|
|
43
43
|
<div style="text-align:right;">
|
|
@@ -46,10 +46,10 @@ import{aT as C,_ as y,aU as R,aV as S,G as F,aW as I,aX as G}from"./scheduled-au
|
|
|
46
46
|
</div>
|
|
47
47
|
</div>
|
|
48
48
|
<div style="margin-top:20px;display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;">
|
|
49
|
-
${["critical","serious","moderate","minor"].map(
|
|
49
|
+
${["critical","serious","moderate","minor"].map(i=>`
|
|
50
50
|
<div style="background:#1e293b;padding:10px 14px;border-radius:6px;">
|
|
51
|
-
<div style="font-size:11px;color:#94a3b8;text-transform:uppercase;letter-spacing:0.06em;">${
|
|
52
|
-
<div style="font-size:24px;font-weight:700;color:${$[
|
|
51
|
+
<div style="font-size:11px;color:#94a3b8;text-transform:uppercase;letter-spacing:0.06em;">${i}</div>
|
|
52
|
+
<div style="font-size:24px;font-weight:700;color:${$[i]};">${e.totals[i]}</div>
|
|
53
53
|
</div>
|
|
54
54
|
`).join("")}
|
|
55
55
|
<div style="background:#1e293b;padding:10px 14px;border-radius:6px;">
|
|
@@ -62,15 +62,16 @@ import{aT as C,_ as y,aU as R,aV as S,G as F,aW as I,aX as G}from"./scheduled-au
|
|
|
62
62
|
</div>
|
|
63
63
|
</div>
|
|
64
64
|
<p style="margin:18px 0 0;font-size:12px;color:#cbd5e1;line-height:1.5;">
|
|
65
|
-
<strong>Grade:</strong> ${
|
|
66
|
-
<strong>Risk:</strong> ${
|
|
65
|
+
<strong>Grade:</strong> ${n(M(e.siteGrade,{moderateCount:e.totals.moderate,blockingCriteriaCount:((s=e.blockingCriteria)==null?void 0:s.length)??0}))}<br/>
|
|
66
|
+
<strong>Risk:</strong> ${n(R[e.siteRisk])}
|
|
67
67
|
</p>
|
|
68
68
|
<p style="margin:14px 0 0;padding:12px 14px;background:#0f172a;border:1px solid #334155;border-radius:6px;font-size:11px;color:#94a3b8;line-height:1.6;">
|
|
69
|
-
${
|
|
69
|
+
${n(F)}
|
|
70
70
|
</p>
|
|
71
71
|
<p style="margin:10px 0 0;font-size:12px;color:#cbd5e1;">
|
|
72
|
-
<strong>Audit rigor:</strong> ${
|
|
73
|
-
${
|
|
72
|
+
<strong>Audit rigor:</strong> ${n(G(e.auditSettings))}
|
|
73
|
+
${(()=>{const i=I(e.auditSettings);return i?`<br/><span style="color:#fca5a5;font-weight:600;">⚠ ${n(i)}</span>`:'<br/><span style="color:#86efac;font-weight:600;">✓ Full 2.1 AA audit — settings cleared the conformance bar.</span>'})()}
|
|
74
|
+
<br/><span style="color:#94a3b8;">${n(D)}</span>
|
|
74
75
|
</p>
|
|
75
76
|
</section>
|
|
76
77
|
`}function j(e,t=!1){const a=t?"Top lawsuit-target findings":"Top site-wide violations";if(e.length===0)return`
|
|
@@ -78,13 +79,13 @@ import{aT as C,_ as y,aU as R,aV as S,G as F,aW as I,aX as G}from"./scheduled-au
|
|
|
78
79
|
<h2 style="margin:0 0 8px;font-size:18px;">${a}</h2>
|
|
79
80
|
<p style="color:#16a34a;font-weight:500;">${t?"No findings of the kind automated demand-letter scanners commonly flag (missing alt text, low contrast, unlabeled controls, missing page language/title, link/button names). That keeps this site off the easy-target list — but it is not a WCAG conformance claim. For a full WCAG 2.1 AA assessment across every criterion, switch to Power or Dev mode.":"No violations detected across the layers that ran: axe-core (rule-based automation), wcagcheckr DOM analyzers (state-matrix + structural heuristics), AI walkthroughs (keyboard / vision / DOM-walk over 6 hard-to-automate criteria), and cross-page comparators (consistency criteria on crawls). All 50 applicable WCAG 2.1 AA criteria have at least one evaluation path here. Some criteria still benefit from human spot-checks: caption accuracy, audio-description quality, sensory cues, and complex screen-reader narrative — see the manual checklist if pursuing a formal conformance claim."}</p>
|
|
80
81
|
</section>
|
|
81
|
-
`;const s=e.slice(0,20).map(
|
|
82
|
+
`;const s=e.slice(0,20).map(i=>`
|
|
82
83
|
<tr style="border-top:1px solid #e2e8f0;">
|
|
83
|
-
<td style="padding:8px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;">${i
|
|
84
|
-
<td style="padding:8px 12px;">${
|
|
85
|
-
<td style="padding:8px 12px;text-align:right;font-weight:600;">${
|
|
86
|
-
<td style="padding:8px 12px;text-align:right;">${
|
|
87
|
-
<td style="padding:8px 12px;font-size:13px;color:#475569;">${i
|
|
84
|
+
<td style="padding:8px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;">${n(i.ruleId)}</td>
|
|
85
|
+
<td style="padding:8px 12px;">${E(i.impact)}</td>
|
|
86
|
+
<td style="padding:8px 12px;text-align:right;font-weight:600;">${i.urlsAffected}</td>
|
|
87
|
+
<td style="padding:8px 12px;text-align:right;">${i.totalOccurrences}</td>
|
|
88
|
+
<td style="padding:8px 12px;font-size:13px;color:#475569;">${n(i.description)}</td>
|
|
88
89
|
</tr>
|
|
89
90
|
`).join("");return`
|
|
90
91
|
<section style="margin-bottom:24px;">
|
|
@@ -105,33 +106,33 @@ import{aT as C,_ as y,aU as R,aV as S,G as F,aW as I,aX as G}from"./scheduled-au
|
|
|
105
106
|
<tbody>${s}</tbody>
|
|
106
107
|
</table>
|
|
107
108
|
</section>
|
|
108
|
-
`}function W(e,t,a){const s=new Map;for(const o of t)if(!o.needsReview)for(const d of o.pages){const r=s.get(d.url)??[];r.push({ruleId:o.ruleId,impact:o.impact,selector:d.selector,description:o.axeDescription,wcagCriterion:o.wcagCriterion}),s.set(d.url,r)}const
|
|
109
|
+
`}function W(e,t,a){const s=new Map;for(const o of t)if(!o.needsReview)for(const d of o.pages){const r=s.get(d.url)??[];r.push({ruleId:o.ruleId,impact:o.impact,selector:d.selector,description:o.axeDescription,wcagCriterion:o.wcagCriterion}),s.set(d.url,r)}const i={critical:0,serious:1,moderate:2,minor:3};for(const o of s.values())o.sort((d,r)=>(i[d.impact]??99)-(i[r.impact]??99));const p=e.map((o,d)=>{const r=s.get(o.url)??[],c=a?[]:o.walkthroughFindings??[],g=a?[]:o.walkthroughAcknowledgements??[],m=r.length+c.length>0||g.length>0||!!o.error,b=`
|
|
109
110
|
<summary style="cursor:${m?"pointer":"default"};list-style:${m?"revert":"none"};padding:10px 12px;display:flex;align-items:center;gap:12px;border-top:1px solid #e2e8f0;">
|
|
110
111
|
<span style="color:#64748b;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;min-width:28px;">${d+1}</span>
|
|
111
|
-
${a?T(a.perUrlLetter[o.url]??"A"):
|
|
112
|
+
${a?T(a.perUrlLetter[o.url]??"A"):L(o.grade)}
|
|
112
113
|
${a?"":h(o.risk)}
|
|
113
114
|
<!-- rc.390 — URL is plain text here (the page-open link moved into the
|
|
114
115
|
expanded detail). An <a> inside <summary> is nested-interactive +
|
|
115
116
|
a sub-24px touch target. -->
|
|
116
117
|
<span
|
|
117
118
|
style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;color:#475569;flex:1;word-break:break-all;"
|
|
118
|
-
>${
|
|
119
|
+
>${n(o.url)}</span>
|
|
119
120
|
<span style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;color:#475569;white-space:nowrap;">
|
|
120
121
|
${r.length>0?`<strong style="color:#b91c1c;">${r.length} axe</strong>`:'<span style="color:#475569;">0 axe</span>'}
|
|
121
122
|
${c.length>0?` · <strong style="color:#b91c1c;">${c.length} walkthru</strong>`:g.length>0?` · <span style="color:#15803d;">${g.length} ✓ack</span>`:""}
|
|
122
123
|
</span>
|
|
123
124
|
<span style="color:#475569;font-size:11px;white-space:nowrap;">${v(o.durationMs)}</span>
|
|
124
|
-
</summary>`;if(!m)return`<details>${b}</details>`;const w=o.error?`<p style="color:#dc2626;font-size:13px;margin:0;padding:8px 12px 0;">⚠ ${
|
|
125
|
+
</summary>`;if(!m)return`<details>${b}</details>`;const w=o.error?`<p style="color:#dc2626;font-size:13px;margin:0;padding:8px 12px 0;">⚠ ${n(o.error)}</p>`:"",k=r.length===0?"":`
|
|
125
126
|
<h4 style="margin:12px 12px 4px;font-size:13px;color:#475569;">Axe findings (${r.length})</h4>
|
|
126
127
|
<ul style="margin:0;padding:0 12px 8px 28px;font-size:12px;line-height:1.5;">
|
|
127
128
|
${r.map(l=>`
|
|
128
129
|
<li style="margin-bottom:4px;">
|
|
129
|
-
<span style="display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600;color:${f[l.impact]??"#475569"};margin-right:6px;">${
|
|
130
|
-
<code style="background:#f1f5f9;padding:1px 4px;border-radius:2px;">${
|
|
131
|
-
${l.wcagCriterion?` · <span style="color:#64748b;">${
|
|
130
|
+
<span style="display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600;color:${f[l.impact]??"#475569"};margin-right:6px;">${n(l.impact)}</span>
|
|
131
|
+
<code style="background:#f1f5f9;padding:1px 4px;border-radius:2px;">${n(l.ruleId)}</code>
|
|
132
|
+
${l.wcagCriterion?` · <span style="color:#64748b;">${n(l.wcagCriterion)}</span>`:""}
|
|
132
133
|
<br>
|
|
133
|
-
<span style="color:#475569;">${
|
|
134
|
-
<code style="font-size:11px;color:#475569;word-break:break-all;">${
|
|
134
|
+
<span style="color:#475569;">${n(l.description)}</span><br>
|
|
135
|
+
<code style="font-size:11px;color:#475569;word-break:break-all;">${n(l.selector)}</code>
|
|
135
136
|
</li>
|
|
136
137
|
`).join("")}
|
|
137
138
|
</ul>`,A=c.length===0?"":`
|
|
@@ -139,21 +140,21 @@ import{aT as C,_ as y,aU as R,aV as S,G as F,aW as I,aX as G}from"./scheduled-au
|
|
|
139
140
|
<ul style="margin:0;padding:0 12px 8px 28px;font-size:12px;line-height:1.5;">
|
|
140
141
|
${c.map(l=>`
|
|
141
142
|
<li style="margin-bottom:6px;">
|
|
142
|
-
<span style="display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600;color:${l.verdict==="fail"?f.serious:f.moderate};margin-right:6px;">${
|
|
143
|
-
<code style="background:#f1f5f9;padding:1px 4px;border-radius:2px;">${
|
|
143
|
+
<span style="display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600;color:${l.verdict==="fail"?f.serious:f.moderate};margin-right:6px;">${n(l.verdict)}</span>
|
|
144
|
+
<code style="background:#f1f5f9;padding:1px 4px;border-radius:2px;">${n(l.criterionId)}</code>
|
|
144
145
|
<br>
|
|
145
|
-
<span style="color:#475569;">${
|
|
146
|
+
<span style="color:#475569;">${n(l.reasoning)}</span>
|
|
146
147
|
</li>
|
|
147
148
|
`).join("")}
|
|
148
149
|
</ul>`,z=g.length===0?"":`
|
|
149
150
|
<h4 style="margin:12px 12px 4px;font-size:13px;color:#059669;">Human verified (${g.length})</h4>
|
|
150
151
|
<ul style="margin:0;padding:0 12px 8px 28px;font-size:12px;line-height:1.5;color:#065f46;">
|
|
151
152
|
${g.map(l=>`
|
|
152
|
-
<li><code style="background:#ecfdf5;padding:1px 4px;border-radius:2px;">${
|
|
153
|
+
<li><code style="background:#ecfdf5;padding:1px 4px;border-radius:2px;">${n(l.criterionId)}</code> — original AI verdict: ${n(l.verdict)}; human verification recorded.</li>
|
|
153
154
|
`).join("")}
|
|
154
|
-
</ul>`,
|
|
155
|
+
</ul>`,S=`
|
|
155
156
|
<div style="padding:8px 12px 12px;font-size:12px;color:#475569;">
|
|
156
|
-
<a href="${
|
|
157
|
+
<a href="${n(o.url)}" target="_blank" rel="noopener noreferrer"
|
|
157
158
|
style="color:#1d4ed8;font-weight:600;display:inline-block;padding:4px 0;">Open this page in a new tab →</a><br>
|
|
158
159
|
Then use the wcagcheckr side panel for per-finding acknowledgements and re-runs.
|
|
159
160
|
</div>`;return`
|
|
@@ -164,7 +165,7 @@ import{aT as C,_ as y,aU as R,aV as S,G as F,aW as I,aX as G}from"./scheduled-au
|
|
|
164
165
|
${k}
|
|
165
166
|
${A}
|
|
166
167
|
${z}
|
|
167
|
-
${
|
|
168
|
+
${S}
|
|
168
169
|
</div>
|
|
169
170
|
</details>`}).join("");return`
|
|
170
171
|
<section style="margin-bottom:24px;">
|
|
@@ -178,7 +179,7 @@ import{aT as C,_ as y,aU as R,aV as S,G as F,aW as I,aX as G}from"./scheduled-au
|
|
|
178
179
|
${p}
|
|
179
180
|
</div>
|
|
180
181
|
</section>
|
|
181
|
-
`}function
|
|
182
|
+
`}function B(e){const t=e.blockingCriteria??[];if(t.length===0)return"";const a={untested:{label:"no evidence",bg:"#64748b"},inconclusive:{label:"inconclusive",bg:"#a16207"},failing:{label:"failing",bg:"#dc2626"}};return`
|
|
182
183
|
<section style="margin-top:24px;padding:16px 18px;border:1px solid #cbd5e1;border-radius:8px;background:#f8fafc;">
|
|
183
184
|
<h2 style="margin:0 0 8px;font-size:16px;color:#0f172a;">
|
|
184
185
|
Criteria still needing your judgment
|
|
@@ -188,17 +189,17 @@ import{aT as C,_ as y,aU as R,aV as S,G as F,aW as I,aX as G}from"./scheduled-au
|
|
|
188
189
|
These WCAG 2.1 AA criteria do not yet have affirmative pass/N/A evidence. Open the extension side panel and expand the "Coverage gaps" panel under the grade to record a verdict for each. Once every blocker has a verdict, the site grade lifts to A.
|
|
189
190
|
</p>
|
|
190
191
|
<ol style="margin:0;padding-left:18px;font-size:12px;color:#0f172a;">
|
|
191
|
-
${t.map(s=>{const
|
|
192
|
-
<span style="display:inline-block;padding:1px 6px;border-radius:3px;background:${
|
|
193
|
-
<code style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;">WCAG ${
|
|
194
|
-
<span style="color:#334155;">— ${
|
|
192
|
+
${t.map(s=>{const i=a[s.state];return`<li style="margin-bottom:6px;">
|
|
193
|
+
<span style="display:inline-block;padding:1px 6px;border-radius:3px;background:${i.bg};color:#fff;font-size:10px;font-weight:600;text-transform:lowercase;">${n(i.label)}</span>
|
|
194
|
+
<code style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;">WCAG ${n(s.criterionId)}</code>
|
|
195
|
+
<span style="color:#334155;">— ${n(s.title)}</span>
|
|
195
196
|
</li>`}).join("")}
|
|
196
197
|
</ol>
|
|
197
198
|
</section>
|
|
198
|
-
`}function
|
|
199
|
+
`}function P(e,t){const a=e.pages.length||1;if(t){const i={A:0,C:0,D:0,F:0};for(const o of e.pages)i[t.perUrlLetter[o.url]??"A"]+=1;return`
|
|
199
200
|
<section style="margin-bottom:24px;">
|
|
200
201
|
<h2 style="margin:0 0 8px;font-size:18px;">Pages by lawsuit-target grade</h2>
|
|
201
|
-
${["A","C","D","F"].map(o=>{const d=
|
|
202
|
+
${["A","C","D","F"].map(o=>{const d=i[o],r=d/a*100;return`
|
|
202
203
|
<div style="display:flex;align-items:center;gap:10px;font-size:13px;margin:4px 0;">
|
|
203
204
|
<div style="width:24px;font-weight:700;color:${u[o]};font-family:ui-monospace,SFMono-Regular,Menlo,monospace;">${o}</div>
|
|
204
205
|
<div style="flex:1;background:#e2e8f0;border-radius:3px;height:18px;overflow:hidden;">
|
|
@@ -210,18 +211,18 @@ import{aT as C,_ as y,aU as R,aV as S,G as F,aW as I,aX as G}from"./scheduled-au
|
|
|
210
211
|
`}return`
|
|
211
212
|
<section style="margin-bottom:24px;">
|
|
212
213
|
<h2 style="margin:0 0 8px;font-size:18px;">Pages by grade</h2>
|
|
213
|
-
${["A","B","C","D","F"].map(
|
|
214
|
+
${["A","B","C","D","F"].map(i=>{const p=e.pagesByGrade[i],o=p/a*100;return`
|
|
214
215
|
<div style="display:flex;align-items:center;gap:10px;font-size:13px;margin:4px 0;">
|
|
215
|
-
<div style="width:24px;font-weight:700;color:${x[
|
|
216
|
+
<div style="width:24px;font-weight:700;color:${x[i]};font-family:ui-monospace,SFMono-Regular,Menlo,monospace;">${i}</div>
|
|
216
217
|
<div style="flex:1;background:#e2e8f0;border-radius:3px;height:18px;overflow:hidden;">
|
|
217
|
-
<div style="height:100%;width:${o}%;background:${x[
|
|
218
|
+
<div style="height:100%;width:${o}%;background:${x[i]};"></div>
|
|
218
219
|
</div>
|
|
219
220
|
<div style="width:60px;text-align:right;color:#475569;">${p} page${p===1?"":"s"}</div>
|
|
220
221
|
</div>
|
|
221
222
|
`}).join("")}
|
|
222
223
|
</section>
|
|
223
|
-
`}function X(e,t,a){const s=t?`Lawsuit-target risk · ${
|
|
224
|
-
<br/>This report covers <strong>only</strong> the issues automated demand-letter scanners commonly flag (the lawsuit-target lens). It is <strong>not</strong> a WCAG 2.1 AA conformance assessment — for that, switch the extension to Power or Dev mode, which grades every applicable criterion across all pages.`:`Generated by wcagcheckr · site-mode crawl from ${
|
|
224
|
+
`}function X(e,t,a){const s=t?`Lawsuit-target risk · ${n(e.startUrl)}`:`WCAG site audit · ${n(e.startUrl)}`,i=t?_(e):e.topViolations,p=t?"":B(e),o=t?"":C(a??[],n),d=t?y(e.findingGroups??[]):e.findingGroups??[],r=t?`Generated by wcagcheckr · owner / lawsuit-target lens · site-mode crawl from ${n(e.startUrl)} · finished ${new Date(e.finishedAt).toLocaleString()}.
|
|
225
|
+
<br/>This report covers <strong>only</strong> the issues automated demand-letter scanners commonly flag (the lawsuit-target lens). It is <strong>not</strong> a WCAG 2.1 AA conformance assessment — for that, switch the extension to Power or Dev mode, which grades every applicable criterion across all pages.`:`Generated by wcagcheckr · site-mode crawl from ${n(e.startUrl)} · finished ${new Date(e.finishedAt).toLocaleString()}.
|
|
225
226
|
<br/>Three evaluation layers: <strong>axe-core</strong> (rule-based automation), <strong>wcagcheckr DOM analyzers</strong> (state-matrix iteration + structural heuristics for criteria axe doesn't cover), and <strong>AI walkthroughs</strong> (real keyboard input + screenshot-by-screenshot judgment for the 6 criteria neither rule-based nor static-DOM analysis can decide). All 50 applicable WCAG 2.1 AA criteria have an evaluation path here; criteria that depend on content meaning — caption accuracy, audio-description quality, alt-text semantic correctness, complex screen-reader narrative — benefit from human spot-checks before a formal conformance claim. See MANUAL_A11Y_CHECKLIST.md for the recommended human checks.`;return`<!doctype html>
|
|
226
227
|
<html lang="en">
|
|
227
228
|
<head>
|
|
@@ -243,10 +244,10 @@ import{aT as C,_ as y,aU as R,aV as S,G as F,aW as I,aX as G}from"./scheduled-au
|
|
|
243
244
|
<body>
|
|
244
245
|
<main class="container">
|
|
245
246
|
${U(e,t)}
|
|
246
|
-
${j(
|
|
247
|
+
${j(i,!!t)}
|
|
247
248
|
${p}
|
|
248
249
|
${o}
|
|
249
|
-
${
|
|
250
|
+
${P(e,t)}
|
|
250
251
|
${W(e.pages,d,t)}
|
|
251
252
|
<footer style="margin-top:32px;padding-top:16px;border-top:1px solid #e2e8f0;color:#475569;font-size:12px;">
|
|
252
253
|
${r}
|
package/dist/devtools/panel.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<title>wcagcheckr</title>
|
|
6
|
-
<script type="module" crossorigin src="/assets/devtools-panel-
|
|
6
|
+
<script type="module" crossorigin src="/assets/devtools-panel-C_c7LXYL.js"></script>
|
|
7
7
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-B5Qt9EMX.js">
|
|
8
8
|
<link rel="modulepreload" crossorigin href="/assets/_commonjsHelpers-Cpj98o6Y.js">
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/crash-reporter-KD5f4utB.js">
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/styles-CLV9y-Ki.js">
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-D7HrI6pR.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/diff-Dc5xUcCG.js">
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/scheduled-audit-runner-
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/scheduled-audit-runner-RmvVHep6.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/design-system-audit-DpxJrxnb.js">
|
|
16
|
-
<link rel="modulepreload" crossorigin href="/assets/ErrorBoundary-
|
|
16
|
+
<link rel="modulepreload" crossorigin href="/assets/ErrorBoundary-DhN8776C.js">
|
|
17
17
|
<link rel="stylesheet" crossorigin href="/assets/styles-BJICDw6s.css">
|
|
18
18
|
</head>
|
|
19
19
|
<body class="bg-slate-50">
|
package/dist/manifest.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"name": "wcagcheckr",
|
|
4
4
|
"description": "Audit your real site for WCAG issues across hover, focus, dark mode & RTL states — baselines surface only NEW violations.",
|
|
5
|
-
"version": "1.0.
|
|
5
|
+
"version": "1.0.9",
|
|
6
6
|
"author": "Locustware",
|
|
7
7
|
"homepage_url": "https://wcagcheckr.com",
|
|
8
8
|
"icons": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import './assets/service-worker.ts-
|
|
1
|
+
import './assets/service-worker.ts-DdLq9xdh.js';
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>WCAG Component Auditor</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/side-panel-
|
|
7
|
+
<script type="module" crossorigin src="/assets/side-panel-KIdHzfJr.js"></script>
|
|
8
8
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-B5Qt9EMX.js">
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/_commonjsHelpers-Cpj98o6Y.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/crash-reporter-KD5f4utB.js">
|
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/styles-CLV9y-Ki.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-D7HrI6pR.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/diff-Dc5xUcCG.js">
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/scheduled-audit-runner-
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/assets/scheduled-audit-runner-RmvVHep6.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/design-system-audit-DpxJrxnb.js">
|
|
17
|
-
<link rel="modulepreload" crossorigin href="/assets/ErrorBoundary-
|
|
18
|
-
<link rel="modulepreload" crossorigin href="/assets/copy-ai-fixer-prompt-
|
|
17
|
+
<link rel="modulepreload" crossorigin href="/assets/ErrorBoundary-DhN8776C.js">
|
|
18
|
+
<link rel="modulepreload" crossorigin href="/assets/copy-ai-fixer-prompt-mjxuJP2G.js">
|
|
19
19
|
<link rel="modulepreload" crossorigin href="/assets/tier-config-client-CT-oOti3.js">
|
|
20
|
-
<link rel="modulepreload" crossorigin href="/assets/rubric-config-client-
|
|
20
|
+
<link rel="modulepreload" crossorigin href="/assets/rubric-config-client-CPb-FmVE.js">
|
|
21
21
|
<link rel="stylesheet" crossorigin href="/assets/styles-BJICDw6s.css">
|
|
22
22
|
<link rel="stylesheet" crossorigin href="/assets/side-panel-Cq-w2yTn.css">
|
|
23
23
|
</head>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wcag-checkr/ci",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Headless wcagcheckr accessibility audit runner for CI/CD pipelines. Drives the wcagcheckr Chrome extension via Playwright, runs full-page audits across the state matrix (108 combinations: hover, focus, dark mode, RTL, breakpoints), outputs JSON / SARIF / JUnit, exits with severity-aware codes.",
|
|
6
6
|
"license": "UNLICENSED",
|