{"version":3,"file":"Swup.umd.js","sources":["../src/helpers/classify.ts","../src/helpers/getCurrentUrl.ts","../src/helpers/updateHistoryRecord.ts","../node_modules/delegate-it/index.js","../src/helpers/delegateEvent.ts","../src/utils/index.ts","../src/helpers/Location.ts","../src/helpers/markSwupElements.ts","../src/helpers/cleanupAnimationClasses.ts","../src/modules/Cache.ts","../src/modules/enterPage.ts","../src/modules/getAnchorElement.ts","../src/modules/getAnimationPromises.ts","../src/modules/getPageData.ts","../src/helpers/getDataFromHtml.ts","../src/modules/fetchPage.ts","../src/helpers/fetch.ts","../src/modules/leavePage.ts","../src/modules/loadPage.ts","../src/helpers/createHistoryRecord.ts","../src/modules/replaceContent.ts","../src/modules/events.ts","../src/modules/plugins.ts","../src/modules/renderPage.ts","../src/modules/transitions.ts","../src/Swup.ts"],"sourcesContent":["export 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","export const getCurrentUrl = ({ hash }: { hash?: boolean } = {}): string => {\n\treturn location.pathname + location.search + (hash ? location.hash : '');\n};\n","import { getCurrentUrl } from './getCurrentUrl.js';\n\nexport const updateHistoryRecord = (\n\turl: string | null = null,\n\tcustomData: Record = {}\n): void => {\n\turl = url || getCurrentUrl({ hash: true });\n\tconst data = {\n\t\t...history.state,\n\t\turl,\n\t\trandom: Math.random(),\n\t\tsource: 'swup',\n\t\t...customData\n\t};\n\thistory.replaceState(data, '', url);\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 var _a, _b;\n if (!wanted && !ledger.has(baseElement)) {\n return false;\n }\n const elementMap = (_a = ledger.get(baseElement)) !== null && _a !== void 0 ? _a : new WeakMap();\n ledger.set(baseElement, elementMap);\n if (!wanted && !ledger.has(baseElement)) {\n return false;\n }\n const setups = (_b = elementMap.get(callback)) !== null && _b !== void 0 ? _b : 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 isEventTarget(elements) {\n return typeof elements.addEventListener === 'function';\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(base, selector, type, callback, options) {\n // Handle Selector-based usage\n if (typeof base === 'string') {\n base = document.querySelectorAll(base);\n }\n // Handle Array-like based usage\n if (!isEventTarget(base)) {\n const subscriptions = Array.prototype.map.call(base, (element) => delegate(element, selector, type, callback, options));\n return {\n destroy() {\n for (const subscription of subscriptions) {\n subscription.destroy();\n }\n },\n };\n }\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 event.delegateTarget = delegateTarget;\n callback.call(baseElement, event);\n }\n };\n // Drop unsupported `once` option https://github.com/fregante/delegate-it/pull/28#discussion_r863467939\n if (typeof options === 'object') {\n delete options.once;\n }\n const setup = JSON.stringify({ selector, type, capture });\n const isAlreadyListening = editLedger(true, baseElement, callback, setup);\n const delegateSubscription = {\n destroy() {\n baseElement.removeEventListener(type, listenerFn, options);\n editLedger(false, baseElement, callback, setup);\n },\n };\n if (!isAlreadyListening) {\n baseElement.addEventListener(type, listenerFn, options);\n }\n return delegateSubscription;\n}\nexport default delegate;\n","import delegate, { EventType } from 'delegate-it';\nimport { ParseSelector } from 'typed-query-selector/parser.js';\n\nexport type Unsubscribe = {\n\tdestroy: () => void;\n};\nexport const delegateEvent = (\n\tselector: Selector,\n\ttype: TEvent,\n\tcallback: delegate.EventHandler,\n\t{ base = document, ...eventOptions } = {}\n): Unsubscribe => {\n\tconst delegation = delegate, TEvent>(\n\t\tbase,\n\t\tselector,\n\t\ttype,\n\t\tcallback,\n\t\teventOptions\n\t);\n\treturn { destroy: () => delegation.destroy() };\n};\n","export const query = (selector: string, context: Document | Element = document) => {\n\treturn context.querySelector(selector);\n};\n\nexport const queryAll = (\n\tselector: string,\n\tcontext: Document | Element = document\n): HTMLElement[] => {\n\treturn Array.from(context.querySelectorAll(selector));\n};\n\nexport const nextTick = (callback: () => void) => {\n\trequestAnimationFrame(() => {\n\t\trequestAnimationFrame(() => {\n\t\t\tcallback();\n\t\t});\n\t});\n};\n\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} else {\n\t\treturn ident;\n\t}\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","/**\n * A helper for creating a Location from either an element\n * or a URL object/string\n *\n */\n\nexport class Location extends URL {\n\tconstructor(url: string, base: string = document.baseURI) {\n\t\tsuper(url.toString(), base);\n\t}\n\n\tget url() {\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 {Element} el\n\t * @return new Location instance\n\t */\n\tstatic fromElement(el: HTMLAnchorElement): 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|string} url\n\t * @return new Location instance\n\t */\n\tstatic fromUrl(url: string): Location {\n\t\treturn new Location(url);\n\t}\n}\n","import { query, queryAll } from '../utils.js';\n\nexport const markSwupElements = (element: Element, containers: string[]): void => {\n\tlet blocks = 0;\n\n\tcontainers.forEach((selector) => {\n\t\tif (query(selector, element) == null) {\n\t\t\tconsole.warn(`[swup] Container ${selector} not found on page.`);\n\t\t} else {\n\t\t\tqueryAll(selector).forEach((item: Element, index: number) => {\n\t\t\t\tqueryAll(selector, element)[index].setAttribute('data-swup', String(blocks));\n\t\t\t\tblocks++;\n\t\t\t});\n\t\t}\n\t});\n};\n","export const isSwupClass = (className: string): boolean =>\n\t/^to-/.test(className) || ['is-changing', 'is-rendering', 'is-popstate'].includes(className);\n\nexport const cleanupAnimationClasses = (): void => {\n\tconst htmlClasses = document.documentElement.className.split(' ');\n\tconst removeClasses = htmlClasses.filter(isSwupClass);\n\tdocument.documentElement.classList.remove(...removeClasses);\n};\n","import { getCurrentUrl, Location } from '../helpers.js';\nimport Swup from '../Swup.js';\nimport { PageData } from './getPageData.js';\n\nexport interface PageRecord extends PageData {\n\turl: string;\n\tresponseURL: string;\n}\nexport class Cache {\n\tpages: Record = {};\n\tlast: PageRecord | null = null;\n\tswup: Swup;\n\n\tconstructor(swup: Swup) {\n\t\tthis.swup = swup;\n\t}\n\n\tgetCacheUrl(url: string): string {\n\t\treturn this.swup.resolveUrl(Location.fromUrl(url).url);\n\t}\n\n\tcacheUrl(page: PageRecord) {\n\t\tpage.url = this.getCacheUrl(page.url);\n\t\tif (page.url in this.pages === false) {\n\t\t\tthis.pages[page.url] = page;\n\t\t}\n\t\tpage.responseURL = this.getCacheUrl(page.responseURL);\n\t\tthis.last = this.pages[page.url];\n\t\tthis.swup.log(`Cache (${Object.keys(this.pages).length})`, this.pages);\n\t}\n\n\tgetPage(url: string): PageRecord {\n\t\turl = this.getCacheUrl(url);\n\t\treturn this.pages[url];\n\t}\n\n\tgetCurrentPage(): PageRecord {\n\t\treturn this.getPage(getCurrentUrl());\n\t}\n\n\texists(url: string): boolean {\n\t\turl = this.getCacheUrl(url);\n\t\treturn url in this.pages;\n\t}\n\n\tempty(): void {\n\t\tthis.pages = {};\n\t\tthis.last = null;\n\t\tthis.swup.log('Cache cleared');\n\t}\n\n\tremove(url: string): void {\n\t\tdelete this.pages[this.getCacheUrl(url)];\n\t}\n}\n","import { nextTick } from '../utils.js';\nimport Swup from '../Swup.js';\nimport { PageRenderOptions } from './renderPage.js';\n\nexport const enterPage = function (this: Swup, { event, skipTransition }: PageRenderOptions = {}) {\n\tif (skipTransition) {\n\t\tthis.triggerEvent('transitionEnd', event);\n\t\tthis.cleanupAnimationClasses();\n\t\treturn [Promise.resolve()];\n\t}\n\n\tnextTick(() => {\n\t\tthis.triggerEvent('animationInStart');\n\t\tdocument.documentElement.classList.remove('is-animating');\n\t});\n\n\tconst animationPromises = this.getAnimationPromises('in');\n\tPromise.all(animationPromises).then(() => {\n\t\tthis.triggerEvent('animationInDone');\n\t\tthis.triggerEvent('transitionEnd', event);\n\t\tthis.cleanupAnimationClasses();\n\t});\n\treturn animationPromises;\n};\n","import { escapeCssIdentifier, query } from '../utils.js';\n\nexport const getAnchorElement = (hash: string): Element | null => {\n\tif (!hash) {\n\t\treturn null;\n\t}\n\n\tif (hash.charAt(0) === '#') {\n\t\thash = hash.substring(1);\n\t}\n\n\thash = decodeURIComponent(hash);\n\thash = escapeCssIdentifier(hash);\n\n\t// https://html.spec.whatwg.org/#find-a-potential-indicated-element\n\treturn query(`#${hash}`) || query(`a[name='${hash}']`);\n};\n","import { queryAll, toMs } from '../utils.js';\nimport Swup from '../Swup.js';\n\n// Transition property/event sniffing\nlet transitionProp = 'transition';\nlet transitionEndEvent = 'transitionend';\nlet animationProp = 'animation';\nlet animationEndEvent = 'animationend';\n\nif (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) {\n\ttransitionProp = 'WebkitTransition';\n\ttransitionEndEvent = 'webkitTransitionEnd';\n}\n\nif (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) {\n\tanimationProp = 'WebkitAnimation';\n\tanimationEndEvent = 'webkitAnimationEnd';\n}\n\nexport function getAnimationPromises(\n\tthis: Swup,\n\t// we don't use this argument, but JS plugin depends on it with\n\t// its own version of getAnimationPromises, so it must be specified when\n\t// getAnimationPromises is being used\n\tanimationType: 'in' | 'out'\n): Promise[] {\n\tconst selector = this.options.animationSelector;\n\n\t// Allow usage of swup without animations\n\tif (selector === false) {\n\t\t// Use array of a single resolved promise instead of an empty array to allow\n\t\t// possible future use with Promise.race() which requires an actual value\n\t\treturn [Promise.resolve()];\n\t}\n\n\tconst animatedElements = queryAll(selector, document.body);\n\n\t// Warn if no animated containers found on page, but keep things going\n\tif (!animatedElements.length) {\n\t\tconsole.warn(`[swup] No animated elements found by selector ${selector}`);\n\t\treturn [Promise.resolve()];\n\t}\n\n\treturn animatedElements.map((element) => getAnimationPromiseForElement(element, selector));\n}\n\nconst isTransitionOrAnimationEvent = (event: any): event is TransitionEvent | AnimationEvent =>\n\t!!event.elapsedTime;\n\nfunction getAnimationPromiseForElement(\n\telement: Element,\n\tselector: string,\n\texpectedType: 'animation' | 'transition' | null = null\n): Promise {\n\tconst { type, timeout, propCount } = getTransitionInfo(element, expectedType);\n\n\t// Resolve immediately if no transition defined\n\tif (!type || !timeout) {\n\t\tconsole.warn(\n\t\t\t`[swup] No CSS transition duration defined for element of selector ${selector}`\n\t\t);\n\t\treturn Promise.resolve();\n\t}\n\n\treturn new Promise((resolve) => {\n\t\tconst endEvent = type === 'transition' ? transitionEndEvent : animationEndEvent;\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(\n\telement: Element,\n\texpectedType: 'animation' | 'transition' | null = null\n) {\n\tconst styles = window.getComputedStyle(element);\n\n\t// not sure what to do about the below mess other than casting, but it's a mess\n\tconst transitionDelay = `${transitionProp}Delay` as keyof CSSStyleDeclaration;\n\tconst transitionDuration = `${transitionProp}Duration` as keyof CSSStyleDeclaration;\n\tconst animationDelay = `${animationProp}Delay` as keyof CSSStyleDeclaration;\n\tconst animationDuration = `${animationProp}Duration` as keyof CSSStyleDeclaration;\n\n\tconst transitionDelays = (\n\t\tstyles[transitionDelay] as CSSStyleDeclaration['transitionDelay']\n\t).split(', ');\n\tconst transitionDurations = (\n\t\t(styles[transitionDuration] || '') as CSSStyleDeclaration['transitionDuration']\n\t).split(', ');\n\tconst transitionTimeout = calculateTimeout(transitionDelays, transitionDurations);\n\n\tconst animationDelays = (\n\t\t(styles[animationDelay] || '') as CSSStyleDeclaration['animationDelay']\n\t).split(', ');\n\tconst animationDurations = (\n\t\t(styles[animationDuration] || '') as CSSStyleDeclaration['animationDuration']\n\t).split(', ');\n\tconst animationTimeout = calculateTimeout(animationDelays, animationDurations);\n\n\tlet type: string | 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 =\n\t\t\ttimeout > 0\n\t\t\t\t? transitionTimeout > animationTimeout\n\t\t\t\t\t? 'transition'\n\t\t\t\t\t: 'animation'\n\t\t\t\t: 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 calculateTimeout(delays: string[], durations: string[]) {\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 { getDataFromHtml } from '../helpers.js';\nimport Swup from '../Swup.js';\nimport { PageHtmlData } from '../helpers/getDataFromHtml.js';\n\nexport type PageData = PageHtmlData & {\n\tresponseURL: string;\n};\nexport const getPageData = function (this: Swup, request: XMLHttpRequest): PageData | null {\n\t// this method can be replaced in case other content than html is expected to be received from server\n\t// this function should always return { title, pageClass, originalContent, blocks, responseURL }\n\t// in case page has invalid structure - return null\n\tconst html = request.responseText;\n\tconst pageHtmlData = getDataFromHtml(html, this.options.containers);\n\n\tif (!pageHtmlData) {\n\t\tconsole.warn('[swup] Received page is invalid.');\n\t\treturn null;\n\t}\n\n\treturn {\n\t\t...pageHtmlData,\n\t\tresponseURL: request.responseURL || window.location.href\n\t};\n};\n","import { query, queryAll } from '../utils.js';\n\nexport type PageHtmlData = {\n\ttitle: string;\n\toriginalContent: string;\n\tblocks: string[];\n\tpageClass?: string;\n};\n\nexport const getDataFromHtml = (html: string, containers: string[]): PageHtmlData => {\n\tlet fakeDom = document.createElement('html');\n\tfakeDom.innerHTML = html;\n\tlet blocks: string[] = [];\n\n\tcontainers.forEach((selector) => {\n\t\tif (query(selector, fakeDom) == null) {\n\t\t\tconsole.warn(`[swup] Container ${selector} not found on page.`);\n\t\t\treturn null;\n\t\t} else {\n\t\t\tif (queryAll(selector).length !== queryAll(selector, fakeDom).length) {\n\t\t\t\tconsole.warn(`[swup] Mismatched number of containers found on new page.`);\n\t\t\t}\n\t\t\tqueryAll(selector).forEach((item, index) => {\n\t\t\t\tqueryAll(selector, fakeDom)[index].setAttribute('data-swup', String(blocks.length));\n\t\t\t\tblocks.push(queryAll(selector, fakeDom)[index].outerHTML);\n\t\t\t});\n\t\t}\n\t});\n\n\tconst title = query('title', fakeDom)?.innerText || '';\n\tconst pageClass = query('body', fakeDom)?.className;\n\n\t// to prevent memory leaks\n\tfakeDom.innerHTML = '';\n\t// @ts-ignore don't want to type it as possible null, since it's created at the top of the function always\n\tfakeDom = null;\n\n\treturn { title, pageClass, blocks, originalContent: html };\n};\n","import Swup from '../Swup.js';\nimport { fetch } from '../helpers.js';\nimport { TransitionOptions } from './loadPage.js';\nimport { PageRecord } from './Cache.js';\n\nexport function fetchPage(this: Swup, data: TransitionOptions): Promise {\n\tconst headers = this.options.requestHeaders;\n\tconst { url } = data;\n\n\tif (this.cache.exists(url)) {\n\t\tthis.triggerEvent('pageRetrievedFromCache');\n\t\treturn Promise.resolve(this.cache.getPage(url));\n\t}\n\n\treturn new Promise((resolve, reject) => {\n\t\tfetch({ ...data, headers }, (response) => {\n\t\t\tif (response.status === 500) {\n\t\t\t\tthis.triggerEvent('serverError');\n\t\t\t\treject(url);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// get json data\n\t\t\tconst page = this.getPageData(response);\n\t\t\tif (!page || !page.blocks.length) {\n\t\t\t\treject(url);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// render page\n\t\t\tconst cacheablePageData = { ...page, url };\n\t\t\tthis.cache.cacheUrl(cacheablePageData);\n\t\t\tthis.triggerEvent('pageLoaded');\n\t\t\tresolve(cacheablePageData);\n\t\t});\n\t});\n}\n","import { TransitionOptions } from '../modules/loadPage.js';\nimport { Options } from '../Swup.js';\n\nexport const fetch = (\n\toptions: TransitionOptions & { headers: Options['requestHeaders'] },\n\tcallback: (request: XMLHttpRequest) => void\n): XMLHttpRequest => {\n\tconst defaults = {\n\t\turl: window.location.pathname + window.location.search,\n\t\tmethod: 'GET',\n\t\tdata: null,\n\t\theaders: {}\n\t};\n\n\tconst { url, method, headers, data } = { ...defaults, ...options };\n\n\tconst request = new XMLHttpRequest();\n\n\trequest.onreadystatechange = function () {\n\t\tif (request.readyState === 4) {\n\t\t\t// if (request.status === 500) {} else {}\n\t\t\tcallback(request);\n\t\t}\n\t};\n\n\trequest.open(method, url, true);\n\tObject.entries(headers).forEach(([key, header]) => {\n\t\trequest.setRequestHeader(key, header);\n\t});\n\trequest.send(data);\n\n\treturn request;\n};\n","import Swup from '../Swup.js';\nimport { PageRenderOptions } from './renderPage.js';\n\nexport const leavePage = function (this: Swup, { event, skipTransition }: PageRenderOptions = {}) {\n\tconst isHistoryVisit = event instanceof PopStateEvent;\n\n\tif (skipTransition) {\n\t\tthis.triggerEvent('animationSkipped');\n\t\treturn [Promise.resolve()];\n\t}\n\n\tthis.triggerEvent('animationOutStart');\n\n\t// handle classes\n\tdocument.documentElement.classList.add('is-changing', 'is-leaving', 'is-animating');\n\tif (isHistoryVisit) {\n\t\tdocument.documentElement.classList.add('is-popstate');\n\t}\n\n\t// animation promise stuff\n\tconst animationPromises: Promise[] = this.getAnimationPromises('out');\n\tPromise.all(animationPromises).then(() => {\n\t\tthis.triggerEvent('animationOutDone');\n\t});\n\n\treturn animationPromises;\n};\n","import { classify, createHistoryRecord, getCurrentUrl } from '../helpers.js';\nimport Swup from '../Swup.js';\nimport { PageRecord } from './Cache.js';\n\nexport type TransitionOptions = {\n\turl: string;\n\tcustomTransition?: string;\n};\n\nexport type PageLoadOptions = {\n\turl: string;\n\tevent?: PopStateEvent;\n\tcustomTransition?: string;\n};\n\nexport function loadPage(this: Swup, data: TransitionOptions) {\n\tconst { url } = data;\n\n\t// Check if the visit should be ignored\n\tif (this.shouldIgnoreVisit(url)) {\n\t\twindow.location.href = url;\n\t} else {\n\t\tthis.performPageLoad(data);\n\t}\n}\n\nexport function performPageLoad(this: Swup, data: PageLoadOptions) {\n\tconst { url, event, customTransition } = data ?? {};\n\n\tconst isHistoryVisit = event instanceof PopStateEvent;\n\tconst skipTransition = this.shouldSkipTransition({ url, event });\n\n\tthis.triggerEvent('transitionStart', event);\n\n\t// set transition object\n\tthis.updateTransition(getCurrentUrl(), url, customTransition);\n\tif (customTransition != null) {\n\t\tdocument.documentElement.classList.add(`to-${classify(customTransition)}`);\n\t}\n\n\t// start/skip animation\n\tconst animationPromises = this.leavePage({ event, skipTransition });\n\n\t// Load page data\n\tconst fetchPromise = this.fetchPage(data);\n\n\t// create history record if this is not a popstate call (with or without anchor)\n\tif (!isHistoryVisit) {\n\t\tcreateHistoryRecord(url + (this.scrollToElement || ''));\n\t}\n\n\tthis.currentPageUrl = getCurrentUrl();\n\n\t// when everything is ready, render the page\n\tPromise.all([fetchPromise, ...animationPromises])\n\t\t.then(([pageData]) => {\n\t\t\tthis.renderPage(pageData as PageRecord, { event, skipTransition });\n\t\t})\n\t\t.catch((errorUrl) => {\n\t\t\t// Return early if errorUrl is not defined (probably aborted preload request)\n\t\t\tif (errorUrl === undefined) return;\n\n\t\t\t// Rewrite `skipPopStateHandling` to redirect manually when `history.go` is processed\n\t\t\tthis.options.skipPopStateHandling = () => {\n\t\t\t\twindow.location = errorUrl;\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\t// Go back to the actual page we're still at\n\t\t\thistory.go(-1);\n\t\t});\n}\n","import { getCurrentUrl } from './getCurrentUrl.js';\n\nexport const createHistoryRecord = (\n\turl: string,\n\tcustomData: Record = {}\n): void => {\n\turl = url || getCurrentUrl({ hash: true });\n\tconst data = {\n\t\turl,\n\t\trandom: Math.random(),\n\t\tsource: 'swup',\n\t\t...customData\n\t};\n\thistory.pushState(data, '', url);\n};\n","/**\n * Perform the replacement of content after loading a page.\n *\n * This method can be replaced or augmented by plugins to allow pausing.\n *\n * It takes an object with the page data as return from `getPageData` and has to\n * return a Promise that resolves once all content has been replaced and the\n * site is ready to start animating in the new page.\n *\n * @param {object} page The page object\n * @returns Promise\n */\nexport const replaceContent = function ({ blocks, title }: { blocks: string[]; title: string }) {\n\t// Replace content blocks\n\tblocks.forEach((html, i) => {\n\t\t// we know the block exists at this point\n\t\tconst block = document.body.querySelector(`[data-swup=\"${i}\"]`)!;\n\t\tblock.outerHTML = html;\n\t});\n\n\t// Update browser title\n\tdocument.title = title;\n\n\t// Return a Promise to allow plugins to defer\n\treturn Promise.resolve();\n};\n","import Swup from '../Swup.js';\nimport delegate from 'delegate-it';\n\ntype HandlersEventMap = {\n\tanimationInDone: undefined;\n\tanimationInStart: undefined;\n\tanimationOutDone: undefined;\n\tanimationOutStart: undefined;\n\tanimationSkipped: undefined;\n\tclickLink: delegate.Event;\n\tcontentReplaced: PopStateEvent | undefined;\n\tdisabled: undefined;\n\tenabled: undefined;\n\topenPageInNewTab: delegate.Event;\n\tpageLoaded: undefined;\n\tpageRetrievedFromCache: undefined;\n\tpageView: PopStateEvent | undefined;\n\tpopState: PopStateEvent;\n\tsamePage: delegate.Event;\n\tsamePageWithHash: delegate.Event;\n\tserverError: undefined;\n\ttransitionStart: PopStateEvent | undefined;\n\ttransitionEnd: PopStateEvent | undefined;\n\twillReplaceContent: PopStateEvent | undefined;\n};\ntype AvailableEventNames = keyof HandlersEventMap;\n\nexport type Handler = (event: HandlersEventMap[T]) => void;\nexport type Handlers = {\n\t[Key in keyof HandlersEventMap]: Handler[];\n};\n\nexport function on(\n\tthis: Swup,\n\tevent: TEventType,\n\thandler: Handler\n): void {\n\tconst eventHandlers = this._handlers[event] as Handler[];\n\n\tif (eventHandlers) {\n\t\teventHandlers.push(handler);\n\t} else {\n\t\tconsole.warn(`Unsupported event ${event}.`);\n\t}\n}\n\nexport function off(\n\tthis: Swup,\n\tevent?: TEventType,\n\thandler?: Handler\n) {\n\tif (event && handler) {\n\t\tconst eventHandlers = this._handlers[event] as Handler[];\n\t\t// Remove specific handler\n\t\tif (eventHandlers.includes(handler)) {\n\t\t\t(this._handlers[event] as Handler[]) = eventHandlers.filter(\n\t\t\t\t(h) => h !== handler\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.warn(`Handler for event '${event}' not found.`);\n\t\t}\n\t} else if (event) {\n\t\t// Remove all handlers for specific event\n\t\tthis._handlers[event] = [];\n\t} else {\n\t\t// Remove all handlers for all events\n\t\tObject.keys(this._handlers).forEach((event) => {\n\t\t\tthis._handlers[event as keyof HandlersEventMap] = [];\n\t\t});\n\t}\n}\n\nexport function triggerEvent(\n\tthis: Swup,\n\teventName: TEventType,\n\toriginalEvent?: HandlersEventMap[TEventType]\n): void {\n\tconst eventHandlers = this._handlers[eventName] as Handler[];\n\n\t// call saved handlers with \"on\" method and pass originalEvent object if available\n\teventHandlers.forEach((handler) => {\n\t\ttry {\n\t\t\thandler(originalEvent as HandlersEventMap[TEventType]);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t}\n\t});\n\n\t// trigger event on document with prefix \"swup:\"\n\tconst event = new CustomEvent(`swup:${eventName}`, { detail: eventName });\n\tdocument.dispatchEvent(event);\n}\n","import Swup from '../Swup.js';\n\nexport type Plugin = {\n\tname: string;\n\tisSwupPlugin: true;\n\tmount: () => void;\n\tunmount: () => void;\n\n\t// the instance is assigned later on after passing to swup\n\tswup?: Swup;\n\n\t// these are possibly undefined for backward compatibility\n\tversion?: string;\n\trequires?: Record;\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\n\treturn maybeInvalidPlugin?.isSwupPlugin;\n};\n\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\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\nexport function findPlugin(this: Swup, pluginOrName: Plugin | string) {\n\treturn this.plugins.find((plugin) => plugin === pluginOrName || plugin.name === pluginOrName);\n}\n","import { Location, updateHistoryRecord, getCurrentUrl } from '../helpers.js';\nimport Swup from '../Swup.js';\nimport { PageRecord } from './Cache.js';\n\nexport type PageRenderOptions = {\n\tevent?: PopStateEvent;\n\tskipTransition?: boolean;\n};\n\nexport const renderPage = function (\n\tthis: Swup,\n\tpage: PageRecord,\n\t{ event, skipTransition }: PageRenderOptions = {}\n) {\n\tdocument.documentElement.classList.remove('is-leaving');\n\n\t// do nothing if another page was requested in the meantime\n\tif (!this.isSameResolvedUrl(getCurrentUrl(), page.url)) {\n\t\treturn;\n\t}\n\n\tconst { url } = Location.fromUrl(page.responseURL);\n\n\t// update cache and state if the url was redirected\n\tif (!this.isSameResolvedUrl(getCurrentUrl(), url)) {\n\t\tthis.cache.cacheUrl({ ...page, url });\n\t\tthis.currentPageUrl = getCurrentUrl();\n\t\tupdateHistoryRecord(url);\n\t}\n\n\t// only add for page loads with transitions\n\tif (!skipTransition) {\n\t\tdocument.documentElement.classList.add('is-rendering');\n\t}\n\n\tthis.triggerEvent('willReplaceContent', event);\n\n\tthis.replaceContent(page).then(() => {\n\t\tthis.triggerEvent('contentReplaced', event);\n\t\tthis.triggerEvent('pageView', event);\n\n\t\t// empty cache if it's disabled (in case preload plugin filled it)\n\t\tif (!this.options.cache) {\n\t\t\tthis.cache.empty();\n\t\t}\n\n\t\t// Perform in transition\n\t\tthis.enterPage({ event, skipTransition });\n\n\t\t// reset scroll-to element\n\t\tthis.scrollToElement = null;\n\t});\n};\n","import Swup from '../Swup.js';\n\nexport function updateTransition(this: Swup, from: string, to: string, custom?: string): void {\n\tthis.transition = { from, to, custom };\n}\n\nexport function shouldSkipTransition(this: Swup, { event }: { url?: string; event?: Event }) {\n\tconst isHistoryVisit = event instanceof PopStateEvent;\n\treturn !!(isHistoryVisit && !this.options.animateHistoryBrowsing);\n}\n","import delegate from 'delegate-it';\n\nimport version from './config/version.js';\n\nimport {\n\tcleanupAnimationClasses,\n\tdelegateEvent,\n\tgetCurrentUrl,\n\tLocation,\n\tmarkSwupElements,\n\tupdateHistoryRecord\n} from './helpers.js';\nimport { Unsubscribe } from './helpers/delegateEvent.js';\n\nimport { Cache } from './modules/Cache.js';\nimport { enterPage } from './modules/enterPage.js';\nimport { getAnchorElement } from './modules/getAnchorElement.js';\nimport { getAnimationPromises } from './modules/getAnimationPromises.js';\nimport { getPageData } from './modules/getPageData.js';\nimport { fetchPage } from './modules/fetchPage.js';\nimport { leavePage } from './modules/leavePage.js';\nimport { loadPage, performPageLoad } from './modules/loadPage.js';\nimport { replaceContent } from './modules/replaceContent.js';\nimport { on, off, triggerEvent, Handlers } from './modules/events.js';\nimport { use, unuse, findPlugin, Plugin } from './modules/plugins.js';\nimport { renderPage } from './modules/renderPage.js';\nimport { updateTransition, shouldSkipTransition } from './modules/transitions.js';\n\nimport { queryAll } from './utils.js';\n\nexport type Transition = {\n\tfrom?: string;\n\tto?: string;\n\tcustom?: string;\n};\n\ntype DelegatedListeners = {\n\tclick?: Unsubscribe;\n};\n\nexport type Options = {\n\tanimateHistoryBrowsing: boolean;\n\tanimationSelector: string | false;\n\tlinkSelector: string;\n\tcache: boolean;\n\tcontainers: string[];\n\trequestHeaders: Record;\n\tplugins: Plugin[];\n\tskipPopStateHandling: (event: any) => boolean;\n\tignoreVisit: (url: string, { el, event }: { el?: Element; event?: Event }) => boolean;\n\tresolveUrl: (url: string) => string;\n};\n\nexport default class Swup {\n\tversion = version;\n\n\t_handlers: Handlers = {\n\t\tanimationInDone: [],\n\t\tanimationInStart: [],\n\t\tanimationOutDone: [],\n\t\tanimationOutStart: [],\n\t\tanimationSkipped: [],\n\t\tclickLink: [],\n\t\tcontentReplaced: [],\n\t\tdisabled: [],\n\t\tenabled: [],\n\t\topenPageInNewTab: [],\n\t\tpageLoaded: [],\n\t\tpageRetrievedFromCache: [],\n\t\tpageView: [],\n\t\tpopState: [],\n\t\tsamePage: [],\n\t\tsamePageWithHash: [],\n\t\tserverError: [],\n\t\ttransitionStart: [],\n\t\ttransitionEnd: [],\n\t\twillReplaceContent: []\n\t};\n\n\t// variable for anchor to scroll to after render\n\tscrollToElement: string | null = null;\n\t// variable for save options\n\toptions: Options;\n\t// running plugin instances\n\tplugins: Plugin[] = [];\n\t// variable for current transition info object\n\ttransition: Transition = {};\n\t// cache instance\n\tcache: Cache;\n\t// allows us to compare the current and new path inside popStateHandler\n\tcurrentPageUrl = getCurrentUrl();\n\t// variable for keeping event listeners from \"delegate\"\n\tdelegatedListeners: DelegatedListeners = {};\n\t// so we are able to remove the listener\n\tboundPopStateHandler: (event: PopStateEvent) => void;\n\n\tloadPage = loadPage;\n\tperformPageLoad = performPageLoad;\n\tleavePage = leavePage;\n\trenderPage = renderPage;\n\treplaceContent = replaceContent;\n\tenterPage = enterPage;\n\ttriggerEvent = triggerEvent;\n\tdelegateEvent = delegateEvent;\n\ton = on;\n\toff = off;\n\tupdateTransition = updateTransition;\n\tshouldSkipTransition = shouldSkipTransition;\n\tgetAnimationPromises = getAnimationPromises;\n\tgetPageData = getPageData;\n\tfetchPage = fetchPage;\n\tgetAnchorElement = getAnchorElement;\n\tlog: (message: string, context?: any) => void = () => {}; // here so it can be used by plugins\n\tuse = use;\n\tunuse = unuse;\n\tfindPlugin = findPlugin;\n\tgetCurrentUrl = getCurrentUrl;\n\tcleanupAnimationClasses = cleanupAnimationClasses;\n\n\tdefaults: Options = {\n\t\tanimateHistoryBrowsing: false,\n\t\tanimationSelector: '[class*=\"transition-\"]',\n\t\tcache: true,\n\t\tcontainers: ['#swup'],\n\t\tignoreVisit: (url, { el, event } = {}) => !!el?.closest('[data-no-swup]'),\n\t\tlinkSelector: 'a[href]',\n\t\tplugins: [],\n\t\tresolveUrl: (url) => url,\n\t\trequestHeaders: {\n\t\t\t'X-Requested-With': 'swup',\n\t\t\tAccept: 'text/html, application/xhtml+xml'\n\t\t},\n\t\tskipPopStateHandling: (event) => event.state?.source !== 'swup'\n\t};\n\n\tconstructor(options: Partial = {}) {\n\t\t// Merge defaults and options\n\t\tthis.options = { ...this.defaults, ...options };\n\n\t\tthis.boundPopStateHandler = this.popStateHandler.bind(this);\n\n\t\tthis.cache = new Cache(this);\n\n\t\tthis.enable();\n\t}\n\n\tenable() {\n\t\t// Check for Promise support\n\t\tif (typeof Promise === 'undefined') {\n\t\t\tconsole.warn('Promise is not supported');\n\t\t\treturn;\n\t\t}\n\n\t\t// Add event listeners\n\t\tthis.delegatedListeners.click = delegateEvent(\n\t\t\tthis.options.linkSelector,\n\t\t\t'click',\n\t\t\tthis.linkClickHandler.bind(this)\n\t\t);\n\n\t\twindow.addEventListener('popstate', this.boundPopStateHandler);\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// Mark swup blocks in html\n\t\tmarkSwupElements(document.documentElement, this.options.containers);\n\n\t\t// Mount plugins\n\t\tthis.options.plugins.forEach((plugin) => this.use(plugin));\n\n\t\t// Modify initial history record\n\t\tupdateHistoryRecord();\n\n\t\t// Trigger enabled event\n\t\tthis.triggerEvent('enabled');\n\n\t\t// Add swup-enabled class to html tag\n\t\tdocument.documentElement.classList.add('swup-enabled');\n\n\t\t// Trigger page view event\n\t\tthis.triggerEvent('pageView');\n\t}\n\n\tdestroy() {\n\t\t// remove delegated listeners\n\t\tthis.delegatedListeners.click!.destroy();\n\n\t\t// remove popstate listener\n\t\twindow.removeEventListener('popstate', this.boundPopStateHandler);\n\n\t\t// empty cache\n\t\tthis.cache.empty();\n\n\t\t// unmount plugins\n\t\tthis.options.plugins.forEach((plugin) => {\n\t\t\tthis.unuse(plugin);\n\t\t});\n\n\t\t// remove swup data atributes from blocks\n\t\tqueryAll('[data-swup]').forEach((element) => {\n\t\t\telement.removeAttribute('data-swup');\n\t\t});\n\n\t\t// remove handlers\n\t\tthis.off();\n\n\t\t// trigger disable event\n\t\tthis.triggerEvent('disabled');\n\n\t\t// remove swup-enabled class from html tag\n\t\tdocument.documentElement.classList.remove('swup-enabled');\n\t}\n\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\tlinkClickHandler(event: delegate.Event) {\n\t\tconst linkEl = event.delegateTarget;\n\t\tconst { href, url, hash } = Location.fromElement(linkEl as HTMLAnchorElement);\n\n\t\t// Exit early if the link should be ignored\n\t\tif (this.shouldIgnoreVisit(href, { el: linkEl, event })) {\n\t\t\treturn;\n\t\t}\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.triggerEvent('openPageInNewTab', event);\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.triggerEvent('clickLink', event);\n\t\tevent.preventDefault();\n\n\t\t// Handle links to the same page and exit early, where applicable\n\t\tif (!url || url === getCurrentUrl()) {\n\t\t\tthis.handleLinkToSamePage(url, hash, 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(url, getCurrentUrl())) return;\n\n\t\t// Store the element that should be scrolled to after loading the next page\n\t\tthis.scrollToElement = hash || null;\n\n\t\t// Get the custom transition name, if present\n\t\tconst customTransition = linkEl.getAttribute('data-swup-transition') || undefined;\n\n\t\t// Finally, proceed with loading the page\n\t\tthis.performPageLoad({ url, customTransition });\n\t}\n\n\thandleLinkToSamePage(url: string, hash: string, event: delegate.Event) {\n\t\t// Emit event and exit early if the url points to the same page without hash\n\t\tif (!hash) {\n\t\t\tthis.triggerEvent('samePage', event);\n\t\t\treturn;\n\t\t}\n\n\t\t// link to the same URL with hash\n\t\tthis.triggerEvent('samePageWithHash', event);\n\n\t\tconst element = getAnchorElement(hash);\n\n\t\t// Warn and exit early if no matching element was found for the hash\n\t\tif (!element) {\n\t\t\treturn console.warn(`Element for offset not found (#${hash})`);\n\t\t}\n\n\t\tupdateHistoryRecord(url + hash);\n\t}\n\n\ttriggerWillOpenNewWindow(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\tpopStateHandler(event: PopStateEvent) {\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 href = event.state?.url ?? location.href;\n\n\t\t// Exit early if the link should be ignored\n\t\tif (this.shouldIgnoreVisit(href, { event })) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { url, hash } = Location.fromUrl(href);\n\n\t\tif (hash) {\n\t\t\tthis.scrollToElement = hash;\n\t\t} else {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\tthis.triggerEvent('popState', event);\n\n\t\tif (!this.options.animateHistoryBrowsing) {\n\t\t\tdocument.documentElement.classList.remove('is-animating');\n\t\t\tcleanupAnimationClasses();\n\t\t}\n\n\t\tthis.performPageLoad({ url, event });\n\t}\n\n\t/**\n\t * Utility function to validate and run the global option 'resolveUrl'\n\t * @param {string} url\n\t * @returns {string} the resolved url\n\t */\n\tresolveUrl(url: string) {\n\t\tif (typeof this.options.resolveUrl !== 'function') {\n\t\t\tconsole.warn(`[swup] options.resolveUrl expects a callback function.`);\n\t\t\treturn url;\n\t\t}\n\t\tconst result = this.options.resolveUrl(url);\n\t\tif (!result || typeof result !== 'string') {\n\t\t\tconsole.warn(`[swup] options.resolveUrl needs to return a url`);\n\t\t\treturn url;\n\t\t}\n\t\tif (result.startsWith('//') || result.startsWith('http')) {\n\t\t\tconsole.warn(`[swup] options.resolveUrl needs to return a relative url`);\n\t\t\treturn url;\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Compares the resolved version of two paths and returns true if they are the same\n\t * @param {string} url1\n\t * @param {string} url2\n\t * @returns {boolean}\n\t */\n\tisSameResolvedUrl(url1: string, url2: string) {\n\t\treturn this.resolveUrl(url1) === this.resolveUrl(url2);\n\t}\n}\n"],"names":["getCurrentUrl","_temp","hash","location","pathname","search","updateHistoryRecord","url","customData","data","history","state","random","Math","source","replaceState","ledger","WeakMap","editLedger","wanted","baseElement","callback","setup","_a","_b","has","elementMap","get","set","setups","Set","existed","add","delete","delegate","base","selector","type","options","document","querySelectorAll","addEventListener","subscriptions","Array","prototype","map","call","element","destroy","subscription","Document","documentElement","capture","Boolean","listenerFn","event","delegateTarget","target","Text","parentElement","Element","currentTarget","closest","contains","safeClosest","once","JSON","stringify","delegateSubscription","removeEventListener","delegateEvent","eventOptions","delegation","query","context","querySelector","queryAll","from","toMs","s","Number","slice","replace","Location","constructor","baseURI","super","toString","this","static","el","getAttribute","href","markSwupElements","isSwupClass","className","test","includes","cleanupAnimationClasses","removeClasses","split","filter","classList","remove","Cache","swup","pages","last","getCacheUrl","resolveUrl","fromUrl","cacheUrl","page","responseURL","log","Object","keys","length","getPage","getCurrentPage","exists","empty","enterPage","skipTransition","triggerEvent","Promise","resolve","requestAnimationFrame","animationPromises","getAnimationPromises","all","then","getAnchorElement","charAt","substring","ident","decodeURIComponent","window","CSS","escape","transitionProp","transitionEndEvent","animationProp","animationEndEvent","animationType","animationSelector","body","animatedElements","expectedType","timeout","propCount","styles","getComputedStyle","animationDelay","transitionDelays","transitionDurations","transitionDuration","transitionTimeout","calculateTimeout","animationDelays","animationDurations","animationDuration","animationTimeout","max","getTransitionInfo","performance","now","end","endEvent","onEnd","elapsedTime","isTransitionOrAnimationEvent","Error","startTime","propsTransitioned","setTimeout","console","warn","getAnimationPromiseForElement","delays","durations","concat","duration","i","undefined","ontransitionend","onwebkittransitionend","onanimationend","onwebkitanimationend","getPageData","request","pageHtmlData","html","containers","fakeDom","createElement","innerHTML","blocks","forEach","item","index","setAttribute","String","push","outerHTML","title","innerText","pageClass","originalContent","getDataFromHtml","responseText","fetchPage","headers","requestHeaders","cache","reject","defaults","method","onreadystatechange","readyState","open","entries","_ref","key","header","setRequestHeader","send","fetch","response","status","cacheablePageData","leavePage","isHistoryVisit","loadPage","shouldIgnoreVisit","performPageLoad","customTransition","PopStateEvent","shouldSkipTransition","text","updateTransition","toLowerCase","fetchPromise","pushState","createHistoryRecord","scrollToElement","currentPageUrl","pageData","renderPage","catch","errorUrl","skipPopStateHandling","go","replaceContent","handler","eventHandlers","_handlers","off","h","eventName","originalEvent","error","CustomEvent","detail","dispatchEvent","plugin","isSwupPlugin","_checkRequirements","_beforeMount","mount","plugins","pluginOrName","findPlugin","unmount","_afterUnmount","p","find","name","isSameResolvedUrl","to","custom","transition","animateHistoryBrowsing","Swup","version","animationInDone","animationInStart","animationOutDone","animationOutStart","animationSkipped","clickLink","contentReplaced","disabled","enabled","openPageInNewTab","pageLoaded","pageRetrievedFromCache","pageView","popState","samePage","samePageWithHash","serverError","transitionStart","transitionEnd","willReplaceContent","delegatedListeners","boundPopStateHandler","on","use","unuse","ignoreVisit","linkSelector","Accept","popStateHandler","bind","enable","click","linkClickHandler","removeAttribute","_temp2","origin","triggerWillOpenNewWindow","linkEl","fromElement","metaKey","ctrlKey","shiftKey","altKey","button","preventDefault","handleLinkToSamePage","triggerEl","matches","result","startsWith","url1","url2"],"mappings":"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"}