@vtbag/turn-signal
Version:
Turn-Signal is a lightweight script that enhances cross-document navigation by detecting the direction of browser navigation. It enables developers to create smooth, responsive transitions that adjust based on forward or backward navigation, delivering a
2 lines (1 loc) • 1.92 kB
JavaScript
;(()=>{var v=null,d=()=>{document.addEventListener("click",t=>{let n=t.composedPath()[0];v=n instanceof Element?n.closest("a, area"):null})};addEventListener("DOMContentLoaded",d);function c(){return v}var o,a,l,i,g,y=t=>{history.state?.vtbagId??history.replaceState({vtbagId:history.length},""),a=parseInt(sessionStorage.getItem("vtbag-id")??"NaN",10),i=history.state.vtbagId,o=sessionStorage.getItem("vtbag-navigation-type"),sessionStorage.setItem("vtbag-id",""+i),l=sessionStorage.getItem("vtbag-from"),g=sessionStorage.getItem("vtbag-to")};addEventListener("pagereveal",y);var f=t=>{t.activation&&(o=t.activation.navigationType,l=t.activation.from?.url??"",g=t.activation.entry.url??"",a=history.state?.vtbagId,i=o==="push"?a+(l===g?0:1):o==="replace"?a:t.activation.entry.index!==-1?a+(t.activation.entry.index-(t.activation.from?.index??-1)):NaN,sessionStorage.setItem("vtbag-navigation-type",o),sessionStorage.setItem("vtbag-from",l),sessionStorage.setItem("vtbag-to",g))};addEventListener("pageswap",f);var S="data-vtbag-link-types",p="vtbag-all-link-types",u=t=>{let n=c();if(!t.viewTransition)return;let s=JSON.parse(sessionStorage.getItem(p)??"[]"),e="";if(!isNaN(i))if(i<a)e=(s[i]??"").split(/\s*\/\s*/)[0]??"";else{o==="traverse"?e=s[a]??"":(n&&(e=n.getAttribute(S)??""),s[a]=e,sessionStorage.setItem(p,JSON.stringify(s)));let r=e.split(/\s*\/\s*/);a===i?e=r[~~((r.length-1)/2)]??"":e=r[r.length-1]??""}m(e+" old",t)};addEventListener("pageswap",u);var T=t=>{if(!t.viewTransition)return;let n=JSON.parse(sessionStorage.getItem(p)??"[]"),s=n[i]??"";if(i<a)s=s.split(/\s*\/\s*/)[0]??"";else{let e=(n[a]??"").split(/\s*\/\s*/);a===i?s=e[~~((e.length-1)/2)]??"":s=e[e.length-1]??""}m(s+" new",t)};addEventListener("pagereveal",T);function m(t,n){let s=t.trim().split(/\s+/);s.length>1&&s[0]==="none"&&s.shift()&&n.viewTransition?.types?.clear(),s.forEach(e=>n.viewTransition?.types?.add(e))}})();