@yuktishaalaa/yuktai 2.0.15 → 2.0.18
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/{index.d.cts → index.d.mts} +33 -2
- package/dist/index.d.ts +33 -2
- package/dist/index.js +288 -185
- package/dist/index.mjs +390 -0
- package/dist/renderer.global.js +282 -162
- package/package.json +76 -42
- package/dist/index.cjs +0 -287
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
async function X(){try{return window.ai?.rewriter?(await window.ai.rewriter.capabilities()).available!=="no":!1}catch{return!1}}async function Fe(e){if(!e||e.trim().length<20)return{success:!1,original:e,rewritten:e,error:"Text too short"};try{let t=await window.ai.rewriter.create({tone:"more-casual",format:"plain-text",length:"as-is"}),o=await t.rewrite(e,{context:"Rewrite this text in simple plain English. Use short sentences. Avoid jargon. Make it easy to understand for everyone."});return t.destroy(),{success:!0,original:e,rewritten:o.trim()}}catch(t){return{success:!1,original:e,rewritten:e,error:t instanceof Error?t.message:"Rewrite failed"}}}async function ce(){if(!await X())return{fixed:0,error:"Chrome Built-in AI not available on this device. Chrome 127+ required."};let t=document.querySelectorAll("p, h1, h2, h3, h4, h5, h6, li, blockquote, td, th, label, figcaption"),o=0;for(let a of t){let n=a.innerText?.trim();if(!n||n.length<20||a.closest("[data-yuktai-panel]"))continue;let s=await Fe(n);s.success&&s.rewritten!==n&&(a.dataset.yuktaiOriginal=n,a.innerText=s.rewritten,o++)}return{fixed:o}}function ue(){let e=document.querySelectorAll("[data-yuktai-original]");for(let t of e){let o=t.dataset.yuktaiOriginal;o&&(t.innerText=o,delete t.dataset.yuktaiOriginal)}}var pe="yuktai-summary-box";async function Z(){try{return window.ai?.summarizer?(await window.ai.summarizer.capabilities()).available!=="no":!1}catch{return!1}}function We(){let e=document.querySelectorAll("p, h1, h2, h3, h4, h5, h6, li, blockquote, article, section"),t=[];for(let o of e){if(o.closest("[data-yuktai-panel]"))continue;let a=window.getComputedStyle(o);if(a.display==="none"||a.visibility==="hidden")continue;let n=o.innerText?.trim();n&&n.length>10&&t.push(n)}return t.join(" ").slice(0,5e3)}async function fe(){if(!await Z())return{success:!1,summary:"",error:"Chrome Built-in AI not available. Chrome 127+ required."};let t=We();if(!t||t.length<100)return{success:!1,summary:"",error:"Not enough text on this page to summarise."};try{let o=await window.ai.summarizer.create({type:"tl;dr",format:"plain-text",length:"short"}),a=await o.summarize(t,{context:"Summarise this page in 2-3 simple sentences for a screen reader user who wants to know if this page is relevant to them."});return o.destroy(),Oe(a.trim()),{success:!0,summary:a.trim()}}catch(o){return{success:!1,summary:"",error:o instanceof Error?o.message:"Summary failed"}}}function Oe(e){I();let t=document.createElement("div");t.id=pe,t.setAttribute("data-yuktai-panel","true"),t.setAttribute("role","region"),t.setAttribute("aria-label","Page summary by yuktai"),t.style.cssText=`
|
|
2
|
+
position: fixed;
|
|
3
|
+
top: 0;
|
|
4
|
+
left: 0;
|
|
5
|
+
right: 0;
|
|
6
|
+
z-index: 9990;
|
|
7
|
+
background: #0d9488;
|
|
8
|
+
color: #ffffff;
|
|
9
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
10
|
+
font-size: 14px;
|
|
11
|
+
line-height: 1.6;
|
|
12
|
+
padding: 10px 20px;
|
|
13
|
+
display: flex;
|
|
14
|
+
align-items: flex-start;
|
|
15
|
+
justify-content: space-between;
|
|
16
|
+
gap: 12px;
|
|
17
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
18
|
+
`;let o=document.createElement("p");o.style.cssText="margin: 0; flex: 1;",o.textContent=`\u{1F4CB} Page summary: ${e}`;let a=document.createElement("button");a.textContent="\xD7",a.setAttribute("aria-label","Close page summary"),a.style.cssText=`
|
|
19
|
+
background: none;
|
|
20
|
+
border: none;
|
|
21
|
+
color: #ffffff;
|
|
22
|
+
font-size: 20px;
|
|
23
|
+
cursor: pointer;
|
|
24
|
+
padding: 0 4px;
|
|
25
|
+
line-height: 1;
|
|
26
|
+
flex-shrink: 0;
|
|
27
|
+
`,a.addEventListener("click",I),t.appendChild(o),t.appendChild(a),document.body.prepend(t)}function I(){let e=document.getElementById(pe);e&&e.remove()}var $=[{code:"en",label:"English"},{code:"hi",label:"Hindi"},{code:"es",label:"Spanish"},{code:"fr",label:"French"},{code:"de",label:"German"},{code:"it",label:"Italian"},{code:"pt",label:"Portuguese"},{code:"nl",label:"Dutch"},{code:"pl",label:"Polish"},{code:"ru",label:"Russian"},{code:"ja",label:"Japanese"},{code:"ko",label:"Korean"},{code:"zh",label:"Chinese"},{code:"ar",label:"Arabic"},{code:"tr",label:"Turkish"},{code:"vi",label:"Vietnamese"},{code:"bn",label:"Bengali"},{code:"id",label:"Indonesian"}],H="en";async function Ne(e){try{return window.translation?await window.translation.canTranslate({sourceLanguage:"en",targetLanguage:e})!=="no":!1}catch{return!1}}async function me(e){if(e===H)return{success:!0,language:e,fixed:0};if(e==="en")return Q(),H="en",{success:!0,language:"en",fixed:0};if(!await Ne(e))return{success:!1,language:e,fixed:0,error:`Translation to ${e} not available. Chrome 127+ required.`};try{let o=await window.translation.createTranslator({sourceLanguage:"en",targetLanguage:e}),a=document.querySelectorAll("p, h1, h2, h3, h4, h5, h6, li, blockquote, td, th, label, figcaption, span, a"),n=0;for(let s of a){if(s.closest("[data-yuktai-panel]")||s.children.length>0)continue;let i=s.innerText?.trim();if(!i||i.length<2)continue;s.dataset.yuktaiTranslationOriginal||(s.dataset.yuktaiTranslationOriginal=i);let d=await o.translate(i);d&&d!==i&&(s.innerText=d,n++)}return o.destroy(),H=e,{success:!0,language:e,fixed:n}}catch(o){return{success:!1,language:e,fixed:0,error:o instanceof Error?o.message:"Translation failed"}}}function Q(){let e=document.querySelectorAll("[data-yuktai-translation-original]");for(let t of e){let o=t.dataset.yuktaiTranslationOriginal;o&&(t.innerText=o,delete t.dataset.yuktaiTranslationOriginal)}H="en"}var Be=[{phrases:["go to main","skip to main","main content"],action:"focus-main",label:"Jump to main content"},{phrases:["go to navigation","go to nav","open menu"],action:"focus-nav",label:"Jump to navigation"},{phrases:["go to search","search","find"],action:"focus-search",label:"Jump to search"},{phrases:["scroll down","page down","next"],action:"scroll-down",label:"Scroll down"},{phrases:["scroll up","page up","back up"],action:"scroll-up",label:"Scroll up"},{phrases:["go back","previous page"],action:"go-back",label:"Go back"},{phrases:["click","press","select"],action:"click-focused",label:"Click focused element"},{phrases:["next item","tab forward","tab"],action:"tab-forward",label:"Move to next element"},{phrases:["previous item","tab back","shift tab"],action:"tab-back",label:"Move to previous element"},{phrases:["stop listening","stop voice","quiet"],action:"stop-voice",label:"Stop voice control"}],h=null,F=!1,E=null;function ee(){return!!(window.SpeechRecognition||window.webkitSpeechRecognition)}function _e(e){let t=e.toLowerCase().trim();for(let o of Be)for(let a of o.phrases)if(t.includes(a))return{action:o.action,label:o.label};return null}function De(e){switch(e){case"focus-main":{let t=document.querySelector("main, [role='main'], #main");t&&(t.focus(),t.scrollIntoView({behavior:"smooth"}));break}case"focus-nav":{let t=document.querySelector("nav, [role='navigation']");t&&(t.focus(),t.scrollIntoView({behavior:"smooth"}));break}case"focus-search":{let t=document.querySelector("input[type='search'], input[role='searchbox'], [aria-label*='search' i]");t&&(t.focus(),t.scrollIntoView({behavior:"smooth"}));break}case"scroll-down":{window.scrollBy({top:400,behavior:"smooth"});break}case"scroll-up":{window.scrollBy({top:-400,behavior:"smooth"});break}case"go-back":{window.history.back();break}case"click-focused":{let t=document.activeElement;t&&t!==document.body&&t.click();break}case"tab-forward":{let t=be(),o=t.indexOf(document.activeElement),a=t[o+1]||t[0];a&&a.focus();break}case"tab-back":{let t=be(),o=t.indexOf(document.activeElement),a=t[o-1]||t[t.length-1];a&&a.focus();break}case"stop-voice":{te();break}}}function be(){return Array.from(document.querySelectorAll('a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')).filter(e=>!e.closest("[data-yuktai-panel]"))}function ge(e){if(!ee())return!1;if(F)return!0;e&&(E=e);let t=window.SpeechRecognition||window.webkitSpeechRecognition;return h=new t,h.continuous=!0,h.interimResults=!1,h.lang="en-US",h.onresult=o=>{let a=o.results[o.results.length-1][0].transcript,n=_e(a);if(n){De(n.action);let s={success:!0,command:a,action:n.label};if(E&&E(s),n.action==="stop-voice")return}},h.onend=()=>{F&&h?.start()},h.onerror=o=>{o.error!=="no-speech"&&E&&E({success:!1,command:"",action:"",error:`Voice error: ${o.error}`})},h.start(),F=!0,qe(),!0}function te(){F=!1,h&&(h.stop(),h=null),E=null,ye()}var xe="yuktai-voice-indicator";function qe(){ye();let e=document.createElement("div");e.id=xe,e.setAttribute("data-yuktai-panel","true"),e.setAttribute("aria-live","polite"),e.setAttribute("aria-label","yuktai voice control is listening"),e.style.cssText=`
|
|
28
|
+
position: fixed;
|
|
29
|
+
bottom: 80px;
|
|
30
|
+
left: 50%;
|
|
31
|
+
transform: translateX(-50%);
|
|
32
|
+
z-index: 9995;
|
|
33
|
+
background: #0d9488;
|
|
34
|
+
color: #ffffff;
|
|
35
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
36
|
+
font-size: 13px;
|
|
37
|
+
font-weight: 500;
|
|
38
|
+
padding: 6px 14px;
|
|
39
|
+
border-radius: 99px;
|
|
40
|
+
display: flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
gap: 8px;
|
|
43
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
44
|
+
pointer-events: none;
|
|
45
|
+
`;let t=document.createElement("span");if(t.style.cssText=`
|
|
46
|
+
width: 8px;
|
|
47
|
+
height: 8px;
|
|
48
|
+
border-radius: 50%;
|
|
49
|
+
background: #ffffff;
|
|
50
|
+
animation: yuktai-pulse 1.2s infinite;
|
|
51
|
+
flex-shrink: 0;
|
|
52
|
+
`,!document.getElementById("yuktai-pulse-style")){let a=document.createElement("style");a.id="yuktai-pulse-style",a.textContent=`
|
|
53
|
+
@keyframes yuktai-pulse {
|
|
54
|
+
0%, 100% { opacity: 1; transform: scale(1); }
|
|
55
|
+
50% { opacity: 0.4; transform: scale(0.7); }
|
|
56
|
+
}
|
|
57
|
+
`,document.head.appendChild(a)}let o=document.createElement("span");o.textContent="Listening for commands...",e.appendChild(t),e.appendChild(o),document.body.appendChild(e)}function ye(){let e=document.getElementById(xe);e&&e.remove()}var Ge=["button:not([aria-label]):not([aria-labelledby])","a:not([aria-label]):not([aria-labelledby])","input:not([aria-label]):not([aria-labelledby]):not([id])","select:not([aria-label]):not([aria-labelledby])","textarea:not([aria-label]):not([aria-labelledby])","[role='button']:not([aria-label])","[role='link']:not([aria-label])","[role='checkbox']:not([aria-label])","[role='tab']:not([aria-label])"].join(", ");async function oe(){try{return window.ai?.writer?(await window.ai.writer.capabilities()).available!=="no":!1}catch{return!1}}function Ve(e){let t=[],o=e.innerText?.trim();o&&t.push(`element text: "${o}"`);let a=e.placeholder?.trim();a&&t.push(`placeholder: "${a}"`);let n=e.getAttribute("name")?.trim();n&&t.push(`name: "${n}"`);let s=e.getAttribute("type")?.trim();s&&t.push(`type: "${s}"`);let i=e.id;if(i){let f=document.querySelector(`label[for="${i}"]`);f&&t.push(`label: "${f.innerText?.trim()}"`)}let d=e.parentElement?.innerText?.trim().slice(0,60);d&&t.push(`parent context: "${d}"`),t.push(`tag: ${e.tagName.toLowerCase()}`);let m=e.getAttribute("role");return m&&t.push(`role: ${m}`),t.join(". ")}async function je(e,t){let o=`
|
|
58
|
+
Generate a short, clear aria-label for an HTML element.
|
|
59
|
+
The label must be 2-6 words maximum.
|
|
60
|
+
The label must describe what the element does or what it is.
|
|
61
|
+
Do not include punctuation.
|
|
62
|
+
Do not explain \u2014 just output the label text only.
|
|
63
|
+
|
|
64
|
+
Element details:
|
|
65
|
+
${t}
|
|
66
|
+
|
|
67
|
+
Output only the label. Nothing else.
|
|
68
|
+
`.trim();return(await e.write(o)).trim().replace(/^["']|["']$/g,"").replace(/\.$/,"").trim()}async function he(){if(!await oe())return{success:!1,fixed:0,elements:[],error:"Chrome Built-in AI not available. Chrome 127+ required."};let t=document.querySelectorAll(Ge);if(t.length===0)return{success:!0,fixed:0,elements:[]};try{let o=await window.ai.writer.create({tone:"neutral",format:"plain-text",length:"short"}),a=0,n=[];for(let s of t){if(s.closest("[data-yuktai-panel]"))continue;let i=window.getComputedStyle(s);if(i.display==="none"||i.visibility==="hidden")continue;let d=Ve(s),m=await je(o,d);m&&m.length>0&&(s.dataset.yuktaiLabelOriginal=s.getAttribute("aria-label")||"",s.setAttribute("aria-label",m),a++,n.push({tag:s.tagName.toLowerCase(),label:m}))}return o.destroy(),{success:!0,fixed:a,elements:n}}catch(o){return{success:!1,fixed:0,elements:[],error:o instanceof Error?o.message:"Label generation failed"}}}function we(){let e=document.querySelectorAll("[data-yuktai-label-original]");for(let t of e){let o=t.dataset.yuktaiLabelOriginal;o?t.setAttribute("aria-label",o):t.removeAttribute("aria-label"),delete t.dataset.yuktaiLabelOriginal}}var N=null,ve=null;var ke=null,ie=null,b=null,T=null,W=null,ne=null,C=null,O={deuteranopia:"yuktai-cb-d",protanopia:"yuktai-cb-p",tritanopia:"yuktai-cb-t"};var Ae=new Set(["input","select","textarea"]);var ae={nav:"navigation",header:"banner",footer:"contentinfo",main:"main",aside:"complementary"};function re(e,t="polite"){if(typeof window>"u"||!C?.speechEnabled||!window.speechSynthesis)return;window.speechSynthesis.cancel();let o=new SpeechSynthesisUtterance(e);o.rate=1,o.pitch=1,o.volume=1;let a=window.speechSynthesis.getVoices();a.length>0&&(o.voice=a[0]),window.speechSynthesis.speak(o)}function Re(e,t="info"){if(typeof document>"u")return;let a={success:{bg:"#0f9d58",border:"#0a7a44",icon:"\u2713"},error:{bg:"#d93025",border:"#b52a1c",icon:"\u2715"},warning:{bg:"#f29900",border:"#c67c00",icon:"\u26A0"},info:{bg:"#1a73e8",border:"#1557b0",icon:"\u2139"}}[t];b||(b=document.createElement("div"),b.setAttribute("role","alert"),b.setAttribute("aria-live","assertive"),b.setAttribute("aria-atomic","true"),b.style.cssText=`
|
|
69
|
+
position: fixed;
|
|
70
|
+
top: 80px;
|
|
71
|
+
right: 16px;
|
|
72
|
+
left: auto;
|
|
73
|
+
z-index: 999999;
|
|
74
|
+
max-width: 320px;
|
|
75
|
+
width: calc(100% - 32px);
|
|
76
|
+
border-radius: 8px;
|
|
77
|
+
padding: 12px 16px;
|
|
78
|
+
display: flex;
|
|
79
|
+
align-items: center;
|
|
80
|
+
gap: 10px;
|
|
81
|
+
font-family: system-ui, sans-serif;
|
|
82
|
+
font-size: 14px;
|
|
83
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
|
|
84
|
+
transition: transform 0.3s, opacity 0.3s;
|
|
85
|
+
transform: translateX(120%);
|
|
86
|
+
opacity: 0;
|
|
87
|
+
`,document.body.appendChild(b)),b.style.background=a.bg,b.style.border=`1px solid ${a.border}`,b.style.color="#fff",b.innerHTML=`
|
|
88
|
+
<span style="font-size:18px;font-weight:700">${a.icon}</span>
|
|
89
|
+
<span style="flex:1;line-height:1.4">${e}</span>
|
|
90
|
+
<button
|
|
91
|
+
onclick="this.parentElement.style.transform='translateX(120%)';this.parentElement.style.opacity='0'"
|
|
92
|
+
style="background:none;border:none;color:#fff;cursor:pointer;font-size:18px;padding:0;line-height:1"
|
|
93
|
+
aria-label="Close notification">\xD7</button>
|
|
94
|
+
`,window.innerWidth<=480&&(b.style.right="8px",b.style.left="8px",b.style.maxWidth="none",b.style.width="auto"),requestAnimationFrame(()=>{b&&(b.style.transform="translateX(0)",b.style.opacity="1")}),setTimeout(()=>{b&&(b.style.transform="translateX(120%)",b.style.opacity="0")},5e3)}function u(e,t="info",o=!0){N&&(N.textContent=e),Re(e,t),o&&re(e,t==="error"?"assertive":"polite")}function Ke(){if(typeof document>"u"||ke)return;let e=[{label:"Skip to main content",selector:"main,[role='main'],#main,#main-content"},{label:"Skip to navigation",selector:"nav,[role='navigation'],#nav,#navigation"},{label:"Skip to search",selector:"[role='search'],#search,input[type='search']"}],t=document.createElement("div");t.setAttribute("data-yuktai-skip-bar","true"),t.setAttribute("role","navigation"),t.setAttribute("aria-label","Skip links"),t.style.cssText=`
|
|
95
|
+
position: fixed;
|
|
96
|
+
top: 0;
|
|
97
|
+
left: 0;
|
|
98
|
+
right: 0;
|
|
99
|
+
z-index: 999999;
|
|
100
|
+
display: flex;
|
|
101
|
+
flex-wrap: wrap;
|
|
102
|
+
gap: 4px;
|
|
103
|
+
padding: 4px;
|
|
104
|
+
background: #111;
|
|
105
|
+
transform: translateY(-100%);
|
|
106
|
+
transition: transform 0.2s ease;
|
|
107
|
+
font-family: system-ui, sans-serif;
|
|
108
|
+
`;let o=!1;if(e.forEach(({label:n,selector:s})=>{let i=document.querySelector(s);if(!i)return;o=!0,i.getAttribute("tabindex")||i.setAttribute("tabindex","-1");let d=document.createElement("a");d.href="#",d.textContent=n,d.style.cssText=`
|
|
109
|
+
color: #fff;
|
|
110
|
+
background: #1a73e8;
|
|
111
|
+
padding: 8px 14px;
|
|
112
|
+
border-radius: 4px;
|
|
113
|
+
font-size: 13px;
|
|
114
|
+
font-weight: 600;
|
|
115
|
+
text-decoration: none;
|
|
116
|
+
white-space: nowrap;
|
|
117
|
+
border: 2px solid transparent;
|
|
118
|
+
transition: background 0.15s, border-color 0.15s;
|
|
119
|
+
`,d.addEventListener("focus",()=>{t.style.transform="translateY(0)"}),d.addEventListener("blur",()=>{setTimeout(()=>{t.matches(":focus-within")||(t.style.transform="translateY(-100%)")},2e3)}),d.addEventListener("click",m=>{m.preventDefault(),i.focus(),i.scrollIntoView({behavior:"smooth",block:"start"}),u(`Jumped to ${n.replace("Skip to ","")}`,"info"),t.style.transform="translateY(-100%)"}),t.appendChild(d)}),!o)return;window.innerWidth<768&&(t.style.transform="translateY(0)",t.style.position="sticky"),window.addEventListener("resize",()=>{window.innerWidth<768&&(t.style.transform="translateY(0)")}),document.body.insertBefore(t,document.body.firstChild),ke=t}function Ye(){if(typeof document>"u"||document.querySelector("[data-yuktai-focus-style]"))return;let e=document.createElement("style");e.setAttribute("data-yuktai-focus-style","true"),e.textContent=`
|
|
120
|
+
|
|
121
|
+
/* \u2500\u2500 Focus indicator \u2014 WCAG 2.4.11 minimum 2px solid \u2500\u2500 */
|
|
122
|
+
[data-yuktai-a11y] *:focus-visible {
|
|
123
|
+
outline: 3px solid #1a73e8 !important;
|
|
124
|
+
outline-offset: 3px !important;
|
|
125
|
+
border-radius: 2px !important;
|
|
126
|
+
box-shadow: 0 0 0 6px rgba(26,115,232,0.15) !important;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* \u2500\u2500 High contrast focus \u2500\u2500 */
|
|
130
|
+
[data-yuktai-high-contrast] *:focus-visible {
|
|
131
|
+
outline: 3px solid #ffff00 !important;
|
|
132
|
+
outline-offset: 3px !important;
|
|
133
|
+
box-shadow: 0 0 0 6px rgba(255,255,0,0.2) !important;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* \u2500\u2500 Keyboard hint mode \u2500\u2500 */
|
|
137
|
+
[data-yuktai-keyboard] *:focus {
|
|
138
|
+
outline: 3px solid #ff6b35 !important;
|
|
139
|
+
outline-offset: 3px !important;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* \u2500\u2500 Remove default outline \u2014 replaced above \u2500\u2500 */
|
|
143
|
+
[data-yuktai-a11y] *:focus:not(:focus-visible) {
|
|
144
|
+
outline: none !important;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* \u2500\u2500 Large targets \u2014 WCAG 2.5.8 \u2500\u2500 */
|
|
148
|
+
[data-yuktai-large-targets] button,
|
|
149
|
+
[data-yuktai-large-targets] a,
|
|
150
|
+
[data-yuktai-large-targets] input,
|
|
151
|
+
[data-yuktai-large-targets] select,
|
|
152
|
+
[data-yuktai-large-targets] [role="button"] {
|
|
153
|
+
min-height: 44px !important;
|
|
154
|
+
min-width: 44px !important;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* \u2500\u2500 Reduce motion \u2014 WCAG 2.3.3 \u2500\u2500 */
|
|
158
|
+
[data-yuktai-reduce-motion] *,
|
|
159
|
+
[data-yuktai-reduce-motion] *::before,
|
|
160
|
+
[data-yuktai-reduce-motion] *::after {
|
|
161
|
+
animation-duration: 0.001ms !important;
|
|
162
|
+
transition-duration: 0.001ms !important;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* \u2500\u2500 High contrast mode \u2500\u2500 */
|
|
166
|
+
[data-yuktai-high-contrast] {
|
|
167
|
+
filter: contrast(1.4) brightness(1.05) !important;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* \u2500\u2500 Dark mode \u2500\u2500 */
|
|
171
|
+
[data-yuktai-dark] {
|
|
172
|
+
filter: invert(1) hue-rotate(180deg) !important;
|
|
173
|
+
}
|
|
174
|
+
[data-yuktai-dark] img,
|
|
175
|
+
[data-yuktai-dark] video,
|
|
176
|
+
[data-yuktai-dark] canvas {
|
|
177
|
+
filter: invert(1) hue-rotate(180deg) !important;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* \u2500\u2500 Dyslexia font \u2500\u2500 */
|
|
181
|
+
[data-yuktai-dyslexia] * {
|
|
182
|
+
font-family: "Atkinson Hyperlegible", "Arial", sans-serif !important;
|
|
183
|
+
letter-spacing: 0.05em !important;
|
|
184
|
+
word-spacing: 0.1em !important;
|
|
185
|
+
line-height: 1.8 !important;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* \u2500\u2500 Link underline enforcement \u2500\u2500 */
|
|
189
|
+
[data-yuktai-a11y] a:not([role]):not([class]) {
|
|
190
|
+
text-decoration: underline !important;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
194
|
+
RESPONSIVE BREAKPOINTS
|
|
195
|
+
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
|
|
196
|
+
|
|
197
|
+
/* Skip link bar \u2014 wrap on small screens */
|
|
198
|
+
@media (max-width: 768px) {
|
|
199
|
+
[data-yuktai-skip-bar] {
|
|
200
|
+
flex-wrap: wrap;
|
|
201
|
+
}
|
|
202
|
+
[data-yuktai-skip-bar] a {
|
|
203
|
+
font-size: 12px !important;
|
|
204
|
+
padding: 6px 10px !important;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* Preference panel \u2014 bottom sheet on mobile */
|
|
209
|
+
@media (max-width: 480px) {
|
|
210
|
+
[data-yuktai-panel] {
|
|
211
|
+
width: 100% !important;
|
|
212
|
+
right: 0 !important;
|
|
213
|
+
left: 0 !important;
|
|
214
|
+
bottom: 0 !important;
|
|
215
|
+
border-radius: 16px 16px 0 0 !important;
|
|
216
|
+
max-height: 85vh !important;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/* FAB button \u2014 reposition on mobile */
|
|
221
|
+
@media (max-width: 480px) {
|
|
222
|
+
[data-yuktai-pref-toggle] {
|
|
223
|
+
bottom: 12px !important;
|
|
224
|
+
right: 12px !important;
|
|
225
|
+
width: 44px !important;
|
|
226
|
+
height: 44px !important;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* Audit badge \u2014 reposition on mobile */
|
|
231
|
+
@media (max-width: 480px) {
|
|
232
|
+
[data-yuktai-badge] {
|
|
233
|
+
bottom: 12px !important;
|
|
234
|
+
left: 12px !important;
|
|
235
|
+
font-size: 11px !important;
|
|
236
|
+
padding: 4px 10px !important;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/* Keyboard cheatsheet \u2014 full width on mobile */
|
|
241
|
+
@media (max-width: 480px) {
|
|
242
|
+
[data-yuktai-cheatsheet] {
|
|
243
|
+
width: calc(100vw - 32px) !important;
|
|
244
|
+
max-height: 80vh !important;
|
|
245
|
+
overflow-y: auto !important;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/* Timeout warning \u2014 full width on mobile */
|
|
250
|
+
@media (max-width: 480px) {
|
|
251
|
+
[data-yuktai-timeout] {
|
|
252
|
+
width: calc(100vw - 32px) !important;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/* Visual alert \u2014 full width on mobile */
|
|
257
|
+
@media (max-width: 480px) {
|
|
258
|
+
[data-yuktai-alert] {
|
|
259
|
+
right: 8px !important;
|
|
260
|
+
left: 8px !important;
|
|
261
|
+
max-width: none !important;
|
|
262
|
+
width: auto !important;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
`,document.head.appendChild(e),document.documentElement.setAttribute("data-yuktai-a11y","true")}function Ue(){typeof document>"u"||document.querySelector("[data-yuktai-kb-init]")||(document.documentElement.setAttribute("data-yuktai-kb-init","true"),document.addEventListener("keydown",e=>{let t=document.activeElement;if(!t)return;let o=t.getAttribute("role")||"";if(e.key==="Escape"){let a=t.closest("[role='dialog'],[role='alertdialog']");if(a){a.style.display="none",u("Dialog closed","info");return}let n=t.closest("[role='menu'],[role='menubar']");n&&(n.style.display="none",u("Menu closed","info"))}if(o==="menuitem"||t.closest("[role='menu'],[role='menubar']")){let a=t.closest("[role='menu'],[role='menubar']");if(!a)return;let n=Array.from(a.querySelectorAll("[role='menuitem']:not([disabled])")),s=n.indexOf(t);e.key==="ArrowDown"||e.key==="ArrowRight"?(e.preventDefault(),n[(s+1)%n.length]?.focus()):e.key==="ArrowUp"||e.key==="ArrowLeft"?(e.preventDefault(),n[(s-1+n.length)%n.length]?.focus()):e.key==="Home"?(e.preventDefault(),n[0]?.focus()):e.key==="End"&&(e.preventDefault(),n[n.length-1]?.focus())}if(o==="tab"||t.closest("[role='tablist']")){let a=t.closest("[role='tablist']");if(!a)return;let n=Array.from(a.querySelectorAll("[role='tab']:not([disabled])")),s=n.indexOf(t);if(e.key==="ArrowRight"||e.key==="ArrowDown"){e.preventDefault();let i=n[(s+1)%n.length];i?.focus(),i?.click()}else if(e.key==="ArrowLeft"||e.key==="ArrowUp"){e.preventDefault();let i=n[(s-1+n.length)%n.length];i?.focus(),i?.click()}}if(o==="option"||t.closest("[role='listbox']")){let a=t.closest("[role='listbox']");if(!a)return;let n=Array.from(a.querySelectorAll("[role='option']:not([aria-disabled='true'])")),s=n.indexOf(t);e.key==="ArrowDown"?(e.preventDefault(),n[(s+1)%n.length]?.focus()):e.key==="ArrowUp"?(e.preventDefault(),n[(s-1+n.length)%n.length]?.focus()):(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),t.setAttribute("aria-selected","true"),n.forEach(i=>{i!==t&&i.setAttribute("aria-selected","false")}),u(`Selected: ${t.textContent?.trim()}`,"success"))}e.altKey&&e.key==="a"&&(e.preventDefault(),Je()),e.key==="Tab"&&C?.speechEnabled&&setTimeout(()=>{let a=document.activeElement;if(!a)return;let n=a.getAttribute("aria-label")||a.getAttribute("title")||a.textContent?.trim()||a.tagName.toLowerCase(),s=a.getAttribute("role")||a.tagName.toLowerCase();re(`${n}, ${s}`)},100)}))}function B(e){let t=e.querySelectorAll('button:not([disabled]),a[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"]),[role="button"]');if(t.length===0)return;let o=t[0],a=t[t.length-1];o.focus(),e.addEventListener("keydown",n=>{n.key==="Tab"&&(n.shiftKey?document.activeElement===o&&(n.preventDefault(),a.focus()):document.activeElement===a&&(n.preventDefault(),o.focus()))})}function Je(){if(typeof document>"u")return;if(T){T.remove(),T=null;return}let e=document.createElement("div");e.setAttribute("role","dialog"),e.setAttribute("aria-label","Keyboard shortcuts"),e.setAttribute("aria-modal","true"),e.setAttribute("data-yuktai-cheatsheet","true"),e.style.cssText=`
|
|
266
|
+
position: fixed;
|
|
267
|
+
top: 50%;
|
|
268
|
+
left: 50%;
|
|
269
|
+
transform: translate(-50%, -50%);
|
|
270
|
+
z-index: 999999;
|
|
271
|
+
background: #1a1a2e;
|
|
272
|
+
color: #fff;
|
|
273
|
+
border-radius: 12px;
|
|
274
|
+
padding: 24px;
|
|
275
|
+
width: min(320px, calc(100vw - 32px));
|
|
276
|
+
max-height: 80vh;
|
|
277
|
+
overflow-y: auto;
|
|
278
|
+
box-shadow: 0 20px 60px rgba(0,0,0,0.5);
|
|
279
|
+
font-family: system-ui, sans-serif;
|
|
280
|
+
`;let t=[["Alt + A","Open/close this menu"],["Tab","Next focusable element"],["Shift+Tab","Previous focusable element"],["Enter","Activate button or link"],["Space","Check checkbox / scroll"],["Arrow keys","Navigate lists and menus"],["Escape","Close dialog or menu"],["Home","First item in list"],["End","Last item in list"]];e.innerHTML=`
|
|
281
|
+
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:16px">
|
|
282
|
+
<h2 style="margin:0;font-size:16px;font-weight:700;color:#74c0fc">
|
|
283
|
+
\u2328 Keyboard shortcuts
|
|
284
|
+
</h2>
|
|
285
|
+
<button data-yuktai-close
|
|
286
|
+
style="background:none;border:none;color:#aaa;cursor:pointer;font-size:20px;padding:0;line-height:1"
|
|
287
|
+
aria-label="Close shortcuts">\xD7</button>
|
|
288
|
+
</div>
|
|
289
|
+
${t.map(([a,n])=>`
|
|
290
|
+
<div style="display:flex;justify-content:space-between;align-items:center;padding:6px 0;border-bottom:1px solid #2a2a4a">
|
|
291
|
+
<kbd style="background:#2a2a4a;color:#74c0fc;padding:3px 8px;border-radius:4px;font-size:12px;font-family:monospace;border:1px solid #3a3a6a">${a}</kbd>
|
|
292
|
+
<span style="font-size:12px;color:#ccc;text-align:right;flex:1;margin-left:12px">${n}</span>
|
|
293
|
+
</div>
|
|
294
|
+
`).join("")}
|
|
295
|
+
`,e.querySelector("[data-yuktai-close]")?.addEventListener("click",()=>{e.remove(),T=null}),e.addEventListener("keydown",a=>{a.key==="Escape"&&(e.remove(),T=null)}),document.body.appendChild(e),T=e,B(e),u("Keyboard shortcuts opened. Press Escape to close.","info")}function Xe(e){if(typeof document>"u"||!C?.showAuditBadge||typeof window<"u"&&!window.location.hostname.includes("localhost")&&!window.location.hostname.includes("127.0.0.1"))return;ie&&ie.remove();let t=e.score,o=t>=90?"#0f9d58":t>=70?"#f29900":"#d93025",a=t>=90?"\u267F":t>=70?"\u26A0":"\u2715",n=document.createElement("button");n.setAttribute("aria-label",`Accessibility score: ${t} out of 100`),n.setAttribute("data-yuktai-badge","true"),n.style.cssText=`
|
|
296
|
+
position: fixed;
|
|
297
|
+
bottom: 16px;
|
|
298
|
+
left: 16px;
|
|
299
|
+
z-index: 999998;
|
|
300
|
+
background: ${o};
|
|
301
|
+
color: #fff;
|
|
302
|
+
border: none;
|
|
303
|
+
border-radius: 20px;
|
|
304
|
+
cursor: pointer;
|
|
305
|
+
padding: 6px 12px;
|
|
306
|
+
font-size: 12px;
|
|
307
|
+
font-weight: 700;
|
|
308
|
+
font-family: system-ui, sans-serif;
|
|
309
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.3);
|
|
310
|
+
display: flex;
|
|
311
|
+
align-items: center;
|
|
312
|
+
gap: 6px;
|
|
313
|
+
transition: transform 0.15s;
|
|
314
|
+
`,n.innerHTML=`${a} ${t}/100 <span style="font-weight:400;opacity:0.85">${e.details.length} issues</span>`,n.addEventListener("click",()=>Ze(e)),document.body.appendChild(n),ie=n}function Ze(e){let t=document.querySelector("[data-yuktai-audit-details]");if(t){t.remove();return}let o=document.createElement("div");o.setAttribute("data-yuktai-audit-details","true"),o.setAttribute("role","dialog"),o.setAttribute("aria-label","Accessibility audit details"),o.style.cssText=`
|
|
315
|
+
position: fixed;
|
|
316
|
+
bottom: 56px;
|
|
317
|
+
left: 16px;
|
|
318
|
+
right: 16px;
|
|
319
|
+
z-index: 999999;
|
|
320
|
+
background: #1a1a2e;
|
|
321
|
+
color: #fff;
|
|
322
|
+
border-radius: 12px;
|
|
323
|
+
padding: 16px;
|
|
324
|
+
width: auto;
|
|
325
|
+
max-width: 340px;
|
|
326
|
+
max-height: 60vh;
|
|
327
|
+
overflow-y: auto;
|
|
328
|
+
box-shadow: 0 8px 32px rgba(0,0,0,0.5);
|
|
329
|
+
font-family: system-ui, sans-serif;
|
|
330
|
+
font-size: 12px;
|
|
331
|
+
`;let a={critical:"#d93025",serious:"#f29900",moderate:"#1a73e8",minor:"#0f9d58"};o.innerHTML=`
|
|
332
|
+
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px">
|
|
333
|
+
<strong style="font-size:14px;color:#74c0fc">Audit report</strong>
|
|
334
|
+
<span style="color:#aaa">${e.fixed} fixed \xB7 ${e.renderTime}ms</span>
|
|
335
|
+
</div>
|
|
336
|
+
${e.details.slice(0,20).map(n=>`
|
|
337
|
+
<div style="padding:6px 0;border-bottom:1px solid #2a2a4a">
|
|
338
|
+
<div style="display:flex;gap:6px;align-items:center">
|
|
339
|
+
<span style="background:${a[n.severity]};color:#fff;padding:1px 6px;border-radius:4px;font-size:10px;font-weight:700;text-transform:uppercase">${n.severity}</span>
|
|
340
|
+
<code style="color:#74c0fc"><${n.tag}></code>
|
|
341
|
+
</div>
|
|
342
|
+
<div style="color:#ccc;margin-top:3px">${n.fix}</div>
|
|
343
|
+
</div>
|
|
344
|
+
`).join("")}
|
|
345
|
+
${e.details.length>20?`<div style="color:#888;padding:8px 0;text-align:center">+${e.details.length-20} more issues</div>`:""}
|
|
346
|
+
`,o.addEventListener("keydown",n=>{n.key==="Escape"&&o.remove()}),document.body.appendChild(o),B(o)}function Pe(e){typeof document>"u"||(ne&&clearTimeout(ne),ne=setTimeout(()=>{if(W)return;let t=document.createElement("div");t.setAttribute("role","alertdialog"),t.setAttribute("aria-label","Session timeout warning"),t.setAttribute("aria-modal","true"),t.setAttribute("data-yuktai-timeout","true"),t.style.cssText=`
|
|
347
|
+
position: fixed;
|
|
348
|
+
top: 50%;
|
|
349
|
+
left: 50%;
|
|
350
|
+
transform: translate(-50%, -50%);
|
|
351
|
+
z-index: 999999;
|
|
352
|
+
background: #fff;
|
|
353
|
+
color: #111;
|
|
354
|
+
border-radius: 12px;
|
|
355
|
+
padding: 24px;
|
|
356
|
+
width: min(320px, calc(100vw - 32px));
|
|
357
|
+
box-shadow: 0 20px 60px rgba(0,0,0,0.4);
|
|
358
|
+
font-family: system-ui, sans-serif;
|
|
359
|
+
border: 2px solid #d93025;
|
|
360
|
+
`,t.innerHTML=`
|
|
361
|
+
<h2 style="margin:0 0 8px;font-size:18px;color:#d93025">\u23F1 Session timeout</h2>
|
|
362
|
+
<p style="margin:0 0 16px;font-size:14px;line-height:1.5;color:#444">
|
|
363
|
+
Your session will expire soon. Do you need more time?
|
|
364
|
+
</p>
|
|
365
|
+
<div style="display:flex;gap:8px;flex-wrap:wrap">
|
|
366
|
+
<button data-yuktai-extend
|
|
367
|
+
style="flex:1;min-width:120px;padding:10px;background:#1a73e8;color:#fff;border:none;border-radius:8px;cursor:pointer;font-size:14px;font-weight:600">
|
|
368
|
+
Yes, more time
|
|
369
|
+
</button>
|
|
370
|
+
<button data-yuktai-dismiss
|
|
371
|
+
style="flex:1;min-width:120px;padding:10px;background:#f1f3f4;color:#111;border:none;border-radius:8px;cursor:pointer;font-size:14px">
|
|
372
|
+
No, sign out
|
|
373
|
+
</button>
|
|
374
|
+
</div>
|
|
375
|
+
`;let o=t.querySelector("[data-yuktai-extend]"),a=t.querySelector("[data-yuktai-dismiss]");o?.addEventListener("click",()=>{t.remove(),W=null,u("Session extended. You have more time.","success"),C?.timeoutWarning&&Pe(C.timeoutWarning)}),a?.addEventListener("click",()=>{t.remove(),W=null}),document.body.appendChild(t),W=t,B(t),u("Warning: Your session will expire soon. Do you need more time?","warning")},e*1e3))}function Qe(e){if(typeof document>"u")return;let t=document.documentElement;if(t.toggleAttribute("data-yuktai-high-contrast",!!e.highContrast),t.toggleAttribute("data-yuktai-dark",!!e.darkMode),t.toggleAttribute("data-yuktai-reduce-motion",!!e.reduceMotion),t.toggleAttribute("data-yuktai-large-targets",!!e.largeTargets),t.toggleAttribute("data-yuktai-keyboard",!!e.keyboardHints),t.toggleAttribute("data-yuktai-dyslexia",!!e.dyslexiaFont),e.localFont?document.body.style.fontFamily=`"${e.localFont}", system-ui, sans-serif`:e.dyslexiaFont||(document.body.style.fontFamily=""),e.fontSizeMultiplier&&e.fontSizeMultiplier!==1?document.documentElement.style.fontSize=`${e.fontSizeMultiplier*100}%`:document.documentElement.style.fontSize="",e.colorBlindMode&&e.colorBlindMode!=="none"){let o=e.colorBlindMode==="achromatopsia"?"grayscale(100%)":`url(#${O[e.colorBlindMode]})`;document.body.style.filter=o}else document.body.style.filter=""}function et(e){try{let t=localStorage.getItem("yuktai-a11y-prefs");t&&Object.assign(e,JSON.parse(t))}catch{}}async function Se(e){if(e){if(!await X()){u("Plain English requires Chrome 127+","warning");return}u("Rewriting page in plain English...","info",!1);let o=await ce();u(o.error?`Plain English failed: ${o.error}`:`${o.fixed} sections rewritten in plain English`,o.error?"error":"success",!1)}else ue(),u("Original text restored","info",!1)}async function Ee(e){if(e){if(!await Z()){u("Page summariser requires Chrome 127+","warning");return}u("Generating page summary...","info",!1);let o=await fe();u(o.error?`Summary failed: ${o.error}`:"Page summary added at top",o.error?"error":"success",!1)}else I(),u("Page summary removed","info",!1)}async function Te(e){if(e==="en"){Q(),u("Page restored to English","info",!1);return}u(`Translating page to ${e}...`,"info",!1);let t=await me(e);u(t.error?`Translation failed: ${t.error}`:`Page translated to ${e}`,t.error?"error":"success",!1)}async function Ce(e){if(e){if(!ee()){u("Voice control not supported in this browser","warning");return}ge(t=>{t.success&&u(`Voice: ${t.action}`,"info",!1)}),u("Voice control started. Say a command.","success",!1)}else te(),u("Voice control stopped","info",!1)}async function Le(e){if(e){if(!await oe()){u("Smart labels requires Chrome 127+","warning");return}u("Generating smart labels...","info",!1);let o=await he();u(o.error?`Smart labels failed: ${o.error}`:`${o.fixed} elements labelled`,o.error?"error":"success",!1)}else we(),u("Smart labels removed","info",!1)}function tt(){if(typeof document>"u"||N)return;let e=document.createElement("div");e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),e.setAttribute("aria-relevant","text"),e.style.cssText="position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);",document.body.appendChild(e),N=e}function ot(){if(typeof document>"u"||ve)return;let e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttribute("aria-hidden","true"),e.style.cssText="position:absolute;width:0;height:0;overflow:hidden;",e.innerHTML=`
|
|
376
|
+
<defs>
|
|
377
|
+
<filter id="${O.deuteranopia}">
|
|
378
|
+
<feColorMatrix type="matrix"
|
|
379
|
+
values="0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0"/>
|
|
380
|
+
</filter>
|
|
381
|
+
<filter id="${O.protanopia}">
|
|
382
|
+
<feColorMatrix type="matrix"
|
|
383
|
+
values="0.567 0.433 0 0 0 0.558 0.442 0 0 0 0 0.242 0.758 0 0 0 0 0 1 0"/>
|
|
384
|
+
</filter>
|
|
385
|
+
<filter id="${O.tritanopia}">
|
|
386
|
+
<feColorMatrix type="matrix"
|
|
387
|
+
values="0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0.475 0.525 0 0 0 0 0 1 0"/>
|
|
388
|
+
</filter>
|
|
389
|
+
</defs>
|
|
390
|
+
`,document.body.appendChild(e),ve=e}function Me(e){let t={critical:20,serious:10,moderate:5,minor:2},o=e.details.reduce((a,n)=>a+(t[n.severity]||0),0);return Math.max(0,Math.min(100,100-o))}var w={name:"yuktai-a11y",version:"4.0.0",observer:null,async execute(e){if(!e.enabled)return this.stopObserver(),"yuktai: disabled.";C=e,et(e),tt(),ot(),Ye(),Ue(),e.showSkipLinks!==!1&&Ke(),e.showPreferencePanel,Qe(e);let t=this.applyFixes(e);t.score=Me(t),e.showAuditBadge&&Xe(t),e.timeoutWarning&&Pe(e.timeoutWarning),e.autoFix&&this.startObserver(e),e.plainEnglish&&await Se(!0),e.summarisePage&&await Ee(!0),e.translateLanguage&&e.translateLanguage!=="en"&&await Te(e.translateLanguage),e.voiceControl&&await Ce(!0),e.smartLabels&&await Le(!0);let o=`${t.fixed} fixes applied. Score: ${t.score}/100.`;return u(o,t.score>=90?"success":"info",!1),`yuktai v4.0.0: ${o} Scanned ${t.scanned} elements in ${t.renderTime}ms.`},applyFixes(e){let t={fixed:0,scanned:0,renderTime:0,score:100,details:[]};if(typeof document>"u")return t;let o=performance.now(),a=document.querySelectorAll("*");t.scanned=a.length;let n=(s,i,d,m)=>{t.details.push({tag:s,fix:i,severity:d,element:m.outerHTML.slice(0,100)}),t.fixed++};return a.forEach(s=>{let i=s,d=i.tagName.toLowerCase();if(d==="html"&&!i.getAttribute("lang")&&(i.setAttribute("lang","en"),n(d,'lang="en" added',"critical",i)),d==="meta"){let f=i.getAttribute("name"),x=i.getAttribute("content")||"";f==="viewport"&&x.includes("user-scalable=no")&&(i.setAttribute("content",x.replace("user-scalable=no","user-scalable=yes")),n(d,"user-scalable=yes restored","serious",i)),f==="viewport"&&/maximum-scale=1(?:[^0-9]|$)/.test(x)&&(i.setAttribute("content",x.replace(/maximum-scale=1(?=[^0-9]|$)/,"maximum-scale=5")),n(d,"maximum-scale=5 restored","serious",i))}if(d==="main"&&!i.getAttribute("tabindex")&&(i.setAttribute("tabindex","-1"),i.getAttribute("id")||i.setAttribute("id","main-content")),d==="img"&&(i.hasAttribute("alt")||(i.setAttribute("alt",""),i.setAttribute("aria-hidden","true"),n(d,'alt="" aria-hidden="true"',"serious",i))),d==="svg"&&(!i.getAttribute("aria-hidden")&&!i.getAttribute("aria-label")&&!s.querySelector("title")&&(i.setAttribute("aria-hidden","true"),n(d,'aria-hidden="true" (decorative svg)',"minor",i)),i.getAttribute("focusable")||i.setAttribute("focusable","false")),d==="iframe"&&!i.getAttribute("title")&&!i.getAttribute("aria-label")&&(i.setAttribute("title","embedded content"),i.setAttribute("aria-label","embedded content"),n(d,"title + aria-label added","serious",i)),d==="button"){if(!i.innerText?.trim()&&!i.getAttribute("aria-label")){let f=i.getAttribute("title")||"button";i.setAttribute("aria-label",f),n(d,`aria-label="${f}" (empty button)`,"critical",i)}i.hasAttribute("disabled")&&!i.getAttribute("aria-disabled")&&(i.setAttribute("aria-disabled","true"),t.fixed++)}if(d==="a"){let f=i;!i.innerText?.trim()&&!i.getAttribute("aria-label")&&(i.setAttribute("aria-label",i.getAttribute("title")||"link"),n(d,"aria-label added (empty link)","critical",i)),f.target==="_blank"&&!f.rel?.includes("noopener")&&(f.rel="noopener noreferrer",t.fixed++)}if(Ae.has(d)){let f=i;if(!i.getAttribute("aria-label")&&!i.getAttribute("aria-labelledby")){let x=i.getAttribute("placeholder")||i.getAttribute("name")||d;i.setAttribute("aria-label",x),n(d,`aria-label="${x}"`,"serious",i)}if(i.hasAttribute("required")&&!i.getAttribute("aria-required")&&(i.setAttribute("aria-required","true"),t.fixed++),d==="input"&&!f.autocomplete){let x=f.name||"";f.type==="email"||x.includes("email")?f.autocomplete="email":f.type==="tel"||x.includes("tel")?f.autocomplete="tel":f.type==="password"&&(f.autocomplete="current-password"),t.fixed++}}d==="th"&&!i.getAttribute("scope")&&(i.setAttribute("scope",i.closest("thead")?"col":"row"),n(d,"scope added to <th>","moderate",i)),ae[d]&&!i.getAttribute("role")&&(i.setAttribute("role",ae[d]),n(d,`role="${ae[d]}"`,"minor",i));let m=i.getAttribute("role")||"";m==="tab"&&!i.getAttribute("aria-selected")&&(i.setAttribute("aria-selected","false"),t.fixed++),["alert","status","log"].includes(m)&&!i.getAttribute("aria-live")&&(i.setAttribute("aria-live",m==="alert"?"assertive":"polite"),n(d,`aria-live added on role=${m}`,"moderate",i)),m==="combobox"&&!i.getAttribute("aria-expanded")&&(i.setAttribute("aria-expanded","false"),n(d,'aria-expanded="false" on combobox',"serious",i)),(m==="checkbox"||m==="radio")&&!i.getAttribute("aria-checked")&&(i.setAttribute("aria-checked","false"),n(d,`aria-checked="false" on role=${m}`,"serious",i))}),t.renderTime=parseFloat((performance.now()-o).toFixed(2)),t},scan(){let e={fixed:0,scanned:0,renderTime:0,score:100,details:[]};if(typeof document>"u")return e;let t=performance.now(),o=document.querySelectorAll("*");e.scanned=o.length;let a=(n,s,i,d)=>e.details.push({tag:n,fix:s,severity:i,element:d.outerHTML.slice(0,100)});return o.forEach(n=>{let s=n,i=s.tagName.toLowerCase();(i==="a"||i==="button")&&!s.innerText?.trim()&&!s.getAttribute("aria-label")&&a(i,"needs aria-label (empty)","critical",s),i==="img"&&!s.hasAttribute("alt")&&a(i,"needs alt text","serious",s),Ae.has(i)&&!s.getAttribute("aria-label")&&!s.getAttribute("aria-labelledby")&&a(i,"needs aria-label","serious",s),i==="iframe"&&!s.getAttribute("title")&&!s.getAttribute("aria-label")&&a(i,"iframe needs title","serious",s)}),e.fixed=e.details.length,e.score=Me(e),e.renderTime=parseFloat((performance.now()-t).toFixed(2)),e},startObserver(e){this.observer||typeof document>"u"||(this.observer=new MutationObserver(()=>this.applyFixes(e)),this.observer.observe(document.body,{childList:!0,subtree:!0,attributes:!1}))},stopObserver(){this.observer?.disconnect(),this.observer=null},announce:u,speak:re,showVisualAlert:Re,trapFocus:B,handlePlainEnglish:Se,handleSummarisePage:Ee,handleTranslate:Te,handleVoiceControl:Ce,handleSmartLabels:Le,SUPPORTED_LANGUAGES:$};import lt,{useEffect as D,useState as M,useCallback as q}from"react";import{forwardRef as it,useEffect as ze,useState as Ie}from"react";import{jsx as r,jsxs as p}from"react/jsx-runtime";var se={highContrast:!1,reduceMotion:!1,autoFix:!0,dyslexiaFont:!1,fontScale:100,localFont:"",darkMode:!1,largeTargets:!1,speechEnabled:!1,colorBlindMode:"none",showAuditBadge:!1,timeoutWarning:void 0,plainEnglish:!1,summarisePage:!1,translateLanguage:"en",voiceControl:!1,smartLabels:!1},L=[80,90,100,110,120,130],nt=[{value:"none",label:"None"},{value:"deuteranopia",label:"Deuteranopia"},{value:"protanopia",label:"Protanopia"},{value:"tritanopia",label:"Tritanopia"},{value:"achromatopsia",label:"Greyscale"}],at=["Prompt API for Gemini Nano","Summarization API for Gemini Nano","Writer API for Gemini Nano","Rewriter API for Gemini Nano","Translation API"];function rt(){let[e,t]=Ie(typeof window<"u"?window.innerWidth:1024);return ze(()=>{let o=()=>t(window.innerWidth);return window.addEventListener("resize",o),()=>window.removeEventListener("resize",o)},[]),{isMobile:e<=480,isTablet:e>480&&e<=768}}function st({checked:e,onChange:t,label:o,disabled:a=!1}){return p("label",{"aria-label":o,style:{position:"relative",display:"inline-flex",width:"40px",height:"24px",cursor:a?"not-allowed":"pointer",flexShrink:0,opacity:a?.4:1},children:[r("input",{type:"checkbox",checked:e,disabled:a,onChange:n=>t(n.target.checked),style:{opacity:0,width:0,height:0,position:"absolute"}}),r("span",{style:{position:"absolute",inset:0,borderRadius:"99px",background:e?"#0d9488":"#cbd5e1",transition:"background 0.2s"}}),r("span",{style:{position:"absolute",top:"3px",left:e?"19px":"3px",width:"18px",height:"18px",background:"#fff",borderRadius:"50%",transition:"left 0.2s",boxShadow:"0 1px 3px rgba(0,0,0,0.2)",pointerEvents:"none"}})]})}function _({label:e,color:t="#64748b",badge:o}){return p("div",{style:{display:"flex",alignItems:"center",gap:"8px",margin:"8px 18px 4px"},children:[r("p",{style:{margin:0,fontSize:"10px",fontWeight:600,color:t,letterSpacing:"0.06em",textTransform:"uppercase"},children:e}),o&&r("span",{style:{fontSize:"9px",fontWeight:500,padding:"1px 7px",borderRadius:"99px",background:"#f5f3ff",color:"#7c3aed",border:"0.5px solid #c4b5fd",whiteSpace:"nowrap"},children:o})]})}function k({icon:e,label:t,desc:o,checked:a,onChange:n,disabled:s=!1,disabledReason:i}){return p("div",{title:s?i:void 0,style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"10px 18px",gap:"12px"},children:[p("div",{style:{display:"flex",alignItems:"center",gap:"10px",flex:1,minWidth:0},children:[r("span",{"aria-hidden":"true",style:{width:"30px",height:"30px",borderRadius:"8px",background:s?"#f1f5f9":"#f0fdfa",color:s?"#94a3b8":"#0d9488",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"13px",flexShrink:0,fontWeight:700},children:e}),p("div",{style:{minWidth:0},children:[r("p",{style:{margin:0,fontSize:"13px",fontWeight:500,color:s?"#94a3b8":"#0f172a",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:t}),r("p",{style:{margin:0,fontSize:"11px",color:"#94a3b8"},children:s?i:o})]})]}),r(st,{checked:a,onChange:n,label:`Toggle ${t}`,disabled:s})]})}function y(){return r("div",{style:{height:"1px",background:"#f1f5f9",margin:"0"}})}var le=it(({position:e,settings:t,report:o,isActive:a,aiSupported:n,voiceSupported:s,set:i,onApply:d,onReset:m,onClose:f},x)=>{let{isMobile:g,isTablet:j}=rt(),[P,K]=Ie([]);ze(()=>{(async()=>{try{let z=window;if(!z.queryLocalFonts)return;let Y=await z.queryLocalFonts(),U=[...new Set(Y.map(J=>J.family))].sort();K(U.slice(0,50))}catch{}})()},[]);let R=g?{position:"fixed",bottom:0,left:0,right:0,zIndex:9999,background:"#fff",border:"1px solid #e2e8f0",borderRadius:"16px 16px 0 0",boxShadow:"0 -8px 32px rgba(0,0,0,0.12)",maxHeight:"90vh",overflowY:"auto",fontFamily:"system-ui,-apple-system,sans-serif",width:"100%"}:{position:"fixed",bottom:"84px",[e]:"24px",zIndex:9999,width:j?"300px":"320px",maxWidth:"calc(100vw - 48px)",background:"#fff",border:"1px solid #e2e8f0",borderRadius:"16px",boxShadow:"0 8px 32px rgba(0,0,0,0.12)",maxHeight:"80vh",overflowY:"auto",fontFamily:"system-ui,-apple-system,sans-serif"};return p("div",{ref:x,role:"dialog","aria-modal":"true","aria-label":"yuktai accessibility preferences","data-yuktai-panel":"true",style:R,children:[p("div",{style:{padding:"14px 18px 12px",borderBottom:"1px solid #f1f5f9",display:"flex",alignItems:"flex-start",justifyContent:"space-between",position:"sticky",top:0,background:"#fff",zIndex:1},children:[p("div",{children:[p("div",{style:{display:"flex",alignItems:"center",gap:"7px",marginBottom:"5px",flexWrap:"wrap"},children:[r("span",{style:{fontSize:"10px",fontWeight:700,padding:"2px 7px",borderRadius:"99px",background:"#f0fdfa",color:"#0d9488",letterSpacing:"0.05em",fontFamily:"monospace"},children:"@yuktishaalaa/yuktai v2.0.18"}),a&&r("span",{style:{fontSize:"10px",fontWeight:700,padding:"2px 7px",borderRadius:"99px",background:"#f0fdfa",color:"#0f766e",border:"1px solid #99f6e4"},children:"\u25CF ACTIVE"})]}),r("p",{style:{margin:"0 0 2px",fontSize:"15px",fontWeight:600,color:"#0f172a"},children:"Accessibility"}),r("p",{style:{margin:0,fontSize:"12px",color:"#64748b"},children:"WCAG 2.2 \xB7 Open source \xB7 Zero cost"})]}),r("button",{onClick:f,"aria-label":"Close accessibility panel",style:{background:"none",border:"none",cursor:"pointer",padding:"4px",color:"#94a3b8",fontSize:"20px",lineHeight:1,borderRadius:"6px",flexShrink:0,minWidth:g?"44px":"auto",minHeight:g?"44px":"auto",display:"flex",alignItems:"center",justifyContent:"center"},children:"\xD7"})]}),r(_,{label:"Core"}),r(k,{icon:"\u267F",label:"Auto-fix ARIA",desc:"Injects missing labels and roles",checked:t.autoFix,onChange:l=>i("autoFix",l)}),r(y,{}),r(k,{icon:"\u{1F50A}",label:"Speak on focus",desc:"Browser reads elements aloud",checked:t.speechEnabled,onChange:l=>i("speechEnabled",l)}),r(y,{}),r(k,{icon:"\u{1F399}",label:"Voice control",desc:"Navigate page by voice",checked:t.voiceControl,onChange:l=>i("voiceControl",l),disabled:!s,disabledReason:"Not supported in this browser"}),r(y,{}),r(_,{label:"AI features",color:"#7c3aed",badge:"Gemini Nano \xB7 Chrome 127+"}),r("div",{style:{margin:"4px 18px 6px",padding:"8px 10px",background:"#f5f3ff",borderRadius:"8px",border:"0.5px solid #c4b5fd",fontSize:"10px",color:"#7c3aed",lineHeight:1.5},children:n?"Gemini Nano detected \u2014 AI features ready. Runs privately on your device. No data leaves your browser.":"AI features need setup \u2014 see guide below."}),!n&&p("div",{style:{margin:"0 18px 8px",padding:"10px 12px",background:"#fafafa",borderRadius:"8px",border:"0.5px solid #e2e8f0",fontSize:"11px",color:"#475569",lineHeight:1.7},children:[r("p",{style:{margin:"0 0 6px",fontWeight:600,color:"#0f172a",fontSize:"11px"},children:"\u{1F6E0} How to enable AI features:"}),p("p",{style:{margin:"0 0 3px"},children:["1. Open Chrome and go to"," ",r("code",{style:{background:"#f1f5f9",padding:"1px 5px",borderRadius:"4px",fontSize:"10px",color:"#0d9488",fontFamily:"monospace"},children:"chrome://flags"})]}),p("p",{style:{margin:"0 0 3px"},children:["2. Search and set each to ",r("strong",{style:{color:"#0f172a"},children:"Enabled:"})]}),r("div",{style:{display:"flex",flexDirection:"column",gap:"2px",margin:"4px 0 6px 10px"},children:at.map(l=>p("span",{style:{fontSize:"10px",color:"#7c3aed",fontFamily:"monospace"},children:["\u2192 ",l]},l))}),p("p",{style:{margin:"0 0 3px"},children:["3. Click ",r("strong",{style:{color:"#0f172a"},children:"Relaunch"})," when Chrome prompts you"]}),p("p",{style:{margin:"0 0 3px"},children:["4. Go to"," ",r("code",{style:{background:"#f1f5f9",padding:"1px 5px",borderRadius:"4px",fontSize:"10px",color:"#0d9488",fontFamily:"monospace"},children:"chrome://components"})]}),p("p",{style:{margin:"0 0 3px 10px"},children:["\u2192 Find ",r("strong",{style:{color:"#0f172a"},children:"Optimization Guide On Device Model"})]}),p("p",{style:{margin:"0 0 6px 10px"},children:["\u2192 Click ",r("strong",{style:{color:"#0f172a"},children:"Check for update"})," and wait for download"]}),r("p",{style:{margin:"0"},children:"5. Refresh this page \u2014 AI features will unlock automatically"})]}),r(k,{icon:"\u{1F4DD}",label:"Plain English mode",desc:"Simplifies complex page text",checked:t.plainEnglish,onChange:l=>i("plainEnglish",l),disabled:!n,disabledReason:"Enable Gemini Nano \u2014 see setup guide above"}),r(y,{}),r(k,{icon:"\u{1F4CB}",label:"Summarise page",desc:"3-sentence summary at top",checked:t.summarisePage,onChange:l=>i("summarisePage",l),disabled:!n,disabledReason:"Enable Gemini Nano \u2014 see setup guide above"}),r(y,{}),r(k,{icon:"\u{1F3F7}",label:"Smart aria-labels",desc:"AI generates meaningful labels",checked:t.smartLabels,onChange:l=>i("smartLabels",l),disabled:!n,disabledReason:"Enable Gemini Nano \u2014 see setup guide above"}),r(y,{}),r(_,{label:"Visual"}),r(k,{icon:"\u25D1",label:"High contrast",desc:"Boosts contrast for low vision",checked:t.highContrast,onChange:l=>i("highContrast",l)}),r(y,{}),r(k,{icon:"\u{1F319}",label:"Dark mode",desc:"Inverts colours",checked:t.darkMode,onChange:l=>i("darkMode",l)}),r(y,{}),r(k,{icon:"\u23F8",label:"Reduce motion",desc:"Disables animations",checked:t.reduceMotion,onChange:l=>i("reduceMotion",l)}),r(y,{}),r(k,{icon:"\u{1F446}",label:"Large targets",desc:"44\xD744px minimum touch targets",checked:t.largeTargets,onChange:l=>i("largeTargets",l)}),r(y,{}),p("div",{style:{padding:"10px 18px"},children:[r("p",{style:{margin:"0 0 8px",fontSize:"13px",fontWeight:500,color:"#0f172a"},children:"\u{1F3A8} Colour blindness"}),r("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px"},children:nt.map(l=>r("button",{onClick:()=>i("colorBlindMode",l.value),"aria-pressed":t.colorBlindMode===l.value,style:{padding:"4px 10px",borderRadius:"20px",fontSize:"11px",fontWeight:500,border:`1px solid ${t.colorBlindMode===l.value?"#0d9488":"#e2e8f0"}`,background:t.colorBlindMode===l.value?"#f0fdfa":"#fff",color:t.colorBlindMode===l.value?"#0d9488":"#64748b",cursor:"pointer",minHeight:g?"36px":"auto"},children:l.label},l.value))})]}),r(y,{}),r(_,{label:"Font"}),r(k,{icon:"Aa",label:"Dyslexia-friendly font",desc:"Atkinson Hyperlegible",checked:t.dyslexiaFont,onChange:l=>i("dyslexiaFont",l)}),r(y,{}),p("div",{style:{padding:"10px 18px"},children:[r("p",{style:{margin:"0 0 8px",fontSize:"13px",fontWeight:500,color:"#0f172a"},children:"\u{1F524} Local font"}),P.length>0?p("select",{value:t.localFont,onChange:l=>i("localFont",l.target.value),"aria-label":"Choose a font from your device",style:{width:"100%",padding:"8px 10px",borderRadius:"8px",border:"1px solid #e2e8f0",fontSize:"13px",color:"#0f172a",background:"#fff",cursor:"pointer",height:g?"44px":"36px"},children:[r("option",{value:"",children:"System default"}),P.map(l=>r("option",{value:l,style:{fontFamily:l},children:l},l))]}):r("p",{style:{margin:0,fontSize:"11px",color:"#94a3b8"},children:"Local font access available in Chrome 103+. Allow font access when prompted."})]}),r(y,{}),p("div",{style:{padding:"10px 18px 14px"},children:[p("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"10px"},children:[r("p",{style:{margin:0,fontSize:"13px",fontWeight:500,color:"#0f172a"},children:"Text size"}),p("span",{style:{fontSize:"12px",fontWeight:600,color:"#0d9488",background:"#f0fdfa",padding:"2px 8px",borderRadius:"99px"},children:[t.fontScale,"%"]})]}),p("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[r("button",{onClick:()=>{let l=L.indexOf(t.fontScale);l>0&&i("fontScale",L[l-1])},disabled:t.fontScale<=80,"aria-label":"Decrease text size",style:{width:g?"44px":"30px",height:g?"44px":"30px",borderRadius:"8px",border:"1px solid #e2e8f0",background:"#fff",cursor:t.fontScale<=80?"not-allowed":"pointer",fontSize:"16px",color:t.fontScale<=80?"#cbd5e1":"#0f172a",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:"\u2212"}),r("div",{style:{flex:1,display:"flex",gap:"3px"},children:L.map(l=>r("button",{onClick:()=>i("fontScale",l),"aria-label":`Set text size to ${l}%`,style:{flex:1,height:"6px",borderRadius:"99px",border:"none",cursor:"pointer",padding:0,background:l<=t.fontScale?"#0d9488":"#e2e8f0",transition:"background 0.15s"}},l))}),r("button",{onClick:()=>{let l=L.indexOf(t.fontScale);l<L.length-1&&i("fontScale",L[l+1])},disabled:t.fontScale>=130,"aria-label":"Increase text size",style:{width:g?"44px":"30px",height:g?"44px":"30px",borderRadius:"8px",border:"1px solid #e2e8f0",background:"#fff",cursor:t.fontScale>=130?"not-allowed":"pointer",fontSize:"16px",color:t.fontScale>=130?"#cbd5e1":"#0f172a",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:"+"})]})]}),r(y,{}),p("div",{style:{padding:"10px 18px"},children:[p("p",{style:{margin:"0 0 8px",fontSize:"13px",fontWeight:500,color:"#0f172a"},children:["\u{1F310} Translate page"," ",r("span",{style:{marginLeft:"6px",fontSize:"9px",fontWeight:500,padding:"1px 6px",borderRadius:"99px",background:"#f5f3ff",color:"#7c3aed",border:"0.5px solid #c4b5fd"},children:"Gemini Nano"})]}),r("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px"},children:$.slice(0,g?8:18).map(l=>r("button",{onClick:()=>i("translateLanguage",l.code),"aria-pressed":t.translateLanguage===l.code,disabled:!n,style:{padding:"4px 10px",borderRadius:"20px",fontSize:"11px",fontWeight:500,border:`1px solid ${t.translateLanguage===l.code?"#7c3aed":"#e2e8f0"}`,background:t.translateLanguage===l.code?"#f5f3ff":"#fff",color:t.translateLanguage===l.code?"#7c3aed":"#64748b",cursor:n?"pointer":"not-allowed",opacity:n?1:.5,minHeight:g?"36px":"auto"},children:l.code.toUpperCase()},l.code))}),!n&&r("p",{style:{margin:"6px 0 0",fontSize:"10px",color:"#94a3b8"},children:"Enable Gemini Nano using the setup guide above to unlock translation."})]}),o&&r("div",{role:"status",style:{margin:"0 14px",padding:"8px 12px",background:"#f0fdfa",border:"1px solid #99f6e4",borderRadius:"8px",fontSize:"12px",color:"#0f766e",fontWeight:500,fontFamily:"monospace"},children:o.fixed>0?`\u2713 ${o.fixed} fixes \xB7 ${o.scanned} nodes \xB7 ${o.renderTime}ms \xB7 Score: ${o.score}/100`:`\u2713 0 auto-fixes needed \xB7 ${o.scanned} nodes \xB7 ${o.renderTime}ms`}),p("div",{style:{display:"flex",gap:"8px",padding:"12px 14px 14px",position:g?"sticky":"relative",bottom:g?0:"auto",background:"#fff",borderTop:"1px solid #f1f5f9"},children:[r("button",{onClick:m,style:{flex:1,padding:g?"12px 0":"8px 0",fontSize:"13px",fontWeight:500,borderRadius:"9px",border:"1px solid #e2e8f0",background:"#fff",color:"#64748b",cursor:"pointer"},children:"Reset"}),r("button",{onClick:d,style:{flex:2,padding:g?"12px 0":"8px 0",fontSize:"13px",fontWeight:600,borderRadius:"9px",border:"none",background:"#0d9488",color:"#fff",cursor:"pointer"},children:"Apply settings"})]})]})});le.displayName="WidgetPanel";import{Fragment as dt,jsx as He,jsxs as ct}from"react/jsx-runtime";function de({position:e="left",children:t,config:o={}}){let[a,n]=M(!1),[s,i]=M(se),[d,m]=M(null),[f,x]=M(!1),[g,j]=M(!1),[P,K]=M(!1),R=lt.useRef(null);D(()=>{if(typeof window>"u")return;let c=!!window.ai;j(c);let v=!!(window.SpeechRecognition||window.webkitSpeechRecognition);K(v)},[]),D(()=>{if(!(typeof window>"u"))try{let c=localStorage.getItem("yuktai-a11y-prefs");if(c){let v=JSON.parse(c);i(A=>({...A,...v}))}}catch{}},[]);let l=q(async c=>{let v={enabled:!0,highContrast:c.highContrast,darkMode:c.darkMode,reduceMotion:c.reduceMotion,largeTargets:c.largeTargets,speechEnabled:c.speechEnabled,autoFix:c.autoFix,dyslexiaFont:c.dyslexiaFont,localFont:c.localFont,fontSizeMultiplier:c.fontScale/100,colorBlindMode:c.colorBlindMode,showAuditBadge:c.showAuditBadge,showSkipLinks:!0,showPreferencePanel:!1,plainEnglish:c.plainEnglish,summarisePage:c.summarisePage,translateLanguage:c.translateLanguage,voiceControl:c.voiceControl,smartLabels:c.smartLabels,...o};await w.execute(v);let A=w.applyFixes(v);m(A),x(!0)},[o]),z=q(async()=>{try{localStorage.setItem("yuktai-a11y-prefs",JSON.stringify(s))}catch{}await l(s),n(!1)},[s,l]),Y=q(()=>{i(se);try{localStorage.removeItem("yuktai-a11y-prefs")}catch{}let c=document.documentElement;["data-yuktai-high-contrast","data-yuktai-dark","data-yuktai-reduce-motion","data-yuktai-large-targets","data-yuktai-keyboard","data-yuktai-dyslexia"].forEach(A=>c.removeAttribute(A)),document.body.style.filter="",document.body.style.fontFamily="",document.documentElement.style.fontSize="",m(null),x(!1)},[]),U=q((c,v)=>{i(A=>({...A,[c]:v}))},[]);D(()=>{let c=v=>{v.key==="Escape"&&a&&n(!1)};return window.addEventListener("keydown",c),()=>window.removeEventListener("keydown",c)},[a]),D(()=>{a&&R.current&&w.trapFocus(R.current)},[a]);let J={position:"fixed",bottom:"24px",[e]:"24px",zIndex:9998,width:"52px",height:"52px",borderRadius:"50%",background:f?"#0d9488":"#1a73e8",color:"#fff",border:"none",cursor:"pointer",fontSize:"22px",display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 4px 16px rgba(0,0,0,0.25)",transition:"transform 0.15s, background 0.2s"};return ct(dt,{children:[t,He("button",{style:J,"aria-label":"Open accessibility preferences","aria-haspopup":"dialog","aria-expanded":a,"data-yuktai-pref-toggle":"true",onClick:()=>n(c=>!c),onMouseEnter:c=>{c.currentTarget.style.transform="scale(1.08)"},onMouseLeave:c=>{c.currentTarget.style.transform="scale(1)"},children:"\u267F"}),a&&He(le,{ref:R,position:e,settings:s,report:d,isActive:f,aiSupported:g,voiceSupported:P,set:U,onApply:z,onReset:Y,onClose:()=>n(!1)})]})}var G={name:"ai.text",async execute(e){return`\u{1F916} YuktAI says: ${e}`}};var V={name:"voice.text",async execute(e){return!e||e.trim()===""?"\u{1F3A4} No speech detected":`\u{1F3A4} You said: ${e}`}};var S=class{plugins=new Map;register(t,o){if(!o||typeof o.execute!="function")throw new Error(`Invalid plugin: ${t}`);this.plugins.set(t,o)}use(t){return this.plugins.get(t)}async run(t,o){try{let a=this.use(t);if(!a)throw new Error(`Plugin not found: ${t}`);return await a.execute(o)}catch(a){throw console.error(`[YuktAI Runtime Error in ${t}]:`,a),a}}getPlugins(){return Array.from(this.plugins.keys())}};function ut(){if(typeof globalThis>"u")return new S;if(!globalThis.__yuktai_runtime__){let e=new S;e.register(w.name,w),e.register(G.name,G),e.register(V.name,V),globalThis.__yuktai_runtime__=e}return globalThis.__yuktai_runtime__}var $e=typeof window<"u"?ut():new S,Dt={wcagPlugin:w,list(){return $e.getPlugins()},use(e){return $e.use(e)},fix(e){return w.applyFixes({enabled:!0,autoFix:!0,...e})},scan(){return w.scan()}};export{S as Runtime,Dt as YuktAI,de as YuktAIWrapper,G as aiPlugin,de as default,V as voicePlugin,w as wcag,w as wcagPlugin};
|