Current section
Files
Jump to
Current section
Files
priv/default_theme/assets/js/enhancements.min.js
/* 1. Reading progress bar */
(function(){var a=document.querySelector("article"),p=a&&a.querySelector(".prose");if(!a||!p)return;var b=document.createElement("div");b.id="reading-progress";document.body.appendChild(b);window.addEventListener("scroll",function(){var r=a.getBoundingClientRect(),t=a.offsetHeight-window.innerHeight;if(t>0)b.style.width=Math.min(Math.max(-r.top/t,0),1)*100+"%"},{passive:true})})();
/* 2. ToC scroll-spy */
(function(){var tl=document.querySelectorAll('aside nav ul li a[href^="#"]');if(!tl.length)return;var ids=[];tl.forEach(function(a){ids.push(a.getAttribute("href").slice(1))});var h=ids.map(function(id){return document.getElementById(id)}).filter(Boolean);if(!h.length)return;var o=new IntersectionObserver(function(entries){entries.forEach(function(e){var l=document.querySelector('aside nav ul li a[href="#'+e.target.id+'"]');if(l&&e.isIntersecting){tl.forEach(function(a){a.classList.remove("toc-active")});l.classList.add("toc-active")}})},{rootMargin:"-80px 0px -70% 0px",threshold:0});h.forEach(function(el){o.observe(el)})})();
/* 3. Mobile menu toggle + Escape key */
(function(){var t=document.getElementById("menu-toggle");if(!t)return;var m=document.getElementById("mobile-menu"),o=document.querySelector(".menu-open"),c=document.querySelector(".menu-close");t.addEventListener("click",function(){var h=m.classList.contains("hidden");m.classList.toggle("hidden");o.classList.toggle("hidden",h);c.classList.toggle("hidden",!h);t.setAttribute("aria-expanded",String(h))});document.addEventListener("keydown",function(e){if(e.key==="Escape"&&m&&!m.classList.contains("hidden")){m.classList.add("hidden");o.classList.remove("hidden");c.classList.add("hidden");t.setAttribute("aria-expanded","false");t.focus()}})})();
/* 4. Language switcher dropdown */
(function(){function init(v){var sfx=v?"-"+v:"",s=document.getElementById("lang-switcher"+sfx);if(!s)return;var b=document.getElementById("lang-toggle"+sfx),m=document.getElementById("lang-menu"+sfx);b.addEventListener("click",function(e){e.stopPropagation();var h=m.classList.contains("hidden");m.classList.toggle("hidden");b.setAttribute("aria-expanded",String(h))});document.addEventListener("click",function(e){if(!s.contains(e.target)){m.classList.add("hidden");b.setAttribute("aria-expanded","false")}});document.addEventListener("keydown",function(e){if(e.key==="Escape"&&!m.classList.contains("hidden")){m.classList.add("hidden");b.setAttribute("aria-expanded","false");b.focus()}})}init("desktop");init("mobile")})();
/* 5. Code copy buttons */
(function(){var c=document.getElementById("sayfa-code-copy");if(!c)return;var sel=c.getAttribute("data-selector")||"pre code",ct=c.getAttribute("data-copy-text")||"Copy",cd=c.getAttribute("data-copied-text")||"Copied!";document.querySelectorAll(sel).forEach(function(block){var pre=block.parentNode;if(pre.parentNode.classList.contains("not-prose"))return;var lang=block.className.replace(/^language-/,"")||"";var w=document.createElement("div");w.className="not-prose my-6 max-w-full rounded-lg overflow-hidden border border-slate-200 dark:border-slate-700";var h=document.createElement("div");h.className="flex items-center justify-between px-4 py-2 bg-slate-800 text-slate-400";h.innerHTML='<span class="text-xs font-mono">'+lang+'</span><button class="copy-btn inline-flex items-center gap-1.5 text-xs text-slate-400 hover:text-slate-200"><svg class="w-3.5 h-3.5 icon-copy" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg><svg class="w-3.5 h-3.5 icon-check text-green-400" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg><span class="copy-label">'+ct+"</span></button>";var btn=h.querySelector(".copy-btn");btn.addEventListener("click",function(){var code=btn.closest(".not-prose").querySelector("code").textContent;navigator.clipboard.writeText(code).then(function(){btn.classList.add("copied");btn.querySelector(".copy-label").textContent=cd;setTimeout(function(){btn.classList.remove("copied");btn.querySelector(".copy-label").textContent=ct},2000)}).catch(function(){})});pre.style.margin="0";pre.className="p-4 bg-slate-900 text-slate-100 overflow-x-auto m-0";var p=pre.parentNode;p.insertBefore(w,pre);w.appendChild(h);w.appendChild(pre)})})();
/* 6. Copy link buttons */
(function(){document.addEventListener("click",function(e){var b=e.target.closest('[data-action="copy-link"]');if(!b)return;var s=b.querySelector("span"),ct=b.getAttribute("data-copy-text"),cd=b.getAttribute("data-copied-text");navigator.clipboard.writeText(window.location.href).then(function(){s.textContent=cd;setTimeout(function(){s.textContent=ct},2000)}).catch(function(){})})})();