@yuktishaalaa/yuktai 3.0.9 → 3.0.10
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/chunk-WG23QKL2.mjs +1 -0
- package/dist/index.js +28 -28
- package/dist/index.mjs +17 -17
- package/dist/transformers-rag-XU7H4K27.mjs +1 -0
- package/package.json +80 -77
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var m=null,g=null,i=!1,u=!1;async function p(){if(!u){if(i){for(;i;)await new Promise(e=>setTimeout(e,200));return}i=!0;try{let{pipeline:e,env:t}=await import("@huggingface/transformers");t.allowRemoteModels=!0,t.allowLocalModels=!1,t.useBrowserCache=!0,m=await e("feature-extraction","Xenova/all-MiniLM-L6-v2",{device:typeof navigator<"u"&&"gpu"in navigator?"webgpu":"wasm"}),g=await e("question-answering","Xenova/distilbert-base-cased-distilled-squad",{device:typeof navigator<"u"&&"gpu"in navigator?"webgpu":"wasm"}),u=!0,i=!1,console.log("yuktai: Transformers.js models loaded \u2705")}catch(e){throw i=!1,console.error("yuktai: Transformers.js model load failed",e),e}}}function w(){return new Promise(e=>{let t=setTimeout(e,1500),r=new MutationObserver(()=>{clearTimeout(t),t=setTimeout(()=>{r.disconnect(),e()},500)});r.observe(document.body,{childList:!0,subtree:!0})})}function h(){let e=[],t=document.querySelectorAll("*");for(let r of t){if(r.closest("[data-yuktai-panel]"))continue;let o=r.innerText?.trim();o&&o.length>30&&e.push(o);let s=r.getAttribute("aria-label");s&&s.length>10&&e.push(s),(r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement)&&r.placeholder&&e.push(r.placeholder)}return e.join(" ").slice(0,8e3)}function y(e,t=200,r=50){if(typeof e!="string")try{e=String(e??"")}catch{return[]}let o=e.trim();if(!o)return[];let s=Math.min(r,Math.floor(t/2)),n=o.split(/\s+/),a=[],l=t-s;for(let c=0;c<n.length;c+=l){let f=n.slice(c,c+t).join(" ");f.trim().length>20&&a.push(f)}return a}function b(e,t){let r=0,o=0,s=0;for(let n=0;n<e.length;n++)r+=e[n]*t[n],o+=e[n]*e[n],s+=t[n]*t[n];return r/(Math.sqrt(o)*Math.sqrt(s)+1e-8)}async function d(e){let t=await m(e,{pooling:"mean",normalize:!0}),r=t?.data??t;return Array.from(r)}async function v(e,t,r=3){let o=await d(e),s=await Promise.all(t.map(async n=>{let a=await d(n),l=b(o,a);return{chunk:n,score:l}}));return s.sort((n,a)=>a.score-n.score),s.slice(0,r).map(n=>n.chunk)}async function T(e){if(!e.trim())return{success:!1,answer:"",error:"Please type a question."};try{await p(),await w();let t=h();if(!t||t.length<50)return{success:!1,answer:"",error:"Not enough content on this page."};let r=y(t);if(r.length===0)return{success:!1,answer:"",error:"Could not process page content."};let s=(await v(e,r,3)).join(" ... "),n=await g(e,s);return!n?.answer||n.answer.trim().length===0?{success:!0,answer:"I could not find a specific answer on this page."}:{success:!0,answer:n.answer.trim()}}catch(t){return console.error("yuktai: Transformers RAG error",t),{success:!1,answer:"",error:t instanceof Error?t.message:"Transformers.js error."}}}function M(){try{return typeof WebAssembly<"u"&&typeof Worker<"u"}catch{return!1}}function k(){return u?"ready":i?"loading":"idle"}export{T as a,M as b,k as c};
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var xt=Object.create;var te=Object.defineProperty;var ht=Object.getOwnPropertyDescriptor;var wt=Object.getOwnPropertyNames;var vt=Object.getPrototypeOf,kt=Object.prototype.hasOwnProperty;var We=(e,t)=>()=>(e&&(t=e(e=0)),t);var be=(e,t)=>{for(var n in t)te(e,n,{get:t[n],enumerable:!0})},Fe=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of wt(t))!kt.call(e,a)&&a!==n&&te(e,a,{get:()=>t[a],enumerable:!(i=ht(t,a))||i.enumerable});return e};var $e=(e,t,n)=>(n=e!=null?xt(vt(e)):{},Fe(t||!e||!e.__esModule?te(n,"default",{value:e,enumerable:!0}):n,e)),At=e=>Fe(te({},"__esModule",{value:!0}),e);var ct={};be(ct,{askPage:()=>Ce});function Kt(){return new Promise(e=>{let t=setTimeout(e,1500),n=new MutationObserver(()=>{clearTimeout(t),t=setTimeout(()=>{n.disconnect(),e()},500)});n.observe(document.body,{childList:!0,subtree:!0})})}function Yt(){let e=[],t=document.querySelectorAll("*");for(let n of t){if(n.closest("[data-yuktai-panel]"))continue;let i=n.innerText?.trim();i&&i.length>30&&e.push(i);let a=n.getAttribute("aria-label");if(a&&a.length>10&&e.push(a),(n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement)&&(n.placeholder&&e.push(n.placeholder),n.value&&e.push(n.value)),n instanceof HTMLButtonElement){let s=n.innerText||n.getAttribute("aria-label");s&&e.push(s)}}return e.join(" ").slice(0,3500)}async function Ce(e){if(!e.trim())return{success:!1,answer:"",error:"Please type a question."};try{let t=window,n=t.LanguageModel||t.ai?.languageModel;if(!n)return{success:!1,answer:"",error:"Gemini Nano not available."};await Kt();let i=Yt();if(!i||i.length<100)return{success:!1,answer:"",error:"Page content not readable."};let a;try{a=await n.create({systemPrompt:`Answer ONLY using page content.
|
|
2
2
|
Keep answer short (2\u20133 sentences).
|
|
3
|
-
If not found say: "I could not find that on this page."`,outputLanguage:"en"})}catch{
|
|
3
|
+
If not found say: "I could not find that on this page."`,outputLanguage:"en"})}catch{a=await n.create()}let s=`Page:
|
|
4
4
|
${i}
|
|
5
5
|
|
|
6
|
-
Q: ${e}`,o=await
|
|
6
|
+
Q: ${e}`,o=await a.prompt(s);return a?.destroy&&a.destroy(),{success:!0,answer:o?.trim()||"No answer found."}}catch(t){return{success:!1,answer:"",error:t instanceof Error?t.message:"Error occurred"}}}var Le=We(()=>{"use strict"});var ft={};be(ft,{askPageWithTransformers:()=>Pe,getModelLoadStatus:()=>U,isTransformersSupported:()=>Y});async function Ut(){if(!Me){if(O){for(;O;)await new Promise(e=>setTimeout(e,200));return}O=!0;try{let{pipeline:e,env:t}=await import("@huggingface/transformers");t.allowRemoteModels=!0,t.allowLocalModels=!1,t.useBrowserCache=!0,ut=await e("feature-extraction","Xenova/all-MiniLM-L6-v2",{device:typeof navigator<"u"&&"gpu"in navigator?"webgpu":"wasm"}),pt=await e("question-answering","Xenova/distilbert-base-cased-distilled-squad",{device:typeof navigator<"u"&&"gpu"in navigator?"webgpu":"wasm"}),Me=!0,O=!1,console.log("yuktai: Transformers.js models loaded \u2705")}catch(e){throw O=!1,console.error("yuktai: Transformers.js model load failed",e),e}}}function Jt(){return new Promise(e=>{let t=setTimeout(e,1500),n=new MutationObserver(()=>{clearTimeout(t),t=setTimeout(()=>{n.disconnect(),e()},500)});n.observe(document.body,{childList:!0,subtree:!0})})}function Xt(){let e=[],t=document.querySelectorAll("*");for(let n of t){if(n.closest("[data-yuktai-panel]"))continue;let i=n.innerText?.trim();i&&i.length>30&&e.push(i);let a=n.getAttribute("aria-label");a&&a.length>10&&e.push(a),(n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement)&&n.placeholder&&e.push(n.placeholder)}return e.join(" ").slice(0,8e3)}function Qt(e,t=200,n=50){if(typeof e!="string")try{e=String(e??"")}catch{return[]}let i=e.trim();if(!i)return[];let a=Math.min(n,Math.floor(t/2)),s=i.split(/\s+/),o=[],c=t-a;for(let g=0;g<s.length;g+=c){let u=s.slice(g,g+t).join(" ");u.trim().length>20&&o.push(u)}return o}function Zt(e,t){let n=0,i=0,a=0;for(let s=0;s<e.length;s++)n+=e[s]*t[s],i+=e[s]*e[s],a+=t[s]*t[s];return n/(Math.sqrt(i)*Math.sqrt(a)+1e-8)}async function dt(e){let t=await ut(e,{pooling:"mean",normalize:!0}),n=t?.data??t;return Array.from(n)}async function en(e,t,n=3){let i=await dt(e),a=await Promise.all(t.map(async s=>{let o=await dt(s),c=Zt(i,o);return{chunk:s,score:c}}));return a.sort((s,o)=>o.score-s.score),a.slice(0,n).map(s=>s.chunk)}async function Pe(e){if(!e.trim())return{success:!1,answer:"",error:"Please type a question."};try{await Ut(),await Jt();let t=Xt();if(!t||t.length<50)return{success:!1,answer:"",error:"Not enough content on this page."};let n=Qt(t);if(n.length===0)return{success:!1,answer:"",error:"Could not process page content."};let a=(await en(e,n,3)).join(" ... "),s=await pt(e,a);return!s?.answer||s.answer.trim().length===0?{success:!0,answer:"I could not find a specific answer on this page."}:{success:!0,answer:s.answer.trim()}}catch(t){return console.error("yuktai: Transformers RAG error",t),{success:!1,answer:"",error:t instanceof Error?t.message:"Transformers.js error."}}}function Y(){try{return typeof WebAssembly<"u"&&typeof Worker<"u"}catch{return!1}}function U(){return Me?"ready":O?"loading":"idle"}var ut,pt,O,Me,de=We(()=>{"use strict";ut=null,pt=null,O=!1,Me=!1});var cn={};be(cn,{Runtime:()=>z,YuktAI:()=>ln,YuktAIWrapper:()=>ue,aiPlugin:()=>X,default:()=>ue,voicePlugin:()=>Q,wcag:()=>T,wcagPlugin:()=>T});module.exports=At(cn);function Be(){let e=window;return e.Rewriter||e.ai?.rewriter||null}async function ye(){try{let e=Be();if(!e)return!1;if(typeof e.availability=="function"){let t=await e.availability();return t==="readily"||t==="available"||t==="downloadable"}return typeof e.capabilities=="function"?(await e.capabilities())?.available!=="no":typeof e.create=="function"}catch{return!1}}async function St(e){if(!e||e.trim().length<20)return{success:!1,original:e,rewritten:e,error:"Text too short"};try{let t=Be();if(!t)throw new Error("Rewriter API not available");let n=await t.create({tone:"more-casual",format:"plain-text",length:"as-is",outputLanguage:"en"}),i=await n.rewrite(e,{context:"Rewrite this text in simple plain English. Use short sentences. Avoid jargon. Make it easy to understand for everyone."});return n.destroy(),{success:!0,original:e,rewritten:i.trim()}}catch(t){return{success:!1,original:e,rewritten:e,error:t instanceof Error?t.message:"Rewrite failed"}}}async function Ne(){if(!await ye())return{fixed:0,error:"Chrome Built-in AI Rewriter not available. Enable via chrome://flags."};let t=document.querySelectorAll("p, h1, h2, h3, h4, h5, h6, li, blockquote, td, th, label, figcaption"),n=0;for(let i of t){let a=i.innerText?.trim();if(!a||a.length<20||i.closest("[data-yuktai-panel]"))continue;let s=await St(a);s.success&&s.rewritten!==a&&(i.dataset.yuktaiOriginal=a,i.innerText=s.rewritten,n++)}return{fixed:n}}function Oe(){let e=document.querySelectorAll("[data-yuktai-original]");for(let t of e){let n=t.dataset.yuktaiOriginal;n&&(t.innerText=n,delete t.dataset.yuktaiOriginal)}}var De="yuktai-summary-box";function Ge(){let e=window;return e.Summarizer||e.ai?.summarizer||null}async function xe(){try{let e=Ge();if(!e)return!1;if(typeof e.availability=="function"){let t=await e.availability();return t==="readily"||t==="available"||t==="downloadable"}return typeof e.capabilities=="function"?(await e.capabilities())?.available!=="no":typeof e.create=="function"}catch{return!1}}function Tt(){let e=document.querySelectorAll("p, h1, h2, h3, h4, h5, h6, li, blockquote, article, section"),t=[];for(let n of e){if(n.closest("[data-yuktai-panel]"))continue;let i=window.getComputedStyle(n);if(i.display==="none"||i.visibility==="hidden")continue;let a=n.innerText?.trim();a&&a.length>10&&t.push(a)}return t.join(" ").slice(0,5e3)}async function qe(){if(!await xe())return{success:!1,summary:"",error:"Chrome Built-in AI Summarizer not available. Enable via chrome://flags."};let t=Tt();if(!t||t.length<100)return{success:!1,summary:"",error:"Not enough text on this page to summarise."};try{let n=Ge();if(!n)throw new Error("Summarizer API not available");let i=await n.create({type:"tl;dr",format:"plain-text",length:"short",outputLanguage:"en"}),a=await i.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 i.destroy(),Et(a.trim()),{success:!0,summary:a.trim()}}catch(n){return{success:!1,summary:"",error:n instanceof Error?n.message:"Summary failed"}}}function Et(e){ne();let t=document.createElement("div");t.id=De,t.setAttribute("data-yuktai-panel","true"),t.setAttribute("role","region"),t.setAttribute("aria-label","Page summary by yuktai"),t.style.cssText=`
|
|
7
7
|
position: fixed;
|
|
8
8
|
top: 0;
|
|
9
9
|
left: 0;
|
|
@@ -20,11 +20,11 @@ Q: ${e}`,o=await n.prompt(s);return n?.destroy&&n.destroy(),{success:!0,answer:o
|
|
|
20
20
|
justify-content: space-between;
|
|
21
21
|
gap: 12px;
|
|
22
22
|
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
23
|
-
`;let
|
|
23
|
+
`;let n=document.createElement("p");n.style.cssText="margin: 0; flex: 1;",n.textContent=`\u{1F4CB} Page summary: ${e}`;let i=document.createElement("button");i.textContent="\xD7",i.setAttribute("aria-label","Close page summary"),i.style.cssText=`
|
|
24
24
|
background: none; border: none; color: #ffffff;
|
|
25
25
|
font-size: 20px; cursor: pointer; padding: 0 4px;
|
|
26
26
|
line-height: 1; flex-shrink: 0;
|
|
27
|
-
`,i.addEventListener("click",
|
|
27
|
+
`,i.addEventListener("click",ne),t.appendChild(n),t.appendChild(i),document.body.prepend(t)}function ne(){let e=document.getElementById(De);e&&e.remove()}var oe=[{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"}],ae="en";function Ct(){let e=window;return e.Translator||e.translation||null}async function Lt(e){try{let t=window;if(!Ct())return!1;if(t.Translator&&typeof t.Translator.availability=="function")try{let i=await t.Translator.availability({sourceLanguage:"en",targetLanguage:e});return i==="readily"||i==="available"||i==="downloadable"||i==="after-download"}catch{}return t.Translator&&typeof t.Translator.canTranslate=="function"?await t.Translator.canTranslate({sourceLanguage:"en",targetLanguage:e})!=="no":t.translation&&typeof t.translation.canTranslate=="function"?await t.translation.canTranslate({sourceLanguage:"en",targetLanguage:e})!=="no":!1}catch{return!1}}async function Mt(e){let t=window,n={sourceLanguage:"en",targetLanguage:e};if(t.Translator&&typeof t.Translator.create=="function")return await t.Translator.create(n);if(t.translation&&typeof t.translation.createTranslator=="function")return await t.translation.createTranslator(n);throw new Error("Translation API not available")}async function _e(e){if(e===ae)return{success:!0,language:e,fixed:0};if(e==="en")return he(),ae="en",{success:!0,language:"en",fixed:0};if(!await Lt(e))return{success:!1,language:e,fixed:0,error:`Translation to ${e} not available. Enable via chrome://flags.`};try{let n=await Mt(e),i=document.querySelectorAll("p, h1, h2, h3, h4, h5, h6, li, blockquote, td, th, label, figcaption, span, a"),a=0;for(let s of i){if(s.closest("[data-yuktai-panel]")||s.children.length>0)continue;let o=s.innerText?.trim();if(!o||o.length<2)continue;s.dataset.yuktaiTranslationOriginal||(s.dataset.yuktaiTranslationOriginal=o);let c=await n.translate(o);c&&c!==o&&(s.innerText=c,a++)}return typeof n.destroy=="function"&&n.destroy(),ae=e,{success:!0,language:e,fixed:a}}catch(n){return{success:!1,language:e,fixed:0,error:n instanceof Error?n.message:"Translation failed"}}}function he(){let e=document.querySelectorAll("[data-yuktai-translation-original]");for(let t of e){let n=t.dataset.yuktaiTranslationOriginal;n&&(t.innerText=n,delete t.dataset.yuktaiTranslationOriginal)}ae="en"}var Pt=[{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"}],C=null,ie=!1,$=null;function we(){return!!(window.SpeechRecognition||window.webkitSpeechRecognition)}function Rt(e){let t=e.toLowerCase().trim();for(let n of Pt)for(let i of n.phrases)if(t.includes(i))return{action:n.action,label:n.label};return null}function It(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=je(),n=t.indexOf(document.activeElement),i=t[n+1]||t[0];i&&i.focus();break}case"tab-back":{let t=je(),n=t.indexOf(document.activeElement),i=t[n-1]||t[t.length-1];i&&i.focus();break}case"stop-voice":{ve();break}}}function je(){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 Ve(e){if(!we())return!1;if(ie)return!0;e&&($=e);let t=window.SpeechRecognition||window.webkitSpeechRecognition;return C=new t,C.continuous=!0,C.interimResults=!1,C.lang="en-US",C.onresult=n=>{let i=n.results[n.results.length-1][0].transcript,a=Rt(i);if(a){It(a.action);let s={success:!0,command:i,action:a.label};if($&&$(s),a.action==="stop-voice")return}},C.onend=()=>{ie&&C?.start()},C.onerror=n=>{n.error!=="no-speech"&&$&&$({success:!1,command:"",action:"",error:`Voice error: ${n.error}`})},C.start(),ie=!0,zt(),!0}function ve(){ie=!1,C&&(C.stop(),C=null),$=null,Ye()}var Ke="yuktai-voice-indicator";function zt(){Ye();let e=document.createElement("div");e.id=Ke,e.setAttribute("data-yuktai-panel","true"),e.setAttribute("aria-live","polite"),e.setAttribute("aria-label","yuktai voice control is listening"),e.style.cssText=`
|
|
28
28
|
position: fixed;
|
|
29
29
|
bottom: 80px;
|
|
30
30
|
left: 50%;
|
|
@@ -54,7 +54,7 @@ Q: ${e}`,o=await n.prompt(s);return n?.destroy&&n.destroy(),{success:!0,answer:o
|
|
|
54
54
|
0%, 100% { opacity: 1; transform: scale(1); }
|
|
55
55
|
50% { opacity: 0.4; transform: scale(0.7); }
|
|
56
56
|
}
|
|
57
|
-
`,document.head.appendChild(i)}let
|
|
57
|
+
`,document.head.appendChild(i)}let n=document.createElement("span");n.textContent="Listening for commands...",e.appendChild(t),e.appendChild(n),document.body.appendChild(e)}function Ye(){let e=document.getElementById(Ke);e&&e.remove()}var Ht=["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(", ");function Ue(){let e=window;return e.Writer||e.ai?.writer||null}async function ke(){try{let e=Ue();if(!e)return!1;if(typeof e.availability=="function"){let t=await e.availability();return t==="readily"||t==="available"||t==="downloadable"}return typeof e.capabilities=="function"?(await e.capabilities())?.available!=="no":typeof e.create=="function"}catch{return!1}}function Wt(e){let t=[],n=e.innerText?.trim();n&&t.push(`element text: "${n}"`);let i=e.placeholder?.trim();i&&t.push(`placeholder: "${i}"`);let a=e.getAttribute("name")?.trim();a&&t.push(`name: "${a}"`);let s=e.getAttribute("type")?.trim();s&&t.push(`type: "${s}"`);let o=e.id;if(o){let u=document.querySelector(`label[for="${o}"]`);u&&t.push(`label: "${u.innerText?.trim()}"`)}let c=e.parentElement?.innerText?.trim().slice(0,60);c&&t.push(`parent context: "${c}"`),t.push(`tag: ${e.tagName.toLowerCase()}`);let g=e.getAttribute("role");return g&&t.push(`role: ${g}`),t.join(". ")}async function Ft(e,t){let n=`
|
|
58
58
|
Generate a short, clear aria-label for an HTML element.
|
|
59
59
|
The label must be 2-6 words maximum.
|
|
60
60
|
The label must describe what the element does or what it is.
|
|
@@ -65,7 +65,7 @@ Q: ${e}`,o=await n.prompt(s);return n?.destroy&&n.destroy(),{success:!0,answer:o
|
|
|
65
65
|
${t}
|
|
66
66
|
|
|
67
67
|
Output only the label. Nothing else.
|
|
68
|
-
`.trim();return(await e.write(
|
|
68
|
+
`.trim();return(await e.write(n)).trim().replace(/^["']|["']$/g,"").replace(/\.$/,"").trim()}async function Je(){if(!await ke())return{success:!1,fixed:0,elements:[],error:"Chrome Built-in AI Writer not available. Enable via chrome://flags."};let t=document.querySelectorAll(Ht);if(t.length===0)return{success:!0,fixed:0,elements:[]};try{let n=Ue();if(!n)throw new Error("Writer API not available");let i=await n.create({tone:"neutral",format:"plain-text",length:"short",outputLanguage:"en"}),a=0,s=[];for(let o of t){if(o.closest("[data-yuktai-panel]"))continue;let c=window.getComputedStyle(o);if(c.display==="none"||c.visibility==="hidden")continue;let g=Wt(o),u=await Ft(i,g);u&&u.length>0&&(o.dataset.yuktaiLabelOriginal=o.getAttribute("aria-label")||"",o.setAttribute("aria-label",u),a++,s.push({tag:o.tagName.toLowerCase(),label:u}))}return i.destroy(),{success:!0,fixed:a,elements:s}}catch(n){return{success:!1,fixed:0,elements:[],error:n instanceof Error?n.message:"Label generation failed"}}}function Xe(){let e=document.querySelectorAll("[data-yuktai-label-original]");for(let t of e){let n=t.dataset.yuktaiLabelOriginal;n?t.setAttribute("aria-label",n):t.removeAttribute("aria-label"),delete t.dataset.yuktaiLabelOriginal}}var le=null,Qe=null;var Ze=null,Ae=null,x=null,B=null,re=null,Se=null,N=null,se={deuteranopia:"yuktai-cb-d",protanopia:"yuktai-cb-p",tritanopia:"yuktai-cb-t"};var et=new Set(["input","select","textarea"]);var Te={nav:"navigation",header:"banner",footer:"contentinfo",main:"main",aside:"complementary"};function Ee(e,t="polite"){if(typeof window>"u"||!N?.speechEnabled||!window.speechSynthesis)return;window.speechSynthesis.cancel();let n=new SpeechSynthesisUtterance(e);n.rate=1,n.pitch=1,n.volume=1;let i=window.speechSynthesis.getVoices();i.length>0&&(n.voice=i[0]),window.speechSynthesis.speak(n)}function st(e,t="info"){if(typeof document>"u")return;let i={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];x||(x=document.createElement("div"),x.setAttribute("role","alert"),x.setAttribute("aria-live","assertive"),x.setAttribute("aria-atomic","true"),x.style.cssText=`
|
|
69
69
|
position: fixed;
|
|
70
70
|
top: 80px;
|
|
71
71
|
right: 16px;
|
|
@@ -84,14 +84,14 @@ Q: ${e}`,o=await n.prompt(s);return n?.destroy&&n.destroy(),{success:!0,answer:o
|
|
|
84
84
|
transition: transform 0.3s, opacity 0.3s;
|
|
85
85
|
transform: translateX(120%);
|
|
86
86
|
opacity: 0;
|
|
87
|
-
`,document.body.appendChild(
|
|
87
|
+
`,document.body.appendChild(x)),x.style.background=i.bg,x.style.border=`1px solid ${i.border}`,x.style.color="#fff",x.innerHTML=`
|
|
88
88
|
<span style="font-size:18px;font-weight:700">${i.icon}</span>
|
|
89
89
|
<span style="flex:1;line-height:1.4">${e}</span>
|
|
90
90
|
<button
|
|
91
91
|
onclick="this.parentElement.style.transform='translateX(120%)';this.parentElement.style.opacity='0'"
|
|
92
92
|
style="background:none;border:none;color:#fff;cursor:pointer;font-size:18px;padding:0;line-height:1"
|
|
93
93
|
aria-label="Close notification">\xD7</button>
|
|
94
|
-
`,window.innerWidth<=480&&(
|
|
94
|
+
`,window.innerWidth<=480&&(x.style.right="8px",x.style.left="8px",x.style.maxWidth="none",x.style.width="auto"),requestAnimationFrame(()=>{x&&(x.style.transform="translateX(0)",x.style.opacity="1")}),setTimeout(()=>{x&&(x.style.transform="translateX(120%)",x.style.opacity="0")},5e3)}function f(e,t="info",n=!0){le&&(le.textContent=e),st(e,t),n&&Ee(e,t==="error"?"assertive":"polite")}function $t(){if(typeof document>"u"||Ze)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
95
|
position: fixed;
|
|
96
96
|
top: 0;
|
|
97
97
|
left: 0;
|
|
@@ -105,7 +105,7 @@ Q: ${e}`,o=await n.prompt(s);return n?.destroy&&n.destroy(),{success:!0,answer:o
|
|
|
105
105
|
transform: translateY(-100%);
|
|
106
106
|
transition: transform 0.2s ease;
|
|
107
107
|
font-family: system-ui, sans-serif;
|
|
108
|
-
`;let
|
|
108
|
+
`;let n=!1;if(e.forEach(({label:a,selector:s})=>{let o=document.querySelector(s);if(!o)return;n=!0,o.getAttribute("tabindex")||o.setAttribute("tabindex","-1");let c=document.createElement("a");c.href="#",c.textContent=a,c.style.cssText=`
|
|
109
109
|
color: #fff;
|
|
110
110
|
background: #1a73e8;
|
|
111
111
|
padding: 8px 14px;
|
|
@@ -116,7 +116,7 @@ Q: ${e}`,o=await n.prompt(s);return n?.destroy&&n.destroy(),{success:!0,answer:o
|
|
|
116
116
|
white-space: nowrap;
|
|
117
117
|
border: 2px solid transparent;
|
|
118
118
|
transition: background 0.15s, border-color 0.15s;
|
|
119
|
-
`,c.addEventListener("focus",()=>{t.style.transform="translateY(0)"}),c.addEventListener("blur",()=>{setTimeout(()=>{t.matches(":focus-within")||(t.style.transform="translateY(-100%)")},2e3)}),c.addEventListener("click",g=>{g.preventDefault(),o.focus(),o.scrollIntoView({behavior:"smooth",block:"start"}),f(`Jumped to ${
|
|
119
|
+
`,c.addEventListener("focus",()=>{t.style.transform="translateY(0)"}),c.addEventListener("blur",()=>{setTimeout(()=>{t.matches(":focus-within")||(t.style.transform="translateY(-100%)")},2e3)}),c.addEventListener("click",g=>{g.preventDefault(),o.focus(),o.scrollIntoView({behavior:"smooth",block:"start"}),f(`Jumped to ${a.replace("Skip to ","")}`,"info"),t.style.transform="translateY(-100%)"}),t.appendChild(c)}),!n)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),Ze=t}function Bt(){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
120
|
|
|
121
121
|
/* \u2500\u2500 Focus indicator \u2014 WCAG 2.4.11 minimum 2px solid \u2500\u2500 */
|
|
122
122
|
[data-yuktai-a11y] *:focus-visible {
|
|
@@ -262,7 +262,7 @@ Q: ${e}`,o=await n.prompt(s);return n?.destroy&&n.destroy(),{success:!0,answer:o
|
|
|
262
262
|
width: auto !important;
|
|
263
263
|
}
|
|
264
264
|
}
|
|
265
|
-
`,document.head.appendChild(e),document.documentElement.setAttribute("data-yuktai-a11y","true")}function
|
|
265
|
+
`,document.head.appendChild(e),document.documentElement.setAttribute("data-yuktai-a11y","true")}function Nt(){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 n=t.getAttribute("role")||"";if(e.key==="Escape"){let i=t.closest("[role='dialog'],[role='alertdialog']");if(i){i.style.display="none",f("Dialog closed","info");return}let a=t.closest("[role='menu'],[role='menubar']");a&&(a.style.display="none",f("Menu closed","info"))}if(n==="menuitem"||t.closest("[role='menu'],[role='menubar']")){let i=t.closest("[role='menu'],[role='menubar']");if(!i)return;let a=Array.from(i.querySelectorAll("[role='menuitem']:not([disabled])")),s=a.indexOf(t);e.key==="ArrowDown"||e.key==="ArrowRight"?(e.preventDefault(),a[(s+1)%a.length]?.focus()):e.key==="ArrowUp"||e.key==="ArrowLeft"?(e.preventDefault(),a[(s-1+a.length)%a.length]?.focus()):e.key==="Home"?(e.preventDefault(),a[0]?.focus()):e.key==="End"&&(e.preventDefault(),a[a.length-1]?.focus())}if(n==="tab"||t.closest("[role='tablist']")){let i=t.closest("[role='tablist']");if(!i)return;let a=Array.from(i.querySelectorAll("[role='tab']:not([disabled])")),s=a.indexOf(t);if(e.key==="ArrowRight"||e.key==="ArrowDown"){e.preventDefault();let o=a[(s+1)%a.length];o?.focus(),o?.click()}else if(e.key==="ArrowLeft"||e.key==="ArrowUp"){e.preventDefault();let o=a[(s-1+a.length)%a.length];o?.focus(),o?.click()}}if(n==="option"||t.closest("[role='listbox']")){let i=t.closest("[role='listbox']");if(!i)return;let a=Array.from(i.querySelectorAll("[role='option']:not([aria-disabled='true'])")),s=a.indexOf(t);e.key==="ArrowDown"?(e.preventDefault(),a[(s+1)%a.length]?.focus()):e.key==="ArrowUp"?(e.preventDefault(),a[(s-1+a.length)%a.length]?.focus()):(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),t.setAttribute("aria-selected","true"),a.forEach(o=>{o!==t&&o.setAttribute("aria-selected","false")}),f(`Selected: ${t.textContent?.trim()}`,"success"))}e.altKey&&e.key==="a"&&(e.preventDefault(),Ot()),e.key==="Tab"&&N?.speechEnabled&&setTimeout(()=>{let i=document.activeElement;if(!i)return;let a=i.getAttribute("aria-label")||i.getAttribute("title")||i.textContent?.trim()||i.tagName.toLowerCase(),s=i.getAttribute("role")||i.tagName.toLowerCase();Ee(`${a}, ${s}`)},100)}))}function ce(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 n=t[0],i=t[t.length-1];n.focus(),e.addEventListener("keydown",a=>{a.key==="Tab"&&(a.shiftKey?document.activeElement===n&&(a.preventDefault(),i.focus()):document.activeElement===i&&(a.preventDefault(),n.focus()))})}function Ot(){if(typeof document>"u")return;if(B){B.remove(),B=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
266
|
position: fixed;
|
|
267
267
|
top: 50%;
|
|
268
268
|
left: 50%;
|
|
@@ -286,18 +286,18 @@ Q: ${e}`,o=await n.prompt(s);return n?.destroy&&n.destroy(),{success:!0,answer:o
|
|
|
286
286
|
style="background:none;border:none;color:#aaa;cursor:pointer;font-size:20px;padding:0;line-height:1"
|
|
287
287
|
aria-label="Close shortcuts">\xD7</button>
|
|
288
288
|
</div>
|
|
289
|
-
${t.map(([i,
|
|
289
|
+
${t.map(([i,a])=>`
|
|
290
290
|
<div style="display:flex;justify-content:space-between;align-items:center;padding:6px 0;border-bottom:1px solid #2a2a4a">
|
|
291
291
|
<kbd style="background:#2a2a4a;color:#74c0fc;padding:3px 8px;border-radius:4px;font-size:12px;font-family:monospace;border:1px solid #3a3a6a">${i}</kbd>
|
|
292
|
-
<span style="font-size:12px;color:#ccc;text-align:right;flex:1;margin-left:12px">${
|
|
292
|
+
<span style="font-size:12px;color:#ccc;text-align:right;flex:1;margin-left:12px">${a}</span>
|
|
293
293
|
</div>
|
|
294
294
|
`).join("")}
|
|
295
|
-
`,e.querySelector("[data-yuktai-close]")?.addEventListener("click",()=>{e.remove(),B=null}),e.addEventListener("keydown",i=>{i.key==="Escape"&&(e.remove(),B=null)}),document.body.appendChild(e),B=e,
|
|
295
|
+
`,e.querySelector("[data-yuktai-close]")?.addEventListener("click",()=>{e.remove(),B=null}),e.addEventListener("keydown",i=>{i.key==="Escape"&&(e.remove(),B=null)}),document.body.appendChild(e),B=e,ce(e),f("Keyboard shortcuts opened. Press Escape to close.","info")}function Dt(e){if(typeof document>"u"||!N?.showAuditBadge||typeof window<"u"&&!window.location.hostname.includes("localhost")&&!window.location.hostname.includes("127.0.0.1"))return;Ae&&Ae.remove();let t=e.score,n=t>=90?"#0f9d58":t>=70?"#f29900":"#d93025",i=t>=90?"\u267F":t>=70?"\u26A0":"\u2715",a=document.createElement("button");a.setAttribute("aria-label",`Accessibility score: ${t} out of 100`),a.setAttribute("data-yuktai-badge","true"),a.style.cssText=`
|
|
296
296
|
position: fixed;
|
|
297
297
|
bottom: 16px;
|
|
298
298
|
left: 16px;
|
|
299
299
|
z-index: 999998;
|
|
300
|
-
background: ${
|
|
300
|
+
background: ${n};
|
|
301
301
|
color: #fff;
|
|
302
302
|
border: none;
|
|
303
303
|
border-radius: 20px;
|
|
@@ -311,7 +311,7 @@ Q: ${e}`,o=await n.prompt(s);return n?.destroy&&n.destroy(),{success:!0,answer:o
|
|
|
311
311
|
align-items: center;
|
|
312
312
|
gap: 6px;
|
|
313
313
|
transition: transform 0.15s;
|
|
314
|
-
`,
|
|
314
|
+
`,a.innerHTML=`${i} ${t}/100 <span style="font-weight:400;opacity:0.85">${e.details.length} issues</span>`,a.addEventListener("click",()=>Gt(e)),document.body.appendChild(a),Ae=a}function Gt(e){let t=document.querySelector("[data-yuktai-audit-details]");if(t){t.remove();return}let n=document.createElement("div");n.setAttribute("data-yuktai-audit-details","true"),n.setAttribute("role","dialog"),n.setAttribute("aria-label","Accessibility audit details"),n.style.cssText=`
|
|
315
315
|
position: fixed;
|
|
316
316
|
bottom: 56px;
|
|
317
317
|
left: 16px;
|
|
@@ -328,22 +328,22 @@ Q: ${e}`,o=await n.prompt(s);return n?.destroy&&n.destroy(),{success:!0,answer:o
|
|
|
328
328
|
box-shadow: 0 8px 32px rgba(0,0,0,0.5);
|
|
329
329
|
font-family: system-ui, sans-serif;
|
|
330
330
|
font-size: 12px;
|
|
331
|
-
`;let i={critical:"#d93025",serious:"#f29900",moderate:"#1a73e8",minor:"#0f9d58"};
|
|
331
|
+
`;let i={critical:"#d93025",serious:"#f29900",moderate:"#1a73e8",minor:"#0f9d58"};n.innerHTML=`
|
|
332
332
|
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px">
|
|
333
333
|
<strong style="font-size:14px;color:#74c0fc">Audit report</strong>
|
|
334
334
|
<span style="color:#aaa">${e.fixed} fixed \xB7 ${e.renderTime}ms</span>
|
|
335
335
|
</div>
|
|
336
|
-
${e.details.slice(0,20).map(
|
|
336
|
+
${e.details.slice(0,20).map(a=>`
|
|
337
337
|
<div style="padding:6px 0;border-bottom:1px solid #2a2a4a">
|
|
338
338
|
<div style="display:flex;gap:6px;align-items:center">
|
|
339
|
-
<span style="background:${i[
|
|
340
|
-
<code style="color:#74c0fc"><${
|
|
339
|
+
<span style="background:${i[a.severity]};color:#fff;padding:1px 6px;border-radius:4px;font-size:10px;font-weight:700;text-transform:uppercase">${a.severity}</span>
|
|
340
|
+
<code style="color:#74c0fc"><${a.tag}></code>
|
|
341
341
|
</div>
|
|
342
|
-
<div style="color:#ccc;margin-top:3px">${
|
|
342
|
+
<div style="color:#ccc;margin-top:3px">${a.fix}</div>
|
|
343
343
|
</div>
|
|
344
344
|
`).join("")}
|
|
345
345
|
${e.details.length>20?`<div style="color:#888;padding:8px 0;text-align:center">+${e.details.length-20} more issues</div>`:""}
|
|
346
|
-
`,
|
|
346
|
+
`,n.addEventListener("keydown",a=>{a.key==="Escape"&&n.remove()}),document.body.appendChild(n),ce(n)}function lt(e){typeof document>"u"||(Se&&clearTimeout(Se),Se=setTimeout(()=>{if(re)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
347
|
position: fixed;
|
|
348
348
|
top: 50%;
|
|
349
349
|
left: 50%;
|
|
@@ -372,19 +372,19 @@ Q: ${e}`,o=await n.prompt(s);return n?.destroy&&n.destroy(),{success:!0,answer:o
|
|
|
372
372
|
No, sign out
|
|
373
373
|
</button>
|
|
374
374
|
</div>
|
|
375
|
-
`;let
|
|
375
|
+
`;let n=t.querySelector("[data-yuktai-extend]"),i=t.querySelector("[data-yuktai-dismiss]");n?.addEventListener("click",()=>{t.remove(),re=null,f("Session extended. You have more time.","success"),N?.timeoutWarning&<(N.timeoutWarning)}),i?.addEventListener("click",()=>{t.remove(),re=null}),document.body.appendChild(t),re=t,ce(t),f("Warning: Your session will expire soon. Do you need more time?","warning")},e*1e3))}function qt(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 n=e.colorBlindMode==="achromatopsia"?"grayscale(100%)":`url(#${se[e.colorBlindMode]})`;document.body.style.filter=n}else document.body.style.filter=""}function _t(e){try{let t=localStorage.getItem("yuktai-a11y-prefs");t&&Object.assign(e,JSON.parse(t))}catch{}}async function tt(e){if(e){if(!await ye()){f("Plain English requires Chrome 127+","warning");return}f("Rewriting page in plain English...","info",!1);let n=await Ne();f(n.error?`Plain English failed: ${n.error}`:`${n.fixed} sections rewritten in plain English`,n.error?"error":"success",!1)}else Oe(),f("Original text restored","info",!1)}async function nt(e){if(e){if(!await xe()){f("Page summariser requires Chrome 127+","warning");return}f("Generating page summary...","info",!1);let n=await qe();f(n.error?`Summary failed: ${n.error}`:"Page summary added at top",n.error?"error":"success",!1)}else ne(),f("Page summary removed","info",!1)}async function at(e){if(e==="en"){he(),f("Page restored to English","info",!1);return}f(`Translating page to ${e}...`,"info",!1);let t=await _e(e);f(t.error?`Translation failed: ${t.error}`:`Page translated to ${e}`,t.error?"error":"success",!1)}async function ot(e){if(e){if(!we()){f("Voice control not supported in this browser","warning");return}Ve(t=>{t.success&&f(`Voice: ${t.action}`,"info",!1)}),f("Voice control started. Say a command.","success",!1)}else ve(),f("Voice control stopped","info",!1)}async function it(e){if(e){if(!await ke()){f("Smart labels requires Chrome 127+","warning");return}f("Generating smart labels...","info",!1);let n=await Je();f(n.error?`Smart labels failed: ${n.error}`:`${n.fixed} elements labelled`,n.error?"error":"success",!1)}else Xe(),f("Smart labels removed","info",!1)}function jt(){if(typeof document>"u"||le)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),le=e}function Vt(){if(typeof document>"u"||Qe)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
376
|
<defs>
|
|
377
|
-
<filter id="${
|
|
377
|
+
<filter id="${se.deuteranopia}">
|
|
378
378
|
<feColorMatrix type="matrix"
|
|
379
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
380
|
</filter>
|
|
381
|
-
<filter id="${
|
|
381
|
+
<filter id="${se.protanopia}">
|
|
382
382
|
<feColorMatrix type="matrix"
|
|
383
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
384
|
</filter>
|
|
385
|
-
<filter id="${
|
|
385
|
+
<filter id="${se.tritanopia}">
|
|
386
386
|
<feColorMatrix type="matrix"
|
|
387
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
388
|
</filter>
|
|
389
389
|
</defs>
|
|
390
|
-
`,document.body.appendChild(e),_e=e}function Qe(e){let t={critical:20,serious:10,moderate:5,minor:2},a=e.details.reduce((i,n)=>i+(t[n.severity]||0),0);return Math.max(0,Math.min(100,100-a))}var T={name:"yuktai-a11y",version:"4.0.0",observer:null,async execute(e){if(!e.enabled)return this.stopObserver(),"yuktai: disabled.";N=e,$t(e),Bt(),Nt(),Pt(),zt(),e.showSkipLinks!==!1&&Rt(),e.showPreferencePanel,Ft(e);let t=this.applyFixes(e);t.score=Qe(t),e.showAuditBadge&&Ht(t),e.timeoutWarning&&et(e.timeoutWarning),e.autoFix&&this.startObserver(e),e.plainEnglish&&await Ke(!0),e.summarisePage&&await Ye(!0),e.translateLanguage&&e.translateLanguage!=="en"&&await Ue(e.translateLanguage),e.voiceControl&&await Je(!0),e.smartLabels&&await Xe(!0);let a=`${t.fixed} fixes applied. Score: ${t.score}/100.`;return f(a,t.score>=90?"success":"info",!1),`yuktai v4.0.0: ${a} 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 a=performance.now(),i=document.querySelectorAll("*");t.scanned=i.length;let n=(s,o,c,g)=>{t.details.push({tag:s,fix:o,severity:c,element:g.outerHTML.slice(0,100)}),t.fixed++};return i.forEach(s=>{let o=s,c=o.tagName.toLowerCase();if(c==="html"&&!o.getAttribute("lang")&&(o.setAttribute("lang","en"),n(c,'lang="en" added',"critical",o)),c==="meta"){let u=o.getAttribute("name"),v=o.getAttribute("content")||"";u==="viewport"&&v.includes("user-scalable=no")&&(o.setAttribute("content",v.replace("user-scalable=no","user-scalable=yes")),n(c,"user-scalable=yes restored","serious",o)),u==="viewport"&&/maximum-scale=1(?:[^0-9]|$)/.test(v)&&(o.setAttribute("content",v.replace(/maximum-scale=1(?=[^0-9]|$)/,"maximum-scale=5")),n(c,"maximum-scale=5 restored","serious",o))}if(c==="main"&&!o.getAttribute("tabindex")&&(o.setAttribute("tabindex","-1"),o.getAttribute("id")||o.setAttribute("id","main-content")),c==="img"&&(o.hasAttribute("alt")||(o.setAttribute("alt",""),o.setAttribute("aria-hidden","true"),n(c,'alt="" aria-hidden="true"',"serious",o))),c==="svg"&&(!o.getAttribute("aria-hidden")&&!o.getAttribute("aria-label")&&!s.querySelector("title")&&(o.setAttribute("aria-hidden","true"),n(c,'aria-hidden="true" (decorative svg)',"minor",o)),o.getAttribute("focusable")||o.setAttribute("focusable","false")),c==="iframe"&&!o.getAttribute("title")&&!o.getAttribute("aria-label")&&(o.setAttribute("title","embedded content"),o.setAttribute("aria-label","embedded content"),n(c,"title + aria-label added","serious",o)),c==="button"){if(!o.innerText?.trim()&&!o.getAttribute("aria-label")){let u=o.getAttribute("title")||"button";o.setAttribute("aria-label",u),n(c,`aria-label="${u}" (empty button)`,"critical",o)}o.hasAttribute("disabled")&&!o.getAttribute("aria-disabled")&&(o.setAttribute("aria-disabled","true"),t.fixed++)}if(c==="a"){let u=o;!o.innerText?.trim()&&!o.getAttribute("aria-label")&&(o.setAttribute("aria-label",o.getAttribute("title")||"link"),n(c,"aria-label added (empty link)","critical",o)),u.target==="_blank"&&!u.rel?.includes("noopener")&&(u.rel="noopener noreferrer",t.fixed++)}if(je.has(c)){let u=o;if(!o.getAttribute("aria-label")&&!o.getAttribute("aria-labelledby")){let v=o.getAttribute("placeholder")||o.getAttribute("name")||c;o.setAttribute("aria-label",v),n(c,`aria-label="${v}"`,"serious",o)}if(o.hasAttribute("required")&&!o.getAttribute("aria-required")&&(o.setAttribute("aria-required","true"),t.fixed++),c==="input"&&!u.autocomplete){let v=u.name||"";u.type==="email"||v.includes("email")?u.autocomplete="email":u.type==="tel"||v.includes("tel")?u.autocomplete="tel":u.type==="password"&&(u.autocomplete="current-password"),t.fixed++}}c==="th"&&!o.getAttribute("scope")&&(o.setAttribute("scope",o.closest("thead")?"col":"row"),n(c,"scope added to <th>","moderate",o)),he[c]&&!o.getAttribute("role")&&(o.setAttribute("role",he[c]),n(c,`role="${he[c]}"`,"minor",o));let g=o.getAttribute("role")||"";g==="tab"&&!o.getAttribute("aria-selected")&&(o.setAttribute("aria-selected","false"),t.fixed++),["alert","status","log"].includes(g)&&!o.getAttribute("aria-live")&&(o.setAttribute("aria-live",g==="alert"?"assertive":"polite"),n(c,`aria-live added on role=${g}`,"moderate",o)),g==="combobox"&&!o.getAttribute("aria-expanded")&&(o.setAttribute("aria-expanded","false"),n(c,'aria-expanded="false" on combobox',"serious",o)),(g==="checkbox"||g==="radio")&&!o.getAttribute("aria-checked")&&(o.setAttribute("aria-checked","false"),n(c,`aria-checked="false" on role=${g}`,"serious",o))}),t.renderTime=parseFloat((performance.now()-a).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(),a=document.querySelectorAll("*");e.scanned=a.length;let i=(n,s,o,c)=>e.details.push({tag:n,fix:s,severity:o,element:c.outerHTML.slice(0,100)});return a.forEach(n=>{let s=n,o=s.tagName.toLowerCase();(o==="a"||o==="button")&&!s.innerText?.trim()&&!s.getAttribute("aria-label")&&i(o,"needs aria-label (empty)","critical",s),o==="img"&&!s.hasAttribute("alt")&&i(o,"needs alt text","serious",s),je.has(o)&&!s.getAttribute("aria-label")&&!s.getAttribute("aria-labelledby")&&i(o,"needs aria-label","serious",s),o==="iframe"&&!s.getAttribute("title")&&!s.getAttribute("aria-label")&&i(o,"iframe needs title","serious",s)}),e.fixed=e.details.length,e.score=Qe(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:f,speak:we,showVisualAlert:Ze,trapFocus:ie,handlePlainEnglish:Ke,handleSummarisePage:Ye,handleTranslate:Ue,handleVoiceControl:Je,handleSmartLabels:Xe,SUPPORTED_LANGUAGES:ee};var m=Me(require("react"));var A=require("react");ke();var nt=null,ot=null,O=!1,Ae=!1;async function Gt(){if(!Ae){if(O){for(;O;)await new Promise(e=>setTimeout(e,200));return}O=!0;try{let{pipeline:e}=await import("@xenova/transformers");nt=await e("feature-extraction","Xenova/all-MiniLM-L6-v2",{device:"webgpu"}),ot=await e("question-answering","Xenova/distilbert-base-cased-distilled-squad",{device:"webgpu"}),Ae=!0,O=!1,console.log("yuktai: Transformers.js models loaded \u2705")}catch(e){throw O=!1,console.error("yuktai: Transformers.js model load failed",e),e}}}function Dt(){return new Promise(e=>{let t=setTimeout(e,1500),a=new MutationObserver(()=>{clearTimeout(t),t=setTimeout(()=>{a.disconnect(),e()},500)});a.observe(document.body,{childList:!0,subtree:!0})})}function _t(){let e=[],t=document.querySelectorAll("*");for(let a of t){if(a.closest("[data-yuktai-panel]"))continue;let i=a.innerText?.trim();i&&i.length>30&&e.push(i);let n=a.getAttribute("aria-label");n&&n.length>10&&e.push(n),(a instanceof HTMLInputElement||a instanceof HTMLTextAreaElement)&&a.placeholder&&e.push(a.placeholder)}return e.join(" ").slice(0,8e3)}function Vt(e,t=200,a=50){if(typeof e!="string")try{e=String(e??"")}catch{return[]}if(e=e.trim(),!e)return[];t<=a&&(a=Math.floor(t/2));let i=e.split(/\s+/),n=[],s=t-a;for(let o=0;o<i.length;o+=s){let c=i.slice(o,o+t).join(" ");c&&c.trim().length>20&&n.push(c)}return n}function jt(e,t){let a=0,i=0,n=0;for(let s=0;s<e.length;s++)a+=e[s]*t[s],i+=e[s]*e[s],n+=t[s]*t[s];return a/(Math.sqrt(i)*Math.sqrt(n)+1e-8)}async function at(e){let t=await nt(e,{pooling:"mean",normalize:!0});return Array.from(t.data)}async function Kt(e,t,a=3){let i=await at(e),n=await Promise.all(t.map(async s=>{let o=await at(s),c=jt(i,o);return{chunk:s,score:c}}));return n.sort((s,o)=>o.score-s.score),n.slice(0,a).map(s=>s.chunk)}async function it(e){if(!e.trim())return{success:!1,answer:"",error:"Please type a question."};try{await Gt(),await Dt();let t=_t();if(!t||t.length<50)return{success:!1,answer:"",error:"Not enough content on this page to answer from."};let a=Vt(t);if(a.length===0)return{success:!1,answer:"",error:"Could not process page content."};let n=(await Kt(e,a,3)).join(" ... "),s=await ot({question:e,context:n});return!s?.answer||s.answer.trim().length===0?{success:!0,answer:"I could not find a specific answer on this page."}:{success:!0,answer:s.answer.trim()}}catch(t){return console.error("yuktai: Transformers RAG error",t),{success:!1,answer:"",error:t instanceof Error?t.message:"Transformers.js error \u2014 please try again."}}}function rt(){try{return typeof WebAssembly<"u"&&typeof Worker<"u"}catch{return!1}}function st(){return Ae?"ready":O?"loading":"idle"}var r=require("react/jsx-runtime"),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},q=[80,90,100,110,120,130],Yt=[{value:"none",label:"None"},{value:"deuteranopia",label:"Deuteranopia"},{value:"protanopia",label:"Protanopia"},{value:"tritanopia",label:"Tritanopia"},{value:"achromatopsia",label:"Greyscale"}],Ut=["Prompt API for Gemini Nano","Summarization API for Gemini Nano","Writer API for Gemini Nano","Rewriter API for Gemini Nano","Translation API"];function Jt(){let[e,t]=(0,A.useState)(typeof window<"u"?window.innerWidth:1024);return(0,A.useEffect)(()=>{let a=()=>t(window.innerWidth);return window.addEventListener("resize",a),()=>window.removeEventListener("resize",a)},[]),{isMobile:e<=480,isTablet:e>480&&e<=768}}function Xt({checked:e,onChange:t,label:a,disabled:i=!1}){return(0,r.jsxs)("label",{"aria-label":a,style:{position:"relative",display:"inline-flex",width:"40px",height:"24px",cursor:i?"not-allowed":"pointer",flexShrink:0,opacity:i?.4:1},children:[(0,r.jsx)("input",{type:"checkbox",checked:e,disabled:i,onChange:n=>t(n.target.checked),style:{opacity:0,width:0,height:0,position:"absolute"}}),(0,r.jsx)("span",{style:{position:"absolute",inset:0,borderRadius:"99px",background:e?"#0d9488":"#cbd5e1",transition:"background 0.2s"}}),(0,r.jsx)("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 G({label:e,color:t="#64748b",badge:a,concept:i}){return(0,r.jsxs)("div",{style:{margin:"10px 18px 4px"},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,r.jsx)("p",{style:{margin:0,fontSize:"10px",fontWeight:600,color:t,letterSpacing:"0.06em",textTransform:"uppercase"},children:e}),a&&(0,r.jsx)("span",{style:{fontSize:"9px",fontWeight:500,padding:"1px 7px",borderRadius:"99px",background:"#f5f3ff",color:"#7c3aed",border:"0.5px solid #c4b5fd",whiteSpace:"nowrap"},children:a})]}),i&&(0,r.jsx)("p",{style:{margin:"2px 0 0",fontSize:"9px",color:"#94a3b8",fontStyle:"italic"},children:i})]})}function M({icon:e,label:t,desc:a,checked:i,onChange:n,disabled:s=!1,disabledReason:o,tip:c}){return(0,r.jsxs)("div",{title:s?o:c,style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"10px 18px",gap:"12px"},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"10px",flex:1,minWidth:0},children:[(0,r.jsx)("span",{"aria-hidden":"true",style:{width:"32px",height:"32px",borderRadius:"8px",background:s?"#f1f5f9":"#f0fdfa",color:s?"#94a3b8":"#0d9488",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"15px",flexShrink:0,fontWeight:700},children:e}),(0,r.jsxs)("div",{style:{minWidth:0},children:[(0,r.jsx)("p",{style:{margin:0,fontSize:"13px",fontWeight:500,color:s?"#94a3b8":"#0f172a",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:t}),(0,r.jsx)("p",{style:{margin:0,fontSize:"10px",color:"#94a3b8"},children:s?o:a})]})]}),(0,r.jsx)(Xt,{checked:i,onChange:n,label:`Toggle ${t}`,disabled:s})]})}function k(){return(0,r.jsx)("div",{style:{height:"1px",background:"#f1f5f9"}})}function j({steps:e}){return(0,r.jsxs)("div",{style:{margin:"0 18px 8px",padding:"8px 10px",background:"#f8fafc",borderRadius:"8px",border:"0.5px solid #e2e8f0"},children:[(0,r.jsx)("p",{style:{margin:"0 0 4px",fontSize:"9px",fontWeight:600,color:"#64748b",textTransform:"uppercase",letterSpacing:"0.05em"},children:"How to use"}),e.map((t,a)=>(0,r.jsxs)("p",{style:{margin:"0 0 2px",fontSize:"10px",color:"#475569"},children:[a+1,". ",t]},a))]})}var Te=(0,A.forwardRef)(({position:e,settings:t,report:a,isActive:i,aiSupported:n,voiceSupported:s,set:o,onApply:c,onReset:g,onClose:u},v)=>{let{isMobile:x,isTablet:E}=Jt(),[U,se]=(0,A.useState)([]),[R,W]=(0,A.useState)(""),[z,P]=(0,A.useState)(""),[w,D]=(0,A.useState)(!1),[p,H]=(0,A.useState)(null),[C,F]=(0,A.useState)("idle");(0,A.useEffect)(()=>{let l=window;!!(l.LanguageModel||l.ai?.languageModel)&&n?H("gemini"):rt()&&H("transformers")},[n]),(0,A.useEffect)(()=>{if(p!=="transformers")return;let l=setInterval(()=>{F(st())},500);return()=>clearInterval(l)},[p]);let _=async()=>{if(!(!R.trim()||w)){if(!p){P("\u26A0\uFE0F No AI engine available on this device.");return}D(!0),P("");try{let l;p==="gemini"?l=await ve(R):(F("loading"),l=await it(R),F("ready")),P(l.success&&l.answer?l.answer.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/#+\s/g,"").trim():"\u26A0\uFE0F "+(l.error||"No answer found on this page"))}catch{P("\u26A0\uFE0F Failed to get answer. Please try again.")}D(!1)}};(0,A.useEffect)(()=>{(async()=>{try{let V=window;if(!V.queryLocalFonts)return;let de=await V.queryLocalFonts(),d=[...new Set(de.map(h=>h.family))].sort();se(d.slice(0,50))}catch{}})()},[]);let J=p==="gemini"?"Gemini Nano":p==="transformers"?"Transformers.js \xB7 All devices":"Detecting...",le=p==="transformers"&&C==="loading"?"Loading AI model... (first time only)":"...",ce=x?{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:E?"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(0,r.jsxs)("div",{ref:v,role:"dialog","aria-modal":"true","aria-label":"yuktai accessibility preferences","data-yuktai-panel":"true",style:ce,children:[(0,r.jsxs)("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:[(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"7px",marginBottom:"4px",flexWrap:"wrap"},children:[(0,r.jsx)("span",{style:{fontSize:"10px",fontWeight:700,padding:"2px 7px",borderRadius:"99px",background:"#f0fdfa",color:"#0d9488",letterSpacing:"0.05em",fontFamily:"monospace"},children:"@yuktishaalaa/yuktai v2.1.0"}),i&&(0,r.jsx)("span",{style:{fontSize:"10px",fontWeight:700,padding:"2px 7px",borderRadius:"99px",background:"#f0fdfa",color:"#0f766e",border:"1px solid #99f6e4"},children:"\u25CF ACTIVE"})]}),(0,r.jsx)("p",{style:{margin:"0 0 1px",fontSize:"15px",fontWeight:600,color:"#0f172a"},children:"Accessibility"}),(0,r.jsx)("p",{style:{margin:0,fontSize:"11px",color:"#64748b"},children:"WCAG 2.2 \xB7 Open source \xB7 Zero cost \xB7 All devices"})]}),(0,r.jsx)("button",{onClick:u,"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:x?"44px":"auto",minHeight:x?"44px":"auto",display:"flex",alignItems:"center",justifyContent:"center"},children:"\xD7"})]}),(0,r.jsx)(G,{label:"\u267F Core Accessibility",concept:"Rule-based engine \u2014 works on all browsers and devices"}),(0,r.jsx)(j,{steps:["Toggle any feature on","Click Apply settings","Preferences saved automatically"]}),(0,r.jsx)(M,{icon:"\u{1F527}",label:"Auto-fix ARIA",desc:"Injects missing labels and roles automatically",checked:t.autoFix,onChange:l=>o("autoFix",l),tip:"Fixes aria-label, alt text, roles on every element"}),(0,r.jsx)(k,{}),(0,r.jsx)(M,{icon:"\u{1F50A}",label:"Speak on focus",desc:"Browser reads elements aloud as you tab",checked:t.speechEnabled,onChange:l=>o("speechEnabled",l),tip:"Uses browser SpeechSynthesis \u2014 no install needed"}),(0,r.jsx)(k,{}),(0,r.jsx)(M,{icon:"\u{1F399}\uFE0F",label:"Voice control",desc:"Say commands to navigate the page",checked:t.voiceControl,onChange:l=>o("voiceControl",l),disabled:!s,disabledReason:"Not supported in this browser",tip:'Say "scroll down", "go to main", "click"'}),(0,r.jsx)(k,{}),(0,r.jsx)(G,{label:"\u{1F916} AI Features",color:"#7c3aed",badge:"Gemini Nano",concept:"Large Language Model running privately on your device \u2014 Chrome 127+ only"}),(0,r.jsx)("div",{style:{margin:"4px 18px 6px",padding:"8px 10px",background:n?"#f0fdfa":"#f5f3ff",borderRadius:"8px",border:`0.5px solid ${n?"#99f6e4":"#c4b5fd"}`,fontSize:"10px",color:n?"#0f766e":"#7c3aed",lineHeight:1.5},children:n?"\u2705 Gemini Nano detected \u2014 AI features ready. Runs privately on your device.":"\u2699\uFE0F AI features need one-time setup \u2014 see guide below."}),!n&&(0,r.jsxs)("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:[(0,r.jsx)("p",{style:{margin:"0 0 6px",fontWeight:600,color:"#0f172a",fontSize:"11px"},children:"\u{1F6E0} One-time setup \u2014 5 steps:"}),(0,r.jsxs)("p",{style:{margin:"0 0 3px"},children:["1. Open Chrome \u2192 ",(0,r.jsx)("code",{style:{background:"#f1f5f9",padding:"1px 5px",borderRadius:"4px",fontSize:"10px",color:"#0d9488",fontFamily:"monospace"},children:"chrome://flags"})]}),(0,r.jsx)("p",{style:{margin:"0 0 3px"},children:"2. Enable each flag:"}),(0,r.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"2px",margin:"4px 0 6px 10px"},children:Ut.map(l=>(0,r.jsxs)("span",{style:{fontSize:"10px",color:"#7c3aed",fontFamily:"monospace"},children:["\u2192 ",l]},l))}),(0,r.jsxs)("p",{style:{margin:"0 0 3px"},children:["3. Click ",(0,r.jsx)("strong",{style:{color:"#0f172a"},children:"Relaunch"})]}),(0,r.jsxs)("p",{style:{margin:"0 0 3px"},children:["4. ",(0,r.jsx)("code",{style:{background:"#f1f5f9",padding:"1px 5px",borderRadius:"4px",fontSize:"10px",color:"#0d9488",fontFamily:"monospace"},children:"chrome://components"})," \u2192 Optimization Guide On Device Model \u2192 Check for update"]}),(0,r.jsx)("p",{style:{margin:"0"},children:"5. Refresh \u2014 AI features unlock automatically \u2705"})]}),(0,r.jsx)(M,{icon:"\u{1F4DD}",label:"Plain English mode",desc:"Rewrites complex text in simple language",checked:t.plainEnglish,onChange:l=>o("plainEnglish",l),disabled:!n,disabledReason:"Enable Gemini Nano \u2014 see setup above",tip:"AI concept: LLM text rewriting"}),(0,r.jsx)(k,{}),(0,r.jsx)(M,{icon:"\u{1F4CB}",label:"Summarise page",desc:"3-sentence summary appears at top",checked:t.summarisePage,onChange:l=>o("summarisePage",l),disabled:!n,disabledReason:"Enable Gemini Nano \u2014 see setup above",tip:"AI concept: Abstractive summarisation"}),(0,r.jsx)(k,{}),(0,r.jsx)(M,{icon:"\u{1F3F7}\uFE0F",label:"Smart aria-labels",desc:"AI generates meaningful labels for elements",checked:t.smartLabels,onChange:l=>o("smartLabels",l),disabled:!n,disabledReason:"Enable Gemini Nano \u2014 see setup above",tip:"AI concept: Context-aware label generation"}),(0,r.jsx)(k,{}),(0,r.jsx)(G,{label:"\u{1F441}\uFE0F Visual",concept:"CSS filter-based \u2014 works on all browsers and devices"}),(0,r.jsx)(j,{steps:["Toggle any visual mode","Changes apply instantly","Works on mobile and desktop"]}),(0,r.jsx)(M,{icon:"\u25D1",label:"High contrast",desc:"Boosts contrast for low vision users",checked:t.highContrast,onChange:l=>o("highContrast",l),tip:"CSS filter: contrast()"}),(0,r.jsx)(k,{}),(0,r.jsx)(M,{icon:"\u{1F319}",label:"Dark mode",desc:"Inverts colours \u2014 easy on eyes at night",checked:t.darkMode,onChange:l=>o("darkMode",l),tip:"CSS filter: invert + hue-rotate"}),(0,r.jsx)(k,{}),(0,r.jsx)(M,{icon:"\u23F8\uFE0F",label:"Reduce motion",desc:"Disables all animations",checked:t.reduceMotion,onChange:l=>o("reduceMotion",l),tip:"WCAG 2.3.3 \u2014 vestibular disorders"}),(0,r.jsx)(k,{}),(0,r.jsx)(M,{icon:"\u{1F446}",label:"Large targets",desc:"44\xD744px minimum touch targets",checked:t.largeTargets,onChange:l=>o("largeTargets",l),tip:"WCAG 2.5.8 \u2014 motor impaired users"}),(0,r.jsx)(k,{}),(0,r.jsxs)("div",{style:{padding:"10px 18px"},children:[(0,r.jsx)("p",{style:{margin:"0 0 2px",fontSize:"12px",fontWeight:500,color:"#0f172a"},children:"\u{1F3A8} Colour blindness"}),(0,r.jsx)("p",{style:{margin:"0 0 8px",fontSize:"10px",color:"#94a3b8"},children:"SVG colour matrix filters \u2014 all devices"}),(0,r.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px"},children:Yt.map(l=>(0,r.jsx)("button",{onClick:()=>o("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:x?"36px":"auto"},children:l.label},l.value))})]}),(0,r.jsx)(k,{}),(0,r.jsx)(G,{label:"\u{1F524} Font",concept:"Browser Font API + CSS \u2014 Chrome 103+"}),(0,r.jsx)(j,{steps:["Toggle dyslexia font or pick from device","Adjust size with + / \u2212","Saved across visits"]}),(0,r.jsx)(M,{icon:"Aa",label:"Dyslexia-friendly font",desc:"Atkinson Hyperlegible \u2014 research-backed",checked:t.dyslexiaFont,onChange:l=>o("dyslexiaFont",l),tip:"By Braille Institute \u2014 free and open source"}),(0,r.jsx)(k,{}),(0,r.jsxs)("div",{style:{padding:"10px 18px"},children:[(0,r.jsx)("p",{style:{margin:"0 0 2px",fontSize:"12px",fontWeight:500,color:"#0f172a"},children:"\u{1F5A5}\uFE0F Local font"}),(0,r.jsx)("p",{style:{margin:"0 0 8px",fontSize:"10px",color:"#94a3b8"},children:"window.queryLocalFonts() \u2014 Chrome 103+"}),U.length>0?(0,r.jsxs)("select",{value:t.localFont,onChange:l=>o("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:x?"44px":"36px"},children:[(0,r.jsx)("option",{value:"",children:"System default"}),U.map(l=>(0,r.jsx)("option",{value:l,style:{fontFamily:l},children:l},l))]}):(0,r.jsx)("p",{style:{margin:0,fontSize:"11px",color:"#94a3b8"},children:"Allow font access when Chrome prompts you."})]}),(0,r.jsx)(k,{}),(0,r.jsxs)("div",{style:{padding:"10px 18px 14px"},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"10px"},children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{style:{margin:0,fontSize:"12px",fontWeight:500,color:"#0f172a"},children:"\u{1F4CF} Text size"}),(0,r.jsx)("p",{style:{margin:0,fontSize:"10px",color:"#94a3b8"},children:"Scales all text on the page"})]}),(0,r.jsxs)("span",{style:{fontSize:"12px",fontWeight:600,color:"#0d9488",background:"#f0fdfa",padding:"2px 8px",borderRadius:"99px"},children:[t.fontScale,"%"]})]}),(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,r.jsx)("button",{onClick:()=>{let l=q.indexOf(t.fontScale);l>0&&o("fontScale",q[l-1])},disabled:t.fontScale<=80,"aria-label":"Decrease text size",style:{width:x?"44px":"30px",height:x?"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"}),(0,r.jsx)("div",{style:{flex:1,display:"flex",gap:"3px"},children:q.map(l=>(0,r.jsx)("button",{onClick:()=>o("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))}),(0,r.jsx)("button",{onClick:()=>{let l=q.indexOf(t.fontScale);l<q.length-1&&o("fontScale",q[l+1])},disabled:t.fontScale>=130,"aria-label":"Increase text size",style:{width:x?"44px":"30px",height:x?"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:"+"})]})]}),(0,r.jsx)(k,{}),(0,r.jsx)(G,{label:"\u{1F310} Translate",color:"#7c3aed",badge:"Gemini Nano",concept:"Chrome Translation API \u2014 on device, no internet after setup"}),(0,r.jsx)(j,{steps:["Enable Gemini Nano first","Pick your language","Full page translates instantly"]}),(0,r.jsxs)("div",{style:{padding:"6px 18px 12px"},children:[(0,r.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px"},children:ee.slice(0,x?8:18).map(l=>(0,r.jsx)("button",{onClick:()=>o("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:x?"36px":"auto"},children:l.label},l.code))}),!n&&(0,r.jsx)("p",{style:{margin:"6px 0 0",fontSize:"10px",color:"#94a3b8"},children:"Enable Gemini Nano using the setup guide above."})]}),(0,r.jsx)(k,{}),(0,r.jsx)(G,{label:"\u{1F4AC} Ask This Page",color:"#0d9488",badge:J,concept:"RAG \u2014 Retrieval Augmented Generation. Works on all devices including mobile."}),(0,r.jsx)(j,{steps:["Type any question about this page","Press Ask or hit Enter",p==="transformers"?"Transformers.js answers \u2014 works on mobile, offline":"Gemini Nano reads page and answers privately","Zero cost. No data leaves your device."]}),(0,r.jsxs)("div",{style:{margin:"0 18px 8px",padding:"6px 10px",background:p==="gemini"?"#f0fdfa":p==="transformers"?"#f5f3ff":"#f8fafc",borderRadius:"8px",border:`0.5px solid ${p==="gemini"?"#99f6e4":p==="transformers"?"#c4b5fd":"#e2e8f0"}`,fontSize:"10px",color:p==="gemini"?"#0f766e":p==="transformers"?"#7c3aed":"#94a3b8"},children:[p==="gemini"&&"\u2705 Using Gemini Nano \u2014 on device, private, instant",p==="transformers"&&"\u2705 Using Transformers.js \u2014 works on mobile and all browsers",!p&&"\u23F3 Detecting AI engine...",p==="transformers"&&C==="loading"&&" \xB7 Loading model...",p==="transformers"&&C==="ready"&&" \xB7 Model ready \u2705"]}),(0,r.jsxs)("div",{style:{padding:"0 18px 14px"},children:[(0,r.jsxs)("div",{style:{display:"flex",gap:"6px",marginBottom:"8px"},children:[(0,r.jsx)("input",{type:"text",value:R,onChange:l=>W(l.target.value),onKeyDown:l=>{l.key==="Enter"&&_()},placeholder:"e.g. What does this page do?",disabled:w||!p,"aria-label":"Ask a question about this page",style:{flex:1,padding:"8px 10px",borderRadius:"8px",border:"1px solid #e2e8f0",fontSize:"12px",color:"#0f172a",background:p?"#fff":"#f8fafc",outline:"none",height:x?"44px":"36px"}}),(0,r.jsx)("button",{onClick:_,disabled:w||!R.trim()||!p,"aria-label":"Ask question",style:{padding:"8px 14px",borderRadius:"8px",border:"none",background:p&&R.trim()&&!w?"#0d9488":"#e2e8f0",color:p&&R.trim()&&!w?"#fff":"#94a3b8",fontSize:"12px",fontWeight:600,cursor:p&&R.trim()&&!w?"pointer":"not-allowed",flexShrink:0,height:x?"44px":"36px",minWidth:"52px",transition:"background 0.2s"},children:w?le:"Ask"})]}),z&&(0,r.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"10px 12px",background:"#f0fdfa",border:"1px solid #99f6e4",borderRadius:"8px",fontSize:"12px",color:"#0f766e",lineHeight:1.6,maxHeight:"180px",overflowY:"auto"},children:[(0,r.jsx)("strong",{style:{display:"block",marginBottom:"4px",fontSize:"11px",color:"#0d9488"},children:"\u{1F4AC} Answer"}),z,(0,r.jsx)("button",{onClick:()=>{P(""),W("")},style:{display:"block",marginTop:"6px",background:"none",border:"none",color:"#94a3b8",fontSize:"10px",cursor:"pointer",padding:0},children:"Clear"})]})]}),a&&(0,r.jsx)("div",{role:"status",style:{margin:"0 14px 10px",padding:"8px 12px",background:"#f0fdfa",border:"1px solid #99f6e4",borderRadius:"8px",fontSize:"12px",color:"#0f766e",fontWeight:500,fontFamily:"monospace"},children:a.fixed>0?`\u2713 ${a.fixed} fixes \xB7 ${a.scanned} nodes \xB7 ${a.renderTime}ms \xB7 Score: ${a.score}/100`:`\u2713 0 auto-fixes needed \xB7 ${a.scanned} nodes \xB7 ${a.renderTime}ms`}),(0,r.jsxs)("div",{style:{display:"flex",gap:"8px",padding:"12px 14px 14px",position:x?"sticky":"relative",bottom:x?0:"auto",background:"#fff",borderTop:"1px solid #f1f5f9"},children:[(0,r.jsx)("button",{onClick:g,style:{flex:1,padding:x?"12px 0":"8px 0",fontSize:"13px",fontWeight:500,borderRadius:"9px",border:"1px solid #e2e8f0",background:"#fff",color:"#64748b",cursor:"pointer"},children:"Reset"}),(0,r.jsx)("button",{onClick:c,style:{flex:2,padding:x?"12px 0":"8px 0",fontSize:"13px",fontWeight:600,borderRadius:"9px",border:"none",background:"#0d9488",color:"#fff",cursor:"pointer"},children:"Apply settings"})]})]})});Te.displayName="WidgetPanel";var y=require("react/jsx-runtime");async function Qt(){try{if(typeof window>"u")return!1;let e=window;if(e.LanguageModel)try{if(typeof e.LanguageModel.availability=="function"){let a=await e.LanguageModel.availability();if(console.log("yuktai: LanguageModel.availability() =",a),a==="readily"||a==="available"||a==="downloadable")return!0}else return!0}catch{}if(e.Summarizer)try{if(typeof e.Summarizer.availability=="function"){let a=await e.Summarizer.availability();if(a==="readily"||a==="available")return!0}else return!0}catch{}if(e.Rewriter)try{if(typeof e.Rewriter.availability=="function"){let a=await e.Rewriter.availability();if(a==="readily"||a==="available")return!0}else return!0}catch{}if(e.Writer)try{if(typeof e.Writer.availability=="function"){let a=await e.Writer.availability();if(a==="readily"||a==="available")return!0}else return!0}catch{}let t=e.ai||globalThis.ai;if(t){if(t.languageModel?.availability)try{let a=await t.languageModel.availability();if(a==="readily"||a==="downloadable"||a==="available")return!0}catch{}if(t.languageModel?.capabilities)try{let a=await t.languageModel.capabilities();if(a?.available==="readily"||a?.available==="after-download")return!0}catch{}if(t.languageModel&&typeof t.languageModel.create=="function")return!0;if(t.summarizer?.capabilities)try{if((await t.summarizer.capabilities())?.available!=="no")return!0}catch{}if(t.rewriter?.capabilities)try{if((await t.rewriter.capabilities())?.available!=="no")return!0}catch{}if(t.writer?.capabilities)try{if((await t.writer.capabilities())?.available!=="no")return!0}catch{}if(t.summarizer||t.rewriter||t.writer||t.languageModel)return!0}return!!(e.Translator||e.translation?.canTranslate)}catch{return!1}}function re({position:e="left",children:t,config:a={},showRag:i=!1}){let[n,s]=(0,m.useState)(!1),[o,c]=(0,m.useState)(Se),[g,u]=(0,m.useState)(null),[v,x]=(0,m.useState)(!1),[E,U]=(0,m.useState)(!1),[se,R]=(0,m.useState)(!1),W=m.default.useRef(null),[z,P]=(0,m.useState)(!1),[w,D]=(0,m.useState)(""),[p,H]=(0,m.useState)(""),[C,F]=(0,m.useState)(!1),_=(0,m.useCallback)(async()=>{if(!(!w.trim()||C||!E)){F(!0),H("");try{let{askPage:d}=await Promise.resolve().then(()=>(ke(),tt)),h=await d(w);H(h.success?h.answer.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/#+\s/g,"").trim():"\u26A0\uFE0F "+(h.error||"No answer found."))}catch{H("\u26A0\uFE0F Something went wrong.")}F(!1)}},[w,C,E]);(0,m.useEffect)(()=>{if(typeof window>"u")return;let h=setTimeout(async()=>{let S=window;console.log("yuktai: Checking AI APIs..."),console.log("yuktai: window.ai =",S.ai),console.log("yuktai: window.LanguageModel =",S.LanguageModel),console.log("yuktai: window.Summarizer =",S.Summarizer),console.log("yuktai: window.Rewriter =",S.Rewriter),console.log("yuktai: window.Writer =",S.Writer);let Ee=await Qt();U(Ee),Ee?console.log("yuktai: Chrome Built-in AI detected \u2705"):(console.log("yuktai: Chrome Built-in AI not detected \u274C"),console.log("yuktai: Enable flags at chrome://flags and download model at chrome://components"));let ct=!!(S.SpeechRecognition||S.webkitSpeechRecognition);R(ct)},800);return()=>clearTimeout(h)},[]),(0,m.useEffect)(()=>{if(!(typeof window>"u"))try{let d=localStorage.getItem("yuktai-a11y-prefs");if(d){let h=JSON.parse(d);c(S=>({...S,...h}))}}catch{}},[]);let J=(0,m.useCallback)(async d=>{let h={enabled:!0,highContrast:d.highContrast,darkMode:d.darkMode,reduceMotion:d.reduceMotion,largeTargets:d.largeTargets,speechEnabled:d.speechEnabled,autoFix:d.autoFix,dyslexiaFont:d.dyslexiaFont,localFont:d.localFont,fontSizeMultiplier:d.fontScale/100,colorBlindMode:d.colorBlindMode,showAuditBadge:d.showAuditBadge,showSkipLinks:!0,showPreferencePanel:!1,plainEnglish:d.plainEnglish,summarisePage:d.summarisePage,translateLanguage:d.translateLanguage,voiceControl:d.voiceControl,smartLabels:d.smartLabels,...a};await T.execute(h);let S=T.applyFixes(h);u(S),x(!0)},[a]),le=(0,m.useCallback)(async()=>{try{localStorage.setItem("yuktai-a11y-prefs",JSON.stringify(o))}catch{}await J(o),s(!1)},[o,J]),ce=(0,m.useCallback)(()=>{c(Se);try{localStorage.removeItem("yuktai-a11y-prefs")}catch{}let d=document.documentElement;["data-yuktai-high-contrast","data-yuktai-dark","data-yuktai-reduce-motion","data-yuktai-large-targets","data-yuktai-keyboard","data-yuktai-dyslexia"].forEach(h=>d.removeAttribute(h)),document.body.style.filter="",document.body.style.fontFamily="",document.documentElement.style.fontSize="",u(null),x(!1)},[]),l=(0,m.useCallback)((d,h)=>{c(S=>({...S,[d]:h}))},[]);(0,m.useEffect)(()=>{let d=h=>{h.key==="Escape"&&(n&&s(!1),z&&P(!1))};return window.addEventListener("keydown",d),()=>window.removeEventListener("keydown",d)},[n,z]),(0,m.useEffect)(()=>{n&&W.current&&T.trapFocus(W.current)},[n]);let V={position:"fixed",bottom:"24px",[e]:"24px",zIndex:9998,width:"52px",height:"52px",borderRadius:"50%",background:v?"#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"},de={position:"fixed",bottom:"84px",[e]:"24px",zIndex:9998,width:"52px",height:"52px",borderRadius:"50%",background:z?"#7c3aed":"#6d28d9",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(0,y.jsxs)(y.Fragment,{children:[t,i&&(0,y.jsx)("button",{style:de,"aria-label":"Ask a question about this page","aria-haspopup":"dialog","aria-expanded":z,onClick:()=>{P(d=>!d),s(!1)},onMouseEnter:d=>{d.currentTarget.style.transform="scale(1.08)"},onMouseLeave:d=>{d.currentTarget.style.transform="scale(1)"},children:"\u{1F4AC}"}),i&&z&&(0,y.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"Ask this page","data-yuktai-panel":"true",style:{position:"fixed",bottom:"148px",[e]:"24px",zIndex:9999,width:"300px",maxWidth:"calc(100vw - 48px)",background:"#fff",border:"1px solid #e2e8f0",borderRadius:"16px",boxShadow:"0 8px 32px rgba(0,0,0,0.12)",fontFamily:"system-ui,-apple-system,sans-serif",padding:"14px"},children:[(0,y.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:"10px"},children:[(0,y.jsxs)("div",{children:[(0,y.jsx)("p",{style:{margin:"0 0 2px",fontSize:"13px",fontWeight:600,color:"#0f172a"},children:"\u{1F4AC} Ask this page"}),(0,y.jsx)("p",{style:{margin:0,fontSize:"10px",color:"#7c3aed"},children:"Gemini Nano \xB7 On device \xB7 Zero cost"})]}),(0,y.jsx)("button",{onClick:()=>P(!1),"aria-label":"Close ask panel",style:{background:"none",border:"none",cursor:"pointer",color:"#94a3b8",fontSize:"18px",lineHeight:1,padding:"2px",borderRadius:"4px"},children:"\xD7"})]}),(0,y.jsxs)("div",{style:{display:"flex",gap:"6px",marginBottom:"8px"},children:[(0,y.jsx)("input",{type:"text",value:w,onChange:d=>D(d.target.value),onKeyDown:d=>{d.key==="Enter"&&_()},placeholder:"e.g. What does this page do?",disabled:!E||C,"aria-label":"Ask a question about this page",style:{flex:1,padding:"8px 10px",borderRadius:"8px",border:"1px solid #e2e8f0",fontSize:"12px",color:"#0f172a",background:E?"#fff":"#f8fafc",outline:"none",height:"36px"}}),(0,y.jsx)("button",{onClick:_,disabled:!E||C||!w.trim(),"aria-label":"Submit question",style:{padding:"8px 12px",borderRadius:"8px",border:"none",background:E&&w.trim()&&!C?"#7c3aed":"#e2e8f0",color:E&&w.trim()&&!C?"#fff":"#94a3b8",fontSize:"12px",fontWeight:600,cursor:E&&w.trim()&&!C?"pointer":"not-allowed",height:"36px",minWidth:"48px",transition:"background 0.2s"},children:C?"...":"Ask"})]}),p&&(0,y.jsxs)("div",{style:{padding:"10px",background:"#f5f3ff",borderRadius:"8px",fontSize:"12px",color:"#4c1d95",lineHeight:1.6,maxHeight:"180px",overflowY:"auto"},children:[(0,y.jsx)("strong",{style:{display:"block",marginBottom:"4px",fontSize:"11px",color:"#7c3aed"},children:"\u{1F4AC} Answer"}),p,(0,y.jsx)("button",{onClick:()=>{H(""),D("")},style:{display:"block",marginTop:"6px",background:"none",border:"none",color:"#94a3b8",fontSize:"10px",cursor:"pointer",padding:0},children:"Clear"})]}),!E&&(0,y.jsx)("p",{style:{margin:"4px 0 0",fontSize:"10px",color:"#94a3b8"},children:"Enable Gemini Nano via chrome://flags to use this feature."})]}),(0,y.jsx)("button",{style:V,"aria-label":"Open accessibility preferences","aria-haspopup":"dialog","aria-expanded":n,"data-yuktai-pref-toggle":"true",onClick:()=>{s(d=>!d),P(!1)},onMouseEnter:d=>{d.currentTarget.style.transform="scale(1.08)"},onMouseLeave:d=>{d.currentTarget.style.transform="scale(1)"},children:"\u267F"}),n&&(0,y.jsx)(Te,{ref:W,position:e,settings:o,report:g,isActive:v,aiSupported:E,voiceSupported:se,set:l,onApply:le,onReset:ce,onClose:()=>s(!1)})]})}var K={name:"ai.text",async execute(e){return`\u{1F916} YuktAI says: ${e}`}};var Y={name:"voice.text",async execute(e){return!e||e.trim()===""?"\u{1F3A4} No speech detected":`\u{1F3A4} You said: ${e}`}};var I=class{plugins=new Map;register(t,a){if(!a||typeof a.execute!="function")throw new Error(`Invalid plugin: ${t}`);this.plugins.set(t,a)}use(t){return this.plugins.get(t)}async run(t,a){try{let i=this.use(t);if(!i)throw new Error(`Plugin not found: ${t}`);return await i.execute(a)}catch(i){throw console.error(`[YuktAI Runtime Error in ${t}]:`,i),i}}getPlugins(){return Array.from(this.plugins.keys())}};function Zt(){if(typeof globalThis>"u")return new I;if(!globalThis.__yuktai_runtime__){let e=new I;e.register(T.name,T),e.register(K.name,K),e.register(Y.name,Y),globalThis.__yuktai_runtime__=e}return globalThis.__yuktai_runtime__}var lt=typeof window<"u"?Zt():new I,ea={wcagPlugin:T,list(){return lt.getPlugins()},use(e){return lt.use(e)},fix(e){return T.applyFixes({enabled:!0,autoFix:!0,...e})},scan(){return T.scan()}};0&&(module.exports={Runtime,YuktAI,YuktAIWrapper,aiPlugin,voicePlugin,wcag,wcagPlugin});
|
|
390
|
+
`,document.body.appendChild(e),Qe=e}function rt(e){let t={critical:20,serious:10,moderate:5,minor:2},n=e.details.reduce((i,a)=>i+(t[a.severity]||0),0);return Math.max(0,Math.min(100,100-n))}var T={name:"yuktai-a11y",version:"4.0.0",observer:null,async execute(e){if(!e.enabled)return this.stopObserver(),"yuktai: disabled.";N=e,_t(e),jt(),Vt(),Bt(),Nt(),e.showSkipLinks!==!1&&$t(),e.showPreferencePanel,qt(e);let t=this.applyFixes(e);t.score=rt(t),e.showAuditBadge&&Dt(t),e.timeoutWarning&<(e.timeoutWarning),e.autoFix&&this.startObserver(e),e.plainEnglish&&await tt(!0),e.summarisePage&&await nt(!0),e.translateLanguage&&e.translateLanguage!=="en"&&await at(e.translateLanguage),e.voiceControl&&await ot(!0),e.smartLabels&&await it(!0);let n=`${t.fixed} fixes applied. Score: ${t.score}/100.`;return f(n,t.score>=90?"success":"info",!1),`yuktai v4.0.0: ${n} 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 n=performance.now(),i=document.querySelectorAll("*");t.scanned=i.length;let a=(s,o,c,g)=>{t.details.push({tag:s,fix:o,severity:c,element:g.outerHTML.slice(0,100)}),t.fixed++};return i.forEach(s=>{let o=s,c=o.tagName.toLowerCase();if(c==="html"&&!o.getAttribute("lang")&&(o.setAttribute("lang","en"),a(c,'lang="en" added',"critical",o)),c==="meta"){let u=o.getAttribute("name"),k=o.getAttribute("content")||"";u==="viewport"&&k.includes("user-scalable=no")&&(o.setAttribute("content",k.replace("user-scalable=no","user-scalable=yes")),a(c,"user-scalable=yes restored","serious",o)),u==="viewport"&&/maximum-scale=1(?:[^0-9]|$)/.test(k)&&(o.setAttribute("content",k.replace(/maximum-scale=1(?=[^0-9]|$)/,"maximum-scale=5")),a(c,"maximum-scale=5 restored","serious",o))}if(c==="main"&&!o.getAttribute("tabindex")&&(o.setAttribute("tabindex","-1"),o.getAttribute("id")||o.setAttribute("id","main-content")),c==="img"&&(o.hasAttribute("alt")||(o.setAttribute("alt",""),o.setAttribute("aria-hidden","true"),a(c,'alt="" aria-hidden="true"',"serious",o))),c==="svg"&&(!o.getAttribute("aria-hidden")&&!o.getAttribute("aria-label")&&!s.querySelector("title")&&(o.setAttribute("aria-hidden","true"),a(c,'aria-hidden="true" (decorative svg)',"minor",o)),o.getAttribute("focusable")||o.setAttribute("focusable","false")),c==="iframe"&&!o.getAttribute("title")&&!o.getAttribute("aria-label")&&(o.setAttribute("title","embedded content"),o.setAttribute("aria-label","embedded content"),a(c,"title + aria-label added","serious",o)),c==="button"){if(!o.innerText?.trim()&&!o.getAttribute("aria-label")){let u=o.getAttribute("title")||"button";o.setAttribute("aria-label",u),a(c,`aria-label="${u}" (empty button)`,"critical",o)}o.hasAttribute("disabled")&&!o.getAttribute("aria-disabled")&&(o.setAttribute("aria-disabled","true"),t.fixed++)}if(c==="a"){let u=o;!o.innerText?.trim()&&!o.getAttribute("aria-label")&&(o.setAttribute("aria-label",o.getAttribute("title")||"link"),a(c,"aria-label added (empty link)","critical",o)),u.target==="_blank"&&!u.rel?.includes("noopener")&&(u.rel="noopener noreferrer",t.fixed++)}if(et.has(c)){let u=o;if(!o.getAttribute("aria-label")&&!o.getAttribute("aria-labelledby")){let k=o.getAttribute("placeholder")||o.getAttribute("name")||c;o.setAttribute("aria-label",k),a(c,`aria-label="${k}"`,"serious",o)}if(o.hasAttribute("required")&&!o.getAttribute("aria-required")&&(o.setAttribute("aria-required","true"),t.fixed++),c==="input"&&!u.autocomplete){let k=u.name||"";u.type==="email"||k.includes("email")?u.autocomplete="email":u.type==="tel"||k.includes("tel")?u.autocomplete="tel":u.type==="password"&&(u.autocomplete="current-password"),t.fixed++}}c==="th"&&!o.getAttribute("scope")&&(o.setAttribute("scope",o.closest("thead")?"col":"row"),a(c,"scope added to <th>","moderate",o)),Te[c]&&!o.getAttribute("role")&&(o.setAttribute("role",Te[c]),a(c,`role="${Te[c]}"`,"minor",o));let g=o.getAttribute("role")||"";g==="tab"&&!o.getAttribute("aria-selected")&&(o.setAttribute("aria-selected","false"),t.fixed++),["alert","status","log"].includes(g)&&!o.getAttribute("aria-live")&&(o.setAttribute("aria-live",g==="alert"?"assertive":"polite"),a(c,`aria-live added on role=${g}`,"moderate",o)),g==="combobox"&&!o.getAttribute("aria-expanded")&&(o.setAttribute("aria-expanded","false"),a(c,'aria-expanded="false" on combobox',"serious",o)),(g==="checkbox"||g==="radio")&&!o.getAttribute("aria-checked")&&(o.setAttribute("aria-checked","false"),a(c,`aria-checked="false" on role=${g}`,"serious",o))}),t.renderTime=parseFloat((performance.now()-n).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(),n=document.querySelectorAll("*");e.scanned=n.length;let i=(a,s,o,c)=>e.details.push({tag:a,fix:s,severity:o,element:c.outerHTML.slice(0,100)});return n.forEach(a=>{let s=a,o=s.tagName.toLowerCase();(o==="a"||o==="button")&&!s.innerText?.trim()&&!s.getAttribute("aria-label")&&i(o,"needs aria-label (empty)","critical",s),o==="img"&&!s.hasAttribute("alt")&&i(o,"needs alt text","serious",s),et.has(o)&&!s.getAttribute("aria-label")&&!s.getAttribute("aria-labelledby")&&i(o,"needs aria-label","serious",s),o==="iframe"&&!s.getAttribute("title")&&!s.getAttribute("aria-label")&&i(o,"iframe needs title","serious",s)}),e.fixed=e.details.length,e.score=rt(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:f,speak:Ee,showVisualAlert:st,trapFocus:ce,handlePlainEnglish:tt,handleSummarisePage:nt,handleTranslate:at,handleVoiceControl:ot,handleSmartLabels:it,SUPPORTED_LANGUAGES:oe};var m=$e(require("react"));var S=require("react");Le();de();var r=require("react/jsx-runtime"),Re={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},D=[80,90,100,110,120,130],tn=[{value:"none",label:"None"},{value:"deuteranopia",label:"Deuteranopia"},{value:"protanopia",label:"Protanopia"},{value:"tritanopia",label:"Tritanopia"},{value:"achromatopsia",label:"Greyscale"}],nn=["Prompt API for Gemini Nano","Summarization API for Gemini Nano","Writer API for Gemini Nano","Rewriter API for Gemini Nano","Translation API"];function an(){let[e,t]=(0,S.useState)(typeof window<"u"?window.innerWidth:1024);return(0,S.useEffect)(()=>{let n=()=>t(window.innerWidth);return window.addEventListener("resize",n),()=>window.removeEventListener("resize",n)},[]),{isMobile:e<=480,isTablet:e>480&&e<=768}}function on({checked:e,onChange:t,label:n,disabled:i=!1}){return(0,r.jsxs)("label",{"aria-label":n,style:{position:"relative",display:"inline-flex",width:"40px",height:"24px",cursor:i?"not-allowed":"pointer",flexShrink:0,opacity:i?.4:1},children:[(0,r.jsx)("input",{type:"checkbox",checked:e,disabled:i,onChange:a=>t(a.target.checked),style:{opacity:0,width:0,height:0,position:"absolute"}}),(0,r.jsx)("span",{style:{position:"absolute",inset:0,borderRadius:"99px",background:e?"#0d9488":"#cbd5e1",transition:"background 0.2s"}}),(0,r.jsx)("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 G({label:e,color:t="#64748b",badge:n,concept:i}){return(0,r.jsxs)("div",{style:{margin:"10px 18px 4px"},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,r.jsx)("p",{style:{margin:0,fontSize:"10px",fontWeight:600,color:t,letterSpacing:"0.06em",textTransform:"uppercase"},children:e}),n&&(0,r.jsx)("span",{style:{fontSize:"9px",fontWeight:500,padding:"1px 7px",borderRadius:"99px",background:"#f5f3ff",color:"#7c3aed",border:"0.5px solid #c4b5fd",whiteSpace:"nowrap"},children:n})]}),i&&(0,r.jsx)("p",{style:{margin:"2px 0 0",fontSize:"9px",color:"#94a3b8",fontStyle:"italic"},children:i})]})}function L({icon:e,label:t,desc:n,checked:i,onChange:a,disabled:s=!1,disabledReason:o,tip:c}){return(0,r.jsxs)("div",{title:s?o:c,style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"10px 18px",gap:"12px"},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"10px",flex:1,minWidth:0},children:[(0,r.jsx)("span",{"aria-hidden":"true",style:{width:"32px",height:"32px",borderRadius:"8px",background:s?"#f1f5f9":"#f0fdfa",color:s?"#94a3b8":"#0d9488",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"15px",flexShrink:0,fontWeight:700},children:e}),(0,r.jsxs)("div",{style:{minWidth:0},children:[(0,r.jsx)("p",{style:{margin:0,fontSize:"13px",fontWeight:500,color:s?"#94a3b8":"#0f172a",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:t}),(0,r.jsx)("p",{style:{margin:0,fontSize:"10px",color:"#94a3b8"},children:s?o:n})]})]}),(0,r.jsx)(on,{checked:i,onChange:a,label:`Toggle ${t}`,disabled:s})]})}function A(){return(0,r.jsx)("div",{style:{height:"1px",background:"#f1f5f9"}})}function J({steps:e}){return(0,r.jsxs)("div",{style:{margin:"0 18px 8px",padding:"8px 10px",background:"#f8fafc",borderRadius:"8px",border:"0.5px solid #e2e8f0"},children:[(0,r.jsx)("p",{style:{margin:"0 0 4px",fontSize:"9px",fontWeight:600,color:"#64748b",textTransform:"uppercase",letterSpacing:"0.05em"},children:"How to use"}),e.map((t,n)=>(0,r.jsxs)("p",{style:{margin:"0 0 2px",fontSize:"10px",color:"#475569"},children:[n+1,". ",t]},n))]})}var Ie=(0,S.forwardRef)(({position:e,settings:t,report:n,isActive:i,aiSupported:a,voiceSupported:s,set:o,onApply:c,onReset:g,onClose:u},k)=>{let{isMobile:h,isTablet:q}=an(),[Z,pe]=(0,S.useState)([]),[M,H]=(0,S.useState)(""),[R,P]=(0,S.useState)(""),[w,_]=(0,S.useState)(!1),[p,I]=(0,S.useState)(null),[E,W]=(0,S.useState)("idle");(0,S.useEffect)(()=>{let l=window;!!(l.LanguageModel||l.ai?.languageModel)&&a?I("gemini"):Y()&&I("transformers")},[a]),(0,S.useEffect)(()=>{if(p!=="transformers")return;let l=setInterval(()=>{W(U())},500);return()=>clearInterval(l)},[p]);let y=async()=>{if(!(!M.trim()||w)){if(!p){P("\u26A0\uFE0F No AI engine available on this device.");return}_(!0),P("");try{let l;p==="gemini"?l=await Ce(M):(W("loading"),l=await Pe(M),W("ready")),P(l.success&&l.answer?l.answer.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/#+\s/g,"").trim():"\u26A0\uFE0F "+(l.error||"No answer found on this page"))}catch{P("\u26A0\uFE0F Failed to get answer. Please try again.")}_(!1)}};(0,S.useEffect)(()=>{(async()=>{try{let F=window;if(!F.queryLocalFonts)return;let fe=await F.queryLocalFonts(),me=[...new Set(fe.map(ge=>ge.family))].sort();pe(me.slice(0,50))}catch{}})()},[]);let ee=p==="gemini"?"Gemini Nano":p==="transformers"?"Transformers.js \xB7 All devices":"Detecting...",j=p==="transformers"&&E==="loading"?"Loading AI model... (first time only)":"...",V=h?{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:q?"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(0,r.jsxs)("div",{ref:k,role:"dialog","aria-modal":"true","aria-label":"yuktai accessibility preferences","data-yuktai-panel":"true",style:V,children:[(0,r.jsxs)("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:[(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"7px",marginBottom:"4px",flexWrap:"wrap"},children:[(0,r.jsx)("span",{style:{fontSize:"10px",fontWeight:700,padding:"2px 7px",borderRadius:"99px",background:"#f0fdfa",color:"#0d9488",letterSpacing:"0.05em",fontFamily:"monospace"},children:"@yuktishaalaa/yuktai v2.1.0"}),i&&(0,r.jsx)("span",{style:{fontSize:"10px",fontWeight:700,padding:"2px 7px",borderRadius:"99px",background:"#f0fdfa",color:"#0f766e",border:"1px solid #99f6e4"},children:"\u25CF ACTIVE"})]}),(0,r.jsx)("p",{style:{margin:"0 0 1px",fontSize:"15px",fontWeight:600,color:"#0f172a"},children:"Accessibility"}),(0,r.jsx)("p",{style:{margin:0,fontSize:"11px",color:"#64748b"},children:"WCAG 2.2 \xB7 Open source \xB7 Zero cost \xB7 All devices"})]}),(0,r.jsx)("button",{onClick:u,"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:h?"44px":"auto",minHeight:h?"44px":"auto",display:"flex",alignItems:"center",justifyContent:"center"},children:"\xD7"})]}),(0,r.jsx)(G,{label:"\u267F Core Accessibility",concept:"Rule-based engine \u2014 works on all browsers and devices"}),(0,r.jsx)(J,{steps:["Toggle any feature on","Click Apply settings","Preferences saved automatically"]}),(0,r.jsx)(L,{icon:"\u{1F527}",label:"Auto-fix ARIA",desc:"Injects missing labels and roles automatically",checked:t.autoFix,onChange:l=>o("autoFix",l),tip:"Fixes aria-label, alt text, roles on every element"}),(0,r.jsx)(A,{}),(0,r.jsx)(L,{icon:"\u{1F50A}",label:"Speak on focus",desc:"Browser reads elements aloud as you tab",checked:t.speechEnabled,onChange:l=>o("speechEnabled",l),tip:"Uses browser SpeechSynthesis \u2014 no install needed"}),(0,r.jsx)(A,{}),(0,r.jsx)(L,{icon:"\u{1F399}\uFE0F",label:"Voice control",desc:"Say commands to navigate the page",checked:t.voiceControl,onChange:l=>o("voiceControl",l),disabled:!s,disabledReason:"Not supported in this browser",tip:'Say "scroll down", "go to main", "click"'}),(0,r.jsx)(A,{}),(0,r.jsx)(G,{label:"\u{1F916} AI Features",color:"#7c3aed",badge:"Gemini Nano",concept:"Large Language Model running privately on your device \u2014 Chrome 127+ only"}),(0,r.jsx)("div",{style:{margin:"4px 18px 6px",padding:"8px 10px",background:a?"#f0fdfa":"#f5f3ff",borderRadius:"8px",border:`0.5px solid ${a?"#99f6e4":"#c4b5fd"}`,fontSize:"10px",color:a?"#0f766e":"#7c3aed",lineHeight:1.5},children:a?"\u2705 Gemini Nano detected \u2014 AI features ready. Runs privately on your device.":"\u2699\uFE0F AI features need one-time setup \u2014 see guide below."}),!a&&(0,r.jsxs)("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:[(0,r.jsx)("p",{style:{margin:"0 0 6px",fontWeight:600,color:"#0f172a",fontSize:"11px"},children:"\u{1F6E0} One-time setup \u2014 5 steps:"}),(0,r.jsxs)("p",{style:{margin:"0 0 3px"},children:["1. Open Chrome \u2192 ",(0,r.jsx)("code",{style:{background:"#f1f5f9",padding:"1px 5px",borderRadius:"4px",fontSize:"10px",color:"#0d9488",fontFamily:"monospace"},children:"chrome://flags"})]}),(0,r.jsx)("p",{style:{margin:"0 0 3px"},children:"2. Enable each flag:"}),(0,r.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"2px",margin:"4px 0 6px 10px"},children:nn.map(l=>(0,r.jsxs)("span",{style:{fontSize:"10px",color:"#7c3aed",fontFamily:"monospace"},children:["\u2192 ",l]},l))}),(0,r.jsxs)("p",{style:{margin:"0 0 3px"},children:["3. Click ",(0,r.jsx)("strong",{style:{color:"#0f172a"},children:"Relaunch"})]}),(0,r.jsxs)("p",{style:{margin:"0 0 3px"},children:["4. ",(0,r.jsx)("code",{style:{background:"#f1f5f9",padding:"1px 5px",borderRadius:"4px",fontSize:"10px",color:"#0d9488",fontFamily:"monospace"},children:"chrome://components"})," \u2192 Optimization Guide On Device Model \u2192 Check for update"]}),(0,r.jsx)("p",{style:{margin:"0"},children:"5. Refresh \u2014 AI features unlock automatically \u2705"})]}),(0,r.jsx)(L,{icon:"\u{1F4DD}",label:"Plain English mode",desc:"Rewrites complex text in simple language",checked:t.plainEnglish,onChange:l=>o("plainEnglish",l),disabled:!a,disabledReason:"Enable Gemini Nano \u2014 see setup above",tip:"AI concept: LLM text rewriting"}),(0,r.jsx)(A,{}),(0,r.jsx)(L,{icon:"\u{1F4CB}",label:"Summarise page",desc:"3-sentence summary appears at top",checked:t.summarisePage,onChange:l=>o("summarisePage",l),disabled:!a,disabledReason:"Enable Gemini Nano \u2014 see setup above",tip:"AI concept: Abstractive summarisation"}),(0,r.jsx)(A,{}),(0,r.jsx)(L,{icon:"\u{1F3F7}\uFE0F",label:"Smart aria-labels",desc:"AI generates meaningful labels for elements",checked:t.smartLabels,onChange:l=>o("smartLabels",l),disabled:!a,disabledReason:"Enable Gemini Nano \u2014 see setup above",tip:"AI concept: Context-aware label generation"}),(0,r.jsx)(A,{}),(0,r.jsx)(G,{label:"\u{1F441}\uFE0F Visual",concept:"CSS filter-based \u2014 works on all browsers and devices"}),(0,r.jsx)(J,{steps:["Toggle any visual mode","Changes apply instantly","Works on mobile and desktop"]}),(0,r.jsx)(L,{icon:"\u25D1",label:"High contrast",desc:"Boosts contrast for low vision users",checked:t.highContrast,onChange:l=>o("highContrast",l),tip:"CSS filter: contrast()"}),(0,r.jsx)(A,{}),(0,r.jsx)(L,{icon:"\u{1F319}",label:"Dark mode",desc:"Inverts colours \u2014 easy on eyes at night",checked:t.darkMode,onChange:l=>o("darkMode",l),tip:"CSS filter: invert + hue-rotate"}),(0,r.jsx)(A,{}),(0,r.jsx)(L,{icon:"\u23F8\uFE0F",label:"Reduce motion",desc:"Disables all animations",checked:t.reduceMotion,onChange:l=>o("reduceMotion",l),tip:"WCAG 2.3.3 \u2014 vestibular disorders"}),(0,r.jsx)(A,{}),(0,r.jsx)(L,{icon:"\u{1F446}",label:"Large targets",desc:"44\xD744px minimum touch targets",checked:t.largeTargets,onChange:l=>o("largeTargets",l),tip:"WCAG 2.5.8 \u2014 motor impaired users"}),(0,r.jsx)(A,{}),(0,r.jsxs)("div",{style:{padding:"10px 18px"},children:[(0,r.jsx)("p",{style:{margin:"0 0 2px",fontSize:"12px",fontWeight:500,color:"#0f172a"},children:"\u{1F3A8} Colour blindness"}),(0,r.jsx)("p",{style:{margin:"0 0 8px",fontSize:"10px",color:"#94a3b8"},children:"SVG colour matrix filters \u2014 all devices"}),(0,r.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px"},children:tn.map(l=>(0,r.jsx)("button",{onClick:()=>o("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:h?"36px":"auto"},children:l.label},l.value))})]}),(0,r.jsx)(A,{}),(0,r.jsx)(G,{label:"\u{1F524} Font",concept:"Browser Font API + CSS \u2014 Chrome 103+"}),(0,r.jsx)(J,{steps:["Toggle dyslexia font or pick from device","Adjust size with + / \u2212","Saved across visits"]}),(0,r.jsx)(L,{icon:"Aa",label:"Dyslexia-friendly font",desc:"Atkinson Hyperlegible \u2014 research-backed",checked:t.dyslexiaFont,onChange:l=>o("dyslexiaFont",l),tip:"By Braille Institute \u2014 free and open source"}),(0,r.jsx)(A,{}),(0,r.jsxs)("div",{style:{padding:"10px 18px"},children:[(0,r.jsx)("p",{style:{margin:"0 0 2px",fontSize:"12px",fontWeight:500,color:"#0f172a"},children:"\u{1F5A5}\uFE0F Local font"}),(0,r.jsx)("p",{style:{margin:"0 0 8px",fontSize:"10px",color:"#94a3b8"},children:"window.queryLocalFonts() \u2014 Chrome 103+"}),Z.length>0?(0,r.jsxs)("select",{value:t.localFont,onChange:l=>o("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:h?"44px":"36px"},children:[(0,r.jsx)("option",{value:"",children:"System default"}),Z.map(l=>(0,r.jsx)("option",{value:l,style:{fontFamily:l},children:l},l))]}):(0,r.jsx)("p",{style:{margin:0,fontSize:"11px",color:"#94a3b8"},children:"Allow font access when Chrome prompts you."})]}),(0,r.jsx)(A,{}),(0,r.jsxs)("div",{style:{padding:"10px 18px 14px"},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:"10px"},children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{style:{margin:0,fontSize:"12px",fontWeight:500,color:"#0f172a"},children:"\u{1F4CF} Text size"}),(0,r.jsx)("p",{style:{margin:0,fontSize:"10px",color:"#94a3b8"},children:"Scales all text on the page"})]}),(0,r.jsxs)("span",{style:{fontSize:"12px",fontWeight:600,color:"#0d9488",background:"#f0fdfa",padding:"2px 8px",borderRadius:"99px"},children:[t.fontScale,"%"]})]}),(0,r.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[(0,r.jsx)("button",{onClick:()=>{let l=D.indexOf(t.fontScale);l>0&&o("fontScale",D[l-1])},disabled:t.fontScale<=80,"aria-label":"Decrease text size",style:{width:h?"44px":"30px",height:h?"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"}),(0,r.jsx)("div",{style:{flex:1,display:"flex",gap:"3px"},children:D.map(l=>(0,r.jsx)("button",{onClick:()=>o("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))}),(0,r.jsx)("button",{onClick:()=>{let l=D.indexOf(t.fontScale);l<D.length-1&&o("fontScale",D[l+1])},disabled:t.fontScale>=130,"aria-label":"Increase text size",style:{width:h?"44px":"30px",height:h?"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:"+"})]})]}),(0,r.jsx)(A,{}),(0,r.jsx)(G,{label:"\u{1F310} Translate",color:"#7c3aed",badge:"Gemini Nano",concept:"Chrome Translation API \u2014 on device, no internet after setup"}),(0,r.jsx)(J,{steps:["Enable Gemini Nano first","Pick your language","Full page translates instantly"]}),(0,r.jsxs)("div",{style:{padding:"6px 18px 12px"},children:[(0,r.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px"},children:oe.slice(0,h?8:18).map(l=>(0,r.jsx)("button",{onClick:()=>o("translateLanguage",l.code),"aria-pressed":t.translateLanguage===l.code,disabled:!a,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:a?"pointer":"not-allowed",opacity:a?1:.5,minHeight:h?"36px":"auto"},children:l.label},l.code))}),!a&&(0,r.jsx)("p",{style:{margin:"6px 0 0",fontSize:"10px",color:"#94a3b8"},children:"Enable Gemini Nano using the setup guide above."})]}),(0,r.jsx)(A,{}),(0,r.jsx)(G,{label:"\u{1F4AC} Ask This Page",color:"#0d9488",badge:ee,concept:"RAG \u2014 Retrieval Augmented Generation. Works on all devices including mobile."}),(0,r.jsx)(J,{steps:["Type any question about this page","Press Ask or hit Enter",p==="transformers"?"Transformers.js answers \u2014 works on mobile, offline":"Gemini Nano reads page and answers privately","Zero cost. No data leaves your device."]}),(0,r.jsxs)("div",{style:{margin:"0 18px 8px",padding:"6px 10px",background:p==="gemini"?"#f0fdfa":p==="transformers"?"#f5f3ff":"#f8fafc",borderRadius:"8px",border:`0.5px solid ${p==="gemini"?"#99f6e4":p==="transformers"?"#c4b5fd":"#e2e8f0"}`,fontSize:"10px",color:p==="gemini"?"#0f766e":p==="transformers"?"#7c3aed":"#94a3b8"},children:[p==="gemini"&&"\u2705 Using Gemini Nano \u2014 on device, private, instant",p==="transformers"&&"\u2705 Using Transformers.js \u2014 works on mobile and all browsers",!p&&"\u23F3 Detecting AI engine...",p==="transformers"&&E==="loading"&&" \xB7 Loading model...",p==="transformers"&&E==="ready"&&" \xB7 Model ready \u2705"]}),(0,r.jsxs)("div",{style:{padding:"0 18px 14px"},children:[(0,r.jsxs)("div",{style:{display:"flex",gap:"6px",marginBottom:"8px"},children:[(0,r.jsx)("input",{type:"text",value:M,onChange:l=>H(l.target.value),onKeyDown:l=>{l.key==="Enter"&&y()},placeholder:"e.g. What does this page do?",disabled:w||!p,"aria-label":"Ask a question about this page",style:{flex:1,padding:"8px 10px",borderRadius:"8px",border:"1px solid #e2e8f0",fontSize:"12px",color:"#0f172a",background:p?"#fff":"#f8fafc",outline:"none",height:h?"44px":"36px"}}),(0,r.jsx)("button",{onClick:y,disabled:w||!M.trim()||!p,"aria-label":"Ask question",style:{padding:"8px 14px",borderRadius:"8px",border:"none",background:p&&M.trim()&&!w?"#0d9488":"#e2e8f0",color:p&&M.trim()&&!w?"#fff":"#94a3b8",fontSize:"12px",fontWeight:600,cursor:p&&M.trim()&&!w?"pointer":"not-allowed",flexShrink:0,height:h?"44px":"36px",minWidth:"52px",transition:"background 0.2s"},children:w?j:"Ask"})]}),R&&(0,r.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"10px 12px",background:"#f0fdfa",border:"1px solid #99f6e4",borderRadius:"8px",fontSize:"12px",color:"#0f766e",lineHeight:1.6,maxHeight:"180px",overflowY:"auto"},children:[(0,r.jsx)("strong",{style:{display:"block",marginBottom:"4px",fontSize:"11px",color:"#0d9488"},children:"\u{1F4AC} Answer"}),R,(0,r.jsx)("button",{onClick:()=>{P(""),H("")},style:{display:"block",marginTop:"6px",background:"none",border:"none",color:"#94a3b8",fontSize:"10px",cursor:"pointer",padding:0},children:"Clear"})]})]}),n&&(0,r.jsx)("div",{role:"status",style:{margin:"0 14px 10px",padding:"8px 12px",background:"#f0fdfa",border:"1px solid #99f6e4",borderRadius:"8px",fontSize:"12px",color:"#0f766e",fontWeight:500,fontFamily:"monospace"},children:n.fixed>0?`\u2713 ${n.fixed} fixes \xB7 ${n.scanned} nodes \xB7 ${n.renderTime}ms \xB7 Score: ${n.score}/100`:`\u2713 0 auto-fixes needed \xB7 ${n.scanned} nodes \xB7 ${n.renderTime}ms`}),(0,r.jsxs)("div",{style:{display:"flex",gap:"8px",padding:"12px 14px 14px",position:h?"sticky":"relative",bottom:h?0:"auto",background:"#fff",borderTop:"1px solid #f1f5f9"},children:[(0,r.jsx)("button",{onClick:g,style:{flex:1,padding:h?"12px 0":"8px 0",fontSize:"13px",fontWeight:500,borderRadius:"9px",border:"1px solid #e2e8f0",background:"#fff",color:"#64748b",cursor:"pointer"},children:"Reset"}),(0,r.jsx)("button",{onClick:c,style:{flex:2,padding:h?"12px 0":"8px 0",fontSize:"13px",fontWeight:600,borderRadius:"9px",border:"none",background:"#0d9488",color:"#fff",cursor:"pointer"},children:"Apply settings"})]})]})});Ie.displayName="WidgetPanel";de();var b=require("react/jsx-runtime");async function rn(){try{if(typeof window>"u")return!1;let e=window;if(e.LanguageModel)try{if(typeof e.LanguageModel.availability=="function"){let n=await e.LanguageModel.availability();if(n==="readily"||n==="available"||n==="downloadable")return!0}else return!0}catch{}if(e.Summarizer)try{let n=await e.Summarizer.availability?.();if(!n||n==="readily"||n==="available")return!0}catch{}if(e.Rewriter)try{let n=await e.Rewriter.availability?.();if(!n||n==="readily"||n==="available")return!0}catch{}if(e.Writer)try{let n=await e.Writer.availability?.();if(!n||n==="readily"||n==="available")return!0}catch{}let t=e.ai||globalThis.ai;if(t){if(t.languageModel?.availability)try{let n=await t.languageModel.availability();if(n==="readily"||n==="available")return!0}catch{}if(t.languageModel&&typeof t.languageModel.create=="function"||t.summarizer||t.rewriter||t.writer||t.languageModel)return!0}return!!(e.Translator||e.translation?.canTranslate)}catch{return!1}}function ue({position:e="left",children:t,config:n={},showRag:i=!1}){let[a,s]=(0,m.useState)(!1),[o,c]=(0,m.useState)(Re),[g,u]=(0,m.useState)(null),[k,h]=(0,m.useState)(!1),[q,Z]=(0,m.useState)(!1),[pe,M]=(0,m.useState)(!1),H=m.default.useRef(null),[R,P]=(0,m.useState)(!1),[w,_]=(0,m.useState)(""),[p,I]=(0,m.useState)(""),[E,W]=(0,m.useState)(!1),[y,ee]=(0,m.useState)(null),[j,V]=(0,m.useState)("idle");(0,m.useEffect)(()=>{if(typeof window>"u")return;let d=window;!!(d.LanguageModel||d.ai?.languageModel)&&q?ee("gemini"):Y()&&ee("transformers")},[q]),(0,m.useEffect)(()=>{if(y!=="transformers")return;let d=setInterval(()=>V(U()),500);return()=>clearInterval(d)},[y]);let l=(0,m.useCallback)(async()=>{if(!(!w.trim()||E)){if(!y){I("\u26A0\uFE0F No AI engine available on this device.");return}W(!0),I("");try{let d;if(y==="gemini"){let{askPage:v}=await Promise.resolve().then(()=>(Le(),ct));d=await v(w)}else{V("loading");let{askPageWithTransformers:v}=await Promise.resolve().then(()=>(de(),ft));d=await v(w),V("ready")}I(d.success&&d.answer?d.answer.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/#+\s/g,"").trim():"\u26A0\uFE0F "+(d.error||"No answer found."))}catch{I("\u26A0\uFE0F Something went wrong. Please try again.")}W(!1)}},[w,E,y]);(0,m.useEffect)(()=>{if(typeof window>"u")return;let v=setTimeout(async()=>{let K=window;console.log("yuktai: Checking AI APIs..."),console.log("yuktai: window.LanguageModel =",K.LanguageModel);let He=await rn();Z(He),console.log(He?"yuktai: Chrome Built-in AI detected \u2705":"yuktai: Chrome Built-in AI not detected \u2014 Transformers.js will handle RAG on mobile"),M(!!(K.SpeechRecognition||K.webkitSpeechRecognition))},800);return()=>clearTimeout(v)},[]),(0,m.useEffect)(()=>{if(!(typeof window>"u"))try{let d=localStorage.getItem("yuktai-a11y-prefs");d&&c(v=>({...v,...JSON.parse(d)}))}catch{}},[]);let F=(0,m.useCallback)(async d=>{let v={enabled:!0,highContrast:d.highContrast,darkMode:d.darkMode,reduceMotion:d.reduceMotion,largeTargets:d.largeTargets,speechEnabled:d.speechEnabled,autoFix:d.autoFix,dyslexiaFont:d.dyslexiaFont,localFont:d.localFont,fontSizeMultiplier:d.fontScale/100,colorBlindMode:d.colorBlindMode,showAuditBadge:d.showAuditBadge,showSkipLinks:!0,showPreferencePanel:!1,plainEnglish:d.plainEnglish,summarisePage:d.summarisePage,translateLanguage:d.translateLanguage,voiceControl:d.voiceControl,smartLabels:d.smartLabels,...n};await T.execute(v),u(T.applyFixes(v)),h(!0)},[n]),fe=(0,m.useCallback)(async()=>{try{localStorage.setItem("yuktai-a11y-prefs",JSON.stringify(o))}catch{}await F(o),s(!1)},[o,F]),me=(0,m.useCallback)(()=>{c(Re);try{localStorage.removeItem("yuktai-a11y-prefs")}catch{}let d=document.documentElement;["data-yuktai-high-contrast","data-yuktai-dark","data-yuktai-reduce-motion","data-yuktai-large-targets","data-yuktai-keyboard","data-yuktai-dyslexia"].forEach(v=>d.removeAttribute(v)),document.body.style.filter="",document.body.style.fontFamily="",document.documentElement.style.fontSize="",u(null),h(!1)},[]),ge=(0,m.useCallback)((d,v)=>{c(K=>({...K,[d]:v}))},[]);(0,m.useEffect)(()=>{let d=v=>{v.key==="Escape"&&(a&&s(!1),R&&P(!1))};return window.addEventListener("keydown",d),()=>window.removeEventListener("keydown",d)},[a,R]),(0,m.useEffect)(()=>{a&&H.current&&T.trapFocus(H.current)},[a]);let gt=y==="transformers"&&j==="loading"?"Loading AI... (first time only)":"...",ze=y==="gemini"?"Gemini Nano \xB7 On device \xB7 Instant":y==="transformers"?"Transformers.js \xB7 All devices \xB7 Offline":"Detecting engine...",bt={position:"fixed",bottom:"24px",[e]:"24px",zIndex:9998,width:"52px",height:"52px",borderRadius:"50%",background:k?"#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"},yt={position:"fixed",bottom:"84px",[e]:"24px",zIndex:9998,width:"52px",height:"52px",borderRadius:"50%",background:R?"#7c3aed":"#6d28d9",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(0,b.jsxs)(b.Fragment,{children:[t,i&&(0,b.jsx)("button",{style:yt,"aria-label":"Ask a question about this page","aria-haspopup":"dialog","aria-expanded":R,title:`Ask this page \xB7 ${ze}`,onClick:()=>{P(d=>!d),s(!1)},onMouseEnter:d=>{d.currentTarget.style.transform="scale(1.08)"},onMouseLeave:d=>{d.currentTarget.style.transform="scale(1)"},children:"\u{1F4AC}"}),i&&R&&(0,b.jsxs)("div",{role:"dialog","aria-modal":"true","aria-label":"Ask this page","data-yuktai-panel":"true",style:{position:"fixed",bottom:"148px",[e]:"24px",zIndex:9999,width:"300px",maxWidth:"calc(100vw - 48px)",background:"#fff",border:"1px solid #e2e8f0",borderRadius:"16px",boxShadow:"0 8px 32px rgba(0,0,0,0.12)",fontFamily:"system-ui,-apple-system,sans-serif",padding:"14px"},children:[(0,b.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:"10px"},children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("p",{style:{margin:"0 0 2px",fontSize:"13px",fontWeight:600,color:"#0f172a"},children:"\u{1F4AC} Ask this page"}),(0,b.jsx)("p",{style:{margin:0,fontSize:"10px",color:y==="gemini"?"#0d9488":"#7c3aed"},children:ze}),y==="transformers"&&j==="loading"&&(0,b.jsx)("p",{style:{margin:"2px 0 0",fontSize:"9px",color:"#94a3b8"},children:"Downloading AI model \u2014 first time only (~90MB)"}),y==="transformers"&&j==="ready"&&(0,b.jsx)("p",{style:{margin:"2px 0 0",fontSize:"9px",color:"#0d9488"},children:"Model ready \u2705 \u2014 works offline now"})]}),(0,b.jsx)("button",{onClick:()=>P(!1),"aria-label":"Close ask panel",style:{background:"none",border:"none",cursor:"pointer",color:"#94a3b8",fontSize:"18px",lineHeight:1,padding:"2px",borderRadius:"4px"},children:"\xD7"})]}),(0,b.jsxs)("div",{style:{display:"flex",gap:"6px",marginBottom:"8px"},children:[(0,b.jsx)("input",{type:"text",value:w,onChange:d=>_(d.target.value),onKeyDown:d=>{d.key==="Enter"&&l()},placeholder:"e.g. What does this page do?",disabled:E||!y,"aria-label":"Ask a question about this page",style:{flex:1,padding:"8px 10px",borderRadius:"8px",border:"1px solid #e2e8f0",fontSize:"12px",color:"#0f172a",background:y?"#fff":"#f8fafc",outline:"none",height:"36px"}}),(0,b.jsx)("button",{onClick:l,disabled:E||!w.trim()||!y,"aria-label":"Submit question",style:{padding:"8px 12px",borderRadius:"8px",border:"none",background:y&&w.trim()&&!E?"#7c3aed":"#e2e8f0",color:y&&w.trim()&&!E?"#fff":"#94a3b8",fontSize:"12px",fontWeight:600,cursor:y&&w.trim()&&!E?"pointer":"not-allowed",height:"36px",minWidth:"48px",transition:"background 0.2s"},children:E?gt:"Ask"})]}),p&&(0,b.jsxs)("div",{style:{padding:"10px",background:"#f5f3ff",borderRadius:"8px",fontSize:"12px",color:"#4c1d95",lineHeight:1.6,maxHeight:"180px",overflowY:"auto"},children:[(0,b.jsx)("strong",{style:{display:"block",marginBottom:"4px",fontSize:"11px",color:"#7c3aed"},children:"\u{1F4AC} Answer"}),p,(0,b.jsx)("button",{onClick:()=>{I(""),_("")},style:{display:"block",marginTop:"6px",background:"none",border:"none",color:"#94a3b8",fontSize:"10px",cursor:"pointer",padding:0},children:"Clear"})]}),!y&&(0,b.jsx)("p",{style:{margin:"4px 0 0",fontSize:"10px",color:"#94a3b8"},children:"Detecting AI engine..."})]}),(0,b.jsx)("button",{style:bt,"aria-label":"Open accessibility preferences","aria-haspopup":"dialog","aria-expanded":a,"data-yuktai-pref-toggle":"true",onClick:()=>{s(d=>!d),P(!1)},onMouseEnter:d=>{d.currentTarget.style.transform="scale(1.08)"},onMouseLeave:d=>{d.currentTarget.style.transform="scale(1)"},children:"\u267F"}),a&&(0,b.jsx)(Ie,{ref:H,position:e,settings:o,report:g,isActive:k,aiSupported:q,voiceSupported:pe,set:ge,onApply:fe,onReset:me,onClose:()=>s(!1)})]})}var X={name:"ai.text",async execute(e){return`\u{1F916} YuktAI says: ${e}`}};var Q={name:"voice.text",async execute(e){return!e||e.trim()===""?"\u{1F3A4} No speech detected":`\u{1F3A4} You said: ${e}`}};var z=class{plugins=new Map;register(t,n){if(!n||typeof n.execute!="function")throw new Error(`Invalid plugin: ${t}`);this.plugins.set(t,n)}use(t){return this.plugins.get(t)}async run(t,n){try{let i=this.use(t);if(!i)throw new Error(`Plugin not found: ${t}`);return await i.execute(n)}catch(i){throw console.error(`[YuktAI Runtime Error in ${t}]:`,i),i}}getPlugins(){return Array.from(this.plugins.keys())}};function sn(){if(typeof globalThis>"u")return new z;if(!globalThis.__yuktai_runtime__){let e=new z;e.register(T.name,T),e.register(X.name,X),e.register(Q.name,Q),globalThis.__yuktai_runtime__=e}return globalThis.__yuktai_runtime__}var mt=typeof window<"u"?sn():new z,ln={wcagPlugin:T,list(){return mt.getPlugins()},use(e){return mt.use(e)},fix(e){return T.applyFixes({enabled:!0,autoFix:!0,...e})},scan(){return T.scan()}};0&&(module.exports={Runtime,YuktAI,YuktAIWrapper,aiPlugin,voicePlugin,wcag,wcagPlugin});
|