@wcag-checkr/ci 1.0.0-rc.276 → 1.0.0-rc.277
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-CzXGFZe4.js → ErrorBoundary-Buu85ak7.js} +3 -3
- package/dist/assets/{copy-ai-fixer-prompt-BHYSg4i0.js → copy-ai-fixer-prompt-BHi-aVOx.js} +2 -2
- package/dist/assets/{devtools-panel-CRNDbFry.js → devtools-panel-rbsN4EGQ.js} +1 -1
- package/dist/assets/{side-panel-KkvjZNfp.js → side-panel-vH1TtNvJ.js} +1 -1
- package/dist/devtools/panel.html +2 -2
- package/dist/manifest.json +2 -2
- package/dist/side-panel/side-panel.html +2 -2
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/scheduled-audit-runner-BqTcRkAP.js","assets/diff-DA41zYPc.js","assets/crash-reporter-Dc5lvxvY.js","assets/ai-usage-log-C-jq4cW3.js","assets/copy-ai-fixer-prompt-
|
|
2
|
-
var Ba=Object.defineProperty;var Ha=(t,s,a)=>s in t?Ba(t,s,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[s]=a;var ls=(t,s,a)=>Ha(t,typeof s!="symbol"?s+"":s,a);import{R as ze,i as ge,r as m,j as e,M as Me,C as Lt,A as tt}from"./styles-DToZ04ht.js";import{s as Xs,i as Bt,g as Ka,a as ue,d as Zs,l as Ue,S as De,b as qe,c as Ie,e as Le,f as Ht,h as ea,j as za,k as Kt,A as fe,m as qa,n as Qa,o as Ya,u as Ja,p as Xa,q as Za,r as en,t as zt,v as tn,w as sn,N as an,x as _t,y as ta,z as Dt,B as nn,O as rn,C as dt,D as ut,E as on,F as ln,G as cs,H as cn,I as dn,J as un,K as pn,L as hn,M as mn,P as xn,Q as gn,R as fn,T as bn,U as vn,V as yn,W as wn,X as sa,Y as jn,Z as ds,_ as us,$ as kt,a0 as Nn,a1 as ps,a2 as kn,a3 as Sn,a4 as An,a5 as Cn,a6 as In}from"./scheduled-audit-runner-BqTcRkAP.js";import{_ as ke}from"./diff-DA41zYPc.js";import{o as we,r as Z,s as ae,c as aa,b as be,d as Ee}from"./crash-reporter-Dc5lvxvY.js";import{g as na,j as ft,k as bt,t as et,m as En,B as Oe,i as qt,n as Rn,o as $e,T as ra,p as ia,q as vt,u as Tn}from"./ai-usage-log-C-jq4cW3.js";import{s as $n,t as Un}from"./design-system-audit-DpxJrxnb.js";const hs=t=>{let s;const a=new Set,n=(p,c)=>{const u=typeof p=="function"?p(s):p;if(!Object.is(u,s)){const h=s;s=c??(typeof u!="object"||u===null)?u:Object.assign({},s,u),a.forEach(x=>x(s,h))}},r=()=>s,i={setState:n,getState:r,getInitialState:()=>d,subscribe:p=>(a.add(p),()=>a.delete(p))},d=s=t(n,r,i);return i},Ln=t=>t?hs(t):hs,_n=t=>t;function Dn(t,s=_n){const a=ze.useSyncExternalStore(t.subscribe,ze.useCallback(()=>s(t.getState()),[t,s]),ze.useCallback(()=>s(t.getInitialState()),[t,s]));return ze.useDebugValue(a),a}const ms=t=>{const s=Ln(t),a=n=>Dn(s,n);return Object.assign(a,s),a},On=t=>t?ms(t):ms,y=On(t=>({status:"idle",progress:null,results:[],delta:null,componentId:null,errorMessage:null,freshThisSession:!1,baselineList:[],tier:"trial",trialDaysRemaining:null,seatsUsed:null,seatsTotal:null,planCode:null,licenseDaysRemaining:null,pastDue:!1,messages:[],unreadMessageCount:0,criticalUnacked:!1,view:"matrix",findingsLens:"overview",userMode:null,siteCrawlStatus:"idle",siteCrawlProgress:null,siteCrawlReport:null,siteCrawlError:null,crawlNavContext:null,resolutionsByUrl:{},pinnedMatchKey:null,pinnedFound:!0,aiFailure:null,aiProgress:null,acknowledgedKeys:new Set,pendingAreaExpand:null,auditStartedAtMs:null,lastAuditWallClockMs:null,setStatus:s=>t({status:s}),startNewScan:()=>t({status:"running",results:[],delta:null,errorMessage:null,progress:null,componentId:null,pinnedMatchKey:null,pinnedFound:!0,aiFailure:null,aiProgress:null,auditStartedAtMs:Date.now(),crawlNavContext:null}),setProgress:s=>t({progress:s}),setResults:(s,a,n)=>t(r=>{const o=r.auditStartedAtMs?Date.now()-r.auditStartedAtMs:null;return{results:s,delta:a,componentId:n,status:"complete",errorMessage:null,freshThisSession:!0,aiProgress:null,pinnedMatchKey:null,pinnedFound:!0,lastAuditWallClockMs:o,auditStartedAtMs:null}}),setDelta:s=>t({delta:s}),setError:s=>t({errorMessage:s,status:"failed"}),setBaselineList:s=>t({baselineList:s}),clearResults:()=>t({results:[],delta:null,componentId:null,errorMessage:null,progress:null,status:"idle",freshThisSession:!1,pinnedMatchKey:null,pinnedFound:!0,aiFailure:null,aiProgress:null}),setTier:(s,a)=>t({tier:s,trialDaysRemaining:(a==null?void 0:a.trialDaysRemaining)??null,seatsUsed:(a==null?void 0:a.seatsUsed)??null,seatsTotal:(a==null?void 0:a.seatsTotal)??null,planCode:(a==null?void 0:a.planCode)??null,licenseDaysRemaining:(a==null?void 0:a.licenseDaysRemaining)??null,pastDue:(a==null?void 0:a.pastDue)??!1}),setView:s=>t({view:s}),setFindingsLens:s=>t({findingsLens:s}),setPendingAreaExpand:s=>t({pendingAreaExpand:s}),setUserMode:s=>t({userMode:s}),setSiteCrawlStatus:s=>t({siteCrawlStatus:s}),setCrawlNavContext:s=>t({crawlNavContext:s}),setResolutionsForUrl:(s,a)=>t(n=>({resolutionsByUrl:{...n.resolutionsByUrl,[s]:a}})),setSiteCrawlProgress:s=>t({siteCrawlProgress:s}),setSiteCrawlReport:s=>{t({siteCrawlReport:s}),Xs(s)},setSiteCrawlError:s=>t({siteCrawlError:s}),setPinned:(s,a=!0)=>t({pinnedMatchKey:s,pinnedFound:a}),setAiFailure:s=>t({aiFailure:s}),clearAiFailure:()=>t({aiFailure:null}),setAiProgress:s=>t({aiProgress:s}),setAcknowledgedKeys:s=>t({acknowledgedKeys:s}),markAcknowledged:s=>t(a=>({acknowledgedKeys:new Set(a.acknowledgedKeys).add(s)})),markUnacknowledged:s=>t(a=>{const n=new Set(a.acknowledgedKeys);return n.delete(s),{acknowledgedKeys:n}}),dismissedKeys:new Set,setDismissedKeys:s=>t({dismissedKeys:s}),markDismissed:s=>t(a=>({dismissedKeys:new Set(a.dismissedKeys).add(s)})),markUndismissed:s=>t(a=>{const n=new Set(a.dismissedKeys);return n.delete(s),{dismissedKeys:n}}),setMessages:(s,a,n)=>t({messages:s,unreadMessageCount:a,criticalUnacked:n}),applyMessageAck:(s,a)=>t(n=>{const r=n.messages.map(i=>i.id!==s?i:a==="seen"?{...i,seen:!0}:a==="dismissed"?{...i,dismissed:!0}:a==="acknowledged"?{...i,acknowledged:!0}:a==="clicked"?{...i,clicked:!0}:i).filter(i=>i.severity==="critical"?!i.acknowledged:!i.dismissed),o=r.filter(i=>!i.seen).length,l=r.some(i=>i.severity==="critical"&&!i.acknowledged);return{messages:r,unreadMessageCount:o,criticalUnacked:l}})})),pt="sidePanel:lastAudit";function Fn(){const t=[];return t.push(we("AUDIT_PROGRESS_EVENT",s=>{const a=y.getState().status==="running";y.getState().setProgress({current:s.current,total:s.total,currentState:s.currentState}),y.getState().setStatus("running"),a||ge.polite(`Audit running, scanning ${s.total} state${s.total===1?"":"s"}.`)})),t.push(we("AUDIT_COMPLETE_EVENT",s=>{var i;y.getState().setResults(s.results,s.delta,s.componentId);const a=s.results.reduce((d,p)=>d+p.violations.length,0),n=((i=s.delta)==null?void 0:i.newCount)??0,r=s.delta?`Audit complete. ${n} new violation${n===1?"":"s"} versus baseline.`:`Audit complete. ${a} violation${a===1?"":"s"} found across ${s.results.length} state${s.results.length===1?"":"s"}.`;ge.polite(r);const o=y.getState().view;["compliance","guided","crawl"].includes(o)||(y.getState().setView("report"),y.getState().setFindingsLens("overview")),Pn({results:s.results,delta:s.delta,componentId:s.componentId}),Mn(s.results,s.delta,s.componentId)})),t.push(we("AUDIT_FAILED_EVENT",s=>{y.getState().setError(s.error.message)})),t.push(we("AI_AUGMENTATION_PROGRESS_EVENT",s=>{const a=y.getState().aiProgress;y.getState().setAiProgress({currentCheckLabel:s.currentCheckLabel,current:s.current,total:s.total,candidatesDone:s.candidatesDone,candidatesTotal:s.candidatesTotal}),a||ge.polite(`AI augmentation running ${s.total} check${s.total===1?"":"s"}.`)})),t.push(we("AI_AUGMENTATION_FAILED_EVENT",s=>{y.getState().setAiFailure({severity:s.severity,reason:s.reason,checksAttempted:s.checksAttempted,checksSucceeded:s.checksSucceeded,checksErrored:s.checksErrored,errorDetails:s.errorDetails})})),t.push(we("SCORECARD_UPDATED_EVENT",()=>{ht()})),t.push(we("LICENSE_CHANGED_EVENT",()=>{oa()})),t.push(we("SITE_CRAWL_PROGRESS_EVENT",s=>{const a=y.getState();a.setSiteCrawlStatus("running"),a.setSiteCrawlProgress({current:s.current,total:s.total,url:s.url,lastViolations:s.violations}),s.status==="auditing"&&s.current===1&&ge.polite(`Site crawl started, scanning up to ${s.total} pages.`)})),t.push(we("SITE_CRAWL_COMPLETE_EVENT",s=>{const a=y.getState();a.setSiteCrawlStatus("complete"),a.setSiteCrawlReport(s.report),a.setSiteCrawlProgress(null),ge.polite(`Site crawl complete. Grade ${s.report.siteGrade}, ${s.report.totalUniqueViolations} unique violation${s.report.totalUniqueViolations===1?"":"s"}.`),(async()=>{try{const{loadSiteCrawlPerUrlResults:n}=await ke(async()=>{const{loadSiteCrawlPerUrlResults:i}=await import("./scheduled-audit-runner-BqTcRkAP.js").then(d=>d.aG);return{loadSiteCrawlPerUrlResults:i}},__vite__mapDeps([0,1,2,3])),{getResolutionsForPage:r}=await ke(async()=>{const{getResolutionsForPage:i}=await import("./scheduled-audit-runner-BqTcRkAP.js").then(d=>d.aI);return{getResolutionsForPage:i}},__vite__mapDeps([0,1,2,3])),o=await n();if(!o||o.length===0)return;const l=y.getState().setResolutionsForUrl;await Promise.all(o.map(async i=>{try{const d=await r(i.url);l(i.url,d)}catch{}}))}catch(n){console.warn("[site-crawl] failed to pre-warm resolutions cache",n)}})()})),t.push(we("SITE_CRAWL_FAILED_EVENT",s=>{const a=y.getState();a.setSiteCrawlStatus("failed"),a.setSiteCrawlError(s.error.message),a.setSiteCrawlProgress(null),ge.assertive(`Site crawl failed: ${s.error.message}`)})),()=>t.forEach(s=>s())}async function Mn(t,s,a){var n,r;if(t.length!==0)try{const o=await na();if(!o.enabled)return;const l=y.getState().tier;if(Bt(l)||!ft(l,"autoExportAuditReports"))return;const i=((n=t[0])==null?void 0:n.pageUrl)??((r=t[0])==null?void 0:r.scope)??"",d=[],p=y.getState().lastAuditWallClockMs??void 0;for(const c of o.formats)try{const u=await Z({type:"EXPORT_REQUEST",format:c,results:t,delta:s??void 0,wallClockMs:p});if(typeof u.content!="string"||u.content.length<200)continue;const h=bt(c,a??null);et(u.content,h),i&&await En({url:i,exportedAt:new Date().toISOString(),format:c,filename:h}),d.push(h)}catch(u){console.warn(`[auto-export] format ${c} failed:`,u)}d.length>0&&ge.polite(`Audit auto-exported ${d.length} file${d.length===1?"":"s"}.`)}catch(o){console.warn("[auto-export] failed:",o)}}async function Pn(t){const s={...t,results:t.results.map(({screenshotDataUrl:a,...n})=>n)};try{await chrome.storage.local.set({[pt]:s})}catch(a){console.warn("[wire-messaging] persistLastAudit failed; results stay in-memory only",a)}}async function Gn(){const s=(await chrome.storage.local.get(pt))[pt];s&&y.setState({results:s.results,delta:s.delta,componentId:s.componentId,status:"complete"})}async function Vn(){await chrome.storage.local.remove(pt)}async function yt(){y.getState().clearResults(),await Vn()}async function ht(){const t=await Z({type:"BASELINE_LIST"});y.getState().setBaselineList(t.items)}async function oa(t){const s=await Z({type:"TIER_GET",forceRefresh:(t==null?void 0:t.forceRefresh)===!0});y.getState().setTier(s.tier,{trialDaysRemaining:s.trialDaysRemaining,seatsUsed:s.seatsUsed,seatsTotal:s.seatsTotal,planCode:s.planCode,licenseDaysRemaining:s.licenseDaysRemaining,pastDue:s.pastDue}),la()}async function la(){const{fetchMessages:t}=await ke(async()=>{const{fetchMessages:n}=await Promise.resolve().then(()=>Jn);return{fetchMessages:n}},void 0),s=y.getState().userMode,a=await t(s);a&&y.getState().setMessages(a.messages,a.unreadCount,a.criticalUnacked)}async function Wn(){const s=(await Z({type:"SETTINGS_GET",key:"userMode"})).data,a=s==="owner"||s==="dev"?s:null;y.getState().setUserMode(a)}function Bn(){return chrome.runtime.connect({name:"audit-keepalive"})}let mt=null;async function Hn(){if(mt===null)try{const t=await chrome.windows.getCurrent();typeof t.id=="number"&&(mt=t.id)}catch{}}function ca(){if(mt===null)return;const t=chrome.sidePanel;!t||typeof t.open!="function"||t.open({windowId:mt}).catch(()=>{})}function Ne(t){ca(),y.getState().setSiteCrawlReport(null),Xs(null).catch(()=>{}),ae(t)}const Ot="dismissedFindings";function wt(t){try{const s=new URL(t);return`${s.origin}${s.pathname.replace(/\/+$/,"")}`}catch{return t}}function Ye(t){return`reading-order::${t}`}function Je(t){return`tab-order::${t}`}function Qt(t){return`violation::${t}`}async function jt(){try{const t=await chrome.storage.local.get(Ot),s=t==null?void 0:t[Ot];if(s&&typeof s=="object")return s}catch{}return{}}async function Yt(t){await chrome.storage.local.set({[Ot]:t})}async function Jt(t){return(await jt())[wt(t)]??{}}async function Xt(t,s,a,n){const r=await jt(),o=wt(t),l=r[o]??{};l[s]={reason:a,dismissedAt:new Date().toISOString(),snippet:n},r[o]=l,await Yt(r)}async function Xe(t,s){if(s.length===0)return;const a=await jt(),n=wt(t),r=a[n]??{},o=new Date().toISOString();for(const l of s)r[l.key]={reason:l.reason,dismissedAt:o,snippet:l.snippet};a[n]=r,await Yt(a)}async function Zt(t,s){const a=await jt(),n=wt(t),r=a[n];!r||!(s in r)||(delete r[s],Object.keys(r).length===0?delete a[n]:a[n]=r,await Yt(a))}const Vc=Object.freeze(Object.defineProperty({__proto__:null,addDismissal:Xt,addDismissals:Xe,dismissalKeyForReadingOrder:Ye,dismissalKeyForTabOrder:Je,dismissalKeyForViolation:Qt,getDismissalsForUrl:Jt,removeDismissal:Zt},Symbol.toStringTag,{value:"Module"}));function Kn({onClose:t}){const[s,a]=m.useState(""),[n,r]=m.useState(""),[o,l]=m.useState(!0),[i,d]=m.useState(""),[p,c]=m.useState(!1),[u,h]=m.useState(null);async function x(b){var w;if(b.preventDefault(),!(!s.trim()||!n.trim())){c(!0),h(null);try{const N=await Z({type:"SUPPORT_MESSAGE_REQUEST",subject:s.trim(),body:n.trim(),includeContext:o,replyEmail:i.trim()||void 0});N.success?(h({ok:!0,msg:`Sent (ref: ${N.ticketRef??"n/a"})`}),setTimeout(t,1200)):h({ok:!1,msg:((w=N.error)==null?void 0:w.message)??"Failed to send"})}finally{c(!1)}}}return e.jsxs("form",{onSubmit:x,className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"support-subject",className:"block text-xs font-medium mb-1",children:"Subject"}),e.jsx("input",{id:"support-subject",type:"text",value:s,onChange:b=>a(b.target.value),required:!0,className:"w-full text-xs border border-slate-300 rounded px-2 py-1"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"support-body",className:"block text-xs font-medium mb-1",children:"Message"}),e.jsx("textarea",{id:"support-body",value:n,onChange:b=>r(b.target.value),required:!0,rows:6,className:"w-full text-xs border border-slate-300 rounded px-2 py-1"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"support-reply",className:"block text-xs font-medium mb-1",children:"Reply email (optional)"}),e.jsx("input",{id:"support-reply",type:"email",autoComplete:"email",value:i,onChange:b=>d(b.target.value),className:"w-full text-xs border border-slate-300 rounded px-2 py-1"})]}),e.jsxs("label",{className:"flex items-start gap-2 text-xs",children:[e.jsx("input",{type:"checkbox",checked:o,onChange:b=>l(b.target.checked),className:"mt-0.5"}),e.jsx("span",{className:"text-slate-600",children:"Include extension version, browser platform, and license tier (no URLs, page content, or audit data is sent)."})]}),u&&e.jsx("p",{id:"support-form-result",role:u.ok?"status":"alert",className:`text-xs ${u.ok?"text-green-700":"text-red-700"}`,children:u.msg}),e.jsxs("div",{className:"flex gap-2 justify-end",children:[e.jsx("button",{type:"button",onClick:t,className:"text-xs px-3 py-1 hover:bg-slate-100 rounded",children:"Cancel"}),e.jsx("button",{type:"submit",disabled:p,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded disabled:opacity-50",children:p?"Sending…":"Send"})]})]})}function xs({onClick:t,ariaLabel:s,title:a,children:n,className:r}){return e.jsx("button",{onClick:t,"aria-label":s,title:a??s,className:`inline-flex items-center justify-center min-w-[24px] min-h-[24px] text-xs text-slate-500 hover:text-slate-900 ${r??""}`,children:n})}const xt=aa("messages-client"),zn="https://api.wcagcheckr.com",da="wcagcheckr",qn=1e4;function Qn(){try{return chrome.runtime.getManifest().version}catch{return"0.0.0"}}async function ua(t,s){const a=await Ka();if(!a)throw new Error("no_license_token");const n={...(s==null?void 0:s.headers)??{},Authorization:`Bearer ${a}`,"X-Extension-Version":Qn()};return s!=null&&s.userMode&&(n["X-User-Mode"]=s.userMode),fetch(`${zn}${t}`,{...s,headers:n,signal:AbortSignal.timeout(qn)})}async function Yn(t){try{const s=await ua(`/v1/products/${da}/messages`,{userMode:t??null});return s.ok?await s.json():(xt.warn("fetchMessages http",s.status),null)}catch(s){return xt.warn("fetchMessages failed",s),null}}async function Fe(t,s){try{const a=await ua(`/v1/products/${da}/messages/${t}/ack`,{method:"POST",body:JSON.stringify({action:s}),headers:{"content-type":"application/json"}});return a.ok?!0:(xt.warn("ackMessage http",a.status,"action",s),!1)}catch(a){return xt.warn("ackMessage failed",a),!1}}const Jn=Object.freeze(Object.defineProperty({__proto__:null,ackMessage:Fe,fetchMessages:Yn},Symbol.toStringTag,{value:"Module"})),Xn=["http:","https:"];function Zn(t){try{const s=new URL(t);return Xn.includes(s.protocol)}catch{return!1}}function gs(t){const s=[];let a=0,n=0;for(;a<t.length;){if(t[a]==="["){const o=t.indexOf("]",a+1);if(o!==-1&&t[o+1]==="("){const l=t.indexOf(")",o+2);if(l!==-1){const i=t.slice(a+1,o),d=t.slice(o+2,l);Zn(d)?s.push(e.jsx("a",{href:d,target:"_blank",rel:"noopener",className:"text-brand-700 underline",children:i},`l-${n++}`)):s.push(e.jsx(m.Fragment,{children:i},`l-${n++}`)),a=l+1;continue}}}if(t[a]==="*"&&t[a+1]==="*"){const o=t.indexOf("**",a+2);if(o!==-1){s.push(e.jsx("strong",{children:t.slice(a+2,o)},`b-${n++}`)),a=o+2;continue}}if(t[a]==="*"&&t[a+1]!=="*"){const o=t.indexOf("*",a+1);if(o!==-1&&t[o+1]!=="*"){s.push(e.jsx("em",{children:t.slice(a+1,o)},`i-${n++}`)),a=o+1;continue}}let r=a+1;for(;r<t.length&&t[r]!=="*"&&t[r]!=="[";)r++;s.push(e.jsx(m.Fragment,{children:t.slice(a,r)},`t-${n++}`)),a=r}return s}function pa({source:t}){const s=t.split(/\r?\n/),a=[];let n=[],r=[],o=0;function l(){if(r.length===0)return;const d=r.join(" ");a.push(e.jsx("p",{className:"leading-snug",children:gs(d)},`p-${o++}`)),r=[]}function i(){n.length!==0&&(a.push(e.jsx("ul",{className:"list-disc pl-5 space-y-0.5",children:n.map((d,p)=>e.jsx("li",{children:gs(d)},p))},`u-${o++}`)),n=[])}for(const d of s){const p=d.trimEnd();if(p===""){l(),i();continue}const c=/^[-*]\s+(.*)$/.exec(p);if(c){l(),n.push(c[1]);continue}i(),r.push(p)}return l(),i(),e.jsx("div",{className:"space-y-1.5",children:a})}const er={info:"bg-blue-500",promo:"bg-purple-500",warning:"bg-amber-500",critical:"bg-rose-500"},tr={critical:"bg-rose-50 border-rose-200"};function ha(){const t=y(h=>h.unreadMessageCount),s=y(h=>h.messages),a=y(h=>h.applyMessageAck),[n,r]=m.useState(!1),o=m.useRef(-1),[l,i]=m.useState(!1);m.useEffect(()=>{const h=s.filter(b=>!b.seen);if(h.length===0)return;const x=Math.max(...h.map(b=>b.id));if(x>o.current){o.current=x,i(!0);const b=setTimeout(()=>i(!1),1500);return()=>clearTimeout(b)}},[s]);async function d(){const h=s.filter(x=>!x.seen);if(h.length!==0)for(const x of h)a(x.id,"seen"),Fe(x.id,"seen")}function p(){const h=!n;r(h),h&&d()}async function c(h){a(h.id,"dismissed"),await Fe(h.id,"dismissed")}async function u(h){h.ctaUrl&&(a(h.id,"clicked"),Fe(h.id,"clicked"),chrome.tabs.create({url:h.ctaUrl}).catch(()=>{window.open(h.ctaUrl,"_blank","noopener")}))}return e.jsxs("div",{className:"relative",children:[e.jsxs("button",{type:"button",onClick:p,"aria-label":t>0?`Notifications (${t} unread)`:"Notifications","aria-expanded":n,"aria-haspopup":"dialog",className:`relative grid place-items-center w-7 h-7 rounded text-slate-500 hover:bg-slate-100 hover:text-slate-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-brand-500 ${l?"animate-bell-pulse":""}`,title:t>0?`${t} new message${t===1?"":"s"}`:"No new messages",children:[e.jsx(sr,{active:t>0}),t>0&&e.jsx("span",{"aria-hidden":"true",className:"absolute top-0.5 right-0.5 w-2 h-2 rounded-full bg-rose-500 ring-2 ring-white"})]}),n&&e.jsx(ar,{messages:s,onClose:()=>r(!1),onDismiss:c,onCtaClick:u})]})}function sr({active:t}){return e.jsx("svg",{viewBox:"0 0 20 20",width:"16",height:"16","aria-hidden":"true",fill:"currentColor",className:t?"text-rose-500":"",children:e.jsx("path",{d:"M10 2a5 5 0 00-5 5v3l-1.6 2.4a1 1 0 00.84 1.6h11.52a1 1 0 00.84-1.6L15 10V7a5 5 0 00-5-5zm-1.5 13a1.5 1.5 0 003 0h-3z"})})}function ar({messages:t,onClose:s,onDismiss:a,onCtaClick:n}){const r=m.useRef(null);return m.useEffect(()=>{const o=i=>{r.current&&(r.current.contains(i.target)||s())},l=i=>{i.key==="Escape"&&s()};return document.addEventListener("mousedown",o),document.addEventListener("keydown",l),()=>{document.removeEventListener("mousedown",o),document.removeEventListener("keydown",l)}},[s]),e.jsxs("div",{ref:r,role:"dialog","aria-label":"Notifications",className:"absolute right-0 top-full mt-1 w-80 max-h-[420px] overflow-y-auto bg-white border border-slate-200 rounded shadow-lg z-50 text-xs",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 border-b border-slate-200",children:[e.jsx("span",{className:"font-medium",children:"Notifications"}),e.jsx("button",{type:"button",onClick:()=>{la()},className:"text-[11px] text-brand-700 hover:underline",children:"Refresh"})]}),t.length===0?e.jsx("div",{className:"p-4 text-center text-slate-500 text-[11px]",children:"No messages."}):e.jsx("ul",{className:"divide-y divide-slate-100",children:t.map(o=>e.jsx("li",{className:`p-3 ${o.seen?"":"bg-slate-50"}`,children:e.jsxs("div",{className:"flex gap-2",children:[e.jsx("div",{className:`shrink-0 w-1 self-stretch rounded ${er[o.severity]}`,"aria-hidden":"true"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx("div",{className:"font-medium text-slate-800",children:o.title}),o.dismissible&&o.severity!=="critical"&&e.jsx("button",{type:"button",onClick:()=>a(o),"aria-label":"Dismiss message",className:"text-slate-400 hover:text-slate-700 shrink-0",children:"✕"})]}),e.jsx("div",{className:"mt-1 text-slate-700",children:e.jsx(pa,{source:o.bodyMd})}),o.ctaLabel&&o.ctaUrl&&e.jsx("button",{type:"button",onClick:()=>n(o),className:"mt-2 text-[11px] px-2 py-1 bg-brand-500 text-white rounded hover:bg-brand-600",children:o.ctaLabel}),e.jsx("div",{className:"mt-1 text-[10px] text-slate-400",children:new Date(o.createdAt).toLocaleString()})]})]})},o.id))})]})}function ma(){const t=y(o=>o.messages),s=y(o=>o.applyMessageAck),a=t.find(o=>o.severity==="critical"&&!o.acknowledged);if(!a)return null;async function n(){s(a.id,"acknowledged"),await Fe(a.id,"acknowledged")}async function r(){a.ctaUrl&&(s(a.id,"clicked"),Fe(a.id,"clicked"),chrome.tabs.create({url:a.ctaUrl}).catch(()=>{}))}return e.jsxs("div",{role:"alert",className:`border-y ${tr.critical} px-3 py-2 text-xs flex items-start gap-2`,children:[e.jsx("span",{"aria-hidden":"true",className:"text-rose-600 text-sm leading-none mt-0.5",children:"⚠"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"font-semibold text-rose-900",children:a.title}),e.jsx("div",{className:"mt-0.5 text-rose-900/90",children:e.jsx(pa,{source:a.bodyMd})}),e.jsxs("div",{className:"mt-1.5 flex items-center gap-2",children:[a.ctaLabel&&a.ctaUrl&&e.jsx("button",{type:"button",onClick:r,className:"text-[11px] px-2 py-1 bg-rose-600 text-white rounded hover:bg-rose-700",children:a.ctaLabel}),e.jsx("button",{type:"button",onClick:n,className:"text-[11px] px-2 py-1 border border-rose-300 text-rose-800 rounded hover:bg-rose-100",children:"Acknowledge"})]})]})]})}const nr=[{slug:"matrix",label:"Dashboard"},{slug:"report",label:"Findings",hideWhenIdle:!0}];function rr(t){if(!t)return null;try{return new URL(t).hostname}catch{return t}}function ir(){var u,h;const t=y(x=>x.view),s=y(x=>x.setView),a=y(x=>x.setUserMode),n=y(x=>x.results),r=y(x=>x.status),[o,l]=m.useState(!1),i=((u=n[0])==null?void 0:u.pageUrl)??((h=n[0])==null?void 0:h.scope),d=rr(i),p=n.length>0&&r!=="running";function c(){a("owner"),ae({type:"SETTINGS_SET",key:"userMode",value:"owner"})}return e.jsxs("header",{className:"border-b border-slate-200 bg-white px-3 py-2",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"font-semibold text-sm leading-tight",children:"wcagcheckr"}),e.jsxs("p",{className:"text-[10px] text-slate-500 leading-tight font-mono",children:["v",chrome.runtime.getManifest().version]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{type:"button",onClick:c,title:"Switch to the simplified site-owner view",className:"text-[11px] px-2 py-1 border border-slate-300 rounded text-slate-600 hover:bg-slate-50",children:"Owner mode"}),e.jsx(ha,{}),e.jsx(xs,{onClick:()=>void ae({type:"OPEN_SETTINGS"}),ariaLabel:"Open settings",children:"⚙"}),e.jsx(xs,{onClick:()=>l(!0),ariaLabel:"Send support message",children:"?"})]})]}),p&&d&&e.jsxs("div",{className:"flex items-center gap-2 mb-2 px-2 py-1 rounded bg-brand-50 border border-brand-200 text-[11px]",title:i??"",children:[e.jsx("span",{className:"text-slate-500 shrink-0",children:"Audit:"}),e.jsx("span",{className:"font-mono font-medium text-slate-800 truncate flex-1","aria-label":`Showing audit results for ${d}`,children:d}),e.jsx("button",{type:"button",onClick:()=>void yt(),className:"shrink-0 text-[11px] px-2 py-0.5 rounded border border-slate-300 bg-white text-slate-700 hover:bg-slate-50 hover:border-slate-400",title:"Clear these results so you can run a fresh audit",children:"Clear"})]}),e.jsx(or,{view:t,setView:s}),e.jsx(Me,{open:o,onClose:()=>l(!1),title:"Send support message",children:e.jsx(Kn,{onClose:()=>l(!1)})})]})}function or({view:t,setView:s}){const a=m.useRef([]),n=y(i=>i.results),r=nr.filter(i=>!i.hideWhenIdle||n.length>0);function o(i){var c;const d=(i+r.length)%r.length,p=r[d];p&&(s(p.slug),(c=a.current[d])==null||c.focus())}function l(i,d){switch(i.key){case"ArrowRight":i.preventDefault(),o(d+1);break;case"ArrowLeft":i.preventDefault(),o(d-1);break;case"Home":i.preventDefault(),o(0);break;case"End":i.preventDefault(),o(r.length-1);break}}return e.jsx("nav",{className:"flex gap-1","aria-label":"Primary navigation",role:"tablist",children:r.map((i,d)=>{const p=t===i.slug;return e.jsx("button",{ref:c=>{a.current[d]=c},role:"tab","aria-selected":p,tabIndex:p?0:-1,onClick:()=>s(i.slug),onKeyDown:c=>l(c,d),className:p?"text-xs font-medium tracking-tight px-3.5 py-1.5 rounded-md bg-slate-900 text-white shadow-sm":"text-xs font-medium tracking-tight px-3.5 py-1.5 rounded-md text-slate-600 hover:bg-slate-100 border border-transparent hover:border-slate-200",children:i.label},i.slug)})})}function lr({feature:t,upgradeUrl:s}){const[a,n]=m.useState(!1);return e.jsxs("div",{className:"p-3 bg-amber-50 border border-amber-200 rounded",children:[e.jsxs("p",{className:"text-xs text-amber-900 mb-2",children:[e.jsx("strong",{children:t})," requires a higher tier."]}),e.jsx("button",{type:"button",onClick:()=>n(!0),className:"text-xs text-brand-600 hover:underline font-medium",children:"Upgrade →"}),e.jsx(Lt,{open:a,onClose:()=>n(!1)})]})}const cr="https://wcagcheckr.com/upgrade";function dr(){const[t,s]=m.useState("single-element"),[a,n]=m.useState(!1),[r,o]=m.useState(null),[l,i]=m.useState(null),[d,p]=m.useState(Oe),[c,u]=m.useState(Oe[0].id),[h,x]=m.useState("none"),[b,w]=m.useState(null),N=y(_=>_.status),E=y(_=>_.tier),I=y(_=>_.results.length>0),C=N==="running";m.useEffect(()=>{Promise.all([Z({type:"SETTINGS_GET",key:"matrixPresets"}),Z({type:"SETTINGS_GET",key:"activePresetId"})]).then(([_,F])=>{const H=Array.isArray(_.data)?_.data:null;p(H&&H.length>0?H:Oe),typeof F.data=="string"&&u(F.data)})},[]);function f(_){const F=d.find(H=>H.id===_);F&&(u(_),ae({type:"SETTINGS_SET",key:"activePresetId",value:_}),ae({type:"SETTINGS_SET",key:"stateMatrix",value:F.matrix}))}const j=ft(E,"storybookAutoIterate");m.useEffect(()=>{const _=we("ELEMENT_PICKED_EVENT",(H,R)=>{n(!1);const M=R.frameId;q(M),o({selector:H.selector,frameId:M,speech:H.speech})}),F=we("PICKER_CANCELLED_EVENT",()=>n(!1));return()=>{_(),F()}},[]);async function g(){const _=await ue();_&&(n(!0),await be(_,{type:"PICKER_ACTIVATE_REQUEST",tabId:_}))}function v(){r&&(q(r.frameId),Ne({type:"START_AUDIT",mode:"single-element",scope:r.selector,frameId:r.frameId}),y.getState().startNewScan())}function S(){if(!j){i("storybook:auto-iterate");return}q(),Ne({type:"START_AUDIT",mode:"storybook-all"}),y.getState().startNewScan()}function k(){q(),Ne({type:"START_AUDIT",mode:"all-frames"}),y.getState().startNewScan()}function T(){q(),Ne({type:"START_AUDIT",mode:"full-page"}),y.getState().startNewScan()}function V(){q(),Ne({type:"START_AUDIT",mode:"full-page",verifyFixesOnly:!0}),y.getState().startNewScan()}function P(){q(),Ne({type:"START_AUDIT",mode:"quick-scan"}),y.getState().startNewScan()}function B(){q(),Ne({type:"START_AUDIT",mode:"parallel-scan"}),y.getState().startNewScan()}function U(){ae({type:"CANCEL_AUDIT"})}async function q(_){y.getState().setPinned(null);const F=await ue();if(F)try{await be(F,{type:"HIGHLIGHT_CLEAR_REQUEST",tabId:F},_)}catch{}}async function $(_){w(null);const F=await ue();if(!F){w("No audited tab; open a page first.");return}if(_==="none"){const R=await Z({type:"PERF_THROTTLE_CLEAR_REQUEST",tabId:F});R.ok||w(R.error??"Failed to clear throttle."),x("none");return}const H=await Z({type:"PERF_THROTTLE_APPLY_REQUEST",tabId:F,profile:_});if(!H.ok){w(H.error??"Failed to apply throttle.");return}x(_)}return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"px-3 py-2 border-b border-slate-200 bg-white space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsxs("select",{"aria-label":"Audit mode",value:t,onChange:_=>s(_.target.value),disabled:C||a,className:"text-xs border border-slate-300 rounded px-2 py-1",children:[e.jsx("option",{value:"single-element",children:"Single element"}),e.jsx("option",{value:"full-page",children:"Full page"}),e.jsx("option",{value:"quick-scan",children:"Quick scan (markup only, ~1s)"}),e.jsx("option",{value:"parallel-scan",children:"Parallel scan (experimental, ~2-4× faster)"}),e.jsx("option",{value:"all-frames",children:"All iframes"}),e.jsxs("option",{value:"storybook-all",children:["All stories (Storybook / Ladle)",j?"":" (paid)"]})]}),e.jsx("select",{"aria-label":"State-matrix preset",value:c,onChange:_=>f(_.target.value),disabled:C||a,title:"Switch the state-matrix preset used for the next audit",className:"text-xs border border-slate-300 rounded px-2 py-1",children:d.map(_=>e.jsx("option",{value:_.id,children:_.name},_.id))}),e.jsxs("select",{"aria-label":"Performance throttle",value:h,onChange:_=>void $(_.target.value),disabled:C||a,title:"Apply CDP network + CPU throttling to the audited tab. Catch contrast / focus / loading-state issues that only manifest under realistic conditions.",className:`text-xs border rounded px-2 py-1 ${h==="none"?"border-slate-300":"border-amber-400 bg-amber-50"}`,children:[e.jsx("option",{value:"none",children:"⚡ Throttle: off"}),e.jsx("option",{value:"3g-slow",children:"⚡ Slow 3G + 6× CPU"}),e.jsx("option",{value:"3g-fast",children:"⚡ Fast 3G + 4× CPU"}),e.jsx("option",{value:"4g",children:"⚡ 4G LTE + 2× CPU"}),e.jsx("option",{value:"cpu-2x",children:"⚡ CPU 2× only"}),e.jsx("option",{value:"cpu-4x",children:"⚡ CPU 4× only"})]}),t==="single-element"?e.jsx(pr,{picking:a,picked:r,isRunning:C,onPick:g,onRun:v,onClearPick:()=>o(null)}):t==="full-page"?e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:T,disabled:C,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50",children:C?"Auditing…":"Scan page"}),e.jsx("button",{onClick:V,disabled:C||!I,className:"text-xs px-3 py-1 border border-emerald-400 text-emerald-700 rounded hover:bg-emerald-50 disabled:opacity-50 disabled:cursor-not-allowed",title:I?"Re-runs the audit but skips walkthroughs that already passed or are human-acked. Faster + cheaper after a fix/ack pass.":"Run a full Scan page first. Verify-fixes mode reuses prior walkthrough verdicts + acks; without prior data there's nothing to skip.",children:C?"Auditing…":"Verify fixes (skip passed)"})]}):t==="quick-scan"?e.jsx("button",{onClick:P,disabled:C,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50",title:"One-state audit (default · light · ltr · desktop). Catches markup-level findings in ~1 second. Run a Full page audit for hover-only contrast, mobile reflow, RTL bidi.",children:C?"Auditing…":"⚡ Quick scan"}):t==="parallel-scan"?e.jsx("button",{onClick:B,disabled:C,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50",title:"Opens N hidden tabs and runs the matrix in parallel. Roughly 2-4× faster wall-clock on a typical matrix. Experimental: skips baseline diff + AI augmentation in rc.77.",children:C?"Auditing…":"⚡⚡ Parallel scan"}):t==="all-frames"?e.jsx("button",{onClick:k,disabled:C,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50",children:C?"Auditing…":"Audit all iframes"}):e.jsx("button",{onClick:S,disabled:C,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50",children:C?"Auditing…":"Audit all stories"}),C&&e.jsx("button",{onClick:U,className:"text-xs px-3 py-1 border border-slate-300 text-slate-700 rounded hover:bg-slate-100",children:"Stop"}),!C&&I&&e.jsx("button",{type:"button",onClick:()=>void yt(),className:"text-xs text-slate-500 hover:text-slate-800 hover:underline ml-auto",title:"Clear current results",children:"Clear"})]}),b&&e.jsxs("p",{className:"text-[11px] text-rose-700",role:"alert",children:["⚡ ",b]}),t==="single-element"&&r&&!a&&!C&&e.jsx(hr,{selector:r.selector,onRepick:g,onClear:()=>o(null)})]}),e.jsx(Me,{open:l!==null,onClose:()=>i(null),title:"Upgrade to continue",children:e.jsx(lr,{feature:l??"",upgradeUrl:cr})})]})}function ur({speech:t}){if(!t)return null;const s=[];if(t.name&&s.push(t.name),t.role&&!["none","presentation","generic"].includes(t.role)&&s.push(t.role),s.push(...t.states),t.group&&s.push(t.group),s.length===0)return e.jsxs("span",{className:"text-[10px] text-amber-800 bg-amber-50 border border-amber-200 rounded px-2 py-0.5",title:"A screen reader would announce nothing for this element. Either it has no accessible name + a silent role (generic/presentation), or it's hidden from AT entirely.","data-testid":"sr-speech-preview",children:["SR: ",e.jsx("em",{children:"(silent)"})]});const a=s.join(", ");return e.jsxs("span",{className:"text-[10px] text-slate-700 bg-slate-100 border border-slate-200 rounded px-2 py-0.5 max-w-[280px] truncate",title:`Predicted screen-reader announcement when this element receives focus: "${a}"`,"data-testid":"sr-speech-preview",children:["SR: ",e.jsx("strong",{children:a})]})}function pr({picking:t,picked:s,isRunning:a,onPick:n,onRun:r,onClearPick:o}){return a?e.jsx("button",{disabled:!0,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded opacity-50",children:"Auditing…"}):t?e.jsx("button",{disabled:!0,className:"text-xs px-3 py-1 bg-brand-400 text-white rounded",children:"Click an element on the page"}):s?e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("button",{onClick:r,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600",children:"Run audit"}),e.jsx(ur,{speech:s.speech})]}):e.jsx("button",{onClick:n,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600",children:"Pick element"})}function hr({selector:t,onRepick:s,onClear:a}){return e.jsxs("div",{className:"text-[11px] text-slate-600 flex items-center gap-2 flex-wrap",children:[e.jsx("span",{children:"Selected:"}),e.jsx("code",{className:"font-mono bg-slate-100 px-1.5 py-0.5 rounded text-slate-700 truncate max-w-[180px]",title:t,children:t}),e.jsx("button",{type:"button",onClick:s,className:"text-brand-600 hover:underline",children:"Re-pick"}),e.jsx("span",{"aria-hidden":"true",className:"text-slate-300",children:"·"}),e.jsx("button",{type:"button",onClick:a,className:"text-slate-500 hover:text-slate-700 hover:underline",children:"Clear"})]})}const mr={outline:"OUTLINE_HIDE_REQUEST","tab-order":"TAB_ORDER_HIDE_REQUEST","reading-order":"READING_ORDER_HIDE_REQUEST","target-size":"TARGET_SIZE_HIDE_REQUEST"},xr={outline:"OUTLINE_SHOW_REQUEST","tab-order":"TAB_ORDER_SHOW_REQUEST","reading-order":"READING_ORDER_SHOW_REQUEST","target-size":"TARGET_SIZE_SHOW_REQUEST"};function gr(){const[t,s]=m.useState(null),[a,n]=m.useState(!1),[r,o]=m.useState(null),[l,i]=m.useState("off"),p=y(x=>x.results).flatMap(x=>x.violations);async function c(x){const b=await ue();b&&(i(x),x==="off"?await be(b,{type:"VISION_SIMULATOR_CLEAR",tabId:b}).catch(()=>{}):await be(b,{type:"VISION_SIMULATOR_APPLY",tabId:b,mode:x}).catch(()=>{}))}async function u(x){const b=await ue();if(b){if(t&&await be(b,{type:mr[t],tabId:b}).catch(()=>{}),t===x){s(null);return}await be(b,{type:xr[x],tabId:b}).catch(()=>{}),s(x)}}async function h(){const x=await ue();if(x){if(a){await be(x,{type:"FIX_PREVIEW_HIDE_REQUEST",tabId:x}).catch(()=>{}),n(!1),o(null);return}if(p.length===0){o("Run an audit first.");return}try{const b=await Ee(x,{type:"FIX_PREVIEW_SHOW_REQUEST",tabId:x,violations:p});n(!0),o(`Previewing ${b.visualFixCount} visual fix${b.visualFixCount===1?"":"es"} + ${b.annotationCount} annotation${b.annotationCount===1?"":"s"}.`)}catch{o("Preview failed.")}}}return e.jsxs("div",{className:"px-3 py-2 border-b border-slate-200 bg-white flex items-center gap-2 flex-wrap",children:[e.jsx("span",{className:"text-[11px] uppercase tracking-wide text-slate-500 mr-1",title:"Page overlays — these draw information on the live page. They do NOT change what the audit detects.",children:"Visualizers"}),e.jsx(Ge,{label:"Outline",title:"Show heading + landmark structure overlay",on:t==="outline",onClick:()=>u("outline")}),e.jsx(Ge,{label:"Tab order",title:"Number focusables in tab sequence. Red = tab order doesn't follow visual layout (focus jumps around). Amber = positive tabindex reordered the DOM sequence.",on:t==="tab-order",onClick:()=>u("tab-order")}),e.jsx(Ge,{label:"Reading order",title:"Number content in DOM order (what a screen reader reads). Red = element's DOM position differs from its visual position; badge shows DOM→Visual.",on:t==="reading-order",onClick:()=>u("reading-order")}),e.jsx(Ge,{label:"Targets",title:"Show interactive-element dimensions vs WCAG 2.5.8 (24px AA) / 2.5.5 (44px AAA)",on:t==="target-size",onClick:()=>u("target-size")}),e.jsx("span",{className:"w-px h-4 bg-slate-200 mx-1","aria-hidden":"true"}),e.jsx(Ge,{label:"Preview fixes ✨",title:"Apply contrast/target-size/focus-ring fixes to the live page + annotate where labels and alt text are missing. Toggle off to revert.",on:a,onClick:h}),e.jsx("span",{className:"w-px h-4 bg-slate-200 mx-1","aria-hidden":"true"}),e.jsxs("label",{className:"text-[11px] text-slate-700 flex items-center gap-1.5",children:[e.jsx("span",{title:"Apply a CSS filter that simulates how the page looks for users with color-vision or low-vision impairments. Visual only — does NOT change what the audit detects.",children:"Vision sim:"}),e.jsxs("select",{"aria-label":"Vision-impairment simulator",value:l,onChange:x=>void c(x.target.value),className:`text-xs border rounded px-1.5 py-0.5 ${l==="off"?"border-slate-300 bg-white text-slate-700":"border-brand-500 bg-brand-50 text-brand-700 font-medium"}`,children:[e.jsx("option",{value:"off",children:"Off"}),e.jsxs("optgroup",{label:"Color blindness",children:[e.jsx("option",{value:"deuteranomaly",children:"Deuteranomaly (green-weak — most common)"}),e.jsx("option",{value:"deuteranopia",children:"Deuteranopia (green-blind)"}),e.jsx("option",{value:"protanomaly",children:"Protanomaly (red-weak)"}),e.jsx("option",{value:"protanopia",children:"Protanopia (red-blind)"}),e.jsx("option",{value:"tritanomaly",children:"Tritanomaly (blue-weak)"}),e.jsx("option",{value:"tritanopia",children:"Tritanopia (blue-blind)"}),e.jsx("option",{value:"achromatomaly",children:"Achromatomaly (partial color blindness)"}),e.jsx("option",{value:"achromatopsia",children:"Achromatopsia (no color)"})]}),e.jsxs("optgroup",{label:"Low vision",children:[e.jsx("option",{value:"cataract",children:"Cataract (blur)"}),e.jsx("option",{value:"low-contrast",children:"Low contrast sensitivity"}),e.jsx("option",{value:"glaucoma",children:"Glaucoma (tunnel vision)"}),e.jsx("option",{value:"macular",children:"Macular degeneration (central loss)"})]})]})]}),r&&e.jsx("span",{className:"text-[11px] text-slate-500 basis-full",children:r})]})}function Ge({label:t,title:s,on:a,onClick:n}){return e.jsx("button",{type:"button",title:s,"aria-pressed":a,onClick:n,className:`text-xs px-2 py-1 rounded border transition-colors ${a?"bg-brand-500 text-white border-brand-500 hover:bg-brand-600":"bg-white text-slate-700 border-slate-300 hover:bg-slate-50"}`,children:t})}function fr(t){if(!t)return"";const s=[t.pseudoState];return t.theme!=="light"&&s.push(t.theme),t.direction!=="ltr"&&s.push(t.direction),s.join(" · ")}function br(){const t=y(d=>d.status),s=y(d=>d.progress),a=y(d=>d.aiProgress);if(t!=="running"||!s)return null;const n=s.current>=s.total,r=n?"Running deep analyzers…":`Auditing… ${s.current}/${s.total}`,o=n?"reading order · tab order · typography · CSS vars · AI candidates":fr(s.currentState),l=n?100:s.current/s.total*100,i=a!=null;return e.jsxs("div",{className:"px-3 py-2 bg-slate-100 border-b border-slate-200 space-y-2",children:[e.jsx(fs,{label:r,detail:o,pct:l,valuenow:Math.min(s.current,s.total),valuemax:s.total,ariaLabel:n?"Running deep analyzers: reading order, tab order, typography, custom properties, AI candidates.":`Audit progress: ${s.current} of ${s.total} states`,barClass:"bg-slate-200",fillClass:"bg-brand-500"}),i&&e.jsx(fs,{label:`AI augmentation… ${a.current}/${a.total}`,detail:a.candidatesTotal&&a.candidatesTotal>0?`${a.currentCheckLabel} (${a.candidatesDone??0}/${a.candidatesTotal})`:a.currentCheckLabel,pct:a.current/a.total*100,valuenow:a.current,valuemax:a.total,ariaLabel:`AI augmentation: ${a.current} of ${a.total} checks. ${a.currentCheckLabel}`,barClass:"bg-violet-100",fillClass:"bg-violet-500"})]})}function fs({label:t,detail:s,pct:a,valuenow:n,valuemax:r,ariaLabel:o,barClass:l,fillClass:i}){return e.jsxs("div",{children:[e.jsxs("div",{className:"flex justify-between items-center gap-2 text-xs text-slate-600 mb-1",children:[e.jsx("span",{className:"shrink-0",children:t}),e.jsx("span",{className:"text-slate-500 truncate flex-1 text-right",children:s})]}),e.jsx("div",{className:`h-1 rounded-full overflow-hidden ${l}`,role:"progressbar","aria-valuenow":n,"aria-valuemin":0,"aria-valuemax":r,"aria-label":o,children:e.jsx("div",{className:`h-full transition-all ${i}`,style:{width:`${a}%`}})})]})}function vr(){const t=new Set;for(const s of De)for(const a of s.axeRules)t.add(a);return t}function xa(t,s,a,n){const r=new Set;for(const o of t)a.has(o.matchKey)||n.has(`violation::${o.matchKey}`)||r.add(`${o.ruleId}::${o.target.selector}`);for(const o of s)o.verdict==="fail"&&r.add(`${o.ruleId}::${o.selector}`);return r.size}function yr(t,s,a,n){const r=new Set;for(const o of t)a.has(o.matchKey)||n.has(`violation::${o.matchKey}`)||o.wcagCriterion&&r.add(o.wcagCriterion);for(const o of s)o.verdict==="fail"&&o.wcagCriterion&&r.add(o.wcagCriterion);return Array.from(r).sort()}function wr(t,s,a={}){const n=vr(),o=(a.excludeAckedMatchKeys?t.filter(c=>!a.excludeAckedMatchKeys.has(c.matchKey)):t).filter(c=>!n.has(c.ruleId)),l=Zs(o),i={critical:0,serious:0,moderate:0,minor:0};for(const c of l)i[c.impact]++;const d=new Set(l.map(c=>Ue(c.ruleId,c.target.selector)));for(const c of s){if(c.verdict!=="fail"||n.has(c.ruleId))continue;const u=Ue(c.ruleId,c.selector);d.has(u)||(d.add(u),i.serious++)}return{total:i.critical+i.serious+i.moderate+i.minor,counts:i,representatives:l}}function bs(t,s){var n;const a=new Set;for(const r of s)for(const o of((n=r.axeRulesEvaluated)==null?void 0:n.incomplete)??[])for(const l of o.elements??[])a.add(`${o.ruleId}::${l.selector}`);return t.filter(r=>r.verdict==="fail"&&a.has(`${r.ruleId}::${r.selector}`))}function es(t){var o,l;const s=((o=t[0])==null?void 0:o.pageUrl)??((l=t[0])==null?void 0:l.scope)??"",a=y(i=>i.setResolutionsForUrl),[n,r]=m.useState(()=>{if(!s)return[];const i=y.getState().resolutionsByUrl[s];return i?bs(i,t):[]});return m.useEffect(()=>{if(!s){r([]);return}let i=!1;return qe(s).then(d=>{i||(a(s,d),r(bs(d,t)))}),()=>{i=!0}},[s,t,a]),n}const jr=[{slug:"delta",label:"Delta",blurb:"Compare against the last baseline; export the prompt",marker:"Δ"},{slug:"guided",label:"Guided",blurb:"Step through manual IGT workflows",marker:"G"},{slug:"compliance",label:"Compliance",blurb:"WCAG-EM report builder + sign-and-seal",marker:"§"},{slug:"scorecard",label:"Components",blurb:"Every tracked component baseline at a glance",marker:"◍"},{slug:"forensic",label:"Forensic",blurb:"Audit history + RFC 3161 timestamps",marker:"⧉"},{slug:"schedules",label:"Schedules",blurb:"Recurring audits + alerts",marker:"⟳"},{slug:"risk",label:"Risk",blurb:"Posture summary across scheduled audits",marker:"⌖"},{slug:"crawl",label:"Site crawl",blurb:"Audit a multi-page site",marker:"↺"},{slug:"flows",label:"Flows",blurb:"Record + replay user-action sequences",marker:"▷"},{slug:"copilot",label:"Co-pilot",blurb:"Chat with AI grounded on the current audit",marker:"✦"},{slug:"ax-tree",label:"AX tree",blurb:"Browser's accessibility-tree viewer",marker:"⌥"},{slug:"tokens",label:"Design tokens",blurb:"CSS custom-properties usage map",marker:"#"}];function Nr(){const t=y(n=>n.results),s=y(n=>n.status),a=y(n=>n.setView);return e.jsxs("div",{className:"p-3 space-y-4",children:[e.jsx(kr,{results:t,status:s,setView:a}),e.jsx(Sr,{setView:a})]})}function kr({results:t,status:s,setView:a}){var x,b;if(s==="running")return e.jsxs("section",{className:"border border-slate-200 rounded-lg bg-white px-4 py-3",children:[e.jsx("p",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500",children:"audit in progress"}),e.jsxs("p",{className:"text-sm font-medium text-slate-900 mt-1",children:["The matrix is iterating. Progress is shown above; results land in ",e.jsx("strong",{children:"Findings"})," when done."]})]});if(t.length===0)return e.jsxs("section",{className:"border border-dashed border-slate-300 rounded-lg bg-slate-50 px-4 py-5 text-center",children:[e.jsx("p",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500",children:"no audit yet"}),e.jsx("p",{className:"text-sm font-medium text-slate-900 mt-1",children:"Pick an audit mode above and run a scan."}),e.jsx("p",{className:"text-xs text-slate-500 mt-1.5 max-w-md mx-auto",children:"Or jump into a specialized tool below — site crawl, multi-page schedules, IGT workflows, the AI co-pilot, the forensic log."})]});const n=t.flatMap(w=>w.violations),r=Zs(n),o=((x=t[0])==null?void 0:x.pageUrl)??((b=t[0])==null?void 0:b.scope)??"audited page",l=t.length,i=es(t),d=y(w=>w.acknowledgedKeys),p=y(w=>w.dismissedKeys),c=xa(n,i,d,p),u=3,h=c>0&&c<=u?r.slice(0,u):[];return e.jsxs("section",{className:"border border-slate-200 rounded-lg bg-white overflow-hidden",children:[e.jsxs("div",{className:"px-3.5 py-3 flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("p",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500 truncate",children:["last audit · ",l," state",l===1?"":"s"]}),e.jsx("p",{className:"text-sm font-medium text-slate-900 truncate mt-0.5",title:o,children:c===0?"No issues found by automation":`Fix ${c} element${c===1?"":"s"}`})]}),e.jsx("button",{type:"button",onClick:()=>a("report"),className:"shrink-0 text-xs font-medium px-3.5 py-1.5 bg-slate-900 text-white rounded-md hover:bg-slate-800",children:"View findings →"})]}),h.length>0&&e.jsx("ul",{className:"border-t border-slate-200 divide-y divide-slate-100","aria-label":"Violations inline list",children:h.map(w=>{var I;const N=((I=w.target)==null?void 0:I.selector)??"(no selector)",E=N.length>50?N.slice(0,47)+"…":N;return e.jsx("li",{className:"px-3.5 py-2",children:e.jsxs("button",{type:"button",onClick:()=>a("report"),className:"w-full text-left flex items-center gap-2 hover:bg-slate-50 -mx-3.5 -my-2 px-3.5 py-2 transition-colors",title:`${w.description??w.ruleId} — ${N}`,children:[e.jsx("span",{className:`shrink-0 text-[9px] uppercase tracking-wider font-bold px-1.5 py-0.5 rounded ${w.impact==="critical"?"bg-rose-200 text-rose-900":w.impact==="serious"?"bg-orange-200 text-orange-900":w.impact==="moderate"?"bg-amber-200 text-amber-900":"bg-slate-200 text-slate-700"}`,children:w.impact}),e.jsx("span",{className:"text-[11px] font-mono text-slate-900 shrink-0",children:w.ruleId}),e.jsx("code",{className:"text-[10px] text-slate-500 truncate",children:E})]})},`${w.ruleId}::${N}`)})})]})}function Sr({setView:t}){return e.jsxs("section",{className:"space-y-2",children:[e.jsx("h2",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500 px-0.5",children:"tools"}),e.jsx("div",{className:"grid grid-cols-2 gap-2",children:jr.map(s=>e.jsxs("button",{type:"button",onClick:()=>t(s.slug),className:"text-left rounded-lg border border-slate-200 bg-white hover:bg-slate-50 hover:border-slate-300 transition-colors px-3 py-2.5 flex flex-col gap-0.5 focus:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-1",children:[e.jsxs("span",{className:"font-mono text-[10px] uppercase tracking-widest text-slate-400",children:[e.jsx("span",{className:"text-slate-700 mr-1.5",children:s.marker}),s.slug]}),e.jsx("span",{className:"text-sm font-semibold text-slate-900 leading-tight mt-0.5",children:s.label}),e.jsx("span",{className:"text-[11px] text-slate-500 leading-snug",children:s.blurb})]},s.slug))})]})}const Ar={A:"bg-emerald-500",B:"bg-lime-500",C:"bg-yellow-500",D:"bg-orange-500",F:"bg-rose-600"},Cr={A:"bg-emerald-500 text-white",B:"bg-lime-500 text-white",C:"bg-yellow-500 text-slate-900",D:"bg-orange-500 text-white",F:"bg-rose-600 text-white"};function Ir({violations:t,componentId:s,hideOverallHeader:a=!1}){var pe,L,X,z,Y,he,de,xe;const[n,r]=m.useState([]),[o,l]=m.useState({}),[i,d]=m.useState([]),[p,c]=m.useState([]),[u,h]=m.useState(new Set),[x,b]=m.useState(null),[w,N]=m.useState({}),[E,I]=m.useState(new Set),[C,f]=m.useState(null),j=y(O=>O.status),g=y(O=>O.progress),v=y(O=>O.freshThisSession),S=y(O=>O.results),k=(pe=S[0])==null?void 0:pe.startedAt,T=((L=S[0])==null?void 0:L.pageUrl)??((X=S[0])==null?void 0:X.scope)??null;m.useEffect(()=>{if(!s){r([]),l({});return}let O=!1;return chrome.storage.local.get("igtRuns").then(ee=>{if(O)return;const se=((ee==null?void 0:ee.igtRuns)??{})[s]??{};r(Object.values(se))}),Promise.all([Ie(s),Le([s])]).then(([ee,me])=>{if(O)return;const se=new Set(me.map(J=>J.criterionId)),Q={},ve=[];for(const J of ee){const re=se.has(J.criterionId)?"pass":J.verdict;J.criterionId==="2.4.3"?Q.focusOrder=re:J.criterionId==="2.1.2"?Q.keyboardTrap=re:J.criterionId==="2.4.7"?Q.focusVisible=re:J.criterionId==="1.3.2"?Q.readingOrder=re:J.criterionId==="1.4.11"&&(Q.nonTextContrast=re),ve.push({criterionId:J.criterionId,ruleId:`ai-walkthrough-${J.criterionId}`,pageUrl:J.pageUrl,verdict:re,reasoning:se.has(J.criterionId)?`Human verified: ${J.reasoning}`:J.reasoning})}l(Q),d(ve)}),()=>{O=!0}},[s]),m.useEffect(()=>{if(!T){c([]);return}let O=!1;return qe(T).then(ee=>{O||c(ee)}),()=>{O=!0}},[T,S]);const V=es(S);if(j==="running")return e.jsx(_r,{current:g==null?void 0:g.current,total:g==null?void 0:g.total});const P=Ht({violations:t,auditRan:S.length>0,manualRuns:n,workflows:fe,heuristicCounts:{tabOrder:((Y=(z=S[0])==null?void 0:z.tabOrderIssues)==null?void 0:Y.length)??0,readingOrder:((de=(he=S[0])==null?void 0:he.readingOrderIssues)==null?void 0:de.length)??0},interactiveAuditVerdicts:o,aiResolvedFails:V.map(O=>({ruleId:O.ruleId,impact:"serious",selector:O.selector}))}),B=y(O=>O.acknowledgedKeys),q=new Set(S.map(O=>O.pageUrl??O.scope??"").filter(Boolean)).size>1?"site-crawl":"single-page",$=S.length>0?ea(S,{runs:n,workflows:fe},"2.1","AA",B,p,i,q):void 0,_=S.length>0?za(Kt({audits:S,igtRuns:n,workflows:fe,acknowledgedMatchKeys:B,incompleteResolutions:p,interactiveAuditResults:i,auditScope:q}),fe):void 0,F=P.overallLetter,R=($?$.failingCriteria.length+$.inconclusiveCriteria.length+$.untestedCriteria.length:0)===0&&!!$;async function M(O){var ve;if(!T||!((ve=$==null?void 0:$.inconclusiveReasons)!=null&&ve[O]))return;const me=$.inconclusiveReasons[O].filter(J=>J.source==="axe-incomplete"&&J.elements&&J.elements.length>0);if(me.length===0)return;h(J=>new Set(J).add(O)),b(null);const se=[];let Q=0;try{for(const re of me){const je=await ae({type:"AI_RESOLVE_INCOMPLETE_REQUEST",ruleId:re.ruleOrStepId,pageUrl:re.pageUrl??T,wcagCriterion:O,elements:re.elements??[],targetLevel:"AA"});if(je!=null&&je.unavailableReason){b(je.unavailableReason);break}je!=null&&je.resolutions&&(se.push(...je.resolutions),Q+=je.totalCostUsd??0)}if(T){const re=await qe(T);c(re)}const J={total:se.length,pass:se.filter(re=>re.verdict==="pass").length,fail:se.filter(re=>re.verdict==="fail").length,uncertain:se.filter(re=>re.verdict==="uncertain").length,costUsd:Q,resolutions:se};N(re=>({...re,[O]:J}))}finally{h(J=>{const re=new Set(J);return re.delete(O),re})}}function ie(O){I(ee=>{const me=new Set(ee);return me.has(O)?me.delete(O):me.add(O),me})}const A=((xe=S[0])==null?void 0:xe.startedAt)??null,G=s&&A?`${s}::${A}`:null;m.useEffect(()=>{if(!G||!$||C===G||j!=="complete")return;const O=$.inconclusiveCriteria.filter(ee=>{var se;return(((se=$.inconclusiveReasons)==null?void 0:se[ee])??[]).some(Q=>Q.source==="axe-incomplete"&&Q.elements&&Q.elements.length>0)});if(O.length===0){f(G);return}f(G),(async()=>{for(const ee of O)try{await M(ee)}catch{}})()},[G,$,j]);async function W(O){var je,os;if(!T)return;const ee=((je=$==null?void 0:$.inconclusiveReasons)==null?void 0:je[O])??[],me=((os=$==null?void 0:$.failingReasons)==null?void 0:os[O])??[],se=[],Q=new Set;for(const ce of ee){if(ce.source!=="axe-incomplete"||!ce.elements)continue;const Se=ce.pageUrl??T;for(const Ae of ce.elements){const Pe=`${Se}::${ce.ruleOrStepId}::${Ae.selector}`;Q.has(Pe)||(Q.add(Pe),se.push({ruleId:ce.ruleOrStepId,pageUrl:Se,selector:Ae.selector}))}}for(const ce of me){if(ce.source!=="ai"||!ce.selector)continue;const Se=ce.ruleOrStepId.startsWith("ai-resolved::")?ce.ruleOrStepId.slice(13):ce.ruleOrStepId,Ae=ce.pageUrl??T,Pe=`${Ae}::${Se}::${ce.selector}`;Q.has(Pe)||(Q.add(Pe),se.push({ruleId:Se,pageUrl:Ae,selector:ce.selector}))}if(se.length===0)return;const ve=new Date().toISOString(),J=[];for(const ce of se){const Se=p.find(Ae=>Ae.pageUrl===ce.pageUrl&&Ae.ruleId===ce.ruleId&&Ae.selector===ce.selector);Se&&Se.verdict==="pass"&&Se.reasoning.startsWith("Marked as visually verified")||J.push({pageUrl:ce.pageUrl,ruleId:ce.ruleId,selector:ce.selector,verdict:"pass",reasoning:`Marked as visually verified by user on ${ve.slice(0,10)}.`,resolvedAt:ve,costUsd:0,wcagCriterion:O})}if(J.length===0)return;await qa(J);const re=await qe(T);c(re),N(ce=>({...ce,[O]:{total:J.length,pass:J.length,fail:0,uncertain:0,costUsd:0,resolutions:J}}))}const K=(()=>{if(!$)return null;if(R)return{kind:"conformant",text:`WCAG ${$.targetLevel} Status: Conformant`,detail:"All applicable criteria pass automated + AI checks."};const O=$.inconclusiveCriteria.length,ee=$.failingCriteria.length,me=$.untestedCriteria.length,se=[];if(ee>0){const ve=$.failingCriteria.slice(0,4).join(", ")+(ee>4?`, +${ee-4}`:"");se.push(`${ee} ${ee===1?"criterion":"criteria"} failing (${ve})`)}if(O>0){const ve=$.inconclusiveCriteria.slice(0,4).join(", ")+(O>4?`, +${O-4}`:"");se.push(`${O} inconclusive (${ve})`)}if(me>0){const ve=$.untestedCriteria.slice(0,4).join(", ")+(me>4?`, +${me-4}`:"");se.push(`${me} untested (${ve})`)}const Q=ee>0?"Fix the failing items OR Mark visually verified if AI was wrong about them.":me>0?"Mark untested via Guided Tests, OR confirm the tool gap (no axe rule + no AI walkthrough + no IGT step).":"Resolve axe-incomplete + IGT-skip items to claim conformance.";return{kind:"not-conformant",text:`WCAG ${$.targetLevel} Status: Not conformant`,detail:`${se.join(" · ")}. ${Q}`}})();let oe=0;for(const O of fe){const ee=n.find(se=>se.workflowId===O.id);if(!ee)continue;O.steps.every(se=>{const Q=ee.steps[se.id];return(Q==null?void 0:Q.status)==="pass"||(Q==null?void 0:Q.status)==="fail"||(Q==null?void 0:Q.status)==="skip"||(Q==null?void 0:Q.status)==="not-applicable"})&&oe++}const ne=new Set;for(const O of t)B.has(O.matchKey)||ne.add(`${O.ruleId}::${O.target.selector}`);for(const O of V)O.verdict==="fail"&&ne.add(`${O.ruleId}::${O.selector}`);const le=ne.size;return e.jsxs("div",{className:"border border-slate-200 rounded-lg bg-white overflow-hidden",children:[!v&&k&&e.jsx(Dr,{scannedAt:k}),!a&&e.jsxs("div",{className:"flex",children:[e.jsx("div",{className:`flex items-center justify-center w-24 ${Ar[F]} text-white shrink-0`,children:e.jsx("span",{className:"text-5xl font-bold leading-none",children:F})}),e.jsxs("div",{className:"flex-1 p-3 space-y-1",children:[e.jsx("p",{className:"text-xs font-semibold text-slate-900",children:"Overall grade"}),e.jsxs("p",{className:"text-[11px] text-slate-600 leading-snug",children:["Mean of ",P.subGrades.length," verification areas below. Untested areas count as F until verified."]}),K&&e.jsxs("div",{className:`text-[11px] leading-snug mt-1 rounded px-2 py-1 border ${K.kind==="conformant"?"bg-emerald-50 border-emerald-200 text-emerald-900":"bg-amber-50 border-amber-200 text-amber-900"}`,children:[e.jsxs("p",{className:"font-medium",children:[K.kind==="conformant"?"✓ ":"✗ ",K.text]}),e.jsx("p",{className:"mt-0.5",children:K.detail})]})]})]}),a&&K&&e.jsxs("div",{className:`text-[11px] leading-snug px-3 py-2 border-b ${K.kind==="conformant"?"bg-emerald-50 border-emerald-200 text-emerald-900":"bg-amber-50 border-amber-200 text-amber-900"}`,children:[e.jsxs("p",{className:"font-medium",children:[K.kind==="conformant"?"✓ ":"✗ ",K.text]}),e.jsx("p",{className:"mt-0.5",children:K.detail})]}),P.isLawsuitRisk&&e.jsx(Tr,{areas:P.warningAreas}),e.jsx($r,{grades:P.subGrades,uncategorized:wr(t,p,{excludeAckedMatchKeys:B})}),$&&e.jsx(Er,{coverage:$,onResolveWithAi:M,onMarkVisuallyVerified:W,resolving:u,resolveError:x,lastResolveResult:w,expandedResultFor:E,onToggleResultDetail:ie,violations:t}),_&&e.jsx(Rr,{layers:_}),e.jsx(Lr,{violationsRemaining:le,manualCompleted:oe,manualTotal:fe.length}),oe>0||S.length>0?e.jsxs("div",{className:"border-t border-slate-200 px-3 py-2 bg-slate-50",children:[e.jsx("p",{className:"text-[11px] uppercase tracking-wide text-slate-500 mb-1.5",children:"Manual coverage (Guided Tests)"}),e.jsxs("div",{className:"text-[11px] text-slate-700 mb-1.5",children:[e.jsx("strong",{children:oe})," of ",e.jsx("strong",{children:fe.length})," workflows complete"]}),e.jsx("div",{className:"flex h-1 bg-slate-200 rounded-full overflow-hidden",children:e.jsx("div",{className:"bg-emerald-500",style:{width:`${oe/fe.length*100}%`}})})]}):null]})}function Er({coverage:t,onResolveWithAi:s,onMarkVisuallyVerified:a,resolving:n,resolveError:r,lastResolveResult:o,expandedResultFor:l,onToggleResultDetail:i,violations:d}){const p=y(C=>C.setView),c=y(C=>C.setFindingsLens),u=y(C=>C.setPendingAreaExpand);function h(C){const f=Qa(C,d);p("report"),f?(c("per-area"),u(f)):c("violations")}const x=t.untestedCriteria.length+t.inconclusiveCriteria.length,[b,w]=m.useState(x>0&&x<=3),N=t.totalApplicable===0?0:Math.round(t.evaluated/t.totalApplicable*100),E=t.canClaimConformance,I=[];return t.failingCriteria.length>0&&I.push({kind:"failing",ids:t.failingCriteria}),t.inconclusiveCriteria.length>0&&I.push({kind:"inconclusive",ids:t.inconclusiveCriteria}),t.untestedCriteria.length>0&&I.push({kind:"untested",ids:t.untestedCriteria}),e.jsxs("div",{className:`border-t ${E?"border-emerald-200 bg-emerald-50":"border-amber-200 bg-amber-50"} px-3 py-2 text-[11px] leading-snug`,children:[e.jsxs("div",{className:`flex items-center justify-between gap-2 ${E?"text-emerald-900":"text-amber-900"}`,children:[e.jsxs("div",{children:[e.jsxs("span",{className:"font-semibold",children:["WCAG ",t.targetVersion," ",t.targetLevel," coverage:"," ",t.evaluated," of ",t.totalApplicable," criteria evaluated (",N,"%)"]}),E&&e.jsxs("p",{className:"text-[11px] mt-0.5",children:["Every applicable criterion has been evaluated and either passes or is N/A. This audit can be presented as a conformance-claim for ",t.targetVersion," ",t.targetLevel," for the audited URL(s)."]}),!E&&(()=>{const C=[];t.failingCriteria.length>0&&C.push("failing"),t.inconclusiveCriteria.length>0&&C.push("inconclusive"),t.untestedCriteria.length>0&&C.push("untested");const f=C.length===0?"unresolved":C.length===1?C[0]:C.length===2?`${C[0]} or ${C[1]}`:`${C.slice(0,-1).join(", ")}, or ${C[C.length-1]}`;return e.jsxs("p",{className:"text-[11px] mt-0.5 font-semibold",children:["Cannot claim ",t.targetLevel," conformance — applicable criteria remain ",f,"."]})})(),!E&&t.untestedCriteria.length>0&&e.jsxs("p",{className:"text-[11px] mt-0.5",children:[e.jsxs("strong",{children:[t.untestedCriteria.length," untested"]})," ",t.untestedCriteria.length===1?"criterion":"criteria"," — mark Pass / Fail / N/A in Guided Tests below."]}),!E&&t.inconclusiveCriteria.length>0&&e.jsxs("p",{className:"text-[11px] mt-0.5",children:[e.jsxs("strong",{children:[t.inconclusiveCriteria.length," inconclusive"]})," ",t.inconclusiveCriteria.length===1?"criterion":"criteria"," — axe couldn't fully determine OR an IGT step was skipped. Resolve before claiming conformance."]})]}),!E&&I.length>0&&e.jsx("button",{type:"button",onClick:()=>w(C=>!C),className:"text-[11px] underline shrink-0 self-start",children:b?"hide":"show list"})]}),b&&!E&&e.jsxs("div",{className:"mt-1.5 space-y-1.5",children:[I.map(C=>e.jsxs("div",{children:[e.jsxs("div",{className:`text-[10.5px] font-semibold uppercase tracking-wide ${C.kind==="failing"?"text-rose-900":"text-amber-900"}`,children:[C.kind==="untested"?"Untested":C.kind==="inconclusive"?"Inconclusive":"Failing"," (",C.ids.length,")"]}),e.jsx("ul",{className:"text-[10.5px] text-amber-900 space-y-1",children:C.ids.map(f=>{var P,B;const j=C.kind==="inconclusive"?(P=t.inconclusiveReasons)==null?void 0:P[f]:void 0,g=C.kind==="failing"?(B=t.failingReasons)==null?void 0:B[f]:void 0,v=j==null?void 0:j.some(U=>U.source==="axe-incomplete"&&U.elements&&U.elements.length>0),S=g==null?void 0:g.some(U=>U.source==="ai"),k=(n==null?void 0:n.has(f))??!1,T=o==null?void 0:o[f],V=(l==null?void 0:l.has(f))??!1;return e.jsxs("li",{className:"leading-snug",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 flex-wrap",children:[e.jsxs("button",{type:"button",onClick:()=>h(f),className:"font-mono text-[11px] text-left underline-offset-2 hover:underline text-brand-700 hover:text-brand-800 cursor-pointer",title:`Jump to the verification area covering ${f}`,children:["· ",f]}),(C.kind==="inconclusive"&&v||C.kind==="failing"&&S)&&(s||a)&&e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[C.kind==="inconclusive"&&s&&f!=="1.4.3"&&f!=="1.4.6"&&e.jsx("button",{type:"button",disabled:k,onClick:()=>s(f),className:"text-[11px] font-semibold px-2 py-1 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50 shadow-sm",title:"Ask AI to determine pass/fail for the specific elements axe couldn't sample.",children:k?"Resolving…":T?"✨ Resolve again →":"✨ Resolve with AI →"}),C.kind==="inconclusive"&&(f==="1.4.3"||f==="1.4.6")&&e.jsx("span",{className:"text-[10px] text-slate-500 italic",title:"The pixel-contrast sampler runs automatically and produces the authoritative verdict for color-contrast. Mark visually verified if the AI was wrong about a specific element.",children:"Pixel sampler ran automatically — use Mark visually verified if needed"}),a&&e.jsx("button",{type:"button",disabled:k,onClick:()=>a(f),className:"text-[11px] font-semibold px-2 py-1 bg-white text-emerald-700 border border-emerald-500 rounded hover:bg-emerald-50 disabled:opacity-50",title:C.kind==="failing"?"Override AI's fail determination — your human visual judgment is the highest authority per WCAG-EM.":"Mark all unresolved elements as visually verified by you. Same semantic weight as Acknowledge on a violation — closes the loop for items only a human can judge (text over images, gradients, etc.).",children:"✓ Mark visually verified"})]})]}),T&&e.jsxs("div",{className:"ml-3 mt-1 p-1.5 bg-white/60 border border-amber-200 rounded text-[10.5px]",children:[e.jsxs("div",{className:"font-semibold text-amber-900 flex items-center gap-2 flex-wrap",children:["AI returned ",T.total," ",T.total===1?"verdict":"verdicts",":",T.pass>0&&e.jsxs("span",{className:"text-emerald-700",children:["✓ ",T.pass," pass"]}),T.fail>0&&e.jsxs("span",{className:"text-rose-700",children:["✗ ",T.fail," fail"]}),T.uncertain>0&&e.jsxs("span",{className:"text-amber-700",children:["? ",T.uncertain," uncertain"]}),e.jsxs("span",{className:"text-slate-500 font-normal",children:["· $",T.costUsd.toFixed(4)]}),i&&e.jsx("button",{type:"button",onClick:()=>i(f),className:"ml-auto text-[10px] underline text-brand-700",children:V?"hide reasoning":"show reasoning"})]}),T.uncertain>0&&e.jsxs("p",{className:"mt-0.5 text-[10px] text-amber-800",children:["AI couldn't determine ",T.uncertain," ",T.uncertain===1?"element":"elements"," ","(typically text over images/gradients — needs visual review). These keep the criterion inconclusive."]}),T.pass===T.total&&T.total>0&&e.jsxs("p",{className:"mt-0.5 text-[10px] text-emerald-800",children:["All elements passed contrast — criterion above will flip to"," ",e.jsx("strong",{children:"pass"})," on next render."]}),V&&e.jsx("ul",{className:"mt-1.5 space-y-1 max-h-40 overflow-y-auto",children:T.resolutions.map((U,q)=>e.jsxs("li",{className:"text-[10px] leading-snug",children:[e.jsx("span",{className:U.verdict==="pass"?"text-emerald-700 font-semibold":U.verdict==="fail"?"text-rose-700 font-semibold":"text-amber-700 font-semibold",children:U.verdict==="pass"?"✓":U.verdict==="fail"?"✗":"?"})," ",e.jsx("code",{className:"font-mono bg-slate-100 px-1 rounded",children:U.selector}),e.jsx("div",{className:"ml-4 text-slate-600",children:U.reasoning})]},q))})]}),g&&g.length>0&&e.jsx("ul",{className:"ml-3 mt-0.5 space-y-0.5",children:g.map((U,q)=>e.jsxs("li",{className:"text-[10px] text-rose-800",children:[U.source==="ai"&&e.jsxs(e.Fragment,{children:["AI verdict ",e.jsx("code",{className:"font-mono",children:U.ruleOrStepId.replace(/^ai-resolved::/,"")})," fail — "]}),U.source==="axe"&&e.jsxs(e.Fragment,{children:["axe rule ",e.jsx("code",{className:"font-mono",children:U.ruleOrStepId})," fail — "]}),U.source==="igt"&&e.jsxs(e.Fragment,{children:["Guided Test ",e.jsx("code",{className:"font-mono",children:U.ruleOrStepId})," fail — "]}),U.selector&&e.jsx("code",{className:"font-mono bg-rose-100 px-1 rounded mr-1",children:U.selector}),U.notes&&e.jsx("span",{className:"text-rose-700",children:U.notes})]},q))}),j&&j.length>0?e.jsx("ul",{className:"ml-3 mt-0.5 space-y-0.5",children:j.map((U,q)=>e.jsxs("li",{className:"text-[10px] text-amber-800",children:[U.source==="axe-incomplete"&&e.jsxs(e.Fragment,{children:["axe rule ",e.jsx("code",{className:"font-mono",children:U.ruleOrStepId})," — "]}),U.source==="igt-skip"&&e.jsxs(e.Fragment,{children:["Guided Test step ",e.jsx("code",{className:"font-mono",children:U.ruleOrStepId})," skipped — "]}),U.source==="ai-uncertain"&&e.jsxs(e.Fragment,{children:["AI rule ",e.jsx("code",{className:"font-mono",children:U.ruleOrStepId})," — "]}),U.resolutionHint,U.elements&&U.elements.length>0&&e.jsxs("span",{className:"block ml-1 mt-0.5 text-[10px] text-amber-700",children:["on ",U.elements.length===1?"element":`${U.elements.length} elements`,":"," ",U.elements.slice(0,3).map(($,_,F)=>e.jsxs("span",{children:[e.jsx("code",{className:"font-mono bg-amber-100 px-1 rounded",children:$.selector}),_<F.length-1&&e.jsx("span",{className:"text-amber-600",children:", "})]},_)),U.elements.length>3&&e.jsxs("span",{className:"text-amber-600",children:[", +",U.elements.length-3," more"]})]})]},q))}):C.kind==="inconclusive"&&e.jsx("p",{className:"ml-3 mt-0.5 text-[10px] text-amber-800 italic",children:"Re-run the audit to see the specific axe rule or Guided Test step responsible. (Cached data from a pre-rc.53 build doesn't carry the reason metadata.)"})]},f)})})]},C.kind)),r&&e.jsx("p",{className:"text-[10px] text-rose-700 bg-rose-50 border border-rose-200 rounded px-1.5 py-1 mt-1",children:r})]})]})}const vs={automation:{label:"Automation",hint:"axe-core rules — runs on every scan."},ai:{label:"AI judgment",hint:"wcagcheckr AI analyzers (alt-text, contrast, vision)."},human:{label:"Human verification",hint:"Independent Guided Tests — manual checks."}};function Rr({layers:t}){const s=y(o=>o.setView),a=y(o=>o.setFindingsLens);function n(){s("report"),a("violations")}const r=["automation","ai","human"];return e.jsxs("div",{className:"border-t border-slate-200 px-3 py-2",children:[e.jsx("p",{className:"text-[11px] uppercase tracking-wide text-slate-500 mb-1.5",children:"Evidence layers"}),e.jsx("ul",{className:"space-y-1",children:r.map(o=>{const l=t[o],i=l.coveredCriteria.length,d=l.failing.length,p=l.inconclusive.length,c=l.unevaluated.length,u=l.cleared,h=d>0||p>0,x=i>0&&!h&&c===0,b=x?"text-emerald-700":d>0?"text-rose-700":"text-amber-700";return e.jsxs("li",{className:"flex items-start gap-2 text-[11px]",children:[e.jsx("span",{className:`w-5 h-5 inline-flex items-center justify-center rounded text-[10px] font-bold shrink-0 ${x?"bg-emerald-500 text-white":d>0?"bg-rose-500 text-white":"bg-amber-500 text-white"}`,"aria-hidden":"true",children:x?"✓":d>0?"!":"?"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-baseline gap-1.5 flex-wrap",children:[e.jsx("span",{className:"font-medium text-slate-800",children:vs[o].label}),e.jsx("span",{className:`font-mono text-[10px] ${b}`,children:i===0?"no coverage yet":`${u}/${i}`}),d>0&&e.jsxs("button",{type:"button",onClick:n,className:"text-[10px] text-rose-700 hover:underline cursor-pointer",title:`Confirmed fails (action: fix the underlying issue + re-audit, OR mark visually verified): ${l.failing.join(", ")}`,children:["· ",d," failing"]}),p>0&&e.jsxs("button",{type:"button",onClick:n,className:"text-[10px] text-amber-700 hover:underline cursor-pointer",title:`Inconclusive — this layer couldn't determine (action: try "Resolve with AI" below, OR mark via Guided Tests): ${l.inconclusive.join(", ")}`,children:["· ",p," inconclusive"]}),c>0&&e.jsxs("span",{className:"text-[10px] text-amber-700",children:["· ",c," pending"]})]}),e.jsx("p",{className:"text-[10px] text-slate-500 leading-snug",children:vs[o].hint}),o==="human"&&c>0&&e.jsx("button",{type:"button",onClick:()=>s("guided"),className:"text-[10px] text-brand-600 hover:underline mt-0.5",children:"Open Guided Tests →"})]})]},o)})})]})}function Tr({areas:t}){const s=t.map(a=>a.label);return e.jsxs("div",{className:"border-t border-rose-200 bg-rose-50 px-3 py-2 text-[11px] text-rose-900 leading-snug",children:[e.jsx("p",{className:"font-semibold mb-0.5",children:"⚠ Not lawsuit-safe"}),e.jsx("p",{children:s.length===1?e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:s[0]})," scored ",t[0].letter,". Even a high overall grade doesn't help if one area is failing — demand-letter mills target the weakest link."]}):e.jsxs(e.Fragment,{children:[s.length," areas are at lawsuit-risk:"," ",s.map((a,n)=>e.jsxs("span",{children:[e.jsx("strong",{children:a}),n<s.length-1?", ":""]},a)),". Fix these before relying on the overall grade."]})})]})}function $r({grades:t,uncategorized:s}){const a=y(i=>i.setView),n=y(i=>i.setFindingsLens),r=y(i=>i.setPendingAreaExpand);function o(i){a("report"),n("per-area"),r(i)}function l(i){const d=i.counts;return d.critical+d.serious+d.moderate+d.minor>0}return e.jsxs("div",{className:"border-t border-slate-200 px-3 py-2",children:[e.jsx("p",{className:"text-[11px] uppercase tracking-wide text-slate-500 mb-2",children:"Verification areas"}),e.jsxs("ul",{className:"grid grid-cols-1 gap-1.5",children:[t.map(i=>{const d=l(i),p="flex items-center gap-2 text-[11px] w-full text-left rounded px-1 py-0.5 -mx-1",c=d?"cursor-pointer hover:bg-slate-100":"cursor-default",u=e.jsxs(e.Fragment,{children:[e.jsx("span",{className:`w-6 h-6 inline-flex items-center justify-center rounded text-xs font-bold ${Cr[i.letter]}`,"aria-label":`Grade ${i.letter}`,children:i.letter}),e.jsx("span",{className:"font-medium text-slate-800 flex-1 min-w-0",children:i.label}),e.jsx(Ur,{grade:i,onOpenGuided:()=>a("guided")})]});return e.jsx("li",{children:d?e.jsx("button",{type:"button",onClick:()=>o(i.id),className:`${p} ${c}`,"aria-label":`Open ${i.label} violations`,children:u}):e.jsx("div",{className:p,children:u})},i.id)}),s&&s.total>0&&e.jsxs("li",{className:"flex items-center gap-2 text-[11px] mt-1 pt-1.5 border-t border-dashed border-slate-200",title:`These findings come from rules not mapped to any of the ${t.length} verification areas above. Listing them here so the headline count and the area cards agree. Rules: ${s.representatives.map(i=>i.ruleId).join(", ")}`,children:[e.jsx("span",{className:"w-6 h-6 inline-flex items-center justify-center rounded text-xs font-bold bg-slate-300 text-slate-700","aria-label":"Other findings",children:"?"}),e.jsxs("span",{className:"font-medium text-slate-700 flex-1 min-w-0",children:["Other findings",e.jsx("span",{className:"ml-2 text-[10px] text-slate-500 font-normal italic",children:"rules not mapped to a category"})]}),e.jsx("span",{className:"text-slate-500 text-[10px]",children:(()=>{const i=[];return s.counts.critical>0&&i.push(`${s.counts.critical} critical`),s.counts.serious>0&&i.push(`${s.counts.serious} serious`),s.counts.moderate>0&&i.push(`${s.counts.moderate} moderate`),s.counts.minor>0&&i.push(`${s.counts.minor} minor`),i.join(" · ")})()})]})]})]})}function Ur({grade:t,onOpenGuided:s}){const a=i=>{if(!i)return"";const d=fe.find(p=>p.id===i);return(d==null?void 0:d.name)??i};if(t.untested)return e.jsxs("span",{className:"text-slate-500 text-[10px] italic",children:["not graded —"," ",t.primaryVerifierWorkflowId?e.jsxs("button",{type:"button",onClick:s,className:"text-brand-600 hover:underline not-italic",children:["run ",a(t.primaryVerifierWorkflowId)," →"]}):"no data yet"]});if(t.verifiedByIgt){const i=t.verifiedAt?ga(Date.now()-new Date(t.verifiedAt).getTime()):null;return e.jsxs("span",{className:"text-emerald-700 text-[10px]",title:t.suppressedHeuristicCount>0?`Heuristic flagged ${t.suppressedHeuristicCount} issue${t.suppressedHeuristicCount===1?"":"s"}, but you verified this area in Guided Tests — those are treated as noise unless you re-verify.`:"Verified via Guided Tests",children:["✓ verified",i?` ${i} ago`:""]})}const{critical:n,serious:r,moderate:o,minor:l}=t.counts;if(n>0||r>0||o>0||l>0){const i=[];return n>0&&i.push({label:"critical",n,cls:"text-rose-700"}),r>0&&i.push({label:"serious",n:r,cls:"text-orange-700"}),o>0&&i.push({label:"moderate",n:o,cls:"text-amber-700"}),l>0&&i.push({label:"minor",n:l,cls:"text-slate-600"}),e.jsx("span",{className:"text-slate-500 text-[10px]",children:i.map((d,p)=>e.jsxs("span",{children:[p>0&&" · ",e.jsxs("span",{className:d.cls,children:[d.n," ",d.label]})]},d.label))})}return t.needsIgt?e.jsxs("button",{type:"button",onClick:s,className:"text-amber-700 hover:underline text-[10px]",title:"Verify this area by running the relevant Guided Tests workflow",children:["verify with ",a(t.primaryVerifierWorkflowId)," →"]}):e.jsx("span",{className:"text-emerald-700 text-[10px]",children:"clean"})}function Lr({violationsRemaining:t,manualCompleted:s,manualTotal:a}){const n=y(l=>l.setView),r=y(l=>l.setFindingsLens),o=[{status:t===0?"done":"next",label:t===0?"Automated checks pass":`Fix ${t} automated violation${t===1?"":"s"}`,action:t>0?()=>{n("report"),r("violations")}:void 0,tooltip:t>0?"Open the Violations list — each finding card has inline Acknowledge / Not a real issue / Locate / Fix recipe affordances.":void 0},{status:"optional",label:a>0?`Optional: spot-check via Guided Tests (${s}/${a} done — AI walkthroughs cover most)`:"Optional: spot-check via Guided Tests (AI walkthroughs cover most)",action:()=>n("guided"),tooltip:"Guided Tests are opt-in. The 5 AI walkthroughs auto-run after every audit and verdict the criteria that previously required manual keyboard / vision checks. Run these workflows only for belt-and-suspenders confidence on a formal conformance claim."},{status:t===0?"next":"pending",label:"Export AI fix prompt → sign-and-seal in Compliance",action:()=>n("delta"),tooltip:'Switches to the Delta lens. Export menu → "AI fix prompt" produces markdown for ChatGPT / Claude / Copilot with code-level fix recipes for every automated finding, including false-positive guidance. Then jump to the Compliance tile from Dashboard to sign-and-seal the audit for a chain-of-custody record.'}];return e.jsxs("div",{className:"border-t border-slate-200 px-3 py-2 bg-slate-50",children:[e.jsx("p",{className:"text-[11px] uppercase tracking-wide text-slate-500 mb-1.5",children:"Path to full WCAG compliance"}),e.jsx("ol",{className:"space-y-1 text-[11px]",children:o.map((l,i)=>{const d=l.status==="done"?"text-emerald-700":l.status==="next"?"text-brand-600 font-semibold":l.status==="optional"?"text-slate-500":"text-slate-400";return e.jsxs("li",{className:"flex items-start gap-2",children:[e.jsxs("span",{className:`font-mono shrink-0 ${d}`,"aria-hidden":"true",children:[i+1,"."]}),l.action?e.jsxs("button",{type:"button",onClick:l.action,title:l.tooltip,className:l.status==="next"?"text-brand-700 font-semibold underline-offset-2 hover:underline text-left leading-snug":"text-slate-600 underline-offset-2 hover:underline hover:text-slate-900 text-left leading-snug",children:[l.label," →"]}):e.jsx("span",{className:l.status==="done"?"text-slate-500 line-through leading-snug":l.status==="next"?"text-slate-900 font-medium leading-snug":"text-slate-500 leading-snug",children:l.label}),l.status==="done"&&e.jsx("span",{className:"text-emerald-700 shrink-0 font-mono","aria-label":"step complete",children:"✓"})]},i)})})]})}function _r({current:t,total:s}){return e.jsxs("div",{role:"status","aria-live":"polite",className:"border border-slate-200 rounded-lg bg-white p-4 flex items-center gap-3",children:[e.jsx("span",{className:"inline-block w-5 h-5 border-2 border-brand-500 border-t-transparent rounded-full animate-spin motion-reduce:animate-none","aria-hidden":"true"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-medium text-slate-900",children:"Scanning…"}),e.jsx("p",{className:"text-[11px] text-slate-500",children:typeof t=="number"&&typeof s=="number"?`State ${t} of ${s}. Grade will appear when the scan completes.`:"Grade will appear when the scan completes."})]})]})}function Dr({scannedAt:t}){const s=Date.now()-new Date(t).getTime();return e.jsxs("div",{className:"bg-amber-50 border-b border-amber-200 px-3 py-1.5 text-[11px] text-amber-900 flex items-center gap-2",children:[e.jsx("span",{"aria-hidden":"true",children:"↻"}),e.jsxs("span",{children:["Showing a previous scan (",ga(s)," old). Re-scan to grade the current page state."]})]})}function ga(t){const s=Math.floor(t/1e3);if(s<60)return"less than a minute";if(s<120)return"1 minute";if(s<3600)return`${Math.floor(s/60)} minutes`;if(s<7200)return"1 hour";if(s<86400)return`${Math.floor(s/3600)} hours`;const a=Math.floor(s/86400);return a===1?"1 day":`${a} days`}function fa(){return typeof chrome<"u"&&typeof chrome.devtools<"u"}async function ys(t){if(!fa())return!1;const s=chrome.devtools;return await new Promise(a=>{const r=`(function(){
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/scheduled-audit-runner-BqTcRkAP.js","assets/diff-DA41zYPc.js","assets/crash-reporter-Dc5lvxvY.js","assets/ai-usage-log-C-jq4cW3.js","assets/copy-ai-fixer-prompt-BHi-aVOx.js","assets/site-report-renderer-ChI4wmii.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
var Ba=Object.defineProperty;var Ha=(t,s,a)=>s in t?Ba(t,s,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[s]=a;var ls=(t,s,a)=>Ha(t,typeof s!="symbol"?s+"":s,a);import{R as ze,i as ge,r as m,j as e,M as Me,C as Lt,A as tt}from"./styles-DToZ04ht.js";import{s as Xs,i as Bt,g as Ka,a as ue,d as Zs,l as Ue,S as De,b as qe,c as Ie,e as Le,f as Ht,h as ea,j as za,k as Kt,A as fe,m as qa,n as Qa,o as Ya,u as Ja,p as Xa,q as Za,r as en,t as zt,v as tn,w as sn,N as an,x as _t,y as ta,z as Dt,B as nn,O as rn,C as dt,D as ut,E as on,F as ln,G as cs,H as cn,I as dn,J as un,K as pn,L as hn,M as mn,P as xn,Q as gn,R as fn,T as bn,U as vn,V as yn,W as wn,X as sa,Y as jn,Z as ds,_ as us,$ as kt,a0 as Nn,a1 as ps,a2 as kn,a3 as Sn,a4 as An,a5 as Cn,a6 as In}from"./scheduled-audit-runner-BqTcRkAP.js";import{_ as ke}from"./diff-DA41zYPc.js";import{o as we,r as Z,s as ae,c as aa,b as be,d as Ee}from"./crash-reporter-Dc5lvxvY.js";import{g as na,j as ft,k as bt,t as et,m as En,B as Oe,i as qt,n as Rn,o as $e,T as ra,p as ia,q as vt,u as Tn}from"./ai-usage-log-C-jq4cW3.js";import{s as $n,t as Un}from"./design-system-audit-DpxJrxnb.js";const hs=t=>{let s;const a=new Set,n=(p,c)=>{const u=typeof p=="function"?p(s):p;if(!Object.is(u,s)){const h=s;s=c??(typeof u!="object"||u===null)?u:Object.assign({},s,u),a.forEach(x=>x(s,h))}},r=()=>s,i={setState:n,getState:r,getInitialState:()=>d,subscribe:p=>(a.add(p),()=>a.delete(p))},d=s=t(n,r,i);return i},Ln=t=>t?hs(t):hs,_n=t=>t;function Dn(t,s=_n){const a=ze.useSyncExternalStore(t.subscribe,ze.useCallback(()=>s(t.getState()),[t,s]),ze.useCallback(()=>s(t.getInitialState()),[t,s]));return ze.useDebugValue(a),a}const ms=t=>{const s=Ln(t),a=n=>Dn(s,n);return Object.assign(a,s),a},On=t=>t?ms(t):ms,y=On(t=>({status:"idle",progress:null,results:[],delta:null,componentId:null,errorMessage:null,freshThisSession:!1,baselineList:[],tier:"trial",trialDaysRemaining:null,seatsUsed:null,seatsTotal:null,planCode:null,licenseDaysRemaining:null,pastDue:!1,messages:[],unreadMessageCount:0,criticalUnacked:!1,view:"matrix",findingsLens:"overview",userMode:null,siteCrawlStatus:"idle",siteCrawlProgress:null,siteCrawlReport:null,siteCrawlError:null,crawlNavContext:null,resolutionsByUrl:{},pinnedMatchKey:null,pinnedFound:!0,aiFailure:null,aiProgress:null,acknowledgedKeys:new Set,pendingAreaExpand:null,auditStartedAtMs:null,lastAuditWallClockMs:null,setStatus:s=>t({status:s}),startNewScan:()=>t({status:"running",results:[],delta:null,errorMessage:null,progress:null,componentId:null,pinnedMatchKey:null,pinnedFound:!0,aiFailure:null,aiProgress:null,auditStartedAtMs:Date.now(),crawlNavContext:null}),setProgress:s=>t({progress:s}),setResults:(s,a,n)=>t(r=>{const o=r.auditStartedAtMs?Date.now()-r.auditStartedAtMs:null;return{results:s,delta:a,componentId:n,status:"complete",errorMessage:null,freshThisSession:!0,aiProgress:null,pinnedMatchKey:null,pinnedFound:!0,lastAuditWallClockMs:o,auditStartedAtMs:null}}),setDelta:s=>t({delta:s}),setError:s=>t({errorMessage:s,status:"failed"}),setBaselineList:s=>t({baselineList:s}),clearResults:()=>t({results:[],delta:null,componentId:null,errorMessage:null,progress:null,status:"idle",freshThisSession:!1,pinnedMatchKey:null,pinnedFound:!0,aiFailure:null,aiProgress:null}),setTier:(s,a)=>t({tier:s,trialDaysRemaining:(a==null?void 0:a.trialDaysRemaining)??null,seatsUsed:(a==null?void 0:a.seatsUsed)??null,seatsTotal:(a==null?void 0:a.seatsTotal)??null,planCode:(a==null?void 0:a.planCode)??null,licenseDaysRemaining:(a==null?void 0:a.licenseDaysRemaining)??null,pastDue:(a==null?void 0:a.pastDue)??!1}),setView:s=>t({view:s}),setFindingsLens:s=>t({findingsLens:s}),setPendingAreaExpand:s=>t({pendingAreaExpand:s}),setUserMode:s=>t({userMode:s}),setSiteCrawlStatus:s=>t({siteCrawlStatus:s}),setCrawlNavContext:s=>t({crawlNavContext:s}),setResolutionsForUrl:(s,a)=>t(n=>({resolutionsByUrl:{...n.resolutionsByUrl,[s]:a}})),setSiteCrawlProgress:s=>t({siteCrawlProgress:s}),setSiteCrawlReport:s=>{t({siteCrawlReport:s}),Xs(s)},setSiteCrawlError:s=>t({siteCrawlError:s}),setPinned:(s,a=!0)=>t({pinnedMatchKey:s,pinnedFound:a}),setAiFailure:s=>t({aiFailure:s}),clearAiFailure:()=>t({aiFailure:null}),setAiProgress:s=>t({aiProgress:s}),setAcknowledgedKeys:s=>t({acknowledgedKeys:s}),markAcknowledged:s=>t(a=>({acknowledgedKeys:new Set(a.acknowledgedKeys).add(s)})),markUnacknowledged:s=>t(a=>{const n=new Set(a.acknowledgedKeys);return n.delete(s),{acknowledgedKeys:n}}),dismissedKeys:new Set,setDismissedKeys:s=>t({dismissedKeys:s}),markDismissed:s=>t(a=>({dismissedKeys:new Set(a.dismissedKeys).add(s)})),markUndismissed:s=>t(a=>{const n=new Set(a.dismissedKeys);return n.delete(s),{dismissedKeys:n}}),setMessages:(s,a,n)=>t({messages:s,unreadMessageCount:a,criticalUnacked:n}),applyMessageAck:(s,a)=>t(n=>{const r=n.messages.map(i=>i.id!==s?i:a==="seen"?{...i,seen:!0}:a==="dismissed"?{...i,dismissed:!0}:a==="acknowledged"?{...i,acknowledged:!0}:a==="clicked"?{...i,clicked:!0}:i).filter(i=>i.severity==="critical"?!i.acknowledged:!i.dismissed),o=r.filter(i=>!i.seen).length,l=r.some(i=>i.severity==="critical"&&!i.acknowledged);return{messages:r,unreadMessageCount:o,criticalUnacked:l}})})),pt="sidePanel:lastAudit";function Fn(){const t=[];return t.push(we("AUDIT_PROGRESS_EVENT",s=>{const a=y.getState().status==="running";y.getState().setProgress({current:s.current,total:s.total,currentState:s.currentState}),y.getState().setStatus("running"),a||ge.polite(`Audit running, scanning ${s.total} state${s.total===1?"":"s"}.`)})),t.push(we("AUDIT_COMPLETE_EVENT",s=>{var i;y.getState().setResults(s.results,s.delta,s.componentId);const a=s.results.reduce((d,p)=>d+p.violations.length,0),n=((i=s.delta)==null?void 0:i.newCount)??0,r=s.delta?`Audit complete. ${n} new violation${n===1?"":"s"} versus baseline.`:`Audit complete. ${a} violation${a===1?"":"s"} found across ${s.results.length} state${s.results.length===1?"":"s"}.`;ge.polite(r);const o=y.getState().view;["compliance","guided","crawl"].includes(o)||(y.getState().setView("report"),y.getState().setFindingsLens("overview")),Pn({results:s.results,delta:s.delta,componentId:s.componentId}),Mn(s.results,s.delta,s.componentId)})),t.push(we("AUDIT_FAILED_EVENT",s=>{y.getState().setError(s.error.message)})),t.push(we("AI_AUGMENTATION_PROGRESS_EVENT",s=>{const a=y.getState().aiProgress;y.getState().setAiProgress({currentCheckLabel:s.currentCheckLabel,current:s.current,total:s.total,candidatesDone:s.candidatesDone,candidatesTotal:s.candidatesTotal}),a||ge.polite(`AI augmentation running ${s.total} check${s.total===1?"":"s"}.`)})),t.push(we("AI_AUGMENTATION_FAILED_EVENT",s=>{y.getState().setAiFailure({severity:s.severity,reason:s.reason,checksAttempted:s.checksAttempted,checksSucceeded:s.checksSucceeded,checksErrored:s.checksErrored,errorDetails:s.errorDetails})})),t.push(we("SCORECARD_UPDATED_EVENT",()=>{ht()})),t.push(we("LICENSE_CHANGED_EVENT",()=>{oa()})),t.push(we("SITE_CRAWL_PROGRESS_EVENT",s=>{const a=y.getState();a.setSiteCrawlStatus("running"),a.setSiteCrawlProgress({current:s.current,total:s.total,url:s.url,lastViolations:s.violations}),s.status==="auditing"&&s.current===1&&ge.polite(`Site crawl started, scanning up to ${s.total} pages.`)})),t.push(we("SITE_CRAWL_COMPLETE_EVENT",s=>{const a=y.getState();a.setSiteCrawlStatus("complete"),a.setSiteCrawlReport(s.report),a.setSiteCrawlProgress(null),ge.polite(`Site crawl complete. Grade ${s.report.siteGrade}, ${s.report.totalUniqueViolations} unique violation${s.report.totalUniqueViolations===1?"":"s"}.`),(async()=>{try{const{loadSiteCrawlPerUrlResults:n}=await ke(async()=>{const{loadSiteCrawlPerUrlResults:i}=await import("./scheduled-audit-runner-BqTcRkAP.js").then(d=>d.aG);return{loadSiteCrawlPerUrlResults:i}},__vite__mapDeps([0,1,2,3])),{getResolutionsForPage:r}=await ke(async()=>{const{getResolutionsForPage:i}=await import("./scheduled-audit-runner-BqTcRkAP.js").then(d=>d.aI);return{getResolutionsForPage:i}},__vite__mapDeps([0,1,2,3])),o=await n();if(!o||o.length===0)return;const l=y.getState().setResolutionsForUrl;await Promise.all(o.map(async i=>{try{const d=await r(i.url);l(i.url,d)}catch{}}))}catch(n){console.warn("[site-crawl] failed to pre-warm resolutions cache",n)}})()})),t.push(we("SITE_CRAWL_FAILED_EVENT",s=>{const a=y.getState();a.setSiteCrawlStatus("failed"),a.setSiteCrawlError(s.error.message),a.setSiteCrawlProgress(null),ge.assertive(`Site crawl failed: ${s.error.message}`)})),()=>t.forEach(s=>s())}async function Mn(t,s,a){var n,r;if(t.length!==0)try{const o=await na();if(!o.enabled)return;const l=y.getState().tier;if(Bt(l)||!ft(l,"autoExportAuditReports"))return;const i=((n=t[0])==null?void 0:n.pageUrl)??((r=t[0])==null?void 0:r.scope)??"",d=[],p=y.getState().lastAuditWallClockMs??void 0;for(const c of o.formats)try{const u=await Z({type:"EXPORT_REQUEST",format:c,results:t,delta:s??void 0,wallClockMs:p});if(typeof u.content!="string"||u.content.length<200)continue;const h=bt(c,a??null);et(u.content,h),i&&await En({url:i,exportedAt:new Date().toISOString(),format:c,filename:h}),d.push(h)}catch(u){console.warn(`[auto-export] format ${c} failed:`,u)}d.length>0&&ge.polite(`Audit auto-exported ${d.length} file${d.length===1?"":"s"}.`)}catch(o){console.warn("[auto-export] failed:",o)}}async function Pn(t){const s={...t,results:t.results.map(({screenshotDataUrl:a,...n})=>n)};try{await chrome.storage.local.set({[pt]:s})}catch(a){console.warn("[wire-messaging] persistLastAudit failed; results stay in-memory only",a)}}async function Gn(){const s=(await chrome.storage.local.get(pt))[pt];s&&y.setState({results:s.results,delta:s.delta,componentId:s.componentId,status:"complete"})}async function Vn(){await chrome.storage.local.remove(pt)}async function yt(){y.getState().clearResults(),await Vn()}async function ht(){const t=await Z({type:"BASELINE_LIST"});y.getState().setBaselineList(t.items)}async function oa(t){const s=await Z({type:"TIER_GET",forceRefresh:(t==null?void 0:t.forceRefresh)===!0});y.getState().setTier(s.tier,{trialDaysRemaining:s.trialDaysRemaining,seatsUsed:s.seatsUsed,seatsTotal:s.seatsTotal,planCode:s.planCode,licenseDaysRemaining:s.licenseDaysRemaining,pastDue:s.pastDue}),la()}async function la(){const{fetchMessages:t}=await ke(async()=>{const{fetchMessages:n}=await Promise.resolve().then(()=>Jn);return{fetchMessages:n}},void 0),s=y.getState().userMode,a=await t(s);a&&y.getState().setMessages(a.messages,a.unreadCount,a.criticalUnacked)}async function Wn(){const s=(await Z({type:"SETTINGS_GET",key:"userMode"})).data,a=s==="owner"||s==="dev"?s:null;y.getState().setUserMode(a)}function Bn(){return chrome.runtime.connect({name:"audit-keepalive"})}let mt=null;async function Hn(){if(mt===null)try{const t=await chrome.windows.getCurrent();typeof t.id=="number"&&(mt=t.id)}catch{}}function ca(){if(mt===null)return;const t=chrome.sidePanel;!t||typeof t.open!="function"||t.open({windowId:mt}).catch(()=>{})}function Ne(t){ca(),y.getState().setSiteCrawlReport(null),Xs(null).catch(()=>{}),ae(t)}const Ot="dismissedFindings";function wt(t){try{const s=new URL(t);return`${s.origin}${s.pathname.replace(/\/+$/,"")}`}catch{return t}}function Ye(t){return`reading-order::${t}`}function Je(t){return`tab-order::${t}`}function Qt(t){return`violation::${t}`}async function jt(){try{const t=await chrome.storage.local.get(Ot),s=t==null?void 0:t[Ot];if(s&&typeof s=="object")return s}catch{}return{}}async function Yt(t){await chrome.storage.local.set({[Ot]:t})}async function Jt(t){return(await jt())[wt(t)]??{}}async function Xt(t,s,a,n){const r=await jt(),o=wt(t),l=r[o]??{};l[s]={reason:a,dismissedAt:new Date().toISOString(),snippet:n},r[o]=l,await Yt(r)}async function Xe(t,s){if(s.length===0)return;const a=await jt(),n=wt(t),r=a[n]??{},o=new Date().toISOString();for(const l of s)r[l.key]={reason:l.reason,dismissedAt:o,snippet:l.snippet};a[n]=r,await Yt(a)}async function Zt(t,s){const a=await jt(),n=wt(t),r=a[n];!r||!(s in r)||(delete r[s],Object.keys(r).length===0?delete a[n]:a[n]=r,await Yt(a))}const Vc=Object.freeze(Object.defineProperty({__proto__:null,addDismissal:Xt,addDismissals:Xe,dismissalKeyForReadingOrder:Ye,dismissalKeyForTabOrder:Je,dismissalKeyForViolation:Qt,getDismissalsForUrl:Jt,removeDismissal:Zt},Symbol.toStringTag,{value:"Module"}));function Kn({onClose:t}){const[s,a]=m.useState(""),[n,r]=m.useState(""),[o,l]=m.useState(!0),[i,d]=m.useState(""),[p,c]=m.useState(!1),[u,h]=m.useState(null);async function x(b){var w;if(b.preventDefault(),!(!s.trim()||!n.trim())){c(!0),h(null);try{const N=await Z({type:"SUPPORT_MESSAGE_REQUEST",subject:s.trim(),body:n.trim(),includeContext:o,replyEmail:i.trim()||void 0});N.success?(h({ok:!0,msg:`Sent (ref: ${N.ticketRef??"n/a"})`}),setTimeout(t,1200)):h({ok:!1,msg:((w=N.error)==null?void 0:w.message)??"Failed to send"})}finally{c(!1)}}}return e.jsxs("form",{onSubmit:x,className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"support-subject",className:"block text-xs font-medium mb-1",children:"Subject"}),e.jsx("input",{id:"support-subject",type:"text",value:s,onChange:b=>a(b.target.value),required:!0,className:"w-full text-xs border border-slate-300 rounded px-2 py-1"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"support-body",className:"block text-xs font-medium mb-1",children:"Message"}),e.jsx("textarea",{id:"support-body",value:n,onChange:b=>r(b.target.value),required:!0,rows:6,className:"w-full text-xs border border-slate-300 rounded px-2 py-1"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"support-reply",className:"block text-xs font-medium mb-1",children:"Reply email (optional)"}),e.jsx("input",{id:"support-reply",type:"email",autoComplete:"email",value:i,onChange:b=>d(b.target.value),className:"w-full text-xs border border-slate-300 rounded px-2 py-1"})]}),e.jsxs("label",{className:"flex items-start gap-2 text-xs",children:[e.jsx("input",{type:"checkbox",checked:o,onChange:b=>l(b.target.checked),className:"mt-0.5"}),e.jsx("span",{className:"text-slate-600",children:"Include extension version, browser platform, and license tier (no URLs, page content, or audit data is sent)."})]}),u&&e.jsx("p",{id:"support-form-result",role:u.ok?"status":"alert",className:`text-xs ${u.ok?"text-green-700":"text-red-700"}`,children:u.msg}),e.jsxs("div",{className:"flex gap-2 justify-end",children:[e.jsx("button",{type:"button",onClick:t,className:"text-xs px-3 py-1 hover:bg-slate-100 rounded",children:"Cancel"}),e.jsx("button",{type:"submit",disabled:p,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded disabled:opacity-50",children:p?"Sending…":"Send"})]})]})}function xs({onClick:t,ariaLabel:s,title:a,children:n,className:r}){return e.jsx("button",{onClick:t,"aria-label":s,title:a??s,className:`inline-flex items-center justify-center min-w-[24px] min-h-[24px] text-xs text-slate-500 hover:text-slate-900 ${r??""}`,children:n})}const xt=aa("messages-client"),zn="https://api.wcagcheckr.com",da="wcagcheckr",qn=1e4;function Qn(){try{return chrome.runtime.getManifest().version}catch{return"0.0.0"}}async function ua(t,s){const a=await Ka();if(!a)throw new Error("no_license_token");const n={...(s==null?void 0:s.headers)??{},Authorization:`Bearer ${a}`,"X-Extension-Version":Qn()};return s!=null&&s.userMode&&(n["X-User-Mode"]=s.userMode),fetch(`${zn}${t}`,{...s,headers:n,signal:AbortSignal.timeout(qn)})}async function Yn(t){try{const s=await ua(`/v1/products/${da}/messages`,{userMode:t??null});return s.ok?await s.json():(xt.warn("fetchMessages http",s.status),null)}catch(s){return xt.warn("fetchMessages failed",s),null}}async function Fe(t,s){try{const a=await ua(`/v1/products/${da}/messages/${t}/ack`,{method:"POST",body:JSON.stringify({action:s}),headers:{"content-type":"application/json"}});return a.ok?!0:(xt.warn("ackMessage http",a.status,"action",s),!1)}catch(a){return xt.warn("ackMessage failed",a),!1}}const Jn=Object.freeze(Object.defineProperty({__proto__:null,ackMessage:Fe,fetchMessages:Yn},Symbol.toStringTag,{value:"Module"})),Xn=["http:","https:"];function Zn(t){try{const s=new URL(t);return Xn.includes(s.protocol)}catch{return!1}}function gs(t){const s=[];let a=0,n=0;for(;a<t.length;){if(t[a]==="["){const o=t.indexOf("]",a+1);if(o!==-1&&t[o+1]==="("){const l=t.indexOf(")",o+2);if(l!==-1){const i=t.slice(a+1,o),d=t.slice(o+2,l);Zn(d)?s.push(e.jsx("a",{href:d,target:"_blank",rel:"noopener",className:"text-brand-700 underline",children:i},`l-${n++}`)):s.push(e.jsx(m.Fragment,{children:i},`l-${n++}`)),a=l+1;continue}}}if(t[a]==="*"&&t[a+1]==="*"){const o=t.indexOf("**",a+2);if(o!==-1){s.push(e.jsx("strong",{children:t.slice(a+2,o)},`b-${n++}`)),a=o+2;continue}}if(t[a]==="*"&&t[a+1]!=="*"){const o=t.indexOf("*",a+1);if(o!==-1&&t[o+1]!=="*"){s.push(e.jsx("em",{children:t.slice(a+1,o)},`i-${n++}`)),a=o+1;continue}}let r=a+1;for(;r<t.length&&t[r]!=="*"&&t[r]!=="[";)r++;s.push(e.jsx(m.Fragment,{children:t.slice(a,r)},`t-${n++}`)),a=r}return s}function pa({source:t}){const s=t.split(/\r?\n/),a=[];let n=[],r=[],o=0;function l(){if(r.length===0)return;const d=r.join(" ");a.push(e.jsx("p",{className:"leading-snug",children:gs(d)},`p-${o++}`)),r=[]}function i(){n.length!==0&&(a.push(e.jsx("ul",{className:"list-disc pl-5 space-y-0.5",children:n.map((d,p)=>e.jsx("li",{children:gs(d)},p))},`u-${o++}`)),n=[])}for(const d of s){const p=d.trimEnd();if(p===""){l(),i();continue}const c=/^[-*]\s+(.*)$/.exec(p);if(c){l(),n.push(c[1]);continue}i(),r.push(p)}return l(),i(),e.jsx("div",{className:"space-y-1.5",children:a})}const er={info:"bg-blue-500",promo:"bg-purple-500",warning:"bg-amber-500",critical:"bg-rose-500"},tr={critical:"bg-rose-50 border-rose-200"};function ha(){const t=y(h=>h.unreadMessageCount),s=y(h=>h.messages),a=y(h=>h.applyMessageAck),[n,r]=m.useState(!1),o=m.useRef(-1),[l,i]=m.useState(!1);m.useEffect(()=>{const h=s.filter(b=>!b.seen);if(h.length===0)return;const x=Math.max(...h.map(b=>b.id));if(x>o.current){o.current=x,i(!0);const b=setTimeout(()=>i(!1),1500);return()=>clearTimeout(b)}},[s]);async function d(){const h=s.filter(x=>!x.seen);if(h.length!==0)for(const x of h)a(x.id,"seen"),Fe(x.id,"seen")}function p(){const h=!n;r(h),h&&d()}async function c(h){a(h.id,"dismissed"),await Fe(h.id,"dismissed")}async function u(h){h.ctaUrl&&(a(h.id,"clicked"),Fe(h.id,"clicked"),chrome.tabs.create({url:h.ctaUrl}).catch(()=>{window.open(h.ctaUrl,"_blank","noopener")}))}return e.jsxs("div",{className:"relative",children:[e.jsxs("button",{type:"button",onClick:p,"aria-label":t>0?`Notifications (${t} unread)`:"Notifications","aria-expanded":n,"aria-haspopup":"dialog",className:`relative grid place-items-center w-7 h-7 rounded text-slate-500 hover:bg-slate-100 hover:text-slate-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-brand-500 ${l?"animate-bell-pulse":""}`,title:t>0?`${t} new message${t===1?"":"s"}`:"No new messages",children:[e.jsx(sr,{active:t>0}),t>0&&e.jsx("span",{"aria-hidden":"true",className:"absolute top-0.5 right-0.5 w-2 h-2 rounded-full bg-rose-500 ring-2 ring-white"})]}),n&&e.jsx(ar,{messages:s,onClose:()=>r(!1),onDismiss:c,onCtaClick:u})]})}function sr({active:t}){return e.jsx("svg",{viewBox:"0 0 20 20",width:"16",height:"16","aria-hidden":"true",fill:"currentColor",className:t?"text-rose-500":"",children:e.jsx("path",{d:"M10 2a5 5 0 00-5 5v3l-1.6 2.4a1 1 0 00.84 1.6h11.52a1 1 0 00.84-1.6L15 10V7a5 5 0 00-5-5zm-1.5 13a1.5 1.5 0 003 0h-3z"})})}function ar({messages:t,onClose:s,onDismiss:a,onCtaClick:n}){const r=m.useRef(null);return m.useEffect(()=>{const o=i=>{r.current&&(r.current.contains(i.target)||s())},l=i=>{i.key==="Escape"&&s()};return document.addEventListener("mousedown",o),document.addEventListener("keydown",l),()=>{document.removeEventListener("mousedown",o),document.removeEventListener("keydown",l)}},[s]),e.jsxs("div",{ref:r,role:"dialog","aria-label":"Notifications",className:"absolute right-0 top-full mt-1 w-80 max-h-[420px] overflow-y-auto bg-white border border-slate-200 rounded shadow-lg z-50 text-xs",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 border-b border-slate-200",children:[e.jsx("span",{className:"font-medium",children:"Notifications"}),e.jsx("button",{type:"button",onClick:()=>{la()},className:"text-[11px] text-brand-700 hover:underline",children:"Refresh"})]}),t.length===0?e.jsx("div",{className:"p-4 text-center text-slate-500 text-[11px]",children:"No messages."}):e.jsx("ul",{className:"divide-y divide-slate-100",children:t.map(o=>e.jsx("li",{className:`p-3 ${o.seen?"":"bg-slate-50"}`,children:e.jsxs("div",{className:"flex gap-2",children:[e.jsx("div",{className:`shrink-0 w-1 self-stretch rounded ${er[o.severity]}`,"aria-hidden":"true"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx("div",{className:"font-medium text-slate-800",children:o.title}),o.dismissible&&o.severity!=="critical"&&e.jsx("button",{type:"button",onClick:()=>a(o),"aria-label":"Dismiss message",className:"text-slate-400 hover:text-slate-700 shrink-0",children:"✕"})]}),e.jsx("div",{className:"mt-1 text-slate-700",children:e.jsx(pa,{source:o.bodyMd})}),o.ctaLabel&&o.ctaUrl&&e.jsx("button",{type:"button",onClick:()=>n(o),className:"mt-2 text-[11px] px-2 py-1 bg-brand-500 text-white rounded hover:bg-brand-600",children:o.ctaLabel}),e.jsx("div",{className:"mt-1 text-[10px] text-slate-400",children:new Date(o.createdAt).toLocaleString()})]})]})},o.id))})]})}function ma(){const t=y(o=>o.messages),s=y(o=>o.applyMessageAck),a=t.find(o=>o.severity==="critical"&&!o.acknowledged);if(!a)return null;async function n(){s(a.id,"acknowledged"),await Fe(a.id,"acknowledged")}async function r(){a.ctaUrl&&(s(a.id,"clicked"),Fe(a.id,"clicked"),chrome.tabs.create({url:a.ctaUrl}).catch(()=>{}))}return e.jsxs("div",{role:"alert",className:`border-y ${tr.critical} px-3 py-2 text-xs flex items-start gap-2`,children:[e.jsx("span",{"aria-hidden":"true",className:"text-rose-600 text-sm leading-none mt-0.5",children:"⚠"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"font-semibold text-rose-900",children:a.title}),e.jsx("div",{className:"mt-0.5 text-rose-900/90",children:e.jsx(pa,{source:a.bodyMd})}),e.jsxs("div",{className:"mt-1.5 flex items-center gap-2",children:[a.ctaLabel&&a.ctaUrl&&e.jsx("button",{type:"button",onClick:r,className:"text-[11px] px-2 py-1 bg-rose-600 text-white rounded hover:bg-rose-700",children:a.ctaLabel}),e.jsx("button",{type:"button",onClick:n,className:"text-[11px] px-2 py-1 border border-rose-300 text-rose-800 rounded hover:bg-rose-100",children:"Acknowledge"})]})]})]})}const nr=[{slug:"matrix",label:"Dashboard"},{slug:"report",label:"Findings",hideWhenIdle:!0}];function rr(t){if(!t)return null;try{return new URL(t).hostname}catch{return t}}function ir(){var u,h;const t=y(x=>x.view),s=y(x=>x.setView),a=y(x=>x.setUserMode),n=y(x=>x.results),r=y(x=>x.status),[o,l]=m.useState(!1),i=((u=n[0])==null?void 0:u.pageUrl)??((h=n[0])==null?void 0:h.scope),d=rr(i),p=n.length>0&&r!=="running";function c(){a("owner"),ae({type:"SETTINGS_SET",key:"userMode",value:"owner"})}return e.jsxs("header",{className:"border-b border-slate-200 bg-white px-3 py-2",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"font-semibold text-sm leading-tight",children:"wcagcheckr"}),e.jsxs("p",{className:"text-[10px] text-slate-500 leading-tight font-mono",children:["v",chrome.runtime.getManifest().version]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{type:"button",onClick:()=>{chrome.storage.local.set({v2UiEnabled:!0})},title:"Switch to the new v2 UI preview (rc.276+). Toggle off via the same button in v2's settings.",className:"text-[11px] px-2 py-1 border border-emerald-400 rounded text-emerald-700 bg-white hover:bg-emerald-50 font-medium",children:"Try v2 UI"}),e.jsx("button",{type:"button",onClick:c,title:"Switch to the simplified site-owner view",className:"text-[11px] px-2 py-1 border border-slate-300 rounded text-slate-600 hover:bg-slate-50",children:"Owner mode"}),e.jsx(ha,{}),e.jsx(xs,{onClick:()=>void ae({type:"OPEN_SETTINGS"}),ariaLabel:"Open settings",children:"⚙"}),e.jsx(xs,{onClick:()=>l(!0),ariaLabel:"Send support message",children:"?"})]})]}),p&&d&&e.jsxs("div",{className:"flex items-center gap-2 mb-2 px-2 py-1 rounded bg-brand-50 border border-brand-200 text-[11px]",title:i??"",children:[e.jsx("span",{className:"text-slate-500 shrink-0",children:"Audit:"}),e.jsx("span",{className:"font-mono font-medium text-slate-800 truncate flex-1","aria-label":`Showing audit results for ${d}`,children:d}),e.jsx("button",{type:"button",onClick:()=>void yt(),className:"shrink-0 text-[11px] px-2 py-0.5 rounded border border-slate-300 bg-white text-slate-700 hover:bg-slate-50 hover:border-slate-400",title:"Clear these results so you can run a fresh audit",children:"Clear"})]}),e.jsx(or,{view:t,setView:s}),e.jsx(Me,{open:o,onClose:()=>l(!1),title:"Send support message",children:e.jsx(Kn,{onClose:()=>l(!1)})})]})}function or({view:t,setView:s}){const a=m.useRef([]),n=y(i=>i.results),r=nr.filter(i=>!i.hideWhenIdle||n.length>0);function o(i){var c;const d=(i+r.length)%r.length,p=r[d];p&&(s(p.slug),(c=a.current[d])==null||c.focus())}function l(i,d){switch(i.key){case"ArrowRight":i.preventDefault(),o(d+1);break;case"ArrowLeft":i.preventDefault(),o(d-1);break;case"Home":i.preventDefault(),o(0);break;case"End":i.preventDefault(),o(r.length-1);break}}return e.jsx("nav",{className:"flex gap-1","aria-label":"Primary navigation",role:"tablist",children:r.map((i,d)=>{const p=t===i.slug;return e.jsx("button",{ref:c=>{a.current[d]=c},role:"tab","aria-selected":p,tabIndex:p?0:-1,onClick:()=>s(i.slug),onKeyDown:c=>l(c,d),className:p?"text-xs font-medium tracking-tight px-3.5 py-1.5 rounded-md bg-slate-900 text-white shadow-sm":"text-xs font-medium tracking-tight px-3.5 py-1.5 rounded-md text-slate-600 hover:bg-slate-100 border border-transparent hover:border-slate-200",children:i.label},i.slug)})})}function lr({feature:t,upgradeUrl:s}){const[a,n]=m.useState(!1);return e.jsxs("div",{className:"p-3 bg-amber-50 border border-amber-200 rounded",children:[e.jsxs("p",{className:"text-xs text-amber-900 mb-2",children:[e.jsx("strong",{children:t})," requires a higher tier."]}),e.jsx("button",{type:"button",onClick:()=>n(!0),className:"text-xs text-brand-600 hover:underline font-medium",children:"Upgrade →"}),e.jsx(Lt,{open:a,onClose:()=>n(!1)})]})}const cr="https://wcagcheckr.com/upgrade";function dr(){const[t,s]=m.useState("single-element"),[a,n]=m.useState(!1),[r,o]=m.useState(null),[l,i]=m.useState(null),[d,p]=m.useState(Oe),[c,u]=m.useState(Oe[0].id),[h,x]=m.useState("none"),[b,w]=m.useState(null),N=y(_=>_.status),E=y(_=>_.tier),I=y(_=>_.results.length>0),C=N==="running";m.useEffect(()=>{Promise.all([Z({type:"SETTINGS_GET",key:"matrixPresets"}),Z({type:"SETTINGS_GET",key:"activePresetId"})]).then(([_,F])=>{const H=Array.isArray(_.data)?_.data:null;p(H&&H.length>0?H:Oe),typeof F.data=="string"&&u(F.data)})},[]);function f(_){const F=d.find(H=>H.id===_);F&&(u(_),ae({type:"SETTINGS_SET",key:"activePresetId",value:_}),ae({type:"SETTINGS_SET",key:"stateMatrix",value:F.matrix}))}const j=ft(E,"storybookAutoIterate");m.useEffect(()=>{const _=we("ELEMENT_PICKED_EVENT",(H,R)=>{n(!1);const M=R.frameId;q(M),o({selector:H.selector,frameId:M,speech:H.speech})}),F=we("PICKER_CANCELLED_EVENT",()=>n(!1));return()=>{_(),F()}},[]);async function g(){const _=await ue();_&&(n(!0),await be(_,{type:"PICKER_ACTIVATE_REQUEST",tabId:_}))}function v(){r&&(q(r.frameId),Ne({type:"START_AUDIT",mode:"single-element",scope:r.selector,frameId:r.frameId}),y.getState().startNewScan())}function S(){if(!j){i("storybook:auto-iterate");return}q(),Ne({type:"START_AUDIT",mode:"storybook-all"}),y.getState().startNewScan()}function k(){q(),Ne({type:"START_AUDIT",mode:"all-frames"}),y.getState().startNewScan()}function T(){q(),Ne({type:"START_AUDIT",mode:"full-page"}),y.getState().startNewScan()}function V(){q(),Ne({type:"START_AUDIT",mode:"full-page",verifyFixesOnly:!0}),y.getState().startNewScan()}function P(){q(),Ne({type:"START_AUDIT",mode:"quick-scan"}),y.getState().startNewScan()}function B(){q(),Ne({type:"START_AUDIT",mode:"parallel-scan"}),y.getState().startNewScan()}function U(){ae({type:"CANCEL_AUDIT"})}async function q(_){y.getState().setPinned(null);const F=await ue();if(F)try{await be(F,{type:"HIGHLIGHT_CLEAR_REQUEST",tabId:F},_)}catch{}}async function $(_){w(null);const F=await ue();if(!F){w("No audited tab; open a page first.");return}if(_==="none"){const R=await Z({type:"PERF_THROTTLE_CLEAR_REQUEST",tabId:F});R.ok||w(R.error??"Failed to clear throttle."),x("none");return}const H=await Z({type:"PERF_THROTTLE_APPLY_REQUEST",tabId:F,profile:_});if(!H.ok){w(H.error??"Failed to apply throttle.");return}x(_)}return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"px-3 py-2 border-b border-slate-200 bg-white space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsxs("select",{"aria-label":"Audit mode",value:t,onChange:_=>s(_.target.value),disabled:C||a,className:"text-xs border border-slate-300 rounded px-2 py-1",children:[e.jsx("option",{value:"single-element",children:"Single element"}),e.jsx("option",{value:"full-page",children:"Full page"}),e.jsx("option",{value:"quick-scan",children:"Quick scan (markup only, ~1s)"}),e.jsx("option",{value:"parallel-scan",children:"Parallel scan (experimental, ~2-4× faster)"}),e.jsx("option",{value:"all-frames",children:"All iframes"}),e.jsxs("option",{value:"storybook-all",children:["All stories (Storybook / Ladle)",j?"":" (paid)"]})]}),e.jsx("select",{"aria-label":"State-matrix preset",value:c,onChange:_=>f(_.target.value),disabled:C||a,title:"Switch the state-matrix preset used for the next audit",className:"text-xs border border-slate-300 rounded px-2 py-1",children:d.map(_=>e.jsx("option",{value:_.id,children:_.name},_.id))}),e.jsxs("select",{"aria-label":"Performance throttle",value:h,onChange:_=>void $(_.target.value),disabled:C||a,title:"Apply CDP network + CPU throttling to the audited tab. Catch contrast / focus / loading-state issues that only manifest under realistic conditions.",className:`text-xs border rounded px-2 py-1 ${h==="none"?"border-slate-300":"border-amber-400 bg-amber-50"}`,children:[e.jsx("option",{value:"none",children:"⚡ Throttle: off"}),e.jsx("option",{value:"3g-slow",children:"⚡ Slow 3G + 6× CPU"}),e.jsx("option",{value:"3g-fast",children:"⚡ Fast 3G + 4× CPU"}),e.jsx("option",{value:"4g",children:"⚡ 4G LTE + 2× CPU"}),e.jsx("option",{value:"cpu-2x",children:"⚡ CPU 2× only"}),e.jsx("option",{value:"cpu-4x",children:"⚡ CPU 4× only"})]}),t==="single-element"?e.jsx(pr,{picking:a,picked:r,isRunning:C,onPick:g,onRun:v,onClearPick:()=>o(null)}):t==="full-page"?e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:T,disabled:C,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50",children:C?"Auditing…":"Scan page"}),e.jsx("button",{onClick:V,disabled:C||!I,className:"text-xs px-3 py-1 border border-emerald-400 text-emerald-700 rounded hover:bg-emerald-50 disabled:opacity-50 disabled:cursor-not-allowed",title:I?"Re-runs the audit but skips walkthroughs that already passed or are human-acked. Faster + cheaper after a fix/ack pass.":"Run a full Scan page first. Verify-fixes mode reuses prior walkthrough verdicts + acks; without prior data there's nothing to skip.",children:C?"Auditing…":"Verify fixes (skip passed)"})]}):t==="quick-scan"?e.jsx("button",{onClick:P,disabled:C,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50",title:"One-state audit (default · light · ltr · desktop). Catches markup-level findings in ~1 second. Run a Full page audit for hover-only contrast, mobile reflow, RTL bidi.",children:C?"Auditing…":"⚡ Quick scan"}):t==="parallel-scan"?e.jsx("button",{onClick:B,disabled:C,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50",title:"Opens N hidden tabs and runs the matrix in parallel. Roughly 2-4× faster wall-clock on a typical matrix. Experimental: skips baseline diff + AI augmentation in rc.77.",children:C?"Auditing…":"⚡⚡ Parallel scan"}):t==="all-frames"?e.jsx("button",{onClick:k,disabled:C,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50",children:C?"Auditing…":"Audit all iframes"}):e.jsx("button",{onClick:S,disabled:C,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50",children:C?"Auditing…":"Audit all stories"}),C&&e.jsx("button",{onClick:U,className:"text-xs px-3 py-1 border border-slate-300 text-slate-700 rounded hover:bg-slate-100",children:"Stop"}),!C&&I&&e.jsx("button",{type:"button",onClick:()=>void yt(),className:"text-xs text-slate-500 hover:text-slate-800 hover:underline ml-auto",title:"Clear current results",children:"Clear"})]}),b&&e.jsxs("p",{className:"text-[11px] text-rose-700",role:"alert",children:["⚡ ",b]}),t==="single-element"&&r&&!a&&!C&&e.jsx(hr,{selector:r.selector,onRepick:g,onClear:()=>o(null)})]}),e.jsx(Me,{open:l!==null,onClose:()=>i(null),title:"Upgrade to continue",children:e.jsx(lr,{feature:l??"",upgradeUrl:cr})})]})}function ur({speech:t}){if(!t)return null;const s=[];if(t.name&&s.push(t.name),t.role&&!["none","presentation","generic"].includes(t.role)&&s.push(t.role),s.push(...t.states),t.group&&s.push(t.group),s.length===0)return e.jsxs("span",{className:"text-[10px] text-amber-800 bg-amber-50 border border-amber-200 rounded px-2 py-0.5",title:"A screen reader would announce nothing for this element. Either it has no accessible name + a silent role (generic/presentation), or it's hidden from AT entirely.","data-testid":"sr-speech-preview",children:["SR: ",e.jsx("em",{children:"(silent)"})]});const a=s.join(", ");return e.jsxs("span",{className:"text-[10px] text-slate-700 bg-slate-100 border border-slate-200 rounded px-2 py-0.5 max-w-[280px] truncate",title:`Predicted screen-reader announcement when this element receives focus: "${a}"`,"data-testid":"sr-speech-preview",children:["SR: ",e.jsx("strong",{children:a})]})}function pr({picking:t,picked:s,isRunning:a,onPick:n,onRun:r,onClearPick:o}){return a?e.jsx("button",{disabled:!0,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded opacity-50",children:"Auditing…"}):t?e.jsx("button",{disabled:!0,className:"text-xs px-3 py-1 bg-brand-400 text-white rounded",children:"Click an element on the page"}):s?e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("button",{onClick:r,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600",children:"Run audit"}),e.jsx(ur,{speech:s.speech})]}):e.jsx("button",{onClick:n,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600",children:"Pick element"})}function hr({selector:t,onRepick:s,onClear:a}){return e.jsxs("div",{className:"text-[11px] text-slate-600 flex items-center gap-2 flex-wrap",children:[e.jsx("span",{children:"Selected:"}),e.jsx("code",{className:"font-mono bg-slate-100 px-1.5 py-0.5 rounded text-slate-700 truncate max-w-[180px]",title:t,children:t}),e.jsx("button",{type:"button",onClick:s,className:"text-brand-600 hover:underline",children:"Re-pick"}),e.jsx("span",{"aria-hidden":"true",className:"text-slate-300",children:"·"}),e.jsx("button",{type:"button",onClick:a,className:"text-slate-500 hover:text-slate-700 hover:underline",children:"Clear"})]})}const mr={outline:"OUTLINE_HIDE_REQUEST","tab-order":"TAB_ORDER_HIDE_REQUEST","reading-order":"READING_ORDER_HIDE_REQUEST","target-size":"TARGET_SIZE_HIDE_REQUEST"},xr={outline:"OUTLINE_SHOW_REQUEST","tab-order":"TAB_ORDER_SHOW_REQUEST","reading-order":"READING_ORDER_SHOW_REQUEST","target-size":"TARGET_SIZE_SHOW_REQUEST"};function gr(){const[t,s]=m.useState(null),[a,n]=m.useState(!1),[r,o]=m.useState(null),[l,i]=m.useState("off"),p=y(x=>x.results).flatMap(x=>x.violations);async function c(x){const b=await ue();b&&(i(x),x==="off"?await be(b,{type:"VISION_SIMULATOR_CLEAR",tabId:b}).catch(()=>{}):await be(b,{type:"VISION_SIMULATOR_APPLY",tabId:b,mode:x}).catch(()=>{}))}async function u(x){const b=await ue();if(b){if(t&&await be(b,{type:mr[t],tabId:b}).catch(()=>{}),t===x){s(null);return}await be(b,{type:xr[x],tabId:b}).catch(()=>{}),s(x)}}async function h(){const x=await ue();if(x){if(a){await be(x,{type:"FIX_PREVIEW_HIDE_REQUEST",tabId:x}).catch(()=>{}),n(!1),o(null);return}if(p.length===0){o("Run an audit first.");return}try{const b=await Ee(x,{type:"FIX_PREVIEW_SHOW_REQUEST",tabId:x,violations:p});n(!0),o(`Previewing ${b.visualFixCount} visual fix${b.visualFixCount===1?"":"es"} + ${b.annotationCount} annotation${b.annotationCount===1?"":"s"}.`)}catch{o("Preview failed.")}}}return e.jsxs("div",{className:"px-3 py-2 border-b border-slate-200 bg-white flex items-center gap-2 flex-wrap",children:[e.jsx("span",{className:"text-[11px] uppercase tracking-wide text-slate-500 mr-1",title:"Page overlays — these draw information on the live page. They do NOT change what the audit detects.",children:"Visualizers"}),e.jsx(Ge,{label:"Outline",title:"Show heading + landmark structure overlay",on:t==="outline",onClick:()=>u("outline")}),e.jsx(Ge,{label:"Tab order",title:"Number focusables in tab sequence. Red = tab order doesn't follow visual layout (focus jumps around). Amber = positive tabindex reordered the DOM sequence.",on:t==="tab-order",onClick:()=>u("tab-order")}),e.jsx(Ge,{label:"Reading order",title:"Number content in DOM order (what a screen reader reads). Red = element's DOM position differs from its visual position; badge shows DOM→Visual.",on:t==="reading-order",onClick:()=>u("reading-order")}),e.jsx(Ge,{label:"Targets",title:"Show interactive-element dimensions vs WCAG 2.5.8 (24px AA) / 2.5.5 (44px AAA)",on:t==="target-size",onClick:()=>u("target-size")}),e.jsx("span",{className:"w-px h-4 bg-slate-200 mx-1","aria-hidden":"true"}),e.jsx(Ge,{label:"Preview fixes ✨",title:"Apply contrast/target-size/focus-ring fixes to the live page + annotate where labels and alt text are missing. Toggle off to revert.",on:a,onClick:h}),e.jsx("span",{className:"w-px h-4 bg-slate-200 mx-1","aria-hidden":"true"}),e.jsxs("label",{className:"text-[11px] text-slate-700 flex items-center gap-1.5",children:[e.jsx("span",{title:"Apply a CSS filter that simulates how the page looks for users with color-vision or low-vision impairments. Visual only — does NOT change what the audit detects.",children:"Vision sim:"}),e.jsxs("select",{"aria-label":"Vision-impairment simulator",value:l,onChange:x=>void c(x.target.value),className:`text-xs border rounded px-1.5 py-0.5 ${l==="off"?"border-slate-300 bg-white text-slate-700":"border-brand-500 bg-brand-50 text-brand-700 font-medium"}`,children:[e.jsx("option",{value:"off",children:"Off"}),e.jsxs("optgroup",{label:"Color blindness",children:[e.jsx("option",{value:"deuteranomaly",children:"Deuteranomaly (green-weak — most common)"}),e.jsx("option",{value:"deuteranopia",children:"Deuteranopia (green-blind)"}),e.jsx("option",{value:"protanomaly",children:"Protanomaly (red-weak)"}),e.jsx("option",{value:"protanopia",children:"Protanopia (red-blind)"}),e.jsx("option",{value:"tritanomaly",children:"Tritanomaly (blue-weak)"}),e.jsx("option",{value:"tritanopia",children:"Tritanopia (blue-blind)"}),e.jsx("option",{value:"achromatomaly",children:"Achromatomaly (partial color blindness)"}),e.jsx("option",{value:"achromatopsia",children:"Achromatopsia (no color)"})]}),e.jsxs("optgroup",{label:"Low vision",children:[e.jsx("option",{value:"cataract",children:"Cataract (blur)"}),e.jsx("option",{value:"low-contrast",children:"Low contrast sensitivity"}),e.jsx("option",{value:"glaucoma",children:"Glaucoma (tunnel vision)"}),e.jsx("option",{value:"macular",children:"Macular degeneration (central loss)"})]})]})]}),r&&e.jsx("span",{className:"text-[11px] text-slate-500 basis-full",children:r})]})}function Ge({label:t,title:s,on:a,onClick:n}){return e.jsx("button",{type:"button",title:s,"aria-pressed":a,onClick:n,className:`text-xs px-2 py-1 rounded border transition-colors ${a?"bg-brand-500 text-white border-brand-500 hover:bg-brand-600":"bg-white text-slate-700 border-slate-300 hover:bg-slate-50"}`,children:t})}function fr(t){if(!t)return"";const s=[t.pseudoState];return t.theme!=="light"&&s.push(t.theme),t.direction!=="ltr"&&s.push(t.direction),s.join(" · ")}function br(){const t=y(d=>d.status),s=y(d=>d.progress),a=y(d=>d.aiProgress);if(t!=="running"||!s)return null;const n=s.current>=s.total,r=n?"Running deep analyzers…":`Auditing… ${s.current}/${s.total}`,o=n?"reading order · tab order · typography · CSS vars · AI candidates":fr(s.currentState),l=n?100:s.current/s.total*100,i=a!=null;return e.jsxs("div",{className:"px-3 py-2 bg-slate-100 border-b border-slate-200 space-y-2",children:[e.jsx(fs,{label:r,detail:o,pct:l,valuenow:Math.min(s.current,s.total),valuemax:s.total,ariaLabel:n?"Running deep analyzers: reading order, tab order, typography, custom properties, AI candidates.":`Audit progress: ${s.current} of ${s.total} states`,barClass:"bg-slate-200",fillClass:"bg-brand-500"}),i&&e.jsx(fs,{label:`AI augmentation… ${a.current}/${a.total}`,detail:a.candidatesTotal&&a.candidatesTotal>0?`${a.currentCheckLabel} (${a.candidatesDone??0}/${a.candidatesTotal})`:a.currentCheckLabel,pct:a.current/a.total*100,valuenow:a.current,valuemax:a.total,ariaLabel:`AI augmentation: ${a.current} of ${a.total} checks. ${a.currentCheckLabel}`,barClass:"bg-violet-100",fillClass:"bg-violet-500"})]})}function fs({label:t,detail:s,pct:a,valuenow:n,valuemax:r,ariaLabel:o,barClass:l,fillClass:i}){return e.jsxs("div",{children:[e.jsxs("div",{className:"flex justify-between items-center gap-2 text-xs text-slate-600 mb-1",children:[e.jsx("span",{className:"shrink-0",children:t}),e.jsx("span",{className:"text-slate-500 truncate flex-1 text-right",children:s})]}),e.jsx("div",{className:`h-1 rounded-full overflow-hidden ${l}`,role:"progressbar","aria-valuenow":n,"aria-valuemin":0,"aria-valuemax":r,"aria-label":o,children:e.jsx("div",{className:`h-full transition-all ${i}`,style:{width:`${a}%`}})})]})}function vr(){const t=new Set;for(const s of De)for(const a of s.axeRules)t.add(a);return t}function xa(t,s,a,n){const r=new Set;for(const o of t)a.has(o.matchKey)||n.has(`violation::${o.matchKey}`)||r.add(`${o.ruleId}::${o.target.selector}`);for(const o of s)o.verdict==="fail"&&r.add(`${o.ruleId}::${o.selector}`);return r.size}function yr(t,s,a,n){const r=new Set;for(const o of t)a.has(o.matchKey)||n.has(`violation::${o.matchKey}`)||o.wcagCriterion&&r.add(o.wcagCriterion);for(const o of s)o.verdict==="fail"&&o.wcagCriterion&&r.add(o.wcagCriterion);return Array.from(r).sort()}function wr(t,s,a={}){const n=vr(),o=(a.excludeAckedMatchKeys?t.filter(c=>!a.excludeAckedMatchKeys.has(c.matchKey)):t).filter(c=>!n.has(c.ruleId)),l=Zs(o),i={critical:0,serious:0,moderate:0,minor:0};for(const c of l)i[c.impact]++;const d=new Set(l.map(c=>Ue(c.ruleId,c.target.selector)));for(const c of s){if(c.verdict!=="fail"||n.has(c.ruleId))continue;const u=Ue(c.ruleId,c.selector);d.has(u)||(d.add(u),i.serious++)}return{total:i.critical+i.serious+i.moderate+i.minor,counts:i,representatives:l}}function bs(t,s){var n;const a=new Set;for(const r of s)for(const o of((n=r.axeRulesEvaluated)==null?void 0:n.incomplete)??[])for(const l of o.elements??[])a.add(`${o.ruleId}::${l.selector}`);return t.filter(r=>r.verdict==="fail"&&a.has(`${r.ruleId}::${r.selector}`))}function es(t){var o,l;const s=((o=t[0])==null?void 0:o.pageUrl)??((l=t[0])==null?void 0:l.scope)??"",a=y(i=>i.setResolutionsForUrl),[n,r]=m.useState(()=>{if(!s)return[];const i=y.getState().resolutionsByUrl[s];return i?bs(i,t):[]});return m.useEffect(()=>{if(!s){r([]);return}let i=!1;return qe(s).then(d=>{i||(a(s,d),r(bs(d,t)))}),()=>{i=!0}},[s,t,a]),n}const jr=[{slug:"delta",label:"Delta",blurb:"Compare against the last baseline; export the prompt",marker:"Δ"},{slug:"guided",label:"Guided",blurb:"Step through manual IGT workflows",marker:"G"},{slug:"compliance",label:"Compliance",blurb:"WCAG-EM report builder + sign-and-seal",marker:"§"},{slug:"scorecard",label:"Components",blurb:"Every tracked component baseline at a glance",marker:"◍"},{slug:"forensic",label:"Forensic",blurb:"Audit history + RFC 3161 timestamps",marker:"⧉"},{slug:"schedules",label:"Schedules",blurb:"Recurring audits + alerts",marker:"⟳"},{slug:"risk",label:"Risk",blurb:"Posture summary across scheduled audits",marker:"⌖"},{slug:"crawl",label:"Site crawl",blurb:"Audit a multi-page site",marker:"↺"},{slug:"flows",label:"Flows",blurb:"Record + replay user-action sequences",marker:"▷"},{slug:"copilot",label:"Co-pilot",blurb:"Chat with AI grounded on the current audit",marker:"✦"},{slug:"ax-tree",label:"AX tree",blurb:"Browser's accessibility-tree viewer",marker:"⌥"},{slug:"tokens",label:"Design tokens",blurb:"CSS custom-properties usage map",marker:"#"}];function Nr(){const t=y(n=>n.results),s=y(n=>n.status),a=y(n=>n.setView);return e.jsxs("div",{className:"p-3 space-y-4",children:[e.jsx(kr,{results:t,status:s,setView:a}),e.jsx(Sr,{setView:a})]})}function kr({results:t,status:s,setView:a}){var x,b;if(s==="running")return e.jsxs("section",{className:"border border-slate-200 rounded-lg bg-white px-4 py-3",children:[e.jsx("p",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500",children:"audit in progress"}),e.jsxs("p",{className:"text-sm font-medium text-slate-900 mt-1",children:["The matrix is iterating. Progress is shown above; results land in ",e.jsx("strong",{children:"Findings"})," when done."]})]});if(t.length===0)return e.jsxs("section",{className:"border border-dashed border-slate-300 rounded-lg bg-slate-50 px-4 py-5 text-center",children:[e.jsx("p",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500",children:"no audit yet"}),e.jsx("p",{className:"text-sm font-medium text-slate-900 mt-1",children:"Pick an audit mode above and run a scan."}),e.jsx("p",{className:"text-xs text-slate-500 mt-1.5 max-w-md mx-auto",children:"Or jump into a specialized tool below — site crawl, multi-page schedules, IGT workflows, the AI co-pilot, the forensic log."})]});const n=t.flatMap(w=>w.violations),r=Zs(n),o=((x=t[0])==null?void 0:x.pageUrl)??((b=t[0])==null?void 0:b.scope)??"audited page",l=t.length,i=es(t),d=y(w=>w.acknowledgedKeys),p=y(w=>w.dismissedKeys),c=xa(n,i,d,p),u=3,h=c>0&&c<=u?r.slice(0,u):[];return e.jsxs("section",{className:"border border-slate-200 rounded-lg bg-white overflow-hidden",children:[e.jsxs("div",{className:"px-3.5 py-3 flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("p",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500 truncate",children:["last audit · ",l," state",l===1?"":"s"]}),e.jsx("p",{className:"text-sm font-medium text-slate-900 truncate mt-0.5",title:o,children:c===0?"No issues found by automation":`Fix ${c} element${c===1?"":"s"}`})]}),e.jsx("button",{type:"button",onClick:()=>a("report"),className:"shrink-0 text-xs font-medium px-3.5 py-1.5 bg-slate-900 text-white rounded-md hover:bg-slate-800",children:"View findings →"})]}),h.length>0&&e.jsx("ul",{className:"border-t border-slate-200 divide-y divide-slate-100","aria-label":"Violations inline list",children:h.map(w=>{var I;const N=((I=w.target)==null?void 0:I.selector)??"(no selector)",E=N.length>50?N.slice(0,47)+"…":N;return e.jsx("li",{className:"px-3.5 py-2",children:e.jsxs("button",{type:"button",onClick:()=>a("report"),className:"w-full text-left flex items-center gap-2 hover:bg-slate-50 -mx-3.5 -my-2 px-3.5 py-2 transition-colors",title:`${w.description??w.ruleId} — ${N}`,children:[e.jsx("span",{className:`shrink-0 text-[9px] uppercase tracking-wider font-bold px-1.5 py-0.5 rounded ${w.impact==="critical"?"bg-rose-200 text-rose-900":w.impact==="serious"?"bg-orange-200 text-orange-900":w.impact==="moderate"?"bg-amber-200 text-amber-900":"bg-slate-200 text-slate-700"}`,children:w.impact}),e.jsx("span",{className:"text-[11px] font-mono text-slate-900 shrink-0",children:w.ruleId}),e.jsx("code",{className:"text-[10px] text-slate-500 truncate",children:E})]})},`${w.ruleId}::${N}`)})})]})}function Sr({setView:t}){return e.jsxs("section",{className:"space-y-2",children:[e.jsx("h2",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500 px-0.5",children:"tools"}),e.jsx("div",{className:"grid grid-cols-2 gap-2",children:jr.map(s=>e.jsxs("button",{type:"button",onClick:()=>t(s.slug),className:"text-left rounded-lg border border-slate-200 bg-white hover:bg-slate-50 hover:border-slate-300 transition-colors px-3 py-2.5 flex flex-col gap-0.5 focus:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-1",children:[e.jsxs("span",{className:"font-mono text-[10px] uppercase tracking-widest text-slate-400",children:[e.jsx("span",{className:"text-slate-700 mr-1.5",children:s.marker}),s.slug]}),e.jsx("span",{className:"text-sm font-semibold text-slate-900 leading-tight mt-0.5",children:s.label}),e.jsx("span",{className:"text-[11px] text-slate-500 leading-snug",children:s.blurb})]},s.slug))})]})}const Ar={A:"bg-emerald-500",B:"bg-lime-500",C:"bg-yellow-500",D:"bg-orange-500",F:"bg-rose-600"},Cr={A:"bg-emerald-500 text-white",B:"bg-lime-500 text-white",C:"bg-yellow-500 text-slate-900",D:"bg-orange-500 text-white",F:"bg-rose-600 text-white"};function Ir({violations:t,componentId:s,hideOverallHeader:a=!1}){var pe,L,X,z,Y,he,de,xe;const[n,r]=m.useState([]),[o,l]=m.useState({}),[i,d]=m.useState([]),[p,c]=m.useState([]),[u,h]=m.useState(new Set),[x,b]=m.useState(null),[w,N]=m.useState({}),[E,I]=m.useState(new Set),[C,f]=m.useState(null),j=y(O=>O.status),g=y(O=>O.progress),v=y(O=>O.freshThisSession),S=y(O=>O.results),k=(pe=S[0])==null?void 0:pe.startedAt,T=((L=S[0])==null?void 0:L.pageUrl)??((X=S[0])==null?void 0:X.scope)??null;m.useEffect(()=>{if(!s){r([]),l({});return}let O=!1;return chrome.storage.local.get("igtRuns").then(ee=>{if(O)return;const se=((ee==null?void 0:ee.igtRuns)??{})[s]??{};r(Object.values(se))}),Promise.all([Ie(s),Le([s])]).then(([ee,me])=>{if(O)return;const se=new Set(me.map(J=>J.criterionId)),Q={},ve=[];for(const J of ee){const re=se.has(J.criterionId)?"pass":J.verdict;J.criterionId==="2.4.3"?Q.focusOrder=re:J.criterionId==="2.1.2"?Q.keyboardTrap=re:J.criterionId==="2.4.7"?Q.focusVisible=re:J.criterionId==="1.3.2"?Q.readingOrder=re:J.criterionId==="1.4.11"&&(Q.nonTextContrast=re),ve.push({criterionId:J.criterionId,ruleId:`ai-walkthrough-${J.criterionId}`,pageUrl:J.pageUrl,verdict:re,reasoning:se.has(J.criterionId)?`Human verified: ${J.reasoning}`:J.reasoning})}l(Q),d(ve)}),()=>{O=!0}},[s]),m.useEffect(()=>{if(!T){c([]);return}let O=!1;return qe(T).then(ee=>{O||c(ee)}),()=>{O=!0}},[T,S]);const V=es(S);if(j==="running")return e.jsx(_r,{current:g==null?void 0:g.current,total:g==null?void 0:g.total});const P=Ht({violations:t,auditRan:S.length>0,manualRuns:n,workflows:fe,heuristicCounts:{tabOrder:((Y=(z=S[0])==null?void 0:z.tabOrderIssues)==null?void 0:Y.length)??0,readingOrder:((de=(he=S[0])==null?void 0:he.readingOrderIssues)==null?void 0:de.length)??0},interactiveAuditVerdicts:o,aiResolvedFails:V.map(O=>({ruleId:O.ruleId,impact:"serious",selector:O.selector}))}),B=y(O=>O.acknowledgedKeys),q=new Set(S.map(O=>O.pageUrl??O.scope??"").filter(Boolean)).size>1?"site-crawl":"single-page",$=S.length>0?ea(S,{runs:n,workflows:fe},"2.1","AA",B,p,i,q):void 0,_=S.length>0?za(Kt({audits:S,igtRuns:n,workflows:fe,acknowledgedMatchKeys:B,incompleteResolutions:p,interactiveAuditResults:i,auditScope:q}),fe):void 0,F=P.overallLetter,R=($?$.failingCriteria.length+$.inconclusiveCriteria.length+$.untestedCriteria.length:0)===0&&!!$;async function M(O){var ve;if(!T||!((ve=$==null?void 0:$.inconclusiveReasons)!=null&&ve[O]))return;const me=$.inconclusiveReasons[O].filter(J=>J.source==="axe-incomplete"&&J.elements&&J.elements.length>0);if(me.length===0)return;h(J=>new Set(J).add(O)),b(null);const se=[];let Q=0;try{for(const re of me){const je=await ae({type:"AI_RESOLVE_INCOMPLETE_REQUEST",ruleId:re.ruleOrStepId,pageUrl:re.pageUrl??T,wcagCriterion:O,elements:re.elements??[],targetLevel:"AA"});if(je!=null&&je.unavailableReason){b(je.unavailableReason);break}je!=null&&je.resolutions&&(se.push(...je.resolutions),Q+=je.totalCostUsd??0)}if(T){const re=await qe(T);c(re)}const J={total:se.length,pass:se.filter(re=>re.verdict==="pass").length,fail:se.filter(re=>re.verdict==="fail").length,uncertain:se.filter(re=>re.verdict==="uncertain").length,costUsd:Q,resolutions:se};N(re=>({...re,[O]:J}))}finally{h(J=>{const re=new Set(J);return re.delete(O),re})}}function ie(O){I(ee=>{const me=new Set(ee);return me.has(O)?me.delete(O):me.add(O),me})}const A=((xe=S[0])==null?void 0:xe.startedAt)??null,G=s&&A?`${s}::${A}`:null;m.useEffect(()=>{if(!G||!$||C===G||j!=="complete")return;const O=$.inconclusiveCriteria.filter(ee=>{var se;return(((se=$.inconclusiveReasons)==null?void 0:se[ee])??[]).some(Q=>Q.source==="axe-incomplete"&&Q.elements&&Q.elements.length>0)});if(O.length===0){f(G);return}f(G),(async()=>{for(const ee of O)try{await M(ee)}catch{}})()},[G,$,j]);async function W(O){var je,os;if(!T)return;const ee=((je=$==null?void 0:$.inconclusiveReasons)==null?void 0:je[O])??[],me=((os=$==null?void 0:$.failingReasons)==null?void 0:os[O])??[],se=[],Q=new Set;for(const ce of ee){if(ce.source!=="axe-incomplete"||!ce.elements)continue;const Se=ce.pageUrl??T;for(const Ae of ce.elements){const Pe=`${Se}::${ce.ruleOrStepId}::${Ae.selector}`;Q.has(Pe)||(Q.add(Pe),se.push({ruleId:ce.ruleOrStepId,pageUrl:Se,selector:Ae.selector}))}}for(const ce of me){if(ce.source!=="ai"||!ce.selector)continue;const Se=ce.ruleOrStepId.startsWith("ai-resolved::")?ce.ruleOrStepId.slice(13):ce.ruleOrStepId,Ae=ce.pageUrl??T,Pe=`${Ae}::${Se}::${ce.selector}`;Q.has(Pe)||(Q.add(Pe),se.push({ruleId:Se,pageUrl:Ae,selector:ce.selector}))}if(se.length===0)return;const ve=new Date().toISOString(),J=[];for(const ce of se){const Se=p.find(Ae=>Ae.pageUrl===ce.pageUrl&&Ae.ruleId===ce.ruleId&&Ae.selector===ce.selector);Se&&Se.verdict==="pass"&&Se.reasoning.startsWith("Marked as visually verified")||J.push({pageUrl:ce.pageUrl,ruleId:ce.ruleId,selector:ce.selector,verdict:"pass",reasoning:`Marked as visually verified by user on ${ve.slice(0,10)}.`,resolvedAt:ve,costUsd:0,wcagCriterion:O})}if(J.length===0)return;await qa(J);const re=await qe(T);c(re),N(ce=>({...ce,[O]:{total:J.length,pass:J.length,fail:0,uncertain:0,costUsd:0,resolutions:J}}))}const K=(()=>{if(!$)return null;if(R)return{kind:"conformant",text:`WCAG ${$.targetLevel} Status: Conformant`,detail:"All applicable criteria pass automated + AI checks."};const O=$.inconclusiveCriteria.length,ee=$.failingCriteria.length,me=$.untestedCriteria.length,se=[];if(ee>0){const ve=$.failingCriteria.slice(0,4).join(", ")+(ee>4?`, +${ee-4}`:"");se.push(`${ee} ${ee===1?"criterion":"criteria"} failing (${ve})`)}if(O>0){const ve=$.inconclusiveCriteria.slice(0,4).join(", ")+(O>4?`, +${O-4}`:"");se.push(`${O} inconclusive (${ve})`)}if(me>0){const ve=$.untestedCriteria.slice(0,4).join(", ")+(me>4?`, +${me-4}`:"");se.push(`${me} untested (${ve})`)}const Q=ee>0?"Fix the failing items OR Mark visually verified if AI was wrong about them.":me>0?"Mark untested via Guided Tests, OR confirm the tool gap (no axe rule + no AI walkthrough + no IGT step).":"Resolve axe-incomplete + IGT-skip items to claim conformance.";return{kind:"not-conformant",text:`WCAG ${$.targetLevel} Status: Not conformant`,detail:`${se.join(" · ")}. ${Q}`}})();let oe=0;for(const O of fe){const ee=n.find(se=>se.workflowId===O.id);if(!ee)continue;O.steps.every(se=>{const Q=ee.steps[se.id];return(Q==null?void 0:Q.status)==="pass"||(Q==null?void 0:Q.status)==="fail"||(Q==null?void 0:Q.status)==="skip"||(Q==null?void 0:Q.status)==="not-applicable"})&&oe++}const ne=new Set;for(const O of t)B.has(O.matchKey)||ne.add(`${O.ruleId}::${O.target.selector}`);for(const O of V)O.verdict==="fail"&&ne.add(`${O.ruleId}::${O.selector}`);const le=ne.size;return e.jsxs("div",{className:"border border-slate-200 rounded-lg bg-white overflow-hidden",children:[!v&&k&&e.jsx(Dr,{scannedAt:k}),!a&&e.jsxs("div",{className:"flex",children:[e.jsx("div",{className:`flex items-center justify-center w-24 ${Ar[F]} text-white shrink-0`,children:e.jsx("span",{className:"text-5xl font-bold leading-none",children:F})}),e.jsxs("div",{className:"flex-1 p-3 space-y-1",children:[e.jsx("p",{className:"text-xs font-semibold text-slate-900",children:"Overall grade"}),e.jsxs("p",{className:"text-[11px] text-slate-600 leading-snug",children:["Mean of ",P.subGrades.length," verification areas below. Untested areas count as F until verified."]}),K&&e.jsxs("div",{className:`text-[11px] leading-snug mt-1 rounded px-2 py-1 border ${K.kind==="conformant"?"bg-emerald-50 border-emerald-200 text-emerald-900":"bg-amber-50 border-amber-200 text-amber-900"}`,children:[e.jsxs("p",{className:"font-medium",children:[K.kind==="conformant"?"✓ ":"✗ ",K.text]}),e.jsx("p",{className:"mt-0.5",children:K.detail})]})]})]}),a&&K&&e.jsxs("div",{className:`text-[11px] leading-snug px-3 py-2 border-b ${K.kind==="conformant"?"bg-emerald-50 border-emerald-200 text-emerald-900":"bg-amber-50 border-amber-200 text-amber-900"}`,children:[e.jsxs("p",{className:"font-medium",children:[K.kind==="conformant"?"✓ ":"✗ ",K.text]}),e.jsx("p",{className:"mt-0.5",children:K.detail})]}),P.isLawsuitRisk&&e.jsx(Tr,{areas:P.warningAreas}),e.jsx($r,{grades:P.subGrades,uncategorized:wr(t,p,{excludeAckedMatchKeys:B})}),$&&e.jsx(Er,{coverage:$,onResolveWithAi:M,onMarkVisuallyVerified:W,resolving:u,resolveError:x,lastResolveResult:w,expandedResultFor:E,onToggleResultDetail:ie,violations:t}),_&&e.jsx(Rr,{layers:_}),e.jsx(Lr,{violationsRemaining:le,manualCompleted:oe,manualTotal:fe.length}),oe>0||S.length>0?e.jsxs("div",{className:"border-t border-slate-200 px-3 py-2 bg-slate-50",children:[e.jsx("p",{className:"text-[11px] uppercase tracking-wide text-slate-500 mb-1.5",children:"Manual coverage (Guided Tests)"}),e.jsxs("div",{className:"text-[11px] text-slate-700 mb-1.5",children:[e.jsx("strong",{children:oe})," of ",e.jsx("strong",{children:fe.length})," workflows complete"]}),e.jsx("div",{className:"flex h-1 bg-slate-200 rounded-full overflow-hidden",children:e.jsx("div",{className:"bg-emerald-500",style:{width:`${oe/fe.length*100}%`}})})]}):null]})}function Er({coverage:t,onResolveWithAi:s,onMarkVisuallyVerified:a,resolving:n,resolveError:r,lastResolveResult:o,expandedResultFor:l,onToggleResultDetail:i,violations:d}){const p=y(C=>C.setView),c=y(C=>C.setFindingsLens),u=y(C=>C.setPendingAreaExpand);function h(C){const f=Qa(C,d);p("report"),f?(c("per-area"),u(f)):c("violations")}const x=t.untestedCriteria.length+t.inconclusiveCriteria.length,[b,w]=m.useState(x>0&&x<=3),N=t.totalApplicable===0?0:Math.round(t.evaluated/t.totalApplicable*100),E=t.canClaimConformance,I=[];return t.failingCriteria.length>0&&I.push({kind:"failing",ids:t.failingCriteria}),t.inconclusiveCriteria.length>0&&I.push({kind:"inconclusive",ids:t.inconclusiveCriteria}),t.untestedCriteria.length>0&&I.push({kind:"untested",ids:t.untestedCriteria}),e.jsxs("div",{className:`border-t ${E?"border-emerald-200 bg-emerald-50":"border-amber-200 bg-amber-50"} px-3 py-2 text-[11px] leading-snug`,children:[e.jsxs("div",{className:`flex items-center justify-between gap-2 ${E?"text-emerald-900":"text-amber-900"}`,children:[e.jsxs("div",{children:[e.jsxs("span",{className:"font-semibold",children:["WCAG ",t.targetVersion," ",t.targetLevel," coverage:"," ",t.evaluated," of ",t.totalApplicable," criteria evaluated (",N,"%)"]}),E&&e.jsxs("p",{className:"text-[11px] mt-0.5",children:["Every applicable criterion has been evaluated and either passes or is N/A. This audit can be presented as a conformance-claim for ",t.targetVersion," ",t.targetLevel," for the audited URL(s)."]}),!E&&(()=>{const C=[];t.failingCriteria.length>0&&C.push("failing"),t.inconclusiveCriteria.length>0&&C.push("inconclusive"),t.untestedCriteria.length>0&&C.push("untested");const f=C.length===0?"unresolved":C.length===1?C[0]:C.length===2?`${C[0]} or ${C[1]}`:`${C.slice(0,-1).join(", ")}, or ${C[C.length-1]}`;return e.jsxs("p",{className:"text-[11px] mt-0.5 font-semibold",children:["Cannot claim ",t.targetLevel," conformance — applicable criteria remain ",f,"."]})})(),!E&&t.untestedCriteria.length>0&&e.jsxs("p",{className:"text-[11px] mt-0.5",children:[e.jsxs("strong",{children:[t.untestedCriteria.length," untested"]})," ",t.untestedCriteria.length===1?"criterion":"criteria"," — mark Pass / Fail / N/A in Guided Tests below."]}),!E&&t.inconclusiveCriteria.length>0&&e.jsxs("p",{className:"text-[11px] mt-0.5",children:[e.jsxs("strong",{children:[t.inconclusiveCriteria.length," inconclusive"]})," ",t.inconclusiveCriteria.length===1?"criterion":"criteria"," — axe couldn't fully determine OR an IGT step was skipped. Resolve before claiming conformance."]})]}),!E&&I.length>0&&e.jsx("button",{type:"button",onClick:()=>w(C=>!C),className:"text-[11px] underline shrink-0 self-start",children:b?"hide":"show list"})]}),b&&!E&&e.jsxs("div",{className:"mt-1.5 space-y-1.5",children:[I.map(C=>e.jsxs("div",{children:[e.jsxs("div",{className:`text-[10.5px] font-semibold uppercase tracking-wide ${C.kind==="failing"?"text-rose-900":"text-amber-900"}`,children:[C.kind==="untested"?"Untested":C.kind==="inconclusive"?"Inconclusive":"Failing"," (",C.ids.length,")"]}),e.jsx("ul",{className:"text-[10.5px] text-amber-900 space-y-1",children:C.ids.map(f=>{var P,B;const j=C.kind==="inconclusive"?(P=t.inconclusiveReasons)==null?void 0:P[f]:void 0,g=C.kind==="failing"?(B=t.failingReasons)==null?void 0:B[f]:void 0,v=j==null?void 0:j.some(U=>U.source==="axe-incomplete"&&U.elements&&U.elements.length>0),S=g==null?void 0:g.some(U=>U.source==="ai"),k=(n==null?void 0:n.has(f))??!1,T=o==null?void 0:o[f],V=(l==null?void 0:l.has(f))??!1;return e.jsxs("li",{className:"leading-snug",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 flex-wrap",children:[e.jsxs("button",{type:"button",onClick:()=>h(f),className:"font-mono text-[11px] text-left underline-offset-2 hover:underline text-brand-700 hover:text-brand-800 cursor-pointer",title:`Jump to the verification area covering ${f}`,children:["· ",f]}),(C.kind==="inconclusive"&&v||C.kind==="failing"&&S)&&(s||a)&&e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[C.kind==="inconclusive"&&s&&f!=="1.4.3"&&f!=="1.4.6"&&e.jsx("button",{type:"button",disabled:k,onClick:()=>s(f),className:"text-[11px] font-semibold px-2 py-1 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50 shadow-sm",title:"Ask AI to determine pass/fail for the specific elements axe couldn't sample.",children:k?"Resolving…":T?"✨ Resolve again →":"✨ Resolve with AI →"}),C.kind==="inconclusive"&&(f==="1.4.3"||f==="1.4.6")&&e.jsx("span",{className:"text-[10px] text-slate-500 italic",title:"The pixel-contrast sampler runs automatically and produces the authoritative verdict for color-contrast. Mark visually verified if the AI was wrong about a specific element.",children:"Pixel sampler ran automatically — use Mark visually verified if needed"}),a&&e.jsx("button",{type:"button",disabled:k,onClick:()=>a(f),className:"text-[11px] font-semibold px-2 py-1 bg-white text-emerald-700 border border-emerald-500 rounded hover:bg-emerald-50 disabled:opacity-50",title:C.kind==="failing"?"Override AI's fail determination — your human visual judgment is the highest authority per WCAG-EM.":"Mark all unresolved elements as visually verified by you. Same semantic weight as Acknowledge on a violation — closes the loop for items only a human can judge (text over images, gradients, etc.).",children:"✓ Mark visually verified"})]})]}),T&&e.jsxs("div",{className:"ml-3 mt-1 p-1.5 bg-white/60 border border-amber-200 rounded text-[10.5px]",children:[e.jsxs("div",{className:"font-semibold text-amber-900 flex items-center gap-2 flex-wrap",children:["AI returned ",T.total," ",T.total===1?"verdict":"verdicts",":",T.pass>0&&e.jsxs("span",{className:"text-emerald-700",children:["✓ ",T.pass," pass"]}),T.fail>0&&e.jsxs("span",{className:"text-rose-700",children:["✗ ",T.fail," fail"]}),T.uncertain>0&&e.jsxs("span",{className:"text-amber-700",children:["? ",T.uncertain," uncertain"]}),e.jsxs("span",{className:"text-slate-500 font-normal",children:["· $",T.costUsd.toFixed(4)]}),i&&e.jsx("button",{type:"button",onClick:()=>i(f),className:"ml-auto text-[10px] underline text-brand-700",children:V?"hide reasoning":"show reasoning"})]}),T.uncertain>0&&e.jsxs("p",{className:"mt-0.5 text-[10px] text-amber-800",children:["AI couldn't determine ",T.uncertain," ",T.uncertain===1?"element":"elements"," ","(typically text over images/gradients — needs visual review). These keep the criterion inconclusive."]}),T.pass===T.total&&T.total>0&&e.jsxs("p",{className:"mt-0.5 text-[10px] text-emerald-800",children:["All elements passed contrast — criterion above will flip to"," ",e.jsx("strong",{children:"pass"})," on next render."]}),V&&e.jsx("ul",{className:"mt-1.5 space-y-1 max-h-40 overflow-y-auto",children:T.resolutions.map((U,q)=>e.jsxs("li",{className:"text-[10px] leading-snug",children:[e.jsx("span",{className:U.verdict==="pass"?"text-emerald-700 font-semibold":U.verdict==="fail"?"text-rose-700 font-semibold":"text-amber-700 font-semibold",children:U.verdict==="pass"?"✓":U.verdict==="fail"?"✗":"?"})," ",e.jsx("code",{className:"font-mono bg-slate-100 px-1 rounded",children:U.selector}),e.jsx("div",{className:"ml-4 text-slate-600",children:U.reasoning})]},q))})]}),g&&g.length>0&&e.jsx("ul",{className:"ml-3 mt-0.5 space-y-0.5",children:g.map((U,q)=>e.jsxs("li",{className:"text-[10px] text-rose-800",children:[U.source==="ai"&&e.jsxs(e.Fragment,{children:["AI verdict ",e.jsx("code",{className:"font-mono",children:U.ruleOrStepId.replace(/^ai-resolved::/,"")})," fail — "]}),U.source==="axe"&&e.jsxs(e.Fragment,{children:["axe rule ",e.jsx("code",{className:"font-mono",children:U.ruleOrStepId})," fail — "]}),U.source==="igt"&&e.jsxs(e.Fragment,{children:["Guided Test ",e.jsx("code",{className:"font-mono",children:U.ruleOrStepId})," fail — "]}),U.selector&&e.jsx("code",{className:"font-mono bg-rose-100 px-1 rounded mr-1",children:U.selector}),U.notes&&e.jsx("span",{className:"text-rose-700",children:U.notes})]},q))}),j&&j.length>0?e.jsx("ul",{className:"ml-3 mt-0.5 space-y-0.5",children:j.map((U,q)=>e.jsxs("li",{className:"text-[10px] text-amber-800",children:[U.source==="axe-incomplete"&&e.jsxs(e.Fragment,{children:["axe rule ",e.jsx("code",{className:"font-mono",children:U.ruleOrStepId})," — "]}),U.source==="igt-skip"&&e.jsxs(e.Fragment,{children:["Guided Test step ",e.jsx("code",{className:"font-mono",children:U.ruleOrStepId})," skipped — "]}),U.source==="ai-uncertain"&&e.jsxs(e.Fragment,{children:["AI rule ",e.jsx("code",{className:"font-mono",children:U.ruleOrStepId})," — "]}),U.resolutionHint,U.elements&&U.elements.length>0&&e.jsxs("span",{className:"block ml-1 mt-0.5 text-[10px] text-amber-700",children:["on ",U.elements.length===1?"element":`${U.elements.length} elements`,":"," ",U.elements.slice(0,3).map(($,_,F)=>e.jsxs("span",{children:[e.jsx("code",{className:"font-mono bg-amber-100 px-1 rounded",children:$.selector}),_<F.length-1&&e.jsx("span",{className:"text-amber-600",children:", "})]},_)),U.elements.length>3&&e.jsxs("span",{className:"text-amber-600",children:[", +",U.elements.length-3," more"]})]})]},q))}):C.kind==="inconclusive"&&e.jsx("p",{className:"ml-3 mt-0.5 text-[10px] text-amber-800 italic",children:"Re-run the audit to see the specific axe rule or Guided Test step responsible. (Cached data from a pre-rc.53 build doesn't carry the reason metadata.)"})]},f)})})]},C.kind)),r&&e.jsx("p",{className:"text-[10px] text-rose-700 bg-rose-50 border border-rose-200 rounded px-1.5 py-1 mt-1",children:r})]})]})}const vs={automation:{label:"Automation",hint:"axe-core rules — runs on every scan."},ai:{label:"AI judgment",hint:"wcagcheckr AI analyzers (alt-text, contrast, vision)."},human:{label:"Human verification",hint:"Independent Guided Tests — manual checks."}};function Rr({layers:t}){const s=y(o=>o.setView),a=y(o=>o.setFindingsLens);function n(){s("report"),a("violations")}const r=["automation","ai","human"];return e.jsxs("div",{className:"border-t border-slate-200 px-3 py-2",children:[e.jsx("p",{className:"text-[11px] uppercase tracking-wide text-slate-500 mb-1.5",children:"Evidence layers"}),e.jsx("ul",{className:"space-y-1",children:r.map(o=>{const l=t[o],i=l.coveredCriteria.length,d=l.failing.length,p=l.inconclusive.length,c=l.unevaluated.length,u=l.cleared,h=d>0||p>0,x=i>0&&!h&&c===0,b=x?"text-emerald-700":d>0?"text-rose-700":"text-amber-700";return e.jsxs("li",{className:"flex items-start gap-2 text-[11px]",children:[e.jsx("span",{className:`w-5 h-5 inline-flex items-center justify-center rounded text-[10px] font-bold shrink-0 ${x?"bg-emerald-500 text-white":d>0?"bg-rose-500 text-white":"bg-amber-500 text-white"}`,"aria-hidden":"true",children:x?"✓":d>0?"!":"?"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-baseline gap-1.5 flex-wrap",children:[e.jsx("span",{className:"font-medium text-slate-800",children:vs[o].label}),e.jsx("span",{className:`font-mono text-[10px] ${b}`,children:i===0?"no coverage yet":`${u}/${i}`}),d>0&&e.jsxs("button",{type:"button",onClick:n,className:"text-[10px] text-rose-700 hover:underline cursor-pointer",title:`Confirmed fails (action: fix the underlying issue + re-audit, OR mark visually verified): ${l.failing.join(", ")}`,children:["· ",d," failing"]}),p>0&&e.jsxs("button",{type:"button",onClick:n,className:"text-[10px] text-amber-700 hover:underline cursor-pointer",title:`Inconclusive — this layer couldn't determine (action: try "Resolve with AI" below, OR mark via Guided Tests): ${l.inconclusive.join(", ")}`,children:["· ",p," inconclusive"]}),c>0&&e.jsxs("span",{className:"text-[10px] text-amber-700",children:["· ",c," pending"]})]}),e.jsx("p",{className:"text-[10px] text-slate-500 leading-snug",children:vs[o].hint}),o==="human"&&c>0&&e.jsx("button",{type:"button",onClick:()=>s("guided"),className:"text-[10px] text-brand-600 hover:underline mt-0.5",children:"Open Guided Tests →"})]})]},o)})})]})}function Tr({areas:t}){const s=t.map(a=>a.label);return e.jsxs("div",{className:"border-t border-rose-200 bg-rose-50 px-3 py-2 text-[11px] text-rose-900 leading-snug",children:[e.jsx("p",{className:"font-semibold mb-0.5",children:"⚠ Not lawsuit-safe"}),e.jsx("p",{children:s.length===1?e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:s[0]})," scored ",t[0].letter,". Even a high overall grade doesn't help if one area is failing — demand-letter mills target the weakest link."]}):e.jsxs(e.Fragment,{children:[s.length," areas are at lawsuit-risk:"," ",s.map((a,n)=>e.jsxs("span",{children:[e.jsx("strong",{children:a}),n<s.length-1?", ":""]},a)),". Fix these before relying on the overall grade."]})})]})}function $r({grades:t,uncategorized:s}){const a=y(i=>i.setView),n=y(i=>i.setFindingsLens),r=y(i=>i.setPendingAreaExpand);function o(i){a("report"),n("per-area"),r(i)}function l(i){const d=i.counts;return d.critical+d.serious+d.moderate+d.minor>0}return e.jsxs("div",{className:"border-t border-slate-200 px-3 py-2",children:[e.jsx("p",{className:"text-[11px] uppercase tracking-wide text-slate-500 mb-2",children:"Verification areas"}),e.jsxs("ul",{className:"grid grid-cols-1 gap-1.5",children:[t.map(i=>{const d=l(i),p="flex items-center gap-2 text-[11px] w-full text-left rounded px-1 py-0.5 -mx-1",c=d?"cursor-pointer hover:bg-slate-100":"cursor-default",u=e.jsxs(e.Fragment,{children:[e.jsx("span",{className:`w-6 h-6 inline-flex items-center justify-center rounded text-xs font-bold ${Cr[i.letter]}`,"aria-label":`Grade ${i.letter}`,children:i.letter}),e.jsx("span",{className:"font-medium text-slate-800 flex-1 min-w-0",children:i.label}),e.jsx(Ur,{grade:i,onOpenGuided:()=>a("guided")})]});return e.jsx("li",{children:d?e.jsx("button",{type:"button",onClick:()=>o(i.id),className:`${p} ${c}`,"aria-label":`Open ${i.label} violations`,children:u}):e.jsx("div",{className:p,children:u})},i.id)}),s&&s.total>0&&e.jsxs("li",{className:"flex items-center gap-2 text-[11px] mt-1 pt-1.5 border-t border-dashed border-slate-200",title:`These findings come from rules not mapped to any of the ${t.length} verification areas above. Listing them here so the headline count and the area cards agree. Rules: ${s.representatives.map(i=>i.ruleId).join(", ")}`,children:[e.jsx("span",{className:"w-6 h-6 inline-flex items-center justify-center rounded text-xs font-bold bg-slate-300 text-slate-700","aria-label":"Other findings",children:"?"}),e.jsxs("span",{className:"font-medium text-slate-700 flex-1 min-w-0",children:["Other findings",e.jsx("span",{className:"ml-2 text-[10px] text-slate-500 font-normal italic",children:"rules not mapped to a category"})]}),e.jsx("span",{className:"text-slate-500 text-[10px]",children:(()=>{const i=[];return s.counts.critical>0&&i.push(`${s.counts.critical} critical`),s.counts.serious>0&&i.push(`${s.counts.serious} serious`),s.counts.moderate>0&&i.push(`${s.counts.moderate} moderate`),s.counts.minor>0&&i.push(`${s.counts.minor} minor`),i.join(" · ")})()})]})]})]})}function Ur({grade:t,onOpenGuided:s}){const a=i=>{if(!i)return"";const d=fe.find(p=>p.id===i);return(d==null?void 0:d.name)??i};if(t.untested)return e.jsxs("span",{className:"text-slate-500 text-[10px] italic",children:["not graded —"," ",t.primaryVerifierWorkflowId?e.jsxs("button",{type:"button",onClick:s,className:"text-brand-600 hover:underline not-italic",children:["run ",a(t.primaryVerifierWorkflowId)," →"]}):"no data yet"]});if(t.verifiedByIgt){const i=t.verifiedAt?ga(Date.now()-new Date(t.verifiedAt).getTime()):null;return e.jsxs("span",{className:"text-emerald-700 text-[10px]",title:t.suppressedHeuristicCount>0?`Heuristic flagged ${t.suppressedHeuristicCount} issue${t.suppressedHeuristicCount===1?"":"s"}, but you verified this area in Guided Tests — those are treated as noise unless you re-verify.`:"Verified via Guided Tests",children:["✓ verified",i?` ${i} ago`:""]})}const{critical:n,serious:r,moderate:o,minor:l}=t.counts;if(n>0||r>0||o>0||l>0){const i=[];return n>0&&i.push({label:"critical",n,cls:"text-rose-700"}),r>0&&i.push({label:"serious",n:r,cls:"text-orange-700"}),o>0&&i.push({label:"moderate",n:o,cls:"text-amber-700"}),l>0&&i.push({label:"minor",n:l,cls:"text-slate-600"}),e.jsx("span",{className:"text-slate-500 text-[10px]",children:i.map((d,p)=>e.jsxs("span",{children:[p>0&&" · ",e.jsxs("span",{className:d.cls,children:[d.n," ",d.label]})]},d.label))})}return t.needsIgt?e.jsxs("button",{type:"button",onClick:s,className:"text-amber-700 hover:underline text-[10px]",title:"Verify this area by running the relevant Guided Tests workflow",children:["verify with ",a(t.primaryVerifierWorkflowId)," →"]}):e.jsx("span",{className:"text-emerald-700 text-[10px]",children:"clean"})}function Lr({violationsRemaining:t,manualCompleted:s,manualTotal:a}){const n=y(l=>l.setView),r=y(l=>l.setFindingsLens),o=[{status:t===0?"done":"next",label:t===0?"Automated checks pass":`Fix ${t} automated violation${t===1?"":"s"}`,action:t>0?()=>{n("report"),r("violations")}:void 0,tooltip:t>0?"Open the Violations list — each finding card has inline Acknowledge / Not a real issue / Locate / Fix recipe affordances.":void 0},{status:"optional",label:a>0?`Optional: spot-check via Guided Tests (${s}/${a} done — AI walkthroughs cover most)`:"Optional: spot-check via Guided Tests (AI walkthroughs cover most)",action:()=>n("guided"),tooltip:"Guided Tests are opt-in. The 5 AI walkthroughs auto-run after every audit and verdict the criteria that previously required manual keyboard / vision checks. Run these workflows only for belt-and-suspenders confidence on a formal conformance claim."},{status:t===0?"next":"pending",label:"Export AI fix prompt → sign-and-seal in Compliance",action:()=>n("delta"),tooltip:'Switches to the Delta lens. Export menu → "AI fix prompt" produces markdown for ChatGPT / Claude / Copilot with code-level fix recipes for every automated finding, including false-positive guidance. Then jump to the Compliance tile from Dashboard to sign-and-seal the audit for a chain-of-custody record.'}];return e.jsxs("div",{className:"border-t border-slate-200 px-3 py-2 bg-slate-50",children:[e.jsx("p",{className:"text-[11px] uppercase tracking-wide text-slate-500 mb-1.5",children:"Path to full WCAG compliance"}),e.jsx("ol",{className:"space-y-1 text-[11px]",children:o.map((l,i)=>{const d=l.status==="done"?"text-emerald-700":l.status==="next"?"text-brand-600 font-semibold":l.status==="optional"?"text-slate-500":"text-slate-400";return e.jsxs("li",{className:"flex items-start gap-2",children:[e.jsxs("span",{className:`font-mono shrink-0 ${d}`,"aria-hidden":"true",children:[i+1,"."]}),l.action?e.jsxs("button",{type:"button",onClick:l.action,title:l.tooltip,className:l.status==="next"?"text-brand-700 font-semibold underline-offset-2 hover:underline text-left leading-snug":"text-slate-600 underline-offset-2 hover:underline hover:text-slate-900 text-left leading-snug",children:[l.label," →"]}):e.jsx("span",{className:l.status==="done"?"text-slate-500 line-through leading-snug":l.status==="next"?"text-slate-900 font-medium leading-snug":"text-slate-500 leading-snug",children:l.label}),l.status==="done"&&e.jsx("span",{className:"text-emerald-700 shrink-0 font-mono","aria-label":"step complete",children:"✓"})]},i)})})]})}function _r({current:t,total:s}){return e.jsxs("div",{role:"status","aria-live":"polite",className:"border border-slate-200 rounded-lg bg-white p-4 flex items-center gap-3",children:[e.jsx("span",{className:"inline-block w-5 h-5 border-2 border-brand-500 border-t-transparent rounded-full animate-spin motion-reduce:animate-none","aria-hidden":"true"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-medium text-slate-900",children:"Scanning…"}),e.jsx("p",{className:"text-[11px] text-slate-500",children:typeof t=="number"&&typeof s=="number"?`State ${t} of ${s}. Grade will appear when the scan completes.`:"Grade will appear when the scan completes."})]})]})}function Dr({scannedAt:t}){const s=Date.now()-new Date(t).getTime();return e.jsxs("div",{className:"bg-amber-50 border-b border-amber-200 px-3 py-1.5 text-[11px] text-amber-900 flex items-center gap-2",children:[e.jsx("span",{"aria-hidden":"true",children:"↻"}),e.jsxs("span",{children:["Showing a previous scan (",ga(s)," old). Re-scan to grade the current page state."]})]})}function ga(t){const s=Math.floor(t/1e3);if(s<60)return"less than a minute";if(s<120)return"1 minute";if(s<3600)return`${Math.floor(s/60)} minutes`;if(s<7200)return"1 hour";if(s<86400)return`${Math.floor(s/3600)} hours`;const a=Math.floor(s/86400);return a===1?"1 day":`${a} days`}function fa(){return typeof chrome<"u"&&typeof chrome.devtools<"u"}async function ys(t){if(!fa())return!1;const s=chrome.devtools;return await new Promise(a=>{const r=`(function(){
|
|
3
3
|
try {
|
|
4
4
|
var el = document.querySelector(${JSON.stringify(t)});
|
|
5
5
|
if (el) { inspect(el); return true; }
|
|
@@ -15,7 +15,7 @@ var Ba=Object.defineProperty;var Ha=(t,s,a)=>s in t?Ba(t,s,{enumerable:!0,config
|
|
|
15
15
|
`),p=new URLSearchParams({"[Title]":l,"[Description]":d});let c=`${r}/_workitems/create/${encodeURIComponent(n)}?${p.toString()}`;return c.length>Ls&&(c=c.slice(0,Ls)),{url:c,title:l,description:d}}const _s=7800;function Li(t,s,a){const n=t.replace(/\/$/,""),r=[];for(const c of a){const u=`${c.ruleId}::${c.target.selector}`,h=`:${c.currentState.pseudoState} · ${c.currentState.theme} · ${c.currentState.direction}`,x=r.find(b=>`${b.ruleId}::${b.target.selector}`===u);if(x){x._states.includes(h)||x._states.push(h);continue}r.push({...c,_states:[h]})}const o=`a11y: ${r.length} new violation${r.length===1?"":"s"} in ${s??"audited component"}`,l=[];l.push(`**Component:** \`${s??"unknown"}\``),l.push(""),l.push("Detected by WCAG Component Auditor as **new** vs the saved baseline — these are violations introduced since the last accepted baseline."),l.push(""),l.push("---"),l.push("");for(const c of r)l.push(`### \`${c.ruleId}\` — ${c.impact}`),l.push(""),l.push(c.description),l.push(""),l.push(`- **WCAG:** ${c.wcagCriterion} (${c.wcagLevel})`),l.push(`- **Selector:** \`${c.target.selector}\``),l.push(`- **Found in state(s):** ${c._states.join(", ")}`),c.helpUrl&&l.push(`- **More info:** ${c.helpUrl}`),l.push(""),l.push("```html"),l.push(c.target.outerHTML),l.push("```"),l.push("");l.push("---"),l.push(""),l.push("_Filed via WCAG Component Auditor (delta-only — inherited debt not included)._");const i=l.join(`
|
|
16
16
|
`),d=new URLSearchParams({"issue[title]":o,"issue[description]":i});let p=`${n}/-/issues/new?${d.toString()}`;return p.length>_s&&(p=p.slice(0,_s)),{url:p,title:o,description:i}}const Ds=["sidePanel:lastAudit","acknowledgedFindings","dismissedFindings","aiColorSuggestions","incompleteResolutions","igtRuns","inflight:audit","aiUsageLog","aiDiagnosticLatest","auditAttestations","spotAuditReviews","interactiveAuditResults"],_i=["wcag-component-auditor","wcag-forensic-log"];async function Di(){const t=[];let s=0;const a=[];try{const n=await chrome.storage.local.get(Ds);s=Object.keys(n).length,await chrome.storage.local.remove(Ds)}catch(n){t.push(`chrome.storage.local: ${n instanceof Error?n.message:String(n)}`)}for(const n of _i)try{await Oi(n),a.push(n)}catch(r){t.push(`IndexedDB ${n}: ${r instanceof Error?r.message:String(r)}`)}return{chromeStorageKeysCleared:s,indexedDbsCleared:a,errors:t}}function Oi(t){return new Promise((s,a)=>{const n=indexedDB.deleteDatabase(t);n.onsuccess=()=>s(),n.onerror=()=>{var r;return a(new Error(((r=n.error)==null?void 0:r.message)??"unknown delete error"))},n.onblocked=()=>a(new Error("blocked — close any open audit tabs and retry"))})}const Ft="accessibilityStatementInputs:v1";async function Fi(){var a;if(typeof chrome>"u"||!((a=chrome.storage)!=null&&a.local))return null;const s=(await chrome.storage.local.get(Ft))[Ft];return s&&typeof s=="object"?s:null}async function Mi(t){var s;typeof chrome>"u"||!((s=chrome.storage)!=null&&s.local)||await chrome.storage.local.set({[Ft]:t})}function ja({open:t,onClose:s,results:a,siteCrawlSource:n}){const[r,o]=m.useState("eaa"),[l,i]=m.useState(""),[d,p]=m.useState(""),[c,u]=m.useState("partial"),[h,x]=m.useState(""),[b,w]=m.useState(""),[N,E]=m.useState(""),[I,C]=m.useState(""),[f,j]=m.useState("English"),[g,v]=m.useState("wcagcheckr (self-evaluation)"),[S,k]=m.useState("2.1"),[T,V]=m.useState("AA"),[P,B]=m.useState(!1),[U,q]=m.useState(null),$=m.useRef(null);if(m.useEffect(()=>{t&&(async()=>{var M,ie,A,G;const R=await Fi();if(R&&(R.framing&&o(R.framing),R.organizationName&&i(R.organizationName),R.siteUrl&&p(R.siteUrl),R.conformanceStatus&&u(R.conformanceStatus),(M=R.contact)!=null&&M.email&&x(R.contact.email),(ie=R.contact)!=null&&ie.phone&&w(R.contact.phone),(A=R.contact)!=null&&A.formUrl&&E(R.contact.formUrl),R.countryCode&&C(R.countryCode),R.language&&j(R.language),R.auditedBy&&v(R.auditedBy),R.wcagVersion&&k(R.wcagVersion),R.wcagLevel&&V(R.wcagLevel)),!(R!=null&&R.siteUrl)&&((G=a[0])!=null&&G.pageUrl))try{const W=new URL(a[0].pageUrl);p(`${W.protocol}//${W.host}/`)}catch{}R!=null&&R.conformanceStatus||u(sn(a)),setTimeout(()=>{var W;return(W=$.current)==null?void 0:W.focus()},50)})()},[t,a]),!t)return null;function _(){var A;const R=new Date().toISOString().slice(0,10),M=(A=a[0])!=null&&A.startedAt?new Date(a[0].startedAt).toISOString().slice(0,10):R,ie={};return h.trim()&&(ie.email=h.trim()),b.trim()&&(ie.phone=b.trim()),N.trim()&&(ie.formUrl=N.trim()),{framing:r,organizationName:l.trim(),siteUrl:d.trim(),conformanceStatus:c,preparedAt:R,evaluatedAt:M,contact:ie,countryCode:I||null,language:f.trim()||"English",auditedBy:g.trim()||"wcagcheckr (self-evaluation)",wcagVersion:S,wcagLevel:T}}function F(R){if(!R.organizationName)return"Organization name is required.";if(!R.siteUrl)return"Site URL is required.";try{new URL(R.siteUrl)}catch{return"Site URL must be a valid URL (e.g. https://example.com/)."}return!R.contact.email&&!R.contact.phone&&!R.contact.formUrl?"At least one contact method (email, phone, or web form) is required — WAD + EAA both require an accessible feedback channel.":null}async function H(R){var A;q(null);const M=_(),ie=F(M);if(ie){q(ie);return}B(!0);try{await Mi(M);const G=await Z({type:"EXPORT_REQUEST",format:R==="html"?"accessibility-statement-html":"accessibility-statement-markdown",results:n?[]:a,siteCrawlSource:n||void 0,statementInputs:M}),W=(G==null?void 0:G.content)??"";if(!W||W.startsWith("# Accessibility statement — error")){q(W||"Export failed — no response.");return}try{await navigator.clipboard.writeText(W)}catch{}const K=new Blob([W],{type:R==="html"?"text/html;charset=utf-8":"text/markdown;charset=utf-8"}),oe=URL.createObjectURL(K);typeof chrome<"u"&&((A=chrome.tabs)!=null&&A.create)?await chrome.tabs.create({url:oe,active:!0}).catch(()=>{window.open(oe,"_blank","noopener,noreferrer")}):window.open(oe,"_blank","noopener,noreferrer"),setTimeout(()=>URL.revokeObjectURL(oe),6e4),s()}catch(G){q(G instanceof Error?G.message:String(G))}finally{B(!1)}}return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-slate-900/40",role:"dialog","aria-modal":"true","aria-labelledby":"statement-dialog-title",children:e.jsxs("div",{className:"bg-white rounded-lg shadow-xl max-w-lg w-full max-h-[90vh] overflow-y-auto m-4",onClick:R=>R.stopPropagation(),children:[e.jsxs("div",{className:"p-4 border-b border-slate-200 flex items-center justify-between",children:[e.jsx("h2",{id:"statement-dialog-title",className:"text-sm font-semibold",children:"Generate accessibility statement"}),e.jsx("button",{type:"button",onClick:s,className:"text-slate-400 hover:text-slate-700 text-xl leading-none","aria-label":"Close",children:"×"})]}),e.jsxs("div",{className:"p-4 space-y-3 text-xs",children:[e.jsx("p",{className:"text-slate-600 leading-snug",children:"Generates an EU-compliant accessibility statement. EAA (private-sector EU) has been enforceable since 28 June 2025; WAD (public-sector EU) since 2018. The statement is built from your most recent audit + the info below. Inputs persist between sessions."}),e.jsxs("fieldset",{className:"space-y-1.5",children:[e.jsx("legend",{className:"font-medium",children:"Regulatory framing"}),e.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"framing",value:"eaa",checked:r==="eaa",onChange:()=>o("eaa"),className:"mt-0.5"}),e.jsxs("span",{children:[e.jsx("strong",{children:"EAA"})," (Directive 2019/882) — private sector. E-commerce, banking, transport, telecom, e-readers, media. Enforceable June 2025."]})]}),e.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[e.jsx("input",{type:"radio",name:"framing",value:"wad",checked:r==="wad",onChange:()=>o("wad"),className:"mt-0.5"}),e.jsxs("span",{children:[e.jsx("strong",{children:"WAD"})," (Directive 2016/2102) — EU public sector. Government, public bodies, education."]})]})]}),e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"statement-org",className:"block font-medium mb-1",children:["Organization name ",e.jsx("span",{className:"text-rose-600",children:"*"})]}),e.jsx("input",{id:"statement-org",ref:$,type:"text",value:l,onChange:R=>i(R.target.value),placeholder:"Acme E-commerce GmbH",className:"w-full border border-slate-300 rounded px-2 py-1.5"})]}),e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"statement-url",className:"block font-medium mb-1",children:["Site URL ",e.jsx("span",{className:"text-rose-600",children:"*"})]}),e.jsx("input",{id:"statement-url",type:"url",value:d,onChange:R=>p(R.target.value),placeholder:"https://acme.example/",className:"w-full border border-slate-300 rounded px-2 py-1.5 font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"statement-conformance",className:"block font-medium mb-1",children:"Conformance status"}),e.jsxs("select",{id:"statement-conformance",value:c,onChange:R=>u(R.target.value),className:"w-full border border-slate-300 rounded px-2 py-1.5",children:[e.jsx("option",{value:"full",children:"Fully conformant"}),e.jsx("option",{value:"partial",children:"Partially conformant"}),e.jsx("option",{value:"non-conformant",children:"Non-conformant"})]}),e.jsx("p",{className:"text-[10px] text-slate-500 mt-1 leading-snug",children:'This is a LEGAL self-declaration. "Partial" is the honest default for most sites with any open findings.'})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"statement-wcag-version",className:"block font-medium mb-1",children:"WCAG version"}),e.jsxs("select",{id:"statement-wcag-version",value:S,onChange:R=>k(R.target.value),className:"w-full border border-slate-300 rounded px-2 py-1.5",children:[e.jsx("option",{value:"2.1",children:"2.1"}),e.jsx("option",{value:"2.2",children:"2.2"})]})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"statement-wcag-level",className:"block font-medium mb-1",children:"WCAG level"}),e.jsxs("select",{id:"statement-wcag-level",value:T,onChange:R=>V(R.target.value),className:"w-full border border-slate-300 rounded px-2 py-1.5",children:[e.jsx("option",{value:"A",children:"A"}),e.jsx("option",{value:"AA",children:"AA"}),e.jsx("option",{value:"AAA",children:"AAA"})]})]})]}),e.jsxs("fieldset",{className:"space-y-1.5",children:[e.jsxs("legend",{className:"font-medium",children:["Feedback contact ",e.jsx("span",{className:"text-rose-600",children:"*"})," ",e.jsx("span",{className:"text-slate-500 font-normal",children:"(at least one required)"})]}),e.jsx("input",{type:"email",value:h,onChange:R=>x(R.target.value),placeholder:"accessibility@acme.example",className:"w-full border border-slate-300 rounded px-2 py-1.5","aria-label":"Email"}),e.jsx("input",{type:"tel",value:b,onChange:R=>w(R.target.value),placeholder:"+49 30 12345678 (optional)",className:"w-full border border-slate-300 rounded px-2 py-1.5","aria-label":"Phone"}),e.jsx("input",{type:"url",value:N,onChange:R=>E(R.target.value),placeholder:"https://acme.example/contact (optional)",className:"w-full border border-slate-300 rounded px-2 py-1.5","aria-label":"Web form URL"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"statement-country",className:"block font-medium mb-1",children:"Country (for WAD enforcement link)"}),e.jsxs("select",{id:"statement-country",value:I,onChange:R=>C(R.target.value),className:"w-full border border-slate-300 rounded px-2 py-1.5",children:[e.jsx("option",{value:"",children:"— Not specified —"}),Object.entries(an).map(([R,M])=>e.jsxs("option",{value:R,children:[R," — ",M.name.replace(/^[A-Z]+\s*—\s*/,"")]},R))]}),e.jsx("p",{className:"text-[10px] text-slate-500 mt-1",children:"Used only for WAD framing. EAA enforcement is handled per member state's market- surveillance authority and the statement uses a generic line."})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"statement-language",className:"block font-medium mb-1",children:"Statement language"}),e.jsx("input",{id:"statement-language",type:"text",value:f,onChange:R=>j(R.target.value),placeholder:"English / Deutsch / Français / …",className:"w-full border border-slate-300 rounded px-2 py-1.5"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"statement-audited-by",className:"block font-medium mb-1",children:"Audited by"}),e.jsx("input",{id:"statement-audited-by",type:"text",value:g,onChange:R=>v(R.target.value),className:"w-full border border-slate-300 rounded px-2 py-1.5"})]}),U&&e.jsx("div",{className:"text-xs text-rose-800 bg-rose-50 border border-rose-200 rounded p-2",role:"alert",children:U})]}),e.jsxs("div",{className:"p-4 border-t border-slate-200 flex gap-2 flex-wrap",children:[e.jsx("button",{type:"button",onClick:()=>void H("markdown"),disabled:P,className:"text-xs px-3 py-1.5 bg-brand-500 hover:bg-brand-600 text-white rounded disabled:opacity-50 font-medium",children:P?"Generating…":"📄 Generate Markdown"}),e.jsx("button",{type:"button",onClick:()=>void H("html"),disabled:P,className:"text-xs px-3 py-1.5 border border-brand-500 text-brand-700 hover:bg-brand-50 rounded disabled:opacity-50 font-medium",children:P?"Generating…":"🌐 Generate HTML"}),e.jsx("button",{type:"button",onClick:s,disabled:P,className:"text-xs px-3 py-1.5 border border-slate-300 text-slate-700 hover:bg-slate-50 rounded disabled:opacity-50 ml-auto",children:"Cancel"})]})]})})}function Na(){const t=y(A=>A.delta),s=y(A=>A.componentId),a=y(A=>A.results),n=y(A=>A.tier),r=y(A=>A.baselineList),o=y(A=>A.siteCrawlReport),[l,i]=m.useState(""),[d,p]=m.useState(""),[c,u]=m.useState(""),[h,x]=m.useState(""),[b,w]=m.useState(!1),[N,E]=m.useState(!1),[I,C]=m.useState(null),[f,j]=m.useState(null),[g,v]=m.useState(!1),[S,k]=m.useState(!1),[T,V]=m.useState(null),[P,B]=m.useState(!1);m.useEffect(()=>{Promise.all([Z({type:"SETTINGS_GET",key:"githubRepoUrl"}),Z({type:"SETTINGS_GET",key:"jiraInstanceUrl"}),Z({type:"SETTINGS_GET",key:"azureDevOpsProjectUrl"}),Z({type:"SETTINGS_GET",key:"gitlabProjectUrl"})]).then(([A,G,W,K])=>{i(typeof A.data=="string"?A.data:""),p(typeof G.data=="string"?G.data:""),u(typeof W.data=="string"?W.data:""),x(typeof K.data=="string"?K.data:"")})},[]),m.useEffect(()=>we("BADGE_CLICKED_EVENT",G=>{const W=`viol-row-${G.violationId}`,K=document.getElementById(W);K&&(K.scrollIntoView({behavior:"smooth",block:"center"}),K.classList.add("ring-2","ring-rose-500"),setTimeout(()=>K.classList.remove("ring-2","ring-rose-500"),1500))}),[]),m.useEffect(()=>()=>{(async()=>{const A=await ue();A&&(S&&await be(A,{type:"BADGES_HIDE_REQUEST",tabId:A}).catch(()=>{}),P&&await be(A,{type:"HEATMAP_HIDE_REQUEST",tabId:A}).catch(()=>{}))})()},[]);async function U(){const A=await ue();if(!A){ge.polite("Cannot identify audit tab; reload and re-run the audit.");return}if(S){await be(A,{type:"BADGES_HIDE_REQUEST",tabId:A}).catch(()=>{}),k(!1),V(null);return}const G={critical:4,serious:3,moderate:2,minor:1},W=new Map;for(const le of a)for(const pe of le.violations)W.has(pe.matchKey)||W.set(pe.matchKey,pe);const oe=Array.from(W.values()).sort((le,pe)=>G[pe.impact]-G[le.impact]).map((le,pe)=>({id:le.matchKey,index:pe+1,selector:le.target.selector,impact:le.impact,ruleId:le.ruleId,wcagCriterion:le.wcagCriterion}));if(oe.length===0){ge.polite("No violations to badge.");return}const ne=await Ee(A,{type:"BADGES_SHOW_REQUEST",tabId:A,violations:oe}).catch(()=>null);ne&&(k(!0),V({rendered:ne.rendered,requested:ne.requested,clustered:ne.clustered}),ge.polite(`${ne.rendered} violation badges shown on the page.`))}async function q(){const A=await ue();if(!A){ge.polite("Cannot identify audit tab; reload and re-run the audit.");return}if(P){await be(A,{type:"HEATMAP_HIDE_REQUEST",tabId:A}).catch(()=>{}),B(!1);return}const G=new Map;for(const oe of a)for(const ne of oe.violations)G.has(ne.matchKey)||G.set(ne.matchKey,ne);const W=Array.from(G.values()).map(oe=>({selector:oe.target.selector,impact:oe.impact}));if(W.length===0){ge.polite("No violations to heatmap.");return}const K=await Ee(A,{type:"HEATMAP_SHOW_REQUEST",tabId:A,violations:W}).catch(()=>null);K&&(B(!0),ge.polite(`Heatmap shown with ${K.rendered} violation blobs.`))}const $=ft(n,"exportJson"),_=ra[n].maxBaselines,F=r.some(A=>A.componentId===s),H=F||r.length<_;if(!t)return e.jsx("div",{className:"p-4 text-center text-slate-500 text-sm",children:"Run an audit to see the delta against your baseline."});async function R(){if(!s||a.length===0)return;const A=a.flatMap(pe=>pe.violations),G=a.flatMap(pe=>pe.announcements??[]),W=a.flatMap(pe=>pe.focusEvents??[]),K=a[0],ne=(await Z({type:"SETTINGS_GET",key:"stateMatrix"})).data??qt;await ae({type:"BASELINE_SET",componentId:s,violations:A,announcements:G,focusEvents:W,snapshotMeta:{url:window.location.href,axeVersion:K.axeVersion,matrixConfig:ne,capturedAt:new Date().toISOString()}});const le=await Z({type:"BASELINE_COMPARE",componentId:s,currentViolations:A,announcements:G,focusEvents:W,currentMatrix:ne});y.getState().setDelta(le.delta),ge.polite(`Baseline saved for ${s}.`)}async function M(){if(!s||!F||!window.confirm(`Remove the saved baseline for "${s}"?
|
|
17
17
|
|
|
18
|
-
Future audits will treat every detected violation as new (no delta filtering). This cannot be undone.`))return;await ae({type:"BASELINE_DELETE",componentId:s});const G=a.flatMap(le=>le.violations),W=a.flatMap(le=>le.announcements??[]),K=a.flatMap(le=>le.focusEvents??[]),oe=await Z({type:"BASELINE_COMPARE",componentId:s,currentViolations:G,announcements:W,focusEvents:K});y.getState().setDelta(oe.delta);const ne=await Z({type:"BASELINE_LIST"});y.getState().setBaselineList(ne.items),ge.polite(`Baseline cleared for ${s}.`)}async function ie(A,G=!1){if(a.length===0)return;if(A==="ai-prompt"){const{copyAiFixerPrompt:Y}=await ke(async()=>{const{copyAiFixerPrompt:he}=await import("./copy-ai-fixer-prompt-BHYSg4i0.js");return{copyAiFixerPrompt:he}},__vite__mapDeps([4,1,2]));await Y({results:a,componentId:s,delta:G?void 0:t,siteCrawlReport:o});return}let W;if((A==="defense-bundle"||A==="evidence-bundle"||A==="deposition-packet")&&s){const Y=await chrome.storage.local.get("igtRuns"),de=((Y==null?void 0:Y.igtRuns)??{})[s]??{};W=Object.values(de)}const ne=await Z({type:"EXPORT_REQUEST",format:A,results:a,delta:G?void 0:t??void 0,manualRuns:W,dismissedKeys:void 0,incompleteResolutions:void 0,wallClockMs:y.getState().lastAuditWallClockMs??void 0});if(A==="defense-bundle"||A==="evidence-bundle"||A==="deposition-packet"){const Y=bt(A,s);await ia()?et(ne.content,Y):j({open:!0,format:A,content:ne.content,filename:Y});return}if(A==="html-print"||A==="vpat"||A==="methodology-doc"||A==="conformance-crosswalk"||A==="executive-report"){$e(ne.content);return}const le=A==="json"?"application/json":A==="sarif"?"application/sarif+json":A==="ticket-bundle"?"text/markdown":"application/xml",pe=A==="junit"?"xml":A==="ticket-bundle"?"md":A,L=new Blob([ne.content],{type:le}),X=URL.createObjectURL(L),z=document.createElement("a");z.href=X,z.download=`audit-${(s==null?void 0:s.replace(/[^a-z0-9]/gi,"-"))??"export"}.${pe}`,z.click(),URL.revokeObjectURL(X)}return e.jsxs("div",{className:"p-3 space-y-3",children:[e.jsxs("div",{className:"flex gap-2 items-center flex-wrap",children:[e.jsx("button",{onClick:R,disabled:!H,title:H?void 0:`Free tier limits you to ${_} baseline. Upgrade for unlimited.`,className:"text-xs px-2 py-1 bg-slate-200 hover:bg-slate-300 rounded disabled:opacity-50 disabled:cursor-not-allowed",children:"Accept as baseline"}),F&&e.jsx("button",{onClick:M,title:"Remove the saved baseline so every detected violation counts as new again.",className:"text-xs px-2 py-1 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50",children:"Clear baseline"}),e.jsx("button",{onClick:()=>w(!0),title:"Wipe ALL audit-derived state (baselines, history, IGT runs, dismissals, AI cache). User settings + custom rules + license are preserved. Use after a major site rebuild.",className:"text-xs px-2 py-1 border border-rose-300 bg-white text-rose-700 rounded hover:bg-rose-50",children:"Reset all audit data"}),e.jsx("button",{type:"button",onClick:()=>void U(),"aria-pressed":S,title:"Overlay numbered, color-coded badges on every violating element in the page. Click a badge to scroll its row into view here.",className:S?"text-xs px-2 py-1 bg-rose-600 hover:bg-rose-700 text-white rounded":"text-xs px-2 py-1 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50",children:S?"Hide badges":"Show badges 🎯"}),S&&T&&e.jsxs("span",{className:"text-[11px] text-slate-500",children:[T.rendered," of ",T.requested," rendered",T.clustered>0?` · ${T.clustered} clusters`:""]}),e.jsx("button",{type:"button",onClick:()=>void q(),"aria-pressed":P,title:"Overlay a density heatmap on the page. Red blobs at each violation rect; overlapping blobs glow brighter to show problem clusters.",className:P?"text-xs px-2 py-1 bg-orange-600 hover:bg-orange-700 text-white rounded":"text-xs px-2 py-1 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50",children:P?"Hide heatmap":"Show heatmap 🔥"}),e.jsx(Hi,{disabled:!$,onExport:ie,onAccessibilityStatement:()=>v(!0),hasBaselineDelta:!!(t!=null&&t.baselineSnapshotMeta)}),!H&&e.jsx("span",{className:"text-xs text-amber-700",children:"Free tier · 1 baseline limit reached."})]}),t.matrixMismatchWarning&&e.jsxs("div",{className:"text-xs bg-amber-50 border border-amber-200 rounded p-2 text-amber-900",children:["⚠ ",t.matrixMismatchWarning]}),(()=>{const A=At(t.new),G=At(t.persistent),W=At(t.fixed),K=[...A.review,...G.review];return e.jsxs(e.Fragment,{children:[e.jsx(We,{title:"New",violations:A.findings,count:A.findings.length,accent:"red",actions:[...l&&A.findings.length>0?[{label:"File GitHub issue",onClick:()=>Gi(l,s,A.findings)}]:[],...d&&A.findings.length>0?[{label:"File Jira issue",onClick:()=>Vi(d,s,A.findings)}]:[],...c&&A.findings.length>0?[{label:"File Azure DevOps work item",onClick:()=>Wi(c,s,A.findings)}]:[],...h&&A.findings.length>0?[{label:"File GitLab issue",onClick:()=>Bi(h,s,A.findings)}]:[]]}),e.jsx(We,{title:"Persistent",violations:G.findings,count:G.findings.length,accent:"slate"}),e.jsx(We,{title:"Fixed",violations:W.findings,count:t.fixedCount,accent:"green"}),K.length>0&&e.jsx(We,{title:"Needs review (does not affect grade)",violations:K,count:K.length,accent:"amber"}),t.acknowledged&&t.acknowledged.length>0&&e.jsx(We,{title:"Acknowledged",violations:t.acknowledged,count:t.acknowledged.length,accent:"slate",renderAsAcknowledged:!0})]})})(),f&&e.jsx(wa,{open:f.open,onClose:()=>j(null),format:f.format,content:f.content,filename:f.filename}),e.jsx(ja,{open:g,onClose:()=>v(!1),results:a}),b&&e.jsx("div",{role:"dialog","aria-modal":"true","aria-labelledby":"reset-confirm-title",className:"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-3",children:e.jsxs("div",{className:"bg-white border border-slate-300 rounded-lg shadow-xl max-w-sm w-full p-4 space-y-3",children:[e.jsx("h2",{id:"reset-confirm-title",className:"text-sm font-semibold text-slate-900",children:"Reset all audit data?"}),e.jsx("p",{className:"text-xs text-slate-700 leading-snug",children:"Wipes everything derived from your audits — for a true fresh start after a site rebuild."}),e.jsxs("div",{className:"text-[11px] text-slate-700 space-y-1",children:[e.jsx("p",{className:"font-medium text-slate-800",children:"Will be deleted:"}),e.jsxs("ul",{className:"list-disc list-inside text-slate-600 space-y-0.5",children:[e.jsx("li",{children:"All baselines + audit history"}),e.jsx("li",{children:"Forensic log entries (the anchored receipts stay anchored to their public TSAs, but the local mirror is gone)"}),e.jsx("li",{children:"Guided Tests workflow answers"}),e.jsx("li",{children:"Acknowledged findings + dismissals"}),e.jsx("li",{children:"AI color suggestions + incomplete resolutions cache"}),e.jsx("li",{children:"Last persisted audit"})]}),e.jsx("p",{className:"font-medium text-slate-800 mt-2",children:"Preserved:"}),e.jsxs("ul",{className:"list-disc list-inside text-slate-600 space-y-0.5",children:[e.jsx("li",{children:"Your AI API key + cost cap + check toggles"}),e.jsx("li",{children:"Matrix presets + disabled-rule list"}),e.jsx("li",{children:"Custom rules"}),e.jsx("li",{children:"License + tier"}),e.jsx("li",{children:"Owner / Developer mode"})]})]}),I&&e.jsxs("div",{className:"text-[11px] bg-emerald-50 border border-emerald-200 rounded p-2 text-emerald-900",children:["✓ Cleared ",I.chromeStorageKeysCleared," chrome.storage key",I.chromeStorageKeysCleared===1?"":"s"," + ",I.indexedDbsCleared.length," database",I.indexedDbsCleared.length===1?"":"s",".",I.errors.length>0&&e.jsxs("div",{className:"mt-1 text-rose-800",children:["Partial: ",I.errors.join("; ")]})]}),e.jsx("div",{className:"flex justify-end gap-2 pt-1 border-t border-slate-200",children:I?e.jsx("button",{type:"button",onClick:()=>{w(!1),C(null)},className:"text-xs px-3 py-1.5 bg-brand-500 text-white rounded hover:bg-brand-600",children:"Done"}):e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:()=>w(!1),disabled:N,className:"text-xs px-3 py-1.5 border border-slate-300 text-slate-700 rounded hover:bg-slate-50 disabled:opacity-50",children:"Cancel"}),e.jsx("button",{type:"button",onClick:async()=>{E(!0);try{const A=await Di();C(A),await yt(),ge.polite("Audit data reset. Ready for a fresh scan.")}catch(A){C({chromeStorageKeysCleared:0,indexedDbsCleared:[],errors:[A instanceof Error?A.message:String(A)]})}finally{E(!1)}},disabled:N,className:"text-xs px-3 py-1.5 bg-rose-600 text-white rounded hover:bg-rose-700 disabled:opacity-50",children:N?"Resetting…":"Reset everything"})]})})]})})]})}const Pi={red:"text-red-700",slate:"text-slate-700",green:"text-green-700",amber:"text-amber-700"};function At(t){const s=[],a=[];for(const n of t)n.needsReview?a.push(n):s.push(n);return{findings:s,review:a,fixed:0}}function We({title:t,violations:s,count:a,accent:n,actions:r,renderAsAcknowledged:o}){const[l,i]=m.useState(!o);return e.jsxs("section",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2 gap-2 flex-wrap",children:[e.jsxs("h2",{className:`text-xs font-semibold ${Pi[n]} ${o?"cursor-pointer select-none":""}`,onClick:o?()=>i(d=>!d):void 0,children:[o&&e.jsx("span",{className:"mr-1 text-slate-400",children:l?"▾":"▸"}),t," (",a,")"]}),r&&r.length>0&&e.jsx("div",{className:"flex gap-1 flex-wrap",children:r.map(d=>e.jsx("button",{type:"button",onClick:d.onClick,className:"text-[11px] px-2 py-0.5 border border-slate-300 rounded text-slate-700 hover:bg-slate-50",children:d.label},d.label))})]}),l?s.length===0?e.jsx("p",{className:"text-xs text-slate-500 italic",children:"none"}):e.jsx("div",{className:"space-y-1.5",children:o?s.map((d,p)=>e.jsx(Ze,{violation:d,alreadyAcknowledged:!0},p)):Ei(s).map(d=>e.jsx(Ii,{ruleId:d.ruleId,violations:d.violations},d.ruleId))}):null]})}function Gi(t,s,a){if(a.length===0)return;const{url:n}=Ti(t,s,a);vt(n)}function Vi(t,s,a){if(a.length===0)return;const{url:n}=$i(t,s,a);vt(n)}function Wi(t,s,a){if(a.length===0)return;const{url:n}=Ui(t,s,a);vt(n)}function Bi(t,s,a){if(a.length===0)return;const{url:n}=Li(t,s,a);vt(n)}function Hi({disabled:t,onExport:s,onAccessibilityStatement:a,hasBaselineDelta:n}){const[r,o]=m.useState(!1),[l,i]=m.useState(!1);function d(p){o(!1),s(p,l)}return e.jsxs("div",{className:"relative inline-block",children:[e.jsx("button",{type:"button",disabled:t,onClick:()=>o(p=>!p),title:t?"Export requires a paid tier.":"Choose an export format",className:"text-xs px-2 py-1 bg-slate-200 hover:bg-slate-300 rounded disabled:opacity-50 disabled:cursor-not-allowed",children:"Export ▾"}),r&&!t&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"fixed inset-0 z-40","aria-hidden":"true",onClick:()=>o(!1)}),e.jsxs("div",{className:"absolute right-0 top-full mt-1 z-50 w-[260px] max-w-[calc(100vw-1rem)] bg-white border border-slate-200 rounded shadow-md py-1",role:"menu",children:[n&&e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"flex items-start gap-2 px-3 py-2 text-[11px] cursor-pointer hover:bg-slate-50",title:"By default, delta-aware formats (AI prompt, SARIF, JUnit) emit only NEW violations vs. the saved baseline. Enable this to include every detected violation regardless of baseline.",children:[e.jsx("input",{type:"checkbox",checked:l,onChange:p=>i(p.target.checked),className:"mt-0.5 shrink-0"}),e.jsxs("span",{className:"leading-snug",children:[e.jsx("strong",{children:"Use full audit"})," — include pre-existing baseline violations."]})]}),e.jsx("div",{className:"border-t border-slate-100 my-1"})]}),e.jsx(ye,{onClick:()=>d("json"),title:"Native format with full audit detail.",children:"JSON"}),e.jsx(ye,{onClick:()=>d("sarif"),title:"SARIF for GitHub code-scanning + most CI tools.",children:"SARIF"}),e.jsx(ye,{onClick:()=>d("junit"),title:"JUnit XML for Jenkins / GitLab CI test reporters.",children:"JUnit XML"}),e.jsx("div",{className:"border-t border-slate-100 my-1"}),e.jsx(ye,{onClick:()=>d("html-print"),title:"Opens a print-ready HTML report in a new tab. Use Ctrl+P / Cmd+P → Save as PDF.",children:"Print report (PDF)"}),e.jsx(ye,{onClick:()=>d("vpat"),title:"VPAT 2.5 conformance report — opens in a new tab for review and printing.",children:"VPAT 2.5"}),e.jsx(ye,{onClick:()=>d("defense-bundle"),title:"One-document attorney-ready bundle for site owners: exec summary + risk grade + per-category breakdown + full findings + screenshots + VPAT + remediation plan + methodology + disclaimer.",children:"Defense bundle 📄"}),e.jsx(ye,{onClick:()=>d("evidence-bundle"),title:"Same content as defense bundle, reframed as objective audit evidence (for compliance documentation, complaints, or third-party review).",children:"Evidence bundle 📄"}),e.jsx(ye,{onClick:()=>d("deposition-packet"),title:"Forensic-grade upgrade of defense bundle. Anchors the audit hash via RFC 3161 trusted timestamp + ed25519 server signature, prepends a chain-of-custody cover sheet, appends verification instructions and a sworn-declaration template. The artifact to hand to opposing counsel.",children:"Deposition packet 🔒"}),e.jsx(ye,{onClick:()=>d("methodology-doc"),title:"Standalone methodology document explaining how wcagcheckr audits — multi-state matrix, axe-core rule coverage, WCAG criteria requiring manual review, audit process. Pairs with the deposition packet for legal use; usable standalone as a publishable 'how we audit' document.",children:"Methodology doc 📘"}),e.jsx(ye,{onClick:()=>d("conformance-crosswalk"),title:"Cross-jurisdiction conformance crosswalk: per WCAG criterion, shows the mapping to EN 301 549 (EU), Section 508 (US federal), ADA Title III (US private-sector), EAA (Directive 2019/882), and AODA (Ontario). Highlights criteria violated in this audit.",children:"Conformance crosswalk 🗺"}),e.jsx("div",{className:"border-t border-slate-100 my-1"}),e.jsx(ye,{onClick:()=>d("ai-prompt"),title:"Generate a structured prompt to paste into Claude / Cursor / Copilot. Auto-copies to clipboard.",children:"AI fix prompt ✨"}),e.jsx(ye,{onClick:()=>d("ticket-bundle"),title:"One markdown document with N self-contained ticket sections — one per unique violation. Copy + paste each section into Linear / Asana / Trello / Jira / GitHub Issues. Tickets deduped by logical group; critical-first ordering.",children:"Ticket bundle (markdown) 🎫"}),e.jsx(ye,{onClick:()=>d("executive-report"),title:"Single-page executive HTML report: grade hero, top 3 risks, recommended next steps. Print-ready (Ctrl+P → Save as PDF). For stakeholder distribution rather than developer remediation.",children:"Executive report 📊"}),e.jsx("div",{className:"border-t border-slate-100 my-1"}),e.jsx(ye,{onClick:()=>{o(!1),a()},title:"EAA / WAD accessibility statement (EU directives). Opens a form to enter org info, then generates Markdown or HTML for your site. EAA enforceable since 28 June 2025.",children:"EAA / WAD statement 🇪🇺"})]})]})]})}function ye({onClick:t,title:s,children:a}){return e.jsx("button",{type:"button",role:"menuitem",onClick:t,title:s,className:"block w-full text-left text-xs px-3 py-1 hover:bg-slate-100",children:a})}const Ki="2024-07-25",zi="Based on the W3C WCAG 3 Working Draft published 2024-07-25. Outcomes may shift before WCAG 3.0 reaches Recommendation; treat this view as a directional preview, not a conformance claim.",ka=[{id:"text-alternatives",category:"perceive",title:"Non-text content has a text alternative",description:"Images, icons, audio, and video have descriptive text alternatives so users who cannot perceive the original modality still get the meaning.",wcag2Criteria:["1.1.1","1.2.1","1.2.2","1.2.3","1.2.4","1.2.5"]},{id:"visual-distinction",category:"perceive",title:"Visual content is distinguishable",description:"Foreground content has sufficient contrast from background, both for text (APCA Lc thresholds in 3.0) and for non-text UI elements.",wcag2Criteria:["1.4.3","1.4.6","1.4.11"]},{id:"adaptable-presentation",category:"perceive",title:"Content adapts to user preferences",description:"Text spacing, zoom, reflow, and orientation respect user-agent and OS preferences without breaking layout or losing functionality.",wcag2Criteria:["1.3.4","1.4.4","1.4.10","1.4.12"]},{id:"meaningful-structure",category:"perceive",title:"Content structure is programmatically determinable",description:"Headings, lists, tables, regions, and other semantic structures are exposed in the accessibility tree so assistive technology can navigate them.",wcag2Criteria:["1.3.1","1.3.2","2.4.1","2.4.6"]},{id:"keyboard-operable",category:"operate",title:"All functionality is keyboard-operable",description:"Every interaction (including drag, pointer-gesture-driven, and complex widget interactions) has a keyboard equivalent that does not require timing or precision.",wcag2Criteria:["2.1.1","2.1.2","2.1.4","2.5.1","2.5.2","2.5.7"]},{id:"focus-management",category:"operate",title:"Focus is visible, ordered, and never obscured",description:"Keyboard focus is visually distinct, moves in a sensible order, never moves unexpectedly, and is never hidden by sticky headers or modals.",wcag2Criteria:["2.4.3","2.4.7","2.4.11","2.4.12"]},{id:"enough-time",category:"operate",title:"Users have enough time to complete tasks",description:"Time limits are adjustable, pauseable, or absent. Moving / blinking content can be paused. No content flashes more than three times per second.",wcag2Criteria:["2.2.1","2.2.2","2.3.1"]},{id:"navigable-content",category:"operate",title:"Content is navigable",description:"Pages have titles, link text describes the destination, multiple ways exist to find content, and skip-links bypass repeated blocks.",wcag2Criteria:["2.4.2","2.4.4","2.4.5"]},{id:"target-size",category:"operate",title:"Pointer targets are sufficiently sized",description:"Interactive targets are large enough to operate without precision-tap difficulty. Drag operations have a single-pointer alternative.",wcag2Criteria:["2.5.8","2.5.7"]},{id:"language-of-content",category:"understand",title:"Language of content is identified",description:"Page and language-of-parts are programmatically determinable so text-to-speech and other AT can pronounce content correctly.",wcag2Criteria:["3.1.1","3.1.2"]},{id:"predictable-behavior",category:"understand",title:"UI behavior is predictable",description:"Focusing or selecting an element does not cause unexpected context changes. Navigation and identification of repeated components is consistent across pages.",wcag2Criteria:["3.2.1","3.2.2","3.2.3","3.2.4","3.2.6"]},{id:"input-assistance",category:"understand",title:"Forms help users avoid and correct errors",description:"Required fields are labeled, errors are identified clearly, suggestions are offered when possible, and legal / financial forms have prevention mechanisms.",wcag2Criteria:["3.3.1","3.3.2","3.3.3","3.3.4","3.3.7"]},{id:"accessible-auth",category:"understand",title:"Authentication does not require cognitive function tests",description:"Login flows do not depend on memorizing characters, transcribing puzzles, or other cognitive function tests with no accessible alternative.",wcag2Criteria:["3.3.8","3.3.9"]},{id:"name-role-value",category:"robust",title:"UI components expose name, role, and value",description:"Every interactive element has a programmatically determinable name, role, and current state. Status messages reach assistive technology without focus changes.",wcag2Criteria:["4.1.2","4.1.3"]}];new Set(ka.flatMap(t=>t.wcag2Criteria));function qi(t,s){return ka.map(a=>{const n=a.wcag2Criteria.filter(l=>t.has(l)),r=a.wcag2Criteria.some(l=>s.has(l));let o;return n.length>0?o="has-violations":r?o="clean":o="not-evaluated",{outcome:a,violatedCriteria:n,status:o}})}const Qi={perceive:"Perceive",operate:"Operate",understand:"Understand",robust:"Robust"};function Sa(){const t=y(c=>c.results),s=y(c=>c.acknowledgedKeys),a=y(c=>c.dismissedKeys);if(t.length===0)return e.jsxs("div",{className:"p-3 space-y-2 text-xs","data-testid":"wcag3-view-root",children:[e.jsx("h2",{className:"text-sm font-semibold",children:"WCAG 3 readiness preview"}),e.jsx("p",{className:"text-slate-600 leading-snug",children:"Run an audit first. This view re-projects the audit's WCAG 2.x findings onto the WCAG 3 outcome structure."})]});const n=new Set,r=new Set;for(const c of t){for(const h of c.violations){if(h.needsReview){r.add(h.wcagCriterion);continue}if(s.has(h.matchKey)){r.add(h.wcagCriterion);continue}if(a.has(`violation::${h.matchKey}`)){r.add(h.wcagCriterion);continue}n.add(h.wcagCriterion),r.add(h.wcagCriterion)}const u=c.axeRulesEvaluated;if(u){for(const h of u.passed)r.add(h.wcagCriterion);for(const h of u.inapplicable)r.add(h.wcagCriterion);for(const h of u.incomplete)r.add(h.wcagCriterion)}}const o=qi(n,r),l=new Map;for(const c of o){const u=l.get(c.outcome.category)??[];u.push(c),l.set(c.outcome.category,u)}const i=o.filter(c=>c.status==="clean").length,d=o.filter(c=>c.status==="has-violations").length,p=o.filter(c=>c.status==="not-evaluated").length;return e.jsxs("div",{className:"p-3 space-y-3 text-xs","data-testid":"wcag3-view-root",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"WCAG 3 readiness preview"}),e.jsx("p",{className:"text-[11px] text-slate-500 leading-snug mt-1",children:"Re-projects this audit's WCAG 2.x findings onto the WCAG 3 outcome structure."}),e.jsxs("p",{className:"text-[10px] text-amber-800 bg-amber-50 border border-amber-200 rounded px-2 py-1 mt-2",role:"status","data-testid":"wcag3-source-badge",children:["⚠ Preview based on WCAG 3 Working Draft ",e.jsx("strong",{children:Ki}),"."," ",zi]})]}),e.jsxs("div",{className:"flex gap-2 text-[11px]",children:[e.jsxs("span",{className:"px-2 py-1 rounded bg-emerald-100 text-emerald-800",children:[i," clean"]}),e.jsxs("span",{className:"px-2 py-1 rounded bg-rose-100 text-rose-900",children:[d," with violations"]}),e.jsxs("span",{className:"px-2 py-1 rounded bg-slate-100 text-slate-700",children:[p," not evaluated"]})]}),["perceive","operate","understand","robust"].map(c=>{const u=l.get(c)??[];return e.jsxs("section",{className:"border border-slate-200 rounded bg-white","data-testid":`wcag3-category-${c}`,children:[e.jsxs("h3",{className:"px-3 py-2 text-xs font-semibold uppercase tracking-wide text-slate-500 border-b border-slate-100",children:[Qi[c]," · ",u.length]}),e.jsx("ul",{className:"divide-y divide-slate-100",children:u.map(h=>e.jsxs("li",{className:"px-3 py-2",children:[e.jsxs("div",{className:"flex items-baseline gap-2 mb-1",children:[e.jsx(Yi,{status:h.status}),e.jsx("strong",{className:"text-xs",children:h.outcome.title})]}),e.jsx("p",{className:"text-[11px] text-slate-600 leading-snug",children:h.outcome.description}),e.jsxs("p",{className:"text-[10px] text-slate-500 mt-1 font-mono",children:["WCAG 2: ",h.outcome.wcag2Criteria.join(", ")]}),h.violatedCriteria.length>0&&e.jsxs("p",{className:"text-[11px] text-rose-700 mt-1",children:["Violated: ",e.jsx("strong",{children:h.violatedCriteria.join(", ")})]})]},h.outcome.id))})]},c)})]})}function Yi({status:t}){return t==="clean"?e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-emerald-100 text-emerald-800",children:"✓ clean"}):t==="has-violations"?e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-rose-100 text-rose-900",children:"✗ violations"}):e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-slate-100 text-slate-600",children:"— not evaluated"})}const Ji=[{id:"overview",label:"Overview",hint:"Verification areas + WCAG coverage + evidence layers"},{id:"per-area",label:"Per-area",hint:"Drill into the 9 verification areas"},{id:"violations",label:"Violations",hint:"Flat list of every unique finding"},{id:"activity",label:"Activity",hint:"Live regions · focus events · tab/reading order"},{id:"delta",label:"Delta",hint:"Compared to the last accepted baseline"},{id:"wcag3",label:"WCAG 3",hint:"Forward-looking projection on the WCAG 3 outcome map"}],Xi={A:"bg-emerald-500 text-white",B:"bg-lime-500 text-white",C:"bg-amber-500 text-slate-900",D:"bg-orange-500 text-white",F:"bg-rose-600 text-white"};function Zi(){const t=y(u=>u.results),s=y(u=>u.componentId),a=y(u=>u.findingsLens),n=y(u=>u.setFindingsLens),r=y(u=>u.setView),o=y(u=>u.status),[l,i]=m.useState({});m.useEffect(()=>{if(!s)return;let u=!1;return(async()=>{const h=await Ie(s),x=await Le([s]);if(u)return;const b=new Set(x.map(N=>N.criterionId)),w={};for(const N of h){const E=b.has(N.criterionId)?"pass":N.verdict;N.criterionId==="2.4.3"?w.focusOrder=E:N.criterionId==="2.1.2"?w.keyboardTrap=E:N.criterionId==="2.4.7"?w.focusVisible=E:N.criterionId==="1.3.2"?w.readingOrder=E:N.criterionId==="1.4.11"&&(w.nonTextContrast=E)}i(w)})(),()=>{u=!0}},[s]);const d=es(t),[p,c]=m.useState([]);return m.useEffect(()=>{if(!s){c([]);return}let u=!1;return chrome.storage.local.get("igtRuns").then(h=>{if(u)return;const b=((h==null?void 0:h.igtRuns)??{})[s]??{};c(Object.values(b))}),()=>{u=!0}},[s]),t.length===0?e.jsxs("div",{className:"p-4",children:[e.jsx(Os,{setView:r}),e.jsx("div",{className:"mt-6 text-center text-sm text-slate-600",children:e.jsx("p",{children:o==="running"?"Audit in progress. Findings appear here when the matrix completes.":o==="failed"||o==="interrupted"?"Last audit didn't complete. Re-run the scan from the controls above.":"No audit results yet. Run a scan from the controls above."})})]}):e.jsxs("div",{className:"p-3 space-y-3",children:[e.jsx(Os,{setView:r}),e.jsx(to,{results:t,interactiveVerdicts:l,manualRuns:p,aiResolvedFails:d}),e.jsx(eo,{results:t}),e.jsx(so,{lens:a,setLens:n}),e.jsx(ao,{lens:a,results:t,componentId:s,interactiveVerdicts:l,aiResolvedFails:d})]})}function Os({setView:t}){return e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("button",{type:"button",onClick:()=>t("matrix"),className:"text-xs text-slate-600 hover:text-slate-900 hover:underline font-mono px-0.5",children:"← Dashboard"}),e.jsx("span",{className:"text-[11px] font-mono uppercase tracking-widest text-slate-400",children:"findings"})]})}function eo({results:t}){const s=y(p=>p.crawlNavContext),a=y(p=>p.setCrawlNavContext),n=y(p=>p.setView);if(t.length===0)return null;const r=new Set(t.map(p=>p.pageUrl??p.scope??"").filter(Boolean)),o=r.size>1,l=o?null:Array.from(r)[0]??"(unknown)",i=(s==null?void 0:s.mode)==="page";function d(){a(null),n("crawl")}return e.jsxs("div",{className:`border rounded-lg px-3 py-2 text-[11px] leading-snug ${o?"border-blue-200 bg-blue-50 text-blue-900":i?"border-amber-200 bg-amber-50 text-amber-900":"border-slate-200 bg-slate-50 text-slate-700"}`,role:"note","aria-label":"Audit scope",children:[i&&e.jsx("button",{type:"button",onClick:()=>d(),className:"float-right text-[10px] font-semibold px-2 py-0.5 rounded border border-amber-400 bg-white text-amber-900 hover:bg-amber-100",children:"← Back to crawl report"}),o?e.jsxs(e.Fragment,{children:[e.jsxs("strong",{children:["Site crawl · ",r.size," pages."]})," ","This grade reflects the site overall, not any individual page. Per-page drilldown is available in the Crawl tab."]}):i?e.jsxs(e.Fragment,{children:[e.jsxs("strong",{children:["One page from site crawl · ",l,"."]})," ",'This is the full per-page audit data for this URL — same lenses as a fresh single-page audit. Use the "Back to crawl report" button to return to the do-the-work report covering all crawled pages.']}):e.jsxs(e.Fragment,{children:[e.jsxs("strong",{children:["Single-page audit · ",l,"."]})," ","This grade reflects this page only. Multi-page criteria (3.2.3 Consistent Navigation, 3.2.4 Consistent Identification, 3.2.6 Consistent Help) are treated as N/A here — run a"," ",e.jsx("strong",{children:"Site Crawl"})," to evaluate them for the whole site."]})]})}function to({results:t,interactiveVerdicts:s,manualRuns:a,aiResolvedFails:n}){var b,w,N,E;const r=t.flatMap(I=>I.violations),o=y(I=>I.lastAuditWallClockMs),l=y(I=>I.acknowledgedKeys),i=y(I=>I.dismissedKeys),p=Ht({violations:r,auditRan:!0,manualRuns:a,workflows:fe,heuristicCounts:{tabOrder:((w=(b=t[0])==null?void 0:b.tabOrderIssues)==null?void 0:w.length)??0,readingOrder:((E=(N=t[0])==null?void 0:N.readingOrderIssues)==null?void 0:E.length)??0},interactiveAuditVerdicts:s,aiResolvedFails:n.map(I=>({ruleId:I.ruleId,impact:"serious",selector:I.selector}))}).overallLetter,c=xa(r,n,l,i),u=yr(r,n,l,i),h=t.length,x=o??t.reduce((I,C)=>I+C.durationMs,0);return e.jsx("section",{className:"sticky top-0 z-10 border border-slate-200 rounded-lg bg-white overflow-hidden shadow-sm","aria-label":"Audit grade summary",children:e.jsxs("div",{className:"flex items-stretch",children:[e.jsx("div",{className:`flex items-center justify-center w-20 shrink-0 ${Xi[p]}`,children:e.jsx("span",{className:"text-4xl font-display font-semibold leading-none tracking-tight",children:p})}),e.jsxs("div",{className:"flex-1 px-3.5 py-3",children:[e.jsx("p",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500",children:"overall grade · 9 verification areas"}),e.jsx("p",{className:"text-sm font-medium text-slate-900 mt-0.5",children:c===0?"No issues found by automation":`Fix ${c} element${c===1?"":"s"}`}),c>0&&u.length>0&&e.jsxs("p",{className:"text-[11px] text-slate-600 leading-snug mt-0.5",children:["across ",u.length," WCAG criterion",u.length===1?"":"a"," (",u.join(", "),")"]}),e.jsxs("p",{className:"text-[11px] text-slate-500 leading-snug mt-0.5",children:[h," state",h===1?"":"s"," tested · ",(x/1e3).toFixed(1),"s"]})]})]})})}function so({lens:t,setLens:s}){return e.jsx("nav",{className:"flex flex-wrap gap-1 border-b border-slate-200 pb-1.5",role:"tablist","aria-label":"Findings lens",children:Ji.map(a=>{const n=t===a.id;return e.jsx("button",{type:"button",role:"tab","aria-selected":n,onClick:()=>s(a.id),title:a.hint,className:n?"text-[11px] font-medium tracking-tight px-2.5 py-1 rounded-md bg-slate-900 text-white":"text-[11px] font-medium tracking-tight px-2.5 py-1 rounded-md text-slate-600 hover:bg-slate-100",children:a.label},a.id)})})}function ao({lens:t,results:s,componentId:a,interactiveVerdicts:n,aiResolvedFails:r}){var o,l;return t==="overview"?e.jsxs("div",{className:"space-y-3",children:[e.jsx(no,{componentId:a,results:s}),e.jsx(lo,{componentId:a}),e.jsx(Ir,{violations:s.flatMap(i=>i.violations),componentId:a,hideOverallHeader:!0}),e.jsx(mo,{pageUrl:((o=s[0])==null?void 0:o.pageUrl)??((l=s[0])==null?void 0:l.scope)??""}),e.jsx(co,{})]}):t==="per-area"?e.jsx(pi,{results:s,interactiveVerdicts:n,aiResolvedFails:r}):t==="violations"?e.jsx(po,{results:s}):t==="activity"?e.jsx("div",{className:"-mx-3",children:e.jsx(ya,{})}):t==="delta"?e.jsx("div",{className:"-mx-3",children:e.jsx(Na,{})}):t==="wcag3"?e.jsx("div",{className:"-mx-3",children:e.jsx(Sa,{})}):null}const gt={critical:0,serious:1,moderate:2,minor:3};function Mt(t){return`${Ue(t.ruleId,t.target.selector)}::${t.target.outerHTML.slice(0,64)}`}function no({componentId:t,results:s}){var b,w;const a=y(N=>N.setFindingsLens),[n,r]=m.useState({}),[o,l]=m.useState({}),[i,d]=m.useState(0);m.useEffect(()=>{let N=!1;return(async()=>{if(!t){r({}),l({});return}const E=await Ie(t);if(N)return;const I={};for(const j of E)I[j.criterionId]=j;r(I);const C=await Le([t]);if(N)return;const f={};for(const j of C)f[`${j.criterionId}::${j.pageUrl}`]=j;l(f)})(),()=>{N=!0}},[t,i]);const p=((b=s[0])==null?void 0:b.pageUrl)??((w=s[0])==null?void 0:w.scope)??"",c=ot.map(N=>({crit:N,record:n[N.id]??null})).filter(({record:N})=>N&&(N.verdict==="fail"||N.verdict==="uncertain")).filter(({crit:N})=>!o[`${N.id}::${p}`]),u=new Set,h=[];for(const N of s)for(const E of N.violations){if(E.needsReview)continue;const I=Ue(E.ruleId,E.target.selector);u.has(I)||(u.add(I),h.push(E))}h.sort((N,E)=>(gt[N.impact]??99)-(gt[E.impact]??99));const x=c.length+h.length;return x===0?e.jsxs("section",{className:"border border-emerald-200 bg-emerald-50 rounded-lg p-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-base",children:"✓"}),e.jsx("p",{className:"text-sm font-semibold text-emerald-900",children:"Nothing needs your attention on this page."})]}),e.jsx("p",{className:"text-[11px] text-emerald-800 mt-1 leading-snug",children:"No axe violations, no AI walkthrough fails, no uncertain findings. The sub-grades and WCAG coverage below are informational — you've done the work here. Move on to the next page or export your defense bundle."})]}):e.jsxs("section",{className:"border border-rose-200 rounded-lg bg-white overflow-hidden",children:[e.jsxs("header",{className:"px-3 py-2 bg-rose-50 border-b border-rose-200",children:[e.jsxs("p",{className:"text-sm font-semibold text-rose-900",children:[x," item",x===1?"":"s"," need",x===1?"s":""," your attention"]}),e.jsx("p",{className:"text-[11px] text-rose-800 mt-0.5 leading-snug",children:"Each row below is one thing to fix or sign off on. Use the inline buttons — you don't need to leave this view."})]}),e.jsxs("ul",{className:"divide-y divide-slate-100",children:[c.map(({crit:N,record:E})=>e.jsx(ro,{componentId:t??"",pageUrl:p,criterionId:N.id,label:N.label,blurb:N.blurb,record:E,onChanged:()=>d(I=>I+1)},`wt::${N.id}`)),h.map(N=>e.jsx(io,{violation:N,onOpen:()=>a("violations")},`axe::${Mt(N)}`))]})]})}function ro({componentId:t,pageUrl:s,criterionId:a,label:n,blurb:r,record:o,onChanged:l}){const[i,d]=m.useState(!1),[p,c]=m.useState(""),[u,h]=m.useState(!1),[x,b]=m.useState(null),[w,N]=m.useState(!1),[E,I]=m.useState(!1),C=o.verdict,f=C==="fail"?"bg-rose-200 text-rose-900":"bg-amber-200 text-amber-900";async function j(){h(!0),b(null);try{if(!p.trim()){b("Note is required — explain how you manually verified this."),h(!1);return}await zt({componentId:t,criterionId:a,pageUrl:s,note:p.trim(),acknowledgedAt:new Date().toISOString(),verdictAtAck:C}),l()}catch(v){b(v instanceof Error?v.message:String(v))}finally{h(!1)}}async function g(){var v;I(!0),b(null);try{const k=(v=(await chrome.tabs.query({active:!0,currentWindow:!0}))[0])==null?void 0:v.id;if(!k){b("No active tab — open the audited page first."),I(!1);return}const V=await ae({type:"INTERACTIVE_AUDIT_REQUEST",criterionId:a,tabId:k,componentId:t,pageUrl:s});V.ok||b(V.error??"Re-run failed."),l()}catch(S){b(S instanceof Error?S.message:String(S))}finally{I(!1)}}return e.jsxs("li",{className:"px-3 py-2.5 space-y-1.5",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:`shrink-0 inline-flex items-center justify-center font-mono text-[10px] font-bold rounded px-1.5 py-0.5 uppercase ${f}`,children:C}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("p",{className:"text-xs font-medium text-slate-900",children:[e.jsx("span",{className:"font-mono text-[11px] text-slate-500 mr-1.5",children:a}),n]}),e.jsx("p",{className:"text-[11px] text-slate-600 mt-0.5 leading-snug",children:C==="fail"?"AI walkthrough flagged a failure here. Fix the page and re-run, or verify manually and acknowledge.":"AI walkthrough couldn't decide. Fix the underlying ambiguity, or verify manually and acknowledge."})]})]}),e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[e.jsx("button",{type:"button",onClick:()=>N(v=>!v),className:"text-[10px] px-2 py-0.5 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50",children:w?"Hide AI reasoning":"Show AI reasoning"}),e.jsx("button",{type:"button",onClick:()=>void g(),disabled:E,className:"text-[10px] px-2 py-0.5 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50 disabled:opacity-50",title:"Re-run AI walkthrough after fixing the page (will switch to the active tab)",children:E?"Re-running…":"Re-run after fix"}),e.jsx("button",{type:"button",onClick:()=>{d(v=>!v),b(null)},className:"text-[10px] px-2 py-0.5 border border-emerald-400 bg-white text-emerald-700 rounded hover:bg-emerald-50 font-medium",children:"Mark verified manually"})]}),w&&e.jsxs("div",{className:"bg-slate-50 border border-slate-200 rounded p-2 mt-1",children:[e.jsx("p",{className:"text-[10px] text-slate-500 mb-1 font-mono uppercase tracking-wide",children:"What the walkthrough does"}),e.jsx("p",{className:"text-[11px] text-slate-700 leading-snug mb-2",children:r}),e.jsx("p",{className:"text-[10px] text-slate-500 mb-1 font-mono uppercase tracking-wide",children:"AI reasoning"}),e.jsx("p",{className:"text-[11px] text-slate-700 leading-snug whitespace-pre-wrap font-mono",children:o.reasoning})]}),i&&e.jsxs("div",{className:"bg-emerald-50 border border-emerald-300 rounded p-2 space-y-1.5 mt-1",children:[e.jsx("label",{className:"text-[11px] font-semibold text-emerald-900 block",children:"How did you verify? (required, goes into the forensic record)"}),e.jsx("textarea",{value:p,onChange:v=>c(v.target.value),placeholder:"e.g., Tested with VoiceOver on Safari — focus order matches visual order, all interactive elements reachable.",className:"w-full text-[11px] px-2 py-1 border border-emerald-300 rounded resize-y min-h-[60px]",autoFocus:!0}),x&&e.jsx("p",{className:"text-[10px] text-rose-700",children:x}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("button",{type:"button",onClick:()=>void j(),disabled:u,className:"text-[11px] px-2 py-1 bg-emerald-600 text-white rounded hover:bg-emerald-700 disabled:opacity-50 font-medium",children:u?"Saving…":"Confirm verification"}),e.jsx("button",{type:"button",onClick:()=>{d(!1),c(""),b(null)},disabled:u,className:"text-[11px] px-2 py-1 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50 disabled:opacity-50",children:"Cancel"})]})]}),x&&!i&&e.jsx("p",{className:"text-[10px] text-rose-700",children:x})]})}function io({violation:t,onOpen:s}){const a=t.impact==="critical"?"bg-rose-200 text-rose-900":t.impact==="serious"?"bg-orange-200 text-orange-900":t.impact==="moderate"?"bg-amber-200 text-amber-900":"bg-slate-200 text-slate-700";return e.jsxs("li",{className:"px-3 py-2.5 space-y-1.5",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:`shrink-0 inline-flex items-center justify-center font-mono text-[10px] font-bold rounded px-1.5 py-0.5 uppercase ${a}`,children:t.impact}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("p",{className:"text-xs font-medium text-slate-900",children:[e.jsx("span",{className:"font-mono text-[11px] text-slate-500 mr-1.5",children:t.wcagCriterion||"wcag"}),e.jsx("code",{className:"text-[11px] text-slate-700 bg-slate-100 px-1 rounded",children:t.ruleId})]}),e.jsx("p",{className:"text-[11px] text-slate-600 mt-0.5 leading-snug",children:t.description}),e.jsx("p",{className:"text-[10px] text-slate-500 mt-0.5 font-mono break-all",children:t.target.selector})]})]}),e.jsx("div",{className:"flex items-center gap-1.5",children:e.jsx("button",{type:"button",onClick:s,className:"text-[10px] px-2 py-0.5 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50",children:"Open in Violations →"})})]})}const ot=[{id:"2.4.3",label:"Focus order",blurb:"AI walks Tab/Shift+Tab and judges screenshot-by-screenshot whether focus reaches every interactive element."},{id:"2.1.2",label:"No keyboard trap",blurb:"AI Tab-cycles forward then Shift+Tab back; verifies every focusable can be left."},{id:"2.4.7",label:"Focus visible",blurb:"AI inspects each focus-state screenshot for a visible indicator (outline/ring/underline)."},{id:"1.3.2",label:"Meaningful sequence",blurb:"AI vision over the page screenshot judges whether DOM-flagged divergences are real reading-order breaks or layout artifacts."},{id:"1.4.11",label:"Non-text contrast",blurb:"AI vision evaluates UI controls + state indicators for adequate contrast against their adjacent colors."},{id:"2.5.3",label:"Label in Name",blurb:"DOM walker collects {visibleText, accessibleName} pairs across every interactive control; AI judges ambiguous cases (icons, plurals, smart-quotes)."}],oo={pass:"bg-emerald-500 text-white",fail:"bg-rose-600 text-white",uncertain:"bg-amber-500 text-slate-900"};function lo({componentId:t}){const[s,a]=m.useState({}),[n,r]=m.useState({});m.useEffect(()=>{let u=!1;return(async()=>{if(!t){a({}),r({});return}const[h,x]=await Promise.all([Ie(t),Le([t])]);if(u)return;const b={};for(const N of h)b[N.criterionId]=N;a(b);const w={};for(const N of x)w[N.criterionId]=N;r(w)})(),()=>{u=!0}},[t]);const o={};for(const[u,h]of Object.entries(s))o[u]=n[u]?"pass":h.verdict;const l=Object.values(o).length,i=Object.values(o).filter(u=>u==="pass").length,d=Object.values(o).filter(u=>u==="fail").length,p=Object.values(o).filter(u=>u==="uncertain").length,c=Object.keys(n).length;return e.jsxs("section",{className:"border border-slate-200 rounded-lg bg-white overflow-hidden",children:[e.jsxs("header",{className:"px-3 py-2 border-b border-slate-100 flex items-baseline gap-2",children:[e.jsx("h3",{className:"text-xs font-semibold text-slate-900",children:"AI verified"}),e.jsx("p",{className:"text-[11px] font-mono text-slate-500",children:l===0?`not configured · all ${ot.length} criteria pending human verification`:`${l}/${ot.length} · ${i} pass · ${d} fail · ${p} uncertain${c>0?` · ${c} human-verified`:""}`})]}),l===0?e.jsxs("div",{className:"px-3 py-2.5 text-[11px] text-slate-600 leading-snug",children:["When an Anthropic API key is set in ",e.jsx("strong",{children:"Settings → AI"}),', these 5 criteria run automatically after every audit — replacing manual keyboard and vision checks. Without a key, they show as "pending human verification" in the Evidence layers below.']}):e.jsx("ul",{className:"divide-y divide-slate-100",children:ot.map(u=>{const h=s[u.id],x=n[u.id],b=h==null?void 0:h.verdict,w=x?"pass":b,N=h?_t(h.reasoning):!1,E=h?ta(h.reasoning):!1,I=h?Dt(h.reasoning):null;return e.jsxs("li",{className:"px-3 py-2 flex items-start gap-2.5",children:[e.jsx("span",{className:`shrink-0 inline-flex items-center justify-center font-mono text-[10px] font-medium rounded px-1.5 py-0.5 ${x?"bg-emerald-500 text-white":w?oo[w]:"bg-slate-200 text-slate-500"}`,title:x?`Human verified at ${new Date(x.acknowledgedAt).toLocaleString()} — note: "${x.note}". (AI verdict was: ${b})`:w?`AI verdict: ${w}${I?` (cascade ${I})`:""}`:"AI did not produce a verdict on this criterion",children:x?"✓ verified":w||"not run"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("p",{className:"text-xs font-medium text-slate-900",children:[e.jsx("span",{className:"font-mono text-[11px] text-slate-500 mr-1.5",children:u.id}),u.label,E&&e.jsx("span",{className:"ml-2 text-[10px] text-slate-500 font-normal",children:"· manual override"})]}),e.jsx("p",{className:"text-[11px] text-slate-500 leading-snug mt-0.5",children:u.blurb}),N&&!E&&!x&&h&&e.jsxs("div",{className:"mt-1.5 bg-amber-50 border border-amber-300 rounded p-2 space-y-1.5",children:[e.jsx("p",{className:"text-[10px] text-amber-900 font-medium",children:"AI cascade flagged this — fix the issue and re-audit."}),e.jsxs("details",{className:"text-[10px] text-amber-900",children:[e.jsx("summary",{className:"cursor-pointer hover:underline select-none font-medium",children:"What AI saw (click to expand)"}),e.jsx("p",{className:"mt-1 leading-snug whitespace-pre-wrap font-mono text-[10px] text-amber-900 max-h-32 overflow-y-auto bg-white/50 p-1.5 rounded",children:h.reasoning})]})]}),x&&e.jsxs("div",{className:"mt-1.5 bg-emerald-50 border border-emerald-300 rounded p-2",children:[e.jsxs("p",{className:"text-[10px] text-emerald-900",children:[e.jsx("strong",{children:"Human verified:"})," ",x.note]}),e.jsxs("p",{className:"text-[10px] text-emerald-700 mt-0.5",children:["Recorded ",new Date(x.acknowledgedAt).toLocaleString(),". Original AI verdict: ",b,"."]})]})]})]},u.id)})})]})}function co(){return e.jsxs("div",{className:"border-t border-slate-200 pt-3 space-y-1.5",children:[e.jsx("h3",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500 px-0.5",children:"how to read this"}),e.jsx(Re,{title:"The overall grade",body:'Count-based aggregation of the 9 verification areas (rc.110). The headline letter is the worst sub-grade letter you have N of — one C drops the overall off A regardless of how clean the other 8 areas look. This keeps a single bad area from hiding behind a high arithmetic mean. It is separate from "WCAG 2.1 AA Status," which is the legal-conformance answer (binary: conformant or not). The grade can be A while AA Status says "Not conformant" if there are unresolved criterion-level items — those are different questions and both are reported.'}),e.jsx(Re,{title:"WCAG 2.1 AA Status",body:"Separate from the letter grade. Says whether you can claim WCAG 2.1 AA conformance. It is binary: Conformant or Not conformant. When Not conformant, the breakdown shows how many criteria are failing (real axe/AI violations) and how many are inconclusive (items that need user disposition). Fix or mark verified to flip to Conformant."}),e.jsx(Re,{title:"Verification areas",body:`Nine categories grouped by lawsuit-mill priority. Each gets its own letter so a single bad area can't hide behind a high overall mean. Areas below A show "verify with X →" — but when an AI walkthrough has already produced a verdict for that criterion, the prompt is suppressed automatically.`}),e.jsx(Re,{title:"AI does most of the human work",body:"Six AI walkthroughs auto-run when an Anthropic API key is configured: 2.4.3 Focus Order, 2.1.2 No Keyboard Trap, 2.4.7 Focus Visible, 1.3.2 Meaningful Sequence, 1.4.11 Non-text Contrast, 2.5.3 Label in Name. They drive real keyboard input + take screenshots + judge them with vision (and parse DOM accessible-name vs visible-text for 2.5.3) — exactly the work IGT manual workflows used to require. Their verdicts feed the Tab order / Keyboard / Reading order / Color & contrast / Forms sub-grades automatically. When AI returns a definitive pass or fail for an area, the heuristic findings for that area become supporting evidence rather than independent severity (rc.227). Humans only spot-check + attest before signing the formal report."}),e.jsx(Re,{title:"Fix recipes",body:'Every finding includes specific remediation instructions in the AI fix prompt export (Delta lens → Export menu). The prompt also includes false-positive guidance (skip-links, multi-column layouts, portal-rendered modals) so AI can ask before "fixing" intentional patterns.'}),e.jsx(Re,{title:"WCAG 2.1 AA coverage",body:"Of 50 applicable Level AA criteria, how many have a definite verdict from any layer (automation, AI, or human). Untested criteria don't cap your grade — automation did everything it could — but for a formal conformance claim, those still need explicit evaluation. Run a Site Crawl or open Compliance to fill the gaps."}),e.jsx(Re,{title:"Path to full compliance",body:"The shortest sequence of actions: fix automated violations, let AI walkthroughs auto-resolve the keyboard/vision criteria, optionally spot-check via Compliance → Sign and seal. Export the AI fix prompt from the Delta lens for code-level walkthroughs of each issue."})]})}function Re({title:t,body:s}){return e.jsxs("details",{className:"border border-slate-200 rounded bg-slate-50",children:[e.jsx("summary",{className:"px-2.5 py-1.5 text-[12px] font-medium text-slate-800 cursor-pointer hover:bg-slate-100 rounded",children:t}),e.jsx("p",{className:"px-2.5 pb-2 text-[11px] text-slate-700 leading-snug",children:s})]})}function uo({componentId:t,records:s,stateCount:a}){const[n,r]=m.useState(0),[o,l]=m.useState({});return m.useEffect(()=>{if(!t){l({});return}let i=!1;return Le([t]).then(d=>{if(i)return;const p={};for(const c of d)p[c.criterionId]=c;l(p)}),()=>{i=!0}},[t,n]),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("p",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500 px-0.5",children:[s.length," AI walkthrough finding",s.length===1?"":"s"," · axe found none"]}),e.jsxs("p",{className:"text-[11px] text-slate-600 px-0.5 leading-snug",children:["axe-core ran clean across ",a," state",a===1?"":"s",", but AI walkthroughs flagged something axe can't detect. Use the inline buttons on each row — no need to navigate elsewhere."]}),s.map(i=>e.jsx("div",{className:"border border-slate-200 rounded bg-white p-2",children:e.jsx(ts,{componentId:t??"",pageUrl:i.pageUrl,criterionId:i.criterionId,record:i,onChanged:()=>r(d=>d+1),ack:o[i.criterionId]??null})},i.criterionId))]})}function po({results:t}){const s=y(i=>i.dismissedKeys),a=y(i=>i.componentId),n=new Set,r=[];for(const i of t)for(const d of i.violations){if(s.has(`violation::${d.matchKey}`))continue;const p=Mt(d);n.has(p)||(n.add(p),r.push(d))}r.sort((i,d)=>{const p=gt[i.impact]??99,c=gt[d.impact]??99;return p-c});const[o,l]=m.useState([]);return m.useEffect(()=>{if(!a){l([]);return}let i=!1;return Ie(a).then(d=>{i||l(d.filter(p=>p.verdict!=="pass"))}),()=>{i=!0}},[a]),r.length===0&&o.length===0?e.jsxs("div",{className:"text-center text-sm text-slate-600 py-6",children:["No issues detected on this page — no axe violations and no AI walkthrough findings. The grade reflects sub-grading on areas that may have heuristic observations (visible under ",e.jsx("strong",{children:"Per-area"}),")."]}):r.length===0&&o.length>0?e.jsx(uo,{componentId:a,records:o,stateCount:t.length}):e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("p",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500 px-0.5",children:[r.length," unique violation",r.length===1?"":"s"," · sorted by impact"]}),r.map(i=>e.jsx(Ze,{violation:i},Mt(i)))]})}const ho={"deposition-packet":"Deposition packet · court-grade","defense-bundle":"Defense bundle · locally anchored","html-print":"HTML print · printable","ai-prompt":"AI fix prompt · markdown"};function mo({pageUrl:t}){const s=y(p=>p.tier),a=Bt(s),n=ft(s,"autoExportAuditReports"),[r,o]=m.useState(null),[l,i]=m.useState(null);if(m.useEffect(()=>{let p=!1;return(async()=>{const c=await na();if(p||o(c),t){const u=await Tn(t);p||i(u)}})(),()=>{p=!0}},[t]),a||!n||!r||!r.enabled)return null;const d=r.formats.length===1?ho[r.formats[0]].split(" · ")[0]:`${r.formats.length} formats`;return e.jsxs("div",{className:"border border-emerald-200 rounded-lg bg-emerald-50 p-2.5 space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("h3",{className:"text-[12px] font-semibold text-emerald-900",children:"✓ Remediation trail active"}),e.jsx("span",{className:"text-[10px] text-emerald-800 font-mono",children:d})]}),l?e.jsxs("p",{className:"text-[10px] text-emerald-800 leading-snug",children:["Last exported ",e.jsx("span",{className:"font-mono",children:new Date(l.exportedAt).toLocaleString()})," ","as ",e.jsx("span",{className:"font-mono",children:l.filename})]}):e.jsx("p",{className:"text-[10px] text-emerald-800 italic",children:"No audit has auto-exported on this page yet. Your next audit will download to Downloads automatically."})]})}const Pt="igtRuns";async function xo(t,s,a){const n=s[0];if(!n)return;const r=n.pageUrl;if(!r)return;const o=`Auto-dismissed by Guided test: "${a}" marked pass`;if(t==="tab-order"){const l=n.tabOrderIssues??[];if(l.length===0)return;await Xe(r,l.map(i=>({key:Je(i.selector),reason:o,snippet:`${i.selector} — ${i.textSnippet||"(no text)"}`})))}else if(t==="reading-order"){const l=n.readingOrderIssues??[];if(l.length===0)return;await Xe(r,l.map(i=>({key:Ye(i.selector),reason:o,snippet:`${i.selector} — ${i.textSnippet||"(no text)"}`})))}}const go={outline:{type:"OUTLINE_SHOW_REQUEST"},"tab-order":{type:"TAB_ORDER_SHOW_REQUEST"},"reading-order":{type:"READING_ORDER_SHOW_REQUEST"},targets:{type:"TARGET_SIZE_SHOW_REQUEST"},"fix-preview":{type:"FIX_PREVIEW_SHOW_REQUEST"}},fo={outline:{type:"OUTLINE_HIDE_REQUEST"},"tab-order":{type:"TAB_ORDER_HIDE_REQUEST"},"reading-order":{type:"READING_ORDER_HIDE_REQUEST"},targets:{type:"TARGET_SIZE_HIDE_REQUEST"},"fix-preview":{type:"FIX_PREVIEW_HIDE_REQUEST"}},bo={outline:"Outline","tab-order":"Tab order","reading-order":"Reading order",targets:"Targets","fix-preview":"Fix preview"};async function Fs(t,s){const a=await ue();if(!a)return;const n=s?go[t]:fo[t];try{await be(a,n)}catch{}}async function vo(){const s=(await chrome.storage.local.get(Pt))[Pt];return s&&typeof s=="object"?s:{}}async function Ms(t){await chrome.storage.local.set({[Pt]:t})}function yo(t,s){if(!t.relatedAxeRule||s.length===0)return null;const a=s.flatMap(n=>n.violations.filter(r=>r.ruleId===t.relatedAxeRule));if(a.length>0){const n=Array.from(new Set(a.map(r=>`${r.currentState.pseudoState}·${r.currentState.theme}·${r.currentState.direction}`)));return{kind:"flagged",ruleId:t.relatedAxeRule,violationCount:a.length,states:n}}return{kind:"clean",ruleId:t.relatedAxeRule,statesAudited:s.length}}function wo(){const t=y(c=>c.componentId),s=y(c=>c.results),[a,n]=m.useState({}),[r,o]=m.useState(null);if(m.useEffect(()=>{vo().then(n)},[]),!t)return e.jsx("div",{className:"p-4 text-center text-slate-500 text-sm",children:"Run an audit on a component first, then run guided tests against it. Results are per-component and persist across sessions."});const l=a[t]??{};function i(c,u,h){var b;const x={...a,[t]:{...l,[c]:{...l[c]??{componentId:t,workflowId:c,steps:{},completedAt:new Date().toISOString()},steps:{...((b=l[c])==null?void 0:b.steps)??{},[u]:h},completedAt:new Date().toISOString()}}};if(n(x),Ms(x),h.status==="pass"){const w=fe.find(E=>E.id===c),N=w==null?void 0:w.steps.find(E=>E.id===u);N!=null&&N.autoDismissActivity&&xo(N.autoDismissActivity,s,u)}}function d(c){if(typeof confirm=="function"&&!confirm("Clear all answers for this workflow?"))return;const u={...l};delete u[c];const h={...a,[t]:u};n(h),Ms(h)}const p=fe.find(c=>c.id===r);if(p){const c=l[p.id];return e.jsx(jo,{workflow:p,run:c,results:s,onAnswer:(u,h)=>i(p.id,u,h),onBack:()=>o(null)})}return e.jsxs("div",{className:"p-3 space-y-2",children:[e.jsx("p",{className:"text-xs text-slate-500 mb-2",children:"Guided manual checks for the accessibility concerns automation can't fully cover. Walk through each step, record pass/fail/skip, and the results persist per-component."}),fe.map(c=>{const u=l[c.id],h=u?nn(u,c):null,x=u?h!=null&&h.failed&&h.failed>0?"failed":h!=null&&h.unanswered&&h.unanswered>0?"in-progress":"done":"unstarted",b={unstarted:"border-slate-200 bg-white hover:bg-slate-50","in-progress":"border-amber-300 bg-amber-50 hover:bg-amber-100",failed:"border-rose-300 bg-rose-50 hover:bg-rose-100",done:"border-emerald-300 bg-emerald-50 hover:bg-emerald-100"}[x];return e.jsxs("button",{type:"button",onClick:()=>o(c.id),className:`w-full text-left border rounded p-2 block transition-colors ${b}`,children:[e.jsxs("div",{className:"flex items-start justify-between gap-2 mb-1",children:[e.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[e.jsx("span",{className:"font-medium text-xs",children:c.name}),x==="done"&&e.jsx("span",{className:"text-[10px] text-emerald-700",children:"✓"}),x==="in-progress"&&h&&e.jsxs("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-amber-200 text-amber-900 font-semibold",children:[h.unanswered," unanswered"]})]}),h&&e.jsxs("span",{className:"text-[10px] text-slate-600 shrink-0",children:[e.jsxs("span",{className:"text-emerald-700",children:[h.passed," pass"]}),h.failed>0&&e.jsxs("span",{className:"text-rose-700",children:[" · ",h.failed," fail"]}),h.notApplicable>0&&e.jsxs("span",{children:[" · ",h.notApplicable," N/A"]}),h.skipped>0&&e.jsxs("span",{children:[" · ",h.skipped," skip"]})," / ",h.total]})]}),e.jsx("p",{className:"text-[11px] text-slate-500",children:c.blurb}),u&&e.jsx("button",{type:"button",onClick:w=>{w.stopPropagation(),d(c.id)},className:"text-[11px] text-slate-500 hover:text-rose-600 mt-1",children:"Clear answers"})]},c.id)})]})}function jo({workflow:t,run:s,results:a,onAnswer:n,onBack:r}){const o=m.useMemo(()=>{const d={};for(const p of t.steps)d[p.id]=yo(p,a);return d},[t,a]);function l(){for(const d of t.steps){const p=o[d.id];(p==null?void 0:p.kind)==="clean"&&!(s!=null&&s.steps[d.id])&&n(d.id,{status:"pass",notes:`Auto-marked via axe-clean evidence (${p.ruleId}, ${p.statesAudited} states).`})}}const i=t.steps.filter(d=>{var p;return((p=o[d.id])==null?void 0:p.kind)==="clean"&&!(s!=null&&s.steps[d.id])}).length;return e.jsxs("div",{className:"p-3 space-y-3",children:[e.jsx("button",{type:"button",onClick:r,className:"text-xs text-brand-600 hover:underline",children:"← Back to workflows"}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:t.name}),e.jsx("p",{className:"text-xs text-slate-500 mt-1",children:t.blurb}),i>0&&e.jsxs("div",{className:"mt-2 flex items-center justify-between gap-2 border border-emerald-300 bg-emerald-50 rounded p-2",children:[e.jsxs("span",{className:"text-[11px] text-emerald-900",children:[i," step",i===1?"":"s"," have a matching axe rule that ran clean across the audit — you can mark them pass in one click and only do the genuinely manual checks."]}),e.jsxs("button",{type:"button",onClick:l,className:"text-[11px] px-2 py-1 bg-emerald-600 text-white rounded hover:bg-emerald-700 shrink-0",children:["Auto-mark ",i," →"]})]})]}),e.jsx("div",{className:"space-y-3",children:t.steps.map((d,p)=>{const c=s==null?void 0:s.steps[d.id];return e.jsxs("div",{className:`border rounded p-2 ${(c==null?void 0:c.status)==="pass"?"border-emerald-300 bg-emerald-50":(c==null?void 0:c.status)==="fail"?"border-rose-300 bg-rose-50":(c==null?void 0:c.status)==="skip"?"border-slate-200 bg-slate-50":"border-slate-200 bg-white"}`,children:[e.jsxs("div",{className:"flex items-start justify-between gap-2 mb-1",children:[e.jsxs("span",{className:"text-[11px] text-slate-500 font-mono",children:[p+1,"/",t.steps.length]}),e.jsxs("div",{className:"flex items-center gap-1",children:[d.severity==="required"&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-rose-100 text-rose-700 rounded",children:"required"}),d.wcag&&e.jsxs("span",{className:"text-[10px] text-slate-500",children:["WCAG ",d.wcag]})]})]}),e.jsxs("p",{className:"text-xs text-slate-700 mb-1",children:[e.jsx("strong",{children:"Do:"})," ",d.prompt]}),e.jsxs("p",{className:"text-xs text-slate-700 mb-2",children:[e.jsx("strong",{children:"Verify:"})," ",d.question]}),d.relatedAxeRule&&e.jsxs("p",{className:"text-[11px] text-slate-500 mb-2",children:["Related axe rule: ",e.jsx("code",{className:"font-mono",children:d.relatedAxeRule})]}),(()=>{const u=o[d.id];return u?u.kind==="clean"?e.jsxs("div",{className:"text-[11px] mb-2 p-1.5 rounded border border-emerald-200 bg-emerald-50 text-emerald-900 flex items-start justify-between gap-2",children:[e.jsxs("span",{children:["✓ Auto-evidence: axe rule ",e.jsx("code",{className:"font-mono",children:u.ruleId})," ran clean across ",u.statesAudited," state",u.statesAudited===1?"":"s",". Quick visual check, then mark pass."]}),!c&&e.jsx("button",{type:"button",onClick:()=>n(d.id,{status:"pass",notes:`Auto-marked via axe-clean evidence (${u.ruleId}, ${u.statesAudited} states).`}),className:"text-[10px] px-1.5 py-0.5 bg-emerald-600 text-white rounded hover:bg-emerald-700 shrink-0",children:"Mark pass"})]}):e.jsxs("div",{className:"text-[11px] mb-2 p-1.5 rounded border border-rose-200 bg-rose-50 text-rose-900 flex items-start justify-between gap-2",children:[e.jsxs("span",{children:["⚠ Auto-flag: axe rule ",e.jsx("code",{className:"font-mono",children:u.ruleId})," already found ",u.violationCount," violation",u.violationCount===1?"":"s"," in"," ",u.states.length," state",u.states.length===1?"":"s",". Verify and mark fail."]}),!c&&e.jsx("button",{type:"button",onClick:()=>n(d.id,{status:"fail",notes:`Auto-flagged via axe violations (${u.ruleId}, ${u.violationCount} hits in: ${u.states.join(", ")}).`}),className:"text-[10px] px-1.5 py-0.5 bg-rose-600 text-white rounded hover:bg-rose-700 shrink-0",children:"Mark fail"})]}):null})(),d.visualizer&&e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsxs("button",{type:"button",onClick:()=>void Fs(d.visualizer,!0),className:"text-[11px] px-2 py-0.5 bg-brand-500 text-white rounded hover:bg-brand-600",children:["Show ",bo[d.visualizer]]}),e.jsx("button",{type:"button",onClick:()=>void Fs(d.visualizer,!1),className:"text-[11px] px-2 py-0.5 border border-slate-300 text-slate-600 rounded hover:bg-slate-100",children:"Hide"}),e.jsx("span",{className:"text-[10px] text-slate-500",children:"Helps verify this step on the target page."})]}),e.jsxs("div",{className:"flex gap-1 flex-wrap",children:[e.jsx(st,{label:"Pass",active:(c==null?void 0:c.status)==="pass",tone:"emerald",onClick:()=>n(d.id,{status:"pass",notes:c==null?void 0:c.notes})}),e.jsx(st,{label:"Fail",active:(c==null?void 0:c.status)==="fail",tone:"rose",onClick:()=>n(d.id,{status:"fail",notes:c==null?void 0:c.notes})}),e.jsx(st,{label:"N/A",active:(c==null?void 0:c.status)==="not-applicable",tone:"slate",onClick:()=>n(d.id,{status:"not-applicable",notes:c==null?void 0:c.notes})}),e.jsx(st,{label:"Skip",active:(c==null?void 0:c.status)==="skip",tone:"slate",onClick:()=>n(d.id,{status:"skip",notes:c==null?void 0:c.notes})})]}),c&&e.jsx("textarea",{placeholder:"Notes (optional)",value:c.notes??"",onChange:u=>n(d.id,{status:c.status,notes:u.target.value}),rows:2,className:"w-full mt-2 text-[11px] border border-slate-200 rounded p-1.5"})]},d.id)})})]})}const No={emerald:"bg-emerald-500 text-white border-emerald-500",rose:"bg-rose-500 text-white border-rose-500",slate:"bg-slate-300 text-slate-800 border-slate-300"};function st({label:t,active:s,tone:a,onClick:n}){return e.jsx("button",{type:"button",onClick:n,className:`text-[11px] px-2 py-1 rounded border ${s?No[a]:"bg-white text-slate-700 border-slate-300 hover:bg-slate-50"}`,children:t})}const lt="savedFlows";async function ko(){const t=await chrome.storage.local.get(lt);return Array.isArray(t[lt])?t[lt]:[]}async function Ps(t){await chrome.storage.local.set({[lt]:t})}function So(){const[t,s]=m.useState([]),[a,n]=m.useState(!1),[r,o]=m.useState(null);m.useEffect(()=>{ko().then(s)},[]);async function l(){const c=await ue();if(!c){o("No audit-target tab found.");return}try{await be(c,{type:"FLOW_RECORD_START_REQUEST"}),n(!0),o("Recording. Switch to the page and perform actions, then come back and Stop.")}catch{o("Failed to start recording.")}}async function i(){const c=await ue();if(c)try{const u=await Ee(c,{type:"FLOW_RECORD_STOP_REQUEST"});if(n(!1),u.steps.length===0){o("Recording stopped — no steps captured.");return}const h=typeof prompt=="function"?prompt(`Captured ${u.steps.length} steps. Name this flow:`,"")??"":`Flow ${new Date().toLocaleTimeString()}`;if(!h.trim()){o("Save canceled.");return}const x={id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,name:h.trim(),steps:u.steps,savedAt:new Date().toISOString()},b=[x,...t];s(b),await Ps(b),o(`Saved "${x.name}" with ${x.steps.length} steps.`)}catch(u){o(`Stop failed: ${u instanceof Error?u.message:String(u)}`)}}async function d(c){const u=await ue();if(u){o(`Replaying "${c.name}"…`);try{const h=await Ee(u,{type:"FLOW_PLAY_REQUEST",steps:c.steps});o(`Replayed ${h.played} step${h.played===1?"":"s"}`+(h.errored?`, ${h.errored} errored (selector not found)`:"")+".")}catch(h){o(`Replay failed: ${h instanceof Error?h.message:String(h)}`)}}}async function p(c){if(typeof confirm=="function"&&!confirm("Delete this flow?"))return;const u=t.filter(h=>h.id!==c);s(u),await Ps(u)}return e.jsxs("div",{className:"p-3 space-y-3",children:[e.jsx("p",{className:"text-xs text-slate-500",children:"Record click/input/keydown sequences on the audited page, then replay them later. Useful for auditing journeys (login → navigate → form) instead of static pages. After replay, run an audit on the resulting state."}),e.jsx("div",{className:"flex gap-2",children:a?e.jsx("button",{onClick:i,className:"text-xs px-3 py-1 bg-slate-700 text-white rounded hover:bg-slate-800",children:"■ Stop & save"}):e.jsx("button",{onClick:l,className:"text-xs px-3 py-1 bg-rose-500 text-white rounded hover:bg-rose-600",children:"● Record flow"})}),r&&e.jsx("p",{className:"text-[11px] text-slate-600 italic",children:r}),t.length===0?e.jsx("p",{className:"text-xs text-slate-500 italic",children:"No saved flows yet."}):e.jsx("div",{className:"space-y-2",children:t.map(c=>e.jsxs("div",{className:"border border-slate-200 rounded p-2 bg-white flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"font-medium text-xs",children:c.name}),e.jsxs("div",{className:"text-[11px] text-slate-500 mt-0.5",children:[c.steps.length," step",c.steps.length===1?"":"s"," ·"," ",new Date(c.savedAt).toLocaleDateString()]})]}),e.jsxs("div",{className:"flex gap-1 shrink-0",children:[e.jsx("button",{onClick:()=>d(c),className:"text-[11px] px-2 py-0.5 border border-slate-300 rounded text-slate-700 hover:bg-slate-50",children:"Replay"}),e.jsx("button",{onClick:()=>p(c.id),className:"text-[11px] text-slate-500 hover:text-rose-600 px-1",title:"Delete flow",children:"✕"})]})]},c.id))})]})}function Ao(t){const s=t.indexOf("::");if(s===-1)return{primary:t};const a=t.slice(0,s),n=t.slice(s+2),r=n.indexOf(":");if(r===-1)return{primary:n};const o=n.slice(0,r),l=n.slice(r+1);return o==="story"?{primary:l.split("--").map(d=>d.split("-").map(Co).join(" ")).join(" / "),secondary:"storybook"}:{primary:l,secondary:a||o}}function Co(t){return t.length===0?t:t[0].toUpperCase()+t.slice(1)}function Io(){const t=y(i=>i.baselineList),s=y(i=>i.tier),a=ra[s].maxBaselines,n=t.length>=a&&Number.isFinite(a),[r,o]=m.useState(!1);if(m.useEffect(()=>{ht().finally(()=>o(!0))},[]),!r)return e.jsx("div",{className:"p-3 space-y-2","aria-label":"Loading scorecard",children:[0,1,2].map(i=>e.jsxs("div",{className:"border border-slate-200 rounded p-2 bg-white animate-pulse",children:[e.jsx("div",{className:"h-3 bg-slate-200 rounded w-2/3 mb-2"}),e.jsx("div",{className:"h-2 bg-slate-100 rounded w-1/3"})]},i))});if(t.length===0)return e.jsx("div",{className:"p-4 text-center text-slate-500 text-sm",children:"No baselines yet. After your first audit, accept the result as a baseline to track only NEW violations going forward."});async function l(i){await ae({type:"BASELINE_DELETE",componentId:i}),await ht()}return e.jsxs("div",{className:"p-3 space-y-2",children:[e.jsxs("p",{className:"text-xs text-slate-500 mb-2",children:[t.length," ",t.length===1?"component":"components"," tracked",Number.isFinite(a)&&e.jsxs("span",{className:"text-amber-700",children:[" · ",s," tier limit: ",a]})]}),n&&e.jsxs("div",{className:"text-xs bg-amber-50 border border-amber-200 rounded p-2 text-amber-900",children:["You've hit the ",s,"-tier baseline limit. Upgrade for unlimited tracked components."]}),t.map(i=>{const d=Ao(i.componentId),p=i.metrics;return e.jsxs("div",{className:"border border-slate-200 rounded p-2 bg-white flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"font-medium text-xs truncate",title:i.componentId,children:d.primary}),d.secondary&&e.jsx("div",{className:"text-[11px] text-slate-500 truncate",title:d.secondary,children:d.secondary}),e.jsxs("div",{className:"text-xs text-slate-500 mt-0.5",children:[i.violationCount," ",i.violationCount===1?"violation":"violations"," ·"," ",new Date(i.lastUpdated).toLocaleDateString()]}),p&&e.jsxs("div",{className:"flex flex-wrap gap-1 mt-1.5",children:[i.seenOnUrlsCount&&i.seenOnUrlsCount>1&&e.jsxs(Te,{tone:"indigo",title:"This component pattern has been audited on multiple URLs",children:["seen on ",i.seenOnUrlsCount," pages"]}),p.criticalCount>0&&e.jsxs(Te,{tone:"rose",title:`${p.criticalCount} critical violations`,children:[p.criticalCount," critical"]}),p.seriousCount>0&&e.jsxs(Te,{tone:"orange",title:`${p.seriousCount} serious violations`,children:[p.seriousCount," serious"]}),p.focusResetCount>0&&e.jsxs(Te,{tone:"rose",title:`${p.focusResetCount} focus resets observed`,children:[p.focusResetCount," focus reset",p.focusResetCount===1?"":"s"]}),p.targetSizeFailCount>0&&e.jsxs(Te,{tone:"amber",title:"Targets smaller than WCAG 2.5.8 minimum",children:[p.targetSizeFailCount," small targets"]}),p.hoverContrastFail&&e.jsx(Te,{tone:"amber",title:"Contrast failure on :hover state",children:"hover-contrast"}),p.announcementCount>0&&e.jsxs(Te,{tone:"indigo",title:"aria-live announcements observed",children:[p.announcementCount," announce"]})]})]}),e.jsx("button",{onClick:()=>l(i.componentId),className:"text-xs text-slate-500 hover:text-red-600 shrink-0",title:"Reset baseline",children:"Reset"})]},i.componentId)})]})}const Eo={rose:"bg-rose-100 text-rose-700",orange:"bg-orange-100 text-orange-700",amber:"bg-amber-100 text-amber-700",indigo:"bg-indigo-100 text-indigo-700"};function Te({tone:t,title:s,children:a}){return e.jsx("span",{title:s,className:`text-[10px] px-1.5 py-0.5 rounded ${Eo[t]}`,children:a})}const ct="wcagcheckr";function te(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Qe(t){try{const s=new Date(t);return Number.isNaN(s.getTime())?t:s.toLocaleString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1,timeZoneName:"short"})}catch{return t}}function Ro(t){return Array.from(new Set(t.map(s=>s.axeVersion).filter(Boolean))).sort()}function To(t){if(t.length===0)return null;const s=[...t].sort((a,n)=>a.capturedAt.localeCompare(n.capturedAt));return{earliest:s[0].capturedAt,latest:s[s.length-1].capturedAt}}function $o(t){const s=new Map;for(const a of t){const n=s.get(a.componentId);n?(n.entries.push(a),a.receipt&&n.anchoredCount++,a.capturedAt>n.latest.capturedAt&&(n.latest=a,n.pageUrl=a.pageUrl)):s.set(a.componentId,{componentId:a.componentId,pageUrl:a.pageUrl,entries:[a],latest:a,anchoredCount:a.receipt?1:0})}for(const a of s.values())a.entries.sort((n,r)=>r.capturedAt.localeCompare(n.capturedAt));return Array.from(s.values()).sort((a,n)=>n.latest.capturedAt.localeCompare(a.latest.capturedAt))}function Uo(t){switch(t){case"A":return"grade-a";case"B":return"grade-b";case"C":return"grade-c";case"D":return"grade-d";case"F":return"grade-f"}}function Lo(t){const s=t.totals,a=[s.critical?`<span class="sev-crit">${s.critical} critical</span>`:"",s.serious?`<span class="sev-serious">${s.serious} serious</span>`:"",s.moderate?`<span class="sev-mod">${s.moderate} moderate</span>`:"",s.minor?`<span class="sev-minor">${s.minor} minor</span>`:""].filter(Boolean).join(" · ")||'<span class="sev-clean">No violations recorded</span>',n=t.receipt?`<tr><th>Trusted timestamp</th><td>RFC 3161 (${te(t.receipt.tsaName)}) — anchored ${te(Qe(t.receipt.anchoredAt))}</td></tr>
|
|
18
|
+
Future audits will treat every detected violation as new (no delta filtering). This cannot be undone.`))return;await ae({type:"BASELINE_DELETE",componentId:s});const G=a.flatMap(le=>le.violations),W=a.flatMap(le=>le.announcements??[]),K=a.flatMap(le=>le.focusEvents??[]),oe=await Z({type:"BASELINE_COMPARE",componentId:s,currentViolations:G,announcements:W,focusEvents:K});y.getState().setDelta(oe.delta);const ne=await Z({type:"BASELINE_LIST"});y.getState().setBaselineList(ne.items),ge.polite(`Baseline cleared for ${s}.`)}async function ie(A,G=!1){if(a.length===0)return;if(A==="ai-prompt"){const{copyAiFixerPrompt:Y}=await ke(async()=>{const{copyAiFixerPrompt:he}=await import("./copy-ai-fixer-prompt-BHi-aVOx.js");return{copyAiFixerPrompt:he}},__vite__mapDeps([4,1,2]));await Y({results:a,componentId:s,delta:G?void 0:t,siteCrawlReport:o});return}let W;if((A==="defense-bundle"||A==="evidence-bundle"||A==="deposition-packet")&&s){const Y=await chrome.storage.local.get("igtRuns"),de=((Y==null?void 0:Y.igtRuns)??{})[s]??{};W=Object.values(de)}const ne=await Z({type:"EXPORT_REQUEST",format:A,results:a,delta:G?void 0:t??void 0,manualRuns:W,dismissedKeys:void 0,incompleteResolutions:void 0,wallClockMs:y.getState().lastAuditWallClockMs??void 0});if(A==="defense-bundle"||A==="evidence-bundle"||A==="deposition-packet"){const Y=bt(A,s);await ia()?et(ne.content,Y):j({open:!0,format:A,content:ne.content,filename:Y});return}if(A==="html-print"||A==="vpat"||A==="methodology-doc"||A==="conformance-crosswalk"||A==="executive-report"){$e(ne.content);return}const le=A==="json"?"application/json":A==="sarif"?"application/sarif+json":A==="ticket-bundle"?"text/markdown":"application/xml",pe=A==="junit"?"xml":A==="ticket-bundle"?"md":A,L=new Blob([ne.content],{type:le}),X=URL.createObjectURL(L),z=document.createElement("a");z.href=X,z.download=`audit-${(s==null?void 0:s.replace(/[^a-z0-9]/gi,"-"))??"export"}.${pe}`,z.click(),URL.revokeObjectURL(X)}return e.jsxs("div",{className:"p-3 space-y-3",children:[e.jsxs("div",{className:"flex gap-2 items-center flex-wrap",children:[e.jsx("button",{onClick:R,disabled:!H,title:H?void 0:`Free tier limits you to ${_} baseline. Upgrade for unlimited.`,className:"text-xs px-2 py-1 bg-slate-200 hover:bg-slate-300 rounded disabled:opacity-50 disabled:cursor-not-allowed",children:"Accept as baseline"}),F&&e.jsx("button",{onClick:M,title:"Remove the saved baseline so every detected violation counts as new again.",className:"text-xs px-2 py-1 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50",children:"Clear baseline"}),e.jsx("button",{onClick:()=>w(!0),title:"Wipe ALL audit-derived state (baselines, history, IGT runs, dismissals, AI cache). User settings + custom rules + license are preserved. Use after a major site rebuild.",className:"text-xs px-2 py-1 border border-rose-300 bg-white text-rose-700 rounded hover:bg-rose-50",children:"Reset all audit data"}),e.jsx("button",{type:"button",onClick:()=>void U(),"aria-pressed":S,title:"Overlay numbered, color-coded badges on every violating element in the page. Click a badge to scroll its row into view here.",className:S?"text-xs px-2 py-1 bg-rose-600 hover:bg-rose-700 text-white rounded":"text-xs px-2 py-1 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50",children:S?"Hide badges":"Show badges 🎯"}),S&&T&&e.jsxs("span",{className:"text-[11px] text-slate-500",children:[T.rendered," of ",T.requested," rendered",T.clustered>0?` · ${T.clustered} clusters`:""]}),e.jsx("button",{type:"button",onClick:()=>void q(),"aria-pressed":P,title:"Overlay a density heatmap on the page. Red blobs at each violation rect; overlapping blobs glow brighter to show problem clusters.",className:P?"text-xs px-2 py-1 bg-orange-600 hover:bg-orange-700 text-white rounded":"text-xs px-2 py-1 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50",children:P?"Hide heatmap":"Show heatmap 🔥"}),e.jsx(Hi,{disabled:!$,onExport:ie,onAccessibilityStatement:()=>v(!0),hasBaselineDelta:!!(t!=null&&t.baselineSnapshotMeta)}),!H&&e.jsx("span",{className:"text-xs text-amber-700",children:"Free tier · 1 baseline limit reached."})]}),t.matrixMismatchWarning&&e.jsxs("div",{className:"text-xs bg-amber-50 border border-amber-200 rounded p-2 text-amber-900",children:["⚠ ",t.matrixMismatchWarning]}),(()=>{const A=At(t.new),G=At(t.persistent),W=At(t.fixed),K=[...A.review,...G.review];return e.jsxs(e.Fragment,{children:[e.jsx(We,{title:"New",violations:A.findings,count:A.findings.length,accent:"red",actions:[...l&&A.findings.length>0?[{label:"File GitHub issue",onClick:()=>Gi(l,s,A.findings)}]:[],...d&&A.findings.length>0?[{label:"File Jira issue",onClick:()=>Vi(d,s,A.findings)}]:[],...c&&A.findings.length>0?[{label:"File Azure DevOps work item",onClick:()=>Wi(c,s,A.findings)}]:[],...h&&A.findings.length>0?[{label:"File GitLab issue",onClick:()=>Bi(h,s,A.findings)}]:[]]}),e.jsx(We,{title:"Persistent",violations:G.findings,count:G.findings.length,accent:"slate"}),e.jsx(We,{title:"Fixed",violations:W.findings,count:t.fixedCount,accent:"green"}),K.length>0&&e.jsx(We,{title:"Needs review (does not affect grade)",violations:K,count:K.length,accent:"amber"}),t.acknowledged&&t.acknowledged.length>0&&e.jsx(We,{title:"Acknowledged",violations:t.acknowledged,count:t.acknowledged.length,accent:"slate",renderAsAcknowledged:!0})]})})(),f&&e.jsx(wa,{open:f.open,onClose:()=>j(null),format:f.format,content:f.content,filename:f.filename}),e.jsx(ja,{open:g,onClose:()=>v(!1),results:a}),b&&e.jsx("div",{role:"dialog","aria-modal":"true","aria-labelledby":"reset-confirm-title",className:"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-3",children:e.jsxs("div",{className:"bg-white border border-slate-300 rounded-lg shadow-xl max-w-sm w-full p-4 space-y-3",children:[e.jsx("h2",{id:"reset-confirm-title",className:"text-sm font-semibold text-slate-900",children:"Reset all audit data?"}),e.jsx("p",{className:"text-xs text-slate-700 leading-snug",children:"Wipes everything derived from your audits — for a true fresh start after a site rebuild."}),e.jsxs("div",{className:"text-[11px] text-slate-700 space-y-1",children:[e.jsx("p",{className:"font-medium text-slate-800",children:"Will be deleted:"}),e.jsxs("ul",{className:"list-disc list-inside text-slate-600 space-y-0.5",children:[e.jsx("li",{children:"All baselines + audit history"}),e.jsx("li",{children:"Forensic log entries (the anchored receipts stay anchored to their public TSAs, but the local mirror is gone)"}),e.jsx("li",{children:"Guided Tests workflow answers"}),e.jsx("li",{children:"Acknowledged findings + dismissals"}),e.jsx("li",{children:"AI color suggestions + incomplete resolutions cache"}),e.jsx("li",{children:"Last persisted audit"})]}),e.jsx("p",{className:"font-medium text-slate-800 mt-2",children:"Preserved:"}),e.jsxs("ul",{className:"list-disc list-inside text-slate-600 space-y-0.5",children:[e.jsx("li",{children:"Your AI API key + cost cap + check toggles"}),e.jsx("li",{children:"Matrix presets + disabled-rule list"}),e.jsx("li",{children:"Custom rules"}),e.jsx("li",{children:"License + tier"}),e.jsx("li",{children:"Owner / Developer mode"})]})]}),I&&e.jsxs("div",{className:"text-[11px] bg-emerald-50 border border-emerald-200 rounded p-2 text-emerald-900",children:["✓ Cleared ",I.chromeStorageKeysCleared," chrome.storage key",I.chromeStorageKeysCleared===1?"":"s"," + ",I.indexedDbsCleared.length," database",I.indexedDbsCleared.length===1?"":"s",".",I.errors.length>0&&e.jsxs("div",{className:"mt-1 text-rose-800",children:["Partial: ",I.errors.join("; ")]})]}),e.jsx("div",{className:"flex justify-end gap-2 pt-1 border-t border-slate-200",children:I?e.jsx("button",{type:"button",onClick:()=>{w(!1),C(null)},className:"text-xs px-3 py-1.5 bg-brand-500 text-white rounded hover:bg-brand-600",children:"Done"}):e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:()=>w(!1),disabled:N,className:"text-xs px-3 py-1.5 border border-slate-300 text-slate-700 rounded hover:bg-slate-50 disabled:opacity-50",children:"Cancel"}),e.jsx("button",{type:"button",onClick:async()=>{E(!0);try{const A=await Di();C(A),await yt(),ge.polite("Audit data reset. Ready for a fresh scan.")}catch(A){C({chromeStorageKeysCleared:0,indexedDbsCleared:[],errors:[A instanceof Error?A.message:String(A)]})}finally{E(!1)}},disabled:N,className:"text-xs px-3 py-1.5 bg-rose-600 text-white rounded hover:bg-rose-700 disabled:opacity-50",children:N?"Resetting…":"Reset everything"})]})})]})})]})}const Pi={red:"text-red-700",slate:"text-slate-700",green:"text-green-700",amber:"text-amber-700"};function At(t){const s=[],a=[];for(const n of t)n.needsReview?a.push(n):s.push(n);return{findings:s,review:a,fixed:0}}function We({title:t,violations:s,count:a,accent:n,actions:r,renderAsAcknowledged:o}){const[l,i]=m.useState(!o);return e.jsxs("section",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2 gap-2 flex-wrap",children:[e.jsxs("h2",{className:`text-xs font-semibold ${Pi[n]} ${o?"cursor-pointer select-none":""}`,onClick:o?()=>i(d=>!d):void 0,children:[o&&e.jsx("span",{className:"mr-1 text-slate-400",children:l?"▾":"▸"}),t," (",a,")"]}),r&&r.length>0&&e.jsx("div",{className:"flex gap-1 flex-wrap",children:r.map(d=>e.jsx("button",{type:"button",onClick:d.onClick,className:"text-[11px] px-2 py-0.5 border border-slate-300 rounded text-slate-700 hover:bg-slate-50",children:d.label},d.label))})]}),l?s.length===0?e.jsx("p",{className:"text-xs text-slate-500 italic",children:"none"}):e.jsx("div",{className:"space-y-1.5",children:o?s.map((d,p)=>e.jsx(Ze,{violation:d,alreadyAcknowledged:!0},p)):Ei(s).map(d=>e.jsx(Ii,{ruleId:d.ruleId,violations:d.violations},d.ruleId))}):null]})}function Gi(t,s,a){if(a.length===0)return;const{url:n}=Ti(t,s,a);vt(n)}function Vi(t,s,a){if(a.length===0)return;const{url:n}=$i(t,s,a);vt(n)}function Wi(t,s,a){if(a.length===0)return;const{url:n}=Ui(t,s,a);vt(n)}function Bi(t,s,a){if(a.length===0)return;const{url:n}=Li(t,s,a);vt(n)}function Hi({disabled:t,onExport:s,onAccessibilityStatement:a,hasBaselineDelta:n}){const[r,o]=m.useState(!1),[l,i]=m.useState(!1);function d(p){o(!1),s(p,l)}return e.jsxs("div",{className:"relative inline-block",children:[e.jsx("button",{type:"button",disabled:t,onClick:()=>o(p=>!p),title:t?"Export requires a paid tier.":"Choose an export format",className:"text-xs px-2 py-1 bg-slate-200 hover:bg-slate-300 rounded disabled:opacity-50 disabled:cursor-not-allowed",children:"Export ▾"}),r&&!t&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"fixed inset-0 z-40","aria-hidden":"true",onClick:()=>o(!1)}),e.jsxs("div",{className:"absolute right-0 top-full mt-1 z-50 w-[260px] max-w-[calc(100vw-1rem)] bg-white border border-slate-200 rounded shadow-md py-1",role:"menu",children:[n&&e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"flex items-start gap-2 px-3 py-2 text-[11px] cursor-pointer hover:bg-slate-50",title:"By default, delta-aware formats (AI prompt, SARIF, JUnit) emit only NEW violations vs. the saved baseline. Enable this to include every detected violation regardless of baseline.",children:[e.jsx("input",{type:"checkbox",checked:l,onChange:p=>i(p.target.checked),className:"mt-0.5 shrink-0"}),e.jsxs("span",{className:"leading-snug",children:[e.jsx("strong",{children:"Use full audit"})," — include pre-existing baseline violations."]})]}),e.jsx("div",{className:"border-t border-slate-100 my-1"})]}),e.jsx(ye,{onClick:()=>d("json"),title:"Native format with full audit detail.",children:"JSON"}),e.jsx(ye,{onClick:()=>d("sarif"),title:"SARIF for GitHub code-scanning + most CI tools.",children:"SARIF"}),e.jsx(ye,{onClick:()=>d("junit"),title:"JUnit XML for Jenkins / GitLab CI test reporters.",children:"JUnit XML"}),e.jsx("div",{className:"border-t border-slate-100 my-1"}),e.jsx(ye,{onClick:()=>d("html-print"),title:"Opens a print-ready HTML report in a new tab. Use Ctrl+P / Cmd+P → Save as PDF.",children:"Print report (PDF)"}),e.jsx(ye,{onClick:()=>d("vpat"),title:"VPAT 2.5 conformance report — opens in a new tab for review and printing.",children:"VPAT 2.5"}),e.jsx(ye,{onClick:()=>d("defense-bundle"),title:"One-document attorney-ready bundle for site owners: exec summary + risk grade + per-category breakdown + full findings + screenshots + VPAT + remediation plan + methodology + disclaimer.",children:"Defense bundle 📄"}),e.jsx(ye,{onClick:()=>d("evidence-bundle"),title:"Same content as defense bundle, reframed as objective audit evidence (for compliance documentation, complaints, or third-party review).",children:"Evidence bundle 📄"}),e.jsx(ye,{onClick:()=>d("deposition-packet"),title:"Forensic-grade upgrade of defense bundle. Anchors the audit hash via RFC 3161 trusted timestamp + ed25519 server signature, prepends a chain-of-custody cover sheet, appends verification instructions and a sworn-declaration template. The artifact to hand to opposing counsel.",children:"Deposition packet 🔒"}),e.jsx(ye,{onClick:()=>d("methodology-doc"),title:"Standalone methodology document explaining how wcagcheckr audits — multi-state matrix, axe-core rule coverage, WCAG criteria requiring manual review, audit process. Pairs with the deposition packet for legal use; usable standalone as a publishable 'how we audit' document.",children:"Methodology doc 📘"}),e.jsx(ye,{onClick:()=>d("conformance-crosswalk"),title:"Cross-jurisdiction conformance crosswalk: per WCAG criterion, shows the mapping to EN 301 549 (EU), Section 508 (US federal), ADA Title III (US private-sector), EAA (Directive 2019/882), and AODA (Ontario). Highlights criteria violated in this audit.",children:"Conformance crosswalk 🗺"}),e.jsx("div",{className:"border-t border-slate-100 my-1"}),e.jsx(ye,{onClick:()=>d("ai-prompt"),title:"Generate a structured prompt to paste into Claude / Cursor / Copilot. Auto-copies to clipboard.",children:"AI fix prompt ✨"}),e.jsx(ye,{onClick:()=>d("ticket-bundle"),title:"One markdown document with N self-contained ticket sections — one per unique violation. Copy + paste each section into Linear / Asana / Trello / Jira / GitHub Issues. Tickets deduped by logical group; critical-first ordering.",children:"Ticket bundle (markdown) 🎫"}),e.jsx(ye,{onClick:()=>d("executive-report"),title:"Single-page executive HTML report: grade hero, top 3 risks, recommended next steps. Print-ready (Ctrl+P → Save as PDF). For stakeholder distribution rather than developer remediation.",children:"Executive report 📊"}),e.jsx("div",{className:"border-t border-slate-100 my-1"}),e.jsx(ye,{onClick:()=>{o(!1),a()},title:"EAA / WAD accessibility statement (EU directives). Opens a form to enter org info, then generates Markdown or HTML for your site. EAA enforceable since 28 June 2025.",children:"EAA / WAD statement 🇪🇺"})]})]})]})}function ye({onClick:t,title:s,children:a}){return e.jsx("button",{type:"button",role:"menuitem",onClick:t,title:s,className:"block w-full text-left text-xs px-3 py-1 hover:bg-slate-100",children:a})}const Ki="2024-07-25",zi="Based on the W3C WCAG 3 Working Draft published 2024-07-25. Outcomes may shift before WCAG 3.0 reaches Recommendation; treat this view as a directional preview, not a conformance claim.",ka=[{id:"text-alternatives",category:"perceive",title:"Non-text content has a text alternative",description:"Images, icons, audio, and video have descriptive text alternatives so users who cannot perceive the original modality still get the meaning.",wcag2Criteria:["1.1.1","1.2.1","1.2.2","1.2.3","1.2.4","1.2.5"]},{id:"visual-distinction",category:"perceive",title:"Visual content is distinguishable",description:"Foreground content has sufficient contrast from background, both for text (APCA Lc thresholds in 3.0) and for non-text UI elements.",wcag2Criteria:["1.4.3","1.4.6","1.4.11"]},{id:"adaptable-presentation",category:"perceive",title:"Content adapts to user preferences",description:"Text spacing, zoom, reflow, and orientation respect user-agent and OS preferences without breaking layout or losing functionality.",wcag2Criteria:["1.3.4","1.4.4","1.4.10","1.4.12"]},{id:"meaningful-structure",category:"perceive",title:"Content structure is programmatically determinable",description:"Headings, lists, tables, regions, and other semantic structures are exposed in the accessibility tree so assistive technology can navigate them.",wcag2Criteria:["1.3.1","1.3.2","2.4.1","2.4.6"]},{id:"keyboard-operable",category:"operate",title:"All functionality is keyboard-operable",description:"Every interaction (including drag, pointer-gesture-driven, and complex widget interactions) has a keyboard equivalent that does not require timing or precision.",wcag2Criteria:["2.1.1","2.1.2","2.1.4","2.5.1","2.5.2","2.5.7"]},{id:"focus-management",category:"operate",title:"Focus is visible, ordered, and never obscured",description:"Keyboard focus is visually distinct, moves in a sensible order, never moves unexpectedly, and is never hidden by sticky headers or modals.",wcag2Criteria:["2.4.3","2.4.7","2.4.11","2.4.12"]},{id:"enough-time",category:"operate",title:"Users have enough time to complete tasks",description:"Time limits are adjustable, pauseable, or absent. Moving / blinking content can be paused. No content flashes more than three times per second.",wcag2Criteria:["2.2.1","2.2.2","2.3.1"]},{id:"navigable-content",category:"operate",title:"Content is navigable",description:"Pages have titles, link text describes the destination, multiple ways exist to find content, and skip-links bypass repeated blocks.",wcag2Criteria:["2.4.2","2.4.4","2.4.5"]},{id:"target-size",category:"operate",title:"Pointer targets are sufficiently sized",description:"Interactive targets are large enough to operate without precision-tap difficulty. Drag operations have a single-pointer alternative.",wcag2Criteria:["2.5.8","2.5.7"]},{id:"language-of-content",category:"understand",title:"Language of content is identified",description:"Page and language-of-parts are programmatically determinable so text-to-speech and other AT can pronounce content correctly.",wcag2Criteria:["3.1.1","3.1.2"]},{id:"predictable-behavior",category:"understand",title:"UI behavior is predictable",description:"Focusing or selecting an element does not cause unexpected context changes. Navigation and identification of repeated components is consistent across pages.",wcag2Criteria:["3.2.1","3.2.2","3.2.3","3.2.4","3.2.6"]},{id:"input-assistance",category:"understand",title:"Forms help users avoid and correct errors",description:"Required fields are labeled, errors are identified clearly, suggestions are offered when possible, and legal / financial forms have prevention mechanisms.",wcag2Criteria:["3.3.1","3.3.2","3.3.3","3.3.4","3.3.7"]},{id:"accessible-auth",category:"understand",title:"Authentication does not require cognitive function tests",description:"Login flows do not depend on memorizing characters, transcribing puzzles, or other cognitive function tests with no accessible alternative.",wcag2Criteria:["3.3.8","3.3.9"]},{id:"name-role-value",category:"robust",title:"UI components expose name, role, and value",description:"Every interactive element has a programmatically determinable name, role, and current state. Status messages reach assistive technology without focus changes.",wcag2Criteria:["4.1.2","4.1.3"]}];new Set(ka.flatMap(t=>t.wcag2Criteria));function qi(t,s){return ka.map(a=>{const n=a.wcag2Criteria.filter(l=>t.has(l)),r=a.wcag2Criteria.some(l=>s.has(l));let o;return n.length>0?o="has-violations":r?o="clean":o="not-evaluated",{outcome:a,violatedCriteria:n,status:o}})}const Qi={perceive:"Perceive",operate:"Operate",understand:"Understand",robust:"Robust"};function Sa(){const t=y(c=>c.results),s=y(c=>c.acknowledgedKeys),a=y(c=>c.dismissedKeys);if(t.length===0)return e.jsxs("div",{className:"p-3 space-y-2 text-xs","data-testid":"wcag3-view-root",children:[e.jsx("h2",{className:"text-sm font-semibold",children:"WCAG 3 readiness preview"}),e.jsx("p",{className:"text-slate-600 leading-snug",children:"Run an audit first. This view re-projects the audit's WCAG 2.x findings onto the WCAG 3 outcome structure."})]});const n=new Set,r=new Set;for(const c of t){for(const h of c.violations){if(h.needsReview){r.add(h.wcagCriterion);continue}if(s.has(h.matchKey)){r.add(h.wcagCriterion);continue}if(a.has(`violation::${h.matchKey}`)){r.add(h.wcagCriterion);continue}n.add(h.wcagCriterion),r.add(h.wcagCriterion)}const u=c.axeRulesEvaluated;if(u){for(const h of u.passed)r.add(h.wcagCriterion);for(const h of u.inapplicable)r.add(h.wcagCriterion);for(const h of u.incomplete)r.add(h.wcagCriterion)}}const o=qi(n,r),l=new Map;for(const c of o){const u=l.get(c.outcome.category)??[];u.push(c),l.set(c.outcome.category,u)}const i=o.filter(c=>c.status==="clean").length,d=o.filter(c=>c.status==="has-violations").length,p=o.filter(c=>c.status==="not-evaluated").length;return e.jsxs("div",{className:"p-3 space-y-3 text-xs","data-testid":"wcag3-view-root",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"WCAG 3 readiness preview"}),e.jsx("p",{className:"text-[11px] text-slate-500 leading-snug mt-1",children:"Re-projects this audit's WCAG 2.x findings onto the WCAG 3 outcome structure."}),e.jsxs("p",{className:"text-[10px] text-amber-800 bg-amber-50 border border-amber-200 rounded px-2 py-1 mt-2",role:"status","data-testid":"wcag3-source-badge",children:["⚠ Preview based on WCAG 3 Working Draft ",e.jsx("strong",{children:Ki}),"."," ",zi]})]}),e.jsxs("div",{className:"flex gap-2 text-[11px]",children:[e.jsxs("span",{className:"px-2 py-1 rounded bg-emerald-100 text-emerald-800",children:[i," clean"]}),e.jsxs("span",{className:"px-2 py-1 rounded bg-rose-100 text-rose-900",children:[d," with violations"]}),e.jsxs("span",{className:"px-2 py-1 rounded bg-slate-100 text-slate-700",children:[p," not evaluated"]})]}),["perceive","operate","understand","robust"].map(c=>{const u=l.get(c)??[];return e.jsxs("section",{className:"border border-slate-200 rounded bg-white","data-testid":`wcag3-category-${c}`,children:[e.jsxs("h3",{className:"px-3 py-2 text-xs font-semibold uppercase tracking-wide text-slate-500 border-b border-slate-100",children:[Qi[c]," · ",u.length]}),e.jsx("ul",{className:"divide-y divide-slate-100",children:u.map(h=>e.jsxs("li",{className:"px-3 py-2",children:[e.jsxs("div",{className:"flex items-baseline gap-2 mb-1",children:[e.jsx(Yi,{status:h.status}),e.jsx("strong",{className:"text-xs",children:h.outcome.title})]}),e.jsx("p",{className:"text-[11px] text-slate-600 leading-snug",children:h.outcome.description}),e.jsxs("p",{className:"text-[10px] text-slate-500 mt-1 font-mono",children:["WCAG 2: ",h.outcome.wcag2Criteria.join(", ")]}),h.violatedCriteria.length>0&&e.jsxs("p",{className:"text-[11px] text-rose-700 mt-1",children:["Violated: ",e.jsx("strong",{children:h.violatedCriteria.join(", ")})]})]},h.outcome.id))})]},c)})]})}function Yi({status:t}){return t==="clean"?e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-emerald-100 text-emerald-800",children:"✓ clean"}):t==="has-violations"?e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-rose-100 text-rose-900",children:"✗ violations"}):e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-slate-100 text-slate-600",children:"— not evaluated"})}const Ji=[{id:"overview",label:"Overview",hint:"Verification areas + WCAG coverage + evidence layers"},{id:"per-area",label:"Per-area",hint:"Drill into the 9 verification areas"},{id:"violations",label:"Violations",hint:"Flat list of every unique finding"},{id:"activity",label:"Activity",hint:"Live regions · focus events · tab/reading order"},{id:"delta",label:"Delta",hint:"Compared to the last accepted baseline"},{id:"wcag3",label:"WCAG 3",hint:"Forward-looking projection on the WCAG 3 outcome map"}],Xi={A:"bg-emerald-500 text-white",B:"bg-lime-500 text-white",C:"bg-amber-500 text-slate-900",D:"bg-orange-500 text-white",F:"bg-rose-600 text-white"};function Zi(){const t=y(u=>u.results),s=y(u=>u.componentId),a=y(u=>u.findingsLens),n=y(u=>u.setFindingsLens),r=y(u=>u.setView),o=y(u=>u.status),[l,i]=m.useState({});m.useEffect(()=>{if(!s)return;let u=!1;return(async()=>{const h=await Ie(s),x=await Le([s]);if(u)return;const b=new Set(x.map(N=>N.criterionId)),w={};for(const N of h){const E=b.has(N.criterionId)?"pass":N.verdict;N.criterionId==="2.4.3"?w.focusOrder=E:N.criterionId==="2.1.2"?w.keyboardTrap=E:N.criterionId==="2.4.7"?w.focusVisible=E:N.criterionId==="1.3.2"?w.readingOrder=E:N.criterionId==="1.4.11"&&(w.nonTextContrast=E)}i(w)})(),()=>{u=!0}},[s]);const d=es(t),[p,c]=m.useState([]);return m.useEffect(()=>{if(!s){c([]);return}let u=!1;return chrome.storage.local.get("igtRuns").then(h=>{if(u)return;const b=((h==null?void 0:h.igtRuns)??{})[s]??{};c(Object.values(b))}),()=>{u=!0}},[s]),t.length===0?e.jsxs("div",{className:"p-4",children:[e.jsx(Os,{setView:r}),e.jsx("div",{className:"mt-6 text-center text-sm text-slate-600",children:e.jsx("p",{children:o==="running"?"Audit in progress. Findings appear here when the matrix completes.":o==="failed"||o==="interrupted"?"Last audit didn't complete. Re-run the scan from the controls above.":"No audit results yet. Run a scan from the controls above."})})]}):e.jsxs("div",{className:"p-3 space-y-3",children:[e.jsx(Os,{setView:r}),e.jsx(to,{results:t,interactiveVerdicts:l,manualRuns:p,aiResolvedFails:d}),e.jsx(eo,{results:t}),e.jsx(so,{lens:a,setLens:n}),e.jsx(ao,{lens:a,results:t,componentId:s,interactiveVerdicts:l,aiResolvedFails:d})]})}function Os({setView:t}){return e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("button",{type:"button",onClick:()=>t("matrix"),className:"text-xs text-slate-600 hover:text-slate-900 hover:underline font-mono px-0.5",children:"← Dashboard"}),e.jsx("span",{className:"text-[11px] font-mono uppercase tracking-widest text-slate-400",children:"findings"})]})}function eo({results:t}){const s=y(p=>p.crawlNavContext),a=y(p=>p.setCrawlNavContext),n=y(p=>p.setView);if(t.length===0)return null;const r=new Set(t.map(p=>p.pageUrl??p.scope??"").filter(Boolean)),o=r.size>1,l=o?null:Array.from(r)[0]??"(unknown)",i=(s==null?void 0:s.mode)==="page";function d(){a(null),n("crawl")}return e.jsxs("div",{className:`border rounded-lg px-3 py-2 text-[11px] leading-snug ${o?"border-blue-200 bg-blue-50 text-blue-900":i?"border-amber-200 bg-amber-50 text-amber-900":"border-slate-200 bg-slate-50 text-slate-700"}`,role:"note","aria-label":"Audit scope",children:[i&&e.jsx("button",{type:"button",onClick:()=>d(),className:"float-right text-[10px] font-semibold px-2 py-0.5 rounded border border-amber-400 bg-white text-amber-900 hover:bg-amber-100",children:"← Back to crawl report"}),o?e.jsxs(e.Fragment,{children:[e.jsxs("strong",{children:["Site crawl · ",r.size," pages."]})," ","This grade reflects the site overall, not any individual page. Per-page drilldown is available in the Crawl tab."]}):i?e.jsxs(e.Fragment,{children:[e.jsxs("strong",{children:["One page from site crawl · ",l,"."]})," ",'This is the full per-page audit data for this URL — same lenses as a fresh single-page audit. Use the "Back to crawl report" button to return to the do-the-work report covering all crawled pages.']}):e.jsxs(e.Fragment,{children:[e.jsxs("strong",{children:["Single-page audit · ",l,"."]})," ","This grade reflects this page only. Multi-page criteria (3.2.3 Consistent Navigation, 3.2.4 Consistent Identification, 3.2.6 Consistent Help) are treated as N/A here — run a"," ",e.jsx("strong",{children:"Site Crawl"})," to evaluate them for the whole site."]})]})}function to({results:t,interactiveVerdicts:s,manualRuns:a,aiResolvedFails:n}){var b,w,N,E;const r=t.flatMap(I=>I.violations),o=y(I=>I.lastAuditWallClockMs),l=y(I=>I.acknowledgedKeys),i=y(I=>I.dismissedKeys),p=Ht({violations:r,auditRan:!0,manualRuns:a,workflows:fe,heuristicCounts:{tabOrder:((w=(b=t[0])==null?void 0:b.tabOrderIssues)==null?void 0:w.length)??0,readingOrder:((E=(N=t[0])==null?void 0:N.readingOrderIssues)==null?void 0:E.length)??0},interactiveAuditVerdicts:s,aiResolvedFails:n.map(I=>({ruleId:I.ruleId,impact:"serious",selector:I.selector}))}).overallLetter,c=xa(r,n,l,i),u=yr(r,n,l,i),h=t.length,x=o??t.reduce((I,C)=>I+C.durationMs,0);return e.jsx("section",{className:"sticky top-0 z-10 border border-slate-200 rounded-lg bg-white overflow-hidden shadow-sm","aria-label":"Audit grade summary",children:e.jsxs("div",{className:"flex items-stretch",children:[e.jsx("div",{className:`flex items-center justify-center w-20 shrink-0 ${Xi[p]}`,children:e.jsx("span",{className:"text-4xl font-display font-semibold leading-none tracking-tight",children:p})}),e.jsxs("div",{className:"flex-1 px-3.5 py-3",children:[e.jsx("p",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500",children:"overall grade · 9 verification areas"}),e.jsx("p",{className:"text-sm font-medium text-slate-900 mt-0.5",children:c===0?"No issues found by automation":`Fix ${c} element${c===1?"":"s"}`}),c>0&&u.length>0&&e.jsxs("p",{className:"text-[11px] text-slate-600 leading-snug mt-0.5",children:["across ",u.length," WCAG criterion",u.length===1?"":"a"," (",u.join(", "),")"]}),e.jsxs("p",{className:"text-[11px] text-slate-500 leading-snug mt-0.5",children:[h," state",h===1?"":"s"," tested · ",(x/1e3).toFixed(1),"s"]})]})]})})}function so({lens:t,setLens:s}){return e.jsx("nav",{className:"flex flex-wrap gap-1 border-b border-slate-200 pb-1.5",role:"tablist","aria-label":"Findings lens",children:Ji.map(a=>{const n=t===a.id;return e.jsx("button",{type:"button",role:"tab","aria-selected":n,onClick:()=>s(a.id),title:a.hint,className:n?"text-[11px] font-medium tracking-tight px-2.5 py-1 rounded-md bg-slate-900 text-white":"text-[11px] font-medium tracking-tight px-2.5 py-1 rounded-md text-slate-600 hover:bg-slate-100",children:a.label},a.id)})})}function ao({lens:t,results:s,componentId:a,interactiveVerdicts:n,aiResolvedFails:r}){var o,l;return t==="overview"?e.jsxs("div",{className:"space-y-3",children:[e.jsx(no,{componentId:a,results:s}),e.jsx(lo,{componentId:a}),e.jsx(Ir,{violations:s.flatMap(i=>i.violations),componentId:a,hideOverallHeader:!0}),e.jsx(mo,{pageUrl:((o=s[0])==null?void 0:o.pageUrl)??((l=s[0])==null?void 0:l.scope)??""}),e.jsx(co,{})]}):t==="per-area"?e.jsx(pi,{results:s,interactiveVerdicts:n,aiResolvedFails:r}):t==="violations"?e.jsx(po,{results:s}):t==="activity"?e.jsx("div",{className:"-mx-3",children:e.jsx(ya,{})}):t==="delta"?e.jsx("div",{className:"-mx-3",children:e.jsx(Na,{})}):t==="wcag3"?e.jsx("div",{className:"-mx-3",children:e.jsx(Sa,{})}):null}const gt={critical:0,serious:1,moderate:2,minor:3};function Mt(t){return`${Ue(t.ruleId,t.target.selector)}::${t.target.outerHTML.slice(0,64)}`}function no({componentId:t,results:s}){var b,w;const a=y(N=>N.setFindingsLens),[n,r]=m.useState({}),[o,l]=m.useState({}),[i,d]=m.useState(0);m.useEffect(()=>{let N=!1;return(async()=>{if(!t){r({}),l({});return}const E=await Ie(t);if(N)return;const I={};for(const j of E)I[j.criterionId]=j;r(I);const C=await Le([t]);if(N)return;const f={};for(const j of C)f[`${j.criterionId}::${j.pageUrl}`]=j;l(f)})(),()=>{N=!0}},[t,i]);const p=((b=s[0])==null?void 0:b.pageUrl)??((w=s[0])==null?void 0:w.scope)??"",c=ot.map(N=>({crit:N,record:n[N.id]??null})).filter(({record:N})=>N&&(N.verdict==="fail"||N.verdict==="uncertain")).filter(({crit:N})=>!o[`${N.id}::${p}`]),u=new Set,h=[];for(const N of s)for(const E of N.violations){if(E.needsReview)continue;const I=Ue(E.ruleId,E.target.selector);u.has(I)||(u.add(I),h.push(E))}h.sort((N,E)=>(gt[N.impact]??99)-(gt[E.impact]??99));const x=c.length+h.length;return x===0?e.jsxs("section",{className:"border border-emerald-200 bg-emerald-50 rounded-lg p-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-base",children:"✓"}),e.jsx("p",{className:"text-sm font-semibold text-emerald-900",children:"Nothing needs your attention on this page."})]}),e.jsx("p",{className:"text-[11px] text-emerald-800 mt-1 leading-snug",children:"No axe violations, no AI walkthrough fails, no uncertain findings. The sub-grades and WCAG coverage below are informational — you've done the work here. Move on to the next page or export your defense bundle."})]}):e.jsxs("section",{className:"border border-rose-200 rounded-lg bg-white overflow-hidden",children:[e.jsxs("header",{className:"px-3 py-2 bg-rose-50 border-b border-rose-200",children:[e.jsxs("p",{className:"text-sm font-semibold text-rose-900",children:[x," item",x===1?"":"s"," need",x===1?"s":""," your attention"]}),e.jsx("p",{className:"text-[11px] text-rose-800 mt-0.5 leading-snug",children:"Each row below is one thing to fix or sign off on. Use the inline buttons — you don't need to leave this view."})]}),e.jsxs("ul",{className:"divide-y divide-slate-100",children:[c.map(({crit:N,record:E})=>e.jsx(ro,{componentId:t??"",pageUrl:p,criterionId:N.id,label:N.label,blurb:N.blurb,record:E,onChanged:()=>d(I=>I+1)},`wt::${N.id}`)),h.map(N=>e.jsx(io,{violation:N,onOpen:()=>a("violations")},`axe::${Mt(N)}`))]})]})}function ro({componentId:t,pageUrl:s,criterionId:a,label:n,blurb:r,record:o,onChanged:l}){const[i,d]=m.useState(!1),[p,c]=m.useState(""),[u,h]=m.useState(!1),[x,b]=m.useState(null),[w,N]=m.useState(!1),[E,I]=m.useState(!1),C=o.verdict,f=C==="fail"?"bg-rose-200 text-rose-900":"bg-amber-200 text-amber-900";async function j(){h(!0),b(null);try{if(!p.trim()){b("Note is required — explain how you manually verified this."),h(!1);return}await zt({componentId:t,criterionId:a,pageUrl:s,note:p.trim(),acknowledgedAt:new Date().toISOString(),verdictAtAck:C}),l()}catch(v){b(v instanceof Error?v.message:String(v))}finally{h(!1)}}async function g(){var v;I(!0),b(null);try{const k=(v=(await chrome.tabs.query({active:!0,currentWindow:!0}))[0])==null?void 0:v.id;if(!k){b("No active tab — open the audited page first."),I(!1);return}const V=await ae({type:"INTERACTIVE_AUDIT_REQUEST",criterionId:a,tabId:k,componentId:t,pageUrl:s});V.ok||b(V.error??"Re-run failed."),l()}catch(S){b(S instanceof Error?S.message:String(S))}finally{I(!1)}}return e.jsxs("li",{className:"px-3 py-2.5 space-y-1.5",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:`shrink-0 inline-flex items-center justify-center font-mono text-[10px] font-bold rounded px-1.5 py-0.5 uppercase ${f}`,children:C}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("p",{className:"text-xs font-medium text-slate-900",children:[e.jsx("span",{className:"font-mono text-[11px] text-slate-500 mr-1.5",children:a}),n]}),e.jsx("p",{className:"text-[11px] text-slate-600 mt-0.5 leading-snug",children:C==="fail"?"AI walkthrough flagged a failure here. Fix the page and re-run, or verify manually and acknowledge.":"AI walkthrough couldn't decide. Fix the underlying ambiguity, or verify manually and acknowledge."})]})]}),e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[e.jsx("button",{type:"button",onClick:()=>N(v=>!v),className:"text-[10px] px-2 py-0.5 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50",children:w?"Hide AI reasoning":"Show AI reasoning"}),e.jsx("button",{type:"button",onClick:()=>void g(),disabled:E,className:"text-[10px] px-2 py-0.5 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50 disabled:opacity-50",title:"Re-run AI walkthrough after fixing the page (will switch to the active tab)",children:E?"Re-running…":"Re-run after fix"}),e.jsx("button",{type:"button",onClick:()=>{d(v=>!v),b(null)},className:"text-[10px] px-2 py-0.5 border border-emerald-400 bg-white text-emerald-700 rounded hover:bg-emerald-50 font-medium",children:"Mark verified manually"})]}),w&&e.jsxs("div",{className:"bg-slate-50 border border-slate-200 rounded p-2 mt-1",children:[e.jsx("p",{className:"text-[10px] text-slate-500 mb-1 font-mono uppercase tracking-wide",children:"What the walkthrough does"}),e.jsx("p",{className:"text-[11px] text-slate-700 leading-snug mb-2",children:r}),e.jsx("p",{className:"text-[10px] text-slate-500 mb-1 font-mono uppercase tracking-wide",children:"AI reasoning"}),e.jsx("p",{className:"text-[11px] text-slate-700 leading-snug whitespace-pre-wrap font-mono",children:o.reasoning})]}),i&&e.jsxs("div",{className:"bg-emerald-50 border border-emerald-300 rounded p-2 space-y-1.5 mt-1",children:[e.jsx("label",{className:"text-[11px] font-semibold text-emerald-900 block",children:"How did you verify? (required, goes into the forensic record)"}),e.jsx("textarea",{value:p,onChange:v=>c(v.target.value),placeholder:"e.g., Tested with VoiceOver on Safari — focus order matches visual order, all interactive elements reachable.",className:"w-full text-[11px] px-2 py-1 border border-emerald-300 rounded resize-y min-h-[60px]",autoFocus:!0}),x&&e.jsx("p",{className:"text-[10px] text-rose-700",children:x}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("button",{type:"button",onClick:()=>void j(),disabled:u,className:"text-[11px] px-2 py-1 bg-emerald-600 text-white rounded hover:bg-emerald-700 disabled:opacity-50 font-medium",children:u?"Saving…":"Confirm verification"}),e.jsx("button",{type:"button",onClick:()=>{d(!1),c(""),b(null)},disabled:u,className:"text-[11px] px-2 py-1 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50 disabled:opacity-50",children:"Cancel"})]})]}),x&&!i&&e.jsx("p",{className:"text-[10px] text-rose-700",children:x})]})}function io({violation:t,onOpen:s}){const a=t.impact==="critical"?"bg-rose-200 text-rose-900":t.impact==="serious"?"bg-orange-200 text-orange-900":t.impact==="moderate"?"bg-amber-200 text-amber-900":"bg-slate-200 text-slate-700";return e.jsxs("li",{className:"px-3 py-2.5 space-y-1.5",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:`shrink-0 inline-flex items-center justify-center font-mono text-[10px] font-bold rounded px-1.5 py-0.5 uppercase ${a}`,children:t.impact}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("p",{className:"text-xs font-medium text-slate-900",children:[e.jsx("span",{className:"font-mono text-[11px] text-slate-500 mr-1.5",children:t.wcagCriterion||"wcag"}),e.jsx("code",{className:"text-[11px] text-slate-700 bg-slate-100 px-1 rounded",children:t.ruleId})]}),e.jsx("p",{className:"text-[11px] text-slate-600 mt-0.5 leading-snug",children:t.description}),e.jsx("p",{className:"text-[10px] text-slate-500 mt-0.5 font-mono break-all",children:t.target.selector})]})]}),e.jsx("div",{className:"flex items-center gap-1.5",children:e.jsx("button",{type:"button",onClick:s,className:"text-[10px] px-2 py-0.5 border border-slate-300 bg-white text-slate-700 rounded hover:bg-slate-50",children:"Open in Violations →"})})]})}const ot=[{id:"2.4.3",label:"Focus order",blurb:"AI walks Tab/Shift+Tab and judges screenshot-by-screenshot whether focus reaches every interactive element."},{id:"2.1.2",label:"No keyboard trap",blurb:"AI Tab-cycles forward then Shift+Tab back; verifies every focusable can be left."},{id:"2.4.7",label:"Focus visible",blurb:"AI inspects each focus-state screenshot for a visible indicator (outline/ring/underline)."},{id:"1.3.2",label:"Meaningful sequence",blurb:"AI vision over the page screenshot judges whether DOM-flagged divergences are real reading-order breaks or layout artifacts."},{id:"1.4.11",label:"Non-text contrast",blurb:"AI vision evaluates UI controls + state indicators for adequate contrast against their adjacent colors."},{id:"2.5.3",label:"Label in Name",blurb:"DOM walker collects {visibleText, accessibleName} pairs across every interactive control; AI judges ambiguous cases (icons, plurals, smart-quotes)."}],oo={pass:"bg-emerald-500 text-white",fail:"bg-rose-600 text-white",uncertain:"bg-amber-500 text-slate-900"};function lo({componentId:t}){const[s,a]=m.useState({}),[n,r]=m.useState({});m.useEffect(()=>{let u=!1;return(async()=>{if(!t){a({}),r({});return}const[h,x]=await Promise.all([Ie(t),Le([t])]);if(u)return;const b={};for(const N of h)b[N.criterionId]=N;a(b);const w={};for(const N of x)w[N.criterionId]=N;r(w)})(),()=>{u=!0}},[t]);const o={};for(const[u,h]of Object.entries(s))o[u]=n[u]?"pass":h.verdict;const l=Object.values(o).length,i=Object.values(o).filter(u=>u==="pass").length,d=Object.values(o).filter(u=>u==="fail").length,p=Object.values(o).filter(u=>u==="uncertain").length,c=Object.keys(n).length;return e.jsxs("section",{className:"border border-slate-200 rounded-lg bg-white overflow-hidden",children:[e.jsxs("header",{className:"px-3 py-2 border-b border-slate-100 flex items-baseline gap-2",children:[e.jsx("h3",{className:"text-xs font-semibold text-slate-900",children:"AI verified"}),e.jsx("p",{className:"text-[11px] font-mono text-slate-500",children:l===0?`not configured · all ${ot.length} criteria pending human verification`:`${l}/${ot.length} · ${i} pass · ${d} fail · ${p} uncertain${c>0?` · ${c} human-verified`:""}`})]}),l===0?e.jsxs("div",{className:"px-3 py-2.5 text-[11px] text-slate-600 leading-snug",children:["When an Anthropic API key is set in ",e.jsx("strong",{children:"Settings → AI"}),', these 5 criteria run automatically after every audit — replacing manual keyboard and vision checks. Without a key, they show as "pending human verification" in the Evidence layers below.']}):e.jsx("ul",{className:"divide-y divide-slate-100",children:ot.map(u=>{const h=s[u.id],x=n[u.id],b=h==null?void 0:h.verdict,w=x?"pass":b,N=h?_t(h.reasoning):!1,E=h?ta(h.reasoning):!1,I=h?Dt(h.reasoning):null;return e.jsxs("li",{className:"px-3 py-2 flex items-start gap-2.5",children:[e.jsx("span",{className:`shrink-0 inline-flex items-center justify-center font-mono text-[10px] font-medium rounded px-1.5 py-0.5 ${x?"bg-emerald-500 text-white":w?oo[w]:"bg-slate-200 text-slate-500"}`,title:x?`Human verified at ${new Date(x.acknowledgedAt).toLocaleString()} — note: "${x.note}". (AI verdict was: ${b})`:w?`AI verdict: ${w}${I?` (cascade ${I})`:""}`:"AI did not produce a verdict on this criterion",children:x?"✓ verified":w||"not run"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("p",{className:"text-xs font-medium text-slate-900",children:[e.jsx("span",{className:"font-mono text-[11px] text-slate-500 mr-1.5",children:u.id}),u.label,E&&e.jsx("span",{className:"ml-2 text-[10px] text-slate-500 font-normal",children:"· manual override"})]}),e.jsx("p",{className:"text-[11px] text-slate-500 leading-snug mt-0.5",children:u.blurb}),N&&!E&&!x&&h&&e.jsxs("div",{className:"mt-1.5 bg-amber-50 border border-amber-300 rounded p-2 space-y-1.5",children:[e.jsx("p",{className:"text-[10px] text-amber-900 font-medium",children:"AI cascade flagged this — fix the issue and re-audit."}),e.jsxs("details",{className:"text-[10px] text-amber-900",children:[e.jsx("summary",{className:"cursor-pointer hover:underline select-none font-medium",children:"What AI saw (click to expand)"}),e.jsx("p",{className:"mt-1 leading-snug whitespace-pre-wrap font-mono text-[10px] text-amber-900 max-h-32 overflow-y-auto bg-white/50 p-1.5 rounded",children:h.reasoning})]})]}),x&&e.jsxs("div",{className:"mt-1.5 bg-emerald-50 border border-emerald-300 rounded p-2",children:[e.jsxs("p",{className:"text-[10px] text-emerald-900",children:[e.jsx("strong",{children:"Human verified:"})," ",x.note]}),e.jsxs("p",{className:"text-[10px] text-emerald-700 mt-0.5",children:["Recorded ",new Date(x.acknowledgedAt).toLocaleString(),". Original AI verdict: ",b,"."]})]})]})]},u.id)})})]})}function co(){return e.jsxs("div",{className:"border-t border-slate-200 pt-3 space-y-1.5",children:[e.jsx("h3",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500 px-0.5",children:"how to read this"}),e.jsx(Re,{title:"The overall grade",body:'Count-based aggregation of the 9 verification areas (rc.110). The headline letter is the worst sub-grade letter you have N of — one C drops the overall off A regardless of how clean the other 8 areas look. This keeps a single bad area from hiding behind a high arithmetic mean. It is separate from "WCAG 2.1 AA Status," which is the legal-conformance answer (binary: conformant or not). The grade can be A while AA Status says "Not conformant" if there are unresolved criterion-level items — those are different questions and both are reported.'}),e.jsx(Re,{title:"WCAG 2.1 AA Status",body:"Separate from the letter grade. Says whether you can claim WCAG 2.1 AA conformance. It is binary: Conformant or Not conformant. When Not conformant, the breakdown shows how many criteria are failing (real axe/AI violations) and how many are inconclusive (items that need user disposition). Fix or mark verified to flip to Conformant."}),e.jsx(Re,{title:"Verification areas",body:`Nine categories grouped by lawsuit-mill priority. Each gets its own letter so a single bad area can't hide behind a high overall mean. Areas below A show "verify with X →" — but when an AI walkthrough has already produced a verdict for that criterion, the prompt is suppressed automatically.`}),e.jsx(Re,{title:"AI does most of the human work",body:"Six AI walkthroughs auto-run when an Anthropic API key is configured: 2.4.3 Focus Order, 2.1.2 No Keyboard Trap, 2.4.7 Focus Visible, 1.3.2 Meaningful Sequence, 1.4.11 Non-text Contrast, 2.5.3 Label in Name. They drive real keyboard input + take screenshots + judge them with vision (and parse DOM accessible-name vs visible-text for 2.5.3) — exactly the work IGT manual workflows used to require. Their verdicts feed the Tab order / Keyboard / Reading order / Color & contrast / Forms sub-grades automatically. When AI returns a definitive pass or fail for an area, the heuristic findings for that area become supporting evidence rather than independent severity (rc.227). Humans only spot-check + attest before signing the formal report."}),e.jsx(Re,{title:"Fix recipes",body:'Every finding includes specific remediation instructions in the AI fix prompt export (Delta lens → Export menu). The prompt also includes false-positive guidance (skip-links, multi-column layouts, portal-rendered modals) so AI can ask before "fixing" intentional patterns.'}),e.jsx(Re,{title:"WCAG 2.1 AA coverage",body:"Of 50 applicable Level AA criteria, how many have a definite verdict from any layer (automation, AI, or human). Untested criteria don't cap your grade — automation did everything it could — but for a formal conformance claim, those still need explicit evaluation. Run a Site Crawl or open Compliance to fill the gaps."}),e.jsx(Re,{title:"Path to full compliance",body:"The shortest sequence of actions: fix automated violations, let AI walkthroughs auto-resolve the keyboard/vision criteria, optionally spot-check via Compliance → Sign and seal. Export the AI fix prompt from the Delta lens for code-level walkthroughs of each issue."})]})}function Re({title:t,body:s}){return e.jsxs("details",{className:"border border-slate-200 rounded bg-slate-50",children:[e.jsx("summary",{className:"px-2.5 py-1.5 text-[12px] font-medium text-slate-800 cursor-pointer hover:bg-slate-100 rounded",children:t}),e.jsx("p",{className:"px-2.5 pb-2 text-[11px] text-slate-700 leading-snug",children:s})]})}function uo({componentId:t,records:s,stateCount:a}){const[n,r]=m.useState(0),[o,l]=m.useState({});return m.useEffect(()=>{if(!t){l({});return}let i=!1;return Le([t]).then(d=>{if(i)return;const p={};for(const c of d)p[c.criterionId]=c;l(p)}),()=>{i=!0}},[t,n]),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("p",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500 px-0.5",children:[s.length," AI walkthrough finding",s.length===1?"":"s"," · axe found none"]}),e.jsxs("p",{className:"text-[11px] text-slate-600 px-0.5 leading-snug",children:["axe-core ran clean across ",a," state",a===1?"":"s",", but AI walkthroughs flagged something axe can't detect. Use the inline buttons on each row — no need to navigate elsewhere."]}),s.map(i=>e.jsx("div",{className:"border border-slate-200 rounded bg-white p-2",children:e.jsx(ts,{componentId:t??"",pageUrl:i.pageUrl,criterionId:i.criterionId,record:i,onChanged:()=>r(d=>d+1),ack:o[i.criterionId]??null})},i.criterionId))]})}function po({results:t}){const s=y(i=>i.dismissedKeys),a=y(i=>i.componentId),n=new Set,r=[];for(const i of t)for(const d of i.violations){if(s.has(`violation::${d.matchKey}`))continue;const p=Mt(d);n.has(p)||(n.add(p),r.push(d))}r.sort((i,d)=>{const p=gt[i.impact]??99,c=gt[d.impact]??99;return p-c});const[o,l]=m.useState([]);return m.useEffect(()=>{if(!a){l([]);return}let i=!1;return Ie(a).then(d=>{i||l(d.filter(p=>p.verdict!=="pass"))}),()=>{i=!0}},[a]),r.length===0&&o.length===0?e.jsxs("div",{className:"text-center text-sm text-slate-600 py-6",children:["No issues detected on this page — no axe violations and no AI walkthrough findings. The grade reflects sub-grading on areas that may have heuristic observations (visible under ",e.jsx("strong",{children:"Per-area"}),")."]}):r.length===0&&o.length>0?e.jsx(uo,{componentId:a,records:o,stateCount:t.length}):e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("p",{className:"text-[11px] font-mono uppercase tracking-wider text-slate-500 px-0.5",children:[r.length," unique violation",r.length===1?"":"s"," · sorted by impact"]}),r.map(i=>e.jsx(Ze,{violation:i},Mt(i)))]})}const ho={"deposition-packet":"Deposition packet · court-grade","defense-bundle":"Defense bundle · locally anchored","html-print":"HTML print · printable","ai-prompt":"AI fix prompt · markdown"};function mo({pageUrl:t}){const s=y(p=>p.tier),a=Bt(s),n=ft(s,"autoExportAuditReports"),[r,o]=m.useState(null),[l,i]=m.useState(null);if(m.useEffect(()=>{let p=!1;return(async()=>{const c=await na();if(p||o(c),t){const u=await Tn(t);p||i(u)}})(),()=>{p=!0}},[t]),a||!n||!r||!r.enabled)return null;const d=r.formats.length===1?ho[r.formats[0]].split(" · ")[0]:`${r.formats.length} formats`;return e.jsxs("div",{className:"border border-emerald-200 rounded-lg bg-emerald-50 p-2.5 space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("h3",{className:"text-[12px] font-semibold text-emerald-900",children:"✓ Remediation trail active"}),e.jsx("span",{className:"text-[10px] text-emerald-800 font-mono",children:d})]}),l?e.jsxs("p",{className:"text-[10px] text-emerald-800 leading-snug",children:["Last exported ",e.jsx("span",{className:"font-mono",children:new Date(l.exportedAt).toLocaleString()})," ","as ",e.jsx("span",{className:"font-mono",children:l.filename})]}):e.jsx("p",{className:"text-[10px] text-emerald-800 italic",children:"No audit has auto-exported on this page yet. Your next audit will download to Downloads automatically."})]})}const Pt="igtRuns";async function xo(t,s,a){const n=s[0];if(!n)return;const r=n.pageUrl;if(!r)return;const o=`Auto-dismissed by Guided test: "${a}" marked pass`;if(t==="tab-order"){const l=n.tabOrderIssues??[];if(l.length===0)return;await Xe(r,l.map(i=>({key:Je(i.selector),reason:o,snippet:`${i.selector} — ${i.textSnippet||"(no text)"}`})))}else if(t==="reading-order"){const l=n.readingOrderIssues??[];if(l.length===0)return;await Xe(r,l.map(i=>({key:Ye(i.selector),reason:o,snippet:`${i.selector} — ${i.textSnippet||"(no text)"}`})))}}const go={outline:{type:"OUTLINE_SHOW_REQUEST"},"tab-order":{type:"TAB_ORDER_SHOW_REQUEST"},"reading-order":{type:"READING_ORDER_SHOW_REQUEST"},targets:{type:"TARGET_SIZE_SHOW_REQUEST"},"fix-preview":{type:"FIX_PREVIEW_SHOW_REQUEST"}},fo={outline:{type:"OUTLINE_HIDE_REQUEST"},"tab-order":{type:"TAB_ORDER_HIDE_REQUEST"},"reading-order":{type:"READING_ORDER_HIDE_REQUEST"},targets:{type:"TARGET_SIZE_HIDE_REQUEST"},"fix-preview":{type:"FIX_PREVIEW_HIDE_REQUEST"}},bo={outline:"Outline","tab-order":"Tab order","reading-order":"Reading order",targets:"Targets","fix-preview":"Fix preview"};async function Fs(t,s){const a=await ue();if(!a)return;const n=s?go[t]:fo[t];try{await be(a,n)}catch{}}async function vo(){const s=(await chrome.storage.local.get(Pt))[Pt];return s&&typeof s=="object"?s:{}}async function Ms(t){await chrome.storage.local.set({[Pt]:t})}function yo(t,s){if(!t.relatedAxeRule||s.length===0)return null;const a=s.flatMap(n=>n.violations.filter(r=>r.ruleId===t.relatedAxeRule));if(a.length>0){const n=Array.from(new Set(a.map(r=>`${r.currentState.pseudoState}·${r.currentState.theme}·${r.currentState.direction}`)));return{kind:"flagged",ruleId:t.relatedAxeRule,violationCount:a.length,states:n}}return{kind:"clean",ruleId:t.relatedAxeRule,statesAudited:s.length}}function wo(){const t=y(c=>c.componentId),s=y(c=>c.results),[a,n]=m.useState({}),[r,o]=m.useState(null);if(m.useEffect(()=>{vo().then(n)},[]),!t)return e.jsx("div",{className:"p-4 text-center text-slate-500 text-sm",children:"Run an audit on a component first, then run guided tests against it. Results are per-component and persist across sessions."});const l=a[t]??{};function i(c,u,h){var b;const x={...a,[t]:{...l,[c]:{...l[c]??{componentId:t,workflowId:c,steps:{},completedAt:new Date().toISOString()},steps:{...((b=l[c])==null?void 0:b.steps)??{},[u]:h},completedAt:new Date().toISOString()}}};if(n(x),Ms(x),h.status==="pass"){const w=fe.find(E=>E.id===c),N=w==null?void 0:w.steps.find(E=>E.id===u);N!=null&&N.autoDismissActivity&&xo(N.autoDismissActivity,s,u)}}function d(c){if(typeof confirm=="function"&&!confirm("Clear all answers for this workflow?"))return;const u={...l};delete u[c];const h={...a,[t]:u};n(h),Ms(h)}const p=fe.find(c=>c.id===r);if(p){const c=l[p.id];return e.jsx(jo,{workflow:p,run:c,results:s,onAnswer:(u,h)=>i(p.id,u,h),onBack:()=>o(null)})}return e.jsxs("div",{className:"p-3 space-y-2",children:[e.jsx("p",{className:"text-xs text-slate-500 mb-2",children:"Guided manual checks for the accessibility concerns automation can't fully cover. Walk through each step, record pass/fail/skip, and the results persist per-component."}),fe.map(c=>{const u=l[c.id],h=u?nn(u,c):null,x=u?h!=null&&h.failed&&h.failed>0?"failed":h!=null&&h.unanswered&&h.unanswered>0?"in-progress":"done":"unstarted",b={unstarted:"border-slate-200 bg-white hover:bg-slate-50","in-progress":"border-amber-300 bg-amber-50 hover:bg-amber-100",failed:"border-rose-300 bg-rose-50 hover:bg-rose-100",done:"border-emerald-300 bg-emerald-50 hover:bg-emerald-100"}[x];return e.jsxs("button",{type:"button",onClick:()=>o(c.id),className:`w-full text-left border rounded p-2 block transition-colors ${b}`,children:[e.jsxs("div",{className:"flex items-start justify-between gap-2 mb-1",children:[e.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[e.jsx("span",{className:"font-medium text-xs",children:c.name}),x==="done"&&e.jsx("span",{className:"text-[10px] text-emerald-700",children:"✓"}),x==="in-progress"&&h&&e.jsxs("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-amber-200 text-amber-900 font-semibold",children:[h.unanswered," unanswered"]})]}),h&&e.jsxs("span",{className:"text-[10px] text-slate-600 shrink-0",children:[e.jsxs("span",{className:"text-emerald-700",children:[h.passed," pass"]}),h.failed>0&&e.jsxs("span",{className:"text-rose-700",children:[" · ",h.failed," fail"]}),h.notApplicable>0&&e.jsxs("span",{children:[" · ",h.notApplicable," N/A"]}),h.skipped>0&&e.jsxs("span",{children:[" · ",h.skipped," skip"]})," / ",h.total]})]}),e.jsx("p",{className:"text-[11px] text-slate-500",children:c.blurb}),u&&e.jsx("button",{type:"button",onClick:w=>{w.stopPropagation(),d(c.id)},className:"text-[11px] text-slate-500 hover:text-rose-600 mt-1",children:"Clear answers"})]},c.id)})]})}function jo({workflow:t,run:s,results:a,onAnswer:n,onBack:r}){const o=m.useMemo(()=>{const d={};for(const p of t.steps)d[p.id]=yo(p,a);return d},[t,a]);function l(){for(const d of t.steps){const p=o[d.id];(p==null?void 0:p.kind)==="clean"&&!(s!=null&&s.steps[d.id])&&n(d.id,{status:"pass",notes:`Auto-marked via axe-clean evidence (${p.ruleId}, ${p.statesAudited} states).`})}}const i=t.steps.filter(d=>{var p;return((p=o[d.id])==null?void 0:p.kind)==="clean"&&!(s!=null&&s.steps[d.id])}).length;return e.jsxs("div",{className:"p-3 space-y-3",children:[e.jsx("button",{type:"button",onClick:r,className:"text-xs text-brand-600 hover:underline",children:"← Back to workflows"}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:t.name}),e.jsx("p",{className:"text-xs text-slate-500 mt-1",children:t.blurb}),i>0&&e.jsxs("div",{className:"mt-2 flex items-center justify-between gap-2 border border-emerald-300 bg-emerald-50 rounded p-2",children:[e.jsxs("span",{className:"text-[11px] text-emerald-900",children:[i," step",i===1?"":"s"," have a matching axe rule that ran clean across the audit — you can mark them pass in one click and only do the genuinely manual checks."]}),e.jsxs("button",{type:"button",onClick:l,className:"text-[11px] px-2 py-1 bg-emerald-600 text-white rounded hover:bg-emerald-700 shrink-0",children:["Auto-mark ",i," →"]})]})]}),e.jsx("div",{className:"space-y-3",children:t.steps.map((d,p)=>{const c=s==null?void 0:s.steps[d.id];return e.jsxs("div",{className:`border rounded p-2 ${(c==null?void 0:c.status)==="pass"?"border-emerald-300 bg-emerald-50":(c==null?void 0:c.status)==="fail"?"border-rose-300 bg-rose-50":(c==null?void 0:c.status)==="skip"?"border-slate-200 bg-slate-50":"border-slate-200 bg-white"}`,children:[e.jsxs("div",{className:"flex items-start justify-between gap-2 mb-1",children:[e.jsxs("span",{className:"text-[11px] text-slate-500 font-mono",children:[p+1,"/",t.steps.length]}),e.jsxs("div",{className:"flex items-center gap-1",children:[d.severity==="required"&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-rose-100 text-rose-700 rounded",children:"required"}),d.wcag&&e.jsxs("span",{className:"text-[10px] text-slate-500",children:["WCAG ",d.wcag]})]})]}),e.jsxs("p",{className:"text-xs text-slate-700 mb-1",children:[e.jsx("strong",{children:"Do:"})," ",d.prompt]}),e.jsxs("p",{className:"text-xs text-slate-700 mb-2",children:[e.jsx("strong",{children:"Verify:"})," ",d.question]}),d.relatedAxeRule&&e.jsxs("p",{className:"text-[11px] text-slate-500 mb-2",children:["Related axe rule: ",e.jsx("code",{className:"font-mono",children:d.relatedAxeRule})]}),(()=>{const u=o[d.id];return u?u.kind==="clean"?e.jsxs("div",{className:"text-[11px] mb-2 p-1.5 rounded border border-emerald-200 bg-emerald-50 text-emerald-900 flex items-start justify-between gap-2",children:[e.jsxs("span",{children:["✓ Auto-evidence: axe rule ",e.jsx("code",{className:"font-mono",children:u.ruleId})," ran clean across ",u.statesAudited," state",u.statesAudited===1?"":"s",". Quick visual check, then mark pass."]}),!c&&e.jsx("button",{type:"button",onClick:()=>n(d.id,{status:"pass",notes:`Auto-marked via axe-clean evidence (${u.ruleId}, ${u.statesAudited} states).`}),className:"text-[10px] px-1.5 py-0.5 bg-emerald-600 text-white rounded hover:bg-emerald-700 shrink-0",children:"Mark pass"})]}):e.jsxs("div",{className:"text-[11px] mb-2 p-1.5 rounded border border-rose-200 bg-rose-50 text-rose-900 flex items-start justify-between gap-2",children:[e.jsxs("span",{children:["⚠ Auto-flag: axe rule ",e.jsx("code",{className:"font-mono",children:u.ruleId})," already found ",u.violationCount," violation",u.violationCount===1?"":"s"," in"," ",u.states.length," state",u.states.length===1?"":"s",". Verify and mark fail."]}),!c&&e.jsx("button",{type:"button",onClick:()=>n(d.id,{status:"fail",notes:`Auto-flagged via axe violations (${u.ruleId}, ${u.violationCount} hits in: ${u.states.join(", ")}).`}),className:"text-[10px] px-1.5 py-0.5 bg-rose-600 text-white rounded hover:bg-rose-700 shrink-0",children:"Mark fail"})]}):null})(),d.visualizer&&e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsxs("button",{type:"button",onClick:()=>void Fs(d.visualizer,!0),className:"text-[11px] px-2 py-0.5 bg-brand-500 text-white rounded hover:bg-brand-600",children:["Show ",bo[d.visualizer]]}),e.jsx("button",{type:"button",onClick:()=>void Fs(d.visualizer,!1),className:"text-[11px] px-2 py-0.5 border border-slate-300 text-slate-600 rounded hover:bg-slate-100",children:"Hide"}),e.jsx("span",{className:"text-[10px] text-slate-500",children:"Helps verify this step on the target page."})]}),e.jsxs("div",{className:"flex gap-1 flex-wrap",children:[e.jsx(st,{label:"Pass",active:(c==null?void 0:c.status)==="pass",tone:"emerald",onClick:()=>n(d.id,{status:"pass",notes:c==null?void 0:c.notes})}),e.jsx(st,{label:"Fail",active:(c==null?void 0:c.status)==="fail",tone:"rose",onClick:()=>n(d.id,{status:"fail",notes:c==null?void 0:c.notes})}),e.jsx(st,{label:"N/A",active:(c==null?void 0:c.status)==="not-applicable",tone:"slate",onClick:()=>n(d.id,{status:"not-applicable",notes:c==null?void 0:c.notes})}),e.jsx(st,{label:"Skip",active:(c==null?void 0:c.status)==="skip",tone:"slate",onClick:()=>n(d.id,{status:"skip",notes:c==null?void 0:c.notes})})]}),c&&e.jsx("textarea",{placeholder:"Notes (optional)",value:c.notes??"",onChange:u=>n(d.id,{status:c.status,notes:u.target.value}),rows:2,className:"w-full mt-2 text-[11px] border border-slate-200 rounded p-1.5"})]},d.id)})})]})}const No={emerald:"bg-emerald-500 text-white border-emerald-500",rose:"bg-rose-500 text-white border-rose-500",slate:"bg-slate-300 text-slate-800 border-slate-300"};function st({label:t,active:s,tone:a,onClick:n}){return e.jsx("button",{type:"button",onClick:n,className:`text-[11px] px-2 py-1 rounded border ${s?No[a]:"bg-white text-slate-700 border-slate-300 hover:bg-slate-50"}`,children:t})}const lt="savedFlows";async function ko(){const t=await chrome.storage.local.get(lt);return Array.isArray(t[lt])?t[lt]:[]}async function Ps(t){await chrome.storage.local.set({[lt]:t})}function So(){const[t,s]=m.useState([]),[a,n]=m.useState(!1),[r,o]=m.useState(null);m.useEffect(()=>{ko().then(s)},[]);async function l(){const c=await ue();if(!c){o("No audit-target tab found.");return}try{await be(c,{type:"FLOW_RECORD_START_REQUEST"}),n(!0),o("Recording. Switch to the page and perform actions, then come back and Stop.")}catch{o("Failed to start recording.")}}async function i(){const c=await ue();if(c)try{const u=await Ee(c,{type:"FLOW_RECORD_STOP_REQUEST"});if(n(!1),u.steps.length===0){o("Recording stopped — no steps captured.");return}const h=typeof prompt=="function"?prompt(`Captured ${u.steps.length} steps. Name this flow:`,"")??"":`Flow ${new Date().toLocaleTimeString()}`;if(!h.trim()){o("Save canceled.");return}const x={id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,name:h.trim(),steps:u.steps,savedAt:new Date().toISOString()},b=[x,...t];s(b),await Ps(b),o(`Saved "${x.name}" with ${x.steps.length} steps.`)}catch(u){o(`Stop failed: ${u instanceof Error?u.message:String(u)}`)}}async function d(c){const u=await ue();if(u){o(`Replaying "${c.name}"…`);try{const h=await Ee(u,{type:"FLOW_PLAY_REQUEST",steps:c.steps});o(`Replayed ${h.played} step${h.played===1?"":"s"}`+(h.errored?`, ${h.errored} errored (selector not found)`:"")+".")}catch(h){o(`Replay failed: ${h instanceof Error?h.message:String(h)}`)}}}async function p(c){if(typeof confirm=="function"&&!confirm("Delete this flow?"))return;const u=t.filter(h=>h.id!==c);s(u),await Ps(u)}return e.jsxs("div",{className:"p-3 space-y-3",children:[e.jsx("p",{className:"text-xs text-slate-500",children:"Record click/input/keydown sequences on the audited page, then replay them later. Useful for auditing journeys (login → navigate → form) instead of static pages. After replay, run an audit on the resulting state."}),e.jsx("div",{className:"flex gap-2",children:a?e.jsx("button",{onClick:i,className:"text-xs px-3 py-1 bg-slate-700 text-white rounded hover:bg-slate-800",children:"■ Stop & save"}):e.jsx("button",{onClick:l,className:"text-xs px-3 py-1 bg-rose-500 text-white rounded hover:bg-rose-600",children:"● Record flow"})}),r&&e.jsx("p",{className:"text-[11px] text-slate-600 italic",children:r}),t.length===0?e.jsx("p",{className:"text-xs text-slate-500 italic",children:"No saved flows yet."}):e.jsx("div",{className:"space-y-2",children:t.map(c=>e.jsxs("div",{className:"border border-slate-200 rounded p-2 bg-white flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"font-medium text-xs",children:c.name}),e.jsxs("div",{className:"text-[11px] text-slate-500 mt-0.5",children:[c.steps.length," step",c.steps.length===1?"":"s"," ·"," ",new Date(c.savedAt).toLocaleDateString()]})]}),e.jsxs("div",{className:"flex gap-1 shrink-0",children:[e.jsx("button",{onClick:()=>d(c),className:"text-[11px] px-2 py-0.5 border border-slate-300 rounded text-slate-700 hover:bg-slate-50",children:"Replay"}),e.jsx("button",{onClick:()=>p(c.id),className:"text-[11px] text-slate-500 hover:text-rose-600 px-1",title:"Delete flow",children:"✕"})]})]},c.id))})]})}function Ao(t){const s=t.indexOf("::");if(s===-1)return{primary:t};const a=t.slice(0,s),n=t.slice(s+2),r=n.indexOf(":");if(r===-1)return{primary:n};const o=n.slice(0,r),l=n.slice(r+1);return o==="story"?{primary:l.split("--").map(d=>d.split("-").map(Co).join(" ")).join(" / "),secondary:"storybook"}:{primary:l,secondary:a||o}}function Co(t){return t.length===0?t:t[0].toUpperCase()+t.slice(1)}function Io(){const t=y(i=>i.baselineList),s=y(i=>i.tier),a=ra[s].maxBaselines,n=t.length>=a&&Number.isFinite(a),[r,o]=m.useState(!1);if(m.useEffect(()=>{ht().finally(()=>o(!0))},[]),!r)return e.jsx("div",{className:"p-3 space-y-2","aria-label":"Loading scorecard",children:[0,1,2].map(i=>e.jsxs("div",{className:"border border-slate-200 rounded p-2 bg-white animate-pulse",children:[e.jsx("div",{className:"h-3 bg-slate-200 rounded w-2/3 mb-2"}),e.jsx("div",{className:"h-2 bg-slate-100 rounded w-1/3"})]},i))});if(t.length===0)return e.jsx("div",{className:"p-4 text-center text-slate-500 text-sm",children:"No baselines yet. After your first audit, accept the result as a baseline to track only NEW violations going forward."});async function l(i){await ae({type:"BASELINE_DELETE",componentId:i}),await ht()}return e.jsxs("div",{className:"p-3 space-y-2",children:[e.jsxs("p",{className:"text-xs text-slate-500 mb-2",children:[t.length," ",t.length===1?"component":"components"," tracked",Number.isFinite(a)&&e.jsxs("span",{className:"text-amber-700",children:[" · ",s," tier limit: ",a]})]}),n&&e.jsxs("div",{className:"text-xs bg-amber-50 border border-amber-200 rounded p-2 text-amber-900",children:["You've hit the ",s,"-tier baseline limit. Upgrade for unlimited tracked components."]}),t.map(i=>{const d=Ao(i.componentId),p=i.metrics;return e.jsxs("div",{className:"border border-slate-200 rounded p-2 bg-white flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"font-medium text-xs truncate",title:i.componentId,children:d.primary}),d.secondary&&e.jsx("div",{className:"text-[11px] text-slate-500 truncate",title:d.secondary,children:d.secondary}),e.jsxs("div",{className:"text-xs text-slate-500 mt-0.5",children:[i.violationCount," ",i.violationCount===1?"violation":"violations"," ·"," ",new Date(i.lastUpdated).toLocaleDateString()]}),p&&e.jsxs("div",{className:"flex flex-wrap gap-1 mt-1.5",children:[i.seenOnUrlsCount&&i.seenOnUrlsCount>1&&e.jsxs(Te,{tone:"indigo",title:"This component pattern has been audited on multiple URLs",children:["seen on ",i.seenOnUrlsCount," pages"]}),p.criticalCount>0&&e.jsxs(Te,{tone:"rose",title:`${p.criticalCount} critical violations`,children:[p.criticalCount," critical"]}),p.seriousCount>0&&e.jsxs(Te,{tone:"orange",title:`${p.seriousCount} serious violations`,children:[p.seriousCount," serious"]}),p.focusResetCount>0&&e.jsxs(Te,{tone:"rose",title:`${p.focusResetCount} focus resets observed`,children:[p.focusResetCount," focus reset",p.focusResetCount===1?"":"s"]}),p.targetSizeFailCount>0&&e.jsxs(Te,{tone:"amber",title:"Targets smaller than WCAG 2.5.8 minimum",children:[p.targetSizeFailCount," small targets"]}),p.hoverContrastFail&&e.jsx(Te,{tone:"amber",title:"Contrast failure on :hover state",children:"hover-contrast"}),p.announcementCount>0&&e.jsxs(Te,{tone:"indigo",title:"aria-live announcements observed",children:[p.announcementCount," announce"]})]})]}),e.jsx("button",{onClick:()=>l(i.componentId),className:"text-xs text-slate-500 hover:text-red-600 shrink-0",title:"Reset baseline",children:"Reset"})]},i.componentId)})]})}const Eo={rose:"bg-rose-100 text-rose-700",orange:"bg-orange-100 text-orange-700",amber:"bg-amber-100 text-amber-700",indigo:"bg-indigo-100 text-indigo-700"};function Te({tone:t,title:s,children:a}){return e.jsx("span",{title:s,className:`text-[10px] px-1.5 py-0.5 rounded ${Eo[t]}`,children:a})}const ct="wcagcheckr";function te(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Qe(t){try{const s=new Date(t);return Number.isNaN(s.getTime())?t:s.toLocaleString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1,timeZoneName:"short"})}catch{return t}}function Ro(t){return Array.from(new Set(t.map(s=>s.axeVersion).filter(Boolean))).sort()}function To(t){if(t.length===0)return null;const s=[...t].sort((a,n)=>a.capturedAt.localeCompare(n.capturedAt));return{earliest:s[0].capturedAt,latest:s[s.length-1].capturedAt}}function $o(t){const s=new Map;for(const a of t){const n=s.get(a.componentId);n?(n.entries.push(a),a.receipt&&n.anchoredCount++,a.capturedAt>n.latest.capturedAt&&(n.latest=a,n.pageUrl=a.pageUrl)):s.set(a.componentId,{componentId:a.componentId,pageUrl:a.pageUrl,entries:[a],latest:a,anchoredCount:a.receipt?1:0})}for(const a of s.values())a.entries.sort((n,r)=>r.capturedAt.localeCompare(n.capturedAt));return Array.from(s.values()).sort((a,n)=>n.latest.capturedAt.localeCompare(a.latest.capturedAt))}function Uo(t){switch(t){case"A":return"grade-a";case"B":return"grade-b";case"C":return"grade-c";case"D":return"grade-d";case"F":return"grade-f"}}function Lo(t){const s=t.totals,a=[s.critical?`<span class="sev-crit">${s.critical} critical</span>`:"",s.serious?`<span class="sev-serious">${s.serious} serious</span>`:"",s.moderate?`<span class="sev-mod">${s.moderate} moderate</span>`:"",s.minor?`<span class="sev-minor">${s.minor} minor</span>`:""].filter(Boolean).join(" · ")||'<span class="sev-clean">No violations recorded</span>',n=t.receipt?`<tr><th>Trusted timestamp</th><td>RFC 3161 (${te(t.receipt.tsaName)}) — anchored ${te(Qe(t.receipt.anchoredAt))}</td></tr>
|
|
19
19
|
<tr><th>Server signature</th><td>ed25519 over (audit hash + anchor time + TSA name${t.receipt.prevAuditHash?" + previous anchor hash":""}) — key fingerprint <code>${te(t.receipt.serverKeyFingerprint)}</code></td></tr>
|
|
20
20
|
${t.receipt.prevAuditHash?`<tr><th>Chain predecessor</th><td><code class="hash">${te(t.receipt.prevAuditHash)}</code></td></tr>`:""}`:`<tr><th>Trusted timestamp</th><td class="local-only">Local-only entry. Self-attested by ${te(ct)}; not anchored to a public TSA. Lower evidentiary weight than RFC 3161-anchored entries.</td></tr>`;return`
|
|
21
21
|
<article class="entry">
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ErrorBoundary-
|
|
2
|
-
import{_ as l}from"./diff-DA41zYPc.js";import{r as v}from"./crash-reporter-Dc5lvxvY.js";async function C(e){var f,w,y,g;if(e.results.length===0)return;let d;if(e.componentId){const o=await chrome.storage.local.get("igtRuns"),a=((o==null?void 0:o.igtRuns)??{})[e.componentId]??{};d=Object.values(a)}let p,u;const i=((f=e.results[0])==null?void 0:f.pageUrl)??((w=e.results[0])==null?void 0:w.scope)??"";if(i){const{getDismissalsForUrl:o}=await l(async()=>{const{getDismissalsForUrl:t}=await import("./ErrorBoundary-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ErrorBoundary-Buu85ak7.js","assets/styles-DToZ04ht.js","assets/_commonjsHelpers-Cpj98o6Y.js","assets/crash-reporter-Dc5lvxvY.js","assets/ai-usage-log-C-jq4cW3.js","assets/styles-d5msFsnl.css","assets/scheduled-audit-runner-BqTcRkAP.js","assets/diff-DA41zYPc.js","assets/design-system-audit-DpxJrxnb.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{_ as l}from"./diff-DA41zYPc.js";import{r as v}from"./crash-reporter-Dc5lvxvY.js";async function C(e){var f,w,y,g;if(e.results.length===0)return;let d;if(e.componentId){const o=await chrome.storage.local.get("igtRuns"),a=((o==null?void 0:o.igtRuns)??{})[e.componentId]??{};d=Object.values(a)}let p,u;const i=((f=e.results[0])==null?void 0:f.pageUrl)??((w=e.results[0])==null?void 0:w.scope)??"";if(i){const{getDismissalsForUrl:o}=await l(async()=>{const{getDismissalsForUrl:t}=await import("./ErrorBoundary-Buu85ak7.js").then(n=>n.d);return{getDismissalsForUrl:t}},__vite__mapDeps([0,1,2,3,4,5,6,7,8])),r=await o(i);p=Object.keys(r);const{getResolutionsForPage:a}=await l(async()=>{const{getResolutionsForPage:t}=await import("./scheduled-audit-runner-BqTcRkAP.js").then(n=>n.aI);return{getResolutionsForPage:t}},__vite__mapDeps([6,7,3,4])),c=await a(i),x=new Set;for(const t of e.results)for(const n of((y=t.axeRulesEvaluated)==null?void 0:y.incomplete)??[])for(const _ of n.elements??[])x.add(`${n.ruleId}::${_.selector}`);u=c.filter(t=>x.has(`${t.ruleId}::${t.selector}`))}let m;if(e.componentId){const{loadAcknowledgedKeysForComponent:o}=await l(async()=>{const{loadAcknowledgedKeysForComponent:a}=await import("./scheduled-audit-runner-BqTcRkAP.js").then(c=>c.aH);return{loadAcknowledgedKeysForComponent:a}},__vite__mapDeps([6,7,3,4])),r=await o(e.componentId);m=r.size>0?Array.from(r):void 0}const b=await v({type:"EXPORT_REQUEST",format:"ai-prompt",results:e.results,delta:e.delta??void 0,manualRuns:d,siteCrawlReport:e.siteCrawlReport??void 0,dismissedKeys:p,incompleteResolutions:u,acknowledgedKeys:m});try{await navigator.clipboard.writeText(b.content)}catch{}const h=`<!doctype html><html><head><meta charset="utf-8"><title>AI fix prompt</title>
|
|
3
3
|
<style>body{font:14px/1.5 ui-monospace,Menlo,monospace;max-width:920px;margin:24px auto;padding:0 16px;color:#0f172a;}
|
|
4
4
|
.banner{background:#ecfdf5;border:1px solid #6ee7b7;padding:12px 14px;border-radius:6px;margin-bottom:16px;font-family:system-ui;}
|
|
5
5
|
pre{white-space:pre-wrap;word-break:break-word;background:#f8fafc;border:1px solid #e2e8f0;padding:14px;border-radius:6px;font-size:13px;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./modulepreload-polyfill-B5Qt9EMX.js";import{c as t,j as o,R as e}from"./styles-DToZ04ht.js";import{E as i,A as s}from"./ErrorBoundary-
|
|
1
|
+
import"./modulepreload-polyfill-B5Qt9EMX.js";import{c as t,j as o,R as e}from"./styles-DToZ04ht.js";import{E as i,A as s}from"./ErrorBoundary-Buu85ak7.js";import{i as m}from"./crash-reporter-Dc5lvxvY.js";import"./_commonjsHelpers-Cpj98o6Y.js";import"./ai-usage-log-C-jq4cW3.js";import"./scheduled-audit-runner-BqTcRkAP.js";import"./diff-DA41zYPc.js";import"./design-system-audit-DpxJrxnb.js";m("devtools-panel");const r=document.getElementById("root");if(!r)throw new Error("devtools panel: #root not found");t(r).render(o.jsx(e.StrictMode,{children:o.jsx(i,{children:o.jsx(s,{})})}));
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/scheduled-audit-runner-BqTcRkAP.js","assets/diff-DA41zYPc.js","assets/crash-reporter-Dc5lvxvY.js","assets/ai-usage-log-C-jq4cW3.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import"./modulepreload-polyfill-B5Qt9EMX.js";import{j as e,r as d,c as f,R as x}from"./styles-DToZ04ht.js";import{u as c,E as y,A as b}from"./ErrorBoundary-CzXGFZe4.js";import{_ as k}from"./diff-DA41zYPc.js";import{i as j}from"./crash-reporter-Dc5lvxvY.js";import"./_commonjsHelpers-Cpj98o6Y.js";import"./ai-usage-log-C-jq4cW3.js";import"./scheduled-audit-runner-BqTcRkAP.js";import"./design-system-audit-DpxJrxnb.js";function w(){const r=c(n=>n.siteCrawlReport),i=c(n=>n.siteCrawlStatus);if(!r)return e.jsxs("section",{"aria-label":"No audit yet",style:{padding:"var(--v2-pad-7) var(--v2-pad-5)",textAlign:"center",borderBottom:"1px solid var(--v2-border)"},children:[e.jsx("p",{className:"v2-eyebrow",style:{marginBottom:"var(--v2-pad-2)"},children:"waiting for audit"}),e.jsx("h1",{className:"v2-display",style:{fontSize:32,fontWeight:500,letterSpacing:"-0.02em",color:"var(--v2-ink-primary)",margin:0,marginBottom:"var(--v2-pad-3)"},children:"Run an audit to begin."}),e.jsx("p",{style:{color:"var(--v2-ink-secondary)",maxWidth:480,margin:"0 auto",marginBottom:"var(--v2-pad-5)"},children:"Crawl a site or audit the active tab. Findings appear here as a single list — axe violations, AI walkthrough verdicts, and items needing human review use the same row shape with the same actions."}),e.jsx("div",{style:{display:"inline-flex",gap:"var(--v2-pad-2)"},children:e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary",disabled:i==="running",children:"Audit this page"})})]});const a=(r.totalWalkthroughFindings??0)+r.totalUniqueViolations,t=(r.walkthroughAcknowledgements??[]).length,l=r.totalNeedsReview;return e.jsxs("section",{"aria-label":"Audit summary",style:{display:"grid",gridTemplateColumns:"auto 1fr",gap:"var(--v2-pad-6)",padding:"var(--v2-pad-6) var(--v2-pad-5)",borderBottom:"1px solid var(--v2-border)",background:"var(--v2-bg)"},children:[e.jsx(S,{grade:r.siteGrade}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",gap:"var(--v2-pad-3)"},children:[e.jsxs("p",{className:"v2-eyebrow",style:{margin:0},children:["site grade · ",r.pagesAudited," page",r.pagesAudited===1?"":"s"]}),e.jsx("h1",{className:"v2-display",style:{fontSize:22,fontWeight:500,letterSpacing:"-0.01em",color:"var(--v2-ink-primary)",margin:0,lineHeight:1.25},children:a===0&&l===0?"All clear — nothing open.":`${a+l} finding${a+l===1?"":"s"} to address.`}),e.jsx(N,{openCount:a,reviewCount:l,verifiedCount:t,axeCount:r.totalUniqueViolations,walkthroughCount:r.totalWalkthroughFindings??0}),e.jsxs("div",{style:{display:"flex",gap:"var(--v2-pad-2)",marginTop:"var(--v2-pad-2)"},children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary",disabled:i==="running",children:"Re-crawl"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost",disabled:i==="running",title:"Re-run audit but skip walkthroughs that already passed or were human-verified",children:"Verify fixes only"})]})]})]})}function S({grade:r}){const i={A:"var(--v2-grade-a)",B:"var(--v2-grade-b)",C:"var(--v2-grade-c)",D:"var(--v2-grade-d)",F:"var(--v2-grade-f)"};return e.jsx("div",{"aria-label":`Grade ${r}`,role:"img",style:{display:"flex",alignItems:"center",justifyContent:"center",minWidth:140},children:e.jsx("span",{className:"v2-display",style:{fontSize:132,lineHeight:1,fontWeight:500,color:i[r],letterSpacing:"-0.04em",fontVariationSettings:'"opsz" 144'},children:r})})}function N({openCount:r,reviewCount:i,verifiedCount:a,axeCount:t,walkthroughCount:l}){return e.jsxs("dl",{style:{display:"flex",gap:"var(--v2-pad-4)",flexWrap:"wrap",margin:0,color:"var(--v2-ink-secondary)",fontSize:12},children:[e.jsx(v,{term:"open",value:r,tone:r>0?"attention":"neutral"}),e.jsx(v,{term:"review",value:i,tone:i>0?"review":"neutral"}),e.jsx(v,{term:"verified",value:a,tone:a>0?"positive":"neutral"}),e.jsx("span",{style:{color:"var(--v2-ink-faint)"},children:"·"}),e.jsx(v,{term:"axe",value:t,tone:"neutral"}),e.jsx(v,{term:"walkthrough",value:l,tone:"neutral"})]})}function v({term:r,value:i,tone:a}){const t={attention:"var(--v2-critical)",review:"var(--v2-needs-review)",positive:"var(--v2-verified)",neutral:"var(--v2-ink-secondary)"};return e.jsxs("div",{style:{display:"inline-flex",alignItems:"baseline",gap:6},children:[e.jsx("dt",{className:"v2-eyebrow",style:{display:"inline",margin:0,color:"var(--v2-ink-tertiary)"},children:r}),e.jsx("dd",{className:"v2-mono",style:{margin:0,fontWeight:600,fontSize:13,color:t[a],fontVariantNumeric:"tabular-nums"},children:i})]})}function R({row:r}){return e.jsxs("details",{style:{background:"var(--v2-bg-elev)",border:"1px solid var(--v2-border)",borderRadius:6,overflow:"hidden"},children:[e.jsxs("summary",{style:{cursor:"pointer",padding:"var(--v2-pad-3) var(--v2-pad-4)",listStyle:"none",display:"flex",alignItems:"flex-start",gap:"var(--v2-pad-3)"},children:[e.jsx(I,{row:r}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx(A,{row:r}),e.jsx(C,{row:r})]}),e.jsx(W,{})]}),e.jsx("div",{style:{padding:"0 var(--v2-pad-4) var(--v2-pad-4)",borderTop:"1px solid var(--v2-border)"},children:e.jsx(z,{row:r})})]})}function I({row:r}){if(r.kind==="walkthrough-ack")return e.jsx("span",{className:"v2-chip v2-chip-verified","aria-label":"Status: human verified",children:"verified"});if(r.kind==="needs-review")return e.jsx("span",{className:"v2-chip v2-chip-review","aria-label":"Status: needs human review",children:"review"});if(r.kind==="walkthrough-fail")return e.jsx("span",{className:r.verdict==="fail"?"v2-chip v2-chip-serious":"v2-chip v2-chip-moderate","aria-label":`Severity: ${r.verdict}`,children:r.verdict});const i={critical:"v2-chip-critical",serious:"v2-chip-serious",moderate:"v2-chip-moderate",minor:"v2-chip-minor"};return e.jsx("span",{className:`v2-chip ${i[r.impact]}`,"aria-label":`Severity: ${r.impact}`,children:r.impact})}function A({row:r}){const i=r.kind==="walkthrough-fail"||r.kind==="walkthrough-ack"||r.kind==="needs-review"||r.kind==="axe"?r.criterion:null,a=r.kind==="walkthrough-fail"?`AI walkthrough ${r.verdict} on this criterion.`:r.kind==="walkthrough-ack"?"Human-verified by an auditor.":(r.kind==="needs-review",r.description);return e.jsxs("p",{style:{margin:0,marginBottom:4,color:"var(--v2-ink-primary)",fontSize:13,fontWeight:500,lineHeight:1.4},children:[i&&e.jsxs("span",{className:"v2-mono",style:{fontSize:11,fontWeight:600,color:"var(--v2-ink-tertiary)",marginRight:8},children:["WCAG ",i]}),a]})}function C({row:r}){const i=r.kind==="axe"||r.kind==="needs-review"?r.pages.length:1,a=r.kind==="axe"||r.kind==="needs-review"?r.selector:null,t=r.kind==="walkthrough-fail"||r.kind==="walkthrough-ack"?r.pageUrl:null;return e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"var(--v2-pad-2)",flexWrap:"wrap"},children:[a&&e.jsx("code",{className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-secondary)",background:"var(--v2-bg-elev-2)",padding:"2px 6px",borderRadius:2,wordBreak:"break-all"},children:a}),t&&e.jsx("span",{className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-tertiary)",wordBreak:"break-all"},children:t}),i>1&&e.jsxs("span",{className:"v2-eyebrow",style:{marginLeft:"auto"},children:["on ",i," pages"]})]})}function W(){return e.jsx("span",{"aria-hidden":"true",style:{color:"var(--v2-ink-tertiary)",fontFamily:"var(--v2-mono)",fontSize:12,marginLeft:8,marginTop:2},children:"⏵"})}function z({row:r}){return r.kind==="walkthrough-fail"?e.jsxs("div",{style:{paddingTop:"var(--v2-pad-3)"},children:[e.jsx(p,{label:"AI reasoning",children:e.jsx("p",{style:{margin:0,color:"var(--v2-ink-secondary)",fontSize:12,lineHeight:1.6},children:r.reasoning})}),e.jsxs(h,{children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",disabled:!0,children:"Re-run walkthrough"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary v2-btn-sm",disabled:!0,children:"Mark verified manually"})]}),e.jsx(T,{children:"Inline ack flow + re-run wiring lands in the next rc — for now, open the v1 UI (the toggle in Settings) to ack this finding."})]}):r.kind==="walkthrough-ack"?e.jsxs("div",{style:{paddingTop:"var(--v2-pad-3)"},children:[e.jsx(p,{label:"What the human verified",children:e.jsx("p",{style:{margin:0,color:"var(--v2-ink-secondary)",fontSize:12,lineHeight:1.6},children:r.reasoning})}),e.jsxs("p",{style:{color:"var(--v2-ink-tertiary)",fontSize:11,margin:0,marginTop:"var(--v2-pad-2)"},children:["Original AI verdict: ",e.jsx("strong",{children:r.verdict}),". Now treated as pass for conformance."]})]}):r.kind==="needs-review"?e.jsx(B,{row:r}):e.jsxs("div",{style:{paddingTop:"var(--v2-pad-3)"},children:[e.jsx(p,{label:"Affected",children:e.jsxs("ul",{style:{margin:0,padding:0,listStyle:"none",display:"flex",flexDirection:"column",gap:4},children:[r.pages.slice(0,8).map(i=>e.jsx("li",{children:e.jsx("a",{href:i.url,target:"_blank",rel:"noopener noreferrer",className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-secondary)",textDecoration:"underline",textDecorationColor:"var(--v2-ink-faint)",textUnderlineOffset:2},children:i.url})},i.url)),r.pages.length>8&&e.jsxs("li",{className:"v2-eyebrow",children:["+ ",r.pages.length-8," more"]})]})}),e.jsxs(h,{children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",disabled:!0,children:"Show fix recipe"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary v2-btn-sm",disabled:!0,children:"Mark verified manually"})]})]})}function B({row:r}){const[i,a]=d.useState(!1);return e.jsxs("div",{style:{paddingTop:"var(--v2-pad-3)"},children:[r.failureSummary&&e.jsx(p,{label:"AI assessment",children:e.jsx("p",{style:{margin:0,color:"var(--v2-ink-secondary)",fontSize:12,lineHeight:1.6,whiteSpace:"pre-wrap"},children:r.failureSummary})}),e.jsx(p,{label:"Affected",children:e.jsx("ul",{style:{margin:0,padding:0,listStyle:"none",display:"flex",flexDirection:"column",gap:4},children:r.pages.slice(0,8).map(t=>e.jsx("li",{children:e.jsx("a",{href:t.url,target:"_blank",rel:"noopener noreferrer",className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-secondary)",textDecoration:"underline",textDecorationColor:"var(--v2-ink-faint)",textUnderlineOffset:2},children:t.url})},t.url))})}),e.jsx(h,{children:e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary v2-btn-sm",onClick:()=>a(t=>!t),children:i?"Cancel":"Mark verified manually"})}),i&&e.jsxs("div",{style:{marginTop:"var(--v2-pad-3)",padding:"var(--v2-pad-3)",border:"1px solid var(--v2-border-strong)",borderRadius:4,background:"var(--v2-bg)"},children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0,marginBottom:"var(--v2-pad-2)"},children:"verification note · required"}),e.jsx("p",{style:{color:"var(--v2-ink-tertiary)",fontSize:11,margin:0,marginBottom:"var(--v2-pad-2)"},children:"Ack wiring on this surface lands in the next rc; for now use the existing v1 ack flow on the Crawl tab."})]})]})}function p({label:r,children:i}){return e.jsxs("div",{style:{marginBottom:"var(--v2-pad-3)"},children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0,marginBottom:6},children:r}),i]})}function h({children:r}){return e.jsx("div",{style:{display:"flex",gap:"var(--v2-pad-2)",flexWrap:"wrap",marginTop:"var(--v2-pad-2)"},children:r})}function T({children:r}){return e.jsx("p",{style:{color:"var(--v2-ink-tertiary)",fontSize:11,margin:0,marginTop:"var(--v2-pad-2)",fontStyle:"italic"},children:r})}function $(){const r=c(s=>s.siteCrawlReport),[i,a]=d.useState("open"),t=d.useMemo(()=>r?E(r.pages,r.findingGroups??[]):[],[r]),l=d.useMemo(()=>i==="all"?t:t.filter(s=>i==="verified"?s.kind==="walkthrough-ack":i==="review"?s.kind==="needs-review":i==="open"?s.kind==="axe"||s.kind==="walkthrough-fail":!0),[t,i]);if(!r)return null;const n={all:t.length,open:t.filter(s=>s.kind==="axe"||s.kind==="walkthrough-fail").length,review:t.filter(s=>s.kind==="needs-review").length,verified:t.filter(s=>s.kind==="walkthrough-ack").length};return e.jsxs("section",{"aria-labelledby":"findings-heading",style:{padding:"var(--v2-pad-5) var(--v2-pad-5) var(--v2-pad-7)"},children:[e.jsxs("header",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"var(--v2-pad-3)",marginBottom:"var(--v2-pad-4)",flexWrap:"wrap"},children:[e.jsx("h2",{id:"findings-heading",className:"v2-display",style:{fontSize:20,fontWeight:500,letterSpacing:"-0.01em",color:"var(--v2-ink-primary)",margin:0},children:"Findings"}),e.jsx(D,{filter:i,setFilter:a,counts:n})]}),l.length===0?e.jsx(U,{filter:i}):e.jsx("ul",{"aria-label":`${i} findings, ${l.length} items`,style:{listStyle:"none",padding:0,margin:0,display:"flex",flexDirection:"column",gap:"var(--v2-pad-2)"},children:l.map((s,o)=>e.jsx("li",{style:{animation:`v2-row-in 240ms ease ${Math.min(o,12)*30}ms both`},children:e.jsx(R,{row:s})},s.key))})]})}function D({filter:r,setFilter:i,counts:a}){const t=[{id:"open",label:"Open"},{id:"review",label:"Review"},{id:"verified",label:"Verified"},{id:"all",label:"All"}];return e.jsx("div",{role:"tablist","aria-label":"Filter findings",style:{display:"inline-flex",gap:4,background:"var(--v2-bg-elev)",padding:3,borderRadius:6,border:"1px solid var(--v2-border)"},children:t.map(l=>{const n=r===l.id;return e.jsxs("button",{type:"button",role:"tab","aria-selected":n,onClick:()=>i(l.id),style:{fontFamily:"var(--v2-body)",fontSize:11,padding:"5px 10px",borderRadius:4,border:"none",cursor:"pointer",background:n?"var(--v2-bg-elev-2)":"transparent",color:n?"var(--v2-ink-primary)":"var(--v2-ink-secondary)",fontWeight:n?600:500,transition:"background 120ms ease, color 120ms ease",display:"inline-flex",alignItems:"baseline",gap:5},children:[l.label,e.jsx("span",{className:"v2-mono",style:{fontSize:10,color:"var(--v2-ink-tertiary)",fontVariantNumeric:"tabular-nums"},children:a[l.id]})]},l.id)})})}function U({filter:r}){const a={open:{headline:"Nothing open.",sub:"No axe violations or AI walkthrough failures across the audited pages. Switch to All to see everything, or to Verified for a record of acknowledged items."},review:{headline:"No items awaiting review.",sub:"AI walkthroughs returned definitive verdicts (or human verifications) for every criterion that needed judgment."},verified:{headline:"No human verifications recorded.",sub:"When you mark a walkthrough finding as manually verified, it appears here with your note + timestamp."},all:{headline:"Nothing to show.",sub:"No audit data yet — run a scan to begin."}}[r];return e.jsxs("div",{role:"status","aria-live":"polite",style:{padding:"var(--v2-pad-6) var(--v2-pad-4)",textAlign:"center",border:"1px dashed var(--v2-border)",borderRadius:6},children:[e.jsx("p",{className:"v2-display",style:{fontSize:18,fontWeight:500,color:"var(--v2-ink-primary)",margin:0,marginBottom:"var(--v2-pad-2)"},children:a.headline}),e.jsx("p",{style:{color:"var(--v2-ink-secondary)",margin:0,maxWidth:440,marginInline:"auto"},children:a.sub})]})}function E(r,i){const a=[];for(const n of i)n.needsReview?a.push({kind:"needs-review",key:`nr::${n.ruleId}::${n.representativeSelector}`,criterion:n.wcagCriterion,ruleId:n.ruleId,description:n.axeDescription,selector:n.representativeSelector,failureSummary:n.failureSummary,pages:n.pages,group:n}):a.push({kind:"axe",key:`axe::${n.ruleId}::${n.representativeSelector}`,criterion:n.wcagCriterion,ruleId:n.ruleId,impact:n.impact,description:n.axeDescription,selector:n.representativeSelector,pages:n.pages,isShared:n.isShared});const t=new Set;for(const n of r){for(const s of n.walkthroughFindings??[]){const o=`wt-fail::${s.criterionId}::${s.pageUrl}`;t.has(o)||(t.add(o),a.push({kind:"walkthrough-fail",key:o,criterion:s.criterionId,verdict:s.verdict,impact:s.impact,reasoning:s.reasoning,pageUrl:s.pageUrl}))}for(const s of n.walkthroughAcknowledgements??[]){const o=`wt-ack::${s.criterionId}::${s.pageUrl}`;t.has(o)||(t.add(o),a.push({kind:"walkthrough-ack",key:o,criterion:s.criterionId,verdict:s.verdict,reasoning:s.reasoning,pageUrl:s.pageUrl}))}}const l={critical:0,serious:1,moderate:2,minor:3,"needs-review":4,ack:5};return a.sort((n,s)=>{const o=n.kind==="walkthrough-ack"?l.ack:n.kind==="needs-review"?l["needs-review"]:l[n.impact],m=s.kind==="walkthrough-ack"?l.ack:s.kind==="needs-review"?l["needs-review"]:l[s.impact];return(o??99)-(m??99)}),a}function F(){var t,l;const r=c(n=>n.siteCrawlReport),i=c(n=>n.results),a=(r==null?void 0:r.startUrl)??((t=i[0])==null?void 0:t.pageUrl)??((l=i[0])==null?void 0:l.scope)??null;return e.jsxs("header",{role:"banner",style:{display:"flex",alignItems:"center",gap:"var(--v2-pad-4)",padding:"var(--v2-pad-3) var(--v2-pad-5)",borderBottom:"1px solid var(--v2-border)",background:"var(--v2-bg)",minHeight:44},children:[e.jsx("a",{href:"#main-content",className:"v2-skip-link",style:{position:"absolute",left:-9999},onFocus:n=>{n.currentTarget.style.left="var(--v2-pad-4)",n.currentTarget.style.top="var(--v2-pad-4)"},onBlur:n=>{n.currentTarget.style.left="-9999px"},children:"Skip to main content"}),e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"var(--v2-pad-2)"},children:[e.jsx("span",{className:"v2-display",style:{fontSize:18,fontWeight:600,letterSpacing:"-0.01em",color:"var(--v2-ink-primary)"},children:"wcagcheckr"}),e.jsx("span",{className:"v2-eyebrow",children:"v2"})]}),a&&e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"var(--v2-pad-2)",marginLeft:"var(--v2-pad-4)",minWidth:0,flex:1},children:[e.jsx("span",{className:"v2-eyebrow",children:"scope"}),e.jsx("span",{className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-secondary)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:0},title:a,children:a})]}),e.jsx("nav",{"aria-label":"Application",style:{display:"flex",gap:"var(--v2-pad-1)",marginLeft:"auto"},children:e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm","aria-label":"Settings",title:"Settings (coming soon)",children:"Settings"})})]})}function V(){const r=c(i=>i.setSiteCrawlReport);return d.useEffect(()=>{let i=!1;return k(async()=>{const{loadSiteCrawlReport:a}=await import("./scheduled-audit-runner-BqTcRkAP.js").then(t=>t.aG);return{loadSiteCrawlReport:a}},__vite__mapDeps([0,1,2,3])).then(({loadSiteCrawlReport:a})=>{a().then(t=>{i||t&&c.setState({siteCrawlReport:t})}).catch(()=>{})}),()=>{i=!0}},[r]),e.jsxs("div",{className:"v2-root",children:[e.jsx(F,{}),e.jsxs("main",{id:"main-content","aria-label":"wcagcheckr findings",children:[e.jsx(w,{}),e.jsx($,{})]})]})}j("side-panel");const u="v2UiEnabled";function H(){const[r,i]=d.useState(null);return d.useEffect(()=>{let a=!1;chrome.storage.local.get(u).then(l=>{a||i(!!l[u])}).catch(()=>i(!1));const t=(l,n)=>{var s;n==="local"&&u in l&&i(!!((s=l[u])!=null&&s.newValue))};return chrome.storage.onChanged.addListener(t),()=>{a=!0,chrome.storage.onChanged.removeListener(t)}},[]),r===null?null:r?e.jsx(V,{}):e.jsx(b,{})}const g=document.getElementById("root");if(!g)throw new Error("side-panel: #root not found");f(g).render(e.jsx(x.StrictMode,{children:e.jsx(y,{children:e.jsx(H,{})})}));
|
|
2
|
+
import"./modulepreload-polyfill-B5Qt9EMX.js";import{j as e,r as d,c as f,R as x}from"./styles-DToZ04ht.js";import{u as c,E as y,A as b}from"./ErrorBoundary-Buu85ak7.js";import{_ as k}from"./diff-DA41zYPc.js";import{i as j}from"./crash-reporter-Dc5lvxvY.js";import"./_commonjsHelpers-Cpj98o6Y.js";import"./ai-usage-log-C-jq4cW3.js";import"./scheduled-audit-runner-BqTcRkAP.js";import"./design-system-audit-DpxJrxnb.js";function w(){const r=c(n=>n.siteCrawlReport),i=c(n=>n.siteCrawlStatus);if(!r)return e.jsxs("section",{"aria-label":"No audit yet",style:{padding:"var(--v2-pad-7) var(--v2-pad-5)",textAlign:"center",borderBottom:"1px solid var(--v2-border)"},children:[e.jsx("p",{className:"v2-eyebrow",style:{marginBottom:"var(--v2-pad-2)"},children:"waiting for audit"}),e.jsx("h1",{className:"v2-display",style:{fontSize:32,fontWeight:500,letterSpacing:"-0.02em",color:"var(--v2-ink-primary)",margin:0,marginBottom:"var(--v2-pad-3)"},children:"Run an audit to begin."}),e.jsx("p",{style:{color:"var(--v2-ink-secondary)",maxWidth:480,margin:"0 auto",marginBottom:"var(--v2-pad-5)"},children:"Crawl a site or audit the active tab. Findings appear here as a single list — axe violations, AI walkthrough verdicts, and items needing human review use the same row shape with the same actions."}),e.jsx("div",{style:{display:"inline-flex",gap:"var(--v2-pad-2)"},children:e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary",disabled:i==="running",children:"Audit this page"})})]});const a=(r.totalWalkthroughFindings??0)+r.totalUniqueViolations,t=(r.walkthroughAcknowledgements??[]).length,l=r.totalNeedsReview;return e.jsxs("section",{"aria-label":"Audit summary",style:{display:"grid",gridTemplateColumns:"auto 1fr",gap:"var(--v2-pad-6)",padding:"var(--v2-pad-6) var(--v2-pad-5)",borderBottom:"1px solid var(--v2-border)",background:"var(--v2-bg)"},children:[e.jsx(S,{grade:r.siteGrade}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",gap:"var(--v2-pad-3)"},children:[e.jsxs("p",{className:"v2-eyebrow",style:{margin:0},children:["site grade · ",r.pagesAudited," page",r.pagesAudited===1?"":"s"]}),e.jsx("h1",{className:"v2-display",style:{fontSize:22,fontWeight:500,letterSpacing:"-0.01em",color:"var(--v2-ink-primary)",margin:0,lineHeight:1.25},children:a===0&&l===0?"All clear — nothing open.":`${a+l} finding${a+l===1?"":"s"} to address.`}),e.jsx(N,{openCount:a,reviewCount:l,verifiedCount:t,axeCount:r.totalUniqueViolations,walkthroughCount:r.totalWalkthroughFindings??0}),e.jsxs("div",{style:{display:"flex",gap:"var(--v2-pad-2)",marginTop:"var(--v2-pad-2)"},children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary",disabled:i==="running",children:"Re-crawl"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost",disabled:i==="running",title:"Re-run audit but skip walkthroughs that already passed or were human-verified",children:"Verify fixes only"})]})]})]})}function S({grade:r}){const i={A:"var(--v2-grade-a)",B:"var(--v2-grade-b)",C:"var(--v2-grade-c)",D:"var(--v2-grade-d)",F:"var(--v2-grade-f)"};return e.jsx("div",{"aria-label":`Grade ${r}`,role:"img",style:{display:"flex",alignItems:"center",justifyContent:"center",minWidth:140},children:e.jsx("span",{className:"v2-display",style:{fontSize:132,lineHeight:1,fontWeight:500,color:i[r],letterSpacing:"-0.04em",fontVariationSettings:'"opsz" 144'},children:r})})}function N({openCount:r,reviewCount:i,verifiedCount:a,axeCount:t,walkthroughCount:l}){return e.jsxs("dl",{style:{display:"flex",gap:"var(--v2-pad-4)",flexWrap:"wrap",margin:0,color:"var(--v2-ink-secondary)",fontSize:12},children:[e.jsx(v,{term:"open",value:r,tone:r>0?"attention":"neutral"}),e.jsx(v,{term:"review",value:i,tone:i>0?"review":"neutral"}),e.jsx(v,{term:"verified",value:a,tone:a>0?"positive":"neutral"}),e.jsx("span",{style:{color:"var(--v2-ink-faint)"},children:"·"}),e.jsx(v,{term:"axe",value:t,tone:"neutral"}),e.jsx(v,{term:"walkthrough",value:l,tone:"neutral"})]})}function v({term:r,value:i,tone:a}){const t={attention:"var(--v2-critical)",review:"var(--v2-needs-review)",positive:"var(--v2-verified)",neutral:"var(--v2-ink-secondary)"};return e.jsxs("div",{style:{display:"inline-flex",alignItems:"baseline",gap:6},children:[e.jsx("dt",{className:"v2-eyebrow",style:{display:"inline",margin:0,color:"var(--v2-ink-tertiary)"},children:r}),e.jsx("dd",{className:"v2-mono",style:{margin:0,fontWeight:600,fontSize:13,color:t[a],fontVariantNumeric:"tabular-nums"},children:i})]})}function R({row:r}){return e.jsxs("details",{style:{background:"var(--v2-bg-elev)",border:"1px solid var(--v2-border)",borderRadius:6,overflow:"hidden"},children:[e.jsxs("summary",{style:{cursor:"pointer",padding:"var(--v2-pad-3) var(--v2-pad-4)",listStyle:"none",display:"flex",alignItems:"flex-start",gap:"var(--v2-pad-3)"},children:[e.jsx(I,{row:r}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx(C,{row:r}),e.jsx(A,{row:r})]}),e.jsx(W,{})]}),e.jsx("div",{style:{padding:"0 var(--v2-pad-4) var(--v2-pad-4)",borderTop:"1px solid var(--v2-border)"},children:e.jsx(z,{row:r})})]})}function I({row:r}){if(r.kind==="walkthrough-ack")return e.jsx("span",{className:"v2-chip v2-chip-verified","aria-label":"Status: human verified",children:"verified"});if(r.kind==="needs-review")return e.jsx("span",{className:"v2-chip v2-chip-review","aria-label":"Status: needs human review",children:"review"});if(r.kind==="walkthrough-fail")return e.jsx("span",{className:r.verdict==="fail"?"v2-chip v2-chip-serious":"v2-chip v2-chip-moderate","aria-label":`Severity: ${r.verdict}`,children:r.verdict});const i={critical:"v2-chip-critical",serious:"v2-chip-serious",moderate:"v2-chip-moderate",minor:"v2-chip-minor"};return e.jsx("span",{className:`v2-chip ${i[r.impact]}`,"aria-label":`Severity: ${r.impact}`,children:r.impact})}function C({row:r}){const i=r.kind==="walkthrough-fail"||r.kind==="walkthrough-ack"||r.kind==="needs-review"||r.kind==="axe"?r.criterion:null,a=r.kind==="walkthrough-fail"?`AI walkthrough ${r.verdict} on this criterion.`:r.kind==="walkthrough-ack"?"Human-verified by an auditor.":(r.kind==="needs-review",r.description);return e.jsxs("p",{style:{margin:0,marginBottom:4,color:"var(--v2-ink-primary)",fontSize:13,fontWeight:500,lineHeight:1.4},children:[i&&e.jsxs("span",{className:"v2-mono",style:{fontSize:11,fontWeight:600,color:"var(--v2-ink-tertiary)",marginRight:8},children:["WCAG ",i]}),a]})}function A({row:r}){const i=r.kind==="axe"||r.kind==="needs-review"?r.pages.length:1,a=r.kind==="axe"||r.kind==="needs-review"?r.selector:null,t=r.kind==="walkthrough-fail"||r.kind==="walkthrough-ack"?r.pageUrl:null;return e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"var(--v2-pad-2)",flexWrap:"wrap"},children:[a&&e.jsx("code",{className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-secondary)",background:"var(--v2-bg-elev-2)",padding:"2px 6px",borderRadius:2,wordBreak:"break-all"},children:a}),t&&e.jsx("span",{className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-tertiary)",wordBreak:"break-all"},children:t}),i>1&&e.jsxs("span",{className:"v2-eyebrow",style:{marginLeft:"auto"},children:["on ",i," pages"]})]})}function W(){return e.jsx("span",{"aria-hidden":"true",style:{color:"var(--v2-ink-tertiary)",fontFamily:"var(--v2-mono)",fontSize:12,marginLeft:8,marginTop:2},children:"⏵"})}function z({row:r}){return r.kind==="walkthrough-fail"?e.jsxs("div",{style:{paddingTop:"var(--v2-pad-3)"},children:[e.jsx(p,{label:"AI reasoning",children:e.jsx("p",{style:{margin:0,color:"var(--v2-ink-secondary)",fontSize:12,lineHeight:1.6},children:r.reasoning})}),e.jsxs(h,{children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",disabled:!0,children:"Re-run walkthrough"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary v2-btn-sm",disabled:!0,children:"Mark verified manually"})]}),e.jsx(U,{children:"Inline ack flow + re-run wiring lands in the next rc — for now, open the v1 UI (the toggle in Settings) to ack this finding."})]}):r.kind==="walkthrough-ack"?e.jsxs("div",{style:{paddingTop:"var(--v2-pad-3)"},children:[e.jsx(p,{label:"What the human verified",children:e.jsx("p",{style:{margin:0,color:"var(--v2-ink-secondary)",fontSize:12,lineHeight:1.6},children:r.reasoning})}),e.jsxs("p",{style:{color:"var(--v2-ink-tertiary)",fontSize:11,margin:0,marginTop:"var(--v2-pad-2)"},children:["Original AI verdict: ",e.jsx("strong",{children:r.verdict}),". Now treated as pass for conformance."]})]}):r.kind==="needs-review"?e.jsx(B,{row:r}):e.jsxs("div",{style:{paddingTop:"var(--v2-pad-3)"},children:[e.jsx(p,{label:"Affected",children:e.jsxs("ul",{style:{margin:0,padding:0,listStyle:"none",display:"flex",flexDirection:"column",gap:4},children:[r.pages.slice(0,8).map(i=>e.jsx("li",{children:e.jsx("a",{href:i.url,target:"_blank",rel:"noopener noreferrer",className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-secondary)",textDecoration:"underline",textDecorationColor:"var(--v2-ink-faint)",textUnderlineOffset:2},children:i.url})},i.url)),r.pages.length>8&&e.jsxs("li",{className:"v2-eyebrow",children:["+ ",r.pages.length-8," more"]})]})}),e.jsxs(h,{children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",disabled:!0,children:"Show fix recipe"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary v2-btn-sm",disabled:!0,children:"Mark verified manually"})]})]})}function B({row:r}){const[i,a]=d.useState(!1);return e.jsxs("div",{style:{paddingTop:"var(--v2-pad-3)"},children:[r.failureSummary&&e.jsx(p,{label:"AI assessment",children:e.jsx("p",{style:{margin:0,color:"var(--v2-ink-secondary)",fontSize:12,lineHeight:1.6,whiteSpace:"pre-wrap"},children:r.failureSummary})}),e.jsx(p,{label:"Affected",children:e.jsx("ul",{style:{margin:0,padding:0,listStyle:"none",display:"flex",flexDirection:"column",gap:4},children:r.pages.slice(0,8).map(t=>e.jsx("li",{children:e.jsx("a",{href:t.url,target:"_blank",rel:"noopener noreferrer",className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-secondary)",textDecoration:"underline",textDecorationColor:"var(--v2-ink-faint)",textUnderlineOffset:2},children:t.url})},t.url))})}),e.jsx(h,{children:e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary v2-btn-sm",onClick:()=>a(t=>!t),children:i?"Cancel":"Mark verified manually"})}),i&&e.jsxs("div",{style:{marginTop:"var(--v2-pad-3)",padding:"var(--v2-pad-3)",border:"1px solid var(--v2-border-strong)",borderRadius:4,background:"var(--v2-bg)"},children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0,marginBottom:"var(--v2-pad-2)"},children:"verification note · required"}),e.jsx("p",{style:{color:"var(--v2-ink-tertiary)",fontSize:11,margin:0,marginBottom:"var(--v2-pad-2)"},children:"Ack wiring on this surface lands in the next rc; for now use the existing v1 ack flow on the Crawl tab."})]})]})}function p({label:r,children:i}){return e.jsxs("div",{style:{marginBottom:"var(--v2-pad-3)"},children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0,marginBottom:6},children:r}),i]})}function h({children:r}){return e.jsx("div",{style:{display:"flex",gap:"var(--v2-pad-2)",flexWrap:"wrap",marginTop:"var(--v2-pad-2)"},children:r})}function U({children:r}){return e.jsx("p",{style:{color:"var(--v2-ink-tertiary)",fontSize:11,margin:0,marginTop:"var(--v2-pad-2)",fontStyle:"italic"},children:r})}function T(){const r=c(s=>s.siteCrawlReport),[i,a]=d.useState("open"),t=d.useMemo(()=>r?E(r.pages,r.findingGroups??[]):[],[r]),l=d.useMemo(()=>i==="all"?t:t.filter(s=>i==="verified"?s.kind==="walkthrough-ack":i==="review"?s.kind==="needs-review":i==="open"?s.kind==="axe"||s.kind==="walkthrough-fail":!0),[t,i]);if(!r)return null;const n={all:t.length,open:t.filter(s=>s.kind==="axe"||s.kind==="walkthrough-fail").length,review:t.filter(s=>s.kind==="needs-review").length,verified:t.filter(s=>s.kind==="walkthrough-ack").length};return e.jsxs("section",{"aria-labelledby":"findings-heading",style:{padding:"var(--v2-pad-5) var(--v2-pad-5) var(--v2-pad-7)"},children:[e.jsxs("header",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"var(--v2-pad-3)",marginBottom:"var(--v2-pad-4)",flexWrap:"wrap"},children:[e.jsx("h2",{id:"findings-heading",className:"v2-display",style:{fontSize:20,fontWeight:500,letterSpacing:"-0.01em",color:"var(--v2-ink-primary)",margin:0},children:"Findings"}),e.jsx($,{filter:i,setFilter:a,counts:n})]}),l.length===0?e.jsx(D,{filter:i}):e.jsx("ul",{"aria-label":`${i} findings, ${l.length} items`,style:{listStyle:"none",padding:0,margin:0,display:"flex",flexDirection:"column",gap:"var(--v2-pad-2)"},children:l.map((s,o)=>e.jsx("li",{style:{animation:`v2-row-in 240ms ease ${Math.min(o,12)*30}ms both`},children:e.jsx(R,{row:s})},s.key))})]})}function $({filter:r,setFilter:i,counts:a}){const t=[{id:"open",label:"Open"},{id:"review",label:"Review"},{id:"verified",label:"Verified"},{id:"all",label:"All"}];return e.jsx("div",{role:"tablist","aria-label":"Filter findings",style:{display:"inline-flex",gap:4,background:"var(--v2-bg-elev)",padding:3,borderRadius:6,border:"1px solid var(--v2-border)"},children:t.map(l=>{const n=r===l.id;return e.jsxs("button",{type:"button",role:"tab","aria-selected":n,onClick:()=>i(l.id),style:{fontFamily:"var(--v2-body)",fontSize:11,padding:"5px 10px",borderRadius:4,border:"none",cursor:"pointer",background:n?"var(--v2-bg-elev-2)":"transparent",color:n?"var(--v2-ink-primary)":"var(--v2-ink-secondary)",fontWeight:n?600:500,transition:"background 120ms ease, color 120ms ease",display:"inline-flex",alignItems:"baseline",gap:5},children:[l.label,e.jsx("span",{className:"v2-mono",style:{fontSize:10,color:"var(--v2-ink-tertiary)",fontVariantNumeric:"tabular-nums"},children:a[l.id]})]},l.id)})})}function D({filter:r}){const a={open:{headline:"Nothing open.",sub:"No axe violations or AI walkthrough failures across the audited pages. Switch to All to see everything, or to Verified for a record of acknowledged items."},review:{headline:"No items awaiting review.",sub:"AI walkthroughs returned definitive verdicts (or human verifications) for every criterion that needed judgment."},verified:{headline:"No human verifications recorded.",sub:"When you mark a walkthrough finding as manually verified, it appears here with your note + timestamp."},all:{headline:"Nothing to show.",sub:"No audit data yet — run a scan to begin."}}[r];return e.jsxs("div",{role:"status","aria-live":"polite",style:{padding:"var(--v2-pad-6) var(--v2-pad-4)",textAlign:"center",border:"1px dashed var(--v2-border)",borderRadius:6},children:[e.jsx("p",{className:"v2-display",style:{fontSize:18,fontWeight:500,color:"var(--v2-ink-primary)",margin:0,marginBottom:"var(--v2-pad-2)"},children:a.headline}),e.jsx("p",{style:{color:"var(--v2-ink-secondary)",margin:0,maxWidth:440,marginInline:"auto"},children:a.sub})]})}function E(r,i){const a=[];for(const n of i)n.needsReview?a.push({kind:"needs-review",key:`nr::${n.ruleId}::${n.representativeSelector}`,criterion:n.wcagCriterion,ruleId:n.ruleId,description:n.axeDescription,selector:n.representativeSelector,failureSummary:n.failureSummary,pages:n.pages,group:n}):a.push({kind:"axe",key:`axe::${n.ruleId}::${n.representativeSelector}`,criterion:n.wcagCriterion,ruleId:n.ruleId,impact:n.impact,description:n.axeDescription,selector:n.representativeSelector,pages:n.pages,isShared:n.isShared});const t=new Set;for(const n of r){for(const s of n.walkthroughFindings??[]){const o=`wt-fail::${s.criterionId}::${s.pageUrl}`;t.has(o)||(t.add(o),a.push({kind:"walkthrough-fail",key:o,criterion:s.criterionId,verdict:s.verdict,impact:s.impact,reasoning:s.reasoning,pageUrl:s.pageUrl}))}for(const s of n.walkthroughAcknowledgements??[]){const o=`wt-ack::${s.criterionId}::${s.pageUrl}`;t.has(o)||(t.add(o),a.push({kind:"walkthrough-ack",key:o,criterion:s.criterionId,verdict:s.verdict,reasoning:s.reasoning,pageUrl:s.pageUrl}))}}const l={critical:0,serious:1,moderate:2,minor:3,"needs-review":4,ack:5};return a.sort((n,s)=>{const o=n.kind==="walkthrough-ack"?l.ack:n.kind==="needs-review"?l["needs-review"]:l[n.impact],m=s.kind==="walkthrough-ack"?l.ack:s.kind==="needs-review"?l["needs-review"]:l[s.impact];return(o??99)-(m??99)}),a}function F(){var t,l;const r=c(n=>n.siteCrawlReport),i=c(n=>n.results),a=(r==null?void 0:r.startUrl)??((t=i[0])==null?void 0:t.pageUrl)??((l=i[0])==null?void 0:l.scope)??null;return e.jsxs("header",{role:"banner",style:{display:"flex",alignItems:"center",gap:"var(--v2-pad-4)",padding:"var(--v2-pad-3) var(--v2-pad-5)",borderBottom:"1px solid var(--v2-border)",background:"var(--v2-bg)",minHeight:44},children:[e.jsx("a",{href:"#main-content",className:"v2-skip-link",style:{position:"absolute",left:-9999},onFocus:n=>{n.currentTarget.style.left="var(--v2-pad-4)",n.currentTarget.style.top="var(--v2-pad-4)"},onBlur:n=>{n.currentTarget.style.left="-9999px"},children:"Skip to main content"}),e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"var(--v2-pad-2)"},children:[e.jsx("span",{className:"v2-display",style:{fontSize:18,fontWeight:600,letterSpacing:"-0.01em",color:"var(--v2-ink-primary)"},children:"wcagcheckr"}),e.jsx("span",{className:"v2-eyebrow",children:"v2"})]}),a&&e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"var(--v2-pad-2)",marginLeft:"var(--v2-pad-4)",minWidth:0,flex:1},children:[e.jsx("span",{className:"v2-eyebrow",children:"scope"}),e.jsx("span",{className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-secondary)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:0},title:a,children:a})]}),e.jsxs("nav",{"aria-label":"Application",style:{display:"flex",gap:"var(--v2-pad-1)",marginLeft:"auto"},children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",onClick:()=>{chrome.storage.local.set({v2UiEnabled:!1})},"aria-label":"Switch back to the classic UI",title:"Switch back to the classic v1 UI",children:"Use v1"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm","aria-label":"Settings",title:"Settings (coming soon)",children:"Settings"})]})]})}function V(){const r=c(i=>i.setSiteCrawlReport);return d.useEffect(()=>{let i=!1;return k(async()=>{const{loadSiteCrawlReport:a}=await import("./scheduled-audit-runner-BqTcRkAP.js").then(t=>t.aG);return{loadSiteCrawlReport:a}},__vite__mapDeps([0,1,2,3])).then(({loadSiteCrawlReport:a})=>{a().then(t=>{i||t&&c.setState({siteCrawlReport:t})}).catch(()=>{})}),()=>{i=!0}},[r]),e.jsxs("div",{className:"v2-root",children:[e.jsx(F,{}),e.jsxs("main",{id:"main-content","aria-label":"wcagcheckr findings",children:[e.jsx(w,{}),e.jsx(T,{})]})]})}j("side-panel");const u="v2UiEnabled";function H(){const[r,i]=d.useState(null);return d.useEffect(()=>{let a=!1;chrome.storage.local.get(u).then(l=>{a||i(!!l[u])}).catch(()=>i(!1));const t=(l,n)=>{var s;n==="local"&&u in l&&i(!!((s=l[u])!=null&&s.newValue))};return chrome.storage.onChanged.addListener(t),()=>{a=!0,chrome.storage.onChanged.removeListener(t)}},[]),r===null?null:r?e.jsx(V,{}):e.jsx(b,{})}const g=document.getElementById("root");if(!g)throw new Error("side-panel: #root not found");f(g).render(e.jsx(x.StrictMode,{children:e.jsx(y,{children:e.jsx(H,{})})}));
|
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-rbsN4EGQ.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-Dc5lvxvY.js">
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/diff-DA41zYPc.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/scheduled-audit-runner-BqTcRkAP.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/design-system-audit-DpxJrxnb.js">
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/ErrorBoundary-
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/assets/ErrorBoundary-Buu85ak7.js">
|
|
16
16
|
<link rel="stylesheet" crossorigin href="/assets/styles-d5msFsnl.css">
|
|
17
17
|
</head>
|
|
18
18
|
<body class="bg-slate-50">
|
package/dist/manifest.json
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"name": "wcagcheckr",
|
|
4
4
|
"description": "Audit components across hover, focus, dark mode, forced colors, RTL — every state your users actually encounter. Per-component baselines surface only NEW violations.",
|
|
5
|
-
"version": "1.0.0.
|
|
6
|
-
"version_name": "1.0.0-rc.
|
|
5
|
+
"version": "1.0.0.277",
|
|
6
|
+
"version_name": "1.0.0-rc.277",
|
|
7
7
|
"author": "Locustware",
|
|
8
8
|
"homepage_url": "https://wcagcheckr.com",
|
|
9
9
|
"icons": {
|
|
@@ -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-vH1TtNvJ.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-Dc5lvxvY.js">
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/diff-DA41zYPc.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/scheduled-audit-runner-BqTcRkAP.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-Buu85ak7.js">
|
|
17
17
|
<link rel="stylesheet" crossorigin href="/assets/styles-d5msFsnl.css">
|
|
18
18
|
<link rel="stylesheet" crossorigin href="/assets/side-panel-D575AWq0.css">
|
|
19
19
|
</head>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wcag-checkr/ci",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.277",
|
|
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",
|