-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdevtools.min.js
More file actions
1 lines (1 loc) · 6.32 KB
/
devtools.min.js
File metadata and controls
1 lines (1 loc) · 6.32 KB
1
!function(){if(window.__devToolsInjected)return;function e(e){const n=window.getComputedStyle(e),t=n.color,o=n.backgroundColor,[l,d]=[t,o].map((e=>"#"+e.match(/\d+/g).map(Number).slice(0,3).map((e=>e.toString(16).padStart(2,"0"))).join("")));if(l&&d){const n=function(e,n){const t=e=>{const n=[parseInt(e.slice(1,3),16)/255,parseInt(e.slice(3,5),16)/255,parseInt(e.slice(5,7),16)/255].map((e=>e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4)));return.2126*n[0]+.7152*n[1]+.0722*n[2]};return(t(e)+.05)/(t(n)+.05)}(l,d);n<4.5&&console.warn("❗ Low contrast:",e,"CR:",n.toFixed(2),l,"on",d)}}window.__devToolsInjected=!0;const n=document.createElement("style");n.textContent='\n .dev-toolbar {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 99999;\n background: rgba(0, 0, 0, 0.85);\n color: white;\n padding: 6px 10px;\n font-family: sans-serif;\n font-size: 14px;\n display: flex;\n gap: 1rem;\n align-items: center;\n transition: transform 0.4s ease;\n }\n .dev-toolbar.hidden {\n transform: translateY(100%);\n }\n .dev-toolbar label {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .dev-toolbar button {\n background: none;\n border: 1px solid white;\n color: white;\n padding: 2px 6px;\n border-radius: 4px;\n cursor: pointer;\n }\n .dev-toolbar button:hover {\n background: rgba(255, 255, 255, 0.1);\n }\n .dev-toolbar input[type="checkbox"] {\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n margin: 3px 7px 0 0;\n padding: 0;\n border: 1px solid white;\n appearance: none;\n background-color: transparent;\n outline: none;\n transition: outline 0.1s;\n }\n .dev-toolbar input[type="checkbox"]:checked {\n background-size: 50%;\n background-repeat: no-repeat;\n background-position: center;\n padding: 2px;\n background-image: url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 32 32" xml:space="preserve"><path style="fill:%23FFF" d="M11.941,28.877l-11.941-11.942l5.695-5.696l6.246,6.246l14.364-14.364L32,8.818"/></svg>\');\n }\n .dev-toolbar label:has([disabled]) {\n opacity: 0.55;\n }\n .dev-grid {\n width: 100%;\n height: 100%;\n position: fixed;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: 999;\n opacity: 0.8;\n }\n .dev-grid [class^="container"], .dev-grid .row {\n height: 100%;\n }\n .dev-column {\n background: rgba(21,198,36,0.108);\n position: relative;\n }\n .dev-column::after, .dev-column::before {\n width: 16px;\n height: 100%;\n content: "";\n display: block;\n position: absolute;\n top: 0;\n background: rgba(21,198,36,0.108);\n }\n .dev-column::before {\n left: 0;\n border-left: 1px solid rgba(0,138,12,0.1);\n }\n .dev-column::after {\n right: 0;\n border-right: 1px solid rgba(0,138,12,0.1);\n }\n .dev-column-outline *{outline:1px solid red;}\n .dev-column-outline .dev-toolbar *,\n .dev-column-outline .dev-grid *{outline:none;}\n ',document.head.appendChild(n);const t=document.createElement("div");t.className="dev-toolbar",t.innerHTML='\n <label><input type="checkbox" id="toggleGrid"> Grid</label>\n <label><input type="checkbox" id="toggleFluid" disabled> Container Fluid</label>\n <label><input type="checkbox" id="toggleOutlines"> Outlines</label>\n <button id="clearStorage">Clear Storage</button>\n <button id="a11yCheck">Accessibility Helpers (console)</button>\n ',document.body.appendChild(t);const o=document.createElement("div");o.className="dev-grid",o.style.display="none",o.innerHTML='<div class="container"><div class="row">'+Array.from({length:12}).map((()=>'<div class="col dev-column"></div>')).join("")+"</div></div>",document.body.appendChild(o);const l=(e,n)=>localStorage.setItem(e,n),d=e=>"true"===localStorage.getItem(e),i=document.getElementById("toggleGrid"),a=document.getElementById("toggleOutlines"),r=document.getElementById("toggleFluid"),c=o.firstElementChild;function s(){const e=document.body.offsetWidth;document.querySelectorAll("body *").forEach((n=>{n.getBoundingClientRect().right>e&&console.warn("Overflowing element →",n)}))}i.addEventListener("change",(e=>{const n=e.target.checked;o.style.display=n?"block":"none",r.disabled=!n,l("devGrid",n)})),a.addEventListener("change",(e=>{const n=e.target.checked;document.body.classList.toggle("dev-column-outline",n),l("devOutlines",n),n&&s()})),r.addEventListener("change",(e=>{const n=e.target.checked;c.classList.toggle("container-fluid",n),c.classList.toggle("container",!n),l("devFluid",n)})),document.getElementById("clearStorage").addEventListener("click",(()=>{localStorage.clear(),alert("localStorage cleared")})),document.getElementById("a11yCheck").addEventListener("click",(()=>{console.log("🔍 Accessibility Helpers");let n=0;document.querySelectorAll("h1,h2,h3,h4,h5,h6").forEach((e=>{const t=parseInt(e.tagName[1]);console.log(`Heading: <${e.tagName.toLowerCase()}> – ${e.textContent.trim()}`),t-n>1&&n>0&&console.warn("⚠️ Skipped heading level!"),n=t})),document.querySelectorAll("[role]").forEach((e=>{console.log(`ARIA role: <${e.tagName.toLowerCase()}> [role="${e.getAttribute("role")}"]`)})),document.querySelectorAll("img").forEach((e=>{const n=e.getAttribute("alt");n?console.log("🖼️ IMG alt:",n):console.warn("❌ Missing alt for image:",e)})),document.querySelectorAll("body *").forEach((n=>{"string"==typeof n.innerText&&n.innerText.trim()&&e(n)}))})),d("devGrid")&&(i.checked=!0,o.style.display="block",r.disabled=!1),d("devOutlines")&&(a.checked=!0,document.body.classList.add("dev-column-outline"),s()),d("devFluid")&&(r.checked=!0,c.classList.remove("container"),c.classList.add("container-fluid"));let g=window.pageYOffset,u=!1;window.addEventListener("scroll",(()=>{u||(requestAnimationFrame((()=>{Math.abs(window.pageYOffset-g)>=5&&(t.classList.toggle("hidden",window.pageYOffset>g),g=window.pageYOffset),u=!1})),u=!0)}))}();