diff --git a/assets/scripts/modules.js b/assets/scripts/modules.js index c3d4373..4848ae9 100644 --- a/assets/scripts/modules.js +++ b/assets/scripts/modules.js @@ -1,3 +1,4 @@ -export {default as Example} from './modules/Example'; +// export {default as Example} from './modules/Example'; +export {default as Dialog} from './modules/Dialog'; export {default as Load} from './modules/Load'; export {default as Scroll} from './modules/Scroll'; diff --git a/assets/scripts/modules/Dialog.js b/assets/scripts/modules/Dialog.js new file mode 100644 index 0000000..7458cdc --- /dev/null +++ b/assets/scripts/modules/Dialog.js @@ -0,0 +1,36 @@ +import { module } from 'modujs'; + +export default class extends module { + constructor(m) { + super(m); + + this.$closeBtn = this.$('close')[0] + } + + init() { + // Prevent ESC to close dialog + this.onKeyDown = this.onKeyDown.bind(this) + } + + onKeyDown(e) { + if(e.key === 'Escape') { + console.log('ESCAPE'); + e.preventDefault() + this.$closeBtn.click(); + } + } + + populate(container) { + this.el.appendChild(container) + } + + show() { + this.el.showModal(); + window.addEventListener('keydown', this.onKeyDown); + } + + close() { + window.removeEventListener('keydown', this.onKeyDown); + this.el.close(); + } +} diff --git a/assets/scripts/modules/Load.js b/assets/scripts/modules/Load.js index 8ff708e..ff01e21 100644 --- a/assets/scripts/modules/Load.js +++ b/assets/scripts/modules/Load.js @@ -1,5 +1,6 @@ import { module } from 'modujs'; -import modularLoad from 'modularload'; +import Swup from 'swup'; +import SwupFragmentPlugin from '@swup/fragment-plugin'; export default class extends module { constructor(m) { @@ -7,16 +8,70 @@ export default class extends module { } init() { - const load = new modularLoad({ - enterDelay: 0, - transitions: { - customTransition: {} + const load = new Swup({ + containers: ['[data-load-container]'], + // cache: false, + plugins: [ + new SwupFragmentPlugin({ + rules: [ + { + from: ['/','/index.php','/index.php/per_page/:per_page/page/:page'], + to: ['/','/index.php','/index.php/per_page/:per_page/page/:page'], + containers: ['#paginated'] + }, + { + from: ['/','/index.php', '/index.php/per_page/:per_page/page/:page'], + to: ['/index.php/modal/:modal'], + containers: ['#modal'], + name: 'open-modal' + }, + { + from: ['/index.php/modal/:modal'], + to: ['/index.php/modal/:modal'], + containers: ['#modal'], + name: 'modal-update' + }, + { + from: ['/index.php/modal/:modal'], + to: ['/','/index.php', '/index.php/per_page/:per_page/page/:page'], + containers: ['#modal', '#paginated'], + name: 'close-modal' + }, + ] + }) + ] + }); + + load.hooks.before('content:replace', async (visit) => { + console.log('before content replace:', visit); + + for(let container of visit.containers) { + const oldContainer = this.el.querySelector(container) + console.log('old container: ', oldContainer) + this.call('destroy', oldContainer, 'app'); } }); - load.on('loaded', (transition, oldContainer, newContainer) => { - this.call('destroy', oldContainer, 'app'); - this.call('update', newContainer, 'app'); + load.hooks.on('content:replace', (visit) => { + console.log('On content replace:', visit); + + if(visit.fragmentVisit) { + if(visit.fragmentVisit.name == 'open-modal') { + this.call('populate', document.getElementById('modal'), 'Dialog'); + this.call('show', null, 'Dialog') + } else if(visit.fragmentVisit.name == 'close-modal') { + this.call('close', null, 'Dialog') + } + } + + for(let container of visit.containers) { + const newContainer = this.el.querySelector(container) + console.log('new container: ', newContainer) + newContainer.classList.add('transition-fade') + this.call('update', newContainer, 'app'); + } }); + + console.log(this, load); } } diff --git a/assets/styles/elements/_document.scss b/assets/styles/elements/_document.scss index d95162d..dcc494d 100644 --- a/assets/styles/elements/_document.scss +++ b/assets/styles/elements/_document.scss @@ -69,3 +69,27 @@ a { color: $color-link-hover; } } + +/* Define a transition duration during page visits */ +html.is-changing .transition-fade { + transition: opacity 0.1s; + opacity: 1; +} +/* Define the styles for the unloaded pages */ +html.is-animating .transition-fade { + opacity: 0; +} + +#paginated.is-changing { + transition: opacity 250ms; +} +#paginated.is-animating { + opacity: 0; +} + +#modal.is-changing { + transition: opacity 100ms; +} +#modal.is-animating { + opacity: 0; +} diff --git a/package-lock.json b/package-lock.json index df163e4..3109621 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,13 @@ "name": "@locomotivemtl/boilerplate", "version": "1.0.0", "dependencies": { + "@swup/fragment-plugin": "^0.3.7", "locomotive-scroll": "^5.0.0-beta.9", "modujs": "^1.4.2", "modularload": "^1.2.6", "normalize.css": "^8.0.1", - "svg4everybody": "^2.1.9" + "svg4everybody": "^2.1.9", + "swup": "^4.5.1" }, "devDependencies": { "autoprefixer": "^10.4.13", @@ -395,6 +397,25 @@ "resolved": "https://registry.npmjs.org/@studio-freight/lenis/-/lenis-1.0.27.tgz", "integrity": "sha512-1I6EaWR9rxdFjIJtF52CtETJt9ngfY4AjawrJY5pLxCvHa/lQZ+1v2gTUntwNZkuks6E2It6YEXV6jnpnCZFjA==" }, + "node_modules/@swup/fragment-plugin": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@swup/fragment-plugin/-/fragment-plugin-0.3.7.tgz", + "integrity": "sha512-tTu8K9gpec4EPy4tiV6xLghwW5YHGb5jQtJvN6gx28eOErk0k3hvD5whoe3zfnSzP8ZrdbK++EzzRoEwn2Tvyw==", + "dependencies": { + "@swup/plugin": "^4.0.0" + }, + "peerDependencies": { + "swup": "^4.0.0" + } + }, + "node_modules/@swup/plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@swup/plugin/-/plugin-4.0.0.tgz", + "integrity": "sha512-3Kq31BJxnzoPg643YxGoWQggoU6VPKZpdE5CqqmP7wwkpCYTzkRmrfcQ29mGhsSS7xfS7D33iZoBiwY+wPoo2A==", + "dependencies": { + "swup": "^4.0.0" + } + }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -1430,6 +1451,17 @@ "node": ">=0.10.0" } }, + "node_modules/delegate-it": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/delegate-it/-/delegate-it-6.0.1.tgz", + "integrity": "sha512-ZS2hRm/SaoPzaeWcWyYjzVVF4/PgALZqma9FXsunFt4XQGVAtQ79Vx7v57vNQNaI75Rl12C+x6TkLqHS5PNKLg==", + "dependencies": { + "typed-query-selector": "^2.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/fregante" + } + }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -3093,6 +3125,14 @@ "wrappy": "1" } }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "bin": { + "opencollective-postinstall": "index.js" + } + }, "node_modules/opn": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", @@ -3177,6 +3217,11 @@ "node": ">=0.10.0" } }, + "node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -4494,6 +4539,17 @@ "node": ">=0.8.0" } }, + "node_modules/swup": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/swup/-/swup-4.5.1.tgz", + "integrity": "sha512-FH9+x7sXzU19OgrLP23wdC8KZOkpBXC0cBKcnf0gM5Unurm5cn5LunCLesA6WZJmT/o5o9TZguM1cFmPaD6K4Q==", + "hasInstallScript": true, + "dependencies": { + "delegate-it": "^6.0.0", + "opencollective-postinstall": "^2.0.2", + "path-to-regexp": "^6.2.1" + } + }, "node_modules/tiny-glob": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", @@ -4571,6 +4627,11 @@ "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", "dev": true }, + "node_modules/typed-query-selector": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.11.0.tgz", + "integrity": "sha512-qBs4sfmnLlPOyo2oSdvHbIFHe2CPgU54/1UGfSNceb7LARpIEVxUaeRX0Doje6oKpuySS2stqy90R3YrynR8Kg==" + }, "node_modules/ua-parser-js": { "version": "1.0.33", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz", @@ -5067,6 +5128,22 @@ "resolved": "https://registry.npmjs.org/@studio-freight/lenis/-/lenis-1.0.27.tgz", "integrity": "sha512-1I6EaWR9rxdFjIJtF52CtETJt9ngfY4AjawrJY5pLxCvHa/lQZ+1v2gTUntwNZkuks6E2It6YEXV6jnpnCZFjA==" }, + "@swup/fragment-plugin": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@swup/fragment-plugin/-/fragment-plugin-0.3.7.tgz", + "integrity": "sha512-tTu8K9gpec4EPy4tiV6xLghwW5YHGb5jQtJvN6gx28eOErk0k3hvD5whoe3zfnSzP8ZrdbK++EzzRoEwn2Tvyw==", + "requires": { + "@swup/plugin": "^4.0.0" + } + }, + "@swup/plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@swup/plugin/-/plugin-4.0.0.tgz", + "integrity": "sha512-3Kq31BJxnzoPg643YxGoWQggoU6VPKZpdE5CqqmP7wwkpCYTzkRmrfcQ29mGhsSS7xfS7D33iZoBiwY+wPoo2A==", + "requires": { + "swup": "^4.0.0" + } + }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -5853,6 +5930,14 @@ } } }, + "delegate-it": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/delegate-it/-/delegate-it-6.0.1.tgz", + "integrity": "sha512-ZS2hRm/SaoPzaeWcWyYjzVVF4/PgALZqma9FXsunFt4XQGVAtQ79Vx7v57vNQNaI75Rl12C+x6TkLqHS5PNKLg==", + "requires": { + "typed-query-selector": "^2.10.0" + } + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -7167,6 +7252,11 @@ "wrappy": "1" } }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" + }, "opn": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", @@ -7224,6 +7314,11 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -8298,6 +8393,16 @@ "resolved": "https://registry.npmjs.org/svg4everybody/-/svg4everybody-2.1.9.tgz", "integrity": "sha1-W9n23vwTOFmgRGRtR0P6vCjbfi0=" }, + "swup": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/swup/-/swup-4.5.1.tgz", + "integrity": "sha512-FH9+x7sXzU19OgrLP23wdC8KZOkpBXC0cBKcnf0gM5Unurm5cn5LunCLesA6WZJmT/o5o9TZguM1cFmPaD6K4Q==", + "requires": { + "delegate-it": "^6.0.0", + "opencollective-postinstall": "^2.0.2", + "path-to-regexp": "^6.2.1" + } + }, "tiny-glob": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", @@ -8362,6 +8467,11 @@ "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", "dev": true }, + "typed-query-selector": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.11.0.tgz", + "integrity": "sha512-qBs4sfmnLlPOyo2oSdvHbIFHe2CPgU54/1UGfSNceb7LARpIEVxUaeRX0Doje6oKpuySS2stqy90R3YrynR8Kg==" + }, "ua-parser-js": { "version": "1.0.33", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz", diff --git a/package.json b/package.json index 2d7485f..57f9e57 100644 --- a/package.json +++ b/package.json @@ -14,11 +14,13 @@ "build": "node --experimental-json-modules --no-warnings build/build.js" }, "dependencies": { + "@swup/fragment-plugin": "^0.3.7", "locomotive-scroll": "^5.0.0-beta.9", "modujs": "^1.4.2", "modularload": "^1.2.6", "normalize.css": "^8.0.1", - "svg4everybody": "^2.1.9" + "svg4everybody": "^2.1.9", + "swup": "^4.5.1" }, "devDependencies": { "autoprefixer": "^10.4.13", diff --git a/www/assets/scripts/app.js b/www/assets/scripts/app.js index c1b7c79..c1ab674 100644 --- a/www/assets/scripts/app.js +++ b/www/assets/scripts/app.js @@ -1,7 +1,3117 @@ -(()=>{var Gt=Object.create;var D=Object.defineProperty;var Yt=Object.getOwnPropertyDescriptor;var Xt=Object.getOwnPropertyNames,P=Object.getOwnPropertySymbols,Zt=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty,ut=Object.prototype.propertyIsEnumerable;var ct=(s,e,t)=>e in s?D(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,dt=(s,e)=>{for(var t in e||(e={}))Z.call(e,t)&&ct(s,t,e[t]);if(P)for(var t of P(e))ut.call(e,t)&&ct(s,t,e[t]);return s};var ft=(s,e)=>{var t={};for(var i in s)Z.call(s,i)&&e.indexOf(i)<0&&(t[i]=s[i]);if(s!=null&&P)for(var i of P(s))e.indexOf(i)<0&&ut.call(s,i)&&(t[i]=s[i]);return t};var Kt=(s,e)=>()=>(s&&(e=s(s=0)),e);var Jt=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),mt=(s,e)=>{for(var t in e)D(s,t,{get:e[t],enumerable:!0})},Qt=(s,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Xt(e))!Z.call(s,n)&&n!==t&&D(s,n,{get:()=>e[n],enumerable:!(i=Yt(e,n))||i.enumerable});return s};var te=(s,e,t)=>(t=s!=null?Gt(Zt(s)):{},Qt(e||!s||!s.__esModule?D(t,"default",{value:s,enumerable:!0}):t,s));var w=(s,e,t)=>new Promise((i,n)=>{var r=a=>{try{l(t.next(a))}catch(h){n(h)}},o=a=>{try{l(t.throw(a))}catch(h){n(h)}},l=a=>a.done?i(a.value):Promise.resolve(a.value).then(r,o);l((t=t.apply(s,e)).next())});var xt=Jt((Ft,Y)=>{(function(s,e){typeof define=="function"&&define.amd?define([],function(){return s.svg4everybody=e()}):typeof Y=="object"&&Y.exports?Y.exports=e():s.svg4everybody=e()})(Ft,function(){function s(n,r,o){if(o){var l=document.createDocumentFragment(),a=!r.hasAttribute("viewBox")&&o.getAttribute("viewBox");a&&r.setAttribute("viewBox",a);for(var h=o.cloneNode(!0);h.childNodes.length;)l.appendChild(h.firstChild);n.appendChild(l)}}function e(n){n.onreadystatechange=function(){if(n.readyState===4){var r=n._cachedDocument;r||(r=n._cachedDocument=document.implementation.createHTMLDocument(""),r.body.innerHTML=n.responseText,n._cachedTarget={}),n._embeds.splice(0).map(function(o){var l=n._cachedTarget[o.id];l||(l=n._cachedTarget[o.id]=r.getElementById(o.id)),s(o.parent,o.svg,l)})}},n.onreadystatechange()}function t(n){function r(){for(var _=0;_0)&&p(r,67)}var o,l=Object(n),a=/\bTrident\/[567]\b|\bMSIE (?:9|10)\.0\b/,h=/\bAppleWebKit\/(\d+)\b/,c=/\bEdge\/12\.(\d+)\b/,u=/\bEdge\/.(\d+)\b/,d=window.top!==window.self;o="polyfill"in l?l.polyfill:a.test(navigator.userAgent)||(navigator.userAgent.match(c)||[])[1]<10547||(navigator.userAgent.match(h)||[])[1]<537||u.test(navigator.userAgent)&&d;var f={},p=window.requestAnimationFrame||setTimeout,y=document.getElementsByTagName("use"),L=0;o&&r()}function i(n){for(var r=n;r.nodeName.toLowerCase()!=="svg"&&(r=r.parentNode););return r}return t})});var Ut={};mt(Ut,{gridHelper:()=>Ae});function Ae({gutterCssVar:s=Oe,marginCssVar:e=Ie,rgbaColor:t=Te}={}){let i=document.createElement("div");document.body.append(i),$t(i,t),Me(i,s,e),Re(i,t)}function Me(s,e,t){let i=s.style;i.zIndex="10000",i.position="fixed",i.top="0",i.left="0",i.display="flex",i.width="100%",i.height="100%",i.columnGap=`var(${e}, 0)`,i.paddingLeft=`var(${t}, 0)`,i.paddingRight=`var(${t}, 0)`,i.pointerEvents="none",i.visibility="hidden"}function $t(s,e){s.innerHTML="";let t=Number(window.getComputedStyle(s).getPropertyValue("--grid-columns")),i;for(var n=0;n{n.key=="Control"?t=!0:t&&n.key=="g"&&(i?s.style.visibility="hidden":s.style.visibility="visible",i=!i)}),document.addEventListener("keyup",n=>{n.key=="Control"&&(t=!1)})}var Oe,Ie,Te,Nt=Kt(()=>{Oe="--grid-gutter",Ie="--grid-margin",Te="rgba(255, 0, 0, .1)"});function x(s){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?x=function(e){return typeof e}:x=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},x(s)}function gt(s,e){if(!(s instanceof e))throw new TypeError("Cannot call a class as a function")}function pt(s,e){for(var t=0;ts.length)&&(e=s.length);for(var t=0,i=new Array(e);tN,Load:()=>j,Scroll:()=>G});var J="production",wt=window.matchMedia("(any-pointer:coarse)").matches,k=Object.freeze({NAME:J,IS_PROD:J==="production",IS_DEV:J==="development",IS_MOBILE:wt,IS_DESKTOP:!wt}),S=Object.freeze({LOADING:"is-loading",LOADED:"is-loaded",READY:"is-ready",FONTS_LOADED:"fonts-loaded",LAZY_CONTAINER:"c-lazy",LAZY_LOADED:"-lazy-loaded"}),St=Object.freeze({RESIZE_END:"loco.resizeEnd"}),$=Object.freeze({EAGER:[{family:"Source Sans",style:"normal",weight:400},{family:"Source Sans",style:"normal",weight:700}]});var _t="fonts"in document;function he(s,e){for(let[t,i]of Object.entries(e))switch(t){case"family":{if(U(s[t])!==i)return!1;break}case"weight":{if(s[t]!=i)return!1;break}default:{if(s[t]!==i)return!1;break}}return!0}function ce(s,e){let t=U(s.family);return U(t)===e||e.endsWith(U(t))&&(e.match(s.weight)||e.match(s.style)),!0}function ue(s){let e=[];for(let t of document.fonts)he(t,s)&&e.push(t);return e}function de(s){let e=[];for(let t of document.fonts)ce(t,s)&&e.push(t);return e}function Ot(s){Array.isArray(s)||(s=[s]);let e=new Set;return s.forEach(t=>{if(t)switch(typeof t){case"string":e.add(...de(t));return;case"object":e.add(...ue(t));return}throw new TypeError("Expected font query to be font shorthand or font reference")}),[...e]}function It(s,e=!1){return w(this,null,function*(){var t;if(((t=s.size)!=null?t:s.length)===0)throw new TypeError("Expected at least one font");return yield fe([...s],e)})}function Ct(s){return w(this,null,function*(){return yield(s.status==="unloaded"?s.load():s.loaded).then(e=>e,e=>s)})}function fe(s,e=!1){return w(this,null,function*(){e&&console.group("[loadFonts:API]",s.length,"/",document.fonts.size);let t=[];for(let i of s)i instanceof FontFace?(document.fonts.has(i)||document.fonts.add(i),t.push(Ct(i))):t.push(...Ot(i).map(n=>Ct(n)));return e&&console.groupEnd(),yield Promise.all(t)})}function U(s){return s.replace(/['"]+/g,"")}function Tt(s){return w(this,null,function*(){let e=Ot(s);return yield Promise.all(e.map(t=>t.loaded))})}var N=class extends A{constructor(s){super(s)}init(){Tt($.EAGER).then(s=>this.onFontsLoaded(s))}onFontsLoaded(s){console.log("Example: Eager Fonts Loaded!",s)}};function me(s,e){if(!(s instanceof e))throw new TypeError("Cannot call a class as a function")}function At(s,e){for(var t=0;ts.length)&&(e=s.length);for(var t=0,i=new Array(e);t-1||(this.reset(),this.getStateOptions())}},{key:"reset",value:function(){this.isLoading&&(this.controller.abort(),this.isLoading=!1,this.controller=new AbortController),window.clearTimeout(this.enterTimeout),this.isInserted&&this.removeContainer(),this.classContainer=this.html,Object.assign(this,this.defaults,this.options)}},{key:"getClickOptions",value:function(t){this.transition=t.getAttribute("data-"+this.name),this.isUrl=t.getAttribute("data-"+this.name+"-url");var i=t.getAttribute("href"),n=t.getAttribute("target");if(n=="_blank"){window.open(i,"_blank");return}if(this.transition=="false"){window.location=i;return}this.setOptions(i,!0)}},{key:"getStateOptions",value:function(){this.transitionsHistory?this.transition=history.state:this.transition=!1;var t=window.location.href;this.setOptions(t)}},{key:"goTo",value:function(t,i,n){this.reset(),this.transition=i,this.isUrl=n,this.setOptions(t,!0)}},{key:"setOptions",value:function(t,i){var n="["+this.container+"]",r;this.transition&&this.transition!="true"&&(this.transitionContainer="["+this.container+'="'+this.transition+'"]',this.loadingClass=this.transitions[this.transition].loadingClass||this.loadingClass,this.loadedClass=this.transitions[this.transition].loadedClass||this.loadedClass,this.readyClass=this.transitions[this.transition].readyClass||this.readyClass,this.transitionsPrefix=this.transitions[this.transition].transitionsPrefix||this.transitionsPrefix,this.enterDelay=this.transitions[this.transition].enterDelay||this.enterDelay,this.exitDelay=this.transitions[this.transition].exitDelay||this.exitDelay,this.loadedDelay=this.transitions[this.transition].loadedDelay||this.loadedDelay,r=document.querySelector(this.transitionContainer)),r?(n=this.transitionContainer,this.oldContainer=r,this.classContainer=this.oldContainer.parentNode,this.subContainer||history.replaceState(this.transition,null,this.href),this.subContainer=!0):(this.oldContainer=document.querySelector(n),this.subContainer&&history.replaceState(this.prevTransition,null,this.href),this.subContainer=!1),this.href=t,this.parentContainer=this.oldContainer.parentNode,this.isUrl===""||this.isUrl!=null&&this.isUrl!="false"&&this.isUrl!=!1?history.pushState(this.transition,null,t):(this.oldContainer.classList.add("is-old"),this.setLoading(),this.startEnterDelay(),this.loadHref(t,n,i))}},{key:"setLoading",value:function(){this.classContainer.classList.remove(this.loadedClass,this.readyClass),this.classContainer.classList.add(this.loadingClass),this.classContainer.classList.remove(this.transitionsPrefix+this.prevTransition),this.transition&&this.classContainer.classList.add(this.transitionsPrefix+this.transition),this.subContainer||(this.prevTransition=this.transition);var t=new Event(this.namespace+"loading");window.dispatchEvent(t)}},{key:"startEnterDelay",value:function(){var t=this;this.enterTimeout=window.setTimeout(function(){t.isEntered=!0,t.isLoaded&&t.transitionContainers()},this.enterDelay)}},{key:"loadHref",value:function(t,i,n){var r=this;this.isLoading=!0;var o=this.controller.signal;fetch(t,{signal:o}).then(function(l){return l.text()}).then(function(l){n&&history.pushState(r.transition,null,t);var a=new DOMParser;r.data=a.parseFromString(l,"text/html"),r.newContainer=r.data.querySelector(i),r.newContainer.classList.add("is-new"),r.parentNewContainer=r.newContainer.parentNode,r.hideContainer(),r.parentContainer.insertBefore(r.newContainer,r.oldContainer),r.isInserted=!0,r.setSvgs(),r.isLoaded=!0,r.isEntered&&r.transitionContainers(),r.loadEls(r.newContainer),r.isLoading=!1}).catch(function(l){window.location=t})}},{key:"transitionContainers",value:function(){var t=this;this.setAttributes(),this.showContainer(),this.setLoaded(),setTimeout(function(){t.removeContainer(),t.setReady()},this.exitDelay)}},{key:"setSvgs",value:function(){if(this.isChrome){var t=this.newContainer.querySelectorAll("use");t.length&&t.forEach(function(i){var n=i.getAttribute("xlink:href");if(n)i.parentNode.innerHTML='';else{var r=i.getAttribute("href");r&&(i.parentNode.innerHTML='')}})}}},{key:"setAttributes",value:function(){var t=this,i=this.data.getElementsByTagName("title")[0],n=this.data.head.querySelector('meta[name="description"]'),r=document.head.querySelector('meta[name="description"]'),o,l;this.subContainer?(l=this.parentNewContainer,o=document.querySelector(this.transitionContainer).parentNode):(l=this.data.querySelector("html"),o=document.querySelector("html"));var a=Object.assign({},l.dataset);i&&(document.title=i.innerText),r&&n&&r.setAttribute("content",n.getAttribute("content")),a&&Object.entries(a).forEach(function(h){var c=ve(h,2),u=c[0],d=c[1];o.setAttribute("data-"+t.toDash(u),d)})}},{key:"toDash",value:function(t){return t.split(/(?=[A-Z])/).join("-").toLowerCase()}},{key:"hideContainer",value:function(){this.newContainer.style.visibility="hidden",this.newContainer.style.height=0,this.newContainer.style.overflow="hidden"}},{key:"showContainer",value:function(){this.newContainer.style.visibility="",this.newContainer.style.height="",this.newContainer.style.overflow=""}},{key:"loadEls",value:function(t){var i=this,n=[];this.loadAttributes.forEach(function(r){var o="data-"+i.name+"-"+r,l=t.querySelectorAll("["+o+"]");l.length&&l.forEach(function(a){var h=a.getAttribute(o);if(a.setAttribute(r,h),r=="src"||r=="srcset"){var c=new Promise(function(u){a.onload=function(){return u(a)}});n.push(c)}})}),Promise.all(n).then(function(r){var o=new Event(i.namespace+"images");window.dispatchEvent(o)})}},{key:"setLoaded",value:function(){var t=this;this.classContainer.classList.remove(this.loadingClass),setTimeout(function(){t.classContainer.classList.add(t.loadedClass)},this.loadedDelay);var i=new Event(this.namespace+"loaded");window.dispatchEvent(i)}},{key:"removeContainer",value:function(){this.parentContainer.removeChild(this.oldContainer),this.newContainer.classList.remove("is-new"),this.isInserted=!1}},{key:"setReady",value:function(){this.classContainer.classList.add(this.readyClass);var t=new Event(this.namespace+"ready");window.dispatchEvent(t)}},{key:"on",value:function(t,i){var n=this;window.addEventListener(this.namespace+t,function(){switch(t){case"loading":return i(n.transition,n.oldContainer);case"loaded":return i(n.transition,n.oldContainer,n.newContainer);case"ready":return i(n.transition,n.newContainer);default:return i()}},!1)}}]),s}(),Rt=we;var j=class extends A{constructor(s){super(s)}init(){new Rt({enterDelay:0,transitions:{customTransition:{}}}).on("loaded",(e,t,i)=>{this.call("destroy",t,"app"),this.call("update",i,"app")})}};var Se=s=>({url:s.src,width:s.naturalWidth,height:s.naturalHeight,ratio:s.naturalWidth/s.naturalHeight}),Ce=(s,e={})=>new Promise((t,i)=>{let n=new Image;e.crossOrigin&&(n.crossOrigin=e.crossOrigin);let r=()=>{t(dt({element:n},Se(n)))};n.decode?(n.src=s,n.decode().then(r).catch(o=>{i(o)})):(n.onload=r,n.onerror=o=>{i(o)},n.src=s)}),kt=[],Lt=(s,e,t)=>w(void 0,null,function*(){let i=e||s.dataset.src,n=kt.find(r=>r.url===i);if(!n){if(n=yield Ce(i),!n.url)return;kt.push(n)}s.src!==i&&(s.tagName==="IMG"?s.src=n.url:s.style.backgroundImage=`url(${n.url})`,requestAnimationFrame(()=>{let r=s.closest(`.${S.LAZY_CONTAINER}`);r&&(r.classList.add(S.LAZY_LOADED),r.style.backgroundImage=""),s.classList.add(S.LAZY_LOADED),t==null||t()}))});function Q(){return Q=Object.assign?Object.assign.bind():function(s){for(var e=1;e=1;let a=i?1:this.easing(l);this.value=this.from+(this.to-this.from)*a}var n,r,o;(t=this.onUpdate)==null||t.call(this,this.value,i),i&&this.stop()}stop(){this.isRunning=!1}fromTo(e,t,{lerp:i=.1,duration:n=1,easing:r=a=>a,onStart:o,onUpdate:l}){this.from=this.value=e,this.to=t,this.lerp=i,this.duration=n,this.easing=r,this.currentTime=0,this.isRunning=!0,o==null||o(),this.onUpdate=l}},et=class{constructor({wrapper:e,content:t,autoResize:i=!0}={}){if(this.resize=()=>{this.onWrapperResize(),this.onContentResize()},this.onWrapperResize=()=>{this.wrapper===window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)},this.onContentResize=()=>{this.scrollHeight=this.content.scrollHeight,this.scrollWidth=this.content.scrollWidth},this.wrapper=e,this.content=t,i){let n=function(r,o){let l;return function(){let a=arguments,h=this;clearTimeout(l),l=setTimeout(function(){r.apply(h,a)},250)}}(this.resize);this.wrapper!==window&&(this.wrapperResizeObserver=new ResizeObserver(n),this.wrapperResizeObserver.observe(this.wrapper)),this.contentResizeObserver=new ResizeObserver(n),this.contentResizeObserver.observe(this.content)}this.resize()}destroy(){var e,t;(e=this.wrapperResizeObserver)==null||e.disconnect(),(t=this.contentResizeObserver)==null||t.disconnect()}get limit(){return{x:this.scrollWidth-this.width,y:this.scrollHeight-this.height}}},H=class{constructor(){this.events={}}emit(e,...t){let i=this.events[e]||[];for(let n=0,r=i.length;n{var n;this.events[e]=(n=this.events[e])==null?void 0:n.filter(r=>t!==r)}}off(e,t){var i;this.events[e]=(i=this.events[e])==null?void 0:i.filter(n=>t!==n)}destroy(){this.events={}}},it=class{constructor(e,{wheelMultiplier:t=1,touchMultiplier:i=2,normalizeWheel:n=!1}){this.onTouchStart=r=>{let{clientX:o,clientY:l}=r.targetTouches?r.targetTouches[0]:r;this.touchStart.x=o,this.touchStart.y=l,this.lastDelta={x:0,y:0}},this.onTouchMove=r=>{let{clientX:o,clientY:l}=r.targetTouches?r.targetTouches[0]:r,a=-(o-this.touchStart.x)*this.touchMultiplier,h=-(l-this.touchStart.y)*this.touchMultiplier;this.touchStart.x=o,this.touchStart.y=l,this.lastDelta={x:a,y:h},this.emitter.emit("scroll",{deltaX:a,deltaY:h,event:r})},this.onTouchEnd=r=>{this.emitter.emit("scroll",{deltaX:this.lastDelta.x,deltaY:this.lastDelta.y,event:r})},this.onWheel=r=>{let{deltaX:o,deltaY:l}=r;this.normalizeWheel&&(o=W(-100,o,100),l=W(-100,l,100)),o*=this.wheelMultiplier,l*=this.wheelMultiplier,this.emitter.emit("scroll",{deltaX:o,deltaY:l,event:r})},this.element=e,this.wheelMultiplier=t,this.touchMultiplier=i,this.normalizeWheel=n,this.touchStart={x:null,y:null},this.emitter=new H,this.element.addEventListener("wheel",this.onWheel,{passive:!1}),this.element.addEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.addEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.addEventListener("touchend",this.onTouchEnd,{passive:!1})}on(e,t){return this.emitter.on(e,t)}destroy(){this.emitter.destroy(),this.element.removeEventListener("wheel",this.onWheel,{passive:!1}),this.element.removeEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.removeEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.removeEventListener("touchend",this.onTouchEnd,{passive:!1})}},B=class{constructor({wrapper:e=window,content:t=document.documentElement,wheelEventsTarget:i=e,eventsTarget:n=i,smoothWheel:r=!0,smoothTouch:o=!1,syncTouch:l=!1,syncTouchLerp:a=.1,__iosNoInertiaSyncTouchLerp:h=.4,touchInertiaMultiplier:c=35,duration:u,easing:d=m=>Math.min(1,1.001-Math.pow(2,-10*m)),lerp:f=!u&&.1,infinite:p=!1,orientation:y="vertical",gestureOrientation:L="vertical",touchMultiplier:_=1,wheelMultiplier:b=1,normalizeWheel:O=!1,autoResize:I=!0}={}){this.onVirtualScroll=({deltaX:m,deltaY:E,event:v})=>{if(v.ctrlKey)return;let C=v.type.includes("touch"),g=v.type.includes("wheel");if(this.options.gestureOrientation==="both"&&m===0&&E===0||this.options.gestureOrientation==="vertical"&&E===0||this.options.gestureOrientation==="horizontal"&&m===0||C&&this.options.gestureOrientation==="vertical"&&this.scroll===0&&!this.options.infinite&&E<=0)return;let z=v.composedPath();if(z=z.slice(0,z.indexOf(this.rootElement)),z.find(T=>{var ht;return(T.hasAttribute==null?void 0:T.hasAttribute("data-lenis-prevent"))||C&&(T.hasAttribute==null?void 0:T.hasAttribute("data-lenis-prevent-touch"))||g&&(T.hasAttribute==null?void 0:T.hasAttribute("data-lenis-prevent-wheel"))||((ht=T.classList)==null?void 0:ht.contains("lenis"))}))return;if(this.isStopped||this.isLocked)return void v.preventDefault();if(this.isSmooth=(this.options.smoothTouch||this.options.syncTouch)&&C||this.options.smoothWheel&&g,!this.isSmooth)return this.isScrolling=!1,void this.animate.stop();v.preventDefault();let R=E;this.options.gestureOrientation==="both"?R=Math.abs(E)>Math.abs(m)?E:m:this.options.gestureOrientation==="horizontal"&&(R=m);let qt=C&&this.options.syncTouch,at=C&&v.type==="touchend"&&Math.abs(R)>1;at&&(R=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+R,Q({programmatic:!1},qt&&{lerp:at?this.syncTouchLerp:this.options.__iosNoInertiaSyncTouchLerp}))},this.onScroll=()=>{if(!this.isScrolling){let m=this.animatedScroll;this.animatedScroll=this.targetScroll=this.actualScroll,this.velocity=0,this.direction=Math.sign(this.animatedScroll-m),this.emit()}},window.lenisVersion="1.0.27",e!==document.documentElement&&e!==document.body||(e=window),this.options={wrapper:e,content:t,wheelEventsTarget:i,eventsTarget:n,smoothWheel:r,smoothTouch:o,syncTouch:l,syncTouchLerp:a,__iosNoInertiaSyncTouchLerp:h,touchInertiaMultiplier:c,duration:u,easing:d,lerp:f,infinite:p,gestureOrientation:L,orientation:y,touchMultiplier:_,wheelMultiplier:b,normalizeWheel:O,autoResize:I},this.animate=new tt,this.emitter=new H,this.dimensions=new et({wrapper:e,content:t,autoResize:I}),this.toggleClass("lenis",!0),this.velocity=0,this.isLocked=!1,this.isStopped=!1,this.isSmooth=l||r||o,this.isScrolling=!1,this.targetScroll=this.animatedScroll=this.actualScroll,this.options.wrapper.addEventListener("scroll",this.onScroll,{passive:!1}),this.virtualScroll=new it(n,{touchMultiplier:_,wheelMultiplier:b,normalizeWheel:O}),this.virtualScroll.on("scroll",this.onVirtualScroll)}destroy(){this.emitter.destroy(),this.options.wrapper.removeEventListener("scroll",this.onScroll,{passive:!1}),this.virtualScroll.destroy(),this.dimensions.destroy(),this.toggleClass("lenis",!1),this.toggleClass("lenis-smooth",!1),this.toggleClass("lenis-scrolling",!1),this.toggleClass("lenis-stopped",!1),this.toggleClass("lenis-locked",!1)}on(e,t){return this.emitter.on(e,t)}off(e,t){return this.emitter.off(e,t)}setScroll(e){this.isHorizontal?this.rootElement.scrollLeft=e:this.rootElement.scrollTop=e}resize(){this.dimensions.resize()}emit(){this.emitter.emit("scroll",this)}reset(){this.isLocked=!1,this.isScrolling=!1,this.velocity=0,this.animate.stop()}start(){this.isStopped=!1,this.reset()}stop(){this.isStopped=!0,this.animate.stop(),this.reset()}raf(e){let t=e-(this.time||e);this.time=e,this.animate.advance(.001*t)}scrollTo(e,{offset:t=0,immediate:i=!1,lock:n=!1,duration:r=this.options.duration,easing:o=this.options.easing,lerp:l=!r&&this.options.lerp,onComplete:a=null,force:h=!1,programmatic:c=!0}={}){if(!this.isStopped&&!this.isLocked||h){if(["top","left","start"].includes(e))e=0;else if(["bottom","right","end"].includes(e))e=this.limit;else{var u;let d;if(typeof e=="string"?d=document.querySelector(e):(u=e)!=null&&u.nodeType&&(d=e),d){if(this.options.wrapper!==window){let p=this.options.wrapper.getBoundingClientRect();t-=this.isHorizontal?p.left:p.top}let f=d.getBoundingClientRect();e=(this.isHorizontal?f.left:f.top)+this.animatedScroll}}if(typeof e=="number"){if(e+=t,e=Math.round(e),this.options.infinite?c&&(this.targetScroll=this.animatedScroll=this.scroll):e=W(0,e,this.limit),i)return this.animatedScroll=this.targetScroll=e,this.setScroll(this.scroll),this.reset(),void(a==null||a(this));if(!c){if(e===this.targetScroll)return;this.targetScroll=e}this.animate.fromTo(this.animatedScroll,e,{duration:r,easing:o,lerp:l,onStart:()=>{n&&(this.isLocked=!0),this.isScrolling=!0},onUpdate:(d,f)=>{this.isScrolling=!0,this.velocity=d-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=d,this.setScroll(this.scroll),c&&(this.targetScroll=d),f||this.emit(),f&&requestAnimationFrame(()=>{this.reset(),this.emit(),a==null||a(this)})}})}}}get rootElement(){return this.options.wrapper===window?this.options.content:this.options.wrapper}get limit(){return this.dimensions.limit[this.isHorizontal?"x":"y"]}get isHorizontal(){return this.options.orientation==="horizontal"}get actualScroll(){return this.isHorizontal?this.rootElement.scrollLeft:this.rootElement.scrollTop}get scroll(){return this.options.infinite?(this.animatedScroll%(e=this.limit)+e)%e:this.animatedScroll;var e}get progress(){return this.limit===0?1:this.scroll/this.limit}get isSmooth(){return this.__isSmooth}set isSmooth(e){this.__isSmooth!==e&&(this.__isSmooth=e,this.toggleClass("lenis-smooth",e))}get isScrolling(){return this.__isScrolling}set isScrolling(e){this.__isScrolling!==e&&(this.__isScrolling=e,this.toggleClass("lenis-scrolling",e))}get isStopped(){return this.__isStopped}set isStopped(e){this.__isStopped!==e&&(this.__isStopped=e,this.toggleClass("lenis-stopped",e))}get isLocked(){return this.__isLocked}set isLocked(e){this.__isLocked!==e&&(this.__isLocked=e,this.toggleClass("lenis-locked",e))}get className(){let e="lenis";return this.isStopped&&(e+=" lenis-stopped"),this.isLocked&&(e+=" lenis-locked"),this.isScrolling&&(e+=" lenis-scrolling"),this.isSmooth&&(e+=" lenis-smooth"),e}toggleClass(e,t){this.rootElement.classList.toggle(e,t),this.emitter.emit("className change",this)}};function st(){return st=Object.assign?Object.assign.bind():function(s){for(var e=1;e{e.forEach(t=>{let i=this.scrollElements.find(n=>n.$el===t.target);t.isIntersecting?(i&&(i.isAlreadyIntersected=!0),this._setInview(t)):i&&i.isAlreadyIntersected&&this._setOutOfView(t)})},{rootMargin:this.rootMargin});for(let e of this.scrollElements)this.observe(e.$el)}destroy(){this.observer.disconnect()}observe(e){e&&this.observer.observe(e)}unobserve(e){e&&this.observer.unobserve(e)}_setInview(e){let t=this.scrollElements.find(i=>i.$el===e.target);this.IORaf&&(t==null||t.setInteractivityOn()),!this.IORaf&&(t==null||t.setInview())}_setOutOfView(e){let t=this.scrollElements.find(i=>i.$el===e.target);this.IORaf&&(t==null||t.setInteractivityOff()),!this.IORaf&&(t==null||t.setOutOfView()),t!=null&&t.attributes.scrollRepeat||this.IORaf||this.unobserve(e.target)}};function zt(s,e,t,i,n){return t+((n-s)/(e-s)*(i-t)||0)}function Pt(s,e){return s.reduce((t,i)=>Math.abs(i-e)1?1:i;var i;if(this.progress=t,t!=this.lastProgress){if(this.lastProgress=t,this.attributes.scrollCssProgress&&this._setCssProgress(t),this.attributes.scrollEventProgress&&this._setCustomEventProgress(t),this.attributes.scrollModuleProgress)for(let n of this.progressModularModules)this.modularInstance&&this.modularInstance.call("onScrollProgress",t,n.moduleName,n.moduleId);t>0&&t<1&&this.setInview(),t===0&&this.setOutOfView(),t===1&&this.setOutOfView()}}_setCssProgress(e=0){this.$el.style.setProperty("--progress",e.toString())}_setCustomEventProgress(e=0){let t=this.attributes.scrollEventProgress;if(!t)return;let i=new CustomEvent(t,{detail:{target:this.$el,progress:e}});window.dispatchEvent(i)}_getProgressModularModules(){if(!this.modularInstance)return;let e=Object.keys(this.$el.dataset).filter(i=>i.includes("module")),t=Object.entries(this.modularInstance.modules);if(e.length)for(let i of e){let n=this.$el.dataset[i];if(!n)return;for(let r of t){let[o,l]=r;n in l&&this.progressModularModules.push({moduleName:o,moduleId:n})}}}_getScrollCallFrom(){let e=Pt([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===e?"start":"end"}_dispatchCall(e,t){var i,n;let r=(i=this.attributes.scrollCall)==null?void 0:i.split(","),o=(n=this.attributes)==null?void 0:n.scrollCallSelf;if(r&&r.length>1){var l;let[a,h,c]=r,u;u=o?this.$el.dataset[`module${h.trim()}`]:c,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:e,from:t},h.trim(),(l=u)==null?void 0:l.trim())}else if(r){let[a]=r,h=new CustomEvent(a,{detail:{target:this.$el,way:e,from:t}});window.dispatchEvent(h)}}},_e=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],rt=class{constructor({$el:e,modularInstance:t,triggerRootMargin:i,rafRootMargin:n,scrollOrientation:r}){this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=t,this.scrollOrientation=r,this.triggerRootMargin=i!=null?i:"-1px -1px -1px -1px",this.rafRootMargin=n!=null?n:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}_init(){let e=this.$scrollContainer.querySelectorAll("[data-scroll]"),t=Array.from(e);this._subscribeScrollElements(t),this.IOTriggerInstance=new V({scrollElements:[...this.triggeredScrollElements],rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new V({scrollElements:[...this.RAFScrollElements],rootMargin:this.rafRootMargin,IORaf:!0})}destroy(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()}onResize({currentScroll:e}){for(let t of this.RAFScrollElements)t.onResize({currentScroll:e})}onRender({currentScroll:e,smooth:t}){for(let i of this.scrollElementsToUpdate)i.onRender({currentScroll:e,smooth:t})}removeScrollElements(e){let t=e.querySelectorAll("[data-scroll]");if(t.length){for(let i=0;i-1&&(this.IOTriggerInstance.unobserve(n.$el),this.triggeredScrollElements.splice(i,1))}for(let i=0;i-1&&(this.IORafInstance.unobserve(n.$el),this.RAFScrollElements.splice(i,1))}t.forEach(i=>{let n=this.scrollElementsToUpdate.find(o=>o.$el===i),r=this.scrollElements.find(o=>o.$el===i);n&&this._unsubscribeElementUpdate(n),r&&(this.scrollElements=this.scrollElements.filter(o=>o.id!=r.id))})}}addScrollElements(e){let t=e.querySelectorAll("[data-scroll]"),i=[];this.scrollElements.forEach(o=>{i.push(o.id)});let n=Math.max(...i)+1,r=Array.from(t);this._subscribeScrollElements(r,n,!0)}_subscribeScrollElements(e,t=0,i=!1){for(let n=0;nt.id!=e.id)}_checkRafNeeded(e){let t=[..._e],i=n=>{t=t.filter(r=>r!=n)};if(e.dataset.scrollOffset){if(e.dataset.scrollOffset.split(",").map(n=>n.replace("%","").trim()).join(",")!="0,0")return!0;i("scrollOffset")}else i("scrollOffset");if(e.dataset.scrollPosition){if(e.dataset.scrollPosition.trim()!="top,bottom")return!0;i("scrollPosition")}else i("scrollPosition");if(e.dataset.scrollSpeed&&!isNaN(parseFloat(e.dataset.scrollSpeed)))return!0;i("scrollSpeed");for(let n of t)if(n in e.dataset)return!0;return!1}},ot=class{constructor({resizeElements:e,resizeCallback:t=()=>{}}){this.$resizeElements=void 0,this.isFirstObserve=void 0,this.observer=void 0,this.resizeCallback=void 0,this.$resizeElements=e,this.resizeCallback=t,this.isFirstObserve=!0,this._init()}_init(){this.observer=new ResizeObserver(e=>{var t;!this.isFirstObserve&&((t=this.resizeCallback)==null||t.call(this)),this.isFirstObserve=!1});for(let e of this.$resizeElements)this.observer.observe(e)}destroy(){this.observer.disconnect()}},Dt={wrapper:window,content:document.documentElement,eventsTarget:window,lerp:.1,duration:.75,orientation:"vertical",gestureOrientation:"vertical",smoothWheel:!0,smoothTouch:!1,syncTouch:!1,syncTouchLerp:.1,touchInertiaMultiplier:35,wheelMultiplier:1,touchMultiplier:2,normalizeWheel:!1,autoResize:!0,easing:s=>Math.min(1,1.001-Math.pow(2,-10*s))},q=class{constructor({lenisOptions:e={},modularInstance:t,triggerRootMargin:i,rafRootMargin:n,autoResize:r=!0,autoStart:o=!0,scrollCallback:l=()=>{},initCustomTicker:a,destroyCustomTicker:h}={}){this.rafPlaying=void 0,this.lenisInstance=void 0,this.coreInstance=void 0,this.lenisOptions=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.rafInstance=void 0,this.autoResize=void 0,this.autoStart=void 0,this.ROInstance=void 0,this.initCustomTicker=void 0,this.destroyCustomTicker=void 0,this._onRenderBind=void 0,this._onResizeBind=void 0,this._onScrollToBind=void 0,this.lenisOptions=st({},Dt,e),Object.assign(this,{lenisOptions:e,modularInstance:t,triggerRootMargin:i,rafRootMargin:n,autoResize:r,autoStart:o,scrollCallback:l,initCustomTicker:a,destroyCustomTicker:h}),this._onRenderBind=this._onRender.bind(this),this._onScrollToBind=this._onScrollTo.bind(this),this._onResizeBind=this._onResize.bind(this),this.rafPlaying=!1,this._init()}_init(){var e;this.lenisInstance=new B({wrapper:this.lenisOptions.wrapper,content:this.lenisOptions.content,eventsTarget:this.lenisOptions.eventsTarget,lerp:this.lenisOptions.lerp,duration:this.lenisOptions.duration,orientation:this.lenisOptions.orientation,gestureOrientation:this.lenisOptions.gestureOrientation,smoothWheel:this.lenisOptions.smoothWheel,smoothTouch:this.lenisOptions.smoothTouch,syncTouch:this.lenisOptions.syncTouch,syncTouchLerp:this.lenisOptions.syncTouchLerp,touchInertiaMultiplier:this.lenisOptions.touchInertiaMultiplier,wheelMultiplier:this.lenisOptions.wheelMultiplier,touchMultiplier:this.lenisOptions.touchMultiplier,normalizeWheel:this.lenisOptions.normalizeWheel,easing:this.lenisOptions.easing}),(e=this.lenisInstance)==null||e.on("scroll",this.scrollCallback),document.documentElement.setAttribute("data-scroll-orientation",this.lenisInstance.options.orientation),requestAnimationFrame(()=>{this.coreInstance=new rt({$el:this.lenisInstance.rootElement,modularInstance:this.modularInstance,triggerRootMargin:this.triggerRootMargin,rafRootMargin:this.rafRootMargin,scrollOrientation:this.lenisInstance.options.orientation}),this._bindEvents(),this.initCustomTicker&&!this.destroyCustomTicker?console.warn("initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble."):!this.initCustomTicker&&this.destroyCustomTicker&&console.warn("destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble."),this.autoStart&&this.start()})}destroy(){this.stop(),this._unbindEvents(),this.lenisInstance.destroy(),this.coreInstance.destroy()}_bindEvents(){this._bindScrollToEvents(),this.autoResize&&("ResizeObserver"in window?this.ROInstance=new ot({resizeElements:[document.body],resizeCallback:this._onResizeBind}):window.addEventListener("resize",this._onResizeBind))}_unbindEvents(){this._unbindScrollToEvents(),this.autoResize&&("ResizeObserver"in window?this.ROInstance&&this.ROInstance.destroy():window.removeEventListener("resize",this._onResizeBind))}_bindScrollToEvents(e){let t=e||this.lenisInstance.rootElement,i=t==null?void 0:t.querySelectorAll("[data-scroll-to]");i!=null&&i.length&&i.forEach(n=>{n.addEventListener("click",this._onScrollToBind,!1)})}_unbindScrollToEvents(e){let t=e||this.lenisInstance.rootElement,i=t==null?void 0:t.querySelectorAll("[data-scroll-to]");i!=null&&i.length&&i.forEach(n=>{n.removeEventListener("click",this._onScrollToBind,!1)})}_onResize(){requestAnimationFrame(()=>{var e;(e=this.coreInstance)==null||e.onResize({currentScroll:this.lenisInstance.scroll})})}_onRender(){var e,t;(e=this.lenisInstance)==null||e.raf(Date.now()),(t=this.coreInstance)==null||t.onRender({currentScroll:this.lenisInstance.scroll,smooth:this.lenisInstance.isSmooth})}_onScrollTo(e){var t;e.preventDefault();let i=(t=e.currentTarget)!=null?t:null;if(!i)return;let n=i.getAttribute("data-scroll-to-href")||i.getAttribute("href"),r=i.getAttribute("data-scroll-to-offset")||0,o=i.getAttribute("data-scroll-to-duration")||this.lenisOptions.duration||Dt.duration;n&&this.scrollTo(n,{offset:typeof r=="string"?parseInt(r):r,duration:typeof o=="string"?parseInt(o):o})}start(){var e;this.rafPlaying||((e=this.lenisInstance)==null||e.start(),this.rafPlaying=!0,this.initCustomTicker?this.initCustomTicker(this._onRenderBind):this._raf())}stop(){var e;this.rafPlaying&&((e=this.lenisInstance)==null||e.stop(),this.rafPlaying=!1,this.destroyCustomTicker?this.destroyCustomTicker(this._onRenderBind):this.rafInstance&&cancelAnimationFrame(this.rafInstance))}removeScrollElements(e){var t;e?(this._unbindScrollToEvents(e),(t=this.coreInstance)==null||t.removeScrollElements(e)):console.error("Please provide a DOM Element as $oldContainer")}addScrollElements(e){var t;e?((t=this.coreInstance)==null||t.addScrollElements(e),requestAnimationFrame(()=>{this._bindScrollToEvents(e)})):console.error("Please provide a DOM Element as $newContainer")}resize(){this._onResizeBind()}scrollTo(e,t){var i;(i=this.lenisInstance)==null||i.scrollTo(e,{offset:t==null?void 0:t.offset,lerp:t==null?void 0:t.lerp,duration:t==null?void 0:t.duration,immediate:t==null?void 0:t.immediate,lock:t==null?void 0:t.lock,force:t==null?void 0:t.force,easing:t==null?void 0:t.easing,onComplete:t==null?void 0:t.onComplete})}_raf(){this._onRenderBind(),this.rafInstance=requestAnimationFrame(()=>this._raf())}};var G=class extends A{constructor(s){super(s)}init(){this.scroll=new q({modularInstance:this})}lazyLoad(s){Lt(s.target,null,()=>{})}scrollTo(s){var n;let i=s,{target:e}=i,t=ft(i,["target"]);t=Object.assign({duration:1},t),(n=this.scroll)==null||n.scrollTo(e,t)}destroy(){this.scroll.destroy()}};var jt=te(xt(),1);var X;w(void 0,null,function*(){if(k.IS_DEV){let s=yield Promise.resolve().then(()=>(Nt(),Ut));X=s==null?void 0:s.gridHelper}});function Wt(){(0,jt.default)(),X==null||X()}var Ht=(s,e,t=!1)=>{let i=null;return(...n)=>{clearTimeout(i);let r=()=>{i=null,t||s(...n)};t&&!i&&s(...n),i=setTimeout(r,e)}};var M=document.documentElement,ui=document.body;var Bt=new Et({modules:lt});window.addEventListener("load",s=>{let e=document.getElementById("main-css");e?e.isLoaded?Vt():e.addEventListener("load",t=>{Vt()}):console.warn('The "main-css" stylesheet not found')});function Vt(){Wt(),Bt.init(Bt),M.classList.add(S.LOADED),M.classList.add(S.READY),M.classList.remove(S.LOADING);let s=new CustomEvent(St.RESIZE_END);window.addEventListener("resize",()=>{M.style.setProperty("--vw",`${document.documentElement.clientWidth*.01}px`),Ht(()=>{window.dispatchEvent(s)},200,!1)}),_t&&It($.EAGER,k.IS_DEV).then(e=>{M.classList.add(S.FONTS_LOADED),k.IS_DEV&&(console.group("Eager fonts loaded!",e.length,"/",document.fonts.size),console.group("State of eager fonts:"),e.forEach(t=>console.log(t.family,t.style,t.weight,t.status)),console.groupEnd(),console.group("State of all fonts:"),document.fonts.forEach(t=>console.log(t.family,t.style,t.weight,t.status)),console.groupEnd())})}})(); +(() => { + var __create = Object.create; + var __defProp = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames = Object.getOwnPropertyNames; + var __getOwnPropSymbols = Object.getOwnPropertySymbols; + var __getProtoOf = Object.getPrototypeOf; + var __hasOwnProp = Object.prototype.hasOwnProperty; + var __propIsEnum = Object.prototype.propertyIsEnumerable; + var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; + var __spreadValues = (a4, b3) => { + for (var prop in b3 || (b3 = {})) + if (__hasOwnProp.call(b3, prop)) + __defNormalProp(a4, prop, b3[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b3)) { + if (__propIsEnum.call(b3, prop)) + __defNormalProp(a4, prop, b3[prop]); + } + return a4; + }; + var __objRest = (source, exclude) => { + var target = {}; + for (var prop in source) + if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0) + target[prop] = source[prop]; + if (source != null && __getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(source)) { + if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop)) + target[prop] = source[prop]; + } + return target; + }; + var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; + }; + var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + }; + var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod + )); + var __async = (__this, __arguments, generator) => { + return new Promise((resolve, reject) => { + var fulfilled = (value) => { + try { + step(generator.next(value)); + } catch (e4) { + reject(e4); + } + }; + var rejected = (value) => { + try { + step(generator.throw(value)); + } catch (e4) { + reject(e4); + } + }; + var step = (x2) => x2.done ? resolve(x2.value) : Promise.resolve(x2.value).then(fulfilled, rejected); + step((generator = generator.apply(__this, __arguments)).next()); + }); + }; + + // node_modules/svg4everybody/dist/svg4everybody.js + var require_svg4everybody = __commonJS({ + "node_modules/svg4everybody/dist/svg4everybody.js"(exports, module) { + !function(root, factory) { + "function" == typeof define && define.amd ? ( + // AMD. Register as an anonymous module unless amdModuleId is set + define([], function() { + return root.svg4everybody = factory(); + }) + ) : "object" == typeof module && module.exports ? ( + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory() + ) : root.svg4everybody = factory(); + }(exports, function() { + function embed(parent, svg, target) { + if (target) { + var fragment = document.createDocumentFragment(), viewBox = !svg.hasAttribute("viewBox") && target.getAttribute("viewBox"); + viewBox && svg.setAttribute("viewBox", viewBox); + for (var clone = target.cloneNode(true); clone.childNodes.length; ) { + fragment.appendChild(clone.firstChild); + } + parent.appendChild(fragment); + } + } + function loadreadystatechange(xhr) { + xhr.onreadystatechange = function() { + if (4 === xhr.readyState) { + var cachedDocument = xhr._cachedDocument; + cachedDocument || (cachedDocument = xhr._cachedDocument = document.implementation.createHTMLDocument(""), cachedDocument.body.innerHTML = xhr.responseText, xhr._cachedTarget = {}), // clear the xhr embeds list and embed each item + xhr._embeds.splice(0).map(function(item) { + var target = xhr._cachedTarget[item.id]; + target || (target = xhr._cachedTarget[item.id] = cachedDocument.getElementById(item.id)), // embed the target into the svg + embed(item.parent, item.svg, target); + }); + } + }, // test the ready state change immediately + xhr.onreadystatechange(); + } + function svg4everybody2(rawopts) { + function oninterval() { + for (var index = 0; index < uses.length; ) { + var use = uses[index], parent = use.parentNode, svg = getSVGAncestor(parent), src = use.getAttribute("xlink:href") || use.getAttribute("href"); + if (!src && opts.attributeName && (src = use.getAttribute(opts.attributeName)), svg && src) { + if (polyfill) { + if (!opts.validate || opts.validate(src, svg, use)) { + parent.removeChild(use); + var srcSplit = src.split("#"), url = srcSplit.shift(), id = srcSplit.join("#"); + if (url.length) { + var xhr = requests[url]; + xhr || (xhr = requests[url] = new XMLHttpRequest(), xhr.open("GET", url), xhr.send(), xhr._embeds = []), // add the svg and id as an item to the xhr embeds list + xhr._embeds.push({ + parent, + svg, + id + }), // prepare the xhr ready state change event + loadreadystatechange(xhr); + } else { + embed(parent, svg, document.getElementById(id)); + } + } else { + ++index, ++numberOfSvgUseElementsToBypass; + } + } + } else { + ++index; + } + } + (!uses.length || uses.length - numberOfSvgUseElementsToBypass > 0) && requestAnimationFrame2(oninterval, 67); + } + var polyfill, opts = Object(rawopts), newerIEUA = /\bTrident\/[567]\b|\bMSIE (?:9|10)\.0\b/, webkitUA = /\bAppleWebKit\/(\d+)\b/, olderEdgeUA = /\bEdge\/12\.(\d+)\b/, edgeUA = /\bEdge\/.(\d+)\b/, inIframe = window.top !== window.self; + polyfill = "polyfill" in opts ? opts.polyfill : newerIEUA.test(navigator.userAgent) || (navigator.userAgent.match(olderEdgeUA) || [])[1] < 10547 || (navigator.userAgent.match(webkitUA) || [])[1] < 537 || edgeUA.test(navigator.userAgent) && inIframe; + var requests = {}, requestAnimationFrame2 = window.requestAnimationFrame || setTimeout, uses = document.getElementsByTagName("use"), numberOfSvgUseElementsToBypass = 0; + polyfill && oninterval(); + } + function getSVGAncestor(node) { + for (var svg = node; "svg" !== svg.nodeName.toLowerCase() && (svg = svg.parentNode); ) { + } + return svg; + } + return svg4everybody2; + }); + } + }); + + // assets/scripts/utils/grid-helper.js + var grid_helper_exports = {}; + __export(grid_helper_exports, { + gridHelper: () => gridHelper + }); + function gridHelper({ + gutterCssVar = GRID_HELPER_GUTTER_CSS_VAR, + marginCssVar = GRID_HELPER_MARGIN_CSS_VAR, + rgbaColor = GRID_HELPER_RGBA_COLOR + } = {}) { + const $gridContainer = document.createElement("div"); + document.body.append($gridContainer); + setGridHelperColumns($gridContainer, rgbaColor); + setGridHelperStyles($gridContainer, gutterCssVar, marginCssVar); + setGridEvents($gridContainer, rgbaColor); + } + function setGridHelperStyles($container, gutterCssVar, marginCssVar) { + const elStyles = $container.style; + elStyles.zIndex = "10000"; + elStyles.position = "fixed"; + elStyles.top = "0"; + elStyles.left = "0"; + elStyles.display = "flex"; + elStyles.width = "100%"; + elStyles.height = "100%"; + elStyles.columnGap = `var(${gutterCssVar}, 0)`; + elStyles.paddingLeft = `var(${marginCssVar}, 0)`; + elStyles.paddingRight = `var(${marginCssVar}, 0)`; + elStyles.pointerEvents = "none"; + elStyles.visibility = "hidden"; + } + function setGridHelperColumns($container, rgbaColor) { + $container.innerHTML = ""; + const columns = Number( + window.getComputedStyle($container).getPropertyValue("--grid-columns") + ); + let $col; + for (var i5 = 0; i5 < columns; i5++) { + $col = document.createElement("div"); + $col.style.flex = "1 1 0"; + $col.style.backgroundColor = rgbaColor; + $container.appendChild($col); + } + } + function setGridEvents($container, rgbaColor) { + window.addEventListener( + "resize", + setGridHelperColumns($container, rgbaColor) + ); + let ctrlDown = false; + let isActive = false; + document.addEventListener("keydown", (e4) => { + if (e4.key == "Control") { + ctrlDown = true; + } else { + if (ctrlDown && e4.key == "g") { + if (isActive) { + $container.style.visibility = "hidden"; + } else { + $container.style.visibility = "visible"; + } + isActive = !isActive; + } + } + }); + document.addEventListener("keyup", (e4) => { + if (e4.key == "Control") { + ctrlDown = false; + } + }); + } + var GRID_HELPER_GUTTER_CSS_VAR, GRID_HELPER_MARGIN_CSS_VAR, GRID_HELPER_RGBA_COLOR; + var init_grid_helper = __esm({ + "assets/scripts/utils/grid-helper.js"() { + GRID_HELPER_GUTTER_CSS_VAR = "--grid-gutter"; + GRID_HELPER_MARGIN_CSS_VAR = "--grid-margin"; + GRID_HELPER_RGBA_COLOR = "rgba(255, 0, 0, .1)"; + } + }); + + // node_modules/modujs/dist/main.esm.js + function _typeof(obj) { + "@babel/helpers - typeof"; + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function(obj2) { + return typeof obj2; + }; + } else { + _typeof = function(obj2) { + return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; + }; + } + return _typeof(obj); + } + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties(target, props) { + for (var i5 = 0; i5 < props.length; i5++) { + var descriptor = props[i5]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) + descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) + _defineProperties(Constructor.prototype, protoProps); + if (staticProps) + _defineProperties(Constructor, staticProps); + return Constructor; + } + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + function _slicedToArray(arr, i5) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i5) || _unsupportedIterableToArray(arr, i5) || _nonIterableRest(); + } + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); + } + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) + return _arrayLikeToArray(arr); + } + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) + return arr; + } + function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) + return Array.from(iter); + } + function _iterableToArrayLimit(arr, i5) { + if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) + return; + var _arr = []; + var _n = true; + var _d = false; + var _e = void 0; + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + if (i5 && _arr.length === i5) + break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) + _i["return"](); + } finally { + if (_d) + throw _e; + } + } + return _arr; + } + function _unsupportedIterableToArray(o5, minLen) { + if (!o5) + return; + if (typeof o5 === "string") + return _arrayLikeToArray(o5, minLen); + var n5 = Object.prototype.toString.call(o5).slice(8, -1); + if (n5 === "Object" && o5.constructor) + n5 = o5.constructor.name; + if (n5 === "Map" || n5 === "Set") + return Array.from(o5); + if (n5 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n5)) + return _arrayLikeToArray(o5, minLen); + } + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) + len = arr.length; + for (var i5 = 0, arr2 = new Array(len); i5 < len; i5++) + arr2[i5] = arr[i5]; + return arr2; + } + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + var _default = /* @__PURE__ */ function() { + function _default2(options) { + _classCallCheck(this, _default2); + this.mAttr = "data-" + options.dataName; + this.mCaptureEvents = ["mouseenter", "mouseleave"]; + this.el = options.el; + } + _createClass(_default2, [{ + key: "mInit", + value: function mInit(modules) { + var _this = this; + this.modules = modules; + this.mCheckEventTarget = this.mCheckEventTarget.bind(this); + if (this.events) { + Object.keys(this.events).forEach(function(event) { + return _this.mAddEvent(event); + }); + } + } + }, { + key: "mUpdate", + value: function mUpdate(modules) { + this.modules = modules; + } + }, { + key: "mDestroy", + value: function mDestroy() { + var _this2 = this; + if (this.events) { + Object.keys(this.events).forEach(function(event) { + return _this2.mRemoveEvent(event); + }); + } + } + }, { + key: "mAddEvent", + value: function mAddEvent(event) { + var capture = this.mCaptureEvents.includes(event) ? true : false; + this.el.addEventListener(event, this.mCheckEventTarget, capture); + } + }, { + key: "mRemoveEvent", + value: function mRemoveEvent(event) { + var capture = this.mCaptureEvents.includes(event) ? true : false; + this.el.removeEventListener(event, this.mCheckEventTarget, capture); + } + }, { + key: "mCheckEventTarget", + value: function mCheckEventTarget(e4) { + var event = this.events[e4.type]; + if (typeof event === "string") { + this[event](e4); + } else { + var data = "[" + this.mAttr + "]"; + var target = e4.target; + if (this.mCaptureEvents.includes(e4.type)) { + if (target.matches(data)) { + this.mCallEventMethod(e4, event, target); + } + } else { + while (target && target !== document) { + if (target.matches(data)) { + if (this.mCallEventMethod(e4, event, target) != "undefined") { + break; + } + } + target = target.parentNode; + } + } + } + } + }, { + key: "mCallEventMethod", + value: function mCallEventMethod(e4, event, target) { + var name = target.getAttribute(this.mAttr); + if (event.hasOwnProperty(name)) { + var method = event[name]; + if (!e4.hasOwnProperty("currentTarget")) { + Object.defineProperty(e4, "currentTarget", { + value: target + }); + } + if (!e4.hasOwnProperty("curTarget")) { + Object.defineProperty(e4, "curTarget", { + value: target + }); + } + this[method](e4); + } + } + }, { + key: "$", + value: function $3(query, context) { + var classIndex = query.indexOf("."); + var idIndex = query.indexOf("#"); + var attrIndex = query.indexOf("["); + var indexes = [classIndex, idIndex, attrIndex].filter(function(index2) { + return index2 != -1; + }); + var index = false; + var name = query; + var more = ""; + var parent = this.el; + if (indexes.length) { + index = Math.min.apply(Math, _toConsumableArray(indexes)); + name = query.slice(0, index); + more = query.slice(index); + } + if (_typeof(context) == "object") { + parent = context; + } + return parent.querySelectorAll("[" + this.mAttr + "=" + name + "]" + more); + } + }, { + key: "parent", + value: function parent(query, context) { + var data = "[" + this.mAttr + "=" + query + "]"; + var parent2 = context.parentNode; + while (parent2 && parent2 !== document) { + if (parent2.matches(data)) { + return parent2; + } + parent2 = parent2.parentNode; + } + } + }, { + key: "getData", + value: function getData(name, context) { + var target = context || this.el; + return target.getAttribute(this.mAttr + "-" + name); + } + }, { + key: "setData", + value: function setData(name, value, context) { + var target = context || this.el; + return target.setAttribute(this.mAttr + "-" + name, value); + } + }, { + key: "call", + value: function call(func, args, mod, id) { + var _this3 = this; + if (args && !mod) { + mod = args; + args = false; + } + if (this.modules[mod]) { + if (id) { + if (this.modules[mod][id]) { + this.modules[mod][id][func](args); + } + } else { + Object.keys(this.modules[mod]).forEach(function(id2) { + _this3.modules[mod][id2][func](args); + }); + } + } + } + }, { + key: "on", + value: function on(e4, mod, func, id) { + var _this4 = this; + if (this.modules[mod]) { + if (id) { + this.modules[mod][id].el.addEventListener(e4, function(o5) { + return func(o5); + }); + } else { + Object.keys(this.modules[mod]).forEach(function(i5) { + _this4.modules[mod][i5].el.addEventListener(e4, function(o5) { + return func(o5); + }); + }); + } + } + } + }, { + key: "init", + value: function init2() { + } + }, { + key: "destroy", + value: function destroy() { + } + }]); + return _default2; + }(); + var _default$1 = /* @__PURE__ */ function() { + function _default2(options) { + _classCallCheck(this, _default2); + this.app; + this.modules = options.modules; + this.currentModules = {}; + this.activeModules = {}; + this.newModules = {}; + this.moduleId = 0; + } + _createClass(_default2, [{ + key: "init", + value: function init2(app2, scope) { + var _this = this; + var container = scope || document; + var elements = container.querySelectorAll("*"); + if (app2 && !this.app) { + this.app = app2; + } + this.activeModules["app"] = { + "app": this.app + }; + elements.forEach(function(el) { + Array.from(el.attributes).forEach(function(i5) { + if (i5.name.startsWith("data-module")) { + var moduleExists = false; + var dataName = i5.name.split("-").splice(2); + var moduleName = _this.toCamel(dataName); + if (_this.modules[moduleName]) { + moduleExists = true; + } else if (_this.modules[_this.toUpper(moduleName)]) { + moduleName = _this.toUpper(moduleName); + moduleExists = true; + } + if (moduleExists) { + var options = { + el, + name: moduleName, + dataName: dataName.join("-") + }; + var module = new _this.modules[moduleName](options); + var id = i5.value; + if (!id) { + _this.moduleId++; + id = "m" + _this.moduleId; + el.setAttribute(i5.name, id); + } + _this.addActiveModule(moduleName, id, module); + var moduleId = moduleName + "-" + id; + if (scope) { + _this.newModules[moduleId] = module; + } else { + _this.currentModules[moduleId] = module; + } + } + } + }); + }); + Object.entries(this.currentModules).forEach(function(_ref) { + var _ref2 = _slicedToArray(_ref, 2), id = _ref2[0], module = _ref2[1]; + if (scope) { + var split = id.split("-"); + var moduleName = split.shift(); + var moduleId = split.pop(); + _this.addActiveModule(moduleName, moduleId, module); + } else { + _this.initModule(module); + } + }); + } + }, { + key: "initModule", + value: function initModule(module) { + module.mInit(this.activeModules); + module.init(); + } + }, { + key: "addActiveModule", + value: function addActiveModule(name, id, module) { + if (this.activeModules[name]) { + Object.assign(this.activeModules[name], _defineProperty({}, id, module)); + } else { + this.activeModules[name] = _defineProperty({}, id, module); + } + } + }, { + key: "update", + value: function update(scope) { + var _this2 = this; + this.init(this.app, scope); + Object.entries(this.currentModules).forEach(function(_ref3) { + var _ref4 = _slicedToArray(_ref3, 2), id = _ref4[0], module = _ref4[1]; + module.mUpdate(_this2.activeModules); + }); + Object.entries(this.newModules).forEach(function(_ref5) { + var _ref6 = _slicedToArray(_ref5, 2), id = _ref6[0], module = _ref6[1]; + _this2.initModule(module); + }); + Object.assign(this.currentModules, this.newModules); + } + }, { + key: "destroy", + value: function destroy(scope) { + if (scope) { + this.destroyScope(scope); + } else { + this.destroyModules(); + } + } + }, { + key: "destroyScope", + value: function destroyScope(scope) { + var _this3 = this; + var elements = scope.querySelectorAll("*"); + elements.forEach(function(el) { + Array.from(el.attributes).forEach(function(i5) { + if (i5.name.startsWith("data-module")) { + var id = i5.value; + var dataName = i5.name.split("-").splice(2); + var moduleName = _this3.toCamel(dataName) + "-" + id; + var moduleExists = false; + if (_this3.currentModules[moduleName]) { + moduleExists = true; + } else if (_this3.currentModules[_this3.toUpper(moduleName)]) { + moduleName = _this3.toUpper(moduleName); + moduleExists = true; + } + if (moduleExists) { + _this3.destroyModule(_this3.currentModules[moduleName]); + delete _this3.currentModules[moduleName]; + } + } + }); + }); + this.activeModules = {}; + this.newModules = {}; + } + }, { + key: "destroyModules", + value: function destroyModules() { + var _this4 = this; + Object.entries(this.currentModules).forEach(function(_ref7) { + var _ref8 = _slicedToArray(_ref7, 2), id = _ref8[0], module = _ref8[1]; + _this4.destroyModule(module); + }); + this.currentModules = []; + } + }, { + key: "destroyModule", + value: function destroyModule(module) { + module.mDestroy(); + module.destroy(); + } + }, { + key: "toCamel", + value: function toCamel(arr) { + var _this5 = this; + return arr.reduce(function(a4, b3) { + return a4 + _this5.toUpper(b3); + }); + } + }, { + key: "toUpper", + value: function toUpper(str) { + return str.charAt(0).toUpperCase() + str.slice(1); + } + }]); + return _default2; + }(); + var main_esm_default = _default$1; + + // assets/scripts/modules.js + var modules_exports = {}; + __export(modules_exports, { + Dialog: () => Dialog_default, + Load: () => Load_default, + Scroll: () => Scroll_default + }); + + // assets/scripts/modules/Dialog.js + var Dialog_default = class extends _default { + constructor(m3) { + super(m3); + this.$closeBtn = this.$("close")[0]; + } + init() { + this.onKeyDown = this.onKeyDown.bind(this); + } + onKeyDown(e4) { + if (e4.key === "Escape") { + console.log("ESCAPE"); + e4.preventDefault(); + this.$closeBtn.click(); + } + } + populate(container) { + this.el.appendChild(container); + } + show() { + this.el.showModal(); + window.addEventListener("keydown", this.onKeyDown); + } + close() { + window.removeEventListener("keydown", this.onKeyDown); + this.el.close(); + } + }; + + // node_modules/delegate-it/delegate.js + var ledger = /* @__PURE__ */ new WeakMap(); + function editLedger(wanted, baseElement, callback, setup) { + var _a, _b; + if (!wanted && !ledger.has(baseElement)) { + return false; + } + const elementMap = (_a = ledger.get(baseElement)) != null ? _a : /* @__PURE__ */ new WeakMap(); + ledger.set(baseElement, elementMap); + const setups = (_b = elementMap.get(callback)) != null ? _b : /* @__PURE__ */ new Set(); + elementMap.set(callback, setups); + const existed = setups.has(setup); + if (wanted) { + setups.add(setup); + } else { + setups.delete(setup); + } + return existed && wanted; + } + function safeClosest(event, selector) { + let target = event.target; + if (target instanceof Text) { + target = target.parentElement; + } + if (target instanceof Element && event.currentTarget instanceof Element) { + const closest = target.closest(selector); + if (closest && event.currentTarget.contains(closest)) { + return closest; + } + } + } + function delegate(selector, type, callback, options = {}) { + const { signal, base = document } = options; + if (signal == null ? void 0 : signal.aborted) { + return; + } + const _a = options, { once } = _a, nativeListenerOptions = __objRest(_a, ["once"]); + const baseElement = base instanceof Document ? base.documentElement : base; + const capture = Boolean(typeof options === "object" ? options.capture : options); + const listenerFn = (event) => { + const delegateTarget = safeClosest(event, selector); + if (delegateTarget) { + const delegateEvent = Object.assign(event, { delegateTarget }); + callback.call(baseElement, delegateEvent); + if (once) { + baseElement.removeEventListener(type, listenerFn, nativeListenerOptions); + editLedger(false, baseElement, callback, setup); + } + } + }; + const setup = JSON.stringify({ selector, type, capture }); + const isAlreadyListening = editLedger(true, baseElement, callback, setup); + if (!isAlreadyListening) { + baseElement.addEventListener(type, listenerFn, nativeListenerOptions); + } + signal == null ? void 0 : signal.addEventListener("abort", () => { + editLedger(false, baseElement, callback, setup); + }); + } + var delegate_default = delegate; + + // node_modules/path-to-regexp/dist.es2015/index.js + function lexer(str) { + var tokens = []; + var i5 = 0; + while (i5 < str.length) { + var char = str[i5]; + if (char === "*" || char === "+" || char === "?") { + tokens.push({ type: "MODIFIER", index: i5, value: str[i5++] }); + continue; + } + if (char === "\\") { + tokens.push({ type: "ESCAPED_CHAR", index: i5++, value: str[i5++] }); + continue; + } + if (char === "{") { + tokens.push({ type: "OPEN", index: i5, value: str[i5++] }); + continue; + } + if (char === "}") { + tokens.push({ type: "CLOSE", index: i5, value: str[i5++] }); + continue; + } + if (char === ":") { + var name = ""; + var j2 = i5 + 1; + while (j2 < str.length) { + var code = str.charCodeAt(j2); + if ( + // `0-9` + code >= 48 && code <= 57 || // `A-Z` + code >= 65 && code <= 90 || // `a-z` + code >= 97 && code <= 122 || // `_` + code === 95 + ) { + name += str[j2++]; + continue; + } + break; + } + if (!name) + throw new TypeError("Missing parameter name at ".concat(i5)); + tokens.push({ type: "NAME", index: i5, value: name }); + i5 = j2; + continue; + } + if (char === "(") { + var count = 1; + var pattern = ""; + var j2 = i5 + 1; + if (str[j2] === "?") { + throw new TypeError('Pattern cannot start with "?" at '.concat(j2)); + } + while (j2 < str.length) { + if (str[j2] === "\\") { + pattern += str[j2++] + str[j2++]; + continue; + } + if (str[j2] === ")") { + count--; + if (count === 0) { + j2++; + break; + } + } else if (str[j2] === "(") { + count++; + if (str[j2 + 1] !== "?") { + throw new TypeError("Capturing groups are not allowed at ".concat(j2)); + } + } + pattern += str[j2++]; + } + if (count) + throw new TypeError("Unbalanced pattern at ".concat(i5)); + if (!pattern) + throw new TypeError("Missing pattern at ".concat(i5)); + tokens.push({ type: "PATTERN", index: i5, value: pattern }); + i5 = j2; + continue; + } + tokens.push({ type: "CHAR", index: i5, value: str[i5++] }); + } + tokens.push({ type: "END", index: i5, value: "" }); + return tokens; + } + function parse(str, options) { + if (options === void 0) { + options = {}; + } + var tokens = lexer(str); + var _a = options.prefixes, prefixes = _a === void 0 ? "./" : _a; + var defaultPattern = "[^".concat(escapeString(options.delimiter || "/#?"), "]+?"); + var result = []; + var key = 0; + var i5 = 0; + var path = ""; + var tryConsume = function(type) { + if (i5 < tokens.length && tokens[i5].type === type) + return tokens[i5++].value; + }; + var mustConsume = function(type) { + var value2 = tryConsume(type); + if (value2 !== void 0) + return value2; + var _a2 = tokens[i5], nextType = _a2.type, index = _a2.index; + throw new TypeError("Unexpected ".concat(nextType, " at ").concat(index, ", expected ").concat(type)); + }; + var consumeText = function() { + var result2 = ""; + var value2; + while (value2 = tryConsume("CHAR") || tryConsume("ESCAPED_CHAR")) { + result2 += value2; + } + return result2; + }; + while (i5 < tokens.length) { + var char = tryConsume("CHAR"); + var name = tryConsume("NAME"); + var pattern = tryConsume("PATTERN"); + if (name || pattern) { + var prefix = char || ""; + if (prefixes.indexOf(prefix) === -1) { + path += prefix; + prefix = ""; + } + if (path) { + result.push(path); + path = ""; + } + result.push({ + name: name || key++, + prefix, + suffix: "", + pattern: pattern || defaultPattern, + modifier: tryConsume("MODIFIER") || "" + }); + continue; + } + var value = char || tryConsume("ESCAPED_CHAR"); + if (value) { + path += value; + continue; + } + if (path) { + result.push(path); + path = ""; + } + var open = tryConsume("OPEN"); + if (open) { + var prefix = consumeText(); + var name_1 = tryConsume("NAME") || ""; + var pattern_1 = tryConsume("PATTERN") || ""; + var suffix = consumeText(); + mustConsume("CLOSE"); + result.push({ + name: name_1 || (pattern_1 ? key++ : ""), + pattern: name_1 && !pattern_1 ? defaultPattern : pattern_1, + prefix, + suffix, + modifier: tryConsume("MODIFIER") || "" + }); + continue; + } + mustConsume("END"); + } + return result; + } + function match(str, options) { + var keys = []; + var re = pathToRegexp(str, keys, options); + return regexpToFunction(re, keys, options); + } + function regexpToFunction(re, keys, options) { + if (options === void 0) { + options = {}; + } + var _a = options.decode, decode = _a === void 0 ? function(x2) { + return x2; + } : _a; + return function(pathname) { + var m3 = re.exec(pathname); + if (!m3) + return false; + var path = m3[0], index = m3.index; + var params = /* @__PURE__ */ Object.create(null); + var _loop_1 = function(i6) { + if (m3[i6] === void 0) + return "continue"; + var key = keys[i6 - 1]; + if (key.modifier === "*" || key.modifier === "+") { + params[key.name] = m3[i6].split(key.prefix + key.suffix).map(function(value) { + return decode(value, key); + }); + } else { + params[key.name] = decode(m3[i6], key); + } + }; + for (var i5 = 1; i5 < m3.length; i5++) { + _loop_1(i5); + } + return { path, index, params }; + }; + } + function escapeString(str) { + return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1"); + } + function flags(options) { + return options && options.sensitive ? "" : "i"; + } + function regexpToRegexp(path, keys) { + if (!keys) + return path; + var groupsRegex = /\((?:\?<(.*?)>)?(?!\?)/g; + var index = 0; + var execResult = groupsRegex.exec(path.source); + while (execResult) { + keys.push({ + // Use parenthesized substring match if available, index otherwise + name: execResult[1] || index++, + prefix: "", + suffix: "", + modifier: "", + pattern: "" + }); + execResult = groupsRegex.exec(path.source); + } + return path; + } + function arrayToRegexp(paths, keys, options) { + var parts = paths.map(function(path) { + return pathToRegexp(path, keys, options).source; + }); + return new RegExp("(?:".concat(parts.join("|"), ")"), flags(options)); + } + function stringToRegexp(path, keys, options) { + return tokensToRegexp(parse(path, options), keys, options); + } + function tokensToRegexp(tokens, keys, options) { + if (options === void 0) { + options = {}; + } + var _a = options.strict, strict = _a === void 0 ? false : _a, _b = options.start, start = _b === void 0 ? true : _b, _c = options.end, end = _c === void 0 ? true : _c, _d = options.encode, encode = _d === void 0 ? function(x2) { + return x2; + } : _d, _e = options.delimiter, delimiter = _e === void 0 ? "/#?" : _e, _f = options.endsWith, endsWith = _f === void 0 ? "" : _f; + var endsWithRe = "[".concat(escapeString(endsWith), "]|$"); + var delimiterRe = "[".concat(escapeString(delimiter), "]"); + var route = start ? "^" : ""; + for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) { + var token = tokens_1[_i]; + if (typeof token === "string") { + route += escapeString(encode(token)); + } else { + var prefix = escapeString(encode(token.prefix)); + var suffix = escapeString(encode(token.suffix)); + if (token.pattern) { + if (keys) + keys.push(token); + if (prefix || suffix) { + if (token.modifier === "+" || token.modifier === "*") { + var mod = token.modifier === "*" ? "?" : ""; + route += "(?:".concat(prefix, "((?:").concat(token.pattern, ")(?:").concat(suffix).concat(prefix, "(?:").concat(token.pattern, "))*)").concat(suffix, ")").concat(mod); + } else { + route += "(?:".concat(prefix, "(").concat(token.pattern, ")").concat(suffix, ")").concat(token.modifier); + } + } else { + if (token.modifier === "+" || token.modifier === "*") { + route += "((?:".concat(token.pattern, ")").concat(token.modifier, ")"); + } else { + route += "(".concat(token.pattern, ")").concat(token.modifier); + } + } + } else { + route += "(?:".concat(prefix).concat(suffix, ")").concat(token.modifier); + } + } + } + if (end) { + if (!strict) + route += "".concat(delimiterRe, "?"); + route += !options.endsWith ? "$" : "(?=".concat(endsWithRe, ")"); + } else { + var endToken = tokens[tokens.length - 1]; + var isEndDelimited = typeof endToken === "string" ? delimiterRe.indexOf(endToken[endToken.length - 1]) > -1 : endToken === void 0; + if (!strict) { + route += "(?:".concat(delimiterRe, "(?=").concat(endsWithRe, "))?"); + } + if (!isEndDelimited) { + route += "(?=".concat(delimiterRe, "|").concat(endsWithRe, ")"); + } + } + return new RegExp(route, flags(options)); + } + function pathToRegexp(path, keys, options) { + if (path instanceof RegExp) + return regexpToRegexp(path, keys); + if (Array.isArray(path)) + return arrayToRegexp(path, keys, options); + return stringToRegexp(path, keys, options); + } + + // node_modules/swup/dist/Swup.modern.js + function i() { + return i = Object.assign ? Object.assign.bind() : function(t2) { + for (var e4 = 1; e4 < arguments.length; e4++) { + var i5 = arguments[e4]; + for (var s5 in i5) + Object.prototype.hasOwnProperty.call(i5, s5) && (t2[s5] = i5[s5]); + } + return t2; + }, i.apply(this, arguments); + } + var s = (t2, e4) => String(t2).toLowerCase().replace(/[\s/_.]+/g, "-").replace(/[^\w-]+/g, "").replace(/--+/g, "-").replace(/^-+|-+$/g, "") || e4 || ""; + var n = ({ hash: t2 } = {}) => window.location.pathname + window.location.search + (t2 ? window.location.hash : ""); + var o = (t2, e4 = {}) => { + const s5 = i({ url: t2 = t2 || n({ hash: true }), random: Math.random(), source: "swup" }, e4); + window.history.pushState(s5, "", t2); + }; + var r = (t2 = null, e4 = {}) => { + t2 = t2 || n({ hash: true }); + const s5 = i({}, window.history.state || {}, { url: t2, random: Math.random(), source: "swup" }, e4); + window.history.replaceState(s5, "", t2); + }; + var a = (e4, s5, n5, o5) => { + const r5 = new AbortController(); + return o5 = i({}, o5, { signal: r5.signal }), delegate_default(e4, s5, n5, o5), { destroy: () => r5.abort() }; + }; + var l = class extends URL { + constructor(t2, e4 = document.baseURI) { + super(t2.toString(), e4), Object.setPrototypeOf(this, l.prototype); + } + get url() { + return this.pathname + this.search; + } + static fromElement(t2) { + const e4 = t2.getAttribute("href") || t2.getAttribute("xlink:href") || ""; + return new l(e4); + } + static fromUrl(t2) { + return new l(t2); + } + }; + var h = (t2, i5) => { + try { + return match(t2, i5); + } catch (e4) { + throw new Error(`[swup] Error parsing path "${String(t2)}": +${String(e4)}`); + } + }; + var c = class extends Error { + constructor(t2, e4) { + super(t2), this.url = void 0, this.status = void 0, this.aborted = void 0, this.timedOut = void 0, this.name = "FetchError", this.url = e4.url, this.status = e4.status, this.aborted = e4.aborted || false, this.timedOut = e4.timedOut || false; + } + }; + function u(_0) { + return __async(this, arguments, function* (t2, e4 = {}) { + var s5; + t2 = l.fromUrl(t2).url; + const { visit: n5 = this.visit } = e4, o5 = i({}, this.options.requestHeaders, e4.headers), r5 = null != (s5 = e4.timeout) ? s5 : this.options.timeout, a4 = new AbortController(), { signal: h4 } = a4; + e4 = i({}, e4, { headers: o5, signal: h4 }); + let u3, d3 = false, p3 = null; + r5 && r5 > 0 && (p3 = setTimeout(() => { + d3 = true, a4.abort("timeout"); + }, r5)); + try { + u3 = yield this.hooks.call("fetch:request", n5, { url: t2, options: e4 }, (t3, { url: e5, options: i5 }) => fetch(e5, i5)), p3 && clearTimeout(p3); + } catch (e5) { + if (d3) + throw this.hooks.call("fetch:timeout", n5, { url: t2 }), new c(`Request timed out: ${t2}`, { url: t2, timedOut: d3 }); + if ("AbortError" === (null == e5 ? void 0 : e5.name) || h4.aborted) + throw new c(`Request aborted: ${t2}`, { url: t2, aborted: true }); + throw e5; + } + const { status: m3, url: w3 } = u3, g3 = yield u3.text(); + if (500 === m3) + throw this.hooks.call("fetch:error", n5, { status: m3, response: u3, url: w3 }), new c(`Server error: ${w3}`, { status: m3, url: w3 }); + if (!g3) + throw new c(`Empty response: ${w3}`, { status: m3, url: w3 }); + const { url: f3 } = l.fromUrl(w3), v2 = { url: f3, html: g3 }; + return !n5.cache.write || e4.method && "GET" !== e4.method || t2 !== f3 || this.cache.set(v2.url, v2), v2; + }); + } + var d = class { + constructor(t2) { + this.swup = void 0, this.pages = /* @__PURE__ */ new Map(), this.swup = t2; + } + get size() { + return this.pages.size; + } + get all() { + const t2 = /* @__PURE__ */ new Map(); + return this.pages.forEach((e4, s5) => { + t2.set(s5, i({}, e4)); + }), t2; + } + has(t2) { + return this.pages.has(this.resolve(t2)); + } + get(t2) { + const e4 = this.pages.get(this.resolve(t2)); + return e4 ? i({}, e4) : e4; + } + set(t2, e4) { + e4 = i({}, e4, { url: t2 = this.resolve(t2) }), this.pages.set(t2, e4), this.swup.hooks.callSync("cache:set", void 0, { page: e4 }); + } + update(t2, e4) { + t2 = this.resolve(t2); + const s5 = i({}, this.get(t2), e4, { url: t2 }); + this.pages.set(t2, s5); + } + delete(t2) { + this.pages.delete(this.resolve(t2)); + } + clear() { + this.pages.clear(), this.swup.hooks.callSync("cache:clear", void 0, void 0); + } + prune(t2) { + this.pages.forEach((e4, i5) => { + t2(i5, e4) && this.delete(i5); + }); + } + resolve(t2) { + const { url: e4 } = l.fromUrl(t2); + return this.swup.resolveUrl(e4); + } + }; + var p = (t2, e4 = document) => e4.querySelector(t2); + var m = (t2, e4 = document) => Array.from(e4.querySelectorAll(t2)); + var w = () => new Promise((t2) => { + requestAnimationFrame(() => { + requestAnimationFrame(() => { + t2(); + }); + }); + }); + function g(t2) { + return !!t2 && ("object" == typeof t2 || "function" == typeof t2) && "function" == typeof t2.then; + } + function f(t2, e4 = []) { + return new Promise((i5, s5) => { + const n5 = t2(...e4); + g(n5) ? n5.then(i5, s5) : i5(n5); + }); + } + var y = (t2) => window.CSS && window.CSS.escape ? CSS.escape(t2) : t2; + var k = (t2) => 1e3 * Number(t2.slice(0, -1).replace(",", ".")); + var b = class { + constructor(t2) { + this.swup = void 0, this.swupClasses = ["to-", "is-changing", "is-rendering", "is-popstate", "is-animating", "is-leaving"], this.swup = t2; + } + get selectors() { + const { scope: t2 } = this.swup.visit.animation; + return "containers" === t2 ? this.swup.visit.containers : "html" === t2 ? ["html"] : Array.isArray(t2) ? t2 : []; + } + get selector() { + return this.selectors.join(","); + } + get targets() { + return this.selector.trim() ? m(this.selector) : []; + } + add(...t2) { + this.targets.forEach((e4) => e4.classList.add(...t2)); + } + remove(...t2) { + this.targets.forEach((e4) => e4.classList.remove(...t2)); + } + clear() { + this.targets.forEach((t2) => { + const e4 = t2.className.split(" ").filter((t3) => this.isSwupClass(t3)); + t2.classList.remove(...e4); + }); + } + isSwupClass(t2) { + return this.swupClasses.some((e4) => t2.startsWith(e4)); + } + }; + var S = class { + constructor(t2, e4) { + 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: i5, from: s5 = t2.currentPageUrl, hash: n5, el: o5, event: r5 } = e4; + this.id = Math.random(), this.state = 1, this.from = { url: s5 }, this.to = { url: i5, hash: n5 }, this.containers = t2.options.containers, this.animation = { animate: true, wait: false, name: void 0, native: t2.options.native, scope: t2.options.animationScope, selector: t2.options.animationSelector }, this.trigger = { el: o5, event: r5 }, this.cache = { read: t2.options.cache, write: t2.options.cache }, this.history = { action: "push", popstate: false, direction: void 0 }, this.scroll = { reset: true, target: void 0 }; + } + advance(t2) { + this.state < t2 && (this.state = t2); + } + abort() { + this.state = 8; + } + get done() { + return this.state >= 7; + } + }; + function E(t2) { + return new S(this, t2); + } + var P = class { + constructor(t2) { + this.swup = void 0, this.registry = /* @__PURE__ */ 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 = t2, this.init(); + } + init() { + this.hooks.forEach((t2) => this.create(t2)); + } + create(t2) { + this.registry.has(t2) || this.registry.set(t2, /* @__PURE__ */ new Map()); + } + exists(t2) { + return this.registry.has(t2); + } + get(t2) { + const e4 = this.registry.get(t2); + if (e4) + return e4; + console.error(`Unknown hook '${t2}'`); + } + clear() { + this.registry.forEach((t2) => t2.clear()); + } + on(t2, e4, s5 = {}) { + const n5 = this.get(t2); + if (!n5) + return console.warn(`Hook '${t2}' not found.`), () => { + }; + const o5 = i({}, s5, { id: n5.size + 1, hook: t2, handler: e4 }); + return n5.set(e4, o5), () => this.off(t2, e4); + } + before(t2, e4, s5 = {}) { + return this.on(t2, e4, i({}, s5, { before: true })); + } + replace(t2, e4, s5 = {}) { + return this.on(t2, e4, i({}, s5, { replace: true })); + } + once(t2, e4, s5 = {}) { + return this.on(t2, e4, i({}, s5, { once: true })); + } + off(t2, e4) { + const i5 = this.get(t2); + i5 && e4 ? i5.delete(e4) || console.warn(`Handler for hook '${t2}' not found.`) : i5 && i5.clear(); + } + call(t2, e4, i5, s5) { + return __async(this, null, function* () { + const [n5, o5, r5] = this.parseCallArgs(t2, e4, i5, s5), { before: a4, handler: l4, after: h4 } = this.getHandlers(t2, r5); + yield this.run(a4, n5, o5); + const [c4] = yield this.run(l4, n5, o5, true); + return yield this.run(h4, n5, o5), this.dispatchDomEvent(t2, n5, o5), c4; + }); + } + callSync(t2, e4, i5, s5) { + const [n5, o5, r5] = this.parseCallArgs(t2, e4, i5, s5), { before: a4, handler: l4, after: h4 } = this.getHandlers(t2, r5); + this.runSync(a4, n5, o5); + const [c4] = this.runSync(l4, n5, o5, true); + return this.runSync(h4, n5, o5), this.dispatchDomEvent(t2, n5, o5), c4; + } + parseCallArgs(t2, e4, i5, s5) { + return e4 instanceof S || "object" != typeof e4 && "function" != typeof i5 ? [e4, i5, s5] : [void 0, e4, i5]; + } + run(_0) { + return __async(this, arguments, function* (t2, e4 = this.swup.visit, i5, s5 = false) { + const n5 = []; + for (const { hook: o5, handler: r5, defaultHandler: a4, once: l4 } of t2) + if (null == e4 || !e4.done) { + l4 && this.off(o5, r5); + try { + const t3 = yield f(r5, [e4, i5, a4]); + n5.push(t3); + } catch (t3) { + if (s5) + throw t3; + console.error(`Error in hook '${o5}':`, t3); + } + } + return n5; + }); + } + runSync(t2, e4 = this.swup.visit, i5, s5 = false) { + const n5 = []; + for (const { hook: o5, handler: r5, defaultHandler: a4, once: l4 } of t2) + if (null == e4 || !e4.done) { + l4 && this.off(o5, r5); + try { + const t3 = r5(e4, i5, a4); + n5.push(t3), g(t3) && console.warn(`Swup will not await Promises in handler for synchronous hook '${o5}'.`); + } catch (t3) { + if (s5) + throw t3; + console.error(`Error in hook '${o5}':`, t3); + } + } + return n5; + } + getHandlers(t2, e4) { + const i5 = this.get(t2); + if (!i5) + return { found: false, before: [], handler: [], after: [], replaced: false }; + const s5 = Array.from(i5.values()), n5 = this.sortRegistrations, o5 = s5.filter(({ before: t3, replace: e5 }) => t3 && !e5).sort(n5), r5 = s5.filter(({ replace: t3 }) => t3).filter((t3) => true).sort(n5), a4 = s5.filter(({ before: t3, replace: e5 }) => !t3 && !e5).sort(n5), l4 = r5.length > 0; + let h4 = []; + if (e4 && (h4 = [{ id: 0, hook: t2, handler: e4 }], l4)) { + const i6 = r5.length - 1, s6 = (t3) => { + const i7 = r5[t3 - 1]; + return i7 ? (e5, n6) => i7.handler(e5, n6, s6(t3 - 1)) : e4; + }; + h4 = [{ id: 0, hook: t2, handler: r5[i6].handler, defaultHandler: s6(i6) }]; + } + return { found: true, before: o5, handler: h4, after: a4, replaced: l4 }; + } + sortRegistrations(t2, e4) { + var i5, s5; + return (null != (i5 = t2.priority) ? i5 : 0) - (null != (s5 = e4.priority) ? s5 : 0) || t2.id - e4.id || 0; + } + dispatchDomEvent(t2, e4, i5) { + if (null != e4 && e4.done) + return; + const s5 = { hook: t2, args: i5, visit: e4 || this.swup.visit }; + document.dispatchEvent(new CustomEvent("swup:any", { detail: s5, bubbles: true })), document.dispatchEvent(new CustomEvent(`swup:${t2}`, { detail: s5, bubbles: true })); + } + }; + var U = (t2) => { + if (t2 && "#" === t2.charAt(0) && (t2 = t2.substring(1)), !t2) + return null; + const e4 = decodeURIComponent(t2); + let i5 = document.getElementById(t2) || document.getElementById(e4) || p(`a[name='${y(t2)}']`) || p(`a[name='${y(e4)}']`); + return i5 || "top" !== t2 || (i5 = document.body), i5; + }; + var C = "transition"; + var $ = "animation"; + function x(_0) { + return __async(this, arguments, function* ({ elements: t2, selector: e4 }) { + if (false === e4 && !t2) + return; + let i5 = []; + if (t2) + i5 = Array.from(t2); + else if (e4 && (i5 = m(e4, document.body), !i5.length)) + return void console.warn(`[swup] No elements found matching animationSelector \`${e4}\``); + const s5 = i5.map((t3) => function(t4) { + const { type: e5, timeout: i6, propCount: s6 } = function(t5, e6) { + const i7 = window.getComputedStyle(t5), s7 = A(i7, `${C}Delay`), n5 = A(i7, `${C}Duration`), o5 = H(s7, n5), r5 = A(i7, `${$}Delay`), a4 = A(i7, `${$}Duration`), l4 = H(r5, a4); + let h4 = null, c4 = 0, u3 = 0; + return c4 = Math.max(o5, l4), h4 = c4 > 0 ? o5 > l4 ? C : $ : null, u3 = h4 ? h4 === C ? n5.length : a4.length : 0, { type: h4, timeout: c4, propCount: u3 }; + }(t4); + return !(!e5 || !i6) && new Promise((n5) => { + const o5 = `${e5}end`, r5 = performance.now(); + let a4 = 0; + const l4 = () => { + t4.removeEventListener(o5, h4), n5(); + }, h4 = (e6) => { + if (e6.target === t4) { + if (!function(t5) { + return [`${C}end`, `${$}end`].includes(t5.type); + }(e6)) + throw new Error("Not a transition or animation event."); + (performance.now() - r5) / 1e3 < e6.elapsedTime || ++a4 >= s6 && l4(); + } + }; + setTimeout(() => { + a4 < s6 && l4(); + }, i6 + 1), t4.addEventListener(o5, h4); + }); + }(t3)); + s5.filter(Boolean).length > 0 ? yield Promise.all(s5) : e4 && console.warn(`[swup] No CSS animation duration defined on elements matching \`${e4}\``); + }); + } + function A(t2, e4) { + return (t2[e4] || "").split(", "); + } + function H(t2, e4) { + for (; t2.length < e4.length; ) + t2 = t2.concat(t2); + return Math.max(...e4.map((e5, i5) => k(e5) + k(t2[i5]))); + } + function q(t2, e4 = {}, s5 = {}) { + if ("string" != typeof t2) + throw new Error("swup.navigate() requires a URL parameter"); + if (this.shouldIgnoreVisit(t2, { el: s5.el, event: s5.event })) + return void window.location.assign(t2); + const { url: n5, hash: o5 } = l.fromUrl(t2), r5 = this.createVisit(i({}, s5, { to: n5, hash: o5 })); + this.performNavigation(r5, e4); + } + function V(_0) { + return __async(this, arguments, function* (t2, e4 = {}) { + if (this.navigating) { + if (this.visit.state >= 6) + return t2.state = 2, void (this.onVisitEnd = () => this.performNavigation(t2, e4)); + yield this.hooks.call("visit:abort", this.visit, void 0), this.visit.state = 8; + } + this.navigating = true, this.visit = t2; + const { el: i5 } = t2.trigger; + e4.referrer = e4.referrer || this.currentPageUrl, false === e4.animate && (t2.animation.animate = false), t2.animation.animate || this.classes.clear(); + const a4 = e4.history || (null == i5 ? void 0 : i5.getAttribute("data-swup-history")) || void 0; + a4 && ["push", "replace"].includes(a4) && (t2.history.action = a4); + const l4 = e4.animation || (null == i5 ? void 0 : i5.getAttribute("data-swup-animation")) || void 0; + var h4, c4; + l4 && (t2.animation.name = l4), "object" == typeof e4.cache ? (t2.cache.read = null != (h4 = e4.cache.read) ? h4 : t2.cache.read, t2.cache.write = null != (c4 = e4.cache.write) ? c4 : t2.cache.write) : void 0 !== e4.cache && (t2.cache = { read: !!e4.cache, write: !!e4.cache }), delete e4.cache; + try { + yield this.hooks.call("visit:start", t2, void 0), t2.state = 3; + const i6 = this.hooks.call("page:load", t2, { options: e4 }, (t3, e5) => __async(this, null, function* () { + let i7; + return t3.cache.read && (i7 = this.cache.get(t3.to.url)), e5.page = i7 || (yield this.fetchPage(t3.to.url, e5.options)), e5.cache = !!i7, e5.page; + })); + if (i6.then(({ html: e5 }) => { + t2.advance(5), t2.to.html = e5; + }), !t2.history.popstate) { + const e5 = t2.to.url + t2.to.hash; + "replace" === t2.history.action || t2.to.url === this.currentPageUrl ? r(e5) : (this.currentHistoryIndex++, o(e5, { index: this.currentHistoryIndex })); + } + if (this.currentPageUrl = n(), t2.history.popstate && this.classes.add("is-popstate"), t2.animation.name && this.classes.add(`to-${s(t2.animation.name)}`), t2.animation.wait && (yield i6), t2.done) + return; + if (yield this.hooks.call("visit:transition", t2, void 0, () => __async(this, null, function* () { + if (!t2.animation.animate) + return yield this.hooks.call("animation:skip", void 0), void (yield this.renderPage(t2, yield i6)); + t2.advance(4), yield this.animatePageOut(t2), t2.animation.native && document.startViewTransition ? yield document.startViewTransition(() => __async(this, null, function* () { + return yield this.renderPage(t2, yield i6); + })).finished : yield this.renderPage(t2, yield i6), yield this.animatePageIn(t2); + })), t2.done) + return; + yield this.hooks.call("visit:end", t2, void 0, () => this.classes.clear()), t2.state = 7, this.navigating = false, this.onVisitEnd && (this.onVisitEnd(), this.onVisitEnd = void 0); + } catch (e5) { + if (!e5 || null != e5 && e5.aborted) + return void (t2.state = 8); + t2.state = 9, console.error(e5), this.options.skipPopStateHandling = () => (window.location.assign(t2.to.url + t2.to.hash), true), window.history.back(); + } + }); + } + var I = function(t2) { + return __async(this, null, function* () { + yield this.hooks.call("animation:out:start", t2, void 0, () => { + this.classes.add("is-changing", "is-animating", "is-leaving"); + }), yield this.hooks.call("animation:out:await", t2, { skip: false }, (t3, { skip: e4 }) => { + if (!e4) + return this.awaitAnimations({ selector: t3.animation.selector }); + }), yield this.hooks.call("animation:out:end", t2, void 0); + }); + }; + var L = function({ html: t2 }, { containers: e4 } = this.options) { + var i5; + const s5 = new DOMParser().parseFromString(t2, "text/html"), n5 = (null == (i5 = s5.querySelector("title")) ? void 0 : i5.innerText) || ""; + document.title = n5; + const o5 = m('[data-swup-persist]:not([data-swup-persist=""])'), r5 = e4.map((t3) => { + const e5 = document.querySelector(t3), i6 = s5.querySelector(t3); + return e5 && i6 ? (e5.replaceWith(i6), true) : (e5 || console.warn(`[swup] Container missing in current document: ${t3}`), i6 || console.warn(`[swup] Container missing in incoming document: ${t3}`), false); + }).filter(Boolean); + return o5.forEach((t3) => { + const e5 = t3.getAttribute("data-swup-persist"), i6 = p(`[data-swup-persist="${e5}"]`); + i6 && i6 !== t3 && i6.replaceWith(t3); + }), r5.length === e4.length; + }; + var R = function(t2) { + const e4 = { behavior: "auto" }, { target: s5, reset: n5 } = t2.scroll, o5 = null != s5 ? s5 : t2.to.hash; + let r5 = false; + return o5 && (r5 = this.hooks.callSync("scroll:anchor", t2, { hash: o5, options: e4 }, (t3, { hash: e5, options: i5 }) => { + const s6 = this.getAnchorElement(e5); + return s6 && s6.scrollIntoView(i5), !!s6; + })), n5 && !r5 && (r5 = this.hooks.callSync("scroll:top", t2, { options: e4 }, (t3, { options: e5 }) => (window.scrollTo(i({ top: 0, left: 0 }, e5)), true))), r5; + }; + var T = function(t2) { + return __async(this, null, function* () { + if (t2.done) + return; + const e4 = this.hooks.call("animation:in:await", t2, { skip: false }, (t3, { skip: e5 }) => { + if (!e5) + return this.awaitAnimations({ selector: t3.animation.selector }); + }); + yield w(), yield this.hooks.call("animation:in:start", t2, void 0, () => { + this.classes.remove("is-animating"); + }), yield e4, yield this.hooks.call("animation:in:end", t2, void 0); + }); + }; + var N = function(t2, e4) { + return __async(this, null, function* () { + if (t2.done) + return; + t2.advance(6); + const { url: i5 } = e4; + this.isSameResolvedUrl(n(), i5) || (r(i5), this.currentPageUrl = n(), t2.to.url = this.currentPageUrl), yield this.hooks.call("content:replace", t2, { page: e4 }, (t3, { page: e5 }) => { + if (this.classes.remove("is-leaving"), t3.animation.animate && this.classes.add("is-rendering"), !this.replaceContent(e5, { containers: t3.containers })) + throw new Error("[swup] Container mismatch, aborting"); + t3.animation.animate && (this.classes.add("is-changing", "is-animating", "is-rendering"), t3.animation.name && this.classes.add(`to-${s(t3.animation.name)}`)); + }), yield this.hooks.call("content:scroll", t2, void 0, () => this.scrollToContent(t2)), yield this.hooks.call("page:view", t2, { url: this.currentPageUrl, title: document.title }); + }); + }; + var O = function(t2) { + var e4; + if (e4 = t2, Boolean(null == e4 ? void 0 : e4.isSwupPlugin)) { + if (t2.swup = this, !t2._checkRequirements || t2._checkRequirements()) + return t2._beforeMount && t2._beforeMount(), t2.mount(), this.plugins.push(t2), this.plugins; + } else + console.error("Not a swup plugin instance", t2); + }; + function D(t2) { + const e4 = this.findPlugin(t2); + if (e4) + return e4.unmount(), e4._afterUnmount && e4._afterUnmount(), this.plugins = this.plugins.filter((t3) => t3 !== e4), this.plugins; + console.error("No such plugin", e4); + } + function M(t2) { + return this.plugins.find((e4) => e4 === t2 || e4.name === t2 || e4.name === `Swup${String(t2)}`); + } + function W(t2) { + if ("function" != typeof this.options.resolveUrl) + return console.warn("[swup] options.resolveUrl expects a callback function."), t2; + const e4 = this.options.resolveUrl(t2); + return e4 && "string" == typeof e4 ? e4.startsWith("//") || e4.startsWith("http") ? (console.warn("[swup] options.resolveUrl needs to return a relative url"), t2) : e4 : (console.warn("[swup] options.resolveUrl needs to return a url"), t2); + } + function j(t2, e4) { + return this.resolveUrl(t2) === this.resolveUrl(e4); + } + var B = { animateHistoryBrowsing: false, animationSelector: '[class*="transition-"]', animationScope: "html", cache: true, containers: ["#swup"], ignoreVisit: (t2, { el: e4 } = {}) => !(null == e4 || !e4.closest("[data-no-swup]")), linkSelector: "a[href]", linkToSelf: "scroll", native: false, plugins: [], resolveUrl: (t2) => t2, requestHeaders: { "X-Requested-With": "swup", Accept: "text/html, application/xhtml+xml" }, skipPopStateHandling: (t2) => { + var e4; + return "swup" !== (null == (e4 = t2.state) ? void 0 : e4.source); + }, timeout: 0 }; + var _ = class { + constructor(t2 = {}) { + var e4, s5; + this.version = "4.5.1", this.options = void 0, this.defaults = B, this.plugins = [], this.visit = void 0, this.cache = void 0, this.hooks = void 0, this.classes = void 0, this.currentPageUrl = n(), this.currentHistoryIndex = void 0, this.clickDelegate = void 0, this.navigating = false, this.onVisitEnd = void 0, this.use = O, this.unuse = D, this.findPlugin = M, this.log = () => { + }, this.navigate = q, this.performNavigation = V, this.createVisit = E, this.delegateEvent = a, this.fetchPage = u, this.awaitAnimations = x, this.renderPage = N, this.replaceContent = L, this.animatePageIn = T, this.animatePageOut = I, this.scrollToContent = R, this.getAnchorElement = U, this.getCurrentUrl = n, this.resolveUrl = W, this.isSameResolvedUrl = j, this.options = i({}, this.defaults, t2), this.handleLinkClick = this.handleLinkClick.bind(this), this.handlePopState = this.handlePopState.bind(this), this.cache = new d(this), this.classes = new b(this), this.hooks = new P(this), this.visit = this.createVisit({ to: "" }), this.currentHistoryIndex = null != (e4 = null == (s5 = window.history.state) ? void 0 : s5.index) ? e4 : 1, this.checkRequirements() && this.enable(); + } + checkRequirements() { + return "undefined" != typeof Promise || (console.warn("Promise is not supported"), false); + } + enable() { + return __async(this, null, function* () { + var t2; + const { linkSelector: e4 } = this.options; + this.clickDelegate = this.delegateEvent(e4, "click", this.handleLinkClick), window.addEventListener("popstate", this.handlePopState), this.options.animateHistoryBrowsing && (window.history.scrollRestoration = "manual"), this.options.native = this.options.native && !!document.startViewTransition, this.options.plugins.forEach((t3) => this.use(t3)), "swup" !== (null == (t2 = window.history.state) ? void 0 : t2.source) && r(null, { index: this.currentHistoryIndex }), yield w(), yield this.hooks.call("enable", void 0, void 0, () => { + const t3 = document.documentElement; + t3.classList.add("swup-enabled"), t3.classList.toggle("swup-native", this.options.native); + }); + }); + } + destroy() { + return __async(this, null, function* () { + this.clickDelegate.destroy(), window.removeEventListener("popstate", this.handlePopState), this.cache.clear(), this.options.plugins.forEach((t2) => this.unuse(t2)), yield this.hooks.call("disable", void 0, void 0, () => { + const t2 = document.documentElement; + t2.classList.remove("swup-enabled"), t2.classList.remove("swup-native"); + }), this.hooks.clear(); + }); + } + shouldIgnoreVisit(t2, { el: e4, event: i5 } = {}) { + const { origin: s5, url: n5, hash: o5 } = l.fromUrl(t2); + return s5 !== window.location.origin || !(!e4 || !this.triggerWillOpenNewWindow(e4)) || !!this.options.ignoreVisit(n5 + o5, { el: e4, event: i5 }); + } + handleLinkClick(t2) { + const e4 = t2.delegateTarget, { href: i5, url: s5, hash: n5 } = l.fromElement(e4); + if (this.shouldIgnoreVisit(i5, { el: e4, event: t2 })) + return; + if (this.navigating && s5 === this.visit.to.url) + return void t2.preventDefault(); + const o5 = this.createVisit({ to: s5, hash: n5, el: e4, event: t2 }); + t2.metaKey || t2.ctrlKey || t2.shiftKey || t2.altKey ? this.hooks.callSync("link:newtab", o5, { href: i5 }) : 0 === t2.button && this.hooks.callSync("link:click", o5, { el: e4, event: t2 }, () => { + var e5; + const i6 = null != (e5 = o5.from.url) ? e5 : ""; + t2.preventDefault(), s5 && s5 !== i6 ? this.isSameResolvedUrl(s5, i6) || this.performNavigation(o5) : n5 ? this.hooks.callSync("link:anchor", o5, { hash: n5 }, () => { + r(s5 + n5), this.scrollToContent(o5); + }) : this.hooks.callSync("link:self", o5, void 0, () => { + "navigate" === this.options.linkToSelf ? this.performNavigation(o5) : (r(s5), this.scrollToContent(o5)); + }); + }); + } + handlePopState(t2) { + var e4, i5, s5, o5; + const r5 = null != (e4 = null == (i5 = t2.state) ? void 0 : i5.url) ? e4 : window.location.href; + if (this.options.skipPopStateHandling(t2)) + return; + if (this.isSameResolvedUrl(n(), this.currentPageUrl)) + return; + const { url: a4, hash: h4 } = l.fromUrl(r5), c4 = this.createVisit({ to: a4, hash: h4, event: t2 }); + c4.history.popstate = true; + const u3 = null != (s5 = null == (o5 = t2.state) ? void 0 : o5.index) ? s5 : 0; + u3 && u3 !== this.currentHistoryIndex && (c4.history.direction = u3 - this.currentHistoryIndex > 0 ? "forwards" : "backwards", this.currentHistoryIndex = u3), c4.animation.animate = false, c4.scroll.reset = false, c4.scroll.target = false, this.options.animateHistoryBrowsing && (c4.animation.animate = true, c4.scroll.reset = true), this.hooks.callSync("history:popstate", c4, { event: t2 }, () => { + this.performNavigation(c4); + }); + } + triggerWillOpenNewWindow(t2) { + return !!t2.matches('[download], [target="_blank"]'); + } + }; + + // node_modules/@swup/plugin/dist/index.modern.js + function r2() { + return r2 = Object.assign ? Object.assign.bind() : function(r5) { + for (var n5 = 1; n5 < arguments.length; n5++) { + var e4 = arguments[n5]; + for (var t2 in e4) + Object.prototype.hasOwnProperty.call(e4, t2) && (r5[t2] = e4[t2]); + } + return r5; + }, r2.apply(this, arguments); + } + var n2 = (r5) => String(r5).split(".").map((r6) => String(parseInt(r6 || "0", 10))).concat(["0", "0"]).slice(0, 3).join("."); + var e = class { + constructor() { + this.isSwupPlugin = true, this.swup = void 0, this.version = void 0, this.requires = {}, this.handlersToUnregister = []; + } + mount() { + } + unmount() { + this.handlersToUnregister.forEach((r5) => r5()), this.handlersToUnregister = []; + } + _beforeMount() { + if (!this.name) + throw new Error("You must define a name of plugin when creating a class."); + } + _afterUnmount() { + } + _checkRequirements() { + return "object" != typeof this.requires || Object.entries(this.requires).forEach(([r5, e4]) => { + if (!function(r6, e5, t2) { + const s5 = function(r7, n5) { + var e6; + if ("swup" === r7) + return null != (e6 = n5.version) ? e6 : ""; + { + var t3; + const e7 = n5.findPlugin(r7); + return null != (t3 = null == e7 ? void 0 : e7.version) ? t3 : ""; + } + }(r6, t2); + return !!s5 && ((r7, e6) => e6.every((e7) => { + const [, t3, s6] = e7.match(/^([\D]+)?(.*)$/) || []; + var o5, i5; + return ((r8, n5) => { + const e8 = { "": (r9) => 0 === r9, ">": (r9) => r9 > 0, ">=": (r9) => r9 >= 0, "<": (r9) => r9 < 0, "<=": (r9) => r9 <= 0 }; + return (e8[n5] || e8[""])(r8); + })((i5 = s6, o5 = n2(o5 = r7), i5 = n2(i5), o5.localeCompare(i5, void 0, { numeric: true })), t3 || ">="); + }))(s5, e5); + }(r5, e4 = Array.isArray(e4) ? e4 : [e4], this.swup)) { + const n5 = `${r5} ${e4.join(", ")}`; + throw new Error(`Plugin version mismatch: ${this.name} requires ${n5}`); + } + }), true; + } + on(r5, n5, e4 = {}) { + var t2; + n5 = !(t2 = n5).name.startsWith("bound ") || t2.hasOwnProperty("prototype") ? n5.bind(this) : n5; + const s5 = this.swup.hooks.on(r5, n5, e4); + return this.handlersToUnregister.push(s5), s5; + } + once(n5, e4, t2 = {}) { + return this.on(n5, e4, r2({}, t2, { once: true })); + } + before(n5, e4, t2 = {}) { + return this.on(n5, e4, r2({}, t2, { before: true })); + } + replace(n5, e4, t2 = {}) { + return this.on(n5, e4, r2({}, t2, { replace: true })); + } + off(r5, n5) { + return this.swup.hooks.off(r5, n5); + } + }; + + // node_modules/@swup/fragment-plugin/dist/index.modern.js + function o2() { + return o2 = Object.assign ? Object.assign.bind() : function(t2) { + for (var r5 = 1; r5 < arguments.length; r5++) { + var e4 = arguments[r5]; + for (var n5 in e4) + Object.prototype.hasOwnProperty.call(e4, n5) && (t2[n5] = e4[n5]); + } + return t2; + }, o2.apply(this, arguments); + } + window.process || (window.process = {}), window.process.env || (window.process.env = {}); + var s2 = ["test"].includes(String("development")); + var i2 = ["development", "test"].includes(String("development")); + var a2 = (t2, r5, e4) => null == t2 ? t2 : `\x1B[${r5}m${String(t2)}\x1B[${e4}m`; + var l2 = (t2) => s2 ? t2 : `\u{1F9E9} ${((t3) => a2(t3, 1, 22))(t2)}`; + var u2 = (t2) => s2 ? t2 : ((t3) => a2(t3, 94, 39))(t2); + var c2 = class { + log(...t2) { + const r5 = t2.shift(); + console.log(l2(r5), ...t2); + } + warn(...t2) { + const r5 = t2.shift(); + console.warn(l2(r5), ...t2); + } + error(...t2) { + const r5 = t2.shift(); + console.error(l2(r5), ...t2); + } + logIf(t2, ...r5) { + t2 && this.log(...r5); + } + warnIf(t2, ...r5) { + t2 && this.warn(...r5); + } + errorIf(t2, ...r5) { + t2 && this.error(...r5); + } + }; + var g2 = (t2) => { + !function({ parsedRules: t3, swup: e4, logger: n5 }) { + const o5 = e4.getCurrentUrl(); + t3.filter((t4) => t4.matchesFrom(o5) || t4.matchesTo(o5)).forEach((t4) => { + t4.containers.forEach((t5) => { + const s5 = y2(`${t5}:not([data-swup-fragment])`, e4); + if (!s5) + return; + const a4 = s5.getAttribute("data-swup-fragment-url"); + a4 && i2 && (null == n5 || n5.log(`fragment url ${u2(a4)} for ${u2(t5)} provided by server`)); + const { url: l4 } = l.fromUrl(a4 || o5); + s5.setAttribute("data-swup-fragment", ""), s5.__swupFragment = { url: l4, selector: t5 }; + }); + }); + }(t2), function({ logger: t3, swup: r5 }) { + const e4 = "data-swup-link-to-fragment"; + document.querySelectorAll(`a[${e4}]`).forEach((n5) => { + var o5; + const s5 = n5.getAttribute(e4); + if (!s5) + return void (i2 && (null == t3 || t3.warn(`[${e4}] needs to contain a valid fragment selector`))); + const a4 = y2(s5, r5); + if (!a4) + return void (i2 && (null == t3 || t3.log(`ignoring ${u2(`[${e4}="${s5}"]`)} as ${u2(s5)} is missing`))); + const l4 = null == (o5 = a4.__swupFragment) ? void 0 : o5.url; + l4 ? m2(l4, r5.getCurrentUrl()) ? i2 && (null == t3 || t3.warn(`The fragment URL of ${s5} is identical to the current URL. This could mean that [data-swup-fragment-url] needs to be provided by the server.`)) : n5.href = l4 : i2 && (null == t3 || t3.warn(`no fragment infos found on ${s5}`)); + }); + }(t2), function({ logger: t3 }) { + document.querySelectorAll("dialog[data-swup-fragment]").forEach((r5) => { + r5.__swupFragment ? r5.__swupFragment.modalShown || (r5.__swupFragment.modalShown = true, r5.removeAttribute("open"), null == r5.showModal || r5.showModal(), r5.addEventListener("keydown", (t4) => "Escape" === t4.key && t4.preventDefault())) : i2 && (null == t3 || t3.warn("fragment properties missing on element:", r5)); + }); + }(t2); + }; + var f2 = (t2, r5) => { + var e4; + const n5 = null == (e4 = t2.__swupFragment) ? void 0 : e4.url; + return !!n5 && m2(n5, r5); + }; + var m2 = (t2, r5) => h2(t2) === h2(r5); + var h2 = (t2) => { + if (!t2.trim()) + return t2; + const e4 = l.fromUrl(t2); + return e4.searchParams.sort(), e4.pathname.replace(/\/+$/g, "") + e4.search; + }; + var p2 = (t2) => { + const r5 = t2.from.url, e4 = t2.to.url; + if (r5 && e4) + return { from: r5, to: e4 }; + }; + var d2 = (t2, r5) => { + if (null == t2 || !t2.name) + return; + const { name: e4, containers: n5 } = t2; + n5.forEach((t3) => { + var n6; + null == (n6 = document.querySelector(t3)) || n6.classList.toggle(`to-${e4}`, r5); + }); + }; + var w2 = (t2, r5) => r5.find((r6) => r6.matches(t2)); + function v(t2) { + return !!t2 && t2.containers.every((t3) => { + var r5; + return "template" === (null == (r5 = document.querySelector(t3)) || null == (r5 = r5.tagName) ? void 0 : r5.toLowerCase()); + }); + } + function y2(t2, r5) { + for (const e4 of r5.options.containers) { + const r6 = document.querySelector(e4); + if (null != r6 && r6.matches(t2)) + return r6; + const n5 = null == r6 ? void 0 : r6.querySelector(t2); + if (n5) + return n5; + } + } + function $2(t2) { + if (!Array.isArray(t2)) + throw new Error("cloneRules() expects an array of rules"); + return t2.map((t3) => o2({}, t3, { from: Array.isArray(t3.from) ? [...t3.from] : t3.from, to: Array.isArray(t3.to) ? [...t3.to] : t3.to, containers: [...t3.containers] })); + } + var S2 = class { + constructor(t2) { + var r5, o5; + this.matchesFrom = void 0, this.matchesTo = void 0, this.swup = void 0, this.from = void 0, this.to = void 0, this.containers = void 0, this.name = void 0, this.scroll = false, this.focus = void 0, this.logger = void 0, this.swup = t2.swup, this.logger = t2.logger, this.from = t2.from || "", this.to = t2.to || "", t2.name && (this.name = s(t2.name)), void 0 !== t2.scroll && (this.scroll = t2.scroll), void 0 !== t2.focus && (this.focus = t2.focus), this.containers = this.parseContainers(t2.containers), i2 && (null == (r5 = this.logger) || r5.errorIf(!this.to, "Every fragment rule must contain a 'to' path", this), null == (o5 = this.logger) || o5.errorIf(!this.from, "Every fragment rule must contain a 'from' path", this)), this.matchesFrom = h(this.from), this.matchesTo = h(this.to); + } + parseContainers(t2) { + var r5, e4; + return Array.isArray(t2) && t2.length ? (e4 = t2.map((t3) => t3.trim()), [...new Set(e4)]).filter((t3) => { + var r6; + const e5 = this.validateSelector(t3); + return null == (r6 = this.logger) || r6.errorIf(e5 instanceof Error, e5), true === e5; + }) : (i2 && (null == (r5 = this.logger) || r5.error("Every fragment rule must contain an array of containers", this.getDebugInfo())), []); + } + validateSelector(t2) { + return t2.startsWith("#") ? !t2.match(/\s|>/) || new Error(`fragment selectors must not be nested: ${t2}`) : new Error(`fragment selectors must be IDs: ${t2}`); + } + getDebugInfo() { + const { from: t2, to: r5, containers: e4 } = this; + return { from: String(t2), to: String(r5), containers: String(e4) }; + } + matches(t2) { + const { url: e4 } = l.fromUrl(t2.from), { url: n5 } = l.fromUrl(t2.to); + if (!this.matchesFrom(e4) || !this.matchesTo(n5)) + return false; + for (const t3 of this.containers) { + const r5 = this.validateFragmentSelectorForMatch(t3); + var o5; + if (r5 instanceof Error) + return i2 && (null == (o5 = this.logger) || o5.error(r5, this.getDebugInfo())), false; + } + return true; + } + validateFragmentSelectorForMatch(t2) { + return document.querySelector(t2) ? !!y2(t2, this.swup) || new Error(`skipping rule since ${u2(t2)} is outside of swup's default containers`) : new Error(`skipping rule since ${u2(t2)} doesn't exist in the current document`); + } + }; + var _2 = function(t2) { + const r5 = p2(t2); + r5 && w2(r5, this.parsedRules) && (t2.scroll.reset = false); + }; + var b2 = function(t2) { + return __async(this, null, function* () { + const r5 = p2(t2); + if (!r5) + return; + const e4 = this.getFragmentVisit(r5); + if (!e4) + return; + var n5; + t2.fragmentVisit = e4, i2 && (null == (n5 = this.logger) || n5.log(`fragment visit: ${u2(t2.fragmentVisit.containers.join(", "))}`)), t2.scroll = function(t3, r6) { + return "boolean" == typeof t3.scroll ? o2({}, r6, { reset: t3.scroll }) : "string" != typeof t3.scroll || r6.target ? r6 : o2({}, r6, { target: t3.scroll }); + }(e4, t2.scroll); + const s5 = t2.a11y; + var a4; + void 0 !== e4.focus && (i2 && (null == (a4 = this.logger) || a4.errorIf(!s5, "Can't set visit.a11y.focus. Is @swup/a11y-plugin installed?")), s5 && (s5.focus = e4.focus)), t2.animation.scope = t2.fragmentVisit.containers, t2.containers = t2.fragmentVisit.containers, t2.animation.selector = t2.fragmentVisit.containers.join(","), d2(e4, true); + }); + }; + var R2 = function(t2, r5) { + var e4, n5; + t2.fragmentVisit && v(t2.fragmentVisit) && (i2 && (null == (e4 = this.logger) || e4.log(`${u2("out")}-animation skipped for ${u2(null == (n5 = t2.fragmentVisit) ? void 0 : n5.containers.toString())}`)), r5.skip = true); + }; + var E2 = function(t2, r5) { + var e4, n5; + t2.fragmentVisit && v(t2.fragmentVisit) && (i2 && (null == (e4 = this.logger) || e4.log(`${u2("in")}-animation skipped for ${u2(null == (n5 = t2.fragmentVisit) ? void 0 : n5.containers.toString())}`)), r5.skip = true); + }; + var F = function(t2, r5) { + var e4; + if (t2.trigger.el || !t2.to.url) + return; + const n5 = this.swup.cache.get(t2.to.url); + n5 && n5.fragmentHtml && (r5.page.html = n5.fragmentHtml, i2 && (null == (e4 = this.logger) || e4.log(`fragment cache used for ${u2(t2.to.url)}`))); + }; + var A2 = function(t2) { + d2(t2.fragmentVisit, true), g2(this), (({ swup: t3, logger: r5 }) => { + const e4 = t3.getCurrentUrl(), n5 = t3.cache, s5 = n5.get(e4); + if (!s5) + return; + const a4 = new DOMParser().parseFromString(s5.html, "text/html"), l4 = [], c4 = Array.from(document.querySelectorAll("[data-swup-fragment]")).filter((t4) => !t4.matches("template") && !f2(t4, e4)); + c4.length && (t3.options.cache ? (c4.forEach((t4) => { + var e5, o5; + if (null != t4.querySelector("[data-swup-fragment]")) + return; + const s6 = null == (e5 = t4.__swupFragment) ? void 0 : e5.url; + if (!s6) + return void (i2 && (null == r5 || r5.warn("no fragment url found:", t4))); + const u3 = null == (o5 = t4.__swupFragment) ? void 0 : o5.selector; + if (!u3) + return void (i2 && (null == r5 || r5.warn("no fragment selector found:", t4))); + const c5 = n5.get(s6); + if (!c5) + return; + const g3 = a4.querySelector(u3); + if (!g3) + return; + const f3 = new DOMParser().parseFromString(c5.html, "text/html").querySelector(u3); + f3 && (f3.setAttribute("data-swup-fragment-url", s6), g3.replaceWith(f3), l4.push(t4)); + }), l4.length && (n5.update(e4, o2({}, s5, { fragmentHtml: a4.documentElement.outerHTML })), l4.forEach((t4) => { + var e5, n6; + const o5 = (null == (e5 = t4.__swupFragment) ? void 0 : e5.url) || "", s6 = (null == (n6 = t4.__swupFragment) ? void 0 : n6.selector) || ""; + i2 && (null == r5 || r5.log(`updated cache with ${u2(s6)} from ${u2(o5)}`)); + }))) : i2 && (null == r5 || r5.warn("can't cache foreign fragment elements without swup's cache"))); + })(this); + }; + var V2 = function(t2) { + d2(t2.fragmentVisit, false); + }; + var q2 = class extends e { + get parsedRules() { + return this._parsedRules; + } + constructor(t2) { + super(), this.name = "SwupFragmentPlugin", this.requires = { swup: ">=4" }, this._rawRules = [], this._parsedRules = [], this.options = void 0, this.defaults = { rules: [], debug: false }, this.logger = void 0, this.options = o2({}, this.defaults, t2); + } + mount() { + const t2 = this.swup; + var r5; + this.setRules(this.options.rules), i2 && this.options.debug && (this.logger = new c2()), this.before("link:self", _2), this.on("visit:start", b2), this.before("animation:out:await", R2), this.before("animation:in:await", E2), this.before("content:replace", F), this.on("content:replace", A2), this.on("visit:end", V2), i2 && (null == (r5 = this.logger) || r5.warnIf(!t2.options.cache, "fragment caching will only work with swup's cache being active")), g2(this); + } + unmount() { + super.unmount(), document.querySelectorAll("[data-swup-fragment]").forEach((t2) => { + t2.removeAttribute("data-swup-fragment-url"), delete t2.__swupFragment; + }); + } + setRules(t2) { + var r5; + this._rawRules = $2(t2), this._parsedRules = t2.map((t3) => this.parseRule(t3)), i2 && (null == (r5 = this.logger) || r5.log("Updated fragment rules", this.getRules())); + } + getRules() { + return $2(this._rawRules); + } + prependRule(t2) { + this.setRules([t2, ...this.getRules()]); + } + appendRule(t2) { + this.setRules([...this.getRules(), t2]); + } + parseRule({ from: t2, to: r5, containers: e4, name: n5, scroll: o5, focus: s5 }) { + return new S2({ from: t2, to: r5, containers: e4, name: n5, scroll: o5, focus: s5, logger: this.logger, swup: this.swup }); + } + getFragmentVisit(t2) { + const r5 = w2(t2, this.parsedRules); + if (!r5) + return; + const e4 = ((t3, r6, e5, n6) => { + const o6 = m2(t3.from, t3.to); + return r6.filter((r7) => { + const s6 = document.querySelector(r7); + return s6 ? y2(r7, e5) ? !(!o6 && f2(s6, t3.to) && (i2 && (null == n6 || n6.log(`ignoring fragment ${u2(r7)} as it already matches the current URL`)), 1)) : (i2 && (null == n6 || n6.error(`${u2(r7)} is outside of swup's default containers`)), false) : (i2 && (null == n6 || n6.log(`${u2(r7)} missing in current document`)), false); + }); + })(t2, r5.containers, this.swup, this.logger); + if (!e4.length) + return; + const { name: n5, scroll: o5, focus: s5 } = r5; + return { containers: e4, name: n5, scroll: o5, focus: s5 }; + } + }; + + // assets/scripts/modules/Load.js + var Load_default = class extends _default { + constructor(m3) { + super(m3); + } + init() { + const load = new _({ + containers: ["[data-load-container]"], + // cache: false, + plugins: [ + new q2({ + rules: [ + { + from: ["/", "/index.php", "/index.php/per_page/:per_page/page/:page"], + to: ["/", "/index.php", "/index.php/per_page/:per_page/page/:page"], + containers: ["#paginated"] + }, + { + from: ["/", "/index.php", "/index.php/per_page/:per_page/page/:page"], + to: ["/index.php/modal/:modal"], + containers: ["#modal"], + name: "open-modal" + }, + { + from: ["/index.php/modal/:modal"], + to: ["/index.php/modal/:modal"], + containers: ["#modal"], + name: "modal-update" + }, + { + from: ["/index.php/modal/:modal"], + to: ["/", "/index.php", "/index.php/per_page/:per_page/page/:page"], + containers: ["#modal", "#paginated"], + name: "close-modal" + } + ] + }) + ] + }); + load.hooks.before("content:replace", (visit) => __async(this, null, function* () { + console.log("before content replace:", visit); + for (let container of visit.containers) { + const oldContainer = this.el.querySelector(container); + console.log("old container: ", oldContainer); + this.call("destroy", oldContainer, "app"); + } + })); + load.hooks.on("content:replace", (visit) => { + console.log("On content replace:", visit); + if (visit.fragmentVisit) { + if (visit.fragmentVisit.name == "open-modal") { + this.call("populate", document.getElementById("modal"), "Dialog"); + this.call("show", null, "Dialog"); + } else if (visit.fragmentVisit.name == "close-modal") { + this.call("close", null, "Dialog"); + } + } + for (let container of visit.containers) { + const newContainer = this.el.querySelector(container); + console.log("new container: ", newContainer); + newContainer.classList.add("transition-fade"); + this.call("update", newContainer, "app"); + } + }); + console.log(this, load); + } + }; + + // assets/scripts/config.js + var NODE_ENV = "development"; + var IS_MOBILE = window.matchMedia("(any-pointer:coarse)").matches; + var ENV = Object.freeze({ + // Node environment + NAME: NODE_ENV, + IS_PROD: NODE_ENV === "production", + IS_DEV: NODE_ENV === "development", + // Device + IS_MOBILE, + IS_DESKTOP: !IS_MOBILE + }); + var CSS_CLASS = Object.freeze({ + LOADING: "is-loading", + LOADED: "is-loaded", + READY: "is-ready", + FONTS_LOADED: "fonts-loaded", + LAZY_CONTAINER: "c-lazy", + LAZY_LOADED: "-lazy-loaded" + // ... + }); + var CUSTOM_EVENT = Object.freeze({ + RESIZE_END: "loco.resizeEnd" + // ... + }); + var FONT = Object.freeze({ + EAGER: [ + { family: "Source Sans", style: "normal", weight: 400 }, + { family: "Source Sans", style: "normal", weight: 700 } + ] + }); + + // assets/scripts/utils/image.js + var getImageMetadata = ($img) => ({ + url: $img.src, + width: $img.naturalWidth, + height: $img.naturalHeight, + ratio: $img.naturalWidth / $img.naturalHeight + }); + var loadImage = (url, options = {}) => { + return new Promise((resolve, reject) => { + const $img = new Image(); + if (options.crossOrigin) { + $img.crossOrigin = options.crossOrigin; + } + const loadCallback = () => { + resolve(__spreadValues({ + element: $img + }, getImageMetadata($img))); + }; + if ($img.decode) { + $img.src = url; + $img.decode().then(loadCallback).catch((e4) => { + reject(e4); + }); + } else { + $img.onload = loadCallback; + $img.onerror = (e4) => { + reject(e4); + }; + $img.src = url; + } + }); + }; + var LAZY_LOADED_IMAGES = []; + var lazyLoadImage = ($el, url, callback) => __async(void 0, null, function* () { + let src = url ? url : $el.dataset.src; + let loadedImage = LAZY_LOADED_IMAGES.find((image) => image.url === src); + if (!loadedImage) { + loadedImage = yield loadImage(src); + if (!loadedImage.url) { + return; + } + LAZY_LOADED_IMAGES.push(loadedImage); + } + if ($el.src === src) { + return; + } + if ($el.tagName === "IMG") { + $el.src = loadedImage.url; + } else { + $el.style.backgroundImage = `url(${loadedImage.url})`; + } + requestAnimationFrame(() => { + let lazyParent = $el.closest(`.${CSS_CLASS.LAZY_CONTAINER}`); + if (lazyParent) { + lazyParent.classList.add(CSS_CLASS.LAZY_LOADED); + lazyParent.style.backgroundImage = ""; + } + $el.classList.add(CSS_CLASS.LAZY_LOADED); + callback == null ? void 0 : callback(); + }); + }); + + // node_modules/@studio-freight/lenis/dist/lenis.modern.mjs + function t() { + return t = Object.assign ? Object.assign.bind() : function(t2) { + for (var i5 = 1; i5 < arguments.length; i5++) { + var e4 = arguments[i5]; + for (var s5 in e4) + Object.prototype.hasOwnProperty.call(e4, s5) && (t2[s5] = e4[s5]); + } + return t2; + }, t.apply(this, arguments); + } + function i3(t2, i5, e4) { + return Math.max(t2, Math.min(i5, e4)); + } + var e2 = class { + advance(t2) { + var e4; + if (!this.isRunning) + return; + let s5 = false; + if (this.lerp) + this.value = (o5 = this.value, n5 = this.to, (1 - (r5 = 1 - Math.exp(-60 * this.lerp * t2))) * o5 + r5 * n5), Math.round(this.value) === this.to && (this.value = this.to, s5 = true); + else { + this.currentTime += t2; + const e5 = i3(0, this.currentTime / this.duration, 1); + s5 = e5 >= 1; + const o6 = s5 ? 1 : this.easing(e5); + this.value = this.from + (this.to - this.from) * o6; + } + var o5, n5, r5; + null == (e4 = this.onUpdate) || e4.call(this, this.value, s5), s5 && this.stop(); + } + stop() { + this.isRunning = false; + } + fromTo(t2, i5, { lerp: e4 = 0.1, duration: s5 = 1, easing: o5 = (t3) => t3, onStart: n5, onUpdate: r5 }) { + this.from = this.value = t2, this.to = i5, this.lerp = e4, this.duration = s5, this.easing = o5, this.currentTime = 0, this.isRunning = true, null == n5 || n5(), this.onUpdate = r5; + } + }; + var s3 = class { + constructor({ wrapper: t2, content: i5, autoResize: e4 = true } = {}) { + if (this.resize = () => { + this.onWrapperResize(), this.onContentResize(); + }, this.onWrapperResize = () => { + this.wrapper === window ? (this.width = window.innerWidth, this.height = window.innerHeight) : (this.width = this.wrapper.clientWidth, this.height = this.wrapper.clientHeight); + }, this.onContentResize = () => { + this.scrollHeight = this.content.scrollHeight, this.scrollWidth = this.content.scrollWidth; + }, this.wrapper = t2, this.content = i5, e4) { + const t3 = function(t4, i6) { + let e5; + return function() { + let i7 = arguments, s5 = this; + clearTimeout(e5), e5 = setTimeout(function() { + t4.apply(s5, i7); + }, 250); + }; + }(this.resize); + this.wrapper !== window && (this.wrapperResizeObserver = new ResizeObserver(t3), this.wrapperResizeObserver.observe(this.wrapper)), this.contentResizeObserver = new ResizeObserver(t3), this.contentResizeObserver.observe(this.content); + } + this.resize(); + } + destroy() { + var t2, i5; + null == (t2 = this.wrapperResizeObserver) || t2.disconnect(), null == (i5 = this.contentResizeObserver) || i5.disconnect(); + } + get limit() { + return { x: this.scrollWidth - this.width, y: this.scrollHeight - this.height }; + } + }; + var o3 = class { + constructor() { + this.events = {}; + } + emit(t2, ...i5) { + let e4 = this.events[t2] || []; + for (let t3 = 0, s5 = e4.length; t3 < s5; t3++) + e4[t3](...i5); + } + on(t2, i5) { + var e4; + return (null == (e4 = this.events[t2]) ? void 0 : e4.push(i5)) || (this.events[t2] = [i5]), () => { + var e5; + this.events[t2] = null == (e5 = this.events[t2]) ? void 0 : e5.filter((t3) => i5 !== t3); + }; + } + off(t2, i5) { + var e4; + this.events[t2] = null == (e4 = this.events[t2]) ? void 0 : e4.filter((t3) => i5 !== t3); + } + destroy() { + this.events = {}; + } + }; + var n3 = class { + constructor(t2, { wheelMultiplier: e4 = 1, touchMultiplier: s5 = 2, normalizeWheel: n5 = false }) { + this.onTouchStart = (t3) => { + const { clientX: i5, clientY: e5 } = t3.targetTouches ? t3.targetTouches[0] : t3; + this.touchStart.x = i5, this.touchStart.y = e5, this.lastDelta = { x: 0, y: 0 }; + }, this.onTouchMove = (t3) => { + const { clientX: i5, clientY: e5 } = t3.targetTouches ? t3.targetTouches[0] : t3, s6 = -(i5 - this.touchStart.x) * this.touchMultiplier, o5 = -(e5 - this.touchStart.y) * this.touchMultiplier; + this.touchStart.x = i5, this.touchStart.y = e5, this.lastDelta = { x: s6, y: o5 }, this.emitter.emit("scroll", { deltaX: s6, deltaY: o5, event: t3 }); + }, this.onTouchEnd = (t3) => { + this.emitter.emit("scroll", { deltaX: this.lastDelta.x, deltaY: this.lastDelta.y, event: t3 }); + }, this.onWheel = (t3) => { + let { deltaX: e5, deltaY: s6 } = t3; + this.normalizeWheel && (e5 = i3(-100, e5, 100), s6 = i3(-100, s6, 100)), e5 *= this.wheelMultiplier, s6 *= this.wheelMultiplier, this.emitter.emit("scroll", { deltaX: e5, deltaY: s6, event: t3 }); + }, this.element = t2, this.wheelMultiplier = e4, this.touchMultiplier = s5, this.normalizeWheel = n5, this.touchStart = { x: null, y: null }, this.emitter = new o3(), this.element.addEventListener("wheel", this.onWheel, { passive: false }), this.element.addEventListener("touchstart", this.onTouchStart, { passive: false }), this.element.addEventListener("touchmove", this.onTouchMove, { passive: false }), this.element.addEventListener("touchend", this.onTouchEnd, { passive: false }); + } + on(t2, i5) { + return this.emitter.on(t2, i5); + } + destroy() { + this.emitter.destroy(), this.element.removeEventListener("wheel", this.onWheel, { passive: false }), this.element.removeEventListener("touchstart", this.onTouchStart, { passive: false }), this.element.removeEventListener("touchmove", this.onTouchMove, { passive: false }), this.element.removeEventListener("touchend", this.onTouchEnd, { passive: false }); + } + }; + var r3 = class { + constructor({ wrapper: i5 = window, content: r5 = document.documentElement, wheelEventsTarget: l4 = i5, eventsTarget: h4 = l4, smoothWheel: a4 = true, smoothTouch: c4 = false, syncTouch: u3 = false, syncTouchLerp: p3 = 0.1, __iosNoInertiaSyncTouchLerp: d3 = 0.4, touchInertiaMultiplier: m3 = 35, duration: g3, easing: v2 = (t2) => Math.min(1, 1.001 - Math.pow(2, -10 * t2)), lerp: S3 = !g3 && 0.1, infinite: w3 = false, orientation: f3 = "vertical", gestureOrientation: y3 = "vertical", touchMultiplier: T2 = 1, wheelMultiplier: z = 1, normalizeWheel: M2 = false, autoResize: L2 = true } = {}) { + this.onVirtualScroll = ({ deltaX: i6, deltaY: e4, event: s5 }) => { + if (s5.ctrlKey) + return; + const o5 = s5.type.includes("touch"), n5 = s5.type.includes("wheel"); + if ("both" === this.options.gestureOrientation && 0 === i6 && 0 === e4 || "vertical" === this.options.gestureOrientation && 0 === e4 || "horizontal" === this.options.gestureOrientation && 0 === i6 || o5 && "vertical" === this.options.gestureOrientation && 0 === this.scroll && !this.options.infinite && e4 <= 0) + return; + let r6 = s5.composedPath(); + if (r6 = r6.slice(0, r6.indexOf(this.rootElement)), r6.find((t2) => { + var i7; + return (null == t2.hasAttribute ? void 0 : t2.hasAttribute("data-lenis-prevent")) || o5 && (null == t2.hasAttribute ? void 0 : t2.hasAttribute("data-lenis-prevent-touch")) || n5 && (null == t2.hasAttribute ? void 0 : t2.hasAttribute("data-lenis-prevent-wheel")) || (null == (i7 = t2.classList) ? void 0 : i7.contains("lenis")); + })) + return; + if (this.isStopped || this.isLocked) + return void s5.preventDefault(); + if (this.isSmooth = (this.options.smoothTouch || this.options.syncTouch) && o5 || this.options.smoothWheel && n5, !this.isSmooth) + return this.isScrolling = false, void this.animate.stop(); + s5.preventDefault(); + let l5 = e4; + "both" === this.options.gestureOrientation ? l5 = Math.abs(e4) > Math.abs(i6) ? e4 : i6 : "horizontal" === this.options.gestureOrientation && (l5 = i6); + const h5 = o5 && this.options.syncTouch, a5 = o5 && "touchend" === s5.type && Math.abs(l5) > 1; + a5 && (l5 = this.velocity * this.options.touchInertiaMultiplier), this.scrollTo(this.targetScroll + l5, t({ programmatic: false }, h5 && { lerp: a5 ? this.syncTouchLerp : this.options.__iosNoInertiaSyncTouchLerp })); + }, this.onScroll = () => { + if (!this.isScrolling) { + const t2 = this.animatedScroll; + this.animatedScroll = this.targetScroll = this.actualScroll, this.velocity = 0, this.direction = Math.sign(this.animatedScroll - t2), this.emit(); + } + }, window.lenisVersion = "1.0.27", i5 !== document.documentElement && i5 !== document.body || (i5 = window), this.options = { wrapper: i5, content: r5, wheelEventsTarget: l4, eventsTarget: h4, smoothWheel: a4, smoothTouch: c4, syncTouch: u3, syncTouchLerp: p3, __iosNoInertiaSyncTouchLerp: d3, touchInertiaMultiplier: m3, duration: g3, easing: v2, lerp: S3, infinite: w3, gestureOrientation: y3, orientation: f3, touchMultiplier: T2, wheelMultiplier: z, normalizeWheel: M2, autoResize: L2 }, this.animate = new e2(), this.emitter = new o3(), this.dimensions = new s3({ wrapper: i5, content: r5, autoResize: L2 }), this.toggleClass("lenis", true), this.velocity = 0, this.isLocked = false, this.isStopped = false, this.isSmooth = u3 || a4 || c4, this.isScrolling = false, this.targetScroll = this.animatedScroll = this.actualScroll, this.options.wrapper.addEventListener("scroll", this.onScroll, { passive: false }), this.virtualScroll = new n3(h4, { touchMultiplier: T2, wheelMultiplier: z, normalizeWheel: M2 }), this.virtualScroll.on("scroll", this.onVirtualScroll); + } + destroy() { + this.emitter.destroy(), this.options.wrapper.removeEventListener("scroll", this.onScroll, { passive: false }), this.virtualScroll.destroy(), this.dimensions.destroy(), this.toggleClass("lenis", false), this.toggleClass("lenis-smooth", false), this.toggleClass("lenis-scrolling", false), this.toggleClass("lenis-stopped", false), this.toggleClass("lenis-locked", false); + } + on(t2, i5) { + return this.emitter.on(t2, i5); + } + off(t2, i5) { + return this.emitter.off(t2, i5); + } + setScroll(t2) { + this.isHorizontal ? this.rootElement.scrollLeft = t2 : this.rootElement.scrollTop = t2; + } + resize() { + this.dimensions.resize(); + } + emit() { + this.emitter.emit("scroll", this); + } + reset() { + this.isLocked = false, this.isScrolling = false, this.velocity = 0, this.animate.stop(); + } + start() { + this.isStopped = false, this.reset(); + } + stop() { + this.isStopped = true, this.animate.stop(), this.reset(); + } + raf(t2) { + const i5 = t2 - (this.time || t2); + this.time = t2, this.animate.advance(1e-3 * i5); + } + scrollTo(t2, { offset: e4 = 0, immediate: s5 = false, lock: o5 = false, duration: n5 = this.options.duration, easing: r5 = this.options.easing, lerp: l4 = !n5 && this.options.lerp, onComplete: h4 = null, force: a4 = false, programmatic: c4 = true } = {}) { + if (!this.isStopped && !this.isLocked || a4) { + if (["top", "left", "start"].includes(t2)) + t2 = 0; + else if (["bottom", "right", "end"].includes(t2)) + t2 = this.limit; + else { + var u3; + let i5; + if ("string" == typeof t2 ? i5 = document.querySelector(t2) : null != (u3 = t2) && u3.nodeType && (i5 = t2), i5) { + if (this.options.wrapper !== window) { + const t3 = this.options.wrapper.getBoundingClientRect(); + e4 -= this.isHorizontal ? t3.left : t3.top; + } + const s6 = i5.getBoundingClientRect(); + t2 = (this.isHorizontal ? s6.left : s6.top) + this.animatedScroll; + } + } + if ("number" == typeof t2) { + if (t2 += e4, t2 = Math.round(t2), this.options.infinite ? c4 && (this.targetScroll = this.animatedScroll = this.scroll) : t2 = i3(0, t2, this.limit), s5) + return this.animatedScroll = this.targetScroll = t2, this.setScroll(this.scroll), this.reset(), void (null == h4 || h4(this)); + if (!c4) { + if (t2 === this.targetScroll) + return; + this.targetScroll = t2; + } + this.animate.fromTo(this.animatedScroll, t2, { duration: n5, easing: r5, lerp: l4, onStart: () => { + o5 && (this.isLocked = true), this.isScrolling = true; + }, onUpdate: (t3, i5) => { + this.isScrolling = true, this.velocity = t3 - this.animatedScroll, this.direction = Math.sign(this.velocity), this.animatedScroll = t3, this.setScroll(this.scroll), c4 && (this.targetScroll = t3), i5 || this.emit(), i5 && requestAnimationFrame(() => { + this.reset(), this.emit(), null == h4 || h4(this); + }); + } }); + } + } + } + get rootElement() { + return this.options.wrapper === window ? this.options.content : this.options.wrapper; + } + get limit() { + return this.dimensions.limit[this.isHorizontal ? "x" : "y"]; + } + get isHorizontal() { + return "horizontal" === this.options.orientation; + } + get actualScroll() { + return this.isHorizontal ? this.rootElement.scrollLeft : this.rootElement.scrollTop; + } + get scroll() { + return this.options.infinite ? (this.animatedScroll % (t2 = this.limit) + t2) % t2 : this.animatedScroll; + var t2; + } + get progress() { + return 0 === this.limit ? 1 : this.scroll / this.limit; + } + get isSmooth() { + return this.__isSmooth; + } + set isSmooth(t2) { + this.__isSmooth !== t2 && (this.__isSmooth = t2, this.toggleClass("lenis-smooth", t2)); + } + get isScrolling() { + return this.__isScrolling; + } + set isScrolling(t2) { + this.__isScrolling !== t2 && (this.__isScrolling = t2, this.toggleClass("lenis-scrolling", t2)); + } + get isStopped() { + return this.__isStopped; + } + set isStopped(t2) { + this.__isStopped !== t2 && (this.__isStopped = t2, this.toggleClass("lenis-stopped", t2)); + } + get isLocked() { + return this.__isLocked; + } + set isLocked(t2) { + this.__isLocked !== t2 && (this.__isLocked = t2, this.toggleClass("lenis-locked", t2)); + } + get className() { + let t2 = "lenis"; + return this.isStopped && (t2 += " lenis-stopped"), this.isLocked && (t2 += " lenis-locked"), this.isScrolling && (t2 += " lenis-scrolling"), this.isSmooth && (t2 += " lenis-smooth"), t2; + } + toggleClass(t2, i5) { + this.rootElement.classList.toggle(t2, i5), this.emitter.emit("className change", this); + } + }; + + // node_modules/locomotive-scroll/dist/locomotive-scroll.modern.mjs + function s4() { + return s4 = Object.assign ? Object.assign.bind() : function(t2) { + for (var s5 = 1; s5 < arguments.length; s5++) { + var e4 = arguments[s5]; + for (var i5 in e4) + Object.prototype.hasOwnProperty.call(e4, i5) && (t2[i5] = e4[i5]); + } + return t2; + }, s4.apply(this, arguments); + } + var e3 = class { + constructor({ scrollElements: t2, rootMargin: s5 = "-1px -1px -1px -1px", IORaf: e4 }) { + this.scrollElements = void 0, this.rootMargin = void 0, this.IORaf = void 0, this.observer = void 0, this.scrollElements = t2, this.rootMargin = s5, this.IORaf = e4, this._init(); + } + _init() { + this.observer = new IntersectionObserver((t2) => { + t2.forEach((t3) => { + const s5 = this.scrollElements.find((s6) => s6.$el === t3.target); + t3.isIntersecting ? (s5 && (s5.isAlreadyIntersected = true), this._setInview(t3)) : s5 && s5.isAlreadyIntersected && this._setOutOfView(t3); + }); + }, { rootMargin: this.rootMargin }); + for (const t2 of this.scrollElements) + this.observe(t2.$el); + } + destroy() { + this.observer.disconnect(); + } + observe(t2) { + t2 && this.observer.observe(t2); + } + unobserve(t2) { + t2 && this.observer.unobserve(t2); + } + _setInview(t2) { + const s5 = this.scrollElements.find((s6) => s6.$el === t2.target); + this.IORaf && (null == s5 || s5.setInteractivityOn()), !this.IORaf && (null == s5 || s5.setInview()); + } + _setOutOfView(t2) { + const s5 = this.scrollElements.find((s6) => s6.$el === t2.target); + this.IORaf && (null == s5 || s5.setInteractivityOff()), !this.IORaf && (null == s5 || s5.setOutOfView()), null != s5 && s5.attributes.scrollRepeat || this.IORaf || this.unobserve(t2.target); + } + }; + function i4(t2, s5, e4, i5, r5) { + return e4 + ((r5 - t2) / (s5 - t2) * (i5 - e4) || 0); + } + function r4(t2, s5) { + return t2.reduce((t3, e4) => Math.abs(e4 - s5) < Math.abs(t3 - s5) ? e4 : t3); + } + var l3 = class { + constructor({ $el: t2, id: s5, modularInstance: e4, subscribeElementUpdateFn: i5, unsubscribeElementUpdateFn: r5, needRaf: l4, scrollOrientation: n5 }) { + var o5, a4, c4, h4, d3; + this.$el = void 0, this.id = void 0, this.needRaf = void 0, this.attributes = void 0, this.scrollOrientation = void 0, this.isAlreadyIntersected = void 0, this.intersection = void 0, this.metrics = void 0, this.currentScroll = void 0, this.translateValue = void 0, this.progress = void 0, this.lastProgress = void 0, this.modularInstance = void 0, this.progressModularModules = void 0, this.isInview = void 0, this.isInteractive = void 0, this.isInFold = void 0, this.isFirstResize = void 0, this.subscribeElementUpdateFn = void 0, this.unsubscribeElementUpdateFn = void 0, this.$el = t2, this.id = s5, this.needRaf = l4, this.scrollOrientation = n5, this.modularInstance = e4, this.subscribeElementUpdateFn = i5, this.unsubscribeElementUpdateFn = r5, this.attributes = { scrollClass: null != (o5 = this.$el.dataset.scrollClass) ? o5 : "is-inview", scrollOffset: null != (a4 = this.$el.dataset.scrollOffset) ? a4 : "0,0", scrollPosition: null != (c4 = this.$el.dataset.scrollPosition) ? c4 : "start,end", scrollModuleProgress: null != this.$el.dataset.scrollModuleProgress, scrollCssProgress: null != this.$el.dataset.scrollCssProgress, scrollEventProgress: null != (h4 = this.$el.dataset.scrollEventProgress) ? h4 : null, scrollSpeed: null != this.$el.dataset.scrollSpeed ? parseFloat(this.$el.dataset.scrollSpeed) : null, scrollRepeat: null != this.$el.dataset.scrollRepeat, scrollCall: null != (d3 = this.$el.dataset.scrollCall) ? d3 : null, scrollCallSelf: null != this.$el.dataset.scrollCallSelf, scrollIgnoreFold: null != this.$el.dataset.scrollIgnoreFold, scrollEnableTouchSpeed: null != this.$el.dataset.scrollEnableTouchSpeed }, this.intersection = { start: 0, end: 0 }, this.metrics = { offsetStart: 0, offsetEnd: 0, bcr: {} }, this.currentScroll = "vertical" === this.scrollOrientation ? window.scrollY : window.scrollX, this.translateValue = 0, this.progress = 0, this.lastProgress = null, this.progressModularModules = [], this.isInview = false, this.isInteractive = false, this.isAlreadyIntersected = false, this.isInFold = false, this.isFirstResize = true, this._init(); + } + _init() { + this.needRaf && (this.modularInstance && this.attributes.scrollModuleProgress && this._getProgressModularModules(), this._resize()); + } + onResize({ currentScroll: t2 }) { + this.currentScroll = t2, this._resize(); + } + onRender({ currentScroll: t2, smooth: s5 }) { + const e4 = "vertical" === this.scrollOrientation ? window.innerHeight : window.innerWidth; + if (this.currentScroll = t2, this._computeProgress(), this.attributes.scrollSpeed && !isNaN(this.attributes.scrollSpeed)) + if (this.attributes.scrollEnableTouchSpeed || s5) { + if (this.isInFold) { + const t3 = Math.max(0, this.progress); + this.translateValue = t3 * e4 * this.attributes.scrollSpeed * -1; + } else { + const t3 = i4(0, 1, -1, 1, this.progress); + this.translateValue = t3 * e4 * this.attributes.scrollSpeed * -1; + } + this.$el.style.transform = "vertical" === this.scrollOrientation ? `translate3d(0, ${this.translateValue}px, 0)` : `translate3d(${this.translateValue}px, 0, 0)`; + } else + this.translateValue && (this.$el.style.transform = "translate3d(0, 0, 0)"), this.translateValue = 0; + } + setInview() { + if (this.isInview) + return; + this.isInview = true, this.$el.classList.add(this.attributes.scrollClass); + const t2 = this._getScrollCallFrom(); + this.attributes.scrollCall && this._dispatchCall("enter", t2); + } + setOutOfView() { + if (!this.isInview || !this.attributes.scrollRepeat) + return; + this.isInview = false, this.$el.classList.remove(this.attributes.scrollClass); + const t2 = this._getScrollCallFrom(); + this.attributes.scrollCall && this._dispatchCall("leave", t2); + } + setInteractivityOn() { + this.isInteractive || (this.isInteractive = true, this.subscribeElementUpdateFn(this)); + } + setInteractivityOff() { + this.isInteractive && (this.isInteractive = false, this.unsubscribeElementUpdateFn(this), null != this.lastProgress && this._computeProgress(r4([0, 1], this.lastProgress))); + } + _resize() { + this.metrics.bcr = this.$el.getBoundingClientRect(), this._computeMetrics(), this._computeIntersection(), this.isFirstResize && (this.isFirstResize = false, this.isInFold && this.setInview()); + } + _computeMetrics() { + const { top: t2, left: s5, height: e4, width: i5 } = this.metrics.bcr, r5 = "vertical" === this.scrollOrientation ? window.innerHeight : window.innerWidth, l4 = "vertical" === this.scrollOrientation ? e4 : i5; + this.metrics.offsetStart = this.currentScroll + ("vertical" === this.scrollOrientation ? t2 : s5) - this.translateValue, this.metrics.offsetEnd = this.metrics.offsetStart + l4, this.isInFold = this.metrics.offsetStart < r5 && !this.attributes.scrollIgnoreFold; + } + _computeIntersection() { + const t2 = "vertical" === this.scrollOrientation ? window.innerHeight : window.innerWidth, s5 = "vertical" === this.scrollOrientation ? this.metrics.bcr.height : this.metrics.bcr.width, e4 = this.attributes.scrollOffset.split(","), i5 = null != e4[0] ? e4[0].trim() : "0", r5 = null != e4[1] ? e4[1].trim() : "0", l4 = this.attributes.scrollPosition.split(","); + let n5 = null != l4[0] ? l4[0].trim() : "start"; + const o5 = null != l4[1] ? l4[1].trim() : "end", a4 = i5.includes("%") ? t2 * parseInt(i5.replace("%", "").trim()) * 0.01 : parseInt(i5), c4 = r5.includes("%") ? t2 * parseInt(r5.replace("%", "").trim()) * 0.01 : parseInt(r5); + switch (this.isInFold && (n5 = "fold"), n5) { + case "start": + default: + this.intersection.start = this.metrics.offsetStart - t2 + a4; + break; + case "middle": + this.intersection.start = this.metrics.offsetStart - t2 + a4 + 0.5 * s5; + break; + case "end": + this.intersection.start = this.metrics.offsetStart - t2 + a4 + s5; + break; + case "fold": + this.intersection.start = 0; + } + switch (o5) { + case "start": + this.intersection.end = this.metrics.offsetStart - c4; + break; + case "middle": + this.intersection.end = this.metrics.offsetStart - c4 + 0.5 * s5; + break; + default: + this.intersection.end = this.metrics.offsetStart - c4 + s5; + } + if (this.intersection.end <= this.intersection.start) + switch (o5) { + case "start": + default: + this.intersection.end = this.intersection.start + 1; + break; + case "middle": + this.intersection.end = this.intersection.start + 0.5 * s5; + break; + case "end": + this.intersection.end = this.intersection.start + s5; + } + } + _computeProgress(t2) { + const s5 = null != t2 ? t2 : (e4 = i4(this.intersection.start, this.intersection.end, 0, 1, this.currentScroll)) < 0 ? 0 : e4 > 1 ? 1 : e4; + var e4; + if (this.progress = s5, s5 != this.lastProgress) { + if (this.lastProgress = s5, this.attributes.scrollCssProgress && this._setCssProgress(s5), this.attributes.scrollEventProgress && this._setCustomEventProgress(s5), this.attributes.scrollModuleProgress) + for (const t3 of this.progressModularModules) + this.modularInstance && this.modularInstance.call("onScrollProgress", s5, t3.moduleName, t3.moduleId); + s5 > 0 && s5 < 1 && this.setInview(), 0 === s5 && this.setOutOfView(), 1 === s5 && this.setOutOfView(); + } + } + _setCssProgress(t2 = 0) { + this.$el.style.setProperty("--progress", t2.toString()); + } + _setCustomEventProgress(t2 = 0) { + const s5 = this.attributes.scrollEventProgress; + if (!s5) + return; + const e4 = new CustomEvent(s5, { detail: { target: this.$el, progress: t2 } }); + window.dispatchEvent(e4); + } + _getProgressModularModules() { + if (!this.modularInstance) + return; + const t2 = Object.keys(this.$el.dataset).filter((t3) => t3.includes("module")), s5 = Object.entries(this.modularInstance.modules); + if (t2.length) + for (const e4 of t2) { + const t3 = this.$el.dataset[e4]; + if (!t3) + return; + for (const e5 of s5) { + const [s6, i5] = e5; + t3 in i5 && this.progressModularModules.push({ moduleName: s6, moduleId: t3 }); + } + } + } + _getScrollCallFrom() { + const t2 = r4([this.intersection.start, this.intersection.end], this.currentScroll); + return this.intersection.start === t2 ? "start" : "end"; + } + _dispatchCall(t2, s5) { + var e4, i5; + const r5 = null == (e4 = this.attributes.scrollCall) ? void 0 : e4.split(","), l4 = null == (i5 = this.attributes) ? void 0 : i5.scrollCallSelf; + if (r5 && r5.length > 1) { + var n5; + const [e5, i6, o5] = r5; + let a4; + a4 = l4 ? this.$el.dataset[`module${i6.trim()}`] : o5, this.modularInstance && this.modularInstance.call(e5.trim(), { target: this.$el, way: t2, from: s5 }, i6.trim(), null == (n5 = a4) ? void 0 : n5.trim()); + } else if (r5) { + const [e5] = r5, i6 = new CustomEvent(e5, { detail: { target: this.$el, way: t2, from: s5 } }); + window.dispatchEvent(i6); + } + } + }; + var n4 = ["scrollOffset", "scrollPosition", "scrollModuleProgress", "scrollCssProgress", "scrollEventProgress", "scrollSpeed"]; + var o4 = class { + constructor({ $el: t2, modularInstance: s5, triggerRootMargin: e4, rafRootMargin: i5, scrollOrientation: r5 }) { + this.$scrollContainer = void 0, this.modularInstance = void 0, this.triggerRootMargin = void 0, this.rafRootMargin = void 0, this.scrollElements = void 0, this.triggeredScrollElements = void 0, this.RAFScrollElements = void 0, this.scrollElementsToUpdate = void 0, this.IOTriggerInstance = void 0, this.IORafInstance = void 0, this.scrollOrientation = void 0, t2 ? (this.$scrollContainer = t2, this.modularInstance = s5, this.scrollOrientation = r5, this.triggerRootMargin = null != e4 ? e4 : "-1px -1px -1px -1px", this.rafRootMargin = null != i5 ? i5 : "100% 100% 100% 100%", this.scrollElements = [], this.triggeredScrollElements = [], this.RAFScrollElements = [], this.scrollElementsToUpdate = [], this._init()) : console.error("Please provide a DOM Element as scrollContainer"); + } + _init() { + const t2 = this.$scrollContainer.querySelectorAll("[data-scroll]"), s5 = Array.from(t2); + this._subscribeScrollElements(s5), this.IOTriggerInstance = new e3({ scrollElements: [...this.triggeredScrollElements], rootMargin: this.triggerRootMargin, IORaf: false }), this.IORafInstance = new e3({ scrollElements: [...this.RAFScrollElements], rootMargin: this.rafRootMargin, IORaf: true }); + } + destroy() { + this.IOTriggerInstance.destroy(), this.IORafInstance.destroy(), this._unsubscribeAllScrollElements(); + } + onResize({ currentScroll: t2 }) { + for (const s5 of this.RAFScrollElements) + s5.onResize({ currentScroll: t2 }); + } + onRender({ currentScroll: t2, smooth: s5 }) { + for (const e4 of this.scrollElementsToUpdate) + e4.onRender({ currentScroll: t2, smooth: s5 }); + } + removeScrollElements(t2) { + const s5 = t2.querySelectorAll("[data-scroll]"); + if (s5.length) { + for (let t3 = 0; t3 < this.triggeredScrollElements.length; t3++) { + const e4 = this.triggeredScrollElements[t3]; + Array.from(s5).indexOf(e4.$el) > -1 && (this.IOTriggerInstance.unobserve(e4.$el), this.triggeredScrollElements.splice(t3, 1)); + } + for (let t3 = 0; t3 < this.RAFScrollElements.length; t3++) { + const e4 = this.RAFScrollElements[t3]; + Array.from(s5).indexOf(e4.$el) > -1 && (this.IORafInstance.unobserve(e4.$el), this.RAFScrollElements.splice(t3, 1)); + } + s5.forEach((t3) => { + const s6 = this.scrollElementsToUpdate.find((s7) => s7.$el === t3), e4 = this.scrollElements.find((s7) => s7.$el === t3); + s6 && this._unsubscribeElementUpdate(s6), e4 && (this.scrollElements = this.scrollElements.filter((t4) => t4.id != e4.id)); + }); + } + } + addScrollElements(t2) { + const s5 = t2.querySelectorAll("[data-scroll]"), e4 = []; + this.scrollElements.forEach((t3) => { + e4.push(t3.id); + }); + const i5 = Math.max(...e4) + 1, r5 = Array.from(s5); + this._subscribeScrollElements(r5, i5, true); + } + _subscribeScrollElements(t2, s5 = 0, e4 = false) { + for (let i5 = 0; i5 < t2.length; i5++) { + const r5 = t2[i5], n5 = this._checkRafNeeded(r5), o5 = new l3({ $el: r5, id: s5 + i5, scrollOrientation: this.scrollOrientation, modularInstance: this.modularInstance, subscribeElementUpdateFn: this._subscribeElementUpdate.bind(this), unsubscribeElementUpdateFn: this._unsubscribeElementUpdate.bind(this), needRaf: n5 }); + this.scrollElements.push(o5), n5 ? (this.RAFScrollElements.push(o5), e4 && (this.IORafInstance.scrollElements.push(o5), this.IORafInstance.observe(o5.$el))) : (this.triggeredScrollElements.push(o5), e4 && (this.IOTriggerInstance.scrollElements.push(o5), this.IOTriggerInstance.observe(o5.$el))); + } + } + _unsubscribeAllScrollElements() { + this.scrollElements = [], this.RAFScrollElements = [], this.triggeredScrollElements = [], this.scrollElementsToUpdate = []; + } + _subscribeElementUpdate(t2) { + this.scrollElementsToUpdate.push(t2); + } + _unsubscribeElementUpdate(t2) { + this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter((s5) => s5.id != t2.id); + } + _checkRafNeeded(t2) { + let s5 = [...n4]; + const e4 = (t3) => { + s5 = s5.filter((s6) => s6 != t3); + }; + if (t2.dataset.scrollOffset) { + if ("0,0" != t2.dataset.scrollOffset.split(",").map((t3) => t3.replace("%", "").trim()).join(",")) + return true; + e4("scrollOffset"); + } else + e4("scrollOffset"); + if (t2.dataset.scrollPosition) { + if ("top,bottom" != t2.dataset.scrollPosition.trim()) + return true; + e4("scrollPosition"); + } else + e4("scrollPosition"); + if (t2.dataset.scrollSpeed && !isNaN(parseFloat(t2.dataset.scrollSpeed))) + return true; + e4("scrollSpeed"); + for (const e5 of s5) + if (e5 in t2.dataset) + return true; + return false; + } + }; + var a3 = class { + constructor({ resizeElements: t2, resizeCallback: s5 = () => { + } }) { + this.$resizeElements = void 0, this.isFirstObserve = void 0, this.observer = void 0, this.resizeCallback = void 0, this.$resizeElements = t2, this.resizeCallback = s5, this.isFirstObserve = true, this._init(); + } + _init() { + this.observer = new ResizeObserver((t2) => { + var s5; + !this.isFirstObserve && (null == (s5 = this.resizeCallback) || s5.call(this)), this.isFirstObserve = false; + }); + for (const t2 of this.$resizeElements) + this.observer.observe(t2); + } + destroy() { + this.observer.disconnect(); + } + }; + var c3 = { wrapper: window, content: document.documentElement, eventsTarget: window, lerp: 0.1, duration: 0.75, orientation: "vertical", gestureOrientation: "vertical", smoothWheel: true, smoothTouch: false, syncTouch: false, syncTouchLerp: 0.1, touchInertiaMultiplier: 35, wheelMultiplier: 1, touchMultiplier: 2, normalizeWheel: false, autoResize: true, easing: (t2) => Math.min(1, 1.001 - Math.pow(2, -10 * t2)) }; + var h3 = class { + constructor({ lenisOptions: t2 = {}, modularInstance: e4, triggerRootMargin: i5, rafRootMargin: r5, autoResize: l4 = true, autoStart: n5 = true, scrollCallback: o5 = () => { + }, initCustomTicker: a4, destroyCustomTicker: h4 } = {}) { + this.rafPlaying = void 0, this.lenisInstance = void 0, this.coreInstance = void 0, this.lenisOptions = void 0, this.modularInstance = void 0, this.triggerRootMargin = void 0, this.rafRootMargin = void 0, this.rafInstance = void 0, this.autoResize = void 0, this.autoStart = void 0, this.ROInstance = void 0, this.initCustomTicker = void 0, this.destroyCustomTicker = void 0, this._onRenderBind = void 0, this._onResizeBind = void 0, this._onScrollToBind = void 0, this.lenisOptions = s4({}, c3, t2), Object.assign(this, { lenisOptions: t2, modularInstance: e4, triggerRootMargin: i5, rafRootMargin: r5, autoResize: l4, autoStart: n5, scrollCallback: o5, initCustomTicker: a4, destroyCustomTicker: h4 }), this._onRenderBind = this._onRender.bind(this), this._onScrollToBind = this._onScrollTo.bind(this), this._onResizeBind = this._onResize.bind(this), this.rafPlaying = false, this._init(); + } + _init() { + var s5; + this.lenisInstance = new r3({ wrapper: this.lenisOptions.wrapper, content: this.lenisOptions.content, eventsTarget: this.lenisOptions.eventsTarget, lerp: this.lenisOptions.lerp, duration: this.lenisOptions.duration, orientation: this.lenisOptions.orientation, gestureOrientation: this.lenisOptions.gestureOrientation, smoothWheel: this.lenisOptions.smoothWheel, smoothTouch: this.lenisOptions.smoothTouch, syncTouch: this.lenisOptions.syncTouch, syncTouchLerp: this.lenisOptions.syncTouchLerp, touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier, wheelMultiplier: this.lenisOptions.wheelMultiplier, touchMultiplier: this.lenisOptions.touchMultiplier, normalizeWheel: this.lenisOptions.normalizeWheel, easing: this.lenisOptions.easing }), null == (s5 = this.lenisInstance) || s5.on("scroll", this.scrollCallback), document.documentElement.setAttribute("data-scroll-orientation", this.lenisInstance.options.orientation), requestAnimationFrame(() => { + this.coreInstance = new o4({ $el: this.lenisInstance.rootElement, modularInstance: this.modularInstance, triggerRootMargin: this.triggerRootMargin, rafRootMargin: this.rafRootMargin, scrollOrientation: this.lenisInstance.options.orientation }), this._bindEvents(), this.initCustomTicker && !this.destroyCustomTicker ? console.warn("initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.") : !this.initCustomTicker && this.destroyCustomTicker && console.warn("destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble."), this.autoStart && this.start(); + }); + } + destroy() { + this.stop(), this._unbindEvents(), this.lenisInstance.destroy(), this.coreInstance.destroy(); + } + _bindEvents() { + this._bindScrollToEvents(), this.autoResize && ("ResizeObserver" in window ? this.ROInstance = new a3({ resizeElements: [document.body], resizeCallback: this._onResizeBind }) : window.addEventListener("resize", this._onResizeBind)); + } + _unbindEvents() { + this._unbindScrollToEvents(), this.autoResize && ("ResizeObserver" in window ? this.ROInstance && this.ROInstance.destroy() : window.removeEventListener("resize", this._onResizeBind)); + } + _bindScrollToEvents(t2) { + const s5 = t2 || this.lenisInstance.rootElement, e4 = null == s5 ? void 0 : s5.querySelectorAll("[data-scroll-to]"); + (null == e4 ? void 0 : e4.length) && e4.forEach((t3) => { + t3.addEventListener("click", this._onScrollToBind, false); + }); + } + _unbindScrollToEvents(t2) { + const s5 = t2 || this.lenisInstance.rootElement, e4 = null == s5 ? void 0 : s5.querySelectorAll("[data-scroll-to]"); + (null == e4 ? void 0 : e4.length) && e4.forEach((t3) => { + t3.removeEventListener("click", this._onScrollToBind, false); + }); + } + _onResize() { + requestAnimationFrame(() => { + var t2; + null == (t2 = this.coreInstance) || t2.onResize({ currentScroll: this.lenisInstance.scroll }); + }); + } + _onRender() { + var t2, s5; + null == (t2 = this.lenisInstance) || t2.raf(Date.now()), null == (s5 = this.coreInstance) || s5.onRender({ currentScroll: this.lenisInstance.scroll, smooth: this.lenisInstance.isSmooth }); + } + _onScrollTo(t2) { + var s5; + t2.preventDefault(); + const e4 = null != (s5 = t2.currentTarget) ? s5 : null; + if (!e4) + return; + const i5 = e4.getAttribute("data-scroll-to-href") || e4.getAttribute("href"), r5 = e4.getAttribute("data-scroll-to-offset") || 0, l4 = e4.getAttribute("data-scroll-to-duration") || this.lenisOptions.duration || c3.duration; + i5 && this.scrollTo(i5, { offset: "string" == typeof r5 ? parseInt(r5) : r5, duration: "string" == typeof l4 ? parseInt(l4) : l4 }); + } + start() { + var t2; + this.rafPlaying || (null == (t2 = this.lenisInstance) || t2.start(), this.rafPlaying = true, this.initCustomTicker ? this.initCustomTicker(this._onRenderBind) : this._raf()); + } + stop() { + var t2; + this.rafPlaying && (null == (t2 = this.lenisInstance) || t2.stop(), this.rafPlaying = false, this.destroyCustomTicker ? this.destroyCustomTicker(this._onRenderBind) : this.rafInstance && cancelAnimationFrame(this.rafInstance)); + } + removeScrollElements(t2) { + var s5; + t2 ? (this._unbindScrollToEvents(t2), null == (s5 = this.coreInstance) || s5.removeScrollElements(t2)) : console.error("Please provide a DOM Element as $oldContainer"); + } + addScrollElements(t2) { + var s5; + t2 ? (null == (s5 = this.coreInstance) || s5.addScrollElements(t2), requestAnimationFrame(() => { + this._bindScrollToEvents(t2); + })) : console.error("Please provide a DOM Element as $newContainer"); + } + resize() { + this._onResizeBind(); + } + scrollTo(t2, s5) { + var e4; + null == (e4 = this.lenisInstance) || e4.scrollTo(t2, { offset: null == s5 ? void 0 : s5.offset, lerp: null == s5 ? void 0 : s5.lerp, duration: null == s5 ? void 0 : s5.duration, immediate: null == s5 ? void 0 : s5.immediate, lock: null == s5 ? void 0 : s5.lock, force: null == s5 ? void 0 : s5.force, easing: null == s5 ? void 0 : s5.easing, onComplete: null == s5 ? void 0 : s5.onComplete }); + } + _raf() { + this._onRenderBind(), this.rafInstance = requestAnimationFrame(() => this._raf()); + } + }; + + // assets/scripts/modules/Scroll.js + var Scroll_default = class extends _default { + constructor(m3) { + super(m3); + } + init() { + this.scroll = new h3({ + modularInstance: this + }); + } + /** + * Lazy load the related image. + * + * @see ../utils/image.js + * + * It is recommended to wrap your `` into an element with the + * CSS class name `.c-lazy`. The CSS class name modifier `.-lazy-loaded` + * will be applied on both the image and the parent wrapper. + * + * ```html + *
+ * + *
+ * ``` + * + * @param {LocomotiveScroll} args - The Locomotive Scroll instance. + */ + lazyLoad(args) { + lazyLoadImage(args.target, null, () => { + }); + } + scrollTo(params) { + var _b; + let _a = params, { target } = _a, options = __objRest(_a, ["target"]); + options = Object.assign({ + // Defaults + duration: 1 + }, options); + (_b = this.scroll) == null ? void 0 : _b.scrollTo(target, options); + } + destroy() { + this.scroll.destroy(); + } + }; + + // assets/scripts/globals.js + var import_svg4everybody = __toESM(require_svg4everybody(), 1); + var gridHelper2; + (() => __async(void 0, null, function* () { + if (ENV.IS_DEV) { + const gridHelperModule = yield Promise.resolve().then(() => (init_grid_helper(), grid_helper_exports)); + gridHelper2 = gridHelperModule == null ? void 0 : gridHelperModule.gridHelper; + } + }))(); + function globals_default() { + (0, import_svg4everybody.default)(); + gridHelper2 == null ? void 0 : gridHelper2(); + } + + // assets/scripts/utils/tickers.js + var debounce = (callback, delay, immediate = false) => { + let timeout = null; + return (...args) => { + clearTimeout(timeout); + const later = () => { + timeout = null; + if (!immediate) { + callback(...args); + } + }; + if (immediate && !timeout) { + callback(...args); + } + timeout = setTimeout(later, delay); + }; + }; + + // assets/scripts/utils/dom.js + var $html = document.documentElement; + var $body = document.body; + + // assets/scripts/utils/fonts.js + var isFontLoadingAPIAvailable = "fonts" in document; + function conformsToReference(font, criterion2) { + for (const [key, value] of Object.entries(criterion2)) { + switch (key) { + case "family": { + if (trim(font[key]) !== value) { + return false; + } + break; + } + case "weight": { + if (font[key] != value) { + return false; + } + break; + } + default: { + if (font[key] !== value) { + return false; + } + break; + } + } + } + return true; + } + function conformsToShorthand(font, criterion2) { + const family = trim(font.family); + if (trim(family) === criterion2) { + return true; + } + if (criterion2.endsWith(trim(family)) && (criterion2.match(font.weight) || criterion2.match(font.style))) { + return true; + } + return true; + } + function findManyByReference(search) { + const found = []; + for (const font of document.fonts) { + if (conformsToReference(font, search)) { + found.push(font); + } + } + return found; + } + function findManyByShorthand(search) { + const found = []; + for (const font of document.fonts) { + if (conformsToShorthand(font, search)) { + found.push(font); + } + } + return found; + } + function getMany(queries) { + if (!Array.isArray(queries)) { + queries = [queries]; + } + const found = /* @__PURE__ */ new Set(); + queries.forEach((search) => { + if (search) { + switch (typeof search) { + case "string": + found.add(...findManyByShorthand(search)); + return; + case "object": + found.add(...findManyByReference(search)); + return; + } + } + throw new TypeError( + "Expected font query to be font shorthand or font reference" + ); + }); + return [...found]; + } + function loadFonts(fontsToLoad, debug = false) { + return __async(this, null, function* () { + var _a; + if (((_a = fontsToLoad.size) != null ? _a : fontsToLoad.length) === 0) { + throw new TypeError( + "Expected at least one font" + ); + } + return yield loadFontsWithAPI([...fontsToLoad], debug); + }); + } + function loadFontFaceWithAPI(font) { + return __async(this, null, function* () { + return yield (font.status === "unloaded" ? font.load() : font.loaded).then((font2) => font2, (err) => font); + }); + } + function loadFontsWithAPI(fontsToLoad, debug = false) { + return __async(this, null, function* () { + debug && console.group("[loadFonts:API]", fontsToLoad.length, "/", document.fonts.size); + const fontsToBeLoaded = []; + for (const fontToLoad of fontsToLoad) { + if (fontToLoad instanceof FontFace) { + if (!document.fonts.has(fontToLoad)) { + document.fonts.add(fontToLoad); + } + fontsToBeLoaded.push( + loadFontFaceWithAPI(fontToLoad) + ); + } else { + fontsToBeLoaded.push( + ...getMany(fontToLoad).map((font) => loadFontFaceWithAPI(font)) + ); + } + } + debug && console.groupEnd(); + return yield Promise.all(fontsToBeLoaded); + }); + } + function trim(value) { + return value.replace(/['"]+/g, ""); + } + + // assets/scripts/app.js + var app = new main_esm_default({ + modules: modules_exports + }); + window.addEventListener("load", (event) => { + const $style = document.getElementById("main-css"); + if ($style) { + if ($style.isLoaded) { + init(); + } else { + $style.addEventListener("load", (event2) => { + init(); + }); + } + } else { + console.warn('The "main-css" stylesheet not found'); + } + }); + function init() { + globals_default(); + app.init(app); + $html.classList.add(CSS_CLASS.LOADED); + $html.classList.add(CSS_CLASS.READY); + $html.classList.remove(CSS_CLASS.LOADING); + const resizeEndEvent = new CustomEvent(CUSTOM_EVENT.RESIZE_END); + window.addEventListener("resize", () => { + $html.style.setProperty("--vw", `${document.documentElement.clientWidth * 0.01}px`); + debounce(() => { + window.dispatchEvent(resizeEndEvent); + }, 200, false); + }); + if (isFontLoadingAPIAvailable) { + loadFonts(FONT.EAGER, ENV.IS_DEV).then((eagerFonts) => { + $html.classList.add(CSS_CLASS.FONTS_LOADED); + if (ENV.IS_DEV) { + console.group("Eager fonts loaded!", eagerFonts.length, "/", document.fonts.size); + console.group("State of eager fonts:"); + eagerFonts.forEach((font) => console.log( + font.family, + font.style, + font.weight, + font.status + /*, font*/ + )); + console.groupEnd(); + console.group("State of all fonts:"); + document.fonts.forEach((font) => console.log( + font.family, + font.style, + font.weight, + font.status + /*, font*/ + )); + console.groupEnd(); + } + }); + } + } +})(); /*! Bundled license information: svg4everybody/dist/svg4everybody.js: diff --git a/www/assets/scripts/app.js.map b/www/assets/scripts/app.js.map index 864afeb..cc7f090 100644 --- a/www/assets/scripts/app.js.map +++ b/www/assets/scripts/app.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../../../node_modules/svg4everybody/dist/svg4everybody.js", "../../../assets/scripts/utils/grid-helper.js", "../../../node_modules/modujs/dist/main.esm.js", "../../../assets/scripts/modules.js", "../../../assets/scripts/config.js", "../../../assets/scripts/utils/fonts.js", "../../../assets/scripts/modules/Example.js", "../../../node_modules/modularload/dist/main.esm.js", "../../../assets/scripts/modules/Load.js", "../../../assets/scripts/utils/image.js", "../../../node_modules/@studio-freight/lenis/src/maths.js", "../../../node_modules/@studio-freight/lenis/src/animate.js", "../../../node_modules/@studio-freight/lenis/src/dimensions.js", "../../../node_modules/@studio-freight/lenis/src/debounce.js", "../../../node_modules/@studio-freight/lenis/src/emitter.js", "../../../node_modules/@studio-freight/lenis/src/virtual-scroll.js", "../../../node_modules/@studio-freight/lenis/src/index.js", "../../../node_modules/locomotive-scroll/src/core/IO.ts", "../../../node_modules/locomotive-scroll/src/utils/maths.ts", "../../../node_modules/locomotive-scroll/src/core/ScrollElement.ts", "../../../node_modules/locomotive-scroll/src/core/Core.ts", "../../../node_modules/locomotive-scroll/src/core/RO.ts", "../../../node_modules/locomotive-scroll/src/index.ts", "../../../assets/scripts/modules/Scroll.js", "../../../assets/scripts/globals.js", "../../../assets/scripts/utils/tickers.js", "../../../assets/scripts/utils/dom.js", "../../../assets/scripts/app.js"], - "sourcesContent": ["!function(root, factory) {\n \"function\" == typeof define && define.amd ? // AMD. Register as an anonymous module unless amdModuleId is set\n define([], function() {\n return root.svg4everybody = factory();\n }) : \"object\" == typeof module && module.exports ? // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory() : root.svg4everybody = factory();\n}(this, function() {\n /*! svg4everybody v2.1.9 | github.com/jonathantneal/svg4everybody */\n function embed(parent, svg, target) {\n // if the target exists\n if (target) {\n // create a document fragment to hold the contents of the target\n var fragment = document.createDocumentFragment(), viewBox = !svg.hasAttribute(\"viewBox\") && target.getAttribute(\"viewBox\");\n // conditionally set the viewBox on the svg\n viewBox && svg.setAttribute(\"viewBox\", viewBox);\n // copy the contents of the clone into the fragment\n for (// clone the target\n var clone = target.cloneNode(!0); clone.childNodes.length; ) {\n fragment.appendChild(clone.firstChild);\n }\n // append the fragment into the svg\n parent.appendChild(fragment);\n }\n }\n function loadreadystatechange(xhr) {\n // listen to changes in the request\n xhr.onreadystatechange = function() {\n // if the request is ready\n if (4 === xhr.readyState) {\n // get the cached html document\n var cachedDocument = xhr._cachedDocument;\n // ensure the cached html document based on the xhr response\n cachedDocument || (cachedDocument = xhr._cachedDocument = document.implementation.createHTMLDocument(\"\"), \n cachedDocument.body.innerHTML = xhr.responseText, xhr._cachedTarget = {}), // clear the xhr embeds list and embed each item\n xhr._embeds.splice(0).map(function(item) {\n // get the cached target\n var target = xhr._cachedTarget[item.id];\n // ensure the cached target\n target || (target = xhr._cachedTarget[item.id] = cachedDocument.getElementById(item.id)), \n // embed the target into the svg\n embed(item.parent, item.svg, target);\n });\n }\n }, // test the ready state change immediately\n xhr.onreadystatechange();\n }\n function svg4everybody(rawopts) {\n function oninterval() {\n // while the index exists in the live collection\n for (// get the cached index\n var index = 0; index < uses.length; ) {\n // get the current \n var use = uses[index], parent = use.parentNode, svg = getSVGAncestor(parent), src = use.getAttribute(\"xlink:href\") || use.getAttribute(\"href\");\n if (!src && opts.attributeName && (src = use.getAttribute(opts.attributeName)), \n svg && src) {\n if (polyfill) {\n if (!opts.validate || opts.validate(src, svg, use)) {\n // remove the element\n parent.removeChild(use);\n // parse the src and get the url and id\n var srcSplit = src.split(\"#\"), url = srcSplit.shift(), id = srcSplit.join(\"#\");\n // if the link is external\n if (url.length) {\n // get the cached xhr request\n var xhr = requests[url];\n // ensure the xhr request exists\n xhr || (xhr = requests[url] = new XMLHttpRequest(), xhr.open(\"GET\", url), xhr.send(), \n xhr._embeds = []), // add the svg and id as an item to the xhr embeds list\n xhr._embeds.push({\n parent: parent,\n svg: svg,\n id: id\n }), // prepare the xhr ready state change event\n loadreadystatechange(xhr);\n } else {\n // embed the local id into the svg\n embed(parent, svg, document.getElementById(id));\n }\n } else {\n // increase the index when the previous value was not \"valid\"\n ++index, ++numberOfSvgUseElementsToBypass;\n }\n }\n } else {\n // increase the index when the previous value was not \"valid\"\n ++index;\n }\n }\n // continue the interval\n (!uses.length || uses.length - numberOfSvgUseElementsToBypass > 0) && requestAnimationFrame(oninterval, 67);\n }\n var polyfill, opts = Object(rawopts), newerIEUA = /\\bTrident\\/[567]\\b|\\bMSIE (?:9|10)\\.0\\b/, webkitUA = /\\bAppleWebKit\\/(\\d+)\\b/, olderEdgeUA = /\\bEdge\\/12\\.(\\d+)\\b/, edgeUA = /\\bEdge\\/.(\\d+)\\b/, inIframe = window.top !== window.self;\n polyfill = \"polyfill\" in opts ? opts.polyfill : newerIEUA.test(navigator.userAgent) || (navigator.userAgent.match(olderEdgeUA) || [])[1] < 10547 || (navigator.userAgent.match(webkitUA) || [])[1] < 537 || edgeUA.test(navigator.userAgent) && inIframe;\n // create xhr requests object\n var requests = {}, requestAnimationFrame = window.requestAnimationFrame || setTimeout, uses = document.getElementsByTagName(\"use\"), numberOfSvgUseElementsToBypass = 0;\n // conditionally start the interval if the polyfill is active\n polyfill && oninterval();\n }\n function getSVGAncestor(node) {\n for (var svg = node; \"svg\" !== svg.nodeName.toLowerCase() && (svg = svg.parentNode); ) {}\n return svg;\n }\n return svg4everybody;\n});", "/**\n * Grid Helper\n *\n * Provides a grid based on the design guidelines and is helpful for web integration.\n *\n * - `Control + g` to toggle the grid\n *\n */\n\n/**\n * @typedef {Object} GridHelperReference\n *\n * @property {string} [gutterCssVar=GRID_HELPER_GUTTER_CSS_VAR] - CSS variable used to define grid gutters.\n * @property {string} [marginCssVar=GRID_HELPER_MARGIN_CSS_VAR] - CSS variable used to define grid margins.\n * @property {string} [rgbaColor=GRID_HELPER_RGBA_COLOR] - RGBA color for the grid appearence.\n */\n\nconst GRID_HELPER_GUTTER_CSS_VAR = '--grid-gutter';\nconst GRID_HELPER_MARGIN_CSS_VAR = '--grid-margin';\nconst GRID_HELPER_RGBA_COLOR = 'rgba(255, 0, 0, .1)';\n\n/**\n * Create a grid helper\n *\n * @param {GridHelperReference}\n *\n */\nfunction gridHelper({\n gutterCssVar = GRID_HELPER_GUTTER_CSS_VAR,\n marginCssVar = GRID_HELPER_MARGIN_CSS_VAR,\n rgbaColor = GRID_HELPER_RGBA_COLOR,\n} = {}) {\n // Set grid container\n const $gridContainer = document.createElement('div');\n document.body.append($gridContainer);\n\n // Set grid appearence\n setGridHelperColumns($gridContainer, rgbaColor);\n setGridHelperStyles($gridContainer, gutterCssVar, marginCssVar);\n\n // Set grid interactivity\n setGridEvents($gridContainer, rgbaColor);\n}\n\n/**\n * Set grid container styles\n *\n * @param {HTMLElement} $container - DOM Element that contains a list of generated columns\n * @param {string} gutterCssVar - CSS variable used to define grid gutters.\n * @param {string} marginCssVar - CSS variable used to define grid margins.\n *\n */\nfunction setGridHelperStyles($container, gutterCssVar, marginCssVar) {\n const elStyles = $container.style;\n elStyles.zIndex = '10000';\n elStyles.position = 'fixed';\n elStyles.top = '0';\n elStyles.left = '0';\n elStyles.display = 'flex';\n elStyles.width = '100%';\n elStyles.height = '100%';\n elStyles.columnGap = `var(${gutterCssVar}, 0)`;\n elStyles.paddingLeft = `var(${marginCssVar}, 0)`;\n elStyles.paddingRight = `var(${marginCssVar}, 0)`;\n elStyles.pointerEvents = 'none';\n elStyles.visibility = 'hidden';\n}\n\n/**\n * Set grid columns\n *\n * @param {HTMLElement} $container - DOM Element that will contain a list of generated columns\n * @param {string} rgbaColor - RGBA color to stylize the generated columns\n *\n */\nfunction setGridHelperColumns($container, rgbaColor) {\n // Clear columns\n $container.innerHTML = '';\n\n // Loop through columns\n const columns = Number(\n window.getComputedStyle($container).getPropertyValue('--grid-columns')\n );\n\n let $col;\n for (var i = 0; i < columns; i++) {\n $col = document.createElement('div');\n $col.style.flex = '1 1 0';\n $col.style.backgroundColor = rgbaColor;\n $container.appendChild($col);\n }\n}\n\n/**\n * Set grid events\n *\n * Resize to rebuild columns\n * Keydown/Keyup to toggle the grid display\n *\n * @param {HTMLElement} $container - DOM Element that contains a list of generated columns\n * @param {string} rgbaColor - RGBA color to stylize the generated columns\n *\n */\nfunction setGridEvents($container, rgbaColor) {\n // Handle resize\n window.addEventListener(\n 'resize',\n setGridHelperColumns($container, rgbaColor)\n );\n\n // Toggle grid\n let ctrlDown = false;\n let isActive = false;\n\n document.addEventListener('keydown', (e) => {\n if (e.key == 'Control') {\n ctrlDown = true;\n } else {\n if (ctrlDown && e.key == 'g') {\n if (isActive) {\n $container.style.visibility = 'hidden';\n } else {\n $container.style.visibility = 'visible';\n }\n\n isActive = !isActive;\n }\n }\n });\n\n document.addEventListener('keyup', (e) => {\n if (e.key == 'Control') {\n ctrlDown = false;\n }\n });\n}\n\nexport { gridHelper };\n", "function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar _default = /*#__PURE__*/function () {\n function _default(options) {\n _classCallCheck(this, _default);\n\n this.mAttr = 'data-' + options.dataName;\n this.mCaptureEvents = ['mouseenter', 'mouseleave'];\n this.el = options.el;\n }\n\n _createClass(_default, [{\n key: \"mInit\",\n value: function mInit(modules) {\n var _this = this;\n\n this.modules = modules;\n this.mCheckEventTarget = this.mCheckEventTarget.bind(this);\n\n if (this.events) {\n Object.keys(this.events).forEach(function (event) {\n return _this.mAddEvent(event);\n });\n }\n }\n }, {\n key: \"mUpdate\",\n value: function mUpdate(modules) {\n this.modules = modules;\n }\n }, {\n key: \"mDestroy\",\n value: function mDestroy() {\n var _this2 = this;\n\n if (this.events) {\n Object.keys(this.events).forEach(function (event) {\n return _this2.mRemoveEvent(event);\n });\n }\n }\n }, {\n key: \"mAddEvent\",\n value: function mAddEvent(event) {\n var capture = this.mCaptureEvents.includes(event) ? true : false;\n this.el.addEventListener(event, this.mCheckEventTarget, capture);\n }\n }, {\n key: \"mRemoveEvent\",\n value: function mRemoveEvent(event) {\n var capture = this.mCaptureEvents.includes(event) ? true : false;\n this.el.removeEventListener(event, this.mCheckEventTarget, capture);\n }\n }, {\n key: \"mCheckEventTarget\",\n value: function mCheckEventTarget(e) {\n var event = this.events[e.type];\n\n if (typeof event === \"string\") {\n this[event](e);\n } else {\n var data = '[' + this.mAttr + ']';\n var target = e.target;\n\n if (this.mCaptureEvents.includes(e.type)) {\n if (target.matches(data)) {\n this.mCallEventMethod(e, event, target);\n }\n } else {\n while (target && target !== document) {\n if (target.matches(data)) {\n if (this.mCallEventMethod(e, event, target) != 'undefined') {\n break;\n }\n }\n\n target = target.parentNode;\n }\n }\n }\n }\n }, {\n key: \"mCallEventMethod\",\n value: function mCallEventMethod(e, event, target) {\n var name = target.getAttribute(this.mAttr);\n\n if (event.hasOwnProperty(name)) {\n var method = event[name];\n\n if (!e.hasOwnProperty('currentTarget')) {\n Object.defineProperty(e, 'currentTarget', {\n value: target\n });\n }\n\n if (!e.hasOwnProperty('curTarget')) {\n Object.defineProperty(e, 'curTarget', {\n value: target\n }); // For IE 11\n }\n\n this[method](e);\n }\n }\n }, {\n key: \"$\",\n value: function $(query, context) {\n var classIndex = query.indexOf('.');\n var idIndex = query.indexOf('#');\n var attrIndex = query.indexOf('[');\n var indexes = [classIndex, idIndex, attrIndex].filter(function (index) {\n return index != -1;\n });\n var index = false;\n var name = query;\n var more = '';\n var parent = this.el;\n\n if (indexes.length) {\n index = Math.min.apply(Math, _toConsumableArray(indexes));\n name = query.slice(0, index);\n more = query.slice(index);\n }\n\n if (_typeof(context) == 'object') {\n parent = context;\n }\n\n return parent.querySelectorAll('[' + this.mAttr + '=' + name + ']' + more);\n }\n }, {\n key: \"parent\",\n value: function parent(query, context) {\n var data = '[' + this.mAttr + '=' + query + ']';\n var parent = context.parentNode;\n\n while (parent && parent !== document) {\n if (parent.matches(data)) {\n return parent;\n }\n\n parent = parent.parentNode;\n }\n }\n }, {\n key: \"getData\",\n value: function getData(name, context) {\n var target = context || this.el;\n return target.getAttribute(this.mAttr + '-' + name);\n }\n }, {\n key: \"setData\",\n value: function setData(name, value, context) {\n var target = context || this.el;\n return target.setAttribute(this.mAttr + '-' + name, value);\n }\n }, {\n key: \"call\",\n value: function call(func, args, mod, id) {\n var _this3 = this;\n\n if (args && !mod) {\n mod = args;\n args = false;\n }\n\n if (this.modules[mod]) {\n if (id) {\n if (this.modules[mod][id]) {\n this.modules[mod][id][func](args);\n }\n } else {\n Object.keys(this.modules[mod]).forEach(function (id) {\n _this3.modules[mod][id][func](args);\n });\n }\n }\n }\n }, {\n key: \"on\",\n value: function on(e, mod, func, id) {\n var _this4 = this;\n\n if (this.modules[mod]) {\n if (id) {\n this.modules[mod][id].el.addEventListener(e, function (o) {\n return func(o);\n });\n } else {\n Object.keys(this.modules[mod]).forEach(function (i) {\n _this4.modules[mod][i].el.addEventListener(e, function (o) {\n return func(o);\n });\n });\n }\n }\n }\n }, {\n key: \"init\",\n value: function init() {}\n }, {\n key: \"destroy\",\n value: function destroy() {}\n }]);\n\n return _default;\n}();\n\nvar _default$1 = /*#__PURE__*/function () {\n function _default(options) {\n _classCallCheck(this, _default);\n\n this.app;\n this.modules = options.modules;\n this.currentModules = {};\n this.activeModules = {};\n this.newModules = {};\n this.moduleId = 0;\n }\n\n _createClass(_default, [{\n key: \"init\",\n value: function init(app, scope) {\n var _this = this;\n\n var container = scope || document;\n var elements = container.querySelectorAll('*');\n\n if (app && !this.app) {\n this.app = app;\n }\n\n this.activeModules['app'] = {\n 'app': this.app\n };\n elements.forEach(function (el) {\n Array.from(el.attributes).forEach(function (i) {\n if (i.name.startsWith('data-module')) {\n var moduleExists = false;\n var dataName = i.name.split('-').splice(2);\n\n var moduleName = _this.toCamel(dataName);\n\n if (_this.modules[moduleName]) {\n moduleExists = true;\n } else if (_this.modules[_this.toUpper(moduleName)]) {\n moduleName = _this.toUpper(moduleName);\n moduleExists = true;\n }\n\n if (moduleExists) {\n var options = {\n el: el,\n name: moduleName,\n dataName: dataName.join('-')\n };\n var module = new _this.modules[moduleName](options);\n var id = i.value;\n\n if (!id) {\n _this.moduleId++;\n id = 'm' + _this.moduleId;\n el.setAttribute(i.name, id);\n }\n\n _this.addActiveModule(moduleName, id, module);\n\n var moduleId = moduleName + '-' + id;\n\n if (scope) {\n _this.newModules[moduleId] = module;\n } else {\n _this.currentModules[moduleId] = module;\n }\n }\n }\n });\n });\n Object.entries(this.currentModules).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n id = _ref2[0],\n module = _ref2[1];\n\n if (scope) {\n var split = id.split('-');\n var moduleName = split.shift();\n var moduleId = split.pop();\n\n _this.addActiveModule(moduleName, moduleId, module);\n } else {\n _this.initModule(module);\n }\n });\n }\n }, {\n key: \"initModule\",\n value: function initModule(module) {\n module.mInit(this.activeModules);\n module.init();\n }\n }, {\n key: \"addActiveModule\",\n value: function addActiveModule(name, id, module) {\n if (this.activeModules[name]) {\n Object.assign(this.activeModules[name], _defineProperty({}, id, module));\n } else {\n this.activeModules[name] = _defineProperty({}, id, module);\n }\n }\n }, {\n key: \"update\",\n value: function update(scope) {\n var _this2 = this;\n\n this.init(this.app, scope);\n Object.entries(this.currentModules).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n id = _ref4[0],\n module = _ref4[1];\n\n module.mUpdate(_this2.activeModules);\n });\n Object.entries(this.newModules).forEach(function (_ref5) {\n var _ref6 = _slicedToArray(_ref5, 2),\n id = _ref6[0],\n module = _ref6[1];\n\n _this2.initModule(module);\n });\n Object.assign(this.currentModules, this.newModules);\n }\n }, {\n key: \"destroy\",\n value: function destroy(scope) {\n if (scope) {\n this.destroyScope(scope);\n } else {\n this.destroyModules();\n }\n }\n }, {\n key: \"destroyScope\",\n value: function destroyScope(scope) {\n var _this3 = this;\n\n var elements = scope.querySelectorAll('*');\n elements.forEach(function (el) {\n Array.from(el.attributes).forEach(function (i) {\n if (i.name.startsWith('data-module')) {\n var id = i.value;\n var dataName = i.name.split('-').splice(2);\n var moduleName = _this3.toCamel(dataName) + '-' + id;\n var moduleExists = false;\n\n if (_this3.currentModules[moduleName]) {\n moduleExists = true;\n } else if (_this3.currentModules[_this3.toUpper(moduleName)]) {\n moduleName = _this3.toUpper(moduleName);\n moduleExists = true;\n }\n\n if (moduleExists) {\n _this3.destroyModule(_this3.currentModules[moduleName]);\n\n delete _this3.currentModules[moduleName];\n }\n }\n });\n });\n this.activeModules = {};\n this.newModules = {};\n }\n }, {\n key: \"destroyModules\",\n value: function destroyModules() {\n var _this4 = this;\n\n Object.entries(this.currentModules).forEach(function (_ref7) {\n var _ref8 = _slicedToArray(_ref7, 2),\n id = _ref8[0],\n module = _ref8[1];\n\n _this4.destroyModule(module);\n });\n this.currentModules = [];\n }\n }, {\n key: \"destroyModule\",\n value: function destroyModule(module) {\n module.mDestroy();\n module.destroy();\n }\n }, {\n key: \"toCamel\",\n value: function toCamel(arr) {\n var _this5 = this;\n\n return arr.reduce(function (a, b) {\n return a + _this5.toUpper(b);\n });\n }\n }, {\n key: \"toUpper\",\n value: function toUpper(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n }]);\n\n return _default;\n}();\n\nexport default _default$1;\nexport { _default as module };\n", "export {default as Example} from './modules/Example';\nexport {default as Load} from './modules/Load';\nexport {default as Scroll} from './modules/Scroll';\n", "/**\n * > When using the esBuild API, all `process.env.NODE_ENV` expressions\n * > are automatically defined to `\"production\"` if all minification\n * > options are enabled and `\"development\"` otherwise. This only happens\n * > if `process`, `process.env`, and `process.env.NODE_ENV` are not already\n * > defined. This substitution is necessary to avoid code crashing instantly\n * > (since `process` is a Node API, not a web API).\n * > \u2014 https://esbuild.github.io/api/#platform\n */\n\nconst NODE_ENV = process.env.NODE_ENV\nconst IS_MOBILE = window.matchMedia('(any-pointer:coarse)').matches\n\n// Main environment variables\nconst ENV = Object.freeze({\n // Node environment\n NAME: NODE_ENV,\n IS_PROD: NODE_ENV === 'production',\n IS_DEV: NODE_ENV === 'development',\n\n // Device\n IS_MOBILE,\n IS_DESKTOP: !IS_MOBILE,\n})\n\n// Main CSS classes used within the project\nconst CSS_CLASS = Object.freeze({\n LOADING: 'is-loading',\n LOADED: 'is-loaded',\n READY: 'is-ready',\n FONTS_LOADED: 'fonts-loaded',\n LAZY_CONTAINER: 'c-lazy',\n LAZY_LOADED: '-lazy-loaded',\n // ...\n})\n\n// Custom js events\nconst CUSTOM_EVENT = Object.freeze({\n RESIZE_END: 'loco.resizeEnd',\n // ...\n})\n\n// Fonts parameters\nconst FONT = Object.freeze({\n EAGER: [\n { family: 'Source Sans', style: 'normal', weight: 400 },\n { family: 'Source Sans', style: 'normal', weight: 700 },\n ],\n})\n\nexport {\n ENV,\n CSS_CLASS,\n CUSTOM_EVENT,\n FONT,\n}\n", "/**\n * Font Faces\n *\n * Provides utilities to facilitate interactions with the CSS Font Loading API.\n *\n * Features functions to:\n *\n * - Retrieve one or more `FontFace` instances based on a font search query.\n * - Check if a `FontFace` instance matches a font search query.\n * - Eagerly load fonts that match a font search query.\n * - Wait until fonts that match a font search query are loaded.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/CSS_Font_Loading_API}\n */\n\n/**\n * @typedef {Object} FontFaceReference\n *\n * @property {string} family - The name used to identify the font in our CSS.\n * @property {string} [style] - The style used by the font in our CSS.\n * @property {string} [weight] - The weight used by the font in our CSS.\n */\n\nconst isFontLoadingAPIAvailable = ('fonts' in document);\n\n/**\n * Determines if the given font matches the given `FontFaceReference`.\n *\n * @param {FontFace} font - The font to inspect.\n * @param {FontFaceReference} criterion - The object of property values to match.\n *\n * @returns {boolean}\n */\nfunction conformsToReference(font, criterion)\n{\n for (const [ key, value ] of Object.entries(criterion)) {\n switch (key) {\n case 'family': {\n if (trim(font[key]) !== value) {\n return false;\n }\n break;\n }\n\n case 'weight': {\n /**\n * Note concerning font weights:\n * Loose equality (`==`) is used to compare numeric weights,\n * a number (`400`) and a numeric string (`\"400\"`).\n * Comparison between numeric and keyword values is neglected.\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight#common_weight_name_mapping\n */\n if (font[key] != value) {\n return false;\n }\n break;\n }\n\n default: {\n if (font[key] !== value) {\n return false;\n }\n break;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Determines if the given font matches the given font shorthand.\n *\n * @param {FontFace} font - The font to inspect.\n * @param {string} criterion - The font shorthand to match.\n *\n * @returns {boolean}\n */\nfunction conformsToShorthand(font, criterion)\n{\n const family = trim(font.family);\n\n if (trim(family) === criterion) {\n return true;\n }\n\n if (\n criterion.endsWith(trim(family)) && (\n criterion.match(font.weight) ||\n criterion.match(font.style)\n )\n ) {\n return true;\n }\n\n return true;\n}\n\n/**\n * Determines if the given font matches any of the given criteria.\n *\n * @param {FontFace} font - The font to inspect.\n * @param {FontFaceReference[]} criteria - A list of objects with property values to match.\n *\n * @returns {boolean}\n */\nfunction conformsToAnyReference(font, criteria)\n{\n for (const criterion of criteria) {\n if (conformsToReference(font, criterion)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Returns an iterator of all `FontFace` from `document.fonts` that satisfy\n * the provided `FontFaceReference`.\n *\n * @param {FontFaceReference} font\n *\n * @returns {FontFace[]}\n */\nfunction findManyByReference(search)\n{\n const found = [];\n\n for (const font of document.fonts) {\n if (conformsToReference(font, search)) {\n found.push(font);\n }\n }\n\n return found;\n}\n\n/**\n * Returns an iterator of all `FontFace` from `document.fonts` that satisfy\n * the provided font shorthand.\n *\n * @param {string} font\n *\n * @returns {FontFace[]}\n */\nfunction findManyByShorthand(search)\n{\n const found = [];\n\n for (const font of document.fonts) {\n if (conformsToShorthand(font, search)) {\n found.push(font);\n }\n }\n\n return found;\n}\n\n/**\n * Returns the first `FontFace` from `document.fonts` that satisfies\n * the provided `FontFaceReference`.\n *\n * @param {FontFaceReference} font\n *\n * @returns {?FontFace}\n */\nfunction findOneByReference(search)\n{\n for (const font of document.fonts) {\n if (conformsToReference(font, criterion)) {\n return font;\n }\n }\n\n return null;\n}\n\n/**\n * Returns the first `FontFace` from `document.fonts` that satisfies\n * the provided font shorthand.\n *\n * Examples:\n *\n * - \"Roboto\"\n * - \"italic bold 16px Roboto\"\n *\n * @param {string} font\n *\n * @returns {?FontFace}\n */\nfunction findOneByShorthand(search)\n{\n for (const font of document.fonts) {\n if (conformsToShorthand(font, search)) {\n return font;\n }\n }\n\n return null;\n}\n\n/**\n * Returns a `FontFace` from `document.fonts` that satisfies\n * the provided query.\n *\n * @param {FontFaceReference|string} font - Either:\n * - a `FontFaceReference` object\n * - a font family name\n * - a font specification, for example \"italic bold 16px Roboto\"\n *\n * @returns {?FontFace}\n *\n * @throws {TypeError}\n */\nfunction getAny(search) {\n if (search) {\n switch (typeof search) {\n case 'string':\n return findOneByShorthand(search);\n\n case 'object':\n return findOneByReference(search);\n }\n }\n\n throw new TypeError(\n 'Expected font query to be font shorthand or font reference'\n );\n}\n\n/**\n * Returns an iterator of all `FontFace` from `document.fonts` that satisfy\n * the provided queries.\n *\n * @param {FontFaceReference|string|(FontFaceReference|string)[]} queries\n *\n * @returns {FontFace[]}\n *\n * @throws {TypeError}\n */\nfunction getMany(queries) {\n if (!Array.isArray(queries)) {\n queries = [ queries ];\n }\n\n const found = new Set();\n\n queries.forEach((search) => {\n if (search) {\n switch (typeof search) {\n case 'string':\n found.add(...findManyByShorthand(search));\n return;\n\n case 'object':\n found.add(...findManyByReference(search));\n return;\n }\n }\n\n throw new TypeError(\n 'Expected font query to be font shorthand or font reference'\n );\n })\n\n return [ ...found ];\n}\n\n/**\n * Determines if a font face is registered.\n *\n * @param {FontFace|FontFaceReference|string} search - Either:\n * - a `FontFace` instance\n * - a `FontFaceReference` object\n * - a font family name\n * - a font specification, for example \"italic bold 16px Roboto\"\n *\n * @returns {boolean}\n */\nfunction hasAny(search) {\n if (search instanceof FontFace) {\n return document.fonts.has(search);\n }\n\n return getAny(search) != null;\n}\n\n/**\n * Eagerly load fonts.\n *\n * Most user agents only fetch and load fonts when they are first needed\n * (\"lazy loaded\"), which can result in a perceptible delay.\n *\n * This function will \"eager load\" the fonts.\n *\n * @param {(FontFace|FontFaceReference)[]} fontsToLoad - List of fonts to load.\n * @param {boolean} [debug] - If TRUE, log details to the console.\n *\n * @returns {Promise}\n */\nasync function loadFonts(fontsToLoad, debug = false)\n{\n if ((fontsToLoad.size ?? fontsToLoad.length) === 0) {\n throw new TypeError(\n 'Expected at least one font'\n );\n }\n\n return await loadFontsWithAPI([ ...fontsToLoad ], debug);\n}\n\n/**\n * Eagerly load a font using `FontFaceSet` API.\n *\n * @param {FontFace} font\n *\n * @returns {Promise}\n */\nasync function loadFontFaceWithAPI(font)\n{\n return await (font.status === 'unloaded'\n ? font.load()\n : font.loaded\n ).then((font) => font, (err) => font)\n}\n\n/**\n * Eagerly load fonts using `FontFaceSet` API.\n *\n * @param {FontFaceReference[]} fontsToLoad\n * @param {boolean} [debug]\n *\n * @returns {Promise}\n */\nasync function loadFontsWithAPI(fontsToLoad, debug = false)\n{\n debug && console.group('[loadFonts:API]', fontsToLoad.length, '/', document.fonts.size);\n\n const fontsToBeLoaded = [];\n\n for (const fontToLoad of fontsToLoad) {\n if (fontToLoad instanceof FontFace) {\n if (!document.fonts.has(fontToLoad)) {\n document.fonts.add(fontToLoad);\n }\n\n fontsToBeLoaded.push(\n loadFontFaceWithAPI(fontToLoad)\n );\n } else {\n fontsToBeLoaded.push(\n ...getMany(fontToLoad).map((font) => loadFontFaceWithAPI(font))\n );\n }\n }\n\n debug && console.groupEnd();\n\n return await Promise.all(fontsToBeLoaded);\n}\n\n/**\n * Removes quotes from the the string.\n *\n * When a `@font-face` is declared, the font family is sometimes\n * defined in quotes which end up included in the `FontFace` instance.\n *\n * @param {string} value\n *\n * @returns {string}\n */\nfunction trim(value) {\n return value.replace(/['\"]+/g, '');\n}\n\n/**\n * Returns a Promise that resolves with the specified fonts\n * when they are done loading or failed.\n *\n * @param {FontFaceReference|string|(FontFaceReference|string)[]} queries\n *\n * @returns {Promise}\n */\nasync function whenReady(queries)\n{\n const fonts = getMany(queries);\n\n return await Promise.all(fonts.map((font) => font.loaded));\n}\n\nexport {\n getAny,\n getMany,\n hasAny,\n isFontLoadingAPIAvailable,\n loadFonts,\n whenReady,\n}\n", "import { module } from 'modujs';\nimport { FONT } from '../config';\nimport { whenReady } from '../utils/fonts';\n\nexport default class extends module {\n constructor(m) {\n super(m);\n }\n\n init() {\n whenReady(FONT.EAGER).then((fonts) => this.onFontsLoaded(fonts));\n }\n\n onFontsLoaded(fonts) {\n console.log('Example: Eager Fonts Loaded!', fonts)\n }\n}\n", "function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar _default = /*#__PURE__*/function () {\n function _default(options) {\n _classCallCheck(this, _default);\n\n this.defaults = {\n name: 'load',\n loadingClass: 'is-loading',\n loadedClass: 'is-loaded',\n readyClass: 'is-ready',\n transitionsPrefix: 'is-',\n transitionsHistory: true,\n enterDelay: 0,\n exitDelay: 0,\n loadedDelay: 0,\n isLoaded: false,\n isEntered: false,\n isUrl: false,\n transitionContainer: null,\n popstateIgnore: false\n };\n Object.assign(this, this.defaults, options);\n this.options = options;\n this.namespace = 'modular';\n this.html = document.documentElement;\n this.href = window.location.href;\n this.container = 'data-' + this.name + '-container';\n this.subContainer = false;\n this.prevTransition = null;\n this.loadAttributes = ['src', 'srcset', 'style', 'href'];\n this.isInserted = false;\n this.isLoading = false;\n this.enterTimeout = false;\n this.controller = new AbortController();\n this.classContainer = this.html;\n this.isChrome = navigator.userAgent.indexOf(\"Chrome\") != -1 ? true : false;\n this.init();\n }\n\n _createClass(_default, [{\n key: \"init\",\n value: function init() {\n var _this = this;\n\n window.addEventListener('popstate', function (e) {\n return _this.checkState(e);\n }, false);\n this.html.addEventListener('click', function (e) {\n return _this.checkClick(e);\n }, false);\n this.loadEls(document);\n }\n }, {\n key: \"checkClick\",\n value: function checkClick(e) {\n if (!e.ctrlKey && !e.metaKey) {\n var target = e.target;\n\n while (target && target !== document) {\n if (target.matches('a') && target.getAttribute('download') == null) {\n var href = target.getAttribute('href');\n\n if (!href.startsWith('#') && !href.startsWith('mailto:') && !href.startsWith('tel:')) {\n e.preventDefault();\n this.reset();\n this.getClickOptions(target);\n }\n\n break;\n }\n\n target = target.parentNode;\n }\n }\n }\n }, {\n key: \"checkState\",\n value: function checkState() {\n if (typeof this.popstateIgnore === 'string' && window.location.href.indexOf(this.popstateIgnore) > -1) {\n return;\n }\n\n this.reset();\n this.getStateOptions();\n }\n }, {\n key: \"reset\",\n value: function reset() {\n if (this.isLoading) {\n this.controller.abort();\n this.isLoading = false;\n this.controller = new AbortController();\n }\n\n window.clearTimeout(this.enterTimeout);\n\n if (this.isInserted) {\n this.removeContainer();\n }\n\n this.classContainer = this.html;\n Object.assign(this, this.defaults, this.options);\n }\n }, {\n key: \"getClickOptions\",\n value: function getClickOptions(link) {\n this.transition = link.getAttribute('data-' + this.name);\n this.isUrl = link.getAttribute('data-' + this.name + '-url');\n var href = link.getAttribute('href');\n var target = link.getAttribute('target');\n\n if (target == '_blank') {\n window.open(href, '_blank');\n return;\n }\n\n if (this.transition == 'false') {\n window.location = href;\n return;\n }\n\n this.setOptions(href, true);\n }\n }, {\n key: \"getStateOptions\",\n value: function getStateOptions() {\n if (this.transitionsHistory) {\n this.transition = history.state;\n } else {\n this.transition = false;\n }\n\n var href = window.location.href;\n this.setOptions(href);\n }\n }, {\n key: \"goTo\",\n value: function goTo(href, transition, isUrl) {\n this.reset();\n this.transition = transition;\n this.isUrl = isUrl;\n this.setOptions(href, true);\n }\n }, {\n key: \"setOptions\",\n value: function setOptions(href, push) {\n var container = '[' + this.container + ']';\n var oldContainer;\n\n if (this.transition && this.transition != 'true') {\n this.transitionContainer = '[' + this.container + '=\"' + this.transition + '\"]';\n this.loadingClass = this.transitions[this.transition].loadingClass || this.loadingClass;\n this.loadedClass = this.transitions[this.transition].loadedClass || this.loadedClass;\n this.readyClass = this.transitions[this.transition].readyClass || this.readyClass;\n this.transitionsPrefix = this.transitions[this.transition].transitionsPrefix || this.transitionsPrefix;\n this.enterDelay = this.transitions[this.transition].enterDelay || this.enterDelay;\n this.exitDelay = this.transitions[this.transition].exitDelay || this.exitDelay;\n this.loadedDelay = this.transitions[this.transition].loadedDelay || this.loadedDelay;\n oldContainer = document.querySelector(this.transitionContainer);\n }\n\n if (oldContainer) {\n container = this.transitionContainer;\n this.oldContainer = oldContainer;\n this.classContainer = this.oldContainer.parentNode;\n\n if (!this.subContainer) {\n history.replaceState(this.transition, null, this.href);\n }\n\n this.subContainer = true;\n } else {\n this.oldContainer = document.querySelector(container);\n\n if (this.subContainer) {\n history.replaceState(this.prevTransition, null, this.href);\n }\n\n this.subContainer = false;\n }\n\n this.href = href;\n this.parentContainer = this.oldContainer.parentNode;\n\n if (this.isUrl === '' || this.isUrl != null && this.isUrl != 'false' && this.isUrl != false) {\n history.pushState(this.transition, null, href);\n } else {\n this.oldContainer.classList.add('is-old');\n this.setLoading();\n this.startEnterDelay();\n this.loadHref(href, container, push);\n }\n }\n }, {\n key: \"setLoading\",\n value: function setLoading() {\n this.classContainer.classList.remove(this.loadedClass, this.readyClass);\n this.classContainer.classList.add(this.loadingClass);\n this.classContainer.classList.remove(this.transitionsPrefix + this.prevTransition);\n\n if (this.transition) {\n this.classContainer.classList.add(this.transitionsPrefix + this.transition);\n }\n\n if (!this.subContainer) {\n this.prevTransition = this.transition;\n }\n\n var loadingEvent = new Event(this.namespace + 'loading');\n window.dispatchEvent(loadingEvent);\n }\n }, {\n key: \"startEnterDelay\",\n value: function startEnterDelay() {\n var _this2 = this;\n\n this.enterTimeout = window.setTimeout(function () {\n _this2.isEntered = true;\n\n if (_this2.isLoaded) {\n _this2.transitionContainers();\n }\n }, this.enterDelay);\n }\n }, {\n key: \"loadHref\",\n value: function loadHref(href, container, push) {\n var _this3 = this;\n\n this.isLoading = true;\n var signal = this.controller.signal;\n fetch(href, {\n signal: signal\n }).then(function (response) {\n return response.text();\n }).then(function (data) {\n if (push) {\n history.pushState(_this3.transition, null, href);\n }\n\n var parser = new DOMParser();\n _this3.data = parser.parseFromString(data, 'text/html');\n _this3.newContainer = _this3.data.querySelector(container);\n\n _this3.newContainer.classList.add('is-new');\n\n _this3.parentNewContainer = _this3.newContainer.parentNode;\n\n _this3.hideContainer();\n\n _this3.parentContainer.insertBefore(_this3.newContainer, _this3.oldContainer);\n\n _this3.isInserted = true;\n\n _this3.setSvgs();\n\n _this3.isLoaded = true;\n\n if (_this3.isEntered) {\n _this3.transitionContainers();\n }\n\n _this3.loadEls(_this3.newContainer);\n\n _this3.isLoading = false;\n })[\"catch\"](function (err) {\n window.location = href;\n });\n }\n }, {\n key: \"transitionContainers\",\n value: function transitionContainers() {\n var _this4 = this;\n\n this.setAttributes();\n this.showContainer();\n this.setLoaded();\n setTimeout(function () {\n _this4.removeContainer();\n\n _this4.setReady();\n }, this.exitDelay);\n }\n }, {\n key: \"setSvgs\",\n value: function setSvgs() {\n if (this.isChrome) {\n var svgs = this.newContainer.querySelectorAll('use');\n\n if (svgs.length) {\n svgs.forEach(function (svg) {\n var xhref = svg.getAttribute('xlink:href');\n\n if (xhref) {\n svg.parentNode.innerHTML = '';\n } else {\n var href = svg.getAttribute('href');\n if (href) svg.parentNode.innerHTML = '';\n }\n });\n }\n }\n }\n }, {\n key: \"setAttributes\",\n value: function setAttributes() {\n var _this5 = this;\n\n var title = this.data.getElementsByTagName('title')[0];\n var newDesc = this.data.head.querySelector('meta[name=\"description\"]');\n var oldDesc = document.head.querySelector('meta[name=\"description\"]');\n var container;\n var newContainer;\n\n if (this.subContainer) {\n newContainer = this.parentNewContainer;\n container = document.querySelector(this.transitionContainer).parentNode;\n } else {\n newContainer = this.data.querySelector('html');\n container = document.querySelector('html');\n }\n\n var datas = Object.assign({}, newContainer.dataset);\n if (title) document.title = title.innerText;\n if (oldDesc && newDesc) oldDesc.setAttribute('content', newDesc.getAttribute('content'));\n\n if (datas) {\n Object.entries(datas).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n val = _ref2[1];\n\n container.setAttribute('data-' + _this5.toDash(key), val);\n });\n }\n }\n }, {\n key: \"toDash\",\n value: function toDash(str) {\n return str.split(/(?=[A-Z])/).join('-').toLowerCase();\n }\n }, {\n key: \"hideContainer\",\n value: function hideContainer() {\n this.newContainer.style.visibility = 'hidden';\n this.newContainer.style.height = 0;\n this.newContainer.style.overflow = 'hidden';\n }\n }, {\n key: \"showContainer\",\n value: function showContainer() {\n this.newContainer.style.visibility = '';\n this.newContainer.style.height = '';\n this.newContainer.style.overflow = '';\n }\n }, {\n key: \"loadEls\",\n value: function loadEls(container) {\n var _this6 = this;\n\n var promises = [];\n this.loadAttributes.forEach(function (attr) {\n var data = 'data-' + _this6.name + '-' + attr;\n var els = container.querySelectorAll('[' + data + ']');\n\n if (els.length) {\n els.forEach(function (el) {\n var elData = el.getAttribute(data);\n el.setAttribute(attr, elData);\n\n if (attr == 'src' || attr == 'srcset') {\n var promise = new Promise(function (resolve) {\n el.onload = function () {\n return resolve(el);\n };\n });\n promises.push(promise);\n }\n });\n }\n });\n Promise.all(promises).then(function (val) {\n var imagesEvent = new Event(_this6.namespace + 'images');\n window.dispatchEvent(imagesEvent);\n });\n }\n }, {\n key: \"setLoaded\",\n value: function setLoaded() {\n var _this7 = this;\n\n this.classContainer.classList.remove(this.loadingClass);\n setTimeout(function () {\n _this7.classContainer.classList.add(_this7.loadedClass);\n }, this.loadedDelay);\n var loadedEvent = new Event(this.namespace + 'loaded');\n window.dispatchEvent(loadedEvent);\n }\n }, {\n key: \"removeContainer\",\n value: function removeContainer() {\n this.parentContainer.removeChild(this.oldContainer);\n this.newContainer.classList.remove('is-new');\n this.isInserted = false;\n }\n }, {\n key: \"setReady\",\n value: function setReady() {\n this.classContainer.classList.add(this.readyClass);\n var readyEvent = new Event(this.namespace + 'ready');\n window.dispatchEvent(readyEvent);\n }\n }, {\n key: \"on\",\n value: function on(event, func) {\n var _this8 = this;\n\n window.addEventListener(this.namespace + event, function () {\n switch (event) {\n case 'loading':\n return func(_this8.transition, _this8.oldContainer);\n\n case 'loaded':\n return func(_this8.transition, _this8.oldContainer, _this8.newContainer);\n\n case 'ready':\n return func(_this8.transition, _this8.newContainer);\n\n default:\n return func();\n }\n }, false);\n }\n }]);\n\n return _default;\n}();\n\nexport default _default;\n", "import { module } from 'modujs';\nimport modularLoad from 'modularload';\n\nexport default class extends module {\n constructor(m) {\n super(m);\n }\n\n init() {\n const load = new modularLoad({\n enterDelay: 0,\n transitions: {\n customTransition: {}\n }\n });\n\n load.on('loaded', (transition, oldContainer, newContainer) => {\n this.call('destroy', oldContainer, 'app');\n this.call('update', newContainer, 'app');\n });\n }\n}\n", "import { CSS_CLASS } from '../config'\n\n/**\n * Get an image meta data\n *\n * @param {HTMLImageElement} $img - The image element.\n * @return {object} The given image meta data\n */\n\nconst getImageMetadata = $img => ({\n url: $img.src,\n width: $img.naturalWidth,\n height: $img.naturalHeight,\n ratio: $img.naturalWidth / $img.naturalHeight,\n})\n\n\n/**\n * Load the given image.\n *\n * @param {string} url - The URI to lazy load into $el.\n * @param {object} options - An object of options\n * @return {void}\n */\n\nconst loadImage = (url, options = {}) => {\n return new Promise((resolve, reject) => {\n const $img = new Image()\n\n if (options.crossOrigin) {\n $img.crossOrigin = options.crossOrigin\n }\n\n const loadCallback = () => {\n resolve({\n element: $img,\n ...getImageMetadata($img),\n })\n }\n\n if($img.decode) {\n $img.src = url\n $img.decode().then(loadCallback).catch(e => {\n reject(e)\n })\n } else {\n $img.onload = loadCallback\n $img.onerror = (e) => {\n reject(e)\n }\n $img.src = url\n }\n })\n}\n\n\n/**\n * Lazy load the given image.\n *\n * @param {HTMLImageElement} $el - The image element.\n * @param {?string} url - The URI to lazy load into $el.\n * If falsey, the value of the `data-src` attribute on $el will be used as the URI.\n * @param {?function} callback - A function to call when the image is loaded.\n * @return {void}\n */\n\nconst LAZY_LOADED_IMAGES = []\nconst lazyLoadImage = async ($el, url, callback) => {\n let src = url ? url : $el.dataset.src\n\n let loadedImage = LAZY_LOADED_IMAGES.find(image => image.url === src)\n\n if (!loadedImage) {\n loadedImage = await loadImage(src)\n\n if (!loadedImage.url) {\n return\n }\n\n LAZY_LOADED_IMAGES.push(loadedImage)\n }\n\n if($el.src === src) {\n return\n }\n\n if ($el.tagName === 'IMG') {\n $el.src = loadedImage.url\n } else {\n $el.style.backgroundImage = `url(${loadedImage.url})`\n }\n\n requestAnimationFrame(() => {\n let lazyParent = $el.closest(`.${CSS_CLASS.LAZY_CONTAINER}`)\n\n if(lazyParent) {\n lazyParent.classList.add(CSS_CLASS.LAZY_LOADED)\n lazyParent.style.backgroundImage = ''\n }\n\n $el.classList.add(CSS_CLASS.LAZY_LOADED)\n\n callback?.()\n })\n}\n\n\nexport {\n getImageMetadata,\n loadImage,\n lazyLoadImage\n}\n", "// Clamp a value between a minimum and maximum value\r\nexport function clamp(min, input, max) {\r\n return Math.max(min, Math.min(input, max))\r\n}\r\n\r\n// Truncate a floating-point number to a specified number of decimal places\r\nexport function truncate(value, decimals = 0) {\r\n return parseFloat(value.toFixed(decimals))\r\n}\r\n\r\n// Linearly interpolate between two values using an amount (0 <= t <= 1)\r\nexport function lerp(x, y, t) {\r\n return (1 - t) * x + t * y\r\n}\r\n\r\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\r\nexport function damp(x, y, lambda, dt) {\r\n return lerp(x, y, 1 - Math.exp(-lambda * dt))\r\n}\r\n\r\n// Calculate the modulo of the dividend and divisor while keeping the result within the same sign as the divisor\r\n// https://anguscroll.com/just/just-modulo\r\nexport function modulo(n, d) {\r\n return ((n % d) + d) % d\r\n}\r\n", "import { clamp, damp } from './maths'\r\n\r\n// Animate class to handle value animations with lerping or easing\r\nexport class Animate {\r\n // Advance the animation by the given delta time\r\n advance(deltaTime) {\r\n if (!this.isRunning) return\r\n\r\n let completed = false\r\n\r\n if (this.lerp) {\r\n this.value = damp(this.value, this.to, this.lerp * 60, deltaTime)\r\n if (Math.round(this.value) === this.to) {\r\n this.value = this.to\r\n completed = true\r\n }\r\n } else {\r\n this.currentTime += deltaTime\r\n const linearProgress = clamp(0, this.currentTime / this.duration, 1)\r\n\r\n completed = linearProgress >= 1\r\n const easedProgress = completed ? 1 : this.easing(linearProgress)\r\n this.value = this.from + (this.to - this.from) * easedProgress\r\n }\r\n\r\n // Call the onUpdate callback with the current value and completed status\r\n\r\n this.onUpdate?.(this.value, completed)\r\n\r\n if (completed) {\r\n this.stop()\r\n }\r\n }\r\n\r\n // Stop the animation\r\n stop() {\r\n this.isRunning = false\r\n }\r\n\r\n // Set up the animation from a starting value to an ending value\r\n // with optional parameters for lerping, duration, easing, and onUpdate callback\r\n fromTo(\r\n from,\r\n to,\r\n { lerp = 0.1, duration = 1, easing = (t) => t, onStart, onUpdate }\r\n ) {\r\n this.from = this.value = from\r\n this.to = to\r\n this.lerp = lerp\r\n this.duration = duration\r\n this.easing = easing\r\n this.currentTime = 0\r\n this.isRunning = true\r\n\r\n onStart?.()\r\n this.onUpdate = onUpdate\r\n }\r\n}\r\n", "import { debounce } from './debounce'\r\n\r\nexport class Dimensions {\r\n constructor({ wrapper, content, autoResize = true } = {}) {\r\n this.wrapper = wrapper\r\n this.content = content\r\n\r\n if (autoResize) {\r\n const resize = debounce(this.resize, 250)\r\n\r\n if (this.wrapper !== window) {\r\n this.wrapperResizeObserver = new ResizeObserver(resize)\r\n this.wrapperResizeObserver.observe(this.wrapper)\r\n }\r\n\r\n this.contentResizeObserver = new ResizeObserver(resize)\r\n this.contentResizeObserver.observe(this.content)\r\n }\r\n\r\n this.resize()\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver?.disconnect()\r\n this.contentResizeObserver?.disconnect()\r\n }\r\n\r\n resize = () => {\r\n this.onWrapperResize()\r\n this.onContentResize()\r\n }\r\n\r\n onWrapperResize = () => {\r\n if (this.wrapper === window) {\r\n this.width = window.innerWidth\r\n this.height = window.innerHeight\r\n } else {\r\n this.width = this.wrapper.clientWidth\r\n this.height = this.wrapper.clientHeight\r\n }\r\n }\r\n\r\n onContentResize = () => {\r\n this.scrollHeight = this.content.scrollHeight\r\n this.scrollWidth = this.content.scrollWidth\r\n }\r\n\r\n get limit() {\r\n return {\r\n x: this.scrollWidth - this.width,\r\n y: this.scrollHeight - this.height,\r\n }\r\n }\r\n}\r\n", "export function debounce(callback, delay) {\r\n let timer\r\n return function () {\r\n let args = arguments\r\n let context = this\r\n clearTimeout(timer)\r\n timer = setTimeout(function () {\r\n callback.apply(context, args)\r\n }, delay)\r\n }\r\n}\r\n", "export class Emitter {\r\n constructor() {\r\n this.events = {}\r\n }\r\n\r\n emit(event, ...args) {\r\n let callbacks = this.events[event] || []\r\n for (let i = 0, length = callbacks.length; i < length; i++) {\r\n callbacks[i](...args)\r\n }\r\n }\r\n\r\n on(event, cb) {\r\n // Add the callback to the event's callback list, or create a new list with the callback\r\n this.events[event]?.push(cb) || (this.events[event] = [cb])\r\n\r\n // Return an unsubscribe function\r\n return () => {\r\n this.events[event] = this.events[event]?.filter((i) => cb !== i)\r\n }\r\n }\r\n\r\n off(event, callback) {\r\n this.events[event] = this.events[event]?.filter((i) => callback !== i)\r\n }\r\n\r\n destroy() {\r\n this.events = {}\r\n }\r\n}\r\n", "import { Emitter } from './emitter'\r\nimport { clamp } from './maths'\r\n\r\nexport class VirtualScroll {\r\n constructor(\r\n element,\r\n { wheelMultiplier = 1, touchMultiplier = 2, normalizeWheel = false }\r\n ) {\r\n this.element = element\r\n this.wheelMultiplier = wheelMultiplier\r\n this.touchMultiplier = touchMultiplier\r\n this.normalizeWheel = normalizeWheel\r\n\r\n this.touchStart = {\r\n x: null,\r\n y: null,\r\n }\r\n\r\n this.emitter = new Emitter()\r\n\r\n this.element.addEventListener('wheel', this.onWheel, { passive: false })\r\n this.element.addEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Add an event listener for the given event and callback\r\n on(event, callback) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n // Remove all event listeners and clean up\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n this.element.removeEventListener('wheel', this.onWheel, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Event handler for 'touchstart' event\r\n onTouchStart = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: 0,\r\n y: 0,\r\n }\r\n }\r\n\r\n // Event handler for 'touchmove' event\r\n onTouchMove = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n const deltaX = -(clientX - this.touchStart.x) * this.touchMultiplier\r\n const deltaY = -(clientY - this.touchStart.y) * this.touchMultiplier\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: deltaX,\r\n y: deltaY,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX,\r\n deltaY,\r\n event,\r\n })\r\n }\r\n\r\n onTouchEnd = (event) => {\r\n this.emitter.emit('scroll', {\r\n deltaX: this.lastDelta.x,\r\n deltaY: this.lastDelta.y,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'wheel' event\r\n onWheel = (event) => {\r\n let { deltaX, deltaY } = event\r\n\r\n if (this.normalizeWheel) {\r\n deltaX = clamp(-100, deltaX, 100)\r\n deltaY = clamp(-100, deltaY, 100)\r\n }\r\n\r\n deltaX *= this.wheelMultiplier\r\n deltaY *= this.wheelMultiplier\r\n\r\n this.emitter.emit('scroll', { deltaX, deltaY, event })\r\n }\r\n}\r\n", "import { version } from '../package.json'\r\nimport { Animate } from './animate'\r\nimport { Dimensions } from './dimensions'\r\nimport { Emitter } from './emitter'\r\nimport { clamp, modulo } from './maths'\r\nimport { VirtualScroll } from './virtual-scroll'\r\n\r\n// Technical explanation\r\n// - listen to 'wheel' events\r\n// - prevent 'wheel' event to prevent scroll\r\n// - normalize wheel delta\r\n// - add delta to targetScroll\r\n// - animate scroll to targetScroll (smooth context)\r\n// - if animation is not running, listen to 'scroll' events (native context)\r\n\r\nexport default class Lenis {\r\n // isScrolling = true when scroll is animating\r\n // isStopped = true if user should not be able to scroll - enable/disable programmatically\r\n // isSmooth = true if scroll should be animated\r\n // isLocked = same as isStopped but enabled/disabled when scroll reaches target\r\n\r\n /**\r\n * @typedef {(t: number) => number} EasingFunction\r\n * @typedef {'vertical' | 'horizontal'} Orientation\r\n * @typedef {'vertical' | 'horizontal' | 'both'} GestureOrientation\r\n *\r\n * @typedef LenisOptions\r\n * @property {Window | HTMLElement} [wrapper]\r\n * @property {HTMLElement} [content]\r\n * @property {Window | HTMLElement} [wheelEventsTarget] // deprecated\r\n * @property {Window | HTMLElement} [eventsTarget]\r\n * @property {boolean} [smoothWheel]\r\n * @property {boolean} [smoothTouch]\r\n * @property {boolean} [syncTouch]\r\n * @property {number} [syncTouchLerp]\r\n * @property {number} [__iosNoInertiaSyncTouchLerp]\r\n * @property {number} [touchInertiaMultiplier]\r\n * @property {number} [duration]\r\n * @property {EasingFunction} [easing]\r\n * @property {number} [lerp]\r\n * @property {boolean} [infinite]\r\n * @property {Orientation} [orientation]\r\n * @property {GestureOrientation} [gestureOrientation]\r\n * @property {number} [touchMultiplier]\r\n * @property {number} [wheelMultiplier]\r\n * @property {boolean} [normalizeWheel]\r\n * @property {boolean} [autoResize]\r\n *\r\n * @param {LenisOptions}\r\n */\r\n constructor({\r\n wrapper = window,\r\n content = document.documentElement,\r\n wheelEventsTarget = wrapper, // deprecated\r\n eventsTarget = wheelEventsTarget,\r\n smoothWheel = true,\r\n smoothTouch = false,\r\n syncTouch = false,\r\n syncTouchLerp = 0.1,\r\n __iosNoInertiaSyncTouchLerp = 0.4, // should be 1 but had to leave 0.4 for iOS (testing purpose)\r\n touchInertiaMultiplier = 35,\r\n duration, // in seconds\r\n easing = (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),\r\n lerp = !duration && 0.1,\r\n infinite = false,\r\n orientation = 'vertical', // vertical, horizontal\r\n gestureOrientation = 'vertical', // vertical, horizontal, both\r\n touchMultiplier = 1,\r\n wheelMultiplier = 1,\r\n normalizeWheel = false,\r\n autoResize = true,\r\n } = {}) {\r\n window.lenisVersion = version\r\n\r\n // if wrapper is html or body, fallback to window\r\n if (wrapper === document.documentElement || wrapper === document.body) {\r\n wrapper = window\r\n }\r\n\r\n this.options = {\r\n wrapper,\r\n content,\r\n wheelEventsTarget,\r\n eventsTarget,\r\n smoothWheel,\r\n smoothTouch,\r\n syncTouch,\r\n syncTouchLerp,\r\n __iosNoInertiaSyncTouchLerp,\r\n touchInertiaMultiplier,\r\n duration,\r\n easing,\r\n lerp,\r\n infinite,\r\n gestureOrientation,\r\n orientation,\r\n touchMultiplier,\r\n wheelMultiplier,\r\n normalizeWheel,\r\n autoResize,\r\n }\r\n\r\n this.animate = new Animate()\r\n this.emitter = new Emitter()\r\n this.dimensions = new Dimensions({ wrapper, content, autoResize })\r\n this.toggleClass('lenis', true)\r\n\r\n this.velocity = 0\r\n this.isLocked = false\r\n this.isStopped = false\r\n this.isSmooth = syncTouch || smoothWheel || smoothTouch\r\n this.isScrolling = false\r\n this.targetScroll = this.animatedScroll = this.actualScroll\r\n\r\n this.options.wrapper.addEventListener('scroll', this.onScroll, {\r\n passive: false,\r\n })\r\n\r\n this.virtualScroll = new VirtualScroll(eventsTarget, {\r\n touchMultiplier,\r\n wheelMultiplier,\r\n normalizeWheel,\r\n })\r\n this.virtualScroll.on('scroll', this.onVirtualScroll)\r\n }\r\n\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n this.options.wrapper.removeEventListener('scroll', this.onScroll, {\r\n passive: false,\r\n })\r\n\r\n this.virtualScroll.destroy()\r\n this.dimensions.destroy()\r\n\r\n this.toggleClass('lenis', false)\r\n this.toggleClass('lenis-smooth', false)\r\n this.toggleClass('lenis-scrolling', false)\r\n this.toggleClass('lenis-stopped', false)\r\n this.toggleClass('lenis-locked', false)\r\n }\r\n\r\n on(event, callback) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n off(event, callback) {\r\n return this.emitter.off(event, callback)\r\n }\r\n\r\n setScroll(scroll) {\r\n // apply scroll value immediately\r\n if (this.isHorizontal) {\r\n this.rootElement.scrollLeft = scroll\r\n } else {\r\n this.rootElement.scrollTop = scroll\r\n }\r\n }\r\n\r\n onVirtualScroll = ({ deltaX, deltaY, event }) => {\r\n // keep zoom feature\r\n if (event.ctrlKey) return\r\n\r\n const isTouch = event.type.includes('touch')\r\n const isWheel = event.type.includes('wheel')\r\n\r\n if (\r\n (this.options.gestureOrientation === 'both' &&\r\n deltaX === 0 &&\r\n deltaY === 0) || // \"touchend\" events prevents \"click\"\r\n (this.options.gestureOrientation === 'vertical' && deltaY === 0) || // trackpad previous/next page gesture\r\n (this.options.gestureOrientation === 'horizontal' && deltaX === 0) ||\r\n (isTouch &&\r\n this.options.gestureOrientation === 'vertical' &&\r\n this.scroll === 0 &&\r\n !this.options.infinite &&\r\n deltaY <= 0) // touch pull to refresh\r\n )\r\n return\r\n\r\n // catch if scrolling on nested scroll elements\r\n let composedPath = event.composedPath()\r\n composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement)) // remove parents elements\r\n\r\n if (\r\n !!composedPath.find(\r\n (node) =>\r\n node.hasAttribute?.('data-lenis-prevent') ||\r\n (isTouch && node.hasAttribute?.('data-lenis-prevent-touch')) ||\r\n (isWheel && node.hasAttribute?.('data-lenis-prevent-wheel')) ||\r\n node.classList?.contains('lenis') // nested lenis instance\r\n )\r\n )\r\n return\r\n\r\n if (this.isStopped || this.isLocked) {\r\n event.preventDefault()\r\n return\r\n }\r\n\r\n this.isSmooth =\r\n ((this.options.smoothTouch || this.options.syncTouch) && isTouch) ||\r\n (this.options.smoothWheel && isWheel)\r\n\r\n if (!this.isSmooth) {\r\n this.isScrolling = false\r\n this.animate.stop()\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n\r\n let delta = deltaY\r\n if (this.options.gestureOrientation === 'both') {\r\n delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX\r\n } else if (this.options.gestureOrientation === 'horizontal') {\r\n delta = deltaX\r\n }\r\n\r\n const syncTouch = isTouch && this.options.syncTouch\r\n const isTouchEnd = isTouch && event.type === 'touchend'\r\n const hasTouchInertia = isTouchEnd && Math.abs(delta) > 1\r\n if (hasTouchInertia) {\r\n delta = this.velocity * this.options.touchInertiaMultiplier\r\n }\r\n\r\n this.scrollTo(this.targetScroll + delta, {\r\n programmatic: false,\r\n ...(syncTouch && {\r\n lerp: hasTouchInertia\r\n ? this.syncTouchLerp\r\n : this.options.__iosNoInertiaSyncTouchLerp,\r\n }),\r\n })\r\n }\r\n\r\n resize() {\r\n this.dimensions.resize()\r\n }\r\n\r\n emit() {\r\n this.emitter.emit('scroll', this)\r\n }\r\n\r\n onScroll = () => {\r\n if (!this.isScrolling) {\r\n const lastScroll = this.animatedScroll\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.velocity = 0\r\n this.direction = Math.sign(this.animatedScroll - lastScroll)\r\n this.emit()\r\n }\r\n }\r\n\r\n reset() {\r\n this.isLocked = false\r\n this.isScrolling = false\r\n this.velocity = 0\r\n this.animate.stop()\r\n }\r\n\r\n start() {\r\n this.isStopped = false\r\n\r\n this.reset()\r\n }\r\n\r\n stop() {\r\n this.isStopped = true\r\n this.animate.stop()\r\n\r\n this.reset()\r\n }\r\n\r\n raf(time) {\r\n const deltaTime = time - (this.time || time)\r\n this.time = time\r\n\r\n this.animate.advance(deltaTime * 0.001)\r\n }\r\n\r\n scrollTo(\r\n target,\r\n {\r\n offset = 0,\r\n immediate = false,\r\n lock = false,\r\n duration = this.options.duration,\r\n easing = this.options.easing,\r\n lerp = !duration && this.options.lerp,\r\n onComplete = null,\r\n force = false, // scroll even if stopped\r\n programmatic = true, // called from outside of the class\r\n } = {}\r\n ) {\r\n if ((this.isStopped || this.isLocked) && !force) return\r\n\r\n // keywords\r\n if (['top', 'left', 'start'].includes(target)) {\r\n target = 0\r\n } else if (['bottom', 'right', 'end'].includes(target)) {\r\n target = this.limit\r\n } else {\r\n let node\r\n\r\n if (typeof target === 'string') {\r\n // CSS selector\r\n node = document.querySelector(target)\r\n } else if (target?.nodeType) {\r\n // Node element\r\n node = target\r\n }\r\n\r\n if (node) {\r\n if (this.options.wrapper !== window) {\r\n // nested scroll offset correction\r\n const wrapperRect = this.options.wrapper.getBoundingClientRect()\r\n offset -= this.isHorizontal ? wrapperRect.left : wrapperRect.top\r\n }\r\n\r\n const rect = node.getBoundingClientRect()\r\n\r\n target =\r\n (this.isHorizontal ? rect.left : rect.top) + this.animatedScroll\r\n }\r\n }\r\n\r\n if (typeof target !== 'number') return\r\n\r\n target += offset\r\n target = Math.round(target)\r\n\r\n if (this.options.infinite) {\r\n if (programmatic) {\r\n this.targetScroll = this.animatedScroll = this.scroll\r\n }\r\n } else {\r\n target = clamp(0, target, this.limit)\r\n }\r\n\r\n if (immediate) {\r\n this.animatedScroll = this.targetScroll = target\r\n this.setScroll(this.scroll)\r\n this.reset()\r\n onComplete?.(this)\r\n return\r\n }\r\n\r\n if (!programmatic) {\r\n if (target === this.targetScroll) return\r\n\r\n this.targetScroll = target\r\n }\r\n\r\n this.animate.fromTo(this.animatedScroll, target, {\r\n duration,\r\n easing,\r\n lerp,\r\n onStart: () => {\r\n // started\r\n if (lock) this.isLocked = true\r\n this.isScrolling = true\r\n },\r\n onUpdate: (value, completed) => {\r\n this.isScrolling = true\r\n\r\n // updated\r\n this.velocity = value - this.animatedScroll\r\n this.direction = Math.sign(this.velocity)\r\n\r\n this.animatedScroll = value\r\n this.setScroll(this.scroll)\r\n\r\n if (programmatic) {\r\n // wheel during programmatic should stop it\r\n this.targetScroll = value\r\n }\r\n\r\n if (!completed) this.emit()\r\n\r\n if (completed) {\r\n // avoid emitting twice (onScroll)\r\n requestAnimationFrame(() => {\r\n this.reset()\r\n this.emit()\r\n onComplete?.(this)\r\n })\r\n }\r\n },\r\n })\r\n }\r\n\r\n get rootElement() {\r\n return this.options.wrapper === window\r\n ? this.options.content\r\n : this.options.wrapper\r\n }\r\n\r\n get limit() {\r\n return this.dimensions.limit[this.isHorizontal ? 'x' : 'y']\r\n }\r\n\r\n get isHorizontal() {\r\n return this.options.orientation === 'horizontal'\r\n }\r\n\r\n get actualScroll() {\r\n // value browser takes into account\r\n return this.isHorizontal\r\n ? this.rootElement.scrollLeft\r\n : this.rootElement.scrollTop\r\n }\r\n\r\n get scroll() {\r\n return this.options.infinite\r\n ? modulo(this.animatedScroll, this.limit)\r\n : this.animatedScroll\r\n }\r\n\r\n get progress() {\r\n // avoid progress to be NaN\r\n return this.limit === 0 ? 1 : this.scroll / this.limit\r\n }\r\n\r\n get isSmooth() {\r\n return this.__isSmooth\r\n }\r\n\r\n set isSmooth(value) {\r\n if (this.__isSmooth !== value) {\r\n this.__isSmooth = value\r\n this.toggleClass('lenis-smooth', value)\r\n }\r\n }\r\n\r\n get isScrolling() {\r\n return this.__isScrolling\r\n }\r\n\r\n set isScrolling(value) {\r\n if (this.__isScrolling !== value) {\r\n this.__isScrolling = value\r\n this.toggleClass('lenis-scrolling', value)\r\n }\r\n }\r\n\r\n get isStopped() {\r\n return this.__isStopped\r\n }\r\n\r\n set isStopped(value) {\r\n if (this.__isStopped !== value) {\r\n this.__isStopped = value\r\n this.toggleClass('lenis-stopped', value)\r\n }\r\n }\r\n\r\n get isLocked() {\r\n return this.__isLocked\r\n }\r\n\r\n set isLocked(value) {\r\n if (this.__isLocked !== value) {\r\n this.__isLocked = value\r\n this.toggleClass('lenis-locked', value)\r\n }\r\n }\r\n\r\n get className() {\r\n let className = 'lenis'\r\n if (this.isStopped) className += ' lenis-stopped'\r\n if (this.isLocked) className += ' lenis-locked'\r\n if (this.isScrolling) className += ' lenis-scrolling'\r\n if (this.isSmooth) className += ' lenis-smooth'\r\n return className\r\n }\r\n\r\n toggleClass(name, value) {\r\n this.rootElement.classList.toggle(name, value)\r\n this.emitter.emit('className change', this)\r\n }\r\n}\r\n", "/**\n * Intersection Observer\n *\n * Detecting visibility of an element in the viewport.\n *\n * Features functions to:\n *\n * - Trigger inview/outOfView callbacks\n * - If the element has a requestAnimationFrame dependency, set interactivy status for the ScrollElement Class\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API}\n */\n\nimport { IIOOptions } from '../types';\nimport ScrollElement from './ScrollElement';\n\nexport default class IO {\n public scrollElements: ScrollElement[];\n private rootMargin: string;\n private IORaf: boolean;\n private observer!: IntersectionObserver;\n\n constructor({\n scrollElements,\n rootMargin = '-1px -1px -1px -1px',\n IORaf,\n }: IIOOptions) {\n // Parameters\n this.scrollElements = scrollElements;\n this.rootMargin = rootMargin;\n this.IORaf = IORaf;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Intersection Observer.\n *\n * @private\n */\n private _init() {\n // Options\n const observerOptions = {\n rootMargin: this.rootMargin,\n };\n\n // Callback\n const onIntersect = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n", "// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n", "/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange } from '../utils/maths';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n", "/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n", "/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n", "//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance.destroy();\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n", "import { module } from 'modujs'\nimport { lazyLoadImage } from '../utils/image'\nimport LocomotiveScroll from 'locomotive-scroll'\n\nexport default class extends module {\n constructor(m) {\n super(m);\n }\n\n init() {\n this.scroll = new LocomotiveScroll({\n modularInstance: this,\n })\n\n // // Force scroll to top\n // if (history.scrollRestoration) {\n // history.scrollRestoration = 'manual'\n // window.scrollTo(0, 0)\n // }\n }\n\n /**\n * Lazy load the related image.\n *\n * @see ../utils/image.js\n *\n * It is recommended to wrap your `` into an element with the\n * CSS class name `.c-lazy`. The CSS class name modifier `.-lazy-loaded`\n * will be applied on both the image and the parent wrapper.\n *\n * ```html\n *
\n * \"\"\n *
\n * ```\n *\n * @param {LocomotiveScroll} args - The Locomotive Scroll instance.\n */\n lazyLoad(args) {\n lazyLoadImage(args.target, null, () => {\n //callback\n })\n }\n\n scrollTo(params) {\n let { target, ...options } = params\n\n options = Object.assign({\n // Defaults\n duration: 1,\n }, options)\n\n this.scroll?.scrollTo(target, options)\n }\n\n destroy() {\n this.scroll.destroy();\n }\n}\n", "import svg4everybody from 'svg4everybody';\nimport { ENV } from './config';\n\n// Dynamic imports for development mode only\nlet gridHelper;\n(async () => {\n if (ENV.IS_DEV) {\n const gridHelperModule = await import('./utils/grid-helper');\n gridHelper = gridHelperModule?.gridHelper;\n }\n})();\n\nexport default function () {\n /**\n * Use external SVG spritemaps\n */\n svg4everybody();\n\n /**\n * Add grid helper\n */\n gridHelper?.();\n}\n", "/**\n * Creates a debounced function.\n *\n * A debounced function delays invoking `callback` until after\n * `delay` milliseconds have elapsed since the last time the\n * debounced function was invoked.\n *\n * Useful for behaviour that should only happen _before_ or\n * _after_ an event has stopped occurring.\n *\n * @template {function} T\n *\n * @param {T} callback - The function to debounce.\n * @param {number} delay - The number of milliseconds to wait.\n * @param {boolean} [immediate] -\n * If `true`, `callback` is invoked before `delay`.\n * If `false`, `callback` is invoked after `delay`.\n * @return {function} The new debounced function.\n */\n\nconst debounce = (callback, delay, immediate = false) => {\n let timeout = null\n\n return (...args) => {\n clearTimeout(timeout)\n\n const later = () => {\n timeout = null\n if (!immediate) {\n callback(...args)\n }\n }\n\n if (immediate && !timeout) {\n callback(...args)\n }\n\n timeout = setTimeout(later, delay)\n }\n}\n\n\n/**\n * Creates a throttled function.\n *\n * A throttled function invokes `callback` at most once per every\n * `delay` milliseconds.\n *\n * Useful for rate-limiting an event that occurs in quick succession.\n *\n * @template {function} T\n *\n * @param {T} callback - The function to throttle.\n * @param {number} delay - The number of milliseconds to wait.\n * @return {function} The new throttled function.\n */\n\nconst throttle = (callback, delay) => {\n let timeout = false\n\n return (...args) => {\n if (!timeout) {\n timeout = true\n\n callback(...args)\n\n setTimeout(() => {\n timeout = false\n }, delay)\n }\n }\n}\n\n\nexport {\n debounce,\n throttle\n}\n", "const $html = document.documentElement\nconst $body = document.body\n\nexport {\n $html,\n $body,\n}\n", "import modular from 'modujs';\nimport * as modules from './modules';\nimport globals from './globals';\nimport { debounce } from './utils/tickers'\nimport { $html } from './utils/dom';\nimport { ENV, FONT, CUSTOM_EVENT, CSS_CLASS } from './config'\nimport { isFontLoadingAPIAvailable, loadFonts } from './utils/fonts';\n\nconst app = new modular({\n modules: modules,\n});\n\nwindow.addEventListener('load', (event) => {\n const $style = document.getElementById('main-css');\n\n if ($style) {\n if ($style.isLoaded) {\n init();\n } else {\n $style.addEventListener('load', (event) => {\n init();\n });\n }\n } else {\n console.warn('The \"main-css\" stylesheet not found');\n }\n});\n\nfunction init() {\n globals();\n\n app.init(app);\n\n $html.classList.add(CSS_CLASS.LOADED);\n $html.classList.add(CSS_CLASS.READY);\n $html.classList.remove(CSS_CLASS.LOADING);\n\n // Bind window resize event with default vars\n const resizeEndEvent = new CustomEvent(CUSTOM_EVENT.RESIZE_END)\n window.addEventListener('resize', () => {\n $html.style.setProperty('--vw', `${document.documentElement.clientWidth * 0.01}px`)\n debounce(() => {\n window.dispatchEvent(resizeEndEvent)\n }, 200, false)\n })\n\n /**\n * Eagerly load the following fonts.\n */\n if (isFontLoadingAPIAvailable) {\n loadFonts(FONT.EAGER, ENV.IS_DEV).then((eagerFonts) => {\n $html.classList.add(CSS_CLASS.FONTS_LOADED);\n\n if (ENV.IS_DEV) {\n console.group('Eager fonts loaded!', eagerFonts.length, '/', document.fonts.size);\n console.group('State of eager fonts:')\n eagerFonts.forEach((font) => console.log(font.family, font.style, font.weight, font.status/*, font*/))\n console.groupEnd()\n console.group('State of all fonts:')\n document.fonts.forEach((font) => console.log(font.family, font.style, font.weight, font.status/*, font*/))\n console.groupEnd()\n }\n });\n }\n}\n"], - "mappings": "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", - "names": ["require_svg4everybody", "__commonJSMin", "exports", "module", "root", "factory", "embed", "parent", "svg", "target", "fragment", "viewBox", "clone", "loadreadystatechange", "xhr", "cachedDocument", "item", "svg4everybody", "rawopts", "oninterval", "index", "uses", "use", "getSVGAncestor", "src", "opts", "polyfill", "srcSplit", "url", "id", "requests", "numberOfSvgUseElementsToBypass", "requestAnimationFrame", "newerIEUA", "webkitUA", "olderEdgeUA", "edgeUA", "inIframe", "node", "grid_helper_exports", "__export", "gridHelper", "gutterCssVar", "GRID_HELPER_GUTTER_CSS_VAR", "marginCssVar", "GRID_HELPER_MARGIN_CSS_VAR", "rgbaColor", "GRID_HELPER_RGBA_COLOR", "$gridContainer", "setGridHelperColumns", "setGridHelperStyles", "setGridEvents", "$container", "elStyles", "columns", "$col", "i", "ctrlDown", "isActive", "e", "init_grid_helper", "__esmMin", "_typeof", "obj", "_classCallCheck", "instance", "Constructor", "_defineProperties", "target", "props", "i", "descriptor", "_createClass", "protoProps", "staticProps", "_defineProperty", "key", "value", "_slicedToArray", "arr", "_arrayWithHoles", "_iterableToArrayLimit", "_unsupportedIterableToArray", "_nonIterableRest", "_toConsumableArray", "_arrayWithoutHoles", "_iterableToArray", "_nonIterableSpread", "_arrayLikeToArray", "iter", "_arr", "_n", "_d", "_e", "_i", "_s", "err", "o", "minLen", "n", "len", "arr2", "_default", "options", "modules", "_this", "event", "_this2", "capture", "e", "data", "name", "method", "query", "context", "classIndex", "idIndex", "attrIndex", "indexes", "index", "more", "parent", "func", "args", "mod", "id", "_this3", "_this4", "_default$1", "app", "scope", "container", "elements", "el", "moduleExists", "dataName", "moduleName", "module", "moduleId", "_ref", "_ref2", "split", "_ref3", "_ref4", "_ref5", "_ref6", "_ref7", "_ref8", "_this5", "a", "b", "str", "main_esm_default", "modules_exports", "__export", "Example_default", "Load_default", "Scroll_default", "NODE_ENV", "IS_MOBILE", "ENV", "CSS_CLASS", "CUSTOM_EVENT", "FONT", "isFontLoadingAPIAvailable", "conformsToReference", "font", "criterion", "key", "value", "trim", "conformsToShorthand", "family", "findManyByReference", "search", "found", "font", "conformsToReference", "findManyByShorthand", "conformsToShorthand", "getMany", "queries", "found", "search", "findManyByShorthand", "findManyByReference", "loadFonts", "fontsToLoad", "debug", "__async", "_a", "loadFontsWithAPI", "loadFontFaceWithAPI", "font", "err", "fontsToBeLoaded", "fontToLoad", "getMany", "trim", "value", "whenReady", "queries", "fonts", "Example_default", "_default", "m", "whenReady", "FONT", "fonts", "_classCallCheck", "instance", "Constructor", "_defineProperties", "target", "props", "i", "descriptor", "_createClass", "protoProps", "staticProps", "_slicedToArray", "arr", "_arrayWithHoles", "_iterableToArrayLimit", "_unsupportedIterableToArray", "_nonIterableRest", "_i", "_arr", "_n", "_d", "_s", "_e", "err", "o", "minLen", "_arrayLikeToArray", "n", "len", "arr2", "_default", "options", "_this", "e", "href", "link", "transition", "isUrl", "push", "container", "oldContainer", "loadingEvent", "_this2", "_this3", "signal", "response", "data", "parser", "_this4", "svgs", "svg", "xhref", "_this5", "title", "newDesc", "oldDesc", "newContainer", "datas", "_ref", "_ref2", "key", "val", "str", "_this6", "promises", "attr", "els", "el", "elData", "promise", "resolve", "imagesEvent", "_this7", "loadedEvent", "readyEvent", "event", "func", "_this8", "main_esm_default", "Load_default", "_default", "m", "main_esm_default", "transition", "oldContainer", "newContainer", "getImageMetadata", "$img", "loadImage", "url", "options", "resolve", "reject", "loadCallback", "__spreadValues", "e", "LAZY_LOADED_IMAGES", "lazyLoadImage", "$el", "callback", "__async", "src", "loadedImage", "image", "lazyParent", "CSS_CLASS", "clamp", "min", "input", "max", "Math", "Animate", "advance", "deltaTime", "_this$onUpdate", "this", "isRunning", "completed", "lerp", "value", "x", "y", "to", "t", "exp", "round", "currentTime", "linearProgress", "duration", "easedProgress", "easing", "from", "onUpdate", "call", "stop", "fromTo", "onStart", "Dimensions", "constructor", "wrapper", "content", "autoResize", "resize", "onWrapperResize", "onContentResize", "window", "width", "innerWidth", "height", "innerHeight", "clientWidth", "clientHeight", "scrollHeight", "scrollWidth", "callback", "delay", "timer", "args", "arguments", "context", "clearTimeout", "setTimeout", "apply", "wrapperResizeObserver", "ResizeObserver", "observe", "contentResizeObserver", "destroy", "_this$wrapperResizeOb", "_this$contentResizeOb", "disconnect", "limit", "Emitter", "events", "emit", "event", "callbacks", "i", "length", "on", "cb", "_this$events$event", "push", "_this$events$event2", "filter", "off", "_this$events$event3", "VirtualScroll", "element", "wheelMultiplier", "touchMultiplier", "normalizeWheel", "onTouchStart", "clientX", "clientY", "targetTouches", "touchStart", "lastDelta", "onTouchMove", "deltaX", "deltaY", "emitter", "onTouchEnd", "onWheel", "addEventListener", "passive", "removeEventListener", "Lenis", "document", "documentElement", "wheelEventsTarget", "eventsTarget", "smoothWheel", "smoothTouch", "syncTouch", "syncTouchLerp", "__iosNoInertiaSyncTouchLerp", "touchInertiaMultiplier", "pow", "infinite", "orientation", "gestureOrientation", "onVirtualScroll", "ctrlKey", "isTouch", "type", "includes", "isWheel", "options", "scroll", "composedPath", "slice", "indexOf", "rootElement", "find", "node", "_node$classList", "hasAttribute", "classList", "contains", "isStopped", "isLocked", "preventDefault", "isSmooth", "isScrolling", "animate", "delta", "abs", "hasTouchInertia", "velocity", "scrollTo", "targetScroll", "_extends", "programmatic", "onScroll", "lastScroll", "animatedScroll", "actualScroll", "direction", "sign", "lenisVersion", "body", "dimensions", "toggleClass", "virtualScroll", "setScroll", "isHorizontal", "scrollLeft", "scrollTop", "reset", "start", "raf", "time", "target", "offset", "immediate", "lock", "onComplete", "force", "_target", "querySelector", "nodeType", "wrapperRect", "getBoundingClientRect", "left", "top", "rect", "requestAnimationFrame", "d", "progress", "__isSmooth", "__isScrolling", "__isStopped", "__isLocked", "className", "name", "toggle", "IO", "constructor", "scrollElements", "rootMargin", "IORaf", "this", "observer", "_init", "IntersectionObserver", "entries", "forEach", "entry", "$targetItem", "find", "item", "$el", "target", "isIntersecting", "isAlreadyIntersected", "_setInview", "_setOutOfView", "scrollElement", "observe", "destroy", "disconnect", "$scrollElement", "unobserve", "setInteractivityOn", "setInview", "setInteractivityOff", "setOutOfView", "attributes", "scrollRepeat", "mapRange", "inMin", "inMax", "outMin", "outMax", "value", "closestNumber", "array", "reduce", "prev", "curr", "Math", "abs", "ScrollElement", "id", "modularInstance", "subscribeElementUpdateFn", "unsubscribeElementUpdateFn", "needRaf", "scrollOrientation", "_this$$el$dataset$scr", "_this$$el$dataset$scr2", "_this$$el$dataset$scr3", "_this$$el$dataset$scr4", "_this$$el$dataset$scr5", "intersection", "metrics", "currentScroll", "translateValue", "progress", "lastProgress", "progressModularModules", "isInview", "isInteractive", "isInFold", "isFirstResize", "scrollClass", "dataset", "scrollOffset", "scrollPosition", "scrollModuleProgress", "scrollCssProgress", "scrollEventProgress", "scrollSpeed", "parseFloat", "scrollCall", "scrollCallSelf", "scrollIgnoreFold", "scrollEnableTouchSpeed", "start", "end", "offsetStart", "offsetEnd", "bcr", "window", "scrollY", "scrollX", "_getProgressModularModules", "_resize", "onResize", "onRender", "smooth", "wSize", "innerHeight", "innerWidth", "_computeProgress", "isNaN", "max", "style", "transform", "classList", "add", "from", "_getScrollCallFrom", "_dispatchCall", "remove", "getBoundingClientRect", "_computeMetrics", "_computeIntersection", "top", "left", "height", "width", "metricsSize", "offset", "split", "undefined", "trim", "scrollPositionStart", "scrollPositionEnd", "viewportStart", "includes", "parseInt", "replace", "viewportEnd", "forcedProgress", "_setCssProgress", "_setCustomEventProgress", "modularModules", "call", "moduleName", "moduleId", "currentProgress", "setProperty", "toString", "customEventName", "customEvent", "CustomEvent", "detail", "dispatchEvent", "modulesIdNames", "Object", "keys", "filter", "key", "modules", "length", "modulesIdName", "module", "moduleObj", "push", "closestIntersectionValue", "way", "_this$attributes$scro", "_this$attributes", "callParameters", "callSelf", "_targetModuleId", "func", "targetModuleId", "ATTRIBUTES_THAT_NEED_RAF", "Core", "triggerRootMargin", "rafRootMargin", "$scrollContainer", "triggeredScrollElements", "RAFScrollElements", "scrollElementsToUpdate", "IOTriggerInstance", "IORafInstance", "console", "error", "$scrollElements", "querySelectorAll", "$scrollElementsArr", "Array", "_subscribeScrollElements", "_unsubscribeAllScrollElements", "removeScrollElements", "$oldContainer", "$scrollElementsToRemove", "index", "indexOf", "splice", "targetScrollElementToUpdate", "targetScrollElement", "_unsubscribeElementUpdate", "scrollElementItem", "addScrollElements", "$newContainer", "ids", "fromIndex", "toObserve", "_checkRafNeeded", "scrollElementInstance", "_subscribeElementUpdate", "bind", "scrollElementToUpdate", "attributesThatNeedRaf", "removeAttribute", "attributeToRemove", "attribute", "map", "test", "join", "RO", "resizeElements", "resizeCallback", "$resizeElements", "isFirstObserve", "ResizeObserver", "_this$resizeCallback", "$resizeElement", "defaultLenisOptions", "wrapper", "content", "document", "documentElement", "eventsTarget", "lerp", "duration", "orientation", "gestureOrientation", "smoothWheel", "smoothTouch", "syncTouch", "syncTouchLerp", "touchInertiaMultiplier", "wheelMultiplier", "touchMultiplier", "normalizeWheel", "autoResize", "easing", "t", "min", "pow", "LocomotiveScroll", "lenisOptions", "autoStart", "scrollCallback", "initCustomTicker", "destroyCustomTicker", "rafPlaying", "lenisInstance", "coreInstance", "rafInstance", "ROInstance", "_onRenderBind", "_onResizeBind", "_onScrollToBind", "_extends", "assign", "_onRender", "_onScrollTo", "_onResize", "_this$lenisInstance", "Lenis", "on", "setAttribute", "options", "requestAnimationFrame", "rootElement", "_bindEvents", "warn", "stop", "_unbindEvents", "_bindScrollToEvents", "body", "addEventListener", "_unbindScrollToEvents", "removeEventListener", "$container", "$rootContainer", "$scrollToElements", "_this$coreInstance", "scroll", "_this$lenisInstance2", "_this$coreInstance2", "raf", "Date", "now", "isSmooth", "event", "_event$currentTarget", "preventDefault", "$target", "currentTarget", "getAttribute", "scrollTo", "_this$lenisInstance3", "_raf", "_this$lenisInstance4", "cancelAnimationFrame", "_this$coreInstance3", "_this$coreInstance4", "resize", "_this$lenisInstance5", "immediate", "lock", "force", "onComplete", "Scroll_default", "_default", "m", "h", "args", "lazyLoadImage", "params", "_b", "_a", "target", "options", "__objRest", "import_svg4everybody", "gridHelper", "__async", "ENV", "gridHelperModule", "globals_default", "svg4everybody", "debounce", "callback", "delay", "immediate", "timeout", "args", "later", "$html", "$body", "app", "main_esm_default", "modules_exports", "event", "$style", "init", "globals_default", "$html", "CSS_CLASS", "resizeEndEvent", "CUSTOM_EVENT", "debounce", "isFontLoadingAPIAvailable", "loadFonts", "FONT", "ENV", "eagerFonts", "font"] + "sources": ["../../../node_modules/svg4everybody/dist/svg4everybody.js", "../../../assets/scripts/utils/grid-helper.js", "../../../node_modules/modujs/dist/main.esm.js", "../../../assets/scripts/modules.js", "../../../assets/scripts/modules/Dialog.js", "../../../node_modules/delegate-it/delegate.js", "../../../node_modules/path-to-regexp/src/index.ts", "../../../node_modules/swup/src/helpers/classify.ts", "../../../node_modules/swup/src/helpers/getCurrentUrl.ts", "../../../node_modules/swup/src/helpers/history.ts", "../../../node_modules/swup/src/helpers/delegateEvent.ts", "../../../node_modules/swup/src/helpers/Location.ts", "../../../node_modules/swup/src/helpers/matchPath.ts", "../../../node_modules/swup/src/modules/fetchPage.ts", "../../../node_modules/swup/src/modules/Cache.ts", "../../../node_modules/swup/src/utils/index.ts", "../../../node_modules/swup/src/modules/Classes.ts", "../../../node_modules/swup/src/modules/Visit.ts", "../../../node_modules/swup/src/modules/Hooks.ts", "../../../node_modules/swup/src/modules/getAnchorElement.ts", "../../../node_modules/swup/src/modules/awaitAnimations.ts", "../../../node_modules/swup/src/modules/navigate.ts", "../../../node_modules/swup/src/modules/animatePageOut.ts", "../../../node_modules/swup/src/modules/replaceContent.ts", "../../../node_modules/swup/src/modules/scrollToContent.ts", "../../../node_modules/swup/src/modules/animatePageIn.ts", "../../../node_modules/swup/src/modules/renderPage.ts", "../../../node_modules/swup/src/modules/plugins.ts", "../../../node_modules/swup/src/modules/resolveUrl.ts", "../../../node_modules/swup/src/Swup.ts", "../../../node_modules/@swup/plugin/src/versionSatisfies.ts", "../../../node_modules/@swup/plugin/src/index.ts", "../../../node_modules/@swup/plugin/src/pluginRequirements.ts", "../../../node_modules/@swup/fragment-plugin/src/inc/env.ts", "../../../node_modules/@swup/fragment-plugin/src/inc/Logger.ts", "../../../node_modules/@swup/fragment-plugin/src/inc/functions.ts", "../../../node_modules/@swup/fragment-plugin/src/inc/ParsedRule.ts", "../../../node_modules/@swup/fragment-plugin/src/inc/handlers.ts", "../../../node_modules/@swup/fragment-plugin/src/SwupFragmentPlugin.ts", "../../../assets/scripts/modules/Load.js", "../../../assets/scripts/config.js", "../../../assets/scripts/utils/image.js", "../../../node_modules/@studio-freight/lenis/src/maths.js", "../../../node_modules/@studio-freight/lenis/src/animate.js", "../../../node_modules/@studio-freight/lenis/src/dimensions.js", "../../../node_modules/@studio-freight/lenis/src/debounce.js", "../../../node_modules/@studio-freight/lenis/src/emitter.js", "../../../node_modules/@studio-freight/lenis/src/virtual-scroll.js", "../../../node_modules/@studio-freight/lenis/src/index.js", "../../../node_modules/locomotive-scroll/src/core/IO.ts", "../../../node_modules/locomotive-scroll/src/utils/maths.ts", "../../../node_modules/locomotive-scroll/src/core/ScrollElement.ts", "../../../node_modules/locomotive-scroll/src/core/Core.ts", "../../../node_modules/locomotive-scroll/src/core/RO.ts", "../../../node_modules/locomotive-scroll/src/index.ts", "../../../assets/scripts/modules/Scroll.js", "../../../assets/scripts/globals.js", "../../../assets/scripts/utils/tickers.js", "../../../assets/scripts/utils/dom.js", "../../../assets/scripts/utils/fonts.js", "../../../assets/scripts/app.js"], + "sourcesContent": ["!function(root, factory) {\n \"function\" == typeof define && define.amd ? // AMD. Register as an anonymous module unless amdModuleId is set\n define([], function() {\n return root.svg4everybody = factory();\n }) : \"object\" == typeof module && module.exports ? // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory() : root.svg4everybody = factory();\n}(this, function() {\n /*! svg4everybody v2.1.9 | github.com/jonathantneal/svg4everybody */\n function embed(parent, svg, target) {\n // if the target exists\n if (target) {\n // create a document fragment to hold the contents of the target\n var fragment = document.createDocumentFragment(), viewBox = !svg.hasAttribute(\"viewBox\") && target.getAttribute(\"viewBox\");\n // conditionally set the viewBox on the svg\n viewBox && svg.setAttribute(\"viewBox\", viewBox);\n // copy the contents of the clone into the fragment\n for (// clone the target\n var clone = target.cloneNode(!0); clone.childNodes.length; ) {\n fragment.appendChild(clone.firstChild);\n }\n // append the fragment into the svg\n parent.appendChild(fragment);\n }\n }\n function loadreadystatechange(xhr) {\n // listen to changes in the request\n xhr.onreadystatechange = function() {\n // if the request is ready\n if (4 === xhr.readyState) {\n // get the cached html document\n var cachedDocument = xhr._cachedDocument;\n // ensure the cached html document based on the xhr response\n cachedDocument || (cachedDocument = xhr._cachedDocument = document.implementation.createHTMLDocument(\"\"), \n cachedDocument.body.innerHTML = xhr.responseText, xhr._cachedTarget = {}), // clear the xhr embeds list and embed each item\n xhr._embeds.splice(0).map(function(item) {\n // get the cached target\n var target = xhr._cachedTarget[item.id];\n // ensure the cached target\n target || (target = xhr._cachedTarget[item.id] = cachedDocument.getElementById(item.id)), \n // embed the target into the svg\n embed(item.parent, item.svg, target);\n });\n }\n }, // test the ready state change immediately\n xhr.onreadystatechange();\n }\n function svg4everybody(rawopts) {\n function oninterval() {\n // while the index exists in the live collection\n for (// get the cached index\n var index = 0; index < uses.length; ) {\n // get the current \n var use = uses[index], parent = use.parentNode, svg = getSVGAncestor(parent), src = use.getAttribute(\"xlink:href\") || use.getAttribute(\"href\");\n if (!src && opts.attributeName && (src = use.getAttribute(opts.attributeName)), \n svg && src) {\n if (polyfill) {\n if (!opts.validate || opts.validate(src, svg, use)) {\n // remove the element\n parent.removeChild(use);\n // parse the src and get the url and id\n var srcSplit = src.split(\"#\"), url = srcSplit.shift(), id = srcSplit.join(\"#\");\n // if the link is external\n if (url.length) {\n // get the cached xhr request\n var xhr = requests[url];\n // ensure the xhr request exists\n xhr || (xhr = requests[url] = new XMLHttpRequest(), xhr.open(\"GET\", url), xhr.send(), \n xhr._embeds = []), // add the svg and id as an item to the xhr embeds list\n xhr._embeds.push({\n parent: parent,\n svg: svg,\n id: id\n }), // prepare the xhr ready state change event\n loadreadystatechange(xhr);\n } else {\n // embed the local id into the svg\n embed(parent, svg, document.getElementById(id));\n }\n } else {\n // increase the index when the previous value was not \"valid\"\n ++index, ++numberOfSvgUseElementsToBypass;\n }\n }\n } else {\n // increase the index when the previous value was not \"valid\"\n ++index;\n }\n }\n // continue the interval\n (!uses.length || uses.length - numberOfSvgUseElementsToBypass > 0) && requestAnimationFrame(oninterval, 67);\n }\n var polyfill, opts = Object(rawopts), newerIEUA = /\\bTrident\\/[567]\\b|\\bMSIE (?:9|10)\\.0\\b/, webkitUA = /\\bAppleWebKit\\/(\\d+)\\b/, olderEdgeUA = /\\bEdge\\/12\\.(\\d+)\\b/, edgeUA = /\\bEdge\\/.(\\d+)\\b/, inIframe = window.top !== window.self;\n polyfill = \"polyfill\" in opts ? opts.polyfill : newerIEUA.test(navigator.userAgent) || (navigator.userAgent.match(olderEdgeUA) || [])[1] < 10547 || (navigator.userAgent.match(webkitUA) || [])[1] < 537 || edgeUA.test(navigator.userAgent) && inIframe;\n // create xhr requests object\n var requests = {}, requestAnimationFrame = window.requestAnimationFrame || setTimeout, uses = document.getElementsByTagName(\"use\"), numberOfSvgUseElementsToBypass = 0;\n // conditionally start the interval if the polyfill is active\n polyfill && oninterval();\n }\n function getSVGAncestor(node) {\n for (var svg = node; \"svg\" !== svg.nodeName.toLowerCase() && (svg = svg.parentNode); ) {}\n return svg;\n }\n return svg4everybody;\n});", "/**\n * Grid Helper\n *\n * Provides a grid based on the design guidelines and is helpful for web integration.\n *\n * - `Control + g` to toggle the grid\n *\n */\n\n/**\n * @typedef {Object} GridHelperReference\n *\n * @property {string} [gutterCssVar=GRID_HELPER_GUTTER_CSS_VAR] - CSS variable used to define grid gutters.\n * @property {string} [marginCssVar=GRID_HELPER_MARGIN_CSS_VAR] - CSS variable used to define grid margins.\n * @property {string} [rgbaColor=GRID_HELPER_RGBA_COLOR] - RGBA color for the grid appearence.\n */\n\nconst GRID_HELPER_GUTTER_CSS_VAR = '--grid-gutter';\nconst GRID_HELPER_MARGIN_CSS_VAR = '--grid-margin';\nconst GRID_HELPER_RGBA_COLOR = 'rgba(255, 0, 0, .1)';\n\n/**\n * Create a grid helper\n *\n * @param {GridHelperReference}\n *\n */\nfunction gridHelper({\n gutterCssVar = GRID_HELPER_GUTTER_CSS_VAR,\n marginCssVar = GRID_HELPER_MARGIN_CSS_VAR,\n rgbaColor = GRID_HELPER_RGBA_COLOR,\n} = {}) {\n // Set grid container\n const $gridContainer = document.createElement('div');\n document.body.append($gridContainer);\n\n // Set grid appearence\n setGridHelperColumns($gridContainer, rgbaColor);\n setGridHelperStyles($gridContainer, gutterCssVar, marginCssVar);\n\n // Set grid interactivity\n setGridEvents($gridContainer, rgbaColor);\n}\n\n/**\n * Set grid container styles\n *\n * @param {HTMLElement} $container - DOM Element that contains a list of generated columns\n * @param {string} gutterCssVar - CSS variable used to define grid gutters.\n * @param {string} marginCssVar - CSS variable used to define grid margins.\n *\n */\nfunction setGridHelperStyles($container, gutterCssVar, marginCssVar) {\n const elStyles = $container.style;\n elStyles.zIndex = '10000';\n elStyles.position = 'fixed';\n elStyles.top = '0';\n elStyles.left = '0';\n elStyles.display = 'flex';\n elStyles.width = '100%';\n elStyles.height = '100%';\n elStyles.columnGap = `var(${gutterCssVar}, 0)`;\n elStyles.paddingLeft = `var(${marginCssVar}, 0)`;\n elStyles.paddingRight = `var(${marginCssVar}, 0)`;\n elStyles.pointerEvents = 'none';\n elStyles.visibility = 'hidden';\n}\n\n/**\n * Set grid columns\n *\n * @param {HTMLElement} $container - DOM Element that will contain a list of generated columns\n * @param {string} rgbaColor - RGBA color to stylize the generated columns\n *\n */\nfunction setGridHelperColumns($container, rgbaColor) {\n // Clear columns\n $container.innerHTML = '';\n\n // Loop through columns\n const columns = Number(\n window.getComputedStyle($container).getPropertyValue('--grid-columns')\n );\n\n let $col;\n for (var i = 0; i < columns; i++) {\n $col = document.createElement('div');\n $col.style.flex = '1 1 0';\n $col.style.backgroundColor = rgbaColor;\n $container.appendChild($col);\n }\n}\n\n/**\n * Set grid events\n *\n * Resize to rebuild columns\n * Keydown/Keyup to toggle the grid display\n *\n * @param {HTMLElement} $container - DOM Element that contains a list of generated columns\n * @param {string} rgbaColor - RGBA color to stylize the generated columns\n *\n */\nfunction setGridEvents($container, rgbaColor) {\n // Handle resize\n window.addEventListener(\n 'resize',\n setGridHelperColumns($container, rgbaColor)\n );\n\n // Toggle grid\n let ctrlDown = false;\n let isActive = false;\n\n document.addEventListener('keydown', (e) => {\n if (e.key == 'Control') {\n ctrlDown = true;\n } else {\n if (ctrlDown && e.key == 'g') {\n if (isActive) {\n $container.style.visibility = 'hidden';\n } else {\n $container.style.visibility = 'visible';\n }\n\n isActive = !isActive;\n }\n }\n });\n\n document.addEventListener('keyup', (e) => {\n if (e.key == 'Control') {\n ctrlDown = false;\n }\n });\n}\n\nexport { gridHelper };\n", "function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar _default = /*#__PURE__*/function () {\n function _default(options) {\n _classCallCheck(this, _default);\n\n this.mAttr = 'data-' + options.dataName;\n this.mCaptureEvents = ['mouseenter', 'mouseleave'];\n this.el = options.el;\n }\n\n _createClass(_default, [{\n key: \"mInit\",\n value: function mInit(modules) {\n var _this = this;\n\n this.modules = modules;\n this.mCheckEventTarget = this.mCheckEventTarget.bind(this);\n\n if (this.events) {\n Object.keys(this.events).forEach(function (event) {\n return _this.mAddEvent(event);\n });\n }\n }\n }, {\n key: \"mUpdate\",\n value: function mUpdate(modules) {\n this.modules = modules;\n }\n }, {\n key: \"mDestroy\",\n value: function mDestroy() {\n var _this2 = this;\n\n if (this.events) {\n Object.keys(this.events).forEach(function (event) {\n return _this2.mRemoveEvent(event);\n });\n }\n }\n }, {\n key: \"mAddEvent\",\n value: function mAddEvent(event) {\n var capture = this.mCaptureEvents.includes(event) ? true : false;\n this.el.addEventListener(event, this.mCheckEventTarget, capture);\n }\n }, {\n key: \"mRemoveEvent\",\n value: function mRemoveEvent(event) {\n var capture = this.mCaptureEvents.includes(event) ? true : false;\n this.el.removeEventListener(event, this.mCheckEventTarget, capture);\n }\n }, {\n key: \"mCheckEventTarget\",\n value: function mCheckEventTarget(e) {\n var event = this.events[e.type];\n\n if (typeof event === \"string\") {\n this[event](e);\n } else {\n var data = '[' + this.mAttr + ']';\n var target = e.target;\n\n if (this.mCaptureEvents.includes(e.type)) {\n if (target.matches(data)) {\n this.mCallEventMethod(e, event, target);\n }\n } else {\n while (target && target !== document) {\n if (target.matches(data)) {\n if (this.mCallEventMethod(e, event, target) != 'undefined') {\n break;\n }\n }\n\n target = target.parentNode;\n }\n }\n }\n }\n }, {\n key: \"mCallEventMethod\",\n value: function mCallEventMethod(e, event, target) {\n var name = target.getAttribute(this.mAttr);\n\n if (event.hasOwnProperty(name)) {\n var method = event[name];\n\n if (!e.hasOwnProperty('currentTarget')) {\n Object.defineProperty(e, 'currentTarget', {\n value: target\n });\n }\n\n if (!e.hasOwnProperty('curTarget')) {\n Object.defineProperty(e, 'curTarget', {\n value: target\n }); // For IE 11\n }\n\n this[method](e);\n }\n }\n }, {\n key: \"$\",\n value: function $(query, context) {\n var classIndex = query.indexOf('.');\n var idIndex = query.indexOf('#');\n var attrIndex = query.indexOf('[');\n var indexes = [classIndex, idIndex, attrIndex].filter(function (index) {\n return index != -1;\n });\n var index = false;\n var name = query;\n var more = '';\n var parent = this.el;\n\n if (indexes.length) {\n index = Math.min.apply(Math, _toConsumableArray(indexes));\n name = query.slice(0, index);\n more = query.slice(index);\n }\n\n if (_typeof(context) == 'object') {\n parent = context;\n }\n\n return parent.querySelectorAll('[' + this.mAttr + '=' + name + ']' + more);\n }\n }, {\n key: \"parent\",\n value: function parent(query, context) {\n var data = '[' + this.mAttr + '=' + query + ']';\n var parent = context.parentNode;\n\n while (parent && parent !== document) {\n if (parent.matches(data)) {\n return parent;\n }\n\n parent = parent.parentNode;\n }\n }\n }, {\n key: \"getData\",\n value: function getData(name, context) {\n var target = context || this.el;\n return target.getAttribute(this.mAttr + '-' + name);\n }\n }, {\n key: \"setData\",\n value: function setData(name, value, context) {\n var target = context || this.el;\n return target.setAttribute(this.mAttr + '-' + name, value);\n }\n }, {\n key: \"call\",\n value: function call(func, args, mod, id) {\n var _this3 = this;\n\n if (args && !mod) {\n mod = args;\n args = false;\n }\n\n if (this.modules[mod]) {\n if (id) {\n if (this.modules[mod][id]) {\n this.modules[mod][id][func](args);\n }\n } else {\n Object.keys(this.modules[mod]).forEach(function (id) {\n _this3.modules[mod][id][func](args);\n });\n }\n }\n }\n }, {\n key: \"on\",\n value: function on(e, mod, func, id) {\n var _this4 = this;\n\n if (this.modules[mod]) {\n if (id) {\n this.modules[mod][id].el.addEventListener(e, function (o) {\n return func(o);\n });\n } else {\n Object.keys(this.modules[mod]).forEach(function (i) {\n _this4.modules[mod][i].el.addEventListener(e, function (o) {\n return func(o);\n });\n });\n }\n }\n }\n }, {\n key: \"init\",\n value: function init() {}\n }, {\n key: \"destroy\",\n value: function destroy() {}\n }]);\n\n return _default;\n}();\n\nvar _default$1 = /*#__PURE__*/function () {\n function _default(options) {\n _classCallCheck(this, _default);\n\n this.app;\n this.modules = options.modules;\n this.currentModules = {};\n this.activeModules = {};\n this.newModules = {};\n this.moduleId = 0;\n }\n\n _createClass(_default, [{\n key: \"init\",\n value: function init(app, scope) {\n var _this = this;\n\n var container = scope || document;\n var elements = container.querySelectorAll('*');\n\n if (app && !this.app) {\n this.app = app;\n }\n\n this.activeModules['app'] = {\n 'app': this.app\n };\n elements.forEach(function (el) {\n Array.from(el.attributes).forEach(function (i) {\n if (i.name.startsWith('data-module')) {\n var moduleExists = false;\n var dataName = i.name.split('-').splice(2);\n\n var moduleName = _this.toCamel(dataName);\n\n if (_this.modules[moduleName]) {\n moduleExists = true;\n } else if (_this.modules[_this.toUpper(moduleName)]) {\n moduleName = _this.toUpper(moduleName);\n moduleExists = true;\n }\n\n if (moduleExists) {\n var options = {\n el: el,\n name: moduleName,\n dataName: dataName.join('-')\n };\n var module = new _this.modules[moduleName](options);\n var id = i.value;\n\n if (!id) {\n _this.moduleId++;\n id = 'm' + _this.moduleId;\n el.setAttribute(i.name, id);\n }\n\n _this.addActiveModule(moduleName, id, module);\n\n var moduleId = moduleName + '-' + id;\n\n if (scope) {\n _this.newModules[moduleId] = module;\n } else {\n _this.currentModules[moduleId] = module;\n }\n }\n }\n });\n });\n Object.entries(this.currentModules).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n id = _ref2[0],\n module = _ref2[1];\n\n if (scope) {\n var split = id.split('-');\n var moduleName = split.shift();\n var moduleId = split.pop();\n\n _this.addActiveModule(moduleName, moduleId, module);\n } else {\n _this.initModule(module);\n }\n });\n }\n }, {\n key: \"initModule\",\n value: function initModule(module) {\n module.mInit(this.activeModules);\n module.init();\n }\n }, {\n key: \"addActiveModule\",\n value: function addActiveModule(name, id, module) {\n if (this.activeModules[name]) {\n Object.assign(this.activeModules[name], _defineProperty({}, id, module));\n } else {\n this.activeModules[name] = _defineProperty({}, id, module);\n }\n }\n }, {\n key: \"update\",\n value: function update(scope) {\n var _this2 = this;\n\n this.init(this.app, scope);\n Object.entries(this.currentModules).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n id = _ref4[0],\n module = _ref4[1];\n\n module.mUpdate(_this2.activeModules);\n });\n Object.entries(this.newModules).forEach(function (_ref5) {\n var _ref6 = _slicedToArray(_ref5, 2),\n id = _ref6[0],\n module = _ref6[1];\n\n _this2.initModule(module);\n });\n Object.assign(this.currentModules, this.newModules);\n }\n }, {\n key: \"destroy\",\n value: function destroy(scope) {\n if (scope) {\n this.destroyScope(scope);\n } else {\n this.destroyModules();\n }\n }\n }, {\n key: \"destroyScope\",\n value: function destroyScope(scope) {\n var _this3 = this;\n\n var elements = scope.querySelectorAll('*');\n elements.forEach(function (el) {\n Array.from(el.attributes).forEach(function (i) {\n if (i.name.startsWith('data-module')) {\n var id = i.value;\n var dataName = i.name.split('-').splice(2);\n var moduleName = _this3.toCamel(dataName) + '-' + id;\n var moduleExists = false;\n\n if (_this3.currentModules[moduleName]) {\n moduleExists = true;\n } else if (_this3.currentModules[_this3.toUpper(moduleName)]) {\n moduleName = _this3.toUpper(moduleName);\n moduleExists = true;\n }\n\n if (moduleExists) {\n _this3.destroyModule(_this3.currentModules[moduleName]);\n\n delete _this3.currentModules[moduleName];\n }\n }\n });\n });\n this.activeModules = {};\n this.newModules = {};\n }\n }, {\n key: \"destroyModules\",\n value: function destroyModules() {\n var _this4 = this;\n\n Object.entries(this.currentModules).forEach(function (_ref7) {\n var _ref8 = _slicedToArray(_ref7, 2),\n id = _ref8[0],\n module = _ref8[1];\n\n _this4.destroyModule(module);\n });\n this.currentModules = [];\n }\n }, {\n key: \"destroyModule\",\n value: function destroyModule(module) {\n module.mDestroy();\n module.destroy();\n }\n }, {\n key: \"toCamel\",\n value: function toCamel(arr) {\n var _this5 = this;\n\n return arr.reduce(function (a, b) {\n return a + _this5.toUpper(b);\n });\n }\n }, {\n key: \"toUpper\",\n value: function toUpper(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n }]);\n\n return _default;\n}();\n\nexport default _default$1;\nexport { _default as module };\n", "// export {default as Example} from './modules/Example';\nexport {default as Dialog} from './modules/Dialog';\nexport {default as Load} from './modules/Load';\nexport {default as Scroll} from './modules/Scroll';\n", "import { module } from 'modujs';\n\nexport default class extends module {\n constructor(m) {\n super(m);\n\n this.$closeBtn = this.$('close')[0]\n }\n\n init() {\n // Prevent ESC to close dialog\n this.onKeyDown = this.onKeyDown.bind(this)\n }\n\n onKeyDown(e) {\n if(e.key === 'Escape') {\n console.log('ESCAPE');\n e.preventDefault()\n this.$closeBtn.click();\n }\n }\n\n populate(container) {\n this.el.appendChild(container)\n }\n\n show() {\n this.el.showModal();\n window.addEventListener('keydown', this.onKeyDown);\n }\n\n close() {\n window.removeEventListener('keydown', this.onKeyDown);\n this.el.close();\n }\n}\n", "/** Keeps track of raw listeners added to the base elements to avoid duplication */\nconst ledger = new WeakMap();\nfunction editLedger(wanted, baseElement, callback, setup) {\n if (!wanted && !ledger.has(baseElement)) {\n return false;\n }\n const elementMap = ledger.get(baseElement)\n ?? new WeakMap();\n ledger.set(baseElement, elementMap);\n const setups = elementMap.get(callback) ?? new Set();\n elementMap.set(callback, setups);\n const existed = setups.has(setup);\n if (wanted) {\n setups.add(setup);\n }\n else {\n setups.delete(setup);\n }\n return existed && wanted;\n}\nfunction safeClosest(event, selector) {\n let target = event.target;\n if (target instanceof Text) {\n target = target.parentElement;\n }\n if (target instanceof Element && event.currentTarget instanceof Element) {\n // `.closest()` may match ancestors of `currentTarget` but we only need its children\n const closest = target.closest(selector);\n if (closest && event.currentTarget.contains(closest)) {\n return closest;\n }\n }\n}\n// This type isn't exported as a declaration, so it needs to be duplicated above\nfunction delegate(selector, type, callback, options = {}) {\n const { signal, base = document } = options;\n if (signal?.aborted) {\n return;\n }\n // Don't pass `once` to `addEventListener` because it needs to be handled in `delegate-it`\n const { once, ...nativeListenerOptions } = options;\n // `document` should never be the base, it's just an easy way to define \"global event listeners\"\n const baseElement = base instanceof Document ? base.documentElement : base;\n // Handle the regular Element usage\n const capture = Boolean(typeof options === 'object' ? options.capture : options);\n const listenerFn = (event) => {\n const delegateTarget = safeClosest(event, selector);\n if (delegateTarget) {\n const delegateEvent = Object.assign(event, { delegateTarget });\n callback.call(baseElement, delegateEvent);\n if (once) {\n baseElement.removeEventListener(type, listenerFn, nativeListenerOptions);\n editLedger(false, baseElement, callback, setup);\n }\n }\n };\n const setup = JSON.stringify({ selector, type, capture });\n const isAlreadyListening = editLedger(true, baseElement, callback, setup);\n if (!isAlreadyListening) {\n baseElement.addEventListener(type, listenerFn, nativeListenerOptions);\n }\n signal?.addEventListener('abort', () => {\n editLedger(false, baseElement, callback, setup);\n });\n}\nexport default delegate;\n", "/**\n * Tokenizer results.\n */\ninterface LexToken {\n type:\n | \"OPEN\"\n | \"CLOSE\"\n | \"PATTERN\"\n | \"NAME\"\n | \"CHAR\"\n | \"ESCAPED_CHAR\"\n | \"MODIFIER\"\n | \"END\";\n index: number;\n value: string;\n}\n\n/**\n * Tokenize input string.\n */\nfunction lexer(str: string): LexToken[] {\n const tokens: LexToken[] = [];\n let i = 0;\n\n while (i < str.length) {\n const char = str[i];\n\n if (char === \"*\" || char === \"+\" || char === \"?\") {\n tokens.push({ type: \"MODIFIER\", index: i, value: str[i++] });\n continue;\n }\n\n if (char === \"\\\\\") {\n tokens.push({ type: \"ESCAPED_CHAR\", index: i++, value: str[i++] });\n continue;\n }\n\n if (char === \"{\") {\n tokens.push({ type: \"OPEN\", index: i, value: str[i++] });\n continue;\n }\n\n if (char === \"}\") {\n tokens.push({ type: \"CLOSE\", index: i, value: str[i++] });\n continue;\n }\n\n if (char === \":\") {\n let name = \"\";\n let j = i + 1;\n\n while (j < str.length) {\n const code = str.charCodeAt(j);\n\n if (\n // `0-9`\n (code >= 48 && code <= 57) ||\n // `A-Z`\n (code >= 65 && code <= 90) ||\n // `a-z`\n (code >= 97 && code <= 122) ||\n // `_`\n code === 95\n ) {\n name += str[j++];\n continue;\n }\n\n break;\n }\n\n if (!name) throw new TypeError(`Missing parameter name at ${i}`);\n\n tokens.push({ type: \"NAME\", index: i, value: name });\n i = j;\n continue;\n }\n\n if (char === \"(\") {\n let count = 1;\n let pattern = \"\";\n let j = i + 1;\n\n if (str[j] === \"?\") {\n throw new TypeError(`Pattern cannot start with \"?\" at ${j}`);\n }\n\n while (j < str.length) {\n if (str[j] === \"\\\\\") {\n pattern += str[j++] + str[j++];\n continue;\n }\n\n if (str[j] === \")\") {\n count--;\n if (count === 0) {\n j++;\n break;\n }\n } else if (str[j] === \"(\") {\n count++;\n if (str[j + 1] !== \"?\") {\n throw new TypeError(`Capturing groups are not allowed at ${j}`);\n }\n }\n\n pattern += str[j++];\n }\n\n if (count) throw new TypeError(`Unbalanced pattern at ${i}`);\n if (!pattern) throw new TypeError(`Missing pattern at ${i}`);\n\n tokens.push({ type: \"PATTERN\", index: i, value: pattern });\n i = j;\n continue;\n }\n\n tokens.push({ type: \"CHAR\", index: i, value: str[i++] });\n }\n\n tokens.push({ type: \"END\", index: i, value: \"\" });\n\n return tokens;\n}\n\nexport interface ParseOptions {\n /**\n * Set the default delimiter for repeat parameters. (default: `'/'`)\n */\n delimiter?: string;\n /**\n * List of characters to automatically consider prefixes when parsing.\n */\n prefixes?: string;\n}\n\n/**\n * Parse a string for the raw tokens.\n */\nexport function parse(str: string, options: ParseOptions = {}): Token[] {\n const tokens = lexer(str);\n const { prefixes = \"./\" } = options;\n const defaultPattern = `[^${escapeString(options.delimiter || \"/#?\")}]+?`;\n const result: Token[] = [];\n let key = 0;\n let i = 0;\n let path = \"\";\n\n const tryConsume = (type: LexToken[\"type\"]): string | undefined => {\n if (i < tokens.length && tokens[i].type === type) return tokens[i++].value;\n };\n\n const mustConsume = (type: LexToken[\"type\"]): string => {\n const value = tryConsume(type);\n if (value !== undefined) return value;\n const { type: nextType, index } = tokens[i];\n throw new TypeError(`Unexpected ${nextType} at ${index}, expected ${type}`);\n };\n\n const consumeText = (): string => {\n let result = \"\";\n let value: string | undefined;\n while ((value = tryConsume(\"CHAR\") || tryConsume(\"ESCAPED_CHAR\"))) {\n result += value;\n }\n return result;\n };\n\n while (i < tokens.length) {\n const char = tryConsume(\"CHAR\");\n const name = tryConsume(\"NAME\");\n const pattern = tryConsume(\"PATTERN\");\n\n if (name || pattern) {\n let prefix = char || \"\";\n\n if (prefixes.indexOf(prefix) === -1) {\n path += prefix;\n prefix = \"\";\n }\n\n if (path) {\n result.push(path);\n path = \"\";\n }\n\n result.push({\n name: name || key++,\n prefix,\n suffix: \"\",\n pattern: pattern || defaultPattern,\n modifier: tryConsume(\"MODIFIER\") || \"\",\n });\n continue;\n }\n\n const value = char || tryConsume(\"ESCAPED_CHAR\");\n if (value) {\n path += value;\n continue;\n }\n\n if (path) {\n result.push(path);\n path = \"\";\n }\n\n const open = tryConsume(\"OPEN\");\n if (open) {\n const prefix = consumeText();\n const name = tryConsume(\"NAME\") || \"\";\n const pattern = tryConsume(\"PATTERN\") || \"\";\n const suffix = consumeText();\n\n mustConsume(\"CLOSE\");\n\n result.push({\n name: name || (pattern ? key++ : \"\"),\n pattern: name && !pattern ? defaultPattern : pattern,\n prefix,\n suffix,\n modifier: tryConsume(\"MODIFIER\") || \"\",\n });\n continue;\n }\n\n mustConsume(\"END\");\n }\n\n return result;\n}\n\nexport interface TokensToFunctionOptions {\n /**\n * When `true` the regexp will be case sensitive. (default: `false`)\n */\n sensitive?: boolean;\n /**\n * Function for encoding input strings for output.\n */\n encode?: (value: string, token: Key) => string;\n /**\n * When `false` the function can produce an invalid (unmatched) path. (default: `true`)\n */\n validate?: boolean;\n}\n\n/**\n * Compile a string to a template function for the path.\n */\nexport function compile

(\n str: string,\n options?: ParseOptions & TokensToFunctionOptions\n) {\n return tokensToFunction

(parse(str, options), options);\n}\n\nexport type PathFunction

= (data?: P) => string;\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nexport function tokensToFunction

(\n tokens: Token[],\n options: TokensToFunctionOptions = {}\n): PathFunction

{\n const reFlags = flags(options);\n const { encode = (x: string) => x, validate = true } = options;\n\n // Compile all the tokens into regexps.\n const matches = tokens.map((token) => {\n if (typeof token === \"object\") {\n return new RegExp(`^(?:${token.pattern})$`, reFlags);\n }\n });\n\n return (data: Record | null | undefined) => {\n let path = \"\";\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (typeof token === \"string\") {\n path += token;\n continue;\n }\n\n const value = data ? data[token.name] : undefined;\n const optional = token.modifier === \"?\" || token.modifier === \"*\";\n const repeat = token.modifier === \"*\" || token.modifier === \"+\";\n\n if (Array.isArray(value)) {\n if (!repeat) {\n throw new TypeError(\n `Expected \"${token.name}\" to not repeat, but got an array`\n );\n }\n\n if (value.length === 0) {\n if (optional) continue;\n\n throw new TypeError(`Expected \"${token.name}\" to not be empty`);\n }\n\n for (let j = 0; j < value.length; j++) {\n const segment = encode(value[j], token);\n\n if (validate && !(matches[i] as RegExp).test(segment)) {\n throw new TypeError(\n `Expected all \"${token.name}\" to match \"${token.pattern}\", but got \"${segment}\"`\n );\n }\n\n path += token.prefix + segment + token.suffix;\n }\n\n continue;\n }\n\n if (typeof value === \"string\" || typeof value === \"number\") {\n const segment = encode(String(value), token);\n\n if (validate && !(matches[i] as RegExp).test(segment)) {\n throw new TypeError(\n `Expected \"${token.name}\" to match \"${token.pattern}\", but got \"${segment}\"`\n );\n }\n\n path += token.prefix + segment + token.suffix;\n continue;\n }\n\n if (optional) continue;\n\n const typeOfMessage = repeat ? \"an array\" : \"a string\";\n throw new TypeError(`Expected \"${token.name}\" to be ${typeOfMessage}`);\n }\n\n return path;\n };\n}\n\nexport interface RegexpToFunctionOptions {\n /**\n * Function for decoding strings for params.\n */\n decode?: (value: string, token: Key) => string;\n}\n\n/**\n * A match result contains data about the path match.\n */\nexport interface MatchResult

{\n path: string;\n index: number;\n params: P;\n}\n\n/**\n * A match is either `false` (no match) or a match result.\n */\nexport type Match

= false | MatchResult

;\n\n/**\n * The match function takes a string and returns whether it matched the path.\n */\nexport type MatchFunction

= (\n path: string\n) => Match

;\n\n/**\n * Create path match function from `path-to-regexp` spec.\n */\nexport function match

(\n str: Path,\n options?: ParseOptions & TokensToRegexpOptions & RegexpToFunctionOptions\n) {\n const keys: Key[] = [];\n const re = pathToRegexp(str, keys, options);\n return regexpToFunction

(re, keys, options);\n}\n\n/**\n * Create a path match function from `path-to-regexp` output.\n */\nexport function regexpToFunction

(\n re: RegExp,\n keys: Key[],\n options: RegexpToFunctionOptions = {}\n): MatchFunction

{\n const { decode = (x: string) => x } = options;\n\n return function (pathname: string) {\n const m = re.exec(pathname);\n if (!m) return false;\n\n const { 0: path, index } = m;\n const params = Object.create(null);\n\n for (let i = 1; i < m.length; i++) {\n if (m[i] === undefined) continue;\n\n const key = keys[i - 1];\n\n if (key.modifier === \"*\" || key.modifier === \"+\") {\n params[key.name] = m[i].split(key.prefix + key.suffix).map((value) => {\n return decode(value, key);\n });\n } else {\n params[key.name] = decode(m[i], key);\n }\n }\n\n return { path, index, params };\n };\n}\n\n/**\n * Escape a regular expression string.\n */\nfunction escapeString(str: string) {\n return str.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n}\n\n/**\n * Get the flags for a regexp from the options.\n */\nfunction flags(options?: { sensitive?: boolean }) {\n return options && options.sensitive ? \"\" : \"i\";\n}\n\n/**\n * Metadata about a key.\n */\nexport interface Key {\n name: string | number;\n prefix: string;\n suffix: string;\n pattern: string;\n modifier: string;\n}\n\n/**\n * A token is a string (nothing special) or key metadata (capture group).\n */\nexport type Token = string | Key;\n\n/**\n * Pull out keys from a regexp.\n */\nfunction regexpToRegexp(path: RegExp, keys?: Key[]): RegExp {\n if (!keys) return path;\n\n const groupsRegex = /\\((?:\\?<(.*?)>)?(?!\\?)/g;\n\n let index = 0;\n let execResult = groupsRegex.exec(path.source);\n while (execResult) {\n keys.push({\n // Use parenthesized substring match if available, index otherwise\n name: execResult[1] || index++,\n prefix: \"\",\n suffix: \"\",\n modifier: \"\",\n pattern: \"\",\n });\n execResult = groupsRegex.exec(path.source);\n }\n\n return path;\n}\n\n/**\n * Transform an array into a regexp.\n */\nfunction arrayToRegexp(\n paths: Array,\n keys?: Key[],\n options?: TokensToRegexpOptions & ParseOptions\n): RegExp {\n const parts = paths.map((path) => pathToRegexp(path, keys, options).source);\n return new RegExp(`(?:${parts.join(\"|\")})`, flags(options));\n}\n\n/**\n * Create a path regexp from string input.\n */\nfunction stringToRegexp(\n path: string,\n keys?: Key[],\n options?: TokensToRegexpOptions & ParseOptions\n) {\n return tokensToRegexp(parse(path, options), keys, options);\n}\n\nexport interface TokensToRegexpOptions {\n /**\n * When `true` the regexp will be case sensitive. (default: `false`)\n */\n sensitive?: boolean;\n /**\n * When `true` the regexp won't allow an optional trailing delimiter to match. (default: `false`)\n */\n strict?: boolean;\n /**\n * When `true` the regexp will match to the end of the string. (default: `true`)\n */\n end?: boolean;\n /**\n * When `true` the regexp will match from the beginning of the string. (default: `true`)\n */\n start?: boolean;\n /**\n * Sets the final character for non-ending optimistic matches. (default: `/`)\n */\n delimiter?: string;\n /**\n * List of characters that can also be \"end\" characters.\n */\n endsWith?: string;\n /**\n * Encode path tokens for use in the `RegExp`.\n */\n encode?: (value: string) => string;\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n */\nexport function tokensToRegexp(\n tokens: Token[],\n keys?: Key[],\n options: TokensToRegexpOptions = {}\n) {\n const {\n strict = false,\n start = true,\n end = true,\n encode = (x: string) => x,\n delimiter = \"/#?\",\n endsWith = \"\",\n } = options;\n const endsWithRe = `[${escapeString(endsWith)}]|$`;\n const delimiterRe = `[${escapeString(delimiter)}]`;\n let route = start ? \"^\" : \"\";\n\n // Iterate over the tokens and create our regexp string.\n for (const token of tokens) {\n if (typeof token === \"string\") {\n route += escapeString(encode(token));\n } else {\n const prefix = escapeString(encode(token.prefix));\n const suffix = escapeString(encode(token.suffix));\n\n if (token.pattern) {\n if (keys) keys.push(token);\n\n if (prefix || suffix) {\n if (token.modifier === \"+\" || token.modifier === \"*\") {\n const mod = token.modifier === \"*\" ? \"?\" : \"\";\n route += `(?:${prefix}((?:${token.pattern})(?:${suffix}${prefix}(?:${token.pattern}))*)${suffix})${mod}`;\n } else {\n route += `(?:${prefix}(${token.pattern})${suffix})${token.modifier}`;\n }\n } else {\n if (token.modifier === \"+\" || token.modifier === \"*\") {\n route += `((?:${token.pattern})${token.modifier})`;\n } else {\n route += `(${token.pattern})${token.modifier}`;\n }\n }\n } else {\n route += `(?:${prefix}${suffix})${token.modifier}`;\n }\n }\n }\n\n if (end) {\n if (!strict) route += `${delimiterRe}?`;\n\n route += !options.endsWith ? \"$\" : `(?=${endsWithRe})`;\n } else {\n const endToken = tokens[tokens.length - 1];\n const isEndDelimited =\n typeof endToken === \"string\"\n ? delimiterRe.indexOf(endToken[endToken.length - 1]) > -1\n : endToken === undefined;\n\n if (!strict) {\n route += `(?:${delimiterRe}(?=${endsWithRe}))?`;\n }\n\n if (!isEndDelimited) {\n route += `(?=${delimiterRe}|${endsWithRe})`;\n }\n }\n\n return new RegExp(route, flags(options));\n}\n\n/**\n * Supported `path-to-regexp` input types.\n */\nexport type Path = string | RegExp | Array;\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n */\nexport function pathToRegexp(\n path: Path,\n keys?: Key[],\n options?: TokensToRegexpOptions & ParseOptions\n) {\n if (path instanceof RegExp) return regexpToRegexp(path, keys);\n if (Array.isArray(path)) return arrayToRegexp(path, keys, options);\n return stringToRegexp(path, keys, options);\n}\n", "/** Turn a string into a slug by lowercasing and replacing whitespace. */\nexport const classify = (text: string, fallback?: string): string => {\n\tconst output = String(text)\n\t\t.toLowerCase()\n\t\t// .normalize('NFD') // split an accented letter in the base letter and the acent\n\t\t// .replace(/[\\u0300-\\u036f]/g, '') // remove all previously split accents\n\t\t.replace(/[\\s/_.]+/g, '-') // replace spaces and _./ with '-'\n\t\t.replace(/[^\\w-]+/g, '') // remove all non-word chars\n\t\t.replace(/--+/g, '-') // replace repeating '-' with single '-'\n\t\t.replace(/^-+|-+$/g, ''); // trim '-' from edges\n\treturn output || fallback || '';\n};\n", "/** Get the current page URL: path name + query params. Optionally including hash. */\nexport const getCurrentUrl = ({ hash }: { hash?: boolean } = {}): string => {\n\treturn window.location.pathname + window.location.search + (hash ? window.location.hash : '');\n};\n", "import { getCurrentUrl } from './getCurrentUrl.js';\n\nexport interface HistoryState {\n\turl: string;\n\tsource: 'swup';\n\trandom: number;\n\tindex?: number;\n\t[key: string]: unknown;\n}\n\ntype HistoryData = Record;\n\n/** Create a new history record with a custom swup identifier. */\nexport const createHistoryRecord = (url: string, data: HistoryData = {}): void => {\n\turl = url || getCurrentUrl({ hash: true });\n\tconst state: HistoryState = {\n\t\turl,\n\t\trandom: Math.random(),\n\t\tsource: 'swup',\n\t\t...data\n\t};\n\twindow.history.pushState(state, '', url);\n};\n\n/** Update the current history record with a custom swup identifier. */\nexport const updateHistoryRecord = (url: string | null = null, data: HistoryData = {}): void => {\n\turl = url || getCurrentUrl({ hash: true });\n\tconst currentState = (window.history.state as HistoryState) || {};\n\tconst state: HistoryState = {\n\t\t...currentState,\n\t\turl,\n\t\trandom: Math.random(),\n\t\tsource: 'swup',\n\t\t...data\n\t};\n\twindow.history.replaceState(state, '', url);\n};\n", "import delegate, {\n\ttype DelegateEventHandler,\n\ttype DelegateOptions,\n\ttype EventType\n} from 'delegate-it';\nimport type { ParseSelector } from 'typed-query-selector/parser.js';\n\nexport type DelegateEventUnsubscribe = {\n\tdestroy: () => void;\n};\n\n/** Register a delegated event listener. */\nexport const delegateEvent = <\n\tSelector extends string,\n\tTElement extends Element = ParseSelector,\n\tTEvent extends EventType = EventType\n>(\n\tselector: Selector,\n\ttype: TEvent,\n\tcallback: DelegateEventHandler,\n\toptions?: DelegateOptions\n): DelegateEventUnsubscribe => {\n\tconst controller = new AbortController();\n\toptions = { ...options, signal: controller.signal };\n\tdelegate(selector, type, callback, options);\n\treturn { destroy: () => controller.abort() };\n};\n", "/**\n * A helper for creating a Location from either an element\n * or a URL object/string\n *\n */\nexport class Location extends URL {\n\tconstructor(url: URL | string, base: string = document.baseURI) {\n\t\tsuper(url.toString(), base);\n\t\t// Fix Safari bug with extending native classes\n\t\tObject.setPrototypeOf(this, Location.prototype);\n\t}\n\n\t/**\n\t * The full local path including query params.\n\t */\n\tget url(): string {\n\t\treturn this.pathname + this.search;\n\t}\n\n\t/**\n\t * Instantiate a Location from an element's href attribute\n\t * @param el\n\t * @returns new Location instance\n\t */\n\tstatic fromElement(el: Element): Location {\n\t\tconst href = el.getAttribute('href') || el.getAttribute('xlink:href') || '';\n\t\treturn new Location(href);\n\t}\n\n\t/**\n\t * Instantiate a Location from a URL object or string\n\t * @param url\n\t * @returns new Location instance\n\t */\n\tstatic fromUrl(url: URL | string): Location {\n\t\treturn new Location(url);\n\t}\n}\n", "import { match } from 'path-to-regexp';\n\nimport type {\n\tPath,\n\tParseOptions,\n\tTokensToRegexpOptions,\n\tRegexpToFunctionOptions,\n\tMatchFunction\n} from 'path-to-regexp';\n\nexport { type Path };\n\n/** Create a match function from a path pattern that checks if a URLs matches it. */\nexport const matchPath =

(\n\tpath: Path,\n\toptions?: ParseOptions & TokensToRegexpOptions & RegexpToFunctionOptions\n): MatchFunction

=> {\n\ttry {\n\t\treturn match

(path, options);\n\t} catch (error) {\n\t\tthrow new Error(`[swup] Error parsing path \"${String(path)}\":\\n${String(error)}`);\n\t}\n};\n", "import type Swup from '../Swup.js';\nimport { Location } from '../helpers.js';\nimport type { Visit } from './Visit.js';\n\n/** A page object as used by swup and its cache. */\nexport interface PageData {\n\t/** The URL of the page */\n\turl: string;\n\t/** The complete HTML response received from the server */\n\thtml: string;\n}\n\n/** Define how a page is fetched. */\nexport interface FetchOptions extends Omit {\n\t/** The request method. */\n\tmethod?: 'GET' | 'POST';\n\t/** The body of the request: raw string, form data object or URL params. */\n\tbody?: string | FormData | URLSearchParams;\n\t/** The request timeout in milliseconds. */\n\ttimeout?: number;\n\t/** Optional visit object with additional context. @internal */\n\tvisit?: Visit;\n}\n\nexport class FetchError extends Error {\n\turl: string;\n\tstatus?: number;\n\taborted: boolean;\n\ttimedOut: boolean;\n\tconstructor(\n\t\tmessage: string,\n\t\tdetails: { url: string; status?: number; aborted?: boolean; timedOut?: boolean }\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'FetchError';\n\t\tthis.url = details.url;\n\t\tthis.status = details.status;\n\t\tthis.aborted = details.aborted || false;\n\t\tthis.timedOut = details.timedOut || false;\n\t}\n}\n\n/**\n * Fetch a page from the server, return it and cache it.\n */\nexport async function fetchPage(\n\tthis: Swup,\n\turl: URL | string,\n\toptions: FetchOptions = {}\n): Promise {\n\turl = Location.fromUrl(url).url;\n\n\tconst { visit = this.visit } = options;\n\tconst headers = { ...this.options.requestHeaders, ...options.headers };\n\tconst timeout = options.timeout ?? this.options.timeout;\n\tconst controller = new AbortController();\n\tconst { signal } = controller;\n\toptions = { ...options, headers, signal };\n\n\tlet timedOut = false;\n\tlet timeoutId: ReturnType | null = null;\n\tif (timeout && timeout > 0) {\n\t\ttimeoutId = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tcontroller.abort('timeout');\n\t\t}, timeout);\n\t}\n\n\t// Allow hooking before this and returning a custom response-like object (e.g. custom fetch implementation)\n\tlet response: Response;\n\ttry {\n\t\tresponse = await this.hooks.call(\n\t\t\t'fetch:request',\n\t\t\tvisit,\n\t\t\t{ url, options },\n\t\t\t(visit, { url, options }) => fetch(url, options)\n\t\t);\n\t\tif (timeoutId) {\n\t\t\tclearTimeout(timeoutId);\n\t\t}\n\t} catch (error) {\n\t\tif (timedOut) {\n\t\t\tthis.hooks.call('fetch:timeout', visit, { url });\n\t\t\tthrow new FetchError(`Request timed out: ${url}`, { url, timedOut });\n\t\t}\n\t\tif ((error as Error)?.name === 'AbortError' || signal.aborted) {\n\t\t\tthrow new FetchError(`Request aborted: ${url}`, { url, aborted: true });\n\t\t}\n\t\tthrow error;\n\t}\n\n\tconst { status, url: responseUrl } = response;\n\tconst html = await response.text();\n\n\tif (status === 500) {\n\t\tthis.hooks.call('fetch:error', visit, { status, response, url: responseUrl });\n\t\tthrow new FetchError(`Server error: ${responseUrl}`, { status, url: responseUrl });\n\t}\n\n\tif (!html) {\n\t\tthrow new FetchError(`Empty response: ${responseUrl}`, { status, url: responseUrl });\n\t}\n\n\t// Resolve real url after potential redirect\n\tconst { url: finalUrl } = Location.fromUrl(responseUrl);\n\tconst page = { url: finalUrl, html };\n\n\t// Write to cache for safe methods and non-redirects\n\tif (visit.cache.write && (!options.method || options.method === 'GET') && url === finalUrl) {\n\t\tthis.cache.set(page.url, page);\n\t}\n\n\treturn page;\n}\n", "import type Swup from '../Swup.js';\nimport { Location } from '../helpers.js';\nimport { type PageData } from './fetchPage.js';\n\nexport interface CacheData extends PageData {}\n\n/**\n * In-memory page cache.\n */\nexport class Cache {\n\t/** Swup instance this cache belongs to */\n\tprotected swup: Swup;\n\n\t/** Cached pages, indexed by URL */\n\tprotected pages: Map = new Map();\n\n\tconstructor(swup: Swup) {\n\t\tthis.swup = swup;\n\t}\n\n\t/** Number of cached pages in memory. */\n\tget size(): number {\n\t\treturn this.pages.size;\n\t}\n\n\t/** All cached pages. */\n\tget all() {\n\t\tconst copy = new Map();\n\t\tthis.pages.forEach((page, key) => {\n\t\t\tcopy.set(key, { ...page });\n\t\t});\n\t\treturn copy;\n\t}\n\n\t/** Check if the given URL has been cached. */\n\thas(url: string): boolean {\n\t\treturn this.pages.has(this.resolve(url));\n\t}\n\n\t/** Return a shallow copy of the cached page object if available. */\n\tget(url: string): CacheData | undefined {\n\t\tconst result = this.pages.get(this.resolve(url));\n\t\tif (!result) return result;\n\t\treturn { ...result };\n\t}\n\n\t/** Create a cache record for the specified URL. */\n\tset(url: string, page: CacheData) {\n\t\turl = this.resolve(url);\n\t\tpage = { ...page, url };\n\t\tthis.pages.set(url, page);\n\t\tthis.swup.hooks.callSync('cache:set', undefined, { page });\n\t}\n\n\t/** Update a cache record, overwriting or adding custom data. */\n\tupdate(url: string, payload: object) {\n\t\turl = this.resolve(url);\n\t\tconst page = { ...this.get(url), ...payload, url } as CacheData;\n\t\tthis.pages.set(url, page);\n\t}\n\n\t/** Delete a cache record. */\n\tdelete(url: string): void {\n\t\tthis.pages.delete(this.resolve(url));\n\t}\n\n\t/** Empty the cache. */\n\tclear(): void {\n\t\tthis.pages.clear();\n\t\tthis.swup.hooks.callSync('cache:clear', undefined, undefined);\n\t}\n\n\t/** Remove all cache entries that return true for a given predicate function. */\n\tprune(predicate: (url: string, page: CacheData) => boolean): void {\n\t\tthis.pages.forEach((page, url) => {\n\t\t\tif (predicate(url, page)) {\n\t\t\t\tthis.delete(url);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Resolve URLs by making them local and letting swup resolve them. */\n\tprotected resolve(urlToResolve: string): string {\n\t\tconst { url } = Location.fromUrl(urlToResolve);\n\t\treturn this.swup.resolveUrl(url);\n\t}\n}\n", "/** Find an element by selector. */\nexport const query = (selector: string, context: Document | Element = document) => {\n\treturn context.querySelector(selector);\n};\n\n/** Find a set of elements by selector. */\nexport const queryAll = (\n\tselector: string,\n\tcontext: Document | Element = document\n): HTMLElement[] => {\n\treturn Array.from(context.querySelectorAll(selector));\n};\n\n/** Return a Promise that resolves after the next event loop. */\nexport const nextTick = (): Promise => {\n\treturn new Promise((resolve) => {\n\t\trequestAnimationFrame(() => {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t});\n};\n\n/** Check if an object is a Promise or a Thenable */\nexport function isPromise(obj: unknown): obj is PromiseLike {\n\treturn (\n\t\t!!obj &&\n\t\t(typeof obj === 'object' || typeof obj === 'function') &&\n\t\ttypeof (obj as Record).then === 'function'\n\t);\n}\n\n/** Call a function as a Promise. Resolves with the returned Promsise or immediately. */\n// eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any\nexport function runAsPromise(func: Function, args: unknown[] = []): Promise {\n\treturn new Promise((resolve, reject) => {\n\t\tconst result: unknown = func(...args);\n\t\tif (isPromise(result)) {\n\t\t\tresult.then(resolve, reject);\n\t\t} else {\n\t\t\tresolve(result);\n\t\t}\n\t});\n}\n\n/**\n * Force a layout reflow, e.g. after adding classnames\n * @returns The offset height, just here so it doesn't get optimized away by the JS engine\n * @see https://stackoverflow.com/a/21665117/3759615\n */\nexport function forceReflow(element?: HTMLElement) {\n\telement = element || document.body;\n\treturn element?.offsetHeight;\n}\n\n/** Escape a string with special chars to not break CSS selectors. */\nexport const escapeCssIdentifier = (ident: string) => {\n\t// @ts-ignore this is for support check, so it's correct that TS complains\n\tif (window.CSS && window.CSS.escape) {\n\t\treturn CSS.escape(ident);\n\t}\n\treturn ident;\n};\n\n/** Fix for Chrome below v61 formatting CSS floats with comma in some locales. */\nexport const toMs = (s: string) => {\n\treturn Number(s.slice(0, -1).replace(',', '.')) * 1000;\n};\n", "import type Swup from '../Swup.js';\nimport { queryAll } from '../utils.js';\n\nexport class Classes {\n\tprotected swup: Swup;\n\tprotected swupClasses = [\n\t\t'to-',\n\t\t'is-changing',\n\t\t'is-rendering',\n\t\t'is-popstate',\n\t\t'is-animating',\n\t\t'is-leaving'\n\t];\n\n\tconstructor(swup: Swup) {\n\t\tthis.swup = swup;\n\t}\n\n\tprotected get selectors(): string[] {\n\t\tconst { scope } = this.swup.visit.animation;\n\t\tif (scope === 'containers') return this.swup.visit.containers;\n\t\tif (scope === 'html') return ['html'];\n\t\tif (Array.isArray(scope)) return scope;\n\t\treturn [];\n\t}\n\n\tprotected get selector(): string {\n\t\treturn this.selectors.join(',');\n\t}\n\n\tprotected get targets(): HTMLElement[] {\n\t\tif (!this.selector.trim()) return [];\n\t\treturn queryAll(this.selector);\n\t}\n\n\tadd(...classes: string[]): void {\n\t\tthis.targets.forEach((target) => target.classList.add(...classes));\n\t}\n\n\tremove(...classes: string[]): void {\n\t\tthis.targets.forEach((target) => target.classList.remove(...classes));\n\t}\n\n\tclear(): void {\n\t\tthis.targets.forEach((target) => {\n\t\t\tconst remove = target.className.split(' ').filter((c) => this.isSwupClass(c));\n\t\t\ttarget.classList.remove(...remove);\n\t\t});\n\t}\n\n\tprotected isSwupClass(className: string): boolean {\n\t\treturn this.swupClasses.some((c) => className.startsWith(c));\n\t}\n}\n", "import type Swup from '../Swup.js';\nimport type { Options } from '../Swup.js';\nimport type { HistoryAction, HistoryDirection } from './navigate.js';\n\n/** See below for the class Visit {} definition */\n// export interface Visit {}\n\nexport interface VisitFrom {\n\t/** The URL of the previous page */\n\turl: string;\n}\n\nexport interface VisitTo {\n\t/** The URL of the next page */\n\turl: string;\n\t/** The hash of the next page */\n\thash?: string;\n\t/** The HTML content of the next page */\n\thtml?: string;\n}\n\nexport interface VisitAnimation {\n\t/** Whether this visit is animated. Default: `true` */\n\tanimate: boolean;\n\t/** Whether to wait for the next page to load before starting the animation. Default: `false` */\n\twait: boolean;\n\t/** Name of a custom animation to run. */\n\tname?: string;\n\t/** Whether this animation uses the native browser ViewTransition API. Default: `false` */\n\tnative: boolean;\n\t/** Elements on which to add animation classes. Default: `html` element */\n\tscope: 'html' | 'containers' | string[];\n\t/** Selector for detecting animation timing. Default: `[class*=\"transition-\"]` */\n\tselector: Options['animationSelector'];\n}\n\nexport interface VisitScroll {\n\t/** Whether to reset the scroll position after the visit. Default: `true` */\n\treset: boolean;\n\t/** Anchor element to scroll to on the next page. */\n\ttarget?: string | false;\n}\n\nexport interface VisitTrigger {\n\t/** DOM element that triggered this visit. */\n\tel?: Element;\n\t/** DOM event that triggered this visit. */\n\tevent?: Event;\n}\n\nexport interface VisitCache {\n\t/** Whether this visit will try to load the requested page from cache. */\n\tread: boolean;\n\t/** Whether this visit will save the loaded page in cache. */\n\twrite: boolean;\n}\n\nexport interface VisitHistory {\n\t/** History action to perform: `push` for creating a new history entry, `replace` for replacing the current entry. Default: `push` */\n\taction: HistoryAction;\n\t/** Whether this visit was triggered by a browser history navigation. */\n\tpopstate: boolean;\n\t/** The direction of travel in case of a browser history navigation: backward or forward. */\n\tdirection: HistoryDirection | undefined;\n}\n\nexport interface VisitInitOptions {\n\tto: string;\n\tfrom?: string;\n\thash?: string;\n\tel?: Element;\n\tevent?: Event;\n}\n\n/** @internal */\nexport const VisitState = {\n\tCREATED: 1,\n\tQUEUED: 2,\n\tSTARTED: 3,\n\tLEAVING: 4,\n\tLOADED: 5,\n\tENTERING: 6,\n\tCOMPLETED: 7,\n\tABORTED: 8,\n\tFAILED: 9\n} as const;\n\n/** @internal */\nexport type VisitState = (typeof VisitState)[keyof typeof VisitState];\n\n/** An object holding details about the current visit. */\nexport class Visit {\n\t/** A unique ID to identify this visit */\n\tid: number;\n\t/** The current state of this visit @internal */\n\tstate: VisitState;\n\t/** The previous page, about to leave */\n\tfrom: VisitFrom;\n\t/** The next page, about to enter */\n\tto: VisitTo;\n\t/** The content containers, about to be replaced */\n\tcontainers: Options['containers'];\n\t/** Information about animated page transitions */\n\tanimation: VisitAnimation;\n\t/** What triggered this visit */\n\ttrigger: VisitTrigger;\n\t/** Cache behavior for this visit */\n\tcache: VisitCache;\n\t/** Browser history behavior on this visit */\n\thistory: VisitHistory;\n\t/** Scroll behavior on this visit */\n\tscroll: VisitScroll;\n\n\tconstructor(swup: Swup, options: VisitInitOptions) {\n\t\tconst { to, from = swup.currentPageUrl, hash, el, event } = options;\n\n\t\tthis.id = Math.random();\n\t\tthis.state = VisitState.CREATED;\n\t\tthis.from = { url: from };\n\t\tthis.to = { url: to, hash };\n\t\tthis.containers = swup.options.containers;\n\t\tthis.animation = {\n\t\t\tanimate: true,\n\t\t\twait: false,\n\t\t\tname: undefined,\n\t\t\tnative: swup.options.native,\n\t\t\tscope: swup.options.animationScope,\n\t\t\tselector: swup.options.animationSelector\n\t\t};\n\t\tthis.trigger = { el, event };\n\t\tthis.cache = {\n\t\t\tread: swup.options.cache,\n\t\t\twrite: swup.options.cache\n\t\t};\n\t\tthis.history = {\n\t\t\taction: 'push',\n\t\t\tpopstate: false,\n\t\t\tdirection: undefined\n\t\t};\n\t\tthis.scroll = {\n\t\t\treset: true,\n\t\t\ttarget: undefined\n\t\t};\n\t}\n\t/** @internal */\n\tadvance(state: VisitState) {\n\t\tif (this.state < state) {\n\t\t\tthis.state = state;\n\t\t}\n\t}\n\n\t/** @internal */\n\tabort() {\n\t\tthis.state = VisitState.ABORTED;\n\t}\n\n\t/** Is this visit done, i.e. completed, failed, or aborted? */\n\tget done(): boolean {\n\t\treturn this.state >= VisitState.COMPLETED;\n\t}\n}\n\n/** Create a new visit object. */\nexport function createVisit(this: Swup, options: VisitInitOptions): Visit {\n\treturn new Visit(this, options);\n}\n", "import type { DelegateEvent } from 'delegate-it';\n\nimport type Swup from '../Swup.js';\nimport { isPromise, runAsPromise } from '../utils.js';\nimport { Visit } from './Visit.js';\nimport type { FetchOptions, PageData } from './fetchPage.js';\n\nexport interface HookDefinitions {\n\t'animation:out:start': undefined;\n\t'animation:out:await': { skip: boolean };\n\t'animation:out:end': undefined;\n\t'animation:in:start': undefined;\n\t'animation:in:await': { skip: boolean };\n\t'animation:in:end': undefined;\n\t'animation:skip': undefined;\n\t'cache:clear': undefined;\n\t'cache:set': { page: PageData };\n\t'content:replace': { page: PageData };\n\t'content:scroll': undefined;\n\t'enable': undefined;\n\t'disable': undefined;\n\t'fetch:request': { url: string; options: FetchOptions };\n\t'fetch:error': { url: string; status: number; response: Response };\n\t'fetch:timeout': { url: string };\n\t'history:popstate': { event: PopStateEvent };\n\t'link:click': { el: HTMLAnchorElement; event: DelegateEvent };\n\t'link:self': undefined;\n\t'link:anchor': { hash: string };\n\t'link:newtab': { href: string };\n\t'page:load': { page?: PageData; cache?: boolean; options: FetchOptions };\n\t'page:view': { url: string; title: string };\n\t'scroll:top': { options: ScrollIntoViewOptions };\n\t'scroll:anchor': { hash: string; options: ScrollIntoViewOptions };\n\t'visit:start': undefined;\n\t'visit:transition': undefined;\n\t'visit:abort': undefined;\n\t'visit:end': undefined;\n}\n\nexport interface HookReturnValues {\n\t'content:scroll': Promise | boolean;\n\t'fetch:request': Promise;\n\t'page:load': Promise;\n\t'scroll:top': boolean;\n\t'scroll:anchor': boolean;\n}\n\nexport type HookArguments = HookDefinitions[T];\n\nexport type HookName = keyof HookDefinitions;\n\n/** A generic hook handler. */\nexport type HookHandler = (\n\t/** Context about the current visit. */\n\tvisit: Visit,\n\t/** Local arguments passed into the handler. */\n\targs: HookArguments\n) => Promise | unknown;\n\n/** A default hook handler with an expected return type. */\nexport type HookDefaultHandler = (\n\t/** Context about the current visit. */\n\tvisit: Visit,\n\t/** Local arguments passed into the handler. */\n\targs: HookArguments,\n\t/** Default handler to be executed. Available if replacing an internal hook handler. */\n\tdefaultHandler?: HookDefaultHandler\n) => T extends keyof HookReturnValues ? HookReturnValues[T] : Promise | unknown;\n\nexport type Handlers = {\n\t[K in HookName]: HookHandler[];\n};\n\n/** Unregister a previously registered hook handler. */\nexport type HookUnregister = () => void;\n\n/** Define when and how a hook handler is executed. */\nexport type HookOptions = {\n\t/** Execute the hook once, then remove the handler */\n\tonce?: boolean;\n\t/** Execute the hook before the internal default handler */\n\tbefore?: boolean;\n\t/** Set a priority for when to execute this hook. Lower numbers execute first. Default: `0` */\n\tpriority?: number;\n\t/** Replace the internal default handler with this hook handler */\n\treplace?: boolean;\n};\n\nexport type HookRegistration<\n\tT extends HookName,\n\tH extends HookHandler | HookDefaultHandler = HookHandler\n> = {\n\tid: number;\n\thook: T;\n\thandler: H;\n\tdefaultHandler?: HookDefaultHandler;\n} & HookOptions;\n\ntype HookEventDetail = {\n\thook: HookName;\n\targs: unknown;\n\tvisit: Visit;\n};\n\nexport type HookEvent = CustomEvent;\n\ntype HookLedger = Map, HookRegistration>;\n\ninterface HookRegistry extends Map> {\n\tget(key: K): HookLedger | undefined;\n\tset(key: K, value: HookLedger): this;\n}\n\n/**\n * Hook registry.\n *\n * Create, trigger and handle hooks.\n *\n */\nexport class Hooks {\n\t/** Swup instance this registry belongs to */\n\tprotected swup: Swup;\n\n\t/** Map of all registered hook handlers. */\n\tprotected registry: HookRegistry = new Map();\n\n\t// Can we deduplicate this somehow? Or make it error when not in sync with HookDefinitions?\n\t// https://stackoverflow.com/questions/53387838/how-to-ensure-an-arrays-values-the-keys-of-a-typescript-interface/53395649\n\tprotected readonly hooks: HookName[] = [\n\t\t'animation:out:start',\n\t\t'animation:out:await',\n\t\t'animation:out:end',\n\t\t'animation:in:start',\n\t\t'animation:in:await',\n\t\t'animation:in:end',\n\t\t'animation:skip',\n\t\t'cache:clear',\n\t\t'cache:set',\n\t\t'content:replace',\n\t\t'content:scroll',\n\t\t'enable',\n\t\t'disable',\n\t\t'fetch:request',\n\t\t'fetch:error',\n\t\t'fetch:timeout',\n\t\t'history:popstate',\n\t\t'link:click',\n\t\t'link:self',\n\t\t'link:anchor',\n\t\t'link:newtab',\n\t\t'page:load',\n\t\t'page:view',\n\t\t'scroll:top',\n\t\t'scroll:anchor',\n\t\t'visit:start',\n\t\t'visit:transition',\n\t\t'visit:abort',\n\t\t'visit:end'\n\t];\n\n\tconstructor(swup: Swup) {\n\t\tthis.swup = swup;\n\t\tthis.init();\n\t}\n\n\t/**\n\t * Create ledgers for all core hooks.\n\t */\n\tprotected init() {\n\t\tthis.hooks.forEach((hook) => this.create(hook));\n\t}\n\n\t/**\n\t * Create a new hook type.\n\t */\n\tcreate(hook: string) {\n\t\tif (!this.registry.has(hook as HookName)) {\n\t\t\tthis.registry.set(hook as HookName, new Map());\n\t\t}\n\t}\n\n\t/**\n\t * Check if a hook type exists.\n\t */\n\texists(hook: HookName): boolean {\n\t\treturn this.registry.has(hook);\n\t}\n\n\t/**\n\t * Get the ledger with all registrations for a hook.\n\t */\n\tprotected get(hook: T): HookLedger | undefined {\n\t\tconst ledger = this.registry.get(hook);\n\t\tif (ledger) {\n\t\t\treturn ledger;\n\t\t}\n\t\tconsole.error(`Unknown hook '${hook}'`);\n\t}\n\n\t/**\n\t * Remove all handlers of all hooks.\n\t */\n\tclear() {\n\t\tthis.registry.forEach((ledger) => ledger.clear());\n\t}\n\n\t/**\n\t * Register a new hook handler.\n\t * @param hook Name of the hook to listen for\n\t * @param handler The handler function to execute\n\t * @param options Object to specify how and when the handler is executed\n\t * Available options:\n\t * - `once`: Only execute the handler once\n\t * - `before`: Execute the handler before the default handler\n\t * - `priority`: Specify the order in which the handlers are executed\n\t * - `replace`: Replace the default handler with this handler\n\t * @returns A function to unregister the handler\n\t */\n\n\t// Overload: replacing default handler\n\ton(hook: T, handler: HookDefaultHandler, options: O & { replace: true }): HookUnregister; // prettier-ignore\n\t// Overload: passed in handler options\n\ton(hook: T, handler: HookHandler, options: O): HookUnregister; // prettier-ignore\n\t// Overload: no handler options\n\ton(hook: T, handler: HookHandler): HookUnregister; // prettier-ignore\n\t// Implementation\n\ton(\n\t\thook: T,\n\t\thandler: O['replace'] extends true ? HookDefaultHandler : HookHandler,\n\t\toptions: Partial = {}\n\t): HookUnregister {\n\t\tconst ledger = this.get(hook);\n\t\tif (!ledger) {\n\t\t\tconsole.warn(`Hook '${hook}' not found.`);\n\t\t\treturn () => {};\n\t\t}\n\n\t\tconst id = ledger.size + 1;\n\t\tconst registration: HookRegistration = { ...options, id, hook, handler };\n\t\tledger.set(handler, registration);\n\n\t\treturn () => this.off(hook, handler);\n\t}\n\n\t/**\n\t * Register a new hook handler to run before the default handler.\n\t * Shortcut for `hooks.on(hook, handler, { before: true })`.\n\t * @param hook Name of the hook to listen for\n\t * @param handler The handler function to execute\n\t * @param options Any other event options (see `hooks.on()` for details)\n\t * @returns A function to unregister the handler\n\t * @see on\n\t */\n\t// Overload: passed in handler options\n\tbefore(hook: T, handler: HookHandler, options: HookOptions): HookUnregister; // prettier-ignore\n\t// Overload: no handler options\n\tbefore(hook: T, handler: HookHandler): HookUnregister;\n\t// Implementation\n\tbefore(\n\t\thook: T,\n\t\thandler: HookHandler,\n\t\toptions: HookOptions = {}\n\t): HookUnregister {\n\t\treturn this.on(hook, handler, { ...options, before: true });\n\t}\n\n\t/**\n\t * Register a new hook handler to replace the default handler.\n\t * Shortcut for `hooks.on(hook, handler, { replace: true })`.\n\t * @param hook Name of the hook to listen for\n\t * @param handler The handler function to execute instead of the default handler\n\t * @param options Any other event options (see `hooks.on()` for details)\n\t * @returns A function to unregister the handler\n\t * @see on\n\t */\n\t// Overload: passed in handler options\n\treplace(hook: T, handler: HookDefaultHandler, options: HookOptions): HookUnregister; // prettier-ignore\n\t// Overload: no handler options\n\treplace(hook: T, handler: HookDefaultHandler): HookUnregister; // prettier-ignore\n\t// Implementation\n\treplace(\n\t\thook: T,\n\t\thandler: HookDefaultHandler,\n\t\toptions: HookOptions = {}\n\t): HookUnregister {\n\t\treturn this.on(hook, handler, { ...options, replace: true });\n\t}\n\n\t/**\n\t * Register a new hook handler to run once.\n\t * Shortcut for `hooks.on(hook, handler, { once: true })`.\n\t * @param hook Name of the hook to listen for\n\t * @param handler The handler function to execute\n\t * @param options Any other event options (see `hooks.on()` for details)\n\t * @see on\n\t */\n\t// Overload: passed in handler options\n\tonce(hook: T, handler: HookHandler, options: HookOptions): HookUnregister; // prettier-ignore\n\t// Overload: no handler options\n\tonce(hook: T, handler: HookHandler): HookUnregister;\n\t// Implementation\n\tonce(\n\t\thook: T,\n\t\thandler: HookHandler,\n\t\toptions: HookOptions = {}\n\t): HookUnregister {\n\t\treturn this.on(hook, handler, { ...options, once: true });\n\t}\n\n\t/**\n\t * Unregister a hook handler.\n\t * @param hook Name of the hook the handler is registered for\n\t * @param handler The handler function that was registered.\n\t * If omitted, all handlers for the hook will be removed.\n\t */\n\t// Overload: unregister a specific handler\n\toff(hook: T, handler: HookHandler | HookDefaultHandler): void;\n\t// Overload: unregister all handlers\n\toff(hook: T): void;\n\t// Implementation\n\toff(hook: T, handler?: HookHandler | HookDefaultHandler): void {\n\t\tconst ledger = this.get(hook);\n\t\tif (ledger && handler) {\n\t\t\tconst deleted = ledger.delete(handler);\n\t\t\tif (!deleted) {\n\t\t\t\tconsole.warn(`Handler for hook '${hook}' not found.`);\n\t\t\t}\n\t\t} else if (ledger) {\n\t\t\tledger.clear();\n\t\t}\n\t}\n\n\t/**\n\t * Trigger a hook asynchronously, executing its default handler and all registered handlers.\n\t * Will execute all handlers in order and `await` any `Promise`s they return.\n\t * @param hook Name of the hook to trigger\n\t * @param visit The visit object this hook belongs to\n\t * @param args Arguments to pass to the handler\n\t * @param defaultHandler A default implementation of this hook to execute\n\t * @returns The resolved return value of the executed default handler\n\t */\n\t// Overload: default order of arguments\n\tasync call(hook: T, visit: Visit | undefined, args: HookArguments, defaultHandler?: HookDefaultHandler): Promise>>>; // prettier-ignore\n\t// Overload: legacy order of arguments, with visit missing\n\tasync call(hook: T, args: HookArguments, defaultHandler?: HookDefaultHandler): Promise>>>; // prettier-ignore\n\t// Implementation\n\tasync call(\n\t\thook: T,\n\t\targ1: Visit | HookArguments,\n\t\targ2: HookArguments | HookDefaultHandler,\n\t\targ3?: HookDefaultHandler\n\t): Promise>>> {\n\t\tconst [visit, args, defaultHandler] = this.parseCallArgs(hook, arg1, arg2, arg3);\n\n\t\tconst { before, handler, after } = this.getHandlers(hook, defaultHandler);\n\t\tawait this.run(before, visit, args);\n\t\tconst [result] = await this.run(handler, visit, args, true);\n\t\tawait this.run(after, visit, args);\n\t\tthis.dispatchDomEvent(hook, visit, args);\n\t\treturn result;\n\t}\n\n\t/**\n\t * Trigger a hook synchronously, executing its default handler and all registered handlers.\n\t * Will execute all handlers in order, but will **not** `await` any `Promise`s they return.\n\t * @param hook Name of the hook to trigger\n\t * @param visit The visit object this hook belongs to\n\t * @param args Arguments to pass to the handler\n\t * @param defaultHandler A default implementation of this hook to execute\n\t * @returns The (possibly unresolved) return value of the executed default handler\n\t */\n\t// Overload: default order of arguments\n\tcallSync(hook: T, visit: Visit | undefined, args: HookArguments, defaultHandler?: HookDefaultHandler): ReturnType>; // prettier-ignore\n\t// Overload: legacy order of arguments, with visit missing\n\tcallSync(hook: T, args: HookArguments, defaultHandler?: HookDefaultHandler): ReturnType>; // prettier-ignore\n\t// Implementation\n\tcallSync(\n\t\thook: T,\n\t\targ1: Visit | HookArguments,\n\t\targ2: HookArguments | HookDefaultHandler,\n\t\targ3?: HookDefaultHandler\n\t): ReturnType> {\n\t\tconst [visit, args, defaultHandler] = this.parseCallArgs(hook, arg1, arg2, arg3);\n\t\tconst { before, handler, after } = this.getHandlers(hook, defaultHandler);\n\t\tthis.runSync(before, visit, args);\n\t\tconst [result] = this.runSync(handler, visit, args, true);\n\t\tthis.runSync(after, visit, args);\n\t\tthis.dispatchDomEvent(hook, visit, args);\n\t\treturn result;\n\t}\n\n\t/**\n\t * Parse the call arguments for call() and callSync() to allow legacy argument order.\n\t */\n\tprotected parseCallArgs(\n\t\thook: T,\n\t\targ1: Visit | HookArguments | undefined,\n\t\targ2: HookArguments | HookDefaultHandler,\n\t\targ3?: HookDefaultHandler\n\t): [Visit | undefined, HookArguments, HookDefaultHandler | undefined] {\n\t\tconst isLegacyOrder =\n\t\t\t!(arg1 instanceof Visit) && (typeof arg1 === 'object' || typeof arg2 === 'function');\n\t\tif (isLegacyOrder) {\n\t\t\t// Legacy positioning: arguments in second or handler passed in third place\n\t\t\treturn [undefined, arg1 as HookArguments, arg2 as HookDefaultHandler];\n\t\t} else {\n\t\t\t// Default positioning: visit passed in as first argument\n\t\t\treturn [arg1, arg2 as HookArguments, arg3];\n\t\t}\n\t}\n\n\t/**\n\t * Execute the handlers for a hook, in order, as `Promise`s that will be `await`ed.\n\t * @param registrations The registrations (handler + options) to execute\n\t * @param args Arguments to pass to the handler\n\t */\n\n\t// Overload: running HookDefaultHandler: expect HookDefaultHandler return type\n\tprotected async run(registrations: HookRegistration>[], visit: Visit | undefined, args: HookArguments, rethrow: true): Promise>>[]>; // prettier-ignore\n\t// Overload: running user handler: expect no specific type\n\tprotected async run(registrations: HookRegistration[], visit: Visit | undefined, args: HookArguments): Promise; // prettier-ignore\n\t// Implementation\n\tprotected async run[]>(\n\t\tregistrations: R,\n\t\tvisit: Visit | undefined = this.swup.visit,\n\t\targs: HookArguments,\n\t\trethrow: boolean = false\n\t): Promise>> | unknown[]> {\n\t\tconst results = [];\n\t\tfor (const { hook, handler, defaultHandler, once } of registrations) {\n\t\t\tif (visit?.done) continue;\n\t\t\tif (once) this.off(hook, handler);\n\t\t\ttry {\n\t\t\t\tconst result = await runAsPromise(handler, [visit, args, defaultHandler]);\n\t\t\t\tresults.push(result);\n\t\t\t} catch (error) {\n\t\t\t\tif (rethrow) {\n\t\t\t\t\tthrow error;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`Error in hook '${hook}':`, error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\n\t/**\n\t * Execute the handlers for a hook, in order, without `await`ing any returned `Promise`s.\n\t * @param registrations The registrations (handler + options) to execute\n\t * @param args Arguments to pass to the handler\n\t */\n\n\t// Overload: running HookDefaultHandler: expect HookDefaultHandler return type\n\tprotected runSync(registrations: HookRegistration>[], visit: Visit | undefined, args: HookArguments, rethrow: true): ReturnType>[]; // prettier-ignore\n\t// Overload: running user handler: expect no specific type\n\tprotected runSync(registrations: HookRegistration[], visit: Visit | undefined, args: HookArguments): unknown[]; // prettier-ignore\n\t// Implementation\n\tprotected runSync[]>(\n\t\tregistrations: R,\n\t\tvisit: Visit | undefined = this.swup.visit,\n\t\targs: HookArguments,\n\t\trethrow: boolean = false\n\t): (ReturnType> | unknown)[] {\n\t\tconst results = [];\n\t\tfor (const { hook, handler, defaultHandler, once } of registrations) {\n\t\t\tif (visit?.done) continue;\n\t\t\tif (once) this.off(hook, handler);\n\t\t\ttry {\n\t\t\t\tconst result = (handler as HookDefaultHandler)(visit, args, defaultHandler);\n\t\t\t\tresults.push(result);\n\t\t\t\tif (isPromise(result)) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Swup will not await Promises in handler for synchronous hook '${hook}'.`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (rethrow) {\n\t\t\t\t\tthrow error;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`Error in hook '${hook}':`, error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\n\t/**\n\t * Get all registered handlers for a hook, sorted by priority and registration order.\n\t * @param hook Name of the hook\n\t * @param defaultHandler The optional default handler of this hook\n\t * @returns An object with the handlers sorted into `before` and `after` arrays,\n\t * as well as a flag indicating if the original handler was replaced\n\t */\n\tprotected getHandlers(hook: T, defaultHandler?: HookDefaultHandler) {\n\t\tconst ledger = this.get(hook);\n\t\tif (!ledger) {\n\t\t\treturn { found: false, before: [], handler: [], after: [], replaced: false };\n\t\t}\n\n\t\tconst registrations = Array.from(ledger.values());\n\n\t\t// Let TypeScript know that replaced handlers are default handlers by filtering to true\n\t\tconst def = (T: HookRegistration): T is HookRegistration> => true; // prettier-ignore\n\t\tconst sort = this.sortRegistrations;\n\n\t\t// Filter into before, after, and replace handlers\n\t\tconst before = registrations.filter(({ before, replace }) => before && !replace).sort(sort);\n\t\tconst replace = registrations.filter(({ replace }) => replace).filter(def).sort(sort); // prettier-ignore\n\t\tconst after = registrations.filter(({ before, replace }) => !before && !replace).sort(sort);\n\t\tconst replaced = replace.length > 0;\n\n\t\t// Define main handler registration\n\t\t// Created as HookRegistration[] array to allow passing it into hooks.run() directly\n\t\tlet handler: HookRegistration>[] = [];\n\t\tif (defaultHandler) {\n\t\t\thandler = [{ id: 0, hook, handler: defaultHandler }];\n\t\t\tif (replaced) {\n\t\t\t\tconst index = replace.length - 1;\n\t\t\t\tconst replacingHandler = replace[index].handler;\n\t\t\t\tconst createDefaultHandler = (index: number): HookDefaultHandler | undefined => {\n\t\t\t\t\tconst next = replace[index - 1];\n\t\t\t\t\tif (next) {\n\t\t\t\t\t\treturn (visit, args) =>\n\t\t\t\t\t\t\tnext.handler(visit, args, createDefaultHandler(index - 1));\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn defaultHandler;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst nestedDefaultHandler = createDefaultHandler(index);\n\t\t\t\thandler = [\n\t\t\t\t\t{ id: 0, hook, handler: replacingHandler, defaultHandler: nestedDefaultHandler }\n\t\t\t\t];\n\t\t\t}\n\t\t}\n\n\t\treturn { found: true, before, handler, after, replaced };\n\t}\n\n\t/**\n\t * Sort two hook registrations by priority and registration order.\n\t * @param a The registration object to compare\n\t * @param b The other registration object to compare with\n\t * @returns The sort direction\n\t */\n\tprotected sortRegistrations(\n\t\ta: HookRegistration,\n\t\tb: HookRegistration\n\t): number {\n\t\tconst priority = (a.priority ?? 0) - (b.priority ?? 0);\n\t\tconst id = a.id - b.id;\n\t\treturn priority || id || 0;\n\t}\n\n\t/**\n\t * Dispatch a custom event on the `document` for a hook. Prefixed with `swup:`\n\t * @param hook Name of the hook.\n\t */\n\tprotected dispatchDomEvent(\n\t\thook: T,\n\t\tvisit: Visit | undefined,\n\t\targs?: HookArguments\n\t): void {\n\t\tif (visit?.done) return;\n\n\t\tconst detail: HookEventDetail = { hook, args, visit: visit || this.swup.visit };\n\t\tdocument.dispatchEvent(\n\t\t\tnew CustomEvent(`swup:any`, { detail, bubbles: true })\n\t\t);\n\t\tdocument.dispatchEvent(\n\t\t\tnew CustomEvent(`swup:${hook}`, { detail, bubbles: true })\n\t\t);\n\t}\n}\n", "import { escapeCssIdentifier as escape, query } from '../utils.js';\n\n/**\n * Find the anchor element for a given hash.\n *\n * @param hash Hash with or without leading '#'\n * @returns The element, if found, or null.\n *\n * @see https://html.spec.whatwg.org/#find-a-potential-indicated-element\n */\nexport const getAnchorElement = (hash?: string): Element | null => {\n\tif (hash && hash.charAt(0) === '#') {\n\t\thash = hash.substring(1);\n\t}\n\n\tif (!hash) {\n\t\treturn null;\n\t}\n\n\tconst decoded = decodeURIComponent(hash);\n\tlet element =\n\t\tdocument.getElementById(hash) ||\n\t\tdocument.getElementById(decoded) ||\n\t\tquery(`a[name='${escape(hash)}']`) ||\n\t\tquery(`a[name='${escape(decoded)}']`);\n\n\tif (!element && hash === 'top') {\n\t\telement = document.body;\n\t}\n\n\treturn element;\n};\n", "import { queryAll, toMs } from '../utils.js';\nimport type Swup from '../Swup.js';\nimport type { Options } from '../Swup.js';\n\nconst TRANSITION = 'transition';\nconst ANIMATION = 'animation';\n\ntype AnimationTypes = typeof TRANSITION | typeof ANIMATION;\ntype AnimationProperties = 'Delay' | 'Duration';\ntype AnimationStyleKeys = `${AnimationTypes}${AnimationProperties}` | 'transitionProperty';\ntype AnimationStyleDeclarations = Pick;\n\nexport type AnimationDirection = 'in' | 'out';\n\n/**\n * Return a Promise that resolves when all CSS animations and transitions\n * are done on the page. Filters by selector or takes elements directly.\n */\nexport async function awaitAnimations(\n\tthis: Swup,\n\t{\n\t\telements,\n\t\tselector\n\t}: {\n\t\tselector: Options['animationSelector'];\n\t\telements?: NodeListOf | HTMLElement[];\n\t}\n): Promise {\n\t// Allow usage of swup without animations: { animationSelector: false }\n\tif (selector === false && !elements) {\n\t\treturn;\n\t}\n\n\t// Allow passing in elements\n\tlet animatedElements: HTMLElement[] = [];\n\tif (elements) {\n\t\tanimatedElements = Array.from(elements);\n\t} else if (selector) {\n\t\tanimatedElements = queryAll(selector, document.body);\n\t\t// Warn if no elements match the selector, but keep things going\n\t\tif (!animatedElements.length) {\n\t\t\tconsole.warn(`[swup] No elements found matching animationSelector \\`${selector}\\``);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst awaitedAnimations = animatedElements.map((el) => awaitAnimationsOnElement(el));\n\tconst hasAnimations = awaitedAnimations.filter(Boolean).length > 0;\n\tif (!hasAnimations) {\n\t\tif (selector) {\n\t\t\tconsole.warn(\n\t\t\t\t`[swup] No CSS animation duration defined on elements matching \\`${selector}\\``\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\n\tawait Promise.all(awaitedAnimations);\n}\n\nfunction awaitAnimationsOnElement(element: Element): Promise | false {\n\tconst { type, timeout, propCount } = getTransitionInfo(element);\n\n\t// Resolve immediately if no transition defined\n\tif (!type || !timeout) {\n\t\treturn false;\n\t}\n\n\treturn new Promise((resolve) => {\n\t\tconst endEvent = `${type}end`;\n\t\tconst startTime = performance.now();\n\t\tlet propsTransitioned = 0;\n\n\t\tconst end = () => {\n\t\t\telement.removeEventListener(endEvent, onEnd);\n\t\t\tresolve();\n\t\t};\n\n\t\tconst onEnd: EventListener = (event) => {\n\t\t\t// Skip transitions on child elements\n\t\t\tif (event.target !== element) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!isTransitionOrAnimationEvent(event)) {\n\t\t\t\tthrow new Error('Not a transition or animation event.');\n\t\t\t}\n\n\t\t\t// Skip transitions that happened before we started listening\n\t\t\tconst elapsedTime = (performance.now() - startTime) / 1000;\n\t\t\tif (elapsedTime < event.elapsedTime) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// End if all properties have transitioned\n\t\t\tif (++propsTransitioned >= propCount) {\n\t\t\t\tend();\n\t\t\t}\n\t\t};\n\n\t\tsetTimeout(() => {\n\t\t\tif (propsTransitioned < propCount) {\n\t\t\t\tend();\n\t\t\t}\n\t\t}, timeout + 1);\n\n\t\telement.addEventListener(endEvent, onEnd);\n\t});\n}\n\nexport function getTransitionInfo(element: Element, expectedType?: AnimationTypes) {\n\tconst styles = window.getComputedStyle(element) as AnimationStyleDeclarations;\n\n\tconst transitionDelays = getStyleProperties(styles, `${TRANSITION}Delay`);\n\tconst transitionDurations = getStyleProperties(styles, `${TRANSITION}Duration`);\n\tconst transitionTimeout = calculateTimeout(transitionDelays, transitionDurations);\n\tconst animationDelays = getStyleProperties(styles, `${ANIMATION}Delay`);\n\tconst animationDurations = getStyleProperties(styles, `${ANIMATION}Duration`);\n\tconst animationTimeout = calculateTimeout(animationDelays, animationDurations);\n\n\tlet type: AnimationTypes | null = null;\n\tlet timeout = 0;\n\tlet propCount = 0;\n\n\tif (expectedType === TRANSITION) {\n\t\tif (transitionTimeout > 0) {\n\t\t\ttype = TRANSITION;\n\t\t\ttimeout = transitionTimeout;\n\t\t\tpropCount = transitionDurations.length;\n\t\t}\n\t} else if (expectedType === ANIMATION) {\n\t\tif (animationTimeout > 0) {\n\t\t\ttype = ANIMATION;\n\t\t\ttimeout = animationTimeout;\n\t\t\tpropCount = animationDurations.length;\n\t\t}\n\t} else {\n\t\ttimeout = Math.max(transitionTimeout, animationTimeout);\n\t\ttype = timeout > 0 ? (transitionTimeout > animationTimeout ? TRANSITION : ANIMATION) : null;\n\t\tpropCount = type\n\t\t\t? type === TRANSITION\n\t\t\t\t? transitionDurations.length\n\t\t\t\t: animationDurations.length\n\t\t\t: 0;\n\t}\n\n\treturn {\n\t\ttype,\n\t\ttimeout,\n\t\tpropCount\n\t};\n}\n\nfunction isTransitionOrAnimationEvent(event: Event): event is TransitionEvent | AnimationEvent {\n\treturn [`${TRANSITION}end`, `${ANIMATION}end`].includes(event.type);\n}\n\nfunction getStyleProperties(styles: AnimationStyleDeclarations, key: AnimationStyleKeys): string[] {\n\treturn (styles[key] || '').split(', ');\n}\n\nfunction calculateTimeout(delays: string[], durations: string[]): number {\n\twhile (delays.length < durations.length) {\n\t\tdelays = delays.concat(delays);\n\t}\n\n\treturn Math.max(...durations.map((duration, i) => toMs(duration) + toMs(delays[i])));\n}\n", "import type Swup from '../Swup.js';\nimport { FetchError, type FetchOptions, type PageData } from './fetchPage.js';\nimport { type VisitInitOptions, type Visit, VisitState } from './Visit.js';\nimport {\n\tcreateHistoryRecord,\n\tupdateHistoryRecord,\n\tgetCurrentUrl,\n\tLocation,\n\tclassify\n} from '../helpers.js';\n\nexport type HistoryAction = 'push' | 'replace';\nexport type HistoryDirection = 'forwards' | 'backwards';\nexport type NavigationToSelfAction = 'scroll' | 'navigate';\nexport type CacheControl = Partial<{ read: boolean; write: boolean }>;\n\n/** Define how to navigate to a page. */\ntype NavigationOptions = {\n\t/** Whether this visit is animated. Default: `true` */\n\tanimate?: boolean;\n\t/** Name of a custom animation to run. */\n\tanimation?: string;\n\t/** History action to perform: `push` for creating a new history entry, `replace` for replacing the current entry. Default: `push` */\n\thistory?: HistoryAction;\n\t/** Whether this visit should read from or write to the cache. */\n\tcache?: CacheControl;\n};\n\n/**\n * Navigate to a new URL.\n * @param url The URL to navigate to.\n * @param options Options for how to perform this visit.\n * @returns Promise\n */\nexport function navigate(\n\tthis: Swup,\n\turl: string,\n\toptions: NavigationOptions & FetchOptions = {},\n\tinit: Omit = {}\n) {\n\tif (typeof url !== 'string') {\n\t\tthrow new Error(`swup.navigate() requires a URL parameter`);\n\t}\n\n\t// Check if the visit should be ignored\n\tif (this.shouldIgnoreVisit(url, { el: init.el, event: init.event })) {\n\t\twindow.location.assign(url);\n\t\treturn;\n\t}\n\n\tconst { url: to, hash } = Location.fromUrl(url);\n\n\tconst visit = this.createVisit({ ...init, to, hash });\n\tthis.performNavigation(visit, options);\n}\n\n/**\n * Start a visit to a new URL.\n *\n * Internal method that assumes the visit context has already been created.\n *\n * As a user, you should call `swup.navigate(url)` instead.\n *\n * @param url The URL to navigate to.\n * @param options Options for how to perform this visit.\n * @returns Promise\n */\nexport async function performNavigation(\n\tthis: Swup,\n\tvisit: Visit,\n\toptions: NavigationOptions & FetchOptions = {}\n): Promise {\n\tif (this.navigating) {\n\t\tif (this.visit.state >= VisitState.ENTERING) {\n\t\t\t// Currently navigating and content already loaded? Finish and queue\n\t\t\tvisit.state = VisitState.QUEUED;\n\t\t\tthis.onVisitEnd = () => this.performNavigation(visit, options);\n\t\t\treturn;\n\t\t} else {\n\t\t\t// Currently navigating and content not loaded? Abort running visit\n\t\t\tawait this.hooks.call('visit:abort', this.visit, undefined);\n\t\t\tthis.visit.state = VisitState.ABORTED;\n\t\t}\n\t}\n\n\tthis.navigating = true;\n\tthis.visit = visit;\n\n\tconst { el } = visit.trigger;\n\toptions.referrer = options.referrer || this.currentPageUrl;\n\n\tif (options.animate === false) {\n\t\tvisit.animation.animate = false;\n\t}\n\n\t// Clean up old animation classes\n\tif (!visit.animation.animate) {\n\t\tthis.classes.clear();\n\t}\n\n\t// Get history action from option or attribute on trigger element\n\tconst history = options.history || el?.getAttribute('data-swup-history') || undefined;\n\tif (history && ['push', 'replace'].includes(history)) {\n\t\tvisit.history.action = history as HistoryAction;\n\t}\n\n\t// Get custom animation name from option or attribute on trigger element\n\tconst animation = options.animation || el?.getAttribute('data-swup-animation') || undefined;\n\tif (animation) {\n\t\tvisit.animation.name = animation;\n\t}\n\n\t// Sanitize cache option\n\tif (typeof options.cache === 'object') {\n\t\tvisit.cache.read = options.cache.read ?? visit.cache.read;\n\t\tvisit.cache.write = options.cache.write ?? visit.cache.write;\n\t} else if (options.cache !== undefined) {\n\t\tvisit.cache = { read: !!options.cache, write: !!options.cache };\n\t}\n\t// Delete this so that window.fetch doesn't mis-interpret it\n\tdelete options.cache;\n\n\ttry {\n\t\tawait this.hooks.call('visit:start', visit, undefined);\n\t\tvisit.state = VisitState.STARTED;\n\n\t\t// Begin loading page\n\t\tconst page = this.hooks.call('page:load', visit, { options }, async (visit, args) => {\n\t\t\t// Read from cache\n\t\t\tlet cachedPage: PageData | undefined;\n\t\t\tif (visit.cache.read) {\n\t\t\t\tcachedPage = this.cache.get(visit.to.url);\n\t\t\t}\n\n\t\t\targs.page = cachedPage || (await this.fetchPage(visit.to.url, args.options));\n\t\t\targs.cache = !!cachedPage;\n\n\t\t\treturn args.page;\n\t\t});\n\n\t\t// When page loaded: mark visit as loaded, save html into visit object\n\t\tpage.then(({ html }) => {\n\t\t\tvisit.advance(VisitState.LOADED);\n\t\t\tvisit.to.html = html;\n\t\t});\n\n\t\t// Create/update history record if this is not a popstate call or leads to the same URL\n\t\tif (!visit.history.popstate) {\n\t\t\t// Add the hash directly from the trigger element\n\t\t\tconst newUrl = visit.to.url + visit.to.hash;\n\t\t\tif (visit.history.action === 'replace' || visit.to.url === this.currentPageUrl) {\n\t\t\t\tupdateHistoryRecord(newUrl);\n\t\t\t} else {\n\t\t\t\tthis.currentHistoryIndex++;\n\t\t\t\tcreateHistoryRecord(newUrl, { index: this.currentHistoryIndex });\n\t\t\t}\n\t\t}\n\n\t\tthis.currentPageUrl = getCurrentUrl();\n\n\t\t// Mark visit type with classes\n\t\tif (visit.history.popstate) {\n\t\t\tthis.classes.add('is-popstate');\n\t\t}\n\t\tif (visit.animation.name) {\n\t\t\tthis.classes.add(`to-${classify(visit.animation.name)}`);\n\t\t}\n\n\t\t// Wait for page before starting to animate out?\n\t\tif (visit.animation.wait) {\n\t\t\tawait page;\n\t\t}\n\n\t\t// Check if failed/aborted in the meantime\n\t\tif (visit.done) return;\n\n\t\t// Perform the actual transition: animate and replace content\n\t\tawait this.hooks.call('visit:transition', visit, undefined, async () => {\n\t\t\t// No animation? Just await page and render\n\t\t\tif (!visit.animation.animate) {\n\t\t\t\tawait this.hooks.call('animation:skip', undefined);\n\t\t\t\tawait this.renderPage(visit, await page);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Animate page out, render page, animate page in\n\t\t\tvisit.advance(VisitState.LEAVING);\n\t\t\tawait this.animatePageOut(visit);\n\t\t\tif (visit.animation.native && document.startViewTransition) {\n\t\t\t\tawait document.startViewTransition(\n\t\t\t\t\tasync () => await this.renderPage(visit, await page)\n\t\t\t\t).finished;\n\t\t\t} else {\n\t\t\t\tawait this.renderPage(visit, await page);\n\t\t\t}\n\t\t\tawait this.animatePageIn(visit);\n\t\t});\n\n\t\t// Check if failed/aborted in the meantime\n\t\tif (visit.done) return;\n\n\t\t// Finalize visit\n\t\tawait this.hooks.call('visit:end', visit, undefined, () => this.classes.clear());\n\t\tvisit.state = VisitState.COMPLETED;\n\t\tthis.navigating = false;\n\n\t\t/** Run eventually queued function */\n\t\tif (this.onVisitEnd) {\n\t\t\tthis.onVisitEnd();\n\t\t\tthis.onVisitEnd = undefined;\n\t\t}\n\t} catch (error) {\n\t\t// Return early if error is undefined or signals an aborted request\n\t\tif (!error || (error as FetchError)?.aborted) {\n\t\t\tvisit.state = VisitState.ABORTED;\n\t\t\treturn;\n\t\t}\n\n\t\tvisit.state = VisitState.FAILED;\n\n\t\t// Log to console\n\t\tconsole.error(error);\n\n\t\t// Remove current history entry, then load requested url in browser\n\t\tthis.options.skipPopStateHandling = () => {\n\t\t\twindow.location.assign(visit.to.url + visit.to.hash);\n\t\t\treturn true;\n\t\t};\n\n\t\t// Go back to the actual page we're still at\n\t\twindow.history.back();\n\t}\n}\n", "import type Swup from '../Swup.js';\nimport type { Visit } from './Visit.js';\n\n/**\n * Perform the out/leave animation of the current page.\n * @returns Promise\n */\nexport const animatePageOut = async function (this: Swup, visit: Visit) {\n\tawait this.hooks.call('animation:out:start', visit, undefined, () => {\n\t\tthis.classes.add('is-changing', 'is-animating', 'is-leaving');\n\t});\n\n\tawait this.hooks.call('animation:out:await', visit, { skip: false }, (visit, { skip }) => {\n\t\tif (skip) return;\n\t\treturn this.awaitAnimations({ selector: visit.animation.selector });\n\t});\n\n\tawait this.hooks.call('animation:out:end', visit, undefined);\n};\n", "import type Swup from '../Swup.js';\nimport type { Options } from '../Swup.js';\nimport { query, queryAll } from '../utils.js';\nimport type { PageData } from './fetchPage.js';\n\n/**\n * Perform the replacement of content after loading a page.\n *\n * It takes an object with the page data as returned from `fetchPage` and a list\n * of container selectors to replace.\n *\n * @returns Whether all containers were replaced.\n */\nexport const replaceContent = function (\n\tthis: Swup,\n\t{ html }: PageData,\n\t{ containers }: { containers: Options['containers'] } = this.options\n): boolean {\n\tconst incomingDocument = new DOMParser().parseFromString(html, 'text/html');\n\n\t// Update browser title\n\tconst title = incomingDocument.querySelector('title')?.innerText || '';\n\tdocument.title = title;\n\n\t// Save persisted elements\n\tconst persistedElements = queryAll('[data-swup-persist]:not([data-swup-persist=\"\"])');\n\n\t// Update content containers\n\tconst replaced = containers\n\t\t.map((selector) => {\n\t\t\tconst currentEl = document.querySelector(selector);\n\t\t\tconst incomingEl = incomingDocument.querySelector(selector);\n\t\t\tif (currentEl && incomingEl) {\n\t\t\t\tcurrentEl.replaceWith(incomingEl);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (!currentEl) {\n\t\t\t\tconsole.warn(`[swup] Container missing in current document: ${selector}`);\n\t\t\t}\n\t\t\tif (!incomingEl) {\n\t\t\t\tconsole.warn(`[swup] Container missing in incoming document: ${selector}`);\n\t\t\t}\n\t\t\treturn false;\n\t\t})\n\t\t.filter(Boolean);\n\n\t// Restore persisted elements\n\tpersistedElements.forEach((existing) => {\n\t\tconst key = existing.getAttribute('data-swup-persist');\n\t\tconst replacement = query(`[data-swup-persist=\"${key}\"]`);\n\t\tif (replacement && replacement !== existing) {\n\t\t\treplacement.replaceWith(existing);\n\t\t}\n\t});\n\n\t// Return true if all containers were replaced\n\treturn replaced.length === containers.length;\n};\n", "import type Swup from '../Swup.js';\nimport type { Visit } from './Visit.js';\n\n/**\n * Update the scroll position after page render.\n * @returns Promise\n */\nexport const scrollToContent = function (this: Swup, visit: Visit): boolean {\n\tconst options: ScrollIntoViewOptions = { behavior: 'auto' };\n\tconst { target, reset } = visit.scroll;\n\tconst scrollTarget = target ?? visit.to.hash;\n\n\tlet scrolled = false;\n\n\tif (scrollTarget) {\n\t\tscrolled = this.hooks.callSync(\n\t\t\t'scroll:anchor',\n\t\t\tvisit,\n\t\t\t{ hash: scrollTarget, options },\n\t\t\t(visit, { hash, options }) => {\n\t\t\t\tconst anchor = this.getAnchorElement(hash);\n\t\t\t\tif (anchor) {\n\t\t\t\t\tanchor.scrollIntoView(options);\n\t\t\t\t}\n\t\t\t\treturn !!anchor;\n\t\t\t}\n\t\t);\n\t}\n\n\tif (reset && !scrolled) {\n\t\tscrolled = this.hooks.callSync('scroll:top', visit, { options }, (visit, { options }) => {\n\t\t\twindow.scrollTo({ top: 0, left: 0, ...options });\n\t\t\treturn true;\n\t\t});\n\t}\n\n\treturn scrolled;\n};\n", "import type Swup from '../Swup.js';\nimport { nextTick } from '../utils.js';\nimport type { Visit } from './Visit.js';\n\n/**\n * Perform the in/enter animation of the next page.\n * @returns Promise\n */\nexport const animatePageIn = async function (this: Swup, visit: Visit) {\n\t// Check if failed/aborted in the meantime\n\tif (visit.done) return;\n\n\tconst animation = this.hooks.call(\n\t\t'animation:in:await',\n\t\tvisit,\n\t\t{ skip: false },\n\t\t(visit, { skip }) => {\n\t\t\tif (skip) return;\n\t\t\treturn this.awaitAnimations({ selector: visit.animation.selector });\n\t\t}\n\t);\n\n\tawait nextTick();\n\n\tawait this.hooks.call('animation:in:start', visit, undefined, () => {\n\t\tthis.classes.remove('is-animating');\n\t});\n\n\tawait animation;\n\n\tawait this.hooks.call('animation:in:end', visit, undefined);\n};\n", "import { updateHistoryRecord, getCurrentUrl, classify } from '../helpers.js';\nimport type Swup from '../Swup.js';\nimport type { PageData } from './fetchPage.js';\nimport { VisitState, type Visit } from './Visit.js';\n\n/**\n * Render the next page: replace the content and update scroll position.\n */\nexport const renderPage = async function (this: Swup, visit: Visit, page: PageData): Promise {\n\t// Check if failed/aborted in the meantime\n\tif (visit.done) return;\n\n\tvisit.advance(VisitState.ENTERING);\n\n\tconst { url } = page;\n\n\t// update state if the url was redirected\n\tif (!this.isSameResolvedUrl(getCurrentUrl(), url)) {\n\t\tupdateHistoryRecord(url);\n\t\tthis.currentPageUrl = getCurrentUrl();\n\t\tvisit.to.url = this.currentPageUrl;\n\t}\n\n\t// replace content: allow handlers and plugins to overwrite paga data and containers\n\tawait this.hooks.call('content:replace', visit, { page }, (visit, { page }) => {\n\t\tthis.classes.remove('is-leaving');\n\t\t// only add for animated page loads\n\t\tif (visit.animation.animate) {\n\t\t\tthis.classes.add('is-rendering');\n\t\t}\n\t\tconst success = this.replaceContent(page, { containers: visit.containers });\n\t\tif (!success) {\n\t\t\tthrow new Error('[swup] Container mismatch, aborting');\n\t\t}\n\t\tif (visit.animation.animate) {\n\t\t\t// Make sure to add these classes to new containers as well\n\t\t\tthis.classes.add('is-changing', 'is-animating', 'is-rendering');\n\t\t\tif (visit.animation.name) {\n\t\t\t\tthis.classes.add(`to-${classify(visit.animation.name)}`);\n\t\t\t}\n\t\t}\n\t});\n\n\t// scroll into view: either anchor or top of page\n\tawait this.hooks.call('content:scroll', visit, undefined, () => {\n\t\treturn this.scrollToContent(visit);\n\t});\n\n\tawait this.hooks.call('page:view', visit, { url: this.currentPageUrl, title: document.title });\n};\n", "import type Swup from '../Swup.js';\n\nexport type Plugin = {\n\t/** Identify as a swup plugin */\n\tisSwupPlugin: true;\n\t/** Name of this plugin */\n\tname: string;\n\t/** Version of this plugin. Currently not in use, defined here for backward compatiblity. */\n\tversion?: string;\n\t/** The swup instance that mounted this plugin */\n\tswup?: Swup;\n\t/** Version requirements of this plugin. Example: `{ swup: '>=4' }` */\n\trequires?: Record;\n\t/** Run on mount */\n\tmount: () => void;\n\t/** Run on unmount */\n\tunmount: () => void;\n\t_beforeMount?: () => void;\n\t_afterUnmount?: () => void;\n\t_checkRequirements?: () => boolean;\n};\n\nconst isSwupPlugin = (maybeInvalidPlugin: unknown): maybeInvalidPlugin is Plugin => {\n\t// @ts-ignore: this might be anything, object or no\n\treturn Boolean(maybeInvalidPlugin?.isSwupPlugin);\n};\n\n/** Install a plugin. */\nexport const use = function (this: Swup, plugin: unknown) {\n\tif (!isSwupPlugin(plugin)) {\n\t\tconsole.error('Not a swup plugin instance', plugin);\n\t\treturn;\n\t}\n\n\tplugin.swup = this;\n\tif (plugin._checkRequirements) {\n\t\tif (!plugin._checkRequirements()) {\n\t\t\treturn;\n\t\t}\n\t}\n\tif (plugin._beforeMount) {\n\t\tplugin._beforeMount();\n\t}\n\tplugin.mount();\n\n\tthis.plugins.push(plugin);\n\n\treturn this.plugins;\n};\n\n/** Uninstall a plugin. */\nexport function unuse(this: Swup, pluginOrName: Plugin | string) {\n\tconst plugin = this.findPlugin(pluginOrName);\n\tif (!plugin) {\n\t\tconsole.error('No such plugin', plugin);\n\t\treturn;\n\t}\n\n\tplugin.unmount();\n\tif (plugin._afterUnmount) {\n\t\tplugin._afterUnmount();\n\t}\n\n\tthis.plugins = this.plugins.filter((p) => p !== plugin);\n\n\treturn this.plugins;\n}\n\n/** Find a plugin by name or reference. */\nexport function findPlugin(this: Swup, pluginOrName: Plugin | string) {\n\treturn this.plugins.find(\n\t\t(plugin) =>\n\t\t\tplugin === pluginOrName ||\n\t\t\tplugin.name === pluginOrName ||\n\t\t\tplugin.name === `Swup${String(pluginOrName)}`\n\t);\n}\n", "import type Swup from '../Swup.js';\n\n/**\n * Utility function to validate and run the global option 'resolveUrl'\n * @param {string} url\n * @returns {string} the resolved url\n */\nexport function resolveUrl(this: Swup, url: string): string {\n\tif (typeof this.options.resolveUrl !== 'function') {\n\t\tconsole.warn(`[swup] options.resolveUrl expects a callback function.`);\n\t\treturn url;\n\t}\n\tconst result = this.options.resolveUrl(url);\n\tif (!result || typeof result !== 'string') {\n\t\tconsole.warn(`[swup] options.resolveUrl needs to return a url`);\n\t\treturn url;\n\t}\n\tif (result.startsWith('//') || result.startsWith('http')) {\n\t\tconsole.warn(`[swup] options.resolveUrl needs to return a relative url`);\n\t\treturn url;\n\t}\n\treturn result;\n}\n\n/**\n * Compares the resolved version of two paths and returns true if they are the same\n * @param {string} url1\n * @param {string} url2\n * @returns {boolean}\n */\nexport function isSameResolvedUrl(this: Swup, url1: string, url2: string): boolean {\n\treturn this.resolveUrl(url1) === this.resolveUrl(url2);\n}\n", "import { type DelegateEvent } from 'delegate-it';\n\nimport version from './config/version.js';\n\nimport { delegateEvent, getCurrentUrl, Location, updateHistoryRecord } from './helpers.js';\nimport { type DelegateEventUnsubscribe } from './helpers/delegateEvent.js';\n\nimport { Cache } from './modules/Cache.js';\nimport { Classes } from './modules/Classes.js';\nimport { type Visit, createVisit } from './modules/Visit.js';\nimport { Hooks } from './modules/Hooks.js';\nimport { getAnchorElement } from './modules/getAnchorElement.js';\nimport { awaitAnimations } from './modules/awaitAnimations.js';\nimport { navigate, performNavigation, type NavigationToSelfAction } from './modules/navigate.js';\nimport { fetchPage } from './modules/fetchPage.js';\nimport { animatePageOut } from './modules/animatePageOut.js';\nimport { replaceContent } from './modules/replaceContent.js';\nimport { scrollToContent } from './modules/scrollToContent.js';\nimport { animatePageIn } from './modules/animatePageIn.js';\nimport { renderPage } from './modules/renderPage.js';\nimport { use, unuse, findPlugin, type Plugin } from './modules/plugins.js';\nimport { isSameResolvedUrl, resolveUrl } from './modules/resolveUrl.js';\nimport { nextTick } from './utils.js';\nimport { type HistoryState } from './helpers/history.js';\n\n/** Options for customizing swup's behavior. */\nexport type Options = {\n\t/** Whether history visits are animated. Default: `false` */\n\tanimateHistoryBrowsing: boolean;\n\t/** Selector for detecting animation timing. Default: `[class*=\"transition-\"]` */\n\tanimationSelector: string | false;\n\t/** Elements on which to add animation classes. Default: `html` element */\n\tanimationScope: 'html' | 'containers';\n\t/** Enable in-memory page cache. Default: `true` */\n\tcache: boolean;\n\t/** Content containers to be replaced on page visits. Default: `['#swup']` */\n\tcontainers: string[];\n\t/** Callback for ignoring visits. Receives the element and event that triggered the visit. */\n\tignoreVisit: (url: string, { el, event }: { el?: Element; event?: Event }) => boolean;\n\t/** Selector for links that trigger visits. Default: `'a[href]'` */\n\tlinkSelector: string;\n\t/** How swup handles links to the same page. Default: `scroll` */\n\tlinkToSelf: NavigationToSelfAction;\n\t/** Enable native animations using the View Transitions API. */\n\tnative: boolean;\n\t/** Plugins to register on startup. */\n\tplugins: Plugin[];\n\t/** Custom headers sent along with fetch requests. */\n\trequestHeaders: Record;\n\t/** Rewrite URLs before loading them. */\n\tresolveUrl: (url: string) => string;\n\t/** Callback for telling swup to ignore certain popstate events. */\n\tskipPopStateHandling: (event: PopStateEvent) => boolean;\n\t/** Request timeout in milliseconds. */\n\ttimeout: number;\n};\n\nconst defaults: Options = {\n\tanimateHistoryBrowsing: false,\n\tanimationSelector: '[class*=\"transition-\"]',\n\tanimationScope: 'html',\n\tcache: true,\n\tcontainers: ['#swup'],\n\tignoreVisit: (url, { el } = {}) => !!el?.closest('[data-no-swup]'),\n\tlinkSelector: 'a[href]',\n\tlinkToSelf: 'scroll',\n\tnative: false,\n\tplugins: [],\n\tresolveUrl: (url) => url,\n\trequestHeaders: {\n\t\t'X-Requested-With': 'swup',\n\t\t'Accept': 'text/html, application/xhtml+xml'\n\t},\n\tskipPopStateHandling: (event) => (event.state as HistoryState)?.source !== 'swup',\n\ttimeout: 0\n};\n\n/** Swup page transition library. */\nexport default class Swup {\n\t/** Library version */\n\treadonly version: string = version;\n\t/** Options passed into the instance */\n\toptions: Options;\n\t/** Default options before merging user options */\n\treadonly defaults: Options = defaults;\n\t/** Registered plugin instances */\n\tplugins: Plugin[] = [];\n\t/** Data about the current visit */\n\tvisit: Visit;\n\t/** Cache instance */\n\treadonly cache: Cache;\n\t/** Hook registry */\n\treadonly hooks: Hooks;\n\t/** Animation class manager */\n\treadonly classes: Classes;\n\t/** URL of the currently visible page */\n\tcurrentPageUrl: string = getCurrentUrl();\n\t/** Index of the current history entry */\n\tprotected currentHistoryIndex: number;\n\t/** Delegated event subscription handle */\n\tprotected clickDelegate?: DelegateEventUnsubscribe;\n\t/** Navigation status */\n\tprotected navigating: boolean = false;\n\t/** Run anytime a visit ends */\n\tprotected onVisitEnd?: () => Promise;\n\n\t/** Install a plugin */\n\tuse = use;\n\t/** Uninstall a plugin */\n\tunuse = unuse;\n\t/** Find a plugin by name or instance */\n\tfindPlugin = findPlugin;\n\n\t/** Log a message. Has no effect unless debug plugin is installed */\n\tlog: (message: string, context?: unknown) => void = () => {};\n\n\t/** Navigate to a new URL */\n\tnavigate = navigate;\n\t/** Actually perform a navigation */\n\tprotected performNavigation = performNavigation;\n\t/** Create a new context for this visit */\n\tprotected createVisit = createVisit;\n\t/** Register a delegated event listener */\n\tdelegateEvent = delegateEvent;\n\t/** Fetch a page from the server */\n\tfetchPage = fetchPage;\n\t/** Resolve when animations on the page finish */\n\tawaitAnimations = awaitAnimations;\n\tprotected renderPage = renderPage;\n\t/** Replace the content after page load */\n\treplaceContent = replaceContent;\n\tprotected animatePageIn = animatePageIn;\n\tprotected animatePageOut = animatePageOut;\n\tprotected scrollToContent = scrollToContent;\n\t/** Find the anchor element for a given hash */\n\tgetAnchorElement = getAnchorElement;\n\n\t/** Get the current page URL */\n\tgetCurrentUrl = getCurrentUrl;\n\t/** Resolve a URL to its final location */\n\tresolveUrl = resolveUrl;\n\t/** Check if two URLs resolve to the same location */\n\tprotected isSameResolvedUrl = isSameResolvedUrl;\n\n\tconstructor(options: Partial = {}) {\n\t\t// Merge defaults and options\n\t\tthis.options = { ...this.defaults, ...options };\n\n\t\tthis.handleLinkClick = this.handleLinkClick.bind(this);\n\t\tthis.handlePopState = this.handlePopState.bind(this);\n\n\t\tthis.cache = new Cache(this);\n\t\tthis.classes = new Classes(this);\n\t\tthis.hooks = new Hooks(this);\n\t\tthis.visit = this.createVisit({ to: '' });\n\n\t\tthis.currentHistoryIndex = (window.history.state as HistoryState)?.index ?? 1;\n\n\t\tif (!this.checkRequirements()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.enable();\n\t}\n\n\tprotected checkRequirements() {\n\t\tif (typeof Promise === 'undefined') {\n\t\t\tconsole.warn('Promise is not supported');\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/** Enable this instance, adding listeners and classnames. */\n\tasync enable() {\n\t\t// Add event listener\n\t\tconst { linkSelector } = this.options;\n\t\tthis.clickDelegate = this.delegateEvent(linkSelector, 'click', this.handleLinkClick);\n\n\t\twindow.addEventListener('popstate', this.handlePopState);\n\n\t\t// Set scroll restoration to manual if animating history visits\n\t\tif (this.options.animateHistoryBrowsing) {\n\t\t\twindow.history.scrollRestoration = 'manual';\n\t\t}\n\n\t\t// Initial save to cache\n\t\tif (this.options.cache) {\n\t\t\t// Disabled to avoid caching modified dom state: logic moved to preload plugin\n\t\t\t// https://github.com/swup/swup/issues/475\n\t\t}\n\n\t\t// Sanitize/check native option\n\t\tthis.options.native = this.options.native && !!document.startViewTransition;\n\n\t\t// Mount plugins\n\t\tthis.options.plugins.forEach((plugin) => this.use(plugin));\n\n\t\t// Create initial history record\n\t\tif ((window.history.state as HistoryState)?.source !== 'swup') {\n\t\t\tupdateHistoryRecord(null, { index: this.currentHistoryIndex });\n\t\t}\n\n\t\t// Give consumers a chance to hook into enable\n\t\tawait nextTick();\n\n\t\t// Trigger enable hook\n\t\tawait this.hooks.call('enable', undefined, undefined, () => {\n\t\t\tconst html = document.documentElement;\n\t\t\thtml.classList.add('swup-enabled');\n\t\t\thtml.classList.toggle('swup-native', this.options.native);\n\t\t});\n\t}\n\n\t/** Disable this instance, removing listeners and classnames. */\n\tasync destroy() {\n\t\t// remove delegated listener\n\t\tthis.clickDelegate!.destroy();\n\n\t\t// remove popstate listener\n\t\twindow.removeEventListener('popstate', this.handlePopState);\n\n\t\t// empty cache\n\t\tthis.cache.clear();\n\n\t\t// unmount plugins\n\t\tthis.options.plugins.forEach((plugin) => this.unuse(plugin));\n\n\t\t// trigger disable hook\n\t\tawait this.hooks.call('disable', undefined, undefined, () => {\n\t\t\tconst html = document.documentElement;\n\t\t\thtml.classList.remove('swup-enabled');\n\t\t\thtml.classList.remove('swup-native');\n\t\t});\n\n\t\t// remove handlers\n\t\tthis.hooks.clear();\n\t}\n\n\t/** Determine if a visit should be ignored by swup, based on URL or trigger element. */\n\tshouldIgnoreVisit(href: string, { el, event }: { el?: Element; event?: Event } = {}) {\n\t\tconst { origin, url, hash } = Location.fromUrl(href);\n\n\t\t// Ignore if the new origin doesn't match the current one\n\t\tif (origin !== window.location.origin) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Ignore if the link/form would open a new window (or none at all)\n\t\tif (el && this.triggerWillOpenNewWindow(el)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Ignore if the visit should be ignored as per user options\n\t\tif (this.options.ignoreVisit(url + hash, { el, event })) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Finally, allow the visit\n\t\treturn false;\n\t}\n\n\tprotected handleLinkClick(event: DelegateEvent) {\n\t\tconst el = event.delegateTarget as HTMLAnchorElement;\n\t\tconst { href, url, hash } = Location.fromElement(el);\n\n\t\t// Exit early if the link should be ignored\n\t\tif (this.shouldIgnoreVisit(href, { el, event })) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ignore if swup is currently navigating towards the link's URL\n\t\tif (this.navigating && url === this.visit.to.url) {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tconst visit = this.createVisit({ to: url, hash, el, event });\n\n\t\t// Exit early if control key pressed\n\t\tif (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\n\t\t\tthis.hooks.callSync('link:newtab', visit, { href });\n\t\t\treturn;\n\t\t}\n\n\t\t// Exit early if other than left mouse button\n\t\tif (event.button !== 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.hooks.callSync('link:click', visit, { el, event }, () => {\n\t\t\tconst from = visit.from.url ?? '';\n\n\t\t\tevent.preventDefault();\n\n\t\t\t// Handle links to the same page\n\t\t\tif (!url || url === from) {\n\t\t\t\tif (hash) {\n\t\t\t\t\t// With hash: scroll to anchor\n\t\t\t\t\tthis.hooks.callSync('link:anchor', visit, { hash }, () => {\n\t\t\t\t\t\tupdateHistoryRecord(url + hash);\n\t\t\t\t\t\tthis.scrollToContent(visit);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Without hash: scroll to top or load/reload page\n\t\t\t\t\tthis.hooks.callSync('link:self', visit, undefined, () => {\n\t\t\t\t\t\tif (this.options.linkToSelf === 'navigate') {\n\t\t\t\t\t\t\tthis.performNavigation(visit);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tupdateHistoryRecord(url);\n\t\t\t\t\t\t\tthis.scrollToContent(visit);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Exit early if the resolved path hasn't changed\n\t\t\tif (this.isSameResolvedUrl(url, from)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Finally, proceed with loading the page\n\t\t\tthis.performNavigation(visit);\n\t\t});\n\t}\n\n\tprotected handlePopState(event: PopStateEvent) {\n\t\tconst href: string = (event.state as HistoryState)?.url ?? window.location.href;\n\n\t\t// Exit early if this event should be ignored\n\t\tif (this.options.skipPopStateHandling(event)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Exit early if the resolved path hasn't changed\n\t\tif (this.isSameResolvedUrl(getCurrentUrl(), this.currentPageUrl)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { url, hash } = Location.fromUrl(href);\n\n\t\tconst visit = this.createVisit({ to: url, hash, event });\n\n\t\t// Mark as history visit\n\t\tvisit.history.popstate = true;\n\n\t\t// Determine direction of history visit\n\t\tconst index = (event.state as HistoryState)?.index ?? 0;\n\t\tif (index && index !== this.currentHistoryIndex) {\n\t\t\tconst direction = index - this.currentHistoryIndex > 0 ? 'forwards' : 'backwards';\n\t\t\tvisit.history.direction = direction;\n\t\t\tthis.currentHistoryIndex = index;\n\t\t}\n\n\t\t// Disable animation & scrolling for history visits\n\t\tvisit.animation.animate = false;\n\t\tvisit.scroll.reset = false;\n\t\tvisit.scroll.target = false;\n\n\t\t// Animated history visit: re-enable animation & scroll reset\n\t\tif (this.options.animateHistoryBrowsing) {\n\t\t\tvisit.animation.animate = true;\n\t\t\tvisit.scroll.reset = true;\n\t\t}\n\n\t\tthis.hooks.callSync('history:popstate', visit, { event }, () => {\n\t\t\tthis.performNavigation(visit);\n\t\t});\n\t}\n\n\t/** Determine whether an element will open a new tab when clicking/activating. */\n\tprotected triggerWillOpenNewWindow(triggerEl: Element) {\n\t\tif (triggerEl.matches('[download], [target=\"_blank\"]')) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n", "type Comparator = '>' | '>=' | '<' | '<=';\n\n// Fill versions to exactly 3 decimals\nexport const normalizeVersion = (version: string): string => {\n\treturn String(version)\n\t\t.split('.')\n\t\t.map(segment => String(parseInt(segment || '0', 10)))\n\t\t.concat(['0', '0'])\n\t\t.slice(0, 3)\n\t\t.join('.');\n};\n\n// Numerically compare version strings after normalizing them\nexport const compareVersion = (a: string, b: string): number => {\n\ta = normalizeVersion(a);\n\tb = normalizeVersion(b);\n\treturn a.localeCompare(b, undefined, { numeric: true });\n};\n\n// Apply a comparator (equals, greater-than, etc) by its symbol to a sort comparison\nconst applyComparator = (comparisonResult: number, comparator: Comparator) => {\n\tconst comparators = {\n\t\t'': (r: number) => r === 0,\n\t\t'>': (r: number) => r > 0,\n\t\t'>=': (r: number) => r >= 0,\n\t\t'<': (r: number) => r < 0,\n\t\t'<=': (r: number) => r <= 0\n\t};\n\tconst comparatorFn = comparators[comparator] || comparators[''];\n\treturn comparatorFn(comparisonResult);\n};\n\n/**\n * Check if a version satisfies all given version requirements\n *\n * versionSatisfies('2.1.0', ['>=2', '<4']) // true\n * versionSatisfies('2.1.0', ['5']) // false\n *\n * @param {string} installed Installed version\n * @param {Array.} requirements Array of requirements that must be satisfied\n * @returns boolean\n */\nexport const versionSatisfies = (installed: string, requirements: string[]) => {\n\treturn requirements.every((required) => {\n\t\tconst [, comparator, version] = required.match(/^([\\D]+)?(.*)$/) || [];\n\t\tconst comparisonResult = compareVersion(installed, version);\n\t\treturn applyComparator(comparisonResult, (comparator as Comparator) || '>=');\n\t});\n};\n", "import type Swup from 'swup';\nimport type { Plugin, HookName, HookOptions, HookUnregister, Handler } from 'swup';\nimport { checkDependencyVersion } from './pluginRequirements.js';\n\nfunction isBound(func: Function) {\n\treturn func.name.startsWith('bound ') && !func.hasOwnProperty('prototype');\n}\n\nexport default abstract class SwupPlugin implements Plugin {\n\t/** Name of the plugin */\n\tabstract name: string;\n\n\t/** Identify as a swup plugin */\n\tisSwupPlugin: true = true;\n\n\t// Swup instance, assigned by swup itself\n\tswup!: Swup;\n\n\t/** Version of this plugin. Currently not in use, defined here for backward compatiblity. */\n\tversion?: string;\n\n\t/** Version requirements of this plugin. Example: `{ swup: '>=4' }` */\n\trequires?: Record = {};\n\n\t// List of hook handlers to unregister on unmount\n\tprivate handlersToUnregister: HookUnregister[] = [];\n\n\t/** Run on mount */\n\tmount() {\n\t\t// this is mount method rewritten by class extending\n\t\t// and is executed when swup is enabled with plugin\n\t}\n\n\t/** Run on unmount */\n\tunmount() {\n\t\t// this is unmount method rewritten by class extending\n\t\t// and is executed when swup with plugin is disabled\n\n\t\t// Unsubscribe all registered hook handlers\n\t\tthis.handlersToUnregister.forEach((unregister) => unregister());\n\t\tthis.handlersToUnregister = [];\n\t}\n\n\t_beforeMount(): void {\n\t\tif (!this.name) {\n\t\t\tthrow new Error('You must define a name of plugin when creating a class.');\n\t\t}\n\t}\n\n\t_afterUnmount(): void {\n\t\t// here for any future hidden auto-cleanup\n\t}\n\n\t_checkRequirements(): boolean {\n\t\tif (typeof this.requires !== 'object') {\n\t\t\treturn true;\n\t\t}\n\n\t\tObject.entries(this.requires).forEach(([dependency, versions]) => {\n\t\t\tversions = Array.isArray(versions) ? versions : [versions];\n\t\t\tif (!checkDependencyVersion(dependency, versions, this.swup)) {\n\t\t\t\tconst requirement = `${dependency} ${versions.join(', ')}`;\n\t\t\t\tthrow new Error(`Plugin version mismatch: ${this.name} requires ${requirement}`);\n\t\t\t}\n\t\t});\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Register a new hook handler.\n\t *\n\t * On plugin unmount, the handler will automatically be unregistered.\n\t * The handler function is lexically bound to the plugin instance for convenience.\n\t * @see swup.hooks.on\n\t */\n\tprotected on(hook: T, handler: Handler, options: HookOptions = {}): HookUnregister {\n\t\thandler = !isBound(handler) ? handler.bind(this) : handler;\n\t\tconst unregister = this.swup.hooks.on(hook, handler, options);\n\t\tthis.handlersToUnregister.push(unregister);\n\t\treturn unregister;\n\t}\n\n\tprotected once(hook: T, handler: Handler, options: HookOptions = {}): HookUnregister {\n\t\treturn this.on(hook, handler, { ...options, once: true });\n\t}\n\n\tprotected before(hook: T, handler: Handler, options: HookOptions = {}): HookUnregister {\n\t\treturn this.on(hook, handler, { ...options, before: true });\n\t}\n\n\tprotected replace(hook: T, handler: Handler, options: HookOptions = {}): HookUnregister {\n\t\treturn this.on(hook, handler, { ...options, replace: true });\n\t}\n\n\tprotected off(hook: T, handler?: Handler): void {\n\t\treturn this.swup.hooks.off(hook, handler!);\n\t}\n}\n", "import type Swup from 'swup';\n\nimport { versionSatisfies } from './versionSatisfies.js';\n\nfunction getInstalledDependencyVersion(dependency: string, swup: Swup): string {\n\tif (dependency === 'swup') {\n\t\treturn swup.version ?? '';\n\t} else {\n\t\t// Circular type dependency?\n\t\t// findPlugin returns swup's Plugin type which is not up-to-date\n\t\t// with the actual Plugin type from index.ts\n\t\tconst plugin = swup.findPlugin(dependency);\n\t\treturn plugin?.version ?? '';\n\t}\n}\n\nexport function checkDependencyVersion(\n\tdependency: string,\n\trequirements: string[],\n\tswup: Swup\n): boolean {\n\tconst version = getInstalledDependencyVersion(dependency, swup);\n\tif (version) {\n\t\treturn versionSatisfies(version, requirements);\n\t} else {\n\t\treturn false;\n\t}\n}\n", "declare global {\n\tconst __DEV__: boolean;\n\tconst MICROBUNDLE_TARGET: string;\n\tinterface Window {\n\t\tprocess?: any;\n\t}\n}\n\n/**\n * Make sure process.env is defined in the browser\n */\nif (!window.process) window.process = {};\nif (!window.process.env) window.process.env = {};\n\n/**\n * Export the __DEV__ variable. This will become false in production builds from consumers\n */\nexport const __TEST__ = ['test'].includes(String(process.env.NODE_ENV));\nexport const __DEV__ = ['development', 'test'].includes(String(process.env.NODE_ENV));\n", "import { __TEST__ } from './env.js';\n/**\n * Wrap a string in an escape sequence\n * @see https://stackoverflow.com/a/68373080/586823\n */\nconst wrapInEscapeSequence = (s: string, open: number, close: number): string => {\n\tif (s == null) return s;\n\treturn `\\x1b[${open}m${String(s)}\\x1b[${close}m`;\n};\n\n/**\n * Color Codes:\n * @see https://github.com/lzwme/console-log-colors/blob/56a41b352bf9ed327cc864f588b831d92ee6390e/src/index.js\n */\nconst bold = (s: string): string => wrapInEscapeSequence(s, 1, 22);\nconst purple = (s: string): string => wrapInEscapeSequence(s, 94, 39);\n\nconst prepare = (s: string): string => {\n\tif (__TEST__) return s;\n\treturn `🧩 ${bold(s)}`;\n};\n\nexport const highlight = (s: string): string => {\n\tif (__TEST__) return s;\n\treturn purple(s);\n};\n\n/**\n * A slim wrapper around console statements\n */\nexport default class Logger {\n\tlog(...args: any) {\n\t\tconst msg = args.shift();\n\t\tconsole.log(prepare(msg), ...args);\n\t}\n\twarn(...args: any) {\n\t\tconst msg = args.shift();\n\t\tconsole.warn(prepare(msg), ...args);\n\t}\n\terror(...args: any) {\n\t\tconst msg = args.shift();\n\t\tconsole.error(prepare(msg), ...args);\n\t}\n\tlogIf(condition: boolean, ...args: any) {\n\t\tif (condition) this.log(...args);\n\t}\n\twarnIf(condition: boolean, ...args: any) {\n\t\tif (condition) this.warn(...args);\n\t}\n\terrorIf(condition: boolean, ...args: any) {\n\t\tif (condition) this.error(...args);\n\t}\n}\n", "import { Location } from 'swup';\nimport type { Swup, Visit, VisitScroll } from 'swup';\nimport type { default as FragmentPlugin } from '../SwupFragmentPlugin.js';\nimport type { Route, Rule, FragmentVisit, FragmentElement } from './defs.js';\nimport type ParsedRule from './ParsedRule.js';\nimport Logger, { highlight } from './Logger.js';\n\nimport { __DEV__ } from './env.js';\n\n/**\n * Handles a page view. Runs on `mount` as well as on every content:replace\n */\nexport const handlePageView = (fragmentPlugin: FragmentPlugin): void => {\n\tprepareFragmentElements(fragmentPlugin);\n\thandleLinksToFragments(fragmentPlugin);\n\tshowDialogs(fragmentPlugin);\n};\n\n/**\n * Run `showModal` for all `` elements\n * This puts them on the top layer and makes them ignore css `transform`s on parent elements\n * @see https://developer.mozilla.org/en-US/docs/Glossary/Top_layer\n */\nfunction showDialogs({ logger }: FragmentPlugin): void {\n\tdocument\n\t\t.querySelectorAll('dialog[data-swup-fragment]')\n\t\t.forEach((el) => {\n\t\t\tif (!el.__swupFragment) {\n\t\t\t\tif (__DEV__) logger?.warn(`fragment properties missing on element:`, el);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (el.__swupFragment.modalShown) return;\n\t\t\tel.__swupFragment.modalShown = true;\n\t\t\tel.removeAttribute('open');\n\t\t\tel.showModal?.();\n\t\t\tel.addEventListener('keydown', (e) => e.key === 'Escape' && e.preventDefault());\n\t\t});\n}\n\n/**\n * Updates the `href` of links matching [data-swup-link-to-fragment=\"#my-fragment\"]\n */\nfunction handleLinksToFragments({ logger, swup }: FragmentPlugin): void {\n\tconst targetAttribute = 'data-swup-link-to-fragment';\n\tconst links = document.querySelectorAll(`a[${targetAttribute}]`);\n\n\tlinks.forEach((el) => {\n\t\tconst selector = el.getAttribute(targetAttribute);\n\t\tif (!selector) {\n\t\t\t// prettier-ignore\n\t\t\tif (__DEV__) logger?.warn(`[${targetAttribute}] needs to contain a valid fragment selector`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst fragment = queryFragmentElement(selector, swup);\n\t\tif (!fragment) {\n\t\t\tif (__DEV__) {\n\t\t\t\tlogger?.log(\n\t\t\t\t\t// prettier-ignore\n\t\t\t\t\t`ignoring ${highlight(`[${targetAttribute}=\"${selector}\"]`)} as ${highlight(selector)} is missing`\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst fragmentUrl = fragment.__swupFragment?.url;\n\t\tif (!fragmentUrl) {\n\t\t\tif (__DEV__) logger?.warn(`no fragment infos found on ${selector}`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Help finding suspicious fragment urls\n\t\tif (isEqualUrl(fragmentUrl, swup.getCurrentUrl())) {\n\t\t\t// prettier-ignore\n\t\t\tif (__DEV__) logger?.warn(`The fragment URL of ${selector} is identical to the current URL. This could mean that [data-swup-fragment-url] needs to be provided by the server.`);\n\t\t\treturn;\n\t\t}\n\n\t\tel.href = fragmentUrl;\n\t});\n}\n\n/**\n * Adds attributes and properties to fragment elements\n */\nfunction prepareFragmentElements({ parsedRules, swup, logger }: FragmentPlugin): void {\n\tconst currentUrl = swup.getCurrentUrl();\n\n\tparsedRules\n\t\t.filter((rule) => rule.matchesFrom(currentUrl) || rule.matchesTo(currentUrl))\n\t\t.forEach((rule) => {\n\t\t\trule.containers.forEach((selector) => {\n\t\t\t\tconst el = queryFragmentElement(`${selector}:not([data-swup-fragment])`, swup);\n\n\t\t\t\t// No element\n\t\t\t\tif (!el) return;\n\n\t\t\t\t// Parse a provided fragment URL\n\t\t\t\tconst providedFragmentUrl = el.getAttribute('data-swup-fragment-url');\n\t\t\t\tif (providedFragmentUrl) {\n\t\t\t\t\tif (__DEV__) {\n\t\t\t\t\t\t// prettier-ignore\n\t\t\t\t\t\tlogger?.log(`fragment url ${highlight(providedFragmentUrl)} for ${highlight(selector)} provided by server`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Get the fragment URL\n\t\t\t\tconst { url } = Location.fromUrl(providedFragmentUrl || currentUrl);\n\n\t\t\t\t// Mark the element as a fragment\n\t\t\t\tel.setAttribute('data-swup-fragment', '');\n\n\t\t\t\t// Augment the element with the necessary properties\n\t\t\t\tel.__swupFragment = { url, selector };\n\t\t\t});\n\t\t});\n}\n\n/**\n * Get all containers that should be replaced for a given visit's route\n */\nexport const getFragmentVisitContainers = (\n\troute: Route,\n\tselectors: string[],\n\tswup: Swup,\n\tlogger?: Logger\n) => {\n\tconst isReload = isEqualUrl(route.from, route.to);\n\n\treturn selectors.filter((selector) => {\n\t\tconst el = document.querySelector(selector);\n\n\t\tif (!el) {\n\t\t\tif (__DEV__) logger?.log(`${highlight(selector)} missing in current document`);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!queryFragmentElement(selector, swup)) {\n\t\t\tif (__DEV__) {\n\t\t\t\t// prettier-ignore\n\t\t\t\tlogger?.error(`${highlight(selector)} is outside of swup's default containers`);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!isReload && elementMatchesFragmentUrl(el, route.to)) {\n\t\t\tif (__DEV__)\n\t\t\t\t// prettier-ignore\n\t\t\t\tlogger?.log(`ignoring fragment ${highlight(selector)} as it already matches the current URL`);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t});\n};\n\n/**\n * Checks if an element's fragment url matches a given URL\n */\nexport const elementMatchesFragmentUrl = (el: FragmentElement, url: string): boolean => {\n\tconst fragmentUrl = el.__swupFragment?.url;\n\tif (!fragmentUrl) return false;\n\treturn isEqualUrl(fragmentUrl, url);\n};\n\n/**\n * Checks if two URLs should be considered equal:\n *\n * - ignores trailing slashes\n * - ignores query string order\n *\n * Example: /test?foo=bar&baz=boo === /test/?baz=boo&foo=bar\n */\nconst isEqualUrl = (url1: string, url2: string) => {\n\treturn normalizeUrl(url1) === normalizeUrl(url2);\n};\n\n/**\n * Normalize a URL\n *\n * - removes the trailing slash\n * - sorts query params\n */\nexport const normalizeUrl = (url: string) => {\n\tif (!url.trim()) return url;\n\n\tconst removeTrailingSlash = (str: string) => str.replace(/\\/+$/g, '');\n\n\tconst location = Location.fromUrl(url);\n\tlocation.searchParams.sort();\n\n\treturn removeTrailingSlash(location.pathname) + location.search;\n};\n\n/**\n * Removes all fragment traces from all fragment elements\n */\nexport const cleanupFragmentElements = () => {\n\tdocument.querySelectorAll('[data-swup-fragment]').forEach((el) => {\n\t\tel.removeAttribute('data-swup-fragment-url');\n\t\tdelete el.__swupFragment;\n\t});\n};\n\n/**\n * Get the route from a given visit\n */\nexport const getRoute = (visit: Visit): Route | undefined => {\n\tconst from = visit.from.url;\n\tconst to = visit.to.url;\n\tif (!from || !to) return;\n\treturn { from, to };\n};\n\n/**\n * Adds or removes a rule's name class from all current fragment elements\n */\nexport const toggleFragmentVisitClass = (\n\tfragmentVisit: FragmentVisit | undefined,\n\ttoggle: boolean\n): void => {\n\tif (!fragmentVisit?.name) return;\n\n\tconst { name, containers } = fragmentVisit;\n\n\tcontainers.forEach((selector) => {\n\t\tdocument.querySelector(selector)?.classList.toggle(`to-${name}`, toggle);\n\t});\n};\n\n/**\n * Get the first matching rule for a given route\n */\nexport const getFirstMatchingRule = (route: Route, rules: ParsedRule[]): ParsedRule | undefined => {\n\treturn rules.find((rule) => rule.matches(route));\n};\n\n/**\n * Makes sure unchanged fragment elements land in the cache of the current page\n */\nexport const cacheForeignFragmentElements = ({ swup, logger }: FragmentPlugin): void => {\n\tconst currentUrl = swup.getCurrentUrl();\n\tconst cache = swup.cache;\n\n\t// Get the cache entry for the current URL\n\tconst currentCache = cache.get(currentUrl);\n\tif (!currentCache) return;\n\tconst currentCachedDocument = new DOMParser().parseFromString(currentCache.html, 'text/html');\n\n\t// debug info\n\tconst updatedFragments: FragmentElement[] = [];\n\n\t/**\n\t * We only want to handle fragment elements that\n\t * - are not templates\n\t * - don't fit the current URL\n\t */\n\tconst foreignFragmentElements = Array.from(\n\t\tdocument.querySelectorAll('[data-swup-fragment]')\n\t).filter((el) => {\n\t\tif (el.matches('template')) return false;\n\t\tif (elementMatchesFragmentUrl(el, currentUrl)) return false;\n\t\treturn true;\n\t});\n\n\t// Bail early if there are no foreign fragment elements\n\tif (!foreignFragmentElements.length) return;\n\n\tif (!swup.options.cache) {\n\t\tif (__DEV__) logger?.warn(`can't cache foreign fragment elements without swup's cache`);\n\t\treturn;\n\t}\n\n\tforeignFragmentElements.forEach((el) => {\n\t\t// Don't cache the fragment if it contains fragment elements\n\t\tconst containsFragments = el.querySelector('[data-swup-fragment]') != null;\n\t\tif (containsFragments) return;\n\n\t\tconst fragmentUrl = el.__swupFragment?.url;\n\t\tif (!fragmentUrl) {\n\t\t\tif (__DEV__) logger?.warn(`no fragment url found:`, el);\n\t\t\treturn;\n\t\t}\n\n\t\tconst fragmentSelector = el.__swupFragment?.selector;\n\t\tif (!fragmentSelector) {\n\t\t\tif (__DEV__) logger?.warn(`no fragment selector found:`, el);\n\t\t\treturn;\n\t\t}\n\n\t\t// Get the cache entry for the fragment URL, bail early if it doesn't exist\n\t\tconst fragmentCache = cache.get(fragmentUrl);\n\t\tif (!fragmentCache) return;\n\n\t\t// Check if the fragment exists in the current cached document\n\t\tconst currentFragment = currentCachedDocument.querySelector(fragmentSelector);\n\t\tif (!currentFragment) return;\n\n\t\t// Get a fresh copy of the fragment from it's original cache\n\t\tconst unchangedFragment = new DOMParser()\n\t\t\t.parseFromString(fragmentCache.html, 'text/html')\n\t\t\t.querySelector(fragmentSelector);\n\t\tif (!unchangedFragment) return;\n\n\t\t// Make sure the dynamic fragment url makes it to the cache\n\t\tunchangedFragment.setAttribute('data-swup-fragment-url', fragmentUrl);\n\n\t\t// Replace the current fragment with the unchanged fragment\n\t\tcurrentFragment.replaceWith(unchangedFragment);\n\n\t\t// For debugging\n\t\tupdatedFragments.push(el);\n\t});\n\n\tif (!updatedFragments.length) return;\n\n\t// Update the cache of the current page with the updated html\n\tcache.update(currentUrl, {\n\t\t...currentCache,\n\t\tfragmentHtml: currentCachedDocument.documentElement.outerHTML\n\t});\n\n\tupdatedFragments.forEach((el) => {\n\t\tconst url = el.__swupFragment?.url || '';\n\t\tconst selector = el.__swupFragment?.selector || '';\n\t\t// prettier-ignore\n\t\tif (__DEV__) logger?.log(`updated cache with ${highlight(selector)} from ${highlight(url)}`);\n\t});\n};\n\n/**\n * Skips the animation if all current containers are