@wcag-checkr/ci 1.0.10 → 1.0.12
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-D-5bMIZq.js +594 -0
- package/dist/assets/{ai-usage-log-CYuyLsU4.js → ai-usage-log-C9Opn0x0.js} +1 -1
- package/dist/assets/{content-script.ts-CsBWyYDh.js → content-script.ts-DxtHl1_w.js} +1 -1
- package/dist/assets/{content-script.ts-loader-H5dU9ywW.js → content-script.ts-loader-CdztdNRK.js} +1 -1
- package/dist/assets/{copy-ai-fixer-prompt-CPoiD1Jp.js → copy-ai-fixer-prompt-tOtbF2rw.js} +2 -2
- package/dist/assets/{crash-reporter-KD5f4utB.js → crash-reporter-DAZnNefT.js} +1 -1
- package/dist/assets/{devtools-panel-DnGlvUWo.js → devtools-panel-DrW08BJr.js} +1 -1
- package/dist/assets/{diff-Dc5xUcCG.js → diff-CECbooHD.js} +1 -1
- package/dist/assets/{options-BXcWL5FW.js → options-DpPJFAfc.js} +1 -1
- package/dist/assets/{parallel-tab-flow-BmRaOzXY.js → parallel-tab-flow-f0rYsTcq.js} +1 -1
- package/dist/assets/{rubric-config-client-VUdHdJxq.js → rubric-config-client-CEBmuFV7.js} +1 -1
- package/dist/assets/{scheduled-audit-runner-D_ZjzHg0.js → scheduled-audit-runner-EQBltZPz.js} +15 -15
- package/dist/assets/{service-worker.ts-CnfhezBo.js → service-worker.ts-BcgJ4Lq9.js} +2 -2
- package/dist/assets/side-panel-C3zieKmW.js +4 -0
- package/dist/assets/{site-report-renderer-Cy-J72oi.js → site-report-renderer-C3U9cFY3.js} +1 -1
- package/dist/assets/styles-8UI6xBiw.css +1 -0
- package/dist/assets/{styles-Bik0yRU1.js → styles-uesms5w-.js} +1 -1
- package/dist/assets/{tier-config-client-CT-oOti3.js → tier-config-client-CGmK5CXV.js} +1 -1
- package/dist/devtools/panel.html +8 -8
- package/dist/manifest.json +5 -5
- package/dist/options/options.html +6 -6
- package/dist/service-worker-loader.js +1 -1
- package/dist/side-panel/side-panel.html +11 -11
- package/package.json +1 -1
- package/dist/assets/ErrorBoundary-Dio2MH5c.js +0 -594
- package/dist/assets/side-panel-D3xkdQNu.js +0 -4
- package/dist/assets/styles-wT2ZFAYL.css +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ai-usage-log-
|
|
2
|
-
import{_ as F}from"./preload-helper-D7HrI6pR.js";import{as as U,at as v,g as J,M as Z,au as ee,av as te,aw as re,ax as ae,ay as ne,az as oe,aA as se,aB as ie,aC as le,aD as ce,aE as de,aF as ue,aG as fe,am as ge,aH as pe,aI as he,aJ as Ee,aK as me,aL as Se,aM as Te,B as C,aN as k,aO as ye,aP as Re,aQ as K,aR as Ie,aS as we,aT as Ae,aU as Ce}from"./scheduled-audit-runner-D_ZjzHg0.js";import{m as G,b as m,r as _e}from"./diff-Dc5xUcCG.js";import{w as be,r as Pe,a as ke}from"./tier-config-client-CT-oOti3.js";import{w as Oe,r as Ue,a as ve}from"./rubric-config-client-VUdHdJxq.js";import{o as g,m as Ne,n as xe,c as h,f as _,i as Le,p as De,h as Q,k as $e}from"./crash-reporter-KD5f4utB.js";import{z as A,C as Fe}from"./ai-usage-log-CYuyLsU4.js";const Ge=h("support-messenger"),Me="https://api.wcagcheckr.com/v1/products/wcagcheckr/support",O="support:rate-window",Ve=5,He=10*60*1e3,We=2,Be="wcagcheckr",M="storybook:lastDetected";async function Ke(e){if(!e)return;const t=await chrome.runtime.getPlatformInfo(),a=(await chrome.storage.local.get(M))[M];return{extensionVersion:chrome.runtime.getManifest().version,platform:t,storybookDetected:a!=null&&a.detected?a.version??"detected":"none",licenseTier:await m(),logTail:Ne(xe())}}async function Qe(e=Date.now()){const r=((await chrome.storage.local.get(O))[O]??[]).filter(a=>e-a<He);return r.length>=Ve?!1:(r.push(e),await chrome.storage.local.set({[O]:r}),!0)}async function j(e,t=0){try{const r=await fetch(Me,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!r.ok)throw new Error(`http ${r.status}`);const a=await r.json();if(!a.success)throw new Error(a.error??"server returned success=false");return{ticketRef:a.ticketRef??""}}catch(r){if(t<We){const a=(t+1)*1e3;return await new Promise(n=>setTimeout(n,a)),j(e,t+1)}throw r}}function je(){return g("SUPPORT_MESSAGE_REQUEST",async e=>{if(!await Qe())return{type:"SUPPORT_MESSAGE_RESPONSE",success:!1,error:G("NETWORK","Rate limit reached. Try again in 10 minutes.",!0)};try{const t=await Ke(e.includeContext);return{type:"SUPPORT_MESSAGE_RESPONSE",success:!0,ticketRef:(await j({productSlug:Be,subject:e.subject,body:e.body,replyEmail:e.replyEmail,context:t,extensionVersion:chrome.runtime.getManifest().version,timestamp:new Date().toISOString()})).ticketRef}}catch(t){Ge.error("send failed",t);const r=t instanceof Error?t.message:String(t);return{type:"SUPPORT_MESSAGE_RESPONSE",success:!1,error:G("NETWORK",r,!0)}}})}const q=h("ai-color-suggester");async function qe(e,t,r=[]){if(!t.enabled||e.length===0)return{results:[],totalCostUsd:0,capExceeded:!1};const a=U(t);if(!a.ok)return{results:[],totalCostUsd:0,capExceeded:!1};const n=a.client,o=v(t.costCapUsd),i=[];for(const l of e){if(!o.canCharge())break;try{const d=await n.suggestColorFix({foreground:l.foreground,background:l.background,fontSize:l.fontSize,fontWeight:l.fontWeight,targetLevel:l.targetLevel,paletteHints:r});o.recordCharge(d.costUsd),d.verdict==="suggested"&&d.candidates.length>0&&i.push({matchKey:l.matchKey,suggestions:d.candidates,reasoning:d.reasoning,costUsd:d.costUsd})}catch(d){q.warn(`color-fix suggestion failed for ${l.matchKey}`,d)}}return{results:i,totalCostUsd:o.state.spentUsd,capExceeded:o.state.exceeded}}async function Xe(){const e=await chrome.storage.local.get("aiConfig");return A(e.aiConfig)}function ze(){return g("AI_COLOR_SUGGEST_REQUEST",async e=>{const t=await m();if(!_(t,"aiColorFix"))return{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:"AI color-fix suggester is not available on your current plan."};const r=await Xe();if(!r.enabled)return{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:"AI augmentation is disabled in Settings → AI augmentation."};if(!r.apiKey)return{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:"No AI API key configured. Add one in Settings → AI augmentation."};try{const{results:a,totalCostUsd:n,capExceeded:o}=await qe(e.inputs,r,e.paletteHints);return{type:"AI_COLOR_SUGGEST_RESPONSE",results:a,totalCostUsd:n,capExceeded:o}}catch(a){return q.warn("color-suggest handler failed",a),{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:a instanceof Error?a.message:String(a)}}})}function V(e){if(!e)return null;const t=e.match(/rgba?\(\s*([0-9.]+)\s*,?\s*([0-9.]+)\s*,?\s*([0-9.]+)(?:\s*[,/]\s*([0-9.]+))?\s*\)/i);return t?{r:Math.round(parseFloat(t[1])),g:Math.round(parseFloat(t[2])),b:Math.round(parseFloat(t[3])),a:t[4]!==void 0?parseFloat(t[4]):1}:null}function H(e){const t=r=>{const a=r/255;return a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4)};return .2126*t(e.r)+.7152*t(e.g)+.0722*t(e.b)}function Ye(e,t){const r=H(e),a=H(t),n=Math.max(r,a),o=Math.min(r,a);return(n+.05)/(o+.05)}function Je(e,t){const r=Math.max(0,Math.min(1,e.a));return{r:Math.round(e.r*r+t.r*(1-r)),g:Math.round(e.g*r+t.g*(1-r)),b:Math.round(e.b*r+t.b*(1-r))}}function Ze(e,t){var $;if(e!=="color-contrast"&&e!=="color-contrast-enhanced")return null;const r=t.styles;if(!r)return null;const a=(($=r.effectiveBackground)==null?void 0:$.color)??r.background,n=r.foreground;if(!n||!a)return null;const o=V(n),i=V(a);if(!o||!i||i.a<.999)return null;const l=o.a<.999?Je(o,i):{r:o.r,g:o.g,b:o.b},d=Ye(l,i),c=r.fontSize??16,s=r.fontWeight??400,u=c>=24||c>=18.5&&s>=700,y=e==="color-contrast-enhanced"?u?4.5:7:u?3:4.5,L=d>=y?"pass":"fail",D=P=>`rgb(${P.r}, ${P.g}, ${P.b})`,Y=`Deterministic WCAG contrast measurement (no AI guessing, no pixel sampling). Foreground ${D(l)}${o.a<.999?` (originally rgba with alpha=${o.a}, composited over background)`:""} against background ${D(i)} yields contrast ratio ${d.toFixed(2)}:1. Text is ${c}px at font-weight ${s}; ${u?"qualifies as large text (threshold 3:1 for AA)":"normal text (threshold 4.5:1 for AA)"}. ${L==="pass"?`Passes AA at ${y}:1.`:`Falls below the ${y}:1 threshold.`}`;return{verdict:L,ratio:d,threshold:y,reasoning:Y}}async function et(e,t,r){var l,d,c,s,u;const a=JSON.stringify({ruleId:e,selector:t,styles:{fg:((l=r.styles)==null?void 0:l.foreground)??null,bg:((d=r.styles)==null?void 0:d.background)??null,fs:((c=r.styles)==null?void 0:c.fontSize)??null,fw:((s=r.styles)==null?void 0:s.fontWeight)??null,ts:((u=r.styles)==null?void 0:u.textSample)??null},failureSummary:r.failureSummary??null}),n=new TextEncoder().encode(a),o=await crypto.subtle.digest("SHA-256",n);return Array.from(new Uint8Array(o)).map(T=>T.toString(16).padStart(2,"0")).join("")}const w=h("ai-incomplete-resolver");function W(e,t){if(!e)return t;const r=e.toLowerCase(),a=/verdict\s+corrected\s+to\s+pass|verdict:\s*pass\s+\(corrected\)/i,n=/verdict\s+corrected\s+to\s+fail|verdict:\s*fail\s+\(corrected\)/i,o=R(r,a),i=R(r,n);if(o>i&&o>=0)return"pass";if(i>o&&i>=0)return"fail";const l=/actually\s+passes|in\s+fact\s+passes|passes\s+AA/gi,d=/actually\s+fails|in\s+fact\s+fails|fails\s+AA/gi,c=R(r,l),s=R(r,d);return c<0&&s<0?t:c>s&&c/r.length>=.5?"pass":s>c&&s/r.length>=.5?"fail":t}function R(e,t){let r=-1;const a=t.flags.includes("g")?t.flags:t.flags+"g",n=new RegExp(t.source,a);let o;for(;(o=n.exec(e))!==null;)r=o.index,o.index===n.lastIndex&&n.lastIndex++;return r}async function tt(){const e=await chrome.storage.local.get("aiConfig");return A(e.aiConfig)}async function rt(e){if(!e.aiConfig.enabled||e.elements.length===0)return{resolutions:[],totalCostUsd:0};const t=U(e.aiConfig);if(!t.ok)return{resolutions:[],totalCostUsd:0};const r=t.client,a=v(e.aiConfig.costCapUsd),n=[],o=await J(e.pageUrl),i=new Map;for(const l of o)i.set(`${l.ruleId}::${l.selector}`,l);for(const l of e.elements){if(!a.canCharge())break;const d=await et(e.ruleId,l.selector,l),c=i.get(`${e.ruleId}::${l.selector}`),s=Ze(e.ruleId,l);if(s){w.info(`Deterministic verdict for ${e.ruleId} on ${l.selector}: ${s.verdict} (${s.ratio.toFixed(2)}:1 vs ${s.threshold}:1) — math overrides cache + AI`),n.push({pageUrl:e.pageUrl,ruleId:e.ruleId,selector:l.selector,verdict:s.verdict,reasoning:s.reasoning,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:e.wcagCriterion,inputHash:d});continue}if(c&&c.inputHash===d&&c.verdict!=="uncertain"){w.info(`Reusing cached resolution for ${e.ruleId} on ${l.selector} (hash match, verdict=${c.verdict})`);const u=W(c.reasoning,c.verdict);n.push({...c,verdict:u,resolvedAt:new Date().toISOString(),costUsd:0,inputHash:d});continue}try{const u=await r.resolveAxeIncomplete({ruleId:e.ruleId,element:l,pageUrl:e.pageUrl,targetLevel:e.targetLevel});a.recordCharge(u.costUsd);const T=W(u.reasoning,u.verdict);n.push({pageUrl:e.pageUrl,ruleId:e.ruleId,selector:l.selector,verdict:T,reasoning:u.reasoning,resolvedAt:new Date().toISOString(),costUsd:u.costUsd,wcagCriterion:e.wcagCriterion,inputHash:d})}catch(u){w.warn(`resolveAxeIncomplete failed for ${l.selector}`,u)}}return n.length>0&&await Z(n),{resolutions:n,totalCostUsd:a.state.spentUsd}}function at(){return g("AI_RESOLVE_INCOMPLETE_REQUEST",async e=>{const t=await m();if(!_(t,"aiIncompleteResolver"))return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:"AI resolver for axe-incomplete elements is not available on your current plan."};const r=await tt();if(!r.enabled)return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:"AI augmentation is disabled in Settings → AI augmentation."};if(!r.apiKey)return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:"No AI API key configured. Add one in Settings → AI augmentation."};try{const{resolutions:a,totalCostUsd:n}=await rt({ruleId:e.ruleId,pageUrl:e.pageUrl,wcagCriterion:e.wcagCriterion,elements:e.elements,targetLevel:e.targetLevel,aiConfig:r});return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:a,totalCostUsd:n}}catch(a){return w.warn("ai-incomplete-resolver failed",a),{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:a instanceof Error?a.message:"Unknown error during AI resolution."}}})}function nt(){return g("INTERACTIVE_AUDIT_REQUEST",async e=>{try{switch(e.criterionId){case"2.4.3":{const t=await oe({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl});return t.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:t.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t.error}}case"2.1.2":{const t=await ne({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl});return t.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:t.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t.error}}case"2.4.7":{const t=await ae({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl});return t.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:t.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t.error}}case"1.4.11":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=(r==null?void 0:r.results)??[];if(a.length===0)return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:"No audit results available. Run an audit first; 1.4.11 needs the page screenshot."};const n=await re({componentId:e.componentId,pageUrl:e.pageUrl,results:a});return n.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:n.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:n.error}}case"1.3.2":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=(r==null?void 0:r.results)??[];if(a.length===0)return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:"No audit results available. Run an audit first, then the 1.3.2 walkthrough can judge its reading-order findings."};const n=await te({componentId:e.componentId,pageUrl:e.pageUrl,results:a});return n.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:n.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:n.error}}case"2.5.3":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=await ee({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl,results:r==null?void 0:r.results});return a.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:a.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:a.error}}default:return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:`Interactive audit for criterion ${e.criterionId} not yet implemented.`}}}catch(t){return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}})}async function ot(){var t;if(typeof chrome>"u"||!((t=chrome.storage)!=null&&t.local))return A(void 0);const e=await chrome.storage.local.get("aiConfig");return A(e.aiConfig)}async function st(e){const t=await ot();if(!t.enabled)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[],skipReason:"disabled"};if(!t.apiKey)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[],skipReason:"no-key"};const r=U(t);if(!r.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${r.reason}`],skipReason:"client-error"};const a=r.client,n=v(t.costCapUsd),o=[],i=[],l=Math.max(1,t.maxCandidatesPerCheck??10);if(t.enabledChecks.altText){const d=e.figureAltTexts.slice(0,l);for(const c of d){if(!n.canCharge())break;try{const s=await a.judgeGenericLinkText({linkText:c.alt,surroundingText:`(This is an alt text on a PDF Figure tag, page ${c.pageNum}.)`});n.recordCharge(s.costUsd),s.verdict==="fail"&&s.confidence>=.6&&o.push({ruleId:"pdf-alt-text-not-descriptive",impact:"moderate",wcagCriterion:"1.1.1",description:`Figure on page ${c.pageNum} has alt text "${c.alt}" that doesn't describe the figure's content. ${s.reasoning} A screen-reader user hears the literal alt and gets no useful information about what the figure shows.`,failureSummary:'Replace generic alt text with a description of what the figure actually shows. For data charts: include the key data point. For decorative images: use alt="" so the screen reader skips them. PDF/UA-1 §7.4 / WCAG 1.1.1.'})}catch(s){i.push(`alt-text page ${c.pageNum}: ${s instanceof Error?s.message:String(s)}`)}}}else i.push("altText AI check disabled in user settings");if(t.enabledChecks.altText&&e.formLabels&&e.formLabels.length>0){const d=s=>{switch(s){case"Tx":return"text input";case"Btn":return"button / checkbox / radio";case"Ch":return"choice / dropdown";case"Sig":return"signature field";default:return s||"unknown"}},c=e.formLabels.slice(0,l);for(const s of c){if(!n.canCharge())break;try{const u=await a.judgeGenericLinkText({linkText:s.tooltip,surroundingText:`(This is the screen-reader tooltip for a PDF form field on page ${s.pageNum}. Field type: ${d(s.fieldType)}. Internal field name: "${s.fieldName||"(none)"}".)`});n.recordCharge(u.costUsd),u.verdict==="fail"&&u.confidence>=.6&&o.push({ruleId:"pdf-form-label-not-descriptive",impact:"serious",wcagCriterion:"3.3.2",description:`Form field on page ${s.pageNum} (${d(s.fieldType)}) has tooltip "${s.tooltip}" that doesn't convey what the user should enter. ${u.reasoning} Screen-reader users hear the tooltip as the field's accessible name; generic tooltips fail to identify the field's purpose.`,failureSummary:'Replace the generic tooltip with one that names what the field is for. "Field 1" → "Mailing address." "Text input" → "Email address." In Acrobat: Tools → Prepare Form → right-click field → Properties → General → Tooltip. WCAG 3.3.2 (Labels or Instructions) requires labels that describe purpose, not just type.'})}catch(u){i.push(`form-label page ${s.pageNum}: ${u instanceof Error?u.message:String(u)}`)}}}if(t.enabledChecks.headings&&e.headings&&e.headings.length>0){const d=e.headings.slice(0,l);for(const c of d){if(!n.canCharge())break;try{const s=await a.judgeHeading({headingText:c.headingText,sectionContent:c.sectionContent});n.recordCharge(s.costUsd),s.verdict==="fail"&&s.confidence>=.6&&o.push({ruleId:"pdf-heading-not-descriptive",impact:"moderate",wcagCriterion:"2.4.6",description:`Heading on page ${c.pageNum} "${c.headingText}" doesn't describe the content of its section. ${s.reasoning} Screen-reader users navigating by heading hear titles that don't help them locate the section they want.`,failureSummary:`Rewrite the heading to describe what the section is about. "Section 1" → "Q3 financial summary." "More info" → "How to apply for benefits." Generic, recycled, or placeholder heading text wastes the SR user's heading-navigation feature.`})}catch(s){i.push(`heading page ${c.pageNum}: ${s instanceof Error?s.message:String(s)}`)}}}return{findings:o,totalCostUsd:n.state.spentUsd,capExceeded:n.state.exceeded,errors:i}}function it(e){return g("PDF_AUDIT_REQUEST",async t=>{const r=await e();if(!_(r,"pdfAudit"))return{type:"PDF_AUDIT_RESPONSE",ok:!1,source:t.url,findings:[],pageCount:null,fatalError:`PDF accessibility audit is not enabled on the ${r} tier. Upgrade or contact your admin to enable the pdfAudit feature.`};try{const a=await se(t.url,{maxBytes:t.maxBytes});let n=[];if(a.aiCandidates)try{const o=await st(a.aiCandidates);if(n=o.findings,o.skipReason&&(a.aiCandidates.figureAltTexts.length>0||a.aiCandidates.headings.length>0||a.aiCandidates.formLabels.length>0)){const i=o.skipReason==="no-key"?"No Anthropic API key configured. AI quality checks (alt-text descriptiveness, heading clarity, form-label match) did NOT run on this PDF.":o.skipReason==="disabled"?"AI augmentation is disabled in Settings → AI. AI quality checks did NOT run on this PDF.":"AI client could not be constructed. AI quality checks did NOT run on this PDF.";n=[...n,{ruleId:"pdf-ai-quality-skipped",impact:"minor",wcagCriterion:"1.1.1",description:i+` (${a.aiCandidates.figureAltTexts.length} figure alts, ${a.aiCandidates.headings.length} headings, ${a.aiCandidates.formLabels.length} form labels would have been judged.)`,failureSummary:"Configure an Anthropic API key in Settings → AI augmentation to enable PDF semantic-quality checks. The structural audit ran normally; this informational finding is dismissible."}]}}catch{}return{type:"PDF_AUDIT_RESPONSE",ok:a.ok,source:a.source,findings:[...a.findings,...n],pageCount:a.pageCount,...a.fatalError?{fatalError:a.fatalError}:{},...a._perPageContrast?{_perPageContrast:a._perPageContrast}:{},...a.aiCandidates?{aiCandidates:a.aiCandidates}:{}}}catch(a){return{type:"PDF_AUDIT_RESPONSE",ok:!1,source:t.url,findings:[],pageCount:null,fatalError:`PDF audit handler threw: ${a instanceof Error?a.message:String(a)}`}}})}const lt=h("ax-tree-snapshot"),ct="1.3";function dt(e){var r,a,n;const t=[];for(const o of e.properties??[]){const i=(r=o.value)==null?void 0:r.value;i!==void 0&&(typeof i=="string"||typeof i=="number"||typeof i=="boolean"||i===null)&&t.push({name:o.name,value:i})}return{nodeId:e.nodeId,parentId:e.parentId,childIds:e.childIds??[],role:typeof((a=e.role)==null?void 0:a.value)=="string"?e.role.value:"unknown",name:typeof((n=e.name)==null?void 0:n.value)=="string"?e.name.value:"",ignored:!!e.ignored,properties:t,backendDomNodeId:e.backendDOMNodeId}}async function ut(e){let t=!1;try{try{await chrome.debugger.attach({tabId:e},ct),t=!0}catch(n){if(!(n instanceof Error?n.message:String(n)).includes("Another debugger"))throw lt.warn("chrome.debugger.attach failed",n),n}await chrome.debugger.sendCommand({tabId:e},"Accessibility.enable");const r=await chrome.debugger.sendCommand({tabId:e},"Accessibility.getFullAXTree");return((r==null?void 0:r.nodes)??[]).map(dt)}finally{if(t)try{await chrome.debugger.detach({tabId:e})}catch{}}}const X=h("perf-throttle"),ft="1.3",gt={none:{label:"No throttling",network:null,cpuRate:1},"3g-slow":{label:"Slow 3G",network:{offline:!1,latency:400,downloadThroughput:500*1024/8,uploadThroughput:500*1024/8},cpuRate:6},"3g-fast":{label:"Fast 3G",network:{offline:!1,latency:150,downloadThroughput:1.5*1024*1024/8,uploadThroughput:750*1024/8},cpuRate:4},"4g":{label:"4G LTE",network:{offline:!1,latency:20,downloadThroughput:4*1024*1024/8,uploadThroughput:3*1024*1024/8},cpuRate:2},"cpu-2x":{label:"CPU 2× slowdown (no network throttle)",network:null,cpuRate:2},"cpu-4x":{label:"CPU 4× slowdown (no network throttle)",network:null,cpuRate:4}};async function pt(e){try{return await chrome.debugger.attach({tabId:e},ft),!0}catch(t){if((t instanceof Error?t.message:String(t)).includes("Another debugger"))return!1;throw t}}async function ht(e,t){const r=gt[t];await pt(e),await chrome.debugger.sendCommand({tabId:e},"Network.enable"),r.network?await chrome.debugger.sendCommand({tabId:e},"Network.emulateNetworkConditions",r.network):await chrome.debugger.sendCommand({tabId:e},"Network.emulateNetworkConditions",{offline:!1,latency:0,downloadThroughput:-1,uploadThroughput:-1}),await chrome.debugger.sendCommand({tabId:e},"Emulation.setCPUThrottlingRate",{rate:r.cpuRate}),X.info(`applied ${t} (label="${r.label}", cpu×${r.cpuRate})`)}async function Et(e){try{await chrome.debugger.sendCommand({tabId:e},"Network.emulateNetworkConditions",{offline:!1,latency:0,downloadThroughput:-1,uploadThroughput:-1}),await chrome.debugger.sendCommand({tabId:e},"Emulation.setCPUThrottlingRate",{rate:1})}catch(t){X.debug("throttle reset commands failed (debugger may not be attached)",t)}}const f=h("service-worker");Le("service-worker");ie();var I,B;(B=(I=chrome.sidePanel)==null?void 0:I.setPanelBehavior)==null||B.call(I,{openPanelOnActionClick:!0}).catch(e=>f.warn("setPanelBehavior failed",e));le();ce();_e();de().catch(e=>f.warn("initial cloud pull failed",e));(async()=>(await Fe(),await be(),Pe(),await Oe(),Ue(),ue(),fe(),ge()))();chrome.alarms.onAlarm.addListener(e=>{const t=pe(e.name);t!==null&&he(t).catch(r=>f.warn(`scheduled audit ${t} threw at top level`,r))});ke();ve();Ee();me();je();ze();Se();at();nt();it(m);self.addEventListener("unhandledrejection",e=>{const t=e.reason;De(t instanceof Error?t:new Error(String(t)))});let E=!1;chrome.runtime.onConnect.addListener(e=>{if(e.name==="audit-keepalive"){f.debug("keepalive connected"),e.onDisconnect.addListener(async()=>{f.debug("keepalive disconnected"),await Te()});return}if(e.name==="sidepanel-tracker"){E=!0,f.debug("chrome.sidePanel opened"),e.onDisconnect.addListener(async()=>{E=!1,f.debug("chrome.sidePanel closed — restoring in-page overlay"),await b()});return}});let N=!1;const p={isCanceled:()=>N};async function x(){const e=await C();if(e)try{await Q(e,{type:"SIDEBAR_HIDE_REQUEST"})}catch(t){f.warn("sidebar hide failed",t)}}async function b(){const e=await C();if(e)try{await Q(e,{type:"SIDEBAR_SHOW_REQUEST"})}catch(t){f.warn("sidebar show failed",t)}}g("START_AUDIT",async e=>{N=!1,await x();const t=await C();let r;const a={verifyFixesOnly:e.verifyFixesOnly};if(e.mode==="single-element"){if(!e.scope)throw new Error("START_AUDIT single-element requires scope");r=k(e.scope,p,e.frameId,e.matrixOverride,a)}else if(e.mode==="full-page")r=k("html",p,0,e.matrixOverride,a);else if(e.mode==="quick-scan"){const{QUICK_SCAN_MATRIX_SETTINGS:n}=await F(async()=>{const{QUICK_SCAN_MATRIX_SETTINGS:o}=await import("./ai-usage-log-CYuyLsU4.js").then(i=>i.Q);return{QUICK_SCAN_MATRIX_SETTINGS:o}},__vite__mapDeps([0,1]));r=k(e.scope??"html",p,e.frameId??0,n,a)}else if(e.mode==="all-frames")r=ye(p);else if(e.mode==="parallel-scan"){const{runParallelScan:n}=await F(async()=>{const{runParallelScan:o}=await import("./scheduled-audit-runner-D_ZjzHg0.js").then(i=>i.b7);return{runParallelScan:o}},__vite__mapDeps([2,3,1,4,0]));r=n(p)}else r=Re(p);r.catch(n=>{f.error("audit failed",n);const o=n instanceof Error?n.message:String(n),i=/no audit target tab/i.test(o);$e({type:"AUDIT_FAILED_EVENT",error:{code:i?"RESTRICTED_URL":"UNKNOWN",message:i?"No audit target tab found. Open a regular http(s) page (not chrome:// or about:blank) and try again.":`Audit failed: ${o}`,recoverable:!0}})}).finally(()=>{t!=null&&K(t).catch(n=>f.debug("post-audit debugger release failed (best-effort)",n)),E||b()})});g("CANCEL_AUDIT",async()=>{N=!0,f.info("cancel requested")});let S=!1;const z={isCanceled:()=>S};g("START_SITE_CRAWL",async e=>{S=!1,await x();const t=await C();Ie(e.startUrl,{maxPages:e.maxPages,includeRegex:e.includeRegex,excludeRegex:e.excludeRegex,verifyFixesOnly:e.verifyFixesOnly,urls:e.urls},z).catch(r=>f.error("site crawl failed",r)).finally(()=>{t!=null&&K(t).catch(r=>f.debug("post-crawl debugger release failed (best-effort)",r)),E||b()})});g("CANCEL_SITE_CRAWL",async()=>{S=!0,f.info("site crawl cancel requested")});g("START_CRAWL_DISCOVERY",async e=>{S=!1,await x(),we(e.startUrl,{maxPages:e.maxPages,includeRegex:e.includeRegex,excludeRegex:e.excludeRegex},z).catch(t=>f.error("crawl discovery failed",t)).finally(()=>{E||b()})});g("CANCEL_CRAWL_DISCOVERY",async()=>{S=!0,f.info("crawl discovery cancel requested")});g("REGRADE_SITE_CRAWL",async()=>{try{const e=await Ae();return{type:"REGRADE_SITE_CRAWL_RESPONSE",ok:e.ok,...e.reason?{reason:e.reason}:{}}}catch(e){return{type:"REGRADE_SITE_CRAWL_RESPONSE",ok:!1,reason:e instanceof Error?e.message:String(e)}}});g("OPEN_SETTINGS",()=>{chrome.runtime.openOptionsPage()});g("PERF_THROTTLE_APPLY_REQUEST",async e=>{try{return await ht(e.tabId,e.profile),{type:"PERF_THROTTLE_APPLY_RESPONSE",ok:!0}}catch(t){return{type:"PERF_THROTTLE_APPLY_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}});g("PERF_THROTTLE_CLEAR_REQUEST",async e=>{try{return await Et(e.tabId),{type:"PERF_THROTTLE_CLEAR_RESPONSE",ok:!0}}catch(t){return{type:"PERF_THROTTLE_CLEAR_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}});g("SITE_CLAIM_GET_REQUEST",async e=>({type:"SITE_CLAIM_GET_RESPONSE",claim:await Ce(e.domain)}));g("AX_TREE_SNAPSHOT_REQUEST",async e=>{const t=await m();if(!_(t,"axTreeViewer"))return{type:"AX_TREE_SNAPSHOT_RESPONSE",ok:!1,error:"AX-tree viewer is not available on your current plan."};try{return{type:"AX_TREE_SNAPSHOT_RESPONSE",ok:!0,nodes:await ut(e.tabId)}}catch(r){return f.warn("ax-tree snapshot failed",r),{type:"AX_TREE_SNAPSHOT_RESPONSE",ok:!1,error:r instanceof Error?r.message:String(r)}}});f.info("service worker ready");
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ai-usage-log-C9Opn0x0.js","assets/crash-reporter-DAZnNefT.js","assets/scheduled-audit-runner-EQBltZPz.js","assets/preload-helper-D7HrI6pR.js","assets/diff-CECbooHD.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{_ as F}from"./preload-helper-D7HrI6pR.js";import{as as U,at as v,b as J,z as Z,au as ee,av as te,aw as re,ax as ae,ay as ne,az as oe,aA as se,aB as ie,aC as le,aD as ce,aE as de,aF as ue,aG as fe,am as ge,aH as pe,aI as he,aJ as Ee,aK as me,aL as Se,aM as Te,q as C,aN as k,aO as ye,aP as Re,aQ as Q,aR as Ie,aS as we,aT as Ae,aU as Ce}from"./scheduled-audit-runner-EQBltZPz.js";import{m as G,b as m,r as _e}from"./diff-CECbooHD.js";import{w as be,r as Pe,a as ke}from"./tier-config-client-CGmK5CXV.js";import{w as Oe,r as Ue,a as ve}from"./rubric-config-client-CEBmuFV7.js";import{o as g,m as Ne,n as xe,c as h,e as _,i as Le,p as De,f as B,k as $e}from"./crash-reporter-DAZnNefT.js";import{z as A,C as Fe}from"./ai-usage-log-C9Opn0x0.js";const Ge=h("support-messenger"),Me="https://api.wcagcheckr.com/v1/products/wcagcheckr/support",O="support:rate-window",Ve=5,He=10*60*1e3,We=2,Ke="wcagcheckr",M="storybook:lastDetected";async function Qe(e){if(!e)return;const t=await chrome.runtime.getPlatformInfo(),a=(await chrome.storage.local.get(M))[M];return{extensionVersion:chrome.runtime.getManifest().version,platform:t,storybookDetected:a!=null&&a.detected?a.version??"detected":"none",licenseTier:await m(),logTail:Ne(xe())}}async function Be(e=Date.now()){const r=((await chrome.storage.local.get(O))[O]??[]).filter(a=>e-a<He);return r.length>=Ve?!1:(r.push(e),await chrome.storage.local.set({[O]:r}),!0)}async function j(e,t=0){try{const r=await fetch(Me,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!r.ok)throw new Error(`http ${r.status}`);const a=await r.json();if(!a.success)throw new Error(a.error??"server returned success=false");return{ticketRef:a.ticketRef??""}}catch(r){if(t<We){const a=(t+1)*1e3;return await new Promise(n=>setTimeout(n,a)),j(e,t+1)}throw r}}function je(){return g("SUPPORT_MESSAGE_REQUEST",async e=>{if(!await Be())return{type:"SUPPORT_MESSAGE_RESPONSE",success:!1,error:G("NETWORK","Rate limit reached. Try again in 10 minutes.",!0)};try{const t=await Qe(e.includeContext);return{type:"SUPPORT_MESSAGE_RESPONSE",success:!0,ticketRef:(await j({productSlug:Ke,subject:e.subject,body:e.body,replyEmail:e.replyEmail,context:t,extensionVersion:chrome.runtime.getManifest().version,timestamp:new Date().toISOString()})).ticketRef}}catch(t){Ge.error("send failed",t);const r=t instanceof Error?t.message:String(t);return{type:"SUPPORT_MESSAGE_RESPONSE",success:!1,error:G("NETWORK",r,!0)}}})}const q=h("ai-color-suggester");async function qe(e,t,r=[]){if(!t.enabled||e.length===0)return{results:[],totalCostUsd:0,capExceeded:!1};const a=U(t);if(!a.ok)return{results:[],totalCostUsd:0,capExceeded:!1};const n=a.client,o=v(t.costCapUsd),i=[];for(const l of e){if(!o.canCharge())break;try{const d=await n.suggestColorFix({foreground:l.foreground,background:l.background,fontSize:l.fontSize,fontWeight:l.fontWeight,targetLevel:l.targetLevel,paletteHints:r});o.recordCharge(d.costUsd),d.verdict==="suggested"&&d.candidates.length>0&&i.push({matchKey:l.matchKey,suggestions:d.candidates,reasoning:d.reasoning,costUsd:d.costUsd})}catch(d){q.warn(`color-fix suggestion failed for ${l.matchKey}`,d)}}return{results:i,totalCostUsd:o.state.spentUsd,capExceeded:o.state.exceeded}}async function Xe(){const e=await chrome.storage.local.get("aiConfig");return A(e.aiConfig)}function ze(){return g("AI_COLOR_SUGGEST_REQUEST",async e=>{const t=await m();if(!_(t,"aiColorFix"))return{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:"AI color-fix suggester is not available on your current plan."};const r=await Xe();if(!r.enabled)return{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:"AI augmentation is disabled in Settings → AI augmentation."};if(!r.apiKey)return{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:"No AI API key configured. Add one in Settings → AI augmentation."};try{const{results:a,totalCostUsd:n,capExceeded:o}=await qe(e.inputs,r,e.paletteHints);return{type:"AI_COLOR_SUGGEST_RESPONSE",results:a,totalCostUsd:n,capExceeded:o}}catch(a){return q.warn("color-suggest handler failed",a),{type:"AI_COLOR_SUGGEST_RESPONSE",results:[],totalCostUsd:0,capExceeded:!1,unavailableReason:a instanceof Error?a.message:String(a)}}})}function V(e){if(!e)return null;const t=e.match(/rgba?\(\s*([0-9.]+)\s*,?\s*([0-9.]+)\s*,?\s*([0-9.]+)(?:\s*[,/]\s*([0-9.]+))?\s*\)/i);return t?{r:Math.round(parseFloat(t[1])),g:Math.round(parseFloat(t[2])),b:Math.round(parseFloat(t[3])),a:t[4]!==void 0?parseFloat(t[4]):1}:null}function H(e){const t=r=>{const a=r/255;return a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4)};return .2126*t(e.r)+.7152*t(e.g)+.0722*t(e.b)}function Ye(e,t){const r=H(e),a=H(t),n=Math.max(r,a),o=Math.min(r,a);return(n+.05)/(o+.05)}function Je(e,t){const r=Math.max(0,Math.min(1,e.a));return{r:Math.round(e.r*r+t.r*(1-r)),g:Math.round(e.g*r+t.g*(1-r)),b:Math.round(e.b*r+t.b*(1-r))}}function Ze(e,t){var $;if(e!=="color-contrast"&&e!=="color-contrast-enhanced")return null;const r=t.styles;if(!r)return null;const a=(($=r.effectiveBackground)==null?void 0:$.color)??r.background,n=r.foreground;if(!n||!a)return null;const o=V(n),i=V(a);if(!o||!i||i.a<.999)return null;const l=o.a<.999?Je(o,i):{r:o.r,g:o.g,b:o.b},d=Ye(l,i),c=r.fontSize??16,s=r.fontWeight??400,u=c>=24||c>=18.5&&s>=700,y=e==="color-contrast-enhanced"?u?4.5:7:u?3:4.5,L=d>=y?"pass":"fail",D=P=>`rgb(${P.r}, ${P.g}, ${P.b})`,Y=`Deterministic WCAG contrast measurement (no AI guessing, no pixel sampling). Foreground ${D(l)}${o.a<.999?` (originally rgba with alpha=${o.a}, composited over background)`:""} against background ${D(i)} yields contrast ratio ${d.toFixed(2)}:1. Text is ${c}px at font-weight ${s}; ${u?"qualifies as large text (threshold 3:1 for AA)":"normal text (threshold 4.5:1 for AA)"}. ${L==="pass"?`Passes AA at ${y}:1.`:`Falls below the ${y}:1 threshold.`}`;return{verdict:L,ratio:d,threshold:y,reasoning:Y}}async function et(e,t,r){var l,d,c,s,u;const a=JSON.stringify({ruleId:e,selector:t,styles:{fg:((l=r.styles)==null?void 0:l.foreground)??null,bg:((d=r.styles)==null?void 0:d.background)??null,fs:((c=r.styles)==null?void 0:c.fontSize)??null,fw:((s=r.styles)==null?void 0:s.fontWeight)??null,ts:((u=r.styles)==null?void 0:u.textSample)??null},failureSummary:r.failureSummary??null}),n=new TextEncoder().encode(a),o=await crypto.subtle.digest("SHA-256",n);return Array.from(new Uint8Array(o)).map(T=>T.toString(16).padStart(2,"0")).join("")}const w=h("ai-incomplete-resolver");function W(e,t){if(!e)return t;const r=e.toLowerCase(),a=/verdict\s+corrected\s+to\s+pass|verdict:\s*pass\s+\(corrected\)/i,n=/verdict\s+corrected\s+to\s+fail|verdict:\s*fail\s+\(corrected\)/i,o=R(r,a),i=R(r,n);if(o>i&&o>=0)return"pass";if(i>o&&i>=0)return"fail";const l=/actually\s+passes|in\s+fact\s+passes|passes\s+AA/gi,d=/actually\s+fails|in\s+fact\s+fails|fails\s+AA/gi,c=R(r,l),s=R(r,d);return c<0&&s<0?t:c>s&&c/r.length>=.5?"pass":s>c&&s/r.length>=.5?"fail":t}function R(e,t){let r=-1;const a=t.flags.includes("g")?t.flags:t.flags+"g",n=new RegExp(t.source,a);let o;for(;(o=n.exec(e))!==null;)r=o.index,o.index===n.lastIndex&&n.lastIndex++;return r}async function tt(){const e=await chrome.storage.local.get("aiConfig");return A(e.aiConfig)}async function rt(e){if(!e.aiConfig.enabled||e.elements.length===0)return{resolutions:[],totalCostUsd:0};const t=U(e.aiConfig);if(!t.ok)return{resolutions:[],totalCostUsd:0};const r=t.client,a=v(e.aiConfig.costCapUsd),n=[],o=await J(e.pageUrl),i=new Map;for(const l of o)i.set(`${l.ruleId}::${l.selector}`,l);for(const l of e.elements){if(!a.canCharge())break;const d=await et(e.ruleId,l.selector,l),c=i.get(`${e.ruleId}::${l.selector}`),s=Ze(e.ruleId,l);if(s){w.info(`Deterministic verdict for ${e.ruleId} on ${l.selector}: ${s.verdict} (${s.ratio.toFixed(2)}:1 vs ${s.threshold}:1) — math overrides cache + AI`),n.push({pageUrl:e.pageUrl,ruleId:e.ruleId,selector:l.selector,verdict:s.verdict,reasoning:s.reasoning,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:e.wcagCriterion,inputHash:d});continue}if(c&&c.inputHash===d&&c.verdict!=="uncertain"){w.info(`Reusing cached resolution for ${e.ruleId} on ${l.selector} (hash match, verdict=${c.verdict})`);const u=W(c.reasoning,c.verdict);n.push({...c,verdict:u,resolvedAt:new Date().toISOString(),costUsd:0,inputHash:d});continue}try{const u=await r.resolveAxeIncomplete({ruleId:e.ruleId,element:l,pageUrl:e.pageUrl,targetLevel:e.targetLevel});a.recordCharge(u.costUsd);const T=W(u.reasoning,u.verdict);n.push({pageUrl:e.pageUrl,ruleId:e.ruleId,selector:l.selector,verdict:T,reasoning:u.reasoning,resolvedAt:new Date().toISOString(),costUsd:u.costUsd,wcagCriterion:e.wcagCriterion,inputHash:d})}catch(u){w.warn(`resolveAxeIncomplete failed for ${l.selector}`,u)}}return n.length>0&&await Z(n),{resolutions:n,totalCostUsd:a.state.spentUsd}}function at(){return g("AI_RESOLVE_INCOMPLETE_REQUEST",async e=>{const t=await m();if(!_(t,"aiIncompleteResolver"))return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:"AI resolver for axe-incomplete elements is not available on your current plan."};const r=await tt();if(!r.enabled)return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:"AI augmentation is disabled in Settings → AI augmentation."};if(!r.apiKey)return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:"No AI API key configured. Add one in Settings → AI augmentation."};try{const{resolutions:a,totalCostUsd:n}=await rt({ruleId:e.ruleId,pageUrl:e.pageUrl,wcagCriterion:e.wcagCriterion,elements:e.elements,targetLevel:e.targetLevel,aiConfig:r});return{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:a,totalCostUsd:n}}catch(a){return w.warn("ai-incomplete-resolver failed",a),{type:"AI_RESOLVE_INCOMPLETE_RESPONSE",resolutions:[],totalCostUsd:0,unavailableReason:a instanceof Error?a.message:"Unknown error during AI resolution."}}})}function nt(){return g("INTERACTIVE_AUDIT_REQUEST",async e=>{try{switch(e.criterionId){case"2.4.3":{const t=await oe({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl});return t.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:t.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t.error}}case"2.1.2":{const t=await ne({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl});return t.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:t.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t.error}}case"2.4.7":{const t=await ae({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl});return t.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:t.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t.error}}case"1.4.11":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=(r==null?void 0:r.results)??[];if(a.length===0)return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:"No audit results available. Run an audit first; 1.4.11 needs the page screenshot."};const n=await re({componentId:e.componentId,pageUrl:e.pageUrl,results:a});return n.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:n.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:n.error}}case"1.3.2":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=(r==null?void 0:r.results)??[];if(a.length===0)return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:"No audit results available. Run an audit first, then the 1.3.2 walkthrough can judge its reading-order findings."};const n=await te({componentId:e.componentId,pageUrl:e.pageUrl,results:a});return n.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:n.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:n.error}}case"2.5.3":{const t=await chrome.storage.local.get("sidePanel:lastAudit"),r=t==null?void 0:t["sidePanel:lastAudit"],a=await ee({tabId:e.tabId,componentId:e.componentId,pageUrl:e.pageUrl,results:r==null?void 0:r.results});return a.ok?{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!0,result:a.result}:{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:a.error}}default:return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:`Interactive audit for criterion ${e.criterionId} not yet implemented.`}}}catch(t){return{type:"INTERACTIVE_AUDIT_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}})}async function ot(){var t;if(typeof chrome>"u"||!((t=chrome.storage)!=null&&t.local))return A(void 0);const e=await chrome.storage.local.get("aiConfig");return A(e.aiConfig)}async function st(e){const t=await ot();if(!t.enabled)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[],skipReason:"disabled"};if(!t.apiKey)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[],skipReason:"no-key"};const r=U(t);if(!r.ok)return{findings:[],totalCostUsd:0,capExceeded:!1,errors:[`AI client unavailable: ${r.reason}`],skipReason:"client-error"};const a=r.client,n=v(t.costCapUsd),o=[],i=[],l=Math.max(1,t.maxCandidatesPerCheck??10);if(t.enabledChecks.altText){const d=e.figureAltTexts.slice(0,l);for(const c of d){if(!n.canCharge())break;try{const s=await a.judgeGenericLinkText({linkText:c.alt,surroundingText:`(This is an alt text on a PDF Figure tag, page ${c.pageNum}.)`});n.recordCharge(s.costUsd),s.verdict==="fail"&&s.confidence>=.6&&o.push({ruleId:"pdf-alt-text-not-descriptive",impact:"moderate",wcagCriterion:"1.1.1",description:`Figure on page ${c.pageNum} has alt text "${c.alt}" that doesn't describe the figure's content. ${s.reasoning} A screen-reader user hears the literal alt and gets no useful information about what the figure shows.`,failureSummary:'Replace generic alt text with a description of what the figure actually shows. For data charts: include the key data point. For decorative images: use alt="" so the screen reader skips them. PDF/UA-1 §7.4 / WCAG 1.1.1.'})}catch(s){i.push(`alt-text page ${c.pageNum}: ${s instanceof Error?s.message:String(s)}`)}}}else i.push("altText AI check disabled in user settings");if(t.enabledChecks.altText&&e.formLabels&&e.formLabels.length>0){const d=s=>{switch(s){case"Tx":return"text input";case"Btn":return"button / checkbox / radio";case"Ch":return"choice / dropdown";case"Sig":return"signature field";default:return s||"unknown"}},c=e.formLabels.slice(0,l);for(const s of c){if(!n.canCharge())break;try{const u=await a.judgeGenericLinkText({linkText:s.tooltip,surroundingText:`(This is the screen-reader tooltip for a PDF form field on page ${s.pageNum}. Field type: ${d(s.fieldType)}. Internal field name: "${s.fieldName||"(none)"}".)`});n.recordCharge(u.costUsd),u.verdict==="fail"&&u.confidence>=.6&&o.push({ruleId:"pdf-form-label-not-descriptive",impact:"serious",wcagCriterion:"3.3.2",description:`Form field on page ${s.pageNum} (${d(s.fieldType)}) has tooltip "${s.tooltip}" that doesn't convey what the user should enter. ${u.reasoning} Screen-reader users hear the tooltip as the field's accessible name; generic tooltips fail to identify the field's purpose.`,failureSummary:'Replace the generic tooltip with one that names what the field is for. "Field 1" → "Mailing address." "Text input" → "Email address." In Acrobat: Tools → Prepare Form → right-click field → Properties → General → Tooltip. WCAG 3.3.2 (Labels or Instructions) requires labels that describe purpose, not just type.'})}catch(u){i.push(`form-label page ${s.pageNum}: ${u instanceof Error?u.message:String(u)}`)}}}if(t.enabledChecks.headings&&e.headings&&e.headings.length>0){const d=e.headings.slice(0,l);for(const c of d){if(!n.canCharge())break;try{const s=await a.judgeHeading({headingText:c.headingText,sectionContent:c.sectionContent});n.recordCharge(s.costUsd),s.verdict==="fail"&&s.confidence>=.6&&o.push({ruleId:"pdf-heading-not-descriptive",impact:"moderate",wcagCriterion:"2.4.6",description:`Heading on page ${c.pageNum} "${c.headingText}" doesn't describe the content of its section. ${s.reasoning} Screen-reader users navigating by heading hear titles that don't help them locate the section they want.`,failureSummary:`Rewrite the heading to describe what the section is about. "Section 1" → "Q3 financial summary." "More info" → "How to apply for benefits." Generic, recycled, or placeholder heading text wastes the SR user's heading-navigation feature.`})}catch(s){i.push(`heading page ${c.pageNum}: ${s instanceof Error?s.message:String(s)}`)}}}return{findings:o,totalCostUsd:n.state.spentUsd,capExceeded:n.state.exceeded,errors:i}}function it(e){return g("PDF_AUDIT_REQUEST",async t=>{const r=await e();if(!_(r,"pdfAudit"))return{type:"PDF_AUDIT_RESPONSE",ok:!1,source:t.url,findings:[],pageCount:null,fatalError:`PDF accessibility audit is not enabled on the ${r} tier. Upgrade or contact your admin to enable the pdfAudit feature.`};try{const a=await se(t.url,{maxBytes:t.maxBytes});let n=[];if(a.aiCandidates)try{const o=await st(a.aiCandidates);if(n=o.findings,o.skipReason&&(a.aiCandidates.figureAltTexts.length>0||a.aiCandidates.headings.length>0||a.aiCandidates.formLabels.length>0)){const i=o.skipReason==="no-key"?"No Anthropic API key configured. AI quality checks (alt-text descriptiveness, heading clarity, form-label match) did NOT run on this PDF.":o.skipReason==="disabled"?"AI augmentation is disabled in Settings → AI. AI quality checks did NOT run on this PDF.":"AI client could not be constructed. AI quality checks did NOT run on this PDF.";n=[...n,{ruleId:"pdf-ai-quality-skipped",impact:"minor",wcagCriterion:"1.1.1",description:i+` (${a.aiCandidates.figureAltTexts.length} figure alts, ${a.aiCandidates.headings.length} headings, ${a.aiCandidates.formLabels.length} form labels would have been judged.)`,failureSummary:"Configure an Anthropic API key in Settings → AI augmentation to enable PDF semantic-quality checks. The structural audit ran normally; this informational finding is dismissible."}]}}catch{}return{type:"PDF_AUDIT_RESPONSE",ok:a.ok,source:a.source,findings:[...a.findings,...n],pageCount:a.pageCount,...a.fatalError?{fatalError:a.fatalError}:{},...a._perPageContrast?{_perPageContrast:a._perPageContrast}:{},...a.aiCandidates?{aiCandidates:a.aiCandidates}:{}}}catch(a){return{type:"PDF_AUDIT_RESPONSE",ok:!1,source:t.url,findings:[],pageCount:null,fatalError:`PDF audit handler threw: ${a instanceof Error?a.message:String(a)}`}}})}const lt=h("ax-tree-snapshot"),ct="1.3";function dt(e){var r,a,n;const t=[];for(const o of e.properties??[]){const i=(r=o.value)==null?void 0:r.value;i!==void 0&&(typeof i=="string"||typeof i=="number"||typeof i=="boolean"||i===null)&&t.push({name:o.name,value:i})}return{nodeId:e.nodeId,parentId:e.parentId,childIds:e.childIds??[],role:typeof((a=e.role)==null?void 0:a.value)=="string"?e.role.value:"unknown",name:typeof((n=e.name)==null?void 0:n.value)=="string"?e.name.value:"",ignored:!!e.ignored,properties:t,backendDomNodeId:e.backendDOMNodeId}}async function ut(e){let t=!1;try{try{await chrome.debugger.attach({tabId:e},ct),t=!0}catch(n){if(!(n instanceof Error?n.message:String(n)).includes("Another debugger"))throw lt.warn("chrome.debugger.attach failed",n),n}await chrome.debugger.sendCommand({tabId:e},"Accessibility.enable");const r=await chrome.debugger.sendCommand({tabId:e},"Accessibility.getFullAXTree");return((r==null?void 0:r.nodes)??[]).map(dt)}finally{if(t)try{await chrome.debugger.detach({tabId:e})}catch{}}}const X=h("perf-throttle"),ft="1.3",gt={none:{label:"No throttling",network:null,cpuRate:1},"3g-slow":{label:"Slow 3G",network:{offline:!1,latency:400,downloadThroughput:500*1024/8,uploadThroughput:500*1024/8},cpuRate:6},"3g-fast":{label:"Fast 3G",network:{offline:!1,latency:150,downloadThroughput:1.5*1024*1024/8,uploadThroughput:750*1024/8},cpuRate:4},"4g":{label:"4G LTE",network:{offline:!1,latency:20,downloadThroughput:4*1024*1024/8,uploadThroughput:3*1024*1024/8},cpuRate:2},"cpu-2x":{label:"CPU 2× slowdown (no network throttle)",network:null,cpuRate:2},"cpu-4x":{label:"CPU 4× slowdown (no network throttle)",network:null,cpuRate:4}};async function pt(e){try{return await chrome.debugger.attach({tabId:e},ft),!0}catch(t){if((t instanceof Error?t.message:String(t)).includes("Another debugger"))return!1;throw t}}async function ht(e,t){const r=gt[t];await pt(e),await chrome.debugger.sendCommand({tabId:e},"Network.enable"),r.network?await chrome.debugger.sendCommand({tabId:e},"Network.emulateNetworkConditions",r.network):await chrome.debugger.sendCommand({tabId:e},"Network.emulateNetworkConditions",{offline:!1,latency:0,downloadThroughput:-1,uploadThroughput:-1}),await chrome.debugger.sendCommand({tabId:e},"Emulation.setCPUThrottlingRate",{rate:r.cpuRate}),X.info(`applied ${t} (label="${r.label}", cpu×${r.cpuRate})`)}async function Et(e){try{await chrome.debugger.sendCommand({tabId:e},"Network.emulateNetworkConditions",{offline:!1,latency:0,downloadThroughput:-1,uploadThroughput:-1}),await chrome.debugger.sendCommand({tabId:e},"Emulation.setCPUThrottlingRate",{rate:1})}catch(t){X.debug("throttle reset commands failed (debugger may not be attached)",t)}}const f=h("service-worker");Le("service-worker");ie();var I,K;(K=(I=chrome.sidePanel)==null?void 0:I.setPanelBehavior)==null||K.call(I,{openPanelOnActionClick:!0}).catch(e=>f.warn("setPanelBehavior failed",e));le();ce();_e();de().catch(e=>f.warn("initial cloud pull failed",e));(async()=>(await Fe(),await be(),Pe(),await Oe(),Ue(),ue(),fe(),ge()))();chrome.alarms.onAlarm.addListener(e=>{const t=pe(e.name);t!==null&&he(t).catch(r=>f.warn(`scheduled audit ${t} threw at top level`,r))});ke();ve();Ee();me();je();ze();Se();at();nt();it(m);self.addEventListener("unhandledrejection",e=>{const t=e.reason;De(t instanceof Error?t:new Error(String(t)))});let E=!1;chrome.runtime.onConnect.addListener(e=>{if(e.name==="audit-keepalive"){f.debug("keepalive connected"),e.onDisconnect.addListener(async()=>{f.debug("keepalive disconnected"),await Te()});return}if(e.name==="sidepanel-tracker"){E=!0,f.debug("chrome.sidePanel opened"),e.onDisconnect.addListener(async()=>{E=!1,f.debug("chrome.sidePanel closed — restoring in-page overlay"),await b()});return}});let N=!1;const p={isCanceled:()=>N};async function x(){const e=await C();if(e)try{await B(e,{type:"SIDEBAR_HIDE_REQUEST"})}catch(t){f.warn("sidebar hide failed",t)}}async function b(){const e=await C();if(e)try{await B(e,{type:"SIDEBAR_SHOW_REQUEST"})}catch(t){f.warn("sidebar show failed",t)}}g("START_AUDIT",async e=>{N=!1,await x();const t=await C();let r;const a={verifyFixesOnly:e.verifyFixesOnly};if(e.mode==="single-element"){if(!e.scope)throw new Error("START_AUDIT single-element requires scope");r=k(e.scope,p,e.frameId,e.matrixOverride,a)}else if(e.mode==="full-page")r=k("html",p,0,e.matrixOverride,a);else if(e.mode==="quick-scan"){const{QUICK_SCAN_MATRIX_SETTINGS:n}=await F(async()=>{const{QUICK_SCAN_MATRIX_SETTINGS:o}=await import("./ai-usage-log-C9Opn0x0.js").then(i=>i.Q);return{QUICK_SCAN_MATRIX_SETTINGS:o}},__vite__mapDeps([0,1]));r=k(e.scope??"html",p,e.frameId??0,n,a)}else if(e.mode==="all-frames")r=ye(p);else if(e.mode==="parallel-scan"){const{runParallelScan:n}=await F(async()=>{const{runParallelScan:o}=await import("./scheduled-audit-runner-EQBltZPz.js").then(i=>i.b7);return{runParallelScan:o}},__vite__mapDeps([2,3,1,4,0]));r=n(p)}else r=Re(p);r.catch(n=>{f.error("audit failed",n);const o=n instanceof Error?n.message:String(n),i=/no audit target tab/i.test(o);$e({type:"AUDIT_FAILED_EVENT",error:{code:i?"RESTRICTED_URL":"UNKNOWN",message:i?"No audit target tab found. Open a regular http(s) page (not chrome:// or about:blank) and try again.":`Audit failed: ${o}`,recoverable:!0}})}).finally(()=>{t!=null&&Q(t).catch(n=>f.debug("post-audit debugger release failed (best-effort)",n)),E||b()})});g("CANCEL_AUDIT",async()=>{N=!0,f.info("cancel requested")});let S=!1;const z={isCanceled:()=>S};g("START_SITE_CRAWL",async e=>{S=!1,await x();const t=await C();Ie(e.startUrl,{maxPages:e.maxPages,includeRegex:e.includeRegex,excludeRegex:e.excludeRegex,verifyFixesOnly:e.verifyFixesOnly,urls:e.urls},z).catch(r=>f.error("site crawl failed",r)).finally(()=>{t!=null&&Q(t).catch(r=>f.debug("post-crawl debugger release failed (best-effort)",r)),E||b()})});g("CANCEL_SITE_CRAWL",async()=>{S=!0,f.info("site crawl cancel requested")});g("START_CRAWL_DISCOVERY",async e=>{S=!1,await x(),we(e.startUrl,{maxPages:e.maxPages,includeRegex:e.includeRegex,excludeRegex:e.excludeRegex},z).catch(t=>f.error("crawl discovery failed",t)).finally(()=>{E||b()})});g("CANCEL_CRAWL_DISCOVERY",async()=>{S=!0,f.info("crawl discovery cancel requested")});g("REGRADE_SITE_CRAWL",async()=>{try{const e=await Ae();return{type:"REGRADE_SITE_CRAWL_RESPONSE",ok:e.ok,...e.reason?{reason:e.reason}:{}}}catch(e){return{type:"REGRADE_SITE_CRAWL_RESPONSE",ok:!1,reason:e instanceof Error?e.message:String(e)}}});g("OPEN_SETTINGS",()=>{chrome.runtime.openOptionsPage()});g("PERF_THROTTLE_APPLY_REQUEST",async e=>{try{return await ht(e.tabId,e.profile),{type:"PERF_THROTTLE_APPLY_RESPONSE",ok:!0}}catch(t){return{type:"PERF_THROTTLE_APPLY_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}});g("PERF_THROTTLE_CLEAR_REQUEST",async e=>{try{return await Et(e.tabId),{type:"PERF_THROTTLE_CLEAR_RESPONSE",ok:!0}}catch(t){return{type:"PERF_THROTTLE_CLEAR_RESPONSE",ok:!1,error:t instanceof Error?t.message:String(t)}}});g("SITE_CLAIM_GET_REQUEST",async e=>({type:"SITE_CLAIM_GET_RESPONSE",claim:await Ce(e.domain)}));g("AX_TREE_SNAPSHOT_REQUEST",async e=>{const t=await m();if(!_(t,"axTreeViewer"))return{type:"AX_TREE_SNAPSHOT_RESPONSE",ok:!1,error:"AX-tree viewer is not available on your current plan."};try{return{type:"AX_TREE_SNAPSHOT_RESPONSE",ok:!0,nodes:await ut(e.tabId)}}catch(r){return f.warn("ax-tree snapshot failed",r),{type:"AX_TREE_SNAPSHOT_RESPONSE",ok:!1,error:r instanceof Error?r.message:String(r)}}});f.info("service worker ready");
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/site-report-renderer-C3U9cFY3.js","assets/scheduled-audit-runner-EQBltZPz.js","assets/preload-helper-D7HrI6pR.js","assets/crash-reporter-DAZnNefT.js","assets/diff-CECbooHD.js","assets/ai-usage-log-C9Opn0x0.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import"./modulepreload-polyfill-B5Qt9EMX.js";import{r as c,j as e,C as we,c as Ee,R as Ae}from"./styles-uesms5w-.js";import{u as m,a as oe,c as Ie,C as Ne,M as Ue,l as ne,b as ze,d as Pe,e as De,i as Le,P as _e,f as We,s as Ge,w as Fe,r as Me,g as Oe,h as $e,j as He,p as Be,k as Ve,A as qe,m as Ke,E as Ye,n as Qe}from"./ErrorBoundary-D-5bMIZq.js";import{s as S,r as Ze,i as Xe}from"./crash-reporter-DAZnNefT.js";import{B as ie,t as Je,u as et}from"./ai-usage-log-C9Opn0x0.js";import{c as tt,C as rt,a as at,d as nt,l as je,g as Se,s as it,b as st,e as ot,f as lt,h as ue,i as ct,j as dt}from"./scheduled-audit-runner-EQBltZPz.js";import{_ as re}from"./preload-helper-D7HrI6pR.js";import{copyAiFixerPrompt as ut}from"./copy-ai-fixer-prompt-tOtbF2rw.js";import{w as pe,h as ve,r as ge}from"./tier-config-client-CGmK5CXV.js";import{w as he,r as me}from"./rubric-config-client-CEBmuFV7.js";import"./_commonjsHelpers-Cpj98o6Y.js";import"./diff-CECbooHD.js";import"./design-system-audit-DpxJrxnb.js";function fe({initialUrl:t,isRunning:a,onCrawl:r,onVerifyFixes:o,onAuditThisPage:s,reviewEnabled:l,onToggleReview:n}){const[i,v]=c.useState(t),[x,w]=c.useState(25),[g,y]=c.useState(""),[b,j]=c.useState(""),[k,h]=c.useState(!1),[E,P]=c.useState(ie),[f,F]=c.useState(ie[0].id),[$,U]=c.useState(null),[W,R]=c.useState(!0);c.useEffect(()=>{t&&!i&&v(t)},[t]),c.useEffect(()=>{let u=!1;return Promise.all([S({type:"SETTINGS_GET",key:"matrixPresets"}),S({type:"SETTINGS_GET",key:"activePresetId"})]).then(([T,L])=>{if(u)return;const d=Array.isArray(T.data)?T.data:null;P(d&&d.length>0?d:ie),typeof L.data=="string"&&F(L.data)}),()=>{u=!0}},[]),c.useEffect(()=>{let u=!1;return S({type:"SETTINGS_GET",key:"crawlRememberSettings"}).then(async T=>{if(u)return;const d=T.data!==!1;if(R(d),!d)return;const[C,B,M]=await Promise.all([S({type:"SETTINGS_GET",key:"crawlMaxPages"}),S({type:"SETTINGS_GET",key:"crawlIncludeRegex"}),S({type:"SETTINGS_GET",key:"crawlExcludeRegex"})]);if(u)return;const O=C.data;typeof O=="number"&&O>=1&&w(Math.min(200,O));const Z=B.data,X=M.data;typeof Z=="string"&&Z&&y(Z),typeof X=="string"&&X&&j(X),(typeof Z=="string"&&Z||typeof X=="string"&&X)&&h(!0)}),()=>{u=!0}},[]);function Q(u){w(u),W&&S({type:"SETTINGS_SET",key:"crawlMaxPages",value:u})}function p(u){y(u),W&&S({type:"SETTINGS_SET",key:"crawlIncludeRegex",value:u})}function z(u){j(u),W&&S({type:"SETTINGS_SET",key:"crawlExcludeRegex",value:u})}function A(u){R(u),S({type:"SETTINGS_SET",key:"crawlRememberSettings",value:u}),u&&(S({type:"SETTINGS_SET",key:"crawlMaxPages",value:x}),S({type:"SETTINGS_SET",key:"crawlIncludeRegex",value:g.trim()}),S({type:"SETTINGS_SET",key:"crawlExcludeRegex",value:b.trim()}))}function I(u){const T=E.find(L=>L.id===u);T&&(F(u),S({type:"SETTINGS_SET",key:"activePresetId",value:u}),S({type:"SETTINGS_SET",key:"stateMatrix",value:T.matrix}))}function H(){U(null);for(const[u,T]of[["Include",g.trim()],["Exclude",b.trim()]])if(T)try{new RegExp(T)}catch(L){return U(`${u} regex invalid: ${L instanceof Error?L.message:String(L)}`),!1}return!0}function D(){const u=i.trim();if(!u)return null;let T;try{T=new URL(u)}catch{return"Start URL must be a full URL starting with http:// or https://."}return T.protocol!=="http:"&&T.protocol!=="https:"?`Start URL must use http:// or https:// — ${T.protocol} can't be crawled.`:null}const N=D(),q=!!i.trim()&&!N;function V(u){if(!H()||!q)return;const T={startUrl:i.trim(),maxPages:x,includeRegex:g.trim(),excludeRegex:b.trim()};u&&o?o(T):r(T)}return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"var(--v2-pad-3)",textAlign:"left"},children:[e.jsxs(J,{label:"Start URL",children:[e.jsx("input",{type:"url",value:i,onChange:u=>v(u.target.value),placeholder:"https://yoursite.com",disabled:a,"aria-invalid":!!N,className:"v2-mono",style:ee}),N&&e.jsx("p",{role:"alert",style:{margin:"4px 0 0",fontSize:11,color:"var(--v2-critical)",lineHeight:1.4},children:N})]}),e.jsx(J,{label:"Max pages",hint:"1–200. Each page runs the full pipeline you configured.",children:e.jsx("input",{type:"number",min:1,max:200,value:x,onChange:u=>Q(Math.min(200,Math.max(1,parseInt(u.target.value,10)||25))),disabled:a,className:"v2-mono",style:{...ee,maxWidth:100}})}),e.jsx(J,{label:"Audit depth",hint:"State matrix preset applied to every crawled page.",children:e.jsx("select",{value:f,onChange:u=>I(u.target.value),disabled:a,style:ee,children:E.map(u=>e.jsx("option",{value:u.id,children:u.name},u.id))})}),e.jsx("button",{type:"button",onClick:()=>h(u=>!u),className:"v2-eyebrow",style:{background:"none",border:"none",padding:0,cursor:"pointer",color:"var(--v2-ink-secondary)",textAlign:"left",alignSelf:"flex-start"},children:k?"− hide advanced filters":"+ show URL filters (include / exclude)"}),k&&e.jsxs(e.Fragment,{children:[e.jsx(J,{label:"Include only URLs matching",hint:"Optional regex. Empty = no filter.",children:e.jsx("input",{type:"text",value:g,onChange:u=>p(u.target.value),placeholder:"^https://example\\.com/products/",disabled:a,className:"v2-mono",style:ee})}),e.jsx(J,{label:"Exclude URLs matching",hint:"Optional regex. Useful for /admin or /login while logged in.",children:e.jsx("input",{type:"text",value:b,onChange:u=>z(u.target.value),placeholder:"/admin|/dashboard|/login",disabled:a,className:"v2-mono",style:ee})})]}),$&&e.jsx("p",{role:"alert",style:{color:"var(--v2-critical)",fontSize:12,margin:0,padding:"var(--v2-pad-2) var(--v2-pad-3)",border:"1px solid var(--v2-critical)",borderRadius:4,background:"rgba(207, 44, 44, 0.06)"},children:$}),e.jsxs("label",{style:{display:"flex",alignItems:"flex-start",gap:"var(--v2-pad-2)",fontSize:12,lineHeight:1.4,color:"var(--v2-ink-secondary)",cursor:"pointer"},children:[e.jsx("input",{type:"checkbox",checked:W,disabled:a,onChange:u=>A(u.target.checked),style:{marginTop:2}}),e.jsxs("span",{children:[e.jsx("strong",{style:{color:"var(--v2-ink-primary)"},children:"Remember these settings."})," ","Keep max pages + the include/exclude filters for next time (the audit-depth preset is always remembered)."]})]}),e.jsxs("label",{style:{display:"flex",alignItems:"flex-start",gap:"var(--v2-pad-2)",fontSize:12,lineHeight:1.4,color:"var(--v2-ink-secondary)",cursor:"pointer"},children:[e.jsx("input",{type:"checkbox",checked:l,disabled:a,onChange:u=>n(u.target.checked),style:{marginTop:2}}),e.jsxs("span",{children:[e.jsx("strong",{style:{color:"var(--v2-ink-primary)"},children:"Review pages before auditing."})," ","List every page that would be crawled, then remove any you don't want before the audit runs."]})]}),e.jsxs("div",{style:{display:"flex",gap:"var(--v2-pad-2)",flexWrap:"wrap",marginTop:"var(--v2-pad-2)"},children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary",disabled:a||!q,onClick:()=>V(!1),children:a?"Crawling…":l?"Find pages to audit":"Crawl whole site"}),o&&e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost",disabled:a||!q,onClick:()=>V(!0),title:"Skip walkthroughs that previously passed or were human-verified",children:"Verify fixes only"}),s&&e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost",disabled:a,onClick:s,title:"Single-page audit on the active tab (no crawl)",children:"Just this page"})]})]})}function pt(){var w;const t=m(g=>g.siteCrawlProgress),a=m(g=>g.siteCrawlStatus),r=m(g=>g.progress),o=m(g=>g.aiProgress),[s,l]=c.useState(!1);function n(){l(!0),S({type:"CANCEL_SITE_CRAWL"})}if(a!=="running")return null;const i=t?Math.min(100,Math.max(0,t.current/Math.max(1,t.total)*100)):0,v=r?Math.min(100,Math.max(0,r.current/Math.max(1,r.total)*100)):0,x=r!=null&&r.currentState?[r.currentState.pseudoState,r.currentState.theme&&r.currentState.theme!=="light"?r.currentState.theme:null,r.currentState.direction&&r.currentState.direction!=="ltr"?r.currentState.direction:null,(w=r.currentState.breakpoint)!=null&&w.id&&r.currentState.breakpoint.id!=="desktop"?r.currentState.breakpoint.id:null].filter(Boolean).join(" · "):"";return e.jsxs("div",{role:"status","aria-live":"polite",style:{background:"var(--v2-bg-elev)",border:"1px solid var(--v2-border)",borderRadius:6,padding:"var(--v2-pad-4)",display:"flex",flexDirection:"column",gap:"var(--v2-pad-3)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"var(--v2-pad-3)"},children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0,color:"var(--v2-action)"},children:"crawling…"}),e.jsx("p",{className:"v2-mono",style:{margin:0,fontSize:12,fontWeight:600,color:"var(--v2-ink-primary)",fontVariantNumeric:"tabular-nums"},children:t?`${t.current} / ${t.total}`:"…"})]}),e.jsx("div",{role:"progressbar","aria-valuenow":(t==null?void 0:t.current)??0,"aria-valuemin":0,"aria-valuemax":(t==null?void 0:t.total)??1,"aria-label":"Crawl progress",style:{height:8,background:"var(--v2-bg-elev-2)",borderRadius:4,overflow:"hidden"},children:e.jsx("div",{style:{height:"100%",width:`${i}%`,background:"var(--v2-action)",transition:"width 240ms ease"}})}),(t==null?void 0:t.url)&&e.jsxs("div",{children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0,marginBottom:4},children:"current page"}),e.jsx("p",{className:"v2-mono",style:{margin:0,fontSize:11,color:"var(--v2-ink-secondary)",wordBreak:"break-all"},children:t.url})]}),(t==null?void 0:t.lastViolations)!==void 0&&t.lastViolations>0&&e.jsxs("p",{className:"v2-mono",style:{margin:0,fontSize:11,color:"var(--v2-ink-tertiary)",fontVariantNumeric:"tabular-nums"},children:["last page: ",t.lastViolations," axe violation",t.lastViolations===1?"":"s"]}),r&&e.jsxs("div",{style:{marginTop:"var(--v2-pad-2)",paddingTop:"var(--v2-pad-3)",borderTop:"1px solid var(--v2-border)",display:"flex",flexDirection:"column",gap:"var(--v2-pad-2)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"var(--v2-pad-3)"},children:[e.jsx("span",{className:"v2-eyebrow",style:{color:"var(--v2-ink-tertiary)"},children:"this page · auditing"}),e.jsxs("span",{className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-secondary)",fontVariantNumeric:"tabular-nums"},children:[r.current," / ",r.total]})]}),e.jsx("div",{role:"progressbar","aria-valuenow":r.current,"aria-valuemin":0,"aria-valuemax":r.total,"aria-label":"Current page audit progress",style:{height:4,background:"var(--v2-bg-elev-2)",borderRadius:2,overflow:"hidden"},children:e.jsx("div",{style:{height:"100%",width:`${v}%`,background:"var(--v2-ink-tertiary)",transition:"width 240ms ease"}})}),x&&e.jsxs("p",{className:"v2-mono",style:{margin:0,fontSize:11,color:"var(--v2-ink-tertiary)"},children:["state: ",x]}),o&&e.jsxs("p",{className:"v2-mono",style:{margin:0,fontSize:11,color:"var(--v2-needs-review)",fontVariantNumeric:"tabular-nums"},children:["AI: ",o.current," / ",o.total," · ",o.currentCheckLabel,o.candidatesTotal&&o.candidatesTotal>0?` (${o.candidatesDone??0}/${o.candidatesTotal})`:""]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--v2-pad-3)"},children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",onClick:n,disabled:s,children:s?"Cancelling…":"Cancel crawl"}),s&&e.jsx("span",{"aria-live":"polite",style:{fontSize:11,color:"var(--v2-ink-tertiary)"},children:"Wrapping up current page audit — final cancel can take up to a few seconds."})]})]})}function vt(){const t=m(s=>s.crawlDiscoveryStatus),a=m(s=>s.crawlDiscoveryFound),r=m(s=>s.crawlDiscoveryLastUrl);function o(){S({type:"CANCEL_CRAWL_DISCOVERY"}),m.getState().resetCrawlDiscovery()}return t!=="discovering"?null:e.jsxs("div",{role:"status","aria-live":"polite",style:{background:"var(--v2-bg-elev)",border:"1px solid var(--v2-border)",borderRadius:6,padding:"var(--v2-pad-4)",display:"flex",flexDirection:"column",gap:"var(--v2-pad-3)"},children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0,color:"var(--v2-action)"},children:"finding pages…"}),e.jsxs("p",{className:"v2-mono",style:{margin:0,fontSize:12,fontWeight:600,color:"var(--v2-ink-primary)",fontVariantNumeric:"tabular-nums"},children:[a," page",a===1?"":"s"," found"]}),r&&e.jsx("p",{className:"v2-mono",style:{margin:0,fontSize:11,color:"var(--v2-ink-secondary)",wordBreak:"break-all"},children:r}),e.jsx("p",{style:{margin:0,fontSize:11,color:"var(--v2-ink-tertiary)",lineHeight:1.4},children:"Loading each page to read its links — no audit yet. You'll prune the list before anything is audited."}),e.jsx("div",{children:e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",onClick:o,children:"Cancel"})})]})}function gt({onAudit:t}){const a=m(n=>n.crawlDiscoveryStatus),r=m(n=>n.crawlDiscoveryUrls),[o,s]=c.useState(new Set);c.useEffect(()=>{a==="reviewing"&&s(new Set(r))},[a,r]);function l(){S({type:"CANCEL_CRAWL_DISCOVERY"}),m.getState().resetCrawlDiscovery()}return a!=="reviewing"?null:e.jsxs("div",{style:{background:"var(--v2-bg-elev)",border:"1px solid var(--v2-border)",borderRadius:6,padding:"var(--v2-pad-4)",display:"flex",flexDirection:"column",gap:"var(--v2-pad-3)",textAlign:"left"},children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0,color:"var(--v2-action)"},children:"review pages to audit"}),e.jsxs("p",{style:{margin:0,fontSize:12,color:"var(--v2-ink-secondary)",lineHeight:1.4},children:["Found ",e.jsx("strong",{style:{color:"var(--v2-ink-primary)"},children:r.length})," page",r.length===1?"":"s",". Uncheck any you don't want, then audit the rest. ",e.jsx("strong",{style:{color:"var(--v2-ink-primary)"},children:o.size})," selected."]}),r.length===0?e.jsx("p",{style:{margin:0,fontSize:12,color:"var(--v2-ink-tertiary)"},children:"No pages discovered from this URL. Check the start URL + filters and try again."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{display:"flex",gap:"var(--v2-pad-3)"},children:[e.jsx("button",{type:"button",onClick:()=>s(new Set(r)),style:{background:"none",border:"none",padding:0,cursor:"pointer",color:"var(--v2-action)",fontSize:11},children:"select all"}),e.jsx("button",{type:"button",onClick:()=>s(new Set),style:{background:"none",border:"none",padding:0,cursor:"pointer",color:"var(--v2-action)",fontSize:11},children:"select none"})]}),e.jsx("ul",{style:{listStyle:"none",margin:0,padding:0,maxHeight:300,overflowY:"auto",border:"1px solid var(--v2-border)",borderRadius:4},children:r.map(n=>e.jsx("li",{style:{borderBottom:"1px solid var(--v2-border)"},children:e.jsxs("label",{style:{display:"flex",alignItems:"flex-start",gap:"var(--v2-pad-2)",padding:"6px 10px",fontSize:11,cursor:"pointer"},children:[e.jsx("input",{type:"checkbox",checked:o.has(n),onChange:i=>s(v=>{const x=new Set(v);return i.target.checked?x.add(n):x.delete(n),x}),style:{marginTop:2}}),e.jsx("span",{className:"v2-mono",style:{wordBreak:"break-all",color:"var(--v2-ink-secondary)"},children:n})]})},n))})]}),e.jsxs("div",{style:{display:"flex",gap:"var(--v2-pad-2)",flexWrap:"wrap"},children:[e.jsxs("button",{type:"button",className:"v2-btn v2-btn-primary",disabled:o.size===0,onClick:()=>t(r.filter(n=>o.has(n))),children:["Audit ",o.size," page",o.size===1?"":"s"]}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost",onClick:l,children:"Cancel"})]})]})}function ht(){const t=m(w=>w.status),a=m(w=>w.progress),r=m(w=>w.aiProgress),[o,s]=c.useState(!1);if(t!=="running")return null;const l=a?a.current>=a.total:!1,n=a?l?"Running deep analyzers…":`Auditing… ${a.current} / ${a.total}`:"Starting audit…",i=a?l?"reading order · tab order · typography · CSS vars · AI candidates":mt(a.currentState):"Loading axe + DOM analyzers",v=a?l?100:a.current/Math.max(1,a.total)*100:0;function x(){s(!0),S({type:"CANCEL_AUDIT"})}return e.jsxs("div",{role:"status","aria-live":"polite",style:{background:"var(--v2-bg-elev)",border:"1px solid var(--v2-border)",borderRadius:6,padding:"var(--v2-pad-4)",display:"flex",flexDirection:"column",gap:"var(--v2-pad-4)"},children:[e.jsx(xe,{label:n,detail:i,pct:v,valuenow:a?Math.min(a.current,a.total):0,valuemax:a?a.total:1,ariaLabel:a?l?"Running deep analyzers: reading order, tab order, typography, custom properties, AI candidates.":`Audit progress: ${a.current} of ${a.total} states`:"Audit starting",fillColor:"var(--v2-action)"}),r&&e.jsx(xe,{label:`AI augmentation… ${r.current} / ${r.total}`,detail:r.candidatesTotal&&r.candidatesTotal>0?`${r.currentCheckLabel} (${r.candidatesDone??0}/${r.candidatesTotal})`:r.currentCheckLabel,pct:r.current/Math.max(1,r.total)*100,valuenow:r.current,valuemax:r.total,ariaLabel:`AI augmentation: ${r.current} of ${r.total} checks. ${r.currentCheckLabel}`,fillColor:"var(--v2-needs-review)"}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--v2-pad-3)"},children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",onClick:x,disabled:o,children:o?"Cancelling…":"Cancel audit"}),o&&e.jsx("span",{"aria-live":"polite",style:{fontSize:11,color:"var(--v2-ink-tertiary)"},children:"Wrapping up — final cancel can take up to a few seconds."})]})]})}function xe({label:t,detail:a,pct:r,valuenow:o,valuemax:s,ariaLabel:l,fillColor:n}){return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:"var(--v2-pad-2)"},children:[e.jsx("div",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"var(--v2-pad-3)"},children:e.jsx("span",{className:"v2-eyebrow",style:{margin:0,color:"var(--v2-action)"},children:t})}),e.jsx("div",{role:"progressbar","aria-valuenow":o,"aria-valuemin":0,"aria-valuemax":s,"aria-label":l,style:{height:6,background:"var(--v2-bg-elev-2)",borderRadius:3,overflow:"hidden"},children:e.jsx("div",{style:{height:"100%",width:`${r}%`,background:n,transition:"width 240ms ease"}})}),a&&e.jsx("p",{className:"v2-mono",style:{margin:0,fontSize:11,color:"var(--v2-ink-secondary)",wordBreak:"break-all"},children:a})]})}function mt(t){if(!t)return"";const a=[t.pseudoState];return t.theme&&t.theme!=="light"&&a.push(t.theme),t.direction&&t.direction!=="ltr"&&a.push(t.direction),a.join(" · ")}function J({label:t,hint:a,children:r}){return e.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:4},children:[e.jsx("span",{className:"v2-eyebrow",style:{color:"var(--v2-ink-secondary)"},children:t}),r,a&&e.jsx("span",{style:{fontSize:11,color:"var(--v2-ink-tertiary)",lineHeight:1.4},children:a})]})}const ee={fontFamily:"var(--v2-body)",fontSize:12,padding:"8px 10px",background:"var(--v2-bg)",color:"var(--v2-ink-primary)",border:"1px solid var(--v2-border-strong)",borderRadius:4,outline:"none"};function ft({sealed:t}){const[a,r]=c.useState(!1),o=JSON.stringify({claim:t.claim,hash:t.hash,receipt:t.receipt},null,2),s=new Date(t.claim.auditedAt).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"}),l=()=>{navigator.clipboard.writeText(o).then(()=>{r(!0),setTimeout(()=>r(!1),2500)})};return e.jsxs("div",{role:"group","aria-label":"Wall of Fame badge",style:{marginTop:"var(--v2-pad-5)",padding:"var(--v2-pad-4)",border:"1px solid var(--v2-verified, #15803d)",borderRadius:6,background:"var(--v2-verified-bg, rgba(21,128,61,0.06))",maxWidth:640},children:[e.jsx("p",{style:{margin:0,fontWeight:600,fontSize:13,color:"var(--v2-ink-primary)"},children:"🏆 You earned a Wall of Fame badge"}),e.jsxs("p",{style:{margin:"var(--v2-pad-2) 0 0",fontSize:12,color:"var(--v2-ink-secondary)"},children:["WCAG ",t.claim.wcagLevel," · grade ",t.claim.grade," · ",t.claim.pageCount," page",t.claim.pageCount===1?"":"s"," · audited ",s]}),e.jsxs("p",{style:{margin:"var(--v2-pad-2) 0 0",fontSize:11,lineHeight:1.5,color:"var(--v2-ink-tertiary)"},children:["Submit this signed attestation at ",e.jsx("strong",{children:"accessibilitywatch.org"})," to claim a public, dated, verifiable badge for ",e.jsx("strong",{children:t.claim.domain}),". They verify the signature and confirm you control the domain before it goes live."]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--v2-pad-2)",marginTop:"var(--v2-pad-3)"},children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary v2-btn-sm",onClick:l,children:a?"Copied ✓":"Copy attestation"}),e.jsx("span",{role:"status","aria-live":"polite",style:{fontSize:11,color:"var(--v2-verified, #15803d)"},children:a?"Attestation copied to clipboard.":""})]})]})}function xt(t){const[a,r]=c.useState(null);return c.useEffect(()=>{if(!t){r(null);return}let o=!1;const s=()=>Ze({type:"SITE_CLAIM_GET_REQUEST",domain:t}).then(n=>{o||r(n.claim)}).catch(()=>{o||r(null)});s();const l=n=>{typeof n=="object"&&n!==null&&n.type==="SITE_CLAIM_SEALED_EVENT"&&n.domain===t&&s()};return chrome.runtime.onMessage.addListener(l),()=>{o=!0,chrome.runtime.onMessage.removeListener(l)}},[t]),a}function ye({open:t,gaps:a,onRunFull:r,onQuickCheck:o,onCancel:s}){return t?e.jsx("div",{role:"dialog","aria-modal":"true","aria-label":"Audit settings are below WCAG 2.1 AA conformance",style:{position:"fixed",inset:0,background:"rgba(2,6,23,0.7)",zIndex:1e3,display:"flex",alignItems:"center",justifyContent:"center",padding:16},onClick:s,children:e.jsxs("div",{onClick:l=>l.stopPropagation(),style:{background:"#0f172a",border:"1px solid #334155",borderRadius:10,maxWidth:460,width:"100%",padding:20,color:"#e2e8f0"},children:[e.jsx("h2",{style:{margin:"0 0 8px",fontSize:16},children:"Your settings aren’t a Full 2.1 AA audit"}),e.jsxs("p",{style:{margin:"0 0 10px",fontSize:13,color:"#cbd5e1",lineHeight:1.5},children:["A grade only means WCAG 2.1 AA if the audit exercised the states and checks the AA criteria live in. With your current settings, this run is a ",e.jsx("strong",{children:"quick check"}),", not a conformance result."]}),e.jsx("ul",{style:{margin:"0 0 14px",paddingLeft:18,fontSize:12,color:"#fca5a5",lineHeight:1.6},children:a.map((l,n)=>e.jsx("li",{children:l},n))}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:8},children:[e.jsx("button",{onClick:r,style:{background:"#2563eb",color:"#fff",border:"none",borderRadius:6,padding:"10px 12px",fontSize:13,fontWeight:600,cursor:"pointer"},children:"Run the Full 2.1 AA audit (applies the preset, then crawls)"}),e.jsx("button",{onClick:o,style:{background:"#1e293b",color:"#cbd5e1",border:"1px solid #334155",borderRadius:6,padding:"10px 12px",fontSize:13,cursor:"pointer"},children:"Quick check with current settings — not a conformance result"}),e.jsx("button",{onClick:s,style:{background:"none",color:"#64748b",border:"none",fontSize:12,padding:"4px",cursor:"pointer"},children:"Cancel"})]}),e.jsx("p",{style:{margin:"12px 0 0",fontSize:11,color:"#64748b",lineHeight:1.5},children:"Either way, the grade and every export are stamped with the exact settings used — a quick check can’t be mistaken for a conformance result. (Owner mode isn’t affected; it only flags demand-letter bait.)"})]})}):null}function yt(){const[t,a]=c.useState([]),[r,o]=c.useState(!1),s=c.useRef(null),l=c.useRef(!1),n=c.useCallback(async()=>{try{const g=await chrome.storage.local.get(["stateMatrix","runsPerState","aiConfig"]),y=g.aiConfig??{},b=tt({stateMatrix:g.stateMatrix,runsPerState:typeof g.runsPerState=="number"?g.runsPerState:1,aiEnabled:!!y.enabled&&!!y.apiKey});return a(b),b}catch{return a([]),[]}},[]);c.useEffect(()=>{n()},[n]);const i=c.useCallback(async g=>{if((await n()).length===0||l.current){g();return}s.current=g,o(!0)},[n]),v=c.useCallback(async()=>{try{const b=(await chrome.storage.local.get("aiConfig")).aiConfig??{};await chrome.storage.local.set({stateMatrix:at,runsPerState:rt,aiConfig:{...b,enabled:!0}})}catch{}l.current=!0,o(!1);const g=s.current;s.current=null,g==null||g()},[]),x=c.useCallback(()=>{l.current=!0,o(!1);const g=s.current;s.current=null,g==null||g()},[]),w=c.useCallback(()=>{o(!1),s.current=null},[]);return{gaps:t,gateOpen:r,requestCrawl:i,runFull:v,quickCheck:x,cancel:w}}function bt(){const{report:t,resolvedFails:a}=oe(),r=m(d=>d.siteCrawlReport),o=m(d=>d.siteCrawlStatus),s=m(d=>d.siteCrawlError),l=m(d=>d.status),n=o==="running",v=n||l==="running"&&!n,x=!!t&&!r,w=!x&&(t==null?void 0:t.siteGrade)==="A"&&t.startUrl?nt(t.startUrl):null,g=xt(w),[y,b]=c.useState(null);c.useEffect(()=>{let d=!1;return chrome.tabs.query({active:!0,currentWindow:!0}).then(C=>{var M;if(d)return;const B=((M=C[0])==null?void 0:M.url)??null;b(B&&/^https?:\/\//i.test(B)?B:null)}),()=>{d=!0}},[]);const[j,k]=c.useState(!1),h=m(d=>d.crawlDiscoveryStatus),[E,P]=c.useState(!0),f=yt(),[F,$]=c.useState("");c.useEffect(()=>{S({type:"SETTINGS_GET",key:"crawlReviewEnabled"}).then(d=>{const C=d.data;typeof C=="boolean"&&P(C)})},[]);function U(d){P(d),S({type:"SETTINGS_SET",key:"crawlReviewEnabled",value:d})}function W(d,C=!1){if(d.startUrl){if(C){R(d,!0);return}f.requestCrawl(()=>R(d,!1))}}function R(d,C=!1){if(E&&!C){$(d.startUrl),m.getState().setSiteCrawlError(null),m.getState().setCrawlDiscoveryStatus("discovering"),ze({type:"START_CRAWL_DISCOVERY",startUrl:d.startUrl,maxPages:d.maxPages,...d.includeRegex?{includeRegex:d.includeRegex}:{},...d.excludeRegex?{excludeRegex:d.excludeRegex}:{}});return}m.getState().setSiteCrawlStatus("running"),m.getState().setSiteCrawlReport(null),m.getState().setSiteCrawlError(null),ne({type:"START_SITE_CRAWL",startUrl:d.startUrl,maxPages:d.maxPages,...d.includeRegex?{includeRegex:d.includeRegex}:{},...d.excludeRegex?{excludeRegex:d.excludeRegex}:{},...C?{verifyFixesOnly:!0}:{}})}function Q(d){d.length!==0&&(m.getState().setSiteCrawlStatus("running"),m.getState().setSiteCrawlReport(null),m.getState().setSiteCrawlError(null),m.getState().resetCrawlDiscovery(),ne({type:"START_SITE_CRAWL",startUrl:F,urls:d}))}function p(){ne({type:"START_AUDIT",mode:"full-page"}),m.getState().startNewScan()}const[z,A]=c.useState(!1),[I,H]=c.useState(null),[D,N]=c.useState(null);async function q(){A(!0),H(null),N(null);const d=(t==null?void 0:t.siteGrade)??"A";try{const C=await S({type:"REGRADE_SITE_CRAWL"});if((C==null?void 0:C.ok)===!0)setTimeout(()=>{var O;const M=((O=m.getState().siteCrawlReport)==null?void 0:O.siteGrade)??d;N({prevGrade:d,nextGrade:M,at:Date.now()})},0);else{const M=(C==null?void 0:C.reason)??"Regrade failed.";H(M)}}catch(C){H(C instanceof Error?C.message:String(C))}finally{A(!1)}}if(c.useEffect(()=>{if(!D)return;const d=setTimeout(()=>N(null),6e3);return()=>clearTimeout(d)},[D]),v)return e.jsx("section",{"aria-label":"Audit in progress",style:{padding:"var(--v2-pad-5) var(--v2-pad-5)",borderBottom:"1px solid var(--v2-border)"},children:n?e.jsx(pt,{}):e.jsx(ht,{})});if(h==="discovering"||h==="reviewing")return e.jsx("section",{"aria-label":"Choose pages to audit",style:{padding:"var(--v2-pad-5) var(--v2-pad-5)",borderBottom:"1px solid var(--v2-border)",maxWidth:640,margin:"0 auto"},children:h==="discovering"?e.jsx(vt,{}):e.jsx(gt,{onAudit:Q})});if(!t)return e.jsxs("section",{"aria-label":"No audit yet",style:{padding:"var(--v2-pad-6) var(--v2-pad-5)",borderBottom:"1px solid var(--v2-border)",maxWidth:640,margin:"0 auto"},children:[e.jsx("p",{className:"v2-eyebrow",style:{marginBottom:"var(--v2-pad-2)"},children:"new audit"}),e.jsx("h1",{className:"v2-display",style:{fontSize:28,fontWeight:500,letterSpacing:"-0.02em",color:"var(--v2-ink-primary)",margin:0,marginBottom:"var(--v2-pad-2)"},children:"Configure your crawl."}),s&&e.jsxs("div",{role:"alert",style:{marginBottom:"var(--v2-pad-4)",padding:"var(--v2-pad-3) var(--v2-pad-4)",border:"1px solid var(--v2-critical)",borderRadius:4,background:"rgba(207, 44, 44, 0.06)",color:"var(--v2-critical)",fontSize:12,lineHeight:1.5},children:[e.jsx("strong",{style:{fontWeight:600,marginRight:6},children:"Last crawl failed:"}),s]}),e.jsx("p",{style:{color:"var(--v2-ink-secondary)",margin:0,marginBottom:"var(--v2-pad-5)",maxWidth:520},children:"The crawler follows internal links from the start URL, same-origin only. Each page runs your full audit pipeline (axe + DOM analyzers + AI walkthroughs). Findings appear below as a single unified list."}),e.jsx(fe,{initialUrl:y??"",isRunning:v,onCrawl:d=>W(d,!1),onAuditThisPage:p,reviewEnabled:E,onToggleReview:U}),e.jsx(ye,{open:f.gateOpen,gaps:f.gaps,onRunFull:f.runFull,onQuickCheck:f.quickCheck,onCancel:f.cancel})]});const V=a.length,u=(t.totalWalkthroughFindings??0)+t.totalUniqueViolations+V,T=(t.walkthroughAcknowledgements??[]).length,L=t.totalNeedsReview;return e.jsxs("section",{"aria-label":"Audit summary",style:{padding:"var(--v2-pad-6) var(--v2-pad-5)",borderBottom:"1px solid var(--v2-border)"},children:[e.jsxs("div",{style:{display:"grid",gridTemplateColumns:"auto 1fr",gap:"var(--v2-pad-6)"},children:[e.jsx(wt,{grade:t.siteGrade}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",gap:"var(--v2-pad-3)"},children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0},children:x?"page grade · single-page audit":`site grade · ${t.pagesAudited} page${t.pagesAudited===1?"":"s"}`}),e.jsxs("p",{style:{margin:0,fontSize:11,lineHeight:1.4,color:"var(--v2-ink-tertiary)"},children:["Your ",e.jsx("strong",{children:"combined grade"})," — severity (your most serious finding) and breadth (how many of the 9 areas have issues) together, with a legal floor so a serious issue can't be averaged away. The Dev view shows the same letter."]}),e.jsx("h1",{className:"v2-display",style:{fontSize:22,fontWeight:500,letterSpacing:"-0.01em",color:"var(--v2-ink-primary)",margin:0,lineHeight:1.25},children:(()=>{var B,M;if(((B=t.spotCheckGate)==null?void 0:B.status)==="pending"){const O=t.spotCheckGate;return`On track for A — answer ${O.unanswered.length} more content-meaning spot-check${O.unanswered.length===1?"":"s"} below to finalize your grade (${O.answered}/${O.total} done).`}const d=u+L,C=((M=t.blockingCriteria)==null?void 0:M.length)??0;return d===0&&C===0?"All clear — nothing open.":d===0&&C>0?`Visible findings clear — ${C} criteri${C===1?"on":"a"} still need${C===1?"s":""} your judgment.`:`${d} finding${d===1?"":"s"} to address.`})()}),e.jsx(jt,{openCount:u,reviewCount:L,verifiedCount:T,axeCount:t.totalUniqueViolations,walkthroughCount:t.totalWalkthroughFindings??0,autoCount:V}),y&&!kt(y,t.startUrl)&&e.jsxs("p",{className:"v2-mono",style:{margin:0,fontSize:11,color:"var(--v2-ink-tertiary)",wordBreak:"break-all"},children:["Active tab: ",y]}),e.jsxs("div",{style:{display:"flex",gap:"var(--v2-pad-2)",marginTop:"var(--v2-pad-2)",flexWrap:"wrap"},children:[x?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary",onClick:p,title:"Re-audit the current page",children:"Re-audit this page"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost",onClick:()=>k(d=>!d),"aria-expanded":j,title:"Open crawl setup to audit the whole site instead",children:j?"Hide crawl options":"Crawl whole site"})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary",onClick:q,disabled:z,title:"Re-aggregate this audit against your latest verdicts + acks. No re-crawl. Use this after marking criteria in the Coverage gaps panel.",children:z?"Regrading…":"Regrade"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost",onClick:()=>W({startUrl:t.startUrl,maxPages:25,includeRegex:"",excludeRegex:""},!1),title:`Re-crawl ${t.startUrl} (same options) — full audit re-run, use when page code changed`,children:"Re-crawl"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost",onClick:p,title:"Single-page audit of the active tab (no crawl)",children:"Just this page"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost",onClick:()=>W({startUrl:t.startUrl,maxPages:25,includeRegex:"",excludeRegex:""},!0),title:"Skip walkthroughs that previously passed or were human-verified",children:"Verify fixes only"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost",onClick:()=>k(d=>!d),"aria-expanded":j,children:j?"Hide options":"Adjust options"})]}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",onClick:()=>void Ie(),title:"Wipe these results so you can start fresh",style:{marginLeft:"auto"},children:"Clear results"})]}),I&&e.jsx("p",{role:"alert",style:{margin:"var(--v2-pad-2) 0 0",fontSize:11,color:"var(--v2-critical)"},children:I}),D&&!I&&e.jsx("p",{role:"status",style:{margin:"var(--v2-pad-2) 0 0",fontSize:11,color:"var(--v2-verified)"},children:D.prevGrade===D.nextGrade?`Regraded — grade unchanged at ${D.nextGrade}. Any verdict changes you made were already in this report.`:`Regraded — grade ${D.prevGrade} → ${D.nextGrade}.`})]})]}),(g==null?void 0:g.receipt)&&e.jsx(ft,{sealed:g}),e.jsx(Ne,{}),e.jsx(Ue,{}),j&&e.jsxs("div",{style:{marginTop:"var(--v2-pad-5)",paddingTop:"var(--v2-pad-4)",borderTop:"1px solid var(--v2-border)",maxWidth:640},children:[e.jsx(fe,{initialUrl:t.startUrl,isRunning:v,onCrawl:d=>W(d,!1),onVerifyFixes:d=>W(d,!0),onAuditThisPage:p,reviewEnabled:E,onToggleReview:U}),e.jsx(ye,{open:f.gateOpen,gaps:f.gaps,onRunFull:f.runFull,onQuickCheck:f.quickCheck,onCancel:f.cancel})]})]})}function kt(t,a){try{return new URL(t).origin===new URL(a).origin}catch{return!1}}function wt({grade:t}){if(t==="pending")return e.jsx("div",{"aria-label":"Grade pending — spot-checks outstanding",role:"img",style:{display:"flex",alignItems:"center",justifyContent:"center",minWidth:140},children:e.jsx("span",{className:"v2-display",style:{fontSize:40,lineHeight:1.05,fontWeight:600,color:"var(--v2-ink-secondary, #94a3b8)",letterSpacing:"-0.02em",textAlign:"center"},children:"Pending"})});const a={A:"var(--v2-grade-a)",B:"var(--v2-grade-b)",C:"var(--v2-grade-c)",D:"var(--v2-grade-d)",F:"var(--v2-grade-f)"};return e.jsx("div",{"aria-label":`Grade ${t}`,role:"img",style:{display:"flex",alignItems:"center",justifyContent:"center",minWidth:140},children:e.jsx("span",{className:"v2-display",style:{fontSize:132,lineHeight:1,fontWeight:500,color:a[t],letterSpacing:"-0.04em",fontVariationSettings:'"opsz" 144'},children:t})})}function jt({openCount:t,reviewCount:a,verifiedCount:r,axeCount:o,walkthroughCount:s,autoCount:l}){return e.jsxs("dl",{style:{display:"flex",gap:"var(--v2-pad-4)",flexWrap:"wrap",margin:0,color:"var(--v2-ink-secondary)",fontSize:12},children:[e.jsx(K,{term:"open",value:t,tone:t>0?"attention":"neutral"}),e.jsx(K,{term:"review",value:a,tone:a>0?"review":"neutral"}),e.jsx(K,{term:"verified",value:r,tone:r>0?"positive":"neutral"}),e.jsx("span",{style:{color:"var(--v2-ink-faint)"},children:"·"}),e.jsx(K,{term:"axe",value:o,tone:"neutral"}),e.jsx(K,{term:"walkthrough",value:s,tone:"neutral"}),l>0&&e.jsx(K,{term:"auto-contrast",value:l,tone:"neutral"})]})}function K({term:t,value:a,tone:r}){const o={attention:"var(--v2-critical)",review:"var(--v2-needs-review)",positive:"var(--v2-verified)",neutral:"var(--v2-ink-secondary)"};return e.jsxs("div",{style:{display:"inline-flex",alignItems:"baseline",gap:6},children:[e.jsx("dt",{className:"v2-eyebrow",style:{display:"inline",margin:0,color:"var(--v2-ink-tertiary)"},children:t}),e.jsx("dd",{className:"v2-mono",style:{margin:0,fontWeight:600,fontSize:13,color:o[r],fontVariantNumeric:"tabular-nums"},children:a})]})}const St=new Set(["2.4.3","2.1.2","2.4.7","1.3.2","1.4.11","2.5.3"]);function be(t){return St.has(t)}async function ke(t){var o,s;const a=m.getState();if(a.componentId&&((o=a.results[0])==null?void 0:o.pageUrl)===t)return a.componentId;const r=await je();return((s=r==null?void 0:r.find(l=>l.url===t))==null?void 0:s.componentId)??null}async function Ct(t,a){var l;const r=m.getState(),o=[];if(r.componentId&&r.results.length>0){const n=(l=r.results[0])==null?void 0:l.pageUrl,i=a.find(v=>v.url===n);if(i){for(const v of r.results)for(const x of v.violations)x.ruleId===t&&x.target.selector===i.selector&&o.push({componentId:r.componentId,matchKey:x.matchKey});if(o.length>0)return o}}const s=await je()??[];for(const n of a){const i=s.find(v=>v.url===n.url);if(i)for(const v of i.results)for(const x of v.violations)x.ruleId===t&&x.target.selector===n.selector&&o.push({componentId:i.componentId,matchKey:x.matchKey})}return o}function Rt({row:t}){return e.jsxs("details",{style:{background:"var(--v2-bg-elev)",border:"1px solid var(--v2-border)",borderRadius:6,overflow:"hidden"},children:[e.jsxs("summary",{style:{cursor:"pointer",padding:"var(--v2-pad-3) var(--v2-pad-4)",listStyle:"none",display:"flex",alignItems:"flex-start",gap:"var(--v2-pad-3)"},children:[e.jsx(Tt,{row:t}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx(Et,{row:t}),e.jsx(At,{row:t})]}),e.jsx(It,{})]}),e.jsx("div",{style:{padding:"0 var(--v2-pad-4) var(--v2-pad-4)",borderTop:"1px solid var(--v2-border)"},children:e.jsx(Nt,{row:t})})]})}function Tt({row:t}){if(t.kind==="walkthrough-ack")return e.jsx("span",{className:"v2-chip v2-chip-verified","aria-label":"Status: human verified",children:"verified"});if(t.kind==="needs-review")return e.jsx("span",{className:"v2-chip v2-chip-review","aria-label":"Status: needs human review",children:"review"});if(t.kind==="auto-contrast")return e.jsx("span",{className:"v2-chip v2-chip-serious","aria-label":"Severity: serious, auto-resolved by pixel sampler",title:"Empirical pixel-contrast measurement, not an axe-confirmed violation. Human verification recommended.",children:"auto · serious"});if(t.kind==="walkthrough-fail")return e.jsx("span",{className:t.verdict==="fail"?"v2-chip v2-chip-serious":"v2-chip v2-chip-moderate","aria-label":`Severity: ${t.verdict}`,children:t.verdict});const a={critical:"v2-chip-critical",serious:"v2-chip-serious",moderate:"v2-chip-moderate",minor:"v2-chip-minor"};return e.jsx("span",{className:`v2-chip ${a[t.impact]}`,"aria-label":`Severity: ${t.impact}`,children:t.impact})}function Et({row:t}){const a=t.kind==="walkthrough-fail"||t.kind==="walkthrough-ack"||t.kind==="needs-review"||t.kind==="axe"||t.kind==="auto-contrast"?t.criterion:null,r=t.kind==="walkthrough-fail"?t.verdict==="uncertain"?"AI could not decide this criterion — needs your manual verification.":"AI walkthrough fail on this criterion.":t.kind==="walkthrough-ack"?"Human-verified by an auditor.":t.kind==="needs-review"?t.description:t.kind==="auto-contrast"?"Empirical contrast measurement fell below threshold.":t.description;return e.jsxs("p",{style:{margin:0,marginBottom:4,color:"var(--v2-ink-primary)",fontSize:13,fontWeight:500,lineHeight:1.4},children:[a&&e.jsxs("span",{className:"v2-mono",style:{fontSize:11,fontWeight:600,color:"var(--v2-ink-tertiary)",marginRight:8},children:["WCAG ",a]}),r]})}function At({row:t}){const a=t.kind==="axe"||t.kind==="needs-review"?t.pages.length:1,r=t.kind==="axe"||t.kind==="needs-review"||t.kind==="auto-contrast"?t.selector:null,o=t.kind==="walkthrough-fail"||t.kind==="walkthrough-ack"||t.kind==="auto-contrast"?t.pageUrl:null;return e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"var(--v2-pad-2)",flexWrap:"wrap"},children:[r&&e.jsx("code",{className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-secondary)",background:"var(--v2-bg-elev-2)",padding:"2px 6px",borderRadius:2,wordBreak:"break-all"},children:r}),o&&e.jsx("span",{className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-tertiary)",wordBreak:"break-all"},children:o}),a>1&&e.jsxs("span",{className:"v2-eyebrow",style:{marginLeft:"auto"},children:["on ",a," pages"]})]})}function It(){return e.jsx("span",{"aria-hidden":"true",style:{color:"var(--v2-ink-tertiary)",fontFamily:"var(--v2-mono)",fontSize:12,marginLeft:8,marginTop:2},children:"⏵"})}function Nt({row:t}){return t.kind==="walkthrough-fail"?e.jsx(zt,{row:t}):t.kind==="walkthrough-ack"?e.jsx(Pt,{row:t}):t.kind==="needs-review"?e.jsx(Dt,{row:t}):t.kind==="auto-contrast"?e.jsx(Ut,{row:t}):e.jsx(Lt,{row:t})}function Ut({row:t}){const[a,r]=c.useState(!1),[o,s]=c.useState(!1),[l,n]=c.useState(""),[i,v]=c.useState(!1),[x,w]=c.useState(!1),[g,y]=c.useState(null),b=Se(t.ruleId);async function j(){if(v(!0),y(null),!l.trim()){y("Note is required — explain why the empirical contrast measurement is wrong, or why this element is acceptable in context."),v(!1);return}try{const h=(await st(t.pageUrl)).find(P=>P.ruleId===t.ruleId&&P.selector===t.selector),E={pageUrl:t.pageUrl,ruleId:t.ruleId,selector:t.selector,verdict:"pass",reasoning:`Human override: ${l.trim()}
|
|
3
|
+
|
|
4
|
+
(Original empirical reasoning: ${t.reasoning})`,resolvedAt:new Date().toISOString(),costUsd:0,wcagCriterion:t.criterion,inputHash:h==null?void 0:h.inputHash};await ot(E),w(!0),r(!1)}catch(k){y(k instanceof Error?k.message:String(k))}finally{v(!1)}}return e.jsxs("div",{style:{paddingTop:"var(--v2-pad-3)"},children:[e.jsx(te,{label:"Empirical measurement",children:e.jsx("p",{style:{margin:0,color:"var(--v2-ink-secondary)",fontSize:12,lineHeight:1.6,whiteSpace:"pre-wrap"},children:t.reasoning})}),e.jsx("p",{style:{margin:0,marginBottom:"var(--v2-pad-3)",fontSize:11,color:"var(--v2-ink-tertiary)",lineHeight:1.5,fontStyle:"italic"},children:"This finding came from a pixel-level screenshot diff of text against the rendered background, not from axe-core. Treat as a strong hint for human review, not a confirmed violation — gradients, translucent overlays, and animated backdrops can fool the sampler."}),x?e.jsx(ce,{}):e.jsxs(e.Fragment,{children:[e.jsxs(de,{children:[b&&e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",onClick:()=>s(k=>!k),"aria-expanded":o,children:o?"Hide fix recipe":"Show fix recipe"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary v2-btn-sm",onClick:()=>r(k=>!k),"aria-expanded":a,children:a?"Cancel":"Mark verified manually"})]}),o&&b&&e.jsx(Re,{summary:b.summary,snippet:b.snippet}),a&&e.jsx(le,{note:l,setNote:n,busy:i,err:g,onConfirm:j,hint:"Why the empirical measurement is wrong, or why this is acceptable. Overrides the resolution to pass.",placeholder:"e.g., Text sits over a video poster image; static screenshot misreads the rendered background. Production poster passes 7:1."}),g&&!a&&e.jsx(ae,{message:g})]})]})}function zt({row:t}){const[a,r]=c.useState(!1),[o,s]=c.useState(""),[l,n]=c.useState(!1),[i,v]=c.useState(!1),[x,w]=c.useState(!1),[g,y]=c.useState(null),[b,j]=c.useState(null),k=be(t.criterion),h=Pe();async function E(){if(n(!0),j(null),!o.trim()){j("Note is required — explain how you manually verified this."),n(!1);return}try{const f=await ke(t.pageUrl);if(!f){j("Could not find this page in the audit data. Re-run the audit and try again.");return}await it({componentId:f,criterionId:t.criterion,pageUrl:t.pageUrl,note:o.trim(),acknowledgedAt:new Date().toISOString(),verdictAtAck:t.verdict}),v(!0),r(!1)}catch(f){j(f instanceof Error?f.message:String(f))}finally{n(!1)}}async function P(){var f;w(!0),y(null),j(null);try{const $=(f=(await chrome.tabs.query({active:!0,currentWindow:!0}))[0])==null?void 0:f.id;if(!$){j("Open the audited page in your active tab to re-run.");return}const U=await ke(t.pageUrl);if(!U){j("Could not find this page in the audit data.");return}if(!be(t.criterion)){j(`Re-run is only available for interactive criteria. ${t.criterion} is not supported.`);return}const R=await S({type:"INTERACTIVE_AUDIT_REQUEST",criterionId:t.criterion,tabId:$,componentId:U,pageUrl:t.pageUrl});if(!R.ok){j(R.error??"Re-run failed.");return}y(`Re-run verdict: ${R.verdict??"unknown"}. Re-audit the page to refresh this list.`)}catch(F){j(F instanceof Error?F.message:String(F))}finally{w(!1)}}return e.jsxs("div",{style:{paddingTop:"var(--v2-pad-3)"},children:[e.jsx(te,{label:"AI reasoning",children:e.jsx("p",{style:{margin:0,color:"var(--v2-ink-secondary)",fontSize:12,lineHeight:1.6},children:t.reasoning})}),i?e.jsx(ce,{}):e.jsxs(e.Fragment,{children:[e.jsxs(de,{children:[k&&e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",onClick:P,disabled:x||!h,title:h?void 0:"AI walkthroughs need an Anthropic API key. Add one in Settings → AI.",children:x?"Re-running…":"Re-run walkthrough"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary v2-btn-sm",onClick:()=>r(f=>!f),"aria-expanded":a,children:a?"Cancel":"Mark verified manually"})]}),g&&e.jsx("p",{role:"status",style:{marginTop:"var(--v2-pad-2)",padding:"var(--v2-pad-2) var(--v2-pad-3)",background:"rgba(15, 143, 94, 0.08)",border:"1px solid var(--v2-verified)",borderRadius:4,color:"var(--v2-verified)",fontSize:11,lineHeight:1.5},children:g}),a&&e.jsx(le,{note:o,setNote:s,busy:l,err:b,onConfirm:E,hint:"Explain what you checked. This goes into the forensic record.",placeholder:"e.g., Verified — focus indicator visible on every interactive control under :focus-visible; tested with keyboard nav."}),b&&!a&&e.jsx(ae,{message:b})]})]})}function Pt({row:t}){return e.jsxs("div",{style:{paddingTop:"var(--v2-pad-3)"},children:[e.jsx(te,{label:"What the human verified",children:e.jsx("p",{style:{margin:0,color:"var(--v2-ink-secondary)",fontSize:12,lineHeight:1.6},children:t.reasoning})}),e.jsxs("p",{style:{color:"var(--v2-ink-tertiary)",fontSize:11,margin:0,marginTop:"var(--v2-pad-2)"},children:["Original AI verdict: ",e.jsx("strong",{children:t.verdict}),". Now treated as pass for conformance."]})]})}function Dt({row:t}){return e.jsx(Ce,{row:t,kind:"needs-review"})}function Lt({row:t}){return e.jsx(Ce,{row:t,kind:"axe"})}function Ce({row:t,kind:a}){const[r,o]=c.useState(!1),[s,l]=c.useState(""),[n,i]=c.useState(!1),[v,x]=c.useState(!1),[w,g]=c.useState(!1),[y,b]=c.useState(null),j=Se(t.ruleId);async function k(){if(i(!0),b(null),!s.trim()){b(a==="needs-review"?"Note is required — explain your review judgment.":"Note is required — explain why this isn't actually an issue in your context."),i(!1);return}try{const h=await Ct(t.ruleId,t.pages);if(h.length===0){b("Could not find this finding in the persisted audit data. Re-run the audit and try again.");return}for(const E of h)await lt({componentId:E.componentId,matchKey:E.matchKey,ruleId:t.ruleId,note:s.trim()});x(!0),o(!1)}catch(h){b(h instanceof Error?h.message:String(h))}finally{i(!1)}}return e.jsxs("div",{style:{paddingTop:"var(--v2-pad-3)"},children:[a==="needs-review"&&t.failureSummary&&e.jsx(te,{label:"AI assessment",children:e.jsx("p",{style:{margin:0,color:"var(--v2-ink-secondary)",fontSize:12,lineHeight:1.6,whiteSpace:"pre-wrap"},children:t.failureSummary})}),e.jsx(te,{label:"Affected",children:e.jsxs("ul",{style:{margin:0,padding:0,listStyle:"none",display:"flex",flexDirection:"column",gap:4},children:[t.pages.slice(0,8).map(h=>e.jsx("li",{children:e.jsx("a",{href:h.url,target:"_blank",rel:"noopener noreferrer",className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-secondary)",textDecoration:"underline",textDecorationColor:"var(--v2-ink-faint)",textUnderlineOffset:2},children:h.url})},h.url)),t.pages.length>8&&e.jsxs("li",{className:"v2-eyebrow",children:["+ ",t.pages.length-8," more"]})]})}),v?e.jsx(ce,{}):e.jsxs(e.Fragment,{children:[e.jsxs(de,{children:[a==="axe"&&j&&e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",onClick:()=>g(h=>!h),"aria-expanded":w,children:w?"Hide fix recipe":"Show fix recipe"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary v2-btn-sm",onClick:()=>o(h=>!h),"aria-expanded":r,children:r?"Cancel":"Mark verified manually"})]}),w&&j&&e.jsx(Re,{summary:j.summary,snippet:j.snippet}),r&&e.jsx(le,{note:s,setNote:l,busy:n,err:y,onConfirm:k,hint:a==="needs-review"?"Your review judgment. Goes into the forensic record.":"Why this isn't actually an issue in your context. Goes into the forensic record.",placeholder:a==="needs-review"?"e.g., Verified — image is a portrait of the named founder; alt text correctly identifies subject and role.":'e.g., This element is decorative; aria-hidden + role="presentation" applied via design system.',confirmLabel:`Confirm — acknowledge on ${t.pages.length} page${t.pages.length===1?"":"s"}`}),y&&!r&&e.jsx(ae,{message:y})]})]})}function le({note:t,setNote:a,busy:r,err:o,onConfirm:s,hint:l,placeholder:n,confirmLabel:i="Confirm acknowledgement"}){return e.jsxs("div",{style:{marginTop:"var(--v2-pad-3)",padding:"var(--v2-pad-3) var(--v2-pad-4)",border:"1px solid var(--v2-border-strong)",borderRadius:4,background:"var(--v2-bg)"},children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0,marginBottom:6},children:"verification note · required"}),e.jsx("p",{style:{margin:0,marginBottom:"var(--v2-pad-2)",fontSize:11,color:"var(--v2-ink-tertiary)"},children:l}),e.jsx("textarea",{value:t,onChange:v=>a(v.target.value),placeholder:n,rows:3,style:{width:"100%",fontFamily:"var(--v2-body)",fontSize:12,lineHeight:1.5,padding:"var(--v2-pad-2) var(--v2-pad-3)",background:"var(--v2-bg)",color:"var(--v2-ink-primary)",border:"1px solid var(--v2-border-strong)",borderRadius:4,resize:"vertical",minHeight:70},autoFocus:!0}),o&&e.jsx(ae,{message:o}),e.jsx("div",{style:{marginTop:"var(--v2-pad-2)"},children:e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary v2-btn-sm",onClick:s,disabled:r||!t.trim(),children:r?"Saving…":i})})]})}function Re({summary:t,snippet:a}){return e.jsxs("div",{style:{marginTop:"var(--v2-pad-3)",padding:"var(--v2-pad-3) var(--v2-pad-4)",border:"1px solid var(--v2-verified)",borderRadius:4,background:"rgba(15, 143, 94, 0.06)"},children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0,marginBottom:6,color:"var(--v2-verified)"},children:"how to fix"}),e.jsx("p",{style:{margin:0,color:"var(--v2-ink-secondary)",fontSize:12,lineHeight:1.6},children:t}),a&&e.jsx("pre",{className:"v2-mono",style:{marginTop:"var(--v2-pad-2)",marginBottom:0,padding:"var(--v2-pad-2) var(--v2-pad-3)",background:"var(--v2-bg)",border:"1px solid var(--v2-border)",borderRadius:3,fontSize:11,color:"var(--v2-ink-primary)",overflowX:"auto",whiteSpace:"pre"},children:e.jsx("code",{children:a})})]})}function ce(){return e.jsxs("div",{role:"status",style:{marginTop:"var(--v2-pad-2)",padding:"var(--v2-pad-2) var(--v2-pad-3)",background:"rgba(15, 143, 94, 0.08)",border:"1px solid var(--v2-verified)",borderRadius:4,color:"var(--v2-verified)",fontSize:12,lineHeight:1.5},children:[e.jsx("strong",{style:{fontWeight:600},children:"✓ Acknowledged."})," ","The ack is saved. Re-audit or re-crawl to see this finding drop out of the list."]})}function ae({message:t}){return e.jsx("p",{role:"alert",style:{marginTop:"var(--v2-pad-2)",marginBottom:0,padding:"var(--v2-pad-2) var(--v2-pad-3)",border:"1px solid var(--v2-critical)",background:"rgba(207, 44, 44, 0.06)",borderRadius:4,color:"var(--v2-critical)",fontSize:11,lineHeight:1.4},children:t})}function te({label:t,children:a}){return e.jsxs("div",{style:{marginBottom:"var(--v2-pad-3)"},children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0,marginBottom:6},children:t}),a]})}function de({children:t}){return e.jsx("div",{style:{display:"flex",gap:"var(--v2-pad-2)",flexWrap:"wrap",marginTop:"var(--v2-pad-2)"},children:t})}function _t(){const{report:t,resolvedFails:a}=oe(),[r,o]=c.useState("open"),s=c.useMemo(()=>t?Ft(t.pages,t.findingGroups??[],a):[],[t,a]),l=c.useMemo(()=>r==="all"?s:s.filter(i=>r==="verified"?i.kind==="walkthrough-ack":r==="review"?i.kind==="needs-review"||i.kind==="walkthrough-fail"&&i.verdict==="uncertain":r==="open"?i.kind==="axe"||i.kind==="walkthrough-fail"&&i.verdict==="fail"||i.kind==="auto-contrast":!0),[s,r]);if(!t)return null;const n={all:s.length,open:s.filter(i=>i.kind==="axe"||i.kind==="walkthrough-fail"&&i.verdict==="fail"||i.kind==="auto-contrast").length,review:s.filter(i=>i.kind==="needs-review"||i.kind==="walkthrough-fail"&&i.verdict==="uncertain").length,verified:s.filter(i=>i.kind==="walkthrough-ack").length};return e.jsxs("section",{"aria-labelledby":"findings-heading",style:{padding:"var(--v2-pad-5) var(--v2-pad-5) var(--v2-pad-7)"},children:[e.jsxs("header",{style:{display:"flex",alignItems:"baseline",justifyContent:"space-between",gap:"var(--v2-pad-3)",marginBottom:"var(--v2-pad-4)",flexWrap:"wrap"},children:[e.jsx("h2",{id:"findings-heading",className:"v2-display",style:{fontSize:20,fontWeight:500,letterSpacing:"-0.01em",color:"var(--v2-ink-primary)",margin:0},children:"Findings"}),e.jsx(Wt,{filter:r,setFilter:o,counts:n})]}),l.length===0?e.jsx(Gt,{filter:r}):e.jsx("ul",{"aria-label":`${r} findings, ${l.length} items`,style:{listStyle:"none",padding:0,margin:0,display:"flex",flexDirection:"column",gap:"var(--v2-pad-2)"},children:l.map((i,v)=>e.jsx("li",{style:{animation:`v2-row-in 240ms ease ${Math.min(v,12)*30}ms both`},children:e.jsx(Rt,{row:i})},i.key))})]})}function Wt({filter:t,setFilter:a,counts:r}){const o=[{id:"open",label:"Open"},{id:"review",label:"Review"},{id:"verified",label:"Verified"},{id:"all",label:"All"}];return e.jsx("div",{role:"tablist","aria-label":"Filter findings",style:{display:"inline-flex",gap:4,background:"var(--v2-bg-elev)",padding:3,borderRadius:6,border:"1px solid var(--v2-border)"},children:o.map(s=>{const l=t===s.id;return e.jsxs("button",{type:"button",role:"tab","aria-selected":l,onClick:()=>a(s.id),style:{fontFamily:"var(--v2-body)",fontSize:11,padding:"5px 10px",borderRadius:4,border:"none",cursor:"pointer",background:l?"var(--v2-bg-elev-2)":"transparent",color:l?"var(--v2-ink-primary)":"var(--v2-ink-secondary)",fontWeight:l?600:500,transition:"background 120ms ease, color 120ms ease",display:"inline-flex",alignItems:"baseline",gap:5},children:[s.label,e.jsx("span",{className:"v2-mono",style:{fontSize:10,color:"var(--v2-ink-tertiary)",fontVariantNumeric:"tabular-nums"},children:r[s.id]})]},s.id)})})}function Gt({filter:t}){const r={open:{headline:"Nothing open.",sub:"No axe violations or AI walkthrough failures across the audited pages. Switch to All to see everything, or to Verified for a record of acknowledged items."},review:{headline:"No items awaiting review.",sub:"AI walkthroughs returned definitive verdicts (or human verifications) for every criterion that needed judgment."},verified:{headline:"No human verifications recorded.",sub:"When you mark a walkthrough finding as manually verified, it appears here with your note + timestamp."},all:{headline:"Nothing to show.",sub:"No audit data yet — run a scan to begin."}}[t];return e.jsxs("div",{role:"status","aria-live":"polite",style:{padding:"var(--v2-pad-6) var(--v2-pad-4)",textAlign:"center",border:"1px dashed var(--v2-border)",borderRadius:6},children:[e.jsx("p",{className:"v2-display",style:{fontSize:18,fontWeight:500,color:"var(--v2-ink-primary)",margin:0,marginBottom:"var(--v2-pad-2)"},children:r.headline}),e.jsx("p",{style:{color:"var(--v2-ink-secondary)",margin:0,maxWidth:440,marginInline:"auto"},children:r.sub})]})}function Ft(t,a,r=[]){const o=[];for(const n of a)n.needsReview?o.push({kind:"needs-review",key:`nr::${n.ruleId}::${n.representativeSelector}`,criterion:n.wcagCriterion,ruleId:n.ruleId,description:n.axeDescription,selector:n.representativeSelector,failureSummary:n.failureSummary,pages:n.pages,group:n}):o.push({kind:"axe",key:`axe::${n.ruleId}::${n.representativeSelector}`,criterion:n.wcagCriterion,ruleId:n.ruleId,impact:n.impact,description:n.axeDescription,selector:n.representativeSelector,pages:n.pages,isShared:n.isShared});const s=new Set;for(const n of t){for(const i of n.walkthroughFindings??[]){const v=`wt-fail::${i.criterionId}::${i.pageUrl}`;s.has(v)||(s.add(v),o.push({kind:"walkthrough-fail",key:v,criterion:i.criterionId,verdict:i.verdict,impact:i.impact,reasoning:i.reasoning,pageUrl:i.pageUrl}))}for(const i of n.walkthroughAcknowledgements??[]){const v=`wt-ack::${i.criterionId}::${i.pageUrl}`;s.has(v)||(s.add(v),o.push({kind:"walkthrough-ack",key:v,criterion:i.criterionId,verdict:i.verdict,reasoning:i.reasoning,pageUrl:i.pageUrl}))}}for(const n of r)o.push({kind:"auto-contrast",key:`auto::${n.ruleId}::${n.selector}::${n.pageUrl}`,criterion:n.wcagCriterion??"1.4.3",ruleId:n.ruleId,impact:"serious",selector:n.selector,pageUrl:n.pageUrl,reasoning:n.reasoning});const l={critical:0,serious:1,moderate:2,minor:3,"needs-review":4,ack:5};return o.sort((n,i)=>{const v=n.kind==="walkthrough-ack"?l.ack:n.kind==="needs-review"?l["needs-review"]:l[n.impact],x=i.kind==="walkthrough-ack"?l.ack:i.kind==="needs-review"?l["needs-review"]:l[i.impact];return(v??99)-(x??99)}),o}function Mt({open:t,onClose:a}){const{report:r}=oe(),o=m(p=>p.siteCrawlReport),s=m(p=>p.results),l=m(p=>p.componentId),n=m(p=>p.delta),i=!!o,v=i||s.length>0,x=m(p=>p.tier),w=p=>!Le(x,p),[g,y]=c.useState(!1),b=()=>y(!0),j=i?"ai-prompt-site-crawl":"ai-prompt",k=De({storeComponentId:l,storeCrawlReport:o,pageUrls:(r==null?void 0:r.pages.map(p=>p.url))??[]}),[h,E]=c.useState({}),P=c.useRef(null);c.useEffect(()=>{var z;if(!t)return;const p=A=>{A.key==="Escape"&&a()};return document.addEventListener("keydown",p),(z=P.current)==null||z.focus(),()=>document.removeEventListener("keydown",p)},[t,a]);function f(p,z){E(A=>({...A,[p]:z}))}async function F(){f("ai-prompt",{state:"busy"});try{if(i){const p=await S({type:"EXPORT_REQUEST",format:"ai-prompt-site-crawl",results:[],...r?{siteCrawlReport:r}:{}});if(!(p!=null&&p.content))throw new Error("Empty response");await navigator.clipboard.writeText(p.content),Je(p.content,"ai-fixer-prompt.md","text/markdown"),f("ai-prompt",{state:"done",message:"Copied to clipboard + saved ai-fixer-prompt.md to Downloads."})}else{if(!s.length)throw new Error("No audit results yet");await ut({results:s,componentId:l??null,delta:n}),f("ai-prompt",{state:"done",message:"Copied to clipboard + opened in a new tab."})}}catch(p){f("ai-prompt",{state:"error",message:p instanceof Error?p.message:String(p)})}}async function $(){f("html",{state:"busy"});try{if(i&&r){const{renderSiteReportHtml:p}=await re(async()=>{const{renderSiteReportHtml:I}=await import("./site-report-renderer-C3U9cFY3.js");return{renderSiteReportHtml:I}},__vite__mapDeps([0,1,2,3,4,5])),z=await ue([r.startUrl]).catch(()=>[]),A=p(r,void 0,z);await se(A,"site-report.html","text/html"),f("html",{state:"done",message:"Opened in a new tab — Save as PDF or use Cmd/Ctrl+S."})}else{if(!s.length)throw new Error("No audit results yet");const{toHtmlPrint:p}=await re(async()=>{const{toHtmlPrint:A}=await import("./scheduled-audit-runner-EQBltZPz.js").then(I=>I.b8);return{toHtmlPrint:A}},__vite__mapDeps([1,2,3,4,5])),z=p(s,n??void 0);await se(z,"page-report.html","text/html"),f("html",{state:"done",message:"Opened in a new tab — Save as PDF or use Cmd/Ctrl+S."})}}catch(p){f("html",{state:"error",message:p instanceof Error?p.message:String(p)})}}async function U(p,z,A){f(p,{state:"busy"});try{const I=await S({type:"EXPORT_REQUEST",format:p,results:i?[]:s,...n&&!i?{delta:n}:{},...i?{siteCrawlSource:!0}:{},...k?{auditTargetId:k}:{}});if(!(I!=null&&I.content))throw new Error("Empty response");await se(I.content,A,"text/html"),f(p,{state:"done",message:`${z} opened in a new tab.`})}catch(I){f(p,{state:"error",message:I instanceof Error?I.message:String(I)})}}async function W(){const{createZip:p}=await re(async()=>{const{createZip:N}=await import("./zip-encoder-CtULHXx_.js");return{createZip:N}},[]),{renderSiteReportHtml:z}=await re(async()=>{const{renderSiteReportHtml:N}=await import("./site-report-renderer-C3U9cFY3.js");return{renderSiteReportHtml:N}},__vite__mapDeps([0,1,2,3,4,5])),A=[],I=i?[{format:"ai-prompt-site-crawl",filename:"ai-fixer-prompt.md"},{format:"defense-bundle",filename:"defense-bundle.html"},{format:"deposition-packet",filename:"deposition-packet.html"},{format:"evidence-bundle",filename:"evidence-bundle.html"},{format:"vpat",filename:"vpat.html"},{format:"conformance-crosswalk",filename:"conformance-crosswalk.html"},{format:"methodology-doc",filename:"methodology-doc.html"},{format:"executive-report",filename:"executive-report.html"}]:[{format:"ai-prompt",filename:"ai-fixer-prompt.md"},{format:"html-print",filename:"page-report.html"}],H=I.length+(i&&r?1:0);let D=0;f("zip",{state:"busy",progress:{current:0,total:H,label:"Starting…"}});try{if(i&&r){D++,f("zip",{state:"busy",progress:{current:D,total:H,label:"site-report.html (client-side)"}});try{const T=await ue([r.startUrl]).catch(()=>[]);A.push({name:"site-report.html",content:z(r,void 0,T)})}catch{}}for(const{format:T,filename:L}of I){D++,f("zip",{state:"busy",progress:{current:D,total:H,label:L}});try{const d=await S({type:"EXPORT_REQUEST",format:T,results:i?[]:s,...n&&!i?{delta:n}:{},...i?{siteCrawlSource:!0}:{},...k?{auditTargetId:k}:{}});d!=null&&d.content&&A.push({name:L,content:d.content})}catch{}}if(A.length===0)throw new Error("All exports failed");const N=p(A),q=new Blob([N],{type:"application/zip"}),V=URL.createObjectURL(q),u=document.createElement("a");u.href=V,u.download=i?"wcagcheckr-site-bundle.zip":"wcagcheckr-page-bundle.zip",u.click(),setTimeout(()=>URL.revokeObjectURL(V),6e4),f("zip",{state:"done",message:`Downloaded ${A.length} file${A.length===1?"":"s"}.`})}catch(N){f("zip",{state:"error",message:N instanceof Error?N.message:String(N)})}}function R(p){m.getState().setView(p),m.getState().setUserMode("dev"),S({type:"SETTINGS_SET",key:"userMode",value:"dev"}),a()}function Q(){S({type:"OPEN_SETTINGS"})}return t?e.jsxs("div",{role:"dialog","aria-modal":"true","aria-label":"Tools and exports",style:{position:"fixed",inset:0,zIndex:50,display:"flex"},children:[e.jsx("div",{onClick:a,style:{position:"absolute",inset:0,background:"rgba(26, 20, 16, 0.35)",backdropFilter:"blur(2px)"},"aria-hidden":"true"}),e.jsxs("div",{style:{position:"relative",marginLeft:"auto",width:"min(100%, 440px)",height:"100%",background:"var(--v2-bg)",borderLeft:"1px solid var(--v2-border-strong)",boxShadow:"-12px 0 28px rgba(26, 20, 16, 0.18)",overflowY:"auto",display:"flex",flexDirection:"column"},children:[e.jsxs("div",{style:{position:"sticky",top:0,background:"var(--v2-bg)",borderBottom:"1px solid var(--v2-border)",padding:"var(--v2-pad-4) var(--v2-pad-5)",display:"flex",alignItems:"center",justifyContent:"space-between",zIndex:1},children:[e.jsx("h2",{className:"v2-display",style:{margin:0,fontSize:18,fontWeight:500,color:"var(--v2-ink-primary)"},children:"Tools"}),e.jsx("button",{ref:P,type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",onClick:a,"aria-label":"Close tools drawer",children:"Close"})]}),e.jsxs("div",{style:{padding:"var(--v2-pad-5)",display:"flex",flexDirection:"column",gap:"var(--v2-pad-5)"},children:[!v&&e.jsx("p",{style:{margin:0,padding:"var(--v2-pad-3) var(--v2-pad-4)",background:"var(--v2-bg-elev)",border:"1px solid var(--v2-border)",borderRadius:4,color:"var(--v2-ink-secondary)",fontSize:12,lineHeight:1.5},children:"Most tools need an audit to act on. Run an audit first, then come back here."}),v&&e.jsxs(e.Fragment,{children:[e.jsx(Y,{title:"AI fixer",children:e.jsx(G,{status:h["ai-prompt"],label:i?"Copy site-wide AI fix prompt":"Copy AI fix prompt",description:i?"Multi-page markdown for ChatGPT/Claude/Copilot. Site-wide summary, consistency findings, per-page violations + fix recipes.":"Markdown for ChatGPT/Claude/Copilot. Every violation with fix recipes, AI-resolved fails, acknowledged context.",onClick:F,locked:w(j),onUpgrade:b})}),e.jsxs(Y,{title:"Reports",children:[e.jsx(G,{status:h.html,label:i?"Site report (HTML)":"Page report (HTML)",description:i?"Full crawl summary with per-page grades, top violations, consistency findings. Print-ready.":"Print-friendly single-page report.",onClick:$}),e.jsx(G,{status:h["executive-report"],label:"Executive report",description:"Hero grade + framing, top risks, next steps. For non-technical readers.",onClick:()=>U("executive-report","Executive report","executive-report.html"),locked:w("executive-report"),onUpgrade:b}),i&&e.jsx(G,{status:h["ticket-bundle"],label:"Ticket bundle",description:"Markdown formatted for paste into Linear / Jira / GitHub Issues — one ticket per finding, sorted by severity.",onClick:()=>U("ticket-bundle","Ticket bundle","ticket-bundle.md")})]}),e.jsxs(Y,{title:"Compliance & legal",children:[e.jsx(G,{status:h["defense-bundle"],label:"Defense bundle",description:"Anchored chain-of-custody evidence package. Use in pre-litigation.",onClick:()=>U("defense-bundle","Defense bundle","defense-bundle.html"),locked:w("defense-bundle"),onUpgrade:b}),e.jsx(G,{status:h["deposition-packet"],label:"Deposition packet",description:"Full evidence bundle — anchor, receipts, fingerprints, signing cert.",onClick:()=>U("deposition-packet","Deposition packet","deposition-packet.html"),locked:w("deposition-packet"),onUpgrade:b}),e.jsx(G,{status:h.vpat,label:"VPAT",description:"Voluntary Product Accessibility Template. Procurement-ready.",onClick:()=>U("vpat","VPAT","vpat.html"),locked:w("vpat"),onUpgrade:b}),e.jsx(G,{status:h["conformance-crosswalk"],label:"Conformance crosswalk",description:"WCAG ↔ Section 508 ↔ EN 301 549 mapping.",onClick:()=>U("conformance-crosswalk","Conformance crosswalk","conformance-crosswalk.html"),locked:w("conformance-crosswalk"),onUpgrade:b}),e.jsx(G,{status:h["methodology-doc"],label:"Methodology PDF",description:"Auditor-explainable methodology — what was tested, how, with what tools.",onClick:()=>U("methodology-doc","Methodology doc","methodology-doc.html"),locked:w("methodology-doc"),onUpgrade:b}),e.jsx(G,{status:h["evidence-bundle"],label:"Evidence bundle",description:"Lighter than defense bundle — audit records + summary.",onClick:()=>U("evidence-bundle","Evidence bundle","evidence-bundle.html"),locked:w("evidence-bundle"),onUpgrade:b})]}),e.jsx(Y,{title:"Bulk",children:e.jsx(G,{status:h.zip,label:i?"Download all as ZIP":"Download both as ZIP",description:i?"Every format above bundled in one ZIP. Runs each export in sequence — ~30s for an 8-page crawl.":"AI fix prompt + page report in one ZIP.",onClick:W,locked:w(i?"defense-bundle":"ai-prompt"),onUpgrade:b})})]}),e.jsxs(Y,{title:"Specialized views (classic UI)",children:[e.jsx("p",{style:{margin:0,marginBottom:"var(--v2-pad-2)",fontSize:11,color:"var(--v2-ink-tertiary)",lineHeight:1.5},children:`These surfaces aren't ported to v2 yet — clicking opens them in the classic UI. Return to v2 anytime via the "Try v2 UI" button in the classic Header.`}),e.jsx(_,{label:"State matrix",description:"Per-state findings grid (hover · focus · dark · RTL · etc.)",onClick:()=>R("matrix")}),e.jsx(_,{label:"Per-area compliance",description:"9 sub-grade areas with drill-in: Color & contrast, Keyboard, etc.",onClick:()=>R("report")}),e.jsx(_,{label:"Baseline delta",description:"New vs. persistent vs. fixed vs. acknowledged since the last baseline.",onClick:()=>R("delta")}),e.jsx(_,{label:"Forensic log",description:"Anchored audit history with chain-of-custody.",onClick:()=>R("forensic")}),e.jsx(_,{label:"Risk dashboard",description:"Lawsuit / conformance risk tiers with prioritized actions.",onClick:()=>R("risk")}),e.jsx(_,{label:"WCAG 3 mapping",description:"Outcome-level grouping per WCAG 3 snapshot.",onClick:()=>R("wcag3")}),e.jsx(_,{label:"WCAG-EM verdicts",description:"Formal per-criterion verdict map.",onClick:()=>R("compliance")}),e.jsx(_,{label:"Schedules",description:"Recurring audit management with email alerts.",onClick:()=>R("schedules")}),e.jsx(_,{label:"Copilot chat",description:"Anthropic-powered Q&A over your audit context.",onClick:()=>R("copilot")}),e.jsx(_,{label:"Accessibility tree",description:"Inspect the live aria tree as assistive tech sees it.",onClick:()=>R("ax-tree")}),e.jsx(_,{label:"Design tokens",description:"CSS-token / design-system audit.",onClick:()=>R("tokens")}),e.jsx(_,{label:"Guided audit",description:"13 manual IGT workflows (keyboard, screen reader, etc.).",onClick:()=>R("guided")}),e.jsx(_,{label:"Per-component scorecard",description:"Custom rules, baselines, per-component drill-in.",onClick:()=>R("scorecard")}),e.jsx(_,{label:"User journey flows",description:"Multi-step audit recordings.",onClick:()=>R("flows")}),e.jsx(_,{label:"Activity / IGT runs",description:"Manual workflow run history.",onClick:()=>R("activity")})]}),e.jsx(Y,{title:"Settings",children:e.jsx(G,{status:void 0,label:"Open settings",description:"Matrix preset, AI config, axe rule overrides, breakpoints, auto-export.",onClick:Q})})]})]}),e.jsx(we,{open:g,onClose:()=>y(!1)})]}):null}async function se(t,a,r){const{body:o,type:s}=et(t,r),l=new Blob([o],{type:s}),n=URL.createObjectURL(l);try{await chrome.tabs.create({url:n})}catch{const i=document.createElement("a");i.href=n,i.download=a,i.click()}setTimeout(()=>URL.revokeObjectURL(n),6e4)}function Y({title:t,children:a}){return e.jsxs("div",{children:[e.jsx("p",{className:"v2-eyebrow",style:{margin:0,marginBottom:"var(--v2-pad-2)",color:"var(--v2-ink-tertiary)"},children:t}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:"var(--v2-pad-2)"},children:a})]})}function G({label:t,description:a,status:r,onClick:o,locked:s=!1,onUpgrade:l}){const n=(r==null?void 0:r.state)==="busy",i=(r==null?void 0:r.state)==="done",v=(r==null?void 0:r.state)==="error";return s?e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:4,padding:"var(--v2-pad-3) var(--v2-pad-4)",border:"1px solid var(--v2-warning, #f59e0b)",borderRadius:4,background:"var(--v2-warning-bg, rgba(245,158,11,0.08))"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--v2-pad-3)"},children:[e.jsxs("span",{style:{fontSize:13,fontWeight:500,color:"var(--v2-ink-primary)"},children:["🔒 ",t]}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-sm",onClick:l,children:"Upgrade"})]}),e.jsxs("p",{style:{margin:0,fontSize:11,color:"var(--v2-ink-tertiary)",lineHeight:1.5},children:[e.jsx("strong",{children:"Upgrade to unlock"}),a?` · ${a}`:""]})]}):e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:4,padding:"var(--v2-pad-3) var(--v2-pad-4)",border:"1px solid var(--v2-border)",borderRadius:4,background:"var(--v2-bg)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--v2-pad-3)"},children:[e.jsx("span",{style:{fontSize:13,fontWeight:500,color:"var(--v2-ink-primary)"},children:t}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",onClick:o,disabled:n,children:n?"Working…":i?"Run again":"Run"})]}),a&&e.jsx("p",{style:{margin:0,fontSize:11,color:"var(--v2-ink-tertiary)",lineHeight:1.5},children:a}),n&&(r==null?void 0:r.progress)&&e.jsxs("p",{role:"status","aria-live":"polite",style:{margin:0,marginTop:4,fontSize:11,color:"var(--v2-ink-secondary)"},children:[r.progress.current,"/",r.progress.total," — ",r.progress.label??""]}),i&&(r==null?void 0:r.message)&&e.jsxs("p",{role:"status",style:{margin:0,marginTop:4,fontSize:11,color:"var(--v2-verified)"},children:["✓ ",r.message]}),v&&(r==null?void 0:r.message)&&e.jsx("p",{role:"alert",style:{margin:0,marginTop:4,fontSize:11,color:"var(--v2-critical)"},children:r.message})]})}function _({label:t,description:a,onClick:r}){return e.jsxs("button",{type:"button",onClick:r,style:{appearance:"none",cursor:"pointer",display:"flex",flexDirection:"column",gap:4,padding:"var(--v2-pad-3) var(--v2-pad-4)",border:"1px solid var(--v2-border)",borderRadius:4,background:"var(--v2-bg)",textAlign:"left",font:"inherit",color:"var(--v2-ink-primary)",width:"100%"},children:[e.jsxs("span",{style:{fontSize:13,fontWeight:500},children:[t," →"]}),e.jsx("span",{style:{fontSize:11,color:"var(--v2-ink-tertiary)",lineHeight:1.5},children:a})]})}function Ot(){var l,n;const t=m(i=>i.siteCrawlReport),a=m(i=>i.results),[r,o]=c.useState(!1),s=(t==null?void 0:t.startUrl)??((l=a[0])==null?void 0:l.pageUrl)??((n=a[0])==null?void 0:n.scope)??null;return e.jsxs(e.Fragment,{children:[e.jsxs("header",{role:"banner",style:{display:"flex",flexDirection:"column",gap:"var(--v2-pad-2)",padding:"var(--v2-pad-3) var(--v2-pad-5)",borderBottom:"1px solid var(--v2-border)",background:"var(--v2-bg)"},children:[e.jsx("a",{href:"#main-content",className:"v2-skip-link",style:{position:"absolute",left:-9999},onFocus:i=>{i.currentTarget.style.left="var(--v2-pad-4)",i.currentTarget.style.top="var(--v2-pad-4)"},onBlur:i=>{i.currentTarget.style.left="-9999px"},children:"Skip to main content"}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--v2-pad-3)",minWidth:0,minHeight:28},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"var(--v2-pad-2)"},children:[e.jsx("span",{className:"v2-display",style:{fontSize:18,fontWeight:600,letterSpacing:"-0.01em",color:"var(--v2-ink-primary)"},children:"wcagcheckr"}),e.jsx("span",{className:"v2-eyebrow",children:"v2"})]}),s&&e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"var(--v2-pad-2)",minWidth:0,flex:1},children:[e.jsx("span",{className:"v2-eyebrow",children:"scope"}),e.jsx("span",{className:"v2-mono",style:{fontSize:11,color:"var(--v2-ink-secondary)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",minWidth:0},title:s,children:s})]}),e.jsx("div",{style:{marginLeft:"auto"},children:e.jsx(_e,{})})]}),e.jsxs("nav",{"aria-label":"Application",style:{display:"flex",alignItems:"center",gap:"var(--v2-pad-2)",justifyContent:"flex-end"},children:[e.jsx(We,{}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-primary v2-btn-sm",onClick:()=>o(!0),"aria-label":"Open tools and exports drawer","aria-expanded":r,title:"Exports, baselines, schedules, forensic log, settings, more",children:"Tools"}),e.jsx("button",{type:"button",className:"v2-btn v2-btn-ghost v2-btn-sm",onClick:()=>void S({type:"OPEN_SETTINGS"}),"aria-label":"Open settings",title:"Settings",children:"⚙"})]})]}),e.jsx(Mt,{open:r,onClose:()=>o(!1)})]})}function $t(){return c.useEffect(()=>{const t=Ge(),r=new URLSearchParams(window.location.search).get("context")==="overlay"?null:chrome.runtime.connect({name:"sidepanel-tracker"}),o=Fe();Me({forceRefresh:!0}).catch(()=>{}),Oe().catch(()=>{}),$e().catch(()=>{}),He().catch(()=>{}),Be().catch(()=>{}),Ve().catch(()=>{}),ct().then(l=>{m.getState().setAcknowledgedKeys(new Set(l.map(n=>n.matchKey)))}).catch(()=>{});let s=!1;return dt().then(l=>{s||l&&m.setState(n=>n.siteCrawlStatus==="running"?{siteCrawlReport:l}:{siteCrawlReport:l,siteCrawlStatus:"complete"})}).catch(()=>{}),()=>{s=!0,o();try{t.disconnect()}catch{}try{r==null||r.disconnect()}catch{}}},[]),e.jsxs("div",{className:"v2-root",children:[e.jsx(Ot,{}),e.jsx(qe,{}),e.jsx(Ke,{}),e.jsxs("main",{id:"main-content","aria-label":"wcagcheckr findings",children:[e.jsx(bt,{}),e.jsx(_t,{})]})]})}function Ht({persona:t,children:a}){const r=t==="power"?"Power user":"Dev",[o,s]=c.useState(!1),l=c.useRef(null);c.useEffect(()=>{const i=l.current;i&&(i.inert=!0)},[]);function n(){chrome.storage.local.set({userMode:"owner",v2UiEnabled:!1}),S({type:"SETTINGS_SET",key:"userMode",value:"owner"})}return e.jsxs("div",{className:"relative h-screen overflow-hidden",children:[e.jsx("div",{ref:l,"aria-hidden":"true",className:"h-full overflow-hidden blur-[2px] opacity-50 pointer-events-none select-none",children:a}),e.jsx("div",{className:"absolute inset-0 z-50 flex items-center justify-center bg-slate-900/40 p-4",children:e.jsxs("div",{role:"dialog","aria-modal":"true","aria-labelledby":"locked-persona-title",className:"max-w-sm w-full bg-white border border-slate-200 rounded-xl shadow-xl p-5 space-y-3 text-sm",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-xl","aria-hidden":"true",children:"🔒"}),e.jsxs("h2",{id:"locked-persona-title",className:"text-base font-semibold text-slate-900",children:[r," mode is a paid feature"]})]}),e.jsxs("p",{className:"text-xs text-slate-600 leading-snug",children:[r," mode unlocks the full WCAG findings, fix recipes, and exports for every page — that needs a license. On the free plan, ",e.jsx("strong",{children:"Owner mode"})," ","(the lawsuit-target screener) is yours to use, no license required."]}),e.jsxs("div",{className:"flex flex-col gap-2 pt-1",children:[e.jsx("button",{type:"button",onClick:()=>s(!0),className:"w-full text-sm px-4 py-2 bg-brand-500 text-white rounded hover:bg-brand-600 font-medium",children:"Upgrade to unlock →"}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("button",{type:"button",onClick:()=>void S({type:"OPEN_SETTINGS"}),className:"text-xs text-slate-600 hover:text-slate-900 underline-offset-2 hover:underline",children:"I have a license token"}),e.jsx("button",{type:"button",onClick:n,className:"text-xs font-medium text-brand-700 hover:underline",children:"← Back to Owner mode"})]})]})]})}),e.jsx(we,{open:o,onClose:()=>s(!1)})]})}function Bt(){return e.jsxs("div",{role:"alert",className:"flex flex-col items-center justify-center min-h-screen gap-4 px-6 py-10 text-center",children:[e.jsx("div",{className:"text-3xl","aria-hidden":"true",children:"📡"}),e.jsx("h1",{className:"text-base font-semibold text-slate-800",children:"Internet connection required"}),e.jsx("p",{className:"max-w-xs text-sm leading-relaxed text-slate-600",children:"wcagcheckr needs to reach its license server to run. Connect to the internet and reload."}),e.jsx("button",{type:"button",onClick:()=>window.location.reload(),className:"rounded bg-slate-800 px-4 py-1.5 text-sm font-medium text-white hover:bg-slate-700",children:"Reload"})]})}Xe("side-panel");function Vt(){const[t,a]=c.useState(null),[r,o]=c.useState(!1),[,s]=c.useState(0),[l,n]=c.useState(null),[i,v]=c.useState(!1),[x,w]=c.useState(!1);if(c.useEffect(()=>{let y=!1;(async()=>{if(await Promise.all([pe(),he()]),!y){if(o(!0),await ve()){y||n(!0),Promise.all([ge(),me()]).then(()=>{y||s(k=>k+1)}).catch(()=>{});return}await Promise.all([ge(),me()]).catch(()=>{}),!y&&(s(k=>k+1),n(await ve()))}})(),chrome.storage.local.get("licenseToken").then(k=>{y||w(!!k.licenseToken)}).catch(()=>{}).finally(()=>{y||v(!0)});function b(k){const h=k.userMode,E=!!k.v2UiEnabled;let P;h==="owner"||h==="power"||h==="dev"?P=h:P=E?"power":"owner",y||a(P)}chrome.storage.local.get(["userMode","v2UiEnabled"]).then(b).catch(()=>a("owner"));const j=(k,h)=>{h==="local"&&("tierConfig:cache"in k&&pe().then(()=>{y||s(E=>E+1)}),"rubricConfigCache"in k&&he().then(()=>{y||s(E=>E+1)}),"licenseToken"in k&&chrome.storage.local.get("licenseToken").then(E=>{y||w(!!E.licenseToken)}),!(!("userMode"in k)&&!("v2UiEnabled"in k))&&chrome.storage.local.get(["userMode","v2UiEnabled"]).then(b))};return chrome.storage.onChanged.addListener(j),()=>{y=!0,chrome.storage.onChanged.removeListener(j)}},[]),t===null||!r||!i||l===null)return null;if(!l)return e.jsx(Bt,{});const g=t==="power"?e.jsx($t,{}):e.jsx(Qe,{});return(t==="power"||t==="dev")&&!x?e.jsx(Ht,{persona:t,children:g}):g}const Te=document.getElementById("root");if(!Te)throw new Error("side-panel: #root not found");Ee(Te).render(e.jsx(Ae.StrictMode,{children:e.jsx(Ye,{children:e.jsx(Vt,{})})}));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{aW as R,a1 as $,aX as S,aY as F,G,aZ as D,a_ as I}from"./scheduled-audit-runner-
|
|
1
|
+
import{aW as R,a1 as $,aX as S,aY as F,U as G,aZ as D,a_ as I}from"./scheduled-audit-runner-EQBltZPz.js";import"./preload-helper-D7HrI6pR.js";import"./crash-reporter-DAZnNefT.js";import"./diff-CECbooHD.js";import"./ai-usage-log-C9Opn0x0.js";const h={A:"#15803d",B:"#4d7c0f",C:"#a16207",D:"#dc2626",F:"#7f1d1d"},O={low:"#15803d",moderate:"#a16207",high:"#dc2626",critical:"#7f1d1d"},m={critical:"#7f1d1d",serious:"#dc2626",moderate:"#a16207",minor:"#4d7c0f"},v={critical:"#fca5a5",serious:"#fdba74",moderate:"#fcd34d",minor:"#bef264"};function n(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function w(e){if(e<1e3)return`${e}ms`;const t=Math.round(e/100)/10;if(t<60)return`${t}s`;const i=Math.floor(t/60),s=Math.round(t-i*60);return`${i}m ${s}s`}function L(e){return`<span style="display:inline-block;background:${h[e]};color:#fff;font-weight:700;padding:2px 10px;border-radius:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;">${e}</span>`}const y={A:"#047857",C:"#a16207",D:"#c2410c",F:"#be123c"};function T(e){return`<span style="display:inline-block;background:${y[e]};color:#fff;font-weight:700;padding:2px 10px;border-radius:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;">${e}</span>`}function _(e){return $(e.findingGroups??[]).map(t=>{const i=[...new Set(t.pages.map(s=>s.url))];return{ruleId:t.ruleId,description:t.axeDescription,impact:t.impact,urlsAffected:i.length,totalOccurrences:t.totalOccurrences,sampleUrls:i.slice(0,5)}}).sort((t,i)=>i.urlsAffected-t.urlsAffected||i.totalOccurrences-t.totalOccurrences)}function b(e){return`<span style="display:inline-block;background:${O[e]};color:#fff;font-weight:600;padding:2px 10px;border-radius:12px;font-size:11px;text-transform:uppercase;letter-spacing:0.05em;">${e}</span>`}function U(e){return`<span style="display:inline-block;background:${m[e]};color:#fff;font-weight:600;padding:1px 8px;border-radius:10px;font-size:11px;">${e}</span>`}function W(e,t){var r,g,f;const i=`
|
|
2
2
|
${e.pagesAudited} page${e.pagesAudited===1?"":"s"} audited
|
|
3
3
|
${e.pagesFailed>0?`· <span style="color:#fca5a5;">${e.pagesFailed} failed</span>`:""}
|
|
4
4
|
· ${w(e.totalDurationMs)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:IBM Plex Sans,-apple-system,BlinkMacSystemFont,Segoe UI Variable Text,Segoe UI,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:IBM Plex Mono,ui-monospace,JetBrains Mono,SF Mono,Consolas,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.left-0{left:0}.left-1\/2{left:50%}.right-0{right:0}.right-0\.5{right:.125rem}.top-0{top:0}.top-0\.5{top:.125rem}.top-1\/2{top:50%}.top-3{top:.75rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.float-right{float:right}.-m-4{margin:-1rem}.m-0{margin:0}.m-2{margin:.5rem}.m-4{margin:1rem}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.-mb-px{margin-bottom:-1px}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.ml-7{margin-left:1.75rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-12{height:3rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-32{max-height:8rem}.max-h-40{max-height:10rem}.max-h-72{max-height:18rem}.max-h-96{max-height:24rem}.max-h-\[420px\]{max-height:420px}.max-h-\[500px\]{max-height:500px}.max-h-\[60vh\]{max-height:60vh}.max-h-\[90vh\]{max-height:90vh}.min-h-\[200px\]{min-height:200px}.min-h-\[24px\]{min-height:24px}.min-h-\[540px\]{min-height:540px}.min-h-\[60px\]{min-height:60px}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\/3{width:33.333333%}.w-12{width:3rem}.w-14{width:3.5rem}.w-2{width:.5rem}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[260px\]{width:260px}.w-\[min\(28rem\,90vw\)\]{width:min(28rem,90vw)}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[140px\]{min-width:140px}.min-w-\[24px\]{min-width:24px}.max-w-2xl{max-width:42rem}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[280px\]{max-width:280px}.max-w-\[calc\(100vw-1rem\)\]{max-width:calc(100vw - 1rem)}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.basis-full{flex-basis:100%}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes bell-pulse{0%,to{transform:rotate(0)}20%{transform:rotate(12deg)}40%{transform:rotate(-10deg)}60%{transform:rotate(8deg)}80%{transform:rotate(-6deg)}}.animate-bell-pulse{animation:bell-pulse .9s ease-in-out}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-y{resize:vertical}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\[1fr_1fr_70px_70px_auto\]{grid-template-columns:1fr 1fr 70px 70px auto}.grid-cols-\[1fr_1fr_auto\]{grid-template-columns:1fr 1fr auto}.grid-cols-\[1fr_70px_70px_auto_auto\]{grid-template-columns:1fr 70px 70px auto auto}.grid-cols-\[400px_1fr\]{grid-template-columns:400px 1fr}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[max-content_1fr\]{grid-template-columns:max-content 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-y-1{row-gap:.25rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-slate-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(241 245 249 / var(--tw-divide-opacity, 1))}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-amber-300{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.border-amber-400{--tw-border-opacity: 1;border-color:rgb(251 191 36 / var(--tw-border-opacity, 1))}.border-amber-500{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-brand-500{--tw-border-opacity: 1;border-color:rgb(79 70 229 / var(--tw-border-opacity, 1))}.border-brand-600\/30{border-color:#4338ca4d}.border-emerald-100{--tw-border-opacity: 1;border-color:rgb(209 250 229 / var(--tw-border-opacity, 1))}.border-emerald-200{--tw-border-opacity: 1;border-color:rgb(167 243 208 / var(--tw-border-opacity, 1))}.border-emerald-300{--tw-border-opacity: 1;border-color:rgb(110 231 183 / var(--tw-border-opacity, 1))}.border-emerald-400{--tw-border-opacity: 1;border-color:rgb(52 211 153 / var(--tw-border-opacity, 1))}.border-emerald-500{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity, 1))}.border-emerald-600{--tw-border-opacity: 1;border-color:rgb(5 150 105 / var(--tw-border-opacity, 1))}.border-orange-200{--tw-border-opacity: 1;border-color:rgb(254 215 170 / var(--tw-border-opacity, 1))}.border-orange-300{--tw-border-opacity: 1;border-color:rgb(253 186 116 / var(--tw-border-opacity, 1))}.border-purple-200{--tw-border-opacity: 1;border-color:rgb(233 213 255 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-rose-100{--tw-border-opacity: 1;border-color:rgb(255 228 230 / var(--tw-border-opacity, 1))}.border-rose-200{--tw-border-opacity: 1;border-color:rgb(254 205 211 / var(--tw-border-opacity, 1))}.border-rose-300{--tw-border-opacity: 1;border-color:rgb(253 164 175 / var(--tw-border-opacity, 1))}.border-rose-400{--tw-border-opacity: 1;border-color:rgb(251 113 133 / var(--tw-border-opacity, 1))}.border-rose-500{--tw-border-opacity: 1;border-color:rgb(244 63 94 / var(--tw-border-opacity, 1))}.border-rose-600{--tw-border-opacity: 1;border-color:rgb(225 29 72 / var(--tw-border-opacity, 1))}.border-sky-200{--tw-border-opacity: 1;border-color:rgb(186 230 253 / var(--tw-border-opacity, 1))}.border-slate-100{--tw-border-opacity: 1;border-color:rgb(241 245 249 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-yellow-200{--tw-border-opacity: 1;border-color:rgb(254 240 138 / var(--tw-border-opacity, 1))}.border-t-transparent{border-top-color:transparent}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-200{--tw-bg-opacity: 1;background-color:rgb(253 230 138 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-50\/50{background-color:#fffbeb80}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-black\/40{background-color:#0006}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-brand-100{--tw-bg-opacity: 1;background-color:rgb(224 231 255 / var(--tw-bg-opacity, 1))}.bg-brand-50{--tw-bg-opacity: 1;background-color:rgb(238 242 255 / var(--tw-bg-opacity, 1))}.bg-brand-50\/40{background-color:#eef2ff66}.bg-brand-500{--tw-bg-opacity: 1;background-color:rgb(79 70 229 / var(--tw-bg-opacity, 1))}.bg-brand-600{--tw-bg-opacity: 1;background-color:rgb(67 56 202 / var(--tw-bg-opacity, 1))}.bg-brand-600\/5{background-color:#4338ca0d}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-emerald-200{--tw-bg-opacity: 1;background-color:rgb(167 243 208 / var(--tw-bg-opacity, 1))}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-emerald-50\/50{background-color:#ecfdf580}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-indigo-100{--tw-bg-opacity: 1;background-color:rgb(224 231 255 / var(--tw-bg-opacity, 1))}.bg-lime-100{--tw-bg-opacity: 1;background-color:rgb(236 252 203 / var(--tw-bg-opacity, 1))}.bg-lime-500{--tw-bg-opacity: 1;background-color:rgb(132 204 22 / var(--tw-bg-opacity, 1))}.bg-lime-600{--tw-bg-opacity: 1;background-color:rgb(101 163 13 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-200{--tw-bg-opacity: 1;background-color:rgb(254 215 170 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-orange-600{--tw-bg-opacity: 1;background-color:rgb(234 88 12 / var(--tw-bg-opacity, 1))}.bg-purple-50{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.bg-purple-500{--tw-bg-opacity: 1;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-rose-100{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.bg-rose-200{--tw-bg-opacity: 1;background-color:rgb(254 205 211 / var(--tw-bg-opacity, 1))}.bg-rose-50{--tw-bg-opacity: 1;background-color:rgb(255 241 242 / var(--tw-bg-opacity, 1))}.bg-rose-50\/40{background-color:#fff1f266}.bg-rose-50\/50{background-color:#fff1f280}.bg-rose-500{--tw-bg-opacity: 1;background-color:rgb(244 63 94 / var(--tw-bg-opacity, 1))}.bg-rose-600{--tw-bg-opacity: 1;background-color:rgb(225 29 72 / var(--tw-bg-opacity, 1))}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-sky-50{--tw-bg-opacity: 1;background-color:rgb(240 249 255 / var(--tw-bg-opacity, 1))}.bg-sky-600{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-slate-300{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.bg-slate-400{--tw-bg-opacity: 1;background-color:rgb(148 163 184 / var(--tw-bg-opacity, 1))}.bg-slate-50{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.bg-slate-50\/50{background-color:#f8fafc80}.bg-slate-500{--tw-bg-opacity: 1;background-color:rgb(100 116 139 / var(--tw-bg-opacity, 1))}.bg-slate-600{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity, 1))}.bg-slate-700{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.bg-slate-800{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.bg-slate-900{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-slate-900\/40{background-color:#0f172a66}.bg-violet-100{--tw-bg-opacity: 1;background-color:rgb(237 233 254 / var(--tw-bg-opacity, 1))}.bg-violet-500{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/50{background-color:#ffffff80}.bg-white\/60{background-color:#fff9}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-brand-50{--tw-gradient-from: #eef2ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(238 242 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-white{--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #fff var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-white{--tw-gradient-to: #fff var(--tw-gradient-to-position)}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-1\.5{padding-bottom:.375rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-4{padding-left:1rem}.pl-6{padding-left:1.5rem}.pr-2{padding-right:.5rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-display{font-family:IBM Plex Sans,-apple-system,BlinkMacSystemFont,Segoe UI Variable Display,Segoe UI,system-ui,sans-serif}.font-mono{font-family:IBM Plex Mono,ui-monospace,JetBrains Mono,SF Mono,Consolas,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.not-italic{font-style:normal}.ordinal{--tw-ordinal: ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.06em\]{letter-spacing:.06em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-100{--tw-text-opacity: 1;color:rgb(254 243 199 / var(--tw-text-opacity, 1))}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-amber-900{--tw-text-opacity: 1;color:rgb(120 53 15 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-blue-900{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.text-brand-600{--tw-text-opacity: 1;color:rgb(67 56 202 / var(--tw-text-opacity, 1))}.text-brand-700{--tw-text-opacity: 1;color:rgb(55 48 163 / var(--tw-text-opacity, 1))}.text-emerald-100{--tw-text-opacity: 1;color:rgb(209 250 229 / var(--tw-text-opacity, 1))}.text-emerald-300{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-emerald-800{--tw-text-opacity: 1;color:rgb(6 95 70 / var(--tw-text-opacity, 1))}.text-emerald-900{--tw-text-opacity: 1;color:rgb(6 78 59 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-indigo-700{--tw-text-opacity: 1;color:rgb(67 56 202 / var(--tw-text-opacity, 1))}.text-lime-700{--tw-text-opacity: 1;color:rgb(77 124 15 / var(--tw-text-opacity, 1))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-orange-900{--tw-text-opacity: 1;color:rgb(124 45 18 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-red-900{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.text-rose-500{--tw-text-opacity: 1;color:rgb(244 63 94 / var(--tw-text-opacity, 1))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-rose-700{--tw-text-opacity: 1;color:rgb(190 18 60 / var(--tw-text-opacity, 1))}.text-rose-800{--tw-text-opacity: 1;color:rgb(159 18 57 / var(--tw-text-opacity, 1))}.text-rose-900{--tw-text-opacity: 1;color:rgb(136 19 55 / var(--tw-text-opacity, 1))}.text-rose-900\/90{color:#881337e6}.text-sky-700{--tw-text-opacity: 1;color:rgb(3 105 161 / var(--tw-text-opacity, 1))}.text-sky-800{--tw-text-opacity: 1;color:rgb(7 89 133 / var(--tw-text-opacity, 1))}.text-sky-900{--tw-text-opacity: 1;color:rgb(12 74 110 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-slate-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.underline-offset-2{text-underline-offset:2px}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_2px_8px_-2px_rgba\(120\,53\,15\,0\.12\)\]{--tw-shadow: 0 2px 8px -2px rgba(120,53,15,.12);--tw-shadow-colored: 0 2px 8px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_2px_8px_-2px_rgba\(159\,18\,57\,0\.16\)\]{--tw-shadow: 0 2px 8px -2px rgba(159,18,57,.16);--tw-shadow-colored: 0 2px 8px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_2px_8px_-2px_rgba\(6\,78\,59\,0\.12\)\]{--tw-shadow: 0 2px 8px -2px rgba(6,78,59,.12);--tw-shadow-colored: 0 2px 8px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_4px_16px_-4px_rgba\(31\,41\,55\,0\.14\)\]{--tw-shadow: 0 4px 16px -4px rgba(31,41,55,.14);--tw-shadow-colored: 0 4px 16px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-brand-500\/30{--tw-ring-color: rgb(79 70 229 / .3)}.ring-rose-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(253 164 175 / var(--tw-ring-opacity, 1))}.ring-rose-500{--tw-ring-opacity: 1;--tw-ring-color: rgb(244 63 94 / var(--tw-ring-opacity, 1))}.ring-white{--tw-ring-opacity: 1;--tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity, 1))}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-\[2px\]{--tw-blur: blur(2px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}html,body,#root{height:100%}html{font-family:IBM Plex Sans,-apple-system,BlinkMacSystemFont,Segoe UI Variable Text,Segoe UI,system-ui,sans-serif;font-feature-settings:"tnum" 1,"ss01" 1,"cv11" 1;-webkit-font-smoothing:antialiased}code,kbd,samp,pre,.font-mono{font-family:IBM Plex Mono,ui-monospace,JetBrains Mono,SF Mono,Consolas,monospace;font-feature-settings:"tnum" 1}:focus-visible{outline:2px solid #3730a3;outline-offset:2px}.last\:border-b-0:last-child{border-bottom-width:0px}.last\:border-r-0:last-child{border-right-width:0px}.hover\:border-red-300:hover{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity, 1))}.hover\:border-slate-200:hover{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.hover\:border-slate-300:hover{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.hover\:border-slate-400:hover{--tw-border-opacity: 1;border-color:rgb(148 163 184 / var(--tw-border-opacity, 1))}.hover\:bg-amber-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-50:hover{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-600:hover{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.hover\:bg-brand-100:hover{--tw-bg-opacity: 1;background-color:rgb(224 231 255 / var(--tw-bg-opacity, 1))}.hover\:bg-brand-50:hover{--tw-bg-opacity: 1;background-color:rgb(238 242 255 / var(--tw-bg-opacity, 1))}.hover\:bg-brand-600:hover{--tw-bg-opacity: 1;background-color:rgb(67 56 202 / var(--tw-bg-opacity, 1))}.hover\:bg-brand-700:hover{--tw-bg-opacity: 1;background-color:rgb(55 48 163 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-100:hover{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-50:hover{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-700:hover{--tw-bg-opacity: 1;background-color:rgb(4 120 87 / var(--tw-bg-opacity, 1))}.hover\:bg-orange-700:hover{--tw-bg-opacity: 1;background-color:rgb(194 65 12 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-rose-100:hover{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.hover\:bg-rose-50:hover{--tw-bg-opacity: 1;background-color:rgb(255 241 242 / var(--tw-bg-opacity, 1))}.hover\:bg-rose-600:hover{--tw-bg-opacity: 1;background-color:rgb(225 29 72 / var(--tw-bg-opacity, 1))}.hover\:bg-rose-700:hover{--tw-bg-opacity: 1;background-color:rgb(190 18 60 / var(--tw-bg-opacity, 1))}.hover\:bg-sky-700:hover{--tw-bg-opacity: 1;background-color:rgb(3 105 161 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-200:hover{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-300:hover{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-700:hover{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-800:hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:text-amber-700:hover{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.hover\:text-amber-950:hover{--tw-text-opacity: 1;color:rgb(69 26 3 / var(--tw-text-opacity, 1))}.hover\:text-blue-900:hover{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.hover\:text-brand-600:hover{--tw-text-opacity: 1;color:rgb(67 56 202 / var(--tw-text-opacity, 1))}.hover\:text-emerald-900:hover{--tw-text-opacity: 1;color:rgb(6 78 59 / var(--tw-text-opacity, 1))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-red-800:hover{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.hover\:text-red-900:hover{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.hover\:text-rose-600:hover{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.hover\:text-rose-700:hover{--tw-text-opacity: 1;color:rgb(190 18 60 / var(--tw-text-opacity, 1))}.hover\:text-rose-900:hover{--tw-text-opacity: 1;color:rgb(136 19 55 / var(--tw-text-opacity, 1))}.hover\:text-slate-700:hover{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.hover\:text-slate-800:hover{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.hover\:text-slate-900:hover{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:no-underline:hover{text-decoration-line:none}.hover\:opacity-70:hover{opacity:.7}.focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.focus\:fixed:focus{position:fixed}.focus\:left-2:focus{left:.5rem}.focus\:top-2:focus{top:.5rem}.focus\:z-50:focus{z-index:50}.focus\:rounded:focus{border-radius:.25rem}.focus\:bg-white:focus{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.focus\:px-3:focus{padding-left:.75rem;padding-right:.75rem}.focus\:py-1\.5:focus{padding-top:.375rem;padding-bottom:.375rem}.focus\:text-slate-900:focus{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.focus\:shadow:focus{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:outline:focus{outline-style:solid}.focus\:outline-2:focus{outline-width:2px}.focus\:outline-brand-500:focus{outline-color:#4f46e5}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-offset-1:focus-visible{outline-offset:1px}.focus-visible\:outline-brand-500:focus-visible{outline-color:#4f46e5}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-brand-500:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity, 1))}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width: 1px}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-slate-50:disabled{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.disabled\:text-slate-500:disabled{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:hover\:bg-white:hover:disabled{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.data-\[state\=active\]\:border-b-2[data-state=active]{border-bottom-width:2px}.data-\[state\=active\]\:border-brand-500[data-state=active]{--tw-border-opacity: 1;border-color:rgb(79 70 229 / var(--tw-border-opacity, 1))}.data-\[state\=active\]\:text-brand-700[data-state=active]{--tw-text-opacity: 1;color:rgb(55 48 163 / var(--tw-text-opacity, 1))}@media (prefers-reduced-motion: reduce){.motion-reduce\:animate-none{animation:none}}@media (min-width: 640px){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:p-6{padding:1.5rem}}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as Qs}from"./_commonjsHelpers-Cpj98o6Y.js";import{c as Ys,
|
|
1
|
+
import{g as Qs}from"./_commonjsHelpers-Cpj98o6Y.js";import{c as Ys,r as Wf}from"./crash-reporter-DAZnNefT.js";import{y as Bf}from"./ai-usage-log-C9Opn0x0.js";function Vf(e,t){for(var n=0;n<t.length;n++){const r=t[n];if(typeof r!="string"&&!Array.isArray(r)){for(const l in r)if(l!=="default"&&!(l in e)){const o=Object.getOwnPropertyDescriptor(r,l);o&&Object.defineProperty(e,l,o.get?o:{enumerable:!0,get:()=>r[l]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}var Ks={exports:{}},Tl={},Xs={exports:{}},M={};/**
|
|
2
2
|
* @license React
|
|
3
3
|
* react.production.min.js
|
|
4
4
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{y as c,E as f,F as h,G as l,H as d,I as p}from"./ai-usage-log-
|
|
1
|
+
import{y as c,E as f,F as h,G as l,H as d,I as p}from"./ai-usage-log-C9Opn0x0.js";import{q as i,c as u,T as s}from"./crash-reporter-DAZnNefT.js";const o=u("tier-config-client"),w="wcagcheckr",T=`https://api.wcagcheckr.com/v1/products/${w}/tier-config`,m=1e4,n="tier-config-refresh",C=60,E=["free","solo","team"];function g(e){const t={};for(const r of E){const a=d(r,e);t[r]=a?p(s[r],a):{...s[r]}}return t}async function S(){const e=await c();if(!e){i(null);return}if(f(e)==="expired"){o.warn("cached tier-config is expired (>7d); using hardcoded defaults"),i(null);return}i(g(e.config))}async function _(){const e=await c();return!!e&&f(e)!=="expired"}async function R(){try{const e=await fetch(T,{signal:AbortSignal.timeout(m),headers:{accept:"application/json"}});if(!e.ok)throw new Error(`http ${e.status}`);const t=await e.json();await h({fetchedAt:Date.now(),config:t}),i(g(t));const r=t.wcagTargetVersion;if(r==="2.1"||r==="2.2")try{await chrome.storage.local.set({wcagTargetVersion:r}),l(r)}catch(a){o.warn("failed to persist wcagTargetVersion",a)}o.info("tier-config refreshed from server")}catch(e){o.warn("tier-config refresh failed; keeping prior cache",e)}}function A(){chrome.alarms.create(n,{periodInMinutes:C}),chrome.alarms.onAlarm.addListener(e=>{e.name===n&&R()})}export{A as a,_ as h,R as r,S as w};
|
package/dist/devtools/panel.html
CHANGED
|
@@ -3,18 +3,18 @@
|
|
|
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-DrW08BJr.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
|
-
<link rel="modulepreload" crossorigin href="/assets/crash-reporter-
|
|
10
|
-
<link rel="modulepreload" crossorigin href="/assets/ai-usage-log-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/styles-
|
|
9
|
+
<link rel="modulepreload" crossorigin href="/assets/crash-reporter-DAZnNefT.js">
|
|
10
|
+
<link rel="modulepreload" crossorigin href="/assets/ai-usage-log-C9Opn0x0.js">
|
|
11
|
+
<link rel="modulepreload" crossorigin href="/assets/styles-uesms5w-.js">
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-D7HrI6pR.js">
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/diff-
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/scheduled-audit-runner-
|
|
13
|
+
<link rel="modulepreload" crossorigin href="/assets/diff-CECbooHD.js">
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/scheduled-audit-runner-EQBltZPz.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/design-system-audit-DpxJrxnb.js">
|
|
16
|
-
<link rel="modulepreload" crossorigin href="/assets/ErrorBoundary-
|
|
17
|
-
<link rel="stylesheet" crossorigin href="/assets/styles-
|
|
16
|
+
<link rel="modulepreload" crossorigin href="/assets/ErrorBoundary-D-5bMIZq.js">
|
|
17
|
+
<link rel="stylesheet" crossorigin href="/assets/styles-8UI6xBiw.css">
|
|
18
18
|
</head>
|
|
19
19
|
<body class="bg-slate-50">
|
|
20
20
|
<div id="root"></div>
|
package/dist/manifest.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"name": "wcagcheckr",
|
|
4
4
|
"description": "Audit your real site for WCAG issues across hover, focus, dark mode & RTL states — baselines surface only NEW violations.",
|
|
5
|
-
"version": "1.0.
|
|
5
|
+
"version": "1.0.12",
|
|
6
6
|
"author": "Locustware",
|
|
7
7
|
"homepage_url": "https://wcagcheckr.com",
|
|
8
8
|
"icons": {
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"content_scripts": [
|
|
38
38
|
{
|
|
39
39
|
"js": [
|
|
40
|
-
"assets/content-script.ts-loader-
|
|
40
|
+
"assets/content-script.ts-loader-CdztdNRK.js"
|
|
41
41
|
],
|
|
42
42
|
"matches": [
|
|
43
43
|
"<all_urls>"
|
|
@@ -60,14 +60,14 @@
|
|
|
60
60
|
"fonts/*",
|
|
61
61
|
"axe.min.js",
|
|
62
62
|
"assets/preload-helper-D7HrI6pR.js",
|
|
63
|
-
"assets/crash-reporter-
|
|
64
|
-
"assets/diff-
|
|
63
|
+
"assets/crash-reporter-DAZnNefT.js",
|
|
64
|
+
"assets/diff-CECbooHD.js",
|
|
65
65
|
"assets/_commonjsHelpers-Cpj98o6Y.js",
|
|
66
66
|
"assets/custom-rules-CAe0nbES.js",
|
|
67
67
|
"assets/design-system-audit-DpxJrxnb.js",
|
|
68
68
|
"assets/reflow-analyzer-DNgBX8N_.js",
|
|
69
69
|
"assets/dom-criterion-analyzers-DoUaJV5C.js",
|
|
70
|
-
"assets/content-script.ts-
|
|
70
|
+
"assets/content-script.ts-DxtHl1_w.js"
|
|
71
71
|
],
|
|
72
72
|
"use_dynamic_url": false
|
|
73
73
|
}
|