swup
Version:
Versatile and extensible page transition library for server-rendered websites
3 lines (2 loc) • 24.5 kB
JavaScript
var t=require("delegate-it"),e=require("path-to-regexp");function n(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var r=/*#__PURE__*/n(t);const o=(t,e)=>String(t).toLowerCase().replace(/[\s/_.]+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+|-+$/g,"")||e||"",i=({hash:t}={})=>window.location.pathname+window.location.search+(t?window.location.hash:""),s=(t,e={})=>{const n={url:t=t||i({hash:!0}),random:Math.random(),source:"swup",...e};window.history.pushState(n,"",t)},a=(t=null,e={})=>{t=t||i({hash:!0});const n={...window.history.state||{},url:t,random:Math.random(),source:"swup",...e};window.history.replaceState(n,"",t)},c=(t,e,n,o)=>{const i=new AbortController;return o={...o,signal:i.signal},r.default(t,e,n,o),{destroy:()=>i.abort()}};class l extends URL{constructor(t,e=document.baseURI){super(t.toString(),e),Object.setPrototypeOf(this,l.prototype)}get url(){return this.pathname+this.search}static fromElement(t){const e=t.getAttribute("href")||t.getAttribute("xlink:href")||"";return new l(e)}static fromUrl(t){return new l(t)}}const h=function(t,e={}){try{const r=this;function n(n){const{status:i,url:s}=h;return Promise.resolve(h.text()).then(function(n){if(500===i)throw r.hooks.call("fetch:error",o,{status:i,response:h,url:s}),new u(`Server error: ${s}`,{status:i,url:s});if(!n)throw new u(`Empty response: ${s}`,{status:i,url:s});const{url:a}=l.fromUrl(s),c={url:a,html:n};return!o.cache.write||e.method&&"GET"!==e.method||t!==a||r.cache.set(c.url,c),c})}t=l.fromUrl(t).url;const{visit:o=r.visit}=e,i={...r.options.requestHeaders,...e.headers},s=e.timeout??r.options.timeout,a=new AbortController,{signal:c}=a;e={...e,headers:i,signal:c};let h,d=!1,f=null;s&&s>0&&(f=setTimeout(()=>{d=!0,a.abort("timeout")},s));const m=function(n,i){try{var s=Promise.resolve(r.hooks.call("fetch:request",o,{url:t,options:e},(t,{url:e,options:n})=>fetch(e,n))).then(function(t){h=t,f&&clearTimeout(f)})}catch(t){return i(t)}return s&&s.then?s.then(void 0,i):s}(0,function(e){if(d)throw r.hooks.call("fetch:timeout",o,{url:t}),new u(`Request timed out: ${t}`,{url:t,timedOut:d});if("AbortError"===e?.name||c.aborted)throw new u(`Request aborted: ${t}`,{url:t,aborted:!0});throw e});return Promise.resolve(m&&m.then?m.then(n):n())}catch(p){return Promise.reject(p)}};class u extends Error{constructor(t,e){super(t),this.url=void 0,this.status=void 0,this.aborted=void 0,this.timedOut=void 0,this.name="FetchError",this.url=e.url,this.status=e.status,this.aborted=e.aborted||!1,this.timedOut=e.timedOut||!1}}class d{constructor(t){this.swup=void 0,this.pages=new Map,this.swup=t}get size(){return this.pages.size}get all(){const t=new Map;return this.pages.forEach((e,n)=>{t.set(n,{...e})}),t}has(t){return this.pages.has(this.resolve(t))}get(t){const e=this.pages.get(this.resolve(t));return e?{...e}:e}set(t,e){t=this.resolve(t),e={...e,url:t},this.pages.set(t,e),this.swup.hooks.callSync("cache:set",void 0,{page:e})}update(t,e){t=this.resolve(t);const n={...this.get(t),...e,url:t};this.pages.set(t,n)}delete(t){this.pages.delete(this.resolve(t))}clear(){this.pages.clear(),this.swup.hooks.callSync("cache:clear",void 0,void 0)}prune(t){this.pages.forEach((e,n)=>{t(n,e)&&this.delete(n)})}resolve(t){const{url:e}=l.fromUrl(t);return this.swup.resolveUrl(e)}}const f=(t,e=document)=>e.querySelector(t),m=(t,e=document)=>Array.from(e.querySelectorAll(t)),p=()=>new Promise(t=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{t()})})});function v(t){return!!t&&("object"==typeof t||"function"==typeof t)&&"function"==typeof t.then}function g(t,e=[]){return new Promise((n,r)=>{const o=t(...e);v(o)?o.then(n,r):n(o)})}class w{constructor(t){this.swup=void 0,this.swupClasses=["to-","is-changing","is-rendering","is-popstate","is-animating","is-leaving"],this.swup=t}get selectors(){const{scope:t}=this.swup.visit.animation;return"containers"===t?this.swup.visit.containers:"html"===t?["html"]:Array.isArray(t)?t:[]}get selector(){return this.selectors.join(",")}get targets(){return this.selector.trim()?m(this.selector):[]}add(){this.targets.forEach(t=>t.classList.add(...[].slice.call(arguments)))}remove(){this.targets.forEach(t=>t.classList.remove(...[].slice.call(arguments)))}clear(){this.targets.forEach(t=>{const e=t.className.split(" ").filter(t=>this.isSwupClass(t));t.classList.remove(...e)})}isSwupClass(t){return this.swupClasses.some(e=>t.startsWith(e))}}class y{constructor(t,e){this.id=void 0,this.state=void 0,this.from=void 0,this.to=void 0,this.containers=void 0,this.animation=void 0,this.trigger=void 0,this.cache=void 0,this.history=void 0,this.scroll=void 0;const{to:n,from:r=t.currentPageUrl,hash:o,el:i,event:s}=e;this.id=Math.random(),this.state=1,this.from={url:r},this.to={url:n,hash:o},this.containers=t.options.containers,this.animation={animate:!0,wait:!1,name:void 0,native:t.options.native,scope:t.options.animationScope,selector:t.options.animationSelector},this.trigger={el:i,event:s},this.cache={read:t.options.cache,write:t.options.cache},this.history={action:"push",popstate:!1,direction:void 0},this.scroll={reset:!0,target:void 0}}advance(t){this.state<t&&(this.state=t)}abort(){this.state=8}get done(){return this.state>=7}}function P(t){return new y(this,t)}const k="undefined"!=typeof Symbol?Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator")):"@@iterator";function b(t,e,n){if(!t.s){if(n instanceof S){if(!n.s)return void(n.o=b.bind(null,t,e));1&e&&(e=n.s),n=n.v}if(n&&n.then)return void n.then(b.bind(null,t,e),b.bind(null,t,2));t.s=e,t.v=n;const r=t.o;r&&r(t)}}const S=/*#__PURE__*/function(){function t(){}return t.prototype.then=function(e,n){const r=new t,o=this.s;if(o){const t=1&o?e:n;if(t){try{b(r,1,t(this.v))}catch(t){b(r,2,t)}return r}return this}return this.o=function(t){try{const o=t.v;1&t.s?b(r,1,e?e(o):o):n?b(r,1,n(o)):b(r,2,o)}catch(t){b(r,2,t)}},r},t}();function E(t){return t instanceof S&&1&t.s}class x{constructor(t){this.swup=void 0,this.registry=new Map,this.hooks=["animation:out:start","animation:out:await","animation:out:end","animation:in:start","animation:in:await","animation:in:end","animation:skip","cache:clear","cache:set","content:replace","content:scroll","enable","disable","fetch:request","fetch:error","fetch:timeout","history:popstate","link:click","link:self","link:anchor","link:newtab","page:load","page:view","scroll:top","scroll:anchor","visit:start","visit:transition","visit:abort","visit:end"],this.swup=t,this.init()}init(){this.hooks.forEach(t=>this.create(t))}create(t){this.registry.has(t)||this.registry.set(t,new Map)}exists(t){return this.registry.has(t)}get(t){const e=this.registry.get(t);if(e)return e;console.error(`Unknown hook '${t}'`)}clear(){this.registry.forEach(t=>t.clear())}on(t,e,n={}){const r=this.get(t);if(!r)return console.warn(`Hook '${t}' not found.`),()=>{};const o={...n,id:r.size+1,hook:t,handler:e};return r.set(e,o),()=>this.off(t,e)}before(t,e,n={}){return this.on(t,e,{...n,before:!0})}replace(t,e,n={}){return this.on(t,e,{...n,replace:!0})}once(t,e,n={}){return this.on(t,e,{...n,once:!0})}off(t,e){const n=this.get(t);n&&e?n.delete(e)||console.warn(`Handler for hook '${t}' not found.`):n&&n.clear()}call(t,e,n,r){try{const o=this,[i,s,a]=o.parseCallArgs(t,e,n,r),{before:c,handler:l,after:h}=o.getHandlers(t,a);return Promise.resolve(o.run(c,i,s)).then(function(){return Promise.resolve(o.run(l,i,s,!0)).then(function([e]){return Promise.resolve(o.run(h,i,s)).then(function(){return o.dispatchDomEvent(t,i,s),e})})})}catch(t){return Promise.reject(t)}}callSync(t,e,n,r){const[o,i,s]=this.parseCallArgs(t,e,n,r),{before:a,handler:c,after:l}=this.getHandlers(t,s);this.runSync(a,o,i);const[h]=this.runSync(c,o,i,!0);return this.runSync(l,o,i),this.dispatchDomEvent(t,o,i),h}parseCallArgs(t,e,n,r){return e instanceof y||"object"!=typeof e&&"function"!=typeof n?[e,n,r]:[void 0,e,n]}run(t,e,n,r=!1){try{let o;const i=this;void 0===e&&(e=i.swup.visit);const s=[],a=function(t,e,n){if("function"==typeof t[k]){var r,o,i,s=t[k]();if(function t(a){try{for(;!((r=s.next()).done||n&&n());)if((a=e(r.value))&&a.then){if(!E(a))return void a.then(t,i||(i=b.bind(null,o=new S,2)));a=a.v}o?b(o,1,a):o=a}catch(t){b(o||(o=new S),2,t)}}(),s.return){var a=function(t){try{r.done||s.return()}catch(t){}return t};if(o&&o.then)return o.then(a,function(t){throw a(t)});a()}return o}if(!("length"in t))throw new TypeError("Object is not iterable");for(var c=[],l=0;l<t.length;l++)c.push(t[l]);return function(t,e,n){var r,o,i=-1;return function s(a){try{for(;++i<t.length&&(!n||!n());)if((a=e(i))&&a.then){if(!E(a))return void a.then(s,o||(o=b.bind(null,r=new S,2)));a=a.v}r?b(r,1,a):r=a}catch(t){b(r||(r=new S),2,t)}}(),r}(c,function(t){return e(c[t])},n)}(t,function({hook:t,handler:o,defaultHandler:a,once:c}){if(!e?.done)return c&&i.off(t,o),function(t,r){try{var i=Promise.resolve(g(o,[e,n,a])).then(function(t){s.push(t)})}catch(t){return r(t)}return i&&i.then?i.then(void 0,r):i}(0,function(e){if(r)throw e;console.error(`Error in hook '${t}':`,e)})},function(){return o});return Promise.resolve(a&&a.then?a.then(function(t){return o?t:s}):o?a:s)}catch(t){return Promise.reject(t)}}runSync(t,e=this.swup.visit,n,r=!1){const o=[];for(const{hook:i,handler:s,defaultHandler:a,once:c}of t)if(!e?.done){c&&this.off(i,s);try{const t=s(e,n,a);o.push(t),v(t)&&console.warn(`Swup will not await Promises in handler for synchronous hook '${i}'.`)}catch(t){if(r)throw t;console.error(`Error in hook '${i}':`,t)}}return o}getHandlers(t,e){const n=this.get(t);if(!n)return{found:!1,before:[],handler:[],after:[],replaced:!1};const r=Array.from(n.values()),o=this.sortRegistrations,i=r.filter(({before:t,replace:e})=>t&&!e).sort(o),s=r.filter(({replace:t})=>t).filter(t=>!0).sort(o),a=r.filter(({before:t,replace:e})=>!t&&!e).sort(o),c=s.length>0;let l=[];if(e&&(l=[{id:0,hook:t,handler:e}],c)){const n=s.length-1,r=t=>{const n=s[t-1];return n?(e,o)=>n.handler(e,o,r(t-1)):e};l=[{id:0,hook:t,handler:s[n].handler,defaultHandler:r(n)}]}return{found:!0,before:i,handler:l,after:a,replaced:c}}sortRegistrations(t,e){return(t.priority??0)-(e.priority??0)||t.id-e.id||0}dispatchDomEvent(t,e,n){if(e?.done)return;const r={hook:t,args:n,visit:e||this.swup.visit};document.dispatchEvent(new CustomEvent("swup:any",{detail:r,bubbles:!0})),document.dispatchEvent(new CustomEvent(`swup:${t}`,{detail:r,bubbles:!0}))}}const U=t=>{if(t&&"#"===t.charAt(0)&&(t=t.substring(1)),!t)return null;const e=decodeURIComponent(t);let n=document.getElementById(t)||document.getElementById(e)||f(`a[name='${CSS.escape(t)}']`)||f(`a[name='${CSS.escape(e)}']`);return n||"top"!==t||(n=document.body),n},C=function({elements:t,selector:e}){try{if(!1===e&&!t)return Promise.resolve();let n=[];if(t)n=Array.from(t);else if(e&&(n=m(e,document.body),!n.length))return console.warn(`[swup] No elements found matching animationSelector \`${e}\``),Promise.resolve();const r=n.map(t=>function(t){const{type:e,timeout:n,propCount:r}=function(t){const e=window.getComputedStyle(t),n=H(e,`${$}Delay`),r=H(e,`${$}Duration`),o=q(n,r),i=H(e,`${A}Delay`),s=H(e,`${A}Duration`),a=q(i,s),c=Math.max(o,a),l=c>0?o>a?$:A:null;return{type:l,timeout:c,propCount:l?l===$?r.length:s.length:0}}(t);return!(!e||!n)&&new Promise(o=>{const i=`${e}end`,s=performance.now();let a=0;const c=()=>{t.removeEventListener(i,l),o()},l=e=>{if(e.target===t){if(!function(t){return[`${$}end`,`${A}end`].includes(t.type)}(e))throw new Error("Not a transition or animation event.");(performance.now()-s)/1e3<e.elapsedTime||++a>=r&&c()}};setTimeout(()=>{a<r&&c()},n+1),t.addEventListener(i,l)})}(t));return r.filter(Boolean).length>0?Promise.resolve(Promise.all(r)).then(function(){}):(e&&console.warn(`[swup] No CSS animation duration defined on elements matching \`${e}\``),Promise.resolve())}catch(t){return Promise.reject(t)}},$="transition",A="animation";function H(t,e){return(t[e]||"").split(", ")}function q(t,e){for(;t.length<e.length;)t=t.concat(t);return Math.max(...e.map((e,n)=>j(e)+j(t[n])))}function j(t){return 1e3*parseFloat(t)}const R=function(t,e={}){try{let r;const c=this;function n(n){if(r)return n;c.navigating=!0,c.visit=t;const{el:l}=t.trigger;e.referrer=e.referrer||c.currentPageUrl,!1===e.animate&&(t.animation.animate=!1),t.animation.animate||c.classes.clear();const h=e.history||l?.getAttribute("data-swup-history")||void 0;h&&["push","replace"].includes(h)&&(t.history.action=h);const u=e.animation||l?.getAttribute("data-swup-animation")||void 0;return u&&(t.animation.name=u),"object"==typeof e.cache?(t.cache.read=e.cache.read??t.cache.read,t.cache.write=e.cache.write??t.cache.write):void 0!==e.cache&&(t.cache={read:!!e.cache,write:!!e.cache}),delete e.cache,function(n,r){try{var l=function(n,r){try{var l=Promise.resolve(c.hooks.call("visit:start",t,void 0)).then(function(){function n(){if(!t.done)return Promise.resolve(c.hooks.call("visit:transition",t,void 0,function(){try{let n;function e(e){return n?e:(t.advance(4),Promise.resolve(c.animatePageOut(t)).then(function(){function e(){return Promise.resolve(c.animatePageIn(t)).then(function(){})}const n=function(){if(t.animation.native&&document.startViewTransition)return Promise.resolve(document.startViewTransition(function(){try{const e=c.renderPage;return Promise.resolve(r).then(function(n){return Promise.resolve(e.call(c,t,n))})}catch(t){return Promise.reject(t)}}).finished).then(function(){});{const e=c.renderPage;return Promise.resolve(r).then(function(n){return Promise.resolve(e.call(c,t,n)).then(function(){})})}}();return n&&n.then?n.then(e):e()}))}const o=function(){if(!t.animation.animate)return Promise.resolve(c.hooks.call("animation:skip",void 0)).then(function(){const e=c.renderPage;return Promise.resolve(r).then(function(r){return Promise.resolve(e.call(c,t,r)).then(function(){n=1})})})}();return Promise.resolve(o&&o.then?o.then(e):e(o))}catch(i){return Promise.reject(i)}})).then(function(){if(!t.done)return Promise.resolve(c.hooks.call("visit:end",t,void 0,()=>c.classes.clear())).then(function(){t.state=7,c.navigating=!1,c.onVisitEnd&&(c.onVisitEnd(),c.onVisitEnd=void 0)})})}t.state=3;const r=c.hooks.call("page:load",t,{options:e},function(t,e){try{function n(t){return e.page=t,e.cache=!!r,e.page}let r;return t.cache.read&&(r=c.cache.get(t.to.url)),Promise.resolve(r?n(r):Promise.resolve(c.fetchPage(t.to.url,e.options)).then(n))}catch(o){return Promise.reject(o)}});if(r.then(({html:e})=>{t.advance(5),t.to.html=e,t.to.document=(new DOMParser).parseFromString(e,"text/html")}),!t.history.popstate){const e=t.to.url+t.to.hash;"replace"===t.history.action||t.to.url===c.currentPageUrl?a(e):(c.currentHistoryIndex++,s(e,{index:c.currentHistoryIndex}))}c.currentPageUrl=i(),t.history.popstate&&c.classes.add("is-popstate"),t.animation.name&&c.classes.add(`to-${o(t.animation.name)}`);const l=function(){if(t.animation.wait)return Promise.resolve(r).then(function(){})}();return l&&l.then?l.then(n):n()})}catch(t){return r(t)}return l&&l.then?l.then(void 0,r):l}(0,function(e){e&&!e?.aborted?(t.state=9,console.error(e),c.options.skipPopStateHandling=()=>(window.location.assign(t.to.url+t.to.hash),!0),window.history.back()):t.state=8})}catch(t){return r(!0,t)}return l&&l.then?l.then(r.bind(null,!1),r.bind(null,!0)):r(!1,l)}(0,function(e,n){if(delete t.to.document,e)throw n;return n})}const l=function(){if(c.navigating)return function(){if(!(c.visit.state>=6))return Promise.resolve(c.hooks.call("visit:abort",c.visit,void 0)).then(function(){delete c.visit.to.document,c.visit.state=8});t.state=2,c.onVisitEnd=()=>c.performNavigation(t,e),r=1}()}();return Promise.resolve(l&&l.then?l.then(n):n(l))}catch(h){return Promise.reject(h)}};function L(t,e={},n={}){if("string"!=typeof t)throw new Error("swup.navigate() requires a URL parameter");if(this.shouldIgnoreVisit(t,{el:n.el,event:n.event}))return void window.location.assign(t);const{url:r,hash:o}=l.fromUrl(t),i=this.createVisit({...n,to:r,hash:o});this.performNavigation(i,e)}const T=function(t){try{const e=this;return Promise.resolve(e.hooks.call("animation:out:start",t,void 0,()=>{e.classes.add("is-changing","is-animating","is-leaving")})).then(function(){return Promise.resolve(e.hooks.call("animation:out:await",t,{skip:!1},(t,{skip:n})=>{if(!n)return e.awaitAnimations({selector:t.animation.selector})})).then(function(){return Promise.resolve(e.hooks.call("animation:out:end",t,void 0)).then(function(){})})})}catch(t){return Promise.reject(t)}},V=function(t){const e=t.to.document;if(!e)return!1;const n=e.querySelector("title")?.innerText||"";document.title=n;const r=m('[data-swup-persist]:not([data-swup-persist=""])'),o=t.containers.map(t=>{const n=document.querySelector(t),r=e.querySelector(t);return n&&r?(n.replaceWith(r.cloneNode(!0)),!0):(n||console.warn(`[swup] Container missing in current document: ${t}`),r||console.warn(`[swup] Container missing in incoming document: ${t}`),!1)}).filter(Boolean);return r.forEach(t=>{const e=t.getAttribute("data-swup-persist"),n=f(`[data-swup-persist="${e}"]`);n&&n!==t&&n.replaceWith(t)}),o.length===t.containers.length},I=function(t){const e={behavior:"auto"},{target:n,reset:r}=t.scroll,o=n??t.to.hash;let i=!1;return o&&(i=this.hooks.callSync("scroll:anchor",t,{hash:o,options:e},(t,{hash:e,options:n})=>{const r=this.getAnchorElement(e);return r&&r.scrollIntoView(n),!!r})),r&&!i&&(i=this.hooks.callSync("scroll:top",t,{options:e},(t,{options:e})=>(window.scrollTo({top:0,left:0,...e}),!0))),i},N=function(t){try{const e=this;if(t.done)return Promise.resolve();const n=e.hooks.call("animation:in:await",t,{skip:!1},(t,{skip:n})=>{if(!n)return e.awaitAnimations({selector:t.animation.selector})});return Promise.resolve(p()).then(function(){return Promise.resolve(e.hooks.call("animation:in:start",t,void 0,()=>{e.classes.remove("is-animating")})).then(function(){return Promise.resolve(n).then(function(){return Promise.resolve(e.hooks.call("animation:in:end",t,void 0)).then(function(){})})})})}catch(t){return Promise.reject(t)}},D=function(t,e){try{const n=this;if(t.done)return Promise.resolve();t.advance(6);const{url:r}=e;return n.isSameResolvedUrl(i(),r)||(a(r),n.currentPageUrl=i(),t.to.url=n.currentPageUrl),Promise.resolve(n.hooks.call("content:replace",t,{page:e},(t,{})=>{if(n.classes.remove("is-leaving"),t.animation.animate&&n.classes.add("is-rendering"),!n.replaceContent(t))throw new Error("[swup] Container mismatch, aborting");t.animation.animate&&(n.classes.add("is-changing","is-animating","is-rendering"),t.animation.name&&n.classes.add(`to-${o(t.animation.name)}`))})).then(function(){return Promise.resolve(n.hooks.call("content:scroll",t,void 0,()=>n.scrollToContent(t))).then(function(){return Promise.resolve(n.hooks.call("page:view",t,{url:n.currentPageUrl,title:document.title})).then(function(){})})})}catch(t){return Promise.reject(t)}},M=function(t){var e;if(e=t,Boolean(e?.isSwupPlugin)){if(t.swup=this,!t._checkRequirements||t._checkRequirements())return t._beforeMount&&t._beforeMount(),t.mount(),this.plugins.push(t),this.plugins}else console.error("Not a swup plugin instance",t)};function O(t){const e=this.findPlugin(t);if(e)return e.unmount(),e._afterUnmount&&e._afterUnmount(),this.plugins=this.plugins.filter(t=>t!==e),this.plugins;console.error("No such plugin",e)}function W(t){return this.plugins.find(e=>e===t||e.name===t||e.name===`Swup${String(t)}`)}function B(t){if("function"!=typeof this.options.resolveUrl)return console.warn("[swup] options.resolveUrl expects a callback function."),t;const e=this.options.resolveUrl(t);return e&&"string"==typeof e?e.startsWith("//")||e.startsWith("http")?(console.warn("[swup] options.resolveUrl needs to return a relative url"),t):e:(console.warn("[swup] options.resolveUrl needs to return a url"),t)}function _(t,e){return this.resolveUrl(t)===this.resolveUrl(e)}const F={animateHistoryBrowsing:!1,animationSelector:'[class*="transition-"]',animationScope:"html",cache:!0,containers:["#swup"],ignoreVisit:(t,{el:e}={})=>!!e?.closest("[data-no-swup]"),linkSelector:"a[href]",linkToSelf:"scroll",native:!1,plugins:[],resolveUrl:t=>t,requestHeaders:{"X-Requested-With":"swup",Accept:"text/html, application/xhtml+xml"},skipPopStateHandling:t=>"swup"!==t.state?.source,timeout:0};exports.Location=l,exports.classify=o,exports.createHistoryRecord=s,exports.default=class{constructor(t={}){this.version="4.6.1",this.options=void 0,this.defaults=F,this.plugins=[],this.visit=void 0,this.cache=void 0,this.hooks=void 0,this.classes=void 0,this.currentPageUrl=i(),this.currentHistoryIndex=void 0,this.clickDelegate=void 0,this.navigating=!1,this.onVisitEnd=void 0,this.use=M,this.unuse=O,this.findPlugin=W,this.log=()=>{},this.navigate=L,this.performNavigation=R,this.createVisit=P,this.delegateEvent=c,this.fetchPage=h,this.awaitAnimations=C,this.renderPage=D,this.replaceContent=V,this.animatePageIn=N,this.animatePageOut=T,this.scrollToContent=I,this.getAnchorElement=U,this.getCurrentUrl=i,this.resolveUrl=B,this.isSameResolvedUrl=_,this.options={...this.defaults,...t},this.handleLinkClick=this.handleLinkClick.bind(this),this.handlePopState=this.handlePopState.bind(this),this.cache=new d(this),this.classes=new w(this),this.hooks=new x(this),this.visit=this.createVisit({to:""}),this.currentHistoryIndex=window.history.state?.index??1,this.enable()}enable(){try{const t=this,{linkSelector:e}=t.options;return t.clickDelegate=t.delegateEvent(e,"click",t.handleLinkClick),window.addEventListener("popstate",t.handlePopState),t.options.animateHistoryBrowsing&&(window.history.scrollRestoration="manual"),t.options.native=t.options.native&&!!document.startViewTransition,t.options.plugins.forEach(e=>t.use(e)),"swup"!==window.history.state?.source&&a(null,{index:t.currentHistoryIndex}),Promise.resolve(p()).then(function(){return Promise.resolve(t.hooks.call("enable",void 0,void 0,()=>{const e=document.documentElement;e.classList.add("swup-enabled"),e.classList.toggle("swup-native",t.options.native)})).then(function(){})})}catch(t){return Promise.reject(t)}}destroy(){try{const t=this;return t.clickDelegate.destroy(),window.removeEventListener("popstate",t.handlePopState),t.cache.clear(),t.options.plugins.forEach(e=>t.unuse(e)),Promise.resolve(t.hooks.call("disable",void 0,void 0,()=>{const t=document.documentElement;t.classList.remove("swup-enabled"),t.classList.remove("swup-native")})).then(function(){t.hooks.clear()})}catch(t){return Promise.reject(t)}}shouldIgnoreVisit(t,{el:e,event:n}={}){const{origin:r,url:o,hash:i}=l.fromUrl(t);return r!==window.location.origin||!(!e||!this.triggerWillOpenNewWindow(e))||!!this.options.ignoreVisit(o+i,{el:e,event:n})}handleLinkClick(t){const e=t.delegateTarget,{href:n,url:r,hash:o}=l.fromElement(e);if(this.shouldIgnoreVisit(n,{el:e,event:t}))return;if(this.navigating&&r===this.visit.to.url)return void t.preventDefault();const i=this.createVisit({to:r,hash:o,el:e,event:t});t.metaKey||t.ctrlKey||t.shiftKey||t.altKey?this.hooks.callSync("link:newtab",i,{href:n}):0===t.button&&this.hooks.callSync("link:click",i,{el:e,event:t},()=>{const e=i.from.url??"";t.preventDefault(),r&&r!==e?this.isSameResolvedUrl(r,e)||this.performNavigation(i):o?this.hooks.callSync("link:anchor",i,{hash:o},()=>{a(r+o),this.scrollToContent(i)}):this.hooks.callSync("link:self",i,void 0,()=>{"navigate"===this.options.linkToSelf?this.performNavigation(i):(a(r),this.scrollToContent(i))})})}handlePopState(t){const e=t.state?.url??window.location.href;if(this.options.skipPopStateHandling(t))return;if(this.isSameResolvedUrl(i(),this.currentPageUrl))return;const{url:n,hash:r}=l.fromUrl(e),o=this.createVisit({to:n,hash:r,event:t});o.history.popstate=!0;const s=t.state?.index??0;s&&s!==this.currentHistoryIndex&&(o.history.direction=s-this.currentHistoryIndex>0?"forwards":"backwards",this.currentHistoryIndex=s),o.animation.animate=!1,o.scroll.reset=!1,o.scroll.target=!1,this.options.animateHistoryBrowsing&&(o.animation.animate=!0,o.scroll.reset=!0),this.hooks.callSync("history:popstate",o,{event:t},()=>{this.performNavigation(o)})}triggerWillOpenNewWindow(t){return!!t.matches('[download], [target="_blank"]')}},exports.delegateEvent=c,exports.forceReflow=function(t){t=t||document.body,t?.getBoundingClientRect()},exports.getCurrentUrl=i,exports.isPromise=v,exports.matchPath=(t,n)=>{try{return e.match(t,n)}catch(e){throw new Error(`[swup] Error parsing path "${String(t)}":\n${String(e)}`)}},exports.nextTick=p,exports.query=f,exports.queryAll=m,exports.runAsPromise=g,exports.updateHistoryRecord=a;
//# sourceMappingURL=Swup.cjs.map