@wcag-checkr/ci 1.0.0-rc.162 → 1.0.0-rc.163
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-Cc_Dg6Hg.js → ErrorBoundary-Drje7b7o.js} +3 -3
- package/dist/assets/{copy-ai-fixer-prompt-BWaVBRIR.js → copy-ai-fixer-prompt-Du-1hhUB.js} +2 -2
- package/dist/assets/{devtools-panel-eX1Erv0f.js → devtools-panel-ts8aqBry.js} +1 -1
- package/dist/assets/{side-panel-B5m49lnv.js → side-panel-CXsMmM59.js} +1 -1
- package/dist/devtools/panel.html +2 -2
- package/dist/manifest.json +2 -2
- package/dist/side-panel/App.tsx +19 -4
- package/dist/side-panel/side-panel.html +2 -2
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/copy-ai-fixer-prompt-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/copy-ai-fixer-prompt-Du-1hhUB.js","assets/diff-DA41zYPc.js","assets/crash-reporter-Dc5lvxvY.js","assets/site-report-renderer-ByK3NGUh.js","assets/scheduled-audit-runner-QJANEKWM.js","assets/ai-usage-log-DBBVxutJ.js"])))=>i.map(i=>d[i]);
|
|
2
2
|
var ca=Object.defineProperty;var da=(t,s,a)=>s in t?ca(t,s,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[s]=a;var At=(t,s,a)=>da(t,typeof s!="symbol"?s+"":s,a);import{R as Ce,i as ce,r as m,j as e,M as ye,C as lt,l as ua,o as gt,t as ft,m as fs,s as bs,k as Le}from"./styles-DbXz4mi-.js";import{s as pa,g as ha,a as ae,d as ze,b as Ke,c as Fe,e as vs,l as ma,f as bt,A as oe,h as xa,i as ga,u as fa,j as ba,k as va,m as ya,n as qe,o as wa,p as ja,N as Na,q as ka,O as Sa,r as Aa,t as Ca,v as Ia,w as Ct,x as Ea,y as ys,z as Ra,B as Ta,C as $a,D as La,E as Ua,F as _a,T as Da,G as Oa,H as Ma,I as Fa,J as ws,K as Pa,L as It,M as Et,P as Xe,Q as Ga,R as Rt,S as Va,U as Wa,V as Ba,W as Ha,X as za,Y as Ka}from"./scheduled-audit-runner-QJANEKWM.js";import{_ as vt}from"./diff-DA41zYPc.js";import{o as pe,r as te,s as re,c as js,b as de,d as ge}from"./crash-reporter-Dc5lvxvY.js";import{B as Ze,i as Ns,f as ks,T as Ss}from"./ai-usage-log-DBBVxutJ.js";import{s as qa,t as Qa}from"./design-system-audit-DpxJrxnb.js";const Tt=t=>{let s;const a=new Set,n=(u,d)=>{const p=typeof u=="function"?u(s):u;if(!Object.is(p,s)){const h=s;s=d??(typeof p!="object"||p===null)?p:Object.assign({},s,p),a.forEach(x=>x(s,h))}},r=()=>s,l={setState:n,getState:r,getInitialState:()=>c,subscribe:u=>(a.add(u),()=>a.delete(u))},c=s=t(n,r,l);return l},Ya=t=>t?Tt(t):Tt,Ja=t=>t;function Xa(t,s=Ja){const a=Ce.useSyncExternalStore(t.subscribe,Ce.useCallback(()=>s(t.getState()),[t,s]),Ce.useCallback(()=>s(t.getInitialState()),[t,s]));return Ce.useDebugValue(a),a}const $t=t=>{const s=Ya(t),a=n=>Xa(s,n);return Object.assign(a,s),a},Za=t=>t?$t(t):$t,b=Za(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,pinnedMatchKey:null,pinnedFound:!0,aiFailure:null,aiProgress:null,acknowledgedKeys:new Set,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}),setProgress:s=>t({progress:s}),setResults:(s,a,n)=>t({results:s,delta:a,componentId:n,status:"complete",errorMessage:null,freshThisSession:!0,aiProgress:null,pinnedMatchKey:null,pinnedFound:!0}),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}),setUserMode:s=>t({userMode:s}),setSiteCrawlStatus:s=>t({siteCrawlStatus:s}),setSiteCrawlProgress:s=>t({siteCrawlProgress:s}),setSiteCrawlReport:s=>{t({siteCrawlReport:s}),pa(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}}),setMessages:(s,a,n)=>t({messages:s,unreadMessageCount:a,criticalUnacked:n}),applyMessageAck:(s,a)=>t(n=>{const r=n.messages.map(l=>l.id!==s?l:a==="seen"?{...l,seen:!0}:a==="dismissed"?{...l,dismissed:!0}:a==="acknowledged"?{...l,acknowledged:!0}:a==="clicked"?{...l,clicked:!0}:l).filter(l=>l.severity==="critical"?!l.acknowledged:!l.dismissed),i=r.filter(l=>!l.seen).length,o=r.some(l=>l.severity==="critical"&&!l.acknowledged);return{messages:r,unreadMessageCount:i,criticalUnacked:o}})})),Ve="sidePanel:lastAudit";function en(){const t=[];return t.push(pe("AUDIT_PROGRESS_EVENT",s=>{const a=b.getState().status==="running";b.getState().setProgress({current:s.current,total:s.total,currentState:s.currentState}),b.getState().setStatus("running"),a||ce.polite(`Audit running, scanning ${s.total} state${s.total===1?"":"s"}.`)})),t.push(pe("AUDIT_COMPLETE_EVENT",s=>{var l;b.getState().setResults(s.results,s.delta,s.componentId);const a=s.results.reduce((c,u)=>c+u.violations.length,0),n=((l=s.delta)==null?void 0:l.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"}.`;ce.polite(r);const i=b.getState().view;["compliance","guided","crawl"].includes(i)||(b.getState().setView("report"),b.getState().setFindingsLens("overview")),tn({results:s.results,delta:s.delta,componentId:s.componentId})})),t.push(pe("AUDIT_FAILED_EVENT",s=>{b.getState().setError(s.error.message)})),t.push(pe("AI_AUGMENTATION_PROGRESS_EVENT",s=>{const a=b.getState().aiProgress;b.getState().setAiProgress({currentCheckLabel:s.currentCheckLabel,current:s.current,total:s.total,candidatesDone:s.candidatesDone,candidatesTotal:s.candidatesTotal}),a||ce.polite(`AI augmentation running ${s.total} check${s.total===1?"":"s"}.`)})),t.push(pe("AI_AUGMENTATION_FAILED_EVENT",s=>{b.getState().setAiFailure({severity:s.severity,reason:s.reason,checksAttempted:s.checksAttempted,checksSucceeded:s.checksSucceeded,checksErrored:s.checksErrored,errorDetails:s.errorDetails})})),t.push(pe("SCORECARD_UPDATED_EVENT",()=>{We()})),t.push(pe("LICENSE_CHANGED_EVENT",()=>{As()})),t.push(pe("SITE_CRAWL_PROGRESS_EVENT",s=>{const a=b.getState();a.setSiteCrawlStatus("running"),a.setSiteCrawlProgress({current:s.current,total:s.total,url:s.url,lastViolations:s.violations}),s.status==="auditing"&&s.current===1&&ce.polite(`Site crawl started, scanning up to ${s.total} pages.`)})),t.push(pe("SITE_CRAWL_COMPLETE_EVENT",s=>{const a=b.getState();a.setSiteCrawlStatus("complete"),a.setSiteCrawlReport(s.report),a.setSiteCrawlProgress(null),ce.polite(`Site crawl complete. Grade ${s.report.siteGrade}, ${s.report.totalUniqueViolations} unique violation${s.report.totalUniqueViolations===1?"":"s"}.`)})),t.push(pe("SITE_CRAWL_FAILED_EVENT",s=>{const a=b.getState();a.setSiteCrawlStatus("failed"),a.setSiteCrawlError(s.error.message),a.setSiteCrawlProgress(null),ce.assertive(`Site crawl failed: ${s.error.message}`)})),()=>t.forEach(s=>s())}async function tn(t){const s={...t,results:t.results.map(({screenshotDataUrl:a,...n})=>n)};try{await chrome.storage.local.set({[Ve]:s})}catch(a){console.warn("[wire-messaging] persistLastAudit failed; results stay in-memory only",a)}}async function sn(){const s=(await chrome.storage.local.get(Ve))[Ve];s&&b.setState({results:s.results,delta:s.delta,componentId:s.componentId,status:"complete"})}async function an(){await chrome.storage.local.remove(Ve)}async function Qe(){b.getState().clearResults(),await an()}async function We(){const t=await te({type:"BASELINE_LIST"});b.getState().setBaselineList(t.items)}async function As(t){const s=await te({type:"TIER_GET",forceRefresh:(t==null?void 0:t.forceRefresh)===!0});b.getState().setTier(s.tier,{trialDaysRemaining:s.trialDaysRemaining,seatsUsed:s.seatsUsed,seatsTotal:s.seatsTotal,planCode:s.planCode,licenseDaysRemaining:s.licenseDaysRemaining,pastDue:s.pastDue}),Cs()}async function Cs(){const{fetchMessages:t}=await vt(async()=>{const{fetchMessages:n}=await Promise.resolve().then(()=>hn);return{fetchMessages:n}},void 0),s=b.getState().userMode,a=await t(s);a&&b.getState().setMessages(a.messages,a.unreadCount,a.criticalUnacked)}async function nn(){const s=(await te({type:"SETTINGS_GET",key:"userMode"})).data,a=s==="owner"||s==="dev"?s:null;b.getState().setUserMode(a)}function rn(){return chrome.runtime.connect({name:"audit-keepalive"})}let Be=null;async function on(){if(Be===null)try{const t=await chrome.windows.getCurrent();typeof t.id=="number"&&(Be=t.id)}catch{}}function Is(){if(Be===null)return;const t=chrome.sidePanel;!t||typeof t.open!="function"||t.open({windowId:Be}).catch(()=>{})}function me(t){Is(),re(t)}function ln({onClose:t}){const[s,a]=m.useState(""),[n,r]=m.useState(""),[i,o]=m.useState(!0),[l,c]=m.useState(""),[u,d]=m.useState(!1),[p,h]=m.useState(null);async function x(g){var j;if(g.preventDefault(),!(!s.trim()||!n.trim())){d(!0),h(null);try{const S=await te({type:"SUPPORT_MESSAGE_REQUEST",subject:s.trim(),body:n.trim(),includeContext:i,replyEmail:l.trim()||void 0});S.success?(h({ok:!0,msg:`Sent (ref: ${S.ticketRef??"n/a"})`}),setTimeout(t,1200)):h({ok:!1,msg:((j=S.error)==null?void 0:j.message)??"Failed to send"})}finally{d(!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:g=>a(g.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:g=>r(g.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:l,onChange:g=>c(g.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:i,onChange:g=>o(g.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)."})]}),p&&e.jsx("p",{id:"support-form-result",role:p.ok?"status":"alert",className:`text-xs ${p.ok?"text-green-700":"text-red-700"}`,children:p.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:u,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded disabled:opacity-50",children:u?"Sending…":"Send"})]})]})}function Lt({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 He=js("messages-client"),cn="https://api.wcagcheckr.com",Es="wcagcheckr",dn=1e4;function un(){try{return chrome.runtime.getManifest().version}catch{return"0.0.0"}}async function Rs(t,s){const a=await ha();if(!a)throw new Error("no_license_token");const n={...(s==null?void 0:s.headers)??{},Authorization:`Bearer ${a}`,"X-Extension-Version":un()};return s!=null&&s.userMode&&(n["X-User-Mode"]=s.userMode),fetch(`${cn}${t}`,{...s,headers:n,signal:AbortSignal.timeout(dn)})}async function pn(t){try{const s=await Rs(`/v1/products/${Es}/messages`,{userMode:t??null});return s.ok?await s.json():(He.warn("fetchMessages http",s.status),null)}catch(s){return He.warn("fetchMessages failed",s),null}}async function ve(t,s){try{const a=await Rs(`/v1/products/${Es}/messages/${t}/ack`,{method:"POST",body:JSON.stringify({action:s}),headers:{"content-type":"application/json"}});return a.ok?!0:(He.warn("ackMessage http",a.status,"action",s),!1)}catch(a){return He.warn("ackMessage failed",a),!1}}const hn=Object.freeze(Object.defineProperty({__proto__:null,ackMessage:ve,fetchMessages:pn},Symbol.toStringTag,{value:"Module"})),mn=["http:","https:"];function xn(t){try{const s=new URL(t);return mn.includes(s.protocol)}catch{return!1}}function Ut(t){const s=[];let a=0,n=0;for(;a<t.length;){if(t[a]==="["){const i=t.indexOf("]",a+1);if(i!==-1&&t[i+1]==="("){const o=t.indexOf(")",i+2);if(o!==-1){const l=t.slice(a+1,i),c=t.slice(i+2,o);xn(c)?s.push(e.jsx("a",{href:c,target:"_blank",rel:"noopener",className:"text-brand-700 underline",children:l},`l-${n++}`)):s.push(e.jsx(m.Fragment,{children:l},`l-${n++}`)),a=o+1;continue}}}if(t[a]==="*"&&t[a+1]==="*"){const i=t.indexOf("**",a+2);if(i!==-1){s.push(e.jsx("strong",{children:t.slice(a+2,i)},`b-${n++}`)),a=i+2;continue}}if(t[a]==="*"&&t[a+1]!=="*"){const i=t.indexOf("*",a+1);if(i!==-1&&t[i+1]!=="*"){s.push(e.jsx("em",{children:t.slice(a+1,i)},`i-${n++}`)),a=i+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 Ts({source:t}){const s=t.split(/\r?\n/),a=[];let n=[],r=[],i=0;function o(){if(r.length===0)return;const c=r.join(" ");a.push(e.jsx("p",{className:"leading-snug",children:Ut(c)},`p-${i++}`)),r=[]}function l(){n.length!==0&&(a.push(e.jsx("ul",{className:"list-disc pl-5 space-y-0.5",children:n.map((c,u)=>e.jsx("li",{children:Ut(c)},u))},`u-${i++}`)),n=[])}for(const c of s){const u=c.trimEnd();if(u===""){o(),l();continue}const d=/^[-*]\s+(.*)$/.exec(u);if(d){o(),n.push(d[1]);continue}l(),r.push(u)}return o(),l(),e.jsx("div",{className:"space-y-1.5",children:a})}const gn={info:"bg-blue-500",promo:"bg-purple-500",warning:"bg-amber-500",critical:"bg-rose-500"},fn={critical:"bg-rose-50 border-rose-200"};function $s(){const t=b(h=>h.unreadMessageCount),s=b(h=>h.messages),a=b(h=>h.applyMessageAck),[n,r]=m.useState(!1),i=m.useRef(-1),[o,l]=m.useState(!1);m.useEffect(()=>{const h=s.filter(g=>!g.seen);if(h.length===0)return;const x=Math.max(...h.map(g=>g.id));if(x>i.current){i.current=x,l(!0);const g=setTimeout(()=>l(!1),1500);return()=>clearTimeout(g)}},[s]);async function c(){const h=s.filter(x=>!x.seen);if(h.length!==0)for(const x of h)a(x.id,"seen"),ve(x.id,"seen")}function u(){const h=!n;r(h),h&&c()}async function d(h){a(h.id,"dismissed"),await ve(h.id,"dismissed")}async function p(h){h.ctaUrl&&(a(h.id,"clicked"),ve(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:u,"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 ${o?"animate-bell-pulse":""}`,title:t>0?`${t} new message${t===1?"":"s"}`:"No new messages",children:[e.jsx(bn,{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(vn,{messages:s,onClose:()=>r(!1),onDismiss:d,onCtaClick:p})]})}function bn({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 vn({messages:t,onClose:s,onDismiss:a,onCtaClick:n}){const r=m.useRef(null);return m.useEffect(()=>{const i=l=>{r.current&&(r.current.contains(l.target)||s())},o=l=>{l.key==="Escape"&&s()};return document.addEventListener("mousedown",i),document.addEventListener("keydown",o),()=>{document.removeEventListener("mousedown",i),document.removeEventListener("keydown",o)}},[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:()=>{Cs()},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(i=>e.jsx("li",{className:`p-3 ${i.seen?"":"bg-slate-50"}`,children:e.jsxs("div",{className:"flex gap-2",children:[e.jsx("div",{className:`shrink-0 w-1 self-stretch rounded ${gn[i.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:i.title}),i.dismissible&&i.severity!=="critical"&&e.jsx("button",{type:"button",onClick:()=>a(i),"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(Ts,{source:i.bodyMd})}),i.ctaLabel&&i.ctaUrl&&e.jsx("button",{type:"button",onClick:()=>n(i),className:"mt-2 text-[11px] px-2 py-1 bg-brand-500 text-white rounded hover:bg-brand-600",children:i.ctaLabel}),e.jsx("div",{className:"mt-1 text-[10px] text-slate-400",children:new Date(i.createdAt).toLocaleString()})]})]})},i.id))})]})}function Ls(){const t=b(i=>i.messages),s=b(i=>i.applyMessageAck),a=t.find(i=>i.severity==="critical"&&!i.acknowledged);if(!a)return null;async function n(){s(a.id,"acknowledged"),await ve(a.id,"acknowledged")}async function r(){a.ctaUrl&&(s(a.id,"clicked"),ve(a.id,"clicked"),chrome.tabs.create({url:a.ctaUrl}).catch(()=>{}))}return e.jsxs("div",{role:"alert",className:`border-y ${fn.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(Ts,{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 yn=[{slug:"matrix",label:"Dashboard"},{slug:"report",label:"Findings",hideWhenIdle:!0}];function wn(t){if(!t)return null;try{return new URL(t).hostname}catch{return t}}function jn(){var p,h;const t=b(x=>x.view),s=b(x=>x.setView),a=b(x=>x.setUserMode),n=b(x=>x.results),r=b(x=>x.status),[i,o]=m.useState(!1),l=((p=n[0])==null?void 0:p.pageUrl)??((h=n[0])==null?void 0:h.scope),c=wn(l),u=n.length>0&&r!=="running";function d(){a("owner"),re({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:d,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($s,{}),e.jsx(Lt,{onClick:()=>void re({type:"OPEN_SETTINGS"}),ariaLabel:"Open settings",children:"⚙"}),e.jsx(Lt,{onClick:()=>o(!0),ariaLabel:"Send support message",children:"?"})]})]}),u&&c&&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:l??"",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 ${c}`,children:c}),e.jsx("button",{type:"button",onClick:()=>void Qe(),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(Nn,{view:t,setView:s}),e.jsx(ye,{open:i,onClose:()=>o(!1),title:"Send support message",children:e.jsx(ln,{onClose:()=>o(!1)})})]})}function Nn({view:t,setView:s}){const a=m.useRef([]),n=b(l=>l.results),r=yn.filter(l=>!l.hideWhenIdle||n.length>0);function i(l){var d;const c=(l+r.length)%r.length,u=r[c];u&&(s(u.slug),(d=a.current[c])==null||d.focus())}function o(l,c){switch(l.key){case"ArrowRight":l.preventDefault(),i(c+1);break;case"ArrowLeft":l.preventDefault(),i(c-1);break;case"Home":l.preventDefault(),i(0);break;case"End":l.preventDefault(),i(r.length-1);break}}return e.jsx("nav",{className:"flex gap-1","aria-label":"Primary navigation",role:"tablist",children:r.map((l,c)=>{const u=t===l.slug;return e.jsx("button",{ref:d=>{a.current[c]=d},role:"tab","aria-selected":u,tabIndex:u?0:-1,onClick:()=>s(l.slug),onKeyDown:d=>o(d,c),className:u?"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:l.label},l.slug)})})}function kn({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 Sn="https://wcagcheckr.com/upgrade";function An(){const[t,s]=m.useState("single-element"),[a,n]=m.useState(!1),[r,i]=m.useState(null),[o,l]=m.useState(null),[c,u]=m.useState(Ze),[d,p]=m.useState(Ze[0].id),[h,x]=m.useState("none"),[g,j]=m.useState(null),S=b(F=>F.status),L=b(F=>F.tier),w=b(F=>F.results.length>0),C=S==="running";m.useEffect(()=>{Promise.all([te({type:"SETTINGS_GET",key:"matrixPresets"}),te({type:"SETTINGS_GET",key:"activePresetId"})]).then(([F,q])=>{const se=Array.isArray(F.data)?F.data:null;u(se&&se.length>0?se:Ze),typeof q.data=="string"&&p(q.data)})},[]);function f(F){const q=c.find(se=>se.id===F);q&&(p(F),re({type:"SETTINGS_SET",key:"activePresetId",value:F}),re({type:"SETTINGS_SET",key:"stateMatrix",value:q.matrix}))}const k=Ns(L,"storybookAutoIterate");m.useEffect(()=>{const F=pe("ELEMENT_PICKED_EVENT",(se,I)=>{n(!1);const Q=I.frameId;M(Q),i({selector:se.selector,frameId:Q,speech:se.speech})}),q=pe("PICKER_CANCELLED_EVENT",()=>n(!1));return()=>{F(),q()}},[]);async function E(){const F=await ae();F&&(n(!0),await de(F,{type:"PICKER_ACTIVATE_REQUEST",tabId:F}))}function N(){r&&(M(r.frameId),me({type:"START_AUDIT",mode:"single-element",scope:r.selector,frameId:r.frameId}),b.getState().startNewScan())}function U(){if(!k){l("storybook:auto-iterate");return}M(),me({type:"START_AUDIT",mode:"storybook-all"}),b.getState().startNewScan()}function v(){M(),me({type:"START_AUDIT",mode:"all-frames"}),b.getState().startNewScan()}function _(){M(),me({type:"START_AUDIT",mode:"full-page"}),b.getState().startNewScan()}function X(){M(),me({type:"START_AUDIT",mode:"quick-scan"}),b.getState().startNewScan()}function A(){M(),me({type:"START_AUDIT",mode:"parallel-scan"}),b.getState().startNewScan()}function B(){re({type:"CANCEL_AUDIT"})}async function M(F){b.getState().setPinned(null);const q=await ae();if(q)try{await de(q,{type:"HIGHLIGHT_CLEAR_REQUEST",tabId:q},F)}catch{}}async function Z(F){j(null);const q=await ae();if(!q){j("No audited tab; open a page first.");return}if(F==="none"){const I=await te({type:"PERF_THROTTLE_CLEAR_REQUEST",tabId:q});I.ok||j(I.error??"Failed to clear throttle."),x("none");return}const se=await te({type:"PERF_THROTTLE_APPLY_REQUEST",tabId:q,profile:F});if(!se.ok){j(se.error??"Failed to apply throttle.");return}x(F)}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:F=>s(F.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)",k?"":" (paid)"]})]}),e.jsx("select",{"aria-label":"State-matrix preset",value:d,onChange:F=>f(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:c.map(F=>e.jsx("option",{value:F.id,children:F.name},F.id))}),e.jsxs("select",{"aria-label":"Performance throttle",value:h,onChange:F=>void Z(F.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(In,{picking:a,picked:r,isRunning:C,onPick:E,onRun:N,onClearPick:()=>i(null)}):t==="full-page"?e.jsx("button",{onClick:_,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"}):t==="quick-scan"?e.jsx("button",{onClick:X,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:A,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:v,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:U,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:B,className:"text-xs px-3 py-1 border border-slate-300 text-slate-700 rounded hover:bg-slate-100",children:"Stop"}),!C&&w&&e.jsx("button",{type:"button",onClick:()=>void Qe(),className:"text-xs text-slate-500 hover:text-slate-800 hover:underline ml-auto",title:"Clear current results",children:"Clear"})]}),g&&e.jsxs("p",{className:"text-[11px] text-rose-700",role:"alert",children:["⚡ ",g]}),t==="single-element"&&r&&!a&&!C&&e.jsx(En,{selector:r.selector,onRepick:E,onClear:()=>i(null)})]}),e.jsx(ye,{open:o!==null,onClose:()=>l(null),title:"Upgrade to continue",children:e.jsx(kn,{feature:o??"",upgradeUrl:Sn})})]})}function Cn({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 In({picking:t,picked:s,isRunning:a,onPick:n,onRun:r,onClearPick:i}){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(Cn,{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 En({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 Rn={outline:"OUTLINE_HIDE_REQUEST","tab-order":"TAB_ORDER_HIDE_REQUEST","reading-order":"READING_ORDER_HIDE_REQUEST","target-size":"TARGET_SIZE_HIDE_REQUEST"},Tn={outline:"OUTLINE_SHOW_REQUEST","tab-order":"TAB_ORDER_SHOW_REQUEST","reading-order":"READING_ORDER_SHOW_REQUEST","target-size":"TARGET_SIZE_SHOW_REQUEST"};function $n(){const[t,s]=m.useState(null),[a,n]=m.useState(!1),[r,i]=m.useState(null),[o,l]=m.useState("off"),u=b(x=>x.results).flatMap(x=>x.violations);async function d(x){const g=await ae();g&&(l(x),x==="off"?await de(g,{type:"VISION_SIMULATOR_CLEAR",tabId:g}).catch(()=>{}):await de(g,{type:"VISION_SIMULATOR_APPLY",tabId:g,mode:x}).catch(()=>{}))}async function p(x){const g=await ae();if(g){if(t&&await de(g,{type:Rn[t],tabId:g}).catch(()=>{}),t===x){s(null);return}await de(g,{type:Tn[x],tabId:g}).catch(()=>{}),s(x)}}async function h(){const x=await ae();if(x){if(a){await de(x,{type:"FIX_PREVIEW_HIDE_REQUEST",tabId:x}).catch(()=>{}),n(!1),i(null);return}if(u.length===0){i("Run an audit first.");return}try{const g=await ge(x,{type:"FIX_PREVIEW_SHOW_REQUEST",tabId:x,violations:u});n(!0),i(`Previewing ${g.visualFixCount} visual fix${g.visualFixCount===1?"":"es"} + ${g.annotationCount} annotation${g.annotationCount===1?"":"s"}.`)}catch{i("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(we,{label:"Outline",title:"Show heading + landmark structure overlay",on:t==="outline",onClick:()=>p("outline")}),e.jsx(we,{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:()=>p("tab-order")}),e.jsx(we,{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:()=>p("reading-order")}),e.jsx(we,{label:"Targets",title:"Show interactive-element dimensions vs WCAG 2.5.8 (24px AA) / 2.5.5 (44px AAA)",on:t==="target-size",onClick:()=>p("target-size")}),e.jsx("span",{className:"w-px h-4 bg-slate-200 mx-1","aria-hidden":"true"}),e.jsx(we,{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:o,onChange:x=>void d(x.target.value),className:`text-xs border rounded px-1.5 py-0.5 ${o==="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 we({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 Ln(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 Un(){const t=b(c=>c.status),s=b(c=>c.progress),a=b(c=>c.aiProgress);if(t!=="running"||!s)return null;const n=s.current>=s.total,r=n?"Running deep analyzers…":`Auditing… ${s.current}/${s.total}`,i=n?"reading order · tab order · typography · CSS vars · AI candidates":Ln(s.currentState),o=n?100:s.current/s.total*100,l=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(_t,{label:r,detail:i,pct:o,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"}),l&&e.jsx(_t,{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 _t({label:t,detail:s,pct:a,valuenow:n,valuemax:r,ariaLabel:i,barClass:o,fillClass:l}){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 ${o}`,role:"progressbar","aria-valuenow":n,"aria-valuemin":0,"aria-valuemax":r,"aria-label":i,children:e.jsx("div",{className:`h-full transition-all ${l}`,style:{width:`${a}%`}})})]})}const _n=[{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 Dn(){const t=b(n=>n.results),s=b(n=>n.status),a=b(n=>n.setView);return e.jsxs("div",{className:"p-3 space-y-4",children:[e.jsx(On,{results:t,status:s,setView:a}),e.jsx(Mn,{setView:a})]})}function On({results:t,status:s,setView:a}){var c,u;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(d=>d.violations),i=ze(n).length,o=((c=t[0])==null?void 0:c.pageUrl)??((u=t[0])==null?void 0:u.scope)??"audited page",l=t.length;return e.jsx("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:i===0?"No issues found by automation":`${i} issue${i===1?"":"s"} to fix`})]}),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 →"})]})})}function Mn({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:_n.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 ct=[{id:"contrast",label:"Color & contrast",axeRules:["color-contrast","color-contrast-enhanced","link-in-text-block"],igtWorkflowIds:["visual-indicators"]},{id:"alt-text",label:"Alt text",axeRules:["image-alt","input-image-alt","object-alt","svg-img-alt","area-alt","role-img-alt"],igtWorkflowIds:[]},{id:"forms",label:"Forms",axeRules:["label","select-name","aria-input-field-name","aria-toggle-field-name","form-field-multiple-labels","label-content-name-mismatch","autocomplete-valid","label-title-only","wcc-onfocus-context-change","wcc-oninput-context-change","wcc-cognitive-auth-challenge"],igtWorkflowIds:["forms"]},{id:"keyboard",label:"Keyboard",axeRules:["nested-interactive","tabindex","frame-focusable-content","no-focusable-content","focus-order-semantics","wcc-gesture-no-alternative","wcc-drag-no-alternative"],igtWorkflowIds:["keyboard","focus-management"]},{id:"tab-order",label:"Tab order",axeRules:[],igtWorkflowIds:[],verifiedByWorkflowIds:["keyboard"],heuristic:"tab-order"},{id:"screen-reader",label:"Screen reader / ARIA",axeRules:["aria-allowed-attr","aria-required-attr","aria-required-children","aria-required-parent","aria-roles","aria-valid-attr-value","aria-valid-attr","aria-hidden-body","aria-hidden-focus","button-name","input-button-name","link-name","frame-title","presentation-role-conflict","aria-allowed-role","aria-prohibited-attr","aria-text","aria-deprecated-role","aria-conditional-attr","aria-braille-equivalent","empty-button","empty-heading","empty-link"],igtWorkflowIds:["screen-reader"]},{id:"reading-order",label:"Reading order",axeRules:[],igtWorkflowIds:[],verifiedByWorkflowIds:["page-structure"],heuristic:"reading-order"},{id:"page-structure",label:"Page structure",axeRules:["heading-order","page-has-heading-one","landmark-one-main","landmark-no-duplicate-banner","landmark-no-duplicate-contentinfo","landmark-no-duplicate-main","region","bypass","empty-table-header","landmark-banner-is-top-level","landmark-complementary-is-top-level","landmark-contentinfo-is-top-level","landmark-main-is-top-level","landmark-unique"],igtWorkflowIds:["page-structure"]}];function yt(t){const s=ct.map(r=>Pn(r,t)),a=Fn(s.map(r=>r.letter)),n=s.filter(r=>r.letter==="D"||r.letter==="F");return{overallLetter:a,subGrades:s,warningAreas:n,isLawsuitRisk:n.length>0}}function Fn(t){const s=t.filter(o=>o==="A").length,a=t.filter(o=>o==="C").length,n=t.filter(o=>o==="D").length,r=t.filter(o=>o==="F").length,i=t.length-s;return s===0&&n+r>a?"F":i===0?"A":i<=3?"B":i<=6?"C":"D"}function Pn(t,s){const a=new Set(t.axeRules),n=s.violations.filter(A=>a.has(A.ruleId)),r=s.manualRuns.filter(A=>t.igtWorkflowIds.includes(A.workflowId)),i=t.igtWorkflowIds.map(A=>s.workflows.find(B=>B.id===A)).filter(A=>A!=null);let o=i.length>0;for(const A of i){const B=r.find(Z=>Z.workflowId===A.id);if((B?Object.keys(B.steps).length:0)!==A.steps.length){o=!1;break}}const l=r.some(A=>Object.keys(A.steps).length>0),c=t.verifiedByWorkflowIds??[],u=s.manualRuns.filter(A=>c.includes(A.workflowId)),d=c.map(A=>s.workflows.find(B=>B.id===A)).filter(A=>A!=null);let p=c.length>0&&d.length===c.length;for(const A of d){const B=u.find(Z=>Z.workflowId===A.id);if((B?Object.keys(B.steps).length:0)!==A.steps.length){p=!1;break}}let h=null;if(p)for(const A of u)A.completedAt&&(h===null||A.completedAt>h)&&(h=A.completedAt);const x=t.heuristic==="tab-order"?s.heuristicCounts.tabOrder??0:t.heuristic==="reading-order"?s.heuristicCounts.readingOrder??0:0,g=c[0]??t.igtWorkflowIds[0]??null,j=s.interactiveAuditVerdicts,S=[];j&&(t.id==="tab-order"&&j.focusOrder&&S.push({verdict:j.focusOrder,criterionId:"2.4.3"}),t.id==="keyboard"&&(j.keyboardTrap&&S.push({verdict:j.keyboardTrap,criterionId:"2.1.2"}),j.focusVisible&&S.push({verdict:j.focusVisible,criterionId:"2.4.7"})),t.id==="reading-order"&&j.readingOrder&&S.push({verdict:j.readingOrder,criterionId:"1.3.2"}),t.id==="contrast"&&j.nonTextContrast&&S.push({verdict:j.nonTextContrast,criterionId:"1.4.11"}));const L=S.some(A=>A.verdict==="fail");if(S.length>0&&S.every(A=>A.verdict==="pass")&&c.length>0&&!p)return{id:t.id,label:t.label,letter:"A",untested:!1,needsIgt:!1,igtCompleted:!1,verifiedByIgt:!1,verifiedAt:S.length>0?new Date().toISOString():null,suppressedHeuristicCount:x,primaryVerifierWorkflowId:g,counts:{critical:0,serious:0,moderate:0,minor:0},caps:{cappedAtC:!1,cappedAtB:!1},aiVerifiedCriteria:S.map(A=>A.criterionId)};if(p&&c.length>0)return{id:t.id,label:t.label,letter:"A",untested:!1,needsIgt:!1,igtCompleted:!0,verifiedByIgt:!0,verifiedAt:h,suppressedHeuristicCount:x,primaryVerifierWorkflowId:g,counts:{critical:0,serious:0,moderate:0,minor:0},caps:{cappedAtC:!1,cappedAtB:!1}};const C=t.axeRules.length>0||t.heuristic!=null,f=t.igtWorkflowIds.length>0;if(C?!s.auditRan:!l)return{id:t.id,label:t.label,letter:"F",untested:!0,needsIgt:f||c.length>0,igtCompleted:!1,verifiedByIgt:!1,verifiedAt:null,suppressedHeuristicCount:0,primaryVerifierWorkflowId:g,counts:{critical:0,serious:0,moderate:0,minor:0},caps:{cappedAtC:!1,cappedAtB:!1}};const E={critical:0,serious:0,moderate:0,minor:0};for(const A of ze(n))E[A.impact]++;S.length>0&&S.every(A=>A.verdict==="pass")||(E.serious+=x),L&&(E.serious+=S.filter(A=>A.verdict==="fail").length);for(const A of r){const B=i.find(M=>M.id===A.workflowId);if(B)for(const M of B.steps){const Z=A.steps[M.id];(Z==null?void 0:Z.status)==="fail"&&(M.severity==="required"?E.serious++:E.moderate++)}}const U=E.critical>0,v=E.serious>0;let _;E.critical>=5?_="F":E.critical>=1?_="D":E.serious>=1?_="C":E.moderate>=1?_="B":_="A";const X=_!=="A"&&(f&&!o||c.length>0&&!p);return{id:t.id,label:t.label,letter:_,untested:!1,needsIgt:X,igtCompleted:o,verifiedByIgt:!1,verifiedAt:null,suppressedHeuristicCount:0,primaryVerifierWorkflowId:g,counts:E,caps:{cappedAtC:U,cappedAtB:v}}}const Gn={A:"bg-emerald-500",B:"bg-lime-500",C:"bg-yellow-500",D:"bg-orange-500",F:"bg-rose-600"},Vn={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 Wn({violations:t,componentId:s,hideOverallHeader:a=!1}){var I,Q,le,ne,y,z,Y;const[n,r]=m.useState([]),[i,o]=m.useState({}),[l,c]=m.useState([]),[u,d]=m.useState(new Set),[p,h]=m.useState(null),[x,g]=m.useState({}),[j,S]=m.useState(new Set),L=b($=>$.status),w=b($=>$.progress),C=b($=>$.freshThisSession),f=b($=>$.results),k=(I=f[0])==null?void 0:I.startedAt,E=((Q=f[0])==null?void 0:Q.pageUrl)??((le=f[0])==null?void 0:le.scope)??null;if(m.useEffect(()=>{if(!s){r([]),o({});return}let $=!1;return chrome.storage.local.get("igtRuns").then(K=>{if($)return;const D=((K==null?void 0:K.igtRuns)??{})[s]??{};r(Object.values(D))}),Ke(s).then(K=>{if($)return;const P={};for(const D of K)D.criterionId==="2.4.3"?P.focusOrder=D.verdict:D.criterionId==="2.1.2"?P.keyboardTrap=D.verdict:D.criterionId==="2.4.7"?P.focusVisible=D.verdict:D.criterionId==="1.3.2"?P.readingOrder=D.verdict:D.criterionId==="1.4.11"&&(P.nonTextContrast=D.verdict);o(P)}),()=>{$=!0}},[s]),m.useEffect(()=>{if(!E){c([]);return}let $=!1;return Fe(E).then(K=>{$||c(K)}),()=>{$=!0}},[E]),L==="running")return e.jsx(Yn,{current:w==null?void 0:w.current,total:w==null?void 0:w.total});const N=yt({violations:t,auditRan:f.length>0,manualRuns:n,workflows:oe,heuristicCounts:{tabOrder:((y=(ne=f[0])==null?void 0:ne.tabOrderIssues)==null?void 0:y.length)??0,readingOrder:((Y=(z=f[0])==null?void 0:z.readingOrderIssues)==null?void 0:Y.length)??0},interactiveAuditVerdicts:i}),U=b($=>$.acknowledgedKeys),v=f.length>0?vs(f,{runs:n,workflows:oe},"2.1","AA",U,l):void 0,_=f.length>0?ma(bt({audits:f,igtRuns:n,workflows:oe,acknowledgedMatchKeys:U,incompleteResolutions:l}),oe):void 0,X=v?v.failingCriteria.length>0||v.inconclusiveCriteria.length>0:!1,A=X&&N.overallLetter==="A"?"B":N.overallLetter;async function B($){var R;if(!E||!((R=v==null?void 0:v.inconclusiveReasons)!=null&&R[$]))return;const P=v.inconclusiveReasons[$].filter(G=>G.source==="axe-incomplete"&&G.elements&&G.elements.length>0);if(P.length===0)return;d(G=>new Set(G).add($)),h(null);const D=[];let H=0;try{for(const O of P){const W=await re({type:"AI_RESOLVE_INCOMPLETE_REQUEST",ruleId:O.ruleOrStepId,pageUrl:O.pageUrl??E,wcagCriterion:$,elements:O.elements??[],targetLevel:"AA"});if(W!=null&&W.unavailableReason){h(W.unavailableReason);break}W!=null&&W.resolutions&&(D.push(...W.resolutions),H+=W.totalCostUsd??0)}if(E){const O=await Fe(E);c(O)}const G={total:D.length,pass:D.filter(O=>O.verdict==="pass").length,fail:D.filter(O=>O.verdict==="fail").length,uncertain:D.filter(O=>O.verdict==="uncertain").length,costUsd:H,resolutions:D};g(O=>({...O,[$]:G}))}finally{d(G=>{const O=new Set(G);return O.delete($),O})}}function M($){S(K=>{const P=new Set(K);return P.has($)?P.delete($):P.add($),P})}async function Z($){var W,ie;if(!E)return;const K=((W=v==null?void 0:v.inconclusiveReasons)==null?void 0:W[$])??[],P=((ie=v==null?void 0:v.failingReasons)==null?void 0:ie[$])??[],D=[],H=new Set;for(const V of K){if(V.source!=="axe-incomplete"||!V.elements)continue;const ee=V.pageUrl??E;for(const he of V.elements){const xe=`${ee}::${V.ruleOrStepId}::${he.selector}`;H.has(xe)||(H.add(xe),D.push({ruleId:V.ruleOrStepId,pageUrl:ee,selector:he.selector}))}}for(const V of P){if(V.source!=="ai"||!V.selector)continue;const ee=V.ruleOrStepId.startsWith("ai-resolved::")?V.ruleOrStepId.slice(13):V.ruleOrStepId,he=V.pageUrl??E,xe=`${he}::${ee}::${V.selector}`;H.has(xe)||(H.add(xe),D.push({ruleId:ee,pageUrl:he,selector:V.selector}))}if(D.length===0)return;const R=new Date().toISOString(),G=[];for(const V of D){const ee=l.find(he=>he.pageUrl===V.pageUrl&&he.ruleId===V.ruleId&&he.selector===V.selector);ee&&ee.verdict==="pass"&&ee.reasoning.startsWith("Marked as visually verified")||G.push({pageUrl:V.pageUrl,ruleId:V.ruleId,selector:V.selector,verdict:"pass",reasoning:`Marked as visually verified by user on ${R.slice(0,10)}.`,resolvedAt:R,costUsd:0,wcagCriterion:$})}if(G.length===0)return;await xa(G);const O=await Fe(E);c(O),g(V=>({...V,[$]:{total:G.length,pass:G.length,fail:0,uncertain:0,costUsd:0,resolutions:G}}))}const F=(()=>{if(!X||N.overallLetter!=="A"||!v)return null;const $=v.inconclusiveCriteria.length,K=v.failingCriteria.length,P=[];K>0&&P.push(`${K} WCAG ${v.targetLevel} ${K===1?"criterion":"criteria"} failing`),$>0&&P.push(`${$} WCAG ${v.targetLevel} ${$===1?"criterion":"criteria"} inconclusive`);const D=K>0?"Fix the failing items OR Mark visually verified if AI was wrong about them.":"Resolve axe-incomplete + IGT-skip items to claim conformance.";return`Capped at B — ${P.join(" + ")}. ${D}`})();let q=0;for(const $ of oe){const K=n.find(D=>D.workflowId===$.id);if(!K)continue;$.steps.every(D=>{const H=K.steps[D.id];return(H==null?void 0:H.status)==="pass"||(H==null?void 0:H.status)==="fail"||(H==null?void 0:H.status)==="skip"||(H==null?void 0:H.status)==="not-applicable"})&&q++}const se=ze(t.filter($=>!U.has($.matchKey))).length;return e.jsxs("div",{className:"border border-slate-200 rounded-lg bg-white overflow-hidden",children:[!C&&k&&e.jsx(Jn,{scannedAt:k}),!a&&e.jsxs("div",{className:"flex",children:[e.jsx("div",{className:`flex items-center justify-center w-24 ${Gn[A]} text-white shrink-0`,children:e.jsx("span",{className:"text-5xl font-bold leading-none",children:A})}),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 ",N.subGrades.length," verification areas below. Untested areas count as F until verified."]}),F&&e.jsx("p",{className:"text-[11px] text-amber-800 leading-snug mt-1 bg-amber-50 border border-amber-200 rounded px-2 py-1",children:F})]})]}),a&&F&&e.jsx("p",{className:"text-[11px] text-amber-800 leading-snug bg-amber-50 border-b border-amber-200 px-3 py-2",children:F}),N.isLawsuitRisk&&e.jsx(zn,{areas:N.warningAreas}),e.jsx(Kn,{grades:N.subGrades}),v&&e.jsx(Bn,{coverage:v,onResolveWithAi:B,onMarkVisuallyVerified:Z,resolving:u,resolveError:p,lastResolveResult:x,expandedResultFor:j,onToggleResultDetail:M}),_&&e.jsx(Hn,{layers:_}),e.jsx(Qn,{violationsRemaining:se,manualCompleted:q,manualTotal:oe.length}),q>0||f.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:q})," of ",e.jsx("strong",{children:oe.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:`${q/oe.length*100}%`}})})]}):null]})}function Bn({coverage:t,onResolveWithAi:s,onMarkVisuallyVerified:a,resolving:n,resolveError:r,lastResolveResult:i,expandedResultFor:o,onToggleResultDetail:l}){const c=t.untestedCriteria.length+t.inconclusiveCriteria.length,[u,d]=m.useState(c>0&&c<=3),p=t.totalApplicable===0?0:Math.round(t.evaluated/t.totalApplicable*100),h=t.canClaimConformance,x=[];return t.failingCriteria.length>0&&x.push({kind:"failing",ids:t.failingCriteria}),t.inconclusiveCriteria.length>0&&x.push({kind:"inconclusive",ids:t.inconclusiveCriteria}),t.untestedCriteria.length>0&&x.push({kind:"untested",ids:t.untestedCriteria}),e.jsxs("div",{className:`border-t ${h?"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 ${h?"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 (",p,"%)"]}),h&&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)."]}),!h&&(()=>{const g=[];t.failingCriteria.length>0&&g.push("failing"),t.inconclusiveCriteria.length>0&&g.push("inconclusive"),t.untestedCriteria.length>0&&g.push("untested");const j=g.length===0?"unresolved":g.length===1?g[0]:g.length===2?`${g[0]} or ${g[1]}`:`${g.slice(0,-1).join(", ")}, or ${g[g.length-1]}`;return e.jsxs("p",{className:"text-[11px] mt-0.5 font-semibold",children:["Cannot claim ",t.targetLevel," conformance — applicable criteria remain ",j,"."]})})(),!h&&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."]}),!h&&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."]})]}),!h&&x.length>0&&e.jsx("button",{type:"button",onClick:()=>d(g=>!g),className:"text-[11px] underline shrink-0 self-start",children:u?"hide":"show list"})]}),u&&!h&&e.jsxs("div",{className:"mt-1.5 space-y-1.5",children:[x.map(g=>e.jsxs("div",{children:[e.jsxs("div",{className:`text-[10.5px] font-semibold uppercase tracking-wide ${g.kind==="failing"?"text-rose-900":"text-amber-900"}`,children:[g.kind==="untested"?"Untested":g.kind==="inconclusive"?"Inconclusive":"Failing"," (",g.ids.length,")"]}),e.jsx("ul",{className:"text-[10.5px] text-amber-900 space-y-1",children:g.ids.map(j=>{var N,U;const S=g.kind==="inconclusive"?(N=t.inconclusiveReasons)==null?void 0:N[j]:void 0,L=g.kind==="failing"?(U=t.failingReasons)==null?void 0:U[j]:void 0,w=S==null?void 0:S.some(v=>v.source==="axe-incomplete"&&v.elements&&v.elements.length>0),C=L==null?void 0:L.some(v=>v.source==="ai"),f=(n==null?void 0:n.has(j))??!1,k=i==null?void 0:i[j],E=(o==null?void 0:o.has(j))??!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("code",{className:"font-mono text-[11px]",children:["· ",j]}),(g.kind==="inconclusive"&&w||g.kind==="failing"&&C)&&(s||a)&&e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[g.kind==="inconclusive"&&s&&e.jsx("button",{type:"button",disabled:f,onClick:()=>s(j),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:f?"Resolving…":k?"✨ Resolve again →":"✨ Resolve with AI →"}),a&&e.jsx("button",{type:"button",disabled:f,onClick:()=>a(j),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:g.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"})]})]}),k&&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 ",k.total," ",k.total===1?"verdict":"verdicts",":",k.pass>0&&e.jsxs("span",{className:"text-emerald-700",children:["✓ ",k.pass," pass"]}),k.fail>0&&e.jsxs("span",{className:"text-rose-700",children:["✗ ",k.fail," fail"]}),k.uncertain>0&&e.jsxs("span",{className:"text-amber-700",children:["? ",k.uncertain," uncertain"]}),e.jsxs("span",{className:"text-slate-500 font-normal",children:["· $",k.costUsd.toFixed(4)]}),l&&e.jsx("button",{type:"button",onClick:()=>l(j),className:"ml-auto text-[10px] underline text-brand-700",children:E?"hide reasoning":"show reasoning"})]}),k.uncertain>0&&e.jsxs("p",{className:"mt-0.5 text-[10px] text-amber-800",children:["AI couldn't determine ",k.uncertain," ",k.uncertain===1?"element":"elements"," ","(typically text over images/gradients — needs visual review). These keep the criterion inconclusive."]}),k.pass===k.total&&k.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."]}),E&&e.jsx("ul",{className:"mt-1.5 space-y-1 max-h-40 overflow-y-auto",children:k.resolutions.map((v,_)=>e.jsxs("li",{className:"text-[10px] leading-snug",children:[e.jsx("span",{className:v.verdict==="pass"?"text-emerald-700 font-semibold":v.verdict==="fail"?"text-rose-700 font-semibold":"text-amber-700 font-semibold",children:v.verdict==="pass"?"✓":v.verdict==="fail"?"✗":"?"})," ",e.jsx("code",{className:"font-mono bg-slate-100 px-1 rounded",children:v.selector}),e.jsx("div",{className:"ml-4 text-slate-600",children:v.reasoning})]},_))})]}),L&&L.length>0&&e.jsx("ul",{className:"ml-3 mt-0.5 space-y-0.5",children:L.map((v,_)=>e.jsxs("li",{className:"text-[10px] text-rose-800",children:[v.source==="ai"&&e.jsxs(e.Fragment,{children:["AI verdict ",e.jsx("code",{className:"font-mono",children:v.ruleOrStepId.replace(/^ai-resolved::/,"")})," fail — "]}),v.source==="axe"&&e.jsxs(e.Fragment,{children:["axe rule ",e.jsx("code",{className:"font-mono",children:v.ruleOrStepId})," fail — "]}),v.source==="igt"&&e.jsxs(e.Fragment,{children:["Guided Test ",e.jsx("code",{className:"font-mono",children:v.ruleOrStepId})," fail — "]}),v.selector&&e.jsx("code",{className:"font-mono bg-rose-100 px-1 rounded mr-1",children:v.selector}),v.notes&&e.jsx("span",{className:"text-rose-700",children:v.notes})]},_))}),S&&S.length>0?e.jsx("ul",{className:"ml-3 mt-0.5 space-y-0.5",children:S.map((v,_)=>e.jsxs("li",{className:"text-[10px] text-amber-800",children:[v.source==="axe-incomplete"&&e.jsxs(e.Fragment,{children:["axe rule ",e.jsx("code",{className:"font-mono",children:v.ruleOrStepId})," — "]}),v.source==="igt-skip"&&e.jsxs(e.Fragment,{children:["Guided Test step ",e.jsx("code",{className:"font-mono",children:v.ruleOrStepId})," skipped — "]}),v.source==="ai-uncertain"&&e.jsxs(e.Fragment,{children:["AI rule ",e.jsx("code",{className:"font-mono",children:v.ruleOrStepId})," — "]}),v.resolutionHint,v.elements&&v.elements.length>0&&e.jsxs("span",{className:"block ml-1 mt-0.5 text-[10px] text-amber-700",children:["on ",v.elements.length===1?"element":`${v.elements.length} elements`,":"," ",v.elements.slice(0,3).map((X,A,B)=>e.jsxs("span",{children:[e.jsx("code",{className:"font-mono bg-amber-100 px-1 rounded",children:X.selector}),A<B.length-1&&e.jsx("span",{className:"text-amber-600",children:", "})]},A)),v.elements.length>3&&e.jsxs("span",{className:"text-amber-600",children:[", +",v.elements.length-3," more"]})]})]},_))}):g.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.)"})]},j)})})]},g.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 Dt={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 Hn({layers:t}){const s=b(n=>n.setView),a=["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:a.map(n=>{const r=t[n],i=r.coveredCriteria.length,o=r.blocked.length,l=r.unevaluated.length,c=r.cleared,u=i>0&&o===0&&l===0,d=u?"text-emerald-700":o>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 ${u?"bg-emerald-500 text-white":o>0?"bg-rose-500 text-white":"bg-amber-500 text-white"}`,"aria-hidden":"true",children:u?"✓":o>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:Dt[n].label}),e.jsx("span",{className:`font-mono text-[10px] ${d}`,children:i===0?"no coverage yet":`${c}/${i}`}),o>0&&e.jsxs("span",{className:"text-[10px] text-rose-700",children:["· ",o," blocked"]}),l>0&&e.jsxs("span",{className:"text-[10px] text-amber-700",children:["· ",l," pending"]})]}),e.jsx("p",{className:"text-[10px] text-slate-500 leading-snug",children:Dt[n].hint}),n==="human"&&l>0&&e.jsx("button",{type:"button",onClick:()=>s("guided"),className:"text-[10px] text-brand-600 hover:underline mt-0.5",children:"Open Guided Tests →"})]})]},n)})})]})}function zn({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 Kn({grades:t}){const s=b(a=>a.setView);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.jsx("ul",{className:"grid grid-cols-1 gap-1.5",children:t.map(a=>e.jsxs("li",{className:"flex items-center gap-2 text-[11px]",children:[e.jsx("span",{className:`w-6 h-6 inline-flex items-center justify-center rounded text-xs font-bold ${Vn[a.letter]}`,"aria-label":`Grade ${a.letter}`,children:a.letter}),e.jsx("span",{className:"font-medium text-slate-800 flex-1 min-w-0",children:a.label}),e.jsx(qn,{grade:a,onOpenGuided:()=>s("guided")})]},a.id))})]})}function qn({grade:t,onOpenGuided:s}){const a=n=>{if(!n)return"";const r=oe.find(i=>i.id===n);return(r==null?void 0:r.name)??n};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 n=t.verifiedAt?Us(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",n?` ${n} ago`:""]})}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)," →"]}):t.counts.critical>0||t.counts.serious>0?e.jsxs("span",{className:"text-slate-500 text-[10px]",children:[t.counts.critical>0&&e.jsxs("span",{className:"text-rose-700",children:[t.counts.critical," critical"]}),t.counts.critical>0&&t.counts.serious>0&&" · ",t.counts.serious>0&&e.jsxs("span",{className:"text-orange-700",children:[t.counts.serious," serious"]})]}):e.jsx("span",{className:"text-emerald-700 text-[10px]",children:"clean"})}function Qn({violationsRemaining:t,manualCompleted:s,manualTotal:a}){const n=b(o=>o.setView),r=[{done:t===0,label:t===0?"Automated checks pass":`Fix ${t} automated violation${t===1?"":"s"}`,action:void 0,tooltip:void 0},{done:!0,label:`Optional: deep-check via Guided Tests (${s}/${a} done)`,action:()=>n("guided"),tooltip:"Guided Tests are opt-in. The audit's automated checks + AI analyzers already produce a binary pass/fail for every WCAG criterion. Run these workflows if you want belt-and-suspenders confidence on top of automation."},{done:!1,label:"Export AI fix prompt + complete manual checklist",action:()=>n("delta"),tooltip:`Switches to the Delta tab. Click the Export menu and pick "AI fix prompt" — markdown for ChatGPT/Claude/Copilot, with manual checklist for the WCAG criteria automation can't detect.`}],i=r.findIndex(o=>!o.done);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:r.map((o,l)=>{const c=l===i,u=o.done;return e.jsxs("li",{className:"flex items-start gap-2",children:[e.jsx("span",{className:u?"font-mono text-emerald-700 shrink-0":c?"font-mono text-brand-600 font-semibold shrink-0":"font-mono text-slate-400 shrink-0","aria-hidden":"true",children:u?"✓":`${l+1}.`}),o.action?e.jsxs("button",{type:"button",onClick:o.action,title:o.tooltip,className:c?"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:[o.label," →"]}):e.jsx("span",{className:u?"text-slate-500 line-through leading-snug":c?"text-slate-900 font-medium leading-snug":"text-slate-500 leading-snug",children:o.label})]},l)})})]})}function Yn({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 Jn({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 (",Us(s)," old). Re-scan to grade the current page state."]})]})}function Us(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 _s(){return typeof chrome<"u"&&typeof chrome.devtools<"u"}async function Ot(t){if(!_s())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)});
|
|
@@ -15,7 +15,7 @@ var ca=Object.defineProperty;var da=(t,s,a)=>s in t?ca(t,s,{enumerable:!0,config
|
|
|
15
15
|
`),u=new URLSearchParams({"[Title]":o,"[Description]":c});let d=`${r}/_workitems/create/${encodeURIComponent(n)}?${u.toString()}`;return d.length>Jt&&(d=d.slice(0,Jt)),{url:d,title:o,description:c}}const Xt=7800;function zr(t,s,a){const n=t.replace(/\/$/,""),r=[];for(const d of a){const p=`${d.ruleId}::${d.target.selector}`,h=`:${d.currentState.pseudoState} · ${d.currentState.theme} · ${d.currentState.direction}`,x=r.find(g=>`${g.ruleId}::${g.target.selector}`===p);if(x){x._states.includes(h)||x._states.push(h);continue}r.push({...d,_states:[h]})}const i=`a11y: ${r.length} new violation${r.length===1?"":"s"} in ${s??"audited component"}`,o=[];o.push(`**Component:** \`${s??"unknown"}\``),o.push(""),o.push("Detected by WCAG Component Auditor as **new** vs the saved baseline — these are violations introduced since the last accepted baseline."),o.push(""),o.push("---"),o.push("");for(const d of r)o.push(`### \`${d.ruleId}\` — ${d.impact}`),o.push(""),o.push(d.description),o.push(""),o.push(`- **WCAG:** ${d.wcagCriterion} (${d.wcagLevel})`),o.push(`- **Selector:** \`${d.target.selector}\``),o.push(`- **Found in state(s):** ${d._states.join(", ")}`),d.helpUrl&&o.push(`- **More info:** ${d.helpUrl}`),o.push(""),o.push("```html"),o.push(d.target.outerHTML),o.push("```"),o.push("");o.push("---"),o.push(""),o.push("_Filed via WCAG Component Auditor (delta-only — inherited debt not included)._");const l=o.join(`
|
|
16
16
|
`),c=new URLSearchParams({"issue[title]":i,"issue[description]":l});let u=`${n}/-/issues/new?${c.toString()}`;return u.length>Xt&&(u=u.slice(0,Xt)),{url:u,title:i,description:l}}const Zt=["sidePanel:lastAudit","acknowledgedFindings","dismissedFindings","aiColorSuggestions","incompleteResolutions","igtRuns","inflight:audit","aiUsageLog","aiDiagnosticLatest","auditAttestations","spotAuditReviews","interactiveAuditResults"],Kr=["wcag-component-auditor","wcag-forensic-log"];async function qr(){const t=[];let s=0;const a=[];try{const n=await chrome.storage.local.get(Zt);s=Object.keys(n).length,await chrome.storage.local.remove(Zt)}catch(n){t.push(`chrome.storage.local: ${n instanceof Error?n.message:String(n)}`)}for(const n of Kr)try{await Qr(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 Qr(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 ut="accessibilityStatementInputs:v1";async function Yr(){var a;if(typeof chrome>"u"||!((a=chrome.storage)!=null&&a.local))return null;const s=(await chrome.storage.local.get(ut))[ut];return s&&typeof s=="object"?s:null}async function Jr(t){var s;typeof chrome>"u"||!((s=chrome.storage)!=null&&s.local)||await chrome.storage.local.set({[ut]:t})}function Xr({open:t,onClose:s,results:a}){const[n,r]=m.useState("eaa"),[i,o]=m.useState(""),[l,c]=m.useState(""),[u,d]=m.useState("partial"),[p,h]=m.useState(""),[x,g]=m.useState(""),[j,S]=m.useState(""),[L,w]=m.useState(""),[C,f]=m.useState("English"),[k,E]=m.useState("wcagcheckr (self-evaluation)"),[N,U]=m.useState("2.1"),[v,_]=m.useState("AA"),[X,A]=m.useState(!1),[B,M]=m.useState(null),Z=m.useRef(null);if(m.useEffect(()=>{t&&(async()=>{var Q,le,ne,y;const I=await Yr();if(I&&(I.framing&&r(I.framing),I.organizationName&&o(I.organizationName),I.siteUrl&&c(I.siteUrl),I.conformanceStatus&&d(I.conformanceStatus),(Q=I.contact)!=null&&Q.email&&h(I.contact.email),(le=I.contact)!=null&&le.phone&&g(I.contact.phone),(ne=I.contact)!=null&&ne.formUrl&&S(I.contact.formUrl),I.countryCode&&w(I.countryCode),I.language&&f(I.language),I.auditedBy&&E(I.auditedBy),I.wcagVersion&&U(I.wcagVersion),I.wcagLevel&&_(I.wcagLevel)),!(I!=null&&I.siteUrl)&&((y=a[0])!=null&&y.pageUrl))try{const z=new URL(a[0].pageUrl);c(`${z.protocol}//${z.host}/`)}catch{}I!=null&&I.conformanceStatus||d(ja(a)),setTimeout(()=>{var z;return(z=Z.current)==null?void 0:z.focus()},50)})()},[t,a]),!t)return null;function F(){var ne;const I=new Date().toISOString().slice(0,10),Q=(ne=a[0])!=null&&ne.startedAt?new Date(a[0].startedAt).toISOString().slice(0,10):I,le={};return p.trim()&&(le.email=p.trim()),x.trim()&&(le.phone=x.trim()),j.trim()&&(le.formUrl=j.trim()),{framing:n,organizationName:i.trim(),siteUrl:l.trim(),conformanceStatus:u,preparedAt:I,evaluatedAt:Q,contact:le,countryCode:L||null,language:C.trim()||"English",auditedBy:k.trim()||"wcagcheckr (self-evaluation)",wcagVersion:N,wcagLevel:v}}function q(I){if(!I.organizationName)return"Organization name is required.";if(!I.siteUrl)return"Site URL is required.";try{new URL(I.siteUrl)}catch{return"Site URL must be a valid URL (e.g. https://example.com/)."}return!I.contact.email&&!I.contact.phone&&!I.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 se(I){M(null);const Q=F(),le=q(Q);if(le){M(le);return}A(!0);try{await Jr(Q);const ne=await te({type:"EXPORT_REQUEST",format:I==="html"?"accessibility-statement-html":"accessibility-statement-markdown",results:a,statementInputs:Q}),y=(ne==null?void 0:ne.content)??"";if(!y||y.startsWith("# Accessibility statement — error")){M(y||"Export failed — no response.");return}try{await navigator.clipboard.writeText(y)}catch{}const z=new Blob([y],{type:I==="html"?"text/html;charset=utf-8":"text/markdown;charset=utf-8"}),Y=URL.createObjectURL(z);window.open(Y,"_blank","noopener,noreferrer"),setTimeout(()=>URL.revokeObjectURL(Y),6e4),s()}catch(ne){M(ne instanceof Error?ne.message:String(ne))}finally{A(!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:I=>I.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:n==="eaa",onChange:()=>r("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:n==="wad",onChange:()=>r("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:Z,type:"text",value:i,onChange:I=>o(I.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:l,onChange:I=>c(I.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:u,onChange:I=>d(I.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:N,onChange:I=>U(I.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:v,onChange:I=>_(I.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:p,onChange:I=>h(I.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:x,onChange:I=>g(I.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:j,onChange:I=>S(I.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:L,onChange:I=>w(I.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(Na).map(([I,Q])=>e.jsxs("option",{value:I,children:[I," — ",Q.name.replace(/^[A-Z]+\s*—\s*/,"")]},I))]}),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:C,onChange:I=>f(I.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:k,onChange:I=>E(I.target.value),className:"w-full border border-slate-300 rounded px-2 py-1.5"})]}),B&&e.jsx("div",{className:"text-xs text-rose-800 bg-rose-50 border border-rose-200 rounded p-2",role:"alert",children:B})]}),e.jsxs("div",{className:"p-4 border-t border-slate-200 flex gap-2 flex-wrap",children:[e.jsx("button",{type:"button",onClick:()=>void se("markdown"),disabled:X,className:"text-xs px-3 py-1.5 bg-brand-500 hover:bg-brand-600 text-white rounded disabled:opacity-50 font-medium",children:X?"Generating…":"📄 Generate Markdown"}),e.jsx("button",{type:"button",onClick:()=>void se("html"),disabled:X,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:X?"Generating…":"🌐 Generate HTML"}),e.jsx("button",{type:"button",onClick:s,disabled:X,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 Bs(){const t=b(y=>y.delta),s=b(y=>y.componentId),a=b(y=>y.results),n=b(y=>y.tier),r=b(y=>y.baselineList),i=b(y=>y.siteCrawlReport),[o,l]=m.useState(""),[c,u]=m.useState(""),[d,p]=m.useState(""),[h,x]=m.useState(""),[g,j]=m.useState(!1),[S,L]=m.useState(!1),[w,C]=m.useState(null),[f,k]=m.useState(null),[E,N]=m.useState(!1),[U,v]=m.useState(!1),[_,X]=m.useState(null),[A,B]=m.useState(!1);m.useEffect(()=>{Promise.all([te({type:"SETTINGS_GET",key:"githubRepoUrl"}),te({type:"SETTINGS_GET",key:"jiraInstanceUrl"}),te({type:"SETTINGS_GET",key:"azureDevOpsProjectUrl"}),te({type:"SETTINGS_GET",key:"gitlabProjectUrl"})]).then(([y,z,Y,$])=>{l(typeof y.data=="string"?y.data:""),u(typeof z.data=="string"?z.data:""),p(typeof Y.data=="string"?Y.data:""),x(typeof $.data=="string"?$.data:"")})},[]),m.useEffect(()=>pe("BADGE_CLICKED_EVENT",z=>{const Y=`viol-row-${z.violationId}`,$=document.getElementById(Y);$&&($.scrollIntoView({behavior:"smooth",block:"center"}),$.classList.add("ring-2","ring-rose-500"),setTimeout(()=>$.classList.remove("ring-2","ring-rose-500"),1500))}),[]),m.useEffect(()=>()=>{(async()=>{const y=await ae();y&&(U&&await de(y,{type:"BADGES_HIDE_REQUEST",tabId:y}).catch(()=>{}),A&&await de(y,{type:"HEATMAP_HIDE_REQUEST",tabId:y}).catch(()=>{}))})()},[]);async function M(){const y=await ae();if(!y){ce.polite("Cannot identify audit tab; reload and re-run the audit.");return}if(U){await de(y,{type:"BADGES_HIDE_REQUEST",tabId:y}).catch(()=>{}),v(!1),X(null);return}const z={critical:4,serious:3,moderate:2,minor:1},Y=new Map;for(const D of a)for(const H of D.violations)Y.has(H.matchKey)||Y.set(H.matchKey,H);const K=Array.from(Y.values()).sort((D,H)=>z[H.impact]-z[D.impact]).map((D,H)=>({id:D.matchKey,index:H+1,selector:D.target.selector,impact:D.impact,ruleId:D.ruleId,wcagCriterion:D.wcagCriterion}));if(K.length===0){ce.polite("No violations to badge.");return}const P=await ge(y,{type:"BADGES_SHOW_REQUEST",tabId:y,violations:K}).catch(()=>null);P&&(v(!0),X({rendered:P.rendered,requested:P.requested,clustered:P.clustered}),ce.polite(`${P.rendered} violation badges shown on the page.`))}async function Z(){const y=await ae();if(!y){ce.polite("Cannot identify audit tab; reload and re-run the audit.");return}if(A){await de(y,{type:"HEATMAP_HIDE_REQUEST",tabId:y}).catch(()=>{}),B(!1);return}const z=new Map;for(const K of a)for(const P of K.violations)z.has(P.matchKey)||z.set(P.matchKey,P);const Y=Array.from(z.values()).map(K=>({selector:K.target.selector,impact:K.impact}));if(Y.length===0){ce.polite("No violations to heatmap.");return}const $=await ge(y,{type:"HEATMAP_SHOW_REQUEST",tabId:y,violations:Y}).catch(()=>null);$&&(B(!0),ce.polite(`Heatmap shown with ${$.rendered} violation blobs.`))}const F=Ns(n,"exportJson"),q=Ss[n].maxBaselines,se=r.some(y=>y.componentId===s),I=se||r.length<q;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 Q(){if(!s||a.length===0)return;const y=a.flatMap(H=>H.violations),z=a.flatMap(H=>H.announcements??[]),Y=a.flatMap(H=>H.focusEvents??[]),$=a[0],P=(await te({type:"SETTINGS_GET",key:"stateMatrix"})).data??ks;await re({type:"BASELINE_SET",componentId:s,violations:y,announcements:z,focusEvents:Y,snapshotMeta:{url:window.location.href,axeVersion:$.axeVersion,matrixConfig:P,capturedAt:new Date().toISOString()}});const D=await te({type:"BASELINE_COMPARE",componentId:s,currentViolations:y,announcements:z,focusEvents:Y,currentMatrix:P});b.getState().setDelta(D.delta),ce.polite(`Baseline saved for ${s}.`)}async function le(){if(!s||!se||!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 re({type:"BASELINE_DELETE",componentId:s});const z=a.flatMap(D=>D.violations),Y=a.flatMap(D=>D.announcements??[]),$=a.flatMap(D=>D.focusEvents??[]),K=await te({type:"BASELINE_COMPARE",componentId:s,currentViolations:z,announcements:Y,focusEvents:$});b.getState().setDelta(K.delta);const P=await te({type:"BASELINE_LIST"});b.getState().setBaselineList(P.items),ce.polite(`Baseline cleared for ${s}.`)}async function ne(y,z=!1){if(a.length===0)return;if(y==="ai-prompt"){const{copyAiFixerPrompt:W}=await vt(async()=>{const{copyAiFixerPrompt:ie}=await import("./copy-ai-fixer-prompt-BWaVBRIR.js");return{copyAiFixerPrompt:ie}},__vite__mapDeps([0,1,2]));await W({results:a,componentId:s,delta:z?void 0:t,siteCrawlReport:i});return}let Y;if((y==="defense-bundle"||y==="evidence-bundle"||y==="deposition-packet")&&s){const W=await chrome.storage.local.get("igtRuns"),V=((W==null?void 0:W.igtRuns)??{})[s]??{};Y=Object.values(V)}const P=await te({type:"EXPORT_REQUEST",format:y,results:a,delta:z?void 0:t??void 0,manualRuns:Y,dismissedKeys:void 0,incompleteResolutions:void 0});if(y==="defense-bundle"||y==="evidence-bundle"||y==="deposition-packet"){const W=fs(y,s);await bs()?ft(P.content,W):k({open:!0,format:y,content:P.content,filename:W});return}if(y==="html-print"||y==="vpat"||y==="methodology-doc"||y==="conformance-crosswalk"||y==="executive-report"){gt(P.content);return}const D=y==="json"?"application/json":y==="sarif"?"application/sarif+json":y==="ticket-bundle"?"text/markdown":"application/xml",H=y==="junit"?"xml":y==="ticket-bundle"?"md":y,R=new Blob([P.content],{type:D}),G=URL.createObjectURL(R),O=document.createElement("a");O.href=G,O.download=`audit-${(s==null?void 0:s.replace(/[^a-z0-9]/gi,"-"))??"export"}.${H}`,O.click(),URL.revokeObjectURL(G)}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:Q,disabled:!I,title:I?void 0:`Free tier limits you to ${q} 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"}),se&&e.jsx("button",{onClick:le,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:()=>j(!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 M(),"aria-pressed":U,title:"Overlay numbered, color-coded badges on every violating element in the page. Click a badge to scroll its row into view here.",className:U?"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:U?"Hide badges":"Show badges 🎯"}),U&&_&&e.jsxs("span",{className:"text-[11px] text-slate-500",children:[_.rendered," of ",_.requested," rendered",_.clustered>0?` · ${_.clustered} clusters`:""]}),e.jsx("button",{type:"button",onClick:()=>void Z(),"aria-pressed":A,title:"Overlay a density heatmap on the page. Red blobs at each violation rect; overlapping blobs glow brighter to show problem clusters.",className:A?"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:A?"Hide heatmap":"Show heatmap 🔥"}),e.jsx(ni,{disabled:!F,onExport:ne,onAccessibilityStatement:()=>N(!0),hasBaselineDelta:!!(t!=null&&t.baselineSnapshotMeta)}),!I&&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 y=tt(t.new),z=tt(t.persistent),Y=tt(t.fixed),$=[...y.review,...z.review];return e.jsxs(e.Fragment,{children:[e.jsx(Ne,{title:"New",violations:y.findings,count:y.findings.length,accent:"red",actions:[...o&&y.findings.length>0?[{label:"File GitHub issue",onClick:()=>ei(o,s,y.findings)}]:[],...c&&y.findings.length>0?[{label:"File Jira issue",onClick:()=>ti(c,s,y.findings)}]:[],...d&&y.findings.length>0?[{label:"File Azure DevOps work item",onClick:()=>si(d,s,y.findings)}]:[],...h&&y.findings.length>0?[{label:"File GitLab issue",onClick:()=>ai(h,s,y.findings)}]:[]]}),e.jsx(Ne,{title:"Persistent",violations:z.findings,count:z.findings.length,accent:"slate"}),e.jsx(Ne,{title:"Fixed",violations:Y.findings,count:t.fixedCount,accent:"green"}),$.length>0&&e.jsx(Ne,{title:"Needs review (does not affect grade)",violations:$,count:$.length,accent:"amber"}),t.acknowledged&&t.acknowledged.length>0&&e.jsx(Ne,{title:"Acknowledged",violations:t.acknowledged,count:t.acknowledged.length,accent:"slate",renderAsAcknowledged:!0})]})})(),f&&e.jsx(Ws,{open:f.open,onClose:()=>k(null),format:f.format,content:f.content,filename:f.filename}),e.jsx(Xr,{open:E,onClose:()=>N(!1),results:a}),g&&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"})]})]}),w&&e.jsxs("div",{className:"text-[11px] bg-emerald-50 border border-emerald-200 rounded p-2 text-emerald-900",children:["✓ Cleared ",w.chromeStorageKeysCleared," chrome.storage key",w.chromeStorageKeysCleared===1?"":"s"," + ",w.indexedDbsCleared.length," database",w.indexedDbsCleared.length===1?"":"s",".",w.errors.length>0&&e.jsxs("div",{className:"mt-1 text-rose-800",children:["Partial: ",w.errors.join("; ")]})]}),e.jsx("div",{className:"flex justify-end gap-2 pt-1 border-t border-slate-200",children:w?e.jsx("button",{type:"button",onClick:()=>{j(!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:()=>j(!1),disabled:S,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()=>{L(!0);try{const y=await qr();C(y),await Qe(),ce.polite("Audit data reset. Ready for a fresh scan.")}catch(y){C({chromeStorageKeysCleared:0,indexedDbsCleared:[],errors:[y instanceof Error?y.message:String(y)]})}finally{L(!1)}},disabled:S,className:"text-xs px-3 py-1.5 bg-rose-600 text-white rounded hover:bg-rose-700 disabled:opacity-50",children:S?"Resetting…":"Reset everything"})]})})]})})]})}const Zr={red:"text-red-700",slate:"text-slate-700",green:"text-green-700",amber:"text-amber-700"};function tt(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 Ne({title:t,violations:s,count:a,accent:n,actions:r,renderAsAcknowledged:i}){const[o,l]=m.useState(!i);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 ${Zr[n]} ${i?"cursor-pointer select-none":""}`,onClick:i?()=>l(c=>!c):void 0,children:[i&&e.jsx("span",{className:"mr-1 text-slate-400",children:o?"▾":"▸"}),t," (",a,")"]}),r&&r.length>0&&e.jsx("div",{className:"flex gap-1 flex-wrap",children:r.map(c=>e.jsx("button",{type:"button",onClick:c.onClick,className:"text-[11px] px-2 py-0.5 border border-slate-300 rounded text-slate-700 hover:bg-slate-50",children:c.label},c.label))})]}),o?s.length===0?e.jsx("p",{className:"text-xs text-slate-500 italic",children:"none"}):e.jsx("div",{className:"space-y-1.5",children:i?s.map((c,u)=>e.jsx(Ee,{violation:c,alreadyAcknowledged:!0},u)):Gr(s).map(c=>e.jsx(Pr,{ruleId:c.ruleId,violations:c.violations},c.ruleId))}):null]})}function ei(t,s,a){if(a.length===0)return;const{url:n}=Wr(t,s,a);window.open(n,"_blank","noopener,noreferrer")}function ti(t,s,a){if(a.length===0)return;const{url:n}=Br(t,s,a);window.open(n,"_blank","noopener,noreferrer")}function si(t,s,a){if(a.length===0)return;const{url:n}=Hr(t,s,a);window.open(n,"_blank","noopener,noreferrer")}function ai(t,s,a){if(a.length===0)return;const{url:n}=zr(t,s,a);window.open(n,"_blank","noopener,noreferrer")}function ni({disabled:t,onExport:s,onAccessibilityStatement:a,hasBaselineDelta:n}){const[r,i]=m.useState(!1),[o,l]=m.useState(!1);function c(u){i(!1),s(u,o)}return e.jsxs("div",{className:"relative inline-block",children:[e.jsx("button",{type:"button",disabled:t,onClick:()=>i(u=>!u),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:()=>i(!1)}),e.jsxs("div",{className:"absolute left-0 top-full mt-1 z-50 min-w-[200px] 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:o,onChange:u=>l(u.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(ue,{onClick:()=>c("json"),title:"Native format with full audit detail.",children:"JSON"}),e.jsx(ue,{onClick:()=>c("sarif"),title:"SARIF for GitHub code-scanning + most CI tools.",children:"SARIF"}),e.jsx(ue,{onClick:()=>c("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(ue,{onClick:()=>c("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(ue,{onClick:()=>c("vpat"),title:"VPAT 2.5 conformance report — opens in a new tab for review and printing.",children:"VPAT 2.5"}),e.jsx(ue,{onClick:()=>c("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(ue,{onClick:()=>c("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(ue,{onClick:()=>c("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(ue,{onClick:()=>c("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(ue,{onClick:()=>c("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(ue,{onClick:()=>c("ai-prompt"),title:"Generate a structured prompt to paste into Claude / Cursor / Copilot. Auto-copies to clipboard.",children:"AI fix prompt ✨"}),e.jsx(ue,{onClick:()=>c("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(ue,{onClick:()=>c("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(ue,{onClick:()=>{i(!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 ue({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 ri="2024-07-25",ii="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.",Hs=[{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(Hs.flatMap(t=>t.wcag2Criteria));function oi(t,s){return Hs.map(a=>{const n=a.wcag2Criteria.filter(o=>t.has(o)),r=a.wcag2Criteria.some(o=>s.has(o));let i;return n.length>0?i="has-violations":r?i="clean":i="not-evaluated",{outcome:a,violatedCriteria:n,status:i}})}const li={perceive:"Perceive",operate:"Operate",understand:"Understand",robust:"Robust"};function zs(){const t=b(c=>c.results);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 s=new Set,a=new Set;for(const c of t){for(const d of c.violations)s.add(d.wcagCriterion);const u=c.axeRulesEvaluated;if(u){for(const d of u.passed)a.add(d.wcagCriterion);for(const d of u.inapplicable)a.add(d.wcagCriterion);for(const d of u.incomplete)a.add(d.wcagCriterion)}for(const d of c.violations)a.add(d.wcagCriterion)}const n=oi(s,a),r=new Map;for(const c of n){const u=r.get(c.outcome.category)??[];u.push(c),r.set(c.outcome.category,u)}const i=n.filter(c=>c.status==="clean").length,o=n.filter(c=>c.status==="has-violations").length,l=n.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:ri}),"."," ",ii]})]}),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:[o," with violations"]}),e.jsxs("span",{className:"px-2 py-1 rounded bg-slate-100 text-slate-700",children:[l," not evaluated"]})]}),["perceive","operate","understand","robust"].map(c=>{const u=r.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:[li[c]," · ",u.length]}),e.jsx("ul",{className:"divide-y divide-slate-100",children:u.map(d=>e.jsxs("li",{className:"px-3 py-2",children:[e.jsxs("div",{className:"flex items-baseline gap-2 mb-1",children:[e.jsx(ci,{status:d.status}),e.jsx("strong",{className:"text-xs",children:d.outcome.title})]}),e.jsx("p",{className:"text-[11px] text-slate-600 leading-snug",children:d.outcome.description}),e.jsxs("p",{className:"text-[10px] text-slate-500 mt-1 font-mono",children:["WCAG 2: ",d.outcome.wcag2Criteria.join(", ")]}),d.violatedCriteria.length>0&&e.jsxs("p",{className:"text-[11px] text-rose-700 mt-1",children:["Violated: ",e.jsx("strong",{children:d.violatedCriteria.join(", ")})]})]},d.outcome.id))})]},c)})]})}function ci({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 di=[{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"}],ui={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 pi(){const t=b(d=>d.results),s=b(d=>d.componentId),a=b(d=>d.findingsLens),n=b(d=>d.setFindingsLens),r=b(d=>d.setView),i=b(d=>d.status),[o,l]=m.useState({});m.useEffect(()=>{if(!s)return;let d=!1;return(async()=>{const p=await Ke(s);if(d)return;const h={};for(const x of p)x.criterionId==="2.4.3"?h.focusOrder=x.verdict:x.criterionId==="2.1.2"?h.keyboardTrap=x.verdict:x.criterionId==="2.4.7"?h.focusVisible=x.verdict:x.criterionId==="1.3.2"?h.readingOrder=x.verdict:x.criterionId==="1.4.11"&&(h.nonTextContrast=x.verdict);l(h)})(),()=>{d=!0}},[s]);const[c,u]=m.useState([]);return m.useEffect(()=>{if(!s){u([]);return}let d=!1;return chrome.storage.local.get("igtRuns").then(p=>{if(d)return;const x=((p==null?void 0:p.igtRuns)??{})[s]??{};u(Object.values(x))}),()=>{d=!0}},[s]),t.length===0?e.jsxs("div",{className:"p-4",children:[e.jsx(es,{setView:r}),e.jsx("div",{className:"mt-6 text-center text-sm text-slate-600",children:e.jsx("p",{children:i==="running"?"Audit in progress. Findings appear here when the matrix completes.":i==="failed"||i==="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(es,{setView:r}),e.jsx(hi,{results:t,interactiveVerdicts:o,manualRuns:c}),e.jsx(mi,{lens:a,setLens:n}),e.jsx(xi,{lens:a,results:t,componentId:s,interactiveVerdicts:o})]})}function es({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 hi({results:t,interactiveVerdicts:s,manualRuns:a}){var d,p,h,x;const n=t.flatMap(g=>g.violations),r=ze(n),o=yt({violations:n,auditRan:!0,manualRuns:a,workflows:oe,heuristicCounts:{tabOrder:((p=(d=t[0])==null?void 0:d.tabOrderIssues)==null?void 0:p.length)??0,readingOrder:((x=(h=t[0])==null?void 0:h.readingOrderIssues)==null?void 0:x.length)??0},interactiveAuditVerdicts:s}).overallLetter,l=r.length,c=t.length,u=t.reduce((g,j)=>g+j.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 ${ui[o]}`,children:e.jsx("span",{className:"text-4xl font-display font-semibold leading-none tracking-tight",children:o})}),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:l===0?"No issues found by automation":`${l} issue${l===1?"":"s"} to fix`}),e.jsxs("p",{className:"text-[11px] text-slate-500 leading-snug mt-0.5",children:[c," state",c===1?"":"s"," tested · ",(u/1e3).toFixed(1),"s"]})]})]})})}function mi({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:di.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 xi({lens:t,results:s,componentId:a,interactiveVerdicts:n}){return t==="overview"?e.jsxs("div",{className:"space-y-3",children:[e.jsx(bi,{componentId:a}),e.jsx(Wn,{violations:s.flatMap(r=>r.violations),componentId:a,hideOverallHeader:!0}),e.jsx(vi,{})]}):t==="per-area"?e.jsx(Sr,{results:s,interactiveVerdicts:n}):t==="violations"?e.jsx(yi,{results:s}):t==="activity"?e.jsx("div",{className:"-mx-3",children:e.jsx(Vs,{})}):t==="delta"?e.jsx("div",{className:"-mx-3",children:e.jsx(Bs,{})}):t==="wcag3"?e.jsx("div",{className:"-mx-3",children:e.jsx(zs,{})}):null}const ts={critical:0,serious:1,moderate:2,minor:3};function ss(t){return`${qe(t.ruleId,t.target.selector)}::${t.target.outerHTML.slice(0,64)}`}const gi=[{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."}],fi={pass:"bg-emerald-500 text-white",fail:"bg-rose-600 text-white",uncertain:"bg-amber-500 text-slate-900"};function bi({componentId:t}){const[s,a]=m.useState({});m.useEffect(()=>{if(!t){a({});return}let l=!1;return(async()=>{const c=await Ke(t);if(l)return;const u={};for(const d of c)u[d.criterionId]=d.verdict;a(u)})(),()=>{l=!0}},[t]);const n=Object.values(s).length,r=Object.values(s).filter(l=>l==="pass").length,i=Object.values(s).filter(l=>l==="fail").length,o=Object.values(s).filter(l=>l==="uncertain").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:n===0?"not configured · all 5 criteria pending human verification":`${n}/5 · ${r} pass · ${i} fail · ${o} uncertain`})]}),n===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:gi.map(l=>{const c=s[l.id];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 ${c?fi[c]:"bg-slate-200 text-slate-500"}`,title:c?`AI verdict: ${c}`:"AI did not produce a verdict on this criterion",children:c||"not run"}),e.jsxs("div",{className:"min-w-0",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:l.id}),l.label]}),e.jsx("p",{className:"text-[11px] text-slate-500 leading-snug mt-0.5",children:l.blurb})]})]},l.id)})})]})}function vi(){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(be,{title:"The overall grade",body:"Mean of the 9 verification areas. Capped at B when any criterion is failing or inconclusive — fix or mark verified to claim A. The grade is computed once with all evidence sources mixed in (axe, AI walkthroughs, IGT runs); the sticky card above and the area list below cannot disagree."}),e.jsx(be,{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(be,{title:"AI does most of the human work",body:"Five 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. They drive real keyboard input + take screenshots + judge them with vision — exactly the work IGT manual workflows used to require. Their verdicts feed the Tab order / Keyboard / Reading order / Color & contrast sub-grades automatically. Humans only spot-check + attest before signing the formal report."}),e.jsx(be,{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(be,{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(be,{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 be({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 yi({results:t}){const s=new Set,a=[];for(const n of t)for(const r of n.violations){const i=ss(r);s.has(i)||(s.add(i),a.push(r))}return a.sort((n,r)=>{const i=ts[n.impact]??99,o=ts[r.impact]??99;return i-o}),a.length===0?e.jsxs("div",{className:"text-center text-sm text-slate-600 py-6",children:["No automation-detectable violations found across ",t.length," state",t.length===1?"":"s",". Switch to ",e.jsx("strong",{children:"Per-area"})," or"," ",e.jsx("strong",{children:"Activity"})," for heuristic findings axe doesn't cover."]}):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:[a.length," unique violation",a.length===1?"":"s"," · sorted by impact"]}),a.map(n=>e.jsx(Ee,{violation:n},ss(n)))]})}const pt="igtRuns";async function wi(t,s,a){const n=s[0];if(!n)return;const r=n.pageUrl;if(!r)return;const i=`Auto-dismissed by Guided test: "${a}" marked pass`;if(t==="tab-order"){const o=n.tabOrderIssues??[];if(o.length===0)return;await $e(r,o.map(l=>({key:Te(l.selector),reason:i,snippet:`${l.selector} — ${l.textSnippet||"(no text)"}`})))}else if(t==="reading-order"){const o=n.readingOrderIssues??[];if(o.length===0)return;await $e(r,o.map(l=>({key:Re(l.selector),reason:i,snippet:`${l.selector} — ${l.textSnippet||"(no text)"}`})))}}const ji={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"}},Ni={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"}},ki={outline:"Outline","tab-order":"Tab order","reading-order":"Reading order",targets:"Targets","fix-preview":"Fix preview"};async function as(t,s){const a=await ae();if(!a)return;const n=s?ji[t]:Ni[t];try{await de(a,n)}catch{}}async function Si(){const s=(await chrome.storage.local.get(pt))[pt];return s&&typeof s=="object"?s:{}}async function ns(t){await chrome.storage.local.set({[pt]:t})}function Ai(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 Ci(){const t=b(d=>d.componentId),s=b(d=>d.results),[a,n]=m.useState({}),[r,i]=m.useState(null);if(m.useEffect(()=>{Si().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 o=a[t]??{};function l(d,p,h){var g;const x={...a,[t]:{...o,[d]:{...o[d]??{componentId:t,workflowId:d,steps:{},completedAt:new Date().toISOString()},steps:{...((g=o[d])==null?void 0:g.steps)??{},[p]:h},completedAt:new Date().toISOString()}}};if(n(x),ns(x),h.status==="pass"){const j=oe.find(L=>L.id===d),S=j==null?void 0:j.steps.find(L=>L.id===p);S!=null&&S.autoDismissActivity&&wi(S.autoDismissActivity,s,p)}}function c(d){if(typeof confirm=="function"&&!confirm("Clear all answers for this workflow?"))return;const p={...o};delete p[d];const h={...a,[t]:p};n(h),ns(h)}const u=oe.find(d=>d.id===r);if(u){const d=o[u.id];return e.jsx(Ii,{workflow:u,run:d,results:s,onAnswer:(p,h)=>l(u.id,p,h),onBack:()=>i(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."}),oe.map(d=>{const p=o[d.id],h=p?ka(p,d):null,x=p?h!=null&&h.failed&&h.failed>0?"failed":h!=null&&h.unanswered&&h.unanswered>0?"in-progress":"done":"unstarted",g={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:()=>i(d.id),className:`w-full text-left border rounded p-2 block transition-colors ${g}`,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:d.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:d.blurb}),p&&e.jsx("button",{type:"button",onClick:j=>{j.stopPropagation(),c(d.id)},className:"text-[11px] text-slate-500 hover:text-rose-600 mt-1",children:"Clear answers"})]},d.id)})]})}function Ii({workflow:t,run:s,results:a,onAnswer:n,onBack:r}){const i=m.useMemo(()=>{const c={};for(const u of t.steps)c[u.id]=Ai(u,a);return c},[t,a]);function o(){for(const c of t.steps){const u=i[c.id];(u==null?void 0:u.kind)==="clean"&&!(s!=null&&s.steps[c.id])&&n(c.id,{status:"pass",notes:`Auto-marked via axe-clean evidence (${u.ruleId}, ${u.statesAudited} states).`})}}const l=t.steps.filter(c=>{var u;return((u=i[c.id])==null?void 0:u.kind)==="clean"&&!(s!=null&&s.steps[c.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}),l>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:[l," step",l===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:o,className:"text-[11px] px-2 py-1 bg-emerald-600 text-white rounded hover:bg-emerald-700 shrink-0",children:["Auto-mark ",l," →"]})]})]}),e.jsx("div",{className:"space-y-3",children:t.steps.map((c,u)=>{const d=s==null?void 0:s.steps[c.id];return e.jsxs("div",{className:`border rounded p-2 ${(d==null?void 0:d.status)==="pass"?"border-emerald-300 bg-emerald-50":(d==null?void 0:d.status)==="fail"?"border-rose-300 bg-rose-50":(d==null?void 0:d.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:[u+1,"/",t.steps.length]}),e.jsxs("div",{className:"flex items-center gap-1",children:[c.severity==="required"&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-rose-100 text-rose-700 rounded",children:"required"}),c.wcag&&e.jsxs("span",{className:"text-[10px] text-slate-500",children:["WCAG ",c.wcag]})]})]}),e.jsxs("p",{className:"text-xs text-slate-700 mb-1",children:[e.jsx("strong",{children:"Do:"})," ",c.prompt]}),e.jsxs("p",{className:"text-xs text-slate-700 mb-2",children:[e.jsx("strong",{children:"Verify:"})," ",c.question]}),c.relatedAxeRule&&e.jsxs("p",{className:"text-[11px] text-slate-500 mb-2",children:["Related axe rule: ",e.jsx("code",{className:"font-mono",children:c.relatedAxeRule})]}),(()=>{const p=i[c.id];return p?p.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:p.ruleId})," ran clean across ",p.statesAudited," state",p.statesAudited===1?"":"s",". Quick visual check, then mark pass."]}),!d&&e.jsx("button",{type:"button",onClick:()=>n(c.id,{status:"pass",notes:`Auto-marked via axe-clean evidence (${p.ruleId}, ${p.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:p.ruleId})," already found ",p.violationCount," violation",p.violationCount===1?"":"s"," in"," ",p.states.length," state",p.states.length===1?"":"s",". Verify and mark fail."]}),!d&&e.jsx("button",{type:"button",onClick:()=>n(c.id,{status:"fail",notes:`Auto-flagged via axe violations (${p.ruleId}, ${p.violationCount} hits in: ${p.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})(),c.visualizer&&e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsxs("button",{type:"button",onClick:()=>void as(c.visualizer,!0),className:"text-[11px] px-2 py-0.5 bg-brand-500 text-white rounded hover:bg-brand-600",children:["Show ",ki[c.visualizer]]}),e.jsx("button",{type:"button",onClick:()=>void as(c.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(Ue,{label:"Pass",active:(d==null?void 0:d.status)==="pass",tone:"emerald",onClick:()=>n(c.id,{status:"pass",notes:d==null?void 0:d.notes})}),e.jsx(Ue,{label:"Fail",active:(d==null?void 0:d.status)==="fail",tone:"rose",onClick:()=>n(c.id,{status:"fail",notes:d==null?void 0:d.notes})}),e.jsx(Ue,{label:"N/A",active:(d==null?void 0:d.status)==="not-applicable",tone:"slate",onClick:()=>n(c.id,{status:"not-applicable",notes:d==null?void 0:d.notes})}),e.jsx(Ue,{label:"Skip",active:(d==null?void 0:d.status)==="skip",tone:"slate",onClick:()=>n(c.id,{status:"skip",notes:d==null?void 0:d.notes})})]}),d&&e.jsx("textarea",{placeholder:"Notes (optional)",value:d.notes??"",onChange:p=>n(c.id,{status:d.status,notes:p.target.value}),rows:2,className:"w-full mt-2 text-[11px] border border-slate-200 rounded p-1.5"})]},c.id)})})]})}const Ei={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 Ue({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?Ei[a]:"bg-white text-slate-700 border-slate-300 hover:bg-slate-50"}`,children:t})}const Pe="savedFlows";async function Ri(){const t=await chrome.storage.local.get(Pe);return Array.isArray(t[Pe])?t[Pe]:[]}async function rs(t){await chrome.storage.local.set({[Pe]:t})}function Ti(){const[t,s]=m.useState([]),[a,n]=m.useState(!1),[r,i]=m.useState(null);m.useEffect(()=>{Ri().then(s)},[]);async function o(){const d=await ae();if(!d){i("No audit-target tab found.");return}try{await de(d,{type:"FLOW_RECORD_START_REQUEST"}),n(!0),i("Recording. Switch to the page and perform actions, then come back and Stop.")}catch{i("Failed to start recording.")}}async function l(){const d=await ae();if(d)try{const p=await ge(d,{type:"FLOW_RECORD_STOP_REQUEST"});if(n(!1),p.steps.length===0){i("Recording stopped — no steps captured.");return}const h=typeof prompt=="function"?prompt(`Captured ${p.steps.length} steps. Name this flow:`,"")??"":`Flow ${new Date().toLocaleTimeString()}`;if(!h.trim()){i("Save canceled.");return}const x={id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,name:h.trim(),steps:p.steps,savedAt:new Date().toISOString()},g=[x,...t];s(g),await rs(g),i(`Saved "${x.name}" with ${x.steps.length} steps.`)}catch(p){i(`Stop failed: ${p instanceof Error?p.message:String(p)}`)}}async function c(d){const p=await ae();if(p){i(`Replaying "${d.name}"…`);try{const h=await ge(p,{type:"FLOW_PLAY_REQUEST",steps:d.steps});i(`Replayed ${h.played} step${h.played===1?"":"s"}`+(h.errored?`, ${h.errored} errored (selector not found)`:"")+".")}catch(h){i(`Replay failed: ${h instanceof Error?h.message:String(h)}`)}}}async function u(d){if(typeof confirm=="function"&&!confirm("Delete this flow?"))return;const p=t.filter(h=>h.id!==d);s(p),await rs(p)}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:l,className:"text-xs px-3 py-1 bg-slate-700 text-white rounded hover:bg-slate-800",children:"■ Stop & save"}):e.jsx("button",{onClick:o,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(d=>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:d.name}),e.jsxs("div",{className:"text-[11px] text-slate-500 mt-0.5",children:[d.steps.length," step",d.steps.length===1?"":"s"," ·"," ",new Date(d.savedAt).toLocaleDateString()]})]}),e.jsxs("div",{className:"flex gap-1 shrink-0",children:[e.jsx("button",{onClick:()=>c(d),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:()=>u(d.id),className:"text-[11px] text-slate-500 hover:text-rose-600 px-1",title:"Delete flow",children:"✕"})]})]},d.id))})]})}function $i(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 i=n.slice(0,r),o=n.slice(r+1);return i==="story"?{primary:o.split("--").map(c=>c.split("-").map(Li).join(" ")).join(" / "),secondary:"storybook"}:{primary:o,secondary:a||i}}function Li(t){return t.length===0?t:t[0].toUpperCase()+t.slice(1)}function Ui(){const t=b(l=>l.baselineList),s=b(l=>l.tier),a=Ss[s].maxBaselines,n=t.length>=a&&Number.isFinite(a),[r,i]=m.useState(!1);if(m.useEffect(()=>{We().finally(()=>i(!0))},[]),!r)return e.jsx("div",{className:"p-3 space-y-2","aria-label":"Loading scorecard",children:[0,1,2].map(l=>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"})]},l))});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 o(l){await re({type:"BASELINE_DELETE",componentId:l}),await We()}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(l=>{const c=$i(l.componentId),u=l.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:l.componentId,children:c.primary}),c.secondary&&e.jsx("div",{className:"text-[11px] text-slate-500 truncate",title:c.secondary,children:c.secondary}),e.jsxs("div",{className:"text-xs text-slate-500 mt-0.5",children:[l.violationCount," ",l.violationCount===1?"violation":"violations"," ·"," ",new Date(l.lastUpdated).toLocaleDateString()]}),u&&e.jsxs("div",{className:"flex flex-wrap gap-1 mt-1.5",children:[l.seenOnUrlsCount&&l.seenOnUrlsCount>1&&e.jsxs(fe,{tone:"indigo",title:"This component pattern has been audited on multiple URLs",children:["seen on ",l.seenOnUrlsCount," pages"]}),u.criticalCount>0&&e.jsxs(fe,{tone:"rose",title:`${u.criticalCount} critical violations`,children:[u.criticalCount," critical"]}),u.seriousCount>0&&e.jsxs(fe,{tone:"orange",title:`${u.seriousCount} serious violations`,children:[u.seriousCount," serious"]}),u.focusResetCount>0&&e.jsxs(fe,{tone:"rose",title:`${u.focusResetCount} focus resets observed`,children:[u.focusResetCount," focus reset",u.focusResetCount===1?"":"s"]}),u.targetSizeFailCount>0&&e.jsxs(fe,{tone:"amber",title:"Targets smaller than WCAG 2.5.8 minimum",children:[u.targetSizeFailCount," small targets"]}),u.hoverContrastFail&&e.jsx(fe,{tone:"amber",title:"Contrast failure on :hover state",children:"hover-contrast"}),u.announcementCount>0&&e.jsxs(fe,{tone:"indigo",title:"aria-live announcements observed",children:[u.announcementCount," announce"]})]})]}),e.jsx("button",{onClick:()=>o(l.componentId),className:"text-xs text-slate-500 hover:text-red-600 shrink-0",title:"Reset baseline",children:"Reset"})]},l.componentId)})]})}const _i={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 fe({tone:t,title:s,children:a}){return e.jsx("span",{title:s,className:`text-[10px] px-1.5 py-0.5 rounded ${_i[t]}`,children:a})}const Di={low:"bg-emerald-50 border-emerald-200",moderate:"bg-yellow-50 border-yellow-200",high:"bg-orange-50 border-orange-200",critical:"bg-rose-50 border-rose-300"},Oi={low:"text-emerald-800",moderate:"text-yellow-800",high:"text-orange-800",critical:"text-rose-800"},Mi={critical:"bg-rose-600 text-white",serious:"bg-orange-500 text-white",moderate:"bg-yellow-500 text-slate-900",minor:"bg-blue-500 text-white"};function Ks({onBack:t}){const s=b(p=>p.siteCrawlStatus),a=b(p=>p.siteCrawlProgress),n=b(p=>p.siteCrawlReport),r=b(p=>p.siteCrawlError),[i,o]=m.useState(""),[l,c]=m.useState(25);i===""&&chrome.tabs.query({active:!0,currentWindow:!0}).then(p=>{var x;const h=(x=p[0])==null?void 0:x.url;h&&/^https?:\/\//.test(h)&&i===""&&o(h)});function u(){i&&(l>=5&&!window.confirm(`Each of the ${l} crawled pages runs your full single-page audit pipeline (same matrix + analyzers + AI walkthroughs you've configured). If your single-page audits take ~5 minutes, expect this crawl to take roughly ${l*5} minutes. Proceed?`)||(b.getState().setSiteCrawlStatus("running"),b.getState().setSiteCrawlReport(null),b.getState().setSiteCrawlError(null),me({type:"START_SITE_CRAWL",startUrl:i,maxPages:l})))}function d(){re({type:"CANCEL_SITE_CRAWL"})}return e.jsxs("div",{className:"p-4 space-y-3",children:[t&&e.jsx("button",{type:"button",onClick:t,className:"text-xs text-brand-600 hover:underline",children:"← Back to single-page scan"}),e.jsx("h2",{className:"text-sm font-semibold",children:"Audit my whole site"}),e.jsx("p",{className:"text-xs text-slate-600 leading-snug",children:"We'll start at the URL below and follow internal links to audit each page. Same-origin only — we won't crawl off-site."}),s!=="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"crawl-start-url",className:"block text-[11px] text-slate-500 mb-1",children:"Starting URL"}),e.jsx("input",{id:"crawl-start-url",type:"url",value:i,onChange:p=>o(p.target.value),placeholder:"https://yoursite.com",className:"w-full text-xs border border-slate-300 rounded px-2 py-1.5 font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"crawl-max-pages",className:"block text-[11px] text-slate-500 mb-1",children:"Maximum pages (cap)"}),e.jsx("input",{id:"crawl-max-pages",type:"number",min:1,max:200,value:l,onChange:p=>c(Math.min(200,Math.max(1,parseInt(p.target.value,10)||25))),className:"w-full text-xs border border-slate-300 rounded px-2 py-1.5"}),e.jsx("p",{className:"text-[10px] text-slate-500 mt-1",children:"Higher = more thorough but slower. 25 is a good default. Each page runs your full single-page audit pipeline (matrix + analyzers + AI)."})]}),e.jsx("button",{type:"button",onClick:u,disabled:!i,className:"w-full text-sm px-4 py-2.5 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50 font-medium",children:"Start whole-site audit"})]}),s==="running"&&a&&e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium",children:"Auditing your site…"}),e.jsxs("div",{className:"bg-slate-100 border border-slate-200 rounded p-2.5 space-y-2",children:[e.jsx("p",{className:"text-xs font-mono break-all",children:a.url}),e.jsx("div",{className:"h-1.5 bg-slate-200 rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full bg-brand-500 transition-all",style:{width:`${a.current/Math.max(1,a.total)*100}%`},role:"progressbar","aria-valuenow":a.current,"aria-valuemin":0,"aria-valuemax":a.total,"aria-label":`Page ${a.current} of ${a.total}`})}),e.jsxs("p",{className:"text-[11px] text-slate-600",children:["Page ",a.current," of ",a.total,a.lastViolations!==void 0&&` · last had ${a.lastViolations} issue${a.lastViolations===1?"":"s"}`]})]}),e.jsx("button",{type:"button",onClick:d,className:"w-full text-xs px-3 py-1.5 border border-slate-300 rounded hover:bg-slate-50",children:"Cancel"})]}),s==="complete"&&n&&e.jsx(Fi,{report:n}),s==="failed"&&r&&e.jsxs("div",{className:"border border-rose-300 bg-rose-50 rounded p-3 text-xs text-rose-800",children:[e.jsx("strong",{children:"Audit failed:"})," ",r]})]})}function Fi({report:t}){function s(){vt(async()=>{const{renderSiteReportHtml:i}=await import("./site-report-renderer-ByK3NGUh.js");return{renderSiteReportHtml:i}},__vite__mapDeps([3,4,1,2,5])).then(({renderSiteReportHtml:i})=>{const o=i(t),l=new Blob([o],{type:"text/html"}),c=URL.createObjectURL(l);window.open(c,"_blank","noopener,noreferrer"),setTimeout(()=>URL.revokeObjectURL(c),6e4)})}const[a,n]=m.useState(!1);async function r(){n(!0);try{const i=await chrome.runtime.sendMessage({type:"EXPORT_REQUEST",format:"ai-prompt-site-crawl",results:[]}),o=(i==null?void 0:i.content)??"";if(!o){window.alert("No crawl results available to export.");return}try{await navigator.clipboard.writeText(o)}catch{}const l=new Blob([o],{type:"text/markdown;charset=utf-8"}),c=URL.createObjectURL(l);window.open(c,"_blank","noopener,noreferrer"),setTimeout(()=>URL.revokeObjectURL(c),6e4)}finally{n(!1)}}return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:`border rounded-lg p-4 ${Di[t.siteRisk]}`,children:[e.jsx("p",{className:`text-base font-semibold ${Oi[t.siteRisk]}`,children:Sa[t.siteRisk]}),e.jsxs("p",{className:"text-xs mt-1",children:[e.jsx("strong",{children:t.pagesAudited})," page",t.pagesAudited===1?"":"s"," audited ·"," ",e.jsx("strong",{children:t.totalUniqueViolations})," unique issue",t.totalUniqueViolations===1?"":"s"," site-wide",t.pagesFailed>0&&` · ${t.pagesFailed} failed`]})]}),e.jsx("button",{type:"button",onClick:s,className:"w-full text-sm px-4 py-2.5 bg-brand-500 text-white rounded hover:bg-brand-600 font-medium",children:"📊 Open full site report"}),e.jsx("button",{type:"button",onClick:r,disabled:a,className:"w-full text-sm px-4 py-2.5 border border-brand-500 text-brand-700 rounded hover:bg-brand-50 disabled:opacity-50 font-medium",title:"Generate an AI-ready markdown doc covering EVERY crawled page's violations + fix recipes (not just the current page).",children:a?"Building…":"🤖 Export AI fix prompt (all crawled pages)"}),e.jsxs("p",{className:"text-[11px] text-slate-600 leading-snug border-l-2 border-brand-300 pl-2.5 bg-brand-50 py-2 rounded-r",children:[e.jsx("strong",{children:"Two ways to use this report."}),' The crawl above is for triage + bulk AI hand-off — knock out the big stuff across the whole site in one shot. For granular control on any single page (acknowledge individual findings, run guided manual checks, preview fixes on the live page, run interactive walkthroughs), click that page in the "Pages, worst first" list below.']}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 mb-2",children:"Top issues across the site"}),e.jsx("ul",{className:"space-y-2",children:t.topViolations.slice(0,8).map(i=>{const o=Aa(i.ruleId);return e.jsx("li",{className:"border border-slate-200 rounded p-2.5 bg-white text-xs",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:`text-[10px] px-1.5 py-0.5 rounded font-semibold uppercase tracking-wide shrink-0 ${Mi[i.impact]}`,children:i.impact}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-medium",children:o.whatsWrong}),e.jsxs("p",{className:"text-[11px] text-slate-500 mt-1",children:["Found on ",e.jsx("strong",{children:i.urlsAffected})," page",i.urlsAffected===1?"":"s"," · ",i.totalOccurrences," total spot",i.totalOccurrences===1?"":"s"]})]})]})},i.ruleId)})})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 mb-2",children:"Pages, worst first"}),e.jsxs("p",{className:"text-[10px] text-slate-500 leading-snug mb-2",children:["The crawl is for triage + bulk AI fix-prompt generation. ",e.jsx("strong",{children:"Click any page"})," to open it in the active tab and load its crawl results into the single-page view — there you get per-finding acknowledgements, visualizers, guided manual checks, and fix-preview overlays."]}),e.jsx("ul",{className:"space-y-1 text-xs",children:t.pages.slice(0,15).map(i=>e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:()=>void Pi(i.url),className:"w-full flex items-center gap-2 text-left px-1.5 py-1 rounded hover:bg-slate-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-brand-500",title:"Open this page in the active tab and load its crawl results into the single-page view for granular fix work",children:[e.jsx("span",{className:`font-mono w-5 text-center font-semibold ${i.grade==="A"?"text-emerald-700":i.grade==="B"?"text-lime-700":i.grade==="C"?"text-yellow-700":i.grade==="D"?"text-orange-700":"text-rose-700"}`,children:i.grade}),e.jsx("span",{className:"font-mono text-[11px] text-slate-700 break-all flex-1",children:i.url}),e.jsx("span",{className:"text-[11px] text-slate-500 shrink-0",children:i.uniqueViolations}),e.jsx("span",{className:"text-[10px] text-brand-600 shrink-0","aria-hidden":"true",children:"→"})]})},i.url))})]})]})}async function Pi(t){try{const s=await Ca(),a=s==null?void 0:s.find(n=>n.url===t);try{const r=(await chrome.tabs.query({active:!0,currentWindow:!0}))[0];r!=null&&r.id?await chrome.tabs.update(r.id,{url:t,active:!0}):await chrome.tabs.create({url:t,active:!0})}catch{}if(a&&a.results.length>0&&a.componentId){b.getState().setResults(a.results,a.delta,a.componentId);try{await chrome.storage.local.set({"sidePanel:lastAudit":{results:a.results.map(({screenshotDataUrl:n,...r})=>r),delta:a.delta,componentId:a.componentId}})}catch{}}b.getState().setView("matrix")}catch(s){console.warn("[site-crawl-panel] openPageInSinglePageView failed",s)}}const st="onboardingDismissed",at=[{title:"Welcome",body:e.jsxs("div",{className:"space-y-2 text-xs text-slate-700",children:[e.jsx("p",{children:"The WCAG Component Auditor finds accessibility violations that other tools miss — by driving your component through every visual state your users actually encounter."}),e.jsx("p",{children:"Three steps. ~30 seconds."})]})},{title:"Step 1 — Pick an element",body:e.jsxs("div",{className:"space-y-2 text-xs text-slate-700",children:[e.jsxs("p",{children:["Click ",e.jsx("strong",{children:"Pick element"})," in the side panel, then click any element on the page. The auditor scopes its analysis to that component — not the whole page."]}),e.jsxs("p",{children:["(For full-page scans, switch the dropdown to ",e.jsx("strong",{children:"Full page"}),".)"]})]})},{title:"Step 2 — Watch the matrix run",body:e.jsxs("div",{className:"space-y-2 text-xs text-slate-700",children:[e.jsxs("p",{children:["When you click ",e.jsx("strong",{children:"Run audit"}),", the auditor drives your element through every combination of ",e.jsx("code",{children:":hover"}),", ",e.jsx("code",{children:":focus"}),", ",e.jsx("code",{children:":focus-visible"}),",",e.jsx("code",{children:":disabled"}),", dark mode, forced-colors, RTL, and breakpoint sizes — auditing at each."]}),e.jsxs("p",{children:["A yellow ",e.jsx("em",{children:'"is debugging this browser"'})," banner appears during runs. That's how we drive the states. It disappears when the audit finishes."]})]})},{title:"Step 3 — Find and replay",body:e.jsxs("div",{className:"space-y-2 text-xs text-slate-700",children:[e.jsxs("p",{children:["Click any violation to highlight it on the page. Click ",e.jsx("strong",{children:"Load state"})," to re-drive the page back to the exact state where the violation was found — see what the auditor saw."]}),e.jsxs("p",{children:["The ",e.jsx("strong",{children:"Delta"})," tab filters to NEW debt vs. your accepted baseline — file a GitHub issue for only what you introduced, not inherited mess."]})]})}];function Gi(){const[t,s]=m.useState(!1),[a,n]=m.useState(0);m.useEffect(()=>{chrome.storage.local.get(st).then(l=>{l[st]||s(!0)})},[]);async function r(){await chrome.storage.local.set({[st]:!0}),s(!1),n(0)}const i=a===at.length-1,o=at[a];return e.jsxs(ye,{open:t,onClose:r,title:o.title,children:[e.jsx("div",{children:o.body}),e.jsxs("div",{className:"flex items-center justify-between mt-4",children:[e.jsxs("span",{className:"text-[11px] text-slate-500",children:[a+1," / ",at.length]}),e.jsxs("div",{className:"flex gap-2",children:[a>0&&e.jsx("button",{onClick:()=>n(l=>l-1),className:"text-xs px-3 py-1 border border-slate-300 rounded text-slate-700 hover:bg-slate-50",children:"Back"}),i?e.jsx("button",{onClick:r,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600",children:"Got it"}):e.jsx("button",{onClick:()=>n(l=>l+1),className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600",children:"Next"})]})]})]})}function Vi(){const t=b(n=>n.status),s=b(n=>n.errorMessage),a=b(n=>n.setStatus);return t!=="failed"||!s?null:e.jsxs("div",{role:"alert",className:"px-3 py-2 bg-red-50 border-b border-red-200 text-xs text-red-800 flex items-center justify-between",children:[e.jsx("span",{children:s}),e.jsx("button",{onClick:()=>a("idle"),className:"text-red-600 hover:text-red-900 ml-2","aria-label":"Dismiss error",children:"×"})]})}function Wi(){const t=b(c=>c.aiFailure),s=b(c=>c.clearAiFailure),[a,n]=m.useState(!1);if(!t)return null;const r=t.severity==="total",i=r?"bg-orange-50 border-orange-300 text-orange-900":"bg-amber-50 border-amber-300 text-amber-900",o="⚠",l=r?"AI fixer didn't run on this audit":`AI fixer partially completed (${t.checksSucceeded}/${t.checksAttempted} checks ran)`;return e.jsx("div",{role:"alert",className:`px-3 py-2 border-b text-xs flex flex-col gap-1 ${i}`,children:e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"font-semibold",children:[e.jsx("span",{"aria-hidden":"true",children:o})," ",l]}),e.jsxs("div",{className:"mt-0.5",children:[t.reason,t.errorDetails.length>0&&e.jsxs(e.Fragment,{children:[" ",e.jsx("button",{onClick:()=>n(c=>!c),className:"underline hover:no-underline","aria-expanded":a,children:a?"Hide details":`Show ${t.errorDetails.length} error${t.errorDetails.length===1?"":"s"}`})]})]}),a&&t.errorDetails.length>0&&e.jsx("ul",{className:"mt-1 pl-4 list-disc font-mono text-[11px] leading-snug",children:t.errorDetails.map((c,u)=>e.jsx("li",{children:c},u))})]}),e.jsx("button",{onClick:s,className:"hover:opacity-70 leading-none","aria-label":"Dismiss AI failure notice",children:"×"})]})})}function is(){const[t,s]=m.useState(!1);return m.useEffect(()=>pe("AUDIT_FAILED_EVENT",a=>{a.error.code==="DEBUGGER_BUSY"&&(s(!0),b.getState().setStatus("idle"))}),[]),e.jsxs(ye,{open:t,onClose:()=>s(!1),title:"Close DevTools to continue",children:[e.jsxs("div",{className:"space-y-3 text-xs text-slate-700",children:[e.jsx("p",{children:"The audit can't run because Chrome DevTools is open on the target tab. We use the same debugging API DevTools uses, and only one consumer can be attached at a time."}),e.jsxs("p",{children:[e.jsx("strong",{children:"To continue:"})," close DevTools on the target tab, then start the audit again."]}),e.jsx("p",{className:"text-slate-500",children:"Why we need it: without the debugger API, we can't drive components through hover, focus, dark-mode, and other states screen readers care about."})]}),e.jsx("div",{className:"flex justify-end mt-4",children:e.jsx("button",{onClick:()=>s(!1),className:"text-xs px-3 py-1 bg-brand-500 text-white rounded",children:"Got it"})})]})}function Bi(){var i;const[t,s]=m.useState(null);if(m.useEffect(()=>{Ia().then(o=>{o&&o.state==="interrupted"&&s(o)})},[]),!t)return null;async function a(){t&&(await Ct(),b.getState().startNewScan(),t.mode==="storybook-all"?me({type:"START_AUDIT",mode:"storybook-all"}):t.scope&&me({type:"START_AUDIT",mode:"single-element",scope:t.scope}),s(null))}async function n(){await Ct(),s(null)}const r=t.mode==="storybook-all"?`Story ${((i=t.completedStories)==null?void 0:i.length)??0}/${t.totalStories??"?"}`:"Single-element audit";return e.jsxs("div",{role:"status",className:"px-3 py-2 bg-amber-50 border-b border-amber-200 text-xs text-amber-900 flex items-center justify-between gap-2",children:[e.jsxs("span",{children:["A previous audit was interrupted (",r,")."]}),e.jsxs("span",{className:"flex gap-1",children:[e.jsx("button",{onClick:a,className:"px-2 py-0.5 bg-brand-500 text-white rounded hover:bg-brand-600",children:"Resume"}),e.jsx("button",{onClick:n,className:"px-2 py-0.5 hover:bg-amber-100 rounded",children:"Discard"})]})]})}const nt="storybook:hintDismissed";function Hi(){const[t,s]=m.useState(!1),[a,n]=m.useState();m.useEffect(()=>{(async()=>{var l;if((await chrome.storage.local.get(nt))[nt])return;const o=await ae();if(o)try{const u=(await chrome.scripting.executeScript({target:{tabId:o,allFrames:!0},world:"MAIN",func:()=>{var p;const d=window;return{detected:typeof d.__STORYBOOK_PREVIEW__=="object",version:(p=d.__STORYBOOK_PREVIEW__)==null?void 0:p.version}}})).find(d=>{var p;return(p=d.result)==null?void 0:p.detected});u&&(n((l=u.result)==null?void 0:l.version),s(!0))}catch{}})()},[]);async function r(){await chrome.storage.local.set({[nt]:!0}),s(!1)}return t?e.jsxs("div",{className:"px-3 py-2 bg-blue-50 border-b border-blue-200 text-xs text-blue-900 flex items-center justify-between gap-2",children:[e.jsxs("span",{children:["Storybook ",a??""," detected. Switch to ",e.jsx("strong",{children:"All stories"})," to audit every story in one pass."]}),e.jsx("button",{onClick:r,className:"text-blue-700 hover:text-blue-900 ml-2","aria-label":"Dismiss hint",children:"×"})]}):null}function zi(){var i;const t=b(o=>o.results),s=b(o=>o.baselineList),a=b(o=>o.status),n=(i=t[0])==null?void 0:i.startedAt,r=s.length;return e.jsxs("footer",{className:"border-t border-slate-200 bg-white text-[10px] text-slate-500",children:[e.jsxs("div",{className:"px-3 py-1.5 flex items-center justify-between",children:[e.jsx("span",{children:r>0?`${r} ${r===1?"component":"components"} tracked`:"no baselines yet"}),e.jsx("span",{children:a==="running"?"auditing…":n?`last audit ${Ki(n)}`:"idle"})]}),e.jsxs("div",{className:"border-t border-slate-100 bg-slate-50 px-3 py-1 text-center",children:["Powered by"," ",e.jsx("a",{href:"https://locustware.com",target:"_blank",rel:"noopener noreferrer",className:"font-medium text-slate-600 hover:text-brand-600 hover:underline focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-brand-500",children:"Locustware"})]})]})}function Ki(t,s=new Date){const a=new Date(t),n=s.getTime()-a.getTime(),r=Math.round(n/1e3);if(r<60)return"just now";const i=Math.round(r/60);if(i<60)return`${i}m ago`;const o=Math.round(i/60);if(o<24)return`${o}h ago`;const l=Math.round(o/24);return l<7?`${l}d ago`:a.toLocaleDateString()}function qi(){const t=b(l=>l.results),s=b(l=>l.componentId),[a,n]=m.useState([]);if(m.useEffect(()=>{if(!s){n([]);return}let l=!1;return chrome.storage.local.get("igtRuns").then(c=>{if(l)return;const d=((c==null?void 0:c.igtRuns)??{})[s]??{};n(Object.values(d))}),()=>{l=!0}},[s]),t.length===0)return null;const r=t.flatMap(l=>l.violations),i=Ea(r,a.length>0?{runs:a,workflows:oe}:void 0),o=i.manual!==void 0&&i.manual.workflowsCompleted===i.manual.workflowsTotal;return e.jsxs("div",{className:"border-t border-amber-200 bg-amber-50 px-3 py-2 text-[11px] text-amber-900 leading-snug",children:[e.jsx("strong",{children:"Not a compliance certificate."})," ",o?"All Guided Tests workflows are complete and folded into this grade.":"Automation covers ~50% of WCAG. The Guided Tests workflows + the manual checklist in the AI fix prompt cover the rest. The grade above only reflects what automation can verify."]})}function Qi(){const t=b(a=>a.setUserMode);function s(a){t(a),re({type:"SETTINGS_SET",key:"userMode",value:a})}return e.jsx("div",{className:"flex flex-col h-screen bg-slate-50 text-slate-900 text-sm",children:e.jsxs("main",{className:"flex-1 overflow-y-auto p-6 space-y-5",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-xl font-semibold mb-1",children:"Welcome."}),e.jsx("p",{className:"text-sm text-slate-600",children:"One quick question — pick the mode that fits your role. You can switch later from Settings."})]}),e.jsx("button",{type:"button",onClick:()=>s("owner"),className:"w-full text-left border border-slate-300 rounded-lg p-4 bg-white hover:border-brand-500 hover:bg-brand-50 transition-colors",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"text-2xl","aria-hidden":"true",children:"🏪"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("h2",{className:"font-semibold text-sm mb-1",children:"I'm a site owner"}),e.jsx("p",{className:"text-[12px] text-slate-600 leading-snug",children:"I bought or built this site (maybe with a template) and want to make sure it's accessible — and not at risk of an ADA lawsuit."}),e.jsxs("ul",{className:"text-[11px] text-slate-500 mt-2 space-y-0.5",children:[e.jsx("li",{children:"· Plain-language audit results"}),e.jsx("li",{children:"· One-click whole-site scan"}),e.jsx("li",{children:'· "Send this to my web developer" report'}),e.jsx("li",{children:"· No code or technical knowledge required"})]})]})]})}),e.jsx("button",{type:"button",onClick:()=>s("dev"),className:"w-full text-left border border-slate-300 rounded-lg p-4 bg-white hover:border-brand-500 hover:bg-brand-50 transition-colors",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"text-2xl","aria-hidden":"true",children:"⚙️"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("h2",{className:"font-semibold text-sm mb-1",children:"I'm a developer or agency"}),e.jsx("p",{className:"text-[12px] text-slate-600 leading-snug",children:"I build or maintain web apps. I want full audit features, exports, AI-driven fix workflows, baselines, and defense-grade legal documentation."}),e.jsxs("ul",{className:"text-[11px] text-slate-500 mt-2 space-y-0.5",children:[e.jsx("li",{children:"· Multi-state matrix audits (108 state combinations)"}),e.jsx("li",{children:"· AI fix prompt, SARIF/JUnit/VPAT exports, baselines + delta"}),e.jsx("li",{children:"· Guided Tests workflows (12 manual checks)"}),e.jsx("li",{children:"· Defense + evidence bundles, site-wide CLI crawler"})]})]})]})}),e.jsxs("p",{className:"text-[11px] text-slate-500 text-center pt-2",children:["You can switch modes anytime from ",e.jsx("strong",{children:"Settings → User mode"}),"."]})]})})}const Yi=["image-alt","input-image-alt","role-img-alt","svg-img-alt","area-alt","label","label-title-only","form-field-multiple-labels","select-name","button-name","link-name","empty-heading","color-contrast","document-title","html-has-lang","html-lang-valid","page-has-heading-one","region","landmark-one-main","bypass","aria-required-attr","aria-roles","aria-valid-attr","aria-valid-attr-value","aria-allowed-attr","aria-hidden-body","aria-hidden-focus","table-fake-caption","td-headers-attr","th-has-data-cells","scope-attr-valid","frame-title","frame-title-unique","list","listitem","definition-list","dlitem"],Ji={low:"Low risk. Your site is clean on every check that automated lawsuit-targeting tools run. They look for easy targets — you aren't one.",moderate:"Moderate risk. A demand-letter scanner would flag at least one issue. Fix these to drop off the easy-target list.",high:"High risk. Multiple findings here are the exact patterns demand-letter mills target. Fix these before the next scanner sweep.",critical:"Critical risk. Your site has many of the high-frequency patterns ADA-targeting firms scan for. You're a likely target. Fix the items below."};function Xi(t){const s=new Set(Yi),a=new Map;for(const c of t)s.has(c.ruleId)&&a.set(c.ruleId,(a.get(c.ruleId)??0)+1);const n=Array.from(a.entries()).map(([c,u])=>({ruleId:c,instanceCount:u})).sort((c,u)=>u.instanceCount-c.instanceCount),r=n.length,i=Array.from(a.values()).reduce((c,u)=>c+u,0);let o;return r===0?o="low":r===1?o="moderate":r<=3?o="high":o="critical",{tier:o,letter:o==="low"?"A":o==="moderate"?"C":o==="high"?"D":"F",flaggedRuleCount:r,flaggedInstanceCount:i,flaggedRules:n,headline:Ji[o]}}const qs={id:"desktop",label:"Desktop",width:1280,height:800,deviceScaleFactor:1,mobile:!1},Zi={pseudoStates:["default"],ariaVariations:[],themes:["light"],directions:["ltr"],breakpoints:["desktop"],breakpointPresets:[qs]},eo={pseudoStates:["default","hover","focus"],ariaVariations:[],themes:["light","dark"],directions:["ltr","rtl"],breakpoints:["desktop"],breakpointPresets:[qs]};function jt(t){return t==="thorough"?eo:Zi}function os(t){const s=jt(t);return s.pseudoStates.length*s.themes.length*s.directions.length*s.breakpoints.length}const Ge="wcagcheckr";function J(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Ie(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 to(t){return Array.from(new Set(t.map(s=>s.axeVersion).filter(Boolean))).sort()}function so(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 ao(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 no(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 ro(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 (${J(t.receipt.tsaName)}) — anchored ${J(Ie(t.receipt.anchoredAt))}</td></tr>
|
|
18
|
+
Future audits will treat every detected violation as new (no delta filtering). This cannot be undone.`))return;await re({type:"BASELINE_DELETE",componentId:s});const z=a.flatMap(D=>D.violations),Y=a.flatMap(D=>D.announcements??[]),$=a.flatMap(D=>D.focusEvents??[]),K=await te({type:"BASELINE_COMPARE",componentId:s,currentViolations:z,announcements:Y,focusEvents:$});b.getState().setDelta(K.delta);const P=await te({type:"BASELINE_LIST"});b.getState().setBaselineList(P.items),ce.polite(`Baseline cleared for ${s}.`)}async function ne(y,z=!1){if(a.length===0)return;if(y==="ai-prompt"){const{copyAiFixerPrompt:W}=await vt(async()=>{const{copyAiFixerPrompt:ie}=await import("./copy-ai-fixer-prompt-Du-1hhUB.js");return{copyAiFixerPrompt:ie}},__vite__mapDeps([0,1,2]));await W({results:a,componentId:s,delta:z?void 0:t,siteCrawlReport:i});return}let Y;if((y==="defense-bundle"||y==="evidence-bundle"||y==="deposition-packet")&&s){const W=await chrome.storage.local.get("igtRuns"),V=((W==null?void 0:W.igtRuns)??{})[s]??{};Y=Object.values(V)}const P=await te({type:"EXPORT_REQUEST",format:y,results:a,delta:z?void 0:t??void 0,manualRuns:Y,dismissedKeys:void 0,incompleteResolutions:void 0});if(y==="defense-bundle"||y==="evidence-bundle"||y==="deposition-packet"){const W=fs(y,s);await bs()?ft(P.content,W):k({open:!0,format:y,content:P.content,filename:W});return}if(y==="html-print"||y==="vpat"||y==="methodology-doc"||y==="conformance-crosswalk"||y==="executive-report"){gt(P.content);return}const D=y==="json"?"application/json":y==="sarif"?"application/sarif+json":y==="ticket-bundle"?"text/markdown":"application/xml",H=y==="junit"?"xml":y==="ticket-bundle"?"md":y,R=new Blob([P.content],{type:D}),G=URL.createObjectURL(R),O=document.createElement("a");O.href=G,O.download=`audit-${(s==null?void 0:s.replace(/[^a-z0-9]/gi,"-"))??"export"}.${H}`,O.click(),URL.revokeObjectURL(G)}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:Q,disabled:!I,title:I?void 0:`Free tier limits you to ${q} 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"}),se&&e.jsx("button",{onClick:le,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:()=>j(!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 M(),"aria-pressed":U,title:"Overlay numbered, color-coded badges on every violating element in the page. Click a badge to scroll its row into view here.",className:U?"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:U?"Hide badges":"Show badges 🎯"}),U&&_&&e.jsxs("span",{className:"text-[11px] text-slate-500",children:[_.rendered," of ",_.requested," rendered",_.clustered>0?` · ${_.clustered} clusters`:""]}),e.jsx("button",{type:"button",onClick:()=>void Z(),"aria-pressed":A,title:"Overlay a density heatmap on the page. Red blobs at each violation rect; overlapping blobs glow brighter to show problem clusters.",className:A?"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:A?"Hide heatmap":"Show heatmap 🔥"}),e.jsx(ni,{disabled:!F,onExport:ne,onAccessibilityStatement:()=>N(!0),hasBaselineDelta:!!(t!=null&&t.baselineSnapshotMeta)}),!I&&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 y=tt(t.new),z=tt(t.persistent),Y=tt(t.fixed),$=[...y.review,...z.review];return e.jsxs(e.Fragment,{children:[e.jsx(Ne,{title:"New",violations:y.findings,count:y.findings.length,accent:"red",actions:[...o&&y.findings.length>0?[{label:"File GitHub issue",onClick:()=>ei(o,s,y.findings)}]:[],...c&&y.findings.length>0?[{label:"File Jira issue",onClick:()=>ti(c,s,y.findings)}]:[],...d&&y.findings.length>0?[{label:"File Azure DevOps work item",onClick:()=>si(d,s,y.findings)}]:[],...h&&y.findings.length>0?[{label:"File GitLab issue",onClick:()=>ai(h,s,y.findings)}]:[]]}),e.jsx(Ne,{title:"Persistent",violations:z.findings,count:z.findings.length,accent:"slate"}),e.jsx(Ne,{title:"Fixed",violations:Y.findings,count:t.fixedCount,accent:"green"}),$.length>0&&e.jsx(Ne,{title:"Needs review (does not affect grade)",violations:$,count:$.length,accent:"amber"}),t.acknowledged&&t.acknowledged.length>0&&e.jsx(Ne,{title:"Acknowledged",violations:t.acknowledged,count:t.acknowledged.length,accent:"slate",renderAsAcknowledged:!0})]})})(),f&&e.jsx(Ws,{open:f.open,onClose:()=>k(null),format:f.format,content:f.content,filename:f.filename}),e.jsx(Xr,{open:E,onClose:()=>N(!1),results:a}),g&&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"})]})]}),w&&e.jsxs("div",{className:"text-[11px] bg-emerald-50 border border-emerald-200 rounded p-2 text-emerald-900",children:["✓ Cleared ",w.chromeStorageKeysCleared," chrome.storage key",w.chromeStorageKeysCleared===1?"":"s"," + ",w.indexedDbsCleared.length," database",w.indexedDbsCleared.length===1?"":"s",".",w.errors.length>0&&e.jsxs("div",{className:"mt-1 text-rose-800",children:["Partial: ",w.errors.join("; ")]})]}),e.jsx("div",{className:"flex justify-end gap-2 pt-1 border-t border-slate-200",children:w?e.jsx("button",{type:"button",onClick:()=>{j(!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:()=>j(!1),disabled:S,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()=>{L(!0);try{const y=await qr();C(y),await Qe(),ce.polite("Audit data reset. Ready for a fresh scan.")}catch(y){C({chromeStorageKeysCleared:0,indexedDbsCleared:[],errors:[y instanceof Error?y.message:String(y)]})}finally{L(!1)}},disabled:S,className:"text-xs px-3 py-1.5 bg-rose-600 text-white rounded hover:bg-rose-700 disabled:opacity-50",children:S?"Resetting…":"Reset everything"})]})})]})})]})}const Zr={red:"text-red-700",slate:"text-slate-700",green:"text-green-700",amber:"text-amber-700"};function tt(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 Ne({title:t,violations:s,count:a,accent:n,actions:r,renderAsAcknowledged:i}){const[o,l]=m.useState(!i);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 ${Zr[n]} ${i?"cursor-pointer select-none":""}`,onClick:i?()=>l(c=>!c):void 0,children:[i&&e.jsx("span",{className:"mr-1 text-slate-400",children:o?"▾":"▸"}),t," (",a,")"]}),r&&r.length>0&&e.jsx("div",{className:"flex gap-1 flex-wrap",children:r.map(c=>e.jsx("button",{type:"button",onClick:c.onClick,className:"text-[11px] px-2 py-0.5 border border-slate-300 rounded text-slate-700 hover:bg-slate-50",children:c.label},c.label))})]}),o?s.length===0?e.jsx("p",{className:"text-xs text-slate-500 italic",children:"none"}):e.jsx("div",{className:"space-y-1.5",children:i?s.map((c,u)=>e.jsx(Ee,{violation:c,alreadyAcknowledged:!0},u)):Gr(s).map(c=>e.jsx(Pr,{ruleId:c.ruleId,violations:c.violations},c.ruleId))}):null]})}function ei(t,s,a){if(a.length===0)return;const{url:n}=Wr(t,s,a);window.open(n,"_blank","noopener,noreferrer")}function ti(t,s,a){if(a.length===0)return;const{url:n}=Br(t,s,a);window.open(n,"_blank","noopener,noreferrer")}function si(t,s,a){if(a.length===0)return;const{url:n}=Hr(t,s,a);window.open(n,"_blank","noopener,noreferrer")}function ai(t,s,a){if(a.length===0)return;const{url:n}=zr(t,s,a);window.open(n,"_blank","noopener,noreferrer")}function ni({disabled:t,onExport:s,onAccessibilityStatement:a,hasBaselineDelta:n}){const[r,i]=m.useState(!1),[o,l]=m.useState(!1);function c(u){i(!1),s(u,o)}return e.jsxs("div",{className:"relative inline-block",children:[e.jsx("button",{type:"button",disabled:t,onClick:()=>i(u=>!u),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:()=>i(!1)}),e.jsxs("div",{className:"absolute left-0 top-full mt-1 z-50 min-w-[200px] 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:o,onChange:u=>l(u.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(ue,{onClick:()=>c("json"),title:"Native format with full audit detail.",children:"JSON"}),e.jsx(ue,{onClick:()=>c("sarif"),title:"SARIF for GitHub code-scanning + most CI tools.",children:"SARIF"}),e.jsx(ue,{onClick:()=>c("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(ue,{onClick:()=>c("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(ue,{onClick:()=>c("vpat"),title:"VPAT 2.5 conformance report — opens in a new tab for review and printing.",children:"VPAT 2.5"}),e.jsx(ue,{onClick:()=>c("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(ue,{onClick:()=>c("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(ue,{onClick:()=>c("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(ue,{onClick:()=>c("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(ue,{onClick:()=>c("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(ue,{onClick:()=>c("ai-prompt"),title:"Generate a structured prompt to paste into Claude / Cursor / Copilot. Auto-copies to clipboard.",children:"AI fix prompt ✨"}),e.jsx(ue,{onClick:()=>c("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(ue,{onClick:()=>c("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(ue,{onClick:()=>{i(!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 ue({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 ri="2024-07-25",ii="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.",Hs=[{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(Hs.flatMap(t=>t.wcag2Criteria));function oi(t,s){return Hs.map(a=>{const n=a.wcag2Criteria.filter(o=>t.has(o)),r=a.wcag2Criteria.some(o=>s.has(o));let i;return n.length>0?i="has-violations":r?i="clean":i="not-evaluated",{outcome:a,violatedCriteria:n,status:i}})}const li={perceive:"Perceive",operate:"Operate",understand:"Understand",robust:"Robust"};function zs(){const t=b(c=>c.results);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 s=new Set,a=new Set;for(const c of t){for(const d of c.violations)s.add(d.wcagCriterion);const u=c.axeRulesEvaluated;if(u){for(const d of u.passed)a.add(d.wcagCriterion);for(const d of u.inapplicable)a.add(d.wcagCriterion);for(const d of u.incomplete)a.add(d.wcagCriterion)}for(const d of c.violations)a.add(d.wcagCriterion)}const n=oi(s,a),r=new Map;for(const c of n){const u=r.get(c.outcome.category)??[];u.push(c),r.set(c.outcome.category,u)}const i=n.filter(c=>c.status==="clean").length,o=n.filter(c=>c.status==="has-violations").length,l=n.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:ri}),"."," ",ii]})]}),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:[o," with violations"]}),e.jsxs("span",{className:"px-2 py-1 rounded bg-slate-100 text-slate-700",children:[l," not evaluated"]})]}),["perceive","operate","understand","robust"].map(c=>{const u=r.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:[li[c]," · ",u.length]}),e.jsx("ul",{className:"divide-y divide-slate-100",children:u.map(d=>e.jsxs("li",{className:"px-3 py-2",children:[e.jsxs("div",{className:"flex items-baseline gap-2 mb-1",children:[e.jsx(ci,{status:d.status}),e.jsx("strong",{className:"text-xs",children:d.outcome.title})]}),e.jsx("p",{className:"text-[11px] text-slate-600 leading-snug",children:d.outcome.description}),e.jsxs("p",{className:"text-[10px] text-slate-500 mt-1 font-mono",children:["WCAG 2: ",d.outcome.wcag2Criteria.join(", ")]}),d.violatedCriteria.length>0&&e.jsxs("p",{className:"text-[11px] text-rose-700 mt-1",children:["Violated: ",e.jsx("strong",{children:d.violatedCriteria.join(", ")})]})]},d.outcome.id))})]},c)})]})}function ci({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 di=[{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"}],ui={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 pi(){const t=b(d=>d.results),s=b(d=>d.componentId),a=b(d=>d.findingsLens),n=b(d=>d.setFindingsLens),r=b(d=>d.setView),i=b(d=>d.status),[o,l]=m.useState({});m.useEffect(()=>{if(!s)return;let d=!1;return(async()=>{const p=await Ke(s);if(d)return;const h={};for(const x of p)x.criterionId==="2.4.3"?h.focusOrder=x.verdict:x.criterionId==="2.1.2"?h.keyboardTrap=x.verdict:x.criterionId==="2.4.7"?h.focusVisible=x.verdict:x.criterionId==="1.3.2"?h.readingOrder=x.verdict:x.criterionId==="1.4.11"&&(h.nonTextContrast=x.verdict);l(h)})(),()=>{d=!0}},[s]);const[c,u]=m.useState([]);return m.useEffect(()=>{if(!s){u([]);return}let d=!1;return chrome.storage.local.get("igtRuns").then(p=>{if(d)return;const x=((p==null?void 0:p.igtRuns)??{})[s]??{};u(Object.values(x))}),()=>{d=!0}},[s]),t.length===0?e.jsxs("div",{className:"p-4",children:[e.jsx(es,{setView:r}),e.jsx("div",{className:"mt-6 text-center text-sm text-slate-600",children:e.jsx("p",{children:i==="running"?"Audit in progress. Findings appear here when the matrix completes.":i==="failed"||i==="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(es,{setView:r}),e.jsx(hi,{results:t,interactiveVerdicts:o,manualRuns:c}),e.jsx(mi,{lens:a,setLens:n}),e.jsx(xi,{lens:a,results:t,componentId:s,interactiveVerdicts:o})]})}function es({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 hi({results:t,interactiveVerdicts:s,manualRuns:a}){var d,p,h,x;const n=t.flatMap(g=>g.violations),r=ze(n),o=yt({violations:n,auditRan:!0,manualRuns:a,workflows:oe,heuristicCounts:{tabOrder:((p=(d=t[0])==null?void 0:d.tabOrderIssues)==null?void 0:p.length)??0,readingOrder:((x=(h=t[0])==null?void 0:h.readingOrderIssues)==null?void 0:x.length)??0},interactiveAuditVerdicts:s}).overallLetter,l=r.length,c=t.length,u=t.reduce((g,j)=>g+j.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 ${ui[o]}`,children:e.jsx("span",{className:"text-4xl font-display font-semibold leading-none tracking-tight",children:o})}),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:l===0?"No issues found by automation":`${l} issue${l===1?"":"s"} to fix`}),e.jsxs("p",{className:"text-[11px] text-slate-500 leading-snug mt-0.5",children:[c," state",c===1?"":"s"," tested · ",(u/1e3).toFixed(1),"s"]})]})]})})}function mi({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:di.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 xi({lens:t,results:s,componentId:a,interactiveVerdicts:n}){return t==="overview"?e.jsxs("div",{className:"space-y-3",children:[e.jsx(bi,{componentId:a}),e.jsx(Wn,{violations:s.flatMap(r=>r.violations),componentId:a,hideOverallHeader:!0}),e.jsx(vi,{})]}):t==="per-area"?e.jsx(Sr,{results:s,interactiveVerdicts:n}):t==="violations"?e.jsx(yi,{results:s}):t==="activity"?e.jsx("div",{className:"-mx-3",children:e.jsx(Vs,{})}):t==="delta"?e.jsx("div",{className:"-mx-3",children:e.jsx(Bs,{})}):t==="wcag3"?e.jsx("div",{className:"-mx-3",children:e.jsx(zs,{})}):null}const ts={critical:0,serious:1,moderate:2,minor:3};function ss(t){return`${qe(t.ruleId,t.target.selector)}::${t.target.outerHTML.slice(0,64)}`}const gi=[{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."}],fi={pass:"bg-emerald-500 text-white",fail:"bg-rose-600 text-white",uncertain:"bg-amber-500 text-slate-900"};function bi({componentId:t}){const[s,a]=m.useState({});m.useEffect(()=>{if(!t){a({});return}let l=!1;return(async()=>{const c=await Ke(t);if(l)return;const u={};for(const d of c)u[d.criterionId]=d.verdict;a(u)})(),()=>{l=!0}},[t]);const n=Object.values(s).length,r=Object.values(s).filter(l=>l==="pass").length,i=Object.values(s).filter(l=>l==="fail").length,o=Object.values(s).filter(l=>l==="uncertain").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:n===0?"not configured · all 5 criteria pending human verification":`${n}/5 · ${r} pass · ${i} fail · ${o} uncertain`})]}),n===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:gi.map(l=>{const c=s[l.id];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 ${c?fi[c]:"bg-slate-200 text-slate-500"}`,title:c?`AI verdict: ${c}`:"AI did not produce a verdict on this criterion",children:c||"not run"}),e.jsxs("div",{className:"min-w-0",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:l.id}),l.label]}),e.jsx("p",{className:"text-[11px] text-slate-500 leading-snug mt-0.5",children:l.blurb})]})]},l.id)})})]})}function vi(){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(be,{title:"The overall grade",body:"Mean of the 9 verification areas. Capped at B when any criterion is failing or inconclusive — fix or mark verified to claim A. The grade is computed once with all evidence sources mixed in (axe, AI walkthroughs, IGT runs); the sticky card above and the area list below cannot disagree."}),e.jsx(be,{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(be,{title:"AI does most of the human work",body:"Five 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. They drive real keyboard input + take screenshots + judge them with vision — exactly the work IGT manual workflows used to require. Their verdicts feed the Tab order / Keyboard / Reading order / Color & contrast sub-grades automatically. Humans only spot-check + attest before signing the formal report."}),e.jsx(be,{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(be,{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(be,{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 be({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 yi({results:t}){const s=new Set,a=[];for(const n of t)for(const r of n.violations){const i=ss(r);s.has(i)||(s.add(i),a.push(r))}return a.sort((n,r)=>{const i=ts[n.impact]??99,o=ts[r.impact]??99;return i-o}),a.length===0?e.jsxs("div",{className:"text-center text-sm text-slate-600 py-6",children:["No automation-detectable violations found across ",t.length," state",t.length===1?"":"s",". Switch to ",e.jsx("strong",{children:"Per-area"})," or"," ",e.jsx("strong",{children:"Activity"})," for heuristic findings axe doesn't cover."]}):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:[a.length," unique violation",a.length===1?"":"s"," · sorted by impact"]}),a.map(n=>e.jsx(Ee,{violation:n},ss(n)))]})}const pt="igtRuns";async function wi(t,s,a){const n=s[0];if(!n)return;const r=n.pageUrl;if(!r)return;const i=`Auto-dismissed by Guided test: "${a}" marked pass`;if(t==="tab-order"){const o=n.tabOrderIssues??[];if(o.length===0)return;await $e(r,o.map(l=>({key:Te(l.selector),reason:i,snippet:`${l.selector} — ${l.textSnippet||"(no text)"}`})))}else if(t==="reading-order"){const o=n.readingOrderIssues??[];if(o.length===0)return;await $e(r,o.map(l=>({key:Re(l.selector),reason:i,snippet:`${l.selector} — ${l.textSnippet||"(no text)"}`})))}}const ji={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"}},Ni={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"}},ki={outline:"Outline","tab-order":"Tab order","reading-order":"Reading order",targets:"Targets","fix-preview":"Fix preview"};async function as(t,s){const a=await ae();if(!a)return;const n=s?ji[t]:Ni[t];try{await de(a,n)}catch{}}async function Si(){const s=(await chrome.storage.local.get(pt))[pt];return s&&typeof s=="object"?s:{}}async function ns(t){await chrome.storage.local.set({[pt]:t})}function Ai(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 Ci(){const t=b(d=>d.componentId),s=b(d=>d.results),[a,n]=m.useState({}),[r,i]=m.useState(null);if(m.useEffect(()=>{Si().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 o=a[t]??{};function l(d,p,h){var g;const x={...a,[t]:{...o,[d]:{...o[d]??{componentId:t,workflowId:d,steps:{},completedAt:new Date().toISOString()},steps:{...((g=o[d])==null?void 0:g.steps)??{},[p]:h},completedAt:new Date().toISOString()}}};if(n(x),ns(x),h.status==="pass"){const j=oe.find(L=>L.id===d),S=j==null?void 0:j.steps.find(L=>L.id===p);S!=null&&S.autoDismissActivity&&wi(S.autoDismissActivity,s,p)}}function c(d){if(typeof confirm=="function"&&!confirm("Clear all answers for this workflow?"))return;const p={...o};delete p[d];const h={...a,[t]:p};n(h),ns(h)}const u=oe.find(d=>d.id===r);if(u){const d=o[u.id];return e.jsx(Ii,{workflow:u,run:d,results:s,onAnswer:(p,h)=>l(u.id,p,h),onBack:()=>i(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."}),oe.map(d=>{const p=o[d.id],h=p?ka(p,d):null,x=p?h!=null&&h.failed&&h.failed>0?"failed":h!=null&&h.unanswered&&h.unanswered>0?"in-progress":"done":"unstarted",g={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:()=>i(d.id),className:`w-full text-left border rounded p-2 block transition-colors ${g}`,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:d.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:d.blurb}),p&&e.jsx("button",{type:"button",onClick:j=>{j.stopPropagation(),c(d.id)},className:"text-[11px] text-slate-500 hover:text-rose-600 mt-1",children:"Clear answers"})]},d.id)})]})}function Ii({workflow:t,run:s,results:a,onAnswer:n,onBack:r}){const i=m.useMemo(()=>{const c={};for(const u of t.steps)c[u.id]=Ai(u,a);return c},[t,a]);function o(){for(const c of t.steps){const u=i[c.id];(u==null?void 0:u.kind)==="clean"&&!(s!=null&&s.steps[c.id])&&n(c.id,{status:"pass",notes:`Auto-marked via axe-clean evidence (${u.ruleId}, ${u.statesAudited} states).`})}}const l=t.steps.filter(c=>{var u;return((u=i[c.id])==null?void 0:u.kind)==="clean"&&!(s!=null&&s.steps[c.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}),l>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:[l," step",l===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:o,className:"text-[11px] px-2 py-1 bg-emerald-600 text-white rounded hover:bg-emerald-700 shrink-0",children:["Auto-mark ",l," →"]})]})]}),e.jsx("div",{className:"space-y-3",children:t.steps.map((c,u)=>{const d=s==null?void 0:s.steps[c.id];return e.jsxs("div",{className:`border rounded p-2 ${(d==null?void 0:d.status)==="pass"?"border-emerald-300 bg-emerald-50":(d==null?void 0:d.status)==="fail"?"border-rose-300 bg-rose-50":(d==null?void 0:d.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:[u+1,"/",t.steps.length]}),e.jsxs("div",{className:"flex items-center gap-1",children:[c.severity==="required"&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-rose-100 text-rose-700 rounded",children:"required"}),c.wcag&&e.jsxs("span",{className:"text-[10px] text-slate-500",children:["WCAG ",c.wcag]})]})]}),e.jsxs("p",{className:"text-xs text-slate-700 mb-1",children:[e.jsx("strong",{children:"Do:"})," ",c.prompt]}),e.jsxs("p",{className:"text-xs text-slate-700 mb-2",children:[e.jsx("strong",{children:"Verify:"})," ",c.question]}),c.relatedAxeRule&&e.jsxs("p",{className:"text-[11px] text-slate-500 mb-2",children:["Related axe rule: ",e.jsx("code",{className:"font-mono",children:c.relatedAxeRule})]}),(()=>{const p=i[c.id];return p?p.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:p.ruleId})," ran clean across ",p.statesAudited," state",p.statesAudited===1?"":"s",". Quick visual check, then mark pass."]}),!d&&e.jsx("button",{type:"button",onClick:()=>n(c.id,{status:"pass",notes:`Auto-marked via axe-clean evidence (${p.ruleId}, ${p.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:p.ruleId})," already found ",p.violationCount," violation",p.violationCount===1?"":"s"," in"," ",p.states.length," state",p.states.length===1?"":"s",". Verify and mark fail."]}),!d&&e.jsx("button",{type:"button",onClick:()=>n(c.id,{status:"fail",notes:`Auto-flagged via axe violations (${p.ruleId}, ${p.violationCount} hits in: ${p.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})(),c.visualizer&&e.jsxs("div",{className:"mb-2 flex items-center gap-2",children:[e.jsxs("button",{type:"button",onClick:()=>void as(c.visualizer,!0),className:"text-[11px] px-2 py-0.5 bg-brand-500 text-white rounded hover:bg-brand-600",children:["Show ",ki[c.visualizer]]}),e.jsx("button",{type:"button",onClick:()=>void as(c.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(Ue,{label:"Pass",active:(d==null?void 0:d.status)==="pass",tone:"emerald",onClick:()=>n(c.id,{status:"pass",notes:d==null?void 0:d.notes})}),e.jsx(Ue,{label:"Fail",active:(d==null?void 0:d.status)==="fail",tone:"rose",onClick:()=>n(c.id,{status:"fail",notes:d==null?void 0:d.notes})}),e.jsx(Ue,{label:"N/A",active:(d==null?void 0:d.status)==="not-applicable",tone:"slate",onClick:()=>n(c.id,{status:"not-applicable",notes:d==null?void 0:d.notes})}),e.jsx(Ue,{label:"Skip",active:(d==null?void 0:d.status)==="skip",tone:"slate",onClick:()=>n(c.id,{status:"skip",notes:d==null?void 0:d.notes})})]}),d&&e.jsx("textarea",{placeholder:"Notes (optional)",value:d.notes??"",onChange:p=>n(c.id,{status:d.status,notes:p.target.value}),rows:2,className:"w-full mt-2 text-[11px] border border-slate-200 rounded p-1.5"})]},c.id)})})]})}const Ei={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 Ue({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?Ei[a]:"bg-white text-slate-700 border-slate-300 hover:bg-slate-50"}`,children:t})}const Pe="savedFlows";async function Ri(){const t=await chrome.storage.local.get(Pe);return Array.isArray(t[Pe])?t[Pe]:[]}async function rs(t){await chrome.storage.local.set({[Pe]:t})}function Ti(){const[t,s]=m.useState([]),[a,n]=m.useState(!1),[r,i]=m.useState(null);m.useEffect(()=>{Ri().then(s)},[]);async function o(){const d=await ae();if(!d){i("No audit-target tab found.");return}try{await de(d,{type:"FLOW_RECORD_START_REQUEST"}),n(!0),i("Recording. Switch to the page and perform actions, then come back and Stop.")}catch{i("Failed to start recording.")}}async function l(){const d=await ae();if(d)try{const p=await ge(d,{type:"FLOW_RECORD_STOP_REQUEST"});if(n(!1),p.steps.length===0){i("Recording stopped — no steps captured.");return}const h=typeof prompt=="function"?prompt(`Captured ${p.steps.length} steps. Name this flow:`,"")??"":`Flow ${new Date().toLocaleTimeString()}`;if(!h.trim()){i("Save canceled.");return}const x={id:`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,name:h.trim(),steps:p.steps,savedAt:new Date().toISOString()},g=[x,...t];s(g),await rs(g),i(`Saved "${x.name}" with ${x.steps.length} steps.`)}catch(p){i(`Stop failed: ${p instanceof Error?p.message:String(p)}`)}}async function c(d){const p=await ae();if(p){i(`Replaying "${d.name}"…`);try{const h=await ge(p,{type:"FLOW_PLAY_REQUEST",steps:d.steps});i(`Replayed ${h.played} step${h.played===1?"":"s"}`+(h.errored?`, ${h.errored} errored (selector not found)`:"")+".")}catch(h){i(`Replay failed: ${h instanceof Error?h.message:String(h)}`)}}}async function u(d){if(typeof confirm=="function"&&!confirm("Delete this flow?"))return;const p=t.filter(h=>h.id!==d);s(p),await rs(p)}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:l,className:"text-xs px-3 py-1 bg-slate-700 text-white rounded hover:bg-slate-800",children:"■ Stop & save"}):e.jsx("button",{onClick:o,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(d=>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:d.name}),e.jsxs("div",{className:"text-[11px] text-slate-500 mt-0.5",children:[d.steps.length," step",d.steps.length===1?"":"s"," ·"," ",new Date(d.savedAt).toLocaleDateString()]})]}),e.jsxs("div",{className:"flex gap-1 shrink-0",children:[e.jsx("button",{onClick:()=>c(d),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:()=>u(d.id),className:"text-[11px] text-slate-500 hover:text-rose-600 px-1",title:"Delete flow",children:"✕"})]})]},d.id))})]})}function $i(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 i=n.slice(0,r),o=n.slice(r+1);return i==="story"?{primary:o.split("--").map(c=>c.split("-").map(Li).join(" ")).join(" / "),secondary:"storybook"}:{primary:o,secondary:a||i}}function Li(t){return t.length===0?t:t[0].toUpperCase()+t.slice(1)}function Ui(){const t=b(l=>l.baselineList),s=b(l=>l.tier),a=Ss[s].maxBaselines,n=t.length>=a&&Number.isFinite(a),[r,i]=m.useState(!1);if(m.useEffect(()=>{We().finally(()=>i(!0))},[]),!r)return e.jsx("div",{className:"p-3 space-y-2","aria-label":"Loading scorecard",children:[0,1,2].map(l=>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"})]},l))});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 o(l){await re({type:"BASELINE_DELETE",componentId:l}),await We()}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(l=>{const c=$i(l.componentId),u=l.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:l.componentId,children:c.primary}),c.secondary&&e.jsx("div",{className:"text-[11px] text-slate-500 truncate",title:c.secondary,children:c.secondary}),e.jsxs("div",{className:"text-xs text-slate-500 mt-0.5",children:[l.violationCount," ",l.violationCount===1?"violation":"violations"," ·"," ",new Date(l.lastUpdated).toLocaleDateString()]}),u&&e.jsxs("div",{className:"flex flex-wrap gap-1 mt-1.5",children:[l.seenOnUrlsCount&&l.seenOnUrlsCount>1&&e.jsxs(fe,{tone:"indigo",title:"This component pattern has been audited on multiple URLs",children:["seen on ",l.seenOnUrlsCount," pages"]}),u.criticalCount>0&&e.jsxs(fe,{tone:"rose",title:`${u.criticalCount} critical violations`,children:[u.criticalCount," critical"]}),u.seriousCount>0&&e.jsxs(fe,{tone:"orange",title:`${u.seriousCount} serious violations`,children:[u.seriousCount," serious"]}),u.focusResetCount>0&&e.jsxs(fe,{tone:"rose",title:`${u.focusResetCount} focus resets observed`,children:[u.focusResetCount," focus reset",u.focusResetCount===1?"":"s"]}),u.targetSizeFailCount>0&&e.jsxs(fe,{tone:"amber",title:"Targets smaller than WCAG 2.5.8 minimum",children:[u.targetSizeFailCount," small targets"]}),u.hoverContrastFail&&e.jsx(fe,{tone:"amber",title:"Contrast failure on :hover state",children:"hover-contrast"}),u.announcementCount>0&&e.jsxs(fe,{tone:"indigo",title:"aria-live announcements observed",children:[u.announcementCount," announce"]})]})]}),e.jsx("button",{onClick:()=>o(l.componentId),className:"text-xs text-slate-500 hover:text-red-600 shrink-0",title:"Reset baseline",children:"Reset"})]},l.componentId)})]})}const _i={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 fe({tone:t,title:s,children:a}){return e.jsx("span",{title:s,className:`text-[10px] px-1.5 py-0.5 rounded ${_i[t]}`,children:a})}const Di={low:"bg-emerald-50 border-emerald-200",moderate:"bg-yellow-50 border-yellow-200",high:"bg-orange-50 border-orange-200",critical:"bg-rose-50 border-rose-300"},Oi={low:"text-emerald-800",moderate:"text-yellow-800",high:"text-orange-800",critical:"text-rose-800"},Mi={critical:"bg-rose-600 text-white",serious:"bg-orange-500 text-white",moderate:"bg-yellow-500 text-slate-900",minor:"bg-blue-500 text-white"};function Ks({onBack:t}){const s=b(p=>p.siteCrawlStatus),a=b(p=>p.siteCrawlProgress),n=b(p=>p.siteCrawlReport),r=b(p=>p.siteCrawlError),[i,o]=m.useState(""),[l,c]=m.useState(25);i===""&&chrome.tabs.query({active:!0,currentWindow:!0}).then(p=>{var x;const h=(x=p[0])==null?void 0:x.url;h&&/^https?:\/\//.test(h)&&i===""&&o(h)});function u(){i&&(l>=5&&!window.confirm(`Each of the ${l} crawled pages runs your full single-page audit pipeline (same matrix + analyzers + AI walkthroughs you've configured). If your single-page audits take ~5 minutes, expect this crawl to take roughly ${l*5} minutes. Proceed?`)||(b.getState().setSiteCrawlStatus("running"),b.getState().setSiteCrawlReport(null),b.getState().setSiteCrawlError(null),me({type:"START_SITE_CRAWL",startUrl:i,maxPages:l})))}function d(){re({type:"CANCEL_SITE_CRAWL"})}return e.jsxs("div",{className:"p-4 space-y-3",children:[t&&e.jsx("button",{type:"button",onClick:t,className:"text-xs text-brand-600 hover:underline",children:"← Back to single-page scan"}),e.jsx("h2",{className:"text-sm font-semibold",children:"Audit my whole site"}),e.jsx("p",{className:"text-xs text-slate-600 leading-snug",children:"We'll start at the URL below and follow internal links to audit each page. Same-origin only — we won't crawl off-site."}),s!=="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"crawl-start-url",className:"block text-[11px] text-slate-500 mb-1",children:"Starting URL"}),e.jsx("input",{id:"crawl-start-url",type:"url",value:i,onChange:p=>o(p.target.value),placeholder:"https://yoursite.com",className:"w-full text-xs border border-slate-300 rounded px-2 py-1.5 font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"crawl-max-pages",className:"block text-[11px] text-slate-500 mb-1",children:"Maximum pages (cap)"}),e.jsx("input",{id:"crawl-max-pages",type:"number",min:1,max:200,value:l,onChange:p=>c(Math.min(200,Math.max(1,parseInt(p.target.value,10)||25))),className:"w-full text-xs border border-slate-300 rounded px-2 py-1.5"}),e.jsx("p",{className:"text-[10px] text-slate-500 mt-1",children:"Higher = more thorough but slower. 25 is a good default. Each page runs your full single-page audit pipeline (matrix + analyzers + AI)."})]}),e.jsx("button",{type:"button",onClick:u,disabled:!i,className:"w-full text-sm px-4 py-2.5 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50 font-medium",children:"Start whole-site audit"})]}),s==="running"&&a&&e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium",children:"Auditing your site…"}),e.jsxs("div",{className:"bg-slate-100 border border-slate-200 rounded p-2.5 space-y-2",children:[e.jsx("p",{className:"text-xs font-mono break-all",children:a.url}),e.jsx("div",{className:"h-1.5 bg-slate-200 rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full bg-brand-500 transition-all",style:{width:`${a.current/Math.max(1,a.total)*100}%`},role:"progressbar","aria-valuenow":a.current,"aria-valuemin":0,"aria-valuemax":a.total,"aria-label":`Page ${a.current} of ${a.total}`})}),e.jsxs("p",{className:"text-[11px] text-slate-600",children:["Page ",a.current," of ",a.total,a.lastViolations!==void 0&&` · last had ${a.lastViolations} issue${a.lastViolations===1?"":"s"}`]})]}),e.jsx("button",{type:"button",onClick:d,className:"w-full text-xs px-3 py-1.5 border border-slate-300 rounded hover:bg-slate-50",children:"Cancel"})]}),s==="complete"&&n&&e.jsx(Fi,{report:n}),s==="failed"&&r&&e.jsxs("div",{className:"border border-rose-300 bg-rose-50 rounded p-3 text-xs text-rose-800",children:[e.jsx("strong",{children:"Audit failed:"})," ",r]})]})}function Fi({report:t}){function s(){vt(async()=>{const{renderSiteReportHtml:i}=await import("./site-report-renderer-ByK3NGUh.js");return{renderSiteReportHtml:i}},__vite__mapDeps([3,4,1,2,5])).then(({renderSiteReportHtml:i})=>{const o=i(t),l=new Blob([o],{type:"text/html"}),c=URL.createObjectURL(l);window.open(c,"_blank","noopener,noreferrer"),setTimeout(()=>URL.revokeObjectURL(c),6e4)})}const[a,n]=m.useState(!1);async function r(){n(!0);try{const i=await chrome.runtime.sendMessage({type:"EXPORT_REQUEST",format:"ai-prompt-site-crawl",results:[]}),o=(i==null?void 0:i.content)??"";if(!o){window.alert("No crawl results available to export.");return}try{await navigator.clipboard.writeText(o)}catch{}const l=new Blob([o],{type:"text/markdown;charset=utf-8"}),c=URL.createObjectURL(l);window.open(c,"_blank","noopener,noreferrer"),setTimeout(()=>URL.revokeObjectURL(c),6e4)}finally{n(!1)}}return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:`border rounded-lg p-4 ${Di[t.siteRisk]}`,children:[e.jsx("p",{className:`text-base font-semibold ${Oi[t.siteRisk]}`,children:Sa[t.siteRisk]}),e.jsxs("p",{className:"text-xs mt-1",children:[e.jsx("strong",{children:t.pagesAudited})," page",t.pagesAudited===1?"":"s"," audited ·"," ",e.jsx("strong",{children:t.totalUniqueViolations})," unique issue",t.totalUniqueViolations===1?"":"s"," site-wide",t.pagesFailed>0&&` · ${t.pagesFailed} failed`]})]}),e.jsx("button",{type:"button",onClick:s,className:"w-full text-sm px-4 py-2.5 bg-brand-500 text-white rounded hover:bg-brand-600 font-medium",children:"📊 Open full site report"}),e.jsx("button",{type:"button",onClick:r,disabled:a,className:"w-full text-sm px-4 py-2.5 border border-brand-500 text-brand-700 rounded hover:bg-brand-50 disabled:opacity-50 font-medium",title:"Generate an AI-ready markdown doc covering EVERY crawled page's violations + fix recipes (not just the current page).",children:a?"Building…":"🤖 Export AI fix prompt (all crawled pages)"}),e.jsxs("p",{className:"text-[11px] text-slate-600 leading-snug border-l-2 border-brand-300 pl-2.5 bg-brand-50 py-2 rounded-r",children:[e.jsx("strong",{children:"Two ways to use this report."}),' The crawl above is for triage + bulk AI hand-off — knock out the big stuff across the whole site in one shot. For granular control on any single page (acknowledge individual findings, run guided manual checks, preview fixes on the live page, run interactive walkthroughs), click that page in the "Pages, worst first" list below.']}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 mb-2",children:"Top issues across the site"}),e.jsx("ul",{className:"space-y-2",children:t.topViolations.slice(0,8).map(i=>{const o=Aa(i.ruleId);return e.jsx("li",{className:"border border-slate-200 rounded p-2.5 bg-white text-xs",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:`text-[10px] px-1.5 py-0.5 rounded font-semibold uppercase tracking-wide shrink-0 ${Mi[i.impact]}`,children:i.impact}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"text-sm font-medium",children:o.whatsWrong}),e.jsxs("p",{className:"text-[11px] text-slate-500 mt-1",children:["Found on ",e.jsx("strong",{children:i.urlsAffected})," page",i.urlsAffected===1?"":"s"," · ",i.totalOccurrences," total spot",i.totalOccurrences===1?"":"s"]})]})]})},i.ruleId)})})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-slate-500 mb-2",children:"Pages, worst first"}),e.jsxs("p",{className:"text-[10px] text-slate-500 leading-snug mb-2",children:["The crawl is for triage + bulk AI fix-prompt generation. ",e.jsx("strong",{children:"Click any page"})," to open it in the active tab and load its crawl results into the single-page view — there you get per-finding acknowledgements, visualizers, guided manual checks, and fix-preview overlays."]}),e.jsx("ul",{className:"space-y-1 text-xs",children:t.pages.slice(0,15).map(i=>e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:()=>void Pi(i.url),className:"w-full flex items-center gap-2 text-left px-1.5 py-1 rounded hover:bg-slate-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-brand-500",title:"Open this page in the active tab and load its crawl results into the single-page view for granular fix work",children:[e.jsx("span",{className:`font-mono w-5 text-center font-semibold ${i.grade==="A"?"text-emerald-700":i.grade==="B"?"text-lime-700":i.grade==="C"?"text-yellow-700":i.grade==="D"?"text-orange-700":"text-rose-700"}`,children:i.grade}),e.jsx("span",{className:"font-mono text-[11px] text-slate-700 break-all flex-1",children:i.url}),e.jsx("span",{className:"text-[11px] text-slate-500 shrink-0",children:i.uniqueViolations}),e.jsx("span",{className:"text-[10px] text-brand-600 shrink-0","aria-hidden":"true",children:"→"})]})},i.url))})]})]})}async function Pi(t){try{const s=await Ca(),a=s==null?void 0:s.find(n=>n.url===t);try{const r=(await chrome.tabs.query({active:!0,currentWindow:!0}))[0];r!=null&&r.id?await chrome.tabs.update(r.id,{url:t,active:!0}):await chrome.tabs.create({url:t,active:!0})}catch{}if(a&&a.results.length>0&&a.componentId){b.getState().setResults(a.results,a.delta,a.componentId);try{await chrome.storage.local.set({"sidePanel:lastAudit":{results:a.results.map(({screenshotDataUrl:n,...r})=>r),delta:a.delta,componentId:a.componentId}})}catch{}}b.getState().setView("matrix")}catch(s){console.warn("[site-crawl-panel] openPageInSinglePageView failed",s)}}const st="onboardingDismissed",at=[{title:"Welcome",body:e.jsxs("div",{className:"space-y-2 text-xs text-slate-700",children:[e.jsx("p",{children:"The WCAG Component Auditor finds accessibility violations that other tools miss — by driving your component through every visual state your users actually encounter."}),e.jsx("p",{children:"Three steps. ~30 seconds."})]})},{title:"Step 1 — Pick an element",body:e.jsxs("div",{className:"space-y-2 text-xs text-slate-700",children:[e.jsxs("p",{children:["Click ",e.jsx("strong",{children:"Pick element"})," in the side panel, then click any element on the page. The auditor scopes its analysis to that component — not the whole page."]}),e.jsxs("p",{children:["(For full-page scans, switch the dropdown to ",e.jsx("strong",{children:"Full page"}),".)"]})]})},{title:"Step 2 — Watch the matrix run",body:e.jsxs("div",{className:"space-y-2 text-xs text-slate-700",children:[e.jsxs("p",{children:["When you click ",e.jsx("strong",{children:"Run audit"}),", the auditor drives your element through every combination of ",e.jsx("code",{children:":hover"}),", ",e.jsx("code",{children:":focus"}),", ",e.jsx("code",{children:":focus-visible"}),",",e.jsx("code",{children:":disabled"}),", dark mode, forced-colors, RTL, and breakpoint sizes — auditing at each."]}),e.jsxs("p",{children:["A yellow ",e.jsx("em",{children:'"is debugging this browser"'})," banner appears during runs. That's how we drive the states. It disappears when the audit finishes."]})]})},{title:"Step 3 — Find and replay",body:e.jsxs("div",{className:"space-y-2 text-xs text-slate-700",children:[e.jsxs("p",{children:["Click any violation to highlight it on the page. Click ",e.jsx("strong",{children:"Load state"})," to re-drive the page back to the exact state where the violation was found — see what the auditor saw."]}),e.jsxs("p",{children:["The ",e.jsx("strong",{children:"Delta"})," tab filters to NEW debt vs. your accepted baseline — file a GitHub issue for only what you introduced, not inherited mess."]})]})}];function Gi(){const[t,s]=m.useState(!1),[a,n]=m.useState(0);m.useEffect(()=>{chrome.storage.local.get(st).then(l=>{l[st]||s(!0)})},[]);async function r(){await chrome.storage.local.set({[st]:!0}),s(!1),n(0)}const i=a===at.length-1,o=at[a];return e.jsxs(ye,{open:t,onClose:r,title:o.title,children:[e.jsx("div",{children:o.body}),e.jsxs("div",{className:"flex items-center justify-between mt-4",children:[e.jsxs("span",{className:"text-[11px] text-slate-500",children:[a+1," / ",at.length]}),e.jsxs("div",{className:"flex gap-2",children:[a>0&&e.jsx("button",{onClick:()=>n(l=>l-1),className:"text-xs px-3 py-1 border border-slate-300 rounded text-slate-700 hover:bg-slate-50",children:"Back"}),i?e.jsx("button",{onClick:r,className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600",children:"Got it"}):e.jsx("button",{onClick:()=>n(l=>l+1),className:"text-xs px-3 py-1 bg-brand-500 text-white rounded hover:bg-brand-600",children:"Next"})]})]})]})}function Vi(){const t=b(n=>n.status),s=b(n=>n.errorMessage),a=b(n=>n.setStatus);return t!=="failed"||!s?null:e.jsxs("div",{role:"alert",className:"px-3 py-2 bg-red-50 border-b border-red-200 text-xs text-red-800 flex items-center justify-between",children:[e.jsx("span",{children:s}),e.jsx("button",{onClick:()=>a("idle"),className:"text-red-600 hover:text-red-900 ml-2","aria-label":"Dismiss error",children:"×"})]})}function Wi(){const t=b(c=>c.aiFailure),s=b(c=>c.clearAiFailure),[a,n]=m.useState(!1);if(!t)return null;const r=t.severity==="total",i=r?"bg-orange-50 border-orange-300 text-orange-900":"bg-amber-50 border-amber-300 text-amber-900",o="⚠",l=r?"AI fixer didn't run on this audit":`AI fixer partially completed (${t.checksSucceeded}/${t.checksAttempted} checks ran)`;return e.jsx("div",{role:"alert",className:`px-3 py-2 border-b text-xs flex flex-col gap-1 ${i}`,children:e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"font-semibold",children:[e.jsx("span",{"aria-hidden":"true",children:o})," ",l]}),e.jsxs("div",{className:"mt-0.5",children:[t.reason,t.errorDetails.length>0&&e.jsxs(e.Fragment,{children:[" ",e.jsx("button",{onClick:()=>n(c=>!c),className:"underline hover:no-underline","aria-expanded":a,children:a?"Hide details":`Show ${t.errorDetails.length} error${t.errorDetails.length===1?"":"s"}`})]})]}),a&&t.errorDetails.length>0&&e.jsx("ul",{className:"mt-1 pl-4 list-disc font-mono text-[11px] leading-snug",children:t.errorDetails.map((c,u)=>e.jsx("li",{children:c},u))})]}),e.jsx("button",{onClick:s,className:"hover:opacity-70 leading-none","aria-label":"Dismiss AI failure notice",children:"×"})]})})}function is(){const[t,s]=m.useState(!1);return m.useEffect(()=>pe("AUDIT_FAILED_EVENT",a=>{a.error.code==="DEBUGGER_BUSY"&&(s(!0),b.getState().setStatus("idle"))}),[]),e.jsxs(ye,{open:t,onClose:()=>s(!1),title:"Close DevTools to continue",children:[e.jsxs("div",{className:"space-y-3 text-xs text-slate-700",children:[e.jsx("p",{children:"The audit can't run because Chrome DevTools is open on the target tab. We use the same debugging API DevTools uses, and only one consumer can be attached at a time."}),e.jsxs("p",{children:[e.jsx("strong",{children:"To continue:"})," close DevTools on the target tab, then start the audit again."]}),e.jsx("p",{className:"text-slate-500",children:"Why we need it: without the debugger API, we can't drive components through hover, focus, dark-mode, and other states screen readers care about."})]}),e.jsx("div",{className:"flex justify-end mt-4",children:e.jsx("button",{onClick:()=>s(!1),className:"text-xs px-3 py-1 bg-brand-500 text-white rounded",children:"Got it"})})]})}function Bi(){var i;const[t,s]=m.useState(null);if(m.useEffect(()=>{Ia().then(o=>{o&&o.state==="interrupted"&&s(o)})},[]),!t)return null;async function a(){t&&(await Ct(),b.getState().startNewScan(),t.mode==="storybook-all"?me({type:"START_AUDIT",mode:"storybook-all"}):t.scope&&me({type:"START_AUDIT",mode:"single-element",scope:t.scope}),s(null))}async function n(){await Ct(),s(null)}const r=t.mode==="storybook-all"?`Story ${((i=t.completedStories)==null?void 0:i.length)??0}/${t.totalStories??"?"}`:"Single-element audit";return e.jsxs("div",{role:"status",className:"px-3 py-2 bg-amber-50 border-b border-amber-200 text-xs text-amber-900 flex items-center justify-between gap-2",children:[e.jsxs("span",{children:["A previous audit was interrupted (",r,")."]}),e.jsxs("span",{className:"flex gap-1",children:[e.jsx("button",{onClick:a,className:"px-2 py-0.5 bg-brand-500 text-white rounded hover:bg-brand-600",children:"Resume"}),e.jsx("button",{onClick:n,className:"px-2 py-0.5 hover:bg-amber-100 rounded",children:"Discard"})]})]})}const nt="storybook:hintDismissed";function Hi(){const[t,s]=m.useState(!1),[a,n]=m.useState();m.useEffect(()=>{(async()=>{var l;if((await chrome.storage.local.get(nt))[nt])return;const o=await ae();if(o)try{const u=(await chrome.scripting.executeScript({target:{tabId:o,allFrames:!0},world:"MAIN",func:()=>{var p;const d=window;return{detected:typeof d.__STORYBOOK_PREVIEW__=="object",version:(p=d.__STORYBOOK_PREVIEW__)==null?void 0:p.version}}})).find(d=>{var p;return(p=d.result)==null?void 0:p.detected});u&&(n((l=u.result)==null?void 0:l.version),s(!0))}catch{}})()},[]);async function r(){await chrome.storage.local.set({[nt]:!0}),s(!1)}return t?e.jsxs("div",{className:"px-3 py-2 bg-blue-50 border-b border-blue-200 text-xs text-blue-900 flex items-center justify-between gap-2",children:[e.jsxs("span",{children:["Storybook ",a??""," detected. Switch to ",e.jsx("strong",{children:"All stories"})," to audit every story in one pass."]}),e.jsx("button",{onClick:r,className:"text-blue-700 hover:text-blue-900 ml-2","aria-label":"Dismiss hint",children:"×"})]}):null}function zi(){var i;const t=b(o=>o.results),s=b(o=>o.baselineList),a=b(o=>o.status),n=(i=t[0])==null?void 0:i.startedAt,r=s.length;return e.jsxs("footer",{className:"border-t border-slate-200 bg-white text-[10px] text-slate-500",children:[e.jsxs("div",{className:"px-3 py-1.5 flex items-center justify-between",children:[e.jsx("span",{children:r>0?`${r} ${r===1?"component":"components"} tracked`:"no baselines yet"}),e.jsx("span",{children:a==="running"?"auditing…":n?`last audit ${Ki(n)}`:"idle"})]}),e.jsxs("div",{className:"border-t border-slate-100 bg-slate-50 px-3 py-1 text-center",children:["Powered by"," ",e.jsx("a",{href:"https://locustware.com",target:"_blank",rel:"noopener noreferrer",className:"font-medium text-slate-600 hover:text-brand-600 hover:underline focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-brand-500",children:"Locustware"})]})]})}function Ki(t,s=new Date){const a=new Date(t),n=s.getTime()-a.getTime(),r=Math.round(n/1e3);if(r<60)return"just now";const i=Math.round(r/60);if(i<60)return`${i}m ago`;const o=Math.round(i/60);if(o<24)return`${o}h ago`;const l=Math.round(o/24);return l<7?`${l}d ago`:a.toLocaleDateString()}function qi(){const t=b(l=>l.results),s=b(l=>l.componentId),[a,n]=m.useState([]);if(m.useEffect(()=>{if(!s){n([]);return}let l=!1;return chrome.storage.local.get("igtRuns").then(c=>{if(l)return;const d=((c==null?void 0:c.igtRuns)??{})[s]??{};n(Object.values(d))}),()=>{l=!0}},[s]),t.length===0)return null;const r=t.flatMap(l=>l.violations),i=Ea(r,a.length>0?{runs:a,workflows:oe}:void 0),o=i.manual!==void 0&&i.manual.workflowsCompleted===i.manual.workflowsTotal;return e.jsxs("div",{className:"border-t border-amber-200 bg-amber-50 px-3 py-2 text-[11px] text-amber-900 leading-snug",children:[e.jsx("strong",{children:"Not a compliance certificate."})," ",o?"All Guided Tests workflows are complete and folded into this grade.":"Automation covers ~50% of WCAG. The Guided Tests workflows + the manual checklist in the AI fix prompt cover the rest. The grade above only reflects what automation can verify."]})}function Qi(){const t=b(a=>a.setUserMode);function s(a){t(a),re({type:"SETTINGS_SET",key:"userMode",value:a})}return e.jsx("div",{className:"flex flex-col h-screen bg-slate-50 text-slate-900 text-sm",children:e.jsxs("main",{className:"flex-1 overflow-y-auto p-6 space-y-5",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-xl font-semibold mb-1",children:"Welcome."}),e.jsx("p",{className:"text-sm text-slate-600",children:"One quick question — pick the mode that fits your role. You can switch later from Settings."})]}),e.jsx("button",{type:"button",onClick:()=>s("owner"),className:"w-full text-left border border-slate-300 rounded-lg p-4 bg-white hover:border-brand-500 hover:bg-brand-50 transition-colors",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"text-2xl","aria-hidden":"true",children:"🏪"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("h2",{className:"font-semibold text-sm mb-1",children:"I'm a site owner"}),e.jsx("p",{className:"text-[12px] text-slate-600 leading-snug",children:"I bought or built this site (maybe with a template) and want to make sure it's accessible — and not at risk of an ADA lawsuit."}),e.jsxs("ul",{className:"text-[11px] text-slate-500 mt-2 space-y-0.5",children:[e.jsx("li",{children:"· Plain-language audit results"}),e.jsx("li",{children:"· One-click whole-site scan"}),e.jsx("li",{children:'· "Send this to my web developer" report'}),e.jsx("li",{children:"· No code or technical knowledge required"})]})]})]})}),e.jsx("button",{type:"button",onClick:()=>s("dev"),className:"w-full text-left border border-slate-300 rounded-lg p-4 bg-white hover:border-brand-500 hover:bg-brand-50 transition-colors",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"text-2xl","aria-hidden":"true",children:"⚙️"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("h2",{className:"font-semibold text-sm mb-1",children:"I'm a developer or agency"}),e.jsx("p",{className:"text-[12px] text-slate-600 leading-snug",children:"I build or maintain web apps. I want full audit features, exports, AI-driven fix workflows, baselines, and defense-grade legal documentation."}),e.jsxs("ul",{className:"text-[11px] text-slate-500 mt-2 space-y-0.5",children:[e.jsx("li",{children:"· Multi-state matrix audits (108 state combinations)"}),e.jsx("li",{children:"· AI fix prompt, SARIF/JUnit/VPAT exports, baselines + delta"}),e.jsx("li",{children:"· Guided Tests workflows (12 manual checks)"}),e.jsx("li",{children:"· Defense + evidence bundles, site-wide CLI crawler"})]})]})]})}),e.jsxs("p",{className:"text-[11px] text-slate-500 text-center pt-2",children:["You can switch modes anytime from ",e.jsx("strong",{children:"Settings → User mode"}),"."]})]})})}const Yi=["image-alt","input-image-alt","role-img-alt","svg-img-alt","area-alt","label","label-title-only","form-field-multiple-labels","select-name","button-name","link-name","empty-heading","color-contrast","document-title","html-has-lang","html-lang-valid","page-has-heading-one","region","landmark-one-main","bypass","aria-required-attr","aria-roles","aria-valid-attr","aria-valid-attr-value","aria-allowed-attr","aria-hidden-body","aria-hidden-focus","table-fake-caption","td-headers-attr","th-has-data-cells","scope-attr-valid","frame-title","frame-title-unique","list","listitem","definition-list","dlitem"],Ji={low:"Low risk. Your site is clean on every check that automated lawsuit-targeting tools run. They look for easy targets — you aren't one.",moderate:"Moderate risk. A demand-letter scanner would flag at least one issue. Fix these to drop off the easy-target list.",high:"High risk. Multiple findings here are the exact patterns demand-letter mills target. Fix these before the next scanner sweep.",critical:"Critical risk. Your site has many of the high-frequency patterns ADA-targeting firms scan for. You're a likely target. Fix the items below."};function Xi(t){const s=new Set(Yi),a=new Map;for(const c of t)s.has(c.ruleId)&&a.set(c.ruleId,(a.get(c.ruleId)??0)+1);const n=Array.from(a.entries()).map(([c,u])=>({ruleId:c,instanceCount:u})).sort((c,u)=>u.instanceCount-c.instanceCount),r=n.length,i=Array.from(a.values()).reduce((c,u)=>c+u,0);let o;return r===0?o="low":r===1?o="moderate":r<=3?o="high":o="critical",{tier:o,letter:o==="low"?"A":o==="moderate"?"C":o==="high"?"D":"F",flaggedRuleCount:r,flaggedInstanceCount:i,flaggedRules:n,headline:Ji[o]}}const qs={id:"desktop",label:"Desktop",width:1280,height:800,deviceScaleFactor:1,mobile:!1},Zi={pseudoStates:["default"],ariaVariations:[],themes:["light"],directions:["ltr"],breakpoints:["desktop"],breakpointPresets:[qs]},eo={pseudoStates:["default","hover","focus"],ariaVariations:[],themes:["light","dark"],directions:["ltr","rtl"],breakpoints:["desktop"],breakpointPresets:[qs]};function jt(t){return t==="thorough"?eo:Zi}function os(t){const s=jt(t);return s.pseudoStates.length*s.themes.length*s.directions.length*s.breakpoints.length}const Ge="wcagcheckr";function J(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Ie(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 to(t){return Array.from(new Set(t.map(s=>s.axeVersion).filter(Boolean))).sort()}function so(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 ao(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 no(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 ro(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 (${J(t.receipt.tsaName)}) — anchored ${J(Ie(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>${J(t.receipt.serverKeyFingerprint)}</code></td></tr>
|
|
20
20
|
${t.receipt.prevAuditHash?`<tr><th>Chain predecessor</th><td><code class="hash">${J(t.receipt.prevAuditHash)}</code></td></tr>`:""}`:`<tr><th>Trusted timestamp</th><td class="local-only">Local-only entry. Self-attested by ${J(Ge)}; not anchored to a public TSA. Lower evidentiary weight than RFC 3161-anchored entries.</td></tr>`;return`
|
|
21
21
|
<article class="entry">
|
|
@@ -565,4 +565,4 @@ Rules:
|
|
|
565
565
|
${t.auditContext}
|
|
566
566
|
</audit-context>`);const r=await fetch(Al,{method:"POST",headers:{"content-type":"application/json","x-api-key":t.apiKey,"anthropic-version":Cl,"anthropic-dangerous-direct-browser-access":"true"},body:JSON.stringify({model:s,max_tokens:a,system:n,messages:t.messages}),signal:t.signal});if(!r.ok){const d=await r.text().catch(()=>"");throw new Error(`Anthropic API ${r.status}: ${d.slice(0,300)}`)}const i=await r.json(),o=i.content.filter(d=>d.type==="text").map(d=>d.text).join(`
|
|
567
567
|
`).trim(),l=i.usage.input_tokens,c=i.usage.output_tokens,u=$l(l,c,s);if(t.maxCostUsd!==void 0&&u>t.maxCostUsd)throw new Error(`chat turn cost $${u.toFixed(4)} exceeded maxCostUsd $${t.maxCostUsd.toFixed(4)}`);return{text:o,inputTokens:l,outputTokens:c,costUsd:u,model:i.model}}function Ul(t){const s=[];t.pageUrl&&s.push(`page: ${t.pageUrl}`),t.componentId&&s.push(`component: ${t.componentId}`),s.push(`violations: ${t.violations.length}`),s.push("");const a=new Set;for(const n of t.violations){const r=`${n.ruleId}::${n.target.selector}`;if(a.has(r))continue;a.add(r);const i=n.target.outerHTML.length>200?n.target.outerHTML.slice(0,197)+"...":n.target.outerHTML;s.push(`- [${n.impact}] ${n.ruleId} (WCAG ${n.wcagCriterion} ${n.wcagLevel})`),s.push(` selector: ${n.target.selector}`),s.push(` html: ${i}`),s.push(` axe says: ${n.description}`),s.push("")}return s.join(`
|
|
568
|
-
`)}const gs="aiConfig";function _l(){var C;const t=b(f=>f.results),s=b(f=>f.componentId),[a,n]=m.useState([]),[r,i]=m.useState(""),[o,l]=m.useState(!1),[c,u]=m.useState(!1),[d,p]=m.useState("claude-sonnet-4-6"),h=m.useRef(""),x=m.useRef(null);m.useEffect(()=>{(async()=>{const k=(await chrome.storage.local.get(gs))[gs];h.current=(k==null?void 0:k.apiKey)??"",u(!!(k!=null&&k.apiKey)),k!=null&&k.model&&p(k.model)})()},[]),m.useEffect(()=>{x.current&&(x.current.scrollTop=x.current.scrollHeight)},[a.length]);const g=t.flatMap(f=>f.violations),j=Ul({componentId:s??void 0,pageUrl:(C=t[0])==null?void 0:C.pageUrl,violations:g.map(f=>({ruleId:f.ruleId,wcagCriterion:f.wcagCriterion,wcagLevel:f.wcagLevel,impact:f.impact,description:f.description,target:{selector:f.target.selector,outerHTML:f.target.outerHTML}}))}),S=a.reduce((f,k)=>f+(k.costUsd??0),0);async function L(){const f=r.trim();if(!f||o||!h.current)return;i("");const k={role:"user",content:f},E=[...a,k];n(E),l(!0);try{const N=E.map(v=>({role:v.role,content:v.content})),U=await Ll({apiKey:h.current,model:d,messages:N,auditContext:j});n([...E,{role:"assistant",content:U.text,costUsd:U.costUsd,inputTokens:U.inputTokens,outputTokens:U.outputTokens}])}catch(N){n([...E,{role:"assistant",content:"",error:N instanceof Error?N.message:String(N)}])}finally{l(!1)}}function w(){n([])}return c?t.length===0?e.jsxs("div",{className:"p-3 space-y-2 text-xs","data-testid":"copilot-view-root",children:[e.jsx("h2",{className:"text-sm font-semibold",children:"AI co-pilot"}),e.jsx("p",{className:"text-slate-600 leading-snug",children:"Run an audit first. The co-pilot answers questions about the audit's structured data (violations, WCAG criteria, components) — it needs that data to ground its answers."})]}):e.jsxs("div",{className:"p-3 space-y-2 text-xs flex flex-col h-full","data-testid":"copilot-view-root",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold",children:"AI co-pilot"}),e.jsxs("div",{className:"flex items-center gap-3 text-[10px] text-slate-500",children:[e.jsxs("span",{children:["Session cost: $",S.toFixed(4)]}),a.length>0&&e.jsx("button",{type:"button",onClick:w,className:"text-slate-600 hover:text-slate-900 underline",children:"Clear"})]})]}),e.jsxs("p",{className:"text-[11px] text-slate-500 leading-snug",children:["Ask questions about THIS audit (",g.length," violation",g.length===1?"":"s","). The model answers from the structured audit data only — it won't invent findings or check the live page."]}),e.jsxs("div",{ref:x,className:"flex-1 overflow-y-auto space-y-2 border border-slate-200 rounded p-2 bg-white min-h-[200px]","data-testid":"copilot-transcript",children:[a.length===0?e.jsx("p",{className:"text-slate-400 italic text-[11px]",children:`Try: "Which 3 issues are highest priority?" · "Explain finding #1 in plain language" · "What's the cheapest fix on this page?"`}):a.map((f,k)=>e.jsxs("div",{className:f.role==="user"?"border-l-2 border-brand-400 pl-2 py-1":"border-l-2 border-emerald-400 pl-2 py-1",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-wide text-slate-500",children:f.role==="user"?"You":"Co-pilot"}),f.error?e.jsx("p",{className:"text-rose-700 whitespace-pre-wrap",children:f.error}):e.jsx("p",{className:"text-slate-800 whitespace-pre-wrap",children:f.content}),f.role==="assistant"&&f.costUsd!==void 0&&e.jsxs("p",{className:"text-[10px] text-slate-400 mt-1",children:["$",f.costUsd.toFixed(4)," · ",f.inputTokens,"→",f.outputTokens," tok"]})]},k)),o&&e.jsx("div",{className:"border-l-2 border-emerald-200 pl-2 py-1 text-[11px] text-slate-400 italic",children:"Thinking…"})]}),e.jsxs("form",{onSubmit:f=>{f.preventDefault(),L()},className:"flex gap-2",children:[e.jsx("input",{type:"text",value:r,onChange:f=>i(f.target.value),placeholder:"Ask about this audit…",disabled:o,"aria-label":"Co-pilot prompt",className:"flex-1 text-xs border border-slate-300 rounded px-2 py-1.5 disabled:bg-slate-50"}),e.jsx("button",{type:"submit",disabled:o||!r.trim(),className:"text-xs px-3 py-1.5 bg-brand-500 hover:bg-brand-600 text-white rounded disabled:opacity-50",children:o?"Sending…":"Send"})]})]}):e.jsxs("div",{className:"p-3 space-y-2 text-xs","data-testid":"copilot-view-root",children:[e.jsx("h2",{className:"text-sm font-semibold",children:"AI co-pilot"}),e.jsxs("p",{className:"text-slate-600 leading-snug",children:["The co-pilot uses your own Anthropic API key (BYOK) to answer questions about the current audit. Configure your key in ",e.jsx("strong",{children:"Settings → AI"})," to enable."]})]})}function Dl(){const[t,s]=m.useState(null),[a,n]=m.useState(!1),[r,i]=m.useState(null),[o,l]=m.useState(""),[c,u]=m.useState(new Set);async function d(){i(null),n(!0);try{const x=await ae();if(!x){i("No audited tab. Open a page to audit, then return here.");return}const g=await te({type:"AX_TREE_SNAPSHOT_REQUEST",tabId:x});if(!g.ok||!g.nodes){i(g.error??"Snapshot failed for an unknown reason.");return}s(g.nodes)}finally{n(!1)}}function p(x){u(g=>{const j=new Set(g);return j.has(x)?j.delete(x):j.add(x),j})}const h=t&&o?t.filter(x=>x.role.toLowerCase().includes(o.toLowerCase())||x.name.toLowerCase().includes(o.toLowerCase())):t;return e.jsxs("div",{className:"p-3 text-xs flex flex-col h-full","data-testid":"ax-tree-view",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-2 mb-2",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Accessibility tree"}),e.jsx("p",{className:"text-[11px] text-slate-500 leading-snug",children:"Snapshot of the browser's computed AX tree — what screen readers actually consume."})]}),e.jsx("button",{type:"button",onClick:()=>void d(),disabled:a,className:"text-xs px-2 py-1 bg-brand-500 hover:bg-brand-600 text-white rounded disabled:opacity-50",children:a?"Snapshotting…":t?"Re-snapshot":"Snapshot tree"})]}),r&&e.jsx("div",{className:"text-rose-700 text-[11px] mb-2",role:"alert",children:r}),t&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2 mb-2 text-[11px]",children:[e.jsx("input",{type:"text",value:o,onChange:x=>l(x.target.value),placeholder:"Filter by role or name…","aria-label":"Filter ax-tree",className:"flex-1 min-w-[140px] border border-slate-300 rounded px-2 py-1"}),e.jsxs("span",{className:"text-slate-500","data-testid":"ax-tree-node-count",children:[(h==null?void 0:h.length)??0," node",((h==null?void 0:h.length)??0)===1?"":"s"]})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto border border-slate-200 rounded bg-white p-2 font-mono text-[11px]",children:[!t&&!a&&e.jsxs("p",{className:"text-slate-400 italic text-center pt-8",children:["Click ",e.jsx("strong",{children:"Snapshot tree"})," above to capture the audited tab's accessibility tree."]}),t&&h&&e.jsx(Ol,{nodes:t,filtered:h,collapsed:c,onToggle:p})]})]})}function Ol({nodes:t,filtered:s,collapsed:a,onToggle:n}){if(s.length!==t.length)return e.jsx("ul",{role:"tree",className:"space-y-0.5",children:s.map(o=>e.jsx("li",{role:"treeitem",children:e.jsx(la,{node:o,depth:0,collapsed:!1,onToggle:()=>{},hasChildren:!1})},o.nodeId))});const r=new Map;for(const o of t){const l=o.parentId,c=r.get(l)??[];c.push(o),r.set(l,c)}const i=r.get(void 0)??t.filter(o=>!o.parentId);return e.jsx("ul",{role:"tree",className:"space-y-0.5",children:i.map(o=>e.jsx(oa,{node:o,depth:0,byParent:r,collapsed:a,onToggle:n},o.nodeId))})}function oa({node:t,depth:s,byParent:a,collapsed:n,onToggle:r}){const i=a.get(t.nodeId)??[],o=i.length>0,l=n.has(t.nodeId);return e.jsxs("li",{role:"treeitem","aria-expanded":o?!l:void 0,children:[e.jsx(la,{node:t,depth:s,collapsed:l,onToggle:()=>r(t.nodeId),hasChildren:o}),!l&&o&&e.jsx("ul",{role:"group",className:"space-y-0.5",children:i.map(c=>e.jsx(oa,{node:c,depth:s+1,byParent:a,collapsed:n,onToggle:r},c.nodeId))})]})}function la({node:t,depth:s,collapsed:a,onToggle:n,hasChildren:r}){const i=t.properties.filter(o=>o.value!==!1&&o.value!==""&&o.value!==null).slice(0,6);return e.jsxs("div",{style:{paddingLeft:`${s*12}px`},className:`flex items-baseline gap-1.5 py-0.5 hover:bg-slate-50 rounded ${t.ignored?"opacity-40":""}`,children:[r?e.jsx("button",{type:"button",onClick:n,"aria-label":a?"Expand":"Collapse",className:"text-slate-500 hover:text-slate-900 w-3 shrink-0",children:a?"▸":"▾"}):e.jsx("span",{className:"w-3 shrink-0","aria-hidden":"true",children:"·"}),e.jsx("span",{className:"font-semibold text-brand-700",children:t.role}),t.name&&e.jsxs("span",{className:"text-slate-700",children:['"',t.name,'"']}),t.ignored&&e.jsx("span",{className:"text-[10px] px-1 py-0 rounded bg-slate-200 text-slate-600",children:"ignored"}),i.length>0&&e.jsx("span",{className:"text-[10px] text-slate-500",children:i.map(o=>`${o.name}=${String(o.value)}`).join(" · ")})]})}function Ml(){const t=b(u=>u.results),[s,a]=m.useState(!1),[n,r]=m.useState(null),[i,o]=m.useState(null);async function l(){r(null),a(!0);try{const u=await ae();if(!u){r("No audited tab. Open a page first.");return}const d=await ge(u,{type:"DESIGN_SYSTEM_SNAPSHOT_REQUEST",tabId:u});if(!d.ok||!d.tokens||!d.references){r(d.error??"Snapshot failed.");return}const p=new Map;for(const g of t)for(const j of g.violations)p.has(j.target.selector)||p.set(j.target.selector,j.matchKey);const h=d.references.map(g=>({violationMatchKey:p.get(g.selector)??null,referencedTokens:g.referencedTokens})),x=d.tokens;o(Qa(x,h))}finally{a(!1)}}const c=i?qa(i):null;return e.jsxs("div",{className:"p-3 space-y-3 text-xs","data-testid":"design-system-view-root",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Design-system audit"}),e.jsx("p",{className:"text-[11px] text-slate-500 leading-snug",children:"CSS custom-property tokens declared on the audited page + usage rollup. Tokens involved in violations are surfaced first."})]}),e.jsx("button",{type:"button",onClick:()=>void l(),disabled:s,className:"text-xs px-2 py-1 bg-brand-500 hover:bg-brand-600 text-white rounded disabled:opacity-50",children:s?"Snapshotting…":i?"Re-snapshot":"Snapshot tokens"})]}),n&&e.jsx("div",{className:"text-rose-700 text-[11px]",role:"alert",children:n}),c&&e.jsxs("section",{className:"border border-slate-200 rounded p-2 bg-white flex flex-wrap gap-2","data-testid":"design-system-summary",children:[e.jsx(Ae,{label:"Total tokens",value:c.totalTokens}),e.jsx(Ae,{label:"Color tokens",value:c.colorTokens}),e.jsx(Ae,{label:"Used",value:c.usedTokens}),e.jsx(Ae,{label:"Unused",value:c.unusedTokens,tint:c.unusedTokens>0?"amber":"slate"}),e.jsx(Ae,{label:"In violations",value:c.violatingTokens,tint:c.violatingTokens>0?"rose":"slate"})]}),i&&i.length>0?e.jsxs("section",{className:"border border-slate-200 rounded bg-white",children:[e.jsx("h3",{className:"px-3 py-2 text-xs font-semibold uppercase tracking-wide text-slate-500 border-b border-slate-100",children:"Tokens"}),e.jsx("ul",{className:"divide-y divide-slate-100 max-h-[500px] overflow-y-auto",children:i.map(u=>e.jsxs("li",{className:"px-3 py-2 space-y-1","data-testid":"ds-token-row",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[u.token.isColor&&e.jsx("span",{"aria-hidden":"true",className:"w-4 h-4 rounded border border-slate-300 shrink-0",style:{background:u.token.value}}),e.jsx("code",{className:"font-mono text-[11px] font-semibold",children:u.token.name}),e.jsxs("span",{className:"text-[10px] text-slate-500 font-mono break-all",children:["= ",u.token.value]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-[10px] text-slate-500",children:[e.jsxs("span",{children:["declared on ",e.jsx("code",{children:u.token.declaredOn})]}),e.jsx("span",{"aria-hidden":"true",children:"·"}),e.jsxs("span",{children:[u.usageCount," usage",u.usageCount===1?"":"s"]}),u.violationMatchKeys.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("span",{"aria-hidden":"true",children:"·"}),e.jsxs("span",{className:"text-rose-700 font-semibold",children:[u.violationMatchKeys.length," violation",u.violationMatchKeys.length===1?"":"s"]})]})]})]},u.token.name))})]}):i?e.jsx("p",{className:"text-slate-500 italic text-[11px]",children:"No CSS custom-property tokens detected on this page. Design-system audit works best on sites that use a token-based theme (Tailwind v4, Material UI, Radix Theme, etc.)."}):e.jsxs("p",{className:"text-slate-500 italic text-[11px]",children:["Click ",e.jsx("strong",{children:"Snapshot tokens"})," above to walk the audited tab's stylesheets and tally per-token usage."]})]})}function Ae({label:t,value:s,tint:a}){const n={slate:"bg-slate-50 text-slate-700",amber:"bg-amber-50 text-amber-800",rose:"bg-rose-50 text-rose-900"};return e.jsxs("div",{className:`px-2 py-1.5 rounded ${n[a??"slate"]}`,children:[e.jsx("div",{className:"text-[10px] uppercase tracking-wide",children:t}),e.jsx("div",{className:"text-base font-semibold leading-tight",children:s})]})}const it="onboarding:dismissed",ot="onboarding:exportTried",Me="onboarding:collapsed";function Fl(){const t=b(N=>N.tier),s=b(N=>N.results),a=b(N=>N.baselineList),[n,r]=m.useState(!1),[i,o]=m.useState(!1),[l,c]=m.useState(!1),[u,d]=m.useState(!1),[p,h]=m.useState(null);m.useEffect(()=>{(async()=>{const N=await chrome.storage.local.get([it,ot,Me]);r(N[it]===!0),c(N[ot]===!0),typeof N[Me]=="boolean"&&h(N[Me]);const U=["githubRepoUrl","jiraInstanceUrl","azureDevOpsProjectUrl","gitlabProjectUrl"],v=await Promise.all(U.map(_=>te({type:"SETTINGS_GET",key:_})));d(v.some(_=>typeof _.data=="string"&&_.data.length>0)),o(!0)})()},[]);const x=[{id:"license",label:"Activate a license",state:t&&t!=="free"?"done":"pending"},{id:"audit",label:"Run your first audit",state:s.length>0?"done":"pending"},{id:"baseline",label:"Save a baseline",state:a.length>0?"done":"pending"},{id:"export",label:"Try an export (Delta tab → export menu)",state:l?"done":"pending"},{id:"tracker",label:"Set up an issue tracker",state:u?"done":"pending",optional:!0}],g=x.filter(N=>!N.optional),j=x.filter(N=>N.state==="done").length,S=g.filter(N=>N.state==="done").length,L=j===x.length,w=S===g.length;if(!i||n||w)return null;async function C(){r(!0),await chrome.storage.local.set({[it]:!0})}async function f(){const N=!l;c(N),await chrome.storage.local.set({[ot]:N})}const k=p??j>0;async function E(){const N=!k;h(N),await chrome.storage.local.set({[Me]:N})}return e.jsxs("div",{"data-testid":"onboarding-checklist",className:"border border-amber-200 bg-amber-50 rounded px-2.5 py-1.5 m-2 text-xs",role:"region","aria-label":"Onboarding checklist",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("button",{type:"button",onClick:()=>void E(),"aria-expanded":!k,"aria-controls":"onboarding-checklist-body",className:"flex-1 text-left flex items-center gap-1.5 hover:text-amber-950",children:[e.jsx("span",{className:"text-amber-800 text-[10px]","aria-hidden":"true",children:k?"▸":"▾"}),e.jsxs("h2",{className:"text-xs font-semibold text-amber-900",children:["Welcome to wcagcheckr · ",j," of ",x.length," done"]})]}),e.jsx("button",{type:"button",onClick:()=>void C(),"aria-label":"Dismiss onboarding checklist",className:"shrink-0 text-amber-800 hover:text-amber-950 text-base leading-none",children:"✕"})]}),!k&&e.jsxs("div",{id:"onboarding-checklist-body",className:"mt-1.5",children:[e.jsxs("p",{className:"text-[11px] text-amber-800 leading-snug mb-1.5",children:["Quick checklist to get you started. ",L?"All steps complete — nice!":"Auto-checks as you go."]}),e.jsx("ul",{className:"space-y-1",children:x.map(N=>e.jsx("li",{className:"flex items-start gap-1.5",children:N.id==="export"?e.jsxs("label",{className:"flex items-start gap-1.5 cursor-pointer flex-1",children:[e.jsx("input",{type:"checkbox",checked:N.state==="done",onChange:()=>void f(),className:"mt-0.5","aria-label":N.label}),e.jsx("span",{className:N.state==="done"?"line-through text-amber-700":"text-amber-900",children:N.label})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"mt-0.5","aria-hidden":"true",children:N.state==="done"?"✓":"○"}),e.jsxs("span",{className:N.state==="done"?"line-through text-amber-700":"text-amber-900",children:[N.label,N.optional&&e.jsx("span",{className:"text-amber-600 ml-1",children:"(optional)"})]})]})},N.id))})]})]})}function Pl(){const[t,s]=m.useState(""),[a,n]=m.useState(!1),[r,i]=m.useState(null);async function o(){if(!t.trim()){i("Paste a license token first.");return}n(!0),i(null);try{const l=await re({type:"LICENSE_SET_REQUEST",token:t.trim()});if(!(l!=null&&l.validated)){const c=l!=null&&l.seatClaim&&"reason"in l.seatClaim?l.seatClaim.reason:null,u=l!=null&&l.seatClaim&&"hint"in l.seatClaim?l.seatClaim.hint:void 0;i(c==="cap-reached"?`License is at seat capacity. ${u??"Release a seat from another device or contact support."}`:c==="not-found"?"License not found. Check the token and try again.":c==="network"?`Network error: ${l!=null&&l.seatClaim&&"message"in l.seatClaim?l.seatClaim.message:"check connection."}`:"Could not validate this license. Check the token and try again.");return}window.location.reload()}catch(l){i(l instanceof Error?l.message:String(l))}finally{n(!1)}}return e.jsx("div",{className:"flex flex-col h-screen bg-slate-50 text-slate-900 text-sm",children:e.jsx("div",{className:"flex-1 flex items-center justify-center p-6",children:e.jsxs("div",{className:"max-w-md w-full bg-white border border-slate-200 rounded-lg shadow-sm p-6 space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("h1",{className:"text-base font-semibold",children:"Private build phase"}),e.jsx("p",{className:"text-xs text-slate-600 leading-relaxed",children:"wcagcheckr is still in private development. Access is currently limited to issued team licenses. If you've been given a license token, paste it below to activate."}),e.jsxs("p",{className:"text-xs text-slate-600 leading-relaxed",children:["If you don't have a license and would like beta access, email"," ",e.jsx("a",{href:"mailto:cliff@locustware.com?subject=wcagcheckr%20beta%20access",className:"text-brand-700 hover:underline",children:"cliff@locustware.com"}),". The public launch is coming."]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"lockout-license-token",className:"block text-xs font-medium text-slate-700",children:"License token"}),e.jsx("textarea",{id:"lockout-license-token",value:t,onChange:l=>s(l.target.value),placeholder:"Paste your team license token here",rows:3,className:"w-full text-xs font-mono border border-slate-300 rounded px-2 py-1.5 focus:outline focus:outline-2 focus:outline-brand-500",disabled:a}),r&&e.jsx("p",{className:"text-xs text-rose-700",role:"alert",children:r}),e.jsx("button",{type:"button",onClick:()=>void o(),disabled:a||!t.trim(),className:"w-full text-sm px-4 py-2 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50 font-medium",children:a?"Activating…":"Activate license"})]}),e.jsxs("p",{className:"text-[10px] text-slate-400 text-center pt-2 border-t border-slate-100",children:["Already activated? The page should have updated. Try"," ",e.jsx("button",{type:"button",onClick:()=>window.location.reload(),className:"text-brand-700 hover:underline",children:"reloading"})," ","if you don't see the main UI."]})]})})})}function Ql(){const t=b(o=>o.view),s=b(o=>o.userMode),a=b(o=>o.tier),[n,r]=m.useState(!1);m.useEffect(()=>{const o=setTimeout(()=>r(!0),600);return()=>clearTimeout(o)},[]);const i=n&&Ka(a);return m.useEffect(()=>{const o=rn(),c=new URLSearchParams(window.location.search).get("context")==="overlay"?null:chrome.runtime.connect({name:"sidepanel-tracker"}),u=en();As({forceRefresh:!0}).catch(()=>{}),We().catch(()=>{}),nn().catch(()=>{}),on().catch(()=>{}),sn().catch(()=>{}),Ha().then(p=>{b.getState().setAcknowledgedKeys(new Set(p.map(h=>h.matchKey)))}).catch(()=>{}),za().then(p=>{p&&b.setState({siteCrawlReport:p})}).catch(()=>{});const d=p=>{if(p.key!=="Escape")return;const{pinnedMatchKey:h,setPinned:x,results:g}=b.getState();h&&(x(null),ae().then(j=>{var S;j&&de(j,{type:"HIGHLIGHT_CLEAR_REQUEST",tabId:j},(S=g[0])==null?void 0:S.frameId).catch(()=>{})}))};return window.addEventListener("keydown",d),()=>{u(),o.disconnect(),c==null||c.disconnect(),window.removeEventListener("keydown",d)}},[]),i?e.jsxs(e.Fragment,{children:[e.jsx(Pl,{}),e.jsx(Le,{})]}):s===null?e.jsxs(e.Fragment,{children:[e.jsx(Qi,{}),e.jsx(Le,{})]}):s==="owner"?e.jsxs(e.Fragment,{children:[e.jsx(vo,{}),e.jsx(is,{}),e.jsx(Le,{})]}):e.jsxs("div",{className:"flex flex-col h-screen bg-slate-50 text-slate-900 text-sm",children:[e.jsx("a",{href:"#main-content",className:"sr-only focus:not-sr-only focus:fixed focus:top-2 focus:left-2 focus:z-50 focus:bg-white focus:text-slate-900 focus:px-3 focus:py-1.5 focus:rounded focus:shadow focus:outline focus:outline-2 focus:outline-brand-500",children:"Skip to main content"}),e.jsx(Ys,{}),e.jsx(Ls,{}),e.jsx(jn,{}),e.jsx(Fl,{}),e.jsxs("main",{id:"main-content",className:"flex-1 flex flex-col overflow-hidden","aria-label":"wcagcheckr",children:[e.jsx(An,{}),e.jsx($n,{}),e.jsx(Hi,{}),e.jsx(Bi,{}),e.jsx(Un,{}),e.jsx(Vi,{}),e.jsx(Wi,{}),e.jsxs("div",{className:"flex-1 overflow-y-auto",role:"region","aria-label":`${t} view`,children:[t==="matrix"&&e.jsx(Dn,{}),t==="report"&&e.jsx(pi,{}),t==="delta"&&e.jsx(Bs,{}),t==="activity"&&e.jsx(Vs,{}),t==="guided"&&e.jsx(Ci,{}),t==="flows"&&e.jsx(Ti,{}),t==="scorecard"&&e.jsx(Ui,{}),t==="crawl"&&e.jsx(Ks,{}),t==="forensic"&&e.jsx(Qs,{}),t==="compliance"&&e.jsx(pl,{}),t==="schedules"&&e.jsx(bl,{}),t==="risk"&&e.jsx(Sl,{}),t==="copilot"&&e.jsx(_l,{}),t==="ax-tree"&&e.jsx(Dl,{}),t==="wcag3"&&e.jsx(zs,{}),t==="tokens"&&e.jsx(Ml,{})]})]}),e.jsx(qi,{}),e.jsx(zi,{}),e.jsx(Gi,{}),e.jsx(is,{}),e.jsx(Le,{})]})}class Yl extends Ce.Component{constructor(){super(...arguments);At(this,"state",{error:null})}static getDerivedStateFromError(a){return{error:a}}componentDidCatch(a,n){console.error("[side-panel] render crashed",a,n.componentStack)}render(){return this.state.error?e.jsxs("div",{className:"p-4 text-sm bg-red-50 text-red-900 h-full flex flex-col",children:[e.jsx("h2",{className:"font-semibold mb-2",children:"Side panel crashed"}),e.jsx("p",{className:"text-xs mb-3",children:this.state.error.message}),e.jsx("button",{onClick:()=>location.reload(),className:"text-xs px-3 py-1 bg-red-600 text-white rounded hover:bg-red-700 self-start",children:"Reload"})]}):this.props.children}}export{Ql as A,Yl as E,ql as d};
|
|
568
|
+
`)}const gs="aiConfig";function _l(){var C;const t=b(f=>f.results),s=b(f=>f.componentId),[a,n]=m.useState([]),[r,i]=m.useState(""),[o,l]=m.useState(!1),[c,u]=m.useState(!1),[d,p]=m.useState("claude-sonnet-4-6"),h=m.useRef(""),x=m.useRef(null);m.useEffect(()=>{(async()=>{const k=(await chrome.storage.local.get(gs))[gs];h.current=(k==null?void 0:k.apiKey)??"",u(!!(k!=null&&k.apiKey)),k!=null&&k.model&&p(k.model)})()},[]),m.useEffect(()=>{x.current&&(x.current.scrollTop=x.current.scrollHeight)},[a.length]);const g=t.flatMap(f=>f.violations),j=Ul({componentId:s??void 0,pageUrl:(C=t[0])==null?void 0:C.pageUrl,violations:g.map(f=>({ruleId:f.ruleId,wcagCriterion:f.wcagCriterion,wcagLevel:f.wcagLevel,impact:f.impact,description:f.description,target:{selector:f.target.selector,outerHTML:f.target.outerHTML}}))}),S=a.reduce((f,k)=>f+(k.costUsd??0),0);async function L(){const f=r.trim();if(!f||o||!h.current)return;i("");const k={role:"user",content:f},E=[...a,k];n(E),l(!0);try{const N=E.map(v=>({role:v.role,content:v.content})),U=await Ll({apiKey:h.current,model:d,messages:N,auditContext:j});n([...E,{role:"assistant",content:U.text,costUsd:U.costUsd,inputTokens:U.inputTokens,outputTokens:U.outputTokens}])}catch(N){n([...E,{role:"assistant",content:"",error:N instanceof Error?N.message:String(N)}])}finally{l(!1)}}function w(){n([])}return c?t.length===0?e.jsxs("div",{className:"p-3 space-y-2 text-xs","data-testid":"copilot-view-root",children:[e.jsx("h2",{className:"text-sm font-semibold",children:"AI co-pilot"}),e.jsx("p",{className:"text-slate-600 leading-snug",children:"Run an audit first. The co-pilot answers questions about the audit's structured data (violations, WCAG criteria, components) — it needs that data to ground its answers."})]}):e.jsxs("div",{className:"p-3 space-y-2 text-xs flex flex-col h-full","data-testid":"copilot-view-root",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold",children:"AI co-pilot"}),e.jsxs("div",{className:"flex items-center gap-3 text-[10px] text-slate-500",children:[e.jsxs("span",{children:["Session cost: $",S.toFixed(4)]}),a.length>0&&e.jsx("button",{type:"button",onClick:w,className:"text-slate-600 hover:text-slate-900 underline",children:"Clear"})]})]}),e.jsxs("p",{className:"text-[11px] text-slate-500 leading-snug",children:["Ask questions about THIS audit (",g.length," violation",g.length===1?"":"s","). The model answers from the structured audit data only — it won't invent findings or check the live page."]}),e.jsxs("div",{ref:x,className:"flex-1 overflow-y-auto space-y-2 border border-slate-200 rounded p-2 bg-white min-h-[200px]","data-testid":"copilot-transcript",children:[a.length===0?e.jsx("p",{className:"text-slate-400 italic text-[11px]",children:`Try: "Which 3 issues are highest priority?" · "Explain finding #1 in plain language" · "What's the cheapest fix on this page?"`}):a.map((f,k)=>e.jsxs("div",{className:f.role==="user"?"border-l-2 border-brand-400 pl-2 py-1":"border-l-2 border-emerald-400 pl-2 py-1",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-wide text-slate-500",children:f.role==="user"?"You":"Co-pilot"}),f.error?e.jsx("p",{className:"text-rose-700 whitespace-pre-wrap",children:f.error}):e.jsx("p",{className:"text-slate-800 whitespace-pre-wrap",children:f.content}),f.role==="assistant"&&f.costUsd!==void 0&&e.jsxs("p",{className:"text-[10px] text-slate-400 mt-1",children:["$",f.costUsd.toFixed(4)," · ",f.inputTokens,"→",f.outputTokens," tok"]})]},k)),o&&e.jsx("div",{className:"border-l-2 border-emerald-200 pl-2 py-1 text-[11px] text-slate-400 italic",children:"Thinking…"})]}),e.jsxs("form",{onSubmit:f=>{f.preventDefault(),L()},className:"flex gap-2",children:[e.jsx("input",{type:"text",value:r,onChange:f=>i(f.target.value),placeholder:"Ask about this audit…",disabled:o,"aria-label":"Co-pilot prompt",className:"flex-1 text-xs border border-slate-300 rounded px-2 py-1.5 disabled:bg-slate-50"}),e.jsx("button",{type:"submit",disabled:o||!r.trim(),className:"text-xs px-3 py-1.5 bg-brand-500 hover:bg-brand-600 text-white rounded disabled:opacity-50",children:o?"Sending…":"Send"})]})]}):e.jsxs("div",{className:"p-3 space-y-2 text-xs","data-testid":"copilot-view-root",children:[e.jsx("h2",{className:"text-sm font-semibold",children:"AI co-pilot"}),e.jsxs("p",{className:"text-slate-600 leading-snug",children:["The co-pilot uses your own Anthropic API key (BYOK) to answer questions about the current audit. Configure your key in ",e.jsx("strong",{children:"Settings → AI"})," to enable."]})]})}function Dl(){const[t,s]=m.useState(null),[a,n]=m.useState(!1),[r,i]=m.useState(null),[o,l]=m.useState(""),[c,u]=m.useState(new Set);async function d(){i(null),n(!0);try{const x=await ae();if(!x){i("No audited tab. Open a page to audit, then return here.");return}const g=await te({type:"AX_TREE_SNAPSHOT_REQUEST",tabId:x});if(!g.ok||!g.nodes){i(g.error??"Snapshot failed for an unknown reason.");return}s(g.nodes)}finally{n(!1)}}function p(x){u(g=>{const j=new Set(g);return j.has(x)?j.delete(x):j.add(x),j})}const h=t&&o?t.filter(x=>x.role.toLowerCase().includes(o.toLowerCase())||x.name.toLowerCase().includes(o.toLowerCase())):t;return e.jsxs("div",{className:"p-3 text-xs flex flex-col h-full","data-testid":"ax-tree-view",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-2 mb-2",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Accessibility tree"}),e.jsx("p",{className:"text-[11px] text-slate-500 leading-snug",children:"Snapshot of the browser's computed AX tree — what screen readers actually consume."})]}),e.jsx("button",{type:"button",onClick:()=>void d(),disabled:a,className:"text-xs px-2 py-1 bg-brand-500 hover:bg-brand-600 text-white rounded disabled:opacity-50",children:a?"Snapshotting…":t?"Re-snapshot":"Snapshot tree"})]}),r&&e.jsx("div",{className:"text-rose-700 text-[11px] mb-2",role:"alert",children:r}),t&&e.jsxs("div",{className:"flex flex-wrap items-center gap-2 mb-2 text-[11px]",children:[e.jsx("input",{type:"text",value:o,onChange:x=>l(x.target.value),placeholder:"Filter by role or name…","aria-label":"Filter ax-tree",className:"flex-1 min-w-[140px] border border-slate-300 rounded px-2 py-1"}),e.jsxs("span",{className:"text-slate-500","data-testid":"ax-tree-node-count",children:[(h==null?void 0:h.length)??0," node",((h==null?void 0:h.length)??0)===1?"":"s"]})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto border border-slate-200 rounded bg-white p-2 font-mono text-[11px]",children:[!t&&!a&&e.jsxs("p",{className:"text-slate-400 italic text-center pt-8",children:["Click ",e.jsx("strong",{children:"Snapshot tree"})," above to capture the audited tab's accessibility tree."]}),t&&h&&e.jsx(Ol,{nodes:t,filtered:h,collapsed:c,onToggle:p})]})]})}function Ol({nodes:t,filtered:s,collapsed:a,onToggle:n}){if(s.length!==t.length)return e.jsx("ul",{role:"tree",className:"space-y-0.5",children:s.map(o=>e.jsx("li",{role:"treeitem",children:e.jsx(la,{node:o,depth:0,collapsed:!1,onToggle:()=>{},hasChildren:!1})},o.nodeId))});const r=new Map;for(const o of t){const l=o.parentId,c=r.get(l)??[];c.push(o),r.set(l,c)}const i=r.get(void 0)??t.filter(o=>!o.parentId);return e.jsx("ul",{role:"tree",className:"space-y-0.5",children:i.map(o=>e.jsx(oa,{node:o,depth:0,byParent:r,collapsed:a,onToggle:n},o.nodeId))})}function oa({node:t,depth:s,byParent:a,collapsed:n,onToggle:r}){const i=a.get(t.nodeId)??[],o=i.length>0,l=n.has(t.nodeId);return e.jsxs("li",{role:"treeitem","aria-expanded":o?!l:void 0,children:[e.jsx(la,{node:t,depth:s,collapsed:l,onToggle:()=>r(t.nodeId),hasChildren:o}),!l&&o&&e.jsx("ul",{role:"group",className:"space-y-0.5",children:i.map(c=>e.jsx(oa,{node:c,depth:s+1,byParent:a,collapsed:n,onToggle:r},c.nodeId))})]})}function la({node:t,depth:s,collapsed:a,onToggle:n,hasChildren:r}){const i=t.properties.filter(o=>o.value!==!1&&o.value!==""&&o.value!==null).slice(0,6);return e.jsxs("div",{style:{paddingLeft:`${s*12}px`},className:`flex items-baseline gap-1.5 py-0.5 hover:bg-slate-50 rounded ${t.ignored?"opacity-40":""}`,children:[r?e.jsx("button",{type:"button",onClick:n,"aria-label":a?"Expand":"Collapse",className:"text-slate-500 hover:text-slate-900 w-3 shrink-0",children:a?"▸":"▾"}):e.jsx("span",{className:"w-3 shrink-0","aria-hidden":"true",children:"·"}),e.jsx("span",{className:"font-semibold text-brand-700",children:t.role}),t.name&&e.jsxs("span",{className:"text-slate-700",children:['"',t.name,'"']}),t.ignored&&e.jsx("span",{className:"text-[10px] px-1 py-0 rounded bg-slate-200 text-slate-600",children:"ignored"}),i.length>0&&e.jsx("span",{className:"text-[10px] text-slate-500",children:i.map(o=>`${o.name}=${String(o.value)}`).join(" · ")})]})}function Ml(){const t=b(u=>u.results),[s,a]=m.useState(!1),[n,r]=m.useState(null),[i,o]=m.useState(null);async function l(){r(null),a(!0);try{const u=await ae();if(!u){r("No audited tab. Open a page first.");return}const d=await ge(u,{type:"DESIGN_SYSTEM_SNAPSHOT_REQUEST",tabId:u});if(!d.ok||!d.tokens||!d.references){r(d.error??"Snapshot failed.");return}const p=new Map;for(const g of t)for(const j of g.violations)p.has(j.target.selector)||p.set(j.target.selector,j.matchKey);const h=d.references.map(g=>({violationMatchKey:p.get(g.selector)??null,referencedTokens:g.referencedTokens})),x=d.tokens;o(Qa(x,h))}finally{a(!1)}}const c=i?qa(i):null;return e.jsxs("div",{className:"p-3 space-y-3 text-xs","data-testid":"design-system-view-root",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Design-system audit"}),e.jsx("p",{className:"text-[11px] text-slate-500 leading-snug",children:"CSS custom-property tokens declared on the audited page + usage rollup. Tokens involved in violations are surfaced first."})]}),e.jsx("button",{type:"button",onClick:()=>void l(),disabled:s,className:"text-xs px-2 py-1 bg-brand-500 hover:bg-brand-600 text-white rounded disabled:opacity-50",children:s?"Snapshotting…":i?"Re-snapshot":"Snapshot tokens"})]}),n&&e.jsx("div",{className:"text-rose-700 text-[11px]",role:"alert",children:n}),c&&e.jsxs("section",{className:"border border-slate-200 rounded p-2 bg-white flex flex-wrap gap-2","data-testid":"design-system-summary",children:[e.jsx(Ae,{label:"Total tokens",value:c.totalTokens}),e.jsx(Ae,{label:"Color tokens",value:c.colorTokens}),e.jsx(Ae,{label:"Used",value:c.usedTokens}),e.jsx(Ae,{label:"Unused",value:c.unusedTokens,tint:c.unusedTokens>0?"amber":"slate"}),e.jsx(Ae,{label:"In violations",value:c.violatingTokens,tint:c.violatingTokens>0?"rose":"slate"})]}),i&&i.length>0?e.jsxs("section",{className:"border border-slate-200 rounded bg-white",children:[e.jsx("h3",{className:"px-3 py-2 text-xs font-semibold uppercase tracking-wide text-slate-500 border-b border-slate-100",children:"Tokens"}),e.jsx("ul",{className:"divide-y divide-slate-100 max-h-[500px] overflow-y-auto",children:i.map(u=>e.jsxs("li",{className:"px-3 py-2 space-y-1","data-testid":"ds-token-row",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[u.token.isColor&&e.jsx("span",{"aria-hidden":"true",className:"w-4 h-4 rounded border border-slate-300 shrink-0",style:{background:u.token.value}}),e.jsx("code",{className:"font-mono text-[11px] font-semibold",children:u.token.name}),e.jsxs("span",{className:"text-[10px] text-slate-500 font-mono break-all",children:["= ",u.token.value]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-[10px] text-slate-500",children:[e.jsxs("span",{children:["declared on ",e.jsx("code",{children:u.token.declaredOn})]}),e.jsx("span",{"aria-hidden":"true",children:"·"}),e.jsxs("span",{children:[u.usageCount," usage",u.usageCount===1?"":"s"]}),u.violationMatchKeys.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("span",{"aria-hidden":"true",children:"·"}),e.jsxs("span",{className:"text-rose-700 font-semibold",children:[u.violationMatchKeys.length," violation",u.violationMatchKeys.length===1?"":"s"]})]})]})]},u.token.name))})]}):i?e.jsx("p",{className:"text-slate-500 italic text-[11px]",children:"No CSS custom-property tokens detected on this page. Design-system audit works best on sites that use a token-based theme (Tailwind v4, Material UI, Radix Theme, etc.)."}):e.jsxs("p",{className:"text-slate-500 italic text-[11px]",children:["Click ",e.jsx("strong",{children:"Snapshot tokens"})," above to walk the audited tab's stylesheets and tally per-token usage."]})]})}function Ae({label:t,value:s,tint:a}){const n={slate:"bg-slate-50 text-slate-700",amber:"bg-amber-50 text-amber-800",rose:"bg-rose-50 text-rose-900"};return e.jsxs("div",{className:`px-2 py-1.5 rounded ${n[a??"slate"]}`,children:[e.jsx("div",{className:"text-[10px] uppercase tracking-wide",children:t}),e.jsx("div",{className:"text-base font-semibold leading-tight",children:s})]})}const it="onboarding:dismissed",ot="onboarding:exportTried",Me="onboarding:collapsed";function Fl(){const t=b(N=>N.tier),s=b(N=>N.results),a=b(N=>N.baselineList),[n,r]=m.useState(!1),[i,o]=m.useState(!1),[l,c]=m.useState(!1),[u,d]=m.useState(!1),[p,h]=m.useState(null);m.useEffect(()=>{(async()=>{const N=await chrome.storage.local.get([it,ot,Me]);r(N[it]===!0),c(N[ot]===!0),typeof N[Me]=="boolean"&&h(N[Me]);const U=["githubRepoUrl","jiraInstanceUrl","azureDevOpsProjectUrl","gitlabProjectUrl"],v=await Promise.all(U.map(_=>te({type:"SETTINGS_GET",key:_})));d(v.some(_=>typeof _.data=="string"&&_.data.length>0)),o(!0)})()},[]);const x=[{id:"license",label:"Activate a license",state:t&&t!=="free"?"done":"pending"},{id:"audit",label:"Run your first audit",state:s.length>0?"done":"pending"},{id:"baseline",label:"Save a baseline",state:a.length>0?"done":"pending"},{id:"export",label:"Try an export (Delta tab → export menu)",state:l?"done":"pending"},{id:"tracker",label:"Set up an issue tracker",state:u?"done":"pending",optional:!0}],g=x.filter(N=>!N.optional),j=x.filter(N=>N.state==="done").length,S=g.filter(N=>N.state==="done").length,L=j===x.length,w=S===g.length;if(!i||n||w)return null;async function C(){r(!0),await chrome.storage.local.set({[it]:!0})}async function f(){const N=!l;c(N),await chrome.storage.local.set({[ot]:N})}const k=p??j>0;async function E(){const N=!k;h(N),await chrome.storage.local.set({[Me]:N})}return e.jsxs("div",{"data-testid":"onboarding-checklist",className:"border border-amber-200 bg-amber-50 rounded px-2.5 py-1.5 m-2 text-xs",role:"region","aria-label":"Onboarding checklist",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("button",{type:"button",onClick:()=>void E(),"aria-expanded":!k,"aria-controls":"onboarding-checklist-body",className:"flex-1 text-left flex items-center gap-1.5 hover:text-amber-950",children:[e.jsx("span",{className:"text-amber-800 text-[10px]","aria-hidden":"true",children:k?"▸":"▾"}),e.jsxs("h2",{className:"text-xs font-semibold text-amber-900",children:["Welcome to wcagcheckr · ",j," of ",x.length," done"]})]}),e.jsx("button",{type:"button",onClick:()=>void C(),"aria-label":"Dismiss onboarding checklist",className:"shrink-0 text-amber-800 hover:text-amber-950 text-base leading-none",children:"✕"})]}),!k&&e.jsxs("div",{id:"onboarding-checklist-body",className:"mt-1.5",children:[e.jsxs("p",{className:"text-[11px] text-amber-800 leading-snug mb-1.5",children:["Quick checklist to get you started. ",L?"All steps complete — nice!":"Auto-checks as you go."]}),e.jsx("ul",{className:"space-y-1",children:x.map(N=>e.jsx("li",{className:"flex items-start gap-1.5",children:N.id==="export"?e.jsxs("label",{className:"flex items-start gap-1.5 cursor-pointer flex-1",children:[e.jsx("input",{type:"checkbox",checked:N.state==="done",onChange:()=>void f(),className:"mt-0.5","aria-label":N.label}),e.jsx("span",{className:N.state==="done"?"line-through text-amber-700":"text-amber-900",children:N.label})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"mt-0.5","aria-hidden":"true",children:N.state==="done"?"✓":"○"}),e.jsxs("span",{className:N.state==="done"?"line-through text-amber-700":"text-amber-900",children:[N.label,N.optional&&e.jsx("span",{className:"text-amber-600 ml-1",children:"(optional)"})]})]})},N.id))})]})]})}function Pl(){const[t,s]=m.useState(""),[a,n]=m.useState(!1),[r,i]=m.useState(null);async function o(){if(!t.trim()){i("Paste a license token first.");return}n(!0),i(null);try{const l=await re({type:"LICENSE_SET_REQUEST",token:t.trim()});if(!(l!=null&&l.validated)){const c=l!=null&&l.seatClaim&&"reason"in l.seatClaim?l.seatClaim.reason:null,u=l!=null&&l.seatClaim&&"hint"in l.seatClaim?l.seatClaim.hint:void 0;i(c==="cap-reached"?`License is at seat capacity. ${u??"Release a seat from another device or contact support."}`:c==="not-found"?"License not found. Check the token and try again.":c==="network"?`Network error: ${l!=null&&l.seatClaim&&"message"in l.seatClaim?l.seatClaim.message:"check connection."}`:"Could not validate this license. Check the token and try again.");return}window.location.reload()}catch(l){i(l instanceof Error?l.message:String(l))}finally{n(!1)}}return e.jsx("div",{className:"flex flex-col h-screen bg-slate-50 text-slate-900 text-sm",children:e.jsx("div",{className:"flex-1 flex items-center justify-center p-6",children:e.jsxs("div",{className:"max-w-md w-full bg-white border border-slate-200 rounded-lg shadow-sm p-6 space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("h1",{className:"text-base font-semibold",children:"Private build phase"}),e.jsx("p",{className:"text-xs text-slate-600 leading-relaxed",children:"wcagcheckr is still in private development. Access is currently limited to issued team licenses. If you've been given a license token, paste it below to activate."}),e.jsxs("p",{className:"text-xs text-slate-600 leading-relaxed",children:["If you don't have a license and would like beta access, email"," ",e.jsx("a",{href:"mailto:cliff@locustware.com?subject=wcagcheckr%20beta%20access",className:"text-brand-700 hover:underline",children:"cliff@locustware.com"}),". The public launch is coming."]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"lockout-license-token",className:"block text-xs font-medium text-slate-700",children:"License token"}),e.jsx("textarea",{id:"lockout-license-token",value:t,onChange:l=>s(l.target.value),placeholder:"Paste your team license token here",rows:3,className:"w-full text-xs font-mono border border-slate-300 rounded px-2 py-1.5 focus:outline focus:outline-2 focus:outline-brand-500",disabled:a}),r&&e.jsx("p",{className:"text-xs text-rose-700",role:"alert",children:r}),e.jsx("button",{type:"button",onClick:()=>void o(),disabled:a||!t.trim(),className:"w-full text-sm px-4 py-2 bg-brand-500 text-white rounded hover:bg-brand-600 disabled:opacity-50 font-medium",children:a?"Activating…":"Activate license"})]}),e.jsxs("p",{className:"text-[10px] text-slate-400 text-center pt-2 border-t border-slate-100",children:["Already activated? The page should have updated. Try"," ",e.jsx("button",{type:"button",onClick:()=>window.location.reload(),className:"text-brand-700 hover:underline",children:"reloading"})," ","if you don't see the main UI."]})]})})})}function Ql(){const t=b(o=>o.view),s=b(o=>o.userMode),a=b(o=>o.tier),[n,r]=m.useState(!1);m.useEffect(()=>{const o=setTimeout(()=>r(!0),600);return()=>clearTimeout(o)},[]);const i=n&&Ka(a);return m.useEffect(()=>{const o=rn(),c=new URLSearchParams(window.location.search).get("context")==="overlay"?null:chrome.runtime.connect({name:"sidepanel-tracker"}),u=en();As({forceRefresh:!0}).catch(()=>{}),We().catch(()=>{}),nn().catch(()=>{}),on().catch(()=>{}),sn().catch(()=>{}),Ha().then(p=>{b.getState().setAcknowledgedKeys(new Set(p.map(h=>h.matchKey)))}).catch(()=>{}),za().then(p=>{p&&b.setState({siteCrawlReport:p})}).catch(()=>{});const d=p=>{if(p.key!=="Escape")return;const{pinnedMatchKey:h,setPinned:x,results:g}=b.getState();h&&(x(null),ae().then(j=>{var S;j&&de(j,{type:"HIGHLIGHT_CLEAR_REQUEST",tabId:j},(S=g[0])==null?void 0:S.frameId).catch(()=>{})}))};return window.addEventListener("keydown",d),()=>{u(),o.disconnect(),c==null||c.disconnect(),window.removeEventListener("keydown",d)}},[]),i?e.jsxs(e.Fragment,{children:[e.jsx(Pl,{}),e.jsx(Le,{})]}):s===null?e.jsxs(e.Fragment,{children:[e.jsx(Qi,{}),e.jsx(Le,{})]}):s==="owner"?e.jsxs(e.Fragment,{children:[e.jsx(vo,{}),e.jsx(is,{}),e.jsx(Le,{})]}):e.jsxs("div",{className:"flex flex-col h-screen bg-slate-50 text-slate-900 text-sm",children:[e.jsx("a",{href:"#main-content",className:"sr-only focus:not-sr-only focus:fixed focus:top-2 focus:left-2 focus:z-50 focus:bg-white focus:text-slate-900 focus:px-3 focus:py-1.5 focus:rounded focus:shadow focus:outline focus:outline-2 focus:outline-brand-500",children:"Skip to main content"}),e.jsx(Ys,{}),e.jsx(Ls,{}),e.jsx(jn,{}),e.jsx(Fl,{}),e.jsxs("main",{id:"main-content",className:"flex-1 flex flex-col overflow-hidden","aria-label":"wcagcheckr",children:[t==="matrix"&&e.jsxs(e.Fragment,{children:[e.jsx(An,{}),e.jsx($n,{}),e.jsx(Hi,{}),e.jsx(Bi,{})]}),e.jsx(Un,{}),e.jsx(Vi,{}),e.jsx(Wi,{}),e.jsxs("div",{className:"flex-1 overflow-y-auto",role:"region","aria-label":`${t} view`,children:[t==="matrix"&&e.jsx(Dn,{}),t==="report"&&e.jsx(pi,{}),t==="delta"&&e.jsx(Bs,{}),t==="activity"&&e.jsx(Vs,{}),t==="guided"&&e.jsx(Ci,{}),t==="flows"&&e.jsx(Ti,{}),t==="scorecard"&&e.jsx(Ui,{}),t==="crawl"&&e.jsx(Ks,{}),t==="forensic"&&e.jsx(Qs,{}),t==="compliance"&&e.jsx(pl,{}),t==="schedules"&&e.jsx(bl,{}),t==="risk"&&e.jsx(Sl,{}),t==="copilot"&&e.jsx(_l,{}),t==="ax-tree"&&e.jsx(Dl,{}),t==="wcag3"&&e.jsx(zs,{}),t==="tokens"&&e.jsx(Ml,{})]})]}),e.jsx(qi,{}),e.jsx(zi,{}),e.jsx(Gi,{}),e.jsx(is,{}),e.jsx(Le,{})]})}class Yl extends Ce.Component{constructor(){super(...arguments);At(this,"state",{error:null})}static getDerivedStateFromError(a){return{error:a}}componentDidCatch(a,n){console.error("[side-panel] render crashed",a,n.componentStack)}render(){return this.state.error?e.jsxs("div",{className:"p-4 text-sm bg-red-50 text-red-900 h-full flex flex-col",children:[e.jsx("h2",{className:"font-semibold mb-2",children:"Side panel crashed"}),e.jsx("p",{className:"text-xs mb-3",children:this.state.error.message}),e.jsx("button",{onClick:()=>location.reload(),className:"text-xs px-3 py-1 bg-red-600 text-white rounded hover:bg-red-700 self-start",children:"Reload"})]}):this.props.children}}export{Ql as A,Yl as E,ql as d};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ErrorBoundary-
|
|
2
|
-
import{_ as b}from"./diff-DA41zYPc.js";import{r as y}from"./crash-reporter-Dc5lvxvY.js";async function h(t){var l,u;if(t.results.length===0)return;let i;if(t.componentId){const e=await chrome.storage.local.get("igtRuns"),r=((e==null?void 0:e.igtRuns)??{})[t.componentId]??{};i=Object.values(r)}let s,c;const o=((l=t.results[0])==null?void 0:l.pageUrl)??((u=t.results[0])==null?void 0:u.scope)??"";if(o){const{getDismissalsForUrl:e}=await b(async()=>{const{getDismissalsForUrl:n}=await import("./ErrorBoundary-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ErrorBoundary-Drje7b7o.js","assets/styles-DbXz4mi-.js","assets/_commonjsHelpers-Cpj98o6Y.js","assets/crash-reporter-Dc5lvxvY.js","assets/ai-usage-log-DBBVxutJ.js","assets/styles-bqpgR4OF.css","assets/scheduled-audit-runner-QJANEKWM.js","assets/diff-DA41zYPc.js","assets/design-system-audit-DpxJrxnb.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{_ as b}from"./diff-DA41zYPc.js";import{r as y}from"./crash-reporter-Dc5lvxvY.js";async function h(t){var l,u;if(t.results.length===0)return;let i;if(t.componentId){const e=await chrome.storage.local.get("igtRuns"),r=((e==null?void 0:e.igtRuns)??{})[t.componentId]??{};i=Object.values(r)}let s,c;const o=((l=t.results[0])==null?void 0:l.pageUrl)??((u=t.results[0])==null?void 0:u.scope)??"";if(o){const{getDismissalsForUrl:e}=await b(async()=>{const{getDismissalsForUrl:n}=await import("./ErrorBoundary-Drje7b7o.js").then(a=>a.d);return{getDismissalsForUrl:n}},__vite__mapDeps([0,1,2,3,4,5,6,7,8])),m=await e(o);s=Object.keys(m);const{getResolutionsForPage:r}=await b(async()=>{const{getResolutionsForPage:n}=await import("./scheduled-audit-runner-QJANEKWM.js").then(a=>a.aC);return{getResolutionsForPage:n}},__vite__mapDeps([6,7,3,4]));c=await r(o)}const p=await y({type:"EXPORT_REQUEST",format:"ai-prompt",results:t.results,delta:t.delta??void 0,manualRuns:i,siteCrawlReport:t.siteCrawlReport??void 0,dismissedKeys:s,incompleteResolutions:c});try{await navigator.clipboard.writeText(p.content)}catch{}const g=`<!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-DbXz4mi-.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-DbXz4mi-.js";import{E as i,A as s}from"./ErrorBoundary-Drje7b7o.js";import{i as m}from"./crash-reporter-Dc5lvxvY.js";import"./_commonjsHelpers-Cpj98o6Y.js";import"./ai-usage-log-DBBVxutJ.js";import"./scheduled-audit-runner-QJANEKWM.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 +1 @@
|
|
|
1
|
-
import"./modulepreload-polyfill-B5Qt9EMX.js";import{c as t,j as r,R as e}from"./styles-DbXz4mi-.js";import{E as i,A as s}from"./ErrorBoundary-
|
|
1
|
+
import"./modulepreload-polyfill-B5Qt9EMX.js";import{c as t,j as r,R as e}from"./styles-DbXz4mi-.js";import{E as i,A as s}from"./ErrorBoundary-Drje7b7o.js";import{i as m}from"./crash-reporter-Dc5lvxvY.js";import"./_commonjsHelpers-Cpj98o6Y.js";import"./ai-usage-log-DBBVxutJ.js";import"./scheduled-audit-runner-QJANEKWM.js";import"./diff-DA41zYPc.js";import"./design-system-audit-DpxJrxnb.js";m("side-panel");const o=document.getElementById("root");if(!o)throw new Error("side-panel: #root not found");t(o).render(r.jsx(e.StrictMode,{children:r.jsx(i,{children:r.jsx(s,{})})}));
|
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-ts8aqBry.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-QJANEKWM.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-Drje7b7o.js">
|
|
16
16
|
<link rel="stylesheet" crossorigin href="/assets/styles-bqpgR4OF.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.163",
|
|
6
|
+
"version_name": "1.0.0-rc.163",
|
|
7
7
|
"author": "Locustware",
|
|
8
8
|
"homepage_url": "https://wcagcheckr.com",
|
|
9
9
|
"icons": {
|
package/dist/side-panel/App.tsx
CHANGED
|
@@ -214,10 +214,25 @@ export function App() {
|
|
|
214
214
|
className="flex-1 flex flex-col overflow-hidden"
|
|
215
215
|
aria-label="wcagcheckr"
|
|
216
216
|
>
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
217
|
+
{/* rc.163 — Audit-launching surface (mode picker, throttle, target
|
|
218
|
+
chooser, visualizer toggles, storybook hint, resume banner) is
|
|
219
|
+
only relevant on the Dashboard, where the user is configuring
|
|
220
|
+
and starting an audit. On Findings and the other specialized
|
|
221
|
+
views these widgets just clutter the screen — Cliff: "remove
|
|
222
|
+
the form fields from the findings tab — distracting and
|
|
223
|
+
serves no real purpose being there — the tab will be better
|
|
224
|
+
fully focused on the findings."
|
|
225
|
+
Progress / error / AI-failure banners stay GLOBAL because
|
|
226
|
+
they're audit-state alerts the user needs to see regardless
|
|
227
|
+
of which view they happened to navigate to. */}
|
|
228
|
+
{view === 'matrix' && (
|
|
229
|
+
<>
|
|
230
|
+
<AuditControls />
|
|
231
|
+
<VisualizerTools />
|
|
232
|
+
<StorybookHint />
|
|
233
|
+
<ResumeAuditBanner />
|
|
234
|
+
</>
|
|
235
|
+
)}
|
|
221
236
|
<ProgressBar />
|
|
222
237
|
<ErrorBanner />
|
|
223
238
|
<AiFailureBanner />
|
|
@@ -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-CXsMmM59.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-QJANEKWM.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-Drje7b7o.js">
|
|
17
17
|
<link rel="stylesheet" crossorigin href="/assets/styles-bqpgR4OF.css">
|
|
18
18
|
</head>
|
|
19
19
|
<body class="m-0 p-0">
|
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.163",
|
|
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",
|