@yuktishaalaa/yuktai 2.0.9 → 2.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.cjs +287 -12
- package/dist/index.d.cts +114 -0
- package/dist/index.d.ts +114 -0
- package/dist/index.js +287 -12
- package/dist/renderer.global.js +270 -12
- package/package.json +17 -23
package/dist/renderer.global.js
CHANGED
|
@@ -1,12 +1,270 @@
|
|
|
1
|
-
"use strict";var YuktAI=(()=>{var g=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var T=(n,r)=>{for(var b in r)g(n,b,{get:r[b],enumerable:!0})},M=(n,r,b,u)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of S(r))!k.call(n,a)&&a!==b&&g(n,a,{get:()=>r[a],enumerable:!(u=w(r,a))||u.enumerable});return n};var E=n=>M(g({},"__esModule",{value:!0}),n);var I={};T(I,{wcagPlugin:()=>q});var d=null,m=null,f={deuteranopia:"yuktai-cb-d",protanopia:"yuktai-cb-p",tritanopia:"yuktai-cb-t"},y=new Set(["h1","h2","h3","h4","h5","h6"]),h=new Set(["input","select","textarea"]),v=new Set(["button","a","input","select","textarea","details","summary"]),C=new Set(["video","audio"]),L=new Set(["ul","ol","dl"]);var $=new Set(["span","strong","em","b","i","u","s","small","mark","del","ins","sub","sup","abbr","cite","code","kbd","samp","var","time","q"]),p={nav:"navigation",header:"banner",footer:"contentinfo",main:"main",aside:"complementary"},q={name:"yuktai-a11y",version:"1.0.0",observer:null,async execute(n){if(!n.enabled)return this.stopObserver(),"yuktai-a11y: disabled.";let r=this.applyFixes(n);return n.autoFix&&this.startObserver(n),`yuktai-a11y: ${r.fixed} fixes applied across ${r.scanned} nodes in ${r.renderTime}ms.`},scan(){let n={fixed:0,scanned:0,renderTime:0,details:[]};if(typeof document>"u")return n;let r=performance.now(),b=document.querySelectorAll("*");n.scanned=b.length;let u=(a,l,e,t)=>n.details.push({tag:a,fix:l,severity:e,element:t.outerHTML.slice(0,100)});return b.forEach(a=>{let l=a,e=l.tagName.toLowerCase();(e==="a"||e==="button")&&!l.innerText?.trim()&&!l.getAttribute("aria-label")&&u(e,"needs aria-label (empty)","critical",l),e==="img"&&!l.hasAttribute("alt")&&u(e,"needs alt text","serious",l),h.has(e)&&!l.getAttribute("aria-label")&&!l.getAttribute("aria-labelledby")&&u(e,"needs aria-label","serious",l),e==="iframe"&&!l.getAttribute("title")&&!l.getAttribute("aria-label")&&u(e,"iframe needs title","serious",l),C.has(e)&&!a.querySelector("track")&&!l.getAttribute("aria-label")&&u(e,"media needs captions/aria-label","serious",l),y.has(e)&&!l.innerText?.trim()&&!l.getAttribute("aria-label")&&u(e,"empty heading","moderate",l)}),n.fixed=n.details.length,n.renderTime=parseFloat((performance.now()-r).toFixed(2)),n},applyFixes(n){let r={fixed:0,scanned:0,renderTime:0,details:[]};if(typeof document>"u")return r;let b=performance.now(),u=document.querySelectorAll("*");r.scanned=u.length;let a=(l,e,t,x)=>{r.details.push({tag:l,fix:e,severity:t,element:x.outerHTML.slice(0,100)}),r.fixed++};if(u.forEach(l=>{let e=l,t=e.tagName.toLowerCase();if(t==="html"&&!e.getAttribute("lang")&&(e.setAttribute("lang","en"),a(t,'lang="en" added to <html>',"critical",e)),t==="head"&&!document.title&&(document.title=document.querySelector("h1")?.innerText?.trim()||"Page",a(t,`document.title set to "${document.title}"`,"serious",e)),t==="meta"){let i=e.getAttribute("name"),o=e.getAttribute("content")||"";i==="viewport"&&o.includes("user-scalable=no")&&(e.setAttribute("content",o.replace("user-scalable=no","user-scalable=yes")),a(t,"user-scalable=yes restored","serious",e)),i==="viewport"&&/maximum-scale=1(?:[^0-9]|$)/.test(o)&&(e.setAttribute("content",o.replace(/maximum-scale=1(?=[^0-9]|$)/,"maximum-scale=5")),a(t,"maximum-scale=5 restored","serious",e))}if(t==="body"&&!document.querySelector("[data-yuktai-skip]")){let i=document.createElement("a");i.setAttribute("href","#main-content"),i.setAttribute("data-yuktai-skip","true"),i.setAttribute("aria-label","Skip to main content"),i.textContent="Skip to main content",i.style.cssText="position:fixed;top:-40px;left:0;background:#0d9488;color:#fff;padding:8px 16px;z-index:99999;font-family:system-ui;font-size:14px;border-radius:0 0 4px 0;text-decoration:none;transition:top 0.2s;",i.addEventListener("focus",()=>{i.style.top="0"}),i.addEventListener("blur",()=>{i.style.top="-40px"}),e.insertBefore(i,e.firstChild),a(t,"skip-to-content link injected","minor",e);let o=document.querySelector("main,[role='main']");o&&!o.getAttribute("tabindex")&&o.setAttribute("tabindex","-1")}if(y.has(t)&&(!e.innerText?.trim()&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label",`${t.toUpperCase()} section`),a(t,`aria-label="${t.toUpperCase()} section" (empty heading)`,"moderate",e)),e.hasAttribute("onclick")&&!e.getAttribute("tabindex")&&(e.setAttribute("tabindex","0"),e.onkeydown||(e.onkeydown=i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),e.click())}),a(t,"tabindex=0 + keydown (clickable heading)","minor",e))),t==="p"&&e.getAttribute("dir")==="rtl"&&!e.getAttribute("lang")&&!document.documentElement.getAttribute("lang")&&(e.setAttribute("lang","ar"),a(t,'lang="ar" (rtl paragraph)',"moderate",e)),t==="img"&&(e.hasAttribute("alt")||(e.setAttribute("alt",""),e.setAttribute("aria-hidden","true"),a(t,'alt="" aria-hidden="true"',"serious",e)),e.getAttribute("role")==="presentation"&&e.getAttribute("alt")!==""&&(e.setAttribute("alt",""),a(t,'alt="" (role=presentation)',"minor",e))),t==="area"&&!e.getAttribute("alt")){let i=e.getAttribute("title")||e.getAttribute("href")||"map area";e.setAttribute("alt",i),a(t,`alt="${i}" on <area>`,"serious",e)}if(t==="svg"){if(!e.getAttribute("aria-hidden")&&!e.getAttribute("aria-label")&&!l.querySelector("title"))if(!e.getAttribute("role")||e.getAttribute("role")==="img"){let i=document.createElementNS("http://www.w3.org/2000/svg","title");i.textContent="graphic",e.prepend(i),e.setAttribute("role","img"),a(t,'role="img" + <title> injected',"moderate",e)}else e.setAttribute("aria-hidden","true"),a(t,'aria-hidden="true" (decorative svg)',"minor",e);e.getAttribute("focusable")||e.setAttribute("focusable","false")}if(t==="canvas"&&(e.getAttribute("role")||(e.setAttribute("role","img"),a(t,'role="img"',"serious",e)),e.getAttribute("aria-label")||(e.setAttribute("aria-label",e.getAttribute("title")||"canvas graphic"),a(t,"aria-label added to canvas","serious",e))),(t==="object"||t==="embed")&&!e.getAttribute("aria-label")&&!e.getAttribute("title")&&(e.setAttribute("aria-label",`embedded ${t} content`),a(t,`aria-label added to <${t}>`,"moderate",e)),t==="video"&&!l.querySelector("track")&&!e.getAttribute("aria-label")&&(e.setAttribute("aria-label",e.getAttribute("title")||"video player"),a(t,"aria-label added (no captions track)","serious",e)),t==="audio"&&!l.querySelector("track")&&!e.getAttribute("aria-label")&&(e.setAttribute("aria-label",e.getAttribute("title")||"audio player"),a(t,"aria-label added to audio","serious",e)),t==="iframe"&&!e.getAttribute("title")&&!e.getAttribute("aria-label")&&(e.setAttribute("title","embedded content"),e.setAttribute("aria-label","embedded content"),a(t,'title + aria-label="embedded content"',"serious",e)),t==="figure"&&!l.querySelector("figcaption")&&!e.getAttribute("aria-label")){let o=l.querySelector("img")?.getAttribute("alt");o&&(e.setAttribute("aria-label",o),a(t,"aria-label from inner img alt","minor",e))}if(t==="button"){if(!e.innerText?.trim()&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")){let i=e.getAttribute("title")||e.getAttribute("data-label")||"button";e.setAttribute("aria-label",i),a(t,`aria-label="${i}" (empty button)`,"critical",e)}e.hasAttribute("disabled")&&!e.getAttribute("aria-disabled")&&(e.setAttribute("aria-disabled","true"),r.fixed++)}if(t==="a"){let i=e;if(!e.innerText?.trim()&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")){let o=e.getAttribute("title")||"link";e.setAttribute("aria-label",o),a(t,`aria-label="${o}" (empty link)`,"critical",e)}if(i.target==="_blank"){i.rel?.includes("noopener")||(i.rel="noopener noreferrer",r.fixed++);let o=i.getAttribute("aria-label")||i.innerText?.trim()||"link";o.includes("opens in new window")||(i.setAttribute("aria-label",`${o} (opens in new window)`),a(t,"aria-label: new-window warning","moderate",e))}!i.href&&!i.getAttribute("role")&&!i.getAttribute("tabindex")&&(i.setAttribute("role","button"),i.setAttribute("tabindex","0"),a(t,'role="button" tabindex=0 (href-less link)',"serious",e))}if((e.hasAttribute("onclick")||typeof window<"u"&&window.getComputedStyle(e).cursor==="pointer")&&!v.has(t)&&(e.getAttribute("role")||(e.setAttribute("role","button"),a(t,'role="button" (clickable non-interactive)',"serious",e)),e.tabIndex<0&&(e.tabIndex=0,r.fixed++),e.onkeydown||(e.onkeydown=i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),e.click())})),h.has(t)){let i=e;if(!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")){let o=e.getAttribute("placeholder")||e.getAttribute("name")||e.getAttribute("title")||t;e.setAttribute("aria-label",o),a(t,`aria-label="${o}"`,"serious",e)}if(e.hasAttribute("required")&&!e.getAttribute("aria-required")&&(e.setAttribute("aria-required","true"),r.fixed++),e.hasAttribute("disabled")&&!e.getAttribute("aria-disabled")&&(e.setAttribute("aria-disabled","true"),r.fixed++),e.hasAttribute("readonly")&&!e.getAttribute("aria-readonly")&&(e.setAttribute("aria-readonly","true"),r.fixed++),t==="input"&&!i.autocomplete){let o=i.name||"";i.type==="email"||o.includes("email")?(i.autocomplete="email",r.fixed++):i.type==="tel"||o.includes("tel")?(i.autocomplete="tel",r.fixed++):i.type==="password"?(i.autocomplete="current-password",r.fixed++):o.includes("firstname")||o.includes("fname")?(i.autocomplete="given-name",r.fixed++):o.includes("lastname")||o.includes("lname")?(i.autocomplete="family-name",r.fixed++):o==="name"||o.includes("fullname")?(i.autocomplete="name",r.fixed++):o.includes("zip")||o.includes("postal")?(i.autocomplete="postal-code",r.fixed++):o.includes("city")?(i.autocomplete="address-level2",r.fixed++):o.includes("country")&&(i.autocomplete="country",r.fixed++)}t==="input"&&i.type==="image"&&!e.getAttribute("alt")&&(e.setAttribute("alt",e.getAttribute("value")||"submit"),a(t,"alt added to input[type=image]","serious",e)),t==="input"&&i.type==="range"&&(e.getAttribute("aria-valuemin")||e.setAttribute("aria-valuemin",i.min||"0"),e.getAttribute("aria-valuemax")||e.setAttribute("aria-valuemax",i.max||"100"),e.getAttribute("aria-valuenow")||e.setAttribute("aria-valuenow",i.value||"50"),r.fixed++)}if(t==="fieldset"&&!l.querySelector("legend")&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label","form group"),a(t,'aria-label="form group" (no legend)',"moderate",e)),t==="label"){let i=e.getAttribute("for"),o=l.querySelector("input,select,textarea");!i&&!o&&!e.getAttribute("aria-label")&&a(t,"label not associated with any control","moderate",e)}if(t==="table"&&(!l.querySelector("th")&&!e.getAttribute("role")&&(e.setAttribute("role","grid"),a(t,'role="grid" (no <th>)',"serious",e)),!l.querySelector("caption")&&!e.getAttribute("aria-label")&&!e.getAttribute("summary")&&(e.setAttribute("aria-label","data table"),a(t,'aria-label="data table" (no caption)',"moderate",e))),t==="th"&&!e.getAttribute("scope")){let i=e.closest("thead")!==null;e.setAttribute("scope",i?"col":"row"),a(t,`scope="${i?"col":"row"}"`,"moderate",e)}if(L.has(t)&&(e.getAttribute("role")==="presentation"&&(l.querySelectorAll("li").forEach(i=>{i.getAttribute("role")||i.setAttribute("role","presentation")}),r.fixed++),(t==="ul"||t==="ol")&&!e.getAttribute("aria-label"))){let i=e.closest("nav");i&&(e.setAttribute("aria-label",i.getAttribute("aria-label")||"navigation list"),a(t,"aria-label from parent nav","minor",e))}if(t==="dt"&&!e.getAttribute("aria-label")){let i=e.nextElementSibling;(!i||i.tagName.toLowerCase()!=="dd")&&(e.setAttribute("aria-label",e.innerText?.trim()||"term"),a(t,"aria-label on <dt> (no following <dd>)","minor",e))}if(p[t]&&!e.getAttribute("role")&&(e.setAttribute("role",p[t]),a(t,`role="${p[t]}"`,"minor",e)),["nav","section","article","aside"].includes(t)){let i=l.parentElement?.querySelectorAll(t);if(i&&i.length>1&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")){let c=l.querySelector("h1,h2,h3,h4,h5,h6")?.textContent?.trim();c&&(e.setAttribute("aria-label",c),a(t,"aria-label from inner heading","moderate",e))}}if(t==="details"&&!l.querySelector("summary")){let i=document.createElement("summary");i.textContent=e.getAttribute("aria-label")||"More details",e.prepend(i),a(t,"<summary> injected","moderate",e)}if(t==="summary"&&!e.innerText?.trim()&&!e.getAttribute("aria-label")&&(e.setAttribute("aria-label","Toggle details"),a(t,'aria-label="Toggle details" (empty summary)',"moderate",e)),t==="dialog"){let i=e.getAttribute("role");if(i&&i!=="dialog"&&(e.setAttribute("role","dialog"),a(t,'role corrected to "dialog"',"serious",e)),!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")){let c=l.querySelector("h1,h2,h3,h4,h5,h6")?.textContent?.trim()||"dialog";e.setAttribute("aria-label",c),a(t,"aria-label added to dialog","serious",e)}}if(t==="abbr"&&!e.getAttribute("title")&&(e.setAttribute("title",e.innerText?.trim()||"abbreviation"),a(t,"title added to <abbr>","minor",e)),t==="time"&&!e.getAttribute("datetime")&&e.innerText?.trim()&&(e.setAttribute("datetime",e.innerText.trim()),a(t,`datetime="${e.innerText.trim()}" added`,"minor",e)),t==="mark"&&!e.getAttribute("aria-label")&&(e.setAttribute("aria-label",`highlighted: ${e.innerText?.trim()?.slice(0,60)}`),a(t,"aria-label added to <mark>","minor",e)),t==="meter"&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label",e.getAttribute("title")||"meter"),a(t,"aria-label added to <meter>","moderate",e)),t==="progress"){!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label",e.getAttribute("title")||"progress"),a(t,"aria-label added to <progress>","moderate",e));let i=e;e.getAttribute("aria-valuenow")||e.setAttribute("aria-valuenow",String(i.value)),e.getAttribute("aria-valuemax")||e.setAttribute("aria-valuemax",String(i.max||1)),r.fixed++}let s=e.getAttribute("role")||"";if(s==="tab"&&!e.getAttribute("aria-selected")&&(e.setAttribute("aria-selected","false"),r.fixed++),s==="tabpanel"&&(!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label","tab panel"),a(t,'aria-label="tab panel"',"moderate",e)),e.getAttribute("tabindex")||(e.setAttribute("tabindex","0"),r.fixed++)),["alert","status","log","marquee"].includes(s)){if(!e.getAttribute("aria-live")){let i=s==="alert"?"assertive":"polite";e.setAttribute("aria-live",i),a(t,`aria-live="${i}" on role=${s}`,"moderate",e)}e.getAttribute("aria-atomic")||(e.setAttribute("aria-atomic","true"),r.fixed++)}s==="tooltip"&&!e.getAttribute("aria-live")&&(e.setAttribute("aria-live","polite"),r.fixed++),(s==="menu"||s==="menubar")&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label","menu"),a(t,'aria-label="menu"',"moderate",e)),s==="menuitem"&&e.tabIndex<0&&(e.tabIndex=-1,r.fixed++),s==="listbox"&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label","listbox"),a(t,'aria-label="listbox"',"moderate",e)),s==="option"&&!e.getAttribute("aria-selected")&&(e.setAttribute("aria-selected","false"),r.fixed++),s==="slider"&&(e.getAttribute("aria-valuemin")||e.setAttribute("aria-valuemin","0"),e.getAttribute("aria-valuemax")||e.setAttribute("aria-valuemax","100"),e.getAttribute("aria-valuenow")||e.setAttribute("aria-valuenow","50"),r.fixed++),(s==="checkbox"||s==="radio")&&!e.getAttribute("aria-checked")&&(e.setAttribute("aria-checked","false"),a(t,`aria-checked="false" on role=${s}`,"serious",e)),s==="combobox"&&(e.getAttribute("aria-expanded")||(e.setAttribute("aria-expanded","false"),a(t,'aria-expanded="false" on combobox',"serious",e)),e.getAttribute("aria-haspopup")||(e.setAttribute("aria-haspopup","listbox"),r.fixed++)),(s==="grid"||s==="treegrid")&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label","data grid"),a(t,'aria-label="data grid"',"moderate",e)),s==="tree"&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label","tree"),a(t,'aria-label="tree"',"moderate",e)),s==="treeitem"&&l.querySelector('[role="group"]')&&!e.getAttribute("aria-expanded")&&(e.setAttribute("aria-expanded","false"),r.fixed++),s==="spinbutton"&&(e.getAttribute("aria-valuenow")||e.setAttribute("aria-valuenow","0"),e.getAttribute("aria-valuemin")||e.setAttribute("aria-valuemin","0"),e.getAttribute("aria-valuemax")||e.setAttribute("aria-valuemax","100"),r.fixed++);let A=!["html","head","meta","script","style","link","noscript"].includes(t);if(n.highContrast&&A&&!$.has(t)&&(e.style.filter="contrast(1.15) brightness(1.05)"),n.reduceMotion&&A&&(e.style.transition="none",e.style.animation="none"),n.fontSizeMultiplier&&n.fontSizeMultiplier!==1&&A){let i=parseFloat(window.getComputedStyle(e).fontSize);!isNaN(i)&&i>0&&(e.style.fontSize=`${i*n.fontSizeMultiplier}px`)}if(n.colorBlindMode&&n.colorBlindMode!=="none"&&t==="body"){let i=n.colorBlindMode==="achromatopsia"?"grayscale(100%)":`url(#${f[n.colorBlindMode]})`;e.style.filter=i}n.keyboardHints&&(v.has(t)||e.tabIndex>=0)&&(e.style.outline="2px solid #007acc",e.style.outlineOffset="2px")}),n.colorBlindMode&&n.colorBlindMode!=="none"&&!m){let l=document.createElementNS("http://www.w3.org/2000/svg","svg");l.setAttribute("aria-hidden","true"),l.style.cssText="position:absolute;width:0;height:0;overflow:hidden;",l.innerHTML=`
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
"use strict";var YuktAI=(()=>{var E=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var j=Object.prototype.hasOwnProperty;var O=(t,i)=>{for(var n in i)E(t,n,{get:i[n],enumerable:!0})},K=(t,i,n,s)=>{if(i&&typeof i=="object"||typeof i=="function")for(let a of I(i))!j.call(t,a)&&a!==n&&E(t,a,{get:()=>i[a],enumerable:!(s=F(i,a))||s.enumerable});return t};var G=t=>K(E({},"__esModule",{value:!0}),t);var re={};O(re,{wcagPlugin:()=>ae});var w=null,C=null,A=null,$=null,T=null,b=null,m=null,h=null,S=null,g=null,k={deuteranopia:"yuktai-cb-d",protanopia:"yuktai-cb-p",tritanopia:"yuktai-cb-t"},H=new Set(["h1","h2","h3","h4","h5","h6"]),q=new Set(["input","select","textarea"]),W=new Set(["button","a","input","select","textarea","details","summary"]),V=new Set(["video","audio"]),Y=new Set(["ul","ol","dl"]);var L={nav:"navigation",header:"banner",footer:"contentinfo",main:"main",aside:"complementary"};function M(t,i="polite"){if(typeof window>"u"||!g?.speechEnabled||!window.speechSynthesis)return;window.speechSynthesis.cancel();let n=new SpeechSynthesisUtterance(t);n.rate=1,n.pitch=1,n.volume=1;let s=window.speechSynthesis.getVoices();s.length>0&&(n.voice=s[0]),window.speechSynthesis.speak(n)}function R(t,i="info"){if(typeof document>"u")return;let s={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"}}[i];b||(b=document.createElement("div"),b.setAttribute("role","alert"),b.setAttribute("aria-live","assertive"),b.setAttribute("aria-atomic","true"),b.style.cssText=`
|
|
2
|
+
position:fixed;top:80px;right:16px;z-index:999999;
|
|
3
|
+
max-width:320px;width:calc(100% - 32px);
|
|
4
|
+
border-radius:8px;padding:12px 16px;
|
|
5
|
+
display:flex;align-items:center;gap:10px;
|
|
6
|
+
font-family:system-ui,sans-serif;font-size:14px;
|
|
7
|
+
box-shadow:0 4px 12px rgba(0,0,0,0.3);
|
|
8
|
+
transition:transform 0.3s,opacity 0.3s;
|
|
9
|
+
transform:translateX(120%);opacity:0;
|
|
10
|
+
`,document.body.appendChild(b)),b.style.background=s.bg,b.style.border=`1px solid ${s.border}`,b.style.color="#fff",b.innerHTML=`
|
|
11
|
+
<span style="font-size:18px;font-weight:700">${s.icon}</span>
|
|
12
|
+
<span style="flex:1;line-height:1.4">${t}</span>
|
|
13
|
+
<button onclick="this.parentElement.style.transform='translateX(120%)';this.parentElement.style.opacity='0'"
|
|
14
|
+
style="background:none;border:none;color:#fff;cursor:pointer;font-size:18px;padding:0;line-height:1"
|
|
15
|
+
aria-label="Close notification">\xD7</button>
|
|
16
|
+
`,requestAnimationFrame(()=>{b&&(b.style.transform="translateX(0)",b.style.opacity="1")}),setTimeout(()=>{b&&(b.style.transform="translateX(120%)",b.style.opacity="0")},5e3)}function c(t,i="info",n=!0){w&&(w.textContent=t),R(t,i),n&&M(t,i==="error"?"assertive":"polite")}function U(){if(typeof document>"u"||$)return;let t=[{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']"}],i=document.createElement("div");i.setAttribute("data-yuktai-skip-bar","true"),i.setAttribute("role","navigation"),i.setAttribute("aria-label","Skip links"),i.style.cssText=`
|
|
17
|
+
position:fixed;top:0;left:0;right:0;z-index:999999;
|
|
18
|
+
display:flex;gap:4px;padding:4px;
|
|
19
|
+
background:#111;
|
|
20
|
+
transform:translateY(-100%);
|
|
21
|
+
transition:transform 0.2s ease;
|
|
22
|
+
font-family:system-ui,sans-serif;
|
|
23
|
+
`;let n=!1;if(t.forEach(({label:a,selector:l})=>{let e=document.querySelector(l);if(!e)return;n=!0,e.getAttribute("tabindex")||e.setAttribute("tabindex","-1");let r=document.createElement("a");r.href="#",r.textContent=a,r.style.cssText=`
|
|
24
|
+
color:#fff;background:#1a73e8;
|
|
25
|
+
padding:8px 14px;border-radius:4px;
|
|
26
|
+
font-size:13px;font-weight:600;
|
|
27
|
+
text-decoration:none;white-space:nowrap;
|
|
28
|
+
border:2px solid transparent;
|
|
29
|
+
transition:background 0.15s,border-color 0.15s;
|
|
30
|
+
`,r.addEventListener("focus",()=>{i.style.transform="translateY(0)"}),r.addEventListener("blur",()=>{setTimeout(()=>{i.matches(":focus-within")||(i.style.transform="translateY(-100%)")},2e3)}),r.addEventListener("keydown",p=>{(p.key==="Enter"||p.key===" ")&&(p.preventDefault(),e.focus(),e.scrollIntoView({behavior:"smooth",block:"start"}),c(`Jumped to ${a.replace("Skip to ","")}`,"info"),i.style.transform="translateY(-100%)")}),r.addEventListener("click",p=>{p.preventDefault(),e.focus(),e.scrollIntoView({behavior:"smooth",block:"start"}),c(`Jumped to ${a.replace("Skip to ","")}`,"info"),i.style.transform="translateY(-100%)"}),r.addEventListener("mouseover",()=>{r.style.background="#1557b0",r.style.borderColor="#fff"}),r.addEventListener("mouseout",()=>{r.style.background="#1a73e8",r.style.borderColor="transparent"}),i.appendChild(r)}),!n)return;window.innerWidth<768&&(i.style.transform="translateY(0)",i.style.position="sticky"),document.body.insertBefore(i,document.body.firstChild),$=i}function J(){if(typeof document>"u"||document.querySelector("[data-yuktai-focus-style]"))return;let t=document.createElement("style");t.setAttribute("data-yuktai-focus-style","true"),t.textContent=`
|
|
31
|
+
/* WCAG 2.4.11 \u2014 minimum 2px solid focus indicator */
|
|
32
|
+
[data-yuktai-a11y] *:focus-visible {
|
|
33
|
+
outline: 3px solid #1a73e8 !important;
|
|
34
|
+
outline-offset: 3px !important;
|
|
35
|
+
border-radius: 2px !important;
|
|
36
|
+
box-shadow: 0 0 0 6px rgba(26,115,232,0.15) !important;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* High contrast focus */
|
|
40
|
+
[data-yuktai-high-contrast] *:focus-visible {
|
|
41
|
+
outline: 3px solid #ffff00 !important;
|
|
42
|
+
outline-offset: 3px !important;
|
|
43
|
+
box-shadow: 0 0 0 6px rgba(255,255,0,0.2) !important;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* Keyboard hint mode */
|
|
47
|
+
[data-yuktai-keyboard] *:focus {
|
|
48
|
+
outline: 3px solid #ff6b35 !important;
|
|
49
|
+
outline-offset: 3px !important;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* Remove default outline \u2014 replaced by above */
|
|
53
|
+
[data-yuktai-a11y] *:focus:not(:focus-visible) {
|
|
54
|
+
outline: none !important;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Large targets \u2014 WCAG 2.5.8 */
|
|
58
|
+
[data-yuktai-large-targets] button,
|
|
59
|
+
[data-yuktai-large-targets] a,
|
|
60
|
+
[data-yuktai-large-targets] input,
|
|
61
|
+
[data-yuktai-large-targets] select,
|
|
62
|
+
[data-yuktai-large-targets] [role="button"] {
|
|
63
|
+
min-height: 44px !important;
|
|
64
|
+
min-width: 44px !important;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* Reduce motion \u2014 WCAG 2.3.3 */
|
|
68
|
+
[data-yuktai-reduce-motion] *,
|
|
69
|
+
[data-yuktai-reduce-motion] *::before,
|
|
70
|
+
[data-yuktai-reduce-motion] *::after {
|
|
71
|
+
animation-duration: 0.001ms !important;
|
|
72
|
+
transition-duration: 0.001ms !important;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* High contrast mode */
|
|
76
|
+
[data-yuktai-high-contrast] {
|
|
77
|
+
filter: contrast(1.4) brightness(1.05) !important;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Dark mode */
|
|
81
|
+
[data-yuktai-dark] {
|
|
82
|
+
filter: invert(1) hue-rotate(180deg) !important;
|
|
83
|
+
}
|
|
84
|
+
[data-yuktai-dark] img,
|
|
85
|
+
[data-yuktai-dark] video,
|
|
86
|
+
[data-yuktai-dark] canvas {
|
|
87
|
+
filter: invert(1) hue-rotate(180deg) !important;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* Skip link bar responsive */
|
|
91
|
+
@media (max-width: 768px) {
|
|
92
|
+
[data-yuktai-skip-bar] {
|
|
93
|
+
flex-wrap: wrap;
|
|
94
|
+
}
|
|
95
|
+
[data-yuktai-skip-bar] a {
|
|
96
|
+
font-size: 12px !important;
|
|
97
|
+
padding: 6px 10px !important;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* Preference panel responsive */
|
|
102
|
+
@media (max-width: 480px) {
|
|
103
|
+
[data-yuktai-panel] {
|
|
104
|
+
width: 100% !important;
|
|
105
|
+
right: 0 !important;
|
|
106
|
+
bottom: 0 !important;
|
|
107
|
+
border-radius: 16px 16px 0 0 !important;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* Link underline enforcement */
|
|
112
|
+
[data-yuktai-a11y] a:not([role]):not([class]) {
|
|
113
|
+
text-decoration: underline !important;
|
|
114
|
+
}
|
|
115
|
+
`,document.head.appendChild(t),document.documentElement.setAttribute("data-yuktai-a11y","true")}function X(){typeof document>"u"||document.querySelector("[data-yuktai-kb-init]")||(document.documentElement.setAttribute("data-yuktai-kb-init","true"),document.addEventListener("keydown",t=>{let i=document.activeElement;if(!i)return;let n=i.getAttribute("role")||"";if(t.key==="Escape"){let s=i.closest("[role='dialog'],[role='alertdialog']");if(s){s.style.display="none";let l=s.getAttribute("data-yuktai-trigger");l&&document.querySelector(`[data-yuktai-id='${l}']`)?.focus(),c("Dialog closed","info");return}let a=i.closest("[role='menu'],[role='menubar']");a&&(a.style.display="none",c("Menu closed","info"))}if(n==="menuitem"||i.closest("[role='menu'],[role='menubar']")){let s=i.closest("[role='menu'],[role='menubar']");if(!s)return;let a=Array.from(s.querySelectorAll("[role='menuitem']:not([disabled])")),l=a.indexOf(i);t.key==="ArrowDown"||t.key==="ArrowRight"?(t.preventDefault(),a[(l+1)%a.length]?.focus()):t.key==="ArrowUp"||t.key==="ArrowLeft"?(t.preventDefault(),a[(l-1+a.length)%a.length]?.focus()):t.key==="Home"?(t.preventDefault(),a[0]?.focus()):t.key==="End"&&(t.preventDefault(),a[a.length-1]?.focus())}if(n==="tab"||i.closest("[role='tablist']")){let s=i.closest("[role='tablist']");if(!s)return;let a=Array.from(s.querySelectorAll("[role='tab']:not([disabled])")),l=a.indexOf(i);if(t.key==="ArrowRight"||t.key==="ArrowDown"){t.preventDefault();let e=a[(l+1)%a.length];e?.focus(),e?.click()}else if(t.key==="ArrowLeft"||t.key==="ArrowUp"){t.preventDefault();let e=a[(l-1+a.length)%a.length];e?.focus(),e?.click()}}if(n==="option"||i.closest("[role='listbox']")){let s=i.closest("[role='listbox']");if(!s)return;let a=Array.from(s.querySelectorAll("[role='option']:not([aria-disabled='true'])")),l=a.indexOf(i);t.key==="ArrowDown"?(t.preventDefault(),a[(l+1)%a.length]?.focus()):t.key==="ArrowUp"?(t.preventDefault(),a[(l-1+a.length)%a.length]?.focus()):(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),i.setAttribute("aria-selected","true"),a.forEach(e=>{e!==i&&e.setAttribute("aria-selected","false")}),c(`Selected: ${i.textContent?.trim()}`,"success"))}t.altKey&&t.key==="a"&&(t.preventDefault(),N()),t.key==="Tab"&&g?.speechEnabled&&setTimeout(()=>{let s=document.activeElement;if(!s)return;let a=s.getAttribute("aria-label")||s.getAttribute("title")||s.textContent?.trim()||s.tagName.toLowerCase(),l=s.getAttribute("role")||s.tagName.toLowerCase();M(`${a}, ${l}`)},100)}))}function y(t){let i=t.querySelectorAll('button:not([disabled]),a[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"]),[role="button"]');if(i.length===0)return;let n=i[0],s=i[i.length-1];n.focus(),t.addEventListener("keydown",a=>{a.key==="Tab"&&(a.shiftKey?document.activeElement===n&&(a.preventDefault(),s.focus()):document.activeElement===s&&(a.preventDefault(),n.focus()))})}function N(){if(typeof document>"u")return;if(m){m.remove(),m=null;return}let t=document.createElement("div");t.setAttribute("role","dialog"),t.setAttribute("aria-label","Keyboard shortcuts"),t.setAttribute("aria-modal","true"),t.style.cssText=`
|
|
116
|
+
position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);
|
|
117
|
+
z-index:999999;background:#1a1a2e;color:#fff;
|
|
118
|
+
border-radius:12px;padding:24px;width:320px;max-width:calc(100vw - 32px);
|
|
119
|
+
box-shadow:0 20px 60px rgba(0,0,0,0.5);
|
|
120
|
+
font-family:system-ui,sans-serif;
|
|
121
|
+
`;let i=[["Alt + A","Open/close this menu"],["Tab","Next focusable element"],["Shift+Tab","Previous focusable element"],["Enter","Activate button or link"],["Space","Check checkbox / scroll"],["Arrow keys","Navigate lists and menus"],["Escape","Close dialog or menu"],["Home","First item in list"],["End","Last item in list"]];t.innerHTML=`
|
|
122
|
+
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:16px">
|
|
123
|
+
<h2 style="margin:0;font-size:16px;font-weight:700;color:#74c0fc">
|
|
124
|
+
\u2328 Keyboard shortcuts
|
|
125
|
+
</h2>
|
|
126
|
+
<button data-yuktai-close style="background:none;border:none;color:#aaa;cursor:pointer;font-size:20px;padding:0;line-height:1" aria-label="Close shortcuts">\xD7</button>
|
|
127
|
+
</div>
|
|
128
|
+
${i.map(([s,a])=>`
|
|
129
|
+
<div style="display:flex;justify-content:space-between;align-items:center;padding:6px 0;border-bottom:1px solid #2a2a4a">
|
|
130
|
+
<kbd style="background:#2a2a4a;color:#74c0fc;padding:3px 8px;border-radius:4px;font-size:12px;font-family:monospace;border:1px solid #3a3a6a">${s}</kbd>
|
|
131
|
+
<span style="font-size:12px;color:#ccc;text-align:right;flex:1;margin-left:12px">${a}</span>
|
|
132
|
+
</div>
|
|
133
|
+
`).join("")}
|
|
134
|
+
<p style="margin:12px 0 0;font-size:11px;color:#888;text-align:center">
|
|
135
|
+
Powered by @yuktai/a11y \xB7 Press Escape to close
|
|
136
|
+
</p>
|
|
137
|
+
`,t.querySelector("[data-yuktai-close]")?.addEventListener("click",()=>{t.remove(),m=null}),t.addEventListener("keydown",s=>{s.key==="Escape"&&(t.remove(),m=null)}),document.body.appendChild(t),m=t,y(t),c("Keyboard shortcuts opened. Press Escape to close.","info")}function Z(t){if(typeof document>"u"||!g?.showAuditBadge||typeof window<"u"&&!window.location.hostname.includes("localhost")&&!window.location.hostname.includes("127.0.0.1"))return;T&&T.remove();let i=t.score,n=i>=90?"#0f9d58":i>=70?"#f29900":"#d93025",s=i>=90?"\u267F":i>=70?"\u26A0":"\u2715",a=document.createElement("button");a.setAttribute("aria-label",`Accessibility score: ${i} out of 100. Click for details.`),a.setAttribute("data-yuktai-badge","true"),a.style.cssText=`
|
|
138
|
+
position:fixed;bottom:16px;left:16px;z-index:999998;
|
|
139
|
+
background:${n};color:#fff;
|
|
140
|
+
border:none;border-radius:20px;cursor:pointer;
|
|
141
|
+
padding:6px 12px;font-size:12px;font-weight:700;
|
|
142
|
+
font-family:system-ui,sans-serif;
|
|
143
|
+
box-shadow:0 2px 8px rgba(0,0,0,0.3);
|
|
144
|
+
display:flex;align-items:center;gap:6px;
|
|
145
|
+
transition:transform 0.15s;
|
|
146
|
+
`,a.innerHTML=`${s} ${i}/100 <span style="font-weight:400;opacity:0.85">${t.details.length} issues</span>`,a.addEventListener("mouseenter",()=>{a.style.transform="scale(1.05)"}),a.addEventListener("mouseleave",()=>{a.style.transform="scale(1)"}),a.addEventListener("click",()=>{Q(t)}),document.body.appendChild(a),T=a}function Q(t){let i=document.querySelector("[data-yuktai-audit-details]");if(i){i.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=`
|
|
147
|
+
position:fixed;bottom:56px;left:16px;z-index:999999;
|
|
148
|
+
background:#1a1a2e;color:#fff;border-radius:12px;
|
|
149
|
+
padding:16px;width:340px;max-width:calc(100vw - 32px);
|
|
150
|
+
max-height:60vh;overflow-y:auto;
|
|
151
|
+
box-shadow:0 8px 32px rgba(0,0,0,0.5);
|
|
152
|
+
font-family:system-ui,sans-serif;font-size:12px;
|
|
153
|
+
`;let s={critical:"#d93025",serious:"#f29900",moderate:"#1a73e8",minor:"#0f9d58"};n.innerHTML=`
|
|
154
|
+
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px">
|
|
155
|
+
<strong style="font-size:14px;color:#74c0fc">Audit Report</strong>
|
|
156
|
+
<span style="color:#aaa">${t.fixed} fixed \xB7 ${t.renderTime}ms</span>
|
|
157
|
+
</div>
|
|
158
|
+
${t.details.slice(0,20).map(a=>`
|
|
159
|
+
<div style="padding:6px 0;border-bottom:1px solid #2a2a4a">
|
|
160
|
+
<div style="display:flex;gap:6px;align-items:center">
|
|
161
|
+
<span style="background:${s[a.severity]};color:#fff;padding:1px 6px;border-radius:4px;font-size:10px;font-weight:700;text-transform:uppercase">${a.severity}</span>
|
|
162
|
+
<code style="color:#74c0fc"><${a.tag}></code>
|
|
163
|
+
</div>
|
|
164
|
+
<div style="color:#ccc;margin-top:3px">${a.fix}</div>
|
|
165
|
+
</div>
|
|
166
|
+
`).join("")}
|
|
167
|
+
${t.details.length>20?`<div style="color:#888;padding:8px 0;text-align:center">+${t.details.length-20} more issues</div>`:""}
|
|
168
|
+
`,n.addEventListener("keydown",a=>{a.key==="Escape"&&n.remove()}),document.body.appendChild(n),y(n)}function _(t){typeof document>"u"||(S&&clearTimeout(S),S=setTimeout(()=>{if(h)return;let i=document.createElement("div");i.setAttribute("role","alertdialog"),i.setAttribute("aria-label","Session timeout warning"),i.setAttribute("aria-modal","true"),i.setAttribute("data-yuktai-timeout","true"),i.style.cssText=`
|
|
169
|
+
position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);
|
|
170
|
+
z-index:999999;background:#fff;color:#111;
|
|
171
|
+
border-radius:12px;padding:24px;width:320px;max-width:calc(100vw - 32px);
|
|
172
|
+
box-shadow:0 20px 60px rgba(0,0,0,0.4);
|
|
173
|
+
font-family:system-ui,sans-serif;border:2px solid #d93025;
|
|
174
|
+
`,i.innerHTML=`
|
|
175
|
+
<h2 style="margin:0 0 8px;font-size:18px;color:#d93025">\u23F1 Session timeout</h2>
|
|
176
|
+
<p style="margin:0 0 16px;font-size:14px;line-height:1.5;color:#444">
|
|
177
|
+
Your session will expire soon. Do you need more time?
|
|
178
|
+
</p>
|
|
179
|
+
<div style="display:flex;gap:8px">
|
|
180
|
+
<button data-yuktai-extend style="flex:1;padding:10px;background:#1a73e8;color:#fff;border:none;border-radius:8px;cursor:pointer;font-size:14px;font-weight:600">
|
|
181
|
+
Yes, more time
|
|
182
|
+
</button>
|
|
183
|
+
<button data-yuktai-dismiss style="flex:1;padding:10px;background:#f1f3f4;color:#111;border:none;border-radius:8px;cursor:pointer;font-size:14px">
|
|
184
|
+
No, sign out
|
|
185
|
+
</button>
|
|
186
|
+
</div>
|
|
187
|
+
`;let n=i.querySelector("[data-yuktai-extend]"),s=i.querySelector("[data-yuktai-dismiss]");n?.addEventListener("click",()=>{i.remove(),h=null,c("Session extended. You have more time.","success"),g?.timeoutWarning&&_(g.timeoutWarning)}),s?.addEventListener("click",()=>{i.remove(),h=null}),document.body.appendChild(i),h=i,y(i),c("Warning: Your session will expire soon. Do you need more time?","warning")},t*1e3))}function P(t){if(typeof document>"u"||A)return;try{let a=localStorage.getItem("yuktai-a11y-prefs");if(a){let l=JSON.parse(a);Object.assign(t,l),x(t)}}catch{}let i=document.createElement("button");i.setAttribute("aria-label","Accessibility preferences"),i.setAttribute("aria-haspopup","dialog"),i.setAttribute("data-yuktai-pref-toggle","true"),i.style.cssText=`
|
|
188
|
+
position:fixed;bottom:16px;right:16px;z-index:999998;
|
|
189
|
+
width:48px;height:48px;border-radius:50%;
|
|
190
|
+
background:#1a73e8;color:#fff;border:none;
|
|
191
|
+
cursor:pointer;font-size:22px;
|
|
192
|
+
box-shadow:0 2px 12px rgba(0,0,0,0.3);
|
|
193
|
+
display:flex;align-items:center;justify-content:center;
|
|
194
|
+
transition:transform 0.15s,background 0.15s;
|
|
195
|
+
`,i.innerHTML="\u267F",i.addEventListener("mouseenter",()=>{i.style.transform="scale(1.1)",i.style.background="#1557b0"}),i.addEventListener("mouseleave",()=>{i.style.transform="scale(1)",i.style.background="#1a73e8"});let n=document.createElement("div");n.setAttribute("role","dialog"),n.setAttribute("aria-label","Accessibility preferences"),n.setAttribute("aria-modal","true"),n.setAttribute("data-yuktai-panel","true"),n.style.cssText=`
|
|
196
|
+
position:fixed;bottom:76px;right:16px;z-index:999999;
|
|
197
|
+
width:300px;max-width:calc(100vw - 32px);
|
|
198
|
+
background:#fff;border-radius:16px;
|
|
199
|
+
box-shadow:0 8px 32px rgba(0,0,0,0.2);
|
|
200
|
+
border:1px solid #e0e0e0;
|
|
201
|
+
font-family:system-ui,sans-serif;
|
|
202
|
+
overflow:hidden;display:none;
|
|
203
|
+
`;let s=[{icon:"\u{1F441}",title:"Vision",options:[{key:"highContrast",label:"High contrast",type:"toggle"},{key:"darkMode",label:"Dark mode",type:"toggle"},{key:"largeTargets",label:"Large text & targets",type:"toggle"}]},{icon:"\u{1F3A8}",title:"Colour blindness",options:[{key:"colorBlind_none",label:"None",type:"radio",group:"cb"},{key:"colorBlind_deuteranopia",label:"Deuteranopia",type:"radio",group:"cb"},{key:"colorBlind_protanopia",label:"Protanopia",type:"radio",group:"cb"},{key:"colorBlind_tritanopia",label:"Tritanopia",type:"radio",group:"cb"},{key:"colorBlind_achromatopsia",label:"Greyscale",type:"radio",group:"cb"}]},{icon:"\u2328",title:"Motor",options:[{key:"reduceMotion",label:"Reduce motion",type:"toggle"},{key:"largeTargets",label:"Large click targets",type:"toggle"}]},{icon:"\u{1F50A}",title:"Audio",options:[{key:"speechEnabled",label:"Speak on focus",type:"toggle"}]}];n.innerHTML=`
|
|
204
|
+
<div style="padding:16px 16px 8px;border-bottom:1px solid #f0f0f0;display:flex;justify-content:space-between;align-items:center">
|
|
205
|
+
<strong style="font-size:15px;color:#111">\u267F Accessibility</strong>
|
|
206
|
+
<button data-yuktai-panel-close style="background:none;border:none;cursor:pointer;font-size:20px;color:#666;padding:0;line-height:1" aria-label="Close preferences">\xD7</button>
|
|
207
|
+
</div>
|
|
208
|
+
<div style="padding:8px 0;max-height:60vh;overflow-y:auto">
|
|
209
|
+
${s.map(a=>`
|
|
210
|
+
<div style="padding:8px 16px">
|
|
211
|
+
<div style="font-size:11px;font-weight:700;color:#888;letter-spacing:0.5px;text-transform:uppercase;margin-bottom:8px">
|
|
212
|
+
${a.icon} ${a.title}
|
|
213
|
+
</div>
|
|
214
|
+
${a.options.map(l=>`
|
|
215
|
+
<label style="display:flex;align-items:center;justify-content:space-between;padding:6px 0;cursor:pointer;gap:8px">
|
|
216
|
+
<span style="font-size:13px;color:#333">${l.label}</span>
|
|
217
|
+
${l.type==="toggle"?`
|
|
218
|
+
<div data-yuktai-toggle="${l.key}" style="
|
|
219
|
+
width:40px;height:22px;border-radius:11px;
|
|
220
|
+
background:${v(t,l.key)?"#1a73e8":"#ccc"};
|
|
221
|
+
position:relative;cursor:pointer;transition:background 0.2s;flex-shrink:0;
|
|
222
|
+
">
|
|
223
|
+
<div style="
|
|
224
|
+
position:absolute;top:2px;left:${v(t,l.key)?"20px":"2px"};
|
|
225
|
+
width:18px;height:18px;border-radius:50%;background:#fff;
|
|
226
|
+
transition:left 0.2s;box-shadow:0 1px 3px rgba(0,0,0,0.2);
|
|
227
|
+
"></div>
|
|
228
|
+
</div>
|
|
229
|
+
`:`
|
|
230
|
+
<input type="radio" name="yuktai-${l.group}" value="${l.key}"
|
|
231
|
+
${ee(t,l.key)?"checked":""}
|
|
232
|
+
style="width:16px;height:16px;cursor:pointer;accent-color:#1a73e8"
|
|
233
|
+
/>
|
|
234
|
+
`}
|
|
235
|
+
</label>
|
|
236
|
+
`).join("")}
|
|
237
|
+
</div>
|
|
238
|
+
`).join("")}
|
|
239
|
+
<div style="padding:8px 16px 4px">
|
|
240
|
+
<div style="font-size:11px;font-weight:700;color:#888;letter-spacing:0.5px;text-transform:uppercase;margin-bottom:8px">
|
|
241
|
+
\u2328 Keyboard
|
|
242
|
+
</div>
|
|
243
|
+
<button data-yuktai-show-keys style="
|
|
244
|
+
width:100%;padding:8px;background:#f8f9fa;border:1px solid #e0e0e0;
|
|
245
|
+
border-radius:8px;cursor:pointer;font-size:13px;color:#333;
|
|
246
|
+
display:flex;align-items:center;justify-content:center;gap:6px;
|
|
247
|
+
">
|
|
248
|
+
Show keyboard shortcuts <kbd style="background:#e0e0e0;padding:1px 6px;border-radius:4px;font-size:11px">Alt+A</kbd>
|
|
249
|
+
</button>
|
|
250
|
+
</div>
|
|
251
|
+
</div>
|
|
252
|
+
<div style="padding:8px 16px 12px;border-top:1px solid #f0f0f0">
|
|
253
|
+
<button data-yuktai-reset style="
|
|
254
|
+
width:100%;padding:8px;background:#fff;border:1px solid #d93025;
|
|
255
|
+
border-radius:8px;cursor:pointer;font-size:12px;color:#d93025;font-weight:600;
|
|
256
|
+
">Reset all preferences</button>
|
|
257
|
+
</div>
|
|
258
|
+
`,n.querySelectorAll("[data-yuktai-toggle]").forEach(a=>{a.addEventListener("click",()=>{let l=a.getAttribute("data-yuktai-toggle");t[l]=!v(t,l),B(t),x(t),z(t),c(`${l.replace(/([A-Z])/g," $1")} ${v(t,l)?"enabled":"disabled"}`,"info")})}),n.querySelectorAll("input[type='radio']").forEach(a=>{a.addEventListener("change",()=>{let l=a.value.replace("colorBlind_","");t.colorBlindMode=l,B(t),x(t),c(`Colour blind mode: ${l}`,"info")})}),n.querySelector("[data-yuktai-show-keys]")?.addEventListener("click",()=>{N()}),n.querySelector("[data-yuktai-reset]")?.addEventListener("click",()=>{localStorage.removeItem("yuktai-a11y-prefs"),t.highContrast=!1,t.darkMode=!1,t.reduceMotion=!1,t.largeTargets=!1,t.speechEnabled=!1,t.colorBlindMode="none",x(t),z(t),c("Preferences reset to default","info")}),n.querySelector("[data-yuktai-panel-close]")?.addEventListener("click",()=>{n.style.display="none",i.focus(),c("Preferences closed","info")}),n.addEventListener("keydown",a=>{a.key==="Escape"&&(n.style.display="none",i.focus())}),i.addEventListener("click",()=>{let a=n.style.display!=="none";n.style.display=a?"none":"block",i.setAttribute("aria-expanded",String(!a)),a||(y(n),c("Accessibility preferences opened","info"))}),document.body.appendChild(i),document.body.appendChild(n),A=n}function z(t){A&&(A.remove(),A=null),P(t)}function v(t,i){return!!t[i]}function ee(t,i){let n=i.replace("colorBlind_","");return t.colorBlindMode===n}function B(t){try{let i={highContrast:t.highContrast,darkMode:t.darkMode,reduceMotion:t.reduceMotion,largeTargets:t.largeTargets,speechEnabled:t.speechEnabled,colorBlindMode:t.colorBlindMode};localStorage.setItem("yuktai-a11y-prefs",JSON.stringify(i))}catch{}}function x(t){if(typeof document>"u")return;let i=document.documentElement;i.toggleAttribute("data-yuktai-high-contrast",!!t.highContrast),i.toggleAttribute("data-yuktai-dark",!!t.darkMode),i.toggleAttribute("data-yuktai-reduce-motion",!!t.reduceMotion),i.toggleAttribute("data-yuktai-large-targets",!!t.largeTargets),i.toggleAttribute("data-yuktai-keyboard",!!t.keyboardHints);let n=document.body;if(t.colorBlindMode&&t.colorBlindMode!=="none"){let s=t.colorBlindMode==="achromatopsia"?"grayscale(100%)":`url(#${k[t.colorBlindMode]})`;n.style.filter=s}else n.style.filter=""}function te(){if(typeof document>"u"||w)return;let t=document.createElement("div");t.setAttribute("aria-live","polite"),t.setAttribute("aria-atomic","true"),t.setAttribute("aria-relevant","text"),t.style.cssText="position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);",document.body.appendChild(t),w=t}function ie(){if(typeof document>"u"||C)return;let t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttribute("aria-hidden","true"),t.style.cssText="position:absolute;width:0;height:0;overflow:hidden;",t.innerHTML=`
|
|
259
|
+
<defs>
|
|
260
|
+
<filter id="${k.deuteranopia}">
|
|
261
|
+
<feColorMatrix type="matrix" 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"/>
|
|
262
|
+
</filter>
|
|
263
|
+
<filter id="${k.protanopia}">
|
|
264
|
+
<feColorMatrix type="matrix" 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"/>
|
|
265
|
+
</filter>
|
|
266
|
+
<filter id="${k.tritanopia}">
|
|
267
|
+
<feColorMatrix type="matrix" values="0.95 0.05 0 0 0 0 0.433 0.567 0 0 0 0 0.475 0.525 0 0 0 0 0 1 0"/>
|
|
268
|
+
</filter>
|
|
269
|
+
</defs>
|
|
270
|
+
`,document.body.appendChild(t),C=t}function D(t){let i={critical:20,serious:10,moderate:5,minor:2},n=t.details.reduce((s,a)=>s+(i[a.severity]||0),0);return Math.max(0,Math.min(100,100-n))}var ae={name:"yuktai-a11y",version:"2.0.0",observer:null,async execute(t){if(!t.enabled)return this.stopObserver(),"yuktai-a11y: disabled.";g=t,te(),ie(),J(),X(),t.showSkipLinks!==!1&&U(),t.showPreferencePanel!==!1&&P(t),x(t);let i=this.applyFixes(t);i.score=D(i),t.showAuditBadge&&Z(i),t.timeoutWarning&&_(t.timeoutWarning),t.autoFix&&this.startObserver(t);let n=`${i.fixed} accessibility fixes applied. Score: ${i.score}/100.`;return c(n,i.score>=90?"success":"info",!1),`yuktai-a11y v2: ${n} Scanned ${i.scanned} elements in ${i.renderTime}ms.`},applyFixes(t){let i={fixed:0,scanned:0,renderTime:0,score:100,details:[]};if(typeof document>"u")return i;let n=performance.now(),s=document.querySelectorAll("*");i.scanned=s.length;let a=(l,e,r,p)=>{i.details.push({tag:l,fix:e,severity:r,element:p.outerHTML.slice(0,100)}),i.fixed++};return s.forEach(l=>{let e=l,r=e.tagName.toLowerCase();if(r==="html"&&!e.getAttribute("lang")&&(e.setAttribute("lang","en"),a(r,'lang="en" added to <html>',"critical",e)),r==="head"&&!document.title&&(document.title=document.querySelector("h1")?.innerText?.trim()||"Page",a(r,`document.title set to "${document.title}"`,"serious",e)),r==="meta"){let o=e.getAttribute("name"),d=e.getAttribute("content")||"";o==="viewport"&&d.includes("user-scalable=no")&&(e.setAttribute("content",d.replace("user-scalable=no","user-scalable=yes")),a(r,"user-scalable=yes restored","serious",e)),o==="viewport"&&/maximum-scale=1(?:[^0-9]|$)/.test(d)&&(e.setAttribute("content",d.replace(/maximum-scale=1(?=[^0-9]|$)/,"maximum-scale=5")),a(r,"maximum-scale=5 restored","serious",e))}if(r==="main"&&!e.getAttribute("tabindex")&&(e.setAttribute("tabindex","-1"),e.getAttribute("id")||e.setAttribute("id","main-content")),r==="body"&&document.querySelectorAll("video[autoplay]:not([muted])").forEach(o=>{o.muted=!0,a("video","autoplay video muted (deaf users)","serious",e)}),t.largeTargets&&(r==="button"||r==="a"||r==="input")){let o=e.getBoundingClientRect();o.width>0&&o.width<24&&(e.style.minWidth="44px",e.style.minHeight="44px",a(r,"min 44px touch target enforced","minor",e))}if(H.has(r)&&(!e.innerText?.trim()&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label",`${r.toUpperCase()} section`),a(r,"aria-label added (empty heading)","moderate",e)),e.hasAttribute("onclick")&&!e.getAttribute("tabindex")&&(e.setAttribute("tabindex","0"),e.onkeydown||(e.onkeydown=o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),e.click())}),a(r,"tabindex=0 + keydown (clickable heading)","minor",e))),r==="img"&&(e.hasAttribute("alt")||(e.setAttribute("alt",""),e.setAttribute("aria-hidden","true"),a(r,'alt="" aria-hidden="true"',"serious",e)),e.getAttribute("role")==="presentation"&&e.getAttribute("alt")!==""&&(e.setAttribute("alt",""),a(r,'alt="" (role=presentation)',"minor",e))),r==="area"&&!e.getAttribute("alt")){let o=e.getAttribute("title")||e.getAttribute("href")||"map area";e.setAttribute("alt",o),a(r,`alt="${o}" on <area>`,"serious",e)}if(r==="svg"){if(!e.getAttribute("aria-hidden")&&!e.getAttribute("aria-label")&&!l.querySelector("title"))if(!e.getAttribute("role")||e.getAttribute("role")==="img"){let o=document.createElementNS("http://www.w3.org/2000/svg","title");o.textContent="graphic",e.prepend(o),e.setAttribute("role","img"),a(r,'role="img" + <title> injected',"moderate",e)}else e.setAttribute("aria-hidden","true"),a(r,'aria-hidden="true" (decorative svg)',"minor",e);e.getAttribute("focusable")||e.setAttribute("focusable","false")}if(r==="canvas"&&(e.getAttribute("role")||(e.setAttribute("role","img"),a(r,'role="img"',"serious",e)),e.getAttribute("aria-label")||(e.setAttribute("aria-label",e.getAttribute("title")||"canvas graphic"),a(r,"aria-label added to canvas","serious",e))),(r==="object"||r==="embed")&&!e.getAttribute("aria-label")&&!e.getAttribute("title")&&(e.setAttribute("aria-label",`embedded ${r} content`),a(r,`aria-label added to <${r}>`,"moderate",e)),r==="video"&&!l.querySelector("track")&&!e.getAttribute("aria-label")&&(e.setAttribute("aria-label",e.getAttribute("title")||"video player"),a(r,"aria-label added (no captions track)","serious",e)),r==="audio"&&!l.querySelector("track")&&!e.getAttribute("aria-label")&&(e.setAttribute("aria-label",e.getAttribute("title")||"audio player"),a(r,"aria-label added to audio","serious",e)),r==="iframe"&&!e.getAttribute("title")&&!e.getAttribute("aria-label")&&(e.setAttribute("title","embedded content"),e.setAttribute("aria-label","embedded content"),a(r,'title + aria-label="embedded content"',"serious",e)),r==="figure"&&!l.querySelector("figcaption")&&!e.getAttribute("aria-label")){let d=l.querySelector("img")?.getAttribute("alt");d&&(e.setAttribute("aria-label",d),a(r,"aria-label from inner img alt","minor",e))}if(r==="button"){if(!e.innerText?.trim()&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")){let o=e.getAttribute("title")||e.getAttribute("data-label")||"button";e.setAttribute("aria-label",o),a(r,`aria-label="${o}" (empty button)`,"critical",e)}e.hasAttribute("disabled")&&!e.getAttribute("aria-disabled")&&(e.setAttribute("aria-disabled","true"),i.fixed++),e.getAttribute("data-yuktai-announced")||(e.setAttribute("data-yuktai-announced","true"),e.addEventListener("click",()=>{let o=e.getAttribute("aria-label")||e.textContent?.trim()||"button";setTimeout(()=>{c(`${o} activated`,"success",!1)},100)}))}if(r==="a"){let o=e;if(!e.innerText?.trim()&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")){let d=e.getAttribute("title")||"link";e.setAttribute("aria-label",d),a(r,`aria-label="${d}" (empty link)`,"critical",e)}if(o.target==="_blank"){o.rel?.includes("noopener")||(o.rel="noopener noreferrer",i.fixed++);let d=o.getAttribute("aria-label")||o.innerText?.trim()||"link";d.includes("opens in new window")||(o.setAttribute("aria-label",`${d} (opens in new window)`),a(r,"aria-label: new-window warning","moderate",e))}!o.href&&!o.getAttribute("role")&&!o.getAttribute("tabindex")&&(o.setAttribute("role","button"),o.setAttribute("tabindex","0"),a(r,'role="button" tabindex=0 (href-less link)',"serious",e))}if((e.hasAttribute("onclick")||typeof window<"u"&&window.getComputedStyle(e).cursor==="pointer")&&!W.has(r)&&(e.getAttribute("role")||(e.setAttribute("role","button"),a(r,'role="button" (clickable non-interactive)',"serious",e)),e.tabIndex<0&&(e.tabIndex=0,i.fixed++),e.onkeydown||(e.onkeydown=o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),e.click())})),q.has(r)){let o=e;if(!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")){let d=e.getAttribute("placeholder")||e.getAttribute("name")||e.getAttribute("title")||r;e.setAttribute("aria-label",d),a(r,`aria-label="${d}"`,"serious",e)}if(e.hasAttribute("required")&&!e.getAttribute("aria-required")&&(e.setAttribute("aria-required","true"),i.fixed++),e.hasAttribute("disabled")&&!e.getAttribute("aria-disabled")&&(e.setAttribute("aria-disabled","true"),i.fixed++),e.hasAttribute("readonly")&&!e.getAttribute("aria-readonly")&&(e.setAttribute("aria-readonly","true"),i.fixed++),e.getAttribute("data-yuktai-validation")||(e.setAttribute("data-yuktai-validation","true"),e.addEventListener("invalid",()=>{let d=e.getAttribute("aria-label")||e.getAttribute("placeholder")||"Field",f=e.validationMessage||"is invalid";c(`Error: ${d} ${f}`,"error")}),e.addEventListener("change",()=>{if(e.validity?.valid){let d=e.getAttribute("aria-label")||e.getAttribute("placeholder")||"Field";c(`${d} looks good`,"success",!1)}})),r==="input"&&!o.autocomplete){let d=o.name||"";o.type==="email"||d.includes("email")?(o.autocomplete="email",i.fixed++):o.type==="tel"||d.includes("tel")?(o.autocomplete="tel",i.fixed++):o.type==="password"?(o.autocomplete="current-password",i.fixed++):d.includes("firstname")||d.includes("fname")?(o.autocomplete="given-name",i.fixed++):d.includes("lastname")||d.includes("lname")?(o.autocomplete="family-name",i.fixed++):d==="name"||d.includes("fullname")?(o.autocomplete="name",i.fixed++):d.includes("zip")||d.includes("postal")?(o.autocomplete="postal-code",i.fixed++):d.includes("city")?(o.autocomplete="address-level2",i.fixed++):d.includes("country")&&(o.autocomplete="country",i.fixed++)}r==="input"&&o.type==="image"&&!e.getAttribute("alt")&&(e.setAttribute("alt",e.getAttribute("value")||"submit"),a(r,"alt added to input[type=image]","serious",e)),r==="input"&&o.type==="range"&&(e.getAttribute("aria-valuemin")||e.setAttribute("aria-valuemin",o.min||"0"),e.getAttribute("aria-valuemax")||e.setAttribute("aria-valuemax",o.max||"100"),e.getAttribute("aria-valuenow")||e.setAttribute("aria-valuenow",o.value||"50"),i.fixed++)}if(r==="fieldset"&&!l.querySelector("legend")&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label","form group"),a(r,'aria-label="form group" (no legend)',"moderate",e)),r==="table"&&(!l.querySelector("th")&&!e.getAttribute("role")&&(e.setAttribute("role","grid"),a(r,'role="grid" (no <th>)',"serious",e)),!l.querySelector("caption")&&!e.getAttribute("aria-label")&&(e.setAttribute("aria-label","data table"),a(r,'aria-label="data table"',"moderate",e))),r==="th"&&!e.getAttribute("scope")){let o=e.closest("thead")!==null;e.setAttribute("scope",o?"col":"row"),a(r,`scope="${o?"col":"row"}"`,"moderate",e)}if(Y.has(r)&&(e.getAttribute("role")==="presentation"&&(l.querySelectorAll("li").forEach(o=>{o.getAttribute("role")||o.setAttribute("role","presentation")}),i.fixed++),(r==="ul"||r==="ol")&&!e.getAttribute("aria-label"))){let o=e.closest("nav");o&&(e.setAttribute("aria-label",o.getAttribute("aria-label")||"navigation list"),a(r,"aria-label from parent nav","minor",e))}if(L[r]&&!e.getAttribute("role")&&(e.setAttribute("role",L[r]),a(r,`role="${L[r]}"`,"minor",e)),["nav","section","article","aside"].includes(r)){let o=l.parentElement?.querySelectorAll(r);if(o&&o.length>1&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")){let f=l.querySelector("h1,h2,h3,h4,h5,h6")?.textContent?.trim();f&&(e.setAttribute("aria-label",f),a(r,"aria-label from inner heading","moderate",e))}}if(r==="details"&&!l.querySelector("summary")){let o=document.createElement("summary");o.textContent=e.getAttribute("aria-label")||"More details",e.prepend(o),a(r,"<summary> injected","moderate",e)}if(r==="summary"&&!e.innerText?.trim()&&!e.getAttribute("aria-label")&&(e.setAttribute("aria-label","Toggle details"),a(r,'aria-label="Toggle details"',"moderate",e)),r==="dialog"){let o=e.getAttribute("role");if(o&&o!=="dialog"&&o!=="alertdialog"&&(e.setAttribute("role","dialog"),a(r,'role corrected to "dialog"',"serious",e)),!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")){let f=l.querySelector("h1,h2,h3,h4,h5,h6")?.textContent?.trim()||"dialog";e.setAttribute("aria-label",f),a(r,"aria-label added to dialog","serious",e)}e.getAttribute("data-yuktai-trap")||(e.setAttribute("data-yuktai-trap","true"),new MutationObserver(()=>{e.style.display!=="none"&&e.style.visibility!=="hidden"&&y(e)}).observe(e,{attributes:!0,attributeFilter:["style","open"]}))}if(r==="abbr"&&!e.getAttribute("title")&&(e.setAttribute("title",e.innerText?.trim()||"abbreviation"),a(r,"title added to <abbr>","minor",e)),r==="time"&&!e.getAttribute("datetime")&&e.innerText?.trim()&&(e.setAttribute("datetime",e.innerText.trim()),a(r,`datetime="${e.innerText.trim()}" added`,"minor",e)),r==="meter"&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label",e.getAttribute("title")||"meter"),a(r,"aria-label added to <meter>","moderate",e)),r==="progress"){!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label",e.getAttribute("title")||"progress"),a(r,"aria-label added to <progress>","moderate",e));let o=e;e.getAttribute("aria-valuenow")||e.setAttribute("aria-valuenow",String(o.value)),e.getAttribute("aria-valuemax")||e.setAttribute("aria-valuemax",String(o.max||1)),i.fixed++}let u=e.getAttribute("role")||"";if(u==="tab"&&!e.getAttribute("aria-selected")&&(e.setAttribute("aria-selected","false"),i.fixed++),u==="tabpanel"&&(!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label","tab panel"),a(r,'aria-label="tab panel"',"moderate",e)),e.getAttribute("tabindex")||(e.setAttribute("tabindex","0"),i.fixed++)),["alert","status","log","marquee"].includes(u)){if(!e.getAttribute("aria-live")){let o=u==="alert"?"assertive":"polite";e.setAttribute("aria-live",o),a(r,`aria-live="${o}" on role=${u}`,"moderate",e)}e.getAttribute("aria-atomic")||(e.setAttribute("aria-atomic","true"),i.fixed++)}u==="tooltip"&&!e.getAttribute("aria-live")&&(e.setAttribute("aria-live","polite"),i.fixed++),(u==="menu"||u==="menubar")&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label","menu"),a(r,'aria-label="menu"',"moderate",e)),u==="listbox"&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label","listbox"),a(r,'aria-label="listbox"',"moderate",e)),u==="option"&&!e.getAttribute("aria-selected")&&(e.setAttribute("aria-selected","false"),i.fixed++),u==="slider"&&(e.getAttribute("aria-valuemin")||e.setAttribute("aria-valuemin","0"),e.getAttribute("aria-valuemax")||e.setAttribute("aria-valuemax","100"),e.getAttribute("aria-valuenow")||e.setAttribute("aria-valuenow","50"),i.fixed++),(u==="checkbox"||u==="radio")&&!e.getAttribute("aria-checked")&&(e.setAttribute("aria-checked","false"),a(r,`aria-checked="false" on role=${u}`,"serious",e)),u==="combobox"&&(e.getAttribute("aria-expanded")||(e.setAttribute("aria-expanded","false"),a(r,'aria-expanded="false" on combobox',"serious",e)),e.getAttribute("aria-haspopup")||(e.setAttribute("aria-haspopup","listbox"),i.fixed++)),(u==="grid"||u==="treegrid")&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label","data grid"),a(r,'aria-label="data grid"',"moderate",e)),u==="tree"&&!e.getAttribute("aria-label")&&!e.getAttribute("aria-labelledby")&&(e.setAttribute("aria-label","tree"),a(r,'aria-label="tree"',"moderate",e)),u==="spinbutton"&&(e.getAttribute("aria-valuenow")||e.setAttribute("aria-valuenow","0"),e.getAttribute("aria-valuemin")||e.setAttribute("aria-valuemin","0"),e.getAttribute("aria-valuemax")||e.setAttribute("aria-valuemax","100"),i.fixed++)}),i.renderTime=parseFloat((performance.now()-n).toFixed(2)),i},scan(){let t={fixed:0,scanned:0,renderTime:0,score:100,details:[]};if(typeof document>"u")return t;let i=performance.now(),n=document.querySelectorAll("*");t.scanned=n.length;let s=(a,l,e,r)=>t.details.push({tag:a,fix:l,severity:e,element:r.outerHTML.slice(0,100)});return n.forEach(a=>{let l=a,e=l.tagName.toLowerCase();(e==="a"||e==="button")&&!l.innerText?.trim()&&!l.getAttribute("aria-label")&&s(e,"needs aria-label (empty)","critical",l),e==="img"&&!l.hasAttribute("alt")&&s(e,"needs alt text","serious",l),q.has(e)&&!l.getAttribute("aria-label")&&!l.getAttribute("aria-labelledby")&&s(e,"needs aria-label","serious",l),e==="iframe"&&!l.getAttribute("title")&&!l.getAttribute("aria-label")&&s(e,"iframe needs title","serious",l),V.has(e)&&!a.querySelector("track")&&!l.getAttribute("aria-label")&&s(e,"media needs captions/aria-label","serious",l),H.has(e)&&!l.innerText?.trim()&&!l.getAttribute("aria-label")&&s(e,"empty heading","moderate",l)}),t.fixed=t.details.length,t.score=D(t),t.renderTime=parseFloat((performance.now()-i).toFixed(2)),t},startObserver(t){this.observer||typeof document>"u"||(this.observer=new MutationObserver(()=>this.applyFixes(t)),this.observer.observe(document.body,{childList:!0,subtree:!0,attributes:!1}))},stopObserver(){this.observer?.disconnect(),this.observer=null},announce:c,speak:M,showVisualAlert:R,trapFocus:y};return G(re);})();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yuktishaalaa/yuktai",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.12",
|
|
4
4
|
"description": "Privacy-first, offline-first universal accessibility engine with WCAG auto-fix, OCR, voice, and Indic language AI support.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
"types": "./dist/index.d.ts",
|
|
10
10
|
"exports": {
|
|
11
11
|
".": {
|
|
12
|
-
"types":
|
|
13
|
-
"import":
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
14
|
"require": "./dist/index.cjs"
|
|
15
15
|
}
|
|
16
16
|
},
|
|
@@ -18,39 +18,33 @@
|
|
|
18
18
|
"access": "public",
|
|
19
19
|
"registry": "https://registry.npmjs.org/"
|
|
20
20
|
},
|
|
21
|
-
"files": [
|
|
22
|
-
"dist"
|
|
23
|
-
],
|
|
21
|
+
"files": ["dist"],
|
|
24
22
|
"scripts": {
|
|
25
|
-
"dev":
|
|
26
|
-
"build":
|
|
23
|
+
"dev": "tsup --watch",
|
|
24
|
+
"build": "tsup",
|
|
27
25
|
"prepublishOnly": "npm run build"
|
|
28
26
|
},
|
|
29
27
|
"author": "Sandeep Miriyala",
|
|
30
28
|
"license": "ISC",
|
|
31
29
|
"peerDependencies": {
|
|
32
|
-
"react":
|
|
30
|
+
"react": ">=18",
|
|
33
31
|
"react-dom": ">=18"
|
|
34
32
|
},
|
|
35
33
|
"peerDependenciesMeta": {
|
|
36
|
-
"react":
|
|
37
|
-
|
|
38
|
-
},
|
|
39
|
-
"react-dom": {
|
|
40
|
-
"optional": true
|
|
41
|
-
}
|
|
34
|
+
"react": { "optional": true },
|
|
35
|
+
"react-dom": { "optional": true }
|
|
42
36
|
},
|
|
43
37
|
"dependencies": {
|
|
44
|
-
"idb-keyval":
|
|
45
|
-
"tesseract.js":
|
|
38
|
+
"idb-keyval": "^6.2.2",
|
|
39
|
+
"tesseract.js": "^7.0.0",
|
|
46
40
|
"wasm-feature-detect": "^1.8.0"
|
|
47
41
|
},
|
|
48
42
|
"devDependencies": {
|
|
49
|
-
"@types/react":
|
|
43
|
+
"@types/react": "^19.0.0",
|
|
50
44
|
"@types/react-dom": "^19.0.0",
|
|
51
|
-
"react":
|
|
52
|
-
"react-dom":
|
|
53
|
-
"tsup":
|
|
54
|
-
"typescript":
|
|
45
|
+
"react": "^19.0.0",
|
|
46
|
+
"react-dom": "^19.0.0",
|
|
47
|
+
"tsup": "^8.5.1",
|
|
48
|
+
"typescript": "^5.0.0"
|
|
55
49
|
}
|
|
56
|
-
}
|
|
50
|
+
}
|